pi-crew 0.9.50 → 0.9.52

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 (609) hide show
  1. package/CHANGELOG.md +150 -0
  2. package/README.md +216 -20
  3. package/dist/build-meta.json +2222 -1761
  4. package/dist/index.mjs +18636 -17603
  5. package/docs/actions-reference.md +431 -1
  6. package/package.json +19 -9
  7. package/schema.json +41 -0
  8. package/scripts/check-bundle-size.mjs +38 -0
  9. package/scripts/test-runner.mjs +11 -1
  10. package/skills/distill-software/SKILL.md +24 -1
  11. package/dist/index.mjs.map +0 -7
  12. package/docs/FEATURE_INTAKE.md +0 -126
  13. package/docs/HARNESS.md +0 -87
  14. package/docs/HARNESS_BACKLOG.md +0 -89
  15. package/docs/PROJECT_REVIEW.md +0 -270
  16. package/docs/PROJECT_REVIEW_FIXES.md +0 -342
  17. package/docs/PROJECT_REVIEW_ROUND4.md +0 -156
  18. package/docs/PROJECT_REVIEW_ROUND5.md +0 -86
  19. package/docs/REVIEW-FINDINGS-2026-06 +0 -357
  20. package/docs/REVIEW-FINDINGS-2026-07-CORE.md +0 -139
  21. package/docs/REVIEW-FINDINGS-2026-07.md +0 -125
  22. package/docs/TEST_MATRIX.md +0 -51
  23. package/docs/archive/README.md +0 -91
  24. package/docs/archive/followup-review-round3-2026-05-12.md +0 -342
  25. package/docs/archive/followup-review-round4-2026-05-13.md +0 -107
  26. package/docs/archive/pi-crew-bugs.md +0 -961
  27. package/docs/archive/pi-crew-test-final.md +0 -120
  28. package/docs/archive/pi-crew-test-results.md +0 -260
  29. package/docs/archive/pi-crew-test-round2.md +0 -136
  30. package/docs/archive/pi-crew-test-round4.md +0 -100
  31. package/docs/archive/pi-crew-test-round5.md +0 -70
  32. package/docs/archive/pi-crew-test-round6.md +0 -110
  33. package/docs/archive/pi-crew-v0.5.10-audit-fix-plan.md +0 -60
  34. package/docs/archive/pi-crew-v0.5.11-audit-fix-plan.md +0 -92
  35. package/docs/archive/pi-crew-v0.5.12-audit-fix-plan.md +0 -76
  36. package/docs/archive/pi-crew-v0.5.13-audit-fix-plan.md +0 -75
  37. package/docs/archive/pi-crew-v0.5.14-audit-fix-plan.md +0 -75
  38. package/docs/archive/pi-crew-v0.5.16-audit-fix-plan.md +0 -35
  39. package/docs/archive/pi-crew-v0.5.17-audit-fix-plan.md +0 -80
  40. package/docs/archive/pi-crew-v0.5.5-audit-fix-plan.md +0 -133
  41. package/docs/archive/pi-crew-v0.5.9-audit-fix-plan.md +0 -88
  42. package/docs/archive/pi-mono-opportunities.md +0 -969
  43. package/docs/archive/pi-mono-review.md +0 -291
  44. package/docs/archive/pi-subagent4-comparison.md +0 -261
  45. package/docs/archive/pi-subagents3-deep-analysis.md +0 -508
  46. package/docs/bugs/bug-021-notification-badge-counter-misleading.md +0 -293
  47. package/docs/bugs/bug-023-chain-windows-path-resolution.md +0 -106
  48. package/docs/bugs/bug-quota-display-truncation.md +0 -223
  49. package/docs/bugs/cross-session-notification-leakage.md +0 -82
  50. package/docs/code-review-2026-05-11.md +0 -592
  51. package/docs/coding-agent-optimization.md +0 -268
  52. package/docs/comparison-pi-subagents-vs-pi-crew.md +0 -303
  53. package/docs/decisions/0001-durable-state.md +0 -41
  54. package/docs/decisions/0002-child-process-for-async.md +0 -42
  55. package/docs/decisions/0003-depth-guard.md +0 -36
  56. package/docs/decisions/0004-execfile-over-exec.md +0 -34
  57. package/docs/decisions/0005-no-parameter-properties.md +0 -49
  58. package/docs/decisions/0006-publish-bundled-esm.md +0 -63
  59. package/docs/decisions/0007-active-run-binary-index.md +0 -54
  60. package/docs/decisions/0008-child-pi-warm-pool.md +0 -61
  61. package/docs/decisions/2026-07-21-broker-phase4-default-on.md +0 -77
  62. package/docs/decisions/2026-07-21-broker-windows-perms.md +0 -91
  63. package/docs/decisions/2026-07-22-broker-phase4-gated-on.md +0 -99
  64. package/docs/decisions/2026-07-24-oidc-trusted-publishing.md +0 -112
  65. package/docs/decisions/README.md +0 -26
  66. package/docs/deep-review-report.md +0 -384
  67. package/docs/distillation/cybersecurity-patterns.md +0 -294
  68. package/docs/feature-analysis-subagent4.md +0 -305
  69. package/docs/fix-plan-disabletools-exit-null.md +0 -219
  70. package/docs/fixes/BATCH_A_H1_H2.md +0 -86
  71. package/docs/fixes/bug-006-foreground-cancel-concurrent.md +0 -78
  72. package/docs/fixes/bug-007-async-notifier-stale-ctx.md +0 -112
  73. package/docs/fixes/bug-008-child-process-silent-timeout.md +0 -100
  74. package/docs/fixes/bug-009-executor-yield-limit-needs-attention.md +0 -75
  75. package/docs/fixes/bug-010-child-process-api-key-filtered.md +0 -109
  76. package/docs/fixes/bug-011-spawn-pi-enoent.md +0 -92
  77. package/docs/fixes/bug-012-essential-env-stripped.md +0 -89
  78. package/docs/fixes/bug-013-background-runner-death.md +0 -84
  79. package/docs/fixes/bug-014-infinite-retry-loop-needs-attention.md +0 -82
  80. package/docs/fixes/bug-015-background-runner-sigterm.md +0 -65
  81. package/docs/fixes/bug-017-background-runner-session-shutdown.md +0 -66
  82. package/docs/fixes/bug-017-background-runner-sigkill-double-fork.md +0 -28
  83. package/docs/fixes/bug-018-child-pi-worker-stdin-hang.md +0 -61
  84. package/docs/fixes/bug-019-phantom-runs-temp-workspace.md +0 -52
  85. package/docs/fixes/bug-020-infinite-retry-loop-needs-attention.md +0 -47
  86. package/docs/fixes/v0.9.10/locks-fix-verify.md +0 -3
  87. package/docs/fixes/v0.9.10/smoke-test.md +0 -12
  88. package/docs/followup-plan-2026-05-12.md +0 -463
  89. package/docs/followup-review-2026-05-12.md +0 -297
  90. package/docs/goals.md +0 -59
  91. package/docs/implementation-plan-top3.md +0 -333
  92. package/docs/issue-29-analysis.md +0 -189
  93. package/docs/live-mailbox-runtime.md +0 -36
  94. package/docs/migration/atomic-write-v2-migration.md +0 -299
  95. package/docs/next-upgrade-roadmap.md +0 -808
  96. package/docs/oh-my-pi-research.md +0 -509
  97. package/docs/optimization-plan-2026-07.md +0 -366
  98. package/docs/optimization-plan.md +0 -644
  99. package/docs/patterns/command-agent-skill.md +0 -71
  100. package/docs/perf/baseline-2026-05.md +0 -113
  101. package/docs/perf/final-report-2026-05.md +0 -206
  102. package/docs/perf/optimization-plan-2026-07-verified.md +0 -396
  103. package/docs/perf/performance-audit-report-2026-07.md +0 -948
  104. package/docs/perf/performance-review-2026-07.md +0 -287
  105. package/docs/perf/sprint-1-report.md +0 -71
  106. package/docs/perf/sprint-2-report.md +0 -81
  107. package/docs/perf/sprint-2.5-report.md +0 -53
  108. package/docs/perf/sprint-3-report.md +0 -36
  109. package/docs/perf/sprint-4-report.md +0 -47
  110. package/docs/perf/sprint-5-report.md +0 -51
  111. package/docs/perf/sprint-6-report.md +0 -94
  112. package/docs/perf/sprint-7-report.md +0 -74
  113. package/docs/perf/upgrade-plan-2026-05.md +0 -147
  114. package/docs/performance-optimization-execution-plan.md +0 -520
  115. package/docs/phase4-triage.md +0 -58
  116. package/docs/pi-crew-investigation-report.md +0 -411
  117. package/docs/product/README.md +0 -31
  118. package/docs/product/platform.md +0 -27
  119. package/docs/product/runtime-safety.md +0 -37
  120. package/docs/product/team-run.md +0 -39
  121. package/docs/product/team-tool.md +0 -37
  122. package/docs/runtime-analysis-child-vs-live.md +0 -171
  123. package/docs/runtime-migration-in-process-analysis.md +0 -250
  124. package/docs/skills/REFERENCE.md +0 -138
  125. package/docs/stories/README.md +0 -32
  126. package/docs/stories/US-DEPS-major-upgrade.md +0 -62
  127. package/docs/stories/backlog.md +0 -36
  128. package/docs/superpowers/plans/2026-06-09-fallow-patterns-adoption.md +0 -1270
  129. package/docs/templates/decision.md +0 -27
  130. package/docs/templates/story.md +0 -44
  131. package/docs/templates/validation-report.md +0 -32
  132. package/docs/ui-optimization-plan.md +0 -447
  133. package/src/adapters/claude-adapter.ts +0 -23
  134. package/src/adapters/codex-adapter.ts +0 -21
  135. package/src/adapters/cursor-adapter.ts +0 -17
  136. package/src/adapters/export-util.ts +0 -143
  137. package/src/adapters/index.ts +0 -15
  138. package/src/adapters/registry.ts +0 -18
  139. package/src/adapters/types.ts +0 -23
  140. package/src/agents/agent-config.ts +0 -194
  141. package/src/agents/agent-search.ts +0 -98
  142. package/src/agents/agent-serializer.ts +0 -38
  143. package/src/agents/discover-agents.ts +0 -623
  144. package/src/benchmark/benchmark-runner.ts +0 -313
  145. package/src/benchmark/feedback-loop.ts +0 -73
  146. package/src/config/config.ts +0 -1269
  147. package/src/config/defaults.ts +0 -193
  148. package/src/config/drift-detector.ts +0 -290
  149. package/src/config/markers.ts +0 -330
  150. package/src/config/resilient-parser.ts +0 -117
  151. package/src/config/role-tools.ts +0 -118
  152. package/src/config/suggestions.ts +0 -75
  153. package/src/config/types.ts +0 -278
  154. package/src/errors.ts +0 -194
  155. package/src/extension/action-suggestions.ts +0 -117
  156. package/src/extension/async-notifier.ts +0 -179
  157. package/src/extension/autonomous-policy.ts +0 -209
  158. package/src/extension/command-completions.ts +0 -120
  159. package/src/extension/context-status-injection.ts +0 -185
  160. package/src/extension/crew-autocomplete.ts +0 -131
  161. package/src/extension/crew-cleanup.ts +0 -168
  162. package/src/extension/crew-input-router.ts +0 -93
  163. package/src/extension/crew-shortcuts.ts +0 -87
  164. package/src/extension/crew-vibes/cat-frames.ts +0 -18
  165. package/src/extension/crew-vibes/config.ts +0 -195
  166. package/src/extension/crew-vibes/figures.ts +0 -101
  167. package/src/extension/crew-vibes/font-detect.ts +0 -71
  168. package/src/extension/crew-vibes/footer.ts +0 -292
  169. package/src/extension/crew-vibes/index.ts +0 -432
  170. package/src/extension/crew-vibes/provider-usage.ts +0 -396
  171. package/src/extension/crew-vibes/render.ts +0 -206
  172. package/src/extension/crew-vibes/speed.ts +0 -286
  173. package/src/extension/cross-extension-rpc.ts +0 -350
  174. package/src/extension/help.ts +0 -62
  175. package/src/extension/import-index.ts +0 -74
  176. package/src/extension/knowledge-injection.ts +0 -402
  177. package/src/extension/management.ts +0 -571
  178. package/src/extension/message-renderers.ts +0 -108
  179. package/src/extension/notification-router.ts +0 -152
  180. package/src/extension/notification-sink.ts +0 -54
  181. package/src/extension/pi-api.ts +0 -56
  182. package/src/extension/plan-orchestrate.ts +0 -302
  183. package/src/extension/project-init.ts +0 -170
  184. package/src/extension/register.ts +0 -113
  185. package/src/extension/registration/artifact-cleanup.ts +0 -20
  186. package/src/extension/registration/command-registration.ts +0 -58
  187. package/src/extension/registration/command-utils.ts +0 -58
  188. package/src/extension/registration/commands.ts +0 -1228
  189. package/src/extension/registration/compaction-guard.ts +0 -333
  190. package/src/extension/registration/context-builder.ts +0 -135
  191. package/src/extension/registration/crash-recovery-cache.ts +0 -54
  192. package/src/extension/registration/foreground-run-controller.ts +0 -238
  193. package/src/extension/registration/hook-registration.ts +0 -119
  194. package/src/extension/registration/lazy-configurers.ts +0 -124
  195. package/src/extension/registration/lifecycle-handlers.ts +0 -923
  196. package/src/extension/registration/lifecycle.ts +0 -259
  197. package/src/extension/registration/observability.ts +0 -322
  198. package/src/extension/registration/registration-types.ts +0 -158
  199. package/src/extension/registration/runtime-cleanup.ts +0 -230
  200. package/src/extension/registration/subagent-helpers.ts +0 -125
  201. package/src/extension/registration/subagent-manager-setup.ts +0 -330
  202. package/src/extension/registration/subagent-tools.ts +0 -456
  203. package/src/extension/registration/team-tool.ts +0 -220
  204. package/src/extension/registration/tool-registration.ts +0 -50
  205. package/src/extension/registration/ui.ts +0 -172
  206. package/src/extension/registration/viewers.ts +0 -121
  207. package/src/extension/registration/wire-cross-extension.ts +0 -37
  208. package/src/extension/result-watcher.ts +0 -139
  209. package/src/extension/rpc-hmac.ts +0 -256
  210. package/src/extension/run-bundle-schema.ts +0 -104
  211. package/src/extension/run-export.ts +0 -97
  212. package/src/extension/run-import.ts +0 -168
  213. package/src/extension/run-index.ts +0 -131
  214. package/src/extension/run-maintenance.ts +0 -190
  215. package/src/extension/session-summary.ts +0 -18
  216. package/src/extension/team-manager-command.ts +0 -153
  217. package/src/extension/team-onboard.ts +0 -177
  218. package/src/extension/team-recommendation.ts +0 -288
  219. package/src/extension/team-tool/anchor.ts +0 -172
  220. package/src/extension/team-tool/api.ts +0 -1244
  221. package/src/extension/team-tool/auto-summarize.ts +0 -142
  222. package/src/extension/team-tool/cache-control.ts +0 -19
  223. package/src/extension/team-tool/cancel.ts +0 -337
  224. package/src/extension/team-tool/chain-dispatch.ts +0 -95
  225. package/src/extension/team-tool/chain-executor.ts +0 -379
  226. package/src/extension/team-tool/config-patch.ts +0 -50
  227. package/src/extension/team-tool/context.ts +0 -149
  228. package/src/extension/team-tool/destructive-gate.ts +0 -52
  229. package/src/extension/team-tool/doctor.ts +0 -431
  230. package/src/extension/team-tool/explain.ts +0 -282
  231. package/src/extension/team-tool/failure-patterns.ts +0 -118
  232. package/src/extension/team-tool/goal-wrap.ts +0 -330
  233. package/src/extension/team-tool/goal.ts +0 -556
  234. package/src/extension/team-tool/handle-schedule.ts +0 -332
  235. package/src/extension/team-tool/handle-settings.ts +0 -520
  236. package/src/extension/team-tool/health-monitor.ts +0 -481
  237. package/src/extension/team-tool/inspect.ts +0 -88
  238. package/src/extension/team-tool/intent-policy.ts +0 -45
  239. package/src/extension/team-tool/lifecycle-actions.ts +0 -615
  240. package/src/extension/team-tool/orchestrate.ts +0 -98
  241. package/src/extension/team-tool/parallel-dispatch.ts +0 -183
  242. package/src/extension/team-tool/plan.ts +0 -50
  243. package/src/extension/team-tool/respond.ts +0 -150
  244. package/src/extension/team-tool/run-not-found.ts +0 -49
  245. package/src/extension/team-tool/run.ts +0 -1035
  246. package/src/extension/team-tool/status.ts +0 -260
  247. package/src/extension/team-tool/workflow-manage.ts +0 -261
  248. package/src/extension/team-tool-types.ts +0 -26
  249. package/src/extension/team-tool.ts +0 -1116
  250. package/src/extension/tool-result.ts +0 -16
  251. package/src/extension/validate-resources.ts +0 -108
  252. package/src/hooks/registry.ts +0 -200
  253. package/src/hooks/types.ts +0 -69
  254. package/src/i18n.ts +0 -212
  255. package/src/observability/correlation.ts +0 -50
  256. package/src/observability/event-bus.ts +0 -86
  257. package/src/observability/event-to-metric.ts +0 -170
  258. package/src/observability/exporters/adapter.ts +0 -27
  259. package/src/observability/exporters/otlp-exporter.ts +0 -356
  260. package/src/observability/exporters/prometheus-exporter.ts +0 -54
  261. package/src/observability/metric-registry.ts +0 -100
  262. package/src/observability/metric-retention.ts +0 -64
  263. package/src/observability/metric-sink.ts +0 -99
  264. package/src/observability/metrics-primitives.ts +0 -219
  265. package/src/plugins/plugin-define.ts +0 -6
  266. package/src/plugins/plugin-registry.ts +0 -32
  267. package/src/plugins/plugins/index.ts +0 -3
  268. package/src/plugins/plugins/nextjs.ts +0 -19
  269. package/src/plugins/plugins/vite.ts +0 -10
  270. package/src/plugins/plugins/vitest.ts +0 -9
  271. package/src/prompt/prompt-runtime.ts +0 -380
  272. package/src/runtime/adaptive-plan.ts +0 -563
  273. package/src/runtime/agent-control.ts +0 -215
  274. package/src/runtime/agent-memory.ts +0 -81
  275. package/src/runtime/agent-observability.ts +0 -122
  276. package/src/runtime/anchor-manager.ts +0 -475
  277. package/src/runtime/async-marker.ts +0 -32
  278. package/src/runtime/async-runner.ts +0 -381
  279. package/src/runtime/attention-events.ts +0 -28
  280. package/src/runtime/auto-summarize.ts +0 -344
  281. package/src/runtime/background-runner.ts +0 -837
  282. package/src/runtime/batch-barrier.ts +0 -147
  283. package/src/runtime/broker-issuer.ts +0 -37
  284. package/src/runtime/cancellation-token.ts +0 -99
  285. package/src/runtime/cancellation.ts +0 -99
  286. package/src/runtime/capability-inventory.ts +0 -137
  287. package/src/runtime/chain-parser.ts +0 -237
  288. package/src/runtime/chain-runner.ts +0 -606
  289. package/src/runtime/checkpoint.ts +0 -291
  290. package/src/runtime/child-pi-constants.ts +0 -42
  291. package/src/runtime/child-pi-kill.ts +0 -180
  292. package/src/runtime/child-pi-pool.ts +0 -68
  293. package/src/runtime/child-pi-spawn.ts +0 -287
  294. package/src/runtime/child-pi-steering.ts +0 -128
  295. package/src/runtime/child-pi-streams.ts +0 -296
  296. package/src/runtime/child-pi-transcript.ts +0 -169
  297. package/src/runtime/child-pi.ts +0 -1105
  298. package/src/runtime/coalesce-tasks.ts +0 -268
  299. package/src/runtime/code-summary.ts +0 -292
  300. package/src/runtime/command-trace.ts +0 -105
  301. package/src/runtime/compact-pipeline.ts +0 -56
  302. package/src/runtime/compact-stages/ansi-strip-stage.ts +0 -25
  303. package/src/runtime/compact-stages/blank-collapse-stage.ts +0 -31
  304. package/src/runtime/compact-stages/deduplicate-stage.ts +0 -34
  305. package/src/runtime/compact-stages/head-snap-stage.ts +0 -57
  306. package/src/runtime/compact-stages/index.ts +0 -23
  307. package/src/runtime/compact-stages/tail-capture-stage.ts +0 -77
  308. package/src/runtime/compact-stages/truncation-stage.ts +0 -74
  309. package/src/runtime/compaction-summary.ts +0 -278
  310. package/src/runtime/completion-guard.ts +0 -207
  311. package/src/runtime/concurrency.ts +0 -58
  312. package/src/runtime/crash-classification.ts +0 -229
  313. package/src/runtime/crash-recovery.ts +0 -577
  314. package/src/runtime/crew-agent-records.ts +0 -593
  315. package/src/runtime/crew-agent-runtime.ts +0 -62
  316. package/src/runtime/crew-broker-child.ts +0 -88
  317. package/src/runtime/crew-broker-client.ts +0 -673
  318. package/src/runtime/crew-broker-tokens.ts +0 -84
  319. package/src/runtime/crew-broker.ts +0 -1276
  320. package/src/runtime/crew-hooks.ts +0 -227
  321. package/src/runtime/cross-extension-rpc.ts +0 -143
  322. package/src/runtime/custom-tools/irc-tool.ts +0 -282
  323. package/src/runtime/custom-tools/submit-result-tool.ts +0 -102
  324. package/src/runtime/deadletter.ts +0 -47
  325. package/src/runtime/delivery-coordinator.ts +0 -211
  326. package/src/runtime/delta-conflict.ts +0 -348
  327. package/src/runtime/deterministic-ast.ts +0 -161
  328. package/src/runtime/diagnostic-export.ts +0 -171
  329. package/src/runtime/direct-run.ts +0 -45
  330. package/src/runtime/dwf-state-store.ts +0 -102
  331. package/src/runtime/dynamic-workflow-context.ts +0 -1016
  332. package/src/runtime/dynamic-workflow-runner.ts +0 -310
  333. package/src/runtime/effectiveness.ts +0 -90
  334. package/src/runtime/errors/crew-errors.ts +0 -162
  335. package/src/runtime/event-stream-bridge.ts +0 -98
  336. package/src/runtime/foreground-control.ts +0 -193
  337. package/src/runtime/foreground-watchdog.ts +0 -132
  338. package/src/runtime/global-worker-cap.ts +0 -96
  339. package/src/runtime/goal-achievement.ts +0 -148
  340. package/src/runtime/goal-evaluator.ts +0 -361
  341. package/src/runtime/goal-loop-runner.ts +0 -828
  342. package/src/runtime/goal-state-store.ts +0 -219
  343. package/src/runtime/green-contract.ts +0 -55
  344. package/src/runtime/group-join.ts +0 -267
  345. package/src/runtime/handoff-manager.ts +0 -598
  346. package/src/runtime/heartbeat-gradient.ts +0 -36
  347. package/src/runtime/heartbeat-watcher.ts +0 -239
  348. package/src/runtime/hidden-handoff.ts +0 -407
  349. package/src/runtime/important-line-classifier.ts +0 -140
  350. package/src/runtime/intercom-bridge.ts +0 -187
  351. package/src/runtime/iteration-hooks.ts +0 -305
  352. package/src/runtime/live-agent-control.ts +0 -136
  353. package/src/runtime/live-agent-manager.ts +0 -704
  354. package/src/runtime/live-control-realtime.ts +0 -56
  355. package/src/runtime/live-extension-bridge.ts +0 -148
  356. package/src/runtime/live-irc.ts +0 -97
  357. package/src/runtime/live-session-health.ts +0 -108
  358. package/src/runtime/live-session-runtime.ts +0 -1139
  359. package/src/runtime/loop-gates.ts +0 -128
  360. package/src/runtime/manifest-cache.ts +0 -375
  361. package/src/runtime/mcp-proxy.ts +0 -105
  362. package/src/runtime/metric-parser.ts +0 -36
  363. package/src/runtime/model-fallback.ts +0 -409
  364. package/src/runtime/model-resolver.ts +0 -126
  365. package/src/runtime/model-scope.ts +0 -158
  366. package/src/runtime/orphan-worker-registry.ts +0 -465
  367. package/src/runtime/output-validator.ts +0 -202
  368. package/src/runtime/overflow-recovery.ts +0 -206
  369. package/src/runtime/parallel-research.ts +0 -68
  370. package/src/runtime/parallel-utils.ts +0 -160
  371. package/src/runtime/parent-guard.ts +0 -134
  372. package/src/runtime/path-overlap.ts +0 -150
  373. package/src/runtime/peer-dep.ts +0 -292
  374. package/src/runtime/per-write-validator.ts +0 -181
  375. package/src/runtime/phase-progress.ts +0 -217
  376. package/src/runtime/phase-tracker.ts +0 -385
  377. package/src/runtime/pi-args.ts +0 -655
  378. package/src/runtime/pi-json-output.ts +0 -170
  379. package/src/runtime/pi-spawn.ts +0 -273
  380. package/src/runtime/pipeline-runner.ts +0 -523
  381. package/src/runtime/plan-templates.ts +0 -201
  382. package/src/runtime/policy-engine.ts +0 -115
  383. package/src/runtime/post-checks.ts +0 -142
  384. package/src/runtime/post-exit-stdio-guard.ts +0 -104
  385. package/src/runtime/process-lifecycle.ts +0 -491
  386. package/src/runtime/process-status.ts +0 -154
  387. package/src/runtime/progress-event-coalescer.ts +0 -44
  388. package/src/runtime/progress-tracker.ts +0 -124
  389. package/src/runtime/prose-compressor.ts +0 -162
  390. package/src/runtime/recovery-recipes.ts +0 -203
  391. package/src/runtime/replace.ts +0 -570
  392. package/src/runtime/resilient-edit.ts +0 -153
  393. package/src/runtime/result-extractor.ts +0 -213
  394. package/src/runtime/retry-executor.ts +0 -100
  395. package/src/runtime/retry-runner.ts +0 -336
  396. package/src/runtime/role-permission.ts +0 -59
  397. package/src/runtime/run-coalesced-task-group.ts +0 -308
  398. package/src/runtime/run-drift.ts +0 -219
  399. package/src/runtime/run-tracker.ts +0 -116
  400. package/src/runtime/runtime-policy.ts +0 -29
  401. package/src/runtime/runtime-resolver.ts +0 -172
  402. package/src/runtime/runtime-warmup.ts +0 -160
  403. package/src/runtime/scheduler.ts +0 -353
  404. package/src/runtime/semaphore.ts +0 -141
  405. package/src/runtime/sensitive-paths.ts +0 -93
  406. package/src/runtime/session-resources.ts +0 -25
  407. package/src/runtime/session-snapshot.ts +0 -59
  408. package/src/runtime/session-usage.ts +0 -79
  409. package/src/runtime/settings-store.ts +0 -155
  410. package/src/runtime/sidechain-output.ts +0 -35
  411. package/src/runtime/single-agent-compose.ts +0 -84
  412. package/src/runtime/skill-effectiveness.ts +0 -524
  413. package/src/runtime/skill-instructions.ts +0 -391
  414. package/src/runtime/stale-reconciler.ts +0 -680
  415. package/src/runtime/stream-preview.ts +0 -184
  416. package/src/runtime/streaming-output.ts +0 -50
  417. package/src/runtime/subagent-manager.ts +0 -561
  418. package/src/runtime/subprocess-tool-registry.ts +0 -70
  419. package/src/runtime/supervisor-contact.ts +0 -64
  420. package/src/runtime/task-display.ts +0 -52
  421. package/src/runtime/task-graph-scheduler.ts +0 -227
  422. package/src/runtime/task-graph.ts +0 -290
  423. package/src/runtime/task-health.ts +0 -83
  424. package/src/runtime/task-id.ts +0 -161
  425. package/src/runtime/task-output-context.ts +0 -602
  426. package/src/runtime/task-packet.ts +0 -268
  427. package/src/runtime/task-quality.ts +0 -199
  428. package/src/runtime/task-runner/capabilities.ts +0 -78
  429. package/src/runtime/task-runner/context-retrieval.ts +0 -163
  430. package/src/runtime/task-runner/live-executor.ts +0 -227
  431. package/src/runtime/task-runner/output-splitter.ts +0 -152
  432. package/src/runtime/task-runner/progress.ts +0 -157
  433. package/src/runtime/task-runner/prompt-builder.ts +0 -278
  434. package/src/runtime/task-runner/prompt-pipeline.ts +0 -88
  435. package/src/runtime/task-runner/result-utils.ts +0 -16
  436. package/src/runtime/task-runner/retrieval-orchestrator.ts +0 -310
  437. package/src/runtime/task-runner/run-projection.ts +0 -125
  438. package/src/runtime/task-runner/state-helpers.ts +0 -176
  439. package/src/runtime/task-runner/tail-read.ts +0 -34
  440. package/src/runtime/task-runner.ts +0 -1420
  441. package/src/runtime/team-runner-artifacts.ts +0 -13
  442. package/src/runtime/team-runner.ts +0 -1993
  443. package/src/runtime/tool-output-pruner.ts +0 -333
  444. package/src/runtime/tool-progress.ts +0 -278
  445. package/src/runtime/usage-tracker.ts +0 -73
  446. package/src/runtime/verification-gates.ts +0 -571
  447. package/src/runtime/verification-integrity.ts +0 -105
  448. package/src/runtime/verification-worktree.ts +0 -186
  449. package/src/runtime/worker-heartbeat.ts +0 -25
  450. package/src/runtime/worker-startup.ts +0 -83
  451. package/src/runtime/workflow-state.ts +0 -195
  452. package/src/runtime/workspace-lock.ts +0 -443
  453. package/src/runtime/workspace-tree.ts +0 -312
  454. package/src/runtime/yield-handler.ts +0 -224
  455. package/src/runtime/zombie-scanner.ts +0 -298
  456. package/src/schema/config-schema.ts +0 -327
  457. package/src/schema/team-tool-schema.ts +0 -415
  458. package/src/schema/validation-types.ts +0 -159
  459. package/src/skills/discover-skills.ts +0 -197
  460. package/src/skills/skill-templates.ts +0 -456
  461. package/src/skills/validate.ts +0 -285
  462. package/src/state/active-run-registry.ts +0 -439
  463. package/src/state/artifact-store.ts +0 -176
  464. package/src/state/atomic-write.ts +0 -903
  465. package/src/state/blob-store.ts +0 -308
  466. package/src/state/contracts.ts +0 -158
  467. package/src/state/crew-init.ts +0 -269
  468. package/src/state/decision-ledger.ts +0 -345
  469. package/src/state/event-log-rotation.ts +0 -342
  470. package/src/state/event-log.ts +0 -1311
  471. package/src/state/event-reconstructor.ts +0 -229
  472. package/src/state/gitignore-manager.ts +0 -46
  473. package/src/state/health-store.ts +0 -79
  474. package/src/state/hook-instinct-bridge.ts +0 -94
  475. package/src/state/hook-integrations.ts +0 -51
  476. package/src/state/instinct-store.ts +0 -275
  477. package/src/state/jsonl-writer.ts +0 -107
  478. package/src/state/locks.ts +0 -562
  479. package/src/state/mailbox.ts +0 -916
  480. package/src/state/observation-store.ts +0 -176
  481. package/src/state/run-cache.ts +0 -193
  482. package/src/state/run-graph.ts +0 -183
  483. package/src/state/run-metrics.ts +0 -165
  484. package/src/state/schedule.ts +0 -166
  485. package/src/state/session-state-map.ts +0 -51
  486. package/src/state/state-store.ts +0 -958
  487. package/src/state/task-claims.ts +0 -61
  488. package/src/state/tiered-eval.ts +0 -480
  489. package/src/state/types-eval.ts +0 -58
  490. package/src/state/types.ts +0 -440
  491. package/src/state/usage.ts +0 -138
  492. package/src/state/worker-atomic-writer.ts +0 -194
  493. package/src/subagents/async-entry.ts +0 -1
  494. package/src/subagents/index.ts +0 -3
  495. package/src/subagents/live/control.ts +0 -1
  496. package/src/subagents/live/manager.ts +0 -1
  497. package/src/subagents/live/realtime.ts +0 -1
  498. package/src/subagents/live/session-runtime.ts +0 -1
  499. package/src/subagents/manager.ts +0 -1
  500. package/src/subagents/spawn.ts +0 -1
  501. package/src/teams/discover-teams.ts +0 -187
  502. package/src/teams/team-config.ts +0 -27
  503. package/src/teams/team-serializer.ts +0 -38
  504. package/src/tools/safe-bash-extension.ts +0 -54
  505. package/src/tools/safe-bash.ts +0 -505
  506. package/src/types/diff.d.ts +0 -18
  507. package/src/types/new-api-types.ts +0 -35
  508. package/src/ui/agent-management-overlay.ts +0 -160
  509. package/src/ui/card-colors.ts +0 -139
  510. package/src/ui/crew-footer.ts +0 -102
  511. package/src/ui/crew-select-list.ts +0 -111
  512. package/src/ui/dashboard-panes/agents-pane.ts +0 -164
  513. package/src/ui/dashboard-panes/cancellation-pane.ts +0 -66
  514. package/src/ui/dashboard-panes/capability-pane.ts +0 -77
  515. package/src/ui/dashboard-panes/health-pane.ts +0 -31
  516. package/src/ui/dashboard-panes/mailbox-pane.ts +0 -35
  517. package/src/ui/dashboard-panes/metrics-pane.ts +0 -37
  518. package/src/ui/dashboard-panes/progress-pane.ts +0 -38
  519. package/src/ui/dashboard-panes/transcript-pane.ts +0 -10
  520. package/src/ui/deploy-bundled-themes.ts +0 -71
  521. package/src/ui/dwf-phase-display.ts +0 -151
  522. package/src/ui/dynamic-border.ts +0 -35
  523. package/src/ui/heartbeat-aggregator.ts +0 -74
  524. package/src/ui/key-utils.ts +0 -42
  525. package/src/ui/keybinding-map.ts +0 -248
  526. package/src/ui/layout-primitives.ts +0 -106
  527. package/src/ui/live-conversation-overlay.ts +0 -183
  528. package/src/ui/live-duration.ts +0 -55
  529. package/src/ui/live-run-sidebar.ts +0 -301
  530. package/src/ui/loaders.ts +0 -176
  531. package/src/ui/mascot.ts +0 -436
  532. package/src/ui/overlays/agent-picker-overlay.ts +0 -65
  533. package/src/ui/overlays/confirm-overlay.ts +0 -60
  534. package/src/ui/overlays/help-overlay.ts +0 -177
  535. package/src/ui/overlays/mailbox-compose-overlay.ts +0 -181
  536. package/src/ui/overlays/mailbox-compose-preview.ts +0 -78
  537. package/src/ui/overlays/mailbox-detail-overlay.ts +0 -154
  538. package/src/ui/pi-ui-compat.ts +0 -68
  539. package/src/ui/powerbar-publisher.ts +0 -459
  540. package/src/ui/render-coalescer.ts +0 -101
  541. package/src/ui/render-diff.ts +0 -160
  542. package/src/ui/render-scheduler.ts +0 -224
  543. package/src/ui/run-action-dispatcher.ts +0 -182
  544. package/src/ui/run-dashboard.ts +0 -913
  545. package/src/ui/run-event-bus.ts +0 -381
  546. package/src/ui/run-snapshot-cache.ts +0 -1057
  547. package/src/ui/settings-overlay.ts +0 -1067
  548. package/src/ui/snapshot-types.ts +0 -90
  549. package/src/ui/spinner.ts +0 -17
  550. package/src/ui/status-colors.ts +0 -143
  551. package/src/ui/syntax-highlight.ts +0 -136
  552. package/src/ui/terminal-status.ts +0 -269
  553. package/src/ui/theme-adapter.ts +0 -271
  554. package/src/ui/theme-discovery.ts +0 -199
  555. package/src/ui/tool-progress-formatter.ts +0 -93
  556. package/src/ui/tool-render.ts +0 -453
  557. package/src/ui/tool-renderers/brief-mode.ts +0 -225
  558. package/src/ui/tool-renderers/index.ts +0 -726
  559. package/src/ui/transcript-cache.ts +0 -128
  560. package/src/ui/transcript-entries.ts +0 -256
  561. package/src/ui/transcript-viewer.ts +0 -424
  562. package/src/ui/widget/index.ts +0 -357
  563. package/src/ui/widget/widget-formatters.ts +0 -182
  564. package/src/ui/widget/widget-model.ts +0 -110
  565. package/src/ui/widget/widget-renderer.ts +0 -182
  566. package/src/ui/widget/widget-types.ts +0 -36
  567. package/src/utils/bm25-search.ts +0 -235
  568. package/src/utils/completion-dedupe.ts +0 -63
  569. package/src/utils/conflict-detect.ts +0 -668
  570. package/src/utils/env-allowlist.ts +0 -30
  571. package/src/utils/env-filter.ts +0 -155
  572. package/src/utils/file-coalescer.ts +0 -98
  573. package/src/utils/fingerprint.ts +0 -180
  574. package/src/utils/frontmatter.ts +0 -70
  575. package/src/utils/fs-watch.ts +0 -37
  576. package/src/utils/gh-protocol.ts +0 -556
  577. package/src/utils/git.ts +0 -260
  578. package/src/utils/guards.ts +0 -107
  579. package/src/utils/ids.ts +0 -24
  580. package/src/utils/incremental-reader.ts +0 -220
  581. package/src/utils/internal-error.ts +0 -10
  582. package/src/utils/names.ts +0 -36
  583. package/src/utils/ndjson.ts +0 -115
  584. package/src/utils/paths.ts +0 -227
  585. package/src/utils/project-detector.ts +0 -160
  586. package/src/utils/redaction.ts +0 -347
  587. package/src/utils/resolve-shell.ts +0 -36
  588. package/src/utils/run-watcher-registry.ts +0 -152
  589. package/src/utils/safe-paths.ts +0 -383
  590. package/src/utils/scan-cache.ts +0 -144
  591. package/src/utils/session-utils.ts +0 -110
  592. package/src/utils/sleep.ts +0 -54
  593. package/src/utils/socket-path.ts +0 -127
  594. package/src/utils/sse-parser.ts +0 -129
  595. package/src/utils/task-name-generator.ts +0 -337
  596. package/src/utils/timings.ts +0 -33
  597. package/src/utils/token-counter.ts +0 -200
  598. package/src/utils/visual.ts +0 -207
  599. package/src/workflows/cost-estimator.ts +0 -34
  600. package/src/workflows/discover-workflows.ts +0 -290
  601. package/src/workflows/intermediate-store.ts +0 -166
  602. package/src/workflows/preflight-validator.ts +0 -168
  603. package/src/workflows/topology-analyzer.ts +0 -203
  604. package/src/workflows/validate-workflow.ts +0 -50
  605. package/src/workflows/workflow-config.ts +0 -70
  606. package/src/workflows/workflow-serializer.ts +0 -32
  607. package/src/worktree/branch-freshness.ts +0 -112
  608. package/src/worktree/cleanup.ts +0 -341
  609. package/src/worktree/worktree-manager.ts +0 -1200
@@ -1,290 +0,0 @@
1
- import * as fs from "node:fs";
2
- import * as path from "node:path";
3
- import type { ResourceSource } from "../agents/agent-config.ts";
4
- import { parseCsv, parseFrontmatter } from "../utils/frontmatter.ts";
5
- import { packageRoot, projectCrewRoot, userPiRoot } from "../utils/paths.ts";
6
- import type { WorkflowConfig, WorkflowStep } from "./workflow-config.ts";
7
-
8
- export interface WorkflowDiscoveryResult {
9
- builtin: WorkflowConfig[];
10
- user: WorkflowConfig[];
11
- project: WorkflowConfig[];
12
- }
13
-
14
- const STEP_CONFIG_KEYS = new Set([
15
- "role",
16
- "dependsOn",
17
- "parallelGroup",
18
- "output",
19
- "reads",
20
- "model",
21
- "skills",
22
- "progress",
23
- "worktree",
24
- "verify",
25
- "task",
26
- "seedPaths",
27
- "preStepScript",
28
- "preStepArgs",
29
- "preStepTimeout",
30
- "preStepOptional",
31
- ]);
32
-
33
- function parseStepSection(id: string, body: string): WorkflowStep | undefined {
34
- const lines = body.trim().split("\n");
35
- const config: Record<string, string> = {};
36
- const taskLines: string[] = [];
37
- let inTask = false;
38
- let sawConfig = false;
39
- for (const line of lines) {
40
- if (!inTask) {
41
- if (line.trim() === "") {
42
- if (!sawConfig) continue;
43
- inTask = true;
44
- continue;
45
- }
46
- const match = line.match(/^([\w-]+):\s*(.*)$/);
47
- if (match) {
48
- config[match[1]!.trim()] = match[2]!.trim();
49
- sawConfig = true;
50
- continue;
51
- }
52
- inTask = true;
53
- }
54
- taskLines.push(line);
55
- }
56
- const role = config.role || id;
57
- return {
58
- id,
59
- role,
60
- task: taskLines.join("\n").trim() || config.task || "{goal}",
61
- dependsOn: parseCsv(config.dependsOn),
62
- parallelGroup: config.parallelGroup || undefined,
63
- output: config.output === "false" ? false : config.output || undefined,
64
- reads: config.reads === "false" ? false : parseCsv(config.reads),
65
- model: config.model || undefined,
66
- skills: config.skills === "false" ? false : parseCsv(config.skills),
67
- progress: config.progress === "true" ? true : config.progress === "false" ? false : undefined,
68
- worktree: config.worktree === "true" ? true : config.worktree === "false" ? false : undefined,
69
- verify: config.verify === "true" ? true : config.verify === "false" ? false : undefined,
70
- seedPaths: parseCsv(config.seedPaths) || undefined,
71
- preStepScript: config.preStepScript || undefined,
72
- preStepArgs: parseCsv(config.preStepArgs) || undefined,
73
- preStepTimeout: parseOptionalInteger(config.preStepTimeout) ?? undefined,
74
- preStepOptional: config.preStepOptional === "true" || config.preStepOptional === "1",
75
- };
76
- }
77
-
78
- const parseOptionalInteger = (value: string | undefined): number | undefined => {
79
- const trimmed = value?.trim();
80
- if (!trimmed) return undefined;
81
- const n = Number.parseInt(trimmed, 10);
82
- return Number.isNaN(n) ? undefined : n;
83
- };
84
-
85
- const parseOptionalBoolean = (value: string | undefined): boolean | undefined => {
86
- const trimmed = value?.trim().toLowerCase();
87
- if (!trimmed) return undefined;
88
- if (trimmed === "true" || trimmed === "yes" || trimmed === "1") return true;
89
- if (trimmed === "false" || trimmed === "no" || trimmed === "0") return false;
90
- return undefined;
91
- };
92
-
93
- /** Parse frontmatter `topology:` field. Validates against allowed enum; bad values are silently
94
- * dropped (fall through to auto-classification in topology-analyzer). */
95
- const parseTopology = (value: string | undefined): WorkflowConfig["topology"] => {
96
- if (!value) return undefined;
97
- const v = value.trim().toLowerCase();
98
- if (v === "single" || v === "sequential" || v === "concurrent" || v === "complex-dag" || v === "dynamic") {
99
- return v;
100
- }
101
- return undefined;
102
- };
103
-
104
- function hasSectionBoundary(body: string, match: RegExpMatchArray): boolean {
105
- const index = match.index ?? 0;
106
- if (index === 0 || body.slice(0, index).trim() === "") return true;
107
- const prev = body.slice(Math.max(0, index - 2), index);
108
- // Accept blank line or single newline before heading.
109
- return prev === "\n\n" || prev.endsWith("\n");
110
- }
111
-
112
- function isStepHeading(body: string, match: RegExpMatchArray): boolean {
113
- const sectionStart = match.index! + match[0].length + (body[match.index! + match[0].length] === "\n" ? 1 : 0);
114
- const nextHeading = body.slice(sectionStart).search(/^##\s+.+[^\S\n]*$/m);
115
- const section = body.slice(sectionStart, nextHeading >= 0 ? sectionStart + nextHeading : body.length);
116
- for (const line of section.split("\n")) {
117
- const trimmed = line.trim();
118
- if (!trimmed) continue;
119
- const config = trimmed.match(/^([\w-]+):\s*(.*)$/);
120
- if (config && STEP_CONFIG_KEYS.has(config[1]!)) return true;
121
- return false;
122
- }
123
- return false;
124
- }
125
-
126
- function parseWorkflowFile(filePath: string, source: ResourceSource): WorkflowConfig | undefined {
127
- try {
128
- const content = fs.readFileSync(filePath, "utf-8");
129
- const { frontmatter, body } = parseFrontmatter(content);
130
- const name = frontmatter.name?.trim() || path.basename(filePath, ".workflow.md");
131
- const matches = [...body.matchAll(/^##\s+(.+)[^\S\n]*$/gm)];
132
- const explicitStepIndexes = new Set(
133
- matches
134
- .map((match, index) => (isStepHeading(body, match) ? index : undefined))
135
- .filter((index): index is number => index !== undefined),
136
- );
137
- const effectiveMatches = matches.filter(
138
- (match, index) =>
139
- explicitStepIndexes.has(index) || (hasSectionBoundary(body, match) && /^[a-z][a-z0-9-]*$/.test(match[1]?.trim() ?? "")),
140
- );
141
- const parseMatches = explicitStepIndexes.size ? effectiveMatches : matches;
142
- const steps: WorkflowStep[] = [];
143
- for (let i = 0; i < parseMatches.length; i++) {
144
- const match = parseMatches[i]!;
145
- const id = match[1]!.trim();
146
- const sectionStart = match.index! + match[0].length + (body[match.index! + match[0].length] === "\n" ? 1 : 0);
147
- const sectionEnd = i + 1 < parseMatches.length ? parseMatches[i + 1]!.index! : body.length;
148
- const step = parseStepSection(id, body.slice(sectionStart, sectionEnd));
149
- if (step) steps.push(step);
150
- }
151
- return {
152
- name,
153
- description: frontmatter.description?.trim() || "No description provided.",
154
- source,
155
- filePath,
156
- maxConcurrency: parseOptionalInteger(frontmatter.maxConcurrency),
157
- topology: parseTopology(frontmatter.topology),
158
- coalesceMicroTasks: parseOptionalBoolean(frontmatter.coalesceMicroTasks),
159
- steps,
160
- };
161
- } catch {
162
- return undefined;
163
- }
164
- }
165
-
166
- function readWorkflowDir(dir: string, source: ResourceSource): WorkflowConfig[] {
167
- if (!fs.existsSync(dir)) return [];
168
- const staticWorkflows = fs
169
- .readdirSync(dir)
170
- .filter((entry) => entry.endsWith(".workflow.md"))
171
- .map((entry) => parseWorkflowFile(path.join(dir, entry), source))
172
- .filter((workflow): workflow is WorkflowConfig => workflow !== undefined)
173
- .sort((a, b) => a.name.localeCompare(b.name));
174
- // P2: also discover dynamic workflows (*.dwf.ts). A .dwf.ts's default export is a JS orchestrator.
175
- const dynamicWorkflows = fs
176
- .readdirSync(dir)
177
- .filter((entry) => entry.endsWith(".dwf.ts"))
178
- .map((entry) => parseDynamicWorkflowFile(path.join(dir, entry), source))
179
- .filter((workflow): workflow is WorkflowConfig => workflow !== undefined);
180
- return [...staticWorkflows, ...dynamicWorkflows].sort((a, b) => a.name.localeCompare(b.name));
181
- }
182
-
183
- /** P2: a .dwf.ts is a dynamic workflow. Name = filename stem; script = the file itself. */
184
- function parseDynamicWorkflowFile(filePath: string, source: ResourceSource): WorkflowConfig | undefined {
185
- try {
186
- const basename = path.basename(filePath, ".dwf.ts");
187
- return {
188
- name: basename,
189
- description: `Dynamic workflow script (${basename}.dwf.ts).`,
190
- source,
191
- filePath,
192
- steps: [],
193
- runtime: "dynamic",
194
- dynamicScript: filePath,
195
- };
196
- } catch {
197
- return undefined;
198
- }
199
- }
200
-
201
- // ─── Workflow Discovery Cache (F17) ──────────────────────────────────────
202
- // Mirrors the Agent Discovery Cache pattern (see discover-agents.ts:493-556).
203
- // `discoverWorkflows(cwd)` is called on the powerbar hot path (≤200 ms coalesce =
204
- // up to ~5 Hz when a run is active + emitting events). Without caching, each call
205
- // walks 3 roots, each requiring readdirSync × 2 + readFileSync + regex-parse per
206
- // `.workflow.md`. We use TTL + dir-stamp invalidation so the cache survives
207
- // steady-state rendering yet still picks up file changes within a few seconds.
208
- //
209
- // SECURITY: ResourceIdentity preserved — same precedence + same parsers as before.
210
- // Reviewers: there is no path-component concern; this only memoises a pure function
211
- // of the filesystem state into a process-local Map.
212
- const WORKFLOW_DISCOVERY_TTL_MS = 5000;
213
- const WORKFLOW_DISCOVERY_MAX_ENTRIES = 32;
214
- interface CachedWorkflowEntry {
215
- result: WorkflowDiscoveryResult;
216
- expiresAt: number;
217
- /** mtime tuple of the 3 workflow source dirs; change ⇒ invalidate early. */
218
- dirStamp: string;
219
- }
220
- const workflowCache = new Map<string, CachedWorkflowEntry>();
221
-
222
- /** Compact mtime signature for the 3 workflow source dirs. Cheap (3 statSync). */
223
- function workflowDirStamp(cwd: string): string {
224
- const dirs = [
225
- path.join(packageRoot(), "workflows"),
226
- path.join(userPiRoot(), "workflows"),
227
- path.join(projectCrewRoot(cwd), "workflows"),
228
- ];
229
- let out = "";
230
- for (const d of dirs) {
231
- try {
232
- const st = fs.statSync(d);
233
- out += `${st.mtimeMs}|`;
234
- } catch {
235
- out += "0|";
236
- }
237
- }
238
- return out;
239
- }
240
-
241
- /** Drop one or all cached entries. Called from management actions and tests. */
242
- export function invalidateWorkflowDiscoveryCache(cwd?: string): void {
243
- if (cwd) {
244
- workflowCache.delete(cwd);
245
- } else {
246
- workflowCache.clear();
247
- }
248
- }
249
-
250
- export function discoverWorkflows(cwd: string): WorkflowDiscoveryResult {
251
- if (!cwd || typeof cwd !== "string") {
252
- return { builtin: [], user: [], project: [] };
253
- }
254
- // F17: serve from cache when both TTL is fresh AND dir-stamp is unchanged.
255
- // `dirStamp` is a 3-stat pulse we run on every cached call — it is much
256
- // cheaper than the disk scan it protects against (3 statSync vs 2 readdirSync
257
- // + N readFileSync + regex parse per `.workflow.md`).
258
- const now = Date.now();
259
- const stamp = workflowDirStamp(cwd);
260
- const cached = workflowCache.get(cwd);
261
- if (cached && cached.expiresAt > now && cached.dirStamp === stamp) {
262
- return cached.result;
263
- }
264
- const result: WorkflowDiscoveryResult = {
265
- builtin: readWorkflowDir(path.join(packageRoot(), "workflows"), "builtin"),
266
- user: readWorkflowDir(path.join(userPiRoot(), "workflows"), "user"),
267
- project: readWorkflowDir(path.join(projectCrewRoot(cwd), "workflows"), "project"),
268
- };
269
- workflowCache.set(cwd, {
270
- result,
271
- expiresAt: now + WORKFLOW_DISCOVERY_TTL_MS,
272
- dirStamp: stamp,
273
- });
274
- // Bounded LRU-ish eviction by insertion order (Map iteration order).
275
- while (workflowCache.size > WORKFLOW_DISCOVERY_MAX_ENTRIES) {
276
- const oldest = workflowCache.keys().next().value;
277
- if (oldest === undefined) break;
278
- workflowCache.delete(oldest);
279
- }
280
- return result;
281
- }
282
-
283
- export function allWorkflows(discovery: WorkflowDiscoveryResult | undefined): WorkflowConfig[] {
284
- if (!discovery) return [];
285
- const byName = new Map<string, WorkflowConfig>();
286
- for (const workflow of [...discovery.project, ...discovery.builtin, ...discovery.user]) {
287
- byName.set(workflow.name, workflow);
288
- }
289
- return [...byName.values()].sort((a, b) => a.name.localeCompare(b.name));
290
- }
@@ -1,166 +0,0 @@
1
- /**
2
- * Phase-gated intermediate store — persist workflow step outputs to disk.
3
- *
4
- * Pattern origin: Understand-Anything 7-phase pipeline where each phase
5
- * writes structured JSON to intermediate/ directory. Phase N reads Phase N-1
6
- * output from disk (not context). Enables:
7
- * - Context isolation between steps
8
- * - Incremental re-runs (skip completed phases)
9
- * - Debugging (inspect intermediate outputs)
10
- */
11
-
12
- import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
13
- import path from "node:path";
14
- import { logInternalError } from "../utils/internal-error.ts";
15
- import { isSafePathId } from "../utils/safe-paths.ts";
16
-
17
- // ── Types ────────────────────────────────────────────────────────────────
18
-
19
- export interface IntermediateOutput {
20
- phase: string;
21
- stepId: string;
22
- timestamp: string;
23
- data: unknown;
24
- }
25
-
26
- export interface IntermediateStoreConfig {
27
- /** Root directory for intermediates (e.g., ".crew/intermediate/") */
28
- intermediateDir: string;
29
- /** File patterns to preserve across runs (e.g., ["scan-result.json"]) */
30
- preservePatterns: string[];
31
- }
32
-
33
- // ── Store Operations ─────────────────────────────────────────────────────
34
-
35
- const DEFAULT_CONFIG: IntermediateStoreConfig = {
36
- intermediateDir: ".crew/intermediate",
37
- preservePatterns: [],
38
- };
39
-
40
- /**
41
- * Ensure the intermediate directory exists.
42
- */
43
- export function ensureIntermediateDir(config: Partial<IntermediateStoreConfig> = {}): string {
44
- const dir = config.intermediateDir ?? DEFAULT_CONFIG.intermediateDir;
45
- mkdirSync(dir, { recursive: true });
46
- return dir;
47
- }
48
-
49
- /**
50
- * Write an intermediate output for a phase.
51
- *
52
- * @param config - Store configuration
53
- * @param phase - Phase name (e.g., "explore", "analyze")
54
- * @param stepId - Step ID for correlation
55
- * @param data - Phase output data
56
- * @returns Path to the written file
57
- */
58
- export function writeIntermediate(config: Partial<IntermediateStoreConfig>, phase: string, stepId: string, data: unknown): string {
59
- // Security: validate phase/stepId before building the filename to prevent
60
- // path traversal via poisoned phase or stepId.
61
- if (!isSafePathId(phase) || !isSafePathId(stepId)) {
62
- throw new Error("Invalid phase or stepId for intermediate store");
63
- }
64
- const dir = ensureIntermediateDir(config);
65
- const filename = `${phase}-${stepId}.json`;
66
- const filePath = path.join(dir, filename);
67
-
68
- const output: IntermediateOutput = {
69
- phase,
70
- stepId,
71
- timestamp: new Date().toISOString(),
72
- data,
73
- };
74
-
75
- writeFileSync(filePath, JSON.stringify(output, null, 2), "utf-8");
76
- return filePath;
77
- }
78
-
79
- /**
80
- * Read an intermediate output for a phase.
81
- *
82
- * @param config - Store configuration
83
- * @param phase - Phase name
84
- * @param stepId - Step ID
85
- * @returns Parsed intermediate output, or undefined if not found
86
- */
87
- export function readIntermediate(config: Partial<IntermediateStoreConfig>, phase: string, stepId: string): IntermediateOutput | undefined {
88
- // M-2 fix (code-review 2026-06-23): validate phase/stepId before building the
89
- // filename to prevent path traversal via a poisoned stepId.
90
- if (!isSafePathId(phase) || !isSafePathId(stepId)) return undefined;
91
- const dir = config.intermediateDir ?? DEFAULT_CONFIG.intermediateDir;
92
- const filename = `${phase}-${stepId}.json`;
93
- const filePath = path.join(dir, filename);
94
-
95
- if (!existsSync(filePath)) return undefined;
96
-
97
- try {
98
- const content = readFileSync(filePath, "utf-8");
99
- return JSON.parse(content) as IntermediateOutput;
100
- } catch (error) {
101
- logInternalError("intermediate-store.read", error, `filePath=${filePath}`);
102
- return undefined;
103
- }
104
- }
105
-
106
- /**
107
- * Read the most recent intermediate output for any phase.
108
- *
109
- * Useful when you don't know the exact stepId but want the latest
110
- * output from a phase (e.g., for incremental re-runs).
111
- */
112
- export function readLatestIntermediate(config: Partial<IntermediateStoreConfig>, phase: string): IntermediateOutput | undefined {
113
- const dir = config.intermediateDir ?? DEFAULT_CONFIG.intermediateDir;
114
- if (!existsSync(dir)) return undefined;
115
-
116
- const files = readdirSync(dir)
117
- .filter((f) => f.startsWith(`${phase}-`) && f.endsWith(".json"))
118
- .sort()
119
- .reverse(); // most recent first
120
-
121
- if (files.length === 0) return undefined;
122
-
123
- try {
124
- const content = readFileSync(path.join(dir, files[0]!), "utf-8");
125
- return JSON.parse(content) as IntermediateOutput;
126
- } catch {
127
- return undefined;
128
- }
129
- }
130
-
131
- /**
132
- * Clean up intermediate files, preserving specified patterns.
133
- *
134
- * @param config - Store configuration
135
- * @returns Number of files removed
136
- */
137
- export function cleanupIntermediates(config: Partial<IntermediateStoreConfig> = {}): number {
138
- const dir = config.intermediateDir ?? DEFAULT_CONFIG.intermediateDir;
139
- const preserve = config.preservePatterns ?? DEFAULT_CONFIG.preservePatterns;
140
-
141
- if (!existsSync(dir)) return 0;
142
-
143
- const files = readdirSync(dir);
144
- let removed = 0;
145
-
146
- for (const file of files) {
147
- const shouldPreserve = preserve.some((pattern) => file.includes(pattern));
148
- if (!shouldPreserve) {
149
- try {
150
- unlinkSync(path.join(dir, file));
151
- removed++;
152
- } catch (error) {
153
- logInternalError("intermediate-store.cleanup", error, `file=${file}`);
154
- }
155
- }
156
- }
157
-
158
- return removed;
159
- }
160
-
161
- /**
162
- * Check if a phase has completed (intermediate exists).
163
- */
164
- export function hasPhaseCompleted(config: Partial<IntermediateStoreConfig>, phase: string, stepId: string): boolean {
165
- return readIntermediate(config, phase, stepId) !== undefined;
166
- }
@@ -1,168 +0,0 @@
1
- // src/workflows/preflight-validator.ts
2
- //
3
- // Decision tree from .crew/knowledge.md "pi-crew USAGE THRESHOLD RULE"
4
- // (3-step refined rule, 2026-06-29). The validator runs synchronously
5
- // before executeTeamRun and returns a structured result; it NEVER throws.
6
- // Call sites decide whether to short-circuit (block) or just log (warn).
7
- //
8
- // The validator is a pure function: it accepts an optional eventAppender
9
- // in PreflightOptions for future telemetry wiring but does NOT call it
10
- // itself. Integration call sites (Phase 3) will fire telemetry from the
11
- // result they receive. This keeps the validator side-effect free and
12
- // trivially testable.
13
-
14
- import { analyzeWorkflowTopology, type WorkflowTopology } from "./topology-analyzer.ts";
15
- import type { WorkflowConfig } from "./workflow-config.ts";
16
-
17
- export interface PreflightOptions {
18
- /** When true, downgrade any block/warn to allow. Audit trail should log the override. */
19
- force?: boolean;
20
- /** Optional hook reserved for future telemetry wiring. Not invoked by the validator. */
21
- eventAppender?: (eventsPath: string, event: object) => void;
22
- }
23
-
24
- export interface PreflightResult {
25
- /**
26
- * Advisory severity. NEVER blocks execution — all levels log a note and proceed.
27
- * - `info` — context-only, e.g. dynamic workflow, force-bypass acknowledged.
28
- * - `note` — topology=`concurrent` or `complex-dag`: validated good use cases.
29
- * - `warn` — potential misuse (single / sequential 2–3 / 4+ sequential). Provides
30
- * the measured cost evidence (Run #3, Run #1) so the agent can decide
31
- * whether to proceed or refactor into raw Agent calls.
32
- */
33
- level: "info" | "note" | "warn";
34
- message: string;
35
- suggestion: string;
36
- topology: WorkflowTopology;
37
- /** Mirrored from TopologyAnalysis for telemetry — useful to scope warn events. */
38
- stepCount: number;
39
- /** Mirrored from TopologyAnalysis — what the analyzer recommends. */
40
- recommendation: string;
41
- }
42
-
43
- function info(topology: WorkflowTopology, stepCount: number, recommendation: string, message: string): PreflightResult {
44
- return {
45
- level: "info",
46
- message,
47
- suggestion: "",
48
- topology,
49
- stepCount,
50
- recommendation,
51
- };
52
- }
53
-
54
- function note(topology: WorkflowTopology, stepCount: number, recommendation: string, message: string): PreflightResult {
55
- return {
56
- level: "note",
57
- message,
58
- suggestion: "Validated use case — proceeding.",
59
- topology,
60
- stepCount,
61
- recommendation,
62
- };
63
- }
64
-
65
- function warn(topology: WorkflowTopology, stepCount: number, recommendation: string, message: string, suggestion: string): PreflightResult {
66
- return {
67
- level: "warn",
68
- message,
69
- suggestion,
70
- topology,
71
- stepCount,
72
- recommendation,
73
- };
74
- }
75
-
76
- /**
77
- * Validate workflow usage against the topology threshold rule.
78
- *
79
- * **Returns a PreflightResult. NEVER blocks the call.** The validator is advisory only —
80
- * the agent (caller) decides whether to proceed, refactor, or override. This honors
81
- * Pi's design philosophy: tooling provides information, agents exercise judgment.
82
- *
83
- * Severity levels:
84
- * - `info` — context-only (dynamic, force-bypass acknowledged).
85
- * - `note` — validated use case (`concurrent`, `complex-dag`). Proceed.
86
- * - `warn` — potential inefficiency. Provides measured cost evidence so the agent
87
- * can weigh the trade-off (e.g. audit-trail value vs. raw-call speed).
88
- *
89
- * No `block` level exists — there is no scenario where pi-crew hard-rejects a call.
90
- * The agent always gets to decide.
91
- */
92
- export function validateWorkflowUsage(workflow: WorkflowConfig, options: PreflightOptions = {}): PreflightResult {
93
- const analysis = analyzeWorkflowTopology(workflow);
94
- const { topology, stepCount, recommendation } = analysis;
95
-
96
- // Rule 0: dynamic workflows are runtime-decided.
97
- if (topology === "dynamic") {
98
- return info(topology, stepCount, recommendation, "Dynamic workflow — runtime decides topology.");
99
- }
100
-
101
- // Rule 0b: explicit force-bypass acknowledged (still log it).
102
- if (options.force === true) {
103
- return info(
104
- topology,
105
- stepCount,
106
- recommendation,
107
- `Force-bypassed preflight acknowledged (topology=${topology}, stepCount=${stepCount}). Proceeding as requested.`,
108
- );
109
- }
110
-
111
- // Rule 1: SINGLE — advisory note that raw Agent would be simpler.
112
- if (topology === "single") {
113
- return warn(
114
- topology,
115
- stepCount,
116
- recommendation,
117
- "Single-task workflow: pi-crew overhead exceeds benefit; raw Agent tool would be ~30× faster and ~5× cheaper. Proceeding anyway — proceed only if audit trail or team coordination matters here.",
118
- "Consider using the raw Agent tool instead. If proceeding, no action needed — pi-crew will run the workflow as configured.",
119
- );
120
- }
121
-
122
- // Rule 2: SEQUENTIAL — note per chain length with measured cost evidence.
123
- if (topology === "sequential") {
124
- if (stepCount === 2) {
125
- return warn(
126
- topology,
127
- stepCount,
128
- recommendation,
129
- "2-step sequential chain: pi-crew adds overhead; 2 raw Agent calls would be faster. Proceeding anyway.",
130
- "Consider 2 raw Agent calls in one turn if speed matters. Otherwise, no action needed.",
131
- );
132
- }
133
- if (stepCount === 3) {
134
- return warn(
135
- topology,
136
- stepCount,
137
- recommendation,
138
- "3-step sequential chain: measured 5.7× slower and 1.9× costlier than 3 raw Agent calls (Run #3 in .crew/state/runs/). Proceeding anyway.",
139
- "Consider 3 raw Agent calls. If audit trail justifies overhead, proceed.",
140
- );
141
- }
142
- return warn(
143
- topology,
144
- stepCount,
145
- recommendation,
146
- `${stepCount}-step sequential chain: longer chains may justify pi-crew for audit/dag-context reasons, but raw Agent calls remain faster. Proceeding anyway.`,
147
- "Consider chaining raw Agent calls if speed matters. Otherwise, no action needed.",
148
- );
149
- }
150
-
151
- // Rule 3: CONCURRENT — validated good use case, informational note.
152
- if (topology === "concurrent") {
153
- return note(
154
- topology,
155
- stepCount,
156
- recommendation,
157
- `Validated use case: ${analysis.fanOutDegree}-way parallel fan-out. pi-crew's parallelism wins here.`,
158
- );
159
- }
160
-
161
- // Rule 4: COMPLEX_DAG — validated good use case, informational note.
162
- return note(
163
- topology,
164
- stepCount,
165
- recommendation,
166
- `Validated use case: complex DAG with ${stepCount} steps, depth ${analysis.dagDepth}. pi-crew's dependency-context injection and adaptive-plan support wins here.`,
167
- );
168
- }