agent-relay-server 0.111.0 → 0.112.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 (69) hide show
  1. package/docs/openapi.json +1 -1
  2. package/package.json +2 -2
  3. package/public/assets/{MessageBubble-WYqSyKPM.js → MessageBubble-DtLlfBAK.js} +2 -2
  4. package/public/assets/{MessageBubble-WYqSyKPM.js.map → MessageBubble-DtLlfBAK.js.map} +1 -1
  5. package/public/assets/{PlanGraphPanel-Dvu17jGe.js → PlanGraphPanel-pcKJ4q_4.js} +2 -2
  6. package/public/assets/{PlanGraphPanel-Dvu17jGe.js.map → PlanGraphPanel-pcKJ4q_4.js.map} +1 -1
  7. package/public/assets/{activity-wAN_upn7.js → activity-DRAeL0Jq.js} +2 -2
  8. package/public/assets/{activity-wAN_upn7.js.map → activity-DRAeL0Jq.js.map} +1 -1
  9. package/public/assets/{agent-profiles-D8WLdTCs.js → agent-profiles-cnWPANzx.js} +2 -2
  10. package/public/assets/{agent-profiles-D8WLdTCs.js.map → agent-profiles-cnWPANzx.js.map} +1 -1
  11. package/public/assets/{agents-C5FajNPw.js → agents-DgUjmk_D.js} +2 -2
  12. package/public/assets/{agents-C5FajNPw.js.map → agents-DgUjmk_D.js.map} +1 -1
  13. package/public/assets/{automation-ShdXg0pX.js → automation-CuTlgY1E.js} +2 -2
  14. package/public/assets/{automation-ShdXg0pX.js.map → automation-CuTlgY1E.js.map} +1 -1
  15. package/public/assets/{chat-aRCk0pLJ.js → chat-C7XCmaZz.js} +2 -2
  16. package/public/assets/{chat-aRCk0pLJ.js.map → chat-C7XCmaZz.js.map} +1 -1
  17. package/public/assets/{formatted-body-impl-DZc7C4-2.js → formatted-body-impl-rLDPgdmJ.js} +2 -2
  18. package/public/assets/{formatted-body-impl-DZc7C4-2.js.map → formatted-body-impl-rLDPgdmJ.js.map} +1 -1
  19. package/public/assets/{index-DXEYz_JV.js → index-DGyeTLPg.js} +5 -5
  20. package/public/assets/index-DGyeTLPg.js.map +1 -0
  21. package/public/assets/{insights-FzTX2wNh.js → insights-C0dDL4El.js} +2 -2
  22. package/public/assets/{insights-FzTX2wNh.js.map → insights-C0dDL4El.js.map} +1 -1
  23. package/public/assets/{maintenance-C8Uw8XiI.js → maintenance-DkOkcEkb.js} +2 -2
  24. package/public/assets/{maintenance-C8Uw8XiI.js.map → maintenance-DkOkcEkb.js.map} +1 -1
  25. package/public/assets/{managed-agents-DVbJ2hqh.js → managed-agents-C7Czinaz.js} +2 -2
  26. package/public/assets/{managed-agents-DVbJ2hqh.js.map → managed-agents-C7Czinaz.js.map} +1 -1
  27. package/public/assets/{markdown-preview-impl-C5D-B-9S.js → markdown-preview-impl-BZ7sigEc.js} +2 -2
  28. package/public/assets/{markdown-preview-impl-C5D-B-9S.js.map → markdown-preview-impl-BZ7sigEc.js.map} +1 -1
  29. package/public/assets/{memory-Bp-D_V80.js → memory-Bys-M7GK.js} +2 -2
  30. package/public/assets/{memory-Bp-D_V80.js.map → memory-Bys-M7GK.js.map} +1 -1
  31. package/public/assets/{messages-DE1QSeHI.js → messages-COSJ6trN.js} +2 -2
  32. package/public/assets/{messages-DE1QSeHI.js.map → messages-COSJ6trN.js.map} +1 -1
  33. package/public/assets/{orchestrators-B0u2lQfw.js → orchestrators-BjLl1Z0L.js} +2 -2
  34. package/public/assets/{orchestrators-B0u2lQfw.js.map → orchestrators-BjLl1Z0L.js.map} +1 -1
  35. package/public/assets/{overview-DpaEvvLT.js → overview-BmU7twic.js} +2 -2
  36. package/public/assets/{overview-DpaEvvLT.js.map → overview-BmU7twic.js.map} +1 -1
  37. package/public/assets/{pairs-DRp_qAu8.js → pairs-xclXjw-c.js} +2 -2
  38. package/public/assets/{pairs-DRp_qAu8.js.map → pairs-xclXjw-c.js.map} +1 -1
  39. package/public/assets/{prompt-settings-CNoBiymk.js → prompt-settings-CtQd0nz0.js} +2 -2
  40. package/public/assets/{prompt-settings-CNoBiymk.js.map → prompt-settings-CtQd0nz0.js.map} +1 -1
  41. package/public/assets/{registry-0A4QFMWC.js → registry-CDe6vjKI.js} +2 -2
  42. package/public/assets/{registry-0A4QFMWC.js.map → registry-CDe6vjKI.js.map} +1 -1
  43. package/public/assets/{security-C9P6yiQ3.js → security-C9mBNQMZ.js} +2 -2
  44. package/public/assets/{security-C9P6yiQ3.js.map → security-C9mBNQMZ.js.map} +1 -1
  45. package/public/assets/{select-B1PVUj6D.js → select-BJDKQk4q.js} +2 -2
  46. package/public/assets/{select-B1PVUj6D.js.map → select-BJDKQk4q.js.map} +1 -1
  47. package/public/assets/{settings-TnHlB9-t.js → settings-BmZjWJkI.js} +2 -2
  48. package/public/assets/{settings-TnHlB9-t.js.map → settings-BmZjWJkI.js.map} +1 -1
  49. package/public/assets/{tasks-1oK_ggFC.js → tasks-DNjZKSM2.js} +2 -2
  50. package/public/assets/tasks-DNjZKSM2.js.map +1 -0
  51. package/public/assets/{teams-BBb0ZYiF.js → teams-KNzmdolE.js} +2 -2
  52. package/public/assets/{teams-BBb0ZYiF.js.map → teams-KNzmdolE.js.map} +1 -1
  53. package/public/assets/{terminal-viewer-impl-DzvaRjkp.js → terminal-viewer-impl-DnFJDl9N.js} +2 -2
  54. package/public/assets/{terminal-viewer-impl-DzvaRjkp.js.map → terminal-viewer-impl-DnFJDl9N.js.map} +1 -1
  55. package/public/assets/{user-avatar-X1pfizLv.js → user-avatar-C8sbjQke.js} +2 -2
  56. package/public/assets/{user-avatar-X1pfizLv.js.map → user-avatar-C8sbjQke.js.map} +1 -1
  57. package/public/assets/{work-queue-DQMbkSD8.js → work-queue-DINvPVPn.js} +2 -2
  58. package/public/assets/{work-queue-DQMbkSD8.js.map → work-queue-DINvPVPn.js.map} +1 -1
  59. package/public/assets/{workspaces-BNLP4IlV.js → workspaces-CSNdUg15.js} +2 -2
  60. package/public/assets/{workspaces-BNLP4IlV.js.map → workspaces-CSNdUg15.js.map} +1 -1
  61. package/public/index.html +1 -1
  62. package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
  63. package/src/mcp-task-tools.ts +2 -1
  64. package/src/services/spawn-registration-watchdog.ts +5 -5
  65. package/src/services/task-done-when.ts +21 -0
  66. package/src/services/task-entity.ts +10 -1
  67. package/src/services/task-lifecycle.ts +9 -39
  68. package/public/assets/index-DXEYz_JV.js.map +0 -1
  69. package/public/assets/tasks-1oK_ggFC.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks-1oK_ggFC.js","names":[],"sources":["../../dashboard/src/components/views/tasks.tsx"],"sourcesContent":["import { useRelayStore, useNow } from '@/store'\nimport { Card, CardContent, CardHeader } from '@/components/ui/card'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { ScrollArea } from '@/components/ui/scroll-area'\nimport { Separator } from '@/components/ui/separator'\nimport { ClipboardList, ExternalLink, GitBranch, Plus } from 'lucide-react'\nimport { displayName, timeAgo, fmtTime } from '@/lib/display'\nimport { TASK_DELIVERABLE_STAGES } from 'agent-relay-sdk/types'\nimport type { Task } from '@/types'\n\nconst STATUS_COLORS: Record<string, string> = {\n open: 'bg-blue-500/10 text-blue-400 border-blue-500/20',\n in_progress: 'bg-purple-500/10 text-purple-400 border-purple-500/20',\n blocked: 'bg-yellow-500/10 text-yellow-400 border-yellow-500/20',\n done: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20',\n failed: 'bg-red-500/10 text-red-400 border-red-500/20',\n canceled: 'bg-zinc-500/10 text-zinc-400 border-zinc-500/20',\n claimed: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20',\n}\n\nconst STAGE_COLORS: Record<string, string> = {\n none: 'bg-zinc-500/10 text-zinc-400',\n uncommitted: 'bg-yellow-500/10 text-yellow-400',\n 'committed-on-branch': 'bg-blue-500/10 text-blue-400',\n 'landed-on-main': 'bg-emerald-500/10 text-emerald-400',\n deploying: 'bg-purple-500/10 text-purple-400',\n deployed: 'bg-teal-500/10 text-teal-400',\n}\n\nconst STAGE_LABELS: Record<string, string> = {\n none: 'None',\n uncommitted: 'Uncommitted',\n 'committed-on-branch': 'On Branch',\n 'landed-on-main': 'Landed',\n deploying: 'Deploying',\n deployed: 'Deployed',\n}\n\nconst DELIVERABLE_STATUS_OPTIONS = ['open', 'in_progress', 'blocked', 'done', 'failed', 'canceled']\n\nexport function TasksView() {\n const now = useNow()\n const deliverableTasks = useRelayStore((s) => s.deliverableTasks)\n const deliverableStatusFilter = useRelayStore((s) => s.deliverableStatusFilter)\n const deliverableStageFilter = useRelayStore((s) => s.deliverableStageFilter)\n const agentsById = useRelayStore((s) => s.agentsById)\n const set = useRelayStore((s) => s.set)\n const fetchDeliverableTasks = useRelayStore((s) => s.fetchDeliverableTasks)\n const openTaskDetail = useRelayStore((s) => s.openTaskDetail)\n const openTaskCreate = useRelayStore((s) => s.openTaskCreate)\n\n function handleStatusFilter(value: string) {\n set({ deliverableStatusFilter: value })\n void fetchDeliverableTasks()\n }\n\n function handleStageFilter(value: string) {\n set({ deliverableStageFilter: value })\n void fetchDeliverableTasks()\n }\n\n function agentLabel(id: string | undefined) {\n if (!id) return null\n return agentsById[id] ? displayName(agentsById[id]) : id.slice(-10)\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-2\">\n <ClipboardList className=\"w-5 h-5 text-muted-foreground\" />\n <h2 className=\"text-lg font-semibold\">Tasks</h2>\n <Badge variant=\"secondary\">{deliverableTasks.length}</Badge>\n </div>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <Button size=\"sm\" className=\"h-8 gap-1.5\" onClick={openTaskCreate}>\n <Plus className=\"w-3.5 h-3.5\" />\n New Task\n </Button>\n <select\n className=\"rounded-md border border-input bg-background px-3 py-1.5 text-sm\"\n value={deliverableStatusFilter}\n onChange={(e) => handleStatusFilter(e.target.value)}\n >\n <option value=\"\">All statuses</option>\n {DELIVERABLE_STATUS_OPTIONS.map((s) => <option key={s} value={s}>{s}</option>)}\n </select>\n <select\n className=\"rounded-md border border-input bg-background px-3 py-1.5 text-sm\"\n value={deliverableStageFilter}\n onChange={(e) => handleStageFilter(e.target.value)}\n >\n <option value=\"\">All stages</option>\n {TASK_DELIVERABLE_STAGES.map((s) => <option key={s} value={s}>{STAGE_LABELS[s] ?? s}</option>)}\n </select>\n </div>\n </div>\n\n <ScrollArea className=\"h-[calc(100dvh-11rem)]\">\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3 pr-2\">\n {deliverableTasks.length === 0 && (\n <div className=\"col-span-full text-center text-muted-foreground py-16 text-sm\">No deliverable tasks</div>\n )}\n {deliverableTasks.map((task) => (\n <DeliverableTaskCard\n key={task.id}\n task={task}\n now={now}\n agentLabel={agentLabel}\n onOpen={() => openTaskDetail(task)}\n />\n ))}\n </div>\n </ScrollArea>\n </div>\n )\n}\n\nfunction DeliverableTaskCard({\n task, now, agentLabel, onOpen,\n}: {\n task: Task\n now: number\n agentLabel: (id: string | undefined) => string | null\n onOpen: () => void\n}) {\n const statusClass = STATUS_COLORS[task.status] ?? 'bg-zinc-500/10 text-zinc-400 border-zinc-500/20'\n const stageClass = task.deliverableStage ? (STAGE_COLORS[task.deliverableStage] ?? 'bg-zinc-500/10 text-zinc-400') : ''\n const owner = agentLabel(task.ownerAgentId)\n\n return (\n <Card\n className=\"flex flex-col cursor-pointer hover:border-zinc-600 transition-colors\"\n onClick={onOpen}\n >\n <CardHeader className=\"py-3 px-4 pb-0 space-y-0\">\n <div className=\"flex items-start gap-2 justify-between\">\n <div className=\"flex gap-1.5 flex-wrap\">\n <Badge variant=\"outline\" className={`text-xs px-1.5 py-0 border ${statusClass}`}>{task.status}</Badge>\n {task.deliverableStage && task.deliverableStage !== 'none' && (\n <Badge variant=\"secondary\" className={`text-xs px-1.5 py-0 ${stageClass}`}>\n {STAGE_LABELS[task.deliverableStage] ?? task.deliverableStage}\n </Badge>\n )}\n </div>\n <span className=\"text-xs text-muted-foreground shrink-0\">#{task.id}</span>\n </div>\n <p className=\"font-medium text-sm mt-2 line-clamp-2\">{task.title}</p>\n </CardHeader>\n <CardContent className=\"px-4 py-3 flex-1 flex flex-col justify-between gap-2\">\n <div className=\"space-y-0.5 text-xs text-muted-foreground\">\n {owner && (\n <div className=\"flex items-center gap-1\">\n <span className=\"text-muted-foreground/60\">owner</span>\n <span className=\"truncate\">{owner}</span>\n </div>\n )}\n {task.branch && (\n <div className=\"flex items-center gap-1\">\n <GitBranch className=\"w-3 h-3 shrink-0\" />\n <span className=\"font-mono truncate\">{task.branch}</span>\n </div>\n )}\n <div className=\"flex items-center gap-1\" title={fmtTime(task.updatedAt)}>\n <span className=\"text-muted-foreground/60\">updated</span>\n <span>{timeAgo(now, task.updatedAt)}</span>\n </div>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Button size=\"sm\" variant=\"outline\" className=\"h-7 text-xs\" onClick={(e) => { e.stopPropagation(); onOpen() }}>\n Details\n </Button>\n {task.externalUrl && (\n <a href={task.externalUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"ml-auto\" onClick={(e) => e.stopPropagation()}>\n <Button size=\"sm\" variant=\"ghost\" className=\"h-7 px-2\">\n <ExternalLink className=\"w-3.5 h-3.5\" />\n </Button>\n </a>\n )}\n </div>\n </CardContent>\n </Card>\n )\n}\n"],"mappings":"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"}