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,52 +0,0 @@
|
|
|
1
|
-
import type { TeamRunManifest, TeamTaskState } from "../state/types.ts";
|
|
2
|
-
import { recordFromTask } from "./crew-agent-records.ts";
|
|
3
|
-
import type { CrewAgentRecord, CrewRuntimeKind } from "./crew-agent-runtime.ts";
|
|
4
|
-
|
|
5
|
-
export function shouldMaterializeAgent(task: TeamTaskState): boolean {
|
|
6
|
-
return task.status !== "queued" && task.status !== "skipped";
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export function recordsForMaterializedTasks(
|
|
10
|
-
manifest: TeamRunManifest,
|
|
11
|
-
tasks: TeamTaskState[],
|
|
12
|
-
runtime: CrewRuntimeKind,
|
|
13
|
-
): CrewAgentRecord[] {
|
|
14
|
-
return tasks.filter(shouldMaterializeAgent).map((task) => recordFromTask(manifest, task, runtime));
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export function taskById(tasks: TeamTaskState[]): Map<string, TeamTaskState> {
|
|
18
|
-
const map = new Map<string, TeamTaskState>();
|
|
19
|
-
for (const task of tasks) {
|
|
20
|
-
map.set(task.id, task);
|
|
21
|
-
if (task.stepId) map.set(task.stepId, task);
|
|
22
|
-
}
|
|
23
|
-
return map;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function waitingReason(task: TeamTaskState, tasks: TeamTaskState[]): string | undefined {
|
|
27
|
-
if (task.status !== "queued") return undefined;
|
|
28
|
-
const byId = taskById(tasks);
|
|
29
|
-
const waiting = task.dependsOn.map((id) => byId.get(id)?.id ?? id).filter((id) => byId.get(id)?.status !== "completed");
|
|
30
|
-
if (waiting.length === 0) return "ready";
|
|
31
|
-
return `waiting for ${waiting.join(", ")}`;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function formatTaskGraphLines(tasks: TeamTaskState[]): string[] {
|
|
35
|
-
if (tasks.length === 0) return ["- (none)"];
|
|
36
|
-
return tasks.map((task) => {
|
|
37
|
-
const icon =
|
|
38
|
-
task.status === "completed"
|
|
39
|
-
? "✓"
|
|
40
|
-
: task.status === "running"
|
|
41
|
-
? "⠋"
|
|
42
|
-
: task.status === "failed"
|
|
43
|
-
? "✗"
|
|
44
|
-
: task.status === "cancelled" || task.status === "skipped"
|
|
45
|
-
? "■"
|
|
46
|
-
: task.status === "needs_attention"
|
|
47
|
-
? "⚠"
|
|
48
|
-
: "◦";
|
|
49
|
-
const wait = waitingReason(task, tasks);
|
|
50
|
-
return `- ${icon} ${task.id} [${task.status}] ${task.role}->${task.agent}${wait && wait !== "ready" ? ` (${wait})` : ""}`;
|
|
51
|
-
});
|
|
52
|
-
}
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
import type { TeamTaskState } from "../state/types.ts";
|
|
2
|
-
|
|
3
|
-
export interface TaskGraphSchedulerSnapshot {
|
|
4
|
-
ready: string[];
|
|
5
|
-
blocked: string[];
|
|
6
|
-
running: string[];
|
|
7
|
-
done: string[];
|
|
8
|
-
failed: string[];
|
|
9
|
-
cancelled: string[];
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface TaskGraphIndex {
|
|
13
|
-
doneSteps: Set<string>;
|
|
14
|
-
idMap: Map<string, TeamTaskState>;
|
|
15
|
-
stepToTaskId: Map<string, string>;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* P14 (perf): identity-keyed memoization for `buildTaskGraphIndex`. The 3
|
|
20
|
-
* data structures built here (doneSteps Set, idMap Map, stepToTaskId Map) are
|
|
21
|
-
* a function of the task list alone — if the caller passes the SAME array
|
|
22
|
-
* reference twice (e.g., across `refreshTaskGraphQueues` -> `getReadyTasks`
|
|
23
|
-
* rounds within one main-loop iteration before any new tasks land), we can
|
|
24
|
-
* reuse the cached index. The cache is invalidated naturally by a new array
|
|
25
|
-
* reference (e.g., the result of `markTaskRunning` / `markTaskDone`).
|
|
26
|
-
*
|
|
27
|
-
* Memozation is a WeakMap so a stale reference is collected when the array
|
|
28
|
-
* goes out of scope — no manual invalidation needed, no unbounded growth.
|
|
29
|
-
*/
|
|
30
|
-
const taskGraphIndexCache = new WeakMap<TeamTaskState[], TaskGraphIndex>();
|
|
31
|
-
|
|
32
|
-
export function buildTaskGraphIndex(tasks: TeamTaskState[]): TaskGraphIndex {
|
|
33
|
-
const cached = taskGraphIndexCache.get(tasks);
|
|
34
|
-
if (cached) return cached;
|
|
35
|
-
const fresh: TaskGraphIndex = {
|
|
36
|
-
doneSteps: new Set(
|
|
37
|
-
tasks
|
|
38
|
-
.filter((task) => task.status === "completed")
|
|
39
|
-
.map((task) => task.stepId)
|
|
40
|
-
.filter((id): id is string => id !== undefined),
|
|
41
|
-
),
|
|
42
|
-
idMap: new Map(tasks.map((task) => [task.id, task])),
|
|
43
|
-
stepToTaskId: new Map(
|
|
44
|
-
tasks.map((task) => [task.stepId, task.id]).filter((entry): entry is [string, string] => entry[0] !== undefined),
|
|
45
|
-
),
|
|
46
|
-
};
|
|
47
|
-
taskGraphIndexCache.set(tasks, fresh);
|
|
48
|
-
return fresh;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/** Test/diagnostic helper — invalidate the WeakMap-backed index cache. Not
|
|
52
|
-
* used by production code paths; the WeakMap self-invalidates when a tasks
|
|
53
|
-
* array goes out of scope. Provided for parity with `clearStablePrefixCache`. */
|
|
54
|
-
export function clearTaskGraphIndexCache(): void {
|
|
55
|
-
// WeakMap has no `.clear()`; rely on GC. Exposed as a no-op stub so callers
|
|
56
|
-
// that import `clearStablePrefixCache` (also a no-op stub for symmetry) can
|
|
57
|
-
// adopt a parallel API if needed in the future. Documented as no-op rather
|
|
58
|
-
// than removed so the API stays discoverable.
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function taskById(tasks: TeamTaskState[]): Map<string, TeamTaskState> {
|
|
62
|
-
return new Map(tasks.map((task) => [task.id, task]));
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function dependencySatisfied(
|
|
66
|
-
task: TeamTaskState,
|
|
67
|
-
doneStepIds: Set<string>,
|
|
68
|
-
idMap: Map<string, TeamTaskState>,
|
|
69
|
-
stepMap: Map<string, string>,
|
|
70
|
-
): boolean {
|
|
71
|
-
return task.dependsOn.every((dependency) => {
|
|
72
|
-
if (doneStepIds.has(dependency)) return true;
|
|
73
|
-
const taskId = stepMap.get(dependency) ?? dependency;
|
|
74
|
-
return idMap.get(taskId)?.status === "completed";
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function withQueue(task: TeamTaskState, index: TaskGraphIndex): TeamTaskState {
|
|
79
|
-
let resolvedQueue: "ready" | "blocked" | "running" | "done";
|
|
80
|
-
if (task.status === "queued") {
|
|
81
|
-
const isReady = dependencySatisfied(task, index.doneSteps, index.idMap, index.stepToTaskId);
|
|
82
|
-
resolvedQueue = isReady ? "ready" : "blocked";
|
|
83
|
-
} else if (task.status === "running") {
|
|
84
|
-
resolvedQueue = "running";
|
|
85
|
-
} else if (task.status === "completed" || task.status === "skipped" || task.status === "needs_attention") {
|
|
86
|
-
resolvedQueue = "done";
|
|
87
|
-
} else {
|
|
88
|
-
resolvedQueue = "blocked";
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// FIX (incremental task graph refresh): return the SAME task reference when
|
|
92
|
-
// the computed queue already matches task.graph.queue. This eliminates the
|
|
93
|
-
// per-task per-call spread allocation that previously ran on every
|
|
94
|
-
// refreshTaskGraphQueues invocation. Common case (queue unchanged from the
|
|
95
|
-
// previous refresh) is now allocation-free; reference-stable tasks also let
|
|
96
|
-
// downstream selectors skip re-rendering when queues haven't moved.
|
|
97
|
-
if (task.graph && task.graph.queue === resolvedQueue) {
|
|
98
|
-
return task;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return {
|
|
102
|
-
...task,
|
|
103
|
-
graph: task.graph ? { ...task.graph, queue: resolvedQueue } : task.graph,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
function ensureIndex(tasks: TeamTaskState[], index?: TaskGraphIndex): TaskGraphIndex {
|
|
108
|
-
return index ?? buildTaskGraphIndex(tasks);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export function refreshTaskGraphQueues(tasks: TeamTaskState[], index?: TaskGraphIndex): TeamTaskState[] {
|
|
112
|
-
const resolved = ensureIndex(tasks, index);
|
|
113
|
-
return tasks.map((task) => withQueue(task, resolved));
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
export function getReadyTasks(tasks: TeamTaskState[], maxCount = 1, index?: TaskGraphIndex): TeamTaskState[] {
|
|
117
|
-
return refreshTaskGraphQueues(tasks, index)
|
|
118
|
-
.filter((task) => task.status === "queued" && task.graph?.queue === "ready")
|
|
119
|
-
.slice(0, Math.max(0, maxCount));
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
export function markTaskRunning(tasks: TeamTaskState[], taskId: string, now = new Date(), index?: TaskGraphIndex): TeamTaskState[] {
|
|
123
|
-
const resolved = ensureIndex(tasks, index);
|
|
124
|
-
return refreshTaskGraphQueues(tasks, resolved).map((task) =>
|
|
125
|
-
task.id === taskId
|
|
126
|
-
? withQueue(
|
|
127
|
-
{
|
|
128
|
-
...task,
|
|
129
|
-
status: "running",
|
|
130
|
-
startedAt: task.startedAt ?? now.toISOString(),
|
|
131
|
-
},
|
|
132
|
-
resolved,
|
|
133
|
-
)
|
|
134
|
-
: task,
|
|
135
|
-
);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
export function markTaskDone(tasks: TeamTaskState[], taskId: string, now = new Date(), index?: TaskGraphIndex): TeamTaskState[] {
|
|
139
|
-
const resolved = ensureIndex(tasks, index);
|
|
140
|
-
return refreshTaskGraphQueues(
|
|
141
|
-
tasks.map((task) =>
|
|
142
|
-
task.id === taskId
|
|
143
|
-
? {
|
|
144
|
-
...task,
|
|
145
|
-
status: "completed",
|
|
146
|
-
finishedAt: task.finishedAt ?? now.toISOString(),
|
|
147
|
-
}
|
|
148
|
-
: task,
|
|
149
|
-
),
|
|
150
|
-
resolved,
|
|
151
|
-
);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
export function cancelTaskSubtree(
|
|
155
|
-
tasks: TeamTaskState[],
|
|
156
|
-
rootTaskId: string,
|
|
157
|
-
reason = "Cancelled by task graph scheduler.",
|
|
158
|
-
now = new Date(),
|
|
159
|
-
): TeamTaskState[] {
|
|
160
|
-
const ids = taskById(tasks);
|
|
161
|
-
const toCancel = new Set<string>();
|
|
162
|
-
const stack = [rootTaskId];
|
|
163
|
-
while (stack.length) {
|
|
164
|
-
const current = stack.pop();
|
|
165
|
-
if (!current || toCancel.has(current)) continue;
|
|
166
|
-
toCancel.add(current);
|
|
167
|
-
const task = ids.get(current);
|
|
168
|
-
for (const child of task?.graph?.children ?? []) stack.push(child);
|
|
169
|
-
}
|
|
170
|
-
return refreshTaskGraphQueues(
|
|
171
|
-
tasks.map((task) => {
|
|
172
|
-
if (!toCancel.has(task.id)) return task;
|
|
173
|
-
if (task.status === "completed") return task;
|
|
174
|
-
return {
|
|
175
|
-
...task,
|
|
176
|
-
status: "cancelled",
|
|
177
|
-
error: reason,
|
|
178
|
-
finishedAt: task.finishedAt ?? now.toISOString(),
|
|
179
|
-
};
|
|
180
|
-
}),
|
|
181
|
-
);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
export function failTaskAndBlockChildren(tasks: TeamTaskState[], rootTaskId: string, reason: string, now = new Date()): TeamTaskState[] {
|
|
185
|
-
const ids = taskById(tasks);
|
|
186
|
-
const blocked = new Set<string>();
|
|
187
|
-
const root = ids.get(rootTaskId);
|
|
188
|
-
const stack = [...(root?.graph?.children ?? [])];
|
|
189
|
-
while (stack.length) {
|
|
190
|
-
const current = stack.pop();
|
|
191
|
-
if (!current || blocked.has(current)) continue;
|
|
192
|
-
blocked.add(current);
|
|
193
|
-
const task = ids.get(current);
|
|
194
|
-
for (const child of task?.graph?.children ?? []) stack.push(child);
|
|
195
|
-
}
|
|
196
|
-
return refreshTaskGraphQueues(
|
|
197
|
-
tasks.map((task) => {
|
|
198
|
-
if (task.id === rootTaskId)
|
|
199
|
-
return {
|
|
200
|
-
...task,
|
|
201
|
-
status: "failed",
|
|
202
|
-
error: reason,
|
|
203
|
-
finishedAt: task.finishedAt ?? now.toISOString(),
|
|
204
|
-
};
|
|
205
|
-
if (blocked.has(task.id) && task.status === "queued")
|
|
206
|
-
return {
|
|
207
|
-
...task,
|
|
208
|
-
status: "skipped",
|
|
209
|
-
error: `Blocked by failed task '${rootTaskId}'.`,
|
|
210
|
-
finishedAt: task.finishedAt ?? now.toISOString(),
|
|
211
|
-
};
|
|
212
|
-
return task;
|
|
213
|
-
}),
|
|
214
|
-
);
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
export function taskGraphSnapshot(tasks: TeamTaskState[], index?: TaskGraphIndex): TaskGraphSchedulerSnapshot {
|
|
218
|
-
const refreshed = refreshTaskGraphQueues(tasks, index);
|
|
219
|
-
return {
|
|
220
|
-
ready: refreshed.filter((task) => task.status === "queued" && task.graph?.queue === "ready").map((task) => task.id),
|
|
221
|
-
blocked: refreshed.filter((task) => task.status === "queued" && task.graph?.queue === "blocked").map((task) => task.id),
|
|
222
|
-
running: refreshed.filter((task) => task.status === "running").map((task) => task.id),
|
|
223
|
-
done: refreshed.filter((task) => task.status === "completed" || task.status === "skipped").map((task) => task.id),
|
|
224
|
-
failed: refreshed.filter((task) => task.status === "failed").map((task) => task.id),
|
|
225
|
-
cancelled: refreshed.filter((task) => task.status === "cancelled").map((task) => task.id),
|
|
226
|
-
};
|
|
227
|
-
}
|
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DAG-based task execution order calculator.
|
|
3
|
-
*
|
|
4
|
-
* Uses Kahn's algorithm for topological sort and DFS for cycle detection.
|
|
5
|
-
* Groups tasks into parallel "waves" where all tasks in wave N can run
|
|
6
|
-
* concurrently and wave N+1 depends on at least one task in wave N.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
/** A lightweight node representation for the execution DAG. */
|
|
10
|
-
export interface TaskNode {
|
|
11
|
-
id: string;
|
|
12
|
-
dependsOn: string[];
|
|
13
|
-
phase?: string;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/** A group of tasks that can all run in parallel. */
|
|
17
|
-
export interface ExecutionWave {
|
|
18
|
-
index: number;
|
|
19
|
-
taskIds: string[];
|
|
20
|
-
label?: string;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/** The full execution plan produced by topological sort. */
|
|
24
|
-
export interface ExecutionPlan {
|
|
25
|
-
waves: ExecutionWave[];
|
|
26
|
-
hasCycle: boolean;
|
|
27
|
-
cycleNodes?: string[];
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Build an execution plan from a flat list of task nodes using Kahn's algorithm.
|
|
32
|
-
*
|
|
33
|
-
* - Tasks with empty `dependsOn` go into wave 0.
|
|
34
|
-
* - Each subsequent wave contains tasks whose dependencies are all in earlier waves.
|
|
35
|
-
* - If all tasks have empty `dependsOn`, they all go into wave 0 (backward compatible).
|
|
36
|
-
* - If a cycle is detected, `hasCycle` is true and `cycleNodes` lists the involved IDs.
|
|
37
|
-
*
|
|
38
|
-
* @throws Error if a task depends on itself (self-dependency).
|
|
39
|
-
*/
|
|
40
|
-
export function buildExecutionPlan(tasks: TaskNode[]): ExecutionPlan {
|
|
41
|
-
if (tasks.length === 0) {
|
|
42
|
-
return { waves: [], hasCycle: false };
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// HIGH-9: Detect self-dependency
|
|
46
|
-
for (const task of tasks) {
|
|
47
|
-
if (task.dependsOn.includes(task.id)) {
|
|
48
|
-
throw new Error(`Task "${task.id}" has self-dependency (depends on itself)`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const idSet = new Set<string>(tasks.map((t) => t.id));
|
|
53
|
-
const adjacency = new Map<string, Set<string>>(); // id -> ids that depend on it
|
|
54
|
-
const inDegree = new Map<string, number>();
|
|
55
|
-
|
|
56
|
-
for (const task of tasks) {
|
|
57
|
-
adjacency.set(task.id, new Set<string>());
|
|
58
|
-
inDegree.set(task.id, 0);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
for (const task of tasks) {
|
|
62
|
-
let degree = 0;
|
|
63
|
-
for (const dep of task.dependsOn) {
|
|
64
|
-
if (!idSet.has(dep)) continue; // ignore unknown deps
|
|
65
|
-
adjacency.get(dep)!.add(task.id);
|
|
66
|
-
degree++;
|
|
67
|
-
}
|
|
68
|
-
inDegree.set(task.id, degree);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Kahn's algorithm with wave grouping
|
|
72
|
-
const waves: ExecutionWave[] = [];
|
|
73
|
-
const assigned = new Set<string>();
|
|
74
|
-
let currentWaveIds = tasks.filter((t) => inDegree.get(t.id) === 0).map((t) => t.id);
|
|
75
|
-
|
|
76
|
-
let waveIndex = 0;
|
|
77
|
-
while (currentWaveIds.length > 0) {
|
|
78
|
-
for (const id of currentWaveIds) assigned.add(id);
|
|
79
|
-
|
|
80
|
-
const wave = buildWave(tasks, currentWaveIds, waveIndex);
|
|
81
|
-
waves.push(wave);
|
|
82
|
-
|
|
83
|
-
// Decrement in-degrees for dependents
|
|
84
|
-
const nextWaveCandidates = new Set<string>();
|
|
85
|
-
for (const id of currentWaveIds) {
|
|
86
|
-
for (const dependent of adjacency.get(id) ?? []) {
|
|
87
|
-
const current = inDegree.get(dependent)!;
|
|
88
|
-
inDegree.set(dependent, current - 1);
|
|
89
|
-
if (current - 1 === 0) nextWaveCandidates.add(dependent);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
currentWaveIds = [...nextWaveCandidates];
|
|
94
|
-
waveIndex++;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Detect cycle: if not all tasks were assigned, remaining ones form cycles
|
|
98
|
-
if (assigned.size < tasks.length) {
|
|
99
|
-
const cycleNodes = tasks.filter((t) => !assigned.has(t.id)).map((t) => t.id);
|
|
100
|
-
return {
|
|
101
|
-
waves,
|
|
102
|
-
hasCycle: true,
|
|
103
|
-
cycleNodes,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
return { waves, hasCycle: false };
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Derive the phase label for a wave. If all tasks in the wave share the same
|
|
112
|
-
* `phase` value, use it as the wave label; otherwise leave it undefined.
|
|
113
|
-
*/
|
|
114
|
-
function buildWave(tasks: TaskNode[], ids: string[], index: number): ExecutionWave {
|
|
115
|
-
const taskMap = new Map(tasks.map((t) => [t.id, t]));
|
|
116
|
-
// MEDIUM-12: Filter out undefined values instead of using non-null assertion
|
|
117
|
-
const waveTasks = ids.map((id) => taskMap.get(id)).filter(Boolean) as TaskNode[];
|
|
118
|
-
|
|
119
|
-
let label: string | undefined;
|
|
120
|
-
if (waveTasks.length > 0 && waveTasks.every((t) => t.phase !== undefined)) {
|
|
121
|
-
const phases = new Set(waveTasks.map((t) => t.phase));
|
|
122
|
-
if (phases.size === 1) label = [...phases][0];
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
return { index, taskIds: ids, label };
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Return the IDs of tasks that are ready to run given a set of completed tasks.
|
|
130
|
-
*
|
|
131
|
-
* A task is "ready" when all its dependencies are in `completedTaskIds` AND
|
|
132
|
-
* it has not already been completed itself. Returns tasks from the earliest
|
|
133
|
-
* wave that still has uncompleted tasks.
|
|
134
|
-
*/
|
|
135
|
-
export function getReadyTasks(plan: ExecutionPlan, completedTaskIds: Set<string>): string[] {
|
|
136
|
-
if (plan.hasCycle || plan.waves.length === 0) return [];
|
|
137
|
-
|
|
138
|
-
const completed = completedTaskIds;
|
|
139
|
-
|
|
140
|
-
for (const wave of plan.waves) {
|
|
141
|
-
// All tasks in prior waves must be completed for this wave to be ready
|
|
142
|
-
const priorWavesComplete = plan.waves.slice(0, wave.index).every((w) => w.taskIds.every((id) => completed.has(id)));
|
|
143
|
-
|
|
144
|
-
if (!priorWavesComplete) continue;
|
|
145
|
-
|
|
146
|
-
// Filter to tasks not already completed
|
|
147
|
-
const ready = wave.taskIds.filter((id) => !completed.has(id));
|
|
148
|
-
if (ready.length > 0) return ready;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
return [];
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Detect all cycles in the task graph using DFS.
|
|
156
|
-
*
|
|
157
|
-
* Returns an array of cycles, where each cycle is represented as an array of
|
|
158
|
-
* task IDs forming a path from a node back to itself.
|
|
159
|
-
*/
|
|
160
|
-
export function detectCycles(tasks: TaskNode[]): string[][] {
|
|
161
|
-
if (tasks.length === 0) return [];
|
|
162
|
-
|
|
163
|
-
const idSet = new Set<string>(tasks.map((t) => t.id));
|
|
164
|
-
const adjacency = new Map<string, string[]>();
|
|
165
|
-
for (const task of tasks) {
|
|
166
|
-
adjacency.set(
|
|
167
|
-
task.id,
|
|
168
|
-
task.dependsOn.filter((dep) => idSet.has(dep)),
|
|
169
|
-
);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
const WHITE = 0;
|
|
173
|
-
const GRAY = 1;
|
|
174
|
-
const BLACK = 2;
|
|
175
|
-
|
|
176
|
-
const color = new Map<string, number>();
|
|
177
|
-
for (const task of tasks) color.set(task.id, WHITE);
|
|
178
|
-
|
|
179
|
-
const cycles: string[][] = [];
|
|
180
|
-
const path: string[] = [];
|
|
181
|
-
|
|
182
|
-
function dfs(nodeId: string): void {
|
|
183
|
-
color.set(nodeId, GRAY);
|
|
184
|
-
path.push(nodeId);
|
|
185
|
-
|
|
186
|
-
const deps = adjacency.get(nodeId) ?? [];
|
|
187
|
-
for (const dep of deps) {
|
|
188
|
-
const depColor = color.get(dep);
|
|
189
|
-
if (depColor === GRAY) {
|
|
190
|
-
// Found a cycle: extract the path from dep to current node
|
|
191
|
-
const cycleStart = path.indexOf(dep);
|
|
192
|
-
if (cycleStart >= 0) {
|
|
193
|
-
cycles.push(path.slice(cycleStart));
|
|
194
|
-
}
|
|
195
|
-
} else if (depColor === WHITE) {
|
|
196
|
-
dfs(dep);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
path.pop();
|
|
201
|
-
color.set(nodeId, BLACK);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
for (const task of tasks) {
|
|
205
|
-
if (color.get(task.id) === WHITE) {
|
|
206
|
-
dfs(task.id);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
return cycles;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Find tasks that are blocked (not completed, have incomplete dependencies).
|
|
215
|
-
*
|
|
216
|
-
* Pattern origin: pi-blueprint dependency-graph.ts findBlockedTasks()
|
|
217
|
-
*
|
|
218
|
-
* @param tasks - All task nodes
|
|
219
|
-
* @param completedIds - Set of completed task IDs
|
|
220
|
-
* @returns Array of blocked task IDs
|
|
221
|
-
*/
|
|
222
|
-
export function findBlockedTasks(tasks: TaskNode[], completedIds: Set<string>): string[] {
|
|
223
|
-
return tasks
|
|
224
|
-
.filter((t) => !completedIds.has(t.id))
|
|
225
|
-
.filter((t) => t.dependsOn.some((dep) => !completedIds.has(dep)))
|
|
226
|
-
.map((t) => t.id);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Get specific incomplete dependencies blocking a task.
|
|
231
|
-
*
|
|
232
|
-
* Pattern origin: pi-blueprint dependency-graph.ts getBlockingTasks()
|
|
233
|
-
*
|
|
234
|
-
* @param tasks - All task nodes
|
|
235
|
-
* @param taskId - The task to check
|
|
236
|
-
* @param completedIds - Set of completed task IDs
|
|
237
|
-
* @returns Array of blocking task IDs
|
|
238
|
-
*/
|
|
239
|
-
export function getBlockingTasks(tasks: TaskNode[], taskId: string, completedIds: Set<string>): string[] {
|
|
240
|
-
const task = tasks.find((t) => t.id === taskId);
|
|
241
|
-
if (!task) return [];
|
|
242
|
-
return task.dependsOn.filter((dep) => !completedIds.has(dep));
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Topological sort using Kahn's BFS algorithm.
|
|
247
|
-
*
|
|
248
|
-
* Pattern origin: pi-blueprint dependency-graph.ts topologicalSort()
|
|
249
|
-
*
|
|
250
|
-
* @param tasks - All task nodes
|
|
251
|
-
* @returns Ordered array of task IDs (dependencies first)
|
|
252
|
-
*/
|
|
253
|
-
export function topologicalSort(tasks: TaskNode[]): string[] {
|
|
254
|
-
if (tasks.length === 0) return [];
|
|
255
|
-
|
|
256
|
-
const idSet = new Set(tasks.map((t) => t.id));
|
|
257
|
-
const inDegree = new Map<string, number>();
|
|
258
|
-
const adjacency = new Map<string, string[]>();
|
|
259
|
-
|
|
260
|
-
for (const task of tasks) {
|
|
261
|
-
inDegree.set(task.id, 0);
|
|
262
|
-
adjacency.set(task.id, []);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
for (const task of tasks) {
|
|
266
|
-
for (const dep of task.dependsOn) {
|
|
267
|
-
if (!idSet.has(dep)) continue;
|
|
268
|
-
adjacency.get(dep)!.push(task.id);
|
|
269
|
-
inDegree.set(task.id, (inDegree.get(task.id) ?? 0) + 1);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
const queue: string[] = [];
|
|
274
|
-
for (const [id, deg] of inDegree) {
|
|
275
|
-
if (deg === 0) queue.push(id);
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
const result: string[] = [];
|
|
279
|
-
while (queue.length > 0) {
|
|
280
|
-
const id = queue.shift()!;
|
|
281
|
-
result.push(id);
|
|
282
|
-
for (const dependent of adjacency.get(id) ?? []) {
|
|
283
|
-
const deg = inDegree.get(dependent)! - 1;
|
|
284
|
-
inDegree.set(dependent, deg);
|
|
285
|
-
if (deg === 0) queue.push(dependent);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
return result;
|
|
290
|
-
}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
export type HealthGrade = "A" | "B" | "C" | "D" | "F";
|
|
2
|
-
|
|
3
|
-
export interface HealthPenalty {
|
|
4
|
-
reason: string;
|
|
5
|
-
deduction: number;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export interface HealthDelta {
|
|
9
|
-
metric: string;
|
|
10
|
-
delta: number;
|
|
11
|
-
trend: "improving" | "degrading" | "stable";
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface RunHealth {
|
|
15
|
-
score: number;
|
|
16
|
-
grade: HealthGrade;
|
|
17
|
-
penalties: HealthPenalty[];
|
|
18
|
-
deltas: HealthDelta[];
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const STALLED_THRESHOLD_MS = 5 * 60 * 1000;
|
|
22
|
-
|
|
23
|
-
export function scoreToGrade(score: number): HealthGrade {
|
|
24
|
-
if (score >= 90) return "A";
|
|
25
|
-
if (score >= 70) return "B";
|
|
26
|
-
if (score >= 50) return "C";
|
|
27
|
-
if (score >= 30) return "D";
|
|
28
|
-
return "F";
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface TaskSummary {
|
|
32
|
-
id: string;
|
|
33
|
-
status: string;
|
|
34
|
-
stalledSince?: number;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export interface ManifestSummary {
|
|
38
|
-
runId: string;
|
|
39
|
-
tasks: TaskSummary[];
|
|
40
|
-
createdAt: string;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function computeRunHealth(manifest: ManifestSummary): RunHealth {
|
|
44
|
-
const penalties: HealthPenalty[] = [];
|
|
45
|
-
const tasks = manifest.tasks;
|
|
46
|
-
const taskCount = tasks.length;
|
|
47
|
-
if (taskCount === 0) return { score: 100, grade: "A", penalties: [], deltas: [] };
|
|
48
|
-
|
|
49
|
-
const failedCount = tasks.filter((t) => t.status === "failed").length;
|
|
50
|
-
const stalledCount = tasks.filter((t) => t.stalledSince !== undefined && Date.now() - t.stalledSince > STALLED_THRESHOLD_MS).length;
|
|
51
|
-
|
|
52
|
-
const failureRate = failedCount / taskCount;
|
|
53
|
-
if (failureRate > 0.2) {
|
|
54
|
-
penalties.push({
|
|
55
|
-
reason: "high-failure-rate",
|
|
56
|
-
deduction: Math.round(failureRate * 50),
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (stalledCount > 0) {
|
|
61
|
-
penalties.push({
|
|
62
|
-
reason: "stalled-tasks",
|
|
63
|
-
deduction: Math.min(15, stalledCount * 5),
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (taskCount > 20) {
|
|
68
|
-
penalties.push({
|
|
69
|
-
reason: "large-task-count",
|
|
70
|
-
deduction: Math.min(10, Math.floor((taskCount - 20) / 10)),
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const totalDeduction = penalties.reduce((sum, p) => sum + p.deduction, 0);
|
|
75
|
-
const score = Math.max(0, Math.min(100, 100 - totalDeduction));
|
|
76
|
-
|
|
77
|
-
return {
|
|
78
|
-
score,
|
|
79
|
-
grade: scoreToGrade(score),
|
|
80
|
-
penalties,
|
|
81
|
-
deltas: [],
|
|
82
|
-
};
|
|
83
|
-
}
|