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.
- package/CHANGELOG.md +150 -0
- package/README.md +216 -20
- package/dist/build-meta.json +2222 -1761
- package/dist/index.mjs +18636 -17603
- package/docs/actions-reference.md +431 -1
- package/package.json +19 -9
- package/schema.json +41 -0
- package/scripts/check-bundle-size.mjs +38 -0
- package/scripts/test-runner.mjs +11 -1
- package/skills/distill-software/SKILL.md +24 -1
- package/dist/index.mjs.map +0 -7
- package/docs/FEATURE_INTAKE.md +0 -126
- package/docs/HARNESS.md +0 -87
- package/docs/HARNESS_BACKLOG.md +0 -89
- package/docs/PROJECT_REVIEW.md +0 -270
- package/docs/PROJECT_REVIEW_FIXES.md +0 -342
- package/docs/PROJECT_REVIEW_ROUND4.md +0 -156
- package/docs/PROJECT_REVIEW_ROUND5.md +0 -86
- package/docs/REVIEW-FINDINGS-2026-06 +0 -357
- package/docs/REVIEW-FINDINGS-2026-07-CORE.md +0 -139
- package/docs/REVIEW-FINDINGS-2026-07.md +0 -125
- package/docs/TEST_MATRIX.md +0 -51
- package/docs/archive/README.md +0 -91
- package/docs/archive/followup-review-round3-2026-05-12.md +0 -342
- package/docs/archive/followup-review-round4-2026-05-13.md +0 -107
- package/docs/archive/pi-crew-bugs.md +0 -961
- package/docs/archive/pi-crew-test-final.md +0 -120
- package/docs/archive/pi-crew-test-results.md +0 -260
- package/docs/archive/pi-crew-test-round2.md +0 -136
- package/docs/archive/pi-crew-test-round4.md +0 -100
- package/docs/archive/pi-crew-test-round5.md +0 -70
- package/docs/archive/pi-crew-test-round6.md +0 -110
- package/docs/archive/pi-crew-v0.5.10-audit-fix-plan.md +0 -60
- package/docs/archive/pi-crew-v0.5.11-audit-fix-plan.md +0 -92
- package/docs/archive/pi-crew-v0.5.12-audit-fix-plan.md +0 -76
- package/docs/archive/pi-crew-v0.5.13-audit-fix-plan.md +0 -75
- package/docs/archive/pi-crew-v0.5.14-audit-fix-plan.md +0 -75
- package/docs/archive/pi-crew-v0.5.16-audit-fix-plan.md +0 -35
- package/docs/archive/pi-crew-v0.5.17-audit-fix-plan.md +0 -80
- package/docs/archive/pi-crew-v0.5.5-audit-fix-plan.md +0 -133
- package/docs/archive/pi-crew-v0.5.9-audit-fix-plan.md +0 -88
- package/docs/archive/pi-mono-opportunities.md +0 -969
- package/docs/archive/pi-mono-review.md +0 -291
- package/docs/archive/pi-subagent4-comparison.md +0 -261
- package/docs/archive/pi-subagents3-deep-analysis.md +0 -508
- package/docs/bugs/bug-021-notification-badge-counter-misleading.md +0 -293
- package/docs/bugs/bug-023-chain-windows-path-resolution.md +0 -106
- package/docs/bugs/bug-quota-display-truncation.md +0 -223
- package/docs/bugs/cross-session-notification-leakage.md +0 -82
- package/docs/code-review-2026-05-11.md +0 -592
- package/docs/coding-agent-optimization.md +0 -268
- package/docs/comparison-pi-subagents-vs-pi-crew.md +0 -303
- package/docs/decisions/0001-durable-state.md +0 -41
- package/docs/decisions/0002-child-process-for-async.md +0 -42
- package/docs/decisions/0003-depth-guard.md +0 -36
- package/docs/decisions/0004-execfile-over-exec.md +0 -34
- package/docs/decisions/0005-no-parameter-properties.md +0 -49
- package/docs/decisions/0006-publish-bundled-esm.md +0 -63
- package/docs/decisions/0007-active-run-binary-index.md +0 -54
- package/docs/decisions/0008-child-pi-warm-pool.md +0 -61
- package/docs/decisions/2026-07-21-broker-phase4-default-on.md +0 -77
- package/docs/decisions/2026-07-21-broker-windows-perms.md +0 -91
- package/docs/decisions/2026-07-22-broker-phase4-gated-on.md +0 -99
- package/docs/decisions/2026-07-24-oidc-trusted-publishing.md +0 -112
- package/docs/decisions/README.md +0 -26
- package/docs/deep-review-report.md +0 -384
- package/docs/distillation/cybersecurity-patterns.md +0 -294
- package/docs/feature-analysis-subagent4.md +0 -305
- package/docs/fix-plan-disabletools-exit-null.md +0 -219
- package/docs/fixes/BATCH_A_H1_H2.md +0 -86
- package/docs/fixes/bug-006-foreground-cancel-concurrent.md +0 -78
- package/docs/fixes/bug-007-async-notifier-stale-ctx.md +0 -112
- package/docs/fixes/bug-008-child-process-silent-timeout.md +0 -100
- package/docs/fixes/bug-009-executor-yield-limit-needs-attention.md +0 -75
- package/docs/fixes/bug-010-child-process-api-key-filtered.md +0 -109
- package/docs/fixes/bug-011-spawn-pi-enoent.md +0 -92
- package/docs/fixes/bug-012-essential-env-stripped.md +0 -89
- package/docs/fixes/bug-013-background-runner-death.md +0 -84
- package/docs/fixes/bug-014-infinite-retry-loop-needs-attention.md +0 -82
- package/docs/fixes/bug-015-background-runner-sigterm.md +0 -65
- package/docs/fixes/bug-017-background-runner-session-shutdown.md +0 -66
- package/docs/fixes/bug-017-background-runner-sigkill-double-fork.md +0 -28
- package/docs/fixes/bug-018-child-pi-worker-stdin-hang.md +0 -61
- package/docs/fixes/bug-019-phantom-runs-temp-workspace.md +0 -52
- package/docs/fixes/bug-020-infinite-retry-loop-needs-attention.md +0 -47
- package/docs/fixes/v0.9.10/locks-fix-verify.md +0 -3
- package/docs/fixes/v0.9.10/smoke-test.md +0 -12
- package/docs/followup-plan-2026-05-12.md +0 -463
- package/docs/followup-review-2026-05-12.md +0 -297
- package/docs/goals.md +0 -59
- package/docs/implementation-plan-top3.md +0 -333
- package/docs/issue-29-analysis.md +0 -189
- package/docs/live-mailbox-runtime.md +0 -36
- package/docs/migration/atomic-write-v2-migration.md +0 -299
- package/docs/next-upgrade-roadmap.md +0 -808
- package/docs/oh-my-pi-research.md +0 -509
- package/docs/optimization-plan-2026-07.md +0 -366
- package/docs/optimization-plan.md +0 -644
- package/docs/patterns/command-agent-skill.md +0 -71
- package/docs/perf/baseline-2026-05.md +0 -113
- package/docs/perf/final-report-2026-05.md +0 -206
- package/docs/perf/optimization-plan-2026-07-verified.md +0 -396
- package/docs/perf/performance-audit-report-2026-07.md +0 -948
- package/docs/perf/performance-review-2026-07.md +0 -287
- package/docs/perf/sprint-1-report.md +0 -71
- package/docs/perf/sprint-2-report.md +0 -81
- package/docs/perf/sprint-2.5-report.md +0 -53
- package/docs/perf/sprint-3-report.md +0 -36
- package/docs/perf/sprint-4-report.md +0 -47
- package/docs/perf/sprint-5-report.md +0 -51
- package/docs/perf/sprint-6-report.md +0 -94
- package/docs/perf/sprint-7-report.md +0 -74
- package/docs/perf/upgrade-plan-2026-05.md +0 -147
- package/docs/performance-optimization-execution-plan.md +0 -520
- package/docs/phase4-triage.md +0 -58
- package/docs/pi-crew-investigation-report.md +0 -411
- package/docs/product/README.md +0 -31
- package/docs/product/platform.md +0 -27
- package/docs/product/runtime-safety.md +0 -37
- package/docs/product/team-run.md +0 -39
- package/docs/product/team-tool.md +0 -37
- package/docs/runtime-analysis-child-vs-live.md +0 -171
- package/docs/runtime-migration-in-process-analysis.md +0 -250
- package/docs/skills/REFERENCE.md +0 -138
- package/docs/stories/README.md +0 -32
- package/docs/stories/US-DEPS-major-upgrade.md +0 -62
- package/docs/stories/backlog.md +0 -36
- package/docs/superpowers/plans/2026-06-09-fallow-patterns-adoption.md +0 -1270
- package/docs/templates/decision.md +0 -27
- package/docs/templates/story.md +0 -44
- package/docs/templates/validation-report.md +0 -32
- package/docs/ui-optimization-plan.md +0 -447
- package/src/adapters/claude-adapter.ts +0 -23
- package/src/adapters/codex-adapter.ts +0 -21
- package/src/adapters/cursor-adapter.ts +0 -17
- package/src/adapters/export-util.ts +0 -143
- package/src/adapters/index.ts +0 -15
- package/src/adapters/registry.ts +0 -18
- package/src/adapters/types.ts +0 -23
- package/src/agents/agent-config.ts +0 -194
- package/src/agents/agent-search.ts +0 -98
- package/src/agents/agent-serializer.ts +0 -38
- package/src/agents/discover-agents.ts +0 -623
- package/src/benchmark/benchmark-runner.ts +0 -313
- package/src/benchmark/feedback-loop.ts +0 -73
- package/src/config/config.ts +0 -1269
- package/src/config/defaults.ts +0 -193
- package/src/config/drift-detector.ts +0 -290
- package/src/config/markers.ts +0 -330
- package/src/config/resilient-parser.ts +0 -117
- package/src/config/role-tools.ts +0 -118
- package/src/config/suggestions.ts +0 -75
- package/src/config/types.ts +0 -278
- package/src/errors.ts +0 -194
- package/src/extension/action-suggestions.ts +0 -117
- package/src/extension/async-notifier.ts +0 -179
- package/src/extension/autonomous-policy.ts +0 -209
- package/src/extension/command-completions.ts +0 -120
- package/src/extension/context-status-injection.ts +0 -185
- package/src/extension/crew-autocomplete.ts +0 -131
- package/src/extension/crew-cleanup.ts +0 -168
- package/src/extension/crew-input-router.ts +0 -93
- package/src/extension/crew-shortcuts.ts +0 -87
- package/src/extension/crew-vibes/cat-frames.ts +0 -18
- package/src/extension/crew-vibes/config.ts +0 -195
- package/src/extension/crew-vibes/figures.ts +0 -101
- package/src/extension/crew-vibes/font-detect.ts +0 -71
- package/src/extension/crew-vibes/footer.ts +0 -292
- package/src/extension/crew-vibes/index.ts +0 -432
- package/src/extension/crew-vibes/provider-usage.ts +0 -396
- package/src/extension/crew-vibes/render.ts +0 -206
- package/src/extension/crew-vibes/speed.ts +0 -286
- package/src/extension/cross-extension-rpc.ts +0 -350
- package/src/extension/help.ts +0 -62
- package/src/extension/import-index.ts +0 -74
- package/src/extension/knowledge-injection.ts +0 -402
- package/src/extension/management.ts +0 -571
- package/src/extension/message-renderers.ts +0 -108
- package/src/extension/notification-router.ts +0 -152
- package/src/extension/notification-sink.ts +0 -54
- package/src/extension/pi-api.ts +0 -56
- package/src/extension/plan-orchestrate.ts +0 -302
- package/src/extension/project-init.ts +0 -170
- package/src/extension/register.ts +0 -113
- package/src/extension/registration/artifact-cleanup.ts +0 -20
- package/src/extension/registration/command-registration.ts +0 -58
- package/src/extension/registration/command-utils.ts +0 -58
- package/src/extension/registration/commands.ts +0 -1228
- package/src/extension/registration/compaction-guard.ts +0 -333
- package/src/extension/registration/context-builder.ts +0 -135
- package/src/extension/registration/crash-recovery-cache.ts +0 -54
- package/src/extension/registration/foreground-run-controller.ts +0 -238
- package/src/extension/registration/hook-registration.ts +0 -119
- package/src/extension/registration/lazy-configurers.ts +0 -124
- package/src/extension/registration/lifecycle-handlers.ts +0 -923
- package/src/extension/registration/lifecycle.ts +0 -259
- package/src/extension/registration/observability.ts +0 -322
- package/src/extension/registration/registration-types.ts +0 -158
- package/src/extension/registration/runtime-cleanup.ts +0 -230
- package/src/extension/registration/subagent-helpers.ts +0 -125
- package/src/extension/registration/subagent-manager-setup.ts +0 -330
- package/src/extension/registration/subagent-tools.ts +0 -456
- package/src/extension/registration/team-tool.ts +0 -220
- package/src/extension/registration/tool-registration.ts +0 -50
- package/src/extension/registration/ui.ts +0 -172
- package/src/extension/registration/viewers.ts +0 -121
- package/src/extension/registration/wire-cross-extension.ts +0 -37
- package/src/extension/result-watcher.ts +0 -139
- package/src/extension/rpc-hmac.ts +0 -256
- package/src/extension/run-bundle-schema.ts +0 -104
- package/src/extension/run-export.ts +0 -97
- package/src/extension/run-import.ts +0 -168
- package/src/extension/run-index.ts +0 -131
- package/src/extension/run-maintenance.ts +0 -190
- package/src/extension/session-summary.ts +0 -18
- package/src/extension/team-manager-command.ts +0 -153
- package/src/extension/team-onboard.ts +0 -177
- package/src/extension/team-recommendation.ts +0 -288
- package/src/extension/team-tool/anchor.ts +0 -172
- package/src/extension/team-tool/api.ts +0 -1244
- package/src/extension/team-tool/auto-summarize.ts +0 -142
- package/src/extension/team-tool/cache-control.ts +0 -19
- package/src/extension/team-tool/cancel.ts +0 -337
- package/src/extension/team-tool/chain-dispatch.ts +0 -95
- package/src/extension/team-tool/chain-executor.ts +0 -379
- package/src/extension/team-tool/config-patch.ts +0 -50
- package/src/extension/team-tool/context.ts +0 -149
- package/src/extension/team-tool/destructive-gate.ts +0 -52
- package/src/extension/team-tool/doctor.ts +0 -431
- package/src/extension/team-tool/explain.ts +0 -282
- package/src/extension/team-tool/failure-patterns.ts +0 -118
- package/src/extension/team-tool/goal-wrap.ts +0 -330
- package/src/extension/team-tool/goal.ts +0 -556
- package/src/extension/team-tool/handle-schedule.ts +0 -332
- package/src/extension/team-tool/handle-settings.ts +0 -520
- package/src/extension/team-tool/health-monitor.ts +0 -481
- package/src/extension/team-tool/inspect.ts +0 -88
- package/src/extension/team-tool/intent-policy.ts +0 -45
- package/src/extension/team-tool/lifecycle-actions.ts +0 -615
- package/src/extension/team-tool/orchestrate.ts +0 -98
- package/src/extension/team-tool/parallel-dispatch.ts +0 -183
- package/src/extension/team-tool/plan.ts +0 -50
- package/src/extension/team-tool/respond.ts +0 -150
- package/src/extension/team-tool/run-not-found.ts +0 -49
- package/src/extension/team-tool/run.ts +0 -1035
- package/src/extension/team-tool/status.ts +0 -260
- package/src/extension/team-tool/workflow-manage.ts +0 -261
- package/src/extension/team-tool-types.ts +0 -26
- package/src/extension/team-tool.ts +0 -1116
- package/src/extension/tool-result.ts +0 -16
- package/src/extension/validate-resources.ts +0 -108
- package/src/hooks/registry.ts +0 -200
- package/src/hooks/types.ts +0 -69
- package/src/i18n.ts +0 -212
- package/src/observability/correlation.ts +0 -50
- package/src/observability/event-bus.ts +0 -86
- package/src/observability/event-to-metric.ts +0 -170
- package/src/observability/exporters/adapter.ts +0 -27
- package/src/observability/exporters/otlp-exporter.ts +0 -356
- package/src/observability/exporters/prometheus-exporter.ts +0 -54
- package/src/observability/metric-registry.ts +0 -100
- package/src/observability/metric-retention.ts +0 -64
- package/src/observability/metric-sink.ts +0 -99
- package/src/observability/metrics-primitives.ts +0 -219
- package/src/plugins/plugin-define.ts +0 -6
- package/src/plugins/plugin-registry.ts +0 -32
- package/src/plugins/plugins/index.ts +0 -3
- package/src/plugins/plugins/nextjs.ts +0 -19
- package/src/plugins/plugins/vite.ts +0 -10
- package/src/plugins/plugins/vitest.ts +0 -9
- package/src/prompt/prompt-runtime.ts +0 -380
- package/src/runtime/adaptive-plan.ts +0 -563
- package/src/runtime/agent-control.ts +0 -215
- package/src/runtime/agent-memory.ts +0 -81
- package/src/runtime/agent-observability.ts +0 -122
- package/src/runtime/anchor-manager.ts +0 -475
- package/src/runtime/async-marker.ts +0 -32
- package/src/runtime/async-runner.ts +0 -381
- package/src/runtime/attention-events.ts +0 -28
- package/src/runtime/auto-summarize.ts +0 -344
- package/src/runtime/background-runner.ts +0 -837
- package/src/runtime/batch-barrier.ts +0 -147
- package/src/runtime/broker-issuer.ts +0 -37
- package/src/runtime/cancellation-token.ts +0 -99
- package/src/runtime/cancellation.ts +0 -99
- package/src/runtime/capability-inventory.ts +0 -137
- package/src/runtime/chain-parser.ts +0 -237
- package/src/runtime/chain-runner.ts +0 -606
- package/src/runtime/checkpoint.ts +0 -291
- package/src/runtime/child-pi-constants.ts +0 -42
- package/src/runtime/child-pi-kill.ts +0 -180
- package/src/runtime/child-pi-pool.ts +0 -68
- package/src/runtime/child-pi-spawn.ts +0 -287
- package/src/runtime/child-pi-steering.ts +0 -128
- package/src/runtime/child-pi-streams.ts +0 -296
- package/src/runtime/child-pi-transcript.ts +0 -169
- package/src/runtime/child-pi.ts +0 -1105
- package/src/runtime/coalesce-tasks.ts +0 -268
- package/src/runtime/code-summary.ts +0 -292
- package/src/runtime/command-trace.ts +0 -105
- package/src/runtime/compact-pipeline.ts +0 -56
- package/src/runtime/compact-stages/ansi-strip-stage.ts +0 -25
- package/src/runtime/compact-stages/blank-collapse-stage.ts +0 -31
- package/src/runtime/compact-stages/deduplicate-stage.ts +0 -34
- package/src/runtime/compact-stages/head-snap-stage.ts +0 -57
- package/src/runtime/compact-stages/index.ts +0 -23
- package/src/runtime/compact-stages/tail-capture-stage.ts +0 -77
- package/src/runtime/compact-stages/truncation-stage.ts +0 -74
- package/src/runtime/compaction-summary.ts +0 -278
- package/src/runtime/completion-guard.ts +0 -207
- package/src/runtime/concurrency.ts +0 -58
- package/src/runtime/crash-classification.ts +0 -229
- package/src/runtime/crash-recovery.ts +0 -577
- package/src/runtime/crew-agent-records.ts +0 -593
- package/src/runtime/crew-agent-runtime.ts +0 -62
- package/src/runtime/crew-broker-child.ts +0 -88
- package/src/runtime/crew-broker-client.ts +0 -673
- package/src/runtime/crew-broker-tokens.ts +0 -84
- package/src/runtime/crew-broker.ts +0 -1276
- package/src/runtime/crew-hooks.ts +0 -227
- package/src/runtime/cross-extension-rpc.ts +0 -143
- package/src/runtime/custom-tools/irc-tool.ts +0 -282
- package/src/runtime/custom-tools/submit-result-tool.ts +0 -102
- package/src/runtime/deadletter.ts +0 -47
- package/src/runtime/delivery-coordinator.ts +0 -211
- package/src/runtime/delta-conflict.ts +0 -348
- package/src/runtime/deterministic-ast.ts +0 -161
- package/src/runtime/diagnostic-export.ts +0 -171
- package/src/runtime/direct-run.ts +0 -45
- package/src/runtime/dwf-state-store.ts +0 -102
- package/src/runtime/dynamic-workflow-context.ts +0 -1016
- package/src/runtime/dynamic-workflow-runner.ts +0 -310
- package/src/runtime/effectiveness.ts +0 -90
- package/src/runtime/errors/crew-errors.ts +0 -162
- package/src/runtime/event-stream-bridge.ts +0 -98
- package/src/runtime/foreground-control.ts +0 -193
- package/src/runtime/foreground-watchdog.ts +0 -132
- package/src/runtime/global-worker-cap.ts +0 -96
- package/src/runtime/goal-achievement.ts +0 -148
- package/src/runtime/goal-evaluator.ts +0 -361
- package/src/runtime/goal-loop-runner.ts +0 -828
- package/src/runtime/goal-state-store.ts +0 -219
- package/src/runtime/green-contract.ts +0 -55
- package/src/runtime/group-join.ts +0 -267
- package/src/runtime/handoff-manager.ts +0 -598
- package/src/runtime/heartbeat-gradient.ts +0 -36
- package/src/runtime/heartbeat-watcher.ts +0 -239
- package/src/runtime/hidden-handoff.ts +0 -407
- package/src/runtime/important-line-classifier.ts +0 -140
- package/src/runtime/intercom-bridge.ts +0 -187
- package/src/runtime/iteration-hooks.ts +0 -305
- package/src/runtime/live-agent-control.ts +0 -136
- package/src/runtime/live-agent-manager.ts +0 -704
- package/src/runtime/live-control-realtime.ts +0 -56
- package/src/runtime/live-extension-bridge.ts +0 -148
- package/src/runtime/live-irc.ts +0 -97
- package/src/runtime/live-session-health.ts +0 -108
- package/src/runtime/live-session-runtime.ts +0 -1139
- package/src/runtime/loop-gates.ts +0 -128
- package/src/runtime/manifest-cache.ts +0 -375
- package/src/runtime/mcp-proxy.ts +0 -105
- package/src/runtime/metric-parser.ts +0 -36
- package/src/runtime/model-fallback.ts +0 -409
- package/src/runtime/model-resolver.ts +0 -126
- package/src/runtime/model-scope.ts +0 -158
- package/src/runtime/orphan-worker-registry.ts +0 -465
- package/src/runtime/output-validator.ts +0 -202
- package/src/runtime/overflow-recovery.ts +0 -206
- package/src/runtime/parallel-research.ts +0 -68
- package/src/runtime/parallel-utils.ts +0 -160
- package/src/runtime/parent-guard.ts +0 -134
- package/src/runtime/path-overlap.ts +0 -150
- package/src/runtime/peer-dep.ts +0 -292
- package/src/runtime/per-write-validator.ts +0 -181
- package/src/runtime/phase-progress.ts +0 -217
- package/src/runtime/phase-tracker.ts +0 -385
- package/src/runtime/pi-args.ts +0 -655
- package/src/runtime/pi-json-output.ts +0 -170
- package/src/runtime/pi-spawn.ts +0 -273
- package/src/runtime/pipeline-runner.ts +0 -523
- package/src/runtime/plan-templates.ts +0 -201
- package/src/runtime/policy-engine.ts +0 -115
- package/src/runtime/post-checks.ts +0 -142
- package/src/runtime/post-exit-stdio-guard.ts +0 -104
- package/src/runtime/process-lifecycle.ts +0 -491
- package/src/runtime/process-status.ts +0 -154
- package/src/runtime/progress-event-coalescer.ts +0 -44
- package/src/runtime/progress-tracker.ts +0 -124
- package/src/runtime/prose-compressor.ts +0 -162
- package/src/runtime/recovery-recipes.ts +0 -203
- package/src/runtime/replace.ts +0 -570
- package/src/runtime/resilient-edit.ts +0 -153
- package/src/runtime/result-extractor.ts +0 -213
- package/src/runtime/retry-executor.ts +0 -100
- package/src/runtime/retry-runner.ts +0 -336
- package/src/runtime/role-permission.ts +0 -59
- package/src/runtime/run-coalesced-task-group.ts +0 -308
- package/src/runtime/run-drift.ts +0 -219
- package/src/runtime/run-tracker.ts +0 -116
- package/src/runtime/runtime-policy.ts +0 -29
- package/src/runtime/runtime-resolver.ts +0 -172
- package/src/runtime/runtime-warmup.ts +0 -160
- package/src/runtime/scheduler.ts +0 -353
- package/src/runtime/semaphore.ts +0 -141
- package/src/runtime/sensitive-paths.ts +0 -93
- package/src/runtime/session-resources.ts +0 -25
- package/src/runtime/session-snapshot.ts +0 -59
- package/src/runtime/session-usage.ts +0 -79
- package/src/runtime/settings-store.ts +0 -155
- package/src/runtime/sidechain-output.ts +0 -35
- package/src/runtime/single-agent-compose.ts +0 -84
- package/src/runtime/skill-effectiveness.ts +0 -524
- package/src/runtime/skill-instructions.ts +0 -391
- package/src/runtime/stale-reconciler.ts +0 -680
- package/src/runtime/stream-preview.ts +0 -184
- package/src/runtime/streaming-output.ts +0 -50
- package/src/runtime/subagent-manager.ts +0 -561
- package/src/runtime/subprocess-tool-registry.ts +0 -70
- package/src/runtime/supervisor-contact.ts +0 -64
- package/src/runtime/task-display.ts +0 -52
- package/src/runtime/task-graph-scheduler.ts +0 -227
- package/src/runtime/task-graph.ts +0 -290
- package/src/runtime/task-health.ts +0 -83
- package/src/runtime/task-id.ts +0 -161
- package/src/runtime/task-output-context.ts +0 -602
- package/src/runtime/task-packet.ts +0 -268
- package/src/runtime/task-quality.ts +0 -199
- package/src/runtime/task-runner/capabilities.ts +0 -78
- package/src/runtime/task-runner/context-retrieval.ts +0 -163
- package/src/runtime/task-runner/live-executor.ts +0 -227
- package/src/runtime/task-runner/output-splitter.ts +0 -152
- package/src/runtime/task-runner/progress.ts +0 -157
- package/src/runtime/task-runner/prompt-builder.ts +0 -278
- package/src/runtime/task-runner/prompt-pipeline.ts +0 -88
- package/src/runtime/task-runner/result-utils.ts +0 -16
- package/src/runtime/task-runner/retrieval-orchestrator.ts +0 -310
- package/src/runtime/task-runner/run-projection.ts +0 -125
- package/src/runtime/task-runner/state-helpers.ts +0 -176
- package/src/runtime/task-runner/tail-read.ts +0 -34
- package/src/runtime/task-runner.ts +0 -1420
- package/src/runtime/team-runner-artifacts.ts +0 -13
- package/src/runtime/team-runner.ts +0 -1993
- package/src/runtime/tool-output-pruner.ts +0 -333
- package/src/runtime/tool-progress.ts +0 -278
- package/src/runtime/usage-tracker.ts +0 -73
- package/src/runtime/verification-gates.ts +0 -571
- package/src/runtime/verification-integrity.ts +0 -105
- package/src/runtime/verification-worktree.ts +0 -186
- package/src/runtime/worker-heartbeat.ts +0 -25
- package/src/runtime/worker-startup.ts +0 -83
- package/src/runtime/workflow-state.ts +0 -195
- package/src/runtime/workspace-lock.ts +0 -443
- package/src/runtime/workspace-tree.ts +0 -312
- package/src/runtime/yield-handler.ts +0 -224
- package/src/runtime/zombie-scanner.ts +0 -298
- package/src/schema/config-schema.ts +0 -327
- package/src/schema/team-tool-schema.ts +0 -415
- package/src/schema/validation-types.ts +0 -159
- package/src/skills/discover-skills.ts +0 -197
- package/src/skills/skill-templates.ts +0 -456
- package/src/skills/validate.ts +0 -285
- package/src/state/active-run-registry.ts +0 -439
- package/src/state/artifact-store.ts +0 -176
- package/src/state/atomic-write.ts +0 -903
- package/src/state/blob-store.ts +0 -308
- package/src/state/contracts.ts +0 -158
- package/src/state/crew-init.ts +0 -269
- package/src/state/decision-ledger.ts +0 -345
- package/src/state/event-log-rotation.ts +0 -342
- package/src/state/event-log.ts +0 -1311
- package/src/state/event-reconstructor.ts +0 -229
- package/src/state/gitignore-manager.ts +0 -46
- package/src/state/health-store.ts +0 -79
- package/src/state/hook-instinct-bridge.ts +0 -94
- package/src/state/hook-integrations.ts +0 -51
- package/src/state/instinct-store.ts +0 -275
- package/src/state/jsonl-writer.ts +0 -107
- package/src/state/locks.ts +0 -562
- package/src/state/mailbox.ts +0 -916
- package/src/state/observation-store.ts +0 -176
- package/src/state/run-cache.ts +0 -193
- package/src/state/run-graph.ts +0 -183
- package/src/state/run-metrics.ts +0 -165
- package/src/state/schedule.ts +0 -166
- package/src/state/session-state-map.ts +0 -51
- package/src/state/state-store.ts +0 -958
- package/src/state/task-claims.ts +0 -61
- package/src/state/tiered-eval.ts +0 -480
- package/src/state/types-eval.ts +0 -58
- package/src/state/types.ts +0 -440
- package/src/state/usage.ts +0 -138
- package/src/state/worker-atomic-writer.ts +0 -194
- package/src/subagents/async-entry.ts +0 -1
- package/src/subagents/index.ts +0 -3
- package/src/subagents/live/control.ts +0 -1
- package/src/subagents/live/manager.ts +0 -1
- package/src/subagents/live/realtime.ts +0 -1
- package/src/subagents/live/session-runtime.ts +0 -1
- package/src/subagents/manager.ts +0 -1
- package/src/subagents/spawn.ts +0 -1
- package/src/teams/discover-teams.ts +0 -187
- package/src/teams/team-config.ts +0 -27
- package/src/teams/team-serializer.ts +0 -38
- package/src/tools/safe-bash-extension.ts +0 -54
- package/src/tools/safe-bash.ts +0 -505
- package/src/types/diff.d.ts +0 -18
- package/src/types/new-api-types.ts +0 -35
- package/src/ui/agent-management-overlay.ts +0 -160
- package/src/ui/card-colors.ts +0 -139
- package/src/ui/crew-footer.ts +0 -102
- package/src/ui/crew-select-list.ts +0 -111
- package/src/ui/dashboard-panes/agents-pane.ts +0 -164
- package/src/ui/dashboard-panes/cancellation-pane.ts +0 -66
- package/src/ui/dashboard-panes/capability-pane.ts +0 -77
- package/src/ui/dashboard-panes/health-pane.ts +0 -31
- package/src/ui/dashboard-panes/mailbox-pane.ts +0 -35
- package/src/ui/dashboard-panes/metrics-pane.ts +0 -37
- package/src/ui/dashboard-panes/progress-pane.ts +0 -38
- package/src/ui/dashboard-panes/transcript-pane.ts +0 -10
- package/src/ui/deploy-bundled-themes.ts +0 -71
- package/src/ui/dwf-phase-display.ts +0 -151
- package/src/ui/dynamic-border.ts +0 -35
- package/src/ui/heartbeat-aggregator.ts +0 -74
- package/src/ui/key-utils.ts +0 -42
- package/src/ui/keybinding-map.ts +0 -248
- package/src/ui/layout-primitives.ts +0 -106
- package/src/ui/live-conversation-overlay.ts +0 -183
- package/src/ui/live-duration.ts +0 -55
- package/src/ui/live-run-sidebar.ts +0 -301
- package/src/ui/loaders.ts +0 -176
- package/src/ui/mascot.ts +0 -436
- package/src/ui/overlays/agent-picker-overlay.ts +0 -65
- package/src/ui/overlays/confirm-overlay.ts +0 -60
- package/src/ui/overlays/help-overlay.ts +0 -177
- package/src/ui/overlays/mailbox-compose-overlay.ts +0 -181
- package/src/ui/overlays/mailbox-compose-preview.ts +0 -78
- package/src/ui/overlays/mailbox-detail-overlay.ts +0 -154
- package/src/ui/pi-ui-compat.ts +0 -68
- package/src/ui/powerbar-publisher.ts +0 -459
- package/src/ui/render-coalescer.ts +0 -101
- package/src/ui/render-diff.ts +0 -160
- package/src/ui/render-scheduler.ts +0 -224
- package/src/ui/run-action-dispatcher.ts +0 -182
- package/src/ui/run-dashboard.ts +0 -913
- package/src/ui/run-event-bus.ts +0 -381
- package/src/ui/run-snapshot-cache.ts +0 -1057
- package/src/ui/settings-overlay.ts +0 -1067
- package/src/ui/snapshot-types.ts +0 -90
- package/src/ui/spinner.ts +0 -17
- package/src/ui/status-colors.ts +0 -143
- package/src/ui/syntax-highlight.ts +0 -136
- package/src/ui/terminal-status.ts +0 -269
- package/src/ui/theme-adapter.ts +0 -271
- package/src/ui/theme-discovery.ts +0 -199
- package/src/ui/tool-progress-formatter.ts +0 -93
- package/src/ui/tool-render.ts +0 -453
- package/src/ui/tool-renderers/brief-mode.ts +0 -225
- package/src/ui/tool-renderers/index.ts +0 -726
- package/src/ui/transcript-cache.ts +0 -128
- package/src/ui/transcript-entries.ts +0 -256
- package/src/ui/transcript-viewer.ts +0 -424
- package/src/ui/widget/index.ts +0 -357
- package/src/ui/widget/widget-formatters.ts +0 -182
- package/src/ui/widget/widget-model.ts +0 -110
- package/src/ui/widget/widget-renderer.ts +0 -182
- package/src/ui/widget/widget-types.ts +0 -36
- package/src/utils/bm25-search.ts +0 -235
- package/src/utils/completion-dedupe.ts +0 -63
- package/src/utils/conflict-detect.ts +0 -668
- package/src/utils/env-allowlist.ts +0 -30
- package/src/utils/env-filter.ts +0 -155
- package/src/utils/file-coalescer.ts +0 -98
- package/src/utils/fingerprint.ts +0 -180
- package/src/utils/frontmatter.ts +0 -70
- package/src/utils/fs-watch.ts +0 -37
- package/src/utils/gh-protocol.ts +0 -556
- package/src/utils/git.ts +0 -260
- package/src/utils/guards.ts +0 -107
- package/src/utils/ids.ts +0 -24
- package/src/utils/incremental-reader.ts +0 -220
- package/src/utils/internal-error.ts +0 -10
- package/src/utils/names.ts +0 -36
- package/src/utils/ndjson.ts +0 -115
- package/src/utils/paths.ts +0 -227
- package/src/utils/project-detector.ts +0 -160
- package/src/utils/redaction.ts +0 -347
- package/src/utils/resolve-shell.ts +0 -36
- package/src/utils/run-watcher-registry.ts +0 -152
- package/src/utils/safe-paths.ts +0 -383
- package/src/utils/scan-cache.ts +0 -144
- package/src/utils/session-utils.ts +0 -110
- package/src/utils/sleep.ts +0 -54
- package/src/utils/socket-path.ts +0 -127
- package/src/utils/sse-parser.ts +0 -129
- package/src/utils/task-name-generator.ts +0 -337
- package/src/utils/timings.ts +0 -33
- package/src/utils/token-counter.ts +0 -200
- package/src/utils/visual.ts +0 -207
- package/src/workflows/cost-estimator.ts +0 -34
- package/src/workflows/discover-workflows.ts +0 -290
- package/src/workflows/intermediate-store.ts +0 -166
- package/src/workflows/preflight-validator.ts +0 -168
- package/src/workflows/topology-analyzer.ts +0 -203
- package/src/workflows/validate-workflow.ts +0 -50
- package/src/workflows/workflow-config.ts +0 -70
- package/src/workflows/workflow-serializer.ts +0 -32
- package/src/worktree/branch-freshness.ts +0 -112
- package/src/worktree/cleanup.ts +0 -341
- 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
|
-
}
|