@elizaos/plugin-task-coordinator 2.0.3-beta.2 → 2.0.3-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/assets/hero.png +0 -0
  2. package/dist/AgentTabsSection.d.ts +16 -0
  3. package/dist/AgentTabsSection.d.ts.map +1 -0
  4. package/dist/AgentTabsSection.js +169 -0
  5. package/dist/AgentTabsSection.js.map +1 -0
  6. package/dist/CodingAgentControlChip.d.ts +2 -0
  7. package/dist/CodingAgentControlChip.d.ts.map +1 -0
  8. package/dist/CodingAgentControlChip.js +73 -0
  9. package/dist/CodingAgentControlChip.js.map +1 -0
  10. package/dist/CodingAgentSettingsSection.d.ts +2 -0
  11. package/dist/CodingAgentSettingsSection.d.ts.map +1 -0
  12. package/dist/CodingAgentSettingsSection.js +379 -0
  13. package/dist/CodingAgentSettingsSection.js.map +1 -0
  14. package/dist/CodingAgentTasksPanel.d.ts +4 -0
  15. package/dist/CodingAgentTasksPanel.d.ts.map +1 -0
  16. package/dist/CodingAgentTasksPanel.interact.d.ts +2 -0
  17. package/dist/CodingAgentTasksPanel.interact.d.ts.map +1 -0
  18. package/dist/CodingAgentTasksPanel.interact.js +46 -0
  19. package/dist/CodingAgentTasksPanel.interact.js.map +1 -0
  20. package/dist/CodingAgentTasksPanel.js +740 -0
  21. package/dist/CodingAgentTasksPanel.js.map +1 -0
  22. package/dist/GitHubConnectionCard.d.ts +2 -0
  23. package/dist/GitHubConnectionCard.d.ts.map +1 -0
  24. package/dist/GitHubConnectionCard.js +172 -0
  25. package/dist/GitHubConnectionCard.js.map +1 -0
  26. package/dist/GlobalPrefsSection.d.ts +10 -0
  27. package/dist/GlobalPrefsSection.d.ts.map +1 -0
  28. package/dist/GlobalPrefsSection.js +166 -0
  29. package/dist/GlobalPrefsSection.js.map +1 -0
  30. package/dist/LlmProviderSection.d.ts +10 -0
  31. package/dist/LlmProviderSection.d.ts.map +1 -0
  32. package/dist/LlmProviderSection.js +161 -0
  33. package/dist/LlmProviderSection.js.map +1 -0
  34. package/dist/ModelConfigSection.d.ts +15 -0
  35. package/dist/ModelConfigSection.d.ts.map +1 -0
  36. package/dist/ModelConfigSection.js +86 -0
  37. package/dist/ModelConfigSection.js.map +1 -0
  38. package/dist/OrchestratorView.d.ts +20 -0
  39. package/dist/OrchestratorView.d.ts.map +1 -0
  40. package/dist/OrchestratorView.js +231 -0
  41. package/dist/OrchestratorView.js.map +1 -0
  42. package/dist/OrchestratorWorkbench.d.ts +32 -0
  43. package/dist/OrchestratorWorkbench.d.ts.map +1 -0
  44. package/dist/OrchestratorWorkbench.js +3200 -0
  45. package/dist/OrchestratorWorkbench.js.map +1 -0
  46. package/dist/PtyConsoleBase.d.ts +9 -0
  47. package/dist/PtyConsoleBase.d.ts.map +1 -0
  48. package/dist/PtyConsoleBase.js +174 -0
  49. package/dist/PtyConsoleBase.js.map +1 -0
  50. package/dist/PtyConsoleDrawer.d.ts +10 -0
  51. package/dist/PtyConsoleDrawer.d.ts.map +1 -0
  52. package/dist/PtyConsoleDrawer.js +77 -0
  53. package/dist/PtyConsoleDrawer.js.map +1 -0
  54. package/dist/PtyConsoleSidePanel.d.ts +8 -0
  55. package/dist/PtyConsoleSidePanel.d.ts.map +1 -0
  56. package/dist/PtyConsoleSidePanel.js +9 -0
  57. package/dist/PtyConsoleSidePanel.js.map +1 -0
  58. package/dist/PtyTerminalPane.d.ts +10 -0
  59. package/dist/PtyTerminalPane.d.ts.map +1 -0
  60. package/dist/PtyTerminalPane.js +147 -0
  61. package/dist/PtyTerminalPane.js.map +1 -0
  62. package/dist/TaskCardList.d.ts +76 -0
  63. package/dist/TaskCardList.d.ts.map +1 -0
  64. package/dist/TaskCardList.js +327 -0
  65. package/dist/TaskCardList.js.map +1 -0
  66. package/dist/TaskCoordinatorView.d.ts +20 -0
  67. package/dist/TaskCoordinatorView.d.ts.map +1 -0
  68. package/dist/TaskCoordinatorView.js +146 -0
  69. package/dist/TaskCoordinatorView.js.map +1 -0
  70. package/dist/__e2e__/dashboard-fixture.d.ts +9 -0
  71. package/dist/__e2e__/dashboard-fixture.d.ts.map +1 -0
  72. package/dist/__e2e__/dashboard-fixture.js +123 -0
  73. package/dist/__e2e__/dashboard-fixture.js.map +1 -0
  74. package/dist/api/coding-agents-auth-sanitize.d.ts +23 -0
  75. package/dist/api/coding-agents-auth-sanitize.d.ts.map +1 -0
  76. package/dist/api/coding-agents-auth-sanitize.js +22 -0
  77. package/dist/api/coding-agents-auth-sanitize.js.map +1 -0
  78. package/dist/api/coding-agents-preflight-normalize.d.ts +29 -0
  79. package/dist/api/coding-agents-preflight-normalize.d.ts.map +1 -0
  80. package/dist/api/coding-agents-preflight-normalize.js +20 -0
  81. package/dist/api/coding-agents-preflight-normalize.js.map +1 -0
  82. package/dist/coding-agent-settings-shared.d.ts +42 -0
  83. package/dist/coding-agent-settings-shared.d.ts.map +1 -0
  84. package/dist/coding-agent-settings-shared.js +121 -0
  85. package/dist/coding-agent-settings-shared.js.map +1 -0
  86. package/dist/components/OrchestratorSpatialView.d.ts +56 -0
  87. package/dist/components/OrchestratorSpatialView.d.ts.map +1 -0
  88. package/dist/components/OrchestratorSpatialView.js +501 -0
  89. package/dist/components/OrchestratorSpatialView.js.map +1 -0
  90. package/dist/components/TaskCoordinatorSpatialView.d.ts +59 -0
  91. package/dist/components/TaskCoordinatorSpatialView.d.ts.map +1 -0
  92. package/dist/components/TaskCoordinatorSpatialView.js +294 -0
  93. package/dist/components/TaskCoordinatorSpatialView.js.map +1 -0
  94. package/dist/index.d.ts +5 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +286 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/orchestrator-capabilities.d.ts +3 -0
  99. package/dist/orchestrator-capabilities.d.ts.map +1 -0
  100. package/dist/orchestrator-capabilities.js +136 -0
  101. package/dist/orchestrator-capabilities.js.map +1 -0
  102. package/dist/orchestrator-command.d.ts +39 -0
  103. package/dist/orchestrator-command.d.ts.map +1 -0
  104. package/dist/orchestrator-command.js +52 -0
  105. package/dist/orchestrator-command.js.map +1 -0
  106. package/dist/orchestrator-diff.d.ts +19 -0
  107. package/dist/orchestrator-diff.d.ts.map +1 -0
  108. package/dist/orchestrator-diff.helpers.d.ts +18 -0
  109. package/dist/orchestrator-diff.helpers.d.ts.map +1 -0
  110. package/dist/orchestrator-diff.helpers.js +76 -0
  111. package/dist/orchestrator-diff.helpers.js.map +1 -0
  112. package/dist/orchestrator-diff.js +119 -0
  113. package/dist/orchestrator-diff.js.map +1 -0
  114. package/dist/orchestrator-markdown.d.ts +5 -0
  115. package/dist/orchestrator-markdown.d.ts.map +1 -0
  116. package/dist/orchestrator-markdown.helpers.d.ts +2 -0
  117. package/dist/orchestrator-markdown.helpers.d.ts.map +1 -0
  118. package/dist/orchestrator-markdown.helpers.js +21 -0
  119. package/dist/orchestrator-markdown.helpers.js.map +1 -0
  120. package/dist/orchestrator-markdown.js +199 -0
  121. package/dist/orchestrator-markdown.js.map +1 -0
  122. package/dist/orchestrator-params.d.ts +8 -0
  123. package/dist/orchestrator-params.d.ts.map +1 -0
  124. package/dist/orchestrator-params.js +27 -0
  125. package/dist/orchestrator-params.js.map +1 -0
  126. package/dist/orchestrator-plan.d.ts +5 -0
  127. package/dist/orchestrator-plan.d.ts.map +1 -0
  128. package/dist/orchestrator-plan.js +95 -0
  129. package/dist/orchestrator-plan.js.map +1 -0
  130. package/dist/orchestrator-reasoning.d.ts +21 -0
  131. package/dist/orchestrator-reasoning.d.ts.map +1 -0
  132. package/dist/orchestrator-reasoning.js +105 -0
  133. package/dist/orchestrator-reasoning.js.map +1 -0
  134. package/dist/orchestrator-stream.d.ts +15 -0
  135. package/dist/orchestrator-stream.d.ts.map +1 -0
  136. package/dist/orchestrator-stream.helpers.d.ts +89 -0
  137. package/dist/orchestrator-stream.helpers.d.ts.map +1 -0
  138. package/dist/orchestrator-stream.helpers.js +361 -0
  139. package/dist/orchestrator-stream.helpers.js.map +1 -0
  140. package/dist/orchestrator-stream.js +307 -0
  141. package/dist/orchestrator-stream.js.map +1 -0
  142. package/dist/pty-status-dots.d.ts +2 -0
  143. package/dist/pty-status-dots.d.ts.map +1 -0
  144. package/dist/pty-status-dots.js +6 -0
  145. package/dist/pty-status-dots.js.map +1 -0
  146. package/dist/register-slots.d.ts +20 -0
  147. package/dist/register-slots.d.ts.map +1 -0
  148. package/dist/register-slots.js +50 -0
  149. package/dist/register-slots.js.map +1 -0
  150. package/dist/register-terminal-view.d.ts +21 -0
  151. package/dist/register-terminal-view.d.ts.map +1 -0
  152. package/dist/register-terminal-view.js +46 -0
  153. package/dist/register-terminal-view.js.map +1 -0
  154. package/dist/register.d.ts +2 -0
  155. package/dist/register.d.ts.map +1 -0
  156. package/dist/register.js +23 -0
  157. package/dist/register.js.map +1 -0
  158. package/dist/session-hydration.d.ts +2 -0
  159. package/dist/session-hydration.d.ts.map +1 -0
  160. package/dist/session-hydration.js +9 -0
  161. package/dist/session-hydration.js.map +1 -0
  162. package/dist/task-coordinator-view-bundle.d.ts +4 -0
  163. package/dist/task-coordinator-view-bundle.d.ts.map +1 -0
  164. package/dist/task-coordinator-view-bundle.js +9 -0
  165. package/dist/task-coordinator-view-bundle.js.map +1 -0
  166. package/dist/ui.d.ts +2 -0
  167. package/dist/ui.d.ts.map +1 -0
  168. package/dist/ui.js +13 -0
  169. package/dist/ui.js.map +1 -0
  170. package/dist/view-format.d.ts +25 -0
  171. package/dist/view-format.d.ts.map +1 -0
  172. package/dist/view-format.js +64 -0
  173. package/dist/view-format.js.map +1 -0
  174. package/dist/views/bundle.js +1383 -0
  175. package/dist/views/bundle.js.map +1 -0
  176. package/package.json +7 -6
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/OrchestratorWorkbench.tsx"],"sourcesContent":["import {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n Button,\n type ChangeSetData,\n type CodingAgentAddAgentInput,\n type CodingAgentOrchestratorStatus,\n type CodingAgentRerunFromEventInput,\n type CodingAgentRestartWithEditedPlanInput,\n type CodingAgentRetryTurnInput,\n type CodingAgentTaskArtifactRecord,\n type CodingAgentTaskEventRecord,\n type CodingAgentTaskMessageRecord,\n type CodingAgentTaskSessionRecord,\n type CodingAgentTaskThread,\n type CodingAgentTaskThreadDetail,\n type CodingAgentTaskTimelineItem,\n type CodingAgentTaskUsageSummary,\n client,\n DiffReviewPanel,\n useAppSelectorShallow,\n} from \"@elizaos/ui\";\nimport { useAgentElement } from \"@elizaos/ui/agent-surface\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n} from \"@elizaos/ui/components/ui/select\";\nimport {\n Archive,\n ArrowDownToLine,\n ArrowLeft,\n Bot,\n Check,\n ChevronDown,\n ChevronsUp,\n ChevronUp,\n Circle,\n CircleAlert,\n CircleCheck,\n CircleDashed,\n CirclePlay,\n CircleStop,\n CircleX,\n Copy,\n Gauge,\n GitFork,\n Layers,\n type LucideIcon,\n OctagonX,\n PanelRightOpen,\n Pause,\n Play,\n RotateCcw,\n Trash2,\n UserPlus,\n UserRound,\n X,\n} from \"lucide-react\";\nimport {\n type CSSProperties,\n type ReactNode,\n type UIEvent,\n useCallback,\n useDeferredValue,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n paramPriority,\n TASK_LIST_LIMIT,\n type TaskPriority,\n} from \"./orchestrator-params.js\";\nimport {\n type ConversationBlock,\n ConversationBlockView,\n ToolBody,\n} from \"./orchestrator-stream.js\";\nimport { buildConversation } from \"./orchestrator-stream.helpers\";\nimport {\n BackChip,\n SparseWatermark,\n TaskCard,\n TaskEmptyState,\n TaskMetaChip,\n TaskSearchInput,\n TaskStatusChip,\n} from \"./TaskCardList.js\";\nimport {\n formatClockTime,\n formatCompactNumber,\n formatDuration,\n formatIsoRelative,\n formatRelativeTime,\n formatUsd,\n} from \"./view-format.js\";\n\ntype Translate = (key: string, vars?: Record<string, unknown>) => string;\ntype TaskStatus = CodingAgentTaskThread[\"status\"];\ntype StatusFilter = \"all\" | TaskStatus;\ntype OperatorTab = \"input\" | \"output\" | \"events\" | \"usage\";\ntype DetailDrawerSelection =\n | { kind: \"session\"; sessionId: string }\n | {\n kind: \"block\";\n blockKey: string;\n blockKind: ConversationBlock[\"kind\"];\n eventIds: string[];\n messageIds: string[];\n };\n\nconst fallbackTranslate: Translate = (key, vars) =>\n String(vars?.defaultValue ?? key);\n\nconst TIMELINE_PAGE_LIMIT = 50;\nconst POLL_INTERVAL_MS = 5_000;\n/** While a task has a working agent, poll its room fast so the conversation,\n * tool calls, and tokens stream in near-live instead of lurching every 5s. */\nconst ACTIVE_POLL_INTERVAL_MS = 1_500;\n\nconst STATUS_ICON: Record<TaskStatus, LucideIcon> = {\n open: Circle,\n active: CirclePlay,\n waiting_on_user: UserRound,\n blocked: OctagonX,\n validating: CircleDashed,\n done: CircleCheck,\n failed: CircleX,\n archived: Archive,\n interrupted: CircleAlert,\n};\n\nconst STATUS_TONE: Record<TaskStatus, string> = {\n open: \"text-muted\",\n active: \"text-ok\",\n waiting_on_user: \"text-warn\",\n blocked: \"text-warn\",\n validating: \"text-accent\",\n done: \"text-ok\",\n failed: \"text-danger\",\n archived: \"text-muted\",\n interrupted: \"text-warn\",\n};\n\nconst STATUS_PULSE: ReadonlySet<TaskStatus> = new Set<TaskStatus>([\n \"active\",\n \"validating\",\n]);\n\n/** Terminal task statuses — the task is settled and no longer mutable\n * through the Edit-group actions (fork, restart, add agent, edit plan)\n * or the priority dropdown. Reopen (when archived) and Delete remain the\n * only meaningful affordances. Mirrors the design doc's\n * {done, failed, archived} set; the `CodingAgentTaskThread[\"status\"]`\n * union has no `\"closed\"` member. */\nconst TERMINAL_TASK_STATUSES: ReadonlySet<TaskStatus> = new Set<TaskStatus>([\n \"done\",\n \"failed\",\n \"archived\",\n]);\n\nconst PRIORITY_ICON: Record<TaskPriority, LucideIcon | null> = {\n low: ChevronDown,\n normal: null,\n high: ChevronUp,\n urgent: ChevronsUp,\n};\n\nconst SESSION_ICON: Record<string, LucideIcon> = {\n active: CirclePlay,\n running: CirclePlay,\n tool_running: CirclePlay,\n blocked: OctagonX,\n idle: Circle,\n completed: CircleCheck,\n stopped: CircleStop,\n error: CircleX,\n errored: CircleX,\n};\n\nconst SESSION_TONE: Record<string, string> = {\n active: \"text-ok\",\n running: \"text-ok\",\n tool_running: \"text-ok\",\n blocked: \"text-warn\",\n idle: \"text-muted\",\n completed: \"text-ok\",\n stopped: \"text-muted\",\n error: \"text-danger\",\n errored: \"text-danger\",\n};\n\nconst SESSION_PULSE: ReadonlySet<string> = new Set([\n \"active\",\n \"running\",\n \"tool_running\",\n]);\n\nconst VERIFICATION_ICON: Record<\n CodingAgentTaskArtifactRecord[\"verificationStatus\"],\n LucideIcon\n> = {\n passed: CircleCheck,\n failed: CircleX,\n pending: CircleDashed,\n unknown: Circle,\n};\n\nconst VERIFICATION_TONE: Record<\n CodingAgentTaskArtifactRecord[\"verificationStatus\"],\n string\n> = {\n passed: \"text-ok\",\n failed: \"text-danger\",\n pending: \"text-warn\",\n unknown: \"text-muted\",\n};\n\nconst PLAN_STEP_ICON: Record<string, LucideIcon> = {\n done: CircleCheck,\n completed: CircleCheck,\n passed: CircleCheck,\n in_progress: CircleDashed,\n active: CircleDashed,\n running: CircleDashed,\n blocked: OctagonX,\n failed: CircleX,\n pending: Circle,\n todo: Circle,\n};\n\nconst PLAN_STEP_TONE: Record<string, string> = {\n done: \"text-ok\",\n completed: \"text-ok\",\n passed: \"text-ok\",\n in_progress: \"text-accent\",\n active: \"text-accent\",\n running: \"text-accent\",\n blocked: \"text-warn\",\n failed: \"text-danger\",\n pending: \"text-muted\",\n todo: \"text-muted\",\n};\n\nconst FILTER_OPTIONS: StatusFilter[] = [\n \"all\",\n \"active\",\n \"blocked\",\n \"validating\",\n \"waiting_on_user\",\n \"interrupted\",\n \"open\",\n \"done\",\n \"failed\",\n];\n\nconst STATUS_LABEL_KEY: Record<TaskStatus, string> = {\n open: \"orchestrator.status.open\",\n active: \"orchestrator.status.active\",\n waiting_on_user: \"orchestrator.status.waitingOnUser\",\n blocked: \"orchestrator.status.blocked\",\n validating: \"orchestrator.status.validating\",\n done: \"orchestrator.status.done\",\n failed: \"orchestrator.status.failed\",\n archived: \"orchestrator.status.archived\",\n interrupted: \"orchestrator.status.interrupted\",\n};\n\nfunction labelStatus(status: TaskStatus, t: Translate): string {\n return t(STATUS_LABEL_KEY[status], {\n defaultValue: status.replace(/_/g, \" \"),\n });\n}\n\nfunction labelPriority(priority: TaskPriority, t: Translate): string {\n return t(`orchestrator.priority.${priority}`, { defaultValue: priority });\n}\n\nfunction StatusGlyph({\n status,\n paused,\n t,\n size = \"h-3.5 w-3.5\",\n}: {\n status: TaskStatus;\n paused?: boolean;\n t: Translate;\n size?: string;\n}) {\n const Icon = STATUS_ICON[status];\n const label = labelStatus(status, t);\n const pulse = STATUS_PULSE.has(status) && !paused ? \" animate-pulse\" : \"\";\n return (\n <span\n className=\"inline-flex shrink-0\"\n title={label}\n aria-label={label}\n role=\"img\"\n >\n <Icon className={`${size} ${STATUS_TONE[status]}${pulse}`} aria-hidden />\n </span>\n );\n}\n\nfunction SessionGlyph({\n status,\n t,\n size = \"h-3.5 w-3.5\",\n}: {\n status: string;\n t: Translate;\n size?: string;\n}) {\n const Icon = SESSION_ICON[status] ?? Circle;\n const tone = SESSION_TONE[status] ?? \"text-muted\";\n const label = labelSessionStatus(status, t);\n const pulse = SESSION_PULSE.has(status) ? \" animate-pulse\" : \"\";\n return (\n <span\n className=\"inline-flex shrink-0\"\n title={label}\n aria-label={label}\n role=\"img\"\n >\n <Icon className={`${size} ${tone}${pulse}`} aria-hidden />\n </span>\n );\n}\n\nfunction VerificationGlyph({\n status,\n t,\n}: {\n status: CodingAgentTaskArtifactRecord[\"verificationStatus\"];\n t: Translate;\n}) {\n const Icon = VERIFICATION_ICON[status];\n const label = t(`orchestrator.verification.${status}`, {\n defaultValue: status,\n });\n return (\n <span\n className=\"inline-flex shrink-0\"\n title={label}\n aria-label={label}\n role=\"img\"\n >\n <Icon\n className={`h-3.5 w-3.5 ${VERIFICATION_TONE[status]}`}\n aria-hidden\n />\n </span>\n );\n}\n\nfunction PlanStepGlyph({ status, t }: { status: string; t: Translate }) {\n const key = status\n .trim()\n .toLowerCase()\n .replace(/[\\s-]+/g, \"_\");\n const Icon = PLAN_STEP_ICON[key] ?? Circle;\n const tone = PLAN_STEP_TONE[key] ?? \"text-muted\";\n const label = t(`orchestrator.planStatus.${key}`, {\n defaultValue: status.replace(/_/g, \" \"),\n });\n return (\n <span\n className=\"mt-px inline-flex shrink-0\"\n title={label}\n aria-label={label}\n role=\"img\"\n >\n <Icon className={`h-3.5 w-3.5 ${tone}`} aria-hidden />\n </span>\n );\n}\n\nconst SENDER_LABEL_KEY: Record<\n CodingAgentTaskMessageRecord[\"senderKind\"],\n { key: string; fallback: string }\n> = {\n user: { key: \"orchestrator.sender.user\", fallback: \"You\" },\n orchestrator: {\n key: \"orchestrator.sender.orchestrator\",\n fallback: \"Orchestrator\",\n },\n sub_agent: { key: \"orchestrator.sender.subAgent\", fallback: \"Sub-agent\" },\n system: { key: \"orchestrator.sender.system\", fallback: \"System\" },\n};\n\nfunction labelSender(\n kind: CodingAgentTaskMessageRecord[\"senderKind\"],\n t: Translate,\n): string {\n const meta = SENDER_LABEL_KEY[kind];\n return t(meta.key, { defaultValue: meta.fallback });\n}\n\n/**\n * Resolve the display name for a timeline message's sender. Sub-agents render\n * their per-session label (the name they were spun up with); the orchestrator\n * renders the running agent's name (usually \"Eliza\"). Falls back to the generic\n * role label when no specific name is available.\n */\nfunction resolveSenderName(\n message: CodingAgentTaskMessageRecord,\n sessionLabelById: Map<string, string>,\n mainAgentName: string | undefined,\n t: Translate,\n): string {\n if (message.senderKind === \"sub_agent\") {\n const label = message.sessionId\n ? sessionLabelById.get(message.sessionId)?.trim()\n : undefined;\n return label || labelSender(\"sub_agent\", t);\n }\n if (message.senderKind === \"orchestrator\") {\n return mainAgentName?.trim() || labelSender(\"orchestrator\", t);\n }\n return labelSender(message.senderKind, t);\n}\n\nfunction getClientErrorMessage(error: unknown, fallback: string): string {\n return error instanceof Error && error.message ? error.message : fallback;\n}\n\n/**\n * True when the connected agent simply doesn't serve the orchestrator backend\n * (a 404 on its routes) — e.g. a local on-device agent without\n * agent-orchestrator. This is NOT a failure: the workbench runs against\n * whatever agent the client points at, so a cloud or desktop agent that has the\n * backend just works. We surface a calm \"connect a cloud/desktop agent\" hint\n * instead of a red error in that case.\n */\nfunction isOrchestratorBackendAbsent(error: unknown): boolean {\n const status = (error as { status?: unknown } | null)?.status;\n if (status === 404) return true;\n const msg = error instanceof Error ? error.message.toLowerCase() : \"\";\n return msg === \"not found\" || msg.includes(\"404\");\n}\n\n/** Merge timeline records by id and return them ascending by timestamp. */\nfunction mergeById<T extends { id: string; timestamp: number }>(\n previous: T[],\n incoming: T[],\n): T[] {\n if (incoming.length === 0) return previous;\n const byId = new Map<string, T>();\n for (const item of previous) byId.set(item.id, item);\n for (const item of incoming) byId.set(item.id, item);\n return [...byId.values()].sort((a, b) => a.timestamp - b.timestamp);\n}\n\nfunction splitTimelineItems(items: CodingAgentTaskTimelineItem[]): {\n messages: CodingAgentTaskMessageRecord[];\n events: CodingAgentTaskEventRecord[];\n} {\n const messages: CodingAgentTaskMessageRecord[] = [];\n const events: CodingAgentTaskEventRecord[] = [];\n for (const item of items) {\n if (item.kind === \"message\") messages.push(item.message);\n else events.push(item.event);\n }\n return { messages, events };\n}\n\ninterface NormalizedPlan {\n summary: string | null;\n /** `key` is the step's ordinal identity within this plan snapshot (plans are\n * ordered and steps carry no server id), used for stable React keys. */\n steps: { key: string; label: string; status: string | null }[];\n}\n\n/** Adapt the free-form `currentPlan` record into a renderable shape, or null\n * when it carries no recognizable summary/steps (so we never dump raw JSON). */\nfunction normalizePlan(\n plan: Record<string, unknown> | null,\n): NormalizedPlan | null {\n if (!plan) return null;\n const summary = typeof plan.summary === \"string\" ? plan.summary : null;\n const rawSteps = Array.isArray(plan.steps) ? plan.steps : [];\n const steps: NormalizedPlan[\"steps\"] = [];\n for (const raw of rawSteps) {\n if (typeof raw === \"string\" && raw.trim()) {\n steps.push({\n key: `step-${steps.length}`,\n label: raw.trim(),\n status: null,\n });\n continue;\n }\n if (raw && typeof raw === \"object\") {\n const obj = raw as Record<string, unknown>;\n const label =\n (typeof obj.title === \"string\" && obj.title) ||\n (typeof obj.label === \"string\" && obj.label) ||\n (typeof obj.description === \"string\" && obj.description) ||\n null;\n if (!label) continue;\n steps.push({\n key: `step-${steps.length}`,\n label,\n status: typeof obj.status === \"string\" ? obj.status : null,\n });\n }\n }\n if (!summary && steps.length === 0) return null;\n return { summary, steps };\n}\n\n// --- Usage rendering -------------------------------------------------------\n// Token/cost figures are computed server-side. The client only formats them and\n// honors `state` so \"unavailable\" never renders as a misleading confident zero.\n\ntype UsageState = \"measured\" | \"estimated\" | \"unavailable\";\n\n// Shared token formatter so every surface (header, inspector total, per-provider\n// breakdown, sub-agent cards) renders the same `~` estimated prefix and `—`\n// unavailable marker instead of a misleading confident number.\nfunction formatTokenCount(\n state: UsageState,\n totalTokens: number,\n t: Translate,\n locale?: string,\n): string {\n if (state === \"unavailable\") {\n return t(\"orchestrator.usage.unavailable\", { defaultValue: \"—\" });\n }\n const value = formatCompactNumber(totalTokens, locale);\n return state === \"estimated\"\n ? t(\"orchestrator.usage.estimatedTokens\", {\n defaultValue: \"~{{value}}\",\n value,\n })\n : value;\n}\n\nfunction renderTokens(\n usage: CodingAgentTaskUsageSummary,\n t: Translate,\n locale?: string,\n): string {\n return formatTokenCount(usage.state, usage.totalTokens, t, locale);\n}\n\nfunction renderCost(\n usage: CodingAgentTaskUsageSummary,\n t: Translate,\n locale?: string,\n): string {\n if (usage.state === \"unavailable\") {\n return t(\"orchestrator.usage.unavailable\", { defaultValue: \"—\" });\n }\n const value = formatUsd(usage.costUsd, locale);\n return usage.state === \"estimated\"\n ? t(\"orchestrator.usage.estimatedCost\", {\n defaultValue: \"~{{value}}\",\n value,\n })\n : value;\n}\n\n/** One labeled count in the header summary — a baseline-aligned number + tiny\n * label, no pill/border. */\nfunction HeaderStat({\n value,\n label,\n toneClass = \"text-txt-strong\",\n}: {\n value: string;\n label: string;\n toneClass?: string;\n}) {\n return (\n <span className=\"inline-flex shrink-0 items-baseline gap-1\" title={label}>\n <span className={`text-sm font-semibold tabular-nums ${toneClass}`}>\n {value}\n </span>\n <span className=\"text-2xs text-muted\">{label}</span>\n </span>\n );\n}\n\n/** Borderless inspector section separated by whitespace alone. */\nfunction InspectorSection({\n title,\n action,\n children,\n}: {\n title: string;\n action?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <section className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between gap-2\">\n <h3 className=\"text-xs font-medium text-muted\">{title}</h3>\n {action}\n </div>\n {children}\n </section>\n );\n}\n\nfunction WorkbenchHeader({\n status,\n busy,\n isMobile,\n onPauseAll,\n onResumeAll,\n t,\n locale,\n}: {\n status: CodingAgentOrchestratorStatus | null;\n busy: boolean;\n isMobile: boolean;\n onPauseAll: () => void;\n onResumeAll: () => void;\n t: Translate;\n locale?: string;\n}) {\n const title = (\n <div className=\"flex shrink-0 items-center gap-2\">\n <Layers className=\"h-4 w-4 text-accent\" />\n <span className=\"text-sm font-semibold text-txt-strong\">\n {t(\"orchestrator.title\", { defaultValue: \"Orchestrator\" })}\n </span>\n </div>\n );\n // Calm labeled summary: total tasks always, then only the non-zero semantic\n // counts — reads \"12 tasks · 1 active · 3 done\", not a six-pill debug strip.\n const summary = (\n <div\n className=\"flex min-w-0 items-center gap-4 overflow-x-auto\"\n style={isMobile ? undefined : { flex: \"1 1 0%\" }}\n >\n <HeaderStat value={String(status?.taskCount ?? 0)} label=\"tasks\" />\n {status?.activeTaskCount ? (\n <HeaderStat\n value={String(status.activeTaskCount)}\n label=\"active\"\n toneClass=\"text-ok\"\n />\n ) : null}\n {status?.blockedTaskCount ? (\n <HeaderStat\n value={String(status.blockedTaskCount)}\n label=\"blocked\"\n toneClass=\"text-warn\"\n />\n ) : null}\n {status?.validatingTaskCount ? (\n <HeaderStat\n value={String(status.validatingTaskCount)}\n label=\"validating\"\n toneClass=\"text-accent\"\n />\n ) : null}\n {status?.activeSessionCount ? (\n <HeaderStat\n value={`${status.activeSessionCount}/${status.sessionCount}`}\n label=\"agents\"\n />\n ) : null}\n </div>\n );\n // Only surface the usage readout once there is real spend to report. An\n // unavailable usage state renders \"— · —\", which looks like a debug leftover.\n const usageReadout =\n status && status.usage.state !== \"unavailable\" ? (\n <span\n className=\"flex shrink-0 items-center gap-1.5 text-xs tabular-nums text-muted\"\n title={t(\"orchestrator.stat.usage\", { defaultValue: \"Usage\" })}\n >\n <Gauge className=\"h-3 w-3 text-muted/70\" />\n {renderTokens(status.usage, t, locale)}\n <span className=\"text-muted/50\">·</span>\n {renderCost(status.usage, t, locale)}\n </span>\n ) : null;\n const pauseAllLabel = t(\"orchestrator.action.pauseAll\", {\n defaultValue: \"Pause all\",\n });\n const resumeAllLabel = t(\"orchestrator.action.resumeAll\", {\n defaultValue: \"Resume all\",\n });\n const { ref: pauseAllRef, agentProps: pauseAllAgentProps } =\n useAgentElement<HTMLButtonElement>({\n id: \"header-pause-all\",\n role: \"button\",\n label: pauseAllLabel,\n group: \"orchestrator-header\",\n description: \"Pause every active orchestrator task\",\n });\n const { ref: resumeAllRef, agentProps: resumeAllAgentProps } =\n useAgentElement<HTMLButtonElement>({\n id: \"header-resume-all\",\n role: \"button\",\n label: resumeAllLabel,\n group: \"orchestrator-header\",\n description: \"Resume every paused orchestrator task\",\n });\n // Pause-all / resume-all only surface while there is something to act on, so a\n // quiet orchestrator shows no controls at all — the dashboard is read-only\n // until work is in flight. New tasks are started conversationally in chat.\n const actions =\n status?.activeTaskCount || status?.pausedTaskCount ? (\n <div className=\"ml-auto flex shrink-0 items-center gap-1.5\">\n {status?.activeTaskCount ? (\n <Button\n ref={pauseAllRef}\n variant=\"ghost\"\n size=\"sm\"\n disabled={busy}\n onClick={onPauseAll}\n className=\"h-7 w-7 p-0\"\n aria-label={pauseAllLabel}\n title={pauseAllLabel}\n data-testid=\"orchestrator-pause-all\"\n {...pauseAllAgentProps}\n >\n <Pause className=\"h-3.5 w-3.5\" />\n </Button>\n ) : null}\n {status?.pausedTaskCount ? (\n <Button\n ref={resumeAllRef}\n variant=\"ghost\"\n size=\"sm\"\n disabled={busy}\n onClick={onResumeAll}\n className=\"h-7 w-7 p-0\"\n aria-label={resumeAllLabel}\n title={resumeAllLabel}\n data-testid=\"orchestrator-resume-all\"\n {...resumeAllAgentProps}\n >\n <Play className=\"h-3.5 w-3.5\" />\n </Button>\n ) : null}\n </div>\n ) : null;\n\n if (isMobile) {\n return (\n <header className=\"flex flex-col gap-2 bg-bg px-4 py-2.5\">\n <div className=\"flex items-center gap-2\">\n {title}\n {actions}\n </div>\n <div className=\"flex items-center justify-between gap-2\">\n {summary}\n {usageReadout}\n </div>\n </header>\n );\n }\n\n return (\n <header className=\"flex items-center gap-4 bg-bg px-4 py-2.5\">\n {title}\n {summary}\n {usageReadout}\n {actions}\n </header>\n );\n}\n\nfunction FilterSelect({\n status,\n active,\n onSelect,\n t,\n}: {\n status: CodingAgentOrchestratorStatus | null;\n active: StatusFilter;\n onSelect: (filter: StatusFilter) => void;\n t: Translate;\n}) {\n const countFor = (filter: StatusFilter): number => {\n if (!status) return 0;\n if (filter === \"all\") return status.taskCount;\n return status.byStatus[filter] ?? 0;\n };\n const filterLabel = t(\"orchestrator.filter.label\", {\n defaultValue: \"Filter by status\",\n });\n const { ref, agentProps } = useAgentElement<HTMLButtonElement>({\n id: \"rail-filter-status\",\n role: \"select\",\n label: filterLabel,\n group: \"orchestrator-rail\",\n description: \"Filter the task list by status\",\n options: FILTER_OPTIONS,\n getValue: () => active,\n onFill: (value) => {\n if ((FILTER_OPTIONS as string[]).includes(value)) {\n onSelect(value as StatusFilter);\n }\n },\n });\n const labelFor = (filter: StatusFilter) =>\n filter === \"all\"\n ? t(\"orchestrator.filter.all\", { defaultValue: \"All\" })\n : labelStatus(filter, t);\n return (\n <Select\n value={active}\n onValueChange={(value) => onSelect(value as StatusFilter)}\n >\n <SelectTrigger\n ref={ref}\n aria-label={filterLabel}\n data-testid=\"orchestrator-filter\"\n className=\"h-9 border-0 bg-transparent px-1 text-xs\"\n {...agentProps}\n >\n <span className=\"flex items-center gap-2\">\n {active !== \"all\" ? (\n <TaskStatusChip status={active} t={t} />\n ) : (\n <span className=\"text-txt\">{labelFor(\"all\")}</span>\n )}\n <span className=\"text-muted tabular-nums\">({countFor(active)})</span>\n </span>\n </SelectTrigger>\n <SelectContent>\n {FILTER_OPTIONS.map((filter) => (\n <SelectItem key={filter} value={filter} className=\"text-xs\">\n <span className=\"flex items-center gap-2\">\n {filter === \"all\" ? (\n <span>{labelFor(\"all\")}</span>\n ) : (\n <TaskStatusChip status={filter} t={t} />\n )}\n <span className=\"text-muted tabular-nums\">\n ({countFor(filter)})\n </span>\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\n/** Visual metadata for an orchestrator task row. */\nfunction orchestratorTaskChips(\n thread: CodingAgentTaskThread,\n t: Translate,\n locale?: string,\n): ReactNode {\n const lastActivity =\n thread.latestActivityAt != null\n ? formatRelativeTime(thread.latestActivityAt, locale)\n : formatIsoRelative(\n thread.updatedAt,\n locale,\n t(\"orchestrator.unknown\", { defaultValue: \"—\" }),\n );\n const PriorityIcon = PRIORITY_ICON[thread.priority];\n return (\n <>\n {thread.sessionCount > 0 ? (\n <TaskMetaChip\n icon={<Bot className=\"h-3 w-3\" />}\n tone={thread.activeSessionCount > 0 ? \"accent\" : \"muted\"}\n >\n {t(\"orchestrator.chip.agents\", {\n defaultValue: \"{{active}}/{{total}} agents\",\n active: thread.activeSessionCount,\n total: thread.sessionCount,\n })}\n </TaskMetaChip>\n ) : null}\n {thread.paused ? (\n <TaskMetaChip icon={<Pause className=\"h-3 w-3\" />}>\n {t(\"orchestrator.status.paused\", { defaultValue: \"Paused\" })}\n </TaskMetaChip>\n ) : null}\n {PriorityIcon && thread.priority !== \"normal\" ? (\n <TaskMetaChip icon={<PriorityIcon className=\"h-3 w-3\" />}>\n {labelPriority(thread.priority, t)}\n </TaskMetaChip>\n ) : null}\n <span className=\"text-2xs text-muted/80\">{lastActivity}</span>\n </>\n );\n}\n\nfunction SubAgentCard({\n session,\n busy,\n onInspect,\n onStop,\n t,\n locale,\n}: {\n session: CodingAgentTaskSessionRecord;\n busy: boolean;\n onInspect: (sessionId: string) => void;\n onStop: (sessionId: string) => void;\n t: Translate;\n locale?: string;\n}) {\n const stoppable = session.stoppedAt == null && session.status !== \"completed\";\n const provider = [session.framework, session.model]\n .filter((part): part is string => Boolean(part))\n .join(\" · \");\n const workspace =\n session.repo ||\n session.workdir ||\n t(\"orchestrator.noWorkspace\", { defaultValue: \"None\" });\n const stopLabel = t(\"orchestrator.action.stopAgent\", {\n defaultValue: \"Stop agent\",\n });\n const inspectLabel = t(\"orchestrator.action.inspectAgent\", {\n defaultValue: \"Inspect agent\",\n });\n const { ref: inspectRef, agentProps: inspectAgentProps } =\n useAgentElement<HTMLButtonElement>({\n id: `sub-agent-inspect-${session.sessionId}`,\n role: \"button\",\n label: `${inspectLabel}: ${session.label}`,\n group: \"orchestrator-sub-agents\",\n description: `Open recovery and event details for the \"${session.label}\" sub-agent`,\n });\n const { ref: stopRef, agentProps: stopAgentProps } =\n useAgentElement<HTMLButtonElement>({\n id: `sub-agent-stop-${session.sessionId}`,\n role: \"button\",\n label: `${stopLabel}: ${session.label}`,\n group: \"orchestrator-sub-agents\",\n description: `Stop the \"${session.label}\" sub-agent`,\n });\n return (\n <div className=\"py-1\">\n <div className=\"flex items-center gap-1.5\">\n <SessionGlyph status={session.status} t={t} />\n <span className=\"min-w-0 flex-1 truncate text-xs font-medium text-txt\">\n {session.label}\n </span>\n <button\n ref={inspectRef}\n type=\"button\"\n onClick={() => onInspect(session.sessionId)}\n className=\"flex items-center gap-0.5 px-1 py-0.5 text-2xs text-muted transition-colors hover:text-txt\"\n data-testid=\"orchestrator-inspect-session\"\n aria-label={inspectLabel}\n title={inspectLabel}\n {...inspectAgentProps}\n >\n <PanelRightOpen className=\"h-3 w-3\" />\n </button>\n {stoppable ? (\n <button\n ref={stopRef}\n type=\"button\"\n disabled={busy}\n onClick={() => onStop(session.sessionId)}\n className=\"flex items-center gap-0.5 px-1 py-0.5 text-2xs text-muted transition-colors hover:text-danger disabled:opacity-50\"\n data-testid=\"orchestrator-stop-agent\"\n aria-label={stopLabel}\n {...stopAgentProps}\n >\n <CircleStop className=\"h-3 w-3\" />\n </button>\n ) : null}\n </div>\n {provider ? (\n <div className=\"mt-0.5 truncate text-2xs text-muted\">{provider}</div>\n ) : null}\n <div className=\"mt-0.5 flex items-center gap-2 text-2xs text-muted\">\n {session.activeTool ? (\n <span className=\"truncate text-warn\">{session.activeTool}</span>\n ) : null}\n <span className=\"ml-auto tabular-nums\">\n {formatTokenCount(session.usageState, session.totalTokens, t, locale)}\n </span>\n </div>\n <div className=\"mt-0.5 truncate text-2xs text-muted/80\">{workspace}</div>\n </div>\n );\n}\n\n/** Sub-agent status labels reuse task-status keys where they overlap and fall\n * back to the raw token otherwise (sessions carry framework-specific states). */\nfunction labelSessionStatus(status: string, t: Translate): string {\n return t(`orchestrator.sessionStatus.${status}`, {\n defaultValue: status.replace(/_/g, \" \"),\n });\n}\n\nfunction PlanSection({ plan, t }: { plan: NormalizedPlan; t: Translate }) {\n return (\n <InspectorSection title={t(\"orchestrator.plan\", { defaultValue: \"Plan\" })}>\n {plan.summary ? (\n <p className=\"mb-2 text-xs-tight text-txt\">{plan.summary}</p>\n ) : null}\n {plan.steps.length > 0 ? (\n <ol className=\"space-y-1\">\n {plan.steps.map((step, index) => (\n <li\n key={step.key}\n className=\"flex items-start gap-1.5 text-xs-tight text-txt\"\n >\n <span className=\"mt-px shrink-0 tabular-nums text-muted\">\n {index + 1}.\n </span>\n <span className=\"min-w-0 flex-1\">{step.label}</span>\n {step.status ? (\n <PlanStepGlyph status={step.status} t={t} />\n ) : null}\n </li>\n ))}\n </ol>\n ) : null}\n </InspectorSection>\n );\n}\n\nfunction EditedPlanRestartSection({\n plan,\n latestPlanRevisionId,\n busy,\n onSubmit,\n t,\n}: {\n plan: Record<string, unknown>;\n latestPlanRevisionId?: string;\n busy: boolean;\n onSubmit: (input: CodingAgentRestartWithEditedPlanInput) => void;\n t: Translate;\n}) {\n const planSource = useMemo(() => JSON.stringify(plan, null, 2), [plan]);\n const [open, setOpen] = useState(false);\n const [draft, setDraft] = useState(planSource);\n const [summary, setSummary] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n const toggleLabel = t(\"orchestrator.action.editPlan\", {\n defaultValue: \"Edit plan\",\n });\n const restartLabel = t(\"orchestrator.action.restartWithPlan\", {\n defaultValue: \"Restart with plan\",\n });\n const summaryLabel = t(\"orchestrator.planEdit.summary\", {\n defaultValue: \"Edit summary\",\n });\n const draftLabel = t(\"orchestrator.planEdit.draft\", {\n defaultValue: \"Plan JSON\",\n });\n const baseLabel = t(\"orchestrator.planEdit.base\", {\n defaultValue: \"Base revision\",\n });\n const currentPlanLabel = t(\"orchestrator.planEdit.currentPlan\", {\n defaultValue: \"Current plan\",\n });\n const { ref: toggleRef, agentProps: toggleAgentProps } =\n useAgentElement<HTMLButtonElement>({\n id: \"inspector-plan-edit-toggle\",\n role: \"button\",\n label: toggleLabel,\n group: \"orchestrator-inspector\",\n description: \"Open the plan JSON editor\",\n });\n const { ref: restartRef, agentProps: restartAgentProps } =\n useAgentElement<HTMLButtonElement>({\n id: \"inspector-restart-edited-plan\",\n role: \"button\",\n label: restartLabel,\n group: \"orchestrator-inspector\",\n description: \"Restart this task with the edited plan\",\n });\n\n useEffect(() => {\n setDraft(planSource);\n setSummary(\"\");\n setError(null);\n }, [planSource]);\n\n const submit = () => {\n let parsed: unknown;\n try {\n parsed = JSON.parse(draft);\n } catch {\n setError(\n t(\"orchestrator.planEdit.invalidJson\", {\n defaultValue: \"Plan must be valid JSON.\",\n }),\n );\n return;\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n setError(\n t(\"orchestrator.planEdit.invalidObject\", {\n defaultValue: \"Plan must be a JSON object.\",\n }),\n );\n return;\n }\n const confirmed =\n typeof window === \"undefined\" ||\n window.confirm(\n t(\"orchestrator.confirmRestartWithPlan\", {\n defaultValue:\n \"Restart this task with the edited plan? Active agents will be stopped first.\",\n }),\n );\n if (!confirmed) return;\n setError(null);\n onSubmit({\n plan: parsed as Record<string, unknown>,\n basePlanRevisionId: latestPlanRevisionId,\n editSummary: summary.trim() || undefined,\n stopActive: true,\n });\n };\n\n return (\n <InspectorSection\n title={t(\"orchestrator.planEdit.title\", {\n defaultValue: \"Plan editor\",\n })}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"min-w-0 text-2xs text-muted\">\n <span className=\"font-semibold text-muted-strong\">{baseLabel}</span>\n <span className=\"ml-1 truncate\">\n {latestPlanRevisionId ?? currentPlanLabel}\n </span>\n </div>\n <button\n ref={toggleRef}\n type=\"button\"\n disabled={busy}\n onClick={() => setOpen((prev) => !prev)}\n className=\"inline-flex h-7 shrink-0 items-center gap-1.5 px-1 text-2xs font-semibold text-muted transition-colors hover:text-txt disabled:opacity-50\"\n data-testid=\"orchestrator-plan-edit-toggle\"\n {...toggleAgentProps}\n >\n {open ? (\n <ChevronUp className=\"h-3 w-3\" />\n ) : (\n <ChevronDown className=\"h-3 w-3\" />\n )}\n {toggleLabel}\n </button>\n </div>\n {open ? (\n <div className=\"mt-2 space-y-2\">\n <label className=\"block\">\n <FieldLabel>{summaryLabel}</FieldLabel>\n <input\n value={summary}\n onChange={(event) => setSummary(event.target.value)}\n className={FIELD_CLASS}\n placeholder={t(\"orchestrator.planEdit.summaryPlaceholder\", {\n defaultValue: \"What changed\",\n })}\n data-testid=\"orchestrator-plan-edit-summary\"\n />\n </label>\n <label className=\"block\">\n <FieldLabel>{draftLabel}</FieldLabel>\n <textarea\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n rows={8}\n className={`${FIELD_CLASS} resize-y font-mono leading-relaxed`}\n spellCheck={false}\n data-testid=\"orchestrator-plan-draft\"\n />\n </label>\n {error ? <p className=\"text-2xs text-danger\">{error}</p> : null}\n <div className=\"flex justify-end\">\n <Button\n ref={restartRef}\n type=\"button\"\n size=\"sm\"\n disabled={busy}\n onClick={submit}\n className=\"h-7 gap-1.5 px-2.5 text-xs-tight\"\n data-testid=\"orchestrator-plan-restart\"\n {...restartAgentProps}\n >\n <RotateCcw className=\"h-3 w-3\" />\n {restartLabel}\n </Button>\n </div>\n </div>\n ) : null}\n </InspectorSection>\n );\n}\n\nfunction AcceptanceSection({\n criteria,\n t,\n}: {\n criteria: string[];\n t: Translate;\n}) {\n return (\n <InspectorSection\n title={t(\"orchestrator.acceptance\", { defaultValue: \"Acceptance\" })}\n >\n <ul className=\"space-y-1\">\n {criteria.map((criterion, index) => (\n <li\n // biome-ignore lint/suspicious/noArrayIndexKey: criteria strings may repeat, so index disambiguates the composite key\n key={`${criterion}-${index}`}\n className=\"flex items-start gap-1.5 text-xs-tight text-txt\"\n >\n <span className=\"mt-1 inline-block h-1.5 w-1.5 shrink-0 rounded-full bg-accent/60\" />\n <span>{criterion}</span>\n </li>\n ))}\n </ul>\n </InspectorSection>\n );\n}\n\nfunction ArtifactSection({\n artifacts,\n t,\n}: {\n artifacts: CodingAgentTaskArtifactRecord[];\n t: Translate;\n}) {\n return (\n <InspectorSection\n title={t(\"orchestrator.artifacts\", { defaultValue: \"Artifacts\" })}\n >\n <div className=\"space-y-1.5\">\n {artifacts.map((artifact) => (\n <div key={artifact.id} className=\"text-xs-tight\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"min-w-0 flex-1 truncate font-medium text-txt\">\n {artifact.title}\n </span>\n <VerificationGlyph status={artifact.verificationStatus} t={t} />\n </div>\n <div className=\"truncate text-muted\">\n {artifact.artifactType}\n {artifact.path || artifact.uri\n ? ` · ${artifact.path ?? artifact.uri}`\n : \"\"}\n </div>\n </div>\n ))}\n </div>\n </InspectorSection>\n );\n}\n\nfunction UsageSection({\n usage,\n t,\n locale,\n}: {\n usage: CodingAgentTaskUsageSummary;\n t: Translate;\n locale?: string;\n}) {\n return (\n <InspectorSection\n title={t(\"orchestrator.usage.title\", { defaultValue: \"Tokens & cost\" })}\n >\n <div className=\"mb-2 flex items-center gap-3 text-xs\">\n <span className=\"text-txt\">\n <span className=\"font-semibold tabular-nums\">\n {renderTokens(usage, t, locale)}\n </span>{\" \"}\n <span className=\"text-muted\">\n {t(\"orchestrator.usage.tokens\", { defaultValue: \"tokens\" })}\n </span>\n </span>\n <span className=\"text-txt\">\n <span className=\"font-semibold tabular-nums\">\n {renderCost(usage, t, locale)}\n </span>\n </span>\n </div>\n {usage.byProvider.length > 1 ? (\n <div className=\"space-y-1\">\n {usage.byProvider.map((entry) => (\n <div\n key={`${entry.provider}-${entry.model ?? \"default\"}`}\n className=\"flex items-center gap-2 text-2xs text-muted\"\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {entry.provider}\n {entry.model ? ` · ${entry.model}` : \"\"}\n </span>\n <span className=\"shrink-0 tabular-nums\">\n {formatTokenCount(entry.state, entry.totalTokens, t, locale)}\n </span>\n <span className=\"shrink-0 tabular-nums\">\n {entry.state === \"unavailable\"\n ? t(\"orchestrator.usage.unavailable\", { defaultValue: \"—\" })\n : formatUsd(entry.costUsd, locale)}\n </span>\n </div>\n ))}\n </div>\n ) : null}\n </InspectorSection>\n );\n}\n\nconst FIELD_CLASS =\n \"w-full border-border/35 border-b bg-transparent px-1 py-1.5 text-xs text-txt outline-none transition-colors placeholder:text-muted focus:border-accent/60\";\n\nfunction FieldLabel({ children }: { children: ReactNode }) {\n return (\n <span className=\"mb-1 block text-xs font-medium text-muted\">\n {children}\n </span>\n );\n}\n\nfunction AddAgentForm({\n busy,\n onClose,\n onSubmit,\n t,\n}: {\n busy: boolean;\n onClose: () => void;\n onSubmit: (input: CodingAgentAddAgentInput) => void;\n t: Translate;\n}) {\n const [label, setLabel] = useState(\"\");\n const [framework, setFramework] = useState(\"\");\n const [model, setModel] = useState(\"\");\n const [workdir, setWorkdir] = useState(\"\");\n const [repo, setRepo] = useState(\"\");\n const [task, setTask] = useState(\"\");\n\n const fieldLabels = {\n label: t(\"orchestrator.addAgent.label\", {\n defaultValue: \"Label (optional)\",\n }),\n framework: t(\"orchestrator.addAgent.framework\", {\n defaultValue: \"Framework\",\n }),\n model: t(\"orchestrator.addAgent.model\", { defaultValue: \"Model\" }),\n workdir: t(\"orchestrator.addAgent.workdir\", {\n defaultValue: \"Workdir (optional)\",\n }),\n repo: t(\"orchestrator.addAgent.repo\", {\n defaultValue: \"Repo URL (optional)\",\n }),\n task: t(\"orchestrator.addAgent.task\", {\n defaultValue: \"Sub-task for this agent (optional)\",\n }),\n };\n const spawnLabel = t(\"orchestrator.action.spawn\", {\n defaultValue: \"Spawn agent\",\n });\n const cancelLabel = t(\"orchestrator.action.cancel\", {\n defaultValue: \"Cancel\",\n });\n const spawn = () =>\n onSubmit({\n label: label.trim() || undefined,\n framework: framework.trim() || undefined,\n model: model.trim() || undefined,\n workdir: workdir.trim() || undefined,\n repo: repo.trim() || undefined,\n task: task.trim() || undefined,\n });\n const { ref: labelRef, agentProps: labelAgentProps } =\n useAgentElement<HTMLInputElement>({\n id: \"add-agent-label\",\n role: \"text-input\",\n label: fieldLabels.label,\n group: \"orchestrator-add-agent\",\n description: \"Optional label for the spawned sub-agent\",\n getValue: () => label,\n onFill: (value) => setLabel(value),\n });\n const { ref: frameworkRef, agentProps: frameworkAgentProps } =\n useAgentElement<HTMLInputElement>({\n id: \"add-agent-framework\",\n role: \"text-input\",\n label: fieldLabels.framework,\n group: \"orchestrator-add-agent\",\n description: \"Coding-agent framework for the sub-agent\",\n getValue: () => framework,\n onFill: (value) => setFramework(value),\n });\n const { ref: modelRef, agentProps: modelAgentProps } =\n useAgentElement<HTMLInputElement>({\n id: \"add-agent-model\",\n role: \"text-input\",\n label: fieldLabels.model,\n group: \"orchestrator-add-agent\",\n description: \"Model for the sub-agent\",\n getValue: () => model,\n onFill: (value) => setModel(value),\n });\n const { ref: workdirRef, agentProps: workdirAgentProps } =\n useAgentElement<HTMLInputElement>({\n id: \"add-agent-workdir\",\n role: \"text-input\",\n label: fieldLabels.workdir,\n group: \"orchestrator-add-agent\",\n description: \"Optional working directory for the sub-agent\",\n getValue: () => workdir,\n onFill: (value) => setWorkdir(value),\n });\n const { ref: repoRef, agentProps: repoAgentProps } =\n useAgentElement<HTMLInputElement>({\n id: \"add-agent-repo\",\n role: \"text-input\",\n label: fieldLabels.repo,\n group: \"orchestrator-add-agent\",\n description: \"Optional repo URL for the sub-agent\",\n getValue: () => repo,\n onFill: (value) => setRepo(value),\n });\n const { ref: taskRef, agentProps: taskAgentProps } =\n useAgentElement<HTMLTextAreaElement>({\n id: \"add-agent-task\",\n role: \"textarea\",\n label: fieldLabels.task,\n group: \"orchestrator-add-agent\",\n description: \"Optional sub-task description for the sub-agent\",\n getValue: () => task,\n onFill: (value) => setTask(value),\n });\n const { ref: cancelRef, agentProps: cancelAgentProps } =\n useAgentElement<HTMLButtonElement>({\n id: \"add-agent-cancel\",\n role: \"button\",\n label: cancelLabel,\n group: \"orchestrator-add-agent\",\n description: \"Cancel adding a sub-agent\",\n });\n const { ref: spawnRef, agentProps: spawnAgentProps } =\n useAgentElement<HTMLButtonElement>({\n id: \"add-agent-spawn\",\n role: \"button\",\n label: spawnLabel,\n group: \"orchestrator-add-agent\",\n description: \"Spawn a new sub-agent on this task\",\n onActivate: () => {\n if (!busy) spawn();\n },\n });\n\n return (\n <div className=\"mt-1.5 space-y-1.5\">\n <input\n ref={labelRef}\n value={label}\n onChange={(event) => setLabel(event.target.value)}\n className={FIELD_CLASS}\n placeholder={fieldLabels.label}\n aria-label={fieldLabels.label}\n data-testid=\"orchestrator-add-agent-label\"\n {...labelAgentProps}\n />\n <div className=\"flex gap-1.5\">\n <input\n ref={frameworkRef}\n value={framework}\n onChange={(event) => setFramework(event.target.value)}\n className={FIELD_CLASS}\n placeholder={fieldLabels.framework}\n aria-label={fieldLabels.framework}\n {...frameworkAgentProps}\n />\n <input\n ref={modelRef}\n value={model}\n onChange={(event) => setModel(event.target.value)}\n className={FIELD_CLASS}\n placeholder={fieldLabels.model}\n aria-label={fieldLabels.model}\n {...modelAgentProps}\n />\n </div>\n <input\n ref={workdirRef}\n value={workdir}\n onChange={(event) => setWorkdir(event.target.value)}\n className={FIELD_CLASS}\n placeholder={fieldLabels.workdir}\n aria-label={fieldLabels.workdir}\n {...workdirAgentProps}\n />\n <input\n ref={repoRef}\n value={repo}\n onChange={(event) => setRepo(event.target.value)}\n className={FIELD_CLASS}\n placeholder={fieldLabels.repo}\n aria-label={fieldLabels.repo}\n {...repoAgentProps}\n />\n <textarea\n ref={taskRef}\n value={task}\n onChange={(event) => setTask(event.target.value)}\n rows={2}\n className={`${FIELD_CLASS} resize-none`}\n placeholder={fieldLabels.task}\n aria-label={fieldLabels.task}\n {...taskAgentProps}\n />\n <div className=\"flex justify-end gap-2\">\n <Button\n ref={cancelRef}\n variant=\"secondary\"\n size=\"sm\"\n onClick={onClose}\n className=\"h-6 px-2 text-2xs\"\n {...cancelAgentProps}\n >\n {cancelLabel}\n </Button>\n <Button\n ref={spawnRef}\n size=\"sm\"\n disabled={busy}\n onClick={spawn}\n className=\"h-6 px-2 text-2xs\"\n data-testid=\"orchestrator-add-agent-submit\"\n {...spawnAgentProps}\n >\n {spawnLabel}\n </Button>\n </div>\n </div>\n );\n}\n\nfunction ControlButton({\n agentId,\n description,\n icon,\n label,\n onClick,\n disabled,\n tone = \"neutral\",\n testId,\n}: {\n agentId: string;\n description: string;\n icon: ReactNode;\n label: string;\n onClick: () => void;\n disabled: boolean;\n tone?: \"neutral\" | \"danger\";\n testId?: string;\n}) {\n const { ref, agentProps } = useAgentElement<HTMLButtonElement>({\n id: agentId,\n role: \"button\",\n label,\n group: \"orchestrator-inspector\",\n description,\n });\n return (\n <button\n ref={ref}\n type=\"button\"\n disabled={disabled}\n onClick={onClick}\n aria-label={label}\n title={label}\n className={`flex items-center justify-center p-1.5 transition-colors disabled:opacity-50 ${\n tone === \"danger\"\n ? \"text-muted hover:text-danger\"\n : \"text-muted hover:text-txt\"\n }`}\n data-testid={testId}\n {...agentProps}\n >\n {icon}\n </button>\n );\n}\n\nfunction RecoveryActionButton({\n agentId,\n description,\n icon,\n label,\n onClick,\n disabled,\n testId,\n}: {\n agentId: string;\n description: string;\n icon: ReactNode;\n label: string;\n onClick: () => void;\n disabled: boolean;\n testId: string;\n}) {\n const { ref, agentProps } = useAgentElement<HTMLButtonElement>({\n id: agentId,\n role: \"button\",\n label,\n group: \"orchestrator-operator-detail\",\n description,\n });\n return (\n <button\n ref={ref}\n type=\"button\"\n disabled={disabled}\n onClick={onClick}\n className=\"inline-flex h-7 items-center gap-1.5 px-1 text-2xs font-semibold text-muted transition-colors hover:text-txt disabled:opacity-50\"\n data-testid={testId}\n {...agentProps}\n >\n {icon}\n {label}\n </button>\n );\n}\n\nexport function TaskInspector({\n detail,\n className,\n style,\n onClose,\n busy,\n addAgentOpen,\n onPause,\n onResume,\n onArchive,\n onReopen,\n onDelete,\n onFork,\n onRestart,\n onRestartWithEditedPlan,\n onValidate,\n onSetPriority,\n onToggleAddAgent,\n onAddAgent,\n onInspectSession,\n onStopAgent,\n onCopyLink,\n t,\n locale,\n}: {\n detail: CodingAgentTaskThreadDetail;\n className?: string;\n style?: CSSProperties;\n onClose?: () => void;\n busy: boolean;\n addAgentOpen: boolean;\n onPause: () => void;\n onResume: () => void;\n onArchive: () => void;\n onReopen: () => void;\n onDelete: () => void;\n onFork: () => void;\n onRestart: () => void;\n onRestartWithEditedPlan: (\n input: CodingAgentRestartWithEditedPlanInput,\n ) => void;\n onValidate: (passed: boolean) => void;\n onSetPriority: (priority: TaskPriority) => void;\n onToggleAddAgent: () => void;\n onAddAgent: (input: CodingAgentAddAgentInput) => void;\n onInspectSession: (sessionId: string) => void;\n onStopAgent: (sessionId: string) => void;\n onCopyLink: () => void;\n t: Translate;\n locale?: string;\n}) {\n const plan = normalizePlan(detail.currentPlan);\n const sessions = [...detail.sessions].sort(\n (a, b) => b.lastActivityAt - a.lastActivityAt,\n );\n // The real git change set the latest sub-agent produced, mirrored onto its\n // session record's metadata at task_complete and served by the existing\n // task-detail route. Read-only review surface; absent for in-flight or\n // no-op completions.\n const latestChangeSet = sessions\n .map((session) => readSessionChangeSet(session.metadata))\n .find((value): value is ChangeSetData => value !== undefined);\n const artifacts = [...detail.artifacts].reverse().slice(0, 12);\n const latestPlanRevisionId =\n detail.planRevisions.length > 0\n ? detail.planRevisions[detail.planRevisions.length - 1]?.id\n : undefined;\n const archived = detail.status === \"archived\";\n const terminal = TERMINAL_TASK_STATUSES.has(detail.status);\n const providerPolicyLine = detail.providerPolicy\n ? [\n detail.providerPolicy.preferredFramework,\n detail.providerPolicy.providerSource,\n detail.providerPolicy.model,\n ]\n .filter((part): part is string => Boolean(part))\n .join(\" · \")\n : \"\";\n const closeDetailsLabel = t(\"orchestrator.action.closeDetails\", {\n defaultValue: \"Close details\",\n });\n const setPriorityLabel = t(\"orchestrator.action.setPriority\", {\n defaultValue: \"Set priority\",\n });\n const { ref: closeRef, agentProps: closeAgentProps } =\n useAgentElement<HTMLButtonElement>({\n id: \"inspector-close\",\n role: \"button\",\n label: closeDetailsLabel,\n group: \"orchestrator-inspector\",\n description: \"Close the task details panel\",\n });\n const { ref: priorityRef, agentProps: priorityAgentProps } =\n useAgentElement<HTMLSelectElement>({\n id: \"inspector-priority\",\n role: \"select\",\n label: setPriorityLabel,\n group: \"orchestrator-inspector\",\n description: \"Set the priority of this task\",\n options: [\"low\", \"normal\", \"high\", \"urgent\"],\n getValue: () => detail.priority,\n onFill: (value) => {\n const next = paramPriority(value);\n if (next && next !== detail.priority) onSetPriority(next);\n },\n });\n\n return (\n <div\n className={`shrink-0 flex-col gap-4 overflow-y-auto bg-bg p-3 ${className ?? \"flex w-80\"}`}\n style={style}\n data-testid=\"orchestrator-inspector\"\n >\n {onClose ? (\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-xs font-medium text-muted\">\n {t(\"orchestrator.inspector.title\", { defaultValue: \"Details\" })}\n </h3>\n <button\n ref={closeRef}\n type=\"button\"\n onClick={onClose}\n className=\"-mr-1 p-1 text-muted transition-colors hover:text-txt\"\n aria-label={closeDetailsLabel}\n data-testid=\"orchestrator-close-inspector\"\n {...closeAgentProps}\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n ) : null}\n <div className=\"flex flex-wrap gap-1\">\n {detail.status === \"validating\" ? (\n <>\n <ControlButton\n agentId=\"inspector-approve\"\n description=\"Approve the task validation\"\n icon={<Check className=\"h-3 w-3\" />}\n label={t(\"orchestrator.action.approve\", {\n defaultValue: \"Approve\",\n })}\n onClick={() => onValidate(true)}\n disabled={busy}\n testId=\"orchestrator-approve\"\n />\n <ControlButton\n agentId=\"inspector-reject\"\n description=\"Reject the task validation\"\n icon={<X className=\"h-3 w-3\" />}\n label={t(\"orchestrator.action.reject\", {\n defaultValue: \"Reject\",\n })}\n onClick={() => onValidate(false)}\n disabled={busy}\n tone=\"danger\"\n testId=\"orchestrator-reject\"\n />\n </>\n ) : null}\n {archived ? (\n <ControlButton\n agentId=\"inspector-reopen\"\n description=\"Reopen this archived task\"\n icon={<RotateCcw className=\"h-3 w-3\" />}\n label={t(\"orchestrator.action.reopen\", { defaultValue: \"Reopen\" })}\n onClick={onReopen}\n disabled={busy}\n testId=\"orchestrator-reopen\"\n />\n ) : terminal ? null : detail.paused ? (\n <ControlButton\n agentId=\"inspector-resume\"\n description=\"Resume this paused task\"\n icon={<Play className=\"h-3 w-3\" />}\n label={t(\"orchestrator.action.resume\", { defaultValue: \"Resume\" })}\n onClick={onResume}\n disabled={busy}\n testId=\"orchestrator-inspector-resume\"\n />\n ) : (\n <ControlButton\n agentId=\"inspector-pause\"\n description=\"Pause this task\"\n icon={<Pause className=\"h-3 w-3\" />}\n label={t(\"orchestrator.action.pause\", { defaultValue: \"Pause\" })}\n onClick={onPause}\n disabled={busy}\n testId=\"orchestrator-inspector-pause\"\n />\n )}\n {archived ? null : (\n <ControlButton\n agentId=\"inspector-archive\"\n description=\"Archive this task\"\n icon={<Archive className=\"h-3 w-3\" />}\n label={t(\"orchestrator.action.archive\", {\n defaultValue: \"Archive\",\n })}\n onClick={onArchive}\n disabled={busy}\n testId=\"orchestrator-inspector-archive\"\n />\n )}\n {terminal ? null : (\n <ControlButton\n agentId=\"inspector-fork\"\n description=\"Fork this task into a new task\"\n icon={<GitFork className=\"h-3 w-3\" />}\n label={t(\"orchestrator.action.fork\", { defaultValue: \"Fork\" })}\n onClick={onFork}\n disabled={busy}\n testId=\"orchestrator-fork\"\n />\n )}\n {terminal ? null : (\n <ControlButton\n agentId=\"inspector-restart\"\n description=\"Restart this task with a fresh worker\"\n icon={<RotateCcw className=\"h-3 w-3\" />}\n label={t(\"orchestrator.action.restart\", {\n defaultValue: \"Restart\",\n })}\n onClick={onRestart}\n disabled={busy}\n testId=\"orchestrator-inspector-restart\"\n />\n )}\n {terminal ? null : (\n <ControlButton\n agentId=\"inspector-add-agent\"\n description=\"Open the add-agent form for this task\"\n icon={<UserPlus className=\"h-3 w-3\" />}\n label={t(\"orchestrator.action.addAgent\", {\n defaultValue: \"Add agent\",\n })}\n onClick={onToggleAddAgent}\n disabled={busy}\n testId=\"orchestrator-add-agent\"\n />\n )}\n <ControlButton\n agentId=\"inspector-copy-link\"\n description=\"Copy a deep link to this task\"\n icon={<Copy className=\"h-3 w-3\" />}\n label={t(\"orchestrator.action.copyLink\", {\n defaultValue: \"Copy link\",\n })}\n onClick={onCopyLink}\n disabled={busy}\n testId=\"orchestrator-copy-link\"\n />\n {terminal ? null : (\n <select\n ref={priorityRef}\n aria-label={setPriorityLabel}\n value={detail.priority}\n disabled={busy}\n onChange={(event) => {\n const next = paramPriority(event.target.value);\n if (next && next !== detail.priority) onSetPriority(next);\n }}\n className=\"border-border/35 border-b bg-transparent px-1 py-1 text-2xs text-muted transition-colors hover:border-accent/60 hover:text-txt disabled:opacity-50\"\n data-testid=\"orchestrator-priority-select\"\n {...priorityAgentProps}\n >\n <option value=\"low\">{labelPriority(\"low\", t)}</option>\n <option value=\"normal\">{labelPriority(\"normal\", t)}</option>\n <option value=\"high\">{labelPriority(\"high\", t)}</option>\n <option value=\"urgent\">{labelPriority(\"urgent\", t)}</option>\n </select>\n )}\n <AlertDialog>\n <AlertDialogTrigger asChild>\n <ControlButton\n agentId=\"inspector-delete\"\n description=\"Delete this task\"\n icon={<Trash2 className=\"h-3 w-3\" />}\n label={t(\"orchestrator.action.delete\", {\n defaultValue: \"Delete\",\n })}\n onClick={() => {}}\n disabled={busy}\n tone=\"danger\"\n testId=\"orchestrator-delete\"\n />\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>\n {t(\"orchestrator.confirmDeleteTitle\", {\n defaultValue: \"Delete task?\",\n })}\n </AlertDialogTitle>\n <AlertDialogDescription>\n {t(\"orchestrator.confirmDelete\", {\n defaultValue:\n \"Delete this task and its transcript? This can't be undone.\",\n })}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>\n {t(\"orchestrator.action.cancel\", { defaultValue: \"Cancel\" })}\n </AlertDialogCancel>\n <AlertDialogAction\n onClick={onDelete}\n className=\"bg-red-600 hover:bg-red-700\"\n >\n {t(\"orchestrator.action.delete\", { defaultValue: \"Delete\" })}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n\n {addAgentOpen && !terminal ? (\n <AddAgentForm\n busy={busy}\n onClose={onToggleAddAgent}\n onSubmit={onAddAgent}\n t={t}\n />\n ) : null}\n\n <InspectorSection\n title={t(\"orchestrator.goal\", { defaultValue: \"Goal\" })}\n >\n <p className=\"whitespace-pre-wrap text-xs-tight text-txt\">\n {detail.goal || detail.originalRequest}\n </p>\n {detail.parentTaskId ? (\n <p className=\"mt-1.5 text-2xs text-muted\">\n {t(\"orchestrator.forkedFrom\", {\n defaultValue: \"Forked from {{id}}\",\n id: detail.parentTaskId,\n })}\n </p>\n ) : null}\n </InspectorSection>\n\n <InspectorSection\n title={t(\"orchestrator.subAgents\", { defaultValue: \"Sub-agents\" })}\n >\n {sessions.length === 0 ? (\n <p className=\"text-xs-tight text-muted\">\n {t(\"orchestrator.noSubAgents\", {\n defaultValue: \"No sub-agents spawned yet.\",\n })}\n </p>\n ) : (\n <div className=\"space-y-1.5\">\n {sessions.map((session) => (\n <SubAgentCard\n key={session.id}\n session={session}\n busy={busy}\n onInspect={onInspectSession}\n onStop={onStopAgent}\n t={t}\n locale={locale}\n />\n ))}\n </div>\n )}\n </InspectorSection>\n\n {latestChangeSet ? (\n <InspectorSection\n title={t(\"orchestrator.changes\", { defaultValue: \"Changes\" })}\n >\n <DiffReviewPanel changeSet={latestChangeSet} />\n </InspectorSection>\n ) : null}\n\n {plan ? <PlanSection plan={plan} t={t} /> : null}\n {detail.currentPlan && !terminal ? (\n <EditedPlanRestartSection\n plan={detail.currentPlan}\n latestPlanRevisionId={latestPlanRevisionId}\n busy={busy}\n onSubmit={onRestartWithEditedPlan}\n t={t}\n />\n ) : null}\n {detail.acceptanceCriteria.length > 0 ? (\n <AcceptanceSection criteria={detail.acceptanceCriteria} t={t} />\n ) : null}\n {artifacts.length > 0 ? (\n <ArtifactSection artifacts={artifacts} t={t} />\n ) : null}\n <UsageSection usage={detail.usage} t={t} locale={locale} />\n\n {providerPolicyLine ? (\n <InspectorSection\n title={t(\"orchestrator.providerPolicy\", {\n defaultValue: \"Provider policy\",\n })}\n >\n <p className=\"text-xs-tight text-txt\">{providerPolicyLine}</p>\n </InspectorSection>\n ) : null}\n </div>\n );\n}\n\nfunction compactText(value: string, max = 6000): string {\n if (value.length <= max) return value;\n return `${value.slice(0, max).trimEnd()}\\n\\n… ${(\n value.length - max\n ).toLocaleString()} characters truncated`;\n}\n\nfunction hasRecordEntries(value: Record<string, unknown> | null | undefined) {\n return Boolean(value && Object.keys(value).length > 0);\n}\n\n/**\n * Validate a captured change set off a session record's metadata. The orchestrator\n * mirrors its `WorkspaceChangeSet` onto `metadata.lastChangeSet`; guard the shape\n * here so a malformed value never reaches the read-only diff panel.\n */\nfunction readSessionChangeSet(\n metadata: Record<string, unknown>,\n): ChangeSetData | undefined {\n const raw = metadata.lastChangeSet;\n if (!raw || typeof raw !== \"object\") return undefined;\n const candidate = raw as Partial<ChangeSetData>;\n if (!Array.isArray(candidate.changedFiles)) return undefined;\n if (typeof candidate.diff !== \"string\") return undefined;\n if (typeof candidate.diffStat !== \"string\") return undefined;\n if (typeof candidate.truncated !== \"boolean\") return undefined;\n if (typeof candidate.capturedAt !== \"number\") return undefined;\n return candidate as ChangeSetData;\n}\n\nfunction JsonBlock({\n value,\n emptyLabel,\n}: {\n value: unknown;\n emptyLabel: string;\n}) {\n const empty =\n value === null ||\n value === undefined ||\n (Array.isArray(value) && value.length === 0) ||\n (typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.keys(value as Record<string, unknown>).length === 0);\n if (empty) {\n return <p className=\"text-xs-tight text-muted\">{emptyLabel}</p>;\n }\n const text =\n typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n return (\n <pre\n className=\"max-h-72 overflow-auto bg-bg/60 px-2.5 py-1.5 font-mono text-2xs leading-relaxed text-muted\"\n data-testid=\"orchestrator-detail-json\"\n >\n {compactText(text)}\n </pre>\n );\n}\n\nfunction DetailRow({ label, value }: { label: string; value: ReactNode }) {\n if (value === null || value === undefined || value === \"\") return null;\n return (\n <div className=\"grid grid-cols-[5.25rem_minmax(0,1fr)] gap-2 text-xs-tight\">\n <span className=\"text-muted\">{label}</span>\n <span className=\"min-w-0 break-words text-txt\">{value}</span>\n </div>\n );\n}\n\nfunction OperatorTabs({\n active,\n onSelect,\n t,\n}: {\n active: OperatorTab;\n onSelect: (tab: OperatorTab) => void;\n t: Translate;\n}) {\n const tabs: Array<{ id: OperatorTab; label: string }> = [\n {\n id: \"input\",\n label: t(\"orchestrator.detail.tabs.input\", { defaultValue: \"Input\" }),\n },\n {\n id: \"output\",\n label: t(\"orchestrator.detail.tabs.output\", { defaultValue: \"Output\" }),\n },\n {\n id: \"events\",\n label: t(\"orchestrator.detail.tabs.events\", { defaultValue: \"Events\" }),\n },\n {\n id: \"usage\",\n label: t(\"orchestrator.detail.tabs.usage\", { defaultValue: \"Usage\" }),\n },\n ];\n return (\n <div\n className=\"flex gap-2\"\n role=\"tablist\"\n aria-label={t(\"orchestrator.detail.tabsLabel\", {\n defaultValue: \"Detail tabs\",\n })}\n >\n {tabs.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={active === tab.id}\n onClick={() => onSelect(tab.id)}\n className={`flex-1 px-1 py-1 text-xs font-medium transition-colors ${\n active === tab.id ? \"text-accent\" : \"text-muted hover:text-txt\"\n }`}\n >\n {tab.label}\n </button>\n ))}\n </div>\n );\n}\n\nfunction sessionUsage(\n session: CodingAgentTaskSessionRecord,\n): CodingAgentTaskUsageSummary {\n return {\n inputTokens: session.inputTokens,\n outputTokens: session.outputTokens,\n reasoningTokens: session.reasoningTokens,\n cacheTokens: session.cacheTokens,\n totalTokens: session.totalTokens,\n costUsd: session.costUsd,\n state: session.usageState,\n byProvider: [\n {\n provider: session.providerSource ?? session.framework,\n model: session.model ?? undefined,\n inputTokens: session.inputTokens,\n outputTokens: session.outputTokens,\n reasoningTokens: session.reasoningTokens,\n cacheTokens: session.cacheTokens,\n totalTokens: session.totalTokens,\n costUsd: session.costUsd,\n state: session.usageState,\n },\n ],\n };\n}\n\nfunction blockEventIds(block: ConversationBlock): string[] {\n if (block.kind === \"tool\") return block.tool.eventIds;\n if (block.kind === \"reasoning\") return block.eventIds;\n if (block.kind === \"notice\") return [block.eventId];\n return [];\n}\n\nfunction blockMessageIds(block: ConversationBlock): string[] {\n if (block.kind === \"user\" || block.kind === \"agent\") return block.messageIds;\n return [];\n}\n\nfunction blockSelection(\n block: ConversationBlock,\n): Extract<DetailDrawerSelection, { kind: \"block\" }> {\n return {\n kind: \"block\",\n blockKey: block.key,\n blockKind: block.kind,\n eventIds: blockEventIds(block),\n messageIds: blockMessageIds(block),\n };\n}\n\nfunction blockMatchesSelection(\n block: ConversationBlock,\n selection: Extract<DetailDrawerSelection, { kind: \"block\" }>,\n): boolean {\n if (block.key === selection.blockKey) return true;\n if (block.kind !== selection.blockKind) return false;\n const eventIds = blockEventIds(block);\n if (\n selection.eventIds.length > 0 &&\n selection.eventIds.some((id) => eventIds.includes(id))\n ) {\n return true;\n }\n const messageIds = blockMessageIds(block);\n return (\n selection.messageIds.length > 0 &&\n selection.messageIds.some((id) => messageIds.includes(id))\n );\n}\n\nfunction blockSelectionKey(selection: DetailDrawerSelection): string {\n if (selection.kind === \"session\") return `session:${selection.sessionId}`;\n return [\n \"block\",\n selection.blockKey,\n selection.blockKind,\n selection.eventIds.join(\",\"),\n selection.messageIds.join(\",\"),\n ].join(\":\");\n}\n\nfunction blockTitle(block: ConversationBlock, t: Translate): string {\n if (block.kind === \"tool\") return block.tool.title;\n if (block.kind === \"agent\") return block.senderName;\n if (block.kind === \"user\")\n return t(\"orchestrator.detail.userTurn\", { defaultValue: \"User turn\" });\n if (block.kind === \"reasoning\")\n return t(\"orchestrator.detail.reasoning\", { defaultValue: \"Reasoning\" });\n return block.eventType.replace(/_/g, \" \");\n}\n\nfunction eventError(\n events: CodingAgentTaskEventRecord[],\n t: Translate,\n): string | null {\n const error = events.find((event) => event.eventType === \"error\");\n if (!error) return null;\n const message =\n typeof error.data?.message === \"string\"\n ? error.data.message\n : typeof error.data?.error === \"string\"\n ? error.data.error\n : error.summary;\n return (\n message.trim() ||\n t(\"orchestrator.detail.errorFallback\", { defaultValue: \"Error\" })\n );\n}\n\nfunction blockError(\n block: ConversationBlock | null,\n events: CodingAgentTaskEventRecord[],\n t: Translate,\n): string | null {\n const fromEvent = eventError(events, t);\n if (fromEvent) return fromEvent;\n if (!block) return null;\n if (block.kind === \"agent\" && block.tone === \"error\") {\n return compactText(block.content, 600);\n }\n if (block.kind === \"notice\" && block.eventType === \"error\") {\n return block.text;\n }\n if (block.kind === \"tool\" && block.tool.status === \"failed\") {\n if (block.tool.output) return compactText(block.tool.output, 600);\n if (typeof block.tool.exitCode === \"number\") {\n return t(\"orchestrator.detail.toolExited\", {\n defaultValue: `Tool exited with code ${block.tool.exitCode}.`,\n code: block.tool.exitCode,\n });\n }\n return (\n block.tool.rawStatus ??\n t(\"orchestrator.detail.toolFailed\", { defaultValue: \"Tool failed.\" })\n );\n }\n return null;\n}\n\nfunction sessionError(\n session: CodingAgentTaskSessionRecord,\n t: Translate,\n): string | null {\n if (session.status !== \"error\" && session.status !== \"errored\") return null;\n return (\n session.completionSummary ??\n session.activeTool ??\n t(\"orchestrator.detail.sessionFailed\", {\n defaultValue: \"Session failed.\",\n })\n );\n}\n\nfunction ErrorFirstBanner({ text }: { text: string | null }) {\n if (!text) return null;\n return (\n <div className=\"rounded-md bg-red-500/10 px-2.5 py-2 text-xs-tight text-red-500\">\n {text}\n </div>\n );\n}\n\nfunction OperatorDrawerShell({\n title,\n subtitle,\n closeLabel,\n className,\n style,\n onClose,\n children,\n}: {\n title: string;\n subtitle: string;\n closeLabel: string;\n className?: string;\n style?: CSSProperties;\n onClose: () => void;\n children: ReactNode;\n}) {\n return (\n <div\n className={`shrink-0 flex-col gap-2.5 overflow-y-auto bg-bg p-3 ${className ?? \"flex w-80\"}`}\n style={style}\n data-testid=\"orchestrator-operator-detail\"\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-xs font-medium text-muted\">{title}</h3>\n <p className=\"mt-0.5 truncate text-xs-tight font-medium text-txt\">\n {subtitle}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"-mr-1 p-1 text-muted transition-colors hover:text-txt\"\n aria-label={closeLabel}\n data-testid=\"orchestrator-close-operator-detail\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n {children}\n </div>\n );\n}\n\nfunction EventList({\n events,\n messages,\n locale,\n t,\n}: {\n events: CodingAgentTaskEventRecord[];\n messages: CodingAgentTaskMessageRecord[];\n locale?: string;\n t: Translate;\n}) {\n if (events.length === 0 && messages.length === 0) {\n return (\n <p className=\"text-xs-tight text-muted\">\n {t(\"orchestrator.detail.noEvents\", {\n defaultValue: \"No events captured.\",\n })}\n </p>\n );\n }\n const timeline = [\n ...messages.map((message) => ({\n kind: \"message\" as const,\n id: message.id,\n timestamp: message.timestamp,\n record: message,\n })),\n ...events.map((event) => ({\n kind: \"event\" as const,\n id: event.id,\n timestamp: event.timestamp,\n record: event,\n })),\n ].sort((a, b) => a.timestamp - b.timestamp);\n return (\n <div className=\"space-y-1.5\">\n {timeline.map((item) => {\n if (item.kind === \"message\") {\n const message = item.record;\n return (\n <div key={`message-${message.id}`} className=\"py-1\">\n <div className=\"mb-1 flex items-center gap-2 text-2xs text-muted\">\n <span className=\"font-semibold text-txt\">\n {message.senderKind}\n </span>\n <span>{message.direction}</span>\n <span className=\"ml-auto tabular-nums\">\n {formatClockTime(message.timestamp, locale)}\n </span>\n </div>\n <JsonBlock\n value={message}\n emptyLabel={t(\"orchestrator.detail.noMessagePayload\", {\n defaultValue: \"No message payload.\",\n })}\n />\n </div>\n );\n }\n const event = item.record;\n return (\n <div key={`event-${event.id}`} className=\"py-1\">\n <div className=\"mb-1 flex items-center gap-2 text-2xs text-muted\">\n <span className=\"font-semibold text-txt\">\n {event.eventType.replace(/_/g, \" \")}\n </span>\n <span className=\"ml-auto tabular-nums\">\n {formatClockTime(event.timestamp, locale)}\n </span>\n </div>\n {event.summary ? (\n <p className=\"mb-1 text-xs-tight text-txt\">{event.summary}</p>\n ) : null}\n <JsonBlock\n value={event.data}\n emptyLabel={t(\"orchestrator.detail.noEventData\", {\n defaultValue: \"No event data.\",\n })}\n />\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction OperatorDetailDrawer({\n selection,\n block,\n session,\n events,\n messages,\n taskUsage,\n busy,\n className,\n style,\n onClose,\n onRetry,\n onRerun,\n t,\n locale,\n}: {\n selection: DetailDrawerSelection;\n block: ConversationBlock | null;\n session: CodingAgentTaskSessionRecord | null;\n events: CodingAgentTaskEventRecord[];\n messages: CodingAgentTaskMessageRecord[];\n taskUsage: CodingAgentTaskUsageSummary;\n busy: boolean;\n className?: string;\n style?: CSSProperties;\n onClose: () => void;\n onRetry: (input: CodingAgentRetryTurnInput) => void;\n onRerun: (input: CodingAgentRerunFromEventInput) => void;\n t: Translate;\n locale?: string;\n}) {\n const [tab, setTab] = useState<OperatorTab>(\"input\");\n const closeDetailsLabel = t(\"orchestrator.detail.close\", {\n defaultValue: \"Close details\",\n });\n const label = (key: string, defaultValue: string) =>\n t(`orchestrator.detail.${key}`, { defaultValue });\n\n if (selection.kind === \"session\" && !session) {\n return (\n <OperatorDrawerShell\n title={t(\"orchestrator.detail.session\", { defaultValue: \"Session\" })}\n subtitle={t(\"orchestrator.detail.noLongerAvailable\", {\n defaultValue: \"No longer available\",\n })}\n closeLabel={closeDetailsLabel}\n className={className}\n style={style}\n onClose={onClose}\n >\n <p className=\"text-xs-tight text-muted\">\n {t(\"orchestrator.detail.sessionDataChanged\", {\n defaultValue: \"Session data changed.\",\n })}\n </p>\n </OperatorDrawerShell>\n );\n }\n if (selection.kind === \"block\" && !block) {\n return (\n <OperatorDrawerShell\n title={t(\"orchestrator.detail.event\", { defaultValue: \"Event\" })}\n subtitle={t(\"orchestrator.detail.noLongerAvailable\", {\n defaultValue: \"No longer available\",\n })}\n closeLabel={closeDetailsLabel}\n className={className}\n style={style}\n onClose={onClose}\n >\n <p className=\"text-xs-tight text-muted\">\n {t(\"orchestrator.detail.timelineDataChanged\", {\n defaultValue: \"Timeline data changed.\",\n })}\n </p>\n </OperatorDrawerShell>\n );\n }\n\n const isSession = selection.kind === \"session\";\n const title = isSession\n ? t(\"orchestrator.detail.sessionDetail\", { defaultValue: \"Session detail\" })\n : t(\"orchestrator.detail.timelineDetail\", {\n defaultValue: \"Timeline detail\",\n });\n const subtitle = isSession\n ? (session?.label ??\n t(\"orchestrator.detail.session\", { defaultValue: \"Session\" }))\n : block\n ? blockTitle(block, t)\n : t(\"orchestrator.detail.event\", { defaultValue: \"Event\" });\n const activeUsage = session ? sessionUsage(session) : taskUsage;\n const toolUsageFallbackLabel = session\n ? label(\n \"perToolUsageUnavailable\",\n \"Per-tool usage is not emitted yet; showing the owning session total.\",\n )\n : label(\n \"perToolUsageTaskFallback\",\n \"Per-tool usage is not emitted yet; showing the task total.\",\n );\n const errorText =\n isSession && session\n ? sessionError(session, t)\n : block\n ? blockError(block, events, t)\n : null;\n const retryMessage = !isSession ? messages[0] : null;\n const rerunEvent = !isSession ? events[0] : null;\n const retryLabel = label(\"retry\", \"Retry\");\n const rerunLabel = label(\"rerun\", \"Rerun\");\n const recoveryActions: ReactNode[] = [];\n if (isSession && session) {\n recoveryActions.push(\n <RecoveryActionButton\n key=\"retry-session\"\n agentId=\"operator-retry-session\"\n description=\"Retry this session's work in a new worker\"\n icon={<RotateCcw className=\"h-3 w-3\" />}\n label={retryLabel}\n onClick={() =>\n onRetry({\n sessionId: session.sessionId,\n mode: \"new-session\",\n instruction: `Retry work from session ${session.label ?? session.sessionId}.`,\n })\n }\n disabled={busy}\n testId=\"orchestrator-detail-retry\"\n />,\n );\n } else if (retryMessage) {\n recoveryActions.push(\n <RecoveryActionButton\n key=\"retry-message\"\n agentId=\"operator-retry-message\"\n description=\"Retry this selected turn in a new worker\"\n icon={<RotateCcw className=\"h-3 w-3\" />}\n label={retryLabel}\n onClick={() =>\n onRetry({\n messageId: retryMessage.id,\n sessionId: retryMessage.sessionId ?? undefined,\n mode: \"new-session\",\n instruction: \"Retry this selected turn.\",\n })\n }\n disabled={busy}\n testId=\"orchestrator-detail-retry\"\n />,\n );\n }\n if (rerunEvent) {\n recoveryActions.push(\n <RecoveryActionButton\n key=\"rerun-event\"\n agentId=\"operator-rerun-event\"\n description=\"Rerun from this selected event without rewriting history\"\n icon={<ChevronsUp className=\"h-3 w-3\" />}\n label={rerunLabel}\n onClick={() =>\n onRerun({\n eventId: rerunEvent.id,\n instruction: `Rerun from ${rerunEvent.eventType.replace(/_/g, \" \")}.`,\n stopActive: false,\n preserveHistory: true,\n })\n }\n disabled={busy}\n testId=\"orchestrator-detail-rerun\"\n />,\n );\n }\n\n let body: ReactNode;\n if (tab === \"input\") {\n if (isSession && session) {\n body = (\n <div className=\"space-y-2\">\n <DetailRow\n label={label(\"status\", \"Status\")}\n value={session.status.replace(/_/g, \" \")}\n />\n <DetailRow\n label={label(\"framework\", \"Framework\")}\n value={session.framework}\n />\n <DetailRow\n label={label(\"provider\", \"Provider\")}\n value={session.providerSource}\n />\n <DetailRow label={label(\"model\", \"Model\")} value={session.model} />\n <DetailRow\n label={label(\"workdir\", \"Workdir\")}\n value={session.workdir}\n />\n <DetailRow label={label(\"repo\", \"Repo\")} value={session.repo} />\n <InspectorSection title={label(\"originalTask\", \"Original task\")}>\n <p className=\"whitespace-pre-wrap text-xs-tight text-txt\">\n {session.originalTask}\n </p>\n </InspectorSection>\n {hasRecordEntries(session.metadata) ? (\n <InspectorSection title={label(\"metadata\", \"Metadata\")}>\n <JsonBlock\n value={session.metadata}\n emptyLabel={label(\"noMetadata\", \"No metadata.\")}\n />\n </InspectorSection>\n ) : null}\n </div>\n );\n } else if (block?.kind === \"tool\") {\n const input = block.tool.rawInput ?? {};\n body = (\n <div className=\"space-y-2\">\n <DetailRow label={label(\"toolId\", \"Tool id\")} value={block.tool.id} />\n <DetailRow\n label={label(\"kind\", \"Kind\")}\n value={block.tool.kind || \"tool\"}\n />\n <DetailRow\n label={label(\"status\", \"Status\")}\n value={block.tool.rawStatus ?? block.tool.status}\n />\n <DetailRow\n label={label(\"file\", \"File\")}\n value={block.tool.filePath}\n />\n <DetailRow\n label={label(\"command\", \"Command\")}\n value={block.tool.command}\n />\n <DetailRow label={label(\"query\", \"Query\")} value={block.tool.query} />\n <JsonBlock\n value={input}\n emptyLabel={label(\"noToolInput\", \"No tool input captured.\")}\n />\n </div>\n );\n } else if (block?.kind === \"user\") {\n body = (\n <pre className=\"whitespace-pre-wrap bg-bg/60 px-2.5 py-1.5 text-xs-tight text-txt\">\n {block.content}\n </pre>\n );\n } else if (block?.kind === \"agent\") {\n body = (\n <JsonBlock\n value={messages.map((message) => message.metadata)}\n emptyLabel={label(\"noInputMetadata\", \"No input metadata captured.\")}\n />\n );\n } else {\n body = (\n <JsonBlock\n value={events.map((event) => event.data)}\n emptyLabel={label(\"noInput\", \"No input captured.\")}\n />\n );\n }\n } else if (tab === \"output\") {\n if (isSession && session) {\n body = (\n <div className=\"space-y-2\">\n <DetailRow\n label={label(\"activeTool\", \"Active tool\")}\n value={session.activeTool}\n />\n <DetailRow\n label={label(\"decisions\", \"Decisions\")}\n value={t(\"orchestrator.detail.decisionCounts\", {\n defaultValue: `${session.decisionCount} total · ${session.autoResolvedCount} auto`,\n count: session.decisionCount,\n auto: session.autoResolvedCount,\n })}\n />\n <DetailRow\n label={label(\"lastInput\", \"Last input\")}\n value={\n session.lastInputSentAt\n ? formatClockTime(session.lastInputSentAt, locale)\n : null\n }\n />\n <InspectorSection title={label(\"completion\", \"Completion\")}>\n {session.completionSummary ? (\n <p className=\"whitespace-pre-wrap text-xs-tight text-txt\">\n {session.completionSummary}\n </p>\n ) : (\n <p className=\"text-xs-tight text-muted\">\n {label(\"noCompletion\", \"No completion yet.\")}\n </p>\n )}\n </InspectorSection>\n </div>\n );\n } else if (block?.kind === \"tool\") {\n body = (\n <div className=\"space-y-2\">\n <DetailRow\n label={label(\"exit\", \"Exit\")}\n value={block.tool.exitCode}\n />\n <DetailRow\n label={label(\"duration\", \"Duration\")}\n value={\n block.tool.durationMs\n ? formatDuration(block.tool.durationMs)\n : null\n }\n />\n <ToolBody tool={block.tool} />\n <JsonBlock\n value={block.tool.rawOutput}\n emptyLabel={label(\"noRawOutput\", \"No raw output payload captured.\")}\n />\n </div>\n );\n } else if (block?.kind === \"agent\" || block?.kind === \"user\") {\n body = (\n <pre className=\"whitespace-pre-wrap bg-bg/60 px-2.5 py-1.5 text-xs-tight text-txt\">\n {compactText(block.content)}\n </pre>\n );\n } else if (block?.kind === \"reasoning\") {\n body = (\n <pre className=\"whitespace-pre-wrap bg-bg/60 px-2.5 py-1.5 text-xs-tight text-txt\">\n {compactText(block.text)}\n </pre>\n );\n } else if (block) {\n body = <p className=\"text-xs-tight text-txt\">{block.text}</p>;\n } else {\n body = null;\n }\n } else if (tab === \"events\") {\n body = (\n <EventList events={events} messages={messages} locale={locale} t={t} />\n );\n } else {\n body = (\n <div className=\"space-y-2\">\n {block?.kind === \"tool\" ? (\n <p className=\"text-xs-tight text-muted\">{toolUsageFallbackLabel}</p>\n ) : null}\n <UsageSection usage={activeUsage} t={t} locale={locale} />\n </div>\n );\n }\n\n return (\n <OperatorDrawerShell\n title={title}\n subtitle={subtitle}\n closeLabel={closeDetailsLabel}\n className={className}\n style={style}\n onClose={onClose}\n >\n <ErrorFirstBanner text={errorText} />\n <div className=\"space-y-1.5\">\n {session ? (\n <>\n <DetailRow\n label={label(\"session\", \"Session\")}\n value={session.sessionId}\n />\n <DetailRow\n label={label(\"activity\", \"Activity\")}\n value={formatClockTime(session.lastActivityAt, locale)}\n />\n </>\n ) : null}\n {block ? (\n <>\n <DetailRow label={label(\"kind\", \"Kind\")} value={block.kind} />\n <DetailRow\n label={label(\"time\", \"Time\")}\n value={formatClockTime(block.at, locale)}\n />\n </>\n ) : null}\n </div>\n {recoveryActions.length > 0 ? (\n <div className=\"space-y-1.5\" data-testid=\"orchestrator-detail-recovery\">\n <div className=\"text-xs font-medium text-muted\">\n {label(\"recovery\", \"Recovery\")}\n </div>\n <div className=\"flex flex-wrap gap-1.5\">{recoveryActions}</div>\n </div>\n ) : null}\n <OperatorTabs active={tab} onSelect={setTab} t={t} />\n <div className=\"min-h-0\">{body}</div>\n </OperatorDrawerShell>\n );\n}\n\nfunction readInitialTaskId(): string | null {\n if (typeof window === \"undefined\") return null;\n // Accept both producers: `?task=` (copy-link) and `?taskId=` (the in-chat\n // task widget). Either opens the workbench straight onto that task.\n const params = new URLSearchParams(window.location.search);\n return params.get(\"task\") ?? params.get(\"taskId\");\n}\n\nconst MOBILE_QUERY = \"(max-width: 767px)\";\n\n// The view bundle ships no CSS — it borrows the host stylesheet, which never\n// generates the plugin's responsive (`md:`) variants. So responsiveness is\n// driven in JS via matchMedia and applied with always-present classes + inline\n// styles instead of breakpoint utilities.\nfunction useIsMobile(): boolean {\n const [isMobile, setIsMobile] = useState<boolean>(() => {\n if (typeof window === \"undefined\" || !window.matchMedia) return false;\n return window.matchMedia(MOBILE_QUERY).matches;\n });\n useEffect(() => {\n if (typeof window === \"undefined\" || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const onChange = (event: MediaQueryListEvent) => setIsMobile(event.matches);\n setIsMobile(mql.matches);\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n }, []);\n return isMobile;\n}\n\n// Mobile inspector slide-over geometry. Inline styles (not `md:` utilities)\n// because the bundle has no CSS of its own — see useIsMobile.\nconst INSPECTOR_DRAWER_STYLE: CSSProperties = {\n position: \"absolute\",\n insetBlock: 0,\n right: 0,\n zIndex: 30,\n width: \"86%\",\n maxWidth: \"22rem\",\n boxShadow: \"0 10px 30px rgba(0, 0, 0, 0.45)\",\n};\n\nconst HIDDEN_STYLE: CSSProperties = { display: \"none\" };\n\n// Timeline header above the message stream. Desktop packs it into one row;\n// mobile splits into a title row (back · status · title · details) and a\n// secondary controls row (status badge · system-events toggle) so the task\n// title is never crushed by the trailing controls.\nfunction TimelineHeader({\n detail,\n isMobile,\n onBack,\n onOpenInspector,\n t,\n}: {\n detail: CodingAgentTaskThreadDetail;\n isMobile: boolean;\n onBack: () => void;\n onOpenInspector: () => void;\n t: Translate;\n}) {\n const statusDot = (\n <StatusGlyph\n status={detail.status}\n paused={detail.paused}\n t={t}\n size=\"h-4 w-4\"\n />\n );\n const title = (\n <span className=\"min-w-0 flex-1 truncate text-sm font-semibold text-txt\">\n {detail.title}\n </span>\n );\n const pausedLabel = t(\"orchestrator.status.paused\", {\n defaultValue: \"Paused\",\n });\n const pausedBadge = detail.paused ? (\n <span\n className=\"inline-flex shrink-0 text-warn\"\n title={pausedLabel}\n aria-label={pausedLabel}\n role=\"img\"\n >\n <Pause className=\"h-3.5 w-3.5\" aria-hidden />\n </span>\n ) : null;\n const detailsLabel = t(\"orchestrator.action.details\", {\n defaultValue: \"Details\",\n });\n const backLabel = t(\"orchestrator.action.backToList\", {\n defaultValue: \"Back to tasks\",\n });\n const { ref: backRef, agentProps: backAgentProps } =\n useAgentElement<HTMLButtonElement>({\n id: \"timeline-back\",\n role: \"button\",\n label: backLabel,\n group: \"orchestrator-timeline\",\n description: \"Go back to the task list\",\n });\n const { ref: detailsRef, agentProps: detailsAgentProps } =\n useAgentElement<HTMLButtonElement>({\n id: \"timeline-open-inspector\",\n role: \"button\",\n label: detailsLabel,\n group: \"orchestrator-timeline\",\n description: \"Open the task details panel\",\n });\n\n if (isMobile) {\n return (\n <div className=\"px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n <button\n ref={backRef}\n type=\"button\"\n onClick={onBack}\n className=\"-ml-1 shrink-0 p-1 text-muted transition-colors hover:text-txt\"\n aria-label={backLabel}\n data-testid=\"orchestrator-back\"\n {...backAgentProps}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </button>\n {statusDot}\n {title}\n <button\n ref={detailsRef}\n type=\"button\"\n onClick={onOpenInspector}\n className=\"shrink-0 p-1 text-muted transition-colors hover:text-txt\"\n aria-label={detailsLabel}\n title={detailsLabel}\n data-testid=\"orchestrator-open-inspector\"\n {...detailsAgentProps}\n >\n <PanelRightOpen className=\"h-4 w-4\" aria-hidden />\n </button>\n </div>\n {pausedBadge ? (\n <div className=\"mt-1.5 flex items-center gap-1.5\">{pausedBadge}</div>\n ) : null}\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center gap-2.5 px-4 py-2.5\">\n <BackChip label={backLabel} onClick={onBack} testId=\"orchestrator-back\" />\n {statusDot}\n {title}\n {pausedBadge}\n <button\n ref={detailsRef}\n type=\"button\"\n onClick={onOpenInspector}\n className=\"shrink-0 p-1 text-muted transition-colors hover:text-txt\"\n aria-label={detailsLabel}\n title={detailsLabel}\n data-testid=\"orchestrator-open-inspector\"\n {...detailsAgentProps}\n >\n <PanelRightOpen className=\"h-4 w-4\" aria-hidden />\n </button>\n </div>\n );\n}\n\nexport function OrchestratorWorkbench() {\n const {\n t: appT,\n uiLanguage,\n copyToClipboard,\n agentStatus,\n } = useAppSelectorShallow((s) => ({\n t: s.t,\n uiLanguage: s.uiLanguage,\n copyToClipboard: s.copyToClipboard,\n agentStatus: s.agentStatus,\n }));\n const t = appT ?? fallbackTranslate;\n const locale = typeof uiLanguage === \"string\" ? uiLanguage : undefined;\n const mainAgentName =\n typeof agentStatus?.agentName === \"string\"\n ? agentStatus.agentName\n : undefined;\n\n const [status, setStatus] = useState<CodingAgentOrchestratorStatus | null>(\n null,\n );\n const [tasks, setTasks] = useState<CodingAgentTaskThread[]>([]);\n const [selectedId, setSelectedId] = useState<string | null>(\n readInitialTaskId,\n );\n const [detail, setDetail] = useState<CodingAgentTaskThreadDetail | null>(\n null,\n );\n const [messages, setMessages] = useState<CodingAgentTaskMessageRecord[]>([]);\n const [events, setEvents] = useState<CodingAgentTaskEventRecord[]>([]);\n const [timelineCursor, setTimelineCursor] = useState<string | null>(null);\n const [search, setSearch] = useState(\"\");\n const [statusFilter, setStatusFilter] = useState<StatusFilter>(\"all\");\n const [showArchived, setShowArchived] = useState(false);\n const [addAgentOpen, setAddAgentOpen] = useState(false);\n const [inspectorOpen, setInspectorOpen] = useState(false);\n const [detailDrawer, setDetailDrawer] =\n useState<DetailDrawerSelection | null>(null);\n const [loading, setLoading] = useState(true);\n const [mutating, setMutating] = useState(false);\n const [loadError, setLoadError] = useState<string | null>(null);\n // The connected agent doesn't serve the orchestrator backend (local on-device\n // agent without it) — shown as a calm hint, not a red error.\n const [backendAbsent, setBackendAbsent] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n\n const isMobile = useIsMobile();\n const deferredSearch = useDeferredValue(search.trim());\n const detailReqRef = useRef(0);\n const selectedIdRef = useRef<string | null>(selectedId);\n selectedIdRef.current = selectedId;\n\n // The conversation sticks to the newest entry, but only while the reader is\n // already near the bottom — scrolling up to read history is never yanked by\n // a streaming update.\n const listRef = useRef<HTMLDivElement | null>(null);\n const stickToBottomRef = useRef(true);\n const handleListScroll = useCallback((event: UIEvent<HTMLDivElement>) => {\n const el = event.currentTarget;\n stickToBottomRef.current =\n el.scrollHeight - el.scrollTop - el.clientHeight < 80;\n }, []);\n\n const fetchTasksAndStatus = useCallback(\n async (silent: boolean) => {\n if (!silent) setLoading(true);\n try {\n const [nextStatus, nextTasks] = await Promise.all([\n client.getOrchestratorStatus(),\n client.listCodingAgentTaskThreads({\n includeArchived: showArchived,\n status: statusFilter === \"all\" ? undefined : statusFilter,\n search: deferredSearch || undefined,\n limit: TASK_LIST_LIMIT,\n }),\n ]);\n setStatus(nextStatus);\n setTasks(nextTasks);\n setLoadError(null);\n setBackendAbsent(false);\n } catch (error) {\n if (!silent) {\n if (isOrchestratorBackendAbsent(error)) {\n // Not a failure — this agent just doesn't run the orchestrator\n // backend. Connect a cloud or desktop agent and it works.\n setBackendAbsent(true);\n setLoadError(null);\n } else {\n setBackendAbsent(false);\n setLoadError(\n getClientErrorMessage(\n error,\n t(\"orchestrator.loadFailed\", {\n defaultValue: \"Failed to load orchestrator state.\",\n }),\n ),\n );\n }\n }\n } finally {\n if (!silent) setLoading(false);\n }\n },\n [deferredSearch, showArchived, statusFilter, t],\n );\n\n const fetchDetail = useCallback(async (id: string, reset: boolean) => {\n const token = ++detailReqRef.current;\n const [nextDetail, timelinePage] = await Promise.all([\n client.getCodingAgentTaskThread(id),\n client.listOrchestratorTaskTimeline(id, { limit: TIMELINE_PAGE_LIMIT }),\n ]);\n // Discard if a newer fetch superseded this one, or if the selection moved on\n // while in flight — otherwise a non-reset poll/refresh could merge one task's\n // transcript into another task's room (cross-task contamination).\n if (token !== detailReqRef.current || id !== selectedIdRef.current) return;\n const timeline = splitTimelineItems(timelinePage.items);\n setDetail(nextDetail);\n if (reset) {\n setMessages(mergeById([], timeline.messages));\n setEvents(mergeById([], timeline.events));\n setTimelineCursor(timelinePage.nextCursor);\n } else {\n setMessages((prev) => mergeById(prev, timeline.messages));\n setEvents((prev) => mergeById(prev, timeline.events));\n setTimelineCursor((prev) => prev ?? timelinePage.nextCursor);\n }\n }, []);\n\n useEffect(() => {\n void fetchTasksAndStatus(false);\n const timer = window.setInterval(\n () => void fetchTasksAndStatus(true),\n POLL_INTERVAL_MS,\n );\n return () => window.clearInterval(timer);\n }, [fetchTasksAndStatus]);\n\n const detailPollMs =\n detail !== null &&\n (detail.activeSessionCount > 0 ||\n detail.status === \"active\" ||\n detail.status === \"validating\")\n ? ACTIVE_POLL_INTERVAL_MS\n : POLL_INTERVAL_MS;\n\n useEffect(() => {\n // Reset transient per-task UI (mobile inspector drawer, add-agent form)\n // and load the room whenever the selection changes, so a freshly opened\n // task starts clean and scrolled to its latest activity.\n setInspectorOpen(false);\n setAddAgentOpen(false);\n setDetailDrawer(null);\n stickToBottomRef.current = true;\n if (!selectedId) {\n setDetail(null);\n setMessages([]);\n setEvents([]);\n setTimelineCursor(null);\n return;\n }\n void fetchDetail(selectedId, true).catch((err: unknown) => {\n console.error(\"[OrchestratorWorkbench] fetchDetail (initial)\", { err });\n });\n }, [selectedId, fetchDetail]);\n\n useEffect(() => {\n // Reconcile poll — the safety net. The SSE stream below drives near-live\n // updates; this only covers a dropped/absent stream (reconnect fallback).\n if (!selectedId) return;\n const timer = window.setInterval(\n () =>\n void fetchDetail(selectedId, false).catch((err: unknown) => {\n console.error(\"[OrchestratorWorkbench] fetchDetail (poll)\", { err });\n }),\n detailPollMs,\n );\n return () => window.clearInterval(timer);\n }, [selectedId, detailPollMs, fetchDetail]);\n\n // Coalesce a burst of change pings into one tail refetch per ~150ms window,\n // so live token streaming doesn't trigger a fetch storm.\n const refetchTimerRef = useRef<number | null>(null);\n const scheduleRefetch = useCallback(() => {\n if (refetchTimerRef.current != null) return;\n refetchTimerRef.current = window.setTimeout(() => {\n refetchTimerRef.current = null;\n const current = selectedIdRef.current;\n if (current)\n void fetchDetail(current, false).catch((err: unknown) => {\n console.error(\"[OrchestratorWorkbench] fetchDetail (debounced)\", {\n err,\n });\n });\n }, 150);\n }, [fetchDetail]);\n\n useEffect(() => {\n // Live push: subscribe to the task's SSE stream; each \"change\" ping\n // schedules a debounced tail refetch, so messages/tool-calls/status appear\n // ~instantly instead of on the poll boundary.\n if (!selectedId) return;\n const unsubscribe = client.streamOrchestratorTask(\n selectedId,\n scheduleRefetch,\n );\n return () => {\n unsubscribe();\n if (refetchTimerRef.current != null) {\n window.clearTimeout(refetchTimerRef.current);\n refetchTimerRef.current = null;\n }\n };\n }, [selectedId, scheduleRefetch]);\n\n const runMutation = useCallback(\n async (fn: () => Promise<unknown>) => {\n setMutating(true);\n setActionError(null);\n try {\n await fn();\n await fetchTasksAndStatus(true);\n const current = selectedIdRef.current;\n if (current)\n await fetchDetail(current, false).catch((err: unknown) => {\n console.error(\"[OrchestratorWorkbench] fetchDetail (mutation)\", {\n err,\n });\n });\n } catch (error) {\n setActionError(\n getClientErrorMessage(\n error,\n t(\"orchestrator.actionFailed\", { defaultValue: \"Action failed.\" }),\n ),\n );\n } finally {\n setMutating(false);\n }\n },\n [fetchTasksAndStatus, fetchDetail, t],\n );\n\n const loadOlderTimeline = useCallback(async () => {\n const current = selectedIdRef.current;\n if (!current || !timelineCursor) return;\n const page = await client.listOrchestratorTaskTimeline(current, {\n cursor: timelineCursor,\n limit: TIMELINE_PAGE_LIMIT,\n });\n // The selection may have moved on during the await — don't merge task A's\n // history into task B (mirrors the fetchDetail guard).\n if (current !== selectedIdRef.current) return;\n const timeline = splitTimelineItems(page.items);\n setMessages((prev) => mergeById(prev, timeline.messages));\n setEvents((prev) => mergeById(prev, timeline.events));\n setTimelineCursor(page.nextCursor);\n }, [timelineCursor]);\n\n // Stop every still-running coding agent on the open task — the prominent\n // in-conversation interrupt (parity with Claude Code / Codex / opencode),\n // also bound to Esc below.\n const handleStopActive = useCallback(() => {\n const current = detail;\n if (!current) return;\n const targets = current.sessions.filter(\n (session) =>\n session.sessionId &&\n session.stoppedAt == null &&\n session.status !== \"completed\",\n );\n if (targets.length === 0) return;\n void runMutation(async () => {\n for (const session of targets) {\n await client.stopOrchestratorAgent(current.id, session.sessionId);\n }\n });\n }, [detail, runMutation]);\n\n // Esc closes an open modal/drawer first; only when nothing is open does it\n // interrupt the running turn. A ref keeps the document listener stable while\n // always seeing the latest state (otherwise Esc-to-stop would trap an open\n // dialog, blocking the whole UI).\n const escStateRef = useRef({\n addAgentOpen,\n inspectorOpen,\n detailDrawer,\n stop: handleStopActive,\n });\n escStateRef.current = {\n addAgentOpen,\n inspectorOpen,\n detailDrawer,\n stop: handleStopActive,\n };\n useEffect(() => {\n const onKey = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n const s = escStateRef.current;\n if (s.addAgentOpen) {\n setAddAgentOpen(false);\n return;\n }\n if (s.inspectorOpen) {\n setInspectorOpen(false);\n return;\n }\n if (s.detailDrawer) {\n setDetailDrawer(null);\n return;\n }\n s.stop();\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, []);\n\n const handleCopyLink = useCallback(() => {\n const current = selectedIdRef.current;\n if (!current || !copyToClipboard || typeof window === \"undefined\") return;\n const url = `${window.location.origin}/orchestrator?task=${encodeURIComponent(current)}`;\n void copyToClipboard(url);\n }, [copyToClipboard]);\n\n const sessionLabelById = useMemo(() => {\n const map = new Map<string, string>();\n for (const session of detail?.sessions ?? []) {\n const label = session.label?.trim();\n if (session.sessionId && label) map.set(session.sessionId, label);\n }\n return map;\n }, [detail?.sessions]);\n\n const finishedSessionIds = useMemo(() => {\n const ids = new Set<string>();\n for (const session of detail?.sessions ?? []) {\n if (\n session.sessionId &&\n (session.stoppedAt != null || session.status === \"completed\")\n ) {\n ids.add(session.sessionId);\n }\n }\n return ids;\n }, [detail?.sessions]);\n\n const conversation = useMemo(\n () =>\n buildConversation(\n messages,\n events,\n (message) =>\n resolveSenderName(message, sessionLabelById, mainAgentName, t),\n finishedSessionIds,\n ),\n [messages, events, sessionLabelById, mainAgentName, finishedSessionIds, t],\n );\n const selectedBlock = useMemo(() => {\n if (detailDrawer?.kind !== \"block\") return null;\n return (\n conversation.find((block) =>\n blockMatchesSelection(block, detailDrawer),\n ) ?? null\n );\n }, [conversation, detailDrawer]);\n const selectedSession = useMemo(() => {\n if (detailDrawer?.kind !== \"session\" || !detail) return null;\n return (\n detail.sessions.find(\n (session) => session.sessionId === detailDrawer.sessionId,\n ) ?? null\n );\n }, [detail, detailDrawer]);\n const selectedBlockEvents = useMemo(() => {\n if (!detailDrawer) return [];\n if (detailDrawer.kind === \"session\") {\n return events.filter(\n (event) => event.sessionId === detailDrawer.sessionId,\n );\n }\n const ids = new Set(detailDrawer.eventIds);\n return events.filter((event) => ids.has(event.id));\n }, [detailDrawer, events]);\n const selectedBlockMessages = useMemo(() => {\n if (!detailDrawer) return [];\n if (detailDrawer.kind === \"session\") {\n return messages.filter(\n (message) => message.sessionId === detailDrawer.sessionId,\n );\n }\n const ids = new Set(detailDrawer.messageIds);\n return messages.filter((message) => ids.has(message.id));\n }, [detailDrawer, messages]);\n const handleSelectBlock = useCallback(\n (block: ConversationBlock) => {\n setDetailDrawer(blockSelection(block));\n if (isMobile) setInspectorOpen(true);\n },\n [isMobile],\n );\n const handleInspectSession = useCallback(\n (sessionId: string) => {\n setDetailDrawer({ kind: \"session\", sessionId });\n if (isMobile) setInspectorOpen(true);\n },\n [isMobile],\n );\n\n // Re-pin to the newest entry whenever the conversation grows (subject to the\n // near-bottom guard); `conversation` is the change trigger, not read here.\n // biome-ignore lint/correctness/useExhaustiveDependencies: trigger-only dep\n useEffect(() => {\n const el = listRef.current;\n if (el && stickToBottomRef.current) el.scrollTop = el.scrollHeight;\n }, [conversation]);\n\n const viewState = JSON.stringify({\n selectedId,\n taskCount: status?.taskCount ?? tasks.length,\n activeTaskCount: status?.activeTaskCount ?? 0,\n statusFilter,\n showArchived,\n });\n\n const searchLabel = t(\"orchestrator.searchPlaceholder\", {\n defaultValue: \"Search tasks\",\n });\n const showArchivedLabel = t(\"orchestrator.showArchived\", {\n defaultValue: \"Show archived\",\n });\n const loadOlderLabel = t(\"orchestrator.loadOlder\", {\n defaultValue: \"Load older\",\n });\n const stopLabel = t(\"orchestrator.action.stop\", { defaultValue: \"Stop\" });\n const { ref: searchRef, agentProps: searchAgentProps } =\n useAgentElement<HTMLInputElement>({\n id: \"rail-search\",\n role: \"text-input\",\n label: searchLabel,\n group: \"orchestrator-rail\",\n description: \"Filter the task list by title or request text\",\n getValue: () => search,\n onFill: (value) => setSearch(value),\n });\n const { ref: showArchivedRef, agentProps: showArchivedAgentProps } =\n useAgentElement<HTMLButtonElement>({\n id: \"rail-show-archived\",\n role: \"toggle\",\n label: showArchivedLabel,\n group: \"orchestrator-rail\",\n status: showArchived ? \"active\" : \"inactive\",\n description: \"Toggle showing archived tasks in the list\",\n onActivate: () => setShowArchived((value) => !value),\n });\n const { ref: loadOlderRef, agentProps: loadOlderAgentProps } =\n useAgentElement<HTMLButtonElement>({\n id: \"timeline-load-older\",\n role: \"button\",\n label: loadOlderLabel,\n group: \"orchestrator-timeline\",\n description: \"Load older entries in the task timeline\",\n });\n const { ref: stopActiveRef, agentProps: stopActiveAgentProps } =\n useAgentElement<HTMLButtonElement>({\n id: \"timeline-stop-active\",\n role: \"button\",\n label: stopLabel,\n group: \"orchestrator-timeline\",\n description: \"Stop the running sub-agents on this task\",\n });\n return (\n <div\n className=\"relative flex h-full min-h-0 w-full flex-col bg-bg text-txt\"\n data-testid=\"orchestrator-workbench\"\n >\n <span data-view-state={viewState} hidden />\n <WorkbenchHeader\n status={status}\n busy={mutating}\n isMobile={isMobile}\n onPauseAll={() => runMutation(() => client.pauseAllOrchestratorTasks())}\n onResumeAll={() =>\n runMutation(() => client.resumeAllOrchestratorTasks())\n }\n t={t}\n locale={locale}\n />\n\n {backendAbsent ? (\n <div className=\"px-4 py-1.5 text-2xs text-muted\">\n {t(\"orchestrator.backendAbsent\", {\n defaultValue: \"Connect a cloud or desktop agent to run tasks.\",\n })}\n </div>\n ) : null}\n {loadError ? (\n <div className=\"bg-danger/10 px-3 py-1.5 text-xs text-danger\">\n {loadError}\n </div>\n ) : null}\n {actionError ? (\n <div className=\"bg-danger/10 px-3 py-1.5 text-xs text-danger\">\n {actionError}\n </div>\n ) : null}\n\n <div className=\"relative flex min-h-0 flex-1 flex-col overflow-y-auto\">\n {/* Single-pane landing: visual task card list. Hidden once a task room\n is open so the workbench is never a side-by-side list+detail. */}\n {!selectedId ? (\n <div\n className=\"relative flex flex-1 flex-col gap-3 px-4 pb-28 pt-4\"\n data-testid=\"orchestrator-rail\"\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <TaskSearchInput\n value={search}\n onChange={setSearch}\n placeholder={searchLabel}\n inputRef={searchRef}\n testId=\"orchestrator-search\"\n className=\"min-w-[12rem] flex-1\"\n agentProps={searchAgentProps}\n />\n <div className=\"flex items-center gap-2\">\n <div className=\"w-40\">\n <FilterSelect\n status={status}\n active={statusFilter}\n onSelect={setStatusFilter}\n t={t}\n />\n </div>\n <button\n ref={showArchivedRef}\n type=\"button\"\n onClick={() => setShowArchived((value) => !value)}\n aria-pressed={showArchived}\n className={`inline-flex h-9 items-center gap-2 px-2 text-xs font-medium transition-colors ${\n showArchived ? \"text-accent\" : \"text-muted hover:text-txt\"\n }`}\n data-testid=\"orchestrator-show-archived\"\n {...showArchivedAgentProps}\n >\n <Archive className=\"h-3.5 w-3.5\" />\n {showArchivedLabel}\n </button>\n </div>\n </div>\n\n {tasks.length === 0 ? (\n loading ? (\n <p className=\"p-2 text-sm text-muted\">\n {t(\"orchestrator.loadingTasks\", {\n defaultValue: \"Loading\",\n })}\n </p>\n ) : (\n <TaskEmptyState\n title={t(\"orchestrator.empty.title\", {\n defaultValue: \"None\",\n })}\n hint={t(\"orchestrator.empty.hint\", {\n defaultValue:\n \"Ask me to start a coding task and it will appear here.\",\n })}\n />\n )\n ) : (\n <>\n <div className=\"flex flex-col gap-2.5\">\n {tasks.map((thread) => (\n <TaskCard\n key={thread.id}\n id={thread.id}\n title={thread.title}\n subtitle={thread.summary || thread.originalRequest}\n status={thread.status}\n chips={orchestratorTaskChips(thread, t, locale)}\n onOpen={(id) => setSelectedId(id)}\n t={t}\n />\n ))}\n </div>\n {tasks.length < 4 ? <SparseWatermark icon={Layers} /> : null}\n </>\n )}\n </div>\n ) : null}\n\n {/* Task room — full-pane detail, entered by clicking a card. */}\n <main\n className=\"flex min-h-0 min-w-0 flex-1 flex-col bg-bg\"\n data-testid=\"orchestrator-timeline\"\n style={selectedId ? undefined : HIDDEN_STYLE}\n >\n {detail ? (\n <>\n <TimelineHeader\n detail={detail}\n isMobile={isMobile}\n onBack={() => setSelectedId(null)}\n onOpenInspector={() => {\n setDetailDrawer(null);\n setInspectorOpen(true);\n }}\n t={t}\n />\n <div\n ref={listRef}\n onScroll={handleListScroll}\n className=\"min-h-0 flex-1 space-y-3 overflow-y-auto px-4 py-4\"\n data-testid=\"orchestrator-message-list\"\n >\n {timelineCursor ? (\n <div className=\"flex justify-center\">\n <button\n ref={loadOlderRef}\n type=\"button\"\n onClick={() => void loadOlderTimeline()}\n className=\"flex items-center gap-1 px-1 py-0.5 text-2xs text-muted transition-colors hover:text-txt\"\n data-testid=\"orchestrator-load-older\"\n aria-label={loadOlderLabel}\n {...loadOlderAgentProps}\n >\n <ArrowDownToLine className=\"h-3 w-3\" />\n {loadOlderLabel}\n </button>\n </div>\n ) : null}\n {conversation.length === 0 ? (\n <p className=\"p-4 text-center text-xs text-muted\">\n {t(\"orchestrator.noMessages\", {\n defaultValue: \"No messages yet.\",\n })}\n </p>\n ) : (\n conversation.map((block) => {\n const selected =\n detailDrawer?.kind === \"block\" &&\n blockMatchesSelection(block, detailDrawer);\n return (\n <div\n key={block.key}\n className={`group flex gap-1.5 transition-colors ${\n selected ? \"text-accent\" : \"hover:bg-bg-hover/30\"\n }`}\n data-testid=\"orchestrator-conversation-block\"\n >\n <button\n type=\"button\"\n onClick={() => handleSelectBlock(block)}\n className=\"mt-1.5 flex h-6 w-6 shrink-0 items-center justify-center text-muted opacity-0 transition-colors hover:text-txt focus:opacity-100 group-hover:opacity-100 group-focus-within:opacity-100\"\n aria-label={t(\"orchestrator.action.inspectBlock\", {\n defaultValue: `Inspect ${blockTitle(block, t)}`,\n })}\n title={t(\"orchestrator.action.inspectBlock\", {\n defaultValue: `Inspect ${blockTitle(block, t)}`,\n })}\n data-testid=\"orchestrator-inspect-block\"\n >\n <PanelRightOpen className=\"h-3.5 w-3.5\" />\n </button>\n <div className=\"min-w-0 flex-1\">\n <ConversationBlockView\n block={block}\n locale={locale}\n onInspect={() => handleSelectBlock(block)}\n />\n </div>\n </div>\n );\n })\n )}\n </div>\n {detail.activeSessionCount > 0 ? (\n <div\n className=\"flex items-center justify-between gap-2 bg-warn/5 px-3 py-1.5\"\n data-testid=\"orchestrator-running-bar\"\n >\n <span className=\"flex items-center gap-1.5 text-2xs font-medium text-warn\">\n <span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-warn\" />\n {t(\"orchestrator.agentsWorking\", {\n defaultValue: \"Agent working…\",\n })}\n </span>\n <button\n ref={stopActiveRef}\n type=\"button\"\n onClick={handleStopActive}\n disabled={mutating}\n className=\"flex items-center gap-1 px-1 py-0.5 text-2xs text-txt transition-colors hover:text-danger disabled:opacity-50\"\n data-testid=\"orchestrator-stop-active\"\n aria-label={stopLabel}\n {...stopActiveAgentProps}\n >\n <CircleStop className=\"h-3 w-3\" />\n {stopLabel}\n <kbd className=\"ml-0.5 px-1 text-[0.9em] text-muted\">\n Esc\n </kbd>\n </button>\n </div>\n ) : null}\n <div className=\"pb-24\" />\n </>\n ) : (\n <>\n <div className=\"flex items-center gap-2.5 px-4 py-2.5\">\n <BackChip\n label={t(\"orchestrator.action.backToList\", {\n defaultValue: \"Tasks\",\n })}\n onClick={() => setSelectedId(null)}\n testId=\"orchestrator-back-loading\"\n />\n <span className=\"text-sm font-medium text-muted\">\n {t(\"orchestrator.loadingTask\", {\n defaultValue: \"Loading task…\",\n })}\n </span>\n </div>\n <div className=\"flex flex-1 items-center justify-center p-6\">\n <p className=\"text-xs text-muted\">\n {t(\"orchestrator.loadingTask\", {\n defaultValue: \"Loading task…\",\n })}\n </p>\n </div>\n </>\n )}\n </main>\n\n {/* Inspector — stacked below activity so the registered view stays one-column. */}\n {detail && isMobile && inspectorOpen ? (\n <button\n type=\"button\"\n aria-label={t(\"orchestrator.action.closeDetails\", {\n defaultValue: \"Close details\",\n })}\n onClick={() => {\n setInspectorOpen(false);\n setDetailDrawer(null);\n }}\n className=\"absolute inset-0 z-20 bg-black/40\"\n data-testid=\"orchestrator-inspector-backdrop\"\n />\n ) : null}\n {detail && detailDrawer ? (\n <OperatorDetailDrawer\n key={blockSelectionKey(detailDrawer)}\n selection={detailDrawer}\n block={selectedBlock}\n session={selectedSession}\n events={selectedBlockEvents}\n messages={selectedBlockMessages}\n taskUsage={detail.usage}\n busy={mutating}\n className=\"flex\"\n style={\n isMobile\n ? inspectorOpen\n ? INSPECTOR_DRAWER_STYLE\n : HIDDEN_STYLE\n : undefined\n }\n onClose={() => {\n setDetailDrawer(null);\n if (isMobile) setInspectorOpen(false);\n }}\n onRetry={(input) =>\n runMutation(() =>\n client.retryOrchestratorTaskTurn(detail.id, input),\n )\n }\n onRerun={(input) =>\n runMutation(() =>\n client.rerunOrchestratorTaskFromEvent(detail.id, input),\n )\n }\n t={t}\n locale={locale}\n />\n ) : detail ? (\n <TaskInspector\n detail={detail}\n className=\"flex\"\n style={\n isMobile\n ? inspectorOpen\n ? INSPECTOR_DRAWER_STYLE\n : HIDDEN_STYLE\n : undefined\n }\n onClose={isMobile ? () => setInspectorOpen(false) : undefined}\n busy={mutating}\n addAgentOpen={addAgentOpen}\n onPause={() =>\n runMutation(() => client.pauseOrchestratorTask(detail.id))\n }\n onResume={() =>\n runMutation(() => client.resumeOrchestratorTask(detail.id))\n }\n onArchive={() =>\n runMutation(async () => {\n await client.archiveCodingAgentTaskThread(detail.id);\n if (!showArchived) setSelectedId(null);\n })\n }\n onReopen={() =>\n runMutation(() => client.reopenCodingAgentTaskThread(detail.id))\n }\n onDelete={() =>\n runMutation(async () => {\n await client.deleteOrchestratorTask(detail.id);\n setSelectedId(null);\n })\n }\n onFork={() =>\n runMutation(async () => {\n const forked = await client.forkOrchestratorTask(detail.id);\n if (forked) setSelectedId(forked.id);\n })\n }\n onRestart={() => {\n const confirmed =\n typeof window === \"undefined\" ||\n window.confirm(\n t(\"orchestrator.confirmRestart\", {\n defaultValue:\n \"Restart this task with a fresh worker? Active agents will be stopped first.\",\n }),\n );\n if (!confirmed) return;\n runMutation(() =>\n client.restartOrchestratorTask(detail.id, { stopActive: true }),\n );\n }}\n onRestartWithEditedPlan={(input) =>\n runMutation(() =>\n client.restartOrchestratorTaskWithEditedPlan(detail.id, input),\n )\n }\n onValidate={(passed) =>\n runMutation(() =>\n client.validateOrchestratorTask(detail.id, {\n passed,\n humanOverride: true,\n }),\n )\n }\n onSetPriority={(priority) =>\n runMutation(() =>\n client.updateOrchestratorTask(detail.id, { priority }),\n )\n }\n onToggleAddAgent={() => setAddAgentOpen((prev) => !prev)}\n onAddAgent={(input) =>\n runMutation(async () => {\n await client.addOrchestratorAgent(detail.id, input);\n setAddAgentOpen(false);\n })\n }\n onInspectSession={handleInspectSession}\n onStopAgent={(sessionId) =>\n runMutation(() =>\n client.stopOrchestratorAgent(detail.id, sessionId),\n )\n }\n onCopyLink={handleCopyLink}\n t={t}\n locale={locale}\n />\n ) : null}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,9 @@
1
+ import { type CodingAgentSession } from "@elizaos/ui";
2
+ export interface PtyConsoleBaseProps {
3
+ activeSessionId: string;
4
+ sessions: CodingAgentSession[];
5
+ onClose: () => void;
6
+ variant: "drawer" | "side-panel" | "full";
7
+ }
8
+ export declare function PtyConsoleBase({ activeSessionId, sessions, onClose, variant, }: PtyConsoleBaseProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=PtyConsoleBase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PtyConsoleBase.d.ts","sourceRoot":"","sources":["../src/PtyConsoleBase.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,kBAAkB,EAAU,MAAM,aAAa,CAAC;AAatE,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,QAAQ,GAAG,YAAY,GAAG,MAAM,CAAC;CAC3C;AAED,wBAAgB,cAAc,CAAC,EAC7B,eAAe,EACf,QAAQ,EACR,OAAO,EACP,OAAO,GACR,EAAE,mBAAmB,2CA2IrB"}