agent-relay-server 0.49.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.
- package/docs/openapi.json +42 -1
- package/package.json +2 -2
- package/public/assets/PlanGraphPanel-BnYmYHnY.js +2 -0
- package/public/assets/PlanGraphPanel-BnYmYHnY.js.map +1 -0
- package/public/assets/{activity--wk4dICK.js → activity-Bt-j5suN.js} +2 -2
- package/public/assets/{activity--wk4dICK.js.map → activity-Bt-j5suN.js.map} +1 -1
- package/public/assets/{agent-profiles-D_GQ78i3.js → agent-profiles-BhVEehP8.js} +2 -2
- package/public/assets/{agent-profiles-D_GQ78i3.js.map → agent-profiles-BhVEehP8.js.map} +1 -1
- package/public/assets/{agents-CrGzl-aX.js → agents-MmlXjZ8S.js} +2 -2
- package/public/assets/{agents-CrGzl-aX.js.map → agents-MmlXjZ8S.js.map} +1 -1
- package/public/assets/{analytics-CvZ_3LoL.js → analytics-dzycu7KU.js} +2 -2
- package/public/assets/{analytics-CvZ_3LoL.js.map → analytics-dzycu7KU.js.map} +1 -1
- package/public/assets/{automation-D-p56w9w.js → automation-DKmzNNAm.js} +2 -2
- package/public/assets/{automation-D-p56w9w.js.map → automation-DKmzNNAm.js.map} +1 -1
- package/public/assets/{branch-state-badge-B8h3vcwK.js → branch-state-badge-Dp6Jk4LH.js} +2 -2
- package/public/assets/{branch-state-badge-B8h3vcwK.js.map → branch-state-badge-Dp6Jk4LH.js.map} +1 -1
- package/public/assets/{channels-K5yks-NP.js → channels-CmfUfiV0.js} +2 -2
- package/public/assets/{channels-K5yks-NP.js.map → channels-CmfUfiV0.js.map} +1 -1
- package/public/assets/chat-DKPT2jJj.js +2 -0
- package/public/assets/chat-DKPT2jJj.js.map +1 -0
- package/public/assets/{connectors-fy5L_B2T.js → connectors-Bf74bw_9.js} +2 -2
- package/public/assets/{connectors-fy5L_B2T.js.map → connectors-Bf74bw_9.js.map} +1 -1
- package/public/assets/display-CXhnBwGf.js.map +1 -1
- package/public/assets/{formatted-body-impl-BRKtV_Ec.js → formatted-body-impl-Bzso46lB.js} +2 -2
- package/public/assets/{formatted-body-impl-BRKtV_Ec.js.map → formatted-body-impl-Bzso46lB.js.map} +1 -1
- package/public/assets/index-C0aWKi0g.css +2 -0
- package/public/assets/{index-C6HByEQl.js → index-uABGD_MX.js} +6 -6
- package/public/assets/{index-C6HByEQl.js.map → index-uABGD_MX.js.map} +1 -1
- package/public/assets/{insights-DFs8q-45.js → insights-BczKqmA4.js} +2 -2
- package/public/assets/{insights-DFs8q-45.js.map → insights-BczKqmA4.js.map} +1 -1
- package/public/assets/{integrations-Bg_JSXvm.js → integrations-By3hMfqC.js} +2 -2
- package/public/assets/{integrations-Bg_JSXvm.js.map → integrations-By3hMfqC.js.map} +1 -1
- package/public/assets/{maintenance-DHZOmgPn.js → maintenance-A3dR4k8v.js} +2 -2
- package/public/assets/{maintenance-DHZOmgPn.js.map → maintenance-A3dR4k8v.js.map} +1 -1
- package/public/assets/{managed-agents-DmSyKkG1.js → managed-agents-65TJRBdv.js} +2 -2
- package/public/assets/{managed-agents-DmSyKkG1.js.map → managed-agents-65TJRBdv.js.map} +1 -1
- package/public/assets/{markdown-preview-impl-C1D7h9Rg.js → markdown-preview-impl-pevH3csB.js} +2 -2
- package/public/assets/{markdown-preview-impl-C1D7h9Rg.js.map → markdown-preview-impl-pevH3csB.js.map} +1 -1
- package/public/assets/{memory-p2-2Ondq.js → memory-B3CXqWQf.js} +2 -2
- package/public/assets/{memory-p2-2Ondq.js.map → memory-B3CXqWQf.js.map} +1 -1
- package/public/assets/{messages-vytFTjcd.js → messages-BV48hQsO.js} +2 -2
- package/public/assets/{messages-vytFTjcd.js.map → messages-BV48hQsO.js.map} +1 -1
- package/public/assets/{orchestrators-CQNQYFnL.js → orchestrators-CPU7U-s7.js} +2 -2
- package/public/assets/{orchestrators-CQNQYFnL.js.map → orchestrators-CPU7U-s7.js.map} +1 -1
- package/public/assets/{overview-CurMUxSA.js → overview-mR70u7ea.js} +2 -2
- package/public/assets/{overview-CurMUxSA.js.map → overview-mR70u7ea.js.map} +1 -1
- package/public/assets/{pairs-CSga0gZ4.js → pairs-B8KJc296.js} +2 -2
- package/public/assets/{pairs-CSga0gZ4.js.map → pairs-B8KJc296.js.map} +1 -1
- package/public/assets/{security-BFmvd8TS.js → security-Dc74nqW8.js} +2 -2
- package/public/assets/{security-BFmvd8TS.js.map → security-Dc74nqW8.js.map} +1 -1
- package/public/assets/{select-U0nqw_nv.js → select-kIw3Jm8E.js} +2 -2
- package/public/assets/{select-U0nqw_nv.js.map → select-kIw3Jm8E.js.map} +1 -1
- package/public/assets/{settings-D_1nlrGB.js → settings-XrFz0Q3b.js} +2 -2
- package/public/assets/{settings-D_1nlrGB.js.map → settings-XrFz0Q3b.js.map} +1 -1
- package/public/assets/store-BLZA3u7Y.js +9 -0
- package/public/assets/store-BLZA3u7Y.js.map +1 -0
- package/public/assets/{tasks-TnEbfohb.js → tasks-TY2QGHHg.js} +2 -2
- package/public/assets/{tasks-TnEbfohb.js.map → tasks-TY2QGHHg.js.map} +1 -1
- package/public/assets/teams-DMQN2gCU.js +2 -0
- package/public/assets/teams-DMQN2gCU.js.map +1 -0
- package/public/assets/{terminal-viewer-impl-DwuhfM71.js → terminal-viewer-impl-D3du9G9E.js} +2 -2
- package/public/assets/{terminal-viewer-impl-DwuhfM71.js.map → terminal-viewer-impl-D3du9G9E.js.map} +1 -1
- package/public/assets/{work-queue-D1iqCla1.js → work-queue-B2nZp_vj.js} +2 -2
- package/public/assets/{work-queue-D1iqCla1.js.map → work-queue-B2nZp_vj.js.map} +1 -1
- package/public/assets/{workspaces-BRVqBWat.js → workspaces-PdCwiSQx.js} +2 -2
- package/public/assets/{workspaces-BRVqBWat.js.map → workspaces-PdCwiSQx.js.map} +1 -1
- package/public/index.html +3 -3
- package/src/bus.ts +2 -2
- package/src/config-store.ts +8 -16
- package/src/db/agents.ts +6 -2
- package/src/db/mappers.ts +1 -0
- package/src/db/migrations.ts +5 -2
- package/src/db/plans.ts +11 -0
- package/src/db/schema.ts +1 -1
- package/src/db/teams.ts +120 -0
- package/src/index.ts +2 -0
- package/src/maintenance.ts +3 -3
- package/src/mcp-agent-action.ts +45 -0
- package/src/mcp.ts +8 -10
- package/src/routes/index.ts +2 -1
- package/src/routes/teams.ts +14 -2
- package/src/services/agent-action.ts +138 -0
- package/src/services/plan-graph.ts +49 -11
- package/src/services/plan-live-bindings.ts +88 -0
- package/src/services/spawn-agent.ts +5 -1
- package/src/services/transient-agent-reaper.ts +108 -0
- package/src/spawn-command.ts +2 -0
- package/public/assets/chat-AcrAMzhN.js +0 -2
- package/public/assets/chat-AcrAMzhN.js.map +0 -1
- package/public/assets/index-B8ND8v33.css +0 -2
- package/public/assets/store-qcA2XXVy.js +0 -9
- package/public/assets/store-qcA2XXVy.js.map +0 -1
- package/public/assets/teams-D5GY1lKs.js +0 -2
- package/public/assets/teams-D5GY1lKs.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}from"./lucide-react-ChOGD4vc.js";import{t as c}from"./store-qcA2XXVy.js";import{H as l,J as u,d,h as f}from"./display-CXhnBwGf.js";import{a as ee,i as te,n as ne,r as re,t as p}from"./select-U0nqw_nv.js";import{t as m}from"./badge-BR4bvEsy.js";import{t as ie}from"./button-BwqJZS4O.js";import{t as h}from"./input-YoPXrp72.js";import{s as g}from"./index-C6HByEQl.js";import{i as _,n as v,r as y,t as b}from"./card-C7JtSyuM.js";var x=e(i(),1),S=a(),C=[{value:`all`,label:`All kinds`},{value:`decision`,label:`Decisions`},{value:`fact`,label:`Facts`},{value:`ruled_out`,label:`Ruled out`}],w={decision:`decision`,fact:`fact`,ruled_out:`ruled out`};function T(e){return e.status===`dissolved`?`dissolved`:e.zeroMembersSince==null?`active`:`orphaned`}var E={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`},D={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`},O={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 k(e){return e?e.slice(0,12):`-`}function A(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 ae(e){if(!e.composition)return null;try{let t=JSON.parse(e.composition);return Array.isArray(t)?t.length:null}catch{return null}}function oe(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 j(){let[e,i]=(0,x.useState)([]),[a,j]=(0,x.useState)(null),[se,M]=(0,x.useState)([]),[N,P]=(0,x.useState)(null),[F,I]=(0,x.useState)(`all`),[L,R]=(0,x.useState)(``),[z,B]=(0,x.useState)(!1),[V,H]=(0,x.useState)(!1),[U,W]=(0,x.useState)(null),[G,ce]=(0,x.useState)(()=>Date.now()),K=c(e=>e.agents),le=c(e=>e.switchView),ue=c(e=>e.openInboxThread),q=(0,x.useMemo)(()=>Object.fromEntries(K.map(e=>[e.id,e])),[K]),de=e=>{let t=q[e];return t?d(t):e.slice(-8)};async function J(e,t=F){H(!0),W(null);try{let n=new URLSearchParams({team:e});t!==`all`&&n.set(`kind`,t),M((await r(`GET`,`/blackboard?${n.toString()}`)).entries),P(e)}catch(t){W(u(t)),M([]),P(e)}finally{H(!1)}}async function Y(){B(!0),W(null);try{let e=await r(`GET`,`/teams`);i(e.teams),ce(Date.now());let t=a??e.teams[0]?.id;t?await J(t,F):(M([]),P(null))}catch(e){W(u(e))}finally{B(!1)}}(0,x.useEffect)(()=>{Y()},[]),(0,x.useEffect)(()=>{N&&J(N,F)},[F]);let X=(0,x.useMemo)(()=>e.filter(e=>oe(e,L)),[e,L]),Z=a??e[0]?.id??null,Q=e.find(e=>e.id===Z)??null,$=N===Z?se:[],fe=(0,x.useMemo)(()=>{let e={decision:[],fact:[],ruled_out:[]};for(let t of $)e[t.kind].push(t);return e},[$]),pe=F===`all`?[`decision`,`fact`,`ruled_out`]:[F];return(0,S.jsxs)(`div`,{className:`space-y-4 p-4`,children:[(0,S.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(s,{className:`size-5 text-primary`}),(0,S.jsx)(`h1`,{className:`text-lg font-semibold`,children:`Teams`}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`active and dissolved team working sets`})]}),(0,S.jsxs)(ie,{variant:`outline`,size:`sm`,onClick:()=>void Y(),disabled:z,children:[(0,S.jsx)(n,{className:o(`size-4`,z&&`animate-spin`)}),` Refresh`]})]}),U&&(0,S.jsx)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive`,children:U}),(0,S.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[minmax(320px,420px)_1fr]`,children:[(0,S.jsxs)(`div`,{className:`min-h-[520px] space-y-3`,children:[(0,S.jsxs)(`div`,{className:`space-y-3`,children:[(0,S.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,S.jsx)(`span`,{children:`Team list`}),(0,S.jsx)(m,{variant:`secondary`,children:e.length})]}),(0,S.jsx)(h,{value:L,onChange:e=>R(e.target.value),placeholder:`Filter teams`,className:`h-8`})]}),(0,S.jsx)(`div`,{children:z&&e.length===0?(0,S.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:`Loading teams…`}):X.length===0?(0,S.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:e.length===0?`No teams`:`No teams match`}):(0,S.jsx)(g,{className:`h-[610px] pr-3`,children:(0,S.jsx)(`div`,{className:`space-y-2`,children:X.map(e=>{let n=e.id===Z,r=ae(e),i=T(e),a=e.coordinatorId,s=()=>{j(e.id),J(e.id,F)};return(0,S.jsx)(`div`,{role:`button`,tabIndex:0,onClick:s,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),s())},className:`block w-full cursor-pointer text-left`,children:(0,S.jsx)(b,{className:o(`transition-colors hover:border-primary/50`,n&&`border-primary/60 bg-primary/5`),children:(0,S.jsxs)(v,{className:`space-y-3 p-3`,children:[(0,S.jsxs)(`div`,{className:`flex items-start justify-between gap-2`,children:[(0,S.jsxs)(`div`,{className:`min-w-0`,children:[(0,S.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.title||k(e.id)}),(0,S.jsx)(`div`,{className:`truncate text-xs text-muted-foreground`,children:e.id})]}),(0,S.jsx)(m,{variant:`outline`,className:E[i],children:i})]}),(0,S.jsxs)(`div`,{className:`grid grid-cols-2 gap-x-3 gap-y-1 text-xs text-muted-foreground`,children:[(0,S.jsx)(`span`,{children:`Coordinator`}),a?(0,S.jsxs)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),ue(a),le(`chat`)},className:`flex min-w-0 items-center justify-end gap-1 text-right text-primary hover:underline`,title:`Chat with ${a}`,children:[(0,S.jsx)(t,{className:`size-3 shrink-0`}),(0,S.jsx)(`span`,{className:`truncate`,children:de(a)})]}):(0,S.jsx)(`span`,{className:`text-right text-muted-foreground`,children:`—`}),(0,S.jsx)(`span`,{children:`Members`}),(0,S.jsx)(`span`,{className:`text-right text-foreground`,children:r??`-`}),(0,S.jsx)(`span`,{children:`Created`}),(0,S.jsx)(`span`,{className:`text-right text-foreground`,title:f(e.createdAt),children:l(G,e.createdAt)}),e.dissolvedAt?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`span`,{children:`Dissolved`}),(0,S.jsx)(`span`,{className:`text-right text-foreground`,title:f(e.dissolvedAt),children:l(G,e.dissolvedAt)})]}):null]}),i===`orphaned`&&e.zeroMembersSince!=null?(0,S.jsx)(`div`,{className:`flex items-center gap-1.5 border-t border-border pt-2 text-xs text-amber-400`,title:f(e.zeroMembersSince),children:(0,S.jsxs)(`span`,{children:[`No live members since `,l(G,e.zeroMembersSince),` — auto-dissolving`]})}):null,e.status===`dissolved`?(0,S.jsxs)(`div`,{className:`space-y-1 border-t border-border pt-2`,children:[(0,S.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[e.outcomeStatus?(0,S.jsx)(m,{variant:`outline`,className:D[e.outcomeStatus],children:e.outcomeStatus}):(0,S.jsx)(m,{variant:`outline`,children:`no outcome`}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:A(e.wallClockMs)})]}),e.outcomeSummary?(0,S.jsx)(`p`,{className:`line-clamp-2 text-xs text-muted-foreground`,children:e.outcomeSummary}):null]}):null]})})},e.id)})})})})]}),(0,S.jsxs)(b,{className:`min-h-[520px]`,children:[(0,S.jsx)(y,{children:(0,S.jsxs)(_,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,S.jsxs)(`div`,{className:`min-w-0`,children:[(0,S.jsx)(`span`,{children:`Blackboard`}),Q?(0,S.jsx)(`span`,{className:`ml-2 text-xs font-normal text-muted-foreground`,children:Q.title||Q.id}):null]}),(0,S.jsxs)(p,{value:F,onValueChange:e=>I(e),children:[(0,S.jsx)(te,{size:`sm`,className:`w-36`,children:(0,S.jsx)(ee,{})}),(0,S.jsx)(ne,{children:C.map(e=>(0,S.jsx)(re,{value:e.value,children:e.label},e.value))})]})]})}),(0,S.jsx)(v,{children:Q?V&&$.length===0?(0,S.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:`Loading blackboard…`}):$.length===0?(0,S.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:`No blackboard entries`}):(0,S.jsx)(g,{className:`h-[640px] pr-3`,children:(0,S.jsx)(`div`,{className:`space-y-5`,children:pe.map(e=>{let t=fe[e];return t.length===0?null:(0,S.jsxs)(`section`,{className:`space-y-2`,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(m,{variant:`secondary`,children:w[e]}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:t.length})]}),(0,S.jsx)(`div`,{className:`space-y-2`,children:t.map(e=>(0,S.jsxs)(`div`,{className:`space-y-3 rounded-md border border-border bg-background p-3`,children:[(0,S.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-2`,children:[(0,S.jsxs)(`div`,{className:`min-w-0`,children:[(0,S.jsx)(`div`,{className:`text-sm font-medium`,children:e.title}),(0,S.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[`by `,k(e.authorId),` · `,l(G,e.updatedAt||e.createdAt)]})]}),(0,S.jsxs)(`div`,{className:`flex flex-wrap justify-end gap-1`,children:[(0,S.jsx)(m,{variant:`outline`,className:O[e.status],children:e.status}),e.supersedes?(0,S.jsxs)(m,{variant:`outline`,children:[`supersedes `,k(e.supersedes)]}):null]})]}),e.body?(0,S.jsx)(`p`,{className:`whitespace-pre-wrap text-sm text-muted-foreground`,children:e.body}):null]},e.id))})]},e)})})}):(0,S.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:`No team selected`})})]})]})]})}export{j as TeamsView};
|
|
2
|
-
//# sourceMappingURL=teams-D5GY1lKs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"teams-D5GY1lKs.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, Users } from 'lucide-react'\nimport { api } from '@/lib/api'\nimport { useRelayStore } from '@/store'\nimport { cn } from '@/lib/utils'\nimport { displayName, fmtTime, 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 type { BlackboardEntry, BlackboardEntryKind, BlackboardEntryStatus, Team } from '@/types'\n\ninterface TeamsResponse {\n teams: Team[]\n}\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\nexport function TeamsView() {\n const [teams, setTeams] = useState<Team[]>([])\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 [loading, setLoading] = 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 agents = useRelayStore((s) => s.agents)\n const switchView = useRelayStore((s) => s.switchView)\n const openInboxThread = useRelayStore((s) => s.openInboxThread)\n const agentsById = useMemo(() => Object.fromEntries(agents.map((a) => [a.id, a])), [agents])\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 setLoading(true)\n setError(null)\n try {\n const payload = await api<TeamsResponse>('GET', '/teams')\n setTeams(payload.teams)\n setNow(Date.now())\n const displayedTeamId = selectedTeamId ?? payload.teams[0]?.id\n if (displayedTeamId) await loadEntries(displayedTeamId, kindFilter)\n else {\n setEntries([])\n setEntriesTeamId(null)\n }\n } catch (e) {\n setError(errMessage(e))\n } finally {\n setLoading(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\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={loading}>\n <RefreshCw className={cn('size-4', loading && 'animate-spin')} /> Refresh\n </Button>\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 gap-4 xl:grid-cols-[minmax(320px,420px)_1fr]\">\n <div className=\"min-h-[520px] 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 {loading && 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 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 <Card className=\"min-h-[520px]\">\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 )\n}\n"],"mappings":"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"}
|