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
@@ -31,22 +31,38 @@ export function runtimeResolutionState(runtime: CrewRuntimeCapabilities, resolve
31
31
  };
32
32
  }
33
33
 
34
- export async function isLiveSessionRuntimeAvailable(timeoutMs = 1500, env: NodeJS.ProcessEnv = process.env): Promise<{ available: boolean; reason?: string }> {
34
+ export async function isLiveSessionRuntimeAvailable(
35
+ timeoutMs = 1500,
36
+ env: NodeJS.ProcessEnv = process.env,
37
+ ): Promise<{ available: boolean; reason?: string }> {
35
38
  if (env.PI_CREW_MOCK_LIVE_SESSION === "success") {
36
- return { available: true, reason: "Mock live-session runtime is enabled." };
39
+ return {
40
+ available: true,
41
+ reason: "Mock live-session runtime is enabled.",
42
+ };
37
43
  }
38
- const probe = async (): Promise<{ available: boolean; reason?: string }> => {
44
+ const probe = async (): Promise<{
45
+ available: boolean;
46
+ reason?: string;
47
+ }> => {
39
48
  try {
40
49
  // LAZY: optional peer dependency — probe at runtime to avoid hard dependency.
41
50
  const mod = await import("@earendil-works/pi-coding-agent");
42
51
  const api = mod as Record<string, unknown>;
43
52
  const required = ["createAgentSession", "DefaultResourceLoader", "SessionManager", "SettingsManager"];
44
53
  const missing = required.filter((name) => typeof api[name] === "undefined");
45
- if (missing.length) return { available: false, reason: `Pi SDK live-session exports missing: ${missing.join(", ")}.` };
54
+ if (missing.length)
55
+ return {
56
+ available: false,
57
+ reason: `Pi SDK live-session exports missing: ${missing.join(", ")}.`,
58
+ };
46
59
  return { available: true };
47
60
  } catch (error) {
48
61
  const message = error instanceof Error ? error.message : String(error);
49
- return { available: false, reason: `Could not load optional Pi SDK live-session runtime: ${message}` };
62
+ return {
63
+ available: false,
64
+ reason: `Could not load optional Pi SDK live-session runtime: ${message}`,
65
+ };
50
66
  }
51
67
  };
52
68
  let timer: NodeJS.Timeout | undefined;
@@ -54,7 +70,14 @@ export async function isLiveSessionRuntimeAvailable(timeoutMs = 1500, env: NodeJ
54
70
  return await Promise.race([
55
71
  probe(),
56
72
  new Promise<{ available: boolean; reason: string }>((resolve) => {
57
- timer = setTimeout(() => resolve({ available: false, reason: `Timed out probing optional Pi SDK live-session runtime after ${timeoutMs}ms.` }), timeoutMs);
73
+ timer = setTimeout(
74
+ () =>
75
+ resolve({
76
+ available: false,
77
+ reason: `Timed out probing optional Pi SDK live-session runtime after ${timeoutMs}ms.`,
78
+ }),
79
+ timeoutMs,
80
+ );
58
81
  timer.unref();
59
82
  }),
60
83
  ]);
@@ -67,16 +90,25 @@ export async function resolveCrewRuntime(config: PiTeamsConfig, env: NodeJS.Proc
67
90
  const requestedMode = config.runtime?.mode ?? "auto";
68
91
  const workersDisabled = config.executeWorkers === false || env.PI_CREW_EXECUTE_WORKERS === "0" || env.PI_TEAMS_EXECUTE_WORKERS === "0";
69
92
  if (requestedMode === "scaffold") return scaffoldCaps(requestedMode, undefined, "explicit_dry_run");
70
- if (workersDisabled) return scaffoldCaps(requestedMode, "Child worker execution disabled by config/env. Set runtime.mode=scaffold or executeWorkers=false only for dry runs.", "blocked");
93
+ if (workersDisabled)
94
+ return scaffoldCaps(
95
+ requestedMode,
96
+ "Child worker execution disabled by config/env. Set runtime.mode=scaffold or executeWorkers=false only for dry runs.",
97
+ "blocked",
98
+ );
71
99
  if (requestedMode === "child-process") return childCaps(requestedMode);
72
100
  // When a child-process mock is active (tests), force auto-mode to child-process where the mock is active.
73
- if (requestedMode === "auto" && env.PI_TEAMS_MOCK_CHILD_PI) return childCaps(requestedMode, "PI_TEAMS_MOCK_CHILD_PI mock forces child-process runtime in auto mode.");
101
+ if (requestedMode === "auto" && env.PI_TEAMS_MOCK_CHILD_PI)
102
+ return childCaps(requestedMode, "PI_TEAMS_MOCK_CHILD_PI mock forces child-process runtime in auto mode.");
74
103
  if (requestedMode === "live-session") {
75
104
  const live = await isLiveSessionRuntimeAvailable(1500, env);
76
105
  if (live.available) return liveCaps(requestedMode);
77
- if (config.runtime?.allowChildProcessFallback === false)
78
- return scaffoldCaps(requestedMode, live.reason, "blocked");
79
- return { ...childCaps(requestedMode), fallback: "child-process", reason: live.reason };
106
+ if (config.runtime?.allowChildProcessFallback === false) return scaffoldCaps(requestedMode, live.reason, "blocked");
107
+ return {
108
+ ...childCaps(requestedMode),
109
+ fallback: "child-process",
110
+ reason: live.reason,
111
+ };
80
112
  }
81
113
  // auto mode: use child-process unless preferLiveSession is explicitly enabled
82
114
  if (requestedMode === "auto") {
@@ -94,14 +126,47 @@ export async function resolveCrewRuntime(config: PiTeamsConfig, env: NodeJS.Proc
94
126
  return childCaps(requestedMode);
95
127
  }
96
128
 
97
- function scaffoldCaps(requestedMode: CrewRuntimeMode, reason?: string, safety: CrewRuntimeSafety = "explicit_dry_run"): CrewRuntimeCapabilities {
98
- return { kind: "scaffold", requestedMode, available: safety !== "blocked", steer: false, resume: false, liveToolActivity: false, transcript: false, safety, ...(reason ? { reason } : {}) };
129
+ function scaffoldCaps(
130
+ requestedMode: CrewRuntimeMode,
131
+ reason?: string,
132
+ safety: CrewRuntimeSafety = "explicit_dry_run",
133
+ ): CrewRuntimeCapabilities {
134
+ return {
135
+ kind: "scaffold",
136
+ requestedMode,
137
+ available: safety !== "blocked",
138
+ steer: false,
139
+ resume: false,
140
+ liveToolActivity: false,
141
+ transcript: false,
142
+ safety,
143
+ ...(reason ? { reason } : {}),
144
+ };
99
145
  }
100
146
 
101
147
  function childCaps(requestedMode: CrewRuntimeMode, reason?: string): CrewRuntimeCapabilities {
102
- return { kind: "child-process", requestedMode, available: true, steer: true, resume: false, liveToolActivity: false, transcript: true, safety: "trusted", ...(reason ? { reason } : {}) };
148
+ return {
149
+ kind: "child-process",
150
+ requestedMode,
151
+ available: true,
152
+ steer: true,
153
+ resume: false,
154
+ liveToolActivity: false,
155
+ transcript: true,
156
+ safety: "trusted",
157
+ ...(reason ? { reason } : {}),
158
+ };
103
159
  }
104
160
 
105
161
  function liveCaps(requestedMode: CrewRuntimeMode): CrewRuntimeCapabilities {
106
- return { kind: "live-session", requestedMode, available: true, steer: true, resume: true, liveToolActivity: true, transcript: true, safety: "trusted" };
162
+ return {
163
+ kind: "live-session",
164
+ requestedMode,
165
+ available: true,
166
+ steer: true,
167
+ resume: true,
168
+ liveToolActivity: true,
169
+ transcript: true,
170
+ safety: "trusted",
171
+ };
107
172
  }
@@ -34,15 +34,13 @@ export class CrewScheduler {
34
34
  private finalizer?: (jobId: string, agentId: string) => void;
35
35
  private runCancelFn?: (runId: string) => void;
36
36
 
37
- start(
38
- options: {
39
- emit: (event: ScheduleChangeEvent) => void;
40
- executor: (job: ScheduledJob) => string;
41
- finalizer: (jobId: string, agentId: string) => void;
42
- /** Optional callback to cancel a spawned run by runId. */
43
- runCancelFn?: (runId: string) => void;
44
- },
45
- ): void {
37
+ start(options: {
38
+ emit: (event: ScheduleChangeEvent) => void;
39
+ executor: (job: ScheduledJob) => string;
40
+ finalizer: (jobId: string, agentId: string) => void;
41
+ /** Optional callback to cancel a spawned run by runId. */
42
+ runCancelFn?: (runId: string) => void;
43
+ }): void {
46
44
  this.emit = options.emit;
47
45
  this.executor = options.executor;
48
46
  this.finalizer = options.finalizer;
@@ -74,7 +72,11 @@ export class CrewScheduler {
74
72
  // Cancel all spawned runs that are still active
75
73
  if (spawnedRunIds && this.runCancelFn) {
76
74
  for (const runId of spawnedRunIds) {
77
- try { this.runCancelFn(runId); } catch { /* best-effort */ }
75
+ try {
76
+ this.runCancelFn(runId);
77
+ } catch {
78
+ /* best-effort */
79
+ }
78
80
  }
79
81
  }
80
82
  const ok = this.jobs.delete(id);
@@ -121,7 +123,11 @@ export class CrewScheduler {
121
123
  this.timers.set(job.id, t);
122
124
  } else {
123
125
  this.update(job.id, { enabled: false, lastStatus: "error" });
124
- this.emit?.({ type: "error", jobId: job.id, error: `Scheduled time ${job.schedule} is in the past` });
126
+ this.emit?.({
127
+ type: "error",
128
+ jobId: job.id,
129
+ error: `Scheduled time ${job.schedule} is in the past`,
130
+ });
125
131
  }
126
132
  }
127
133
  }
@@ -149,7 +155,10 @@ export class CrewScheduler {
149
155
  agentId = this.executor(job);
150
156
  } catch (err) {
151
157
  const error = err instanceof Error ? err.message : String(err);
152
- this.update(id, { lastRun: new Date().toISOString(), lastStatus: "error" });
158
+ this.update(id, {
159
+ lastRun: new Date().toISOString(),
160
+ lastStatus: "error",
161
+ });
153
162
  this.emit?.({ type: "error", jobId: id, error });
154
163
  return;
155
164
  }
@@ -157,13 +166,20 @@ export class CrewScheduler {
157
166
  this.finalizer?.(id, agentId);
158
167
  }
159
168
 
160
- static detectSchedule(s: string): { type: ScheduleType; intervalMs?: number; normalized: string } {
169
+ static detectSchedule(s: string): {
170
+ type: ScheduleType;
171
+ intervalMs?: number;
172
+ normalized: string;
173
+ } {
161
174
  const trimmed = s.trim();
162
175
  // Relative: +10m
163
176
  const rel = trimmed.match(/^\+(\d+)(s|m|h|d)$/);
164
177
  if (rel) {
165
178
  const ms = parseInt(rel[1], 10) * { s: 1000, m: 60_000, h: 3_600_000, d: 86_400_000 }[rel[2] as "s" | "m" | "h" | "d"];
166
- return { type: "once", normalized: new Date(Date.now() + ms).toISOString() };
179
+ return {
180
+ type: "once",
181
+ normalized: new Date(Date.now() + ms).toISOString(),
182
+ };
167
183
  }
168
184
  // Interval: 5m
169
185
  const ivl = trimmed.match(/^(\d+)(s|m|h|d)$/);
@@ -196,7 +212,12 @@ export interface ScheduleSpec {
196
212
  function parseIntervalMs(s: string): number | undefined {
197
213
  let ms = 0;
198
214
  let remaining = s;
199
- const unitMs: Record<string, number> = { s: 1000, m: 60_000, h: 3_600_000, d: 86_400_000 };
215
+ const unitMs: Record<string, number> = {
216
+ s: 1000,
217
+ m: 60_000,
218
+ h: 3_600_000,
219
+ d: 86_400_000,
220
+ };
200
221
  while (remaining.length > 0) {
201
222
  const m = remaining.match(/^(\d+)(s|m|h|d)/);
202
223
  if (!m) return undefined;
@@ -272,7 +293,9 @@ export function parseSchedule(spec: string): ScheduleSpec | { error: string } {
272
293
  if (fields.length >= 5) {
273
294
  return { kind: "cron", spec: trimmed };
274
295
  }
275
- return { error: `Invalid schedule "${spec}". Use "5m", "+10m", ISO timestamp, or cron expression.` };
296
+ return {
297
+ error: `Invalid schedule "${spec}". Use "5m", "+10m", ISO timestamp, or cron expression.`,
298
+ };
276
299
  }
277
300
 
278
301
  export function nextRunTime(spec: ScheduleSpec, from: Date = new Date()): Date | { error: string } {
@@ -298,11 +321,17 @@ export function nextRunTime(spec: ScheduleSpec, from: Date = new Date()): Date |
298
321
  if (spec.kind === "cron") {
299
322
  const next = nextCronDate(spec.spec, from);
300
323
  if (!next || !(next instanceof Date)) {
301
- return (next as { error: string } | null) ?? { error: "Invalid cron expression" };
324
+ return (
325
+ (next as { error: string } | null) ?? {
326
+ error: "Invalid cron expression",
327
+ }
328
+ );
302
329
  }
303
330
  return next;
304
331
  }
305
- return { error: `Unknown schedule kind: ${(spec as unknown as Record<string, unknown>).kind}` };
332
+ return {
333
+ error: `Unknown schedule kind: ${(spec as unknown as Record<string, unknown>).kind}`,
334
+ };
306
335
  }
307
336
 
308
337
  export function humanizeSchedule(spec: ScheduleSpec): string {
@@ -33,13 +33,13 @@ export class Semaphore {
33
33
  // implementation let #queue grow without bound, risking memory
34
34
  // exhaustion under sustained high concurrency with slow releases.
35
35
  if (this.#queue.length >= Semaphore.MAX_QUEUE) {
36
- throw new Error(
37
- `Semaphore queue full: ${this.#queue.length} waiters (max ${Semaphore.MAX_QUEUE}); cannot acquire slot`,
38
- );
36
+ throw new Error(`Semaphore queue full: ${this.#queue.length} waiters (max ${Semaphore.MAX_QUEUE}); cannot acquire slot`);
39
37
  }
40
38
  const { promise, resolve } = (() => {
41
39
  let res: () => void;
42
- const p = new Promise<void>((r) => { res = r; });
40
+ const p = new Promise<void>((r) => {
41
+ res = r;
42
+ });
43
43
  return { promise: p, resolve: res! };
44
44
  })();
45
45
  this.#queue.push(resolve);
@@ -101,9 +101,7 @@ async function mapWithFailFast<T, R>(
101
101
 
102
102
  // Internal abort controller for fail-fast
103
103
  const abortController = new AbortController();
104
- const workerSignal = signal
105
- ? AbortSignal.any([signal, abortController.signal])
106
- : abortController.signal;
104
+ const workerSignal = signal ? AbortSignal.any([signal, abortController.signal]) : abortController.signal;
107
105
 
108
106
  // Promise that rejects on first error — used for fail-fast
109
107
  let rejectFirst: (error: unknown) => void;
@@ -12,7 +12,8 @@ import * as path from "node:path";
12
12
 
13
13
  /** Basenames that almost certainly hold secrets or PII */
14
14
  const SENSITIVE_BASENAMES = /\.(?:env|pem|key|p12|pfx|crt|cer|jks|keystore|asc|gpg)(?:\..+)?$/i;
15
- const SENSITIVE_EXACT = /^(?:\.env|\.netrc|\.npmrc|\.pypirc|credentials|secrets?|passwords?|id_(?:rsa|dsa|ecdsa|ed25519)(?:\.pub)?|authorized_keys|known_hosts|jwt\.json|session\.cookie|\.token)$/i;
15
+ const SENSITIVE_EXACT =
16
+ /^(?:\.env|\.netrc|\.npmrc|\.pypirc|credentials|secrets?|passwords?|id_(?:rsa|dsa|ecdsa|ed25519)(?:\.pub)?|authorized_keys|known_hosts|jwt\.json|session\.cookie|\.token)$/i;
16
17
 
17
18
  /** Path components that indicate sensitive directories */
18
19
  const SENSITIVE_DIRS = new Set([".ssh", ".aws", ".gnupg", ".kube", ".docker", ".config/gcloud", ".config/gh"]);
@@ -2,7 +2,7 @@ import * as fs from "node:fs";
2
2
  import type { UsageState } from "../state/types.ts";
3
3
 
4
4
  function asRecord(value: unknown): Record<string, unknown> | undefined {
5
- return value && typeof value === "object" && !Array.isArray(value) ? value as Record<string, unknown> : undefined;
5
+ return value && typeof value === "object" && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;
6
6
  }
7
7
 
8
8
  function numberField(obj: Record<string, unknown>, keys: string[]): number | undefined {
@@ -1,6 +1,6 @@
1
1
  import * as fs from "node:fs";
2
- import * as path from "node:path";
3
2
  import { homedir } from "node:os";
3
+ import * as path from "node:path";
4
4
  import { logInternalError } from "../utils/internal-error.ts";
5
5
  import type { JoinMode } from "./group-join.ts";
6
6
 
@@ -27,9 +27,7 @@ const VALID_JOIN_MODES = new Set<JoinMode>(["async", "group", "smart"]);
27
27
  function validateScheduledJob(job: unknown): boolean {
28
28
  if (!job || typeof job !== "object") return false;
29
29
  const obj = job as Record<string, unknown>;
30
- return typeof obj.id === "string" && obj.id.length > 0
31
- && typeof obj.scheduleType === "string"
32
- && typeof obj.enabled === "boolean";
30
+ return typeof obj.id === "string" && obj.id.length > 0 && typeof obj.scheduleType === "string" && typeof obj.enabled === "boolean";
33
31
  }
34
32
 
35
33
  function sanitizeSettings(raw: unknown): CrewSettings {
@@ -52,12 +50,7 @@ function sanitizeSettings(raw: unknown): CrewSettings {
52
50
  ) {
53
51
  out.defaultMaxTurns = r.defaultMaxTurns;
54
52
  }
55
- if (
56
- typeof r.graceTurns === "number" &&
57
- Number.isInteger(r.graceTurns) &&
58
- r.graceTurns >= 1 &&
59
- r.graceTurns <= GRACE_TURNS_CEILING
60
- ) {
53
+ if (typeof r.graceTurns === "number" && Number.isInteger(r.graceTurns) && r.graceTurns >= 1 && r.graceTurns <= GRACE_TURNS_CEILING) {
61
54
  out.graceTurns = r.graceTurns;
62
55
  }
63
56
  if (typeof r.defaultJoinMode === "string" && VALID_JOIN_MODES.has(r.defaultJoinMode as JoinMode)) {
@@ -95,7 +88,10 @@ function readSettingsFile(filePath: string): CrewSettings {
95
88
  }
96
89
 
97
90
  export function loadCrewSettings(cwd: string = process.cwd()): CrewSettings {
98
- return { ...readSettingsFile(globalPath()), ...readSettingsFile(projectPath(cwd)) };
91
+ return {
92
+ ...readSettingsFile(globalPath()),
93
+ ...readSettingsFile(projectPath(cwd)),
94
+ };
99
95
  }
100
96
 
101
97
  export function saveCrewSettings(s: CrewSettings, cwd: string = process.cwd()): boolean {
@@ -110,7 +106,15 @@ export function saveCrewSettings(s: CrewSettings, cwd: string = process.cwd()):
110
106
  }
111
107
 
112
108
  export function applyCrewSettingsToConfig(
113
- config: { limits?: { maxConcurrentWorkers?: number }; runtime?: { maxTurns?: number; graceTurns?: number; groupJoin?: string }; notifierIntervalMs?: number },
109
+ config: {
110
+ limits?: { maxConcurrentWorkers?: number };
111
+ runtime?: {
112
+ maxTurns?: number;
113
+ graceTurns?: number;
114
+ groupJoin?: string;
115
+ };
116
+ notifierIntervalMs?: number;
117
+ },
114
118
  settings: CrewSettings,
115
119
  ): void {
116
120
  if (settings.maxConcurrent != null && config.limits) config.limits.maxConcurrentWorkers = settings.maxConcurrent;
@@ -1,7 +1,7 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
- import { isSafePathId } from "../utils/safe-paths.ts";
4
3
  import { redactSecrets } from "../utils/redaction.ts";
4
+ import { isSafePathId } from "../utils/safe-paths.ts";
5
5
 
6
6
  export interface SidechainEntry {
7
7
  isSidechain: true;
@@ -14,7 +14,11 @@ export interface SidechainEntry {
14
14
 
15
15
  export function writeSidechainEntry(filePath: string, entry: Omit<SidechainEntry, "isSidechain" | "timestamp">): void {
16
16
  fs.mkdirSync(path.dirname(filePath), { recursive: true });
17
- fs.appendFileSync(filePath, `${JSON.stringify(redactSecrets({ isSidechain: true, timestamp: new Date().toISOString(), ...entry }))}\n`, "utf-8");
17
+ fs.appendFileSync(
18
+ filePath,
19
+ `${JSON.stringify(redactSecrets({ isSidechain: true, timestamp: new Date().toISOString(), ...entry }))}\n`,
20
+ "utf-8",
21
+ );
18
22
  }
19
23
 
20
24
  export function sidechainOutputPath(stateRoot: string, taskId: string): string {
@@ -49,10 +49,7 @@ function orderSteps(steps: WorkflowStep[]): WorkflowStep[] {
49
49
  * The agent executes each phase in dependency order, writing outputs to the
50
50
  * named artifacts, mimicking what the multi-agent team would produce.
51
51
  */
52
- export function composeSingleAgentPrompt(
53
- workflow: WorkflowConfig,
54
- goal: string,
55
- ): SingleAgentPrompt {
52
+ export function composeSingleAgentPrompt(workflow: WorkflowConfig, goal: string): SingleAgentPrompt {
56
53
  const ordered = orderSteps(workflow.steps);
57
54
  const lines: string[] = [];
58
55
  lines.push(`# Single-agent workflow execution: ${workflow.name}`);