agent-relay-server 0.122.1 → 0.123.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/docs/openapi.json +1 -1
  2. package/package.json +4 -4
  3. package/public/assets/MessageBubble-NCggGKTA.js +2 -0
  4. package/public/assets/{MessageBubble-DRdUD-kW.js.map → MessageBubble-NCggGKTA.js.map} +1 -1
  5. package/public/assets/{PlanGraphPanel-siKMPCln.js → PlanGraphPanel-CSdszmGk.js} +2 -2
  6. package/public/assets/{PlanGraphPanel-siKMPCln.js.map → PlanGraphPanel-CSdszmGk.js.map} +1 -1
  7. package/public/assets/{activity-D3MNcSaV.js → activity-Cyp2nolX.js} +2 -2
  8. package/public/assets/{activity-D3MNcSaV.js.map → activity-Cyp2nolX.js.map} +1 -1
  9. package/public/assets/{agent-profiles-CKzttq6G.js → agent-profiles-D5Izg0Vn.js} +2 -2
  10. package/public/assets/{agent-profiles-CKzttq6G.js.map → agent-profiles-D5Izg0Vn.js.map} +1 -1
  11. package/public/assets/{agent-type-icon-0ZJRP1Vy.js → agent-type-icon-BxUopALO.js} +2 -2
  12. package/public/assets/{agent-type-icon-0ZJRP1Vy.js.map → agent-type-icon-BxUopALO.js.map} +1 -1
  13. package/public/assets/agents-DIOxuJ6M.js +2 -0
  14. package/public/assets/{agents-CuVj_rfG.js.map → agents-DIOxuJ6M.js.map} +1 -1
  15. package/public/assets/{analytics-iob6C27d.js → analytics-DqAuUAwX.js} +3 -3
  16. package/public/assets/{analytics-iob6C27d.js.map → analytics-DqAuUAwX.js.map} +1 -1
  17. package/public/assets/{automation-B2ixxs4q.js → automation-Bn6mOLAR.js} +2 -2
  18. package/public/assets/{automation-B2ixxs4q.js.map → automation-Bn6mOLAR.js.map} +1 -1
  19. package/public/assets/{badge-DCIT3Irj.js → badge-XEru6wto.js} +2 -2
  20. package/public/assets/{badge-DCIT3Irj.js.map → badge-XEru6wto.js.map} +1 -1
  21. package/public/assets/branch-state-badge-Mf0Ow77K.js +2 -0
  22. package/public/assets/{branch-state-badge-CafBJWKo.js.map → branch-state-badge-Mf0Ow77K.js.map} +1 -1
  23. package/public/assets/{button-CzdTkRIf.js → button-C3CQSr4p.js} +2 -2
  24. package/public/assets/{button-CzdTkRIf.js.map → button-C3CQSr4p.js.map} +1 -1
  25. package/public/assets/card-C5XTIPvq.js +2 -0
  26. package/public/assets/{card-C3BGuVC6.js.map → card-C5XTIPvq.js.map} +1 -1
  27. package/public/assets/{channels-C-WsbL2H.js → channels-DVRkVeky.js} +2 -2
  28. package/public/assets/{channels-C-WsbL2H.js.map → channels-DVRkVeky.js.map} +1 -1
  29. package/public/assets/chat-eUaPz399.js +2 -0
  30. package/public/assets/{chat-DeoVTVob.js.map → chat-eUaPz399.js.map} +1 -1
  31. package/public/assets/{connectors-C2Ac03LJ.js → connectors-Cqubkw9C.js} +2 -2
  32. package/public/assets/{connectors-C2Ac03LJ.js.map → connectors-Cqubkw9C.js.map} +1 -1
  33. package/public/assets/copy-button-Bil2CjzT.js +2 -0
  34. package/public/assets/{copy-button-B3o1jpLu.js.map → copy-button-Bil2CjzT.js.map} +1 -1
  35. package/public/assets/{display-CJzSoTMq.js → display-GFbGUG0O.js} +2 -2
  36. package/public/assets/{display-CJzSoTMq.js.map → display-GFbGUG0O.js.map} +1 -1
  37. package/public/assets/{dist-OUPTEP6q.js → dist-4VwhnLtj.js} +2 -2
  38. package/public/assets/{dist-OUPTEP6q.js.map → dist-4VwhnLtj.js.map} +1 -1
  39. package/public/assets/{dist-BIjlN-xB.js → dist-B8tD9ZcR.js} +2 -2
  40. package/public/assets/{dist-BIjlN-xB.js.map → dist-B8tD9ZcR.js.map} +1 -1
  41. package/public/assets/{dist-BInckSJC.js → dist-BJaV2BD4.js} +2 -2
  42. package/public/assets/{dist-BInckSJC.js.map → dist-BJaV2BD4.js.map} +1 -1
  43. package/public/assets/{dist-B-T7lg0a.js → dist-C5z05Vkz.js} +2 -2
  44. package/public/assets/{dist-B-T7lg0a.js.map → dist-C5z05Vkz.js.map} +1 -1
  45. package/public/assets/dist-CFtFIhu3.js +2 -0
  46. package/public/assets/{dist-DT-OV6sQ.js.map → dist-CFtFIhu3.js.map} +1 -1
  47. package/public/assets/{dist-C7aTlosb.js → dist-CGaHpxnN.js} +2 -2
  48. package/public/assets/{dist-C7aTlosb.js.map → dist-CGaHpxnN.js.map} +1 -1
  49. package/public/assets/dist-CjyfQThq.js +2 -0
  50. package/public/assets/{dist-DGfp5dLz.js.map → dist-CjyfQThq.js.map} +1 -1
  51. package/public/assets/dist-CrUl2aQp.js +2 -0
  52. package/public/assets/{dist-B6woQ9Tb.js.map → dist-CrUl2aQp.js.map} +1 -1
  53. package/public/assets/{dist-B3e4B9pg.js → dist-DKmTXfpP.js} +2 -2
  54. package/public/assets/{dist-B3e4B9pg.js.map → dist-DKmTXfpP.js.map} +1 -1
  55. package/public/assets/{dist-B9G83DXv.js → dist-V3wu3BHw.js} +2 -2
  56. package/public/assets/{dist-B9G83DXv.js.map → dist-V3wu3BHw.js.map} +1 -1
  57. package/public/assets/{dist-BlzVGRhh.js → dist-r8wyUTkK.js} +2 -2
  58. package/public/assets/{dist-BlzVGRhh.js.map → dist-r8wyUTkK.js.map} +1 -1
  59. package/public/assets/{es2015-CnKXYKpf.js → es2015-5DTJe35n.js} +2 -2
  60. package/public/assets/{es2015-CnKXYKpf.js.map → es2015-5DTJe35n.js.map} +1 -1
  61. package/public/assets/formatted-body-CvrQ2D1J.js +3 -0
  62. package/public/assets/{formatted-body-35XBOY5L.js.map → formatted-body-CvrQ2D1J.js.map} +1 -1
  63. package/public/assets/{formatted-body-impl-RmDxI5Ux.js → formatted-body-impl-BJ7jdbpR.js} +2 -2
  64. package/public/assets/{formatted-body-impl-RmDxI5Ux.js.map → formatted-body-impl-BJ7jdbpR.js.map} +1 -1
  65. package/public/assets/index-DnUo0Zqg.js +25 -0
  66. package/public/assets/index-DnUo0Zqg.js.map +1 -0
  67. package/public/assets/{input-B6Q0NWCS.js → input-CXMbJ848.js} +2 -2
  68. package/public/assets/{input-B6Q0NWCS.js.map → input-CXMbJ848.js.map} +1 -1
  69. package/public/assets/{insights-B643SFvm.js → insights-CQGH5LhD.js} +2 -2
  70. package/public/assets/{insights-B643SFvm.js.map → insights-CQGH5LhD.js.map} +1 -1
  71. package/public/assets/{integrations-hFIHeCF4.js → integrations-9G5TJnnU.js} +2 -2
  72. package/public/assets/{integrations-hFIHeCF4.js.map → integrations-9G5TJnnU.js.map} +1 -1
  73. package/public/assets/{lib-BHsWPMKB.js → lib-BcUW1l-W.js} +2 -2
  74. package/public/assets/{lib-BHsWPMKB.js.map → lib-BcUW1l-W.js.map} +1 -1
  75. package/public/assets/lucide-react-CoU_Xts2.js +10 -0
  76. package/public/assets/{lucide-react-DuhlF2Sj.js.map → lucide-react-CoU_Xts2.js.map} +1 -1
  77. package/public/assets/maintenance-7c7UvpAt.js +2 -0
  78. package/public/assets/{maintenance-CURvdp_Z.js.map → maintenance-7c7UvpAt.js.map} +1 -1
  79. package/public/assets/{managed-agents-DrZtdlSn.js → managed-agents-yh4HPO5a.js} +4 -4
  80. package/public/assets/{managed-agents-DrZtdlSn.js.map → managed-agents-yh4HPO5a.js.map} +1 -1
  81. package/public/assets/{markdown-preview-impl-CVDO--ek.js → markdown-preview-impl-BuOn5-Uc.js} +2 -2
  82. package/public/assets/{markdown-preview-impl-CVDO--ek.js.map → markdown-preview-impl-BuOn5-Uc.js.map} +1 -1
  83. package/public/assets/memory-Qv0JN8CE.js +2 -0
  84. package/public/assets/{memory-Bm7dt_Qf.js.map → memory-Qv0JN8CE.js.map} +1 -1
  85. package/public/assets/messages-CgjHJmc2.js +2 -0
  86. package/public/assets/{messages-DTq4i2KZ.js.map → messages-CgjHJmc2.js.map} +1 -1
  87. package/public/assets/{orchestrators-Dra318Ap.js → orchestrators-CgL4CFzb.js} +2 -2
  88. package/public/assets/{orchestrators-Dra318Ap.js.map → orchestrators-CgL4CFzb.js.map} +1 -1
  89. package/public/assets/{overview-yr1Vmk64.js → overview-Bri04eYE.js} +2 -2
  90. package/public/assets/{overview-yr1Vmk64.js.map → overview-Bri04eYE.js.map} +1 -1
  91. package/public/assets/{pairs-mnlKDBGp.js → pairs-C78LwUH2.js} +2 -2
  92. package/public/assets/{pairs-mnlKDBGp.js.map → pairs-C78LwUH2.js.map} +1 -1
  93. package/public/assets/{projects-Dzdf-gkK.js → projects-CquHTMo1.js} +2 -2
  94. package/public/assets/{projects-Dzdf-gkK.js.map → projects-CquHTMo1.js.map} +1 -1
  95. package/public/assets/prompt-settings-DDEkMqPZ.js +2 -0
  96. package/public/assets/{prompt-settings-ByL8SNCi.js.map → prompt-settings-DDEkMqPZ.js.map} +1 -1
  97. package/public/assets/{react-dom-DWBmcawP.js → react-dom-BQICbUuF.js} +2 -2
  98. package/public/assets/{react-dom-DWBmcawP.js.map → react-dom-BQICbUuF.js.map} +1 -1
  99. package/public/assets/registry-5KhP5FE5.js +2 -0
  100. package/public/assets/registry-5KhP5FE5.js.map +1 -0
  101. package/public/assets/{security-0SBsc_4W.js → security-wvnRKFvm.js} +2 -2
  102. package/public/assets/{security-0SBsc_4W.js.map → security-wvnRKFvm.js.map} +1 -1
  103. package/public/assets/{select-Bw5z2KJ_.js → select-BIfbVmLf.js} +2 -2
  104. package/public/assets/{select-Bw5z2KJ_.js.map → select-BIfbVmLf.js.map} +1 -1
  105. package/public/assets/settings-B6Ntahx7.js +6 -0
  106. package/public/assets/{settings-78Cyq_tA.js.map → settings-B6Ntahx7.js.map} +1 -1
  107. package/public/assets/{store-BPrVuKiv.js → store-zFLzd0Jd.js} +5 -5
  108. package/public/assets/{store-BPrVuKiv.js.map → store-zFLzd0Jd.js.map} +1 -1
  109. package/public/assets/{task-chip-DXfvXBDx.js → task-chip-BHM-e3I8.js} +2 -2
  110. package/public/assets/{task-chip-DXfvXBDx.js.map → task-chip-BHM-e3I8.js.map} +1 -1
  111. package/public/assets/{tasks-Cg2MMeri.js → tasks-CUglafo5.js} +2 -2
  112. package/public/assets/{tasks-Cg2MMeri.js.map → tasks-CUglafo5.js.map} +1 -1
  113. package/public/assets/{teams-DWv6UwFV.js → teams-EE8RHhHM.js} +2 -2
  114. package/public/assets/{teams-DWv6UwFV.js.map → teams-EE8RHhHM.js.map} +1 -1
  115. package/public/assets/{terminal-viewer-impl-DBLDjbIg.js → terminal-viewer-impl-DBRkdyag.js} +3 -3
  116. package/public/assets/{terminal-viewer-impl-DBLDjbIg.js.map → terminal-viewer-impl-DBRkdyag.js.map} +1 -1
  117. package/public/assets/types-CRptbSYh.js +2 -0
  118. package/public/assets/types-CRptbSYh.js.map +1 -0
  119. package/public/assets/{use-keyboard-viewport-CP109w9y.js → use-keyboard-viewport-CAa7IQTm.js} +2 -2
  120. package/public/assets/{use-keyboard-viewport-CP109w9y.js.map → use-keyboard-viewport-CAa7IQTm.js.map} +1 -1
  121. package/public/assets/user-avatar-kYPfLgXp.js +2 -0
  122. package/public/assets/{user-avatar-BsOLyVJj.js.map → user-avatar-kYPfLgXp.js.map} +1 -1
  123. package/public/assets/{work-queue-DmwvnF6F.js → work-queue-BFQVVL4T.js} +2 -2
  124. package/public/assets/{work-queue-DmwvnF6F.js.map → work-queue-BFQVVL4T.js.map} +1 -1
  125. package/public/assets/workspaces-CR6f7G0R.js +3 -0
  126. package/public/assets/{workspaces-dIBivJN8.js.map → workspaces-CR6f7G0R.js.map} +1 -1
  127. package/public/index.html +25 -25
  128. package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
  129. package/runner/src/adapters/claude.ts +5 -2
  130. package/runner/src/codex-version.ts +63 -0
  131. package/runner/src/config.ts +7 -0
  132. package/runner/src/launch-assembly.ts +208 -9
  133. package/runner/src/profile-projection.ts +19 -0
  134. package/runner/src/provisioning.ts +74 -5
  135. package/runner/src/relay-injection-events.ts +3 -0
  136. package/runner/src/runner-helpers.ts +1 -1
  137. package/runner/src/version.ts +1 -0
  138. package/src/config-store.ts +2 -0
  139. package/src/db/provisioning-registry.ts +40 -9
  140. package/src/db/provisioning-resolve.ts +66 -5
  141. package/src/routes/provisioning-registry.ts +1 -1
  142. package/src/services/spawn-agent.ts +1 -0
  143. package/public/assets/MessageBubble-DRdUD-kW.js +0 -2
  144. package/public/assets/agents-CuVj_rfG.js +0 -2
  145. package/public/assets/branch-state-badge-CafBJWKo.js +0 -2
  146. package/public/assets/card-C3BGuVC6.js +0 -2
  147. package/public/assets/chat-DeoVTVob.js +0 -2
  148. package/public/assets/copy-button-B3o1jpLu.js +0 -2
  149. package/public/assets/dist-B6woQ9Tb.js +0 -2
  150. package/public/assets/dist-DGfp5dLz.js +0 -2
  151. package/public/assets/dist-DT-OV6sQ.js +0 -2
  152. package/public/assets/formatted-body-35XBOY5L.js +0 -3
  153. package/public/assets/index-D0xMQQb_.js +0 -25
  154. package/public/assets/index-D0xMQQb_.js.map +0 -1
  155. package/public/assets/lucide-react-DuhlF2Sj.js +0 -10
  156. package/public/assets/maintenance-CURvdp_Z.js +0 -2
  157. package/public/assets/memory-Bm7dt_Qf.js +0 -2
  158. package/public/assets/messages-DTq4i2KZ.js +0 -2
  159. package/public/assets/prompt-settings-ByL8SNCi.js +0 -2
  160. package/public/assets/registry-CXWyOtpr.js +0 -2
  161. package/public/assets/registry-CXWyOtpr.js.map +0 -1
  162. package/public/assets/settings-78Cyq_tA.js +0 -6
  163. package/public/assets/types-BeJUSfDj.js +0 -2
  164. package/public/assets/types-BeJUSfDj.js.map +0 -1
  165. package/public/assets/user-avatar-BsOLyVJj.js +0 -2
  166. package/public/assets/workspaces-dIBivJN8.js +0 -3
@@ -1 +1 @@
1
- {"version":3,"file":"activity-D3MNcSaV.js","names":[],"sources":["../../dashboard/src/components/views/activity.tsx"],"sourcesContent":["import { useRelayStore, useNow } from '@/store'\nimport { Card, CardContent } from '@/components/ui/card'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { ScrollArea } from '@/components/ui/scroll-area'\nimport {\n Activity, MessageCircle, MessageSquareReply, HelpCircle, User,\n Link, ClipboardList, Radio, FileDown, Braces, Flame,\n} from 'lucide-react'\nimport { timeAgo, fmtTime, displayTarget } from '@/lib/display'\nimport type { ActivityEvent, Agent, Message } from '@/types'\nimport { useMemo, useState } from 'react'\nimport { TaskChip } from '@/components/shared/task-chip'\nimport { buildTimeline, type TimelineEntry } from '@/components/chat/sessionTrace'\nimport { AgentActionEntry, NoticePill, ActivityTrace, StatusMarker, DateSeparator } from '@/components/chat/TraceView'\nimport { MessageBubble } from '@/components/chat/MessageBubble'\nimport { HUMAN_AGENT_ID } from '@/lib/constants'\nimport { cn } from '@/lib/utils'\n\nconst KIND_ICONS: Record<string, React.ElementType> = {\n question: HelpCircle,\n reply: MessageSquareReply,\n message: MessageCircle,\n operator: User,\n pair: Link,\n task: ClipboardList,\n state: Radio,\n}\n\nconst KIND_COLORS: Record<string, string> = {\n question: 'bg-blue-500/10 text-blue-400 border-blue-500/20',\n reply: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20',\n message: 'bg-zinc-500/10 text-zinc-400 border-zinc-500/20',\n operator: 'bg-purple-500/10 text-purple-400 border-purple-500/20',\n pair: 'bg-yellow-500/10 text-yellow-400 border-yellow-500/20',\n task: 'bg-orange-500/10 text-orange-400 border-orange-500/20',\n state: 'bg-cyan-500/10 text-cyan-400 border-cyan-500/20',\n}\n\nconst EVENT_KIND_LABELS = ['question', 'reply', 'message', 'operator', 'pair', 'task', 'state'] as const\nconst MSG_KIND_LABELS = ['chat', 'session', 'system', 'task'] as const\n\n// Compact attribution line for dashboard-initiated lifecycle commands (#172): identifies the\n// surface that issued a restart/shutdown/reconnect — component, SPA view, tab session, browser.\nfunction formatSurface(metadata: Record<string, unknown> | undefined): string | null {\n const surface = metadata?.surface\n if (!surface || typeof surface !== 'object') return null\n const s = surface as Record<string, unknown>\n const parts: string[] = []\n if (typeof s.component === 'string') parts.push(s.component)\n if (typeof s.view === 'string' && s.view !== s.component) parts.push(s.view)\n if (typeof s.session === 'string') parts.push(`tab ${s.session.slice(0, 6)}`)\n if (typeof s.client === 'string') parts.push(`client ${s.client.slice(0, 6)}`)\n return parts.length ? parts.join(' · ') : null\n}\n\n// Render one firehose timeline entry using Tier-1 exported components.\n// No entry-render code is duplicated here — body formatting, reactions, code blocks,\n// notice pills, status markers, and date separators all live in the shared exports.\nfunction FirehoseRow({ entry, agentsById }: { entry: TimelineEntry; agentsById: Record<string, Agent> }) {\n if (entry.type === 'notice') return <div className=\"px-1\"><NoticePill msg={entry.msg} /></div>\n if (entry.type === 'agent-action') return <div className=\"px-1\"><AgentActionEntry entry={entry} /></div>\n if (entry.type === 'activity') return (\n <div className=\"px-1 opacity-60\">\n <ActivityTrace steps={entry.steps} showReasoning={false} />\n </div>\n )\n if (entry.type === 'status') return <div className=\"px-1\"><StatusMarker event={entry.event} /></div>\n if (entry.type === 'date') return <div className=\"px-1\"><DateSeparator date={entry.date} /></div>\n if (entry.type === 'created' || entry.type === 'import-boundary' || entry.type === 'imported-message') return null\n if (entry.type !== 'message') return null\n\n const { msg } = entry\n const fromLabel = displayTarget(msg.from, agentsById)\n const toLabel = displayTarget(msg.to, agentsById)\n return (\n <div>\n {/* Attribution header: both sides of the routing, not shown by MessageBubble alone */}\n <div className=\"flex items-center gap-1.5 px-3 mb-0.5\">\n <span className=\"text-xs font-mono text-muted-foreground truncate max-w-[140px]\" title={msg.from}>{fromLabel}</span>\n <span className=\"text-xs text-muted-foreground shrink-0\">→</span>\n <span className=\"text-xs font-mono text-muted-foreground truncate max-w-[140px]\" title={msg.to}>{toLabel}</span>\n <Badge variant=\"outline\" className=\"text-[10px] px-1 py-0 shrink-0 ml-1\">{msg.kind}</Badge>\n </div>\n {/* peer=HUMAN_AGENT_ID: agent messages render inbound (left), user messages outbound (right) */}\n <MessageBubble msg={msg} peer={HUMAN_AGENT_ID} />\n </div>\n )\n}\n\nfunction FirehoseTab() {\n const messages = useRelayStore((s) => s.messages) as Message[]\n const agentsById = useRelayStore((s) => s.agentsById)\n const [agentFilter, setAgentFilter] = useState('')\n const [kindFilter, setKindFilter] = useState('')\n\n const filteredMessages = useMemo(() => {\n let msgs = messages\n if (agentFilter) {\n const q = agentFilter.toLowerCase()\n msgs = msgs.filter((m) => m.from.toLowerCase().includes(q) || m.to.toLowerCase().includes(q))\n }\n if (kindFilter) msgs = msgs.filter((m) => m.kind === kindFilter)\n return msgs\n }, [messages, agentFilter, kindFilter])\n\n const timeline = useMemo(() => buildTimeline(filteredMessages, []), [filteredMessages])\n\n return (\n <>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <input\n type=\"text\"\n className=\"rounded-md border border-input bg-background px-3 py-1.5 text-sm w-44\"\n placeholder=\"Filter by agent…\"\n value={agentFilter}\n onChange={(e) => setAgentFilter(e.target.value)}\n />\n <select\n className=\"rounded-md border border-input bg-background px-3 py-1.5 text-sm\"\n value={kindFilter}\n onChange={(e) => setKindFilter(e.target.value)}\n >\n <option value=\"\">All kinds</option>\n {MSG_KIND_LABELS.map((k) => <option key={k} value={k}>{k}</option>)}\n </select>\n <Badge variant=\"secondary\" className=\"ml-auto\">{filteredMessages.length}</Badge>\n </div>\n\n <ScrollArea className=\"h-[calc(100dvh-13rem)]\">\n <div className=\"space-y-1 pr-2\">\n {timeline.length === 0 && (\n <div className=\"text-center text-muted-foreground py-16 text-sm\">No messages yet</div>\n )}\n {timeline.map((entry, i) => (\n <FirehoseRow key={i} entry={entry} agentsById={agentsById} />\n ))}\n </div>\n </ScrollArea>\n </>\n )\n}\n\nfunction EventsTab() {\n const now = useNow()\n const activityFilter = useRelayStore((s) => s.activityFilter)\n const activityEvents = useRelayStore((s) => s.activityEvents)\n const operatorActivity = useRelayStore((s) => s.operatorActivity)\n const set = useRelayStore((s) => s.set)\n const openActivityItem = useRelayStore((s) => s.openActivityItem)\n const openTaskDetailById = useRelayStore((s) => s.openTaskDetailById)\n const exportActivity = useRelayStore((s) => s.exportActivity)\n\n const allItems = useMemo(() => {\n const merged = [...activityEvents, ...operatorActivity]\n const seen = new Set<string>()\n const deduped: ActivityEvent[] = []\n for (const item of merged) {\n const key = item.clientId || String(item.id)\n if (!seen.has(key)) { seen.add(key); deduped.push(item) }\n }\n return deduped\n .map((e) => ({ ...e, ts: e.ts ?? new Date(e.createdAt as string).getTime() }))\n .sort((a, b) => (b.ts ?? 0) - (a.ts ?? 0))\n }, [activityEvents, operatorActivity])\n\n const filtered = useMemo(() => {\n if (!activityFilter) return allItems\n return allItems.filter((e) => e.kind === activityFilter)\n }, [allItems, activityFilter])\n\n return (\n <>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <select\n className=\"rounded-md border border-input bg-background px-3 py-1.5 text-sm\"\n value={activityFilter}\n onChange={(e) => set({ activityFilter: e.target.value })}\n >\n <option value=\"\">All types</option>\n {EVENT_KIND_LABELS.map((k) => <option key={k} value={k}>{k}</option>)}\n </select>\n <Button size=\"sm\" variant=\"outline\" onClick={() => exportActivity('markdown')}>\n <FileDown className=\"w-4 h-4 mr-1\" /> Markdown\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => exportActivity('json')}>\n <Braces className=\"w-4 h-4 mr-1\" /> JSON\n </Button>\n <Badge variant=\"secondary\" className=\"ml-auto\">{filtered.length}</Badge>\n </div>\n\n <ScrollArea className=\"h-[calc(100dvh-13rem)]\">\n <div className=\"space-y-2 pr-2\">\n {filtered.length === 0 && (\n <div className=\"text-center text-muted-foreground py-16 text-sm\">No activity yet</div>\n )}\n {filtered.map((item) => {\n const Icon = KIND_ICONS[item.kind] || Activity\n const colorClass = KIND_COLORS[item.kind] || KIND_COLORS.message\n const surface = formatSurface(item.metadata)\n return (\n <Card\n key={item.clientId || item.id}\n className=\"cursor-pointer hover:bg-accent/40 transition-colors\"\n onClick={() => openActivityItem(item)}\n >\n <CardContent className=\"p-3 flex gap-3\">\n <span className={`inline-flex items-center justify-center w-7 h-7 rounded-md border shrink-0 mt-0.5 ${colorClass}`}>\n <Icon className=\"w-3.5 h-3.5\" />\n </span>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-medium text-sm truncate\">{item.title}</span>\n <Badge variant=\"outline\" className={`text-xs px-1.5 py-0 border ${colorClass}`}>{item.kind}</Badge>\n <span className=\"text-xs text-muted-foreground ml-auto shrink-0\" title={fmtTime(item.ts ?? item.createdAt)}>\n {timeAgo(now, item.ts ?? item.createdAt)}\n </span>\n </div>\n {item.body && (\n <p className=\"text-xs text-muted-foreground mt-0.5 line-clamp-2\">{item.body}</p>\n )}\n {item.meta && (\n <p className=\"text-xs text-muted-foreground/60 mt-0.5 font-mono truncate\">{item.meta}</p>\n )}\n {surface && (\n <p className=\"text-xs text-muted-foreground/60 mt-0.5 truncate\" title={surface}>\n <span className=\"opacity-70\">via</span> {surface}\n </p>\n )}\n {item.taskId != null && (\n <div className=\"mt-1\">\n <TaskChip id={item.taskId} onClick={() => openTaskDetailById(item.taskId!)} />\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n )\n })}\n </div>\n </ScrollArea>\n </>\n )\n}\n\ntype ActivityTab = 'firehose' | 'events'\n\nexport function ActivityView() {\n const [tab, setTab] = useState<ActivityTab>('firehose')\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-2\">\n {tab === 'firehose'\n ? <Flame className=\"w-5 h-5 text-muted-foreground\" />\n : <Activity className=\"w-5 h-5 text-muted-foreground\" />}\n <h2 className=\"text-lg font-semibold\">{tab === 'firehose' ? 'Firehose' : 'Events'}</h2>\n </div>\n <div className=\"flex items-center gap-1 rounded-md border border-input overflow-hidden\">\n <button\n className={cn('px-3 py-1.5 text-sm transition-colors', tab === 'firehose' ? 'bg-primary text-primary-foreground' : 'hover:bg-accent')}\n onClick={() => setTab('firehose')}\n >\n Firehose\n </button>\n <button\n className={cn('px-3 py-1.5 text-sm transition-colors', tab === 'events' ? 'bg-primary text-primary-foreground' : 'hover:bg-accent')}\n onClick={() => setTab('events')}\n >\n Events\n </button>\n </div>\n </div>\n\n {tab === 'firehose' ? <FirehoseTab /> : <EventsTab />}\n </div>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"activity-Cyp2nolX.js","names":[],"sources":["../../dashboard/src/components/views/activity.tsx"],"sourcesContent":["import { useRelayStore, useNow } from '@/store'\nimport { Card, CardContent } from '@/components/ui/card'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { ScrollArea } from '@/components/ui/scroll-area'\nimport {\n Activity, MessageCircle, MessageSquareReply, HelpCircle, User,\n Link, ClipboardList, Radio, FileDown, Braces, Flame,\n} from 'lucide-react'\nimport { timeAgo, fmtTime, displayTarget } from '@/lib/display'\nimport type { ActivityEvent, Agent, Message } from '@/types'\nimport { useMemo, useState } from 'react'\nimport { TaskChip } from '@/components/shared/task-chip'\nimport { buildTimeline, type TimelineEntry } from '@/components/chat/sessionTrace'\nimport { AgentActionEntry, NoticePill, ActivityTrace, StatusMarker, DateSeparator } from '@/components/chat/TraceView'\nimport { MessageBubble } from '@/components/chat/MessageBubble'\nimport { HUMAN_AGENT_ID } from '@/lib/constants'\nimport { cn } from '@/lib/utils'\n\nconst KIND_ICONS: Record<string, React.ElementType> = {\n question: HelpCircle,\n reply: MessageSquareReply,\n message: MessageCircle,\n operator: User,\n pair: Link,\n task: ClipboardList,\n state: Radio,\n}\n\nconst KIND_COLORS: Record<string, string> = {\n question: 'bg-blue-500/10 text-blue-400 border-blue-500/20',\n reply: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20',\n message: 'bg-zinc-500/10 text-zinc-400 border-zinc-500/20',\n operator: 'bg-purple-500/10 text-purple-400 border-purple-500/20',\n pair: 'bg-yellow-500/10 text-yellow-400 border-yellow-500/20',\n task: 'bg-orange-500/10 text-orange-400 border-orange-500/20',\n state: 'bg-cyan-500/10 text-cyan-400 border-cyan-500/20',\n}\n\nconst EVENT_KIND_LABELS = ['question', 'reply', 'message', 'operator', 'pair', 'task', 'state'] as const\nconst MSG_KIND_LABELS = ['chat', 'session', 'system', 'task'] as const\n\n// Compact attribution line for dashboard-initiated lifecycle commands (#172): identifies the\n// surface that issued a restart/shutdown/reconnect — component, SPA view, tab session, browser.\nfunction formatSurface(metadata: Record<string, unknown> | undefined): string | null {\n const surface = metadata?.surface\n if (!surface || typeof surface !== 'object') return null\n const s = surface as Record<string, unknown>\n const parts: string[] = []\n if (typeof s.component === 'string') parts.push(s.component)\n if (typeof s.view === 'string' && s.view !== s.component) parts.push(s.view)\n if (typeof s.session === 'string') parts.push(`tab ${s.session.slice(0, 6)}`)\n if (typeof s.client === 'string') parts.push(`client ${s.client.slice(0, 6)}`)\n return parts.length ? parts.join(' · ') : null\n}\n\n// Render one firehose timeline entry using Tier-1 exported components.\n// No entry-render code is duplicated here — body formatting, reactions, code blocks,\n// notice pills, status markers, and date separators all live in the shared exports.\nfunction FirehoseRow({ entry, agentsById }: { entry: TimelineEntry; agentsById: Record<string, Agent> }) {\n if (entry.type === 'notice') return <div className=\"px-1\"><NoticePill msg={entry.msg} /></div>\n if (entry.type === 'agent-action') return <div className=\"px-1\"><AgentActionEntry entry={entry} /></div>\n if (entry.type === 'activity') return (\n <div className=\"px-1 opacity-60\">\n <ActivityTrace steps={entry.steps} showReasoning={false} />\n </div>\n )\n if (entry.type === 'status') return <div className=\"px-1\"><StatusMarker event={entry.event} /></div>\n if (entry.type === 'date') return <div className=\"px-1\"><DateSeparator date={entry.date} /></div>\n if (entry.type === 'created' || entry.type === 'import-boundary' || entry.type === 'imported-message') return null\n if (entry.type !== 'message') return null\n\n const { msg } = entry\n const fromLabel = displayTarget(msg.from, agentsById)\n const toLabel = displayTarget(msg.to, agentsById)\n return (\n <div>\n {/* Attribution header: both sides of the routing, not shown by MessageBubble alone */}\n <div className=\"flex items-center gap-1.5 px-3 mb-0.5\">\n <span className=\"text-xs font-mono text-muted-foreground truncate max-w-[140px]\" title={msg.from}>{fromLabel}</span>\n <span className=\"text-xs text-muted-foreground shrink-0\">→</span>\n <span className=\"text-xs font-mono text-muted-foreground truncate max-w-[140px]\" title={msg.to}>{toLabel}</span>\n <Badge variant=\"outline\" className=\"text-[10px] px-1 py-0 shrink-0 ml-1\">{msg.kind}</Badge>\n </div>\n {/* peer=HUMAN_AGENT_ID: agent messages render inbound (left), user messages outbound (right) */}\n <MessageBubble msg={msg} peer={HUMAN_AGENT_ID} />\n </div>\n )\n}\n\nfunction FirehoseTab() {\n const messages = useRelayStore((s) => s.messages) as Message[]\n const agentsById = useRelayStore((s) => s.agentsById)\n const [agentFilter, setAgentFilter] = useState('')\n const [kindFilter, setKindFilter] = useState('')\n\n const filteredMessages = useMemo(() => {\n let msgs = messages\n if (agentFilter) {\n const q = agentFilter.toLowerCase()\n msgs = msgs.filter((m) => m.from.toLowerCase().includes(q) || m.to.toLowerCase().includes(q))\n }\n if (kindFilter) msgs = msgs.filter((m) => m.kind === kindFilter)\n return msgs\n }, [messages, agentFilter, kindFilter])\n\n const timeline = useMemo(() => buildTimeline(filteredMessages, []), [filteredMessages])\n\n return (\n <>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <input\n type=\"text\"\n className=\"rounded-md border border-input bg-background px-3 py-1.5 text-sm w-44\"\n placeholder=\"Filter by agent…\"\n value={agentFilter}\n onChange={(e) => setAgentFilter(e.target.value)}\n />\n <select\n className=\"rounded-md border border-input bg-background px-3 py-1.5 text-sm\"\n value={kindFilter}\n onChange={(e) => setKindFilter(e.target.value)}\n >\n <option value=\"\">All kinds</option>\n {MSG_KIND_LABELS.map((k) => <option key={k} value={k}>{k}</option>)}\n </select>\n <Badge variant=\"secondary\" className=\"ml-auto\">{filteredMessages.length}</Badge>\n </div>\n\n <ScrollArea className=\"h-[calc(100dvh-13rem)]\">\n <div className=\"space-y-1 pr-2\">\n {timeline.length === 0 && (\n <div className=\"text-center text-muted-foreground py-16 text-sm\">No messages yet</div>\n )}\n {timeline.map((entry, i) => (\n <FirehoseRow key={i} entry={entry} agentsById={agentsById} />\n ))}\n </div>\n </ScrollArea>\n </>\n )\n}\n\nfunction EventsTab() {\n const now = useNow()\n const activityFilter = useRelayStore((s) => s.activityFilter)\n const activityEvents = useRelayStore((s) => s.activityEvents)\n const operatorActivity = useRelayStore((s) => s.operatorActivity)\n const set = useRelayStore((s) => s.set)\n const openActivityItem = useRelayStore((s) => s.openActivityItem)\n const openTaskDetailById = useRelayStore((s) => s.openTaskDetailById)\n const exportActivity = useRelayStore((s) => s.exportActivity)\n\n const allItems = useMemo(() => {\n const merged = [...activityEvents, ...operatorActivity]\n const seen = new Set<string>()\n const deduped: ActivityEvent[] = []\n for (const item of merged) {\n const key = item.clientId || String(item.id)\n if (!seen.has(key)) { seen.add(key); deduped.push(item) }\n }\n return deduped\n .map((e) => ({ ...e, ts: e.ts ?? new Date(e.createdAt as string).getTime() }))\n .sort((a, b) => (b.ts ?? 0) - (a.ts ?? 0))\n }, [activityEvents, operatorActivity])\n\n const filtered = useMemo(() => {\n if (!activityFilter) return allItems\n return allItems.filter((e) => e.kind === activityFilter)\n }, [allItems, activityFilter])\n\n return (\n <>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <select\n className=\"rounded-md border border-input bg-background px-3 py-1.5 text-sm\"\n value={activityFilter}\n onChange={(e) => set({ activityFilter: e.target.value })}\n >\n <option value=\"\">All types</option>\n {EVENT_KIND_LABELS.map((k) => <option key={k} value={k}>{k}</option>)}\n </select>\n <Button size=\"sm\" variant=\"outline\" onClick={() => exportActivity('markdown')}>\n <FileDown className=\"w-4 h-4 mr-1\" /> Markdown\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => exportActivity('json')}>\n <Braces className=\"w-4 h-4 mr-1\" /> JSON\n </Button>\n <Badge variant=\"secondary\" className=\"ml-auto\">{filtered.length}</Badge>\n </div>\n\n <ScrollArea className=\"h-[calc(100dvh-13rem)]\">\n <div className=\"space-y-2 pr-2\">\n {filtered.length === 0 && (\n <div className=\"text-center text-muted-foreground py-16 text-sm\">No activity yet</div>\n )}\n {filtered.map((item) => {\n const Icon = KIND_ICONS[item.kind] || Activity\n const colorClass = KIND_COLORS[item.kind] || KIND_COLORS.message\n const surface = formatSurface(item.metadata)\n return (\n <Card\n key={item.clientId || item.id}\n className=\"cursor-pointer hover:bg-accent/40 transition-colors\"\n onClick={() => openActivityItem(item)}\n >\n <CardContent className=\"p-3 flex gap-3\">\n <span className={`inline-flex items-center justify-center w-7 h-7 rounded-md border shrink-0 mt-0.5 ${colorClass}`}>\n <Icon className=\"w-3.5 h-3.5\" />\n </span>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-medium text-sm truncate\">{item.title}</span>\n <Badge variant=\"outline\" className={`text-xs px-1.5 py-0 border ${colorClass}`}>{item.kind}</Badge>\n <span className=\"text-xs text-muted-foreground ml-auto shrink-0\" title={fmtTime(item.ts ?? item.createdAt)}>\n {timeAgo(now, item.ts ?? item.createdAt)}\n </span>\n </div>\n {item.body && (\n <p className=\"text-xs text-muted-foreground mt-0.5 line-clamp-2\">{item.body}</p>\n )}\n {item.meta && (\n <p className=\"text-xs text-muted-foreground/60 mt-0.5 font-mono truncate\">{item.meta}</p>\n )}\n {surface && (\n <p className=\"text-xs text-muted-foreground/60 mt-0.5 truncate\" title={surface}>\n <span className=\"opacity-70\">via</span> {surface}\n </p>\n )}\n {item.taskId != null && (\n <div className=\"mt-1\">\n <TaskChip id={item.taskId} onClick={() => openTaskDetailById(item.taskId!)} />\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n )\n })}\n </div>\n </ScrollArea>\n </>\n )\n}\n\ntype ActivityTab = 'firehose' | 'events'\n\nexport function ActivityView() {\n const [tab, setTab] = useState<ActivityTab>('firehose')\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-2\">\n {tab === 'firehose'\n ? <Flame className=\"w-5 h-5 text-muted-foreground\" />\n : <Activity className=\"w-5 h-5 text-muted-foreground\" />}\n <h2 className=\"text-lg font-semibold\">{tab === 'firehose' ? 'Firehose' : 'Events'}</h2>\n </div>\n <div className=\"flex items-center gap-1 rounded-md border border-input overflow-hidden\">\n <button\n className={cn('px-3 py-1.5 text-sm transition-colors', tab === 'firehose' ? 'bg-primary text-primary-foreground' : 'hover:bg-accent')}\n onClick={() => setTab('firehose')}\n >\n Firehose\n </button>\n <button\n className={cn('px-3 py-1.5 text-sm transition-colors', tab === 'events' ? 'bg-primary text-primary-foreground' : 'hover:bg-accent')}\n onClick={() => setTab('events')}\n >\n Events\n </button>\n </div>\n </div>\n\n {tab === 'firehose' ? <FirehoseTab /> : <EventsTab />}\n </div>\n )\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{G as t,Jt as n,V as r,an as i,en as a,g as o,hr as s,nr as c,p as l,pt as u,qt as d}from"./lucide-react-DuhlF2Sj.js";import{t as f}from"./store-BPrVuKiv.js";import{d as p,g as m,m as h}from"./types-BeJUSfDj.js";import{t as g}from"./badge-DCIT3Irj.js";import{t as _}from"./button-CzdTkRIf.js";import{a as v,i as y,n as b,o as x,r as S,t as C}from"./index-D0xMQQb_.js";var w=e(s(),1),T=c();function E(e){let t=h(),n=e.provider??``;return n&&n!==`any`&&t.includes(n)?n:t[0]??n}function D(e){if(Array.isArray(e))return e.map(D);if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))n===`files`&&Array.isArray(r)?t[n]=r.map(e=>{if(e&&typeof e==`object`&&typeof e.content==`string`){let t=e.content;return{...e,content:`<${t.length} chars elided>`}}return D(e)}):t[n]=D(r);return t}return e}function O({profile:e,open:t,onOpenChange:n}){let r=f(e=>e.apiCall),[i,o]=(0,w.useState)(()=>E(e)),[s,c]=(0,w.useState)(!1),[l,d]=(0,w.useState)(null),[g,O]=(0,w.useState)(null),k=(0,w.useCallback)(async t=>{c(!0),d(null);try{O((await r(`GET`,`/agent-profiles/${encodeURIComponent(e.name)}/resolved?provider=${t}`)).profile)}catch(e){O(null),d(p(e))}finally{c(!1)}},[r,e.name]);(0,w.useEffect)(()=>{if(t){let t=E(e);o(t),k(t)}},[t,e,k]);function A(e){e!==i&&(o(e),k(e))}function j(){if(!g)return;let t=new Blob([JSON.stringify(g,null,2)],{type:`application/json`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`${e.name}.${i}.resolved.json`,document.body.appendChild(r),r.click(),r.remove(),URL.revokeObjectURL(n)}let M=g?JSON.stringify(D(g),null,2):``;return(0,T.jsx)(C,{open:t,onOpenChange:n,children:(0,T.jsxs)(b,{className:`max-w-3xl`,children:[(0,T.jsxs)(v,{children:[(0,T.jsxs)(x,{className:`font-mono text-sm`,children:[e.name,` — resolved projection`]}),(0,T.jsxs)(S,{children:[`The fully-resolved agent-profile projection (`,(0,T.jsx)(`code`,{children:`withResolvedProvisioning`}),`) for the selected provider. File contents are elided below; download the full JSON for the complete bundle.`]})]}),(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,T.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Provider`}),(0,T.jsx)(`div`,{className:`flex items-center gap-1`,children:h().map(e=>(0,T.jsx)(_,{variant:e===i?`default`:`outline`,size:`sm`,className:`h-7 px-3 text-xs`,disabled:s,onClick:()=>A(e),children:m(e)},e))}),(0,T.jsx)(`div`,{className:`flex-1`}),(0,T.jsxs)(_,{size:`sm`,className:`h-7 gap-1 text-xs`,disabled:s||!g,onClick:j,children:[(0,T.jsx)(a,{className:`h-3.5 w-3.5`}),`Download full JSON`]})]}),(0,T.jsx)(`div`,{className:`min-h-[16rem] overflow-auto rounded-md border border-border bg-muted/30 p-3`,children:s?(0,T.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,T.jsx)(u,{className:`h-3.5 w-3.5 animate-spin`}),`Resolving projection…`]}):l?(0,T.jsx)(`div`,{className:`text-xs text-destructive`,children:l}):g?(0,T.jsx)(`pre`,{className:`max-h-[60vh] overflow-auto whitespace-pre-wrap break-words font-mono text-[11px] leading-relaxed`,children:M}):(0,T.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`No projection available.`})}),(0,T.jsx)(y,{children:(0,T.jsx)(_,{variant:`outline`,size:`sm`,onClick:()=>n(!1),children:`Close`})})]})})}var k={host:`text-emerald-400 bg-emerald-500/10`,minimal:`text-amber-400 bg-amber-500/10`,isolated:`text-red-400 bg-red-500/10`,vanilla:`text-fuchsia-400 bg-fuchsia-500/10`};function A({relay:e}){return(0,T.jsx)(`div`,{className:`flex items-center gap-1`,children:[{key:`ctx`,on:e.context},{key:`skl`,on:e.skills},{key:`plg`,on:e.plugins},{key:`stl`,on:e.statusLine}].map(e=>(0,T.jsx)(`span`,{className:`inline-block h-1.5 w-1.5 rounded-full ${e.on?`bg-emerald-400`:`bg-muted-foreground/30`}`,title:`${e.key}: ${e.on?`on`:`off`}`},e.key))})}function j({profile:e}){let r=f(e=>e.openProfileModal),a=f(e=>e.deleteProfile),s=e.builtIn===!0,[c,l]=(0,w.useState)(!1);return(0,T.jsxs)(`div`,{className:`group flex flex-col gap-3 rounded-lg border border-border bg-card p-4`,children:[(0,T.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,T.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsx)(`span`,{className:`text-base leading-none`,"aria-hidden":!0,children:e.icon?.trim()||`•`}),(0,T.jsx)(`span`,{className:`font-mono text-sm font-medium`,children:e.name}),s&&(0,T.jsx)(g,{variant:`secondary`,className:`text-[10px]`,children:`Built-in`}),e.overridden&&(0,T.jsx)(g,{variant:`outline`,className:`text-[10px] border-amber-500/30 bg-amber-500/10 text-amber-400`,children:`Overridden`})]}),e.description&&(0,T.jsx)(`p`,{className:`mt-0.5 text-xs text-muted-foreground line-clamp-2`,children:e.description})]}),(0,T.jsxs)(`div`,{className:`flex shrink-0 items-center gap-0.5 opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity`,children:[(0,T.jsx)(_,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7`,title:`View`,onClick:()=>r(`view`,e),children:(0,T.jsx)(n,{className:`h-3.5 w-3.5`})}),(0,T.jsx)(_,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7`,title:`Edit`,onClick:()=>r(`edit`,e),children:(0,T.jsx)(t,{className:`h-3.5 w-3.5`})}),(0,T.jsx)(_,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7`,title:`Duplicate`,onClick:()=>r(`duplicate`,e),children:(0,T.jsx)(i,{className:`h-3.5 w-3.5`})}),(0,T.jsx)(_,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7`,title:`Resolved projection`,onClick:()=>l(!0),children:(0,T.jsx)(d,{className:`h-3.5 w-3.5`})}),(!s||e.overridden)&&(0,T.jsx)(_,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7 text-destructive`,title:s?`Reset to default`:`Delete`,onClick:()=>a(e),children:(0,T.jsx)(o,{className:`h-3.5 w-3.5`})})]})]}),(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5 text-[10px]`,children:[(0,T.jsx)(g,{variant:`outline`,className:k[e.base]||``,children:e.base}),(0,T.jsx)(g,{variant:`outline`,children:e.provider||`any`}),(0,T.jsxs)(g,{variant:`outline`,children:[`fs: `,e.permissions.filesystem]}),e.permissions.mode&&(0,T.jsx)(g,{variant:`outline`,children:e.permissions.mode})]}),(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-4 gap-y-1 text-[10px] text-muted-foreground`,children:[(0,T.jsxs)(`span`,{className:`flex items-center gap-1`,children:[`Relay `,(0,T.jsx)(A,{relay:e.relay})]}),(0,T.jsxs)(`span`,{children:[`MCP: `,e.mcp.mode]}),(0,T.jsxs)(`span`,{children:[`Hooks: `,e.hooks.mode]}),e.instructions.globalInstructions===`ignore`&&(0,T.jsx)(`span`,{className:`text-amber-400`,children:`global: ignore`}),Object.keys(e.env||{}).length>0&&(0,T.jsxs)(`span`,{children:[Object.keys(e.env).length,` env vars`]})]}),(0,T.jsx)(O,{profile:e,open:c,onOpenChange:l})]})}function M(){let e=f(e=>e.agentProfiles),t=f(e=>e.openProfileModal),n=e.filter(e=>e.builtIn),i=e.filter(e=>!e.builtIn);return(0,T.jsxs)(`div`,{className:`space-y-4`,children:[(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2 text-lg font-semibold`,children:[(0,T.jsx)(l,{className:`h-5 w-5 text-primary`}),`Agent Profiles`]}),(0,T.jsx)(g,{variant:`outline`,children:e.length}),(0,T.jsx)(`div`,{className:`flex-1`}),(0,T.jsxs)(_,{size:`sm`,className:`gap-1`,onClick:()=>t(`create`),children:[(0,T.jsx)(r,{className:`h-3.5 w-3.5`}),`Create Profile`]})]}),n.length>0&&(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`h3`,{className:`mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wider`,children:`Built-in`}),(0,T.jsx)(`div`,{className:`grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3`,children:n.map(e=>(0,T.jsx)(j,{profile:e},e.name))})]}),i.length>0&&(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`h3`,{className:`mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wider`,children:`Custom`}),(0,T.jsx)(`div`,{className:`grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3`,children:i.map(e=>(0,T.jsx)(j,{profile:e},e.name))})]}),e.length===0&&(0,T.jsx)(`div`,{className:`py-12 text-center text-sm text-muted-foreground`,children:`No agent profiles found. Create one to configure agent behavior.`})]})}export{M as AgentProfilesView};
2
- //# sourceMappingURL=agent-profiles-CKzttq6G.js.map
1
+ import{r as e}from"./chunk-CilyBKbf.js";import{H as t,Jt as n,K as r,Yt as i,g as a,gr as o,mt as s,on as c,p as l,rr as u,tn as d}from"./lucide-react-CoU_Xts2.js";import{t as f}from"./store-zFLzd0Jd.js";import{d as p,g as m,m as h}from"./types-CRptbSYh.js";import{t as g}from"./badge-XEru6wto.js";import{t as _}from"./button-C3CQSr4p.js";import{a as v,i as y,n as b,o as x,r as S,t as C}from"./index-DnUo0Zqg.js";var w=e(o(),1),T=u();function E(e){let t=h(),n=e.provider??``;return n&&n!==`any`&&t.includes(n)?n:t[0]??n}function D(e){if(Array.isArray(e))return e.map(D);if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))n===`files`&&Array.isArray(r)?t[n]=r.map(e=>{if(e&&typeof e==`object`&&typeof e.content==`string`){let t=e.content;return{...e,content:`<${t.length} chars elided>`}}return D(e)}):t[n]=D(r);return t}return e}function O({profile:e,open:t,onOpenChange:n}){let r=f(e=>e.apiCall),[i,a]=(0,w.useState)(()=>E(e)),[o,c]=(0,w.useState)(!1),[l,u]=(0,w.useState)(null),[g,O]=(0,w.useState)(null),k=(0,w.useCallback)(async t=>{c(!0),u(null);try{O((await r(`GET`,`/agent-profiles/${encodeURIComponent(e.name)}/resolved?provider=${t}`)).profile)}catch(e){O(null),u(p(e))}finally{c(!1)}},[r,e.name]);(0,w.useEffect)(()=>{if(t){let t=E(e);a(t),k(t)}},[t,e,k]);function A(e){e!==i&&(a(e),k(e))}function j(){if(!g)return;let t=new Blob([JSON.stringify(g,null,2)],{type:`application/json`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`${e.name}.${i}.resolved.json`,document.body.appendChild(r),r.click(),r.remove(),URL.revokeObjectURL(n)}let M=g?JSON.stringify(D(g),null,2):``;return(0,T.jsx)(C,{open:t,onOpenChange:n,children:(0,T.jsxs)(b,{className:`max-w-3xl`,children:[(0,T.jsxs)(v,{children:[(0,T.jsxs)(x,{className:`font-mono text-sm`,children:[e.name,` — resolved projection`]}),(0,T.jsxs)(S,{children:[`The fully-resolved agent-profile projection (`,(0,T.jsx)(`code`,{children:`withResolvedProvisioning`}),`) for the selected provider. File contents are elided below; download the full JSON for the complete bundle.`]})]}),(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,T.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Provider`}),(0,T.jsx)(`div`,{className:`flex items-center gap-1`,children:h().map(e=>(0,T.jsx)(_,{variant:e===i?`default`:`outline`,size:`sm`,className:`h-7 px-3 text-xs`,disabled:o,onClick:()=>A(e),children:m(e)},e))}),(0,T.jsx)(`div`,{className:`flex-1`}),(0,T.jsxs)(_,{size:`sm`,className:`h-7 gap-1 text-xs`,disabled:o||!g,onClick:j,children:[(0,T.jsx)(d,{className:`h-3.5 w-3.5`}),`Download full JSON`]})]}),(0,T.jsx)(`div`,{className:`min-h-[16rem] overflow-auto rounded-md border border-border bg-muted/30 p-3`,children:o?(0,T.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,T.jsx)(s,{className:`h-3.5 w-3.5 animate-spin`}),`Resolving projection…`]}):l?(0,T.jsx)(`div`,{className:`text-xs text-destructive`,children:l}):g?(0,T.jsx)(`pre`,{className:`max-h-[60vh] overflow-auto whitespace-pre-wrap break-words font-mono text-[11px] leading-relaxed`,children:M}):(0,T.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`No projection available.`})}),(0,T.jsx)(y,{children:(0,T.jsx)(_,{variant:`outline`,size:`sm`,onClick:()=>n(!1),children:`Close`})})]})})}var k={host:`text-emerald-400 bg-emerald-500/10`,minimal:`text-amber-400 bg-amber-500/10`,isolated:`text-red-400 bg-red-500/10`,vanilla:`text-fuchsia-400 bg-fuchsia-500/10`};function A({relay:e}){return(0,T.jsx)(`div`,{className:`flex items-center gap-1`,children:[{key:`ctx`,on:e.context},{key:`skl`,on:e.skills},{key:`plg`,on:e.plugins},{key:`stl`,on:e.statusLine}].map(e=>(0,T.jsx)(`span`,{className:`inline-block h-1.5 w-1.5 rounded-full ${e.on?`bg-emerald-400`:`bg-muted-foreground/30`}`,title:`${e.key}: ${e.on?`on`:`off`}`},e.key))})}function j({profile:e}){let t=f(e=>e.openProfileModal),o=f(e=>e.deleteProfile),s=e.builtIn===!0,[l,u]=(0,w.useState)(!1);return(0,T.jsxs)(`div`,{className:`group flex flex-col gap-3 rounded-lg border border-border bg-card p-4`,children:[(0,T.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,T.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsx)(`span`,{className:`text-base leading-none`,"aria-hidden":!0,children:e.icon?.trim()||`•`}),(0,T.jsx)(`span`,{className:`font-mono text-sm font-medium`,children:e.name}),s&&(0,T.jsx)(g,{variant:`secondary`,className:`text-[10px]`,children:`Built-in`}),e.overridden&&(0,T.jsx)(g,{variant:`outline`,className:`text-[10px] border-amber-500/30 bg-amber-500/10 text-amber-400`,children:`Overridden`})]}),e.description&&(0,T.jsx)(`p`,{className:`mt-0.5 text-xs text-muted-foreground line-clamp-2`,children:e.description})]}),(0,T.jsxs)(`div`,{className:`flex shrink-0 items-center gap-0.5 opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity`,children:[(0,T.jsx)(_,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7`,title:`View`,onClick:()=>t(`view`,e),children:(0,T.jsx)(i,{className:`h-3.5 w-3.5`})}),(0,T.jsx)(_,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7`,title:`Edit`,onClick:()=>t(`edit`,e),children:(0,T.jsx)(r,{className:`h-3.5 w-3.5`})}),(0,T.jsx)(_,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7`,title:`Duplicate`,onClick:()=>t(`duplicate`,e),children:(0,T.jsx)(c,{className:`h-3.5 w-3.5`})}),(0,T.jsx)(_,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7`,title:`Resolved projection`,onClick:()=>u(!0),children:(0,T.jsx)(n,{className:`h-3.5 w-3.5`})}),(!s||e.overridden)&&(0,T.jsx)(_,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7 text-destructive`,title:s?`Reset to default`:`Delete`,onClick:()=>o(e),children:(0,T.jsx)(a,{className:`h-3.5 w-3.5`})})]})]}),(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5 text-[10px]`,children:[(0,T.jsx)(g,{variant:`outline`,className:k[e.base]||``,children:e.base}),(0,T.jsx)(g,{variant:`outline`,children:e.provider||`any`}),(0,T.jsxs)(g,{variant:`outline`,children:[`fs: `,e.permissions.filesystem]}),e.permissions.mode&&(0,T.jsx)(g,{variant:`outline`,children:e.permissions.mode})]}),(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-4 gap-y-1 text-[10px] text-muted-foreground`,children:[(0,T.jsxs)(`span`,{className:`flex items-center gap-1`,children:[`Relay `,(0,T.jsx)(A,{relay:e.relay})]}),(0,T.jsxs)(`span`,{children:[`MCP: `,e.mcp.mode]}),(0,T.jsxs)(`span`,{children:[`Hooks: `,e.hooks.mode]}),e.instructions.globalInstructions===`ignore`&&(0,T.jsx)(`span`,{className:`text-amber-400`,children:`global: ignore`}),Object.keys(e.env||{}).length>0&&(0,T.jsxs)(`span`,{children:[Object.keys(e.env).length,` env vars`]})]}),(0,T.jsx)(O,{profile:e,open:l,onOpenChange:u})]})}function M(){let e=f(e=>e.agentProfiles),n=f(e=>e.openProfileModal),r=e.filter(e=>e.builtIn),i=e.filter(e=>!e.builtIn);return(0,T.jsxs)(`div`,{className:`space-y-4`,children:[(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2 text-lg font-semibold`,children:[(0,T.jsx)(l,{className:`h-5 w-5 text-primary`}),`Agent Profiles`]}),(0,T.jsx)(g,{variant:`outline`,children:e.length}),(0,T.jsx)(`div`,{className:`flex-1`}),(0,T.jsxs)(_,{size:`sm`,className:`gap-1`,onClick:()=>n(`create`),children:[(0,T.jsx)(t,{className:`h-3.5 w-3.5`}),`Create Profile`]})]}),r.length>0&&(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`h3`,{className:`mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wider`,children:`Built-in`}),(0,T.jsx)(`div`,{className:`grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3`,children:r.map(e=>(0,T.jsx)(j,{profile:e},e.name))})]}),i.length>0&&(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`h3`,{className:`mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wider`,children:`Custom`}),(0,T.jsx)(`div`,{className:`grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3`,children:i.map(e=>(0,T.jsx)(j,{profile:e},e.name))})]}),e.length===0&&(0,T.jsx)(`div`,{className:`py-12 text-center text-sm text-muted-foreground`,children:`No agent profiles found. Create one to configure agent behavior.`})]})}export{M as AgentProfilesView};
2
+ //# sourceMappingURL=agent-profiles-D5Izg0Vn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-profiles-CKzttq6G.js","names":[],"sources":["../../dashboard/src/components/views/agent-profile-resolved-dialog.tsx","../../dashboard/src/components/views/agent-profiles.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport { errMessage } from 'agent-relay-sdk/types'\nimport { Download, Loader2 } from 'lucide-react'\nimport { useRelayStore } from '@/store'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from '@/components/ui/dialog'\nimport { Button } from '@/components/ui/button'\nimport type { AgentProfile } from '@/types'\nimport { getKnownProviderIds, getProviderLabel } from '@/lib/provider-display'\n\ninterface ResolvedResponse {\n provider: string\n profile: AgentProfile\n}\n\ninterface AgentProfileResolvedDialogProps {\n profile: AgentProfile\n open: boolean\n onOpenChange: (open: boolean) => void\n}\n\nfunction defaultProvider(profile: AgentProfile): string {\n const ids = getKnownProviderIds()\n const p = profile.provider ?? ''\n if (p && p !== 'any' && ids.includes(p)) return p\n return ids[0] ?? p\n}\n\n// Deep-clone the projection, replacing every `provisioning.*.files[].content` blob with a\n// `<N chars elided>` marker so the inline view stays legible without dumping plugin/skill\n// source. The full content remains available via the JSON download.\nfunction elideFileContents(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(elideFileContents)\n if (value && typeof value === 'object') {\n const out: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n if (key === 'files' && Array.isArray(val)) {\n out[key] = val.map((file) => {\n if (file && typeof file === 'object' && typeof (file as Record<string, unknown>).content === 'string') {\n const content = (file as Record<string, unknown>).content as string\n return { ...(file as Record<string, unknown>), content: `<${content.length} chars elided>` }\n }\n return elideFileContents(file)\n })\n } else {\n out[key] = elideFileContents(val)\n }\n }\n return out\n }\n return value\n}\n\nexport function AgentProfileResolvedDialog({ profile, open, onOpenChange }: AgentProfileResolvedDialogProps) {\n const apiCall = useRelayStore((s) => s.apiCall)\n const [provider, setProvider] = useState<string>(() => defaultProvider(profile))\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [resolved, setResolved] = useState<AgentProfile | null>(null)\n\n const load = useCallback(async (p: string) => {\n setLoading(true)\n setError(null)\n try {\n const result = await apiCall<ResolvedResponse>('GET', `/agent-profiles/${encodeURIComponent(profile.name)}/resolved?provider=${p}`)\n setResolved(result.profile)\n } catch (e) {\n setResolved(null)\n setError(errMessage(e))\n } finally {\n setLoading(false)\n }\n }, [apiCall, profile.name])\n\n useEffect(() => {\n if (open) {\n const p = defaultProvider(profile)\n setProvider(p)\n void load(p)\n }\n }, [open, profile, load])\n\n function selectProvider(p: string) {\n if (p === provider) return\n setProvider(p)\n void load(p)\n }\n\n function downloadFullJson() {\n if (!resolved) return\n const blob = new Blob([JSON.stringify(resolved, null, 2)], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = `${profile.name}.${provider}.resolved.json`\n document.body.appendChild(link)\n link.click()\n link.remove()\n URL.revokeObjectURL(url)\n }\n\n const elided = resolved ? JSON.stringify(elideFileContents(resolved), null, 2) : ''\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle className=\"font-mono text-sm\">{profile.name} — resolved projection</DialogTitle>\n <DialogDescription>\n The fully-resolved agent-profile projection (<code>withResolvedProvisioning</code>) for the selected provider.\n File contents are elided below; download the full JSON for the complete bundle.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">Provider</span>\n <div className=\"flex items-center gap-1\">\n {getKnownProviderIds().map((p) => (\n <Button\n key={p}\n variant={p === provider ? 'default' : 'outline'}\n size=\"sm\"\n className=\"h-7 px-3 text-xs\"\n disabled={loading}\n onClick={() => selectProvider(p)}\n >\n {getProviderLabel(p)}\n </Button>\n ))}\n </div>\n <div className=\"flex-1\" />\n <Button size=\"sm\" className=\"h-7 gap-1 text-xs\" disabled={loading || !resolved} onClick={downloadFullJson}>\n <Download className=\"h-3.5 w-3.5\" />\n Download full JSON\n </Button>\n </div>\n\n <div className=\"min-h-[16rem] overflow-auto rounded-md border border-border bg-muted/30 p-3\">\n {loading ? (\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Resolving projection…\n </div>\n ) : error ? (\n <div className=\"text-xs text-destructive\">{error}</div>\n ) : resolved ? (\n <pre className=\"max-h-[60vh] overflow-auto whitespace-pre-wrap break-words font-mono text-[11px] leading-relaxed\">{elided}</pre>\n ) : (\n <div className=\"text-xs text-muted-foreground\">No projection available.</div>\n )}\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" size=\"sm\" onClick={() => onOpenChange(false)}>Close</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","import { useState } from 'react'\nimport { useRelayStore } from '@/store'\nimport { Button } from '@/components/ui/button'\nimport { Badge } from '@/components/ui/badge'\nimport { Copy, Eye, FileJson, Pencil, Plus, Trash2, UserCog } from 'lucide-react'\nimport type { AgentProfile } from '@/types'\nimport { AgentProfileResolvedDialog } from './agent-profile-resolved-dialog'\n\nconst BASE_COLORS: Record<string, string> = {\n host: 'text-emerald-400 bg-emerald-500/10',\n minimal: 'text-amber-400 bg-amber-500/10',\n isolated: 'text-red-400 bg-red-500/10',\n vanilla: 'text-fuchsia-400 bg-fuchsia-500/10',\n}\n\nfunction RelayDots({ relay }: { relay: AgentProfile['relay'] }) {\n const items = [\n { key: 'ctx', on: relay.context },\n { key: 'skl', on: relay.skills },\n { key: 'plg', on: relay.plugins },\n { key: 'stl', on: relay.statusLine },\n ]\n return (\n <div className=\"flex items-center gap-1\">\n {items.map((item) => (\n <span key={item.key} className={`inline-block h-1.5 w-1.5 rounded-full ${item.on ? 'bg-emerald-400' : 'bg-muted-foreground/30'}`} title={`${item.key}: ${item.on ? 'on' : 'off'}`} />\n ))}\n </div>\n )\n}\n\nfunction ProfileCard({ profile }: { profile: AgentProfile }) {\n const openProfileModal = useRelayStore((s) => s.openProfileModal)\n const deleteProfile = useRelayStore((s) => s.deleteProfile)\n const isBuiltIn = profile.builtIn === true\n const [resolvedOpen, setResolvedOpen] = useState(false)\n\n return (\n <div className=\"group flex flex-col gap-3 rounded-lg border border-border bg-card p-4\">\n <div className=\"flex items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-base leading-none\" aria-hidden>{profile.icon?.trim() || '•'}</span>\n <span className=\"font-mono text-sm font-medium\">{profile.name}</span>\n {isBuiltIn && <Badge variant=\"secondary\" className=\"text-[10px]\">Built-in</Badge>}\n {profile.overridden && <Badge variant=\"outline\" className=\"text-[10px] border-amber-500/30 bg-amber-500/10 text-amber-400\">Overridden</Badge>}\n </div>\n {profile.description && (\n <p className=\"mt-0.5 text-xs text-muted-foreground line-clamp-2\">{profile.description}</p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-0.5 opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity\">\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7\" title=\"View\" onClick={() => openProfileModal('view', profile)}>\n <Eye className=\"h-3.5 w-3.5\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7\" title=\"Edit\" onClick={() => openProfileModal('edit', profile)}>\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7\" title=\"Duplicate\" onClick={() => openProfileModal('duplicate', profile)}>\n <Copy className=\"h-3.5 w-3.5\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7\" title=\"Resolved projection\" onClick={() => setResolvedOpen(true)}>\n <FileJson className=\"h-3.5 w-3.5\" />\n </Button>\n {(!isBuiltIn || profile.overridden) && (\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7 text-destructive\" title={isBuiltIn ? 'Reset to default' : 'Delete'} onClick={() => deleteProfile(profile)}>\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-1.5 text-[10px]\">\n <Badge variant=\"outline\" className={BASE_COLORS[profile.base] || ''}>{profile.base}</Badge>\n <Badge variant=\"outline\">{profile.provider || 'any'}</Badge>\n <Badge variant=\"outline\">fs: {profile.permissions.filesystem}</Badge>\n {profile.permissions.mode && <Badge variant=\"outline\">{profile.permissions.mode}</Badge>}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-[10px] text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n Relay <RelayDots relay={profile.relay} />\n </span>\n <span>MCP: {profile.mcp.mode}</span>\n <span>Hooks: {profile.hooks.mode}</span>\n {profile.instructions.globalInstructions === 'ignore' && <span className=\"text-amber-400\">global: ignore</span>}\n {Object.keys(profile.env || {}).length > 0 && <span>{Object.keys(profile.env).length} env vars</span>}\n </div>\n\n <AgentProfileResolvedDialog profile={profile} open={resolvedOpen} onOpenChange={setResolvedOpen} />\n </div>\n )\n}\n\nexport function AgentProfilesView() {\n const profiles = useRelayStore((s) => s.agentProfiles)\n const openProfileModal = useRelayStore((s) => s.openProfileModal)\n\n const builtIn = profiles.filter((p) => p.builtIn)\n const custom = profiles.filter((p) => !p.builtIn)\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"flex items-center gap-2 text-lg font-semibold\">\n <UserCog className=\"h-5 w-5 text-primary\" />\n Agent Profiles\n </div>\n <Badge variant=\"outline\">{profiles.length}</Badge>\n <div className=\"flex-1\" />\n <Button size=\"sm\" className=\"gap-1\" onClick={() => openProfileModal('create')}>\n <Plus className=\"h-3.5 w-3.5\" />\n Create Profile\n </Button>\n </div>\n\n {builtIn.length > 0 && (\n <div>\n <h3 className=\"mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wider\">Built-in</h3>\n <div className=\"grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\">\n {builtIn.map((p) => <ProfileCard key={p.name} profile={p} />)}\n </div>\n </div>\n )}\n\n {custom.length > 0 && (\n <div>\n <h3 className=\"mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wider\">Custom</h3>\n <div className=\"grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\">\n {custom.map((p) => <ProfileCard key={p.name} profile={p} />)}\n </div>\n </div>\n )}\n\n {profiles.length === 0 && (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">\n No agent profiles found. Create one to configure agent behavior.\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"agent-profiles-D5Izg0Vn.js","names":[],"sources":["../../dashboard/src/components/views/agent-profile-resolved-dialog.tsx","../../dashboard/src/components/views/agent-profiles.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport { errMessage } from 'agent-relay-sdk/types'\nimport { Download, Loader2 } from 'lucide-react'\nimport { useRelayStore } from '@/store'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from '@/components/ui/dialog'\nimport { Button } from '@/components/ui/button'\nimport type { AgentProfile } from '@/types'\nimport { getKnownProviderIds, getProviderLabel } from '@/lib/provider-display'\n\ninterface ResolvedResponse {\n provider: string\n profile: AgentProfile\n}\n\ninterface AgentProfileResolvedDialogProps {\n profile: AgentProfile\n open: boolean\n onOpenChange: (open: boolean) => void\n}\n\nfunction defaultProvider(profile: AgentProfile): string {\n const ids = getKnownProviderIds()\n const p = profile.provider ?? ''\n if (p && p !== 'any' && ids.includes(p)) return p\n return ids[0] ?? p\n}\n\n// Deep-clone the projection, replacing every `provisioning.*.files[].content` blob with a\n// `<N chars elided>` marker so the inline view stays legible without dumping plugin/skill\n// source. The full content remains available via the JSON download.\nfunction elideFileContents(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(elideFileContents)\n if (value && typeof value === 'object') {\n const out: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n if (key === 'files' && Array.isArray(val)) {\n out[key] = val.map((file) => {\n if (file && typeof file === 'object' && typeof (file as Record<string, unknown>).content === 'string') {\n const content = (file as Record<string, unknown>).content as string\n return { ...(file as Record<string, unknown>), content: `<${content.length} chars elided>` }\n }\n return elideFileContents(file)\n })\n } else {\n out[key] = elideFileContents(val)\n }\n }\n return out\n }\n return value\n}\n\nexport function AgentProfileResolvedDialog({ profile, open, onOpenChange }: AgentProfileResolvedDialogProps) {\n const apiCall = useRelayStore((s) => s.apiCall)\n const [provider, setProvider] = useState<string>(() => defaultProvider(profile))\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [resolved, setResolved] = useState<AgentProfile | null>(null)\n\n const load = useCallback(async (p: string) => {\n setLoading(true)\n setError(null)\n try {\n const result = await apiCall<ResolvedResponse>('GET', `/agent-profiles/${encodeURIComponent(profile.name)}/resolved?provider=${p}`)\n setResolved(result.profile)\n } catch (e) {\n setResolved(null)\n setError(errMessage(e))\n } finally {\n setLoading(false)\n }\n }, [apiCall, profile.name])\n\n useEffect(() => {\n if (open) {\n const p = defaultProvider(profile)\n setProvider(p)\n void load(p)\n }\n }, [open, profile, load])\n\n function selectProvider(p: string) {\n if (p === provider) return\n setProvider(p)\n void load(p)\n }\n\n function downloadFullJson() {\n if (!resolved) return\n const blob = new Blob([JSON.stringify(resolved, null, 2)], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = `${profile.name}.${provider}.resolved.json`\n document.body.appendChild(link)\n link.click()\n link.remove()\n URL.revokeObjectURL(url)\n }\n\n const elided = resolved ? JSON.stringify(elideFileContents(resolved), null, 2) : ''\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle className=\"font-mono text-sm\">{profile.name} — resolved projection</DialogTitle>\n <DialogDescription>\n The fully-resolved agent-profile projection (<code>withResolvedProvisioning</code>) for the selected provider.\n File contents are elided below; download the full JSON for the complete bundle.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">Provider</span>\n <div className=\"flex items-center gap-1\">\n {getKnownProviderIds().map((p) => (\n <Button\n key={p}\n variant={p === provider ? 'default' : 'outline'}\n size=\"sm\"\n className=\"h-7 px-3 text-xs\"\n disabled={loading}\n onClick={() => selectProvider(p)}\n >\n {getProviderLabel(p)}\n </Button>\n ))}\n </div>\n <div className=\"flex-1\" />\n <Button size=\"sm\" className=\"h-7 gap-1 text-xs\" disabled={loading || !resolved} onClick={downloadFullJson}>\n <Download className=\"h-3.5 w-3.5\" />\n Download full JSON\n </Button>\n </div>\n\n <div className=\"min-h-[16rem] overflow-auto rounded-md border border-border bg-muted/30 p-3\">\n {loading ? (\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Resolving projection…\n </div>\n ) : error ? (\n <div className=\"text-xs text-destructive\">{error}</div>\n ) : resolved ? (\n <pre className=\"max-h-[60vh] overflow-auto whitespace-pre-wrap break-words font-mono text-[11px] leading-relaxed\">{elided}</pre>\n ) : (\n <div className=\"text-xs text-muted-foreground\">No projection available.</div>\n )}\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" size=\"sm\" onClick={() => onOpenChange(false)}>Close</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","import { useState } from 'react'\nimport { useRelayStore } from '@/store'\nimport { Button } from '@/components/ui/button'\nimport { Badge } from '@/components/ui/badge'\nimport { Copy, Eye, FileJson, Pencil, Plus, Trash2, UserCog } from 'lucide-react'\nimport type { AgentProfile } from '@/types'\nimport { AgentProfileResolvedDialog } from './agent-profile-resolved-dialog'\n\nconst BASE_COLORS: Record<string, string> = {\n host: 'text-emerald-400 bg-emerald-500/10',\n minimal: 'text-amber-400 bg-amber-500/10',\n isolated: 'text-red-400 bg-red-500/10',\n vanilla: 'text-fuchsia-400 bg-fuchsia-500/10',\n}\n\nfunction RelayDots({ relay }: { relay: AgentProfile['relay'] }) {\n const items = [\n { key: 'ctx', on: relay.context },\n { key: 'skl', on: relay.skills },\n { key: 'plg', on: relay.plugins },\n { key: 'stl', on: relay.statusLine },\n ]\n return (\n <div className=\"flex items-center gap-1\">\n {items.map((item) => (\n <span key={item.key} className={`inline-block h-1.5 w-1.5 rounded-full ${item.on ? 'bg-emerald-400' : 'bg-muted-foreground/30'}`} title={`${item.key}: ${item.on ? 'on' : 'off'}`} />\n ))}\n </div>\n )\n}\n\nfunction ProfileCard({ profile }: { profile: AgentProfile }) {\n const openProfileModal = useRelayStore((s) => s.openProfileModal)\n const deleteProfile = useRelayStore((s) => s.deleteProfile)\n const isBuiltIn = profile.builtIn === true\n const [resolvedOpen, setResolvedOpen] = useState(false)\n\n return (\n <div className=\"group flex flex-col gap-3 rounded-lg border border-border bg-card p-4\">\n <div className=\"flex items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-base leading-none\" aria-hidden>{profile.icon?.trim() || '•'}</span>\n <span className=\"font-mono text-sm font-medium\">{profile.name}</span>\n {isBuiltIn && <Badge variant=\"secondary\" className=\"text-[10px]\">Built-in</Badge>}\n {profile.overridden && <Badge variant=\"outline\" className=\"text-[10px] border-amber-500/30 bg-amber-500/10 text-amber-400\">Overridden</Badge>}\n </div>\n {profile.description && (\n <p className=\"mt-0.5 text-xs text-muted-foreground line-clamp-2\">{profile.description}</p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-0.5 opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity\">\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7\" title=\"View\" onClick={() => openProfileModal('view', profile)}>\n <Eye className=\"h-3.5 w-3.5\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7\" title=\"Edit\" onClick={() => openProfileModal('edit', profile)}>\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7\" title=\"Duplicate\" onClick={() => openProfileModal('duplicate', profile)}>\n <Copy className=\"h-3.5 w-3.5\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7\" title=\"Resolved projection\" onClick={() => setResolvedOpen(true)}>\n <FileJson className=\"h-3.5 w-3.5\" />\n </Button>\n {(!isBuiltIn || profile.overridden) && (\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7 text-destructive\" title={isBuiltIn ? 'Reset to default' : 'Delete'} onClick={() => deleteProfile(profile)}>\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-1.5 text-[10px]\">\n <Badge variant=\"outline\" className={BASE_COLORS[profile.base] || ''}>{profile.base}</Badge>\n <Badge variant=\"outline\">{profile.provider || 'any'}</Badge>\n <Badge variant=\"outline\">fs: {profile.permissions.filesystem}</Badge>\n {profile.permissions.mode && <Badge variant=\"outline\">{profile.permissions.mode}</Badge>}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-[10px] text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n Relay <RelayDots relay={profile.relay} />\n </span>\n <span>MCP: {profile.mcp.mode}</span>\n <span>Hooks: {profile.hooks.mode}</span>\n {profile.instructions.globalInstructions === 'ignore' && <span className=\"text-amber-400\">global: ignore</span>}\n {Object.keys(profile.env || {}).length > 0 && <span>{Object.keys(profile.env).length} env vars</span>}\n </div>\n\n <AgentProfileResolvedDialog profile={profile} open={resolvedOpen} onOpenChange={setResolvedOpen} />\n </div>\n )\n}\n\nexport function AgentProfilesView() {\n const profiles = useRelayStore((s) => s.agentProfiles)\n const openProfileModal = useRelayStore((s) => s.openProfileModal)\n\n const builtIn = profiles.filter((p) => p.builtIn)\n const custom = profiles.filter((p) => !p.builtIn)\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"flex items-center gap-2 text-lg font-semibold\">\n <UserCog className=\"h-5 w-5 text-primary\" />\n Agent Profiles\n </div>\n <Badge variant=\"outline\">{profiles.length}</Badge>\n <div className=\"flex-1\" />\n <Button size=\"sm\" className=\"gap-1\" onClick={() => openProfileModal('create')}>\n <Plus className=\"h-3.5 w-3.5\" />\n Create Profile\n </Button>\n </div>\n\n {builtIn.length > 0 && (\n <div>\n <h3 className=\"mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wider\">Built-in</h3>\n <div className=\"grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\">\n {builtIn.map((p) => <ProfileCard key={p.name} profile={p} />)}\n </div>\n </div>\n )}\n\n {custom.length > 0 && (\n <div>\n <h3 className=\"mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wider\">Custom</h3>\n <div className=\"grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\">\n {custom.map((p) => <ProfileCard key={p.name} profile={p} />)}\n </div>\n </div>\n )}\n\n {profiles.length === 0 && (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">\n No agent profiles found. Create one to configure agent behavior.\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{D as e,Ln as t,_ as n,d as r,er as i,nr as a,tt as o}from"./lucide-react-DuhlF2Sj.js";import{o as s}from"./display-CJzSoTMq.js";var c=a();function l({className:e}){return(0,c.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 16 16`,fill:`currentColor`,"aria-hidden":`true`,className:e,children:(0,c.jsx)(`path`,{d:`m3.127 10.604 3.135-1.76.053-.153-.053-.085H6.11l-.525-.032-1.791-.048-1.554-.065-1.505-.08-.38-.081L0 7.832l.036-.234.32-.214.455.04 1.009.069 1.513.105 1.097.064 1.626.17h.259l.036-.105-.089-.065-.068-.064-1.566-1.062-1.695-1.121-.887-.646-.48-.327-.243-.306-.104-.67.435-.48.585.04.15.04.593.456 1.267.981 1.654 1.218.242.202.097-.068.012-.049-.109-.181-.9-1.626-.96-1.655-.428-.686-.113-.411a2 2 0 0 1-.068-.484l.496-.674L4.446 0l.662.089.279.242.411.94.666 1.48 1.033 2.014.302.597.162.553.06.17h.105v-.097l.085-1.134.157-1.392.154-1.792.052-.504.25-.605.497-.327.387.186.319.456-.045.294-.19 1.23-.37 1.93-.243 1.29h.142l.161-.16.654-.868 1.097-1.372.484-.545.565-.601.363-.287h.686l.505.751-.226.775-.707.895-.585.759-.839 1.13-.524.904.048.072.125-.012 1.897-.403 1.024-.186 1.223-.21.553.258.06.263-.218.536-1.307.323-1.533.307-2.284.54-.028.02.032.04 1.029.098.44.024h1.077l2.005.15.525.346.315.424-.053.323-.807.411-3.631-.863-.872-.218h-.12v.073l.726.71 1.331 1.202 1.667 1.55.084.383-.214.302-.226-.032-1.464-1.101-.565-.497-1.28-1.077h-.084v.113l.295.432 1.557 2.34.08.718-.112.234-.404.141-.444-.08-.911-1.28-.94-1.44-.759-1.291-.093.053-.448 4.821-.21.246-.484.186-.403-.307-.214-.496.214-.98.258-1.28.21-1.016.19-1.263.112-.42-.008-.028-.092.012-.953 1.307-1.448 1.957-1.146 1.227-.274.109-.477-.247.045-.44.266-.39 1.586-2.018.956-1.25.617-.723-.004-.105h-.036l-4.212 2.736-.75.096-.324-.302.04-.496.154-.162 1.267-.871z`})})}function u({className:e}){return(0,c.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`currentColor`,"aria-hidden":`true`,className:e,children:(0,c.jsx)(`path`,{d:`M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.98 5.98 0 0 0 .51 4.911 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.99 5.99 0 0 0 3.997-2.9 6.056 6.056 0 0 0-.747-7.073zM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.141-.081 4.779-2.758a.795.795 0 0 0 .392-.681v-6.737l2.02 1.168a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494zM3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.771.771 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.676l5.815 3.355-2.02 1.168a.076.076 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855-5.833-3.387L15.119 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667zm2.01-3.023-.141-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.795.795 0 0 0-.393.681zm1.097-2.365 2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5z`})})}var d={claude:l,anthropic:l,codex:u,openai:u},f={claude:`text-orange-400`,anthropic:`text-orange-400`};function p({provider:e,className:t}){let n=e.toLowerCase(),r=d[n];return r?(0,c.jsx)(`span`,{role:`img`,"aria-label":e,title:e,className:`inline-flex shrink-0`,children:(0,c.jsx)(r,{className:i(f[n],t)})}):(0,c.jsx)(`span`,{className:`capitalize`,children:e})}var m={codex:`text-blue-400 bg-blue-500/10 border-blue-500/25`,claude:`text-orange-400 bg-orange-500/10 border-orange-500/25`,user:`text-emerald-400 bg-emerald-500/10 border-emerald-500/25`,system:`text-purple-400 bg-purple-500/10 border-purple-500/25`,channel:`text-blue-400 bg-blue-500/10 border-blue-500/25`,agent:`text-zinc-400 bg-zinc-500/10 border-zinc-500/25`},h={codex:n,claude:l,user:r,system:e,channel:o,agent:t};function g({agent:e,className:n}){let r=s(e),a=h[r]||t;return(0,c.jsx)(`span`,{className:i(`inline-flex items-center justify-center w-5 h-5 rounded-md border text-sm`,m[r]||m.agent,n),children:(0,c.jsx)(a,{className:`w-3.5 h-3.5`})})}export{p as n,g as t};
2
- //# sourceMappingURL=agent-type-icon-0ZJRP1Vy.js.map
1
+ import{O as e,Rn as t,_ as n,d as r,nt as i,rr as a,tr as o}from"./lucide-react-CoU_Xts2.js";import{o as s}from"./display-GFbGUG0O.js";var c=a();function l({className:e}){return(0,c.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 16 16`,fill:`currentColor`,"aria-hidden":`true`,className:e,children:(0,c.jsx)(`path`,{d:`m3.127 10.604 3.135-1.76.053-.153-.053-.085H6.11l-.525-.032-1.791-.048-1.554-.065-1.505-.08-.38-.081L0 7.832l.036-.234.32-.214.455.04 1.009.069 1.513.105 1.097.064 1.626.17h.259l.036-.105-.089-.065-.068-.064-1.566-1.062-1.695-1.121-.887-.646-.48-.327-.243-.306-.104-.67.435-.48.585.04.15.04.593.456 1.267.981 1.654 1.218.242.202.097-.068.012-.049-.109-.181-.9-1.626-.96-1.655-.428-.686-.113-.411a2 2 0 0 1-.068-.484l.496-.674L4.446 0l.662.089.279.242.411.94.666 1.48 1.033 2.014.302.597.162.553.06.17h.105v-.097l.085-1.134.157-1.392.154-1.792.052-.504.25-.605.497-.327.387.186.319.456-.045.294-.19 1.23-.37 1.93-.243 1.29h.142l.161-.16.654-.868 1.097-1.372.484-.545.565-.601.363-.287h.686l.505.751-.226.775-.707.895-.585.759-.839 1.13-.524.904.048.072.125-.012 1.897-.403 1.024-.186 1.223-.21.553.258.06.263-.218.536-1.307.323-1.533.307-2.284.54-.028.02.032.04 1.029.098.44.024h1.077l2.005.15.525.346.315.424-.053.323-.807.411-3.631-.863-.872-.218h-.12v.073l.726.71 1.331 1.202 1.667 1.55.084.383-.214.302-.226-.032-1.464-1.101-.565-.497-1.28-1.077h-.084v.113l.295.432 1.557 2.34.08.718-.112.234-.404.141-.444-.08-.911-1.28-.94-1.44-.759-1.291-.093.053-.448 4.821-.21.246-.484.186-.403-.307-.214-.496.214-.98.258-1.28.21-1.016.19-1.263.112-.42-.008-.028-.092.012-.953 1.307-1.448 1.957-1.146 1.227-.274.109-.477-.247.045-.44.266-.39 1.586-2.018.956-1.25.617-.723-.004-.105h-.036l-4.212 2.736-.75.096-.324-.302.04-.496.154-.162 1.267-.871z`})})}function u({className:e}){return(0,c.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`currentColor`,"aria-hidden":`true`,className:e,children:(0,c.jsx)(`path`,{d:`M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.98 5.98 0 0 0 .51 4.911 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.99 5.99 0 0 0 3.997-2.9 6.056 6.056 0 0 0-.747-7.073zM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.141-.081 4.779-2.758a.795.795 0 0 0 .392-.681v-6.737l2.02 1.168a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494zM3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.771.771 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.676l5.815 3.355-2.02 1.168a.076.076 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855-5.833-3.387L15.119 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667zm2.01-3.023-.141-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.795.795 0 0 0-.393.681zm1.097-2.365 2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5z`})})}var d={claude:l,anthropic:l,codex:u,openai:u},f={claude:`text-orange-400`,anthropic:`text-orange-400`};function p({provider:e,className:t}){let n=e.toLowerCase(),r=d[n];return r?(0,c.jsx)(`span`,{role:`img`,"aria-label":e,title:e,className:`inline-flex shrink-0`,children:(0,c.jsx)(r,{className:o(f[n],t)})}):(0,c.jsx)(`span`,{className:`capitalize`,children:e})}var m={codex:`text-blue-400 bg-blue-500/10 border-blue-500/25`,claude:`text-orange-400 bg-orange-500/10 border-orange-500/25`,user:`text-emerald-400 bg-emerald-500/10 border-emerald-500/25`,system:`text-purple-400 bg-purple-500/10 border-purple-500/25`,channel:`text-blue-400 bg-blue-500/10 border-blue-500/25`,agent:`text-zinc-400 bg-zinc-500/10 border-zinc-500/25`},h={codex:n,claude:l,user:r,system:e,channel:i,agent:t};function g({agent:e,className:n}){let r=s(e),i=h[r]||t;return(0,c.jsx)(`span`,{className:o(`inline-flex items-center justify-center w-5 h-5 rounded-md border text-sm`,m[r]||m.agent,n),children:(0,c.jsx)(i,{className:`w-3.5 h-3.5`})})}export{p as n,g as t};
2
+ //# sourceMappingURL=agent-type-icon-BxUopALO.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-type-icon-0ZJRP1Vy.js","names":[],"sources":["../../dashboard/src/components/shared/provider-brand-icon.tsx","../../dashboard/src/components/shared/agent-type-icon.tsx"],"sourcesContent":["import type { ComponentType } from 'react'\nimport { cn } from '@/lib/utils'\n\n// Provider brand marks as small inline SVGs (lucide ships none). These are the\n// recognizable logos used wherever a quota/agent row identifies its provider —\n// kept here so the Claude mark lives in one place (also consumed by\n// agent-type-icon.tsx) instead of being copy-pasted per call site.\n\nexport function ClaudeLogo({ className }: { className?: string }) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\" className={className}>\n <path d=\"m3.127 10.604 3.135-1.76.053-.153-.053-.085H6.11l-.525-.032-1.791-.048-1.554-.065-1.505-.08-.38-.081L0 7.832l.036-.234.32-.214.455.04 1.009.069 1.513.105 1.097.064 1.626.17h.259l.036-.105-.089-.065-.068-.064-1.566-1.062-1.695-1.121-.887-.646-.48-.327-.243-.306-.104-.67.435-.48.585.04.15.04.593.456 1.267.981 1.654 1.218.242.202.097-.068.012-.049-.109-.181-.9-1.626-.96-1.655-.428-.686-.113-.411a2 2 0 0 1-.068-.484l.496-.674L4.446 0l.662.089.279.242.411.94.666 1.48 1.033 2.014.302.597.162.553.06.17h.105v-.097l.085-1.134.157-1.392.154-1.792.052-.504.25-.605.497-.327.387.186.319.456-.045.294-.19 1.23-.37 1.93-.243 1.29h.142l.161-.16.654-.868 1.097-1.372.484-.545.565-.601.363-.287h.686l.505.751-.226.775-.707.895-.585.759-.839 1.13-.524.904.048.072.125-.012 1.897-.403 1.024-.186 1.223-.21.553.258.06.263-.218.536-1.307.323-1.533.307-2.284.54-.028.02.032.04 1.029.098.44.024h1.077l2.005.15.525.346.315.424-.053.323-.807.411-3.631-.863-.872-.218h-.12v.073l.726.71 1.331 1.202 1.667 1.55.084.383-.214.302-.226-.032-1.464-1.101-.565-.497-1.28-1.077h-.084v.113l.295.432 1.557 2.34.08.718-.112.234-.404.141-.444-.08-.911-1.28-.94-1.44-.759-1.291-.093.053-.448 4.821-.21.246-.484.186-.403-.307-.214-.496.214-.98.258-1.28.21-1.016.19-1.263.112-.42-.008-.028-.092.012-.953 1.307-1.448 1.957-1.146 1.227-.274.109-.477-.247.045-.44.266-.39 1.586-2.018.956-1.25.617-.723-.004-.105h-.036l-4.212 2.736-.75.096-.324-.302.04-.496.154-.162 1.267-.871z\" />\n </svg>\n )\n}\n\nfunction OpenAILogo({ className }: { className?: string }) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" className={className}>\n <path d=\"M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.98 5.98 0 0 0 .51 4.911 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.99 5.99 0 0 0 3.997-2.9 6.056 6.056 0 0 0-.747-7.073zM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.141-.081 4.779-2.758a.795.795 0 0 0 .392-.681v-6.737l2.02 1.168a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494zM3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.771.771 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.676l5.815 3.355-2.02 1.168a.076.076 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855-5.833-3.387L15.119 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667zm2.01-3.023-.141-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.795.795 0 0 0-.393.681zm1.097-2.365 2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5z\" />\n </svg>\n )\n}\n\ntype LogoComponent = ComponentType<{ className?: string }>\n\n// provider key → brand mark. Both the orchestrator's provider id (claude/codex)\n// and the underlying vendor name (anthropic/openai) map to the same logo so\n// either spelling lights up.\nconst PROVIDER_LOGO: Record<string, LogoComponent> = {\n claude: ClaudeLogo,\n anthropic: ClaudeLogo,\n codex: OpenAILogo,\n openai: OpenAILogo,\n}\n\n// Subtle brand tint so the mark is recognizable at small sizes. OpenAI's mark is\n// monochrome by design, so it inherits the surrounding text color.\nconst PROVIDER_TINT: Record<string, string> = {\n claude: 'text-orange-400',\n anthropic: 'text-orange-400',\n}\n\n// Provider brand mark with an accessible label. Falls back to the capitalized\n// provider name for providers without a dedicated logo yet.\nexport function ProviderBrandIcon({ provider, className }: { provider: string; className?: string }) {\n const key = provider.toLowerCase()\n const Logo = PROVIDER_LOGO[key]\n if (!Logo) return <span className=\"capitalize\">{provider}</span>\n return (\n <span role=\"img\" aria-label={provider} title={provider} className=\"inline-flex shrink-0\">\n <Logo className={cn(PROVIDER_TINT[key], className)} />\n </span>\n )\n}\n","import { cn } from '@/lib/utils'\nimport { agentType as getAgentType } from '@/lib/display'\nimport { Bot, Terminal, User, Server, MessagesSquare } from 'lucide-react'\nimport type { Agent } from '@/types'\nimport { ClaudeLogo } from './provider-brand-icon'\n\nconst typeStyles: Record<string, string> = {\n codex: 'text-blue-400 bg-blue-500/10 border-blue-500/25',\n claude: 'text-orange-400 bg-orange-500/10 border-orange-500/25',\n user: 'text-emerald-400 bg-emerald-500/10 border-emerald-500/25',\n system: 'text-purple-400 bg-purple-500/10 border-purple-500/25',\n channel: 'text-blue-400 bg-blue-500/10 border-blue-500/25',\n agent: 'text-zinc-400 bg-zinc-500/10 border-zinc-500/25',\n}\n\nconst typeIcons: Record<string, typeof Bot | typeof ClaudeLogo> = {\n codex: Terminal,\n claude: ClaudeLogo,\n user: User,\n system: Server,\n channel: MessagesSquare,\n agent: Bot,\n}\n\nexport function AgentTypeIcon({ agent, className }: { agent: Agent | null | undefined; className?: string }) {\n const type = getAgentType(agent)\n const Icon = typeIcons[type] || Bot\n return (\n <span className={cn('inline-flex items-center justify-center w-5 h-5 rounded-md border text-sm', typeStyles[type] || typeStyles.agent, className)}>\n <Icon className=\"w-3.5 h-3.5\" />\n </span>\n )\n}\n"],"mappings":"iJAQA,SAAgB,EAAW,CAAE,aAAqC,CAChE,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,MAAM,6BAA6B,QAAQ,YAAY,KAAK,eAAe,cAAY,OAAkB,sBAC5G,EAAA,EAAA,KAAC,OAAD,CAAM,EAAE,i6CAAm6C,CAAA,CACv6C,CAAA,CAIV,SAAS,EAAW,CAAE,aAAqC,CACzD,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,MAAM,6BAA6B,QAAQ,YAAY,KAAK,eAAe,cAAY,OAAkB,sBAC5G,EAAA,EAAA,KAAC,OAAD,CAAM,EAAE,muCAAquC,CAAA,CACzuC,CAAA,CASV,IAAM,EAA+C,CACnD,OAAQ,EACR,UAAW,EACX,MAAO,EACP,OAAQ,EACT,CAIK,EAAwC,CAC5C,OAAQ,kBACR,UAAW,kBACZ,CAID,SAAgB,EAAkB,CAAE,WAAU,aAAuD,CACnG,IAAM,EAAM,EAAS,aAAa,CAC5B,EAAO,EAAc,GAE3B,OADK,GAEH,EAAA,EAAA,KAAC,OAAD,CAAM,KAAK,MAAM,aAAY,EAAU,MAAO,EAAU,UAAU,iCAChE,EAAA,EAAA,KAAC,EAAD,CAAM,UAAW,EAAG,EAAc,GAAM,EAAU,CAAI,CAAA,CACjD,CAAA,EAJS,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,sBAAc,EAAgB,CAAA,CC1ClE,IAAM,EAAqC,CACzC,MAAO,kDACP,OAAQ,wDACR,KAAM,2DACN,OAAQ,wDACR,QAAS,kDACT,MAAO,kDACR,CAEK,EAA4D,CAChE,MAAO,EACP,OAAQ,EACR,KAAM,EACN,OAAQ,EACR,QAAS,EACT,MAAO,EACR,CAED,SAAgB,EAAc,CAAE,QAAO,aAAsE,CAC3G,IAAM,EAAO,EAAa,EAAM,CAC1B,EAAO,EAAU,IAAS,EAChC,OACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAG,4EAA6E,EAAW,IAAS,EAAW,MAAO,EAAU,WAC/I,EAAA,EAAA,KAAC,EAAD,CAAM,UAAU,cAAgB,CAAA,CAC3B,CAAA"}
1
+ {"version":3,"file":"agent-type-icon-BxUopALO.js","names":[],"sources":["../../dashboard/src/components/shared/provider-brand-icon.tsx","../../dashboard/src/components/shared/agent-type-icon.tsx"],"sourcesContent":["import type { ComponentType } from 'react'\nimport { cn } from '@/lib/utils'\n\n// Provider brand marks as small inline SVGs (lucide ships none). These are the\n// recognizable logos used wherever a quota/agent row identifies its provider —\n// kept here so the Claude mark lives in one place (also consumed by\n// agent-type-icon.tsx) instead of being copy-pasted per call site.\n\nexport function ClaudeLogo({ className }: { className?: string }) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\" className={className}>\n <path d=\"m3.127 10.604 3.135-1.76.053-.153-.053-.085H6.11l-.525-.032-1.791-.048-1.554-.065-1.505-.08-.38-.081L0 7.832l.036-.234.32-.214.455.04 1.009.069 1.513.105 1.097.064 1.626.17h.259l.036-.105-.089-.065-.068-.064-1.566-1.062-1.695-1.121-.887-.646-.48-.327-.243-.306-.104-.67.435-.48.585.04.15.04.593.456 1.267.981 1.654 1.218.242.202.097-.068.012-.049-.109-.181-.9-1.626-.96-1.655-.428-.686-.113-.411a2 2 0 0 1-.068-.484l.496-.674L4.446 0l.662.089.279.242.411.94.666 1.48 1.033 2.014.302.597.162.553.06.17h.105v-.097l.085-1.134.157-1.392.154-1.792.052-.504.25-.605.497-.327.387.186.319.456-.045.294-.19 1.23-.37 1.93-.243 1.29h.142l.161-.16.654-.868 1.097-1.372.484-.545.565-.601.363-.287h.686l.505.751-.226.775-.707.895-.585.759-.839 1.13-.524.904.048.072.125-.012 1.897-.403 1.024-.186 1.223-.21.553.258.06.263-.218.536-1.307.323-1.533.307-2.284.54-.028.02.032.04 1.029.098.44.024h1.077l2.005.15.525.346.315.424-.053.323-.807.411-3.631-.863-.872-.218h-.12v.073l.726.71 1.331 1.202 1.667 1.55.084.383-.214.302-.226-.032-1.464-1.101-.565-.497-1.28-1.077h-.084v.113l.295.432 1.557 2.34.08.718-.112.234-.404.141-.444-.08-.911-1.28-.94-1.44-.759-1.291-.093.053-.448 4.821-.21.246-.484.186-.403-.307-.214-.496.214-.98.258-1.28.21-1.016.19-1.263.112-.42-.008-.028-.092.012-.953 1.307-1.448 1.957-1.146 1.227-.274.109-.477-.247.045-.44.266-.39 1.586-2.018.956-1.25.617-.723-.004-.105h-.036l-4.212 2.736-.75.096-.324-.302.04-.496.154-.162 1.267-.871z\" />\n </svg>\n )\n}\n\nfunction OpenAILogo({ className }: { className?: string }) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" className={className}>\n <path d=\"M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.98 5.98 0 0 0 .51 4.911 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.99 5.99 0 0 0 3.997-2.9 6.056 6.056 0 0 0-.747-7.073zM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.141-.081 4.779-2.758a.795.795 0 0 0 .392-.681v-6.737l2.02 1.168a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494zM3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.771.771 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.676l5.815 3.355-2.02 1.168a.076.076 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855-5.833-3.387L15.119 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667zm2.01-3.023-.141-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.795.795 0 0 0-.393.681zm1.097-2.365 2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5z\" />\n </svg>\n )\n}\n\ntype LogoComponent = ComponentType<{ className?: string }>\n\n// provider key → brand mark. Both the orchestrator's provider id (claude/codex)\n// and the underlying vendor name (anthropic/openai) map to the same logo so\n// either spelling lights up.\nconst PROVIDER_LOGO: Record<string, LogoComponent> = {\n claude: ClaudeLogo,\n anthropic: ClaudeLogo,\n codex: OpenAILogo,\n openai: OpenAILogo,\n}\n\n// Subtle brand tint so the mark is recognizable at small sizes. OpenAI's mark is\n// monochrome by design, so it inherits the surrounding text color.\nconst PROVIDER_TINT: Record<string, string> = {\n claude: 'text-orange-400',\n anthropic: 'text-orange-400',\n}\n\n// Provider brand mark with an accessible label. Falls back to the capitalized\n// provider name for providers without a dedicated logo yet.\nexport function ProviderBrandIcon({ provider, className }: { provider: string; className?: string }) {\n const key = provider.toLowerCase()\n const Logo = PROVIDER_LOGO[key]\n if (!Logo) return <span className=\"capitalize\">{provider}</span>\n return (\n <span role=\"img\" aria-label={provider} title={provider} className=\"inline-flex shrink-0\">\n <Logo className={cn(PROVIDER_TINT[key], className)} />\n </span>\n )\n}\n","import { cn } from '@/lib/utils'\nimport { agentType as getAgentType } from '@/lib/display'\nimport { Bot, Terminal, User, Server, MessagesSquare } from 'lucide-react'\nimport type { Agent } from '@/types'\nimport { ClaudeLogo } from './provider-brand-icon'\n\nconst typeStyles: Record<string, string> = {\n codex: 'text-blue-400 bg-blue-500/10 border-blue-500/25',\n claude: 'text-orange-400 bg-orange-500/10 border-orange-500/25',\n user: 'text-emerald-400 bg-emerald-500/10 border-emerald-500/25',\n system: 'text-purple-400 bg-purple-500/10 border-purple-500/25',\n channel: 'text-blue-400 bg-blue-500/10 border-blue-500/25',\n agent: 'text-zinc-400 bg-zinc-500/10 border-zinc-500/25',\n}\n\nconst typeIcons: Record<string, typeof Bot | typeof ClaudeLogo> = {\n codex: Terminal,\n claude: ClaudeLogo,\n user: User,\n system: Server,\n channel: MessagesSquare,\n agent: Bot,\n}\n\nexport function AgentTypeIcon({ agent, className }: { agent: Agent | null | undefined; className?: string }) {\n const type = getAgentType(agent)\n const Icon = typeIcons[type] || Bot\n return (\n <span className={cn('inline-flex items-center justify-center w-5 h-5 rounded-md border text-sm', typeStyles[type] || typeStyles.agent, className)}>\n <Icon className=\"w-3.5 h-3.5\" />\n </span>\n )\n}\n"],"mappings":"iJAQA,SAAgB,EAAW,CAAE,aAAqC,CAChE,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,MAAM,6BAA6B,QAAQ,YAAY,KAAK,eAAe,cAAY,OAAkB,sBAC5G,EAAA,EAAA,KAAC,OAAD,CAAM,EAAE,i6CAAm6C,CAAA,CACv6C,CAAA,CAIV,SAAS,EAAW,CAAE,aAAqC,CACzD,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,MAAM,6BAA6B,QAAQ,YAAY,KAAK,eAAe,cAAY,OAAkB,sBAC5G,EAAA,EAAA,KAAC,OAAD,CAAM,EAAE,muCAAquC,CAAA,CACzuC,CAAA,CASV,IAAM,EAA+C,CACnD,OAAQ,EACR,UAAW,EACX,MAAO,EACP,OAAQ,EACT,CAIK,EAAwC,CAC5C,OAAQ,kBACR,UAAW,kBACZ,CAID,SAAgB,EAAkB,CAAE,WAAU,aAAuD,CACnG,IAAM,EAAM,EAAS,aAAa,CAC5B,EAAO,EAAc,GAE3B,OADK,GAEH,EAAA,EAAA,KAAC,OAAD,CAAM,KAAK,MAAM,aAAY,EAAU,MAAO,EAAU,UAAU,iCAChE,EAAA,EAAA,KAAC,EAAD,CAAM,UAAW,EAAG,EAAc,GAAM,EAAU,CAAI,CAAA,CACjD,CAAA,EAJS,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,sBAAc,EAAgB,CAAA,CC1ClE,IAAM,EAAqC,CACzC,MAAO,kDACP,OAAQ,wDACR,KAAM,2DACN,OAAQ,wDACR,QAAS,kDACT,MAAO,kDACR,CAEK,EAA4D,CAChE,MAAO,EACP,OAAQ,EACR,KAAM,EACN,OAAQ,EACR,QAAS,EACT,MAAO,EACR,CAED,SAAgB,EAAc,CAAE,QAAO,aAAsE,CAC3G,IAAM,EAAO,EAAa,EAAM,CAC1B,EAAO,EAAU,IAAS,EAChC,OACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAG,4EAA6E,EAAW,IAAS,EAAW,MAAO,EAAU,WAC/I,EAAA,EAAA,KAAC,EAAD,CAAM,UAAU,cAAgB,CAAA,CAC3B,CAAA"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./chunk-CilyBKbf.js";import{B as t,Gn as n,H as r,Ht as i,Qt as a,Xn as o,_ as s,_t as c,a as l,et as u,g as d,gr as f,q as p,rr as m,rt as h,tr as g,u as _}from"./lucide-react-CoU_Xts2.js";import{p as ee,t as v}from"./store-zFLzd0Jd.js";import{g as te,m as y}from"./types-CRptbSYh.js";import{J as b,K as x,W as S,Y as C,a as w,d as T,i as ne,n as re}from"./display-GFbGUG0O.js";import{o as E,r as D}from"./dist-B8tD9ZcR.js";import{t as O}from"./dist-V3wu3BHw.js";import{i as ie,n as k}from"./dist-C5z05Vkz.js";import{t as A}from"./dist-4VwhnLtj.js";import{t as j}from"./dist-r8wyUTkK.js";import{a as M,i as N,n as P,o as F,r as I,s as ae,t as oe}from"./es2015-5DTJe35n.js";import{a as L,i as se,n as R,r as z,t as B}from"./dist-DKmTXfpP.js";import{t as V}from"./badge-XEru6wto.js";import{t as H}from"./button-C3CQSr4p.js";import{t as ce}from"./copy-button-Bil2CjzT.js";import{t as U}from"./agent-type-icon-BxUopALO.js";import{Dt as W,Et as le,J as ue,Ot as de,Y as fe,Z as pe,bt as me,ct as G,et as he,kt as ge,nt as _e,q as ve,rt as ye,tt as be}from"./index-DnUo0Zqg.js";import{r as xe,t as Se}from"./card-C5XTIPvq.js";import{i as Ce,n as we,r as Te,t as Ee}from"./branch-state-badge-Mf0Ow77K.js";var K=e(f(),1),q=m(),J=`Popover`,[De,Oe]=ie(J,[L]),Y=L(),[ke,X]=De(J),Ae=e=>{let{__scopePopover:t,children:n,open:r,defaultOpen:i,onOpenChange:a,modal:o=!1}=e,s=Y(t),c=K.useRef(null),[l,u]=K.useState(!1),[d,f]=A({prop:r,defaultProp:i??!1,onChange:a,caller:J});return(0,q.jsx)(se,{...s,children:(0,q.jsx)(ke,{scope:t,contentId:ae(),triggerRef:c,open:d,onOpenChange:f,onOpenToggle:K.useCallback(()=>f(e=>!e),[f]),hasCustomAnchor:l,onCustomAnchorAdd:K.useCallback(()=>u(!0),[]),onCustomAnchorRemove:K.useCallback(()=>u(!1),[]),modal:o,children:n})})};Ae.displayName=J;var je=`PopoverAnchor`,Me=K.forwardRef((e,t)=>{let{__scopePopover:n,...r}=e,i=X(je,n),a=Y(n),{onCustomAnchorAdd:o,onCustomAnchorRemove:s}=i;return K.useEffect(()=>(o(),()=>s()),[o,s]),(0,q.jsx)(B,{...a,...r,ref:t})});Me.displayName=je;var Z=`PopoverTrigger`,Ne=K.forwardRef((e,t)=>{let{__scopePopover:n,...r}=e,i=X(Z,n),a=Y(n),o=E(t,i.triggerRef),s=(0,q.jsx)(O.button,{type:`button`,"aria-haspopup":`dialog`,"aria-expanded":i.open,"aria-controls":i.contentId,"data-state":Ke(i.open),...r,ref:o,onClick:k(e.onClick,i.onOpenToggle)});return i.hasCustomAnchor?s:(0,q.jsx)(B,{asChild:!0,...a,children:s})});Ne.displayName=Z;var Q=`PopoverPortal`,[Pe,Fe]=De(Q,{forceMount:void 0}),Ie=e=>{let{__scopePopover:t,forceMount:n,children:r,container:i}=e,a=X(Q,t);return(0,q.jsx)(Pe,{scope:t,forceMount:n,children:(0,q.jsx)(j,{present:n||a.open,children:(0,q.jsx)(N,{asChild:!0,container:i,children:r})})})};Ie.displayName=Q;var $=`PopoverContent`,Le=K.forwardRef((e,t)=>{let n=Fe($,e.__scopePopover),{forceMount:r=n.forceMount,...i}=e,a=X($,e.__scopePopover);return(0,q.jsx)(j,{present:r||a.open,children:a.modal?(0,q.jsx)(ze,{...i,ref:t}):(0,q.jsx)(Be,{...i,ref:t})})});Le.displayName=$;var Re=D(`PopoverContent.RemoveScroll`),ze=K.forwardRef((e,t)=>{let n=X($,e.__scopePopover),r=K.useRef(null),i=E(t,r),a=K.useRef(!1);return K.useEffect(()=>{let e=r.current;if(e)return oe(e)},[]),(0,q.jsx)(P,{as:Re,allowPinchZoom:!0,children:(0,q.jsx)(Ve,{...e,ref:i,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:k(e.onCloseAutoFocus,e=>{e.preventDefault(),a.current||n.triggerRef.current?.focus()}),onPointerDownOutside:k(e.onPointerDownOutside,e=>{let t=e.detail.originalEvent,n=t.button===0&&t.ctrlKey===!0;a.current=t.button===2||n},{checkForDefaultPrevented:!1}),onFocusOutside:k(e.onFocusOutside,e=>e.preventDefault(),{checkForDefaultPrevented:!1})})})}),Be=K.forwardRef((e,t)=>{let n=X($,e.__scopePopover),r=K.useRef(!1),i=K.useRef(!1);return(0,q.jsx)(Ve,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:t=>{e.onCloseAutoFocus?.(t),t.defaultPrevented||(r.current||n.triggerRef.current?.focus(),t.preventDefault()),r.current=!1,i.current=!1},onInteractOutside:t=>{e.onInteractOutside?.(t),t.defaultPrevented||(r.current=!0,t.detail.originalEvent.type===`pointerdown`&&(i.current=!0));let a=t.target;n.triggerRef.current?.contains(a)&&t.preventDefault(),t.detail.originalEvent.type===`focusin`&&i.current&&t.preventDefault()}})}),Ve=K.forwardRef((e,t)=>{let{__scopePopover:n,trapFocus:r,onOpenAutoFocus:i,onCloseAutoFocus:a,disableOutsidePointerEvents:o,onEscapeKeyDown:s,onPointerDownOutside:c,onFocusOutside:l,onInteractOutside:u,...d}=e,f=X($,n),p=Y(n);return I(),(0,q.jsx)(M,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:i,onUnmountAutoFocus:a,children:(0,q.jsx)(F,{asChild:!0,disableOutsidePointerEvents:o,onInteractOutside:u,onEscapeKeyDown:s,onPointerDownOutside:c,onFocusOutside:l,onDismiss:()=>f.onOpenChange(!1),children:(0,q.jsx)(z,{"data-state":Ke(f.open),role:`dialog`,id:f.contentId,...p,...d,ref:t,style:{...d.style,"--radix-popover-content-transform-origin":`var(--radix-popper-transform-origin)`,"--radix-popover-content-available-width":`var(--radix-popper-available-width)`,"--radix-popover-content-available-height":`var(--radix-popper-available-height)`,"--radix-popover-trigger-width":`var(--radix-popper-anchor-width)`,"--radix-popover-trigger-height":`var(--radix-popper-anchor-height)`}})})})}),He=`PopoverClose`,Ue=K.forwardRef((e,t)=>{let{__scopePopover:n,...r}=e,i=X(He,n);return(0,q.jsx)(O.button,{type:`button`,...r,ref:t,onClick:k(e.onClick,()=>i.onOpenChange(!1))})});Ue.displayName=He;var We=`PopoverArrow`,Ge=K.forwardRef((e,t)=>{let{__scopePopover:n,...r}=e,i=Y(n);return(0,q.jsx)(R,{...i,...r,ref:t})});Ge.displayName=We;function Ke(e){return e?`open`:`closed`}var qe=Ae,Je=Ne,Ye=Ie,Xe=Le;function Ze({...e}){return(0,q.jsx)(qe,{"data-slot":`popover`,...e})}function Qe({...e}){return(0,q.jsx)(Je,{"data-slot":`popover-trigger`,...e})}function $e({className:e,align:t=`center`,sideOffset:n=4,...r}){return(0,q.jsx)(Ye,{children:(0,q.jsx)(Xe,{"data-slot":`popover-content`,align:t,sideOffset:n,className:g(`z-50 flex w-72 origin-(--radix-popover-content-transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95`,e),...r})})}function et({className:e,...t}){return(0,q.jsx)(`div`,{"data-slot":`popover-header`,className:g(`flex flex-col gap-0.5 text-sm`,e),...t})}function tt({className:e,...t}){return(0,q.jsx)(`div`,{"data-slot":`popover-title`,className:g(`font-medium`,e),...t})}function nt({agent:e,childAgents:n=[],parentAgent:r}){let o=ee();v(e=>e.set);let l=v(e=>e.switchView),f=v(e=>e.openInboxThread),m=v(e=>e.openAgentDetail),g=v(e=>e.openPairInvite),te=v(e=>e.openRename),y=v(e=>e.openConfirm),E=v(e=>e.doAgentAction),D=v(e=>e.doDeleteAgent),O=v(e=>e.openFilesForAgent),ie=v(e=>e.workspaceAction),k=v(e=>e.openWorkspaceFocus),{terminalOpen:A,terminalTarget:j,terminalOpening:M,openTerminal:N,closeTerminal:P}=Ce(e.id),F=le(),I=ne(o,e,me(e),F[e.id]||null),ae=w(e,`shutdown`),oe=w(e,`compact`),L=w(e,`clearContext`),se=!!(e.providerCapabilities?.terminal?.live?.read||e.providerCapabilities?.terminal?.attach?.create),R=!!e.providerCapabilities?.terminal?.live?.write,z=re(e),B=r?T(r):e.spawnedBy,W=n.length>0;return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Se,{className:`group hover:border-zinc-600 transition-colors cursor-pointer`,onClick:()=>m(e),children:(0,q.jsxs)(xe,{className:`p-4`,children:[(0,q.jsxs)(`div`,{className:`flex items-start gap-2.5 mb-2.5`,children:[(0,q.jsx)(G,{agent:e,now:o,className:`mt-0.5`}),(0,q.jsx)(U,{agent:e}),(0,q.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-1 min-w-0`,children:[(0,q.jsx)(we,{profile:Te(e),className:`text-sm shrink-0`}),(0,q.jsx)(`span`,{className:`text-sm font-medium truncate`,children:T(e)})]}),(0,q.jsx)(`div`,{className:`text-xs mt-0.5 ${b(I.tone)}`,children:I.label}),typeof e.meta?.cwd==`string`&&e.meta.cwd&&(0,q.jsx)(`button`,{type:`button`,className:`mt-0.5 block max-w-full truncate font-mono text-[10px] text-muted-foreground hover:text-foreground`,title:`Open ${e.meta.cwd} in Files`,onClick:t=>{t.stopPropagation(),O(e)},children:S(e.meta.cwd)}),(0,q.jsx)(pe,{agent:e,className:`mt-1`})]}),e.branchState&&e.branchWorkspaceId&&(0,q.jsx)(Ee,{state:e.branchState,className:`mt-0.5 shrink-0`,onClick:t=>{t.stopPropagation(),k(e.branchWorkspaceId)}})]}),I.badges.length>0&&(0,q.jsx)(`div`,{className:`flex flex-wrap gap-1 mb-2`,children:I.badges.map(e=>(0,q.jsx)(`span`,{className:`text-[10px] px-1.5 py-0.5 rounded-full font-medium ${e.className}`,children:e.label},e.label))}),(W||e.spawnedBy&&B)&&(0,q.jsxs)(`div`,{className:`mb-2 flex flex-wrap gap-1.5`,onClick:e=>e.stopPropagation(),children:[W&&(0,q.jsxs)(Ze,{children:[(0,q.jsx)(Qe,{asChild:!0,children:(0,q.jsxs)(`button`,{type:`button`,className:`inline-flex h-6 max-w-full items-center gap-1.5 rounded-full border border-sky-500/30 bg-sky-500/10 px-2 text-[10px] font-medium text-sky-300 transition-colors hover:bg-sky-500/15`,title:`${n.length} live child ${n.length===1?`agent`:`agents`}`,children:[(0,q.jsx)(_,{className:`h-3 w-3`}),(0,q.jsx)(`span`,{children:n.length}),(0,q.jsx)(`span`,{className:`flex -space-x-1`,children:n.slice(0,4).map(e=>(0,q.jsx)(G,{agent:e,now:o,className:`h-2 w-2 ring-1 ring-background`},e.id))})]})}),(0,q.jsxs)($e,{align:`start`,className:`w-80`,onClick:e=>e.stopPropagation(),children:[(0,q.jsx)(et,{children:(0,q.jsx)(tt,{children:`Team`})}),(0,q.jsx)(`div`,{className:`space-y-1.5`,children:n.map(e=>(0,q.jsxs)(`div`,{className:`rounded-md border border-border bg-card/60 p-2`,children:[(0,q.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,q.jsx)(G,{agent:e,now:o,className:`mt-1`}),(0,q.jsx)(U,{agent:e}),(0,q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,q.jsx)(`div`,{className:`truncate text-xs font-medium`,children:T(e)}),(0,q.jsx)(`div`,{className:`truncate text-[10px] text-muted-foreground`,children:e.providerCapabilities?.model?.alias||e.providerCapabilities?.model?.id||e.providerCapabilities?.model?.provider||e.status})]}),(0,q.jsx)(V,{variant:`outline`,className:`h-4 px-1.5 text-[9px]`,children:e.status})]}),(0,q.jsxs)(`div`,{className:`mt-2 flex gap-1`,children:[(0,q.jsx)(H,{size:`xs`,variant:`outline`,onClick:()=>m(e),children:`Open`}),(0,q.jsxs)(H,{size:`xs`,variant:`ghost`,onClick:()=>{f(e.id),l(`chat`)},children:[(0,q.jsx)(h,{className:`h-3 w-3`}),`Chat`]})]})]},e.id))})]})]}),e.spawnedBy&&B&&(0,q.jsx)(V,{variant:`outline`,className:`max-w-full text-[10px] text-muted-foreground`,children:(0,q.jsxs)(`span`,{className:`truncate`,children:[`spawned by `,B]})})]}),(e.tags.length>0||C(e.capabilities).length>0)&&(0,q.jsxs)(`div`,{className:`flex flex-wrap gap-1 mb-2`,children:[e.tags.slice(0,3).map(e=>(0,q.jsx)(V,{variant:`outline`,className:`text-[9px] px-1 py-0 h-4`,children:e},e)),C(e.capabilities).slice(0,2).map(e=>(0,q.jsx)(V,{variant:`secondary`,className:`text-[9px] px-1 py-0 h-4`,children:e},e))]}),(0,q.jsxs)(`div`,{className:`space-y-2 mb-2`,children:[(0,q.jsx)(_e,{agent:e}),(0,q.jsx)(be,{agent:e,compact:!0}),(0,q.jsx)(ye,{agent:e})]}),(0,q.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:e.id!==`user`&&e.id!==`system`&&x(o,e.lastSeen)}),(0,q.jsxs)(`div`,{className:`flex gap-1 mt-2.5 opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity`,onClick:e=>e.stopPropagation(),children:[(0,q.jsx)(ce,{value:e.id,label:`Copy agent ID`,size:`icon`,className:`h-7 w-7`,iconClassName:`w-3 h-3`}),(0,q.jsx)(H,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Chat`,onClick:()=>{f(e.id),l(`chat`)},children:(0,q.jsx)(h,{className:`w-3 h-3`})}),(0,q.jsx)(H,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Pair`,onClick:()=>g(e.id),children:(0,q.jsx)(c,{className:`w-3 h-3`})}),(0,q.jsx)(H,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Rename`,onClick:()=>te(e),children:(0,q.jsx)(p,{className:`w-3 h-3`})}),se&&(0,q.jsx)(H,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Terminal`,disabled:M,onClick:()=>void N(),children:(0,q.jsx)(s,{className:`w-3 h-3`})}),(e.branchState===`changes`||e.branchState===`idle`)&&e.branchWorkspaceId&&(0,q.jsx)(H,{size:`icon`,variant:`ghost`,className:`h-7 w-7 text-amber-400 hover:text-amber-300`,title:`Mark workspace ready — hand off to the auto-merge`,onClick:()=>y(`Mark Workspace Ready`,`Mark ${T(e)}'s branch ready to land? The relay auto-merge will rebase and land it.`,()=>ie(e.branchWorkspaceId,`ready`)),children:(0,q.jsx)(i,{className:`w-3 h-3`})}),oe&&(0,q.jsx)(H,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Compact`,onClick:()=>y(`Compact Agent`,`Compact context for ${T(e)}?`,()=>E(e,`compact`,`agents-grid`)),children:(0,q.jsx)(u,{className:`w-3 h-3`})}),L&&(0,q.jsx)(H,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Clear Context`,onClick:()=>y(`Clear Context`,`Clear context for ${T(e)}?`,()=>E(e,`clearContext`,`agents-grid`)),children:(0,q.jsx)(a,{className:`w-3 h-3`})}),ae&&(0,q.jsx)(H,{size:`icon`,variant:`ghost`,className:`h-7 w-7 text-red-400 hover:text-red-300`,title:`Shutdown`,onClick:()=>y(`Shutdown Agent`,`Shutdown ${T(e)}?`,()=>E(e,`shutdown`,`agents-grid`)),children:(0,q.jsx)(t,{className:`w-3 h-3`})}),z&&(0,q.jsx)(H,{size:`icon`,variant:`ghost`,className:`h-7 w-7 text-red-400 hover:text-red-300`,title:`Forget stale agent`,onClick:()=>y(`Forget Agent`,`Forget ${T(e)}?`,()=>D(e.id)),children:(0,q.jsx)(d,{className:`w-3 h-3`})})]})]})}),j&&(0,q.jsx)(he,{open:A,onOpenChange:P,orchestratorId:j.orchestratorId,session:j.session,interactive:j.interactive||R,canWrite:R})]})}function rt(){let e=v(e=>e.agentPresetFilter),t=v(e=>e.agentStatusFilter),i=v(e=>e.agentTagFilter),a=v(e=>e.agentHostFilter),s=v(e=>e.agentSort),c=v(e=>e.agentSortDir),u=v(e=>e.showOffline),d=v(e=>e.set),f=v(e=>e.openAgentSpawn),p=v(e=>e.agentsById),m=ee(),h=W(),g=ge(),_=de(),b=ve(h,m),x=fe(h,m),S=e||t||i||a;function C(){d({agentPresetFilter:``,agentStatusFilter:``,agentTagFilter:``,agentHostFilter:``})}function w(){d({agentSortDir:c===`asc`?`desc`:`asc`})}return(0,q.jsxs)(`div`,{className:`space-y-4`,children:[(0,q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,q.jsxs)(`select`,{value:e,onChange:e=>d({agentPresetFilter:e.target.value}),className:`h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground`,children:[(0,q.jsx)(`option`,{value:``,children:`All agents`}),(0,q.jsx)(`option`,{value:`active`,children:`Active`}),y().map(e=>(0,q.jsx)(`option`,{value:e,children:te(e)},e)),(0,q.jsx)(`option`,{value:`paired`,children:`Paired`}),(0,q.jsx)(`option`,{value:`unpaired`,children:`Unpaired`}),(0,q.jsx)(`option`,{value:`offline_stale`,children:`Offline / Stale`})]}),(0,q.jsxs)(`select`,{value:t,onChange:e=>d({agentStatusFilter:e.target.value}),className:`h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground`,children:[(0,q.jsx)(`option`,{value:``,children:`Any status`}),(0,q.jsx)(`option`,{value:`online`,children:`Online`}),(0,q.jsx)(`option`,{value:`idle`,children:`Idle`}),(0,q.jsx)(`option`,{value:`busy`,children:`Busy`}),(0,q.jsx)(`option`,{value:`offline`,children:`Offline`}),(0,q.jsx)(`option`,{value:`starting`,children:`Starting`})]}),g.length>0&&(0,q.jsxs)(`select`,{value:i,onChange:e=>d({agentTagFilter:e.target.value}),className:`h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground`,children:[(0,q.jsx)(`option`,{value:``,children:`Any tag`}),g.map(e=>(0,q.jsx)(`option`,{value:e,children:e},e))]}),_.length>1&&(0,q.jsxs)(`select`,{value:a,onChange:e=>d({agentHostFilter:e.target.value}),className:`h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground`,children:[(0,q.jsx)(`option`,{value:``,children:`Any host`}),_.map(e=>(0,q.jsx)(`option`,{value:e,children:e},e))]}),(0,q.jsxs)(`select`,{value:s,onChange:e=>d({agentSort:e.target.value}),className:`h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground`,children:[(0,q.jsx)(`option`,{value:`status`,children:`Sort: Status`}),(0,q.jsx)(`option`,{value:`name`,children:`Sort: Name`}),(0,q.jsx)(`option`,{value:`lastSeen`,children:`Sort: Last seen`}),(0,q.jsx)(`option`,{value:`created`,children:`Sort: Created`})]}),(0,q.jsx)(H,{size:`icon`,variant:`outline`,className:`h-8 w-8`,title:`Toggle sort direction`,onClick:w,children:c===`asc`?(0,q.jsx)(n,{className:`w-3.5 h-3.5`}):(0,q.jsx)(o,{className:`w-3.5 h-3.5`})}),(0,q.jsxs)(`label`,{className:`flex items-center gap-1.5 text-sm text-muted-foreground cursor-pointer select-none`,children:[(0,q.jsx)(`input`,{type:`checkbox`,checked:u,onChange:e=>d({showOffline:e.target.checked}),className:`rounded`}),`Show offline`]}),S&&(0,q.jsxs)(H,{size:`sm`,variant:`ghost`,className:`h-8 text-muted-foreground hover:text-foreground gap-1`,onClick:C,children:[(0,q.jsx)(l,{className:`w-3 h-3`}),`Clear filters`]}),(0,q.jsx)(`div`,{className:`ml-auto`,children:(0,q.jsxs)(H,{size:`sm`,onClick:f,className:`gap-1`,children:[(0,q.jsx)(r,{className:`w-3.5 h-3.5`}),`Spawn`]})})]}),x.length===0?(0,q.jsx)(`div`,{className:`text-center py-16 text-muted-foreground text-sm`,children:`No agents match the current filters.`}):(0,q.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 xl:grid-cols-4 gap-3`,children:x.map(e=>(0,q.jsx)(nt,{agent:e,parentAgent:e.spawnedBy?p[e.spawnedBy]??null:null,childAgents:ue(b.get(e.id)??[])},e.id))})]})}export{rt as AgentsView};
2
+ //# sourceMappingURL=agents-DIOxuJ6M.js.map