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
@@ -13,12 +13,7 @@ type WidgetOptionsWithPersist = WidgetOptions & { persist?: boolean };
13
13
 
14
14
  type CustomOptions = Parameters<ExtensionUi["custom"]>[1];
15
15
 
16
- type CustomFactory<T> = (
17
- tui: unknown,
18
- theme: unknown,
19
- keybindings: unknown,
20
- done: (result: T) => void,
21
- ) => unknown;
16
+ type CustomFactory<T> = (tui: unknown, theme: unknown, keybindings: unknown, done: (result: T) => void) => unknown;
22
17
  type GenericCustom = <T>(factory: CustomFactory<T>, options?: CustomOptions) => Promise<T>;
23
18
 
24
19
  function maybeRecord(value: unknown): Record<string, unknown> | undefined {
@@ -41,7 +36,12 @@ export function setWorkingIndicator(ctx: UiContext, options?: WorkingIndicatorOp
41
36
  if (typeof fn === "function") fn.call(ctx.ui, options);
42
37
  }
43
38
 
44
- export function setExtensionWidget(ctx: UiContext, key: string, content: WidgetContent | undefined, options?: WidgetOptionsWithPersist): void {
39
+ export function setExtensionWidget(
40
+ ctx: UiContext,
41
+ key: string,
42
+ content: WidgetContent | undefined,
43
+ options?: WidgetOptionsWithPersist,
44
+ ): void {
45
45
  const { persist: _persist, ...widgetOptions } = options ?? {};
46
46
  ctx.ui.setWidget(key, content as never, widgetOptions as WidgetOptions);
47
47
  }
@@ -1,22 +1,34 @@
1
1
  import * as fs from "node:fs";
2
- import { listRecentRuns } from "../extension/run-index.ts";
3
2
  import type { CrewUiConfig } from "../config/config.ts";
3
+ import { listRecentRuns } from "../extension/run-index.ts";
4
4
  import { readCrewAgents } from "../runtime/crew-agent-records.ts";
5
- import { readJsonFileCoalesced } from "../utils/file-coalescer.ts";
6
- import type { TeamTaskState, TeamRunManifest } from "../state/types.ts";
7
- import { aggregateUsage } from "../state/usage.ts";
8
- import { isDisplayActiveRun } from "../runtime/process-status.ts";
9
5
  import { listLiveAgents } from "../runtime/live-agent-manager.ts";
10
- import { logInternalError } from "../utils/internal-error.ts";
11
6
  import type { ManifestCache } from "../runtime/manifest-cache.ts";
12
- import type { RunSnapshotCache, RunUiSnapshot } from "./snapshot-types.ts";
13
- import { notificationBadge } from "./widget/widget-formatters.ts";
14
- import { RenderCoalescer } from "./render-coalescer.ts";
7
+ import { isDisplayActiveRun } from "../runtime/process-status.ts";
8
+ import type { TeamRunManifest, TeamTaskState } from "../state/types.ts";
9
+ import { aggregateUsage } from "../state/usage.ts";
10
+ import { readJsonFileCoalesced } from "../utils/file-coalescer.ts";
11
+ import { logInternalError } from "../utils/internal-error.ts";
15
12
  import { allWorkflows, discoverWorkflows } from "../workflows/discover-workflows.ts";
16
13
  import type { WorkflowConfig, WorkflowStep } from "../workflows/workflow-config.ts";
14
+ import { RenderCoalescer } from "./render-coalescer.ts";
15
+ import type { RunSnapshotCache, RunUiSnapshot } from "./snapshot-types.ts";
16
+ import { notificationBadge } from "./widget/widget-formatters.ts";
17
17
 
18
- type EventBus = { emit?: (event: string, data: unknown) => void; listenerCount?: (event: string) => number } | undefined;
19
- type StatusContext = { hasUI?: boolean; ui?: { setStatus?: (key: string, text: string | undefined) => void } } | undefined;
18
+ type EventBus =
19
+ | {
20
+ emit?: (event: string, data: unknown) => void;
21
+ listenerCount?: (event: string) => number;
22
+ }
23
+ | undefined;
24
+ type StatusContext =
25
+ | {
26
+ hasUI?: boolean;
27
+ ui?: {
28
+ setStatus?: (key: string, text: string | undefined) => void;
29
+ };
30
+ }
31
+ | undefined;
20
32
 
21
33
  const TASK_READ_TTL_MS = 200;
22
34
 
@@ -63,33 +75,59 @@ export function compactTokens(total: number): string {
63
75
 
64
76
  export function registerPiCrewPowerbarSegments(events: EventBus, config?: CrewUiConfig): void {
65
77
  if (config?.powerbar === false) return;
66
- safeEmit(events, "powerbar:register-segment", { id: "pi-crew-active", label: "pi-crew active agents" });
67
- safeEmit(events, "powerbar:register-segment", { id: "pi-crew-progress", label: "pi-crew run progress" });
68
- safeEmit(events, "powerbar:register-segment", { id: "pi-crew-steps", label: "pi-crew workflow steps" });
78
+ safeEmit(events, "powerbar:register-segment", {
79
+ id: "pi-crew-active",
80
+ label: "pi-crew active agents",
81
+ });
82
+ safeEmit(events, "powerbar:register-segment", {
83
+ id: "pi-crew-progress",
84
+ label: "pi-crew run progress",
85
+ });
86
+ safeEmit(events, "powerbar:register-segment", {
87
+ id: "pi-crew-steps",
88
+ label: "pi-crew workflow steps",
89
+ });
69
90
  }
70
91
 
71
- export function updatePiCrewPowerbar(events: EventBus, cwd: string, config?: CrewUiConfig, manifestCache?: ManifestCache, snapshotCache?: RunSnapshotCache, ctx?: StatusContext, notificationCount = 0, preloadedManifests?: TeamRunManifest[]): void {
92
+ export function updatePiCrewPowerbar(
93
+ events: EventBus,
94
+ cwd: string,
95
+ config?: CrewUiConfig,
96
+ manifestCache?: ManifestCache,
97
+ snapshotCache?: RunSnapshotCache,
98
+ ctx?: StatusContext,
99
+ notificationCount = 0,
100
+ preloadedManifests?: TeamRunManifest[],
101
+ ): void {
72
102
  if (config?.powerbar === false) return;
73
103
  const useStatusFallback = !hasPowerbarConsumer(events);
74
104
  const runs = preloadedManifests ?? (manifestCache ? manifestCache.list(20) : listRecentRuns(cwd, 20));
75
- const active = runs.map((run) => {
76
- let snapshot: RunUiSnapshot | undefined;
77
- try {
78
- // 1.2: render path is read-only. Use cache.get() only; the background
79
- // preload loop in register.ts populates entries on its own cadence.
80
- snapshot = snapshotCache?.get(run.runId);
81
- } catch (error) {
82
- logInternalError("powerbar.snapshot", error, run.runId);
83
- }
84
- if (snapshot) return { run: snapshot.manifest, agents: snapshot.agents, tasks: snapshot.tasks, snapshot };
85
- let agents: ReturnType<typeof readCrewAgents> = [];
86
- try {
87
- agents = readCrewAgents(run);
88
- } catch (error) {
89
- logInternalError("powerbar.readCrewAgents", error, run.runId);
90
- }
91
- return { run, agents, tasks: readTasks(run.tasksPath), snapshot };
92
- }).filter((item) => isDisplayActiveRun(item.run, item.agents));
105
+ const active = runs
106
+ .map((run) => {
107
+ let snapshot: RunUiSnapshot | undefined;
108
+ try {
109
+ // 1.2: render path is read-only. Use cache.get() only; the background
110
+ // preload loop in register.ts populates entries on its own cadence.
111
+ snapshot = snapshotCache?.get(run.runId);
112
+ } catch (error) {
113
+ logInternalError("powerbar.snapshot", error, run.runId);
114
+ }
115
+ if (snapshot)
116
+ return {
117
+ run: snapshot.manifest,
118
+ agents: snapshot.agents,
119
+ tasks: snapshot.tasks,
120
+ snapshot,
121
+ };
122
+ let agents: ReturnType<typeof readCrewAgents> = [];
123
+ try {
124
+ agents = readCrewAgents(run);
125
+ } catch (error) {
126
+ logInternalError("powerbar.readCrewAgents", error, run.runId);
127
+ }
128
+ return { run, agents, tasks: readTasks(run.tasksPath), snapshot };
129
+ })
130
+ .filter((item) => isDisplayActiveRun(item.run, item.agents));
93
131
  if (!active.length) {
94
132
  lastActiveKey = undefined;
95
133
  lastProgressKey = undefined;
@@ -102,25 +140,56 @@ export function updatePiCrewPowerbar(events: EventBus, cwd: string, config?: Cre
102
140
  const agents = active.flatMap((item) => item.agents);
103
141
  const tasks = active.flatMap((item) => item.tasks);
104
142
  const running = agents.filter((agent) => agent.status === "running").length;
105
- const waiting = active.reduce((sum, item) => sum + (item.snapshot ? item.snapshot.progress.queued + (item.snapshot.progress.waiting ?? 0) : item.tasks.reduce((s, t) => s + (t.status === "queued" || t.status === "waiting" ? 1 : 0), 0)), 0);
106
- const completed = active.reduce((sum, item) => sum + (item.snapshot?.progress.completed ?? item.tasks.reduce((s, t) => s + (t.status === "completed" ? 1 : 0), 0)), 0);
143
+ const waiting = active.reduce(
144
+ (sum, item) =>
145
+ sum +
146
+ (item.snapshot
147
+ ? item.snapshot.progress.queued + (item.snapshot.progress.waiting ?? 0)
148
+ : item.tasks.reduce((s, t) => s + (t.status === "queued" || t.status === "waiting" ? 1 : 0), 0)),
149
+ 0,
150
+ );
151
+ const completed = active.reduce(
152
+ (sum, item) => sum + (item.snapshot?.progress.completed ?? item.tasks.reduce((s, t) => s + (t.status === "completed" ? 1 : 0), 0)),
153
+ 0,
154
+ );
107
155
  const total = Math.max(1, active.reduce((sum, item) => sum + (item.snapshot?.progress.total ?? item.tasks.length), 0) || agents.length);
108
156
  const usage = aggregateUsage(tasks);
109
- const snapshotTokens = active.reduce((sum, item) => sum + (item.snapshot ? item.snapshot.usage.tokensIn + item.snapshot.usage.tokensOut : 0), 0);
110
- const hasUsage = usage && ((usage.input ?? 0) + (usage.output ?? 0) + (usage.cacheRead ?? 0) + (usage.cacheWrite ?? 0)) > 0;
111
- const tokenTotal = hasUsage ? (usage.input ?? 0) + (usage.output ?? 0) + (usage.cacheRead ?? 0) + (usage.cacheWrite ?? 0) : snapshotTokens;
112
- const model = config?.showModel === false ? undefined : agents.find((agent) => agent.model)?.model?.split("/").at(-1);
157
+ const snapshotTokens = active.reduce(
158
+ (sum, item) => sum + (item.snapshot ? item.snapshot.usage.tokensIn + item.snapshot.usage.tokensOut : 0),
159
+ 0,
160
+ );
161
+ const hasUsage = usage && (usage.input ?? 0) + (usage.output ?? 0) + (usage.cacheRead ?? 0) + (usage.cacheWrite ?? 0) > 0;
162
+ const tokenTotal = hasUsage
163
+ ? (usage.input ?? 0) + (usage.output ?? 0) + (usage.cacheRead ?? 0) + (usage.cacheWrite ?? 0)
164
+ : snapshotTokens;
165
+ const model =
166
+ config?.showModel === false
167
+ ? undefined
168
+ : agents
169
+ .find((agent) => agent.model)
170
+ ?.model?.split("/")
171
+ .at(-1);
113
172
  const tokenText = config?.showTokens === false || !tokenTotal ? undefined : compactTokens(tokenTotal);
114
173
  const liveRunning = listLiveAgents().filter((a) => a.status === "running").length;
115
174
  // Always show consistent status: running count + queued count from live tasks only
116
175
  // Avoid snapshot cache for counts to prevent UI jumping
117
176
  const runningCount = agents.filter((a) => a.status === "running").length;
118
177
  // Count queued/waiting tasks directly from tasks array (not snapshot) for consistency
119
- const queuedCount = active.reduce((sum, item) => sum + item.tasks.reduce((s, t) => s + (t.status === "queued" || t.status === "waiting" ? 1 : 0), 0), 0);
178
+ const queuedCount = active.reduce(
179
+ (sum, item) => sum + item.tasks.reduce((s, t) => s + (t.status === "queued" || t.status === "waiting" ? 1 : 0), 0),
180
+ 0,
181
+ );
120
182
  // Format: "1 running", "2 running · 1 queued", "3 queued", "idle"
121
183
  const runningLabel = runningCount === 1 ? "1 running" : `${runningCount} running`;
122
184
  const queuedLabel = queuedCount === 1 ? "1 queued" : `${queuedCount} queued`;
123
- const crewStatus = runningCount > 0 && queuedCount > 0 ? `${runningLabel} · ${queuedLabel}` : runningCount > 0 ? runningLabel : queuedCount > 0 ? queuedLabel : "idle";
185
+ const crewStatus =
186
+ runningCount > 0 && queuedCount > 0
187
+ ? `${runningLabel} · ${queuedLabel}`
188
+ : runningCount > 0
189
+ ? runningLabel
190
+ : queuedCount > 0
191
+ ? queuedLabel
192
+ : "idle";
124
193
  const liveSuffix = liveRunning > 0 ? ` (${liveRunning} live)` : "";
125
194
  const notificationText = notificationBadge(notificationCount);
126
195
  // Always show model + tokens as suffix when available (for activePayload consistency)
@@ -288,7 +357,16 @@ export function requestPowerbarUpdate(
288
357
  preloadedManifests?: TeamRunManifest[],
289
358
  ): void {
290
359
  if (config?.powerbar === false) return;
291
- latestArgs = { events, cwd, config, manifestCache, snapshotCache, ctx, notificationCount, preloadedManifests };
360
+ latestArgs = {
361
+ events,
362
+ cwd,
363
+ config,
364
+ manifestCache,
365
+ snapshotCache,
366
+ ctx,
367
+ notificationCount,
368
+ preloadedManifests,
369
+ };
292
370
  powerbarCoalescer.request();
293
371
  }
294
372
 
@@ -4,7 +4,8 @@ import { asCrewTheme } from "./theme-adapter.ts";
4
4
 
5
5
  interface ParsedDiffLine {
6
6
  prefix: string;
7
- lineNum: string; content: string;
7
+ lineNum: string;
8
+ content: string;
8
9
  }
9
10
 
10
11
  interface DiffLineContent {
@@ -108,7 +109,10 @@ export function renderDiff(diffText: string, options: RenderDiffOptions = {}): s
108
109
  while (i < lines.length) {
109
110
  const nextParsed = parseDiffLine(lines[i] ?? "");
110
111
  if (!nextParsed || nextParsed.prefix !== "-") break;
111
- removedLines.push({ lineNum: nextParsed.lineNum, content: nextParsed.content });
112
+ removedLines.push({
113
+ lineNum: nextParsed.lineNum,
114
+ content: nextParsed.content,
115
+ });
112
116
  i++;
113
117
  }
114
118
 
@@ -116,7 +120,10 @@ export function renderDiff(diffText: string, options: RenderDiffOptions = {}): s
116
120
  while (i < lines.length) {
117
121
  const nextParsed = parseDiffLine(lines[i] ?? "");
118
122
  if (!nextParsed || nextParsed.prefix !== "+") break;
119
- addedLines.push({ lineNum: nextParsed.lineNum, content: nextParsed.content });
123
+ addedLines.push({
124
+ lineNum: nextParsed.lineNum,
125
+ content: nextParsed.content,
126
+ });
120
127
  i++;
121
128
  }
122
129
 
@@ -132,9 +132,13 @@ export class RenderScheduler {
132
132
  */
133
133
  private invalidate(payload: unknown): void {
134
134
  try {
135
- const runId = typeof payload === "object" && payload !== null && "runId" in payload && typeof (payload as { runId: unknown }).runId === "string"
136
- ? (payload as { runId: string }).runId
137
- : undefined;
135
+ const runId =
136
+ typeof payload === "object" &&
137
+ payload !== null &&
138
+ "runId" in payload &&
139
+ typeof (payload as { runId: unknown }).runId === "string"
140
+ ? (payload as { runId: string }).runId
141
+ : undefined;
138
142
  if (runId === undefined || this.invalidateCoalesceMs <= 0) {
139
143
  this.onInvalidate?.(payload);
140
144
  return;
@@ -210,7 +214,11 @@ export class RenderScheduler {
210
214
  this.invalidateTimer = undefined;
211
215
  this.invalidateBuffer.clear();
212
216
  for (const unsub of this.unsubs.splice(0)) {
213
- try { unsub(); } catch (error) { logInternalError("render-scheduler.unsubscribe", error); }
217
+ try {
218
+ unsub();
219
+ } catch (error) {
220
+ logInternalError("render-scheduler.unsubscribe", error);
221
+ }
214
222
  }
215
223
  }
216
224
  }
@@ -1,9 +1,13 @@
1
1
  import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
2
- import type { MetricRegistry } from "../observability/metric-registry.ts";
3
2
  // Lazy-loaded: team-tool.ts pulls in entire runtime chain.
4
3
  import type { handleTeamTool as HandleTeamToolFn } from "../extension/team-tool.ts";
4
+ import type { MetricRegistry } from "../observability/metric-registry.ts";
5
+
5
6
  let _cachedHandleTeamTool: typeof HandleTeamToolFn | undefined;
6
- async function handleTeamTool(params: Parameters<typeof HandleTeamToolFn>[0], ctx: Parameters<typeof HandleTeamToolFn>[1]): Promise<Awaited<ReturnType<typeof HandleTeamToolFn>>> {
7
+ async function handleTeamTool(
8
+ params: Parameters<typeof HandleTeamToolFn>[0],
9
+ ctx: Parameters<typeof HandleTeamToolFn>[1],
10
+ ): Promise<Awaited<ReturnType<typeof HandleTeamToolFn>>> {
7
11
  if (!_cachedHandleTeamTool) {
8
12
  // LAZY: avoid pulling team-tool.ts (and its entire runtime chain) into module load.
9
13
  const mod = await import("../extension/team-tool.ts");
@@ -11,12 +15,13 @@ async function handleTeamTool(params: Parameters<typeof HandleTeamToolFn>[0], ct
11
15
  }
12
16
  return _cachedHandleTeamTool(params, ctx);
13
17
  }
18
+
14
19
  import { isToolError, textFromToolResult } from "../extension/tool-result.ts";
15
- import { loadRunManifestById, saveRunTasks } from "../state/state-store.ts";
16
- import { appendEvent } from "../state/event-log.ts";
17
20
  import { readCrewAgents } from "../runtime/crew-agent-records.ts";
18
21
  import { exportDiagnostic } from "../runtime/diagnostic-export.ts";
22
+ import { appendEvent } from "../state/event-log.ts";
19
23
  import type { MailboxDirection, MailboxMessage } from "../state/mailbox.ts";
24
+ import { loadRunManifestById, saveRunTasks } from "../state/state-store.ts";
20
25
 
21
26
  export interface RunActionResult {
22
27
  ok: boolean;
@@ -25,11 +30,18 @@ export interface RunActionResult {
25
30
  }
26
31
 
27
32
  function okFromTool(result: Awaited<ReturnType<typeof handleTeamTool>>): RunActionResult {
28
- return { ok: !isToolError(result), message: textFromToolResult(result), data: result };
33
+ return {
34
+ ok: !isToolError(result),
35
+ message: textFromToolResult(result),
36
+ data: result,
37
+ };
29
38
  }
30
39
 
31
40
  function err(error: unknown): RunActionResult {
32
- return { ok: false, message: error instanceof Error ? error.message : String(error) };
41
+ return {
42
+ ok: false,
43
+ message: error instanceof Error ? error.message : String(error),
44
+ };
33
45
  }
34
46
 
35
47
  async function dispatchApi(ctx: ExtensionContext, runId: string, config: Record<string, unknown>): Promise<RunActionResult> {
@@ -44,7 +56,10 @@ function parseMailboxMessages(text: string): MailboxMessage[] {
44
56
  try {
45
57
  const parsed = JSON.parse(text) as unknown;
46
58
  if (!Array.isArray(parsed)) return [];
47
- return parsed.filter((item): item is MailboxMessage => Boolean(item) && typeof item === "object" && !Array.isArray(item) && typeof (item as { id?: unknown }).id === "string");
59
+ return parsed.filter(
60
+ (item): item is MailboxMessage =>
61
+ Boolean(item) && typeof item === "object" && !Array.isArray(item) && typeof (item as { id?: unknown }).id === "string",
62
+ );
48
63
  } catch {
49
64
  return [];
50
65
  }
@@ -55,28 +70,56 @@ export function dispatchMailboxAck(ctx: ExtensionContext, runId: string, message
55
70
  }
56
71
 
57
72
  export function dispatchMailboxNudge(ctx: ExtensionContext, runId: string, agentId: string, message: string): Promise<RunActionResult> {
58
- return dispatchApi(ctx, runId, { operation: "nudge-agent", agentId, message });
73
+ return dispatchApi(ctx, runId, {
74
+ operation: "nudge-agent",
75
+ agentId,
76
+ message,
77
+ });
59
78
  }
60
79
 
61
- export function dispatchMailboxCompose(ctx: ExtensionContext, runId: string, payload: { from: string; to: string; body: string; taskId?: string; direction: MailboxDirection }): Promise<RunActionResult> {
80
+ export function dispatchMailboxCompose(
81
+ ctx: ExtensionContext,
82
+ runId: string,
83
+ payload: {
84
+ from: string;
85
+ to: string;
86
+ body: string;
87
+ taskId?: string;
88
+ direction: MailboxDirection;
89
+ },
90
+ ): Promise<RunActionResult> {
62
91
  return dispatchApi(ctx, runId, { operation: "send-message", ...payload });
63
92
  }
64
93
 
65
94
  export async function dispatchMailboxAckAll(ctx: ExtensionContext, runId: string): Promise<RunActionResult> {
66
- const listed = await dispatchApi(ctx, runId, { operation: "read-mailbox", direction: "inbox" });
95
+ const listed = await dispatchApi(ctx, runId, {
96
+ operation: "read-mailbox",
97
+ direction: "inbox",
98
+ });
67
99
  if (!listed.ok) return listed;
68
100
  const messages = parseMailboxMessages(listed.message).filter((message) => message.status !== "acknowledged");
69
101
  let count = 0;
70
102
  for (const message of messages) {
71
103
  const acked = await dispatchMailboxAck(ctx, runId, message.id);
72
- if (!acked.ok) return { ok: false, message: `Acknowledged ${count}/${messages.length}; failed ${message.id}: ${acked.message}` };
104
+ if (!acked.ok)
105
+ return {
106
+ ok: false,
107
+ message: `Acknowledged ${count}/${messages.length}; failed ${message.id}: ${acked.message}`,
108
+ };
73
109
  count += 1;
74
110
  }
75
- return { ok: true, message: `Acknowledged ${count} messages.`, data: { count } };
111
+ return {
112
+ ok: true,
113
+ message: `Acknowledged ${count} messages.`,
114
+ data: { count },
115
+ };
76
116
  }
77
117
 
78
118
  export function dispatchHealthRecovery(ctx: ExtensionContext, runId: string): Promise<RunActionResult> {
79
- return dispatchApi(ctx, runId, { operation: "foreground-interrupt", reason: "operator health recovery" });
119
+ return dispatchApi(ctx, runId, {
120
+ operation: "foreground-interrupt",
121
+ reason: "operator health recovery",
122
+ });
80
123
  }
81
124
 
82
125
  export async function dispatchKillStaleWorkers(ctx: ExtensionContext, runId: string): Promise<RunActionResult> {
@@ -92,20 +135,40 @@ export async function dispatchKillStaleWorkers(ctx: ExtensionContext, runId: str
92
135
  const lastSeenMs = Date.parse(task.heartbeat.lastSeenAt);
93
136
  if (!Number.isFinite(lastSeenMs) || currentMs - lastSeenMs <= staleMs) return task;
94
137
  count += 1;
95
- return { ...task, heartbeat: { ...task.heartbeat, alive: false, lastSeenAt: now } };
138
+ return {
139
+ ...task,
140
+ heartbeat: { ...task.heartbeat, alive: false, lastSeenAt: now },
141
+ };
96
142
  });
97
143
  saveRunTasks(loaded.manifest, tasks);
98
- appendEvent(loaded.manifest.eventsPath, { type: "worker.kill_stale", runId, message: `Marked ${count} stale worker heartbeat(s) dead.`, data: { count } });
99
- return { ok: true, message: `Marked ${count} stale worker heartbeat(s) dead.`, data: { count } };
144
+ appendEvent(loaded.manifest.eventsPath, {
145
+ type: "worker.kill_stale",
146
+ runId,
147
+ message: `Marked ${count} stale worker heartbeat(s) dead.`,
148
+ data: { count },
149
+ });
150
+ return {
151
+ ok: true,
152
+ message: `Marked ${count} stale worker heartbeat(s) dead.`,
153
+ data: { count },
154
+ };
100
155
  } catch (error) {
101
156
  return err(error);
102
157
  }
103
158
  }
104
159
 
105
- export async function dispatchDiagnosticExport(ctx: ExtensionContext, runId: string, options: { registry?: MetricRegistry } = {}): Promise<RunActionResult> {
160
+ export async function dispatchDiagnosticExport(
161
+ ctx: ExtensionContext,
162
+ runId: string,
163
+ options: { registry?: MetricRegistry } = {},
164
+ ): Promise<RunActionResult> {
106
165
  try {
107
166
  const exported = await exportDiagnostic(ctx, runId, options);
108
- return { ok: true, message: `Diagnostic exported to ${exported.path}`, data: exported.path };
167
+ return {
168
+ ok: true,
169
+ message: `Diagnostic exported to ${exported.path}`,
170
+ data: exported.path,
171
+ };
109
172
  } catch (error) {
110
173
  return err(error);
111
174
  }