pi-crew 0.9.16 → 0.9.17

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 (432) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/README.md +19 -0
  3. package/dist/build-meta.json +21790 -0
  4. package/dist/index.mjs +83070 -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/patterns/command-agent-skill.md +1 -1
  14. package/docs/skills/REFERENCE.md +0 -17
  15. package/docs//303/242mmaAAA/303/242 +357 -0
  16. package/index.bundle.ts +25 -0
  17. package/index.ts +95 -4
  18. package/package.json +15 -4
  19. package/skills/iterative-audit/SKILL.md +0 -1
  20. package/skills/widget-rendering/SKILL.md +17 -0
  21. package/src/adapters/claude-adapter.ts +1 -3
  22. package/src/adapters/export-util.ts +16 -16
  23. package/src/adapters/index.ts +5 -5
  24. package/src/agents/agent-config.ts +20 -14
  25. package/src/agents/agent-serializer.ts +1 -1
  26. package/src/agents/discover-agents.ts +83 -39
  27. package/src/benchmark/benchmark-runner.ts +51 -51
  28. package/src/benchmark/feedback-loop.ts +1 -1
  29. package/src/config/config.ts +166 -590
  30. package/src/config/defaults.ts +28 -2
  31. package/src/config/drift-detector.ts +11 -14
  32. package/src/config/markers.ts +201 -203
  33. package/src/config/resilient-parser.ts +14 -6
  34. package/src/config/role-tools.ts +3 -3
  35. package/src/config/suggestions.ts +5 -12
  36. package/src/config/types.ts +9 -25
  37. package/src/errors.ts +151 -157
  38. package/src/extension/action-suggestions.ts +54 -9
  39. package/src/extension/async-notifier.ts +43 -13
  40. package/src/extension/autonomous-policy.ts +77 -37
  41. package/src/extension/command-completions.ts +9 -8
  42. package/src/extension/context-status-injection.ts +14 -12
  43. package/src/extension/crew-autocomplete.ts +8 -16
  44. package/src/extension/crew-cleanup.ts +2 -1
  45. package/src/extension/crew-shortcuts.ts +9 -6
  46. package/src/extension/cross-extension-rpc.ts +136 -42
  47. package/src/extension/help.ts +1 -1
  48. package/src/extension/import-index.ts +10 -5
  49. package/src/extension/knowledge-injection.ts +88 -15
  50. package/src/extension/management.ts +89 -349
  51. package/src/extension/message-renderers.ts +3 -4
  52. package/src/extension/notification-router.ts +22 -5
  53. package/src/extension/notification-sink.ts +6 -3
  54. package/src/extension/pi-api.ts +17 -8
  55. package/src/extension/plan-orchestrate.ts +8 -27
  56. package/src/extension/project-init.ts +21 -6
  57. package/src/extension/register.ts +329 -975
  58. package/src/extension/registration/artifact-cleanup.ts +9 -4
  59. package/src/extension/registration/command-utils.ts +5 -1
  60. package/src/extension/registration/commands.ts +806 -314
  61. package/src/extension/registration/compaction-guard.ts +15 -15
  62. package/src/extension/registration/lifecycle.ts +259 -0
  63. package/src/extension/registration/observability.ts +293 -0
  64. package/src/extension/registration/subagent-helpers.ts +29 -7
  65. package/src/extension/registration/subagent-tools.ts +253 -44
  66. package/src/extension/registration/team-tool.ts +19 -84
  67. package/src/extension/registration/ui.ts +168 -0
  68. package/src/extension/registration/viewers.ts +64 -24
  69. package/src/extension/result-watcher.ts +18 -7
  70. package/src/extension/run-bundle-schema.ts +21 -6
  71. package/src/extension/run-export.ts +15 -6
  72. package/src/extension/run-import.ts +64 -29
  73. package/src/extension/run-index.ts +28 -9
  74. package/src/extension/run-maintenance.ts +32 -12
  75. package/src/extension/session-summary.ts +1 -1
  76. package/src/extension/team-manager-command.ts +64 -7
  77. package/src/extension/team-onboard.ts +151 -150
  78. package/src/extension/team-recommendation.ts +121 -21
  79. package/src/extension/team-tool/anchor.ts +31 -64
  80. package/src/extension/team-tool/api.ts +929 -141
  81. package/src/extension/team-tool/auto-summarize.ts +14 -26
  82. package/src/extension/team-tool/cache-control.ts +1 -5
  83. package/src/extension/team-tool/cancel.ts +138 -38
  84. package/src/extension/team-tool/chain-dispatch.ts +5 -13
  85. package/src/extension/team-tool/chain-executor.ts +29 -51
  86. package/src/extension/team-tool/config-patch.ts +1 -1
  87. package/src/extension/team-tool/context.ts +40 -20
  88. package/src/extension/team-tool/destructive-gate.ts +10 -5
  89. package/src/extension/team-tool/doctor.ts +170 -51
  90. package/src/extension/team-tool/explain.ts +228 -214
  91. package/src/extension/team-tool/failure-patterns.ts +3 -9
  92. package/src/extension/team-tool/goal-wrap.ts +71 -29
  93. package/src/extension/team-tool/goal.ts +185 -35
  94. package/src/extension/team-tool/handle-schedule.ts +34 -15
  95. package/src/extension/team-tool/handle-settings.ts +94 -56
  96. package/src/extension/team-tool/health-monitor.ts +27 -108
  97. package/src/extension/team-tool/inspect.ts +42 -9
  98. package/src/extension/team-tool/intent-policy.ts +4 -1
  99. package/src/extension/team-tool/lifecycle-actions.ts +244 -48
  100. package/src/extension/team-tool/orchestrate.ts +7 -18
  101. package/src/extension/team-tool/parallel-dispatch.ts +51 -29
  102. package/src/extension/team-tool/plan.ts +29 -5
  103. package/src/extension/team-tool/respond.ts +49 -16
  104. package/src/extension/team-tool/run-not-found.ts +3 -8
  105. package/src/extension/team-tool/run.ts +80 -317
  106. package/src/extension/team-tool/status.ts +135 -43
  107. package/src/extension/team-tool/workflow-manage.ts +92 -25
  108. package/src/extension/team-tool-types.ts +8 -1
  109. package/src/extension/team-tool.ts +142 -551
  110. package/src/extension/validate-resources.ts +39 -8
  111. package/src/hooks/registry.ts +66 -17
  112. package/src/hooks/types.ts +1 -1
  113. package/src/i18n.ts +25 -11
  114. package/src/observability/correlation.ts +17 -3
  115. package/src/observability/event-bus.ts +51 -56
  116. package/src/observability/event-to-metric.ts +117 -15
  117. package/src/observability/exporters/otlp-exporter.ts +56 -17
  118. package/src/observability/exporters/prometheus-exporter.ts +1 -1
  119. package/src/observability/metric-registry.ts +16 -4
  120. package/src/observability/metric-retention.ts +8 -2
  121. package/src/observability/metric-sink.ts +11 -3
  122. package/src/observability/metrics-primitives.ts +42 -9
  123. package/src/plugins/plugin-define.ts +2 -2
  124. package/src/plugins/plugin-registry.ts +25 -25
  125. package/src/plugins/plugins/index.ts +1 -1
  126. package/src/plugins/plugins/nextjs.ts +16 -16
  127. package/src/plugins/plugins/vite.ts +7 -11
  128. package/src/plugins/plugins/vitest.ts +6 -11
  129. package/src/runtime/adaptive-plan.ts +225 -40
  130. package/src/runtime/agent-control.ts +58 -15
  131. package/src/runtime/agent-memory.ts +15 -9
  132. package/src/runtime/agent-observability.ts +10 -2
  133. package/src/runtime/anchor-manager.ts +27 -25
  134. package/src/runtime/async-marker.ts +7 -1
  135. package/src/runtime/async-runner.ts +27 -23
  136. package/src/runtime/auto-summarize.ts +7 -13
  137. package/src/runtime/background-runner.ts +189 -251
  138. package/src/runtime/batch-barrier.ts +18 -16
  139. package/src/runtime/cancellation-token.ts +16 -6
  140. package/src/runtime/cancellation.ts +46 -8
  141. package/src/runtime/capability-inventory.ts +6 -4
  142. package/src/runtime/chain-parser.ts +44 -11
  143. package/src/runtime/chain-runner.ts +63 -69
  144. package/src/runtime/checkpoint.ts +12 -56
  145. package/src/runtime/child-pi.ts +343 -78
  146. package/src/runtime/coalesce-tasks.ts +268 -0
  147. package/src/runtime/code-summary.ts +71 -26
  148. package/src/runtime/compact-stages/index.ts +15 -5
  149. package/src/runtime/compact-stages/tail-capture-stage.ts +7 -2
  150. package/src/runtime/compact-stages/truncation-stage.ts +4 -1
  151. package/src/runtime/compaction-summary.ts +17 -10
  152. package/src/runtime/completion-guard.ts +33 -16
  153. package/src/runtime/crash-classification.ts +28 -7
  154. package/src/runtime/crash-recovery.ts +177 -37
  155. package/src/runtime/crew-agent-records.ts +145 -47
  156. package/src/runtime/crew-hooks.ts +9 -24
  157. package/src/runtime/cross-extension-rpc.ts +25 -23
  158. package/src/runtime/custom-tools/irc-tool.ts +43 -15
  159. package/src/runtime/custom-tools/submit-result-tool.ts +16 -5
  160. package/src/runtime/delivery-coordinator.ts +34 -7
  161. package/src/runtime/delta-conflict.ts +9 -21
  162. package/src/runtime/deterministic-ast.ts +1 -1
  163. package/src/runtime/diagnostic-export.ts +53 -20
  164. package/src/runtime/direct-run.ts +12 -2
  165. package/src/runtime/dwf-state-store.ts +1 -1
  166. package/src/runtime/dynamic-workflow-context.ts +186 -58
  167. package/src/runtime/dynamic-workflow-runner.ts +42 -20
  168. package/src/runtime/effectiveness.ts +16 -8
  169. package/src/runtime/errors/crew-errors.ts +7 -11
  170. package/src/runtime/event-stream-bridge.ts +9 -3
  171. package/src/runtime/foreground-control.ts +54 -14
  172. package/src/runtime/foreground-watchdog.ts +9 -6
  173. package/src/runtime/goal-achievement.ts +27 -10
  174. package/src/runtime/goal-evaluator.ts +54 -19
  175. package/src/runtime/goal-loop-runner.ts +280 -99
  176. package/src/runtime/goal-state-store.ts +27 -17
  177. package/src/runtime/green-contract.ts +11 -2
  178. package/src/runtime/group-join.ts +64 -31
  179. package/src/runtime/handoff-manager.ts +37 -42
  180. package/src/runtime/heartbeat-gradient.ts +10 -2
  181. package/src/runtime/heartbeat-watcher.ts +32 -6
  182. package/src/runtime/hidden-handoff.ts +12 -30
  183. package/src/runtime/important-line-classifier.ts +12 -2
  184. package/src/runtime/iteration-hooks.ts +25 -15
  185. package/src/runtime/live-agent-control.ts +55 -7
  186. package/src/runtime/live-agent-manager.ts +130 -27
  187. package/src/runtime/live-control-realtime.ts +23 -3
  188. package/src/runtime/live-irc.ts +4 -1
  189. package/src/runtime/live-session-health.ts +12 -4
  190. package/src/runtime/live-session-runtime.ts +379 -117
  191. package/src/runtime/manifest-cache.ts +28 -12
  192. package/src/runtime/mcp-proxy.ts +8 -16
  193. package/src/runtime/metric-parser.ts +1 -5
  194. package/src/runtime/model-fallback.ts +55 -18
  195. package/src/runtime/model-resolver.ts +2 -6
  196. package/src/runtime/model-scope.ts +19 -3
  197. package/src/runtime/notebook-helpers.ts +60 -62
  198. package/src/runtime/orphan-worker-registry.ts +37 -26
  199. package/src/runtime/output-validator.ts +18 -3
  200. package/src/runtime/overflow-recovery.ts +5 -4
  201. package/src/runtime/parallel-research.ts +29 -5
  202. package/src/runtime/parallel-utils.ts +9 -11
  203. package/src/runtime/path-overlap.ts +150 -0
  204. package/src/runtime/peer-dep.ts +12 -17
  205. package/src/runtime/per-write-validator.ts +1 -3
  206. package/src/runtime/phase-tracker.ts +342 -330
  207. package/src/runtime/pi-args.ts +26 -8
  208. package/src/runtime/pi-json-output.ts +1 -1
  209. package/src/runtime/pi-spawn.ts +30 -19
  210. package/src/runtime/pipeline-runner.ts +56 -55
  211. package/src/runtime/plan-templates.ts +5 -6
  212. package/src/runtime/policy-engine.ts +43 -7
  213. package/src/runtime/post-checks.ts +12 -4
  214. package/src/runtime/post-exit-stdio-guard.ts +2 -2
  215. package/src/runtime/process-lifecycle.ts +20 -10
  216. package/src/runtime/process-status.ts +16 -5
  217. package/src/runtime/progress-event-coalescer.ts +2 -1
  218. package/src/runtime/progress-tracker.ts +103 -103
  219. package/src/runtime/prose-compressor.ts +9 -11
  220. package/src/runtime/recovery-recipes.ts +118 -24
  221. package/src/runtime/replace.ts +25 -10
  222. package/src/runtime/resilient-edit.ts +10 -25
  223. package/src/runtime/result-extractor.ts +1 -2
  224. package/src/runtime/retry-executor.ts +20 -4
  225. package/src/runtime/retry-runner.ts +26 -50
  226. package/src/runtime/role-permission.ts +6 -1
  227. package/src/runtime/run-coalesced-task-group.ts +256 -0
  228. package/src/runtime/run-drift.ts +14 -15
  229. package/src/runtime/run-tracker.ts +6 -28
  230. package/src/runtime/runtime-policy.ts +1 -6
  231. package/src/runtime/runtime-resolver.ts +80 -15
  232. package/src/runtime/scheduler.ts +47 -18
  233. package/src/runtime/semaphore.ts +5 -7
  234. package/src/runtime/sensitive-paths.ts +2 -1
  235. package/src/runtime/session-usage.ts +1 -1
  236. package/src/runtime/settings-store.ts +16 -12
  237. package/src/runtime/sidechain-output.ts +6 -2
  238. package/src/runtime/single-agent-compose.ts +1 -4
  239. package/src/runtime/skill-effectiveness.ts +29 -97
  240. package/src/runtime/skill-instructions.ts +40 -83
  241. package/src/runtime/stale-reconciler.ts +73 -197
  242. package/src/runtime/stream-preview.ts +1 -1
  243. package/src/runtime/streaming-output.ts +1 -1
  244. package/src/runtime/subagent-manager.ts +44 -169
  245. package/src/runtime/subprocess-tool-registry.ts +4 -1
  246. package/src/runtime/supervisor-contact.ts +10 -5
  247. package/src/runtime/task-display.ts +19 -5
  248. package/src/runtime/task-graph-scheduler.ts +95 -21
  249. package/src/runtime/task-graph.ts +5 -11
  250. package/src/runtime/task-health.ts +54 -47
  251. package/src/runtime/task-id.ts +11 -18
  252. package/src/runtime/task-output-context.ts +265 -81
  253. package/src/runtime/task-packet.ts +12 -20
  254. package/src/runtime/task-quality.ts +6 -14
  255. package/src/runtime/task-runner/context-retrieval.ts +4 -13
  256. package/src/runtime/task-runner/live-executor.ts +114 -36
  257. package/src/runtime/task-runner/output-splitter.ts +152 -0
  258. package/src/runtime/task-runner/progress.ts +50 -12
  259. package/src/runtime/task-runner/prompt-builder.ts +31 -7
  260. package/src/runtime/task-runner/prompt-pipeline.ts +31 -7
  261. package/src/runtime/task-runner/result-utils.ts +3 -1
  262. package/src/runtime/task-runner/retrieval-orchestrator.ts +310 -0
  263. package/src/runtime/task-runner/run-projection.ts +27 -8
  264. package/src/runtime/task-runner/state-helpers.ts +29 -8
  265. package/src/runtime/task-runner/tail-read.ts +2 -6
  266. package/src/runtime/task-runner.ts +180 -326
  267. package/src/runtime/team-runner-artifacts.ts +13 -0
  268. package/src/runtime/team-runner.ts +456 -974
  269. package/src/runtime/tool-output-pruner.ts +6 -9
  270. package/src/runtime/tool-progress.ts +11 -21
  271. package/src/runtime/verification-gates.ts +33 -24
  272. package/src/runtime/verification-integrity.ts +1 -4
  273. package/src/runtime/verification-worktree.ts +62 -12
  274. package/src/runtime/worker-heartbeat.ts +5 -1
  275. package/src/runtime/worker-startup.ts +29 -5
  276. package/src/runtime/workflow-state.ts +17 -9
  277. package/src/runtime/workspace-lock.ts +30 -35
  278. package/src/runtime/workspace-tree.ts +20 -32
  279. package/src/runtime/yield-handler.ts +43 -9
  280. package/src/runtime/zombie-scanner.ts +5 -4
  281. package/src/schema/config-schema.ts +266 -172
  282. package/src/schema/team-tool-schema.ts +29 -74
  283. package/src/schema/validation-types.ts +25 -17
  284. package/src/skills/discover-skills.ts +35 -10
  285. package/src/skills/skill-templates.ts +109 -27
  286. package/src/skills/validate.ts +26 -8
  287. package/src/state/active-run-registry.ts +87 -28
  288. package/src/state/artifact-store.ts +9 -5
  289. package/src/state/atomic-write-v2.ts +85 -63
  290. package/src/state/atomic-write.ts +105 -26
  291. package/src/state/blob-store.ts +47 -20
  292. package/src/state/contracts.ts +20 -5
  293. package/src/state/crew-init.ts +5 -22
  294. package/src/state/decision-ledger.ts +19 -73
  295. package/src/state/event-log-rotation.ts +41 -15
  296. package/src/state/event-log.ts +168 -53
  297. package/src/state/event-reconstructor.ts +11 -1
  298. package/src/state/gitignore-manager.ts +2 -8
  299. package/src/state/health-store.ts +57 -57
  300. package/src/state/hook-instinct-bridge.ts +1 -1
  301. package/src/state/hook-integrations.ts +1 -1
  302. package/src/state/instinct-store.ts +17 -5
  303. package/src/state/jsonl-writer.ts +1 -1
  304. package/src/state/locks.ts +23 -9
  305. package/src/state/mailbox.ts +151 -28
  306. package/src/state/observation-store.ts +20 -14
  307. package/src/state/run-cache.ts +142 -135
  308. package/src/state/run-graph.ts +6 -15
  309. package/src/state/run-metrics.ts +5 -18
  310. package/src/state/schedule.ts +15 -9
  311. package/src/state/state-store.ts +129 -45
  312. package/src/state/task-claims.ts +12 -2
  313. package/src/state/tiered-eval.ts +52 -43
  314. package/src/state/types-eval.ts +2 -2
  315. package/src/state/types.ts +24 -20
  316. package/src/state/usage.ts +20 -4
  317. package/src/state/worker-atomic-writer.ts +6 -3
  318. package/src/subagents/index.ts +2 -2
  319. package/src/teams/discover-teams.ts +21 -6
  320. package/src/tools/safe-bash-extension.ts +5 -6
  321. package/src/tools/safe-bash.ts +10 -11
  322. package/src/types/new-api-types.ts +6 -10
  323. package/src/ui/agent-management-overlay.ts +52 -40
  324. package/src/ui/card-colors.ts +13 -4
  325. package/src/ui/crew-footer.ts +8 -7
  326. package/src/ui/crew-select-list.ts +1 -1
  327. package/src/ui/dashboard-panes/agents-pane.ts +41 -25
  328. package/src/ui/dashboard-panes/cancellation-pane.ts +1 -1
  329. package/src/ui/dashboard-panes/capability-pane.ts +32 -15
  330. package/src/ui/dashboard-panes/health-pane.ts +2 -1
  331. package/src/ui/dashboard-panes/metrics-pane.ts +4 -1
  332. package/src/ui/dashboard-panes/progress-pane.ts +12 -9
  333. package/src/ui/heartbeat-aggregator.ts +15 -4
  334. package/src/ui/keybinding-map.ts +40 -7
  335. package/src/ui/live-conversation-overlay.ts +36 -20
  336. package/src/ui/live-duration.ts +1 -4
  337. package/src/ui/live-run-sidebar.ts +88 -25
  338. package/src/ui/loaders.ts +2 -8
  339. package/src/ui/mascot.ts +20 -36
  340. package/src/ui/overlays/agent-picker-overlay.ts +11 -3
  341. package/src/ui/overlays/confirm-overlay.ts +4 -2
  342. package/src/ui/overlays/help-overlay.ts +25 -14
  343. package/src/ui/overlays/mailbox-compose-overlay.ts +48 -11
  344. package/src/ui/overlays/mailbox-compose-preview.ts +20 -5
  345. package/src/ui/overlays/mailbox-detail-overlay.ts +27 -6
  346. package/src/ui/pi-ui-compat.ts +7 -7
  347. package/src/ui/powerbar-publisher.ts +120 -42
  348. package/src/ui/render-diff.ts +10 -3
  349. package/src/ui/render-scheduler.ts +12 -4
  350. package/src/ui/run-action-dispatcher.ts +81 -18
  351. package/src/ui/run-dashboard.ts +172 -76
  352. package/src/ui/run-event-bus.ts +59 -37
  353. package/src/ui/run-snapshot-cache.ts +276 -86
  354. package/src/ui/settings-overlay.ts +361 -74
  355. package/src/ui/status-colors.ts +12 -1
  356. package/src/ui/syntax-highlight.ts +1 -1
  357. package/src/ui/theme-adapter.ts +16 -14
  358. package/src/ui/theme-discovery.ts +13 -2
  359. package/src/ui/tool-progress-formatter.ts +7 -7
  360. package/src/ui/tool-render.ts +128 -56
  361. package/src/ui/tool-renderers/brief-mode.ts +45 -27
  362. package/src/ui/tool-renderers/index.ts +109 -43
  363. package/src/ui/transcript-cache.ts +32 -6
  364. package/src/ui/transcript-entries.ts +25 -23
  365. package/src/ui/transcript-viewer.ts +78 -29
  366. package/src/ui/widget/index.ts +99 -40
  367. package/src/ui/widget/widget-formatters.ts +13 -6
  368. package/src/ui/widget/widget-model.ts +19 -8
  369. package/src/ui/widget/widget-renderer.ts +23 -13
  370. package/src/ui/widget/widget-types.ts +1 -1
  371. package/src/utils/bm25-search.ts +199 -199
  372. package/src/utils/conflict-detect.ts +22 -21
  373. package/src/utils/env-filter.ts +14 -7
  374. package/src/utils/file-coalescer.ts +5 -1
  375. package/src/utils/fingerprint.ts +3 -6
  376. package/src/utils/frontmatter.ts +3 -1
  377. package/src/utils/fs-watch.ts +2 -6
  378. package/src/utils/gh-protocol.ts +119 -44
  379. package/src/utils/git.ts +13 -15
  380. package/src/utils/guards.ts +2 -5
  381. package/src/utils/ids.ts +9 -2
  382. package/src/utils/incremental-reader.ts +14 -3
  383. package/src/utils/internal-error.ts +2 -1
  384. package/src/utils/names.ts +12 -3
  385. package/src/utils/paths.ts +49 -5
  386. package/src/utils/project-detector.ts +2 -2
  387. package/src/utils/redaction.ts +29 -19
  388. package/src/utils/resolve-shell.ts +9 -7
  389. package/src/utils/run-watcher-registry.ts +19 -31
  390. package/src/utils/safe-paths.ts +45 -24
  391. package/src/utils/scan-cache.ts +9 -2
  392. package/src/utils/session-utils.ts +2 -4
  393. package/src/utils/sleep.ts +12 -5
  394. package/src/utils/sse-parser.ts +5 -17
  395. package/src/utils/visual.ts +52 -32
  396. package/src/workflows/discover-workflows.ts +41 -109
  397. package/src/workflows/intermediate-store.ts +5 -21
  398. package/src/workflows/preflight-validator.ts +6 -33
  399. package/src/workflows/topology-analyzer.ts +5 -21
  400. package/src/workflows/workflow-config.ts +7 -6
  401. package/src/worktree/branch-freshness.ts +66 -8
  402. package/src/worktree/cleanup.ts +130 -20
  403. package/src/worktree/worktree-manager.ts +212 -69
  404. package/skills/artifact-analysis-loop/SKILL.md +0 -303
  405. package/skills/detection-pipeline-design/SKILL.md +0 -286
  406. package/skills/hunting-investigation-loop/SKILL.md +0 -402
  407. package/skills/incident-playbook-construction/SKILL.md +0 -384
  408. package/skills/security-review/SKILL.md +0 -561
  409. package/skills/threat-hypothesis-framework/SKILL.md +0 -176
  410. package/skills/ui-render-performance/SKILL.md +0 -58
  411. /package/docs/{followup-review-round3-2026-05-12.md → archive/followup-review-round3-2026-05-12.md} +0 -0
  412. /package/docs/{followup-review-round4-2026-05-13.md → archive/followup-review-round4-2026-05-13.md} +0 -0
  413. /package/docs/{pi-crew-bugs.md → archive/pi-crew-bugs.md} +0 -0
  414. /package/docs/{pi-crew-test-final.md → archive/pi-crew-test-final.md} +0 -0
  415. /package/docs/{pi-crew-test-results.md → archive/pi-crew-test-results.md} +0 -0
  416. /package/docs/{pi-crew-test-round2.md → archive/pi-crew-test-round2.md} +0 -0
  417. /package/docs/{pi-crew-test-round4.md → archive/pi-crew-test-round4.md} +0 -0
  418. /package/docs/{pi-crew-test-round5.md → archive/pi-crew-test-round5.md} +0 -0
  419. /package/docs/{pi-crew-test-round6.md → archive/pi-crew-test-round6.md} +0 -0
  420. /package/docs/{pi-crew-v0.5.10-audit-fix-plan.md → archive/pi-crew-v0.5.10-audit-fix-plan.md} +0 -0
  421. /package/docs/{pi-crew-v0.5.11-audit-fix-plan.md → archive/pi-crew-v0.5.11-audit-fix-plan.md} +0 -0
  422. /package/docs/{pi-crew-v0.5.12-audit-fix-plan.md → archive/pi-crew-v0.5.12-audit-fix-plan.md} +0 -0
  423. /package/docs/{pi-crew-v0.5.13-audit-fix-plan.md → archive/pi-crew-v0.5.13-audit-fix-plan.md} +0 -0
  424. /package/docs/{pi-crew-v0.5.14-audit-fix-plan.md → archive/pi-crew-v0.5.14-audit-fix-plan.md} +0 -0
  425. /package/docs/{pi-crew-v0.5.16-audit-fix-plan.md → archive/pi-crew-v0.5.16-audit-fix-plan.md} +0 -0
  426. /package/docs/{pi-crew-v0.5.17-audit-fix-plan.md → archive/pi-crew-v0.5.17-audit-fix-plan.md} +0 -0
  427. /package/docs/{pi-crew-v0.5.5-audit-fix-plan.md → archive/pi-crew-v0.5.5-audit-fix-plan.md} +0 -0
  428. /package/docs/{pi-crew-v0.5.9-audit-fix-plan.md → archive/pi-crew-v0.5.9-audit-fix-plan.md} +0 -0
  429. /package/docs/{pi-mono-opportunities.md → archive/pi-mono-opportunities.md} +0 -0
  430. /package/docs/{pi-mono-review.md → archive/pi-mono-review.md} +0 -0
  431. /package/docs/{pi-subagent4-comparison.md → archive/pi-subagent4-comparison.md} +0 -0
  432. /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