agent.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. const defaults: Record<string, string> = {
  2. ask: "var(--icon-agent-ask-base)",
  3. build: "var(--icon-agent-build-base)",
  4. docs: "var(--icon-agent-docs-base)",
  5. plan: "var(--icon-agent-plan-base)",
  6. }
  7. const palette = [
  8. "var(--icon-agent-ask-base)",
  9. "var(--icon-agent-build-base)",
  10. "var(--icon-agent-docs-base)",
  11. "var(--icon-agent-plan-base)",
  12. "var(--syntax-info)",
  13. "var(--syntax-success)",
  14. "var(--syntax-warning)",
  15. "var(--syntax-property)",
  16. "var(--syntax-constant)",
  17. "var(--text-diff-add-base)",
  18. "var(--text-diff-delete-base)",
  19. "var(--icon-warning-base)",
  20. ]
  21. function tone(name: string) {
  22. let hash = 0
  23. for (const char of name) hash = (hash * 31 + char.charCodeAt(0)) >>> 0
  24. return palette[hash % palette.length]
  25. }
  26. export function agentColor(name: string, custom?: string) {
  27. if (custom) return custom
  28. return defaults[name] ?? defaults[name.toLowerCase()] ?? tone(name.toLowerCase())
  29. }
  30. export function messageAgentColor(
  31. list: readonly { role: string; agent?: string }[] | undefined,
  32. agents: readonly { name: string; color?: string }[],
  33. ) {
  34. if (!list) return undefined
  35. for (let i = list.length - 1; i >= 0; i--) {
  36. const item = list[i]
  37. if (item.role !== "user" || !item.agent) continue
  38. return agentColor(item.agent, agents.find((agent) => agent.name === item.agent)?.color)
  39. }
  40. }