agent-relay-server 0.48.0 → 0.50.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 (73) hide show
  1. package/docs/openapi.json +1 -1
  2. package/package.json +1 -1
  3. package/public/assets/PlanGraphPanel-BYgnvJZR.js +2 -0
  4. package/public/assets/PlanGraphPanel-BYgnvJZR.js.map +1 -0
  5. package/public/assets/{activity-B7rLbnPy.js → activity-CCOlARUq.js} +2 -2
  6. package/public/assets/{activity-B7rLbnPy.js.map → activity-CCOlARUq.js.map} +1 -1
  7. package/public/assets/{agent-profiles-D_GQ78i3.js → agent-profiles-CGQq2EyX.js} +2 -2
  8. package/public/assets/{agent-profiles-D_GQ78i3.js.map → agent-profiles-CGQq2EyX.js.map} +1 -1
  9. package/public/assets/{agents-BVQGIUe8.js → agents-Cl9a1uBD.js} +2 -2
  10. package/public/assets/{agents-BVQGIUe8.js.map → agents-Cl9a1uBD.js.map} +1 -1
  11. package/public/assets/{analytics-BoGZ46xL.js → analytics-DkABnOKb.js} +2 -2
  12. package/public/assets/{analytics-BoGZ46xL.js.map → analytics-DkABnOKb.js.map} +1 -1
  13. package/public/assets/{automation-DH0gqxI2.js → automation-CS2V5WAh.js} +2 -2
  14. package/public/assets/{automation-DH0gqxI2.js.map → automation-CS2V5WAh.js.map} +1 -1
  15. package/public/assets/{branch-state-badge-B8h3vcwK.js → branch-state-badge-DhTKagJn.js} +2 -2
  16. package/public/assets/{branch-state-badge-B8h3vcwK.js.map → branch-state-badge-DhTKagJn.js.map} +1 -1
  17. package/public/assets/{channels-K5yks-NP.js → channels-BcUZKNmr.js} +2 -2
  18. package/public/assets/{channels-K5yks-NP.js.map → channels-BcUZKNmr.js.map} +1 -1
  19. package/public/assets/chat-TFFCz8AI.js +2 -0
  20. package/public/assets/chat-TFFCz8AI.js.map +1 -0
  21. package/public/assets/{connectors-fy5L_B2T.js → connectors-Dd5gUsM2.js} +2 -2
  22. package/public/assets/{connectors-fy5L_B2T.js.map → connectors-Dd5gUsM2.js.map} +1 -1
  23. package/public/assets/{formatted-body-impl-Cq3BVd4_.js → formatted-body-impl-B_mZW3Vj.js} +2 -2
  24. package/public/assets/{formatted-body-impl-Cq3BVd4_.js.map → formatted-body-impl-B_mZW3Vj.js.map} +1 -1
  25. package/public/assets/index-B8ND8v33.css +2 -0
  26. package/public/assets/{index-DtubrNEq.js → index-CWs6iPpQ.js} +6 -6
  27. package/public/assets/{index-DtubrNEq.js.map → index-CWs6iPpQ.js.map} +1 -1
  28. package/public/assets/{insights-D9AWKTUT.js → insights-D5e1k0IU.js} +2 -2
  29. package/public/assets/{insights-D9AWKTUT.js.map → insights-D5e1k0IU.js.map} +1 -1
  30. package/public/assets/{integrations-Bg_JSXvm.js → integrations-DVdvwQaZ.js} +2 -2
  31. package/public/assets/{integrations-Bg_JSXvm.js.map → integrations-DVdvwQaZ.js.map} +1 -1
  32. package/public/assets/{maintenance-B4gOLu3O.js → maintenance-ChmWW3iQ.js} +2 -2
  33. package/public/assets/{maintenance-B4gOLu3O.js.map → maintenance-ChmWW3iQ.js.map} +1 -1
  34. package/public/assets/{managed-agents-BiuAnZXF.js → managed-agents-C6cbTB9d.js} +2 -2
  35. package/public/assets/{managed-agents-BiuAnZXF.js.map → managed-agents-C6cbTB9d.js.map} +1 -1
  36. package/public/assets/{markdown-preview-impl-Dgt126-c.js → markdown-preview-impl-DjmZIwx5.js} +2 -2
  37. package/public/assets/{markdown-preview-impl-Dgt126-c.js.map → markdown-preview-impl-DjmZIwx5.js.map} +1 -1
  38. package/public/assets/{memory-C9ugmii9.js → memory-DYRuGhD9.js} +2 -2
  39. package/public/assets/{memory-C9ugmii9.js.map → memory-DYRuGhD9.js.map} +1 -1
  40. package/public/assets/{messages-BTSGjXwT.js → messages-q5N9kJ4f.js} +2 -2
  41. package/public/assets/{messages-BTSGjXwT.js.map → messages-q5N9kJ4f.js.map} +1 -1
  42. package/public/assets/{orchestrators-BLbeF61k.js → orchestrators-bbIEU7xO.js} +2 -2
  43. package/public/assets/{orchestrators-BLbeF61k.js.map → orchestrators-bbIEU7xO.js.map} +1 -1
  44. package/public/assets/{overview-BXtry9lM.js → overview-B3TxMRHV.js} +2 -2
  45. package/public/assets/{overview-BXtry9lM.js.map → overview-B3TxMRHV.js.map} +1 -1
  46. package/public/assets/{pairs-lm0CpPLI.js → pairs-CF3XEcbG.js} +2 -2
  47. package/public/assets/{pairs-lm0CpPLI.js.map → pairs-CF3XEcbG.js.map} +1 -1
  48. package/public/assets/{security-D_GiLWK-.js → security-Bffy1FyV.js} +2 -2
  49. package/public/assets/{security-D_GiLWK-.js.map → security-Bffy1FyV.js.map} +1 -1
  50. package/public/assets/{select-Dfy3f6py.js → select-Bz0VV6tj.js} +2 -2
  51. package/public/assets/{select-Dfy3f6py.js.map → select-Bz0VV6tj.js.map} +1 -1
  52. package/public/assets/{settings-BEHFzRj_.js → settings-DUucPX58.js} +2 -2
  53. package/public/assets/{settings-BEHFzRj_.js.map → settings-DUucPX58.js.map} +1 -1
  54. package/public/assets/store-C7dqPL_V.js +9 -0
  55. package/public/assets/store-C7dqPL_V.js.map +1 -0
  56. package/public/assets/{tasks-D_awpUcE.js → tasks-Dv1CeteT.js} +2 -2
  57. package/public/assets/{tasks-D_awpUcE.js.map → tasks-Dv1CeteT.js.map} +1 -1
  58. package/public/assets/teams-DEASyStU.js +2 -0
  59. package/public/assets/teams-DEASyStU.js.map +1 -0
  60. package/public/assets/{terminal-viewer-impl-DsxxgYft.js → terminal-viewer-impl-DQEV3e7Z.js} +2 -2
  61. package/public/assets/{terminal-viewer-impl-DsxxgYft.js.map → terminal-viewer-impl-DQEV3e7Z.js.map} +1 -1
  62. package/public/assets/{work-queue-DniyVomK.js → work-queue-9iUCo-hM.js} +2 -2
  63. package/public/assets/{work-queue-DniyVomK.js.map → work-queue-9iUCo-hM.js.map} +1 -1
  64. package/public/assets/{workspaces-BRVqBWat.js → workspaces-B0zGEd0M.js} +2 -2
  65. package/public/assets/{workspaces-BRVqBWat.js.map → workspaces-B0zGEd0M.js.map} +1 -1
  66. package/public/index.html +3 -3
  67. package/public/assets/chat-CAg1G_AE.js +0 -2
  68. package/public/assets/chat-CAg1G_AE.js.map +0 -1
  69. package/public/assets/index-DY-jpX4m.css +0 -2
  70. package/public/assets/store-qcA2XXVy.js +0 -9
  71. package/public/assets/store-qcA2XXVy.js.map +0 -1
  72. package/public/assets/teams-C0INWuQC.js +0 -2
  73. package/public/assets/teams-C0INWuQC.js.map +0 -1
@@ -1,2 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{M as t,Mn as n,Un as r,jn as i,kn as a,l as o}from"./lucide-react-ChOGD4vc.js";import{H as s,J as c,h as l}from"./display-CXhnBwGf.js";import{a as u,i as ee,n as te,r as d,t as f}from"./select-Dfy3f6py.js";import{t as p}from"./badge-BR4bvEsy.js";import{t as m}from"./button-BwqJZS4O.js";import{t as h}from"./input-YoPXrp72.js";import{s as g}from"./index-DtubrNEq.js";import{i as _,n as v,r as y,t as b}from"./card-C7JtSyuM.js";var x=e(r(),1),S=i(),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`},T={active:`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`,dissolved:`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`},E={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`},D={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 O(e){return e?e.slice(0,12):`-`}function k(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 A(e){if(!e.composition)return null;try{let t=JSON.parse(e.composition);return Array.isArray(t)?t.length:null}catch{return null}}function j(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 M(){let[e,r]=(0,x.useState)([]),[i,M]=(0,x.useState)(null),[ne,N]=(0,x.useState)([]),[P,F]=(0,x.useState)(null),[I,L]=(0,x.useState)(`all`),[R,z]=(0,x.useState)(``),[B,V]=(0,x.useState)(!1),[H,U]=(0,x.useState)(!1),[W,G]=(0,x.useState)(null),[K,q]=(0,x.useState)(()=>Date.now());async function J(e,t=I){U(!0),G(null);try{let r=new URLSearchParams({team:e});t!==`all`&&r.set(`kind`,t),N((await n(`GET`,`/blackboard?${r.toString()}`)).entries),F(e)}catch(t){G(c(t)),N([]),F(e)}finally{U(!1)}}async function Y(){V(!0),G(null);try{let e=await n(`GET`,`/teams`);r(e.teams),q(Date.now());let t=i??e.teams[0]?.id;t?await J(t,I):(N([]),F(null))}catch(e){G(c(e))}finally{V(!1)}}(0,x.useEffect)(()=>{Y()},[]),(0,x.useEffect)(()=>{P&&J(P,I)},[I]);let X=(0,x.useMemo)(()=>e.filter(e=>j(e,R)),[e,R]),Z=i??e[0]?.id??null,Q=e.find(e=>e.id===Z)??null,$=P===Z?ne:[],re=(0,x.useMemo)(()=>{let e={decision:[],fact:[],ruled_out:[]};for(let t of $)e[t.kind].push(t);return e},[$]),ie=I===`all`?[`decision`,`fact`,`ruled_out`]:[I];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)(o,{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)(m,{variant:`outline`,size:`sm`,onClick:()=>void Y(),disabled:B,children:[(0,S.jsx)(t,{className:a(`size-4`,B&&`animate-spin`)}),` Refresh`]})]}),W&&(0,S.jsx)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive`,children:W}),(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)(p,{variant:`secondary`,children:e.length})]}),(0,S.jsx)(h,{value:R,onChange:e=>z(e.target.value),placeholder:`Filter teams`,className:`h-8`})]}),(0,S.jsx)(`div`,{children:B&&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 t=e.id===Z,n=A(e);return(0,S.jsx)(`button`,{type:`button`,onClick:()=>{M(e.id),J(e.id,I)},className:`block w-full text-left`,children:(0,S.jsx)(b,{className:a(`transition-colors hover:border-primary/50`,t&&`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||O(e.id)}),(0,S.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:e.id})]}),(0,S.jsx)(p,{variant:`outline`,className:T[e.status],children:e.status})]}),(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`}),(0,S.jsx)(`span`,{className:`truncate text-right text-foreground`,children:O(e.coordinatorId)}),(0,S.jsx)(`span`,{children:`Members`}),(0,S.jsx)(`span`,{className:`text-right text-foreground`,children:n??`-`}),(0,S.jsx)(`span`,{children:`Created`}),(0,S.jsx)(`span`,{className:`text-right text-foreground`,title:l(e.createdAt),children:s(K,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:l(e.dissolvedAt),children:s(K,e.dissolvedAt)})]}):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)(p,{variant:`outline`,className:E[e.outcomeStatus],children:e.outcomeStatus}):(0,S.jsx)(p,{variant:`outline`,children:`no outcome`}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:k(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)(f,{value:I,onValueChange:e=>L(e),children:[(0,S.jsx)(ee,{size:`sm`,className:`w-36`,children:(0,S.jsx)(u,{})}),(0,S.jsx)(te,{children:C.map(e=>(0,S.jsx)(d,{value:e.value,children:e.label},e.value))})]})]})}),(0,S.jsx)(v,{children:Q?H&&$.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:ie.map(e=>{let t=re[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)(p,{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 `,O(e.authorId),` · `,s(K,e.updatedAt||e.createdAt)]})]}),(0,S.jsxs)(`div`,{className:`flex flex-wrap justify-end gap-1`,children:[(0,S.jsx)(p,{variant:`outline`,className:D[e.status],children:e.status}),e.supersedes?(0,S.jsxs)(p,{variant:`outline`,children:[`supersedes `,O(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{M as TeamsView};
2
- //# sourceMappingURL=teams-C0INWuQC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"teams-C0INWuQC.js","names":[],"sources":["../../dashboard/src/components/views/teams.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react'\nimport { errMessage } from 'agent-relay-sdk/types'\nimport { RefreshCw, Users } from 'lucide-react'\nimport { api } from '@/lib/api'\nimport { cn } from '@/lib/utils'\nimport { 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\nconst TEAM_STATUS_CLASS: Record<Team['status'], string> = {\n active: 'bg-emerald-500/10 text-emerald-400 border-emerald-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\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 return (\n <button\n key={team.id}\n type=\"button\"\n onClick={() => {\n setSelectedTeamId(team.id)\n void loadEntries(team.id, kindFilter)\n }}\n className=\"block w-full 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=\"text-xs text-muted-foreground\">{team.id}</div>\n </div>\n <Badge variant=\"outline\" className={TEAM_STATUS_CLASS[team.status]}>{team.status}</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 <span className=\"truncate text-right text-foreground\">{shortId(team.coordinatorId)}</span>\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 {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 </button>\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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"}