pi-crew 0.9.16 → 0.9.18

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 (435) hide show
  1. package/CHANGELOG.md +130 -0
  2. package/README.md +19 -0
  3. package/dist/build-meta.json +21784 -0
  4. package/dist/index.mjs +83169 -0
  5. package/dist/index.mjs.map +7 -0
  6. package/docs/A +358 -0
  7. package/docs/M-A +357 -0
  8. package/docs/REVIEW-FINDINGS-2026-06 +357 -0
  9. package/docs/Y +357 -0
  10. package/docs/a +357 -0
  11. package/docs/aA +358 -0
  12. package/docs/archive/README.md +91 -0
  13. package/docs/migration/atomic-write-v2-migration.md +297 -0
  14. package/docs/patterns/command-agent-skill.md +1 -1
  15. package/docs/perf/performance-review-2026-07.md +287 -0
  16. package/docs/skills/REFERENCE.md +0 -17
  17. package/docs//303/242mmaAAA/303/242 +357 -0
  18. package/index.bundle.ts +25 -0
  19. package/index.ts +95 -4
  20. package/package.json +15 -4
  21. package/skills/iterative-audit/SKILL.md +0 -1
  22. package/skills/widget-rendering/SKILL.md +17 -0
  23. package/src/adapters/claude-adapter.ts +1 -3
  24. package/src/adapters/export-util.ts +16 -16
  25. package/src/adapters/index.ts +5 -5
  26. package/src/agents/agent-config.ts +20 -14
  27. package/src/agents/agent-serializer.ts +1 -1
  28. package/src/agents/discover-agents.ts +83 -39
  29. package/src/benchmark/benchmark-runner.ts +51 -51
  30. package/src/benchmark/feedback-loop.ts +1 -1
  31. package/src/config/config.ts +303 -591
  32. package/src/config/defaults.ts +28 -2
  33. package/src/config/drift-detector.ts +11 -14
  34. package/src/config/markers.ts +201 -203
  35. package/src/config/resilient-parser.ts +14 -6
  36. package/src/config/role-tools.ts +3 -3
  37. package/src/config/suggestions.ts +5 -12
  38. package/src/config/types.ts +9 -25
  39. package/src/errors.ts +151 -157
  40. package/src/extension/action-suggestions.ts +54 -9
  41. package/src/extension/async-notifier.ts +43 -13
  42. package/src/extension/autonomous-policy.ts +77 -37
  43. package/src/extension/command-completions.ts +9 -8
  44. package/src/extension/context-status-injection.ts +14 -12
  45. package/src/extension/crew-autocomplete.ts +8 -16
  46. package/src/extension/crew-cleanup.ts +2 -1
  47. package/src/extension/crew-shortcuts.ts +9 -6
  48. package/src/extension/cross-extension-rpc.ts +136 -42
  49. package/src/extension/help.ts +1 -1
  50. package/src/extension/import-index.ts +10 -5
  51. package/src/extension/knowledge-injection.ts +88 -15
  52. package/src/extension/management.ts +89 -349
  53. package/src/extension/message-renderers.ts +3 -4
  54. package/src/extension/notification-router.ts +22 -5
  55. package/src/extension/notification-sink.ts +6 -3
  56. package/src/extension/pi-api.ts +17 -8
  57. package/src/extension/plan-orchestrate.ts +8 -27
  58. package/src/extension/project-init.ts +21 -6
  59. package/src/extension/register.ts +329 -975
  60. package/src/extension/registration/artifact-cleanup.ts +9 -4
  61. package/src/extension/registration/command-utils.ts +5 -1
  62. package/src/extension/registration/commands.ts +806 -314
  63. package/src/extension/registration/compaction-guard.ts +15 -15
  64. package/src/extension/registration/lifecycle.ts +259 -0
  65. package/src/extension/registration/observability.ts +293 -0
  66. package/src/extension/registration/subagent-helpers.ts +29 -7
  67. package/src/extension/registration/subagent-tools.ts +253 -44
  68. package/src/extension/registration/team-tool.ts +19 -84
  69. package/src/extension/registration/ui.ts +168 -0
  70. package/src/extension/registration/viewers.ts +64 -24
  71. package/src/extension/result-watcher.ts +18 -7
  72. package/src/extension/run-bundle-schema.ts +21 -6
  73. package/src/extension/run-export.ts +15 -6
  74. package/src/extension/run-import.ts +64 -29
  75. package/src/extension/run-index.ts +28 -9
  76. package/src/extension/run-maintenance.ts +32 -12
  77. package/src/extension/session-summary.ts +1 -1
  78. package/src/extension/team-manager-command.ts +64 -7
  79. package/src/extension/team-onboard.ts +149 -150
  80. package/src/extension/team-recommendation.ts +121 -21
  81. package/src/extension/team-tool/anchor.ts +31 -64
  82. package/src/extension/team-tool/api.ts +929 -141
  83. package/src/extension/team-tool/auto-summarize.ts +14 -26
  84. package/src/extension/team-tool/cache-control.ts +1 -5
  85. package/src/extension/team-tool/cancel.ts +138 -38
  86. package/src/extension/team-tool/chain-dispatch.ts +5 -13
  87. package/src/extension/team-tool/chain-executor.ts +29 -51
  88. package/src/extension/team-tool/config-patch.ts +1 -1
  89. package/src/extension/team-tool/context.ts +40 -20
  90. package/src/extension/team-tool/destructive-gate.ts +10 -5
  91. package/src/extension/team-tool/doctor.ts +170 -51
  92. package/src/extension/team-tool/explain.ts +228 -214
  93. package/src/extension/team-tool/failure-patterns.ts +3 -9
  94. package/src/extension/team-tool/goal-wrap.ts +71 -29
  95. package/src/extension/team-tool/goal.ts +185 -35
  96. package/src/extension/team-tool/handle-schedule.ts +34 -15
  97. package/src/extension/team-tool/handle-settings.ts +94 -56
  98. package/src/extension/team-tool/health-monitor.ts +27 -108
  99. package/src/extension/team-tool/inspect.ts +42 -9
  100. package/src/extension/team-tool/intent-policy.ts +4 -1
  101. package/src/extension/team-tool/lifecycle-actions.ts +244 -48
  102. package/src/extension/team-tool/orchestrate.ts +7 -18
  103. package/src/extension/team-tool/parallel-dispatch.ts +51 -29
  104. package/src/extension/team-tool/plan.ts +29 -5
  105. package/src/extension/team-tool/respond.ts +49 -16
  106. package/src/extension/team-tool/run-not-found.ts +3 -8
  107. package/src/extension/team-tool/run.ts +80 -317
  108. package/src/extension/team-tool/status.ts +135 -43
  109. package/src/extension/team-tool/workflow-manage.ts +92 -25
  110. package/src/extension/team-tool-types.ts +8 -1
  111. package/src/extension/team-tool.ts +142 -551
  112. package/src/extension/validate-resources.ts +39 -8
  113. package/src/hooks/registry.ts +66 -17
  114. package/src/hooks/types.ts +1 -1
  115. package/src/i18n.ts +25 -11
  116. package/src/observability/correlation.ts +17 -3
  117. package/src/observability/event-bus.ts +51 -56
  118. package/src/observability/event-to-metric.ts +117 -15
  119. package/src/observability/exporters/otlp-exporter.ts +56 -17
  120. package/src/observability/exporters/prometheus-exporter.ts +1 -1
  121. package/src/observability/metric-registry.ts +16 -4
  122. package/src/observability/metric-retention.ts +8 -2
  123. package/src/observability/metric-sink.ts +11 -3
  124. package/src/observability/metrics-primitives.ts +42 -9
  125. package/src/plugins/plugin-define.ts +2 -2
  126. package/src/plugins/plugin-registry.ts +25 -25
  127. package/src/plugins/plugins/index.ts +1 -1
  128. package/src/plugins/plugins/nextjs.ts +16 -16
  129. package/src/plugins/plugins/vite.ts +7 -11
  130. package/src/plugins/plugins/vitest.ts +6 -11
  131. package/src/runtime/adaptive-plan.ts +225 -40
  132. package/src/runtime/agent-control.ts +58 -15
  133. package/src/runtime/agent-memory.ts +15 -9
  134. package/src/runtime/agent-observability.ts +10 -2
  135. package/src/runtime/anchor-manager.ts +27 -25
  136. package/src/runtime/async-marker.ts +7 -1
  137. package/src/runtime/async-runner.ts +39 -24
  138. package/src/runtime/auto-summarize.ts +7 -13
  139. package/src/runtime/background-runner.ts +189 -251
  140. package/src/runtime/batch-barrier.ts +18 -16
  141. package/src/runtime/cancellation-token.ts +16 -6
  142. package/src/runtime/cancellation.ts +46 -8
  143. package/src/runtime/capability-inventory.ts +6 -4
  144. package/src/runtime/chain-parser.ts +44 -11
  145. package/src/runtime/chain-runner.ts +63 -69
  146. package/src/runtime/checkpoint.ts +12 -56
  147. package/src/runtime/child-pi.ts +344 -79
  148. package/src/runtime/coalesce-tasks.ts +268 -0
  149. package/src/runtime/code-summary.ts +71 -26
  150. package/src/runtime/compact-stages/index.ts +15 -5
  151. package/src/runtime/compact-stages/tail-capture-stage.ts +7 -2
  152. package/src/runtime/compact-stages/truncation-stage.ts +4 -1
  153. package/src/runtime/compaction-summary.ts +17 -10
  154. package/src/runtime/completion-guard.ts +33 -16
  155. package/src/runtime/crash-classification.ts +28 -7
  156. package/src/runtime/crash-recovery.ts +177 -37
  157. package/src/runtime/crew-agent-records.ts +145 -47
  158. package/src/runtime/crew-hooks.ts +9 -24
  159. package/src/runtime/cross-extension-rpc.ts +25 -23
  160. package/src/runtime/custom-tools/irc-tool.ts +43 -15
  161. package/src/runtime/custom-tools/submit-result-tool.ts +16 -5
  162. package/src/runtime/delivery-coordinator.ts +34 -7
  163. package/src/runtime/delta-conflict.ts +9 -21
  164. package/src/runtime/deterministic-ast.ts +1 -1
  165. package/src/runtime/diagnostic-export.ts +53 -20
  166. package/src/runtime/direct-run.ts +12 -2
  167. package/src/runtime/dwf-state-store.ts +1 -1
  168. package/src/runtime/dynamic-workflow-context.ts +187 -59
  169. package/src/runtime/dynamic-workflow-runner.ts +42 -20
  170. package/src/runtime/effectiveness.ts +16 -8
  171. package/src/runtime/errors/crew-errors.ts +7 -11
  172. package/src/runtime/event-stream-bridge.ts +9 -3
  173. package/src/runtime/foreground-control.ts +54 -14
  174. package/src/runtime/foreground-watchdog.ts +9 -6
  175. package/src/runtime/goal-achievement.ts +27 -10
  176. package/src/runtime/goal-evaluator.ts +54 -19
  177. package/src/runtime/goal-loop-runner.ts +280 -99
  178. package/src/runtime/goal-state-store.ts +27 -17
  179. package/src/runtime/green-contract.ts +11 -2
  180. package/src/runtime/group-join.ts +64 -31
  181. package/src/runtime/handoff-manager.ts +37 -42
  182. package/src/runtime/heartbeat-gradient.ts +10 -2
  183. package/src/runtime/heartbeat-watcher.ts +32 -6
  184. package/src/runtime/hidden-handoff.ts +13 -31
  185. package/src/runtime/important-line-classifier.ts +12 -2
  186. package/src/runtime/iteration-hooks.ts +25 -15
  187. package/src/runtime/live-agent-control.ts +55 -7
  188. package/src/runtime/live-agent-manager.ts +130 -27
  189. package/src/runtime/live-control-realtime.ts +23 -3
  190. package/src/runtime/live-irc.ts +4 -1
  191. package/src/runtime/live-session-health.ts +12 -4
  192. package/src/runtime/live-session-runtime.ts +379 -117
  193. package/src/runtime/manifest-cache.ts +28 -12
  194. package/src/runtime/mcp-proxy.ts +10 -18
  195. package/src/runtime/metric-parser.ts +1 -5
  196. package/src/runtime/model-fallback.ts +55 -18
  197. package/src/runtime/model-resolver.ts +2 -6
  198. package/src/runtime/model-scope.ts +19 -3
  199. package/src/runtime/notebook-helpers.ts +60 -62
  200. package/src/runtime/orphan-worker-registry.ts +37 -26
  201. package/src/runtime/output-validator.ts +18 -3
  202. package/src/runtime/overflow-recovery.ts +5 -4
  203. package/src/runtime/parallel-research.ts +29 -5
  204. package/src/runtime/parallel-utils.ts +9 -11
  205. package/src/runtime/path-overlap.ts +150 -0
  206. package/src/runtime/peer-dep.ts +12 -17
  207. package/src/runtime/per-write-validator.ts +1 -3
  208. package/src/runtime/phase-tracker.ts +342 -330
  209. package/src/runtime/pi-args.ts +26 -8
  210. package/src/runtime/pi-json-output.ts +1 -1
  211. package/src/runtime/pi-spawn.ts +30 -19
  212. package/src/runtime/pipeline-runner.ts +56 -55
  213. package/src/runtime/plan-templates.ts +5 -6
  214. package/src/runtime/policy-engine.ts +43 -7
  215. package/src/runtime/post-checks.ts +12 -4
  216. package/src/runtime/post-exit-stdio-guard.ts +2 -2
  217. package/src/runtime/process-lifecycle.ts +20 -10
  218. package/src/runtime/process-status.ts +16 -5
  219. package/src/runtime/progress-event-coalescer.ts +2 -1
  220. package/src/runtime/progress-tracker.ts +103 -103
  221. package/src/runtime/prose-compressor.ts +9 -11
  222. package/src/runtime/recovery-recipes.ts +118 -24
  223. package/src/runtime/replace.ts +25 -10
  224. package/src/runtime/resilient-edit.ts +10 -25
  225. package/src/runtime/result-extractor.ts +2 -6
  226. package/src/runtime/retry-executor.ts +20 -4
  227. package/src/runtime/retry-runner.ts +27 -51
  228. package/src/runtime/role-permission.ts +6 -1
  229. package/src/runtime/run-coalesced-task-group.ts +256 -0
  230. package/src/runtime/run-drift.ts +14 -15
  231. package/src/runtime/run-tracker.ts +6 -28
  232. package/src/runtime/runtime-policy.ts +1 -6
  233. package/src/runtime/runtime-resolver.ts +80 -15
  234. package/src/runtime/scheduler.ts +47 -18
  235. package/src/runtime/semaphore.ts +5 -7
  236. package/src/runtime/sensitive-paths.ts +2 -1
  237. package/src/runtime/session-usage.ts +1 -1
  238. package/src/runtime/settings-store.ts +16 -12
  239. package/src/runtime/sidechain-output.ts +6 -2
  240. package/src/runtime/single-agent-compose.ts +1 -4
  241. package/src/runtime/skill-effectiveness.ts +29 -97
  242. package/src/runtime/skill-instructions.ts +40 -83
  243. package/src/runtime/stale-reconciler.ts +73 -197
  244. package/src/runtime/stream-preview.ts +1 -1
  245. package/src/runtime/streaming-output.ts +1 -1
  246. package/src/runtime/subagent-manager.ts +44 -169
  247. package/src/runtime/subprocess-tool-registry.ts +4 -1
  248. package/src/runtime/supervisor-contact.ts +10 -5
  249. package/src/runtime/task-display.ts +19 -5
  250. package/src/runtime/task-graph-scheduler.ts +95 -21
  251. package/src/runtime/task-graph.ts +5 -11
  252. package/src/runtime/task-health.ts +54 -47
  253. package/src/runtime/task-id.ts +12 -19
  254. package/src/runtime/task-output-context.ts +265 -81
  255. package/src/runtime/task-packet.ts +12 -20
  256. package/src/runtime/task-quality.ts +6 -14
  257. package/src/runtime/task-runner/context-retrieval.ts +4 -13
  258. package/src/runtime/task-runner/live-executor.ts +114 -36
  259. package/src/runtime/task-runner/output-splitter.ts +152 -0
  260. package/src/runtime/task-runner/progress.ts +50 -12
  261. package/src/runtime/task-runner/prompt-builder.ts +31 -7
  262. package/src/runtime/task-runner/prompt-pipeline.ts +31 -7
  263. package/src/runtime/task-runner/result-utils.ts +3 -1
  264. package/src/runtime/task-runner/retrieval-orchestrator.ts +310 -0
  265. package/src/runtime/task-runner/run-projection.ts +27 -8
  266. package/src/runtime/task-runner/state-helpers.ts +50 -14
  267. package/src/runtime/task-runner/tail-read.ts +2 -6
  268. package/src/runtime/task-runner.ts +180 -326
  269. package/src/runtime/team-runner-artifacts.ts +13 -0
  270. package/src/runtime/team-runner.ts +456 -974
  271. package/src/runtime/tool-output-pruner.ts +6 -9
  272. package/src/runtime/tool-progress.ts +11 -21
  273. package/src/runtime/verification-gates.ts +33 -24
  274. package/src/runtime/verification-integrity.ts +2 -7
  275. package/src/runtime/verification-worktree.ts +62 -12
  276. package/src/runtime/worker-heartbeat.ts +5 -1
  277. package/src/runtime/worker-startup.ts +29 -5
  278. package/src/runtime/workflow-state.ts +17 -9
  279. package/src/runtime/workspace-lock.ts +30 -35
  280. package/src/runtime/workspace-tree.ts +20 -32
  281. package/src/runtime/yield-handler.ts +43 -9
  282. package/src/runtime/zombie-scanner.ts +5 -4
  283. package/src/schema/config-schema.ts +266 -172
  284. package/src/schema/team-tool-schema.ts +29 -74
  285. package/src/schema/validation-types.ts +25 -17
  286. package/src/skills/discover-skills.ts +35 -10
  287. package/src/skills/skill-templates.ts +109 -27
  288. package/src/skills/validate.ts +26 -8
  289. package/src/state/active-run-registry.ts +87 -28
  290. package/src/state/artifact-store.ts +9 -5
  291. package/src/state/atomic-write-v2.ts +85 -63
  292. package/src/state/atomic-write.ts +106 -27
  293. package/src/state/blob-store.ts +47 -20
  294. package/src/state/contracts.ts +20 -5
  295. package/src/state/crew-init.ts +5 -22
  296. package/src/state/decision-ledger.ts +19 -73
  297. package/src/state/event-log-rotation.ts +41 -15
  298. package/src/state/event-log.ts +168 -53
  299. package/src/state/event-reconstructor.ts +11 -1
  300. package/src/state/gitignore-manager.ts +2 -8
  301. package/src/state/health-store.ts +57 -57
  302. package/src/state/hook-instinct-bridge.ts +1 -1
  303. package/src/state/hook-integrations.ts +1 -1
  304. package/src/state/instinct-store.ts +17 -5
  305. package/src/state/jsonl-writer.ts +1 -1
  306. package/src/state/locks.ts +23 -9
  307. package/src/state/mailbox.ts +151 -28
  308. package/src/state/observation-store.ts +20 -14
  309. package/src/state/run-cache.ts +142 -135
  310. package/src/state/run-graph.ts +6 -15
  311. package/src/state/run-metrics.ts +5 -18
  312. package/src/state/schedule.ts +15 -9
  313. package/src/state/state-store.ts +137 -47
  314. package/src/state/task-claims.ts +12 -2
  315. package/src/state/tiered-eval.ts +52 -43
  316. package/src/state/types-eval.ts +2 -2
  317. package/src/state/types.ts +24 -20
  318. package/src/state/usage.ts +20 -4
  319. package/src/state/worker-atomic-writer.ts +6 -3
  320. package/src/subagents/index.ts +2 -2
  321. package/src/teams/discover-teams.ts +21 -6
  322. package/src/tools/safe-bash-extension.ts +5 -6
  323. package/src/tools/safe-bash.ts +10 -11
  324. package/src/types/new-api-types.ts +6 -10
  325. package/src/ui/agent-management-overlay.ts +52 -40
  326. package/src/ui/card-colors.ts +13 -4
  327. package/src/ui/crew-footer.ts +8 -7
  328. package/src/ui/crew-select-list.ts +1 -1
  329. package/src/ui/dashboard-panes/agents-pane.ts +41 -25
  330. package/src/ui/dashboard-panes/cancellation-pane.ts +1 -1
  331. package/src/ui/dashboard-panes/capability-pane.ts +32 -15
  332. package/src/ui/dashboard-panes/health-pane.ts +2 -1
  333. package/src/ui/dashboard-panes/metrics-pane.ts +4 -1
  334. package/src/ui/dashboard-panes/progress-pane.ts +12 -9
  335. package/src/ui/heartbeat-aggregator.ts +15 -4
  336. package/src/ui/keybinding-map.ts +40 -7
  337. package/src/ui/live-conversation-overlay.ts +36 -20
  338. package/src/ui/live-duration.ts +1 -4
  339. package/src/ui/live-run-sidebar.ts +88 -25
  340. package/src/ui/loaders.ts +2 -8
  341. package/src/ui/mascot.ts +20 -36
  342. package/src/ui/overlays/agent-picker-overlay.ts +11 -3
  343. package/src/ui/overlays/confirm-overlay.ts +4 -2
  344. package/src/ui/overlays/help-overlay.ts +25 -14
  345. package/src/ui/overlays/mailbox-compose-overlay.ts +48 -11
  346. package/src/ui/overlays/mailbox-compose-preview.ts +20 -5
  347. package/src/ui/overlays/mailbox-detail-overlay.ts +27 -6
  348. package/src/ui/pi-ui-compat.ts +7 -7
  349. package/src/ui/powerbar-publisher.ts +120 -42
  350. package/src/ui/render-diff.ts +10 -3
  351. package/src/ui/render-scheduler.ts +12 -4
  352. package/src/ui/run-action-dispatcher.ts +81 -18
  353. package/src/ui/run-dashboard.ts +172 -76
  354. package/src/ui/run-event-bus.ts +59 -37
  355. package/src/ui/run-snapshot-cache.ts +276 -86
  356. package/src/ui/settings-overlay.ts +361 -74
  357. package/src/ui/status-colors.ts +12 -1
  358. package/src/ui/syntax-highlight.ts +1 -1
  359. package/src/ui/terminal-status.ts +1 -3
  360. package/src/ui/theme-adapter.ts +16 -14
  361. package/src/ui/theme-discovery.ts +13 -2
  362. package/src/ui/tool-progress-formatter.ts +7 -7
  363. package/src/ui/tool-render.ts +128 -56
  364. package/src/ui/tool-renderers/brief-mode.ts +45 -27
  365. package/src/ui/tool-renderers/index.ts +109 -43
  366. package/src/ui/transcript-cache.ts +32 -6
  367. package/src/ui/transcript-entries.ts +25 -23
  368. package/src/ui/transcript-viewer.ts +78 -29
  369. package/src/ui/widget/index.ts +99 -40
  370. package/src/ui/widget/widget-formatters.ts +13 -6
  371. package/src/ui/widget/widget-model.ts +19 -8
  372. package/src/ui/widget/widget-renderer.ts +23 -13
  373. package/src/ui/widget/widget-types.ts +1 -1
  374. package/src/utils/bm25-search.ts +199 -199
  375. package/src/utils/conflict-detect.ts +22 -21
  376. package/src/utils/env-filter.ts +14 -7
  377. package/src/utils/file-coalescer.ts +5 -1
  378. package/src/utils/fingerprint.ts +3 -6
  379. package/src/utils/frontmatter.ts +3 -1
  380. package/src/utils/fs-watch.ts +2 -6
  381. package/src/utils/gh-protocol.ts +119 -44
  382. package/src/utils/git.ts +13 -15
  383. package/src/utils/guards.ts +2 -5
  384. package/src/utils/ids.ts +9 -2
  385. package/src/utils/incremental-reader.ts +14 -3
  386. package/src/utils/internal-error.ts +2 -1
  387. package/src/utils/names.ts +12 -3
  388. package/src/utils/paths.ts +49 -5
  389. package/src/utils/project-detector.ts +2 -2
  390. package/src/utils/redaction.ts +29 -19
  391. package/src/utils/resolve-shell.ts +9 -7
  392. package/src/utils/run-watcher-registry.ts +19 -31
  393. package/src/utils/safe-paths.ts +46 -29
  394. package/src/utils/scan-cache.ts +9 -2
  395. package/src/utils/session-utils.ts +2 -4
  396. package/src/utils/sleep.ts +12 -5
  397. package/src/utils/sse-parser.ts +5 -17
  398. package/src/utils/visual.ts +52 -32
  399. package/src/workflows/discover-workflows.ts +41 -109
  400. package/src/workflows/intermediate-store.ts +5 -21
  401. package/src/workflows/preflight-validator.ts +6 -33
  402. package/src/workflows/topology-analyzer.ts +5 -21
  403. package/src/workflows/workflow-config.ts +7 -6
  404. package/src/worktree/branch-freshness.ts +66 -8
  405. package/src/worktree/cleanup.ts +130 -20
  406. package/src/worktree/worktree-manager.ts +212 -69
  407. package/skills/artifact-analysis-loop/SKILL.md +0 -303
  408. package/skills/detection-pipeline-design/SKILL.md +0 -286
  409. package/skills/hunting-investigation-loop/SKILL.md +0 -402
  410. package/skills/incident-playbook-construction/SKILL.md +0 -384
  411. package/skills/security-review/SKILL.md +0 -561
  412. package/skills/threat-hypothesis-framework/SKILL.md +0 -176
  413. package/skills/ui-render-performance/SKILL.md +0 -58
  414. /package/docs/{followup-review-round3-2026-05-12.md → archive/followup-review-round3-2026-05-12.md} +0 -0
  415. /package/docs/{followup-review-round4-2026-05-13.md → archive/followup-review-round4-2026-05-13.md} +0 -0
  416. /package/docs/{pi-crew-bugs.md → archive/pi-crew-bugs.md} +0 -0
  417. /package/docs/{pi-crew-test-final.md → archive/pi-crew-test-final.md} +0 -0
  418. /package/docs/{pi-crew-test-results.md → archive/pi-crew-test-results.md} +0 -0
  419. /package/docs/{pi-crew-test-round2.md → archive/pi-crew-test-round2.md} +0 -0
  420. /package/docs/{pi-crew-test-round4.md → archive/pi-crew-test-round4.md} +0 -0
  421. /package/docs/{pi-crew-test-round5.md → archive/pi-crew-test-round5.md} +0 -0
  422. /package/docs/{pi-crew-test-round6.md → archive/pi-crew-test-round6.md} +0 -0
  423. /package/docs/{pi-crew-v0.5.10-audit-fix-plan.md → archive/pi-crew-v0.5.10-audit-fix-plan.md} +0 -0
  424. /package/docs/{pi-crew-v0.5.11-audit-fix-plan.md → archive/pi-crew-v0.5.11-audit-fix-plan.md} +0 -0
  425. /package/docs/{pi-crew-v0.5.12-audit-fix-plan.md → archive/pi-crew-v0.5.12-audit-fix-plan.md} +0 -0
  426. /package/docs/{pi-crew-v0.5.13-audit-fix-plan.md → archive/pi-crew-v0.5.13-audit-fix-plan.md} +0 -0
  427. /package/docs/{pi-crew-v0.5.14-audit-fix-plan.md → archive/pi-crew-v0.5.14-audit-fix-plan.md} +0 -0
  428. /package/docs/{pi-crew-v0.5.16-audit-fix-plan.md → archive/pi-crew-v0.5.16-audit-fix-plan.md} +0 -0
  429. /package/docs/{pi-crew-v0.5.17-audit-fix-plan.md → archive/pi-crew-v0.5.17-audit-fix-plan.md} +0 -0
  430. /package/docs/{pi-crew-v0.5.5-audit-fix-plan.md → archive/pi-crew-v0.5.5-audit-fix-plan.md} +0 -0
  431. /package/docs/{pi-crew-v0.5.9-audit-fix-plan.md → archive/pi-crew-v0.5.9-audit-fix-plan.md} +0 -0
  432. /package/docs/{pi-mono-opportunities.md → archive/pi-mono-opportunities.md} +0 -0
  433. /package/docs/{pi-mono-review.md → archive/pi-mono-review.md} +0 -0
  434. /package/docs/{pi-subagent4-comparison.md → archive/pi-subagent4-comparison.md} +0 -0
  435. /package/docs/{pi-subagents3-deep-analysis.md → archive/pi-subagents3-deep-analysis.md} +0 -0
@@ -33,7 +33,15 @@ function requestId(): string {
33
33
  return `ctrl_${Date.now().toString(36)}_${Math.random().toString(16).slice(2, 10)}`;
34
34
  }
35
35
 
36
- export function appendLiveAgentControlRequest(manifest: TeamRunManifest, input: { taskId: string; agentId?: string; operation: LiveAgentControlOperation; message?: string }): LiveAgentControlRequest {
36
+ export function appendLiveAgentControlRequest(
37
+ manifest: TeamRunManifest,
38
+ input: {
39
+ taskId: string;
40
+ agentId?: string;
41
+ operation: LiveAgentControlOperation;
42
+ message?: string;
43
+ },
44
+ ): LiveAgentControlRequest {
37
45
  const request: LiveAgentControlRequest = {
38
46
  id: requestId(),
39
47
  runId: manifest.runId,
@@ -48,7 +56,11 @@ export function appendLiveAgentControlRequest(manifest: TeamRunManifest, input:
48
56
  return request;
49
57
  }
50
58
 
51
- export function readLiveAgentControlRequests(manifest: TeamRunManifest, taskId: string, cursor: LiveAgentControlCursor = { offset: 0 }): { requests: LiveAgentControlRequest[]; cursor: LiveAgentControlCursor } {
59
+ export function readLiveAgentControlRequests(
60
+ manifest: TeamRunManifest,
61
+ taskId: string,
62
+ cursor: LiveAgentControlCursor = { offset: 0 },
63
+ ): { requests: LiveAgentControlRequest[]; cursor: LiveAgentControlCursor } {
52
64
  let filePath: string;
53
65
  try {
54
66
  filePath = liveAgentControlFile(manifest, taskId);
@@ -69,20 +81,56 @@ export function readLiveAgentControlRequests(manifest: TeamRunManifest, taskId:
69
81
  return { requests, cursor: { offset: lines.length } };
70
82
  }
71
83
 
72
- export async function applyLiveAgentControlRequest(input: { request: LiveAgentControlRequest; taskId: string; agentId: string; session: { steer?: (text: string) => Promise<void>; prompt?: (text: string, options?: Record<string, unknown>) => Promise<void>; abort?: () => Promise<void> | void }; seenRequestIds?: Set<string> }): Promise<boolean> {
84
+ export async function applyLiveAgentControlRequest(input: {
85
+ request: LiveAgentControlRequest;
86
+ taskId: string;
87
+ agentId: string;
88
+ session: {
89
+ steer?: (text: string) => Promise<void>;
90
+ prompt?: (text: string, options?: Record<string, unknown>) => Promise<void>;
91
+ abort?: () => Promise<void> | void;
92
+ };
93
+ seenRequestIds?: Set<string>;
94
+ }): Promise<boolean> {
73
95
  const { request, taskId, agentId, session, seenRequestIds } = input;
74
96
  if (seenRequestIds?.has(request.id)) return false;
75
97
  if (request.agentId && request.agentId !== agentId && request.agentId !== taskId) return false;
76
98
  seenRequestIds?.add(request.id);
77
99
  if (request.operation === "steer") await session.steer?.(request.message ?? "Please report current status and wrap up if possible.");
78
- else if (request.operation === "follow-up") await session.prompt?.(request.message ?? "Please continue with the follow-up request.", { source: "api", expandPromptTemplates: false });
79
- else if (request.operation === "resume") await session.prompt?.(request.message ?? "Please resume and report final status.", { source: "api", expandPromptTemplates: false });
100
+ else if (request.operation === "follow-up")
101
+ await session.prompt?.(request.message ?? "Please continue with the follow-up request.", {
102
+ source: "api",
103
+ expandPromptTemplates: false,
104
+ });
105
+ else if (request.operation === "resume")
106
+ await session.prompt?.(request.message ?? "Please resume and report final status.", {
107
+ source: "api",
108
+ expandPromptTemplates: false,
109
+ });
80
110
  else if (request.operation === "stop") await session.abort?.();
81
111
  return true;
82
112
  }
83
113
 
84
- export async function applyLiveAgentControlRequests(input: { manifest: TeamRunManifest; taskId: string; agentId: string; session: { steer?: (text: string) => Promise<void>; prompt?: (text: string, options?: Record<string, unknown>) => Promise<void>; abort?: () => Promise<void> | void }; cursor: LiveAgentControlCursor; seenRequestIds?: Set<string> }): Promise<LiveAgentControlCursor> {
114
+ export async function applyLiveAgentControlRequests(input: {
115
+ manifest: TeamRunManifest;
116
+ taskId: string;
117
+ agentId: string;
118
+ session: {
119
+ steer?: (text: string) => Promise<void>;
120
+ prompt?: (text: string, options?: Record<string, unknown>) => Promise<void>;
121
+ abort?: () => Promise<void> | void;
122
+ };
123
+ cursor: LiveAgentControlCursor;
124
+ seenRequestIds?: Set<string>;
125
+ }): Promise<LiveAgentControlCursor> {
85
126
  const batch = readLiveAgentControlRequests(input.manifest, input.taskId, input.cursor);
86
- for (const request of batch.requests) await applyLiveAgentControlRequest({ request, taskId: input.taskId, agentId: input.agentId, session: input.session, seenRequestIds: input.seenRequestIds });
127
+ for (const request of batch.requests)
128
+ await applyLiveAgentControlRequest({
129
+ request,
130
+ taskId: input.taskId,
131
+ agentId: input.agentId,
132
+ session: input.session,
133
+ seenRequestIds: input.seenRequestIds,
134
+ });
87
135
  return batch.cursor;
88
136
  }
@@ -1,7 +1,7 @@
1
+ import type { appendEvent } from "../state/event-log.ts";
2
+ import { logInternalError } from "../utils/internal-error.ts";
1
3
  import type { CrewAgentRecord } from "./crew-agent-runtime.ts";
2
4
  import type { IrcMessage } from "./live-irc.ts";
3
- import { logInternalError } from "../utils/internal-error.ts";
4
- import type { appendEvent } from "../state/event-log.ts";
5
5
 
6
6
  const MAX_PENDING_MESSAGES = 1000;
7
7
 
@@ -12,7 +12,12 @@ type LiveSessionHandle = {
12
12
  dispose?: () => void;
13
13
  /** Upstream session stats (input/output/cacheWrite tokens, context %). */
14
14
  getSessionStats?: () => {
15
- tokens?: { input?: number; output?: number; cacheWrite?: number; cacheRead?: number };
15
+ tokens?: {
16
+ input?: number;
17
+ output?: number;
18
+ cacheWrite?: number;
19
+ cacheRead?: number;
20
+ };
16
21
  contextUsage?: { percent?: number | null; window?: number };
17
22
  };
18
23
  };
@@ -86,7 +91,13 @@ function listActiveLiveAgentsByWorkspace(workspaceId: string): LiveAgentHandle[]
86
91
  return listActiveLiveAgents().filter((a) => a.workspaceId === workspaceId);
87
92
  }
88
93
 
89
- export function registerLiveAgent(input: Omit<LiveAgentHandle, "createdAt" | "updatedAt" | "pendingSteers" | "pendingFollowUps" | "pendingMessages" | "activity"> & { workspaceId: string }, eventLogFn?: typeof appendEvent, eventsPath?: string): LiveAgentHandle {
94
+ export function registerLiveAgent(
95
+ input: Omit<LiveAgentHandle, "createdAt" | "updatedAt" | "pendingSteers" | "pendingFollowUps" | "pendingMessages" | "activity"> & {
96
+ workspaceId: string;
97
+ },
98
+ eventLogFn?: typeof appendEvent,
99
+ eventsPath?: string,
100
+ ): LiveAgentHandle {
90
101
  const now = new Date().toISOString();
91
102
  const existing = liveAgents.get(input.agentId);
92
103
  const handle: LiveAgentHandle = {
@@ -124,16 +135,41 @@ export function registerLiveAgent(input: Omit<LiveAgentHandle, "createdAt" | "up
124
135
  }
125
136
  }
126
137
  liveAgents.set(input.agentId, handle);
127
- try { if (eventLogFn && eventsPath) eventLogFn(eventsPath, { type: "live_agent.registered", runId: input.runId, taskId: input.taskId, message: `Live agent registered: ${input.agent} (${input.role})`, data: { agentId: input.agentId, role: input.role, agent: input.agent, workspaceId: input.workspaceId } }); } catch { /* non-critical */ }
138
+ try {
139
+ if (eventLogFn && eventsPath)
140
+ eventLogFn(eventsPath, {
141
+ type: "live_agent.registered",
142
+ runId: input.runId,
143
+ taskId: input.taskId,
144
+ message: `Live agent registered: ${input.agent} (${input.role})`,
145
+ data: {
146
+ agentId: input.agentId,
147
+ role: input.role,
148
+ agent: input.agent,
149
+ workspaceId: input.workspaceId,
150
+ },
151
+ });
152
+ } catch {
153
+ /* non-critical */
154
+ }
128
155
  if (handle.pendingSteers.length && typeof handle.session.steer === "function") {
129
156
  const pending = [...handle.pendingSteers];
130
157
  handle.pendingSteers.length = 0;
131
- for (const message of pending) void handle.session.steer(message).catch((error) => logInternalError("live-agent-manager.steer", error, `agentId=${handle.agentId}`));
158
+ for (const message of pending)
159
+ void handle.session
160
+ .steer(message)
161
+ .catch((error) => logInternalError("live-agent-manager.steer", error, `agentId=${handle.agentId}`));
132
162
  }
133
163
  if (handle.pendingFollowUps.length && typeof handle.session.prompt === "function") {
134
164
  const pending = [...handle.pendingFollowUps];
135
165
  handle.pendingFollowUps.length = 0;
136
- for (const message of pending) void handle.session.prompt(message, { source: "api", expandPromptTemplates: false }).catch((error) => logInternalError("live-agent-manager.prompt", error, `agentId=${handle.agentId}`));
166
+ for (const message of pending)
167
+ void handle.session
168
+ .prompt(message, {
169
+ source: "api",
170
+ expandPromptTemplates: false,
171
+ })
172
+ .catch((error) => logInternalError("live-agent-manager.prompt", error, `agentId=${handle.agentId}`));
137
173
  }
138
174
  return handle;
139
175
  }
@@ -146,7 +182,9 @@ export function updateLiveAgentStatus(agentId: string, status: CrewAgentRecord["
146
182
  }
147
183
 
148
184
  function safeDisposeLiveSession(handle: LiveAgentHandle): void {
149
- try { handle.session.dispose?.(); } catch (error) {
185
+ try {
186
+ handle.session.dispose?.();
187
+ } catch (error) {
150
188
  logInternalError("live-agent-manager.dispose", error, `agentId=${handle.agentId}`);
151
189
  }
152
190
  }
@@ -166,22 +204,48 @@ export function disposeLiveAgentSession(agentIdOrTaskId: string): void {
166
204
  safeDisposeLiveSession(handle);
167
205
  }
168
206
 
169
- export async function terminateLiveAgent(agentIdOrTaskId: string, status: CrewAgentRecord["status"] = "stopped", eventLogFn?: typeof appendEvent, eventsPath?: string): Promise<LiveAgentHandle | undefined> {
207
+ export async function terminateLiveAgent(
208
+ agentIdOrTaskId: string,
209
+ status: CrewAgentRecord["status"] = "stopped",
210
+ eventLogFn?: typeof appendEvent,
211
+ eventsPath?: string,
212
+ ): Promise<LiveAgentHandle | undefined> {
170
213
  const handle = getLiveAgent(agentIdOrTaskId);
171
214
  if (!handle) return undefined;
172
215
  handle.status = status;
173
216
  handle.updatedAt = new Date().toISOString();
174
- try { if (eventLogFn && eventsPath) eventLogFn(eventsPath, { type: "live_agent.terminated", runId: handle.runId, taskId: handle.taskId, message: `Live agent terminated: ${handle.agent} status=${status}`, data: { agentId: handle.agentId, status, role: handle.role, workspaceId: handle.workspaceId } }); } catch { /* non-critical */ }
217
+ try {
218
+ if (eventLogFn && eventsPath)
219
+ eventLogFn(eventsPath, {
220
+ type: "live_agent.terminated",
221
+ runId: handle.runId,
222
+ taskId: handle.taskId,
223
+ message: `Live agent terminated: ${handle.agent} status=${status}`,
224
+ data: {
225
+ agentId: handle.agentId,
226
+ status,
227
+ role: handle.role,
228
+ workspaceId: handle.workspaceId,
229
+ },
230
+ });
231
+ } catch {
232
+ /* non-critical */
233
+ }
175
234
  try {
176
235
  await handle.session.abort?.();
177
236
  } finally {
178
237
  safeDisposeLiveSession(handle);
179
- liveAgents.delete(handle.agentId); // Move AFTER abort completes to prevent race
238
+ liveAgents.delete(handle.agentId); // Move AFTER abort completes to prevent race
180
239
  }
181
240
  return handle;
182
241
  }
183
242
 
184
- export async function terminateLiveAgentsForRun(runId: string, status: CrewAgentRecord["status"] = "failed", eventLogFn?: typeof appendEvent, eventsPath?: string): Promise<number> {
243
+ export async function terminateLiveAgentsForRun(
244
+ runId: string,
245
+ status: CrewAgentRecord["status"] = "failed",
246
+ eventLogFn?: typeof appendEvent,
247
+ eventsPath?: string,
248
+ ): Promise<number> {
185
249
  const agents = [...liveAgents.values()].filter((agent) => agent.runId === runId);
186
250
  await Promise.all(agents.map((agent) => terminateLiveAgent(agent.agentId, status, eventLogFn, eventsPath)));
187
251
  return agents.length;
@@ -191,11 +255,11 @@ export function getLiveAgent(agentIdOrTaskId: string): LiveAgentHandle | undefin
191
255
  return liveAgents.get(agentIdOrTaskId) ?? [...liveAgents.values()].find((entry) => entry.taskId === agentIdOrTaskId);
192
256
  }
193
257
 
194
- /** Maximum time a terminal live agent handle stays in memory (10 minutes). */
195
- const STALE_HANDLE_MS = 10 * 60 * 1000;
196
- /** Maximum time a running/queued live agent handle stays without any update (30 minutes).
197
- * After this, the agent is presumed dead — the real process would have updated the handle. */
198
- const STALE_RUNNING_HANDLE_MS = 30 * 60 * 1000;
258
+ /** Maximum time a terminal live agent handle stays in memory (10 minutes). */
259
+ const STALE_HANDLE_MS = 10 * 60 * 1000;
260
+ /** Maximum time a running/queued live agent handle stays without any update (30 minutes).
261
+ * After this, the agent is presumed dead — the real process would have updated the handle. */
262
+ const STALE_RUNNING_HANDLE_MS = 30 * 60 * 1000;
199
263
 
200
264
  /** Remove dead live agent handles.
201
265
  * Evicts: (1) terminal-status handles older than STALE_HANDLE_MS, and
@@ -262,7 +326,10 @@ export async function followUpLiveAgent(agentIdOrTaskId: string, prompt: string)
262
326
  handle.pendingFollowUps.push(prompt);
263
327
  return handle;
264
328
  }
265
- await handle.session.prompt(prompt, { source: "api", expandPromptTemplates: false });
329
+ await handle.session.prompt(prompt, {
330
+ source: "api",
331
+ expandPromptTemplates: false,
332
+ });
266
333
  handle.updatedAt = new Date().toISOString();
267
334
  return handle;
268
335
  }
@@ -278,7 +345,10 @@ export async function resumeLiveAgent(agentIdOrTaskId: string, prompt: string):
278
345
  if (!handle) throw new Error(`Live agent '${agentIdOrTaskId}' is not registered in this process.`);
279
346
  if (typeof handle.session.prompt !== "function") throw new Error(`Live agent '${agentIdOrTaskId}' does not expose prompt().`);
280
347
  handle.status = "running";
281
- await handle.session.prompt(prompt, { source: "api", expandPromptTemplates: false });
348
+ await handle.session.prompt(prompt, {
349
+ source: "api",
350
+ expandPromptTemplates: false,
351
+ });
282
352
  handle.status = "completed";
283
353
  handle.updatedAt = new Date().toISOString();
284
354
  return handle;
@@ -354,7 +424,11 @@ export function sendIrcMessage(targetAgentId: string, message: IrcMessage): void
354
424
  if (typeof session.sendCustomMessage === "function") {
355
425
  try {
356
426
  (session.sendCustomMessage as (msg: unknown, opts?: unknown) => void)(
357
- { customType: "irc", content: `[DM from ${message.from}] ${message.content}`, display: "collapsed" },
427
+ {
428
+ customType: "irc",
429
+ content: `[DM from ${message.from}] ${message.content}`,
430
+ display: "collapsed",
431
+ },
358
432
  { deliverAs: "followUp", triggerTurn: false },
359
433
  );
360
434
  return;
@@ -365,7 +439,9 @@ export function sendIrcMessage(targetAgentId: string, message: IrcMessage): void
365
439
  // Fallback: inject as prompt (blocking)
366
440
  if (typeof handle.session.prompt === "function") {
367
441
  const ircPrompt = `[Message from ${message.from}] ${message.content}`;
368
- void handle.session.prompt(ircPrompt, { source: "api", expandPromptTemplates: false }).catch((error) => logInternalError("live-agent-manager.irc-deliver", error, `agentId=${handle.agentId}`));
442
+ void handle.session
443
+ .prompt(ircPrompt, { source: "api", expandPromptTemplates: false })
444
+ .catch((error) => logInternalError("live-agent-manager.irc-deliver", error, `agentId=${handle.agentId}`));
369
445
  }
370
446
  }
371
447
 
@@ -388,7 +464,11 @@ export function broadcastIrcMessage(fromAgentId: string, message: IrcMessage): s
388
464
  if (typeof session.sendCustomMessage === "function") {
389
465
  try {
390
466
  (session.sendCustomMessage as (msg: unknown, opts?: unknown) => void)(
391
- { customType: "irc", content: `[Broadcast from ${message.from}] ${message.content}`, display: "collapsed" },
467
+ {
468
+ customType: "irc",
469
+ content: `[Broadcast from ${message.from}] ${message.content}`,
470
+ display: "collapsed",
471
+ },
392
472
  { deliverAs: "followUp", triggerTurn: false },
393
473
  );
394
474
  recipients.push(handle.agentId);
@@ -400,7 +480,12 @@ export function broadcastIrcMessage(fromAgentId: string, message: IrcMessage): s
400
480
  // Fallback: inject as prompt
401
481
  if (typeof handle.session.prompt === "function") {
402
482
  const ircPrompt = `[Broadcast from ${message.from}] ${message.content}`;
403
- void handle.session.prompt(ircPrompt, { source: "api", expandPromptTemplates: false }).catch((error) => logInternalError("live-agent-manager.irc-broadcast", error, `agentId=${handle.agentId}`));
483
+ void handle.session
484
+ .prompt(ircPrompt, {
485
+ source: "api",
486
+ expandPromptTemplates: false,
487
+ })
488
+ .catch((error) => logInternalError("live-agent-manager.irc-broadcast", error, `agentId=${handle.agentId}`));
404
489
  }
405
490
  recipients.push(handle.agentId);
406
491
  }
@@ -491,7 +576,12 @@ export async function respondAsBackground(
491
576
  if (typeof session.sendCustomMessage === "function") {
492
577
  try {
493
578
  (session.sendCustomMessage as (msg: unknown, o?: unknown) => void)(
494
- { customType: "irc", content: deliveredTag, display: "collapsed", corrId },
579
+ {
580
+ customType: "irc",
581
+ content: deliveredTag,
582
+ display: "collapsed",
583
+ corrId,
584
+ },
495
585
  { deliverAs: "followUp", triggerTurn: false },
496
586
  );
497
587
  delivered = true;
@@ -501,10 +591,16 @@ export async function respondAsBackground(
501
591
  }
502
592
  if (!delivered && typeof handle.session.prompt === "function") {
503
593
  const promptText = `${deliveredTag}${awaitReply ? ` (reply correlation: ${corrId})` : ""}`;
504
- void handle.session.prompt(promptText, { source: "api", expandPromptTemplates: false }).catch((error) => logInternalError("live-agent-manager.respondAsBackground", error, `agentId=${handle.agentId}`));
594
+ void handle.session
595
+ .prompt(promptText, { source: "api", expandPromptTemplates: false })
596
+ .catch((error) => logInternalError("live-agent-manager.respondAsBackground", error, `agentId=${handle.agentId}`));
505
597
  delivered = true;
506
598
  }
507
- if (!delivered) return { ok: false, error: `Target '${targetAgentId}' has no message channel.` };
599
+ if (!delivered)
600
+ return {
601
+ ok: false,
602
+ error: `Target '${targetAgentId}' has no message channel.`,
603
+ };
508
604
  handle.updatedAt = new Date().toISOString();
509
605
 
510
606
  if (!awaitReply) return { ok: true, corrId };
@@ -555,7 +651,14 @@ export function awaitPendingReply(
555
651
  signal.addEventListener("abort", signalListener, { once: true });
556
652
  }
557
653
 
558
- pendingReplies.set(corrId, { corrId, targetAgentId, fromId, deadline, resolve: finish, timer });
654
+ pendingReplies.set(corrId, {
655
+ corrId,
656
+ targetAgentId,
657
+ fromId,
658
+ deadline,
659
+ resolve: finish,
660
+ timer,
661
+ });
559
662
  const set = pendingRepliesByTarget.get(targetAgentId) ?? new Set<string>();
560
663
  set.add(corrId);
561
664
  pendingRepliesByTarget.set(targetAgentId, set);
@@ -25,10 +25,30 @@ export function liveControlRealtimeMessage(request: LiveAgentControlRequest): Li
25
25
 
26
26
  export function parseLiveControlRealtimeMessage(raw: unknown): LiveAgentControlRequest | undefined {
27
27
  if (!raw || typeof raw !== "object" || Array.isArray(raw)) return undefined;
28
- const message = raw as { type?: unknown; version?: unknown; request?: unknown };
29
- if (message.type !== "live-control" || message.version !== 1 || !message.request || typeof message.request !== "object" || Array.isArray(message.request)) return undefined;
28
+ const message = raw as {
29
+ type?: unknown;
30
+ version?: unknown;
31
+ request?: unknown;
32
+ };
33
+ if (
34
+ message.type !== "live-control" ||
35
+ message.version !== 1 ||
36
+ !message.request ||
37
+ typeof message.request !== "object" ||
38
+ Array.isArray(message.request)
39
+ )
40
+ return undefined;
30
41
  const request = message.request as Partial<LiveAgentControlRequest>;
31
- return typeof request.id === "string" && typeof request.runId === "string" && typeof request.taskId === "string" && (request.operation === "steer" || request.operation === "follow-up" || request.operation === "stop" || request.operation === "resume") && typeof request.createdAt === "string" ? request as LiveAgentControlRequest : undefined;
42
+ return typeof request.id === "string" &&
43
+ typeof request.runId === "string" &&
44
+ typeof request.taskId === "string" &&
45
+ (request.operation === "steer" ||
46
+ request.operation === "follow-up" ||
47
+ request.operation === "stop" ||
48
+ request.operation === "resume") &&
49
+ typeof request.createdAt === "string"
50
+ ? (request as LiveAgentControlRequest)
51
+ : undefined;
32
52
  }
33
53
 
34
54
  export function clearLiveControlRealtimeForTest(): void {
@@ -77,7 +77,10 @@ function routeIrcMessage(
77
77
  },
78
78
  ): { deliveredTo: string[]; error?: string } {
79
79
  if (!message.to || !message.message?.trim()) {
80
- return { deliveredTo: [], error: "Missing 'to' (agent ID or 'all') and 'message' fields." };
80
+ return {
81
+ deliveredTo: [],
82
+ error: "Missing 'to' (agent ID or 'all') and 'message' fields.",
83
+ };
81
84
  }
82
85
  if (message.to === selfId) {
83
86
  return { deliveredTo: [], error: "Cannot send a message to yourself." };
@@ -60,10 +60,18 @@ export function collectLiveSessionHealth(
60
60
 
61
61
  for (const agent of agents) {
62
62
  switch (agent.status) {
63
- case "running": running++; break;
64
- case "idle": idle++; break;
65
- case "completed": completed++; break;
66
- case "failed": failed++; break;
63
+ case "running":
64
+ running++;
65
+ break;
66
+ case "idle":
67
+ idle++;
68
+ break;
69
+ case "completed":
70
+ completed++;
71
+ break;
72
+ case "failed":
73
+ failed++;
74
+ break;
67
75
  }
68
76
  }
69
77