agent-relay-server 0.50.0 → 0.51.0

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 (91) hide show
  1. package/docs/openapi.json +42 -1
  2. package/package.json +2 -2
  3. package/public/assets/{PlanGraphPanel-BYgnvJZR.js → PlanGraphPanel-BnYmYHnY.js} +2 -2
  4. package/public/assets/{PlanGraphPanel-BYgnvJZR.js.map → PlanGraphPanel-BnYmYHnY.js.map} +1 -1
  5. package/public/assets/{activity-CCOlARUq.js → activity-Bt-j5suN.js} +2 -2
  6. package/public/assets/{activity-CCOlARUq.js.map → activity-Bt-j5suN.js.map} +1 -1
  7. package/public/assets/{agent-profiles-CGQq2EyX.js → agent-profiles-BhVEehP8.js} +2 -2
  8. package/public/assets/{agent-profiles-CGQq2EyX.js.map → agent-profiles-BhVEehP8.js.map} +1 -1
  9. package/public/assets/{agents-Cl9a1uBD.js → agents-MmlXjZ8S.js} +2 -2
  10. package/public/assets/{agents-Cl9a1uBD.js.map → agents-MmlXjZ8S.js.map} +1 -1
  11. package/public/assets/{analytics-DkABnOKb.js → analytics-dzycu7KU.js} +2 -2
  12. package/public/assets/{analytics-DkABnOKb.js.map → analytics-dzycu7KU.js.map} +1 -1
  13. package/public/assets/{automation-CS2V5WAh.js → automation-DKmzNNAm.js} +2 -2
  14. package/public/assets/{automation-CS2V5WAh.js.map → automation-DKmzNNAm.js.map} +1 -1
  15. package/public/assets/{branch-state-badge-DhTKagJn.js → branch-state-badge-Dp6Jk4LH.js} +2 -2
  16. package/public/assets/{branch-state-badge-DhTKagJn.js.map → branch-state-badge-Dp6Jk4LH.js.map} +1 -1
  17. package/public/assets/{channels-BcUZKNmr.js → channels-CmfUfiV0.js} +2 -2
  18. package/public/assets/{channels-BcUZKNmr.js.map → channels-CmfUfiV0.js.map} +1 -1
  19. package/public/assets/{chat-TFFCz8AI.js → chat-DKPT2jJj.js} +2 -2
  20. package/public/assets/{chat-TFFCz8AI.js.map → chat-DKPT2jJj.js.map} +1 -1
  21. package/public/assets/{connectors-Dd5gUsM2.js → connectors-Bf74bw_9.js} +2 -2
  22. package/public/assets/{connectors-Dd5gUsM2.js.map → connectors-Bf74bw_9.js.map} +1 -1
  23. package/public/assets/display-CXhnBwGf.js.map +1 -1
  24. package/public/assets/{formatted-body-impl-B_mZW3Vj.js → formatted-body-impl-Bzso46lB.js} +2 -2
  25. package/public/assets/{formatted-body-impl-B_mZW3Vj.js.map → formatted-body-impl-Bzso46lB.js.map} +1 -1
  26. package/public/assets/index-C0aWKi0g.css +2 -0
  27. package/public/assets/{index-CWs6iPpQ.js → index-uABGD_MX.js} +6 -6
  28. package/public/assets/{index-CWs6iPpQ.js.map → index-uABGD_MX.js.map} +1 -1
  29. package/public/assets/{insights-D5e1k0IU.js → insights-BczKqmA4.js} +2 -2
  30. package/public/assets/{insights-D5e1k0IU.js.map → insights-BczKqmA4.js.map} +1 -1
  31. package/public/assets/{integrations-DVdvwQaZ.js → integrations-By3hMfqC.js} +2 -2
  32. package/public/assets/{integrations-DVdvwQaZ.js.map → integrations-By3hMfqC.js.map} +1 -1
  33. package/public/assets/{maintenance-ChmWW3iQ.js → maintenance-A3dR4k8v.js} +2 -2
  34. package/public/assets/{maintenance-ChmWW3iQ.js.map → maintenance-A3dR4k8v.js.map} +1 -1
  35. package/public/assets/{managed-agents-C6cbTB9d.js → managed-agents-65TJRBdv.js} +2 -2
  36. package/public/assets/{managed-agents-C6cbTB9d.js.map → managed-agents-65TJRBdv.js.map} +1 -1
  37. package/public/assets/{markdown-preview-impl-DjmZIwx5.js → markdown-preview-impl-pevH3csB.js} +2 -2
  38. package/public/assets/{markdown-preview-impl-DjmZIwx5.js.map → markdown-preview-impl-pevH3csB.js.map} +1 -1
  39. package/public/assets/{memory-DYRuGhD9.js → memory-B3CXqWQf.js} +2 -2
  40. package/public/assets/{memory-DYRuGhD9.js.map → memory-B3CXqWQf.js.map} +1 -1
  41. package/public/assets/{messages-q5N9kJ4f.js → messages-BV48hQsO.js} +2 -2
  42. package/public/assets/{messages-q5N9kJ4f.js.map → messages-BV48hQsO.js.map} +1 -1
  43. package/public/assets/{orchestrators-bbIEU7xO.js → orchestrators-CPU7U-s7.js} +2 -2
  44. package/public/assets/{orchestrators-bbIEU7xO.js.map → orchestrators-CPU7U-s7.js.map} +1 -1
  45. package/public/assets/{overview-B3TxMRHV.js → overview-mR70u7ea.js} +2 -2
  46. package/public/assets/{overview-B3TxMRHV.js.map → overview-mR70u7ea.js.map} +1 -1
  47. package/public/assets/{pairs-CF3XEcbG.js → pairs-B8KJc296.js} +2 -2
  48. package/public/assets/{pairs-CF3XEcbG.js.map → pairs-B8KJc296.js.map} +1 -1
  49. package/public/assets/{security-Bffy1FyV.js → security-Dc74nqW8.js} +2 -2
  50. package/public/assets/{security-Bffy1FyV.js.map → security-Dc74nqW8.js.map} +1 -1
  51. package/public/assets/{select-Bz0VV6tj.js → select-kIw3Jm8E.js} +2 -2
  52. package/public/assets/{select-Bz0VV6tj.js.map → select-kIw3Jm8E.js.map} +1 -1
  53. package/public/assets/{settings-DUucPX58.js → settings-XrFz0Q3b.js} +2 -2
  54. package/public/assets/{settings-DUucPX58.js.map → settings-XrFz0Q3b.js.map} +1 -1
  55. package/public/assets/{store-C7dqPL_V.js → store-BLZA3u7Y.js} +2 -2
  56. package/public/assets/store-BLZA3u7Y.js.map +1 -0
  57. package/public/assets/{tasks-Dv1CeteT.js → tasks-TY2QGHHg.js} +2 -2
  58. package/public/assets/{tasks-Dv1CeteT.js.map → tasks-TY2QGHHg.js.map} +1 -1
  59. package/public/assets/teams-DMQN2gCU.js +2 -0
  60. package/public/assets/teams-DMQN2gCU.js.map +1 -0
  61. package/public/assets/{terminal-viewer-impl-DQEV3e7Z.js → terminal-viewer-impl-D3du9G9E.js} +2 -2
  62. package/public/assets/{terminal-viewer-impl-DQEV3e7Z.js.map → terminal-viewer-impl-D3du9G9E.js.map} +1 -1
  63. package/public/assets/{work-queue-9iUCo-hM.js → work-queue-B2nZp_vj.js} +2 -2
  64. package/public/assets/{work-queue-9iUCo-hM.js.map → work-queue-B2nZp_vj.js.map} +1 -1
  65. package/public/assets/{workspaces-B0zGEd0M.js → workspaces-PdCwiSQx.js} +2 -2
  66. package/public/assets/{workspaces-B0zGEd0M.js.map → workspaces-PdCwiSQx.js.map} +1 -1
  67. package/public/index.html +3 -3
  68. package/src/bus.ts +2 -2
  69. package/src/config-store.ts +8 -16
  70. package/src/db/agents.ts +6 -2
  71. package/src/db/mappers.ts +1 -0
  72. package/src/db/migrations.ts +5 -2
  73. package/src/db/plans.ts +11 -0
  74. package/src/db/schema.ts +1 -1
  75. package/src/db/teams.ts +120 -0
  76. package/src/index.ts +2 -0
  77. package/src/maintenance.ts +3 -3
  78. package/src/mcp-agent-action.ts +45 -0
  79. package/src/mcp.ts +8 -10
  80. package/src/routes/index.ts +2 -1
  81. package/src/routes/teams.ts +14 -2
  82. package/src/services/agent-action.ts +138 -0
  83. package/src/services/plan-graph.ts +49 -11
  84. package/src/services/plan-live-bindings.ts +88 -0
  85. package/src/services/spawn-agent.ts +5 -1
  86. package/src/services/transient-agent-reaper.ts +108 -0
  87. package/src/spawn-command.ts +2 -0
  88. package/public/assets/index-B8ND8v33.css +0 -2
  89. package/public/assets/store-C7dqPL_V.js.map +0 -1
  90. package/public/assets/teams-DEASyStU.js +0 -2
  91. package/public/assets/teams-DEASyStU.js.map +0 -1
@@ -1,2 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{J as t,M as n,Mn as r,Un as i,jn as a,kn as o,l as s,m as c}from"./lucide-react-ChOGD4vc.js";import{r as l,t as u}from"./store-C7dqPL_V.js";import{H as d,J as f,V as p,d as m,h}from"./display-CXhnBwGf.js";import{a as ee,i as te,n as ne,r as re,t as g}from"./select-Bz0VV6tj.js";import{t as _}from"./badge-BR4bvEsy.js";import{t as v}from"./button-BwqJZS4O.js";import{t as ie}from"./input-YoPXrp72.js";import{s as y}from"./index-CWs6iPpQ.js";import{i as b,n as x,r as S,t as C}from"./card-C7JtSyuM.js";import{t as w}from"./PlanGraphPanel-BYgnvJZR.js";var T=e(i(),1),E=a(),ae=[{value:`all`,label:`All kinds`},{value:`decision`,label:`Decisions`},{value:`fact`,label:`Facts`},{value:`ruled_out`,label:`Ruled out`}],oe={decision:`decision`,fact:`fact`,ruled_out:`ruled out`};function se(e){return e.status===`dissolved`?`dissolved`:e.zeroMembersSince==null?`active`:`orphaned`}var ce={active:`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`,orphaned:`bg-amber-500/10 text-amber-400 border-amber-500/20`,dissolved:`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`},le={success:`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`,partial:`bg-yellow-500/10 text-yellow-400 border-yellow-500/20`,failed:`bg-red-500/10 text-red-400 border-red-500/20`},ue={active:`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`,superseded:`bg-yellow-500/10 text-yellow-400 border-yellow-500/20`,retracted:`bg-red-500/10 text-red-400 border-red-500/20`};function D(e){return e?e.slice(0,12):`-`}function de(e){if(e===void 0)return`-`;let t=Math.round(e/1e3);if(t<60)return`${t}s`;let n=Math.round(t/60);if(n<60)return`${n}m`;let r=Math.round(n/60);return r<48?`${r}h`:`${Math.round(r/24)}d`}function fe(e){if(!e.composition)return null;try{let t=JSON.parse(e.composition);return Array.isArray(t)?t.length:null}catch{return null}}function pe(e,t){let n=t.trim().toLowerCase();return n?[e.title,e.id,e.coordinatorId,e.rootCoordinatorId,e.outcomeStatus,e.outcomeSummary].some(e=>String(e??``).toLowerCase().includes(n)):!0}function me(e){return e.status===`offline`?`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`:e.status===`busy`?`bg-yellow-500/10 text-yellow-400 border-yellow-500/20`:e.status===`stale`?`bg-red-500/10 text-red-400 border-red-500/20`:`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`}function O(){let[e,i]=(0,T.useState)(null),[a,O]=(0,T.useState)([]),[k,A]=(0,T.useState)(null),[j,he]=(0,T.useState)(`all`),[M,N]=(0,T.useState)(``),[P,F]=(0,T.useState)(!1),[I,L]=(0,T.useState)(!1),[R,z]=(0,T.useState)(null),[B,ge]=(0,T.useState)(()=>Date.now()),V=u(e=>e.teams),H=u(e=>e.teamsLoading),U=u(e=>e.teamsError),_e=u(e=>e.fetchTeams),W=u(e=>e.fetchPlan),ve=u(e=>e.dissolveTeam),ye=u(e=>e.openConfirm),G=u(e=>e.agentsById),be=u(e=>e.switchView),K=u(e=>e.openInboxThread),xe=u(t=>{let n=e??t.teams[0]?.id;return n?t.plansByTeam[l(n)]??null:null}),Se=e=>{let t=G[e];return t?m(t):e.slice(-8)};async function q(e,t=j){L(!0),z(null);try{let n=new URLSearchParams({team:e});t!==`all`&&n.set(`kind`,t),O((await r(`GET`,`/blackboard?${n.toString()}`)).entries),A(e)}catch(t){z(f(t)),O([]),A(e)}finally{L(!1)}}async function J(){F(!0),z(null);try{let t=await _e();ge(Date.now());let n=e??t[0]?.id;n?(W({teamId:n}),await q(n,j)):(O([]),A(null))}catch(e){z(f(e))}finally{F(!1)}}(0,T.useEffect)(()=>{J()},[]),(0,T.useEffect)(()=>{k&&q(k,j)},[j]);let Y=(0,T.useMemo)(()=>V.filter(e=>pe(e,M)),[V,M]),X=e??V[0]?.id??null,Z=V.find(e=>e.id===X)??null,Q=k===X?a:[],$=(0,T.useMemo)(()=>X?Object.values(G).filter(e=>e.teamId===X).sort((e,t)=>m(e).localeCompare(m(t))||e.id.localeCompare(t.id)):[],[G,X]),Ce=(0,T.useMemo)(()=>{let e={decision:[],fact:[],ruled_out:[]};for(let t of Q)e[t.kind].push(t);return e},[Q]),we=j===`all`?[`decision`,`fact`,`ruled_out`]:[j];return(0,E.jsxs)(`div`,{className:`space-y-4 p-4`,children:[(0,E.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,E.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,E.jsx)(s,{className:`size-5 text-primary`}),(0,E.jsx)(`h1`,{className:`text-lg font-semibold`,children:`Teams`}),(0,E.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`active and dissolved team working sets`})]}),(0,E.jsxs)(v,{variant:`outline`,size:`sm`,onClick:()=>void J(),disabled:P||H,children:[(0,E.jsx)(n,{className:o(`size-4`,(P||H)&&`animate-spin`)}),` Refresh`]})]}),(R||U)&&(0,E.jsx)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive`,children:R||U}),(0,E.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[minmax(320px,420px)_1fr]`,children:[(0,E.jsxs)(`div`,{className:`min-h-[520px] min-w-0 space-y-3`,children:[(0,E.jsxs)(`div`,{className:`space-y-3`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,E.jsx)(`span`,{children:`Team list`}),(0,E.jsx)(_,{variant:`secondary`,children:V.length})]}),(0,E.jsx)(ie,{value:M,onChange:e=>N(e.target.value),placeholder:`Filter teams`,className:`h-8`})]}),(0,E.jsx)(`div`,{children:(P||H)&&V.length===0?(0,E.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:`Loading teams…`}):Y.length===0?(0,E.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:V.length===0?`No teams`:`No teams match`}):(0,E.jsx)(y,{className:`h-[610px] pr-3`,children:(0,E.jsx)(`div`,{className:`space-y-2`,children:Y.map(e=>{let n=e.id===X,r=fe(e),a=se(e),s=e.coordinatorId,c=()=>{i(e.id),W({teamId:e.id}),q(e.id,j)};return(0,E.jsx)(`div`,{role:`button`,tabIndex:0,onClick:c,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),c())},className:`block w-full cursor-pointer text-left`,children:(0,E.jsx)(C,{className:o(`transition-colors hover:border-primary/50`,n&&`border-primary/60 bg-primary/5`),children:(0,E.jsxs)(x,{className:`space-y-3 p-3`,children:[(0,E.jsxs)(`div`,{className:`flex items-start justify-between gap-2`,children:[(0,E.jsxs)(`div`,{className:`min-w-0`,children:[(0,E.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.title||D(e.id)}),(0,E.jsx)(`div`,{className:`truncate text-xs text-muted-foreground`,children:e.id})]}),(0,E.jsx)(_,{variant:`outline`,className:ce[a],children:a})]}),(0,E.jsxs)(`div`,{className:`grid grid-cols-2 gap-x-3 gap-y-1 text-xs text-muted-foreground`,children:[(0,E.jsx)(`span`,{children:`Coordinator`}),s?(0,E.jsxs)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),K(s),be(`chat`)},className:`flex min-w-0 items-center justify-end gap-1 text-right text-primary hover:underline`,title:`Chat with ${s}`,children:[(0,E.jsx)(t,{className:`size-3 shrink-0`}),(0,E.jsx)(`span`,{className:`truncate`,children:Se(s)})]}):(0,E.jsx)(`span`,{className:`text-right text-muted-foreground`,children:`—`}),(0,E.jsx)(`span`,{children:`Members`}),(0,E.jsx)(`span`,{className:`text-right text-foreground`,children:r??`-`}),(0,E.jsx)(`span`,{children:`Created`}),(0,E.jsx)(`span`,{className:`text-right text-foreground`,title:h(e.createdAt),children:d(B,e.createdAt)}),e.dissolvedAt?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(`span`,{children:`Dissolved`}),(0,E.jsx)(`span`,{className:`text-right text-foreground`,title:h(e.dissolvedAt),children:d(B,e.dissolvedAt)})]}):null]}),a===`orphaned`&&e.zeroMembersSince!=null?(0,E.jsx)(`div`,{className:`flex items-center gap-1.5 border-t border-border pt-2 text-xs text-amber-400`,title:h(e.zeroMembersSince),children:(0,E.jsxs)(`span`,{children:[`No live members since `,d(B,e.zeroMembersSince),` — auto-dissolving`]})}):null,e.status===`dissolved`?(0,E.jsxs)(`div`,{className:`space-y-1 border-t border-border pt-2`,children:[(0,E.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[e.outcomeStatus?(0,E.jsx)(_,{variant:`outline`,className:le[e.outcomeStatus],children:e.outcomeStatus}):(0,E.jsx)(_,{variant:`outline`,children:`no outcome`}),(0,E.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:de(e.wallClockMs)})]}),e.outcomeSummary?(0,E.jsx)(`p`,{className:`line-clamp-2 text-xs text-muted-foreground`,children:e.outcomeSummary}):null]}):null]})})},e.id)})})})})]}),(0,E.jsxs)(`div`,{className:`min-h-[520px] min-w-0 space-y-4`,children:[Z&&xe?(0,E.jsx)(C,{className:`p-0`,children:(0,E.jsx)(w,{teamId:Z.id})}):null,(0,E.jsxs)(C,{children:[(0,E.jsx)(S,{children:(0,E.jsxs)(b,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,E.jsxs)(`div`,{className:`min-w-0`,children:[(0,E.jsx)(`span`,{children:`Roster`}),(0,E.jsxs)(`span`,{className:`ml-2 text-xs font-normal text-muted-foreground`,children:[$.length,` member`,$.length===1?``:`s`]})]}),Z&&Z.status!==`dissolved`?(0,E.jsxs)(v,{variant:`destructive`,size:`sm`,onClick:()=>ye(`Dissolve Team`,`Dissolve "${Z.title||Z.id}"? This closes the team working set but keeps its records visible.`,()=>void ve(Z.id)),children:[(0,E.jsx)(c,{className:`size-4`}),` Dissolve`]}):null]})}),(0,E.jsx)(x,{children:Z?$.length===0?(0,E.jsx)(`div`,{className:`py-8 text-center text-sm text-muted-foreground`,children:`No members`}):(0,E.jsx)(`div`,{className:`grid gap-2 md:grid-cols-2`,children:$.map(e=>(0,E.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3 rounded-md border border-border bg-background px-3 py-2`,children:[(0,E.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,E.jsx)(`span`,{className:o(`h-2 w-2 shrink-0 rounded-full`,p(e,B))}),(0,E.jsxs)(`div`,{className:`min-w-0`,children:[(0,E.jsx)(`div`,{className:`truncate text-sm font-medium`,children:m(e)}),(0,E.jsx)(`div`,{className:`truncate text-xs text-muted-foreground`,children:e.id})]})]}),(0,E.jsx)(_,{variant:`outline`,className:me(e),children:e.status})]},e.id))}):(0,E.jsx)(`div`,{className:`py-8 text-center text-sm text-muted-foreground`,children:`No team selected`})})]}),(0,E.jsxs)(C,{children:[(0,E.jsx)(S,{children:(0,E.jsxs)(b,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,E.jsxs)(`div`,{className:`min-w-0`,children:[(0,E.jsx)(`span`,{children:`Blackboard`}),Z?(0,E.jsx)(`span`,{className:`ml-2 text-xs font-normal text-muted-foreground`,children:Z.title||Z.id}):null]}),(0,E.jsxs)(g,{value:j,onValueChange:e=>he(e),children:[(0,E.jsx)(te,{size:`sm`,className:`w-36`,children:(0,E.jsx)(ee,{})}),(0,E.jsx)(ne,{children:ae.map(e=>(0,E.jsx)(re,{value:e.value,children:e.label},e.value))})]})]})}),(0,E.jsx)(x,{children:Z?I&&Q.length===0?(0,E.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:`Loading blackboard…`}):Q.length===0?(0,E.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:`No blackboard entries`}):(0,E.jsx)(y,{className:`h-[640px] pr-3`,children:(0,E.jsx)(`div`,{className:`space-y-5`,children:we.map(e=>{let t=Ce[e];return t.length===0?null:(0,E.jsxs)(`section`,{className:`space-y-2`,children:[(0,E.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,E.jsx)(_,{variant:`secondary`,children:oe[e]}),(0,E.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:t.length})]}),(0,E.jsx)(`div`,{className:`space-y-2`,children:t.map(e=>(0,E.jsxs)(`div`,{className:`space-y-3 rounded-md border border-border bg-background p-3`,children:[(0,E.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-2`,children:[(0,E.jsxs)(`div`,{className:`min-w-0`,children:[(0,E.jsx)(`div`,{className:`text-sm font-medium`,children:e.title}),(0,E.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[`by `,D(e.authorId),` · `,d(B,e.updatedAt||e.createdAt)]})]}),(0,E.jsxs)(`div`,{className:`flex flex-wrap justify-end gap-1`,children:[(0,E.jsx)(_,{variant:`outline`,className:ue[e.status],children:e.status}),e.supersedes?(0,E.jsxs)(_,{variant:`outline`,children:[`supersedes `,D(e.supersedes)]}):null]})]}),e.body?(0,E.jsx)(`p`,{className:`whitespace-pre-wrap text-sm text-muted-foreground`,children:e.body}):null]},e.id))})]},e)})})}):(0,E.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:`No team selected`})})]})]})]})]})}export{O as TeamsView};
2
- //# sourceMappingURL=teams-DEASyStU.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"teams-DEASyStU.js","names":[],"sources":["../../dashboard/src/components/views/teams.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react'\nimport { errMessage } from 'agent-relay-sdk/types'\nimport { MessageSquare, RefreshCw, Trash2, Users } from 'lucide-react'\nimport { api } from '@/lib/api'\nimport { useRelayStore } from '@/store'\nimport { cn } from '@/lib/utils'\nimport { displayName, fmtTime, statusDotColor, timeAgo } from '@/lib/display'\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 { ScrollArea } from '@/components/ui/scroll-area'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'\nimport { PlanGraphPanel } from '@/components/chat/PlanGraphPanel'\nimport { planTeamLookupKey } from '@/store/slices/plans'\nimport type { Agent, BlackboardEntry, BlackboardEntryKind, BlackboardEntryStatus, Team } from '@/types'\n\ninterface BlackboardResponse {\n entries: BlackboardEntry[]\n}\n\ntype KindFilter = 'all' | BlackboardEntryKind\n\nconst KIND_OPTIONS: Array<{ value: KindFilter; label: string }> = [\n { value: 'all', label: 'All kinds' },\n { value: 'decision', label: 'Decisions' },\n { value: 'fact', label: 'Facts' },\n { value: 'ruled_out', label: 'Ruled out' },\n]\n\nconst KIND_LABEL: Record<BlackboardEntryKind, string> = {\n decision: 'decision',\n fact: 'fact',\n ruled_out: 'ruled out',\n}\n\n// (status badge colors are derived via DISPLAY_STATE_CLASS below, not a raw status map.)\n// Display state is derived, not stored: a team row stays status='active' while orphaned —\n// zeroMembersSince being set means the #398 reaper has flagged it (zero live members) and is\n// counting down to auto-dissolve. Surface that as a distinct state so \"active\" means truly live.\ntype TeamDisplayState = 'active' | 'orphaned' | 'dissolved'\n\nfunction teamDisplayState(team: Team): TeamDisplayState {\n if (team.status === 'dissolved') return 'dissolved'\n if (team.zeroMembersSince != null) return 'orphaned'\n return 'active'\n}\n\nconst DISPLAY_STATE_CLASS: Record<TeamDisplayState, string> = {\n active: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20',\n orphaned: 'bg-amber-500/10 text-amber-400 border-amber-500/20',\n dissolved: 'bg-zinc-500/10 text-zinc-400 border-zinc-500/20',\n}\n\nconst OUTCOME_STATUS_CLASS: Record<NonNullable<Team['outcomeStatus']>, string> = {\n success: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20',\n partial: 'bg-yellow-500/10 text-yellow-400 border-yellow-500/20',\n failed: 'bg-red-500/10 text-red-400 border-red-500/20',\n}\n\nconst ENTRY_STATUS_CLASS: Record<BlackboardEntryStatus, string> = {\n active: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20',\n superseded: 'bg-yellow-500/10 text-yellow-400 border-yellow-500/20',\n retracted: 'bg-red-500/10 text-red-400 border-red-500/20',\n}\n\nfunction shortId(id: string | undefined): string {\n return id ? id.slice(0, 12) : '-'\n}\n\nfunction duration(ms: number | undefined): string {\n if (ms === undefined) return '-'\n const seconds = Math.round(ms / 1000)\n if (seconds < 60) return `${seconds}s`\n const minutes = Math.round(seconds / 60)\n if (minutes < 60) return `${minutes}m`\n const hours = Math.round(minutes / 60)\n if (hours < 48) return `${hours}h`\n return `${Math.round(hours / 24)}d`\n}\n\nfunction compositionCount(team: Team): number | null {\n if (!team.composition) return null\n try {\n const parsed = JSON.parse(team.composition) as unknown\n return Array.isArray(parsed) ? parsed.length : null\n } catch {\n return null\n }\n}\n\nfunction matchesTeamFilter(team: Team, filter: string): boolean {\n const q = filter.trim().toLowerCase()\n if (!q) return true\n return [\n team.title,\n team.id,\n team.coordinatorId,\n team.rootCoordinatorId,\n team.outcomeStatus,\n team.outcomeSummary,\n ].some((value) => String(value ?? '').toLowerCase().includes(q))\n}\n\nfunction agentStatusClass(agent: Agent): string {\n if (agent.status === 'offline') return 'bg-zinc-500/10 text-zinc-400 border-zinc-500/20'\n if (agent.status === 'busy') return 'bg-yellow-500/10 text-yellow-400 border-yellow-500/20'\n if (agent.status === 'stale') return 'bg-red-500/10 text-red-400 border-red-500/20'\n return 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20'\n}\n\nexport function TeamsView() {\n const [selectedTeamId, setSelectedTeamId] = useState<string | null>(null)\n const [entries, setEntries] = useState<BlackboardEntry[]>([])\n const [entriesTeamId, setEntriesTeamId] = useState<string | null>(null)\n const [kindFilter, setKindFilter] = useState<KindFilter>('all')\n const [teamFilter, setTeamFilter] = useState('')\n const [refreshing, setRefreshing] = useState(false)\n const [entriesLoading, setEntriesLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [now, setNow] = useState(() => Date.now())\n const teams = useRelayStore((s) => s.teams)\n const teamsLoading = useRelayStore((s) => s.teamsLoading)\n const teamsError = useRelayStore((s) => s.teamsError)\n const fetchTeams = useRelayStore((s) => s.fetchTeams)\n const fetchPlan = useRelayStore((s) => s.fetchPlan)\n const dissolveTeam = useRelayStore((s) => s.dissolveTeam)\n const openConfirm = useRelayStore((s) => s.openConfirm)\n const agentsById = useRelayStore((s) => s.agentsById)\n const switchView = useRelayStore((s) => s.switchView)\n const openInboxThread = useRelayStore((s) => s.openInboxThread)\n // Read the selected team's plan from the store so the drill-in can gate the\n // plan card on its existence (no empty card for plan-less teams). teams.tsx\n // owns the fetch below; PlanGraphPanel then renders it from the store.\n const teamPlan = useRelayStore((s) => {\n const id = selectedTeamId ?? s.teams[0]?.id\n return id ? s.plansByTeam[planTeamLookupKey(id)] ?? null : null\n })\n const coordinatorLabel = (id: string): string => {\n const agent = agentsById[id]\n return agent ? displayName(agent) : id.slice(-8)\n }\n\n async function loadEntries(teamId: string, nextKind: KindFilter = kindFilter) {\n setEntriesLoading(true)\n setError(null)\n try {\n const params = new URLSearchParams({ team: teamId })\n if (nextKind !== 'all') params.set('kind', nextKind)\n const payload = await api<BlackboardResponse>('GET', `/blackboard?${params.toString()}`)\n setEntries(payload.entries)\n setEntriesTeamId(teamId)\n } catch (e) {\n setError(errMessage(e))\n setEntries([])\n setEntriesTeamId(teamId)\n } finally {\n setEntriesLoading(false)\n }\n }\n\n async function refresh() {\n setRefreshing(true)\n setError(null)\n try {\n const nextTeams = await fetchTeams()\n setNow(Date.now())\n const displayedTeamId = selectedTeamId ?? nextTeams[0]?.id\n if (displayedTeamId) {\n void fetchPlan({ teamId: displayedTeamId })\n await loadEntries(displayedTeamId, kindFilter)\n } else {\n setEntries([])\n setEntriesTeamId(null)\n }\n } catch (e) {\n setError(errMessage(e))\n } finally {\n setRefreshing(false)\n }\n }\n\n // Mount: synchronize this local view with Relay's persisted team list.\n useEffect(() => {\n void refresh()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // Filter change: re-query the currently loaded blackboard working set.\n useEffect(() => {\n if (entriesTeamId) void loadEntries(entriesTeamId, kindFilter)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [kindFilter])\n\n const visibleTeams = useMemo(() => teams.filter((team) => matchesTeamFilter(team, teamFilter)), [teams, teamFilter])\n const displayedTeamId = selectedTeamId ?? teams[0]?.id ?? null\n const displayedTeam = teams.find((team) => team.id === displayedTeamId) ?? null\n const displayedEntries = entriesTeamId === displayedTeamId ? entries : []\n const teamRoster = useMemo(() => {\n if (!displayedTeamId) return []\n return Object.values(agentsById)\n .filter((agent) => agent.teamId === displayedTeamId)\n .sort((a, b) => displayName(a).localeCompare(displayName(b)) || a.id.localeCompare(b.id))\n }, [agentsById, displayedTeamId])\n\n const groupedEntries = useMemo(() => {\n const groups: Record<BlackboardEntryKind, BlackboardEntry[]> = { decision: [], fact: [], ruled_out: [] }\n for (const entry of displayedEntries) groups[entry.kind].push(entry)\n return groups\n }, [displayedEntries])\n\n const entryKinds = kindFilter === 'all'\n ? (['decision', 'fact', 'ruled_out'] as const)\n : ([kindFilter] as const)\n\n return (\n <div className=\"space-y-4 p-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n <Users className=\"size-5 text-primary\" />\n <h1 className=\"text-lg font-semibold\">Teams</h1>\n <span className=\"text-xs text-muted-foreground\">active and dissolved team working sets</span>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={() => void refresh()} disabled={refreshing || teamsLoading}>\n <RefreshCw className={cn('size-4', (refreshing || teamsLoading) && 'animate-spin')} /> Refresh\n </Button>\n </div>\n\n {(error || teamsError) && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive\">{error || teamsError}</div>\n )}\n\n <div className=\"grid gap-4 xl:grid-cols-[minmax(320px,420px)_1fr]\">\n <div className=\"min-h-[520px] min-w-0 space-y-3\">\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <span>Team list</span>\n <Badge variant=\"secondary\">{teams.length}</Badge>\n </div>\n <Input\n value={teamFilter}\n onChange={(e) => setTeamFilter(e.target.value)}\n placeholder=\"Filter teams\"\n className=\"h-8\"\n />\n </div>\n <div>\n {(refreshing || teamsLoading) && teams.length === 0 ? (\n <div className=\"py-16 text-center text-sm text-muted-foreground\">Loading teams…</div>\n ) : visibleTeams.length === 0 ? (\n <div className=\"py-16 text-center text-sm text-muted-foreground\">{teams.length === 0 ? 'No teams' : 'No teams match'}</div>\n ) : (\n <ScrollArea className=\"h-[610px] pr-3\">\n <div className=\"space-y-2\">\n {visibleTeams.map((team) => {\n const selected = team.id === displayedTeamId\n const members = compositionCount(team)\n const state = teamDisplayState(team)\n const coordId = team.coordinatorId\n const selectTeam = () => {\n setSelectedTeamId(team.id)\n void fetchPlan({ teamId: team.id })\n void loadEntries(team.id, kindFilter)\n }\n return (\n // Clickable card, not a <button>: it nests an interactive \"chat with\n // coordinator\" link, and button-in-button is invalid HTML.\n <div\n key={team.id}\n role=\"button\"\n tabIndex={0}\n onClick={selectTeam}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); selectTeam() } }}\n className=\"block w-full cursor-pointer text-left\"\n >\n <Card className={cn('transition-colors hover:border-primary/50', selected && 'border-primary/60 bg-primary/5')}>\n <CardContent className=\"space-y-3 p-3\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">{team.title || shortId(team.id)}</div>\n <div className=\"truncate text-xs text-muted-foreground\">{team.id}</div>\n </div>\n <Badge variant=\"outline\" className={DISPLAY_STATE_CLASS[state]}>{state}</Badge>\n </div>\n <div className=\"grid grid-cols-2 gap-x-3 gap-y-1 text-xs text-muted-foreground\">\n <span>Coordinator</span>\n {coordId ? (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); openInboxThread(coordId); switchView('chat') }}\n className=\"flex min-w-0 items-center justify-end gap-1 text-right text-primary hover:underline\"\n title={`Chat with ${coordId}`}\n >\n <MessageSquare className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{coordinatorLabel(coordId)}</span>\n </button>\n ) : (\n <span className=\"text-right text-muted-foreground\">—</span>\n )}\n <span>Members</span>\n <span className=\"text-right text-foreground\">{members ?? '-'}</span>\n <span>Created</span>\n <span className=\"text-right text-foreground\" title={fmtTime(team.createdAt)}>{timeAgo(now, team.createdAt)}</span>\n {team.dissolvedAt ? (\n <>\n <span>Dissolved</span>\n <span className=\"text-right text-foreground\" title={fmtTime(team.dissolvedAt)}>{timeAgo(now, team.dissolvedAt)}</span>\n </>\n ) : null}\n </div>\n {state === 'orphaned' && team.zeroMembersSince != null ? (\n <div className=\"flex items-center gap-1.5 border-t border-border pt-2 text-xs text-amber-400\" title={fmtTime(team.zeroMembersSince)}>\n <span>No live members since {timeAgo(now, team.zeroMembersSince)} — auto-dissolving</span>\n </div>\n ) : null}\n {team.status === 'dissolved' ? (\n <div className=\"space-y-1 border-t border-border pt-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {team.outcomeStatus ? (\n <Badge variant=\"outline\" className={OUTCOME_STATUS_CLASS[team.outcomeStatus]}>{team.outcomeStatus}</Badge>\n ) : (\n <Badge variant=\"outline\">no outcome</Badge>\n )}\n <span className=\"text-xs text-muted-foreground\">{duration(team.wallClockMs)}</span>\n </div>\n {team.outcomeSummary ? <p className=\"line-clamp-2 text-xs text-muted-foreground\">{team.outcomeSummary}</p> : null}\n </div>\n ) : null}\n </CardContent>\n </Card>\n </div>\n )\n })}\n </div>\n </ScrollArea>\n )}\n </div>\n </div>\n\n <div className=\"min-h-[520px] min-w-0 space-y-4\">\n {displayedTeam && teamPlan ? (\n // Wrap the chat-style plan overlay in a Card so it reads as a peer of\n // the Roster/Blackboard cards (rounded + solid bg + ring) instead of a\n // flat translucent strip. Gated on teamPlan so plan-less teams show no\n // empty card. p-0 lets the panel's own px-3 py-2 govern its padding.\n <Card className=\"p-0\">\n <PlanGraphPanel teamId={displayedTeam.id} />\n </Card>\n ) : null}\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <span>Roster</span>\n <span className=\"ml-2 text-xs font-normal text-muted-foreground\">{teamRoster.length} member{teamRoster.length === 1 ? '' : 's'}</span>\n </div>\n {displayedTeam && displayedTeam.status !== 'dissolved' ? (\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => openConfirm(\n 'Dissolve Team',\n `Dissolve \"${displayedTeam.title || displayedTeam.id}\"? This closes the team working set but keeps its records visible.`,\n () => void dissolveTeam(displayedTeam.id),\n )}\n >\n <Trash2 className=\"size-4\" /> Dissolve\n </Button>\n ) : null}\n </CardTitle>\n </CardHeader>\n <CardContent>\n {!displayedTeam ? (\n <div className=\"py-8 text-center text-sm text-muted-foreground\">No team selected</div>\n ) : teamRoster.length === 0 ? (\n <div className=\"py-8 text-center text-sm text-muted-foreground\">No members</div>\n ) : (\n <div className=\"grid gap-2 md:grid-cols-2\">\n {teamRoster.map((agent) => (\n <div key={agent.id} className=\"flex min-w-0 items-center justify-between gap-3 rounded-md border border-border bg-background px-3 py-2\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className={cn('h-2 w-2 shrink-0 rounded-full', statusDotColor(agent, now))} />\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">{displayName(agent)}</div>\n <div className=\"truncate text-xs text-muted-foreground\">{agent.id}</div>\n </div>\n </div>\n <Badge variant=\"outline\" className={agentStatusClass(agent)}>{agent.status}</Badge>\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <span>Blackboard</span>\n {displayedTeam ? (\n <span className=\"ml-2 text-xs font-normal text-muted-foreground\">{displayedTeam.title || displayedTeam.id}</span>\n ) : null}\n </div>\n <Select value={kindFilter} onValueChange={(value) => setKindFilter(value as KindFilter)}>\n <SelectTrigger size=\"sm\" className=\"w-36\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {KIND_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>{option.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </CardTitle>\n </CardHeader>\n <CardContent>\n {!displayedTeam ? (\n <div className=\"py-16 text-center text-sm text-muted-foreground\">No team selected</div>\n ) : entriesLoading && displayedEntries.length === 0 ? (\n <div className=\"py-16 text-center text-sm text-muted-foreground\">Loading blackboard…</div>\n ) : displayedEntries.length === 0 ? (\n <div className=\"py-16 text-center text-sm text-muted-foreground\">No blackboard entries</div>\n ) : (\n <ScrollArea className=\"h-[640px] pr-3\">\n <div className=\"space-y-5\">\n {entryKinds.map((kind) => {\n const kindEntries = groupedEntries[kind]\n if (kindEntries.length === 0) return null\n return (\n <section key={kind} className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"secondary\">{KIND_LABEL[kind]}</Badge>\n <span className=\"text-xs text-muted-foreground\">{kindEntries.length}</span>\n </div>\n <div className=\"space-y-2\">\n {kindEntries.map((entry) => (\n <div key={entry.id} className=\"space-y-3 rounded-md border border-border bg-background p-3\">\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"text-sm font-medium\">{entry.title}</div>\n <div className=\"text-xs text-muted-foreground\">\n by {shortId(entry.authorId)} · {timeAgo(now, entry.updatedAt || entry.createdAt)}\n </div>\n </div>\n <div className=\"flex flex-wrap justify-end gap-1\">\n <Badge variant=\"outline\" className={ENTRY_STATUS_CLASS[entry.status]}>{entry.status}</Badge>\n {entry.supersedes ? <Badge variant=\"outline\">supersedes {shortId(entry.supersedes)}</Badge> : null}\n </div>\n </div>\n {entry.body ? <p className=\"whitespace-pre-wrap text-sm text-muted-foreground\">{entry.body}</p> : null}\n </div>\n ))}\n </div>\n </section>\n )\n })}\n </div>\n </ScrollArea>\n )}\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n )\n}\n"],"mappings":"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"}