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
@@ -3,14 +3,10 @@
3
3
  * Provides on/off/status commands for auto-summarization.
4
4
  */
5
5
 
6
+ import { AutoSummarizeService, createAutoSummarizeService, DEFAULT_AUTO_SUMMARIZE_CONFIG } from "../../runtime/auto-summarize.ts";
6
7
  import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
7
8
  import type { PiTeamsToolResult } from "../tool-result.ts";
8
9
  import { result, type TeamContext } from "./context.ts";
9
- import {
10
- AutoSummarizeService,
11
- createAutoSummarizeService,
12
- DEFAULT_AUTO_SUMMARIZE_CONFIG,
13
- } from "../../runtime/auto-summarize.ts";
14
10
 
15
11
  // Global auto-summarize service instance for CLI usage
16
12
  let globalAutoSummarize: AutoSummarizeService | null = null;
@@ -22,10 +18,7 @@ function getAutoSummarize(): AutoSummarizeService {
22
18
  return globalAutoSummarize;
23
19
  }
24
20
 
25
- export function handleAutoSummarizeOn(
26
- params: TeamToolParamsValue,
27
- ctx: TeamContext,
28
- ): PiTeamsToolResult {
21
+ export function handleAutoSummarizeOn(params: TeamToolParamsValue, ctx: TeamContext): PiTeamsToolResult {
29
22
  const service = getAutoSummarize();
30
23
  const cfg = params.config ?? {};
31
24
 
@@ -61,24 +54,18 @@ export function handleAutoSummarizeOn(
61
54
  );
62
55
  }
63
56
 
64
- export function handleAutoSummarizeOff(
65
- params: TeamToolParamsValue,
66
- ctx: TeamContext,
67
- ): PiTeamsToolResult {
57
+ export function handleAutoSummarizeOff(params: TeamToolParamsValue, ctx: TeamContext): PiTeamsToolResult {
68
58
  const service = getAutoSummarize();
69
59
 
70
60
  service.disable();
71
61
 
72
- return result(
73
- "Auto-summarize disabled.",
74
- { action: "auto-summarize", status: "ok" },
75
- );
62
+ return result("Auto-summarize disabled.", {
63
+ action: "auto-summarize",
64
+ status: "ok",
65
+ });
76
66
  }
77
67
 
78
- export function handleAutoSummarizeStatus(
79
- params: TeamToolParamsValue,
80
- ctx: TeamContext,
81
- ): PiTeamsToolResult {
68
+ export function handleAutoSummarizeStatus(params: TeamToolParamsValue, ctx: TeamContext): PiTeamsToolResult {
82
69
  const service = getAutoSummarize();
83
70
  const config = service.getConfig();
84
71
  const isEnabled = service.isEnabled();
@@ -103,15 +90,16 @@ export function handleAutoSummarizeStatus(
103
90
  );
104
91
  }
105
92
 
106
- export function handleAutoSummarizeConfig(
107
- params: TeamToolParamsValue,
108
- ctx: TeamContext,
109
- ): PiTeamsToolResult {
93
+ export function handleAutoSummarizeConfig(params: TeamToolParamsValue, ctx: TeamContext): PiTeamsToolResult {
110
94
  const service = getAutoSummarize();
111
95
  const cfg = params.config ?? {};
112
96
 
113
97
  // Parse config options
114
- const updates: { threshold?: number; minTools?: number; collapseContext?: boolean } = {};
98
+ const updates: {
99
+ threshold?: number;
100
+ minTools?: number;
101
+ collapseContext?: boolean;
102
+ } = {};
115
103
 
116
104
  if (cfg.threshold !== undefined) {
117
105
  const threshold = typeof cfg.threshold === "number" ? cfg.threshold : parseInt(String(cfg.threshold), 10);
@@ -10,11 +10,7 @@ export interface CacheControlDeps {
10
10
  * a runEventBus event so the render scheduler coalescer fires immediately.
11
11
  * Call this after any state mutation that changes task/agent status.
12
12
  */
13
- export function invalidateSnapshot(
14
- runId: string,
15
- runCwd: string,
16
- deps: CacheControlDeps,
17
- ): void {
13
+ export function invalidateSnapshot(runId: string, runCwd: string, deps: CacheControlDeps): void {
18
14
  // 1. Invalidate snapshot cache entry
19
15
  deps.getRunSnapshotCache(runCwd).invalidate(runId);
20
16
 
@@ -1,20 +1,20 @@
1
- import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
2
- import { withRunLockSync } from "../../state/locks.ts";
3
- import { loadRunManifestById, saveRunTasks, updateRunStatus } from "../../state/state-store.ts";
4
- import { saveCrewAgents, recordFromTask } from "../../runtime/crew-agent-records.ts";
1
+ import { appendHookEvent, executeHook } from "../../hooks/registry.ts";
2
+ import { buildSyntheticTerminalEvidence, type CancellationReason, cancellationReasonFromUnknown } from "../../runtime/cancellation.ts";
3
+ import { killProcessPid } from "../../runtime/child-pi.ts";
4
+ import { recordFromTask, saveCrewAgents } from "../../runtime/crew-agent-records.ts";
5
5
  import { writeForegroundInterruptRequest } from "../../runtime/foreground-control.ts";
6
- import { cancellationReasonFromUnknown, buildSyntheticTerminalEvidence, type CancellationReason } from "../../runtime/cancellation.ts";
7
6
  import { terminateLiveAgentsForRun } from "../../runtime/live-agent-manager.ts";
7
+ import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
8
8
  import { appendEvent } from "../../state/event-log.ts";
9
- import { killProcessPid } from "../../runtime/child-pi.ts";
9
+ import { withRunLockSync } from "../../state/locks.ts";
10
+ import { loadRunManifestById, saveRunTasks, updateRunStatus } from "../../state/state-store.ts";
10
11
  import { logInternalError } from "../../utils/internal-error.ts";
11
- import { executeHook, appendHookEvent } from "../../hooks/registry.ts";
12
- import type { PiTeamsToolResult } from "../tool-result.ts";
13
12
  import { locateRunCwd } from "../team-tool.ts";
13
+ import type { PiTeamsToolResult } from "../tool-result.ts";
14
+ import { type CacheControlDeps, invalidateSnapshot } from "./cache-control.ts";
14
15
  import { result, type TeamContext } from "./context.ts";
15
- import { RUN_NOT_FOUND_HINT } from "./run-not-found.ts";
16
16
  import { enforceDestructiveIntent, intentFromConfig } from "./intent-policy.ts";
17
- import { invalidateSnapshot, type CacheControlDeps } from "./cache-control.ts";
17
+ import { RUN_NOT_FOUND_HINT } from "./run-not-found.ts";
18
18
 
19
19
  export interface AbortOwnedResult {
20
20
  abortedIds: string[];
@@ -34,18 +34,17 @@ export interface AbortOwnedResult {
34
34
  * the ownerSessionId comes from the context. Foreign detection compares
35
35
  * the requesting session against the run's creating session.
36
36
  */
37
- export function abortOwned(
38
- runId: string,
39
- taskIds: string[] | undefined,
40
- ctx: TeamContext,
41
- force?: boolean,
42
- ): AbortOwnedResult {
37
+ export function abortOwned(runId: string, taskIds: string[] | undefined, ctx: TeamContext, force?: boolean): AbortOwnedResult {
43
38
  const runCwd = locateRunCwd(runId, ctx.cwd);
44
39
  if (!runCwd) return { abortedIds: [], missingIds: taskIds ?? [], foreignIds: [] };
45
40
  const loaded = loadRunManifestById(runCwd, runId); // NOTE: no withRunLock - best-effort only; concurrent writes may cause inconsistency
46
41
  if (!loaded) return { abortedIds: [], missingIds: taskIds ?? [], foreignIds: [] };
47
42
 
48
- const result: AbortOwnedResult = { abortedIds: [], missingIds: [], foreignIds: [] };
43
+ const result: AbortOwnedResult = {
44
+ abortedIds: [],
45
+ missingIds: [],
46
+ foreignIds: [],
47
+ };
49
48
  const taskMap = new Map(loaded.tasks.map((t) => [t.id, t] as const));
50
49
  const targetIds = taskIds ?? loaded.tasks.map((t) => t.id);
51
50
  const foreignRun = typeof loaded.manifest.ownerSessionId === "string" && loaded.manifest.ownerSessionId !== ctx.sessionId;
@@ -74,7 +73,13 @@ function configFromParams(params: TeamToolParamsValue): Record<string, unknown>
74
73
  function cancelReasonFromParams(params: TeamToolParamsValue): CancellationReason {
75
74
  const config = configFromParams(params);
76
75
  const rawReason = config?.reason ?? config?.cancelReason;
77
- const reason = rawReason === undefined ? { code: "caller_cancelled" as const, message: "Run cancelled by user request." } : cancellationReasonFromUnknown(rawReason);
76
+ const reason =
77
+ rawReason === undefined
78
+ ? {
79
+ code: "caller_cancelled" as const,
80
+ message: "Run cancelled by user request.",
81
+ }
82
+ : cancellationReasonFromUnknown(rawReason);
78
83
  return { code: reason.code, message: reason.message };
79
84
  }
80
85
 
@@ -88,14 +93,25 @@ export async function handleRetry(params: TeamToolParamsValue, ctx: TeamContext,
88
93
  // Pre-lock ownership check: reject foreign-owned runs unless force is set
89
94
  const foreignRun = typeof loaded.manifest.ownerSessionId === "string" && loaded.manifest.ownerSessionId !== ctx.sessionId;
90
95
  if (foreignRun && !params.force) {
91
- return result(`Run ${loaded.manifest.runId} belongs to another session. Use force: true to override.`, { action: "retry", status: "error", runId: loaded.manifest.runId }, true);
96
+ return result(
97
+ `Run ${loaded.manifest.runId} belongs to another session. Use force: true to override.`,
98
+ { action: "retry", status: "error", runId: loaded.manifest.runId },
99
+ true,
100
+ );
92
101
  }
93
102
 
94
103
  // Execute before_retry hook after ownership confirmed, before mutation lock
95
- const hookReport = await executeHook("before_retry", { runId: loaded.manifest.runId, cwd: ctx.cwd });
104
+ const hookReport = await executeHook("before_retry", {
105
+ runId: loaded.manifest.runId,
106
+ cwd: ctx.cwd,
107
+ });
96
108
  appendHookEvent(loaded.manifest, hookReport);
97
109
  if (hookReport.outcome === "block") {
98
- return result(`Retry blocked by hook: ${hookReport.reason ?? "before_retry hook blocked the operation."}`, { action: "retry", status: "error", runId: loaded.manifest.runId }, true);
110
+ return result(
111
+ `Retry blocked by hook: ${hookReport.reason ?? "before_retry hook blocked the operation."}`,
112
+ { action: "retry", status: "error", runId: loaded.manifest.runId },
113
+ true,
114
+ );
99
115
  }
100
116
 
101
117
  const targetTaskId = typeof params.taskId === "string" ? params.taskId : undefined;
@@ -109,7 +125,15 @@ export async function handleRetry(params: TeamToolParamsValue, ctx: TeamContext,
109
125
  });
110
126
 
111
127
  if (matchingTasks.length === 0) {
112
- return result(targetTaskId ? `Task '${targetTaskId}' is not failed/cancelled; nothing to retry.` : "No failed/cancelled tasks to retry.", { action: "retry", status: "error", runId: loaded.manifest.runId }, true);
128
+ return result(
129
+ targetTaskId ? `Task '${targetTaskId}' is not failed/cancelled; nothing to retry.` : "No failed/cancelled tasks to retry.",
130
+ {
131
+ action: "retry",
132
+ status: "error",
133
+ runId: loaded.manifest.runId,
134
+ },
135
+ true,
136
+ );
113
137
  }
114
138
 
115
139
  const retriedIds = new Set(matchingTasks.map((t) => t.id));
@@ -120,14 +144,22 @@ export async function handleRetry(params: TeamToolParamsValue, ctx: TeamContext,
120
144
  });
121
145
  saveRunTasks(loaded.manifest, tasks);
122
146
  try {
123
- saveCrewAgents(loaded.manifest, tasks.map((task) => recordFromTask(loaded.manifest, task, "child-process")));
147
+ saveCrewAgents(
148
+ loaded.manifest,
149
+ tasks.map((task) => recordFromTask(loaded.manifest, task, "child-process")),
150
+ );
124
151
  } catch (error) {
125
152
  logInternalError("team-tool.handleRetry.crewAgents", error, `runId=${loaded.manifest.runId}`);
126
153
  }
127
154
 
128
155
  const retriedTaskIds = [...retriedIds];
129
156
  for (const taskId of retriedTaskIds) {
130
- appendEvent(loaded.manifest.eventsPath, { type: "task.retried", runId: loaded.manifest.runId, taskId, message: `Task ${taskId} queued for retry.` });
157
+ appendEvent(loaded.manifest.eventsPath, {
158
+ type: "task.retried",
159
+ runId: loaded.manifest.runId,
160
+ taskId,
161
+ message: `Task ${taskId} queued for retry.`,
162
+ });
131
163
  }
132
164
 
133
165
  if (deps) invalidateSnapshot(loaded.manifest.runId, runCwd, deps);
@@ -153,14 +185,30 @@ export async function handleCancel(params: TeamToolParamsValue, ctx: TeamContext
153
185
  // Pre-lock ownership check: reject foreign-owned runs unless force is set
154
186
  const preCheck = abortOwned(loaded.manifest.runId, undefined, ctx, params.force);
155
187
  if (preCheck.abortedIds.length === 0 && preCheck.foreignIds.length > 0 && !params.force) {
156
- return result(`Run ${loaded.manifest.runId} belongs to another session. Use force: true to override.`, { action: "cancel", status: "error", runId: loaded.manifest.runId, foreignIds: preCheck.foreignIds }, true);
188
+ return result(
189
+ `Run ${loaded.manifest.runId} belongs to another session. Use force: true to override.`,
190
+ {
191
+ action: "cancel",
192
+ status: "error",
193
+ runId: loaded.manifest.runId,
194
+ foreignIds: preCheck.foreignIds,
195
+ },
196
+ true,
197
+ );
157
198
  }
158
199
 
159
200
  // Execute before_cancel hook after ownership confirmed, before mutation lock
160
- const hookReport = await executeHook("before_cancel", { runId: loaded.manifest.runId, cwd: ctx.cwd });
201
+ const hookReport = await executeHook("before_cancel", {
202
+ runId: loaded.manifest.runId,
203
+ cwd: ctx.cwd,
204
+ });
161
205
  appendHookEvent(loaded.manifest, hookReport);
162
206
  if (hookReport.outcome === "block") {
163
- return result(`Cancel blocked by hook: ${hookReport.reason ?? "before_cancel hook blocked the operation."}`, { action: "cancel", status: "error", runId: loaded.manifest.runId }, true);
207
+ return result(
208
+ `Cancel blocked by hook: ${hookReport.reason ?? "before_cancel hook blocked the operation."}`,
209
+ { action: "cancel", status: "error", runId: loaded.manifest.runId },
210
+ true,
211
+ );
164
212
  }
165
213
  await terminateLiveAgentsForRun(loaded.manifest.runId, "cancelled", appendEvent, loaded.manifest.eventsPath);
166
214
 
@@ -170,19 +218,42 @@ export async function handleCancel(params: TeamToolParamsValue, ctx: TeamContext
170
218
  if (asyncPid !== undefined && asyncPid > 0) {
171
219
  try {
172
220
  killProcessPid(asyncPid);
173
- appendEvent(loaded.manifest.eventsPath, { type: "async.kill_requested", runId: loaded.manifest.runId, message: "Sent SIGTERM to background runner process.", data: { pid: asyncPid } });
221
+ appendEvent(loaded.manifest.eventsPath, {
222
+ type: "async.kill_requested",
223
+ runId: loaded.manifest.runId,
224
+ message: "Sent SIGTERM to background runner process.",
225
+ data: { pid: asyncPid },
226
+ });
174
227
  } catch (error) {
175
228
  logInternalError("team-tool.handleCancel.killAsync", error, `runId=${loaded.manifest.runId},pid=${asyncPid}`);
176
229
  }
177
230
  }
178
231
 
179
232
  return withRunLockSync(loaded.manifest, () => {
180
- if ((loaded.manifest.status === "completed" || loaded.manifest.status === "cancelled") && !params.force) return result(`Run ${loaded.manifest.runId} is already ${loaded.manifest.status}; nothing to cancel. Use force: true to mark it cancelled anyway.`, { action: "cancel", status: "ok", runId: loaded.manifest.runId, artifactsRoot: loaded.manifest.artifactsRoot });
233
+ if ((loaded.manifest.status === "completed" || loaded.manifest.status === "cancelled") && !params.force)
234
+ return result(
235
+ `Run ${loaded.manifest.runId} is already ${loaded.manifest.status}; nothing to cancel. Use force: true to mark it cancelled anyway.`,
236
+ {
237
+ action: "cancel",
238
+ status: "ok",
239
+ runId: loaded.manifest.runId,
240
+ artifactsRoot: loaded.manifest.artifactsRoot,
241
+ },
242
+ );
181
243
 
182
244
  // Classify tasks for foreign-aware cancellation
183
245
  const abortResult = abortOwned(loaded.manifest.runId, undefined, ctx, params.force);
184
246
  if (abortResult.abortedIds.length === 0 && abortResult.foreignIds.length > 0 && !params.force) {
185
- return result(`Run ${loaded.manifest.runId} belongs to another session. Use force: true to override.`, { action: "cancel", status: "error", runId: loaded.manifest.runId, foreignIds: abortResult.foreignIds }, true);
247
+ return result(
248
+ `Run ${loaded.manifest.runId} belongs to another session. Use force: true to override.`,
249
+ {
250
+ action: "cancel",
251
+ status: "error",
252
+ runId: loaded.manifest.runId,
253
+ foreignIds: abortResult.foreignIds,
254
+ },
255
+ true,
256
+ );
186
257
  }
187
258
  const cancellableIds = new Set(abortResult.abortedIds);
188
259
  const cancelReason = cancelReasonFromParams(params);
@@ -192,9 +263,20 @@ export async function handleCancel(params: TeamToolParamsValue, ctx: TeamContext
192
263
 
193
264
  const tasks = loaded.tasks.map((task) => {
194
265
  if (cancellableIds.has(task.id) && (task.status === "queued" || task.status === "running" || task.status === "waiting")) {
195
- const base = { ...task, status: "cancelled" as const, finishedAt: new Date().toISOString(), error: cancelMessage };
266
+ const base = {
267
+ ...task,
268
+ status: "cancelled" as const,
269
+ finishedAt: new Date().toISOString(),
270
+ error: cancelMessage,
271
+ };
196
272
  if (task.status === "running") {
197
- return { ...base, terminalEvidence: [...(task.terminalEvidence ?? []), buildSyntheticTerminalEvidence("worker", cancelReason, task.startedAt)] };
273
+ return {
274
+ ...base,
275
+ terminalEvidence: [
276
+ ...(task.terminalEvidence ?? []),
277
+ buildSyntheticTerminalEvidence("worker", cancelReason, task.startedAt),
278
+ ],
279
+ };
198
280
  }
199
281
  return base;
200
282
  }
@@ -202,7 +284,10 @@ export async function handleCancel(params: TeamToolParamsValue, ctx: TeamContext
202
284
  });
203
285
  saveRunTasks(loaded.manifest, tasks);
204
286
  try {
205
- saveCrewAgents(loaded.manifest, tasks.map((task) => recordFromTask(loaded.manifest, task, loaded.manifest.runtimeResolution?.kind ?? "child-process")));
287
+ saveCrewAgents(
288
+ loaded.manifest,
289
+ tasks.map((task) => recordFromTask(loaded.manifest, task, loaded.manifest.runtimeResolution?.kind ?? "child-process")),
290
+ );
206
291
  } catch (error) {
207
292
  logInternalError("team-tool.handleCancel.crewAgents", error, `runId=${loaded.manifest.runId}`);
208
293
  }
@@ -213,14 +298,29 @@ export async function handleCancel(params: TeamToolParamsValue, ctx: TeamContext
213
298
  }
214
299
  ctx.abortForegroundRun?.(loaded.manifest.runId);
215
300
  for (const taskId of abortResult.abortedIds) {
216
- appendEvent(loaded.manifest.eventsPath, { type: "task.cancelled", runId: loaded.manifest.runId, taskId, message: cancelMessage, data: cancelData });
301
+ appendEvent(loaded.manifest.eventsPath, {
302
+ type: "task.cancelled",
303
+ runId: loaded.manifest.runId,
304
+ taskId,
305
+ message: cancelMessage,
306
+ data: cancelData,
307
+ });
217
308
  }
218
- const updated = updateRunStatus(loaded.manifest, "cancelled", `${cancelMessage} Already-finished worker processes are not retroactively changed.`, { data: cancelData });
309
+ const updated = updateRunStatus(
310
+ loaded.manifest,
311
+ "cancelled",
312
+ `${cancelMessage} Already-finished worker processes are not retroactively changed.`,
313
+ { data: cancelData },
314
+ );
219
315
 
220
316
  // Build descriptive message including foreign/missing info
221
317
  const parts = [`Cancelled run ${updated.runId}.`];
222
- if (abortResult.foreignIds.length > 0) parts.push(` ${abortResult.foreignIds.length} task(s) belong to another session and were not cancelled: ${abortResult.foreignIds.join(", ")}.`);
223
- if (abortResult.missingIds.length > 0) parts.push(` ${abortResult.missingIds.length} task ID(s) not found: ${abortResult.missingIds.join(", ")}.`);
318
+ if (abortResult.foreignIds.length > 0)
319
+ parts.push(
320
+ ` ${abortResult.foreignIds.length} task(s) belong to another session and were not cancelled: ${abortResult.foreignIds.join(", ")}.`,
321
+ );
322
+ if (abortResult.missingIds.length > 0)
323
+ parts.push(` ${abortResult.missingIds.length} task ID(s) not found: ${abortResult.missingIds.join(", ")}.`);
224
324
 
225
325
  if (deps) invalidateSnapshot(updated.runId, runCwd, deps);
226
326
  return result(parts.join(""), {
@@ -234,4 +334,4 @@ export async function handleCancel(params: TeamToolParamsValue, ctx: TeamContext
234
334
  intent: cancelIntent,
235
335
  });
236
336
  });
237
- }
337
+ }
@@ -15,10 +15,10 @@
15
15
 
16
16
  import { ChainRunner, parseChainString } from "../../runtime/chain-runner.ts";
17
17
  import { HandoffManager } from "../../runtime/handoff-manager.ts";
18
- import { ChainTeamRunExecutor, type HandleRunFn } from "./chain-executor.ts";
19
- import { result, type TeamContext } from "./context.ts";
20
18
  import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
21
19
  import type { PiTeamsToolResult } from "../tool-result.ts";
20
+ import { ChainTeamRunExecutor, type HandleRunFn } from "./chain-executor.ts";
21
+ import { result, type TeamContext } from "./context.ts";
22
22
 
23
23
  /**
24
24
  * Execute a chain expression (`"a -> b -> c"`). Each step runs a real team run
@@ -30,11 +30,7 @@ import type { PiTeamsToolResult } from "../tool-result.ts";
30
30
  * @param ctx - The team tool context (cwd is used to load run manifests).
31
31
  * @param handleRun - The run.ts `handleRun` function reference (injected).
32
32
  */
33
- export async function handleChainRun(
34
- params: TeamToolParamsValue,
35
- ctx: TeamContext,
36
- handleRun: HandleRunFn,
37
- ): Promise<PiTeamsToolResult> {
33
+ export async function handleChainRun(params: TeamToolParamsValue, ctx: TeamContext, handleRun: HandleRunFn): Promise<PiTeamsToolResult> {
38
34
  const chainString = params.chain;
39
35
  if (!chainString || chainString.trim().length === 0) {
40
36
  return result("Chain expression is empty.", { action: "run", status: "error" }, true);
@@ -43,7 +39,7 @@ export async function handleChainRun(
43
39
  const spec = parseChainString(chainString);
44
40
  if (spec.steps.length === 0) {
45
41
  return result(
46
- "Chain must contain at least one step. Use the form: \"step1 -> step2 -> step3\".",
42
+ 'Chain must contain at least one step. Use the form: "step1 -> step2 -> step3".',
47
43
  { action: "run", status: "error" },
48
44
  true,
49
45
  );
@@ -72,11 +68,7 @@ export async function handleChainRun(
72
68
  ];
73
69
  for (const s of chainResult.steps) {
74
70
  const runId = executor.stepRunIds[s.step - 1];
75
- const tag =
76
- s.outcome === "success" ? "✓"
77
- : s.outcome === "failure" ? "✗"
78
- : s.outcome === "partial" ? "≈"
79
- : "⊘";
71
+ const tag = s.outcome === "success" ? "✓" : s.outcome === "failure" ? "✗" : s.outcome === "partial" ? "≈" : "⊘";
80
72
  lines.push(
81
73
  `${tag} Step ${s.step} [${s.name}]: ${s.outcome} (${s.duration}ms)${runId ? ` runId=${runId}` : ""}${s.error ? ` | ${s.error}` : ""}`,
82
74
  );
@@ -24,27 +24,24 @@
24
24
  * @see src/extension/team-tool/run.ts (handleRun — the reused machinery)
25
25
  */
26
26
 
27
+ import * as fs from "node:fs";
28
+ import * as path from "node:path";
27
29
  import type { ChainTaskRunner } from "../../runtime/chain-runner.ts";
28
- import type { TaskPacket, TaskResult, Decision } from "../../runtime/handoff-manager.ts";
29
- import { loadRunManifestById, createRunPaths } from "../../state/state-store.ts";
30
+ import type { Decision, TaskPacket, TaskResult } from "../../runtime/handoff-manager.ts";
30
31
  import { readIfSmallWithTee } from "../../runtime/task-output-context.ts";
32
+ import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
33
+ import { createRunPaths, loadRunManifestById } from "../../state/state-store.ts";
31
34
  import type { TeamRunManifest, TeamTaskState } from "../../state/types.ts";
32
35
  import type { PiTeamsToolResult } from "../tool-result.ts";
33
36
  import { textFromToolResult } from "../tool-result.ts";
34
- import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
35
37
  import type { TeamContext } from "./context.ts";
36
- import * as fs from "node:fs";
37
- import * as path from "node:path";
38
38
 
39
39
  /**
40
40
  * Signature of `handleRun`, declared locally (type-only) to break the
41
41
  * import cycle with run.ts. Structurally identical to
42
42
  * `(params, ctx) => Promise<PiTeamsToolResult>`.
43
43
  */
44
- export type HandleRunFn = (
45
- params: TeamToolParamsValue,
46
- ctx: TeamContext,
47
- ) => Promise<PiTeamsToolResult>;
44
+ export type HandleRunFn = (params: TeamToolParamsValue, ctx: TeamContext) => Promise<PiTeamsToolResult>;
48
45
 
49
46
  /** Per-step team/workflow/model overrides forwarded from the chain invocation. */
50
47
  export interface ChainExecutorOverrides {
@@ -94,8 +91,8 @@ export function formatChainHistory(context: Record<string, unknown>): string {
94
91
  if (entry.decisions?.length) {
95
92
  lines.push("Decisions:");
96
93
  for (const d of entry.decisions) {
97
- const rationale = (d && typeof d === "object" && "rationale" in d) ? String(d.rationale) : "(undocumented)";
98
- const decisionOutcome = (d && typeof d === "object" && "outcome" in d) ? String(d.outcome) : "";
94
+ const rationale = d && typeof d === "object" && "rationale" in d ? String(d.rationale) : "(undocumented)";
95
+ const decisionOutcome = d && typeof d === "object" && "outcome" in d ? String(d.outcome) : "";
99
96
  lines.push(`- ${rationale}${decisionOutcome ? ` → ${decisionOutcome}` : ""}`);
100
97
  }
101
98
  }
@@ -133,19 +130,12 @@ export function formatChainHistory(context: Record<string, unknown>): string {
133
130
  *
134
131
  * Extracted as a pure function for unit testability (acceptance criterion 6b).
135
132
  */
136
- export function mapRunToTaskResult(
137
- manifest: TeamRunManifest,
138
- tasks: TeamTaskState[],
139
- ): TaskResult {
133
+ export function mapRunToTaskResult(manifest: TeamRunManifest, tasks: TeamTaskState[]): TaskResult {
140
134
  // Determine outcome from manifest status.
141
135
  let outcome: TaskResult["outcome"];
142
136
  if (manifest.status === "completed") {
143
137
  outcome = "success";
144
- } else if (
145
- manifest.status === "failed" ||
146
- manifest.status === "blocked" ||
147
- manifest.status === "cancelled"
148
- ) {
138
+ } else if (manifest.status === "failed" || manifest.status === "blocked" || manifest.status === "cancelled") {
149
139
  outcome = "failure";
150
140
  } else {
151
141
  // queued / planning / running → not terminal yet
@@ -196,10 +186,7 @@ export function mapRunToTaskResult(
196
186
  *
197
187
  * Returns the concatenated output text, or undefined if no artifacts were readable.
198
188
  */
199
- export function readChainStepOutput(
200
- manifest: TeamRunManifest,
201
- tasks: TeamTaskState[],
202
- ): string | undefined {
189
+ export function readChainStepOutput(manifest: TeamRunManifest, tasks: TeamTaskState[]): string | undefined {
203
190
  const parts: string[] = [];
204
191
  for (const t of tasks) {
205
192
  if (t.status !== "completed" || !t.resultArtifact?.path) continue;
@@ -247,21 +234,12 @@ export class ChainTeamRunExecutor implements ChainTaskRunner {
247
234
  // 1. Format chain history into the goal — this is how context reaches the worker.
248
235
  // Mirrors the parentContext pattern in child-pi.ts (parent context + task delimiter).
249
236
  const historyPrefix = formatChainHistory(context);
250
- const enrichedGoal = historyPrefix
251
- ? `${historyPrefix}\n\n---\n# Current Chain Step\n${packet.goal}`
252
- : packet.goal;
237
+ const enrichedGoal = historyPrefix ? `${historyPrefix}\n\n---\n# Current Chain Step\n${packet.goal}` : packet.goal;
253
238
 
254
239
  // 2. Resolve team/workflow/model: step config (set by executeStep) → overrides → default.
255
- const stepTeam =
256
- (context.__chainStepTeam as string | undefined) ??
257
- this.overrides.team ??
258
- "default";
259
- const stepWorkflow =
260
- (context.__chainStepWorkflow as string | undefined) ??
261
- this.overrides.workflow;
262
- const stepModel =
263
- (context.__chainStepModel as string | undefined) ??
264
- this.overrides.model;
240
+ const stepTeam = (context.__chainStepTeam as string | undefined) ?? this.overrides.team ?? "default";
241
+ const stepWorkflow = (context.__chainStepWorkflow as string | undefined) ?? this.overrides.workflow;
242
+ const stepModel = (context.__chainStepModel as string | undefined) ?? this.overrides.model;
265
243
 
266
244
  // 3. Call handleRun for the heavy lifting. async:false forces each step to
267
245
  // complete synchronously (overrides asyncByDefault) so the chain is sequential.
@@ -341,22 +319,22 @@ export function writeRunFixture(
341
319
  retention: "run" as const,
342
320
  };
343
321
  if (!tasks || tasks.length === 0) {
344
- tasks = [{
345
- id: taskId,
346
- runId,
347
- role: "executor",
348
- agent: "executor",
349
- title: "(chain step fixture)",
350
- status: "completed",
351
- dependsOn: [],
352
- cwd,
353
- resultArtifact,
354
- }];
322
+ tasks = [
323
+ {
324
+ id: taskId,
325
+ runId,
326
+ role: "executor",
327
+ agent: "executor",
328
+ title: "(chain step fixture)",
329
+ status: "completed",
330
+ dependsOn: [],
331
+ cwd,
332
+ resultArtifact,
333
+ },
334
+ ];
355
335
  } else {
356
336
  // Attach resultArtifact to the first task if it doesn't have one.
357
- tasks = tasks.map((t, i) => i === 0 && !t.resultArtifact
358
- ? { ...t, resultArtifact }
359
- : t);
337
+ tasks = tasks.map((t, i) => (i === 0 && !t.resultArtifact ? { ...t, resultArtifact } : t));
360
338
  }
361
339
  }
362
340
 
@@ -1,4 +1,4 @@
1
- import { effectiveAutonomousConfig, parseConfig, type PiTeamsAutonomousConfig, type PiTeamsConfig } from "../../config/config.ts";
1
+ import { effectiveAutonomousConfig, type PiTeamsAutonomousConfig, type PiTeamsConfig, parseConfig } from "../../config/config.ts";
2
2
 
3
3
  const DANGEROUS_KEYS = new Set(["__proto__", "constructor", "prototype"]);
4
4