pi-crew 0.9.15 → 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 +145 -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 +193 -40
  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 +86 -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
@@ -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}`);