agent-relay-server 0.102.2 → 0.103.4

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 (128) hide show
  1. package/docs/openapi.json +1 -1
  2. package/package.json +4 -2
  3. package/public/assets/MessageBubble-BpiTbbnp.js +4 -0
  4. package/public/assets/{MessageBubble-Dppo7pil.js.map → MessageBubble-BpiTbbnp.js.map} +1 -1
  5. package/public/assets/{PlanGraphPanel-DO5OY2qa.js → PlanGraphPanel-k8Aa98g5.js} +2 -2
  6. package/public/assets/{PlanGraphPanel-DO5OY2qa.js.map → PlanGraphPanel-k8Aa98g5.js.map} +1 -1
  7. package/public/assets/{activity-BhuOs5ha.js → activity-CxKi5Erb.js} +2 -2
  8. package/public/assets/{activity-BhuOs5ha.js.map → activity-CxKi5Erb.js.map} +1 -1
  9. package/public/assets/agent-profiles-DMZXdN6K.js +2 -0
  10. package/public/assets/agent-profiles-DMZXdN6K.js.map +1 -0
  11. package/public/assets/agents-BrvpH3gn.js +2 -0
  12. package/public/assets/agents-BrvpH3gn.js.map +1 -0
  13. package/public/assets/{analytics-BxGRljQc.js → analytics-1fvh-9ok.js} +2 -2
  14. package/public/assets/{analytics-BxGRljQc.js.map → analytics-1fvh-9ok.js.map} +1 -1
  15. package/public/assets/automation-BCgX5WOH.js +2 -0
  16. package/public/assets/automation-BCgX5WOH.js.map +1 -0
  17. package/public/assets/{branch-state-badge-olhanssg.js → branch-state-badge-DYA7bU0i.js} +2 -2
  18. package/public/assets/{branch-state-badge-olhanssg.js.map → branch-state-badge-DYA7bU0i.js.map} +1 -1
  19. package/public/assets/{channels-yHkm1dux.js → channels-CK80oJYG.js} +2 -2
  20. package/public/assets/{channels-yHkm1dux.js.map → channels-CK80oJYG.js.map} +1 -1
  21. package/public/assets/chat-D_2PEz06.js +2 -0
  22. package/public/assets/chat-D_2PEz06.js.map +1 -0
  23. package/public/assets/{connectors-DpR0V2hy.js → connectors-ChGyht5m.js} +2 -2
  24. package/public/assets/{connectors-DpR0V2hy.js.map → connectors-ChGyht5m.js.map} +1 -1
  25. package/public/assets/display-D1xB8NJZ.js +3 -0
  26. package/public/assets/display-D1xB8NJZ.js.map +1 -0
  27. package/public/assets/{formatted-body-impl-BTeCfK4I.js → formatted-body-impl-BJ4WCF5J.js} +2 -2
  28. package/public/assets/{formatted-body-impl-BTeCfK4I.js.map → formatted-body-impl-BJ4WCF5J.js.map} +1 -1
  29. package/public/assets/index-BMO_Sblt.css +2 -0
  30. package/public/assets/index-CN7QZlMb.js +23 -0
  31. package/public/assets/index-CN7QZlMb.js.map +1 -0
  32. package/public/assets/{insights-C4aYlgsY.js → insights-BCZRV0hX.js} +2 -2
  33. package/public/assets/{insights-C4aYlgsY.js.map → insights-BCZRV0hX.js.map} +1 -1
  34. package/public/assets/{integrations-CEmYa5mW.js → integrations-C7UGs00U.js} +2 -2
  35. package/public/assets/{integrations-CEmYa5mW.js.map → integrations-C7UGs00U.js.map} +1 -1
  36. package/public/assets/maintenance-ChYno3Fm.js +2 -0
  37. package/public/assets/{maintenance-DVx3SiC_.js.map → maintenance-ChYno3Fm.js.map} +1 -1
  38. package/public/assets/{managed-agents-DUyOTdz1.js → managed-agents-DjxZQNIR.js} +4 -4
  39. package/public/assets/managed-agents-DjxZQNIR.js.map +1 -0
  40. package/public/assets/{markdown-preview-impl-D3hYfzGD.js → markdown-preview-impl-DFa5HF1H.js} +2 -2
  41. package/public/assets/{markdown-preview-impl-D3hYfzGD.js.map → markdown-preview-impl-DFa5HF1H.js.map} +1 -1
  42. package/public/assets/{memory-2IfPgcnN.js → memory-CTw6kadT.js} +2 -2
  43. package/public/assets/{memory-2IfPgcnN.js.map → memory-CTw6kadT.js.map} +1 -1
  44. package/public/assets/{messages-CkOwABhw.js → messages-Cjr816D_.js} +2 -2
  45. package/public/assets/{messages-CkOwABhw.js.map → messages-Cjr816D_.js.map} +1 -1
  46. package/public/assets/{orchestrators-CEKO3eQ1.js → orchestrators-CdmFKA7K.js} +2 -2
  47. package/public/assets/{orchestrators-CEKO3eQ1.js.map → orchestrators-CdmFKA7K.js.map} +1 -1
  48. package/public/assets/overview-DBOnjfpP.js +2 -0
  49. package/public/assets/{overview-D9BxevAq.js.map → overview-DBOnjfpP.js.map} +1 -1
  50. package/public/assets/{pairs-CqT4D1uL.js → pairs-BkcdKdF7.js} +2 -2
  51. package/public/assets/{pairs-CqT4D1uL.js.map → pairs-BkcdKdF7.js.map} +1 -1
  52. package/public/assets/{projects-C_zwR-Fn.js → projects-ClKbDQB1.js} +2 -2
  53. package/public/assets/{projects-C_zwR-Fn.js.map → projects-ClKbDQB1.js.map} +1 -1
  54. package/public/assets/registry-Bsf3RtOO.js +2 -0
  55. package/public/assets/registry-Bsf3RtOO.js.map +1 -0
  56. package/public/assets/{security-8a5_4U3S.js → security-Iyu5bhJw.js} +2 -2
  57. package/public/assets/{security-8a5_4U3S.js.map → security-Iyu5bhJw.js.map} +1 -1
  58. package/public/assets/{select-s4BE-T62.js → select-Bi6tNJDx.js} +2 -2
  59. package/public/assets/{select-s4BE-T62.js.map → select-Bi6tNJDx.js.map} +1 -1
  60. package/public/assets/settings-CbHp2F9r.js +6 -0
  61. package/public/assets/settings-CbHp2F9r.js.map +1 -0
  62. package/public/assets/store-zeyDiSKE.js +9 -0
  63. package/public/assets/store-zeyDiSKE.js.map +1 -0
  64. package/public/assets/{tasks-Bcr17zR3.js → tasks-CPlf-5Tr.js} +2 -2
  65. package/public/assets/{tasks-Bcr17zR3.js.map → tasks-CPlf-5Tr.js.map} +1 -1
  66. package/public/assets/teams-D2uUNhlY.js +2 -0
  67. package/public/assets/{teams-B_HSkU9T.js.map → teams-D2uUNhlY.js.map} +1 -1
  68. package/public/assets/{terminal-viewer-impl-Ctp4csJ3.js → terminal-viewer-impl-uRzbrlXy.js} +2 -2
  69. package/public/assets/{terminal-viewer-impl-Ctp4csJ3.js.map → terminal-viewer-impl-uRzbrlXy.js.map} +1 -1
  70. package/public/assets/types-DorDDvEb.js +2 -0
  71. package/public/assets/types-DorDDvEb.js.map +1 -0
  72. package/public/assets/{user-avatar-RliaJcaG.js → user-avatar-GFWMuAGK.js} +2 -2
  73. package/public/assets/{user-avatar-RliaJcaG.js.map → user-avatar-GFWMuAGK.js.map} +1 -1
  74. package/public/assets/{work-queue-C0hpmlv8.js → work-queue-B30SNmuq.js} +2 -2
  75. package/public/assets/{work-queue-C0hpmlv8.js.map → work-queue-B30SNmuq.js.map} +1 -1
  76. package/public/assets/{workspaces-QXbQx_AG.js → workspaces-CSpmgbPT.js} +3 -3
  77. package/public/assets/{workspaces-QXbQx_AG.js.map → workspaces-CSpmgbPT.js.map} +1 -1
  78. package/public/index.html +5 -5
  79. package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
  80. package/runner/plugins/claude/monitors/relay-monitor.provisioned.mjs +238 -16
  81. package/runner/src/config.ts +8 -3
  82. package/src/automations/validation.ts +3 -3
  83. package/src/cli/orchestrator.ts +7 -5
  84. package/src/cli/provider.ts +26 -10
  85. package/src/cli/upgrade.ts +5 -4
  86. package/src/commands-db.ts +1 -1
  87. package/src/config-store.ts +3 -3
  88. package/src/config.ts +3 -3
  89. package/src/context-advisory.ts +3 -3
  90. package/src/db/provider-quotas.ts +11 -2
  91. package/src/db/provisioning-registry.ts +49 -61
  92. package/src/managed-policy.ts +7 -2
  93. package/src/mcp/tools-spawn.ts +2 -2
  94. package/src/mcp-team-template-tools.ts +2 -2
  95. package/src/provider-catalog-store.ts +1 -1
  96. package/src/recipe-validator.ts +4 -2
  97. package/src/routes/agent-profiles.ts +2 -2
  98. package/src/routes/agent-sessions.ts +18 -23
  99. package/src/routes/provider-config.ts +1 -1
  100. package/src/spawn-targets.ts +2 -2
  101. package/src/upgrade.ts +120 -44
  102. package/src/workspace-phase.ts +1 -0
  103. package/public/assets/MessageBubble-Dppo7pil.js +0 -4
  104. package/public/assets/agent-profiles-CT-vbfzd.js +0 -2
  105. package/public/assets/agent-profiles-CT-vbfzd.js.map +0 -1
  106. package/public/assets/agents-CLcgi8AD.js +0 -2
  107. package/public/assets/agents-CLcgi8AD.js.map +0 -1
  108. package/public/assets/automation-CE1i1zpw.js +0 -2
  109. package/public/assets/automation-CE1i1zpw.js.map +0 -1
  110. package/public/assets/chat-DHdFZvAg.js +0 -2
  111. package/public/assets/chat-DHdFZvAg.js.map +0 -1
  112. package/public/assets/display-DRiGi1zj.js +0 -3
  113. package/public/assets/display-DRiGi1zj.js.map +0 -1
  114. package/public/assets/index-CKhh9XRZ.css +0 -2
  115. package/public/assets/index-DeDosfVE.js +0 -23
  116. package/public/assets/index-DeDosfVE.js.map +0 -1
  117. package/public/assets/maintenance-DVx3SiC_.js +0 -2
  118. package/public/assets/managed-agents-DUyOTdz1.js.map +0 -1
  119. package/public/assets/overview-D9BxevAq.js +0 -2
  120. package/public/assets/registry-BLjwVXCW.js +0 -2
  121. package/public/assets/registry-BLjwVXCW.js.map +0 -1
  122. package/public/assets/settings-BR30UpbJ.js +0 -6
  123. package/public/assets/settings-BR30UpbJ.js.map +0 -1
  124. package/public/assets/store-DNbkrqbU.js +0 -9
  125. package/public/assets/store-DNbkrqbU.js.map +0 -1
  126. package/public/assets/teams-B_HSkU9T.js +0 -2
  127. package/public/assets/types-Tv67voFu.js +0 -2
  128. package/public/assets/types-Tv67voFu.js.map +0 -1
@@ -1,2 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{H as t,I as n,Qn as r,Xn as i,Yn as a,a as o,dr as s,hn as c,m as l,sn as u}from"./lucide-react-BYZuAhQs.js";import{d,t as f}from"./store-DNbkrqbU.js";import{K as p,h as m}from"./display-DRiGi1zj.js";import{t as h}from"./badge-BLar6FjP.js";import{t as g}from"./button-BrIB69qd.js";import{u as _}from"./index-DeDosfVE.js";var v=e(s(),1),y=r(),b={succeeded:`bg-emerald-500/10 text-emerald-400 border-emerald-500/30`,running:`bg-blue-500/10 text-blue-400 border-blue-500/30`,failed:`bg-red-500/10 text-red-400 border-red-500/30`,idle:`bg-zinc-500/10 text-zinc-400 border-zinc-500/30`,disabled:`bg-zinc-500/10 text-zinc-500 border-zinc-500/20`};function x(){let e=d(),t=f(e=>e.maintenanceJobs),r=f(e=>e.fetchMaintenanceJobs),i=f(e=>e.runMaintenanceJob),a=(0,v.useMemo)(()=>({failed:t.filter(e=>e.lastStatus===`failed`).length,running:t.filter(e=>e.running||e.lastStatus===`running`).length,dueSoon:t.filter(t=>t.nextRunAt&&t.nextRunAt<=e+300*1e3).length}),[t,e]);return(0,y.jsxs)(`div`,{className:`space-y-4`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between flex-wrap gap-2`,children:[(0,y.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[(0,y.jsx)(o,{className:`h-5 w-5 text-muted-foreground`}),(0,y.jsx)(`h2`,{className:`text-lg font-semibold`,children:`Maintenance`}),(0,y.jsx)(h,{variant:`secondary`,children:t.length}),a.running>0&&(0,y.jsxs)(h,{className:`border border-blue-500/30 bg-blue-500/10 text-blue-400`,children:[a.running,` running`]}),a.failed>0&&(0,y.jsxs)(h,{variant:`destructive`,children:[a.failed,` failing`]}),a.dueSoon>0&&(0,y.jsxs)(h,{className:`border border-yellow-500/30 bg-yellow-500/10 text-yellow-400`,children:[a.dueSoon,` due soon`]})]}),(0,y.jsxs)(g,{size:`sm`,variant:`outline`,onClick:()=>void r(),children:[(0,y.jsx)(n,{className:`h-3.5 w-3.5`}),` Refresh`]})]}),(0,y.jsx)(_,{className:`h-[calc(100dvh-10rem)]`,children:t.length===0?(0,y.jsx)(`div`,{className:`rounded-md border border-border px-3 py-12 text-center text-sm text-muted-foreground`,children:`No maintenance jobs registered`}):(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(`div`,{className:`hidden overflow-x-auto rounded-md border border-border md:block`,children:(0,y.jsxs)(`table`,{className:`w-full min-w-[980px] text-sm`,children:[(0,y.jsx)(`thead`,{className:`bg-muted/40 text-xs text-muted-foreground`,children:(0,y.jsxs)(`tr`,{children:[(0,y.jsx)(`th`,{className:`px-3 py-2 text-left font-medium`,children:`Job`}),(0,y.jsx)(`th`,{className:`px-3 py-2 text-left font-medium`,children:`Status`}),(0,y.jsx)(`th`,{className:`px-3 py-2 text-left font-medium`,children:`Last run`}),(0,y.jsx)(`th`,{className:`px-3 py-2 text-left font-medium`,children:`Next run`}),(0,y.jsx)(`th`,{className:`px-3 py-2 text-left font-medium`,children:`Duration`}),(0,y.jsx)(`th`,{className:`px-3 py-2 text-left font-medium`,children:`Result`}),(0,y.jsx)(`th`,{className:`px-3 py-2 text-right font-medium`,children:`Action`})]})}),(0,y.jsx)(`tbody`,{children:t.map(t=>(0,y.jsx)(T,{job:t,now:e,onRun:()=>void i(t.id)},t.id))})]})}),(0,y.jsx)(`div`,{className:`space-y-3 md:hidden`,children:t.map(t=>(0,y.jsx)(w,{job:t,now:e,onRun:()=>void i(t.id)},t.id))})]})})]})}function S(e){return e.running?`running`:e.enabled?e.lastStatus:`disabled`}function C({status:e}){return(0,y.jsxs)(h,{variant:`outline`,className:i(`border`,b[e]||b.idle),children:[E(e),e]})}function w({job:e,now:n,onRun:r}){let i=S(e);return(0,y.jsxs)(`div`,{className:`rounded-md border border-border p-3`,children:[(0,y.jsxs)(`div`,{className:`flex items-start justify-between gap-2`,children:[(0,y.jsxs)(`div`,{className:`min-w-0`,children:[(0,y.jsx)(`div`,{className:`font-medium`,children:e.title}),(0,y.jsx)(`div`,{className:`mt-0.5 text-xs text-muted-foreground`,children:e.description}),(0,y.jsx)(`div`,{className:`mt-1 font-mono text-[11px] text-muted-foreground/80`,children:e.id})]}),(0,y.jsx)(C,{status:i})]}),e.consecutiveFailures>0&&(0,y.jsxs)(`div`,{className:`mt-2 text-xs text-red-400`,children:[e.consecutiveFailures,` failure`,e.consecutiveFailures===1?``:`s`]}),(0,y.jsxs)(`dl`,{className:`mt-3 grid grid-cols-3 gap-2 text-xs`,children:[(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`dt`,{className:`text-muted-foreground`,children:`Last run`}),(0,y.jsx)(`dd`,{children:e.lastRunAt?(0,y.jsx)(`span`,{title:m(e.lastRunAt),children:p(n,e.lastRunAt)}):`never`})]}),(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`dt`,{className:`text-muted-foreground`,children:`Next run`}),(0,y.jsx)(`dd`,{children:e.nextRunAt?(0,y.jsx)(`span`,{title:m(e.nextRunAt),children:O(n,e.nextRunAt)}):`-`})]}),(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`dt`,{className:`text-muted-foreground`,children:`Duration`}),(0,y.jsx)(`dd`,{children:e.lastDurationMs===void 0?`-`:`${e.lastDurationMs}ms`})]})]}),(0,y.jsxs)(`div`,{className:`mt-3`,children:[(0,y.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`Result`}),e.lastError?(0,y.jsx)(`div`,{className:`mt-0.5 text-xs text-red-400 line-clamp-3`,children:e.lastError}):(0,y.jsx)(`div`,{className:`mt-0.5 font-mono text-[11px] text-muted-foreground line-clamp-3`,children:D(e)})]}),(0,y.jsx)(`div`,{className:`mt-3 flex justify-end`,children:(0,y.jsxs)(g,{size:`sm`,variant:`outline`,disabled:!e.enabled||e.running,onClick:r,children:[(0,y.jsx)(t,{className:`h-3.5 w-3.5`}),` Run`]})})]})}function T({job:e,now:n,onRun:r}){let i=S(e);return(0,y.jsxs)(`tr`,{className:`border-t border-border align-top`,children:[(0,y.jsxs)(`td`,{className:`px-3 py-3`,children:[(0,y.jsx)(`div`,{className:`font-medium`,children:e.title}),(0,y.jsx)(`div`,{className:`mt-0.5 max-w-md text-xs text-muted-foreground`,children:e.description}),(0,y.jsx)(`div`,{className:`mt-1 font-mono text-[11px] text-muted-foreground/80`,children:e.id})]}),(0,y.jsxs)(`td`,{className:`px-3 py-3`,children:[(0,y.jsx)(C,{status:i}),e.consecutiveFailures>0&&(0,y.jsxs)(`div`,{className:`mt-1 text-xs text-red-400`,children:[e.consecutiveFailures,` failure`,e.consecutiveFailures===1?``:`s`]})]}),(0,y.jsx)(`td`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:e.lastRunAt?(0,y.jsx)(`span`,{title:m(e.lastRunAt),children:p(n,e.lastRunAt)}):`never`}),(0,y.jsx)(`td`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:e.nextRunAt?(0,y.jsx)(`span`,{title:m(e.nextRunAt),children:O(n,e.nextRunAt)}):`-`}),(0,y.jsx)(`td`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:e.lastDurationMs===void 0?`-`:`${e.lastDurationMs}ms`}),(0,y.jsx)(`td`,{className:`px-3 py-3`,children:e.lastError?(0,y.jsx)(`div`,{className:`max-w-sm text-xs text-red-400 line-clamp-3`,children:e.lastError}):(0,y.jsx)(`div`,{className:`max-w-sm font-mono text-[11px] text-muted-foreground line-clamp-3`,children:D(e)})}),(0,y.jsx)(`td`,{className:`px-3 py-3 text-right`,children:(0,y.jsxs)(g,{size:`sm`,variant:`outline`,disabled:!e.enabled||e.running,onClick:r,children:[(0,y.jsx)(t,{className:`h-3.5 w-3.5`}),` Run`]})})]})}function E(e){return e===`succeeded`?(0,y.jsx)(c,{className:`mr-1 h-3 w-3`}):e===`running`?(0,y.jsx)(a,{className:`mr-1 h-3 w-3`}):e===`failed`?(0,y.jsx)(l,{className:`mr-1 h-3 w-3`}):(0,y.jsx)(u,{className:`mr-1 h-3 w-3`})}function D(e){if(!e.lastResult)return`-`;let t=Object.entries(e.lastResult).filter(([,e])=>Array.isArray(e)?e.length>0:e!=null&&e!==0).map(([e,t])=>`${e}: ${Array.isArray(t)?t.length:String(t)}`);return t.length?t.join(`, `):`no changes`}function O(e,t){if(t<=e)return`due now`;let n=Math.max(0,(t-e)/1e3);return n<60?`in ${Math.ceil(n)}s`:n<3600?`in ${Math.ceil(n/60)}m`:n<86400?`in ${Math.ceil(n/3600)}h`:`in ${Math.ceil(n/86400)}d`}export{x as MaintenanceView};
2
- //# sourceMappingURL=maintenance-DVx3SiC_.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"managed-agents-DUyOTdz1.js","names":[],"sources":["../../dashboard/src/components/shared/health-badge.tsx","../../dashboard/src/components/shared/managed-policy-diagnostics.tsx","../../dashboard/src/components/views/managed-agents.tsx"],"sourcesContent":["import { cn } from '@/lib/utils'\nimport type { ManagedAgentLifecycleStatus } from '@/types'\n\nconst styles: Record<ManagedAgentLifecycleStatus, string> = {\n running: 'bg-emerald-500/15 text-emerald-400 border-emerald-500/30',\n starting: 'bg-blue-500/15 text-blue-400 border-blue-500/30',\n stopping: 'bg-yellow-500/15 text-yellow-400 border-yellow-500/30',\n backoff: 'bg-red-500/15 text-red-400 border-red-500/30',\n failed: 'bg-red-500/15 text-red-400 border-red-500/30',\n stopped: 'bg-muted text-muted-foreground border-border',\n}\n\nexport function HealthBadge({ status }: { status: ManagedAgentLifecycleStatus }) {\n return (\n <span className={cn('inline-flex items-center rounded border px-2 py-0.5 text-xs font-medium', styles[status])}>\n {status}\n </span>\n )\n}\n","import { useEffect, useMemo, useState } from 'react'\nimport type { CrashReport } from 'agent-relay-sdk/types'\nimport { isRecord } from 'agent-relay-sdk/types'\nimport { Activity, AlertTriangle, FileText, Server, Stethoscope } from 'lucide-react'\nimport { api } from '@/lib/api'\nimport { fmtTime, timeAgo, toTimestamp } from '@/lib/display'\nimport { agentStuckBusyHealth } from '@/lib/busy-health'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { CopyButton } from '@/components/shared/copy-button'\nimport { HealthBadge } from '@/components/shared/health-badge'\nimport { LogViewer } from '@/components/shared/log-viewer'\nimport type { Agent, AgentTimelineEntry, ManagedAgent, ManagedPolicyHealth, Orchestrator } from '@/types'\n\ninterface ManagedPolicyDiagnosticsProps {\n item: ManagedPolicyHealth\n agent?: Agent\n orchestrators: Orchestrator[]\n now: number\n onClose: () => void\n initialDiagnostics?: ManagedPolicyDiagnosticsPayload\n}\n\nexport interface ManagedPolicyDiagnosticsPayload extends ManagedPolicyHealth {\n timeline: AgentTimelineEntry[]\n crashReport: CrashReport | null\n}\n\nconst LIFECYCLE_STATUS_COLORS: Record<string, string> = {\n running: 'bg-emerald-500/20 text-emerald-400',\n starting: 'bg-blue-500/20 text-blue-400',\n stopping: 'bg-yellow-500/20 text-yellow-400',\n stopped: 'bg-zinc-500/20 text-zinc-400',\n backoff: 'bg-red-500/20 text-red-400',\n failed: 'bg-red-500/20 text-red-400',\n}\n\nexport function ManagedPolicyDiagnostics({ item, agent, orchestrators, now, onClose, initialDiagnostics }: ManagedPolicyDiagnosticsProps) {\n const [diagnostics, setDiagnostics] = useState<ManagedPolicyDiagnosticsPayload | null>(initialDiagnostics ?? null)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n if (initialDiagnostics) {\n setDiagnostics(initialDiagnostics)\n return\n }\n let cancelled = false\n setLoading(true)\n setError(null)\n api<ManagedPolicyDiagnosticsPayload>('GET', '/spawn-policy/' + encodeURIComponent(item.policy.name) + '/diagnostics?limit=80')\n .then((payload) => {\n if (!cancelled) setDiagnostics(payload)\n })\n .catch((e) => {\n if (!cancelled) {\n setDiagnostics(null)\n setError((e as Error).message)\n }\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => { cancelled = true }\n }, [item.policy.name, item.state.updatedAt, initialDiagnostics])\n\n const orchestrator = orchestrators.find((o) => o.id === item.policy.orchestratorId)\n const managedAgent = useMemo(() => managedAgentFor(item, orchestrator), [item, orchestrator])\n const timeline = diagnostics?.timeline ?? []\n const lastExit = latestExitDiagnostics(timeline, agent)\n const crashReport = diagnostics?.crashReport ?? null\n const logSession = logSessionFor(item, managedAgent)\n const stuckBusy = agent ? agentStuckBusyHealth(now, agent) : null\n\n return (\n <section className=\"rounded-md border border-border bg-card p-3 space-y-3\">\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <h2 className=\"flex items-center gap-1.5 text-sm font-semibold\">\n <Stethoscope className=\"h-4 w-4 text-muted-foreground\" />\n {item.policy.label || item.policy.name} Diagnostics\n </h2>\n <p className=\"text-xs text-muted-foreground\">Spawn config, live attachments, recent lifecycle, and logs.</p>\n </div>\n <div className=\"flex items-center gap-1\">\n <CopyButton value={() => buildDiagnosticBundle(item, agent, orchestrator, managedAgent, timeline, crashReport, lastExit)} label=\"Copy Bundle\" showText size=\"sm\" variant=\"outline\" className=\"h-8 text-xs\" />\n <Button variant=\"outline\" size=\"sm\" onClick={onClose}>Close</Button>\n </div>\n </div>\n\n {error && <div className=\"rounded border border-red-500/20 bg-red-500/5 px-2 py-1.5 text-xs text-red-300\">{error}</div>}\n {loading && !diagnostics && <div className=\"text-xs text-muted-foreground\">Loading diagnostics...</div>}\n\n <div className=\"grid gap-3 lg:grid-cols-2\">\n <Panel title=\"Spawn Command\" icon={<FileText className=\"h-3.5 w-3.5\" />}>\n <div className=\"grid grid-cols-2 gap-x-3 gap-y-1 text-xs\">\n <KV label=\"Provider\" value={item.policy.provider} />\n {item.policy.model && <KV label=\"Model\" value={item.policy.model} />}\n {item.policy.effort && <KV label=\"Effort\" value={item.policy.effort} />}\n <KV label=\"Approval\" value={item.policy.permissionMode} />\n <KV label=\"Mode\" value={item.policy.mode} />\n {item.policy.profile && <KV label=\"Profile\" value={item.policy.profile} />}\n {item.policy.rig && <KV label=\"Rig\" value={item.policy.rig} />}\n <KV label=\"CWD\" value={item.policy.cwd} className=\"col-span-2\" mono />\n {item.policy.providerArgs.length > 0 && <KV label=\"Provider Args\" value={item.policy.providerArgs.join(' ')} className=\"col-span-2\" mono />}\n {item.policy.tags.length > 0 && <Pills label=\"Tags\" values={item.policy.tags} />}\n {item.policy.capabilities.length > 0 && <Pills label=\"Caps\" values={item.policy.capabilities} />}\n </div>\n </Panel>\n\n <Panel title=\"Runtime\" icon={<Server className=\"h-3.5 w-3.5\" />}>\n <div className=\"space-y-2 text-xs\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Lifecycle</span>\n <HealthBadge status={item.state.status} />\n <Badge className={LIFECYCLE_STATUS_COLORS[item.state.status] || 'bg-zinc-500/20 text-zinc-400'}>{item.state.status}</Badge>\n </div>\n <div className=\"grid grid-cols-2 gap-x-3 gap-y-1\">\n <KV label=\"Orchestrator\" value={orchestrator ? `${orchestrator.hostname} (${orchestrator.id})` : item.policy.orchestratorId} />\n {orchestrator?.version && <KV label=\"Orch Version\" value={orchestrator.version} />}\n {managedAgent?.pid && <KV label=\"PID\" value={String(managedAgent.pid)} mono />}\n {managedAgent?.supervisor && <KV label=\"Supervisor\" value={managedAgent.supervisor} />}\n {managedAgent?.systemdUnit && <KV label=\"Systemd\" value={managedAgent.systemdUnit} mono className=\"col-span-2\" />}\n {managedAgent?.sessionName && <KV label=\"Session\" value={managedAgent.sessionName} mono />}\n {managedAgent?.terminalSession && <KV label=\"Terminal\" value={managedAgent.terminalAvailable ? `${managedAgent.terminalSession} (available)` : `${managedAgent.terminalSession} (not attachable)`} mono />}\n {managedAgent?.spawnRequestId && <KV label=\"Spawn ID\" value={managedAgent.spawnRequestId} mono className=\"col-span-2\" />}\n {managedAgent?.startedAt && <KV label=\"Started\" value={fmtTime(managedAgent.startedAt)} />}\n {item.state.restartCount !== undefined && <KV label=\"Restarts\" value={String(item.state.restartCount)} />}\n {item.state.consecutiveFailures !== undefined && <KV label=\"Failures\" value={String(item.state.consecutiveFailures)} />}\n {item.state.backoffUntil && <KV label=\"Backoff\" value={item.state.backoffUntil > now ? timeAgo(now, item.state.backoffUntil) : 'expired'} />}\n </div>\n {stuckBusy && (\n <div className=\"rounded border border-yellow-500/20 bg-yellow-500/5 px-2 py-1.5 text-yellow-100/80\">\n Stuck busy: {stuckBusy.kind} stale for {timeAgo(now, now - stuckBusy.staleForMs)}\n </div>\n )}\n {item.state.lastError && <ErrorBlock title=\"Last Error\" body={item.state.lastError} />}\n </div>\n </Panel>\n </div>\n\n {(lastExit || crashReport) && (\n <Panel title=\"Post-Mortem\" icon={<AlertTriangle className=\"h-3.5 w-3.5\" />}>\n <div className=\"space-y-2 text-xs\">\n {crashReport && (\n <div className=\"rounded border border-red-500/20 bg-red-500/5 px-2 py-1.5\">\n <div className=\"font-medium text-red-200\">{crashReport.diagnosis.summary}</div>\n <div className=\"mt-0.5 text-red-200/70\">Cause {crashReport.diagnosis.cause} · {crashReport.diagnosis.confidence}</div>\n </div>\n )}\n {lastExit && (\n <div className=\"grid grid-cols-2 gap-x-3 gap-y-1\">\n <KV label=\"Exit\" value={lastExit.lastError} className=\"col-span-2\" />\n {lastExit.detectedAt && <KV label=\"Detected\" value={timeAgo(now, lastExit.detectedAt)} />}\n {typeof lastExit.runtimeMs === 'number' && <KV label=\"Runtime\" value={`${Math.max(0, Math.round(lastExit.runtimeMs / 1000))}s`} />}\n {lastExit.systemd?.unit && <KV label=\"Unit\" value={lastExit.systemd.unit} mono className=\"col-span-2\" />}\n {lastExit.systemd?.result && <KV label=\"Systemd Result\" value={lastExit.systemd.result} />}\n {lastExit.logFile && <KV label=\"Log\" value={lastExit.logFile} mono className=\"col-span-2\" />}\n </div>\n )}\n {lastExit?.logTail?.length ? (\n <pre className=\"max-h-32 overflow-auto whitespace-pre-wrap break-words rounded border border-border bg-zinc-950 p-2 text-[11px] leading-4 text-zinc-100\">{lastExit.logTail.slice(-8).join('\\n')}</pre>\n ) : null}\n </div>\n </Panel>\n )}\n\n <Panel title={`Recent Events (${timeline.length})`} icon={<Activity className=\"h-3.5 w-3.5\" />}>\n {timeline.length === 0 ? (\n <div className=\"text-xs text-muted-foreground\">No recent lifecycle events or command outcomes.</div>\n ) : (\n <div className=\"space-y-1\">\n {timeline.slice(0, 12).map((entry, index) => (\n <div key={`${entry.source}-${entry.ts}-${entry.kind}-${index}`} className=\"grid grid-cols-[5.5rem_5rem_1fr] gap-2 text-xs\">\n <span className=\"text-muted-foreground tabular-nums\">{timeAgo(now, entry.ts)}</span>\n <Badge variant=\"outline\" className=\"h-5 justify-center text-[10px]\">{entry.source}</Badge>\n <div className=\"min-w-0\">\n <div className=\"truncate font-medium\" title={entry.title}>{entry.title}</div>\n {entry.detail && <div className=\"break-words text-muted-foreground\">{entry.detail.length > 160 ? entry.detail.slice(0, 160) + '...' : entry.detail}</div>}\n {typeof entry.metadata?.id === 'string' && <div className=\"font-mono text-[10px] text-muted-foreground\">command {entry.metadata.id}</div>}\n </div>\n </div>\n ))}\n </div>\n )}\n </Panel>\n\n {orchestrator && logSession && (\n <Panel title=\"Log Tail\" icon={<FileText className=\"h-3.5 w-3.5\" />}>\n <LogViewer orchestratorId={orchestrator.id} session={logSession} lines={120} />\n </Panel>\n )}\n </section>\n )\n}\n\nfunction managedAgentFor(item: ManagedPolicyHealth, orchestrator?: Orchestrator): ManagedAgent | undefined {\n return orchestrator?.managedAgents.find((m) =>\n m.policyName === item.policy.name ||\n (item.state.agentId && m.agentId === item.state.agentId) ||\n (item.state.spawnRequestId && m.spawnRequestId === item.state.spawnRequestId) ||\n (item.state.tmuxSession && (m.sessionName === item.state.tmuxSession || m.tmuxSession === item.state.tmuxSession))\n )\n}\n\nfunction logSessionFor(item: ManagedPolicyHealth, managedAgent?: ManagedAgent): string | undefined {\n return managedAgent?.terminalSession || managedAgent?.sessionName || managedAgent?.tmuxSession || item.state.tmuxSession\n}\n\nfunction latestExitDiagnostics(timeline: AgentTimelineEntry[], agent?: Agent): ManagedSessionExitDiagnostics | null {\n const fromAgent = exitDiagnostics(agent?.meta?.lastExit)\n if (fromAgent) return fromAgent\n for (const entry of timeline) {\n const exit = exitDiagnostics(entry.metadata?.lastExit)\n if (exit) return exit\n }\n return null\n}\n\nfunction exitDiagnostics(value: unknown): ManagedSessionExitDiagnostics | null {\n if (!isRecord(value) || typeof value.lastError !== 'string') return null\n const systemd = isRecord(value.systemd) ? value.systemd : undefined\n return {\n lastError: value.lastError,\n detectedAt: typeof value.detectedAt === 'number' ? value.detectedAt : undefined,\n runtimeMs: typeof value.runtimeMs === 'number' ? value.runtimeMs : undefined,\n logFile: typeof value.logFile === 'string' ? value.logFile : undefined,\n logBytes: typeof value.logBytes === 'number' ? value.logBytes : undefined,\n logEmpty: typeof value.logEmpty === 'boolean' ? value.logEmpty : undefined,\n logTail: Array.isArray(value.logTail) ? value.logTail.filter((line): line is string => typeof line === 'string') : undefined,\n systemd: systemd ? {\n unit: typeof systemd.unit === 'string' ? systemd.unit : undefined,\n activeState: typeof systemd.activeState === 'string' ? systemd.activeState : undefined,\n subState: typeof systemd.subState === 'string' ? systemd.subState : undefined,\n result: typeof systemd.result === 'string' ? systemd.result : undefined,\n } : undefined,\n unavailable: Array.isArray(value.unavailable) ? value.unavailable.filter((line): line is string => typeof line === 'string') : undefined,\n }\n}\n\ninterface ManagedSessionExitDiagnostics {\n lastError: string\n detectedAt?: number\n runtimeMs?: number\n logFile?: string\n logBytes?: number\n logEmpty?: boolean\n logTail?: string[]\n systemd?: {\n unit?: string\n activeState?: string\n subState?: string\n result?: string\n }\n unavailable?: string[]\n}\n\nfunction buildDiagnosticBundle(\n item: ManagedPolicyHealth,\n agent: Agent | undefined,\n orchestrator: Orchestrator | undefined,\n managedAgent: ManagedAgent | undefined,\n timeline: AgentTimelineEntry[],\n crashReport: CrashReport | null,\n lastExit: ManagedSessionExitDiagnostics | null,\n): string {\n const lines = [\n '# Managed Agent Diagnostics',\n `Policy: ${item.policy.name}`,\n `Lifecycle: ${item.state.status}`,\n `Provider: ${item.policy.provider}`,\n `CWD: ${item.policy.cwd}`,\n `Approval: ${item.policy.permissionMode}`,\n ]\n if (item.policy.model) lines.push(`Model: ${item.policy.model}`)\n if (item.policy.effort) lines.push(`Effort: ${item.policy.effort}`)\n if (item.policy.profile) lines.push(`Profile: ${item.policy.profile}`)\n if (item.policy.tags.length) lines.push(`Tags: ${item.policy.tags.join(', ')}`)\n if (item.policy.capabilities.length) lines.push(`Caps: ${item.policy.capabilities.join(', ')}`)\n if (agent) lines.push(`Agent: ${agent.id} (${agent.status})`)\n if (orchestrator) lines.push(`Orchestrator: ${orchestrator.hostname} (${orchestrator.id})`, `Orchestrator status: ${orchestrator.status}`)\n if (managedAgent) {\n lines.push('', '## Runtime')\n if (managedAgent.pid) lines.push(`PID: ${managedAgent.pid}`)\n if (managedAgent.supervisor) lines.push(`Supervisor: ${managedAgent.supervisor}`)\n if (managedAgent.systemdUnit) lines.push(`Systemd: ${managedAgent.systemdUnit}`)\n if (managedAgent.sessionName) lines.push(`Session: ${managedAgent.sessionName}`)\n if (managedAgent.terminalSession) lines.push(`Terminal: ${managedAgent.terminalSession} (${managedAgent.terminalAvailable ? 'available' : 'not attachable'})`)\n if (managedAgent.spawnRequestId) lines.push(`Spawn request: ${managedAgent.spawnRequestId}`)\n }\n if (item.state.lastError || crashReport || lastExit) {\n lines.push('', '## Post-Mortem')\n if (item.state.lastError) lines.push(`Last error: ${item.state.lastError}`)\n if (crashReport) lines.push(`Crash: ${crashReport.diagnosis.cause}/${crashReport.diagnosis.confidence} - ${crashReport.diagnosis.summary}`)\n if (lastExit?.lastError) lines.push(`Exit: ${lastExit.lastError}`)\n if (lastExit?.logTail?.length) lines.push('', 'Log tail:', ...lastExit.logTail.slice(-8))\n }\n if (timeline.length) {\n lines.push('', '## Recent Events')\n for (const entry of timeline.slice(0, 12)) {\n const commandId = typeof entry.metadata?.id === 'string' ? ` (${entry.metadata.id})` : ''\n lines.push(`- ${new Date(toTimestamp(entry.ts)).toISOString()} [${entry.source}] ${entry.title}${commandId}${entry.detail ? `: ${entry.detail}` : ''}`)\n }\n }\n return lines.join('\\n')\n}\n\nfunction Panel({ title, icon, children }: { title: string; icon: React.ReactNode; children: React.ReactNode }) {\n return (\n <div className=\"rounded-md border border-border p-2.5\">\n <h3 className=\"mb-2 flex items-center gap-1.5 text-xs font-medium text-muted-foreground\">\n {icon}\n {title}\n </h3>\n {children}\n </div>\n )\n}\n\nfunction KV({ label, value, className = '', mono = false }: { label: string; value: string; className?: string; mono?: boolean }) {\n return (\n <div className={`min-w-0 ${className}`}>\n <span className=\"text-muted-foreground\">{label}</span>\n <div className={`truncate ${mono ? 'font-mono' : ''}`} title={value}>{value}</div>\n </div>\n )\n}\n\nfunction Pills({ label, values }: { label: string; values: string[] }) {\n return (\n <div className=\"col-span-2\">\n <span className=\"text-muted-foreground\">{label}</span>\n <div className=\"mt-0.5 flex flex-wrap gap-1\">\n {values.map((value) => <Badge key={value} variant=\"outline\" className=\"text-[10px]\">{value}</Badge>)}\n </div>\n </div>\n )\n}\n\nfunction ErrorBlock({ title, body }: { title: string; body: string }) {\n return (\n <div className=\"rounded border border-red-500/20 bg-red-500/5 px-2 py-1.5\">\n <span className=\"text-muted-foreground\">{title}</span>\n <div className=\"mt-0.5 break-words text-red-300/80\">{body}</div>\n </div>\n )\n}\n","import { useEffect, useState } from 'react'\nimport { FileText, Pencil, Play, Plus, RotateCw, Square, Stethoscope, Terminal, Trash2 } from 'lucide-react'\nimport { useNow, useRelayStore } from '@/store'\nimport { Button } from '@/components/ui/button'\nimport { HealthBadge } from '@/components/shared/health-badge'\nimport { LogViewer } from '@/components/shared/log-viewer'\nimport { ManagedPolicyDiagnostics } from '@/components/shared/managed-policy-diagnostics'\nimport { TerminalDialog } from '@/components/shared/terminal-viewer'\nimport { fmtTime } from '@/lib/display'\nimport type { Agent, ManagedPolicyHealth } from '@/types'\n\nfunction terminalSessionFor(item: ManagedPolicyHealth, agent?: Agent): string | undefined {\n const agentSession = agent?.meta?.tmuxSession\n if (typeof agentSession === 'string' && agentSession.trim()) return agentSession\n return item.state.tmuxSession\n}\n\nfunction canReadTerminal(item: ManagedPolicyHealth, agent?: Agent): boolean {\n if (!terminalSessionFor(item, agent)) return false\n if (agent) return Boolean(agent.providerCapabilities?.terminal?.live?.read)\n return item.policy.provider === 'claude'\n}\n\nfunction canWriteTerminal(item: ManagedPolicyHealth, agent?: Agent): boolean {\n if (!canReadTerminal(item, agent)) return false\n if (agent) return Boolean(agent.providerCapabilities?.terminal?.live?.write || item.policy.provider === 'claude')\n return item.policy.provider === 'claude'\n}\n\nexport function ManagedAgentsView() {\n const policies = useRelayStore((s) => s.managedPolicies)\n const agentsById = useRelayStore((s) => s.agentsById)\n const orchestrators = useRelayStore((s) => s.orchestrators)\n const fetchManagedPolicies = useRelayStore((s) => s.fetchManagedPolicies)\n const fetchOrchestrators = useRelayStore((s) => s.fetchOrchestrators)\n const apiCall = useRelayStore((s) => s.apiCall)\n const openPolicyCreate = useRelayStore((s) => s.openPolicyCreate)\n const openPolicyEdit = useRelayStore((s) => s.openPolicyEdit)\n const deletePolicy = useRelayStore((s) => s.deletePolicy)\n const now = useNow()\n const [logsFor, setLogsFor] = useState<ManagedPolicyHealth | null>(null)\n const [terminalFor, setTerminalFor] = useState<{ item: ManagedPolicyHealth; session: string } | null>(null)\n const [diagnosticsFor, setDiagnosticsFor] = useState<string | null>(null)\n\n useEffect(() => {\n void Promise.all([fetchManagedPolicies(), fetchOrchestrators()])\n }, [])\n\n async function lifecycle(name: string, action: 'start' | 'stop' | 'restart') {\n await apiCall('POST', `/spawn-policy/${encodeURIComponent(name)}/${action}`, { surface: { component: 'managed-agents' } })\n await fetchManagedPolicies()\n }\n\n const diagnosticsItem = diagnosticsFor ? policies.find((item) => item.policy.name === diagnosticsFor) ?? null : null\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Managed Agents</h1>\n <p className=\"text-sm text-muted-foreground\">Spawn policies, lifecycle state, and headless session logs.</p>\n </div>\n <Button onClick={openPolicyCreate} size=\"sm\">\n <Plus className=\"h-4 w-4 mr-1\" />\n Create Policy\n </Button>\n </div>\n\n {policies.length === 0 && (\n <div className=\"rounded-md border border-border px-3 py-8 text-center text-sm text-muted-foreground\">\n No managed agents configured\n </div>\n )}\n\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {policies.map((item) => {\n const agent = item.state.agentId ? agentsById[item.state.agentId] : undefined\n const terminalSession = terminalSessionFor(item, agent)\n return (\n <div key={item.policy.name} className=\"rounded-md border border-border bg-card p-3 space-y-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"font-medium text-sm truncate\">{item.policy.label || item.policy.name}</div>\n <div className=\"text-xs text-muted-foreground truncate\">{item.policy.mode} · {item.policy.cwd}</div>\n </div>\n <HealthBadge status={item.state.status} />\n </div>\n\n <div className=\"grid grid-cols-2 gap-x-4 gap-y-1 text-xs\">\n <div className=\"text-muted-foreground\">Provider</div>\n <div>{item.policy.provider}</div>\n <div className=\"text-muted-foreground\">Agent</div>\n <div className=\"font-mono truncate\">{item.state.agentId || '-'}</div>\n <div className=\"text-muted-foreground\">Restarts</div>\n <div>{item.state.restartCount}</div>\n {(item.state.backoffUntil || item.state.lastError) && (\n <>\n <div className=\"text-muted-foreground\">{item.state.backoffUntil ? 'Backoff' : 'Error'}</div>\n <div className=\"truncate\">{item.state.backoffUntil ? fmtTime(item.state.backoffUntil) : item.state.lastError}</div>\n </>\n )}\n </div>\n\n <div className=\"flex flex-wrap gap-1 pt-1 border-t border-border\">\n <Button size=\"icon\" variant=\"outline\" className=\"h-7 w-7\" onClick={() => lifecycle(item.policy.name, 'start')} title=\"Start\"><Play className=\"h-3.5 w-3.5\" /></Button>\n <Button size=\"icon\" variant=\"outline\" className=\"h-7 w-7\" onClick={() => lifecycle(item.policy.name, 'stop')} title=\"Stop\"><Square className=\"h-3.5 w-3.5\" /></Button>\n <Button size=\"icon\" variant=\"outline\" className=\"h-7 w-7\" onClick={() => lifecycle(item.policy.name, 'restart')} title=\"Restart\"><RotateCw className=\"h-3.5 w-3.5\" /></Button>\n <Button size=\"icon\" variant=\"outline\" className=\"h-7 w-7\" onClick={() => setLogsFor(item)} disabled={!item.state.tmuxSession} title=\"Logs\"><FileText className=\"h-3.5 w-3.5\" /></Button>\n <Button size=\"icon\" variant=\"outline\" className=\"h-7 w-7\" onClick={() => terminalSession && setTerminalFor({ item, session: terminalSession })} disabled={!canReadTerminal(item, agent)} title=\"Terminal\"><Terminal className=\"h-3.5 w-3.5\" /></Button>\n <Button size=\"icon\" variant={diagnosticsFor === item.policy.name ? 'secondary' : 'outline'} className=\"h-7 w-7\" onClick={() => setDiagnosticsFor((current) => current === item.policy.name ? null : item.policy.name)} title=\"Diagnostics\"><Stethoscope className=\"h-3.5 w-3.5\" /></Button>\n <Button size=\"icon\" variant=\"outline\" className=\"h-7 w-7\" onClick={() => openPolicyEdit(item.policy)} title=\"Edit\"><Pencil className=\"h-3.5 w-3.5\" /></Button>\n <Button size=\"icon\" variant=\"outline\" className=\"h-7 w-7\" onClick={() => deletePolicy(item.policy.name)} title=\"Delete\"><Trash2 className=\"h-3.5 w-3.5\" /></Button>\n </div>\n </div>\n )\n })}\n </div>\n\n {diagnosticsItem && (\n <ManagedPolicyDiagnostics\n item={diagnosticsItem}\n agent={diagnosticsItem.state.agentId ? agentsById[diagnosticsItem.state.agentId] : undefined}\n orchestrators={orchestrators}\n now={now}\n onClose={() => setDiagnosticsFor(null)}\n />\n )}\n\n {logsFor?.state.tmuxSession && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold\">{logsFor.policy.name} Logs</h2>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setLogsFor(null)}>Close</Button>\n </div>\n <LogViewer orchestratorId={logsFor.policy.orchestratorId} session={logsFor.state.tmuxSession} />\n </div>\n )}\n\n <TerminalDialog\n open={!!terminalFor}\n onOpenChange={(open) => { if (!open) setTerminalFor(null) }}\n orchestratorId={terminalFor?.item.policy.orchestratorId ?? ''}\n session={terminalFor?.session ?? ''}\n interactive={terminalFor ? canWriteTerminal(terminalFor.item, terminalFor.item.state.agentId ? agentsById[terminalFor.item.state.agentId] : undefined) : false}\n />\n </div>\n )\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{Ct as t,Pn as n,Qn as r,Yn as i,dr as a,l as o,m as s,mt as c,ot as l,pt as u,tt as d}from"./lucide-react-BYZuAhQs.js";import{d as f,t as p}from"./store-DNbkrqbU.js";import{K as m,M as h,X as g,d as _,f as v,g as y,lt as b,q as x}from"./display-DRiGi1zj.js";import{t as S}from"./badge-BLar6FjP.js";import{D as C,G as w,H as T,O as E,R as D,U as O,u as k}from"./index-DeDosfVE.js";import{a as A,o as j,r as M,t as N}from"./card-lhnFnBoz.js";var P=e(a(),1),F=r();function I(){let e=p(e=>e.stats),r=p(e=>e.agents),a=p(e=>e.messages),I=p(e=>e.health),L=f(),R=p(e=>e.agentsById),z=p(e=>e.switchView),B=p(e=>e.runHealthAction),V=p(e=>e.managedPolicies),H=p(e=>e.showOffline),U=w(),W=O(),G=T(),K=(0,P.useMemo)(()=>{let e=g(r,!1,V);return H||(e=e.filter(e=>e.status!==`offline`)),[...e].sort((e,t)=>(b[e.status]??9)-(b[t.status]??9)||x(t.lastSeen)-x(e.lastSeen))},[r,H,V]),q=K.slice(0,20),J=[...a].sort((e,t)=>t.id-e.id).slice(0,15),Y=I&&I.status!==`ok`?y(I.checks||[]):[];function X(e){z(e)}return(0,F.jsxs)(`div`,{className:`space-y-6`,children:[(0,F.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-4 gap-4`,children:[(0,F.jsxs)(N,{className:`cursor-pointer hover:border-zinc-600 transition-colors`,onClick:()=>X(`agents`),children:[(0,F.jsx)(A,{className:`pb-1 pt-4 px-4`,children:(0,F.jsxs)(j,{className:`text-xs font-medium text-muted-foreground flex items-center gap-1.5`,children:[(0,F.jsx)(o,{className:`w-3.5 h-3.5`}),`Agents`]})}),(0,F.jsxs)(M,{className:`px-4 pb-4`,children:[(0,F.jsx)(`div`,{className:`text-2xl font-bold`,children:K.length}),(0,F.jsxs)(`div`,{className:`text-xs text-muted-foreground mt-0.5`,children:[U,` online`]})]})]}),(0,F.jsxs)(N,{className:`cursor-pointer hover:border-zinc-600 transition-colors`,onClick:()=>X(`agents`),children:[(0,F.jsx)(A,{className:`pb-1 pt-4 px-4`,children:(0,F.jsxs)(j,{className:`text-xs font-medium text-muted-foreground flex items-center gap-1.5`,children:[(0,F.jsx)(i,{className:`w-3.5 h-3.5`}),`Busy`]})}),(0,F.jsxs)(M,{className:`px-4 pb-4`,children:[(0,F.jsx)(`div`,{className:`text-2xl font-bold`,children:W}),(0,F.jsx)(`div`,{className:`text-xs text-muted-foreground mt-0.5`,children:`in a turn now`})]})]}),(0,F.jsxs)(N,{className:`cursor-pointer hover:border-zinc-600 transition-colors`,onClick:()=>X(`messages`),children:[(0,F.jsx)(A,{className:`pb-1 pt-4 px-4`,children:(0,F.jsxs)(j,{className:`text-xs font-medium text-muted-foreground flex items-center gap-1.5`,children:[(0,F.jsx)(d,{className:`w-3.5 h-3.5`}),`Messages 24h`]})}),(0,F.jsxs)(M,{className:`px-4 pb-4`,children:[(0,F.jsx)(`div`,{className:`text-2xl font-bold`,children:e.messagesLast24h??`—`}),(0,F.jsx)(`div`,{className:`text-xs text-muted-foreground mt-0.5`,children:`last 24 hours`})]})]}),(0,F.jsxs)(N,{className:`cursor-pointer hover:border-zinc-600 transition-colors`,onClick:()=>X(`messages`),children:[(0,F.jsx)(A,{className:`pb-1 pt-4 px-4`,children:(0,F.jsxs)(j,{className:`text-xs font-medium text-muted-foreground flex items-center gap-1.5`,children:[(0,F.jsx)(l,{className:`w-3.5 h-3.5`}),`Total Messages`]})}),(0,F.jsxs)(M,{className:`px-4 pb-4`,children:[(0,F.jsx)(`div`,{className:`text-2xl font-bold`,children:e.messages??`—`}),(0,F.jsx)(`div`,{className:`text-xs text-muted-foreground mt-0.5`,children:`all time`})]})]})]}),Y.length>0&&(0,F.jsxs)(N,{className:`border-yellow-500/40 bg-yellow-500/5`,children:[(0,F.jsx)(A,{className:`pb-2 pt-4 px-4`,children:(0,F.jsxs)(j,{className:`text-sm font-medium text-yellow-400 flex items-center gap-2`,children:[(0,F.jsx)(s,{className:`w-4 h-4`}),`Health Alerts (`,Y.length,`)`]})}),(0,F.jsx)(M,{className:`px-4 pb-4 space-y-2`,children:Y.map(e=>(0,F.jsxs)(`div`,{className:`text-sm space-y-1`,children:[(0,F.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,F.jsx)(S,{variant:`outline`,className:e.status===`error`?`border-red-500/40 text-red-400`:`border-yellow-500/40 text-yellow-400`,children:e.status}),(0,F.jsx)(`span`,{className:`font-medium`,children:e.name})]}),(0,F.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.detail}),e.subjects.length>0&&(0,F.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:e.subjects.map(e=>(0,F.jsxs)(S,{variant:`secondary`,className:`max-w-full truncate text-[11px]`,title:[e.id,e.status,e.detail].filter(Boolean).join(` · `),children:[e.label||e.id,e.status?` · ${e.status}`:``,e.detail?` · ${e.detail}`:``]},e.id))}),e.actions.length>0&&(0,F.jsx)(`div`,{className:`flex flex-wrap gap-1.5 pt-0.5`,children:e.actions.slice(0,3).map(e=>(0,F.jsx)(`button`,{onClick:()=>B(e),className:`text-xs text-blue-400 hover:text-blue-300 underline underline-offset-2`,children:e.label},e.label))})]},e.name))})]}),(0,F.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-4`,children:[(0,F.jsx)(N,{className:`cursor-pointer hover:border-zinc-600 transition-colors ${G.unreadInbox>0?`border-red-500/40`:``}`,onClick:()=>X(`chat`),children:(0,F.jsxs)(M,{className:`p-4 flex items-center gap-3`,children:[(0,F.jsx)(`div`,{className:`p-2 rounded-lg ${G.unreadInbox>0?`bg-red-500/15`:`bg-zinc-800`}`,children:(0,F.jsx)(t,{className:`w-4 h-4 ${G.unreadInbox>0?`text-red-400`:`text-zinc-400`}`})}),(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`div`,{className:`text-lg font-bold`,children:G.unreadInbox}),(0,F.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`Unread`})]})]})}),(0,F.jsx)(N,{className:`cursor-pointer hover:border-zinc-600 transition-colors ${G.pendingPairInvites>0?`border-yellow-500/40`:``}`,onClick:()=>X(`pairs`),children:(0,F.jsxs)(M,{className:`p-4 flex items-center gap-3`,children:[(0,F.jsx)(`div`,{className:`p-2 rounded-lg ${G.pendingPairInvites>0?`bg-yellow-500/15`:`bg-zinc-800`}`,children:(0,F.jsx)(c,{className:`w-4 h-4 ${G.pendingPairInvites>0?`text-yellow-400`:`text-zinc-400`}`})}),(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`div`,{className:`text-lg font-bold`,children:G.pendingPairInvites}),(0,F.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`Pair invites`})]})]})}),(0,F.jsx)(N,{className:`cursor-pointer hover:border-zinc-600 transition-colors ${G.claimableTasks>0?`border-orange-500/40`:``}`,onClick:()=>X(`work`),children:(0,F.jsxs)(M,{className:`p-4 flex items-center gap-3`,children:[(0,F.jsx)(`div`,{className:`p-2 rounded-lg ${G.claimableTasks>0?`bg-orange-500/15`:`bg-zinc-800`}`,children:(0,F.jsx)(u,{className:`w-4 h-4 ${G.claimableTasks>0?`text-orange-400`:`text-zinc-400`}`})}),(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`div`,{className:`text-lg font-bold`,children:G.claimableTasks}),(0,F.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`Claimable waiting`})]})]})})]}),(0,F.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-6`,children:[(0,F.jsxs)(N,{children:[(0,F.jsx)(A,{className:`pb-2 pt-4 px-4`,children:(0,F.jsxs)(j,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,F.jsx)(n,{className:`w-4 h-4 text-muted-foreground`}),`Agents`,(0,F.jsx)(`span`,{className:`ml-auto text-xs text-muted-foreground font-normal`,children:q.length})]})}),(0,F.jsx)(M,{className:`px-0 pb-0`,children:(0,F.jsx)(k,{className:`h-[340px]`,children:q.length===0?(0,F.jsx)(`div`,{className:`px-4 pb-4 text-sm text-muted-foreground`,children:`No agents registered.`}):(0,F.jsx)(`div`,{className:`space-y-0`,children:q.map((e,t)=>(0,F.jsxs)(`div`,{children:[t>0&&(0,F.jsx)(D,{}),(0,F.jsxs)(`div`,{className:`flex items-center gap-2.5 px-4 py-2.5 hover:bg-zinc-800/50 transition-colors cursor-pointer`,onClick:()=>p.getState().openAgentDetail(e),children:[(0,F.jsx)(E,{agent:e,now:L}),(0,F.jsx)(C,{agent:e}),(0,F.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,F.jsx)(`div`,{className:`text-sm font-medium truncate`,children:_(e)}),e.tags.length>0&&(0,F.jsx)(`div`,{className:`flex gap-1 mt-0.5 flex-wrap`,children:e.tags.slice(0,2).map(e=>(0,F.jsx)(S,{variant:`outline`,className:`text-[9px] px-1 py-0 h-4`,children:e},e))})]}),(0,F.jsx)(`span`,{className:`text-xs text-muted-foreground shrink-0`,children:m(L,e.lastSeen)})]})]},e.id))})})})]}),(0,F.jsxs)(N,{children:[(0,F.jsx)(A,{className:`pb-2 pt-4 px-4`,children:(0,F.jsxs)(j,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,F.jsx)(i,{className:`w-4 h-4 text-muted-foreground`}),`Recent Activity`,(0,F.jsx)(`span`,{className:`ml-auto text-xs text-muted-foreground font-normal`,children:J.length})]})}),(0,F.jsx)(M,{className:`px-0 pb-0`,children:(0,F.jsx)(k,{className:`h-[340px]`,children:J.length===0?(0,F.jsx)(`div`,{className:`px-4 pb-4 text-sm text-muted-foreground`,children:`No recent messages.`}):(0,F.jsx)(`div`,{className:`space-y-0`,children:J.map((e,t)=>(0,F.jsxs)(`div`,{children:[t>0&&(0,F.jsx)(D,{}),(0,F.jsxs)(`div`,{className:`px-4 py-2.5 hover:bg-zinc-800/50 transition-colors`,children:[(0,F.jsxs)(`div`,{className:`flex items-center gap-1 text-xs text-muted-foreground mb-0.5`,children:[(0,F.jsx)(`span`,{className:`text-foreground font-medium truncate max-w-[100px]`,children:v(e.from,R)}),(0,F.jsx)(`span`,{children:`→`}),(0,F.jsx)(`span`,{className:`truncate max-w-[100px]`,children:v(e.to,R)}),(0,F.jsxs)(`span`,{className:`ml-auto shrink-0 tabular-nums`,children:[(0,F.jsxs)(`span`,{className:`opacity-40 mr-1`,children:[`#`,e.id]}),m(L,e.createdAt)]})]}),(0,F.jsx)(`div`,{className:`text-xs text-foreground line-clamp-2 leading-snug`,children:h(e)})]})]},e.id))})})})]})]})]})}export{I as OverviewView};
2
- //# sourceMappingURL=overview-D9BxevAq.js.map
@@ -1,2 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{$n as t,B as n,H as r,I as i,Qn as a,Qt as o,Y as s,_n as c,dr as l,mn as u,on as d}from"./lucide-react-BYZuAhQs.js";import{a as f}from"./types-Tv67voFu.js";import{t as p}from"./badge-BLar6FjP.js";import{t as m}from"./button-BrIB69qd.js";import{t as h}from"./input-B_fUHtLD.js";import{n as g,z as _}from"./index-DeDosfVE.js";import{a as v,o as y,r as b,t as x}from"./card-lhnFnBoz.js";var S=e(l(),1),C=a(),w=[{value:`all`,label:`All`},{value:`skill`,label:`Skills`},{value:`plugin`,label:`Plugins`},{value:`mcp`,label:`MCP`}],T=[`any`,`claude`,`codex`];function E(e){return e===`skill`?`bg-blue-500/10 text-blue-400 border-blue-500/30`:e===`plugin`?`bg-violet-500/10 text-violet-400 border-violet-500/30`:`bg-emerald-500/10 text-emerald-400 border-emerald-500/30`}function D(e){return e===`claude`?`bg-amber-500/10 text-amber-400 border-amber-500/30`:e===`codex`?`bg-sky-500/10 text-sky-400 border-sky-500/30`:`bg-zinc-500/10 text-zinc-400 border-zinc-500/30`}function O(e){return e===`approved`?`bg-emerald-500/10 text-emerald-400 border-emerald-500/30`:e===`rejected`?`bg-red-500/10 text-red-400 border-red-500/30`:`bg-yellow-500/10 text-yellow-400 border-yellow-500/30`}function k({status:e}){return e===`valid`?(0,C.jsx)(u,{className:`h-3.5 w-3.5 text-emerald-400`}):e===`invalid`?(0,C.jsx)(c,{className:`h-3.5 w-3.5 text-red-400`}):(0,C.jsx)(d,{className:`h-3.5 w-3.5 text-zinc-400`})}var A={kind:`skill`,slug:``,title:``},j={githubUrl:``,ref:`main`,subpath:``,provider:`any`,versionConstraint:``},M={command:``,args:``,url:``,approvalStatus:`pending`,versionConstraint:``};function N({variant:e,onToggle:t,onUpdate:n,onValidate:i,busy:a}){let s=a===e.id;return(0,C.jsxs)(`div`,{className:`rounded-md border border-border bg-card/60 p-3 space-y-2`,children:[(0,C.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,C.jsx)(p,{variant:`outline`,className:`text-[10px] ${D(e.provider)}`,children:e.provider}),(0,C.jsx)(`span`,{className:`text-xs font-medium font-mono`,children:e.name}),e.approvalStatus&&(0,C.jsx)(p,{variant:`outline`,className:`text-[10px] ${O(e.approvalStatus)}`,children:e.approvalStatus}),(0,C.jsxs)(`span`,{className:`text-[10px] text-muted-foreground flex items-center gap-1 ml-auto`,children:[(0,C.jsx)(k,{status:e.validationStatus}),e.validationStatus??`unvalidated`]}),(0,C.jsx)(_,{size:`sm`,checked:e.enabled,disabled:s,onCheckedChange:n=>t(e.id,n)})]}),(e.sourceUrl||e.sourceRef)&&(0,C.jsxs)(`div`,{className:`text-[10px] text-muted-foreground font-mono truncate`,title:e.sourceUrl,children:[e.sourceUrl,e.sourceRef?`@${e.resolvedRef??e.sourceRef}`:``,e.sourceSubpath?` · ${e.sourceSubpath}`:``]}),(0,C.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,C.jsxs)(m,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,disabled:s||!e.sourceRef,onClick:()=>n(e.id),title:`Pull latest from source ref`,children:[(0,C.jsx)(o,{className:`h-3 w-3 mr-1`}),`Update ref`]}),(0,C.jsxs)(m,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,disabled:s,onClick:()=>i(e.id),children:[(0,C.jsx)(r,{className:`h-3 w-3 mr-1`}),`Validate`]})]})]})}function P({form:e,onChange:t,onSubmit:n,onCancel:r,busy:i,error:a}){return(0,C.jsxs)(`div`,{className:`rounded-md border border-border bg-card/60 p-3 space-y-3`,children:[(0,C.jsx)(`div`,{className:`text-sm font-medium`,children:`New Capability`}),a&&(0,C.jsx)(`div`,{className:`text-xs text-destructive`,children:a}),(0,C.jsxs)(`div`,{children:[(0,C.jsx)(g,{className:`text-xs`,children:`Kind`}),(0,C.jsxs)(`select`,{className:`mt-1 w-full rounded-md border border-input bg-background px-2 py-1.5 text-sm`,value:e.kind,onChange:e=>t({kind:e.target.value}),children:[(0,C.jsx)(`option`,{value:`skill`,children:`Skill`}),(0,C.jsx)(`option`,{value:`plugin`,children:`Plugin`}),(0,C.jsx)(`option`,{value:`mcp`,children:`MCP Server`})]})]}),(0,C.jsxs)(`div`,{children:[(0,C.jsx)(g,{className:`text-xs`,children:`Slug`}),(0,C.jsx)(h,{value:e.slug,onChange:e=>t({slug:e.target.value}),placeholder:`my-capability`,className:`mt-1 text-sm font-mono`})]}),(0,C.jsxs)(`div`,{children:[(0,C.jsx)(g,{className:`text-xs`,children:`Title (optional)`}),(0,C.jsx)(h,{value:e.title,onChange:e=>t({title:e.target.value}),placeholder:`My Capability`,className:`mt-1 text-sm`})]}),(0,C.jsxs)(`div`,{className:`flex gap-2`,children:[(0,C.jsx)(m,{size:`sm`,onClick:n,disabled:i||!e.slug.trim(),children:i?`Creating…`:`Create`}),(0,C.jsx)(m,{size:`sm`,variant:`outline`,onClick:r,children:`Cancel`})]})]})}function F({form:e,onChange:t,onSubmit:n,onCancel:r,busy:i,error:a}){return(0,C.jsxs)(`div`,{className:`rounded-md border border-border bg-card/60 p-3 space-y-3`,children:[(0,C.jsx)(`div`,{className:`text-sm font-medium`,children:`Import from GitHub`}),a&&(0,C.jsx)(`div`,{className:`text-xs text-destructive`,children:a}),(0,C.jsxs)(`div`,{children:[(0,C.jsx)(g,{className:`text-xs`,children:`GitHub URL`}),(0,C.jsx)(h,{value:e.githubUrl,onChange:e=>t({githubUrl:e.target.value}),placeholder:`https://github.com/owner/repo`,className:`mt-1 text-sm font-mono`})]}),(0,C.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,C.jsxs)(`div`,{children:[(0,C.jsx)(g,{className:`text-xs`,children:`Ref`}),(0,C.jsx)(h,{value:e.ref,onChange:e=>t({ref:e.target.value}),placeholder:`main`,className:`mt-1 text-sm font-mono`})]}),(0,C.jsxs)(`div`,{children:[(0,C.jsx)(g,{className:`text-xs`,children:`Subpath (optional)`}),(0,C.jsx)(h,{value:e.subpath,onChange:e=>t({subpath:e.target.value}),placeholder:`skills/my-skill`,className:`mt-1 text-sm font-mono`})]})]}),(0,C.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,C.jsxs)(`div`,{children:[(0,C.jsx)(g,{className:`text-xs`,children:`Provider`}),(0,C.jsx)(`select`,{className:`mt-1 w-full rounded-md border border-input bg-background px-2 py-1.5 text-sm`,value:e.provider,onChange:e=>t({provider:e.target.value}),children:T.map(e=>(0,C.jsx)(`option`,{value:e,children:e},e))})]}),(0,C.jsxs)(`div`,{children:[(0,C.jsx)(g,{className:`text-xs`,children:`Version constraint (optional)`}),(0,C.jsx)(h,{value:e.versionConstraint,onChange:e=>t({versionConstraint:e.target.value}),placeholder:`>=1.0.0`,className:`mt-1 text-sm font-mono`})]})]}),(0,C.jsxs)(`div`,{className:`flex gap-2`,children:[(0,C.jsx)(m,{size:`sm`,onClick:n,disabled:i||!e.githubUrl.trim()||!e.ref.trim(),children:i?`Importing…`:`Import`}),(0,C.jsx)(m,{size:`sm`,variant:`outline`,onClick:r,children:`Cancel`})]})]})}function I({form:e,onChange:t,onSubmit:n,onCancel:r,busy:i,error:a}){return(0,C.jsxs)(`div`,{className:`rounded-md border border-border bg-card/60 p-3 space-y-3`,children:[(0,C.jsx)(`div`,{className:`text-sm font-medium`,children:`Add MCP Server Variant`}),a&&(0,C.jsx)(`div`,{className:`text-xs text-destructive`,children:a}),(0,C.jsxs)(`div`,{children:[(0,C.jsx)(g,{className:`text-xs`,children:`Command (for stdio type)`}),(0,C.jsx)(h,{value:e.command,onChange:e=>t({command:e.target.value}),placeholder:`npx -y @modelcontextprotocol/server-foo`,className:`mt-1 text-sm font-mono`})]}),(0,C.jsxs)(`div`,{children:[(0,C.jsx)(g,{className:`text-xs`,children:`Args (space-separated, overrides command split)`}),(0,C.jsx)(h,{value:e.args,onChange:e=>t({args:e.target.value}),placeholder:`--port 3000`,className:`mt-1 text-sm font-mono`})]}),(0,C.jsxs)(`div`,{children:[(0,C.jsx)(g,{className:`text-xs`,children:`URL (for http/sse type)`}),(0,C.jsx)(h,{value:e.url,onChange:e=>t({url:e.target.value}),placeholder:`http://localhost:3000/mcp`,className:`mt-1 text-sm font-mono`})]}),(0,C.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,C.jsxs)(`div`,{children:[(0,C.jsx)(g,{className:`text-xs`,children:`Approval status`}),(0,C.jsxs)(`select`,{className:`mt-1 w-full rounded-md border border-input bg-background px-2 py-1.5 text-sm`,value:e.approvalStatus,onChange:e=>t({approvalStatus:e.target.value}),children:[(0,C.jsx)(`option`,{value:`pending`,children:`Pending`}),(0,C.jsx)(`option`,{value:`approved`,children:`Approved`})]})]}),(0,C.jsxs)(`div`,{children:[(0,C.jsx)(g,{className:`text-xs`,children:`Version constraint (optional)`}),(0,C.jsx)(h,{value:e.versionConstraint,onChange:e=>t({versionConstraint:e.target.value}),placeholder:`>=1.0.0`,className:`mt-1 text-sm font-mono`})]})]}),(0,C.jsxs)(`div`,{className:`flex gap-2`,children:[(0,C.jsx)(m,{size:`sm`,onClick:n,disabled:i||!e.command.trim()&&!e.url.trim(),children:i?`Adding…`:`Add MCP Variant`}),(0,C.jsx)(m,{size:`sm`,variant:`outline`,onClick:r,children:`Cancel`})]})]})}function L(){let[e,r]=(0,S.useState)([]),[a,o]=(0,S.useState)(`all`),[c,l]=(0,S.useState)(``),[u,d]=(0,S.useState)(!0),[h,g]=(0,S.useState)(null),[_,T]=(0,S.useState)(`none`),[D,O]=(0,S.useState)(!1),[k,L]=(0,S.useState)(null),[R,z]=(0,S.useState)(null),[B,V]=(0,S.useState)(A),[H,U]=(0,S.useState)(j),[W,G]=(0,S.useState)(M);async function K(){g(null);try{let e=await t(`GET`,`/provisioning/capabilities${a===`all`?``:`?kind=${a}`}`);r(e.capabilities),!c&&e.capabilities.length>0&&l(e.capabilities[0].capability.id)}catch(e){g(f(e))}finally{d(!1)}}(0,S.useEffect)(()=>{d(!0),K()},[a]);let q=e.find(e=>e.capability.id===c)??null;function J(e){T(e),L(null),O(!1),V(A),U(j),G(M)}async function Y(){O(!0),L(null);try{await t(`POST`,`/provisioning/capabilities`,{kind:B.kind,slug:B.slug.trim(),title:B.title.trim()||void 0}),T(`none`),await K()}catch(e){L(f(e))}finally{O(!1)}}async function X(){if(q){O(!0),L(null);try{await t(`POST`,`/provisioning/capabilities/${encodeURIComponent(q.capability.id)}/variants/import`,{githubUrl:H.githubUrl.trim(),ref:H.ref.trim(),subpath:H.subpath.trim()||void 0,provider:H.provider,versionConstraint:H.versionConstraint.trim()||void 0}),T(`none`),await K()}catch(e){L(f(e))}finally{O(!1)}}}async function Z(){if(q){O(!0),L(null);try{let e={};if(W.url.trim())e.type=`http`,e.url=W.url.trim();else{e.type=`stdio`;let t=W.command.trim().split(/\s+/);e.command=t[0];let n=W.args.trim()?W.args.trim().split(/\s+/):t.slice(1);n.length>0&&(e.args=n)}await t(`POST`,`/provisioning/capabilities/${encodeURIComponent(q.capability.id)}/variants/mcp`,{server:e,approvalStatus:W.approvalStatus,versionConstraint:W.versionConstraint.trim()||void 0}),T(`none`),await K()}catch(e){L(f(e))}finally{O(!1)}}}async function Q(e,n){z(e);try{await t(`PATCH`,`/provisioning/variants/${encodeURIComponent(e)}`,{enabled:n}),r(t=>t.map(t=>({...t,variants:t.variants.map(t=>t.id===e?{...t,enabled:n}:t)})))}catch(e){g(f(e))}finally{z(null)}}async function ee(e){let n=q?.variants.find(t=>t.id===e);if(n?.sourceRef){z(e);try{await t(`POST`,`/provisioning/variants/${encodeURIComponent(e)}/update`,{ref:n.sourceRef,subpath:n.sourceSubpath}),await K()}catch(e){g(f(e))}finally{z(null)}}}async function te(e){z(e);try{await t(`POST`,`/provisioning/variants/${encodeURIComponent(e)}/validate`,{}),await K()}catch(e){g(f(e))}finally{z(null)}}let $=q?.capability;return(0,C.jsxs)(`div`,{className:`space-y-4 p-4`,children:[(0,C.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,C.jsx)(s,{className:`size-5 text-primary`}),(0,C.jsx)(`h1`,{className:`text-lg font-semibold`,children:`Registry`}),(0,C.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`provisioning capability registry · #561`}),(0,C.jsxs)(`div`,{className:`ml-auto flex items-center gap-2`,children:[w.map(e=>(0,C.jsx)(`button`,{type:`button`,onClick:()=>o(e.value),className:`rounded-md border px-2.5 py-1 text-xs transition-colors ${a===e.value?`border-primary/40 bg-primary/10 text-primary`:`border-border text-muted-foreground hover:bg-accent`}`,children:e.label},e.value)),(0,C.jsx)(m,{variant:`outline`,size:`sm`,onClick:()=>void K(),children:(0,C.jsx)(i,{className:`size-4`})})]})]}),h&&(0,C.jsx)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive`,children:h}),(0,C.jsxs)(`div`,{className:`grid grid-cols-1 gap-4 xl:grid-cols-[300px_1fr]`,children:[(0,C.jsxs)(`div`,{className:`space-y-2`,children:[(0,C.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,C.jsxs)(`span`,{className:`text-xs text-muted-foreground font-medium`,children:[e.length,` capabilities`]}),(0,C.jsxs)(m,{size:`sm`,variant:`outline`,className:`h-7 text-xs gap-1`,onClick:()=>J(`new-capability`),children:[(0,C.jsx)(n,{className:`h-3 w-3`}),`New`]})]}),_===`new-capability`&&(0,C.jsx)(P,{form:B,onChange:e=>V(t=>({...t,...e})),onSubmit:()=>void Y(),onCancel:()=>T(`none`),busy:D,error:k}),u&&e.length===0&&(0,C.jsx)(`div`,{className:`py-8 text-center text-sm text-muted-foreground`,children:`Loading…`}),!u&&e.length===0&&(0,C.jsx)(x,{children:(0,C.jsx)(b,{className:`py-10 text-center text-sm text-muted-foreground`,children:`No capabilities yet. Click New to create one.`})}),e.map(({capability:e,variants:t})=>(0,C.jsxs)(`button`,{type:`button`,onClick:()=>{l(e.id),T(`none`)},className:`w-full rounded-md border p-3 text-left transition-colors ${c===e.id?`border-primary/50 bg-primary/5`:`border-border bg-card/60 hover:bg-accent`}`,children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,C.jsx)(p,{variant:`outline`,className:`text-[10px] ${E(e.kind)}`,children:e.kind}),(0,C.jsx)(`span`,{className:`text-xs font-medium font-mono truncate flex-1`,children:e.slug}),(0,C.jsxs)(`span`,{className:`text-[10px] text-muted-foreground shrink-0`,children:[t.length,`v`]})]}),e.title&&(0,C.jsx)(`div`,{className:`mt-1 text-xs text-muted-foreground truncate`,children:e.title}),(0,C.jsxs)(`div`,{className:`mt-1 flex items-center gap-1.5`,children:[(0,C.jsx)(`span`,{className:`inline-block h-1.5 w-1.5 rounded-full ${e.status===`active`?`bg-emerald-500`:`bg-zinc-500`}`}),(0,C.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:e.status})]})]},e.id))]}),$?(0,C.jsxs)(`div`,{className:`space-y-3`,children:[(0,C.jsxs)(x,{children:[(0,C.jsx)(v,{children:(0,C.jsxs)(y,{className:`flex flex-wrap items-center gap-2`,children:[(0,C.jsx)(p,{variant:`outline`,className:E($.kind),children:$.kind}),(0,C.jsx)(`span`,{className:`font-mono text-base`,children:$.slug}),$.title&&(0,C.jsxs)(`span`,{className:`text-sm font-normal text-muted-foreground`,children:[`· `,$.title]}),(0,C.jsx)(p,{variant:$.status===`active`?`secondary`:`outline`,className:`ml-auto text-[10px]`,children:$.status})]})}),$.description&&(0,C.jsx)(b,{className:`pt-0 text-sm text-muted-foreground`,children:$.description})]}),(0,C.jsxs)(x,{children:[(0,C.jsx)(v,{children:(0,C.jsxs)(y,{className:`flex items-center gap-2 text-base`,children:[`Variants`,(0,C.jsxs)(`span`,{className:`text-xs font-normal text-muted-foreground`,children:[`(`,q?.variants.length??0,`)`]}),(0,C.jsxs)(`div`,{className:`ml-auto flex items-center gap-2`,children:[(0,C.jsxs)(m,{size:`sm`,variant:`outline`,className:`h-7 text-xs gap-1`,onClick:()=>J(_===`import-github`?`none`:`import-github`),children:[(0,C.jsx)(n,{className:`h-3 w-3`}),`GitHub`]}),$.kind===`mcp`&&(0,C.jsxs)(m,{size:`sm`,variant:`outline`,className:`h-7 text-xs gap-1`,onClick:()=>J(_===`import-mcp`?`none`:`import-mcp`),children:[(0,C.jsx)(n,{className:`h-3 w-3`}),`MCP Server`]})]})]})}),(0,C.jsxs)(b,{className:`space-y-3`,children:[_===`import-github`&&(0,C.jsx)(F,{form:H,onChange:e=>U(t=>({...t,...e})),onSubmit:()=>void X(),onCancel:()=>T(`none`),busy:D,error:k}),_===`import-mcp`&&(0,C.jsx)(I,{form:W,onChange:e=>G(t=>({...t,...e})),onSubmit:()=>void Z(),onCancel:()=>T(`none`),busy:D,error:k}),q&&q.variants.length===0&&_===`none`&&(0,C.jsxs)(`div`,{className:`py-6 text-center text-sm text-muted-foreground`,children:[`No variants yet. Add one via GitHub import`,$.kind===`mcp`?` or MCP Server`:``,`.`]}),q?.variants.map(e=>(0,C.jsx)(N,{variant:e,onToggle:(e,t)=>void Q(e,t),onUpdate:e=>void ee(e),onValidate:e=>void te(e),busy:R},e.id))]})]})]}):!u&&(0,C.jsx)(x,{children:(0,C.jsx)(b,{className:`py-16 text-center text-sm text-muted-foreground`,children:`Select a capability to view details and variants.`})})]})]})}export{L as RegistryView};
2
- //# sourceMappingURL=registry-BLjwVXCW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry-BLjwVXCW.js","names":[],"sources":["../../dashboard/src/components/views/registry.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\nimport { errMessage } from 'agent-relay-sdk/types'\nimport { api } from '@/lib/api'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport { Switch } from '@/components/ui/switch'\nimport { PackagePlus, RefreshCw, Plus, Trash2, CheckCircle, AlertCircle, Clock, Download, Play } from 'lucide-react'\nimport type { ProvisioningAssetKind, ProvisioningCapability, ProvisioningAsset, ProvisioningCapabilityWithVariants } from '@/types'\n\n// Registry view (#561) — browse and manage the provisioning capability registry.\n// Two-pane: left = capability list + filters, right = selected capability detail + variants.\n\ntype KindFilter = 'all' | ProvisioningAssetKind\n\nconst KIND_OPTIONS: Array<{ value: KindFilter; label: string }> = [\n { value: 'all', label: 'All' },\n { value: 'skill', label: 'Skills' },\n { value: 'plugin', label: 'Plugins' },\n { value: 'mcp', label: 'MCP' },\n]\n\nconst PROVIDER_OPTIONS = ['any', 'claude', 'codex'] as const\ntype Provider = typeof PROVIDER_OPTIONS[number]\n\nfunction kindBadgeClass(kind: ProvisioningAssetKind): string {\n if (kind === 'skill') return 'bg-blue-500/10 text-blue-400 border-blue-500/30'\n if (kind === 'plugin') return 'bg-violet-500/10 text-violet-400 border-violet-500/30'\n return 'bg-emerald-500/10 text-emerald-400 border-emerald-500/30'\n}\n\nfunction providerBadgeClass(provider: Provider): string {\n if (provider === 'claude') return 'bg-amber-500/10 text-amber-400 border-amber-500/30'\n if (provider === 'codex') return 'bg-sky-500/10 text-sky-400 border-sky-500/30'\n return 'bg-zinc-500/10 text-zinc-400 border-zinc-500/30'\n}\n\nfunction approvalBadgeClass(status?: string): string {\n if (status === 'approved') return 'bg-emerald-500/10 text-emerald-400 border-emerald-500/30'\n if (status === 'rejected') return 'bg-red-500/10 text-red-400 border-red-500/30'\n return 'bg-yellow-500/10 text-yellow-400 border-yellow-500/30'\n}\n\nfunction ValidationIcon({ status }: { status?: string }) {\n if (status === 'valid') return <CheckCircle className=\"h-3.5 w-3.5 text-emerald-400\" />\n if (status === 'invalid') return <AlertCircle className=\"h-3.5 w-3.5 text-red-400\" />\n return <Clock className=\"h-3.5 w-3.5 text-zinc-400\" />\n}\n\n// Form state for creating a new capability\ninterface NewCapabilityForm {\n kind: ProvisioningAssetKind\n slug: string\n title: string\n}\n\n// Form state for GitHub import wizard\ninterface ImportGithubForm {\n githubUrl: string\n ref: string\n subpath: string\n provider: Provider\n versionConstraint: string\n}\n\n// Form state for MCP server variant\ninterface ImportMcpForm {\n command: string\n args: string\n url: string\n approvalStatus: string\n versionConstraint: string\n}\n\nconst DEFAULT_NEW_CAP: NewCapabilityForm = { kind: 'skill', slug: '', title: '' }\nconst DEFAULT_IMPORT_GH: ImportGithubForm = { githubUrl: '', ref: 'main', subpath: '', provider: 'any', versionConstraint: '' }\nconst DEFAULT_IMPORT_MCP: ImportMcpForm = { command: '', args: '', url: '', approvalStatus: 'pending', versionConstraint: '' }\n\ntype InlineWizard = 'none' | 'new-capability' | 'import-github' | 'import-mcp'\n\nfunction VariantRow({\n variant,\n onToggle,\n onUpdate,\n onValidate,\n busy,\n}: {\n variant: ProvisioningAsset\n onToggle: (id: string, enabled: boolean) => void\n onUpdate: (id: string) => void\n onValidate: (id: string) => void\n busy: string | null\n}) {\n const isBusy = busy === variant.id\n\n return (\n <div className=\"rounded-md border border-border bg-card/60 p-3 space-y-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"outline\" className={`text-[10px] ${providerBadgeClass(variant.provider as Provider)}`}>\n {variant.provider}\n </Badge>\n <span className=\"text-xs font-medium font-mono\">{variant.name}</span>\n {variant.approvalStatus && (\n <Badge variant=\"outline\" className={`text-[10px] ${approvalBadgeClass(variant.approvalStatus)}`}>\n {variant.approvalStatus}\n </Badge>\n )}\n <span className=\"text-[10px] text-muted-foreground flex items-center gap-1 ml-auto\">\n <ValidationIcon status={variant.validationStatus} />\n {variant.validationStatus ?? 'unvalidated'}\n </span>\n <Switch\n size=\"sm\"\n checked={variant.enabled}\n disabled={isBusy}\n onCheckedChange={(v) => onToggle(variant.id, v)}\n />\n </div>\n {(variant.sourceUrl || variant.sourceRef) && (\n <div className=\"text-[10px] text-muted-foreground font-mono truncate\" title={variant.sourceUrl}>\n {variant.sourceUrl}{variant.sourceRef ? `@${variant.resolvedRef ?? variant.sourceRef}` : ''}\n {variant.sourceSubpath ? ` · ${variant.sourceSubpath}` : ''}\n </div>\n )}\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-6 text-xs\"\n disabled={isBusy || !variant.sourceRef}\n onClick={() => onUpdate(variant.id)}\n title=\"Pull latest from source ref\"\n >\n <Download className=\"h-3 w-3 mr-1\" />\n Update ref\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-6 text-xs\"\n disabled={isBusy}\n onClick={() => onValidate(variant.id)}\n >\n <Play className=\"h-3 w-3 mr-1\" />\n Validate\n </Button>\n </div>\n </div>\n )\n}\n\nfunction NewCapabilityForm({\n form,\n onChange,\n onSubmit,\n onCancel,\n busy,\n error,\n}: {\n form: NewCapabilityForm\n onChange: (patch: Partial<NewCapabilityForm>) => void\n onSubmit: () => void\n onCancel: () => void\n busy: boolean\n error: string | null\n}) {\n return (\n <div className=\"rounded-md border border-border bg-card/60 p-3 space-y-3\">\n <div className=\"text-sm font-medium\">New Capability</div>\n {error && <div className=\"text-xs text-destructive\">{error}</div>}\n <div>\n <Label className=\"text-xs\">Kind</Label>\n <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-2 py-1.5 text-sm\"\n value={form.kind}\n onChange={(e) => onChange({ kind: e.target.value as ProvisioningAssetKind })}\n >\n <option value=\"skill\">Skill</option>\n <option value=\"plugin\">Plugin</option>\n <option value=\"mcp\">MCP Server</option>\n </select>\n </div>\n <div>\n <Label className=\"text-xs\">Slug</Label>\n <Input\n value={form.slug}\n onChange={(e) => onChange({ slug: e.target.value })}\n placeholder=\"my-capability\"\n className=\"mt-1 text-sm font-mono\"\n />\n </div>\n <div>\n <Label className=\"text-xs\">Title (optional)</Label>\n <Input\n value={form.title}\n onChange={(e) => onChange({ title: e.target.value })}\n placeholder=\"My Capability\"\n className=\"mt-1 text-sm\"\n />\n </div>\n <div className=\"flex gap-2\">\n <Button size=\"sm\" onClick={onSubmit} disabled={busy || !form.slug.trim()}>\n {busy ? 'Creating…' : 'Create'}\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={onCancel}>Cancel</Button>\n </div>\n </div>\n )\n}\n\nfunction ImportGithubForm({\n form,\n onChange,\n onSubmit,\n onCancel,\n busy,\n error,\n}: {\n form: ImportGithubForm\n onChange: (patch: Partial<ImportGithubForm>) => void\n onSubmit: () => void\n onCancel: () => void\n busy: boolean\n error: string | null\n}) {\n return (\n <div className=\"rounded-md border border-border bg-card/60 p-3 space-y-3\">\n <div className=\"text-sm font-medium\">Import from GitHub</div>\n {error && <div className=\"text-xs text-destructive\">{error}</div>}\n <div>\n <Label className=\"text-xs\">GitHub URL</Label>\n <Input\n value={form.githubUrl}\n onChange={(e) => onChange({ githubUrl: e.target.value })}\n placeholder=\"https://github.com/owner/repo\"\n className=\"mt-1 text-sm font-mono\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <Label className=\"text-xs\">Ref</Label>\n <Input\n value={form.ref}\n onChange={(e) => onChange({ ref: e.target.value })}\n placeholder=\"main\"\n className=\"mt-1 text-sm font-mono\"\n />\n </div>\n <div>\n <Label className=\"text-xs\">Subpath (optional)</Label>\n <Input\n value={form.subpath}\n onChange={(e) => onChange({ subpath: e.target.value })}\n placeholder=\"skills/my-skill\"\n className=\"mt-1 text-sm font-mono\"\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <Label className=\"text-xs\">Provider</Label>\n <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-2 py-1.5 text-sm\"\n value={form.provider}\n onChange={(e) => onChange({ provider: e.target.value as Provider })}\n >\n {PROVIDER_OPTIONS.map((p) => <option key={p} value={p}>{p}</option>)}\n </select>\n </div>\n <div>\n <Label className=\"text-xs\">Version constraint (optional)</Label>\n <Input\n value={form.versionConstraint}\n onChange={(e) => onChange({ versionConstraint: e.target.value })}\n placeholder=\">=1.0.0\"\n className=\"mt-1 text-sm font-mono\"\n />\n </div>\n </div>\n <div className=\"flex gap-2\">\n <Button size=\"sm\" onClick={onSubmit} disabled={busy || !form.githubUrl.trim() || !form.ref.trim()}>\n {busy ? 'Importing…' : 'Import'}\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={onCancel}>Cancel</Button>\n </div>\n </div>\n )\n}\n\nfunction ImportMcpForm({\n form,\n onChange,\n onSubmit,\n onCancel,\n busy,\n error,\n}: {\n form: ImportMcpForm\n onChange: (patch: Partial<ImportMcpForm>) => void\n onSubmit: () => void\n onCancel: () => void\n busy: boolean\n error: string | null\n}) {\n return (\n <div className=\"rounded-md border border-border bg-card/60 p-3 space-y-3\">\n <div className=\"text-sm font-medium\">Add MCP Server Variant</div>\n {error && <div className=\"text-xs text-destructive\">{error}</div>}\n <div>\n <Label className=\"text-xs\">Command (for stdio type)</Label>\n <Input\n value={form.command}\n onChange={(e) => onChange({ command: e.target.value })}\n placeholder=\"npx -y @modelcontextprotocol/server-foo\"\n className=\"mt-1 text-sm font-mono\"\n />\n </div>\n <div>\n <Label className=\"text-xs\">Args (space-separated, overrides command split)</Label>\n <Input\n value={form.args}\n onChange={(e) => onChange({ args: e.target.value })}\n placeholder=\"--port 3000\"\n className=\"mt-1 text-sm font-mono\"\n />\n </div>\n <div>\n <Label className=\"text-xs\">URL (for http/sse type)</Label>\n <Input\n value={form.url}\n onChange={(e) => onChange({ url: e.target.value })}\n placeholder=\"http://localhost:3000/mcp\"\n className=\"mt-1 text-sm font-mono\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <Label className=\"text-xs\">Approval status</Label>\n <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-2 py-1.5 text-sm\"\n value={form.approvalStatus}\n onChange={(e) => onChange({ approvalStatus: e.target.value })}\n >\n <option value=\"pending\">Pending</option>\n <option value=\"approved\">Approved</option>\n </select>\n </div>\n <div>\n <Label className=\"text-xs\">Version constraint (optional)</Label>\n <Input\n value={form.versionConstraint}\n onChange={(e) => onChange({ versionConstraint: e.target.value })}\n placeholder=\">=1.0.0\"\n className=\"mt-1 text-sm font-mono\"\n />\n </div>\n </div>\n <div className=\"flex gap-2\">\n <Button size=\"sm\" onClick={onSubmit} disabled={busy || (!form.command.trim() && !form.url.trim())}>\n {busy ? 'Adding…' : 'Add MCP Variant'}\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={onCancel}>Cancel</Button>\n </div>\n </div>\n )\n}\n\nexport function RegistryView() {\n const [items, setItems] = useState<ProvisioningCapabilityWithVariants[]>([])\n const [kindFilter, setKindFilter] = useState<KindFilter>('all')\n const [selectedId, setSelectedId] = useState<string>('')\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [wizard, setWizard] = useState<InlineWizard>('none')\n const [wizardBusy, setWizardBusy] = useState(false)\n const [wizardError, setWizardError] = useState<string | null>(null)\n const [variantBusy, setVariantBusy] = useState<string | null>(null)\n const [newCap, setNewCap] = useState<NewCapabilityForm>(DEFAULT_NEW_CAP)\n const [importGh, setImportGh] = useState<ImportGithubForm>(DEFAULT_IMPORT_GH)\n const [importMcp, setImportMcp] = useState<ImportMcpForm>(DEFAULT_IMPORT_MCP)\n\n async function load() {\n setError(null)\n try {\n const params = kindFilter !== 'all' ? `?kind=${kindFilter}` : ''\n const res = await api<{ capabilities: ProvisioningCapabilityWithVariants[] }>('GET', `/provisioning/capabilities${params}`)\n setItems(res.capabilities)\n if (!selectedId && res.capabilities.length > 0) {\n setSelectedId(res.capabilities[0]!.capability.id)\n }\n } catch (e) {\n setError(errMessage(e))\n } finally {\n setLoading(false)\n }\n }\n\n // Initial load + kind filter changes\n useEffect(() => {\n setLoading(true)\n void load()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [kindFilter])\n\n const selected = items.find((i) => i.capability.id === selectedId) ?? null\n\n function openWizard(w: InlineWizard) {\n setWizard(w)\n setWizardError(null)\n setWizardBusy(false)\n setNewCap(DEFAULT_NEW_CAP)\n setImportGh(DEFAULT_IMPORT_GH)\n setImportMcp(DEFAULT_IMPORT_MCP)\n }\n\n async function createCapability() {\n setWizardBusy(true)\n setWizardError(null)\n try {\n await api<ProvisioningCapability>('POST', '/provisioning/capabilities', {\n kind: newCap.kind,\n slug: newCap.slug.trim(),\n title: newCap.title.trim() || undefined,\n })\n setWizard('none')\n await load()\n } catch (e) {\n setWizardError(errMessage(e))\n } finally {\n setWizardBusy(false)\n }\n }\n\n async function importFromGithub() {\n if (!selected) return\n setWizardBusy(true)\n setWizardError(null)\n try {\n await api('POST', `/provisioning/capabilities/${encodeURIComponent(selected.capability.id)}/variants/import`, {\n githubUrl: importGh.githubUrl.trim(),\n ref: importGh.ref.trim(),\n subpath: importGh.subpath.trim() || undefined,\n provider: importGh.provider,\n versionConstraint: importGh.versionConstraint.trim() || undefined,\n })\n setWizard('none')\n await load()\n } catch (e) {\n setWizardError(errMessage(e))\n } finally {\n setWizardBusy(false)\n }\n }\n\n async function importMcpServer() {\n if (!selected) return\n setWizardBusy(true)\n setWizardError(null)\n try {\n // Build server spec: command/args or url\n const server: Record<string, unknown> = {}\n if (importMcp.url.trim()) {\n server.type = 'http'\n server.url = importMcp.url.trim()\n } else {\n server.type = 'stdio'\n const parts = importMcp.command.trim().split(/\\s+/)\n server.command = parts[0]\n const extraArgs = importMcp.args.trim() ? importMcp.args.trim().split(/\\s+/) : parts.slice(1)\n if (extraArgs.length > 0) server.args = extraArgs\n }\n await api('POST', `/provisioning/capabilities/${encodeURIComponent(selected.capability.id)}/variants/mcp`, {\n server,\n approvalStatus: importMcp.approvalStatus,\n versionConstraint: importMcp.versionConstraint.trim() || undefined,\n })\n setWizard('none')\n await load()\n } catch (e) {\n setWizardError(errMessage(e))\n } finally {\n setWizardBusy(false)\n }\n }\n\n async function toggleVariant(id: string, enabled: boolean) {\n setVariantBusy(id)\n try {\n await api('PATCH', `/provisioning/variants/${encodeURIComponent(id)}`, { enabled })\n setItems((prev) =>\n prev.map((item) => ({\n ...item,\n variants: item.variants.map((v) => (v.id === id ? { ...v, enabled } : v)),\n }))\n )\n } catch (e) {\n setError(errMessage(e))\n } finally {\n setVariantBusy(null)\n }\n }\n\n async function updateVariantRef(id: string) {\n const variant = selected?.variants.find((v) => v.id === id)\n if (!variant?.sourceRef) return\n setVariantBusy(id)\n try {\n await api('POST', `/provisioning/variants/${encodeURIComponent(id)}/update`, {\n ref: variant.sourceRef,\n subpath: variant.sourceSubpath,\n })\n await load()\n } catch (e) {\n setError(errMessage(e))\n } finally {\n setVariantBusy(null)\n }\n }\n\n async function validateVariant(id: string) {\n setVariantBusy(id)\n try {\n await api('POST', `/provisioning/variants/${encodeURIComponent(id)}/validate`, {})\n await load()\n } catch (e) {\n setError(errMessage(e))\n } finally {\n setVariantBusy(null)\n }\n }\n\n const cap = selected?.capability\n\n return (\n <div className=\"space-y-4 p-4\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <PackagePlus className=\"size-5 text-primary\" />\n <h1 className=\"text-lg font-semibold\">Registry</h1>\n <span className=\"text-xs text-muted-foreground\">provisioning capability registry · #561</span>\n <div className=\"ml-auto flex items-center gap-2\">\n {KIND_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => setKindFilter(opt.value)}\n className={`rounded-md border px-2.5 py-1 text-xs transition-colors ${kindFilter === opt.value ? 'border-primary/40 bg-primary/10 text-primary' : 'border-border text-muted-foreground hover:bg-accent'}`}\n >\n {opt.label}\n </button>\n ))}\n <Button variant=\"outline\" size=\"sm\" onClick={() => void load()}>\n <RefreshCw className=\"size-4\" />\n </Button>\n </div>\n </div>\n\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive\">{error}</div>\n )}\n\n <div className=\"grid grid-cols-1 gap-4 xl:grid-cols-[300px_1fr]\">\n {/* Left pane: capability list */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-muted-foreground font-medium\">{items.length} capabilities</span>\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 text-xs gap-1\"\n onClick={() => openWizard('new-capability')}\n >\n <Plus className=\"h-3 w-3\" />\n New\n </Button>\n </div>\n\n {wizard === 'new-capability' && (\n <NewCapabilityForm\n form={newCap}\n onChange={(p) => setNewCap((f) => ({ ...f, ...p }))}\n onSubmit={() => void createCapability()}\n onCancel={() => setWizard('none')}\n busy={wizardBusy}\n error={wizardError}\n />\n )}\n\n {loading && items.length === 0 && (\n <div className=\"py-8 text-center text-sm text-muted-foreground\">Loading…</div>\n )}\n\n {!loading && items.length === 0 && (\n <Card>\n <CardContent className=\"py-10 text-center text-sm text-muted-foreground\">\n No capabilities yet. Click New to create one.\n </CardContent>\n </Card>\n )}\n\n {items.map(({ capability, variants }) => (\n <button\n key={capability.id}\n type=\"button\"\n onClick={() => { setSelectedId(capability.id); setWizard('none') }}\n className={`w-full rounded-md border p-3 text-left transition-colors ${selectedId === capability.id ? 'border-primary/50 bg-primary/5' : 'border-border bg-card/60 hover:bg-accent'}`}\n >\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className={`text-[10px] ${kindBadgeClass(capability.kind)}`}>\n {capability.kind}\n </Badge>\n <span className=\"text-xs font-medium font-mono truncate flex-1\">{capability.slug}</span>\n <span className=\"text-[10px] text-muted-foreground shrink-0\">{variants.length}v</span>\n </div>\n {capability.title && (\n <div className=\"mt-1 text-xs text-muted-foreground truncate\">{capability.title}</div>\n )}\n <div className=\"mt-1 flex items-center gap-1.5\">\n <span className={`inline-block h-1.5 w-1.5 rounded-full ${capability.status === 'active' ? 'bg-emerald-500' : 'bg-zinc-500'}`} />\n <span className=\"text-[10px] text-muted-foreground\">{capability.status}</span>\n </div>\n </button>\n ))}\n </div>\n\n {/* Right pane: selected capability detail */}\n {cap ? (\n <div className=\"space-y-3\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"outline\" className={kindBadgeClass(cap.kind)}>{cap.kind}</Badge>\n <span className=\"font-mono text-base\">{cap.slug}</span>\n {cap.title && <span className=\"text-sm font-normal text-muted-foreground\">· {cap.title}</span>}\n <Badge variant={cap.status === 'active' ? 'secondary' : 'outline'} className=\"ml-auto text-[10px]\">\n {cap.status}\n </Badge>\n </CardTitle>\n </CardHeader>\n {cap.description && (\n <CardContent className=\"pt-0 text-sm text-muted-foreground\">{cap.description}</CardContent>\n )}\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n Variants\n <span className=\"text-xs font-normal text-muted-foreground\">({selected?.variants.length ?? 0})</span>\n <div className=\"ml-auto flex items-center gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 text-xs gap-1\"\n onClick={() => openWizard(wizard === 'import-github' ? 'none' : 'import-github')}\n >\n <Plus className=\"h-3 w-3\" />\n GitHub\n </Button>\n {cap.kind === 'mcp' && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 text-xs gap-1\"\n onClick={() => openWizard(wizard === 'import-mcp' ? 'none' : 'import-mcp')}\n >\n <Plus className=\"h-3 w-3\" />\n MCP Server\n </Button>\n )}\n </div>\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {wizard === 'import-github' && (\n <ImportGithubForm\n form={importGh}\n onChange={(p) => setImportGh((f) => ({ ...f, ...p }))}\n onSubmit={() => void importFromGithub()}\n onCancel={() => setWizard('none')}\n busy={wizardBusy}\n error={wizardError}\n />\n )}\n {wizard === 'import-mcp' && (\n <ImportMcpForm\n form={importMcp}\n onChange={(p) => setImportMcp((f) => ({ ...f, ...p }))}\n onSubmit={() => void importMcpServer()}\n onCancel={() => setWizard('none')}\n busy={wizardBusy}\n error={wizardError}\n />\n )}\n {selected && selected.variants.length === 0 && wizard === 'none' && (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">\n No variants yet. Add one via GitHub import{cap.kind === 'mcp' ? ' or MCP Server' : ''}.\n </div>\n )}\n {selected?.variants.map((variant) => (\n <VariantRow\n key={variant.id}\n variant={variant}\n onToggle={(id, enabled) => void toggleVariant(id, enabled)}\n onUpdate={(id) => void updateVariantRef(id)}\n onValidate={(id) => void validateVariant(id)}\n busy={variantBusy}\n />\n ))}\n </CardContent>\n </Card>\n </div>\n ) : (\n !loading && (\n <Card>\n <CardContent className=\"py-16 text-center text-sm text-muted-foreground\">\n Select a capability to view details and variants.\n </CardContent>\n </Card>\n )\n )}\n </div>\n </div>\n )\n}\n"],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{$n as t,A as n,An as r,B as i,Bn as a,D as o,En as s,Gn as c,I as l,Kt as u,Qn as d,S as f,W as p,Xn as m,Z as h,Zt as g,_n as _,c as v,dr as y,ft as b,h as x,hn as S,j as C,jt as w,p as T,qt as E,rr as D,xn as ee,yn as te}from"./lucide-react-BYZuAhQs.js";import{h as ne,l as re,p as O,t as k}from"./store-DNbkrqbU.js";import{o as ie,r as ae}from"./types-Tv67voFu.js";import{t as oe}from"./themes-DjSwmAZN.js";import{a as A,i as j,n as M,r as N,t as P}from"./select-s4BE-T62.js";import{t as F}from"./badge-BLar6FjP.js";import{t as I}from"./button-BrIB69qd.js";import{t as L}from"./input-B_fUHtLD.js";import{r as se,z as R}from"./index-DeDosfVE.js";import{a as z,i as B,n as V,o as H,r as U,t as W}from"./card-lhnFnBoz.js";import{t as ce}from"./user-avatar-RliaJcaG.js";var G=e(y(),1);function K(e){return`${e.namespace}/${e.key}`}function le(e){return`/settings/${encodeURIComponent(e.namespace)}/${encodeURIComponent(e.key)}`}function ue(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``)||`settings`}function de(e){let t=new Map;for(let n of e.filter(e=>e.readable)){let e=n.display?.group?.trim()||n.namespace;t.set(e,[...t.get(e)??[],n])}return[...t.entries()].map(([e,t])=>({group:e,slug:ue(e),settings:t.sort(fe)})).sort((e,t)=>pe(e.settings)-pe(t.settings)||e.group.localeCompare(t.group))}function fe(e,t){return(e.display?.order??2**53-1)-(t.display?.order??2**53-1)||e.display?.label?.localeCompare(t.display?.label??``)||K(e).localeCompare(K(t))}function pe(e){return Math.min(...e.map(e=>e.display?.order??2**53-1))}function me(e){return Array.isArray(e.type)?e.type.find(e=>e!==`null`):e.type}function he(e,t,n){if(!t.length)return n;let[r,...i]=t;if(r===void 0)return n;if(typeof r==`number`){let t=Array.isArray(e)?[...e]:[];return t[r]=he(t[r],i,n),t}let a=ie(e)?{...e}:{},o=he(a[r],i,n);return o===void 0?delete a[r]:a[r]=o,a}function ge(e){if(e.default!==void 0)return e.default;if(e.const!==void 0)return e.const;if(e.enum?.length)return e.enum[0];switch(me(e)){case`boolean`:return!1;case`integer`:case`number`:return 0;case`array`:return[];case`object`:return{};case`string`:return``;default:return}}function _e(e){return e.split(/\r?\n|,/).map(e=>e.trim()).filter(Boolean)}function ve(e){return Array.isArray(e)?e.map(e=>String(e)).join(`
2
- `):``}function ye(e){return ie(e)?Object.entries(e).map(([e,t])=>`${e}=${String(t??``)}`).join(`
3
- `):``}function be(e){return Object.fromEntries(e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean).map(e=>{let t=e.indexOf(`=`);return t>=0?[e.slice(0,t).trim(),e.slice(t+1)]:[e,``]}))}var q=d(),xe=`__unset__`;function Se(e){return e===`server-runtime`?`Server runtime`:e===`bootstrap`?`Bootstrap`:`Browser`}function Ce(e){return e===`server-runtime`?`Stored by Relay and mutable while the server is running.`:e===`bootstrap`?`Read from startup configuration; restart or host config changes are required.`:`Stored only in this browser profile.`}function we(e){return e===`browser`?(0,q.jsx)(h,{className:`size-3.5`}):(0,q.jsx)(o,{className:`size-3.5`})}function J(e){return e.details??[]}function Te({group:e,settings:t,onSaved:n}){let r=[...new Set(t.map(e=>e.tier))];return(0,q.jsxs)(`section`,{className:`space-y-3`,children:[(0,q.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,q.jsx)(`h2`,{className:`text-base font-semibold`,children:e}),(0,q.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:r.map(e=>(0,q.jsxs)(F,{variant:`outline`,className:`gap-1`,title:Ce(e),children:[we(e),Se(e)]},e))})]}),t.length===0?(0,q.jsx)(W,{size:`sm`,children:(0,q.jsx)(U,{className:`text-sm text-muted-foreground`,children:`No settings in this group.`})}):(0,q.jsx)(`div`,{className:`space-y-3`,children:t.map(e=>(0,q.jsx)(Ee,{setting:e,onSaved:n},K(e)))})]})}function Ee({setting:e,onSaved:r}){let[i,a]=(0,G.useState)(()=>e.value??e.defaults??ge(e.schema)),[o,s]=(0,G.useState)(!1),[c,l]=(0,G.useState)(``),[u,d]=(0,G.useState)([]),f=e.writable&&e.tier===`server-runtime`;function p(e,t){a(n=>he(n,e,t)),d([]),l(``)}async function m(){if(f){s(!0),d([]),l(``);try{let n=await t(`PUT`,le(e),{value:i,updatedBy:`dashboard`});a(n.value),r(n),l(`Saved`)}catch(e){let t=J(e);d(t.length?t:[e.message])}finally{s(!1)}}}return(0,q.jsxs)(W,{size:`sm`,children:[(0,q.jsxs)(z,{children:[(0,q.jsxs)(H,{className:`flex flex-wrap items-center gap-2 text-sm`,children:[e.display.label,(0,q.jsxs)(F,{variant:`outline`,className:`gap-1`,title:Ce(e.tier),children:[we(e.tier),Se(e.tier)]}),!e.writable&&(0,q.jsx)(F,{variant:`secondary`,children:`Read only`})]}),e.display.description&&(0,q.jsx)(B,{children:e.display.description}),(0,q.jsx)(V,{children:(0,q.jsxs)(I,{size:`sm`,onClick:m,disabled:!f||o,children:[(0,q.jsx)(n,{className:`size-4`}),o?`Saving`:`Save`]})})]}),(0,q.jsxs)(U,{className:`space-y-3`,children:[(0,q.jsx)(De,{schema:e.schema,value:i,path:[],label:e.display.label,required:!0,disabled:!f||o,onChange:p}),(0,q.jsxs)(`p`,{className:`flex flex-wrap items-center gap-x-2 text-[11px] text-muted-foreground`,children:[(0,q.jsxs)(`code`,{className:`rounded bg-muted px-1.5 py-0.5 font-mono`,children:[e.namespace,`/`,e.key]}),(0,q.jsxs)(`span`,{children:[`read `,(0,q.jsx)(`span`,{className:`text-foreground/70`,children:e.scope.read})]}),(0,q.jsx)(`span`,{"aria-hidden":!0,children:`·`}),(0,q.jsxs)(`span`,{children:[`write `,(0,q.jsx)(`span`,{className:`text-foreground/70`,children:e.scope.write})]})]}),u.length>0&&(0,q.jsxs)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive`,children:[(0,q.jsxs)(`div`,{className:`mb-1 flex items-center gap-2 font-medium`,children:[(0,q.jsx)(_,{className:`size-4`}),`Save failed`]}),(0,q.jsx)(`ul`,{className:`list-disc space-y-1 pl-5`,children:u.map(e=>(0,q.jsx)(`li`,{children:e},e))})]}),c&&(0,q.jsxs)(`p`,{className:`flex items-center gap-1 text-sm text-emerald-500`,children:[(0,q.jsx)(S,{className:`size-4`}),c]})]})]})}function De(e){let{schema:t,value:n,path:r,label:i,required:a,disabled:o,onChange:s}=e,c=me(t);if(t.enum?.length){let e=n==null||n===``?xe:String(n);return(0,q.jsx)(Y,{label:i,description:t.description,children:(0,q.jsxs)(P,{value:e,onValueChange:e=>s(r,e===`__unset__`?void 0:e),disabled:o,children:[(0,q.jsx)(j,{children:(0,q.jsx)(A,{})}),(0,q.jsxs)(M,{children:[!a&&(0,q.jsx)(N,{value:`__unset__`,children:`Not set`}),t.enum.map(e=>(0,q.jsx)(N,{value:String(e),children:String(e)},String(e)))]})]})})}if(c===`boolean`)return(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded-md border bg-muted/20 p-3`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`div`,{className:`text-sm font-medium`,children:i}),t.description&&(0,q.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:t.description})]}),(0,q.jsx)(R,{checked:!!n,onCheckedChange:e=>s(r,e),disabled:o})]});if(c===`integer`||c===`number`)return(0,q.jsx)(Y,{label:i,description:t.description,children:(0,q.jsx)(L,{type:`number`,min:typeof t.minimum==`number`?t.minimum:void 0,max:typeof t.maximum==`number`?t.maximum:void 0,step:c===`integer`?1:`any`,value:typeof n==`number`?n:``,disabled:o,onChange:e=>s(r,e.target.value===``&&!a?void 0:Number(e.target.value))})});if(c===`array`)return(0,q.jsx)(Y,{label:i,description:t.description??`One item per line.`,children:(0,q.jsx)(se,{rows:Math.min(8,Math.max(3,Array.isArray(n)?n.length+1:3)),value:ve(n),disabled:o,onChange:e=>s(r,_e(e.target.value))})});if(c===`object`){let e=t.properties??{},a=new Set(t.required??[]);return Object.keys(e).length===0&&t.additionalProperties?(0,q.jsx)(Y,{label:i,description:t.description??`KEY=value, one entry per line.`,children:(0,q.jsx)(se,{rows:5,value:ye(n),disabled:o,onChange:e=>s(r,be(e.target.value))})}):(0,q.jsxs)(`div`,{className:`space-y-3`,children:[r.length>0&&(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`div`,{className:`text-sm font-medium`,children:i}),t.description&&(0,q.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:t.description})]}),(0,q.jsx)(`div`,{className:`grid gap-3 md:grid-cols-2`,children:Object.entries(e).map(([e,t])=>{let i=ie(n)?n[e]:void 0;return(0,q.jsx)(De,{schema:t,value:i===void 0&&a.has(e)?ge(t):i,path:[...r,e],label:t.title||Oe(e),required:a.has(e),disabled:o,onChange:s},e)})})]})}return(0,q.jsx)(Y,{label:i,description:t.description,children:(0,q.jsx)(L,{value:typeof n==`string`?n:n==null?``:String(n),disabled:o,onChange:e=>s(r,e.target.value===``&&!a?void 0:e.target.value)})})}function Y({label:e,description:t,children:n}){return(0,q.jsxs)(`label`,{className:`block space-y-1.5 text-sm`,children:[(0,q.jsx)(`span`,{className:`text-muted-foreground`,children:e}),n,t&&(0,q.jsx)(`span`,{className:`block text-xs text-muted-foreground`,children:t})]})}function Oe(e){return e.replace(/([a-z0-9])([A-Z])/g,`$1 $2`).replace(/[-_]+/g,` `).replace(/^\w/,e=>e.toUpperCase())}function ke(){let e=k(e=>e.theme),t=k(e=>e.showReasoning),n=k(e=>e.set);return(0,q.jsxs)(`section`,{className:`space-y-4`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`h2`,{className:`text-base font-semibold`,children:`Browser preferences`}),(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`These are stored in local dashboard state, not in Relay server config.`})]}),(0,q.jsxs)(W,{size:`sm`,children:[(0,q.jsxs)(z,{children:[(0,q.jsx)(H,{className:`text-sm`,children:`Dashboard display`}),(0,q.jsx)(B,{className:`text-xs`,children:`Browser tier · persisted in this browser profile.`}),(0,q.jsx)(V,{children:(0,q.jsxs)(F,{variant:`outline`,className:`gap-1`,children:[(0,q.jsx)(h,{className:`size-3.5`}),`Browser`]})})]}),(0,q.jsxs)(U,{className:`grid gap-3 md:grid-cols-2`,children:[(0,q.jsx)(Y,{label:`Theme`,children:(0,q.jsxs)(P,{value:e,onValueChange:e=>n({theme:e}),children:[(0,q.jsx)(j,{children:(0,q.jsx)(A,{})}),(0,q.jsx)(M,{children:oe.map(e=>(0,q.jsx)(N,{value:e.id,children:e.label},e.id))})]})}),(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded-md border bg-muted/20 p-3`,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,q.jsx)(r,{className:`size-4`}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`div`,{className:`text-sm font-medium`,children:`Show reasoning details`}),(0,q.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`Display captured reasoning/tool steps in chat. Server capture is controlled separately by provider reasoningCapture.`})]})]}),(0,q.jsx)(R,{checked:t,onCheckedChange:e=>n({showReasoning:e})})]})]})]}),(0,q.jsx)(Ae,{})]})}function Ae(){let e=k(e=>e.voiceTtsEnabled),t=k(e=>e.setVoiceTtsEnabled),n=k(e=>e.voiceTtsMode),r=k(e=>e.setVoiceTtsMode),i=k(e=>e.voiceTtsKokoroVoice),a=k(e=>e.setVoiceTtsKokoroVoice),o=k(e=>e.voiceTtsBrowserVoice),s=k(e=>e.setVoiceTtsBrowserVoice),c=k(e=>e.voiceInputMode),l=k(e=>e.setVoiceInputMode),[u,d]=(0,G.useState)(()=>ne());(0,G.useEffect)(()=>{if(typeof window>`u`||!(`speechSynthesis`in window))return;let e=()=>d(ne());return e(),window.speechSynthesis.addEventListener?.(`voiceschanged`,e),()=>window.speechSynthesis.removeEventListener?.(`voiceschanged`,e)},[]);let f=O.some(e=>e.id===i)?O:[...O,{id:i,label:i}];return(0,q.jsxs)(W,{size:`sm`,children:[(0,q.jsxs)(z,{children:[(0,q.jsxs)(H,{className:`flex items-center gap-2 text-sm`,children:[(0,q.jsx)(v,{className:`size-4`}),`Voice`]}),(0,q.jsx)(B,{className:`text-xs`,children:`Browser tier TTS and push-to-talk behavior.`}),(0,q.jsx)(V,{children:(0,q.jsx)(R,{checked:e,onCheckedChange:t})})]}),(0,q.jsxs)(U,{className:`grid gap-3 md:grid-cols-2`,children:[(0,q.jsx)(Y,{label:`Speech engine`,children:(0,q.jsxs)(P,{value:n,onValueChange:e=>r(e),children:[(0,q.jsx)(j,{children:(0,q.jsx)(A,{})}),(0,q.jsxs)(M,{children:[(0,q.jsx)(N,{value:`kokoro`,children:`Kokoro (server, fallback to browser)`}),(0,q.jsx)(N,{value:`browser`,children:`Browser Web Speech API`})]})]})}),(0,q.jsx)(Y,{label:`Kokoro voice`,children:(0,q.jsxs)(P,{value:i,onValueChange:a,children:[(0,q.jsx)(j,{children:(0,q.jsx)(A,{})}),(0,q.jsx)(M,{children:f.map(e=>(0,q.jsx)(N,{value:e.id,children:e.label},e.id))})]})}),(0,q.jsx)(Y,{label:`Browser voice`,children:(0,q.jsxs)(P,{value:o||`__unset__`,onValueChange:e=>s(e===`__unset__`?``:e),children:[(0,q.jsx)(j,{children:(0,q.jsx)(A,{})}),(0,q.jsxs)(M,{children:[(0,q.jsx)(N,{value:xe,children:`System default`}),u.map(e=>(0,q.jsx)(N,{value:e.uri,children:e.label},e.uri))]})]})}),(0,q.jsx)(Y,{label:`Push-to-talk input`,children:(0,q.jsxs)(P,{value:c,onValueChange:e=>l(e),children:[(0,q.jsx)(j,{children:(0,q.jsx)(A,{})}),(0,q.jsxs)(M,{children:[(0,q.jsx)(N,{value:`compose`,children:`Fill message box`}),(0,q.jsx)(N,{value:`autosend`,children:`Send immediately`})]})]})})]})]})}function je({catalog:e,error:n,canWrite:r,onCatalog:a}){let s=e[0]?.provider??`codex`,[c,l]=(0,G.useState)(s),[d,m]=(0,G.useState)(()=>Me(s)),[h,g]=(0,G.useState)(``),[_,v]=(0,G.useState)([]),y=e.some(e=>e.provider===c)?c:s,b=e.find(e=>e.provider===y)??e[0],C=e.map(e=>e.provider);function w(e){m(t=>({...t,...e})),v([]),g(``)}function T(e){l(e),m(Me(e)),v([]),g(``)}async function D(){a((await t(`GET`,`/providers`)).catalog)}async function ee(){if(r){v([]),g(``);try{await t(`PUT`,`/providers/${encodeURIComponent(d.provider)}/models/${encodeURIComponent(d.alias)}`,{label:d.label,providerModel:d.providerModel,efforts:_e(d.efforts),defaultEffort:d.defaultEffort.trim()||void 0,limits:d.limits,capabilities:d.capabilities,contextThreshold:Ne(d),disabled:d.disabled,updatedBy:`dashboard`}),await D(),g(`${d.alias} saved`),m(Me(d.provider))}catch(e){let t=J(e);v(t.length?t:[e.message])}}}async function te(e,n){if(r){v([]),g(``);try{await t(`PATCH`,`/providers/${encodeURIComponent(y)}/models/${encodeURIComponent(e.alias)}`,{disabled:n,updatedBy:`dashboard`}),await D(),g(`${e.alias} ${n?`disabled`:`enabled`}`)}catch(e){let t=J(e);v(t.length?t:[e.message])}}}async function ne(e){if(r){v([]),g(``);try{await t(`DELETE`,`/providers/${encodeURIComponent(y)}/models/${encodeURIComponent(e.alias)}`),await D(),g(`${e.alias} removed`)}catch(e){let t=J(e);v(t.length?t:[e.message])}}}function re(e){m({provider:y,alias:e.alias,label:e.label,providerModel:e.providerModel,efforts:e.efforts.join(`, `),defaultEffort:e.defaultEffort??``,selfCompactUtilization:e.contextThreshold?.selfCompactUtilization?.toString()??``,warnUtilization:e.contextThreshold?.warnUtilization?.toString()??``,hardBackstopUtilization:e.contextThreshold?.hardBackstopUtilization?.toString()??``,disabled:!!e.disabled,limits:e.limits,capabilities:e.capabilities}),v([]),g(``)}return n?(0,q.jsx)(W,{size:`sm`,children:(0,q.jsxs)(U,{className:`text-sm text-muted-foreground`,children:[(0,q.jsxs)(`div`,{className:`mb-1 flex items-center gap-2 font-medium text-foreground`,children:[(0,q.jsx)(f,{className:`size-4`}),`Model catalog`]}),n]})}):(0,q.jsxs)(`section`,{className:`space-y-4`,children:[(0,q.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`h2`,{className:`text-base font-semibold`,children:`Model catalog`}),(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Add override models, disable unavailable models, or remove custom entries from the provider catalog.`})]}),!r&&(0,q.jsx)(F,{variant:`secondary`,children:`Read only: needs settings:write:provider`})]}),(0,q.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:C.map(e=>(0,q.jsx)(I,{variant:e===y?`default`:`outline`,size:`sm`,onClick:()=>T(e),children:e},e))}),(0,q.jsxs)(W,{size:`sm`,children:[(0,q.jsxs)(z,{children:[(0,q.jsx)(H,{className:`text-sm`,children:`Add or edit model`}),(0,q.jsx)(V,{children:(0,q.jsxs)(F,{variant:`outline`,className:`gap-1`,children:[(0,q.jsx)(o,{className:`size-3.5`}),`Server runtime`]})})]}),(0,q.jsxs)(U,{className:`space-y-3`,children:[(0,q.jsxs)(`div`,{className:`grid gap-3 md:grid-cols-2`,children:[(0,q.jsx)(Y,{label:`Alias`,children:(0,q.jsx)(L,{value:d.alias,disabled:!r,placeholder:`nightly`,onChange:e=>w({alias:e.target.value.trim()})})}),(0,q.jsx)(Y,{label:`Label`,children:(0,q.jsx)(L,{value:d.label,disabled:!r,placeholder:`Nightly Codex`,onChange:e=>w({label:e.target.value})})}),(0,q.jsx)(Y,{label:`Provider model`,children:(0,q.jsx)(L,{value:d.providerModel,disabled:!r,placeholder:`codex-nightly`,onChange:e=>w({providerModel:e.target.value})})}),(0,q.jsx)(Y,{label:`Efforts`,children:(0,q.jsx)(L,{value:d.efforts,disabled:!r,placeholder:`low, medium, high`,onChange:e=>w({efforts:e.target.value})})}),(0,q.jsx)(Y,{label:`Default effort`,children:(0,q.jsx)(L,{value:d.defaultEffort,disabled:!r,placeholder:`medium`,onChange:e=>w({defaultEffort:e.target.value})})}),(0,q.jsx)(Y,{label:`Self compact utilization`,children:(0,q.jsx)(L,{value:d.selfCompactUtilization,disabled:!r,placeholder:`0.80`,inputMode:`decimal`,onChange:e=>w({selfCompactUtilization:e.target.value})})}),(0,q.jsx)(Y,{label:`Warn utilization`,children:(0,q.jsx)(L,{value:d.warnUtilization,disabled:!r,placeholder:`default: self - 0.10`,inputMode:`decimal`,onChange:e=>w({warnUtilization:e.target.value})})}),(0,q.jsx)(Y,{label:`Hard backstop utilization`,children:(0,q.jsx)(L,{value:d.hardBackstopUtilization,disabled:!r,placeholder:`0.90`,inputMode:`decimal`,onChange:e=>w({hardBackstopUtilization:e.target.value})})}),(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded-md border bg-muted/20 p-3`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`div`,{className:`text-sm font-medium`,children:`Disabled`}),(0,q.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`Keep visible but unavailable for new launches.`})]}),(0,q.jsx)(R,{checked:d.disabled,disabled:!r,onCheckedChange:e=>w({disabled:e})})]})]}),(0,q.jsxs)(I,{onClick:ee,disabled:!r||!d.alias||!d.label||!d.providerModel,children:[(0,q.jsx)(i,{className:`size-4`}),`Save model`]})]})]}),(0,q.jsxs)(`div`,{className:`space-y-2`,children:[b&&b.models.length===0&&(0,q.jsx)(W,{size:`sm`,children:(0,q.jsx)(U,{className:`text-sm text-muted-foreground`,children:`No models in this provider catalog yet.`})}),b?.models.map(e=>(0,q.jsx)(W,{size:`sm`,children:(0,q.jsxs)(U,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,q.jsxs)(`div`,{className:`min-w-0`,children:[(0,q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,q.jsx)(`span`,{className:`font-medium`,children:e.label}),(0,q.jsx)(`code`,{className:`rounded bg-muted px-1.5 py-0.5 font-mono text-xs`,children:e.alias}),e.disabled&&(0,q.jsx)(F,{variant:`secondary`,children:`Disabled`})]}),(0,q.jsxs)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:[e.providerModel,e.efforts.length>0?` · efforts ${e.efforts.join(`, `)}`:` · no effort levels`,e.defaultEffort?` · default ${e.defaultEffort}`:``,` · context ${Fe(e)}`]})]}),(0,q.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,q.jsxs)(I,{variant:`outline`,size:`sm`,onClick:()=>re(e),children:[(0,q.jsx)(p,{className:`size-4`}),`Edit`]}),(0,q.jsxs)(I,{variant:`outline`,size:`sm`,disabled:!r,onClick:()=>void te(e,!e.disabled),children:[e.disabled?(0,q.jsx)(u,{className:`size-4`}):(0,q.jsx)(E,{className:`size-4`}),e.disabled?`Enable`:`Disable`]}),(0,q.jsxs)(I,{variant:`outline`,size:`sm`,disabled:!r,onClick:()=>void ne(e),children:[(0,q.jsx)(x,{className:`size-4`}),`Remove`]})]})]})},e.alias))]}),_.length>0&&(0,q.jsx)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive`,children:(0,q.jsx)(`ul`,{className:`list-disc space-y-1 pl-5`,children:_.map(e=>(0,q.jsx)(`li`,{children:e},e))})}),h&&(0,q.jsxs)(`p`,{className:`flex items-center gap-1 text-sm text-emerald-500`,children:[(0,q.jsx)(S,{className:`size-4`}),h]})]})}function Me(e){return{provider:e,alias:``,label:``,providerModel:``,efforts:``,defaultEffort:``,selfCompactUtilization:``,warnUtilization:``,hardBackstopUtilization:``,disabled:!1}}function Ne(e){let t=Pe(e.selfCompactUtilization,`Self compact utilization`),n=Pe(e.warnUtilization,`Warn utilization`),r=Pe(e.hardBackstopUtilization,`Hard backstop utilization`);if(!(t===void 0&&n===void 0&&r===void 0)){if(t===void 0)throw Error(`Self compact utilization is required when setting context thresholds`);return{selfCompactUtilization:t,...n===void 0?{}:{warnUtilization:n},...r===void 0?{}:{hardBackstopUtilization:r}}}}function Pe(e,t){let n=e.trim();if(!n)return;let r=Number(n);if(!Number.isFinite(r))throw Error(`${t} must be a number`);return r}function Fe(e){if(e.contextThreshold)return`self ${Ie(e.contextThreshold.selfCompactUtilization)}, warn ${Ie(e.contextThreshold.warnUtilization??Math.max(0,e.contextThreshold.selfCompactUtilization-.1))}`;let t=re(e.limits?.contextWindowTokens?.value);return`derived self ${Ie(t.selfCompactUtilization)}, warn ${Ie(t.warnUtilization)}`}function Ie(e){return`${Math.round(e*100)}%`}var Le=5,Re=15,ze={claude:`Claude`,codex:`Codex`};function Be(e){return Math.round(e/6e4)}function Ve(e){return`${Be(e)} min`}function He({canWrite:e}){let[n,r]=(0,G.useState)(null),[i,a]=(0,G.useState)(``),[o,s]=(0,G.useState)(``),[c,l]=(0,G.useState)(null);(0,G.useEffect)(()=>{let e=!1;return(async()=>{try{let n=await t(`GET`,`/providers/quota-config`);e||r(n)}catch(t){e||a(t.message)}})(),()=>{e=!0}},[]);async function u(e,n){r(t=>({...t??{},[e]:n})),s(``),l(e);try{let i=await t(`PUT`,`/providers/${e}/quota-config`,n);r(t=>({...t??{},[e]:i}))}catch(t){s(`${ze[e]??e}: ${t.message}`)}finally{l(null)}}let d=n?Object.keys(n).sort():[];return(0,q.jsxs)(`section`,{className:`space-y-4`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`h2`,{className:`text-base font-semibold`,children:`Quota`}),(0,q.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Per-provider quota collection and display. `,(0,q.jsx)(`strong`,{children:`Enabled`}),` governs collection (disabled stops polling — no API calls);`,(0,q.jsx)(`strong`,{children:` Show in widget`}),` governs display only.`]})]}),i&&(0,q.jsxs)(`div`,{className:`flex items-start gap-2 rounded-lg border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive`,children:[(0,q.jsx)(_,{className:`mt-0.5 size-4`}),(0,q.jsx)(`span`,{children:i})]}),o&&(0,q.jsxs)(`div`,{className:`flex items-start gap-2 rounded-lg border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive`,children:[(0,q.jsx)(_,{className:`mt-0.5 size-4`}),(0,q.jsx)(`span`,{children:o})]}),!n&&!i&&(0,q.jsx)(W,{size:`sm`,children:(0,q.jsxs)(U,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,q.jsx)(b,{className:`size-4 animate-spin`}),`Loading quota config…`]})}),d.map(t=>{let i=n[t],a=!e||c===t;return(0,q.jsxs)(W,{size:`sm`,children:[(0,q.jsxs)(z,{children:[(0,q.jsxs)(H,{className:`flex items-center gap-2 text-sm`,children:[(0,q.jsx)(w,{className:`size-4`}),ze[t]??t,c===t&&(0,q.jsx)(b,{className:`size-3 animate-spin text-muted-foreground`})]}),(0,q.jsxs)(B,{className:`text-xs`,children:[i.enabled?`Polled every ${Ve(i.pollIntervalMs)}`:`Collection disabled`,i.enabled&&!i.showInWidget?` · hidden from widget`:``]})]}),(0,q.jsxs)(U,{className:`space-y-4`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded-md border bg-muted/20 p-3`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`div`,{className:`text-sm font-medium`,children:`Enabled`}),(0,q.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`Collect quota for this provider. Off stops all polling (no API calls, no token spend).`})]}),(0,q.jsx)(R,{checked:i.enabled,disabled:a,onCheckedChange:e=>void u(t,{...i,enabled:e})})]}),(0,q.jsxs)(`div`,{className:`rounded-md border bg-muted/20 p-3 space-y-2`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,q.jsx)(`div`,{className:`text-sm font-medium`,children:`Polling interval`}),(0,q.jsx)(F,{variant:`outline`,className:`tabular-nums`,children:Ve(i.pollIntervalMs)})]}),(0,q.jsx)(`input`,{type:`range`,min:Le,max:Re,step:1,value:Be(i.pollIntervalMs),disabled:a||!i.enabled,onChange:e=>{let n=Number(e.target.value)*6e4;r(e=>({...e??{},[t]:{...i,pollIntervalMs:n}}))},onPointerUp:e=>void u(t,{...i,pollIntervalMs:Number(e.target.value)*6e4}),onKeyUp:e=>void u(t,{...i,pollIntervalMs:Number(e.target.value)*6e4}),className:`w-full accent-primary disabled:opacity-50`}),(0,q.jsxs)(`div`,{className:`flex justify-between text-[10px] text-muted-foreground`,children:[(0,q.jsxs)(`span`,{children:[Le,` min`]}),(0,q.jsxs)(`span`,{children:[Re,` min`]})]})]}),(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded-md border bg-muted/20 p-3`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`div`,{className:`text-sm font-medium`,children:`Show in quota widget`}),(0,q.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`Display only. Off hides this provider from the dashboard widget; collection continues if enabled.`})]}),(0,q.jsx)(R,{checked:i.showInWidget,disabled:a,onCheckedChange:e=>void u(t,{...i,showInWidget:e})})]})]})]},t)})]})}function Ue({message:e}){return(0,q.jsxs)(`div`,{className:`flex items-start gap-2 rounded-lg border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive`,children:[(0,q.jsx)(_,{className:`mt-0.5 size-4 shrink-0`}),(0,q.jsx)(`span`,{children:e})]})}var We=[`claude`,`codex`],Ge={claude:`Claude`,codex:`Codex`},X={cautionAt:.15,avoidLargeAt:.5,hardAvoidAt:1},Ke=.99,qe=.5;function Z(e,t){return((e??t)*100).toFixed(0)}function Q(e){let t=Number(e);return!Number.isFinite(t)||t<0||t>100?null:t/100}function Je({policy:e,canWrite:r,onPolicy:i}){let a=e.quotaBands,o=e.providerQuota??{},[s,c]=(0,G.useState)(Z(a?.cautionAt,X.cautionAt)),[l,u]=(0,G.useState)(Z(a?.avoidLargeAt,X.avoidLargeAt)),[d,f]=(0,G.useState)(Z(a?.hardAvoidAt,X.hardAvoidAt)),[p,m]=(0,G.useState)(()=>{let e={};for(let t of We){let n=o[t]??{};e[t]={backstop:Z(n.hardBackstopUtilization,Ke),floor:Z(n.burnPenaltyUtilizationFloor,qe)}}return e}),[h,g]=(0,G.useState)(!1),[_,v]=(0,G.useState)(``),[y,x]=(0,G.useState)(!1),[S,C]=(0,G.useState)(``);async function w(){let n=Q(s),r=Q(l),a=Q(d);if(n===null){C(`Caution threshold must be 0–100%.`);return}if(r===null){C(`Avoid-large threshold must be 0–100%.`);return}if(a===null){C(`Hard-avoid threshold must be 0–100%.`);return}if(n>=r){C(`Caution must be less than avoid-large.`);return}if(r>=a){C(`Avoid-large must be less than hard-avoid.`);return}let o={};for(let e of We){let t=p[e],n=Q(t.backstop),r=Q(t.floor);if(n===null){C(`${Ge[e]}: hard-backstop must be 0–100%.`);return}if(r===null){C(`${Ge[e]}: burn-penalty floor must be 0–100%.`);return}o[e]={hardBackstopUtilization:n,burnPenaltyUtilizationFloor:r}}C(``),g(!0),v(``),x(!1);try{i(await t(`PUT`,`/routing-policy`,{...e,quotaBands:{cautionAt:n,avoidLargeAt:r,hardAvoidAt:a},providerQuota:o})),x(!0),setTimeout(()=>x(!1),2e3)}catch(e){v(e.message)}finally{g(!1)}}function T(e,t){m(n=>({...n,[e]:{...n[e],...t}})),C(``),x(!1)}function E(){C(``),x(!1)}return(0,q.jsxs)(W,{size:`sm`,children:[(0,q.jsxs)(z,{children:[(0,q.jsx)(H,{className:`text-sm`,children:`Quota thresholds`}),(0,q.jsx)(B,{className:`text-xs`,children:`Band cutoffs govern when the orchestrator starts penalising or blocking high-quota providers. Values are utilization percentages (0–100).`})]}),(0,q.jsxs)(U,{className:`space-y-4`,children:[(_||S)&&(0,q.jsx)(Ue,{message:_||S}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`div`,{className:`mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wide`,children:`Band cutoffs`}),(0,q.jsx)(Ye,{caution:Number(s),avoidLarge:Number(l),hardAvoid:Number(d)}),(0,q.jsxs)(`div`,{className:`mt-3 grid gap-3 sm:grid-cols-3`,children:[(0,q.jsx)($,{label:`Caution at`,hint:`Default: ${(X.cautionAt*100).toFixed(0)}%`,value:s,disabled:!r||h,onChange:e=>{c(e),E()}}),(0,q.jsx)($,{label:`Avoid-large at`,hint:`Default: ${(X.avoidLargeAt*100).toFixed(0)}%`,value:l,disabled:!r||h,onChange:e=>{u(e),E()}}),(0,q.jsx)($,{label:`Hard-avoid at`,hint:`Default: ${(X.hardAvoidAt*100).toFixed(0)}%`,value:d,disabled:!r||h,onChange:e=>{f(e),E()}})]})]}),We.map(e=>{let t=p[e];return(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`div`,{className:`mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wide`,children:[Ge[e],` overrides`]}),(0,q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,q.jsx)($,{label:`Hard-backstop utilization`,hint:`Provider blocked above this. Default: ${(Ke*100).toFixed(0)}%`,value:t.backstop,disabled:!r||h,onChange:t=>T(e,{backstop:t})}),(0,q.jsx)($,{label:`Burn-penalty floor`,hint:`Penalties suppressed below this. Default: ${(qe*100).toFixed(0)}%`,value:t.floor,disabled:!r||h,onChange:t=>T(e,{floor:t})})]})]},e)}),r&&(0,q.jsxs)(I,{size:`sm`,onClick:()=>void w(),disabled:h,children:[h?(0,q.jsx)(b,{className:`size-4 animate-spin`}):(0,q.jsx)(n,{className:`size-4`}),y?`Saved`:`Save thresholds`]})]})]})}function Ye({caution:e,avoidLarge:t,hardAvoid:n}){let r=e=>Math.max(0,Math.min(100,Number.isFinite(e)?e:0)),i=r(e),a=Math.max(i,r(t)),o=Math.max(a,r(n)),s=e=>`${e.toFixed(0)}%`,c=[{key:`normal`,label:`normal`,color:`bg-emerald-500`,from:0,to:i,range:`0–${s(i)}`},{key:`caution`,label:`caution`,color:`bg-amber-500`,from:i,to:a,range:`${s(i)}–${s(a)}`},{key:`avoid-large`,label:`avoid large`,color:`bg-orange-500`,from:a,to:o,range:`${s(a)}–${s(o)}`},{key:`hard-avoid`,label:`hard avoid`,color:`bg-red-500`,from:o,to:100,range:`≥ ${s(o)}`}];return(0,q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,q.jsx)(`div`,{className:`flex h-2.5 overflow-hidden rounded-full bg-muted`,role:`img`,"aria-label":`Quota penalty bands from 0 to 100 percent`,children:c.map(e=>(0,q.jsx)(`div`,{className:m(e.color,`transition-[width] duration-300`),style:{width:`${e.to-e.from}%`},title:`${e.label} · ${e.range}`},e.key))}),(0,q.jsx)(`div`,{className:`flex flex-wrap gap-x-3 gap-y-1 text-[10px] text-muted-foreground`,children:c.map(e=>(0,q.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,q.jsx)(`span`,{className:m(`size-2 shrink-0 rounded-full`,e.color)}),e.label,` `,(0,q.jsx)(`span`,{className:`tabular-nums text-foreground/70`,children:e.range})]},e.key))})]})}function $({label:e,hint:t,value:n,disabled:r,onChange:i}){return(0,q.jsxs)(`label`,{className:`space-y-1`,children:[(0,q.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground`,children:e}),(0,q.jsxs)(`div`,{className:`relative`,children:[(0,q.jsx)(L,{value:n,onChange:e=>i(e.target.value),disabled:r,className:`h-8 pr-6 text-xs tabular-nums`}),(0,q.jsx)(`span`,{className:`pointer-events-none absolute inset-y-0 right-2.5 flex items-center text-xs text-muted-foreground`,children:`%`})]}),(0,q.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:t})]})}function Xe(){let[e,n]=(0,G.useState)(null),[r,i]=(0,G.useState)(!1),[a,o]=(0,G.useState)(``),[s,c]=(0,G.useState)(!1),[d,f]=(0,G.useState)(!1);async function p(){if(!d){i(!0),o(``);try{let[e,r]=await Promise.all([t(`GET`,`/routing-policy`),t(`GET`,`/agent-profiles/coordinator`).catch(()=>null)]);n({policy:e,profile:r}),f(!0)}catch(e){o(e.message)}finally{i(!1)}}}async function h(){f(!1),i(!0),o(``);try{let[e,r]=await Promise.all([t(`GET`,`/routing-policy`),t(`GET`,`/agent-profiles/coordinator`).catch(()=>null)]);n({policy:e,profile:r}),f(!0)}catch(e){o(e.message)}finally{i(!1)}}function g(){let e=!s;c(e),e&&!d&&p()}return(0,q.jsx)(W,{size:`sm`,children:(0,q.jsxs)(U,{className:`space-y-3`,children:[(0,q.jsxs)(`button`,{type:`button`,className:`flex w-full items-center gap-2 text-left`,onClick:g,children:[(0,q.jsx)(u,{className:`size-4 text-muted-foreground`}),(0,q.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,q.jsx)(`div`,{className:`text-sm font-semibold`,children:`What your coordinator knows`}),(0,q.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`Active routing policy + coordinator profile instructions (read-only)`})]}),s?(0,q.jsx)(ee,{className:`size-4 shrink-0 text-muted-foreground`}):(0,q.jsx)(te,{className:`size-4 shrink-0 text-muted-foreground`})]}),s&&(0,q.jsxs)(`div`,{className:`space-y-4 pt-1`,children:[(0,q.jsx)(`div`,{className:`flex justify-end`,children:(0,q.jsxs)(I,{variant:`outline`,size:`sm`,onClick:()=>void h(),disabled:r,children:[(0,q.jsx)(l,{className:m(`size-3.5`,r&&`animate-spin`)}),`Refresh`]})}),a&&(0,q.jsx)(Ue,{message:a}),r&&!e&&(0,q.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-muted-foreground py-2`,children:[(0,q.jsx)(b,{className:`size-3.5 animate-spin`}),`Loading…`]}),e&&(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Ze,{policy:e.policy}),e.profile?(0,q.jsx)($e,{profile:e.profile}):(0,q.jsx)(`div`,{className:`text-xs text-muted-foreground italic`,children:`Coordinator profile not found.`})]})]})]})})}function Ze({policy:e}){let t=e.quotaBands,n=e.providerQuota??{};return(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(0,q.jsx)(`div`,{className:`text-xs font-semibold text-muted-foreground uppercase tracking-wide`,children:`Active routing policy`}),e.rules.length===0?(0,q.jsx)(`div`,{className:`text-xs text-muted-foreground italic`,children:`No rules — coordinators use their own heuristics.`}):(0,q.jsxs)(`div`,{className:`overflow-hidden rounded-md border border-border text-xs`,children:[(0,q.jsxs)(`div`,{className:`grid grid-cols-[1.5rem_minmax(0,1fr)_minmax(0,1fr)_minmax(0,1fr)] gap-px bg-border text-[10px] font-medium text-muted-foreground uppercase tracking-wide`,children:[(0,q.jsx)(`div`,{className:`bg-muted/40 px-2 py-1.5`,children:`#`}),(0,q.jsx)(`div`,{className:`bg-muted/40 px-2 py-1.5`,children:`Match`}),(0,q.jsx)(`div`,{className:`bg-muted/40 px-2 py-1.5`,children:`Target`}),(0,q.jsx)(`div`,{className:`bg-muted/40 px-2 py-1.5`,children:`Status`})]}),e.rules.map((e,t)=>(0,q.jsxs)(`div`,{className:m(`grid grid-cols-[1.5rem_minmax(0,1fr)_minmax(0,1fr)_minmax(0,1fr)] gap-px bg-border`,e.enabled===!1&&`opacity-50`),children:[(0,q.jsx)(`div`,{className:`bg-card px-2 py-1.5 text-muted-foreground tabular-nums`,children:t+1}),(0,q.jsxs)(`div`,{className:`bg-card px-2 py-1.5`,children:[e.label&&(0,q.jsx)(`div`,{className:`font-medium`,children:e.label}),e.match.taskType&&(0,q.jsxs)(`div`,{className:`font-mono`,children:[`task: `,e.match.taskType]}),e.match.capability&&(0,q.jsxs)(`div`,{className:`font-mono`,children:[`cap: `,e.match.capability]})]}),(0,q.jsxs)(`div`,{className:`bg-card px-2 py-1.5`,children:[(0,q.jsx)(`span`,{className:`font-medium`,children:e.target.provider}),e.target.model&&(0,q.jsxs)(`span`,{className:`text-muted-foreground`,children:[` / `,e.target.model]}),e.target.effort&&(0,q.jsxs)(`span`,{className:`text-muted-foreground`,children:[` (`,e.target.effort,`)`]})]}),(0,q.jsx)(`div`,{className:`bg-card px-2 py-1.5`,children:e.enabled===!1?(0,q.jsx)(`span`,{className:`text-muted-foreground`,children:`disabled`}):(0,q.jsx)(`span`,{className:`text-emerald-500`,children:`active`})})]},t))]}),(t||Object.keys(n).length>0)&&(0,q.jsxs)(`div`,{className:`rounded-md border border-border bg-muted/10 px-3 py-2 text-xs space-y-1`,children:[t&&(0,q.jsxs)(`div`,{className:`flex flex-wrap gap-x-4 gap-y-0.5`,children:[t.cautionAt!==void 0&&(0,q.jsxs)(`span`,{children:[`caution ≥ `,(t.cautionAt*100).toFixed(0),`%`]}),t.avoidLargeAt!==void 0&&(0,q.jsxs)(`span`,{children:[`avoid-large ≥ `,(t.avoidLargeAt*100).toFixed(0),`%`]}),t.hardAvoidAt!==void 0&&(0,q.jsxs)(`span`,{children:[`hard-avoid ≥ `,(t.hardAvoidAt*100).toFixed(0),`%`]})]}),Object.entries(n).map(([e,t])=>(0,q.jsxs)(`div`,{className:`flex flex-wrap gap-x-4 gap-y-0.5 text-muted-foreground`,children:[(0,q.jsx)(`span`,{className:`font-medium text-foreground`,children:Ge[e]??e}),t?.hardBackstopUtilization!==void 0&&(0,q.jsxs)(`span`,{children:[`backstop: `,(t.hardBackstopUtilization*100).toFixed(0),`%`]}),t?.burnPenaltyUtilizationFloor!==void 0&&(0,q.jsxs)(`span`,{children:[`floor: `,(t.burnPenaltyUtilizationFloor*100).toFixed(0),`%`]})]},e))]})]})}function Qe({text:e,index:t}){return(0,q.jsxs)(`div`,{className:`relative max-h-72 overflow-y-auto rounded-md border border-border bg-muted/20`,children:[t!==void 0&&(0,q.jsxs)(`span`,{className:`sticky top-0 float-right m-1.5 rounded bg-muted px-1.5 py-0.5 text-[9px] font-medium tabular-nums text-muted-foreground`,children:[`#`,t]}),(0,q.jsx)(`pre`,{className:`whitespace-pre-wrap break-words px-3 py-2.5 font-sans text-[11px] leading-relaxed text-foreground/90`,children:e})]})}function $e({profile:e}){return(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(0,q.jsxs)(`div`,{className:`text-xs font-semibold text-muted-foreground uppercase tracking-wide`,children:[`Coordinator profile instructions`,(0,q.jsx)(F,{variant:`secondary`,className:`ml-2 text-[10px]`,children:e.name}),e.builtIn&&(0,q.jsx)(F,{variant:`outline`,className:`ml-1 text-[10px]`,children:`built-in`})]}),e.description&&(0,q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.description}),(0,q.jsxs)(`div`,{className:`flex flex-wrap gap-2 text-[10px]`,children:[(0,q.jsxs)(F,{variant:`outline`,children:[`base: `,e.base]}),(0,q.jsxs)(F,{variant:`outline`,children:[`repo: `,e.instructions.repoInstructions]}),(0,q.jsxs)(F,{variant:`outline`,children:[`global: `,e.instructions.globalInstructions]}),e.provider&&(0,q.jsxs)(F,{variant:`outline`,children:[`provider: `,e.provider]})]}),e.instructions.system&&(0,q.jsxs)(`div`,{className:`space-y-1`,children:[(0,q.jsx)(`div`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wide`,children:`System prompt`}),(0,q.jsx)(Qe,{text:e.instructions.system})]}),e.instructions.append.length>0&&(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(0,q.jsxs)(`div`,{className:`text-[10px] font-medium text-muted-foreground uppercase tracking-wide`,children:[`Appended instructions (`,e.instructions.append.length,`)`]}),e.instructions.append.map((e,t)=>(0,q.jsx)(Qe,{text:e,index:t+1},t))]}),e.instructions.append.length===0&&!e.instructions.system&&(0,q.jsx)(`div`,{className:`text-xs text-muted-foreground italic`,children:`No instruction blocks defined.`})]})}var et=[`claude`,`codex`],tt={claude:`Claude`,codex:`Codex`};function nt(){return{label:``,matchTaskType:``,matchCapability:``,targetProvider:`claude`,targetModel:``,targetEffort:``,enabled:!0}}function rt(e){return{label:e.label??``,matchTaskType:e.match.taskType??``,matchCapability:e.match.capability??``,targetProvider:e.target.provider,targetModel:e.target.model??``,targetEffort:e.target.effort??``,enabled:e.enabled!==!1}}function it(e){return{...e.label.trim()?{label:e.label.trim()}:{},match:{...e.matchTaskType.trim()?{taskType:e.matchTaskType.trim()}:{},...e.matchCapability.trim()?{capability:e.matchCapability.trim()}:{}},target:{provider:e.targetProvider,...e.targetModel.trim()?{model:e.targetModel.trim()}:{},...e.targetEffort.trim()?{effort:e.targetEffort.trim()}:{}},enabled:e.enabled}}function at(e){return!e.matchTaskType.trim()&&!e.matchCapability.trim()?`At least one match criterion (task type or capability) is required.`:null}function ot({message:e}){return(0,q.jsxs)(`div`,{className:`flex items-start gap-2 rounded-lg border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive`,children:[(0,q.jsx)(_,{className:`mt-0.5 size-4 shrink-0`}),(0,q.jsx)(`span`,{children:e})]})}function st({canWrite:e}){let[n,r]=(0,G.useState)(null),[i,a]=(0,G.useState)(!1),[o,s]=(0,G.useState)(``),[c,u]=(0,G.useState)(!1);!c&&!i&&!o&&(a(!0),(async()=>{try{r(await t(`GET`,`/routing-policy`)),u(!0)}catch(e){s(e.message)}finally{a(!1)}})());async function d(){a(!0),s(``);try{r(await t(`GET`,`/routing-policy`)),u(!0)}catch(e){s(e.message)}finally{a(!1)}}return(0,q.jsxs)(`div`,{className:`space-y-6`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`h2`,{className:`text-base font-semibold`,children:`Routing`}),(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Declarative rules mapping task types and capabilities to providers. Rules are advisory — coordinators apply them; explicit per-spawn arguments always take precedence.`})]}),(0,q.jsxs)(I,{variant:`outline`,size:`sm`,onClick:()=>void d(),disabled:i,children:[(0,q.jsx)(l,{className:m(`size-4`,i&&`animate-spin`)}),`Refresh`]})]}),o&&(0,q.jsx)(ot,{message:o}),i&&!n&&(0,q.jsx)(W,{size:`sm`,children:(0,q.jsxs)(U,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,q.jsx)(b,{className:`size-4 animate-spin`}),`Loading routing policy…`]})}),n&&(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(ct,{policy:n,canWrite:e,onPolicy:r}),(0,q.jsx)(Je,{policy:n,canWrite:e,onPolicy:r})]}),(0,q.jsx)(Xe,{})]})}function ct({policy:e,canWrite:n,onPolicy:r}){let[a,o]=(0,G.useState)(!1),[s,c]=(0,G.useState)(``),[l,u]=(0,G.useState)(!1),[d,f]=(0,G.useState)(nt),[p,m]=(0,G.useState)(``),[h,g]=(0,G.useState)(null),[_,v]=(0,G.useState)(nt),[y,x]=(0,G.useState)(``);async function S(e){o(!0),c(``);try{r(await t(`PUT`,`/routing-policy`,e))}catch(e){c(e.message)}finally{o(!1)}}function w(t,n){let r=[...e.rules],i=t+n;i<0||i>=r.length||([r[t],r[i]]=[r[i],r[t]],S({...e,rules:r}))}function T(t){let n=e.rules.map((e,n)=>n===t?{...e,enabled:e.enabled===!1}:e);S({...e,rules:n})}function E(t){S({...e,rules:e.rules.filter((e,n)=>n!==t)})}function D(){f(nt()),m(``),u(!0)}function ee(){u(!1),m(``)}function te(){let t=at(d);if(t){m(t);return}u(!1),S({...e,rules:[...e.rules,it(d)]})}function ne(t){g(t),v(rt(e.rules[t])),x(``)}function re(){g(null),x(``)}function O(){if(h===null)return;let t=at(_);if(t){x(t);return}let n=e.rules.map((e,t)=>t===h?it(_):e);g(null),S({...e,rules:n})}return(0,q.jsxs)(W,{size:`sm`,children:[(0,q.jsxs)(z,{children:[(0,q.jsxs)(H,{className:`flex items-center gap-2 text-sm`,children:[(0,q.jsx)(C,{className:`size-4`}),`Rules`,(0,q.jsxs)(F,{variant:`outline`,className:`ml-auto text-[10px]`,children:[e.rules.length,` rule`,e.rules.length===1?``:`s`]}),a&&(0,q.jsx)(b,{className:`size-3 animate-spin text-muted-foreground`})]}),(0,q.jsx)(B,{className:`text-xs`,children:`Evaluated in order — first matching enabled rule wins. Rules are advisory; explicit spawn arguments override them.`})]}),(0,q.jsxs)(U,{className:`space-y-2`,children:[s&&(0,q.jsx)(ot,{message:s}),e.rules.length===0&&!l&&(0,q.jsx)(`div`,{className:`rounded-md border border-dashed border-border py-6 text-center text-xs text-muted-foreground`,children:`No rules — coordinators fall back to their own heuristics.`}),e.rules.map((t,r)=>h===r?(0,q.jsx)(ut,{form:_,error:y,onChange:v,onSave:O,onCancel:re},r):(0,q.jsx)(lt,{rule:t,idx:r,total:e.rules.length,canWrite:n,saving:a,onMoveUp:()=>w(r,-1),onMoveDown:()=>w(r,1),onToggle:()=>T(r),onEdit:()=>ne(r),onRemove:()=>E(r)},r)),l&&(0,q.jsx)(ut,{form:d,error:p,onChange:f,onSave:te,onCancel:ee,isNew:!0}),n&&!l&&h===null&&(0,q.jsxs)(I,{variant:`outline`,size:`sm`,className:`w-full gap-1`,onClick:D,disabled:a,children:[(0,q.jsx)(i,{className:`size-4`}),`Add rule`]})]})]})}function lt({rule:e,idx:t,total:n,canWrite:r,saving:i,onMoveUp:o,onMoveDown:s,onToggle:l,onEdit:u,onRemove:d}){return(0,q.jsxs)(`div`,{className:m(`group flex items-start gap-3 rounded-md border bg-muted/20 p-3`,e.enabled===!1&&`opacity-60`),children:[(0,q.jsxs)(`div`,{className:`flex flex-col items-center gap-0.5 pt-0.5`,children:[(0,q.jsx)(`button`,{type:`button`,title:`Move up`,onClick:o,disabled:!r||i||t===0,className:`rounded p-0.5 text-muted-foreground hover:bg-accent hover:text-foreground disabled:pointer-events-none disabled:opacity-30`,children:(0,q.jsx)(a,{className:`size-3.5`})}),(0,q.jsx)(`button`,{type:`button`,title:`Move down`,onClick:s,disabled:!r||i||t===n-1,className:`rounded p-0.5 text-muted-foreground hover:bg-accent hover:text-foreground disabled:pointer-events-none disabled:opacity-30`,children:(0,q.jsx)(c,{className:`size-3.5`})})]}),(0,q.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1`,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,q.jsxs)(`span`,{className:`text-[10px] tabular-nums text-muted-foreground`,children:[`#`,t+1]}),e.label&&(0,q.jsx)(`span`,{className:`text-xs font-medium`,children:e.label}),(0,q.jsx)(F,{variant:`outline`,className:`text-[10px]`,children:e.target.provider}),e.target.model&&(0,q.jsx)(F,{variant:`outline`,className:`text-[10px] font-mono`,children:e.target.model}),e.target.effort&&(0,q.jsx)(F,{variant:`outline`,className:`text-[10px]`,children:e.target.effort})]}),(0,q.jsxs)(`div`,{className:`flex flex-wrap gap-x-3 gap-y-0.5 text-[10px] text-muted-foreground`,children:[e.match.taskType&&(0,q.jsxs)(`span`,{children:[`task-type: `,(0,q.jsx)(`span`,{className:`font-mono text-foreground`,children:e.match.taskType})]}),e.match.capability&&(0,q.jsxs)(`span`,{children:[`capability: `,(0,q.jsx)(`span`,{className:`font-mono text-foreground`,children:e.match.capability})]})]})]}),(0,q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1 opacity-70 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100`,children:[(0,q.jsx)(R,{checked:e.enabled!==!1,disabled:!r||i,onCheckedChange:l,title:e.enabled===!1?`Enable rule`:`Disable rule`}),r&&(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`button`,{type:`button`,title:`Edit`,onClick:u,disabled:i,className:`rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground disabled:pointer-events-none`,children:(0,q.jsxs)(`svg`,{className:`size-3.5`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,children:[(0,q.jsx)(`path`,{d:`M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7`}),(0,q.jsx)(`path`,{d:`M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z`})]})}),(0,q.jsx)(`button`,{type:`button`,title:`Remove`,onClick:d,disabled:i,className:`rounded p-1 text-destructive hover:bg-destructive/10 disabled:pointer-events-none`,children:(0,q.jsx)(x,{className:`size-3.5`})})]})]})]})}function ut({form:e,error:t,onChange:r,onSave:i,onCancel:a,isNew:o}){function s(t){r({...e,...t})}return(0,q.jsxs)(`div`,{className:`rounded-md border border-primary/30 bg-primary/5 p-3 space-y-3`,children:[(0,q.jsx)(`div`,{className:`text-xs font-semibold text-muted-foreground uppercase tracking-wide`,children:o?`New rule`:`Edit rule`}),(0,q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,q.jsxs)(`label`,{className:`space-y-1`,children:[(0,q.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground`,children:`Label (optional)`}),(0,q.jsx)(L,{value:e.label,onChange:e=>s({label:e.target.value}),placeholder:`e.g. Route GUI tasks to Claude`,className:`h-8 text-xs`})]}),(0,q.jsxs)(`label`,{className:`space-y-1`,children:[(0,q.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground`,children:`Target provider`}),(0,q.jsxs)(P,{value:e.targetProvider,onValueChange:e=>s({targetProvider:e}),children:[(0,q.jsx)(j,{className:`h-8 text-xs`,children:(0,q.jsx)(A,{})}),(0,q.jsx)(M,{children:et.map(e=>(0,q.jsx)(N,{value:e,className:`text-xs`,children:tt[e]},e))})]})]})]}),(0,q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,q.jsxs)(`label`,{className:`space-y-1`,children:[(0,q.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground`,children:`Match task-type (prefix)`}),(0,q.jsx)(L,{value:e.matchTaskType,onChange:e=>s({matchTaskType:e.target.value}),placeholder:`e.g. gui, backend, mechanical`,className:`h-8 font-mono text-xs`}),(0,q.jsxs)(`span`,{className:`block text-[10px] leading-snug text-muted-foreground`,children:[`Prefix match — `,(0,q.jsx)(`span`,{className:`font-mono text-foreground`,children:`gui`}),` matches `,(0,q.jsx)(`span`,{className:`font-mono text-foreground`,children:`gui/ux`}),`, `,(0,q.jsx)(`span`,{className:`font-mono text-foreground`,children:`gui/layout`}),`.`]})]}),(0,q.jsxs)(`label`,{className:`space-y-1`,children:[(0,q.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground`,children:`Match capability (exact)`}),(0,q.jsx)(L,{value:e.matchCapability,onChange:e=>s({matchCapability:e.target.value}),placeholder:`e.g. code, research, bounded`,className:`h-8 font-mono text-xs`}),(0,q.jsx)(`span`,{className:`block text-[10px] leading-snug text-muted-foreground`,children:`Exact match against the agent's capability tag. Both fields are AND-ed.`})]})]}),(0,q.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,q.jsxs)(`label`,{className:`space-y-1`,children:[(0,q.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground`,children:`Model alias (optional)`}),(0,q.jsx)(L,{value:e.targetModel,onChange:e=>s({targetModel:e.target.value}),placeholder:`e.g. opus, gpt-5.4`,className:`h-8 font-mono text-xs`})]}),(0,q.jsxs)(`label`,{className:`space-y-1`,children:[(0,q.jsx)(`span`,{className:`text-[10px] font-medium text-muted-foreground`,children:`Effort (optional)`}),(0,q.jsx)(L,{value:e.targetEffort,onChange:e=>s({targetEffort:e.target.value}),placeholder:`e.g. high, low`,className:`h-8 text-xs`})]})]}),(0,q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,q.jsx)(R,{checked:e.enabled,onCheckedChange:e=>s({enabled:e})}),(0,q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Enabled`})]}),t&&(0,q.jsx)(ot,{message:t}),(0,q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,q.jsxs)(I,{size:`sm`,onClick:i,children:[(0,q.jsx)(n,{className:`size-4`}),o?`Add`:`Save`]}),(0,q.jsx)(I,{size:`sm`,variant:`outline`,onClick:a,children:`Cancel`})]})]})}var dt=`browser`,ft=`models`,pt=`profile`,mt=`routing`,ht=[`branch.landed`,`landed-failure`,`agent.ready`,`agent.exited`,`agent.spawn_failed`,`agent.context_threshold`,`agent.quota_threshold`,`workspace.steward_task`,`workspace.conflict`,`workspace.review_request`];function gt(){if(typeof window>`u`)return``;let e=window.location.hash.replace(/^#/,``);return e.startsWith(`settings/`)?decodeURIComponent(e.slice(9)):``}function _t(e){if(typeof window>`u`)return;let t=new URL(window.location.href);t.hash=`settings/${encodeURIComponent(e)}`,window.history.pushState({},``,t)}function vt(){let[e,n]=(0,G.useState)([]),[r,i]=(0,G.useState)(null),[a,o]=(0,G.useState)([]),[s,c]=(0,G.useState)(()=>gt()),[u,d]=(0,G.useState)(!0),[f,p]=(0,G.useState)(``),[h,v]=(0,G.useState)(``);async function y(){d(!0),p(``),v(``);try{let[e,r,a]=await Promise.all([t(`GET`,`/settings`),t(`GET`,`/tokens/me`),t(`GET`,`/providers`).catch(e=>(v(e.message),{catalog:[]}))]);n(e.settings),i(r),o(a.catalog)}catch(e){p(e.message)}finally{d(!1)}}(0,G.useEffect)(()=>{y()},[]),(0,G.useEffect)(()=>{let e=()=>c(gt());return window.addEventListener(`hashchange`,e),window.addEventListener(`popstate`,e),()=>{window.removeEventListener(`hashchange`,e),window.removeEventListener(`popstate`,e)}},[]);let b=(0,G.useMemo)(()=>de(e),[e]),x=(0,G.useMemo)(()=>[...b.map(e=>({slug:e.slug,label:e.group,description:`${e.settings.length} schema setting${e.settings.length===1?``:`s`}`,kind:`descriptors`,settings:e.settings})),{slug:mt,label:`Routing`,description:`Rules, quota thresholds, coordinator view`,kind:`routing`,settings:[]},{slug:pt,label:`Profile`,description:`Display name and avatar`,kind:`profile`,settings:[]},{slug:dt,label:`Browser`,description:`Local dashboard preferences`,kind:`browser`,settings:[]},{slug:ft,label:`Models`,description:`Provider model catalog`,kind:`models`,settings:[]}],[b]),S=x.find(e=>e.slug===s)??x[0];function C(e){c(e),_t(e)}function w(e){n(t=>t.map(t=>K(t)===K(e)?e:t))}return(0,q.jsxs)(`div`,{className:`space-y-4`,children:[(0,q.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`h1`,{className:`text-lg font-semibold`,children:`Settings`}),(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Schema-driven Relay settings, browser preferences, and model catalog controls.`})]}),(0,q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[r&&(0,q.jsxs)(F,{variant:`outline`,className:`gap-1`,children:[(0,q.jsx)(g,{className:`size-3`}),r.kind,`:`,r.actor]}),(0,q.jsxs)(I,{variant:`outline`,size:`sm`,onClick:()=>void y(),disabled:u,children:[(0,q.jsx)(l,{className:m(`size-4`,u&&`animate-spin`)}),`Refresh`]})]})]}),f&&(0,q.jsxs)(`div`,{className:`flex items-start gap-2 rounded-lg border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive`,children:[(0,q.jsx)(_,{className:`mt-0.5 size-4`}),(0,q.jsx)(`span`,{children:f})]}),(0,q.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-[230px_minmax(0,1fr)]`,children:[(0,q.jsx)(`nav`,{className:`space-y-1 lg:sticky lg:top-4 lg:self-start`,children:x.map(e=>(0,q.jsxs)(`button`,{type:`button`,className:m(`w-full rounded-md border px-3 py-2 text-left text-sm transition-colors`,S?.slug===e.slug?`border-primary/50 bg-primary/10 text-foreground`:`border-transparent hover:border-border hover:bg-accent`),onClick:()=>C(e.slug),children:[(0,q.jsx)(`span`,{className:`block font-medium`,children:e.label}),(0,q.jsx)(`span`,{className:`block truncate text-xs text-muted-foreground`,children:e.description})]},e.slug))}),(0,q.jsx)(`div`,{className:`min-w-0 space-y-4`,children:u&&!e.length?(0,q.jsx)(W,{size:`sm`,children:(0,q.jsx)(U,{className:`text-sm text-muted-foreground`,children:`Loading settings…`})}):S?.kind===`routing`?(0,q.jsx)(st,{canWrite:ae(r?.scopes,`settings:write:routing`)}):S?.kind===`descriptors`?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Te,{group:S.label,settings:S.settings,onSaved:w}),S.label===`Providers`&&(0,q.jsx)(He,{canWrite:ae(r?.scopes,`settings:write:provider`)}),S.label===`Notifications`&&(0,q.jsx)(yt,{})]}):S?.kind===`profile`?(0,q.jsx)(bt,{}):S?.kind===`browser`?(0,q.jsx)(ke,{}):(0,q.jsx)(je,{catalog:a,error:h,canWrite:ae(r?.scopes,`settings:write:provider`),onCatalog:o})})]})]})}function yt(){let[e,n]=(0,G.useState)(`branch.landed`),[r,i]=(0,G.useState)(`{
4
- "repoRoot": "/repo"
5
- }`),[a,o]=(0,G.useState)(null),[s,c]=(0,G.useState)(!1),[l,u]=(0,G.useState)(``);async function d(){c(!0),u(``);try{let n=JSON.parse(r);if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`Scope must be a JSON object`);o((await t(`POST`,`/notifications/preview`,{type:e,scope:n})).preview)}catch(e){o(null),u(e.message)}finally{c(!1)}}return(0,q.jsx)(W,{size:`sm`,children:(0,q.jsxs)(U,{className:`space-y-3`,children:[(0,q.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Who gets what`}),(0,q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Dry-run notification routing without sending.`})]}),(0,q.jsxs)(I,{size:`sm`,onClick:()=>void d(),disabled:s,children:[(0,q.jsx)(C,{className:`size-4`}),`Preview`]})]}),(0,q.jsxs)(`div`,{className:`grid gap-3 md:grid-cols-[240px_minmax(0,1fr)]`,children:[(0,q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,q.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`Type`}),(0,q.jsxs)(P,{value:e,onValueChange:n,children:[(0,q.jsx)(j,{className:`w-full`,children:(0,q.jsx)(A,{})}),(0,q.jsx)(M,{children:ht.map(e=>(0,q.jsx)(N,{value:e,children:e},e))})]})]}),(0,q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,q.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`Scope`}),(0,q.jsx)(se,{value:r,onChange:e=>i(e.target.value),rows:4,className:`font-mono text-xs`})]})]}),l&&(0,q.jsxs)(`div`,{className:`flex items-start gap-2 rounded-md border border-destructive/40 bg-destructive/10 p-2 text-xs text-destructive`,children:[(0,q.jsx)(_,{className:`mt-0.5 size-3.5`}),(0,q.jsx)(`span`,{children:l})]}),a&&(0,q.jsx)(`div`,{className:`overflow-hidden rounded-md border border-border`,children:a.recipients.length===0?(0,q.jsx)(`div`,{className:`px-3 py-4 text-center text-xs text-muted-foreground`,children:`No recipients`}):a.recipients.map(e=>(0,q.jsxs)(`div`,{className:`grid gap-1 border-b border-border px-3 py-2 text-xs last:border-b-0 md:grid-cols-[minmax(0,180px)_minmax(0,160px)_minmax(0,1fr)]`,children:[(0,q.jsx)(`span`,{className:`truncate font-medium`,children:e.recipient}),(0,q.jsx)(`span`,{className:`truncate font-mono text-muted-foreground`,children:e.matchedRule}),(0,q.jsx)(`span`,{className:`truncate text-muted-foreground`,children:e.reason})]},`${e.recipient}-${e.matchedRule}`))})]})})}function bt(){let e=k(e=>e.fetchUsers),r=(0,G.useRef)(null),[i,a]=(0,G.useState)(null),[o,c]=(0,G.useState)(``),[l,u]=(0,G.useState)(!0),[d,f]=(0,G.useState)(!1),[p,m]=(0,G.useState)(``);async function h(){u(!0),m(``);try{let e=await t(`GET`,`/users/me`);a(e),c(e.displayName||e.handle)}catch(e){m(e.message)}finally{u(!1)}}(0,G.useEffect)(()=>{h()},[]);async function g(){f(!0),m(``);try{let n=await t(`PATCH`,`/users/me`,{displayName:o});a(n),c(n.displayName||n.handle),await e()}catch(e){m(e.message)}finally{f(!1)}}async function v(t){if(t){f(!0),m(``);try{let n=await D(`/users/me/avatar`,t);a(n.user),c(n.user.displayName||n.user.handle),await e()}catch(e){m(e.message)}finally{f(!1),r.current&&(r.current.value=``)}}}async function y(){f(!0),m(``);try{a(await t(`DELETE`,`/users/me/avatar`)),await e()}catch(e){m(e.message)}finally{f(!1)}}return(0,q.jsx)(W,{size:`sm`,children:(0,q.jsxs)(U,{className:`space-y-4`,children:[p&&(0,q.jsxs)(`div`,{className:`flex items-start gap-2 rounded-md border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive`,children:[(0,q.jsx)(_,{className:`mt-0.5 size-4`}),(0,q.jsx)(`span`,{children:p})]}),(0,q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-4`,children:[(0,q.jsx)(ce,{user:i??void 0,distinct:!0,className:`size-16 text-lg`}),(0,q.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-2`,children:[(0,q.jsx)(`label`,{className:`block text-xs font-medium text-muted-foreground`,htmlFor:`profile-display-name`,children:`Display name`}),(0,q.jsx)(`input`,{id:`profile-display-name`,className:`h-9 w-full rounded-md border border-input bg-background px-3 text-sm`,value:o,onChange:e=>c(e.target.value),disabled:l||d,maxLength:120})]})]}),(0,q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,q.jsxs)(I,{size:`sm`,onClick:()=>void g(),disabled:l||d||!o.trim(),children:[(0,q.jsx)(n,{className:`size-4`}),`Save`]}),(0,q.jsxs)(I,{size:`sm`,variant:`outline`,onClick:()=>r.current?.click(),disabled:l||d,children:[(0,q.jsx)(T,{className:`size-4`}),`Upload`]}),(0,q.jsxs)(I,{size:`sm`,variant:`outline`,onClick:()=>void y(),disabled:l||d||!i?.avatarArtifactId,children:[(0,q.jsx)(x,{className:`size-4`}),`Remove`]}),d&&(0,q.jsx)(s,{className:`size-4 animate-pulse text-muted-foreground`}),(0,q.jsx)(`input`,{ref:r,type:`file`,accept:`image/png,image/jpeg,image/gif,image/webp`,className:`hidden`,onChange:e=>void v(e.target.files?.[0])})]})]})})}export{vt as SettingsView};
6
- //# sourceMappingURL=settings-BR30UpbJ.js.map