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,556 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* team-tool/goal.ts — Handler for `team action='goal'` (P0 skeleton).
|
|
3
|
-
*
|
|
4
|
-
* Sub-actions (anchor sub-action pattern, team-tool.ts:1224):
|
|
5
|
-
* - start : create GoalLoopState + spawn background goal-loop process
|
|
6
|
-
* - status : show objective/state/turn/budget/last verdict
|
|
7
|
-
* - pause : cooperative pause (flip GoalLoopState.state)
|
|
8
|
-
* - resume : cooperative resume (re-spawn next turn) — P0: status-only stub
|
|
9
|
-
* - stop : cooperative cancel + handleCancel(currentRunId)
|
|
10
|
-
* - step : run exactly one more turn (debug) — P0: status-only stub
|
|
11
|
-
* - clear : remove GoalLoopState file
|
|
12
|
-
*
|
|
13
|
-
* Plan: 07-PLAN.md v3 §0c C10 (assertSafePathId, evaluatorModel required, ≤4000 chars),
|
|
14
|
-
* §0c C11 (control path: cooperative flag + handleCancel(currentRunId) via abortOwned).
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { GoalStore } from "../../runtime/goal-state-store.ts";
|
|
18
|
-
import { snapshotManifests } from "../../runtime/verification-integrity.ts";
|
|
19
|
-
import { isWorkspaceBusy } from "../../runtime/workspace-lock.ts";
|
|
20
|
-
import type { TeamToolParamsValue } from "../../schema/team-tool-schema.ts";
|
|
21
|
-
import { appendEvent } from "../../state/event-log.ts";
|
|
22
|
-
import { createRunPaths, saveRunManifestAsync } from "../../state/state-store.ts";
|
|
23
|
-
import type { GoalLoopState, GoalLoopStatus, TeamRunManifest } from "../../state/types.ts";
|
|
24
|
-
import { spawnBackgroundTeamRun } from "../../subagents/async-entry.ts";
|
|
25
|
-
import { logInternalError } from "../../utils/internal-error.ts";
|
|
26
|
-
import { result, type TeamContext } from "./context.ts";
|
|
27
|
-
|
|
28
|
-
const MAX_GOAL_OBJECTIVE_CHARS = 4000;
|
|
29
|
-
|
|
30
|
-
interface GoalSubActionInput {
|
|
31
|
-
params: TeamToolParamsValue;
|
|
32
|
-
ctx: TeamContext;
|
|
33
|
-
store: GoalStore;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/** Extract a clean objective string from params (goalObjective || goal || task), validated. */
|
|
37
|
-
function readObjective(params: TeamToolParamsValue): string {
|
|
38
|
-
const raw = (params.config?.objective as string | undefined) ?? params.goal ?? params.task ?? "";
|
|
39
|
-
const objective = typeof raw === "string" ? raw.trim() : "";
|
|
40
|
-
if (!objective) {
|
|
41
|
-
throw new Error("`goal start` requires a non-empty objective (config.objective, goal, or task).");
|
|
42
|
-
}
|
|
43
|
-
if (objective.length > MAX_GOAL_OBJECTIVE_CHARS) {
|
|
44
|
-
throw new Error(`Objective too long: ${objective.length} > ${MAX_GOAL_OBJECTIVE_CHARS} chars (Claude/Codex parity).`);
|
|
45
|
-
}
|
|
46
|
-
return objective;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/** Validate evaluatorModel is set (required per §0c C10 — no silent default). */
|
|
50
|
-
function readEvaluatorModel(params: TeamToolParamsValue): string {
|
|
51
|
-
const model = (params.config?.evaluatorModel as string | undefined) ?? (params.config?.model as string | undefined) ?? params.model;
|
|
52
|
-
if (!model || typeof model !== "string") {
|
|
53
|
-
throw new Error("`goal start` requires config.evaluatorModel (the goal-judge model). No silent default.");
|
|
54
|
-
}
|
|
55
|
-
return model;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function formatGoalStatus(goal: GoalLoopState): string {
|
|
59
|
-
const last = goal.verdicts[goal.verdicts.length - 1];
|
|
60
|
-
const budgetPct = goal.budgetTotal ? `${Math.round((goal.budgetUsed / goal.budgetTotal) * 100)}%` : "n/a";
|
|
61
|
-
return [
|
|
62
|
-
`Goal ${goal.goalId} [${goal.state}]`,
|
|
63
|
-
` objective: ${goal.objective.slice(0, 200)}${goal.objective.length > 200 ? "…" : ""}`,
|
|
64
|
-
` turn: ${goal.turnsUsed}/${goal.maxTurns} budget: ${goal.budgetUsed}/${goal.budgetTotal ?? "∞"} (${budgetPct})`,
|
|
65
|
-
` evaluator: ${goal.evaluatorModel} worker: ${goal.workerAgent ?? "executor"}`,
|
|
66
|
-
last
|
|
67
|
-
? ` last verdict (turn ${last.turn}): ${last.achieved ? "ACHIEVED" : "not-achieved"} — ${last.reason.slice(0, 300)}`
|
|
68
|
-
: " (no verdicts yet)",
|
|
69
|
-
goal.nextTurnFeedback ? ` next-turn feedback: ${goal.nextTurnFeedback.slice(0, 200)}` : "",
|
|
70
|
-
goal.currentRunId ? ` current turn runId: ${goal.currentRunId}` : "",
|
|
71
|
-
]
|
|
72
|
-
.filter(Boolean)
|
|
73
|
-
.join("\n");
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/** `goal start` — create state + spawn background process (P0: writes state; spawn wiring TBD per host). */
|
|
77
|
-
async function handleStart(input: GoalSubActionInput): Promise<ReturnType<typeof result>> {
|
|
78
|
-
const { params, ctx, store } = input;
|
|
79
|
-
try {
|
|
80
|
-
const objective = readObjective(params);
|
|
81
|
-
const evaluatorModel = readEvaluatorModel(params);
|
|
82
|
-
const cwd = ctx.cwd;
|
|
83
|
-
const goalId = store.createGoalId();
|
|
84
|
-
const ownerSessionId = ctx.sessionId ?? "unknown";
|
|
85
|
-
const now = new Date().toISOString();
|
|
86
|
-
const maxTurns = typeof params.config?.maxTurns === "number" && params.config.maxTurns > 0 ? params.config.maxTurns : 20; // Claude/Codex parity default
|
|
87
|
-
// P1d (RFC v0.5 §P1d): budget is REQUIRED. Either an explicit budgetTotal (>=1000, enforced
|
|
88
|
-
// by schema) OR an explicit budgetUnlimited:true opt-out (audit-logged). No silent unbounded
|
|
89
|
-
// default — without a cap the loop could spend unboundedly across many turns × workers.
|
|
90
|
-
const budgetUnlimited = params.config?.budgetUnlimited === true;
|
|
91
|
-
const hasBudgetTotal = typeof params.budgetTotal === "number" && params.budgetTotal >= 1000;
|
|
92
|
-
if (!budgetUnlimited && !hasBudgetTotal) {
|
|
93
|
-
throw new Error(
|
|
94
|
-
"`goal start` requires either config.budgetTotal (>=1000, schema-enforced) OR config.budgetUnlimited:true (audit-logged opt-out). No silent unbounded-spend default.",
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
// Cold-review #2 nit: reject the mutually-exclusive combination. If both are set the
|
|
98
|
-
// runner silently lets budgetUnlimited win, surprising the user.
|
|
99
|
-
if (budgetUnlimited && hasBudgetTotal) {
|
|
100
|
-
throw new Error("`goal start`: config.budgetTotal and config.budgetUnlimited are mutually exclusive. Set exactly one.");
|
|
101
|
-
}
|
|
102
|
-
// P1g (cold-review #2 BLOCKING fix): pre-check the workspace lock BEFORE spawning. If another
|
|
103
|
-
// goal already owns this cwd's lock, fail-fast with a clear error (the runner would otherwise
|
|
104
|
-
// queue silently inside the background process). isWorkspaceBusy peeks the lockfile without
|
|
105
|
-
// acquiring. The authoritative acquisition happens in runGoalLoop.
|
|
106
|
-
const busyOwner = isWorkspaceBusy(cwd);
|
|
107
|
-
if (busyOwner) {
|
|
108
|
-
throw new Error(
|
|
109
|
-
`Workspace '${cwd}' is already locked by goal '${busyOwner}'. Concurrent goals on the same single-workspace cwd are serialized to prevent edit clobbering. Stop the other goal first, or use a separate workspace.`,
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
const verification = params.config?.verification as
|
|
113
|
-
| {
|
|
114
|
-
commands: string[];
|
|
115
|
-
allowManualEvidence?: boolean;
|
|
116
|
-
mode?: string;
|
|
117
|
-
}
|
|
118
|
-
| undefined;
|
|
119
|
-
const isTextOnly = verification?.mode === "text-only";
|
|
120
|
-
// P1a (RFC v0.5 §P1a): take manifest-integrity snapshot at start IF verification.commands
|
|
121
|
-
// declared. For text-only mode (no objective oracle), mark "none-text-only" explicitly so
|
|
122
|
-
// the runner knows no snapshot guard applies. No auto-detect (B2: auto-detect is a confused
|
|
123
|
-
// deputy — the user MUST declare verification explicitly).
|
|
124
|
-
let verificationIntegrity: import("../../state/types.ts").GoalLoopState["verificationIntegrity"];
|
|
125
|
-
if (isTextOnly || !verification?.commands?.length) {
|
|
126
|
-
verificationIntegrity = "none-text-only";
|
|
127
|
-
} else {
|
|
128
|
-
try {
|
|
129
|
-
const snap = snapshotManifests(cwd);
|
|
130
|
-
verificationIntegrity = { snapshot: snap, takenAt: now };
|
|
131
|
-
} catch (error) {
|
|
132
|
-
logInternalError("goal.start.integritySnapshot", error, `goalId=${goalId}`);
|
|
133
|
-
// Non-fatal: proceed without integrity guard (downgraded to text-only behavior).
|
|
134
|
-
verificationIntegrity = "none-text-only";
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
const goalState: import("../../state/types.ts").GoalLoopState = {
|
|
138
|
-
goalId,
|
|
139
|
-
ownerSessionId,
|
|
140
|
-
objective,
|
|
141
|
-
scope: typeof params.config?.scope === "string" ? params.config.scope : undefined,
|
|
142
|
-
verification,
|
|
143
|
-
state: "running",
|
|
144
|
-
maxTurns,
|
|
145
|
-
turnsUsed: 0,
|
|
146
|
-
budgetTotal: hasBudgetTotal ? (params.budgetTotal as number) : undefined,
|
|
147
|
-
budgetUnlimited: budgetUnlimited || undefined,
|
|
148
|
-
budgetWarning: typeof params.budgetWarning === "number" ? params.budgetWarning : 0.8,
|
|
149
|
-
budgetAbort: typeof params.budgetAbort === "number" ? params.budgetAbort : 0.95,
|
|
150
|
-
budgetUsed: 0,
|
|
151
|
-
verificationIntegrity,
|
|
152
|
-
evaluatorModel,
|
|
153
|
-
workerModel: typeof params.model === "string" ? params.model : undefined,
|
|
154
|
-
workerAgent: typeof params.config?.workerAgent === "string" ? params.config.workerAgent : undefined,
|
|
155
|
-
team: typeof params.team === "string" ? params.team : undefined,
|
|
156
|
-
cwd,
|
|
157
|
-
verdicts: [],
|
|
158
|
-
history: [],
|
|
159
|
-
createdAt: now,
|
|
160
|
-
updatedAt: now,
|
|
161
|
-
};
|
|
162
|
-
store.save(goalState);
|
|
163
|
-
|
|
164
|
-
// ── Spawn the background goal-loop process (Fix P0-1 v2) ────────────────
|
|
165
|
-
// Convention: the goal-loop manifest's runId IS the goalId, so background-runner's
|
|
166
|
-
// `case "goal-loop"` can load GoalLoopState via `store.load(manifest.runId)`.
|
|
167
|
-
// Fix P0-1: build paths via createRunPaths(cwd, goalId) so ALL paths
|
|
168
|
-
// (stateRoot/artifactsRoot/eventsPath/tasksPath) are consistent with runId=goalId.
|
|
169
|
-
// The previous fix overrode runId AFTER createRunManifest (which used a random id),
|
|
170
|
-
// so the manifest was written to runs/<randomId>/ but background-runner looked for
|
|
171
|
-
// runs/<goalId>/ → "Run not found" → silent death. (Review #2 F1.)
|
|
172
|
-
const paths = createRunPaths(cwd, goalId);
|
|
173
|
-
const now2 = new Date().toISOString();
|
|
174
|
-
const goalLoopManifest: TeamRunManifest = {
|
|
175
|
-
schemaVersion: 1,
|
|
176
|
-
runId: goalId, // paths.runId === goalId by construction
|
|
177
|
-
sessionId: ownerSessionId,
|
|
178
|
-
team: `goal-${goalId}`,
|
|
179
|
-
workflow: "goal-loop",
|
|
180
|
-
goal: objective,
|
|
181
|
-
status: "queued",
|
|
182
|
-
workspaceMode: "single",
|
|
183
|
-
createdAt: now2,
|
|
184
|
-
updatedAt: now2,
|
|
185
|
-
cwd,
|
|
186
|
-
stateRoot: paths.stateRoot,
|
|
187
|
-
artifactsRoot: paths.artifactsRoot,
|
|
188
|
-
tasksPath: paths.tasksPath,
|
|
189
|
-
eventsPath: paths.eventsPath,
|
|
190
|
-
artifacts: [],
|
|
191
|
-
ownerSessionId,
|
|
192
|
-
runKind: "goal-loop",
|
|
193
|
-
};
|
|
194
|
-
await saveRunManifestAsync(goalLoopManifest);
|
|
195
|
-
appendEvent(paths.eventsPath, {
|
|
196
|
-
type: "goal.loop_start",
|
|
197
|
-
runId: goalId,
|
|
198
|
-
data: {
|
|
199
|
-
goalId,
|
|
200
|
-
objective,
|
|
201
|
-
maxTurns,
|
|
202
|
-
statePath: `${cwd}/.crew/state/goals/${goalId}.json`,
|
|
203
|
-
},
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
try {
|
|
207
|
-
const spawned = await spawnBackgroundTeamRun(goalLoopManifest);
|
|
208
|
-
const pid = spawned.pid ?? 0;
|
|
209
|
-
const withAsync = {
|
|
210
|
-
...goalState,
|
|
211
|
-
async: {
|
|
212
|
-
pid,
|
|
213
|
-
logPath: spawned.logPath,
|
|
214
|
-
spawnedAt: new Date().toISOString(),
|
|
215
|
-
},
|
|
216
|
-
};
|
|
217
|
-
store.save(withAsync);
|
|
218
|
-
return result(
|
|
219
|
-
`Goal loop started (background pid=${pid}).\n${formatGoalStatus(withAsync)}\n\nNext: \`team action='goal' config.subAction='status' config.goalId='${goalId}'\`. The loop runs up to ${maxTurns} turns, judging each against the objective. Log: ${spawned.logPath}`,
|
|
220
|
-
{
|
|
221
|
-
action: "goal",
|
|
222
|
-
status: "ok",
|
|
223
|
-
data: { goalId, state: goalState.state, maxTurns, pid },
|
|
224
|
-
},
|
|
225
|
-
false,
|
|
226
|
-
);
|
|
227
|
-
} catch (spawnError) {
|
|
228
|
-
const message = spawnError instanceof Error ? spawnError.message : String(spawnError);
|
|
229
|
-
store.setStatus(goalId, "blocked", paths.eventsPath);
|
|
230
|
-
return result(
|
|
231
|
-
`goal start: state saved but background spawn failed: ${message}`,
|
|
232
|
-
{ action: "goal", status: "error", data: { goalId } },
|
|
233
|
-
true,
|
|
234
|
-
);
|
|
235
|
-
}
|
|
236
|
-
} catch (error) {
|
|
237
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
238
|
-
return result(`goal start failed: ${message}`, { action: "goal", status: "error" }, true);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
/** `goal status` — show current state (and list goals if no goalId). */
|
|
243
|
-
function handleStatus(input: GoalSubActionInput): ReturnType<typeof result> {
|
|
244
|
-
const { params, store } = input;
|
|
245
|
-
const goalId = (params.config?.goalId as string | undefined) ?? (params.config?.goalId as string | undefined);
|
|
246
|
-
if (goalId) {
|
|
247
|
-
const goal = store.load(goalId);
|
|
248
|
-
if (!goal) return result(`Goal '${goalId}' not found.`, { action: "goal", status: "error" }, true);
|
|
249
|
-
return result(
|
|
250
|
-
formatGoalStatus(goal),
|
|
251
|
-
{
|
|
252
|
-
action: "goal",
|
|
253
|
-
status: "ok",
|
|
254
|
-
data: { goalId, state: goal.state, turnsUsed: goal.turnsUsed },
|
|
255
|
-
},
|
|
256
|
-
false,
|
|
257
|
-
);
|
|
258
|
-
}
|
|
259
|
-
const goals = store.list();
|
|
260
|
-
if (goals.length === 0)
|
|
261
|
-
return result(
|
|
262
|
-
"No goals found. Start one with `team action='goal' config.subAction='start' config.objective='...' config.evaluatorModel='...'`.",
|
|
263
|
-
{ action: "goal", status: "ok" },
|
|
264
|
-
false,
|
|
265
|
-
);
|
|
266
|
-
return result(
|
|
267
|
-
`Goals (${goals.length}):\n\n${goals.map(formatGoalStatus).join("\n\n")}`,
|
|
268
|
-
{ action: "goal", status: "ok", data: { count: goals.length } },
|
|
269
|
-
false,
|
|
270
|
-
);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
/** Cooperative pause/resume/stop/clear — flip GoalLoopState.state. */
|
|
274
|
-
function assertGoalOwnership(goal: GoalLoopState, ctx: TeamContext, action: string): ReturnType<typeof result> | undefined {
|
|
275
|
-
// Fix round-6 A01: goal sub-actions must check session ownership (like handleCancel's abortOwned).
|
|
276
|
-
// status (read-only) is allowed for any session; mutating actions require ownership or force.
|
|
277
|
-
const owner = goal.ownerSessionId;
|
|
278
|
-
const current = ctx.sessionId;
|
|
279
|
-
// Fix round-7: ownership check must fire for running AND paused goals (paused still has
|
|
280
|
-
// an in-flight turn potentially). Previously only 'running' was gated — a paused goal
|
|
281
|
-
// with an active currentRunId could be stop/cancelled by a foreign session without force.
|
|
282
|
-
if (owner && current && owner !== current && (goal.state === "running" || goal.state === "paused")) {
|
|
283
|
-
return result(
|
|
284
|
-
`Goal '${goal.goalId}' belongs to session '${owner}' (you are '${current}') and is still running. Use force:true to override.`,
|
|
285
|
-
{
|
|
286
|
-
action,
|
|
287
|
-
status: "error",
|
|
288
|
-
data: { goalId: goal.goalId, ownerSessionId: owner },
|
|
289
|
-
},
|
|
290
|
-
true,
|
|
291
|
-
);
|
|
292
|
-
}
|
|
293
|
-
return undefined;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
function handleStateFlip(input: GoalSubActionInput, nextState: GoalLoopStatus, label: string): ReturnType<typeof result> {
|
|
297
|
-
const { params, ctx, store } = input;
|
|
298
|
-
const goalId = params.config?.goalId as string | undefined;
|
|
299
|
-
if (!goalId) return result(`${label} requires config.goalId.`, { action: "goal", status: "error" }, true);
|
|
300
|
-
const existing = store.load(goalId);
|
|
301
|
-
if (!existing) return result(`Goal '${goalId}' not found.`, { action: "goal", status: "error" }, true);
|
|
302
|
-
if (params.force !== true) {
|
|
303
|
-
const denied = assertGoalOwnership(existing, ctx, "goal");
|
|
304
|
-
if (denied) return denied;
|
|
305
|
-
}
|
|
306
|
-
const eventsPath = createRunPaths(ctx.cwd, goalId).eventsPath;
|
|
307
|
-
const updated = store.setStatus(goalId, nextState, eventsPath);
|
|
308
|
-
if (!updated) return result(`Goal '${goalId}' not found.`, { action: "goal", status: "error" }, true);
|
|
309
|
-
return result(
|
|
310
|
-
`Goal ${goalId} ${label} (state='${updated.state}').`,
|
|
311
|
-
{
|
|
312
|
-
action: "goal",
|
|
313
|
-
status: "ok",
|
|
314
|
-
data: { goalId, state: updated.state },
|
|
315
|
-
},
|
|
316
|
-
false,
|
|
317
|
-
);
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
/**
|
|
321
|
-
* `goal stop`/`cancel`/`clear`/`reset` — cooperative flag + cancel the in-flight turn (H-5).
|
|
322
|
-
* Flips GoalLoopState.state='cancelled' so the loop exits at the next turn boundary,
|
|
323
|
-
* AND calls handleCancel(currentRunId) to kill a running turn immediately. §0c C11.
|
|
324
|
-
*/
|
|
325
|
-
async function handleStop(input: GoalSubActionInput): Promise<ReturnType<typeof result>> {
|
|
326
|
-
const { params, ctx, store } = input;
|
|
327
|
-
const goalId = params.config?.goalId as string | undefined;
|
|
328
|
-
if (!goalId) return result("stop requires config.goalId.", { action: "goal", status: "error" }, true);
|
|
329
|
-
const eventsPath = createRunPaths(ctx.cwd, goalId).eventsPath;
|
|
330
|
-
const before = store.load(goalId);
|
|
331
|
-
if (!before) return result(`Goal '${goalId}' not found.`, { action: "goal", status: "error" }, true);
|
|
332
|
-
if (params.force !== true) {
|
|
333
|
-
const denied = assertGoalOwnership(before, ctx, "goal");
|
|
334
|
-
if (denied) return denied;
|
|
335
|
-
}
|
|
336
|
-
const updated = store.setStatus(goalId, "cancelled", eventsPath)!;
|
|
337
|
-
// If a turn is mid-flight, cancel it now (not just at the next turn boundary).
|
|
338
|
-
let cancelMsg = "";
|
|
339
|
-
if (updated.currentRunId) {
|
|
340
|
-
try {
|
|
341
|
-
// LAZY: defer dynamic import of ./cancel.ts to its call site.
|
|
342
|
-
const { handleCancel } = await import("./cancel.ts");
|
|
343
|
-
const cancelResult = await handleCancel(
|
|
344
|
-
{
|
|
345
|
-
action: "cancel",
|
|
346
|
-
runId: updated.currentRunId,
|
|
347
|
-
force: true,
|
|
348
|
-
config: { intent: "user requested goal stop" },
|
|
349
|
-
},
|
|
350
|
-
ctx,
|
|
351
|
-
);
|
|
352
|
-
cancelMsg = ` In-flight turn ${updated.currentRunId} cancel: ${(cancelResult.content[0] as { text?: string } | undefined)?.text ?? "ok"}.`;
|
|
353
|
-
} catch (error) {
|
|
354
|
-
cancelMsg = ` (in-flight turn ${updated.currentRunId} cancel failed: ${error instanceof Error ? error.message : String(error)}; the loop will still exit at the next turn boundary.)`;
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
return result(
|
|
358
|
-
`Goal ${goalId} stopped (state='cancelled').${cancelMsg}`,
|
|
359
|
-
{
|
|
360
|
-
action: "goal",
|
|
361
|
-
status: "ok",
|
|
362
|
-
data: {
|
|
363
|
-
goalId,
|
|
364
|
-
state: "cancelled",
|
|
365
|
-
cancelledRunId: updated.currentRunId,
|
|
366
|
-
},
|
|
367
|
-
},
|
|
368
|
-
false,
|
|
369
|
-
);
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
/**
|
|
373
|
-
* `goal resume` (P1b, RFC v0.5 §P1b): promote from P0 stub to real handler.
|
|
374
|
-
* Resumes a paused OR stuck goal via CAS (state -> "running") + injects the user's
|
|
375
|
-
* optional hint into nextTurnFeedback + re-spawns the background loop.
|
|
376
|
-
*
|
|
377
|
-
* No double-turn-execution: the loop is single-threaded per goal, and any in-flight
|
|
378
|
-
* turn (from before the pause) completes normally; nextTurnFeedback is read at turn
|
|
379
|
-
* N+1's composeGoalPrompt, so the hint applies to N+1, not the in-flight turn.
|
|
380
|
-
*
|
|
381
|
-
* `goal start`'s workspace-lock ownership is reused: a resumed goal does NOT re-acquire
|
|
382
|
-
* the lock (the lock was held for the goal's lifetime at start). If the original goal
|
|
383
|
-
* had released its lock (e.g. it crashed and the lock was reclaimed), the resumed
|
|
384
|
-
* loop will fail-fast at the first worker turn that needs it — surfaced via events.
|
|
385
|
-
*/
|
|
386
|
-
async function handleResume(input: GoalSubActionInput): Promise<ReturnType<typeof result>> {
|
|
387
|
-
const { params, ctx, store } = input;
|
|
388
|
-
const goalId = params.config?.goalId as string | undefined;
|
|
389
|
-
if (!goalId) return result("resume requires config.goalId.", { action: "goal", status: "error" }, true);
|
|
390
|
-
const existing = store.load(goalId);
|
|
391
|
-
if (!existing) return result(`Goal '${goalId}' not found.`, { action: "goal", status: "error" }, true);
|
|
392
|
-
if (params.force !== true) {
|
|
393
|
-
const denied = assertGoalOwnership(existing, ctx, "goal");
|
|
394
|
-
if (denied) return denied;
|
|
395
|
-
}
|
|
396
|
-
// Only paused/stuck goals are resumable. (running = already running; terminal states
|
|
397
|
-
// achieved/max_turns/blocked/cancelled/budget_exceeded are done.)
|
|
398
|
-
if (existing.state !== "paused" && existing.state !== "stuck") {
|
|
399
|
-
return result(
|
|
400
|
-
`Goal '${goalId}' is in state '${existing.state}' — only 'paused' or 'stuck' goals can be resumed.`,
|
|
401
|
-
{
|
|
402
|
-
action: "goal",
|
|
403
|
-
status: "error",
|
|
404
|
-
data: { goalId, state: existing.state },
|
|
405
|
-
},
|
|
406
|
-
true,
|
|
407
|
-
);
|
|
408
|
-
}
|
|
409
|
-
const hint = typeof params.config?.hint === "string" ? params.config.hint.trim() : undefined;
|
|
410
|
-
const eventsPath = createRunPaths(ctx.cwd, goalId).eventsPath;
|
|
411
|
-
// CAS: only resume if the state is still what we loaded. A concurrent stop/cancel wins.
|
|
412
|
-
const updated = store.compareAndSetStatus(goalId, existing.state, "running", eventsPath);
|
|
413
|
-
if (!updated) {
|
|
414
|
-
return result(
|
|
415
|
-
`Goal '${goalId}' state changed concurrently (resume aborted; another actor won the race).`,
|
|
416
|
-
{ action: "goal", status: "error", data: { goalId } },
|
|
417
|
-
true,
|
|
418
|
-
);
|
|
419
|
-
}
|
|
420
|
-
// Inject the hint as next-turn feedback (applies to turn N+1's worker prompt).
|
|
421
|
-
let withHint = updated;
|
|
422
|
-
if (hint) {
|
|
423
|
-
withHint = store.patch(goalId, { nextTurnFeedback: hint }, eventsPath) ?? updated;
|
|
424
|
-
}
|
|
425
|
-
appendEvent(eventsPath, {
|
|
426
|
-
type: "goal.resumed",
|
|
427
|
-
runId: goalId,
|
|
428
|
-
data: { goalId, fromState: existing.state, hint: hint?.slice(0, 200) },
|
|
429
|
-
});
|
|
430
|
-
// Re-spawn the background loop. The loop checks goal.state === "running" before each
|
|
431
|
-
// turn; since we just set it to running, it proceeds.
|
|
432
|
-
try {
|
|
433
|
-
const manifest: TeamRunManifest = {
|
|
434
|
-
schemaVersion: 1,
|
|
435
|
-
runId: goalId,
|
|
436
|
-
sessionId: existing.ownerSessionId,
|
|
437
|
-
team: `goal-${goalId}`,
|
|
438
|
-
workflow: "goal-loop",
|
|
439
|
-
goal: existing.objective,
|
|
440
|
-
status: "queued",
|
|
441
|
-
workspaceMode: "single",
|
|
442
|
-
createdAt: existing.createdAt,
|
|
443
|
-
updatedAt: new Date().toISOString(),
|
|
444
|
-
cwd: existing.cwd,
|
|
445
|
-
stateRoot: createRunPaths(existing.cwd, goalId).stateRoot,
|
|
446
|
-
artifactsRoot: createRunPaths(existing.cwd, goalId).artifactsRoot,
|
|
447
|
-
tasksPath: createRunPaths(existing.cwd, goalId).tasksPath,
|
|
448
|
-
eventsPath,
|
|
449
|
-
artifacts: [],
|
|
450
|
-
ownerSessionId: existing.ownerSessionId,
|
|
451
|
-
runKind: "goal-loop",
|
|
452
|
-
};
|
|
453
|
-
const spawned = await spawnBackgroundTeamRun(manifest);
|
|
454
|
-
return result(
|
|
455
|
-
`Goal ${goalId} resumed from '${existing.state}' (background pid=${spawned.pid ?? 0}).${hint ? ` Hint injected for next turn.` : ""}`,
|
|
456
|
-
{
|
|
457
|
-
action: "goal",
|
|
458
|
-
status: "ok",
|
|
459
|
-
data: {
|
|
460
|
-
goalId,
|
|
461
|
-
state: "running",
|
|
462
|
-
fromState: existing.state,
|
|
463
|
-
pid: spawned.pid,
|
|
464
|
-
},
|
|
465
|
-
},
|
|
466
|
-
false,
|
|
467
|
-
);
|
|
468
|
-
} catch (spawnError) {
|
|
469
|
-
const msg = spawnError instanceof Error ? spawnError.message : String(spawnError);
|
|
470
|
-
// Cold-review #2 nit: roll back to the PRIOR state (paused/stuck) so the user can retry
|
|
471
|
-
// 'goal resume' (which requires paused/stuck). Leaving it at 'running' with no process made
|
|
472
|
-
// the goal un-resumable — the user had to pause-then-resume as a workaround.
|
|
473
|
-
store.compareAndSetStatus(goalId, "running", existing.state, eventsPath);
|
|
474
|
-
appendEvent(eventsPath, {
|
|
475
|
-
type: "goal.resume_spawn_failed",
|
|
476
|
-
runId: goalId,
|
|
477
|
-
data: { goalId, error: msg, rolledBackTo: existing.state },
|
|
478
|
-
});
|
|
479
|
-
return result(
|
|
480
|
-
`Goal ${goalId} background re-spawn failed: ${msg}. State rolled back to '${existing.state}'. Retry 'goal resume' to re-attempt.`,
|
|
481
|
-
{
|
|
482
|
-
action: "goal",
|
|
483
|
-
status: "error",
|
|
484
|
-
data: { goalId, spawnFailed: true, state: existing.state },
|
|
485
|
-
},
|
|
486
|
-
true,
|
|
487
|
-
);
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
/** `team action='goal'` dispatch. */
|
|
492
|
-
export async function handleGoal(params: TeamToolParamsValue, ctx: TeamContext): Promise<ReturnType<typeof result>> {
|
|
493
|
-
const store = new GoalStore(ctx.cwd);
|
|
494
|
-
const subAction = typeof params.config?.subAction === "string" ? params.config.subAction : "status";
|
|
495
|
-
const input: GoalSubActionInput = { params, ctx, store };
|
|
496
|
-
switch (subAction) {
|
|
497
|
-
case "start":
|
|
498
|
-
return handleStart(input);
|
|
499
|
-
case "status":
|
|
500
|
-
return handleStatus(input);
|
|
501
|
-
case "pause":
|
|
502
|
-
return handleStateFlip(input, "paused", "paused");
|
|
503
|
-
case "resume":
|
|
504
|
-
return await handleResume(input);
|
|
505
|
-
case "stop":
|
|
506
|
-
case "cancel":
|
|
507
|
-
case "reset":
|
|
508
|
-
return await handleStop(input);
|
|
509
|
-
case "clear": {
|
|
510
|
-
// Fix P1-3 + round-5 P2: remove the goal file. But refuse if the loop is still
|
|
511
|
-
// running (would leave a zombie background process). Require stop first.
|
|
512
|
-
const clearGoalId = params.config?.goalId as string | undefined;
|
|
513
|
-
if (!clearGoalId) return result("clear requires config.goalId.", { action: "goal", status: "error" }, true);
|
|
514
|
-
const existing = store.load(clearGoalId);
|
|
515
|
-
if (!existing) return result(`Goal '${clearGoalId}' not found (already cleared?).`, { action: "goal", status: "error" }, true);
|
|
516
|
-
if (params.force !== true) {
|
|
517
|
-
const denied = assertGoalOwnership(existing, ctx, "goal");
|
|
518
|
-
if (denied) return denied;
|
|
519
|
-
}
|
|
520
|
-
if (existing.state === "running" || existing.state === "paused") {
|
|
521
|
-
return result(
|
|
522
|
-
`Goal '${clearGoalId}' is still ${existing.state}. Stop it first (team action='goal' subAction='stop' goalId='${clearGoalId}'), then clear.`,
|
|
523
|
-
{
|
|
524
|
-
action: "goal",
|
|
525
|
-
status: "error",
|
|
526
|
-
data: { goalId: clearGoalId, state: existing.state },
|
|
527
|
-
},
|
|
528
|
-
true,
|
|
529
|
-
);
|
|
530
|
-
}
|
|
531
|
-
const removed = store.remove(clearGoalId);
|
|
532
|
-
if (!removed) return result(`Goal '${clearGoalId}' could not be removed.`, { action: "goal", status: "error" }, true);
|
|
533
|
-
return result(
|
|
534
|
-
`Goal '${clearGoalId}' cleared (file removed).`,
|
|
535
|
-
{
|
|
536
|
-
action: "goal",
|
|
537
|
-
status: "ok",
|
|
538
|
-
data: { goalId: clearGoalId, cleared: true },
|
|
539
|
-
},
|
|
540
|
-
false,
|
|
541
|
-
);
|
|
542
|
-
}
|
|
543
|
-
case "step":
|
|
544
|
-
// P0: step is a status-only stub — single-turn execution lands with P1.
|
|
545
|
-
return handleStatus(input);
|
|
546
|
-
default:
|
|
547
|
-
return result(
|
|
548
|
-
`Unknown goal subAction '${subAction}'. Known: start, status, pause, resume, stop, step, clear.`,
|
|
549
|
-
{ action: "goal", status: "error" },
|
|
550
|
-
true,
|
|
551
|
-
);
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
// Touch logInternalError so the import is not tree-shaken in type-only builds (defensive).
|
|
556
|
-
void logInternalError;
|