@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.8e6112e9
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/dist/cli-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/cli.js +2 -19
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/help-text.js +5 -0
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +123 -20
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/ask-user-questions.js +81 -25
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/bg-shell/utilities.js +5 -2
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +546 -426
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +256 -0
- package/dist/resources/extensions/github-sync/templates.js +3 -3
- package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
- package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +80 -56
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +310 -78
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2299
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
- package/dist/resources/extensions/gsd/auto/session.js +6 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +56 -63
- package/dist/resources/extensions/gsd/auto-model-selection.js +44 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +47 -17
- package/dist/resources/extensions/gsd/auto-prompts.js +161 -26
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
- package/dist/resources/extensions/gsd/auto-start.js +59 -52
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +14 -47
- package/dist/resources/extensions/gsd/auto-verification.js +30 -37
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +68 -370
- package/dist/resources/extensions/gsd/auto.js +71 -29
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +74 -50
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +316 -161
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +365 -58
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +5 -15
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +66 -3
- package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
- package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-ship.js +2 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
- package/dist/resources/extensions/gsd/db/engine.js +757 -0
- package/dist/resources/extensions/gsd/db/queries.js +428 -0
- package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
- package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
- package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
- package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
- package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
- package/dist/resources/extensions/gsd/db-workspace.js +103 -0
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
- package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +261 -136
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- package/dist/resources/extensions/gsd/doctor.js +16 -9
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +10 -1
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
- package/dist/resources/extensions/gsd/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +3 -0
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +186 -2048
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +174 -473
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/markdown-renderer.js +12 -1
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +4 -20
- package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/memory-relations.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +22 -11
- package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
- package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
- package/dist/resources/extensions/gsd/milestone-closeout.js +97 -28
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
- package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
- package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +3 -0
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
- package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +37 -24
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/preferences.js +161 -29
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +5 -4
- package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +3 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
- package/dist/resources/extensions/gsd/prompts/system.md +6 -3
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
- package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
- package/dist/resources/extensions/gsd/question-transport.js +86 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/roadmap-slices.js +33 -5
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +24 -26
- package/dist/resources/extensions/gsd/status-guards.js +56 -8
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/templates/plan.md +7 -0
- package/dist/resources/extensions/gsd/templates/project.md +1 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/dist/resources/extensions/gsd/templates/uat.md +5 -1
- package/dist/resources/extensions/gsd/tool-contract.js +66 -11
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +17 -36
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
- package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
- package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +41 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +57 -25
- package/dist/resources/extensions/gsd/uat-run.js +9 -14
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +114 -21
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +367 -0
- package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +117 -0
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
- package/dist/resources/extensions/gsd/workflow-reconcile.js +25 -59
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
- package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +36 -31
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
- package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
- package/dist/resources/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +40 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +4 -4
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +4 -4
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
- package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
- package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/package.json +1 -1
- package/dist/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +4 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -4
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +58 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +113 -40
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -50
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +452 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts +10 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +12 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts +49 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +209 -103
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +183 -76
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +193 -112
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/index.d.ts +1 -1
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +1 -1
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/keys.d.ts.map +1 -1
- package/packages/pi-tui/dist/keys.js +39 -30
- package/packages/pi-tui/dist/keys.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +22 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +72 -18
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/ask-user-questions.ts +94 -26
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/bg-shell/utilities.ts +5 -2
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +651 -483
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +940 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +324 -0
- package/src/resources/extensions/github-sync/templates.ts +3 -3
- package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
- package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
- package/src/resources/extensions/gsd/auto/loop.ts +89 -61
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +350 -81
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -2981
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
- package/src/resources/extensions/gsd/auto/session.ts +7 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +68 -68
- package/src/resources/extensions/gsd/auto-model-selection.ts +49 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +56 -16
- package/src/resources/extensions/gsd/auto-prompts.ts +225 -44
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
- package/src/resources/extensions/gsd/auto-start.ts +65 -53
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +21 -49
- package/src/resources/extensions/gsd/auto-verification.ts +33 -36
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +83 -386
- package/src/resources/extensions/gsd/auto.ts +99 -34
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +93 -49
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +375 -177
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +452 -58
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +5 -16
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +64 -3
- package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
- package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-ship.ts +2 -2
- package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
- package/src/resources/extensions/gsd/db/engine.ts +811 -0
- package/src/resources/extensions/gsd/db/queries.ts +519 -0
- package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
- package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
- package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
- package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
- package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
- package/src/resources/extensions/gsd/db-workspace.ts +170 -0
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
- package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +272 -155
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- package/src/resources/extensions/gsd/doctor.ts +15 -5
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +12 -1
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
- package/src/resources/extensions/gsd/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +3 -0
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +190 -2375
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +240 -585
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/markdown-renderer.ts +13 -1
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +4 -24
- package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/memory-relations.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +20 -9
- package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
- package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
- package/src/resources/extensions/gsd/milestone-closeout.ts +121 -28
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
- package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
- package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +3 -0
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
- package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +42 -22
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +191 -28
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +5 -4
- package/src/resources/extensions/gsd/prompts/execute-task.md +5 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +3 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
- package/src/resources/extensions/gsd/prompts/system.md +6 -3
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
- package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
- package/src/resources/extensions/gsd/question-transport.ts +138 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/roadmap-slices.ts +36 -5
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +31 -27
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/templates/plan.md +7 -0
- package/src/resources/extensions/gsd/templates/project.md +1 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/src/resources/extensions/gsd/templates/uat.md +5 -1
- package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +649 -26
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +395 -30
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +46 -8
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +89 -59
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +120 -4
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +56 -2
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +11 -4
- package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +342 -1
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +51 -2
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +300 -41
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +9 -4
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -6
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +114 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +193 -13
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +75 -1
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +24 -2
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +188 -1
- package/src/resources/extensions/gsd/tool-contract.ts +124 -11
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +18 -35
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
- package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
- package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +45 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +80 -25
- package/src/resources/extensions/gsd/uat-run.ts +10 -14
- package/src/resources/extensions/gsd/undo.ts +9 -8
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +196 -21
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +442 -0
- package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/web-app-uat.ts +144 -0
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
- package/src/resources/extensions/gsd/workflow-reconcile.ts +32 -65
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +76 -0
- package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +20 -25
- package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +49 -44
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
- package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
- package/src/resources/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -195
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
- package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
- package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -88
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -198
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → pZbHa49xI-knmKlphIRq0}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → pZbHa49xI-knmKlphIRq0}/_ssgManifest.js +0 -0
|
@@ -12,14 +12,17 @@
|
|
|
12
12
|
|
|
13
13
|
import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
|
|
14
14
|
|
|
15
|
-
import type { AutoAdvanceResult, AutoOrchestrationModule, AutoSessionContext, AutoStatus } from "./contracts.js";
|
|
15
|
+
import type { AutoAdvanceResult, AutoOrchestrationModule, AutoSessionContext, AutoStatus, AutoTerminalOutcome } from "./contracts.js";
|
|
16
16
|
import type { AutoSession, PendingOrchestrationDispatch } from "./session.js";
|
|
17
|
-
import type { GSDState } from "../types.js";
|
|
17
|
+
import type { GSDState, Phase } from "../types.js";
|
|
18
18
|
import type { MinimalModelRegistry } from "../context-budget.js";
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
type BlockedAdvanceResult = Extract<AutoAdvanceResult, { kind: "blocked" }>;
|
|
21
|
+
|
|
22
|
+
import { debugCount, debugLog, debugTime } from "../debug-logger.js";
|
|
21
23
|
import { reconcileBeforeDispatch } from "../state-reconciliation.js";
|
|
22
|
-
import {
|
|
24
|
+
import { isLegalEdge, IllegalPhaseTransitionError } from "../state-transition-matrix.js";
|
|
25
|
+
import { hasPendingDeepStage, resolveDispatch } from "../auto-dispatch.js";
|
|
23
26
|
import { classifyFailure } from "../recovery-classification.js";
|
|
24
27
|
import { verifyExpectedArtifact, refreshRecoveryDbForArtifact } from "../auto-recovery.js";
|
|
25
28
|
import { invalidateAllCaches } from "../cache.js";
|
|
@@ -35,14 +38,21 @@ import { checkResourcesStale, autoWorktreeBranch, mergeMilestoneToMain } from ".
|
|
|
35
38
|
import { getSessionLockStatus } from "../session-lock.js";
|
|
36
39
|
import { resolveUokFlags } from "../uok/flags.js";
|
|
37
40
|
import { emitJournalEvent as _emitJournalEvent } from "../journal.js";
|
|
38
|
-
import { loadEffectiveGSDPreferences, getIsolationMode } from "../preferences.js";
|
|
39
|
-
import {
|
|
41
|
+
import { loadEffectiveGSDPreferences, getIsolationMode, resolveEffectiveUnitIsolationMode } from "../preferences.js";
|
|
42
|
+
import {
|
|
43
|
+
detectWorktreeName,
|
|
44
|
+
getMainBranch,
|
|
45
|
+
resolveProjectRoot,
|
|
46
|
+
resolveWorktreeProjectRoot,
|
|
47
|
+
} from "../worktree.js";
|
|
48
|
+
import { getPriorSliceCompletionBlocker } from "../dispatch-guard.js";
|
|
40
49
|
import { GitServiceImpl } from "../git-service.js";
|
|
41
50
|
import { WorktreeStateProjection } from "../worktree-state-projection.js";
|
|
42
51
|
import { WorktreeLifecycle } from "../worktree-lifecycle.js";
|
|
52
|
+
import { createMilestoneMergeTransaction } from "../milestone-merge-transaction.js";
|
|
43
53
|
import { createWorkspace, scopeMilestone } from "../workspace.js";
|
|
44
54
|
import { supportsStructuredQuestions } from "../workflow-mcp.js";
|
|
45
|
-
import { getToolBaselineSnapshot } from "../auto-model-selection.js";
|
|
55
|
+
import { getRegisteredToolSnapshot, getToolBaselineSnapshot } from "../auto-model-selection.js";
|
|
46
56
|
import { deriveState } from "../state.js";
|
|
47
57
|
import { parseUnitId } from "../unit-id.js";
|
|
48
58
|
import { isClosedStatus } from "../status-guards.js";
|
|
@@ -50,32 +60,39 @@ import {
|
|
|
50
60
|
isDbAvailable,
|
|
51
61
|
getSlice,
|
|
52
62
|
getTask,
|
|
53
|
-
refreshOpenDatabaseFromDisk,
|
|
54
63
|
} from "../gsd-db.js";
|
|
64
|
+
import { refreshWorkflowDatabaseFromDisk } from "../db-workspace.js";
|
|
55
65
|
import { getErrorMessage } from "../error-utils.js";
|
|
56
66
|
import { logWarning } from "../workflow-logger.js";
|
|
67
|
+
import { normalizeRealPath } from "../paths.js";
|
|
68
|
+
import {
|
|
69
|
+
buildDispatchKey,
|
|
70
|
+
createDispatchHistory,
|
|
71
|
+
STUCK_WINDOW_SIZE,
|
|
72
|
+
type DispatchHistory,
|
|
73
|
+
} from "./dispatch-history.js";
|
|
57
74
|
import { existsSync, readFileSync } from "node:fs";
|
|
58
75
|
import { join } from "node:path";
|
|
76
|
+
import { evaluateAllCompleteSettlement } from "../milestone-settlement.js";
|
|
77
|
+
import { hasHeldMilestoneLease, reclaimMissingMilestoneLease } from "./milestone-lease-reclaim.js";
|
|
59
78
|
|
|
60
79
|
function now(): number {
|
|
61
80
|
return Date.now();
|
|
62
81
|
}
|
|
63
82
|
|
|
64
|
-
|
|
65
|
-
* Size of the dispatch-decision ring buffer used by the Auto Orchestration
|
|
66
|
-
* module's stuck-loop detector. When the same `${unitType}:${unitId}` key
|
|
67
|
-
* fills the window, advance() blocks with `action: "stop"`.
|
|
68
|
-
*
|
|
69
|
-
* Mirrors the legacy `STUCK_WINDOW_SIZE` in auto/phases.ts so behaviour is
|
|
70
|
-
* preserved across the eventual cutover (issue #5791).
|
|
71
|
-
*/
|
|
72
|
-
export const STUCK_WINDOW_SIZE = 6;
|
|
73
|
-
|
|
74
|
-
function noRemainingUnitsReason(stateSnapshot: GSDState): string {
|
|
83
|
+
function noRemainingUnitsOutcome(stateSnapshot: GSDState): AutoTerminalOutcome {
|
|
75
84
|
if (stateSnapshot.phase === "complete") {
|
|
76
|
-
return
|
|
85
|
+
return {
|
|
86
|
+
code: "all-complete",
|
|
87
|
+
displayReason: "All milestones complete",
|
|
88
|
+
allMilestonesComplete: true,
|
|
89
|
+
};
|
|
77
90
|
}
|
|
78
|
-
return
|
|
91
|
+
return {
|
|
92
|
+
code: "no-remaining-units",
|
|
93
|
+
displayReason: "No remaining units",
|
|
94
|
+
allMilestonesComplete: false,
|
|
95
|
+
};
|
|
79
96
|
}
|
|
80
97
|
|
|
81
98
|
/**
|
|
@@ -118,7 +135,7 @@ export interface DispatchDecisionInput {
|
|
|
118
135
|
|
|
119
136
|
function getAlreadyClosedDispatchReason(unitType: string, unitId: string): string | null {
|
|
120
137
|
if (!isDbAvailable()) return null;
|
|
121
|
-
|
|
138
|
+
refreshWorkflowDatabaseFromDisk();
|
|
122
139
|
const { milestone, slice, task } = parseUnitId(unitId);
|
|
123
140
|
if (unitType === "execute-task" && milestone && slice && task) {
|
|
124
141
|
const row = getTask(milestone, slice, task);
|
|
@@ -177,14 +194,26 @@ export async function decideOrchestratorDispatch(
|
|
|
177
194
|
): Promise<DispatchDecision> {
|
|
178
195
|
const state = input.stateSnapshot;
|
|
179
196
|
const active = state.activeMilestone;
|
|
180
|
-
if (!active) return null;
|
|
181
|
-
|
|
182
197
|
const activeSession = input.session ?? session;
|
|
183
198
|
const activeDispatchBasePath = activeSession?.basePath || dispatchBasePath;
|
|
184
|
-
|
|
199
|
+
const prefs = loadEffectiveGSDPreferences(activeDispatchBasePath)?.preferences;
|
|
200
|
+
if (!active) {
|
|
201
|
+
if (state.phase !== "pre-planning") return null;
|
|
202
|
+
if (!hasPendingDeepStage(prefs, activeDispatchBasePath)) {
|
|
203
|
+
return {
|
|
204
|
+
kind: "blocked",
|
|
205
|
+
reason: state.nextAction || "No active milestone. Run /gsd unpark <id> or create a new milestone.",
|
|
206
|
+
action: "stop",
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (active && activeSession && shouldAdoptActiveMilestone(state, activeSession, activeDispatchBasePath)) {
|
|
185
212
|
activeSession.currentMilestoneId = active.id;
|
|
213
|
+
activeSession.milestoneLeaseToken = null;
|
|
186
214
|
}
|
|
187
|
-
const
|
|
215
|
+
const dispatchMid = active?.id ?? activeSession?.currentMilestoneId ?? "";
|
|
216
|
+
const dispatchMidTitle = active?.title ?? "";
|
|
188
217
|
|
|
189
218
|
// Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
|
|
190
219
|
// (#5789). Prefer caller-supplied values when present so test harnesses and
|
|
@@ -201,6 +230,7 @@ export async function decideOrchestratorDispatch(
|
|
|
201
230
|
// active set may be narrowed by the prior unit before selectAndApplyModel
|
|
202
231
|
// restores it, causing false transport-preflight failures (#477 follow-up).
|
|
203
232
|
const activeTools = getToolBaselineSnapshot(pi);
|
|
233
|
+
const registeredTools = getRegisteredToolSnapshot(pi);
|
|
204
234
|
// Mirrors runDispatch: deep-planning keeps approval gates in plain chat
|
|
205
235
|
// because structured questions can be cancelled outside the chat turn on
|
|
206
236
|
// some transports.
|
|
@@ -215,8 +245,15 @@ export async function decideOrchestratorDispatch(
|
|
|
215
245
|
? "true"
|
|
216
246
|
: "false");
|
|
217
247
|
|
|
248
|
+
// Only replay a milestone-scoped verification retry when a milestone is
|
|
249
|
+
// active. Pre-PR (#712 fix), `!active` returned null before reaching this
|
|
250
|
+
// block, so the retry was preserved for a future tick. The new
|
|
251
|
+
// pre-planning + deep-pending fall-through must keep that contract:
|
|
252
|
+
// otherwise a stale execute-task / complete-slice / complete-milestone
|
|
253
|
+
// retry whose target milestone has since been parked would preempt
|
|
254
|
+
// project-level deep rules like `discuss-project`.
|
|
218
255
|
const pendingRetry = session?.pendingVerificationRetryDispatch;
|
|
219
|
-
if (session && pendingRetry) {
|
|
256
|
+
if (session && pendingRetry && active) {
|
|
220
257
|
session.pendingVerificationRetryDispatch = null;
|
|
221
258
|
const alreadyClosedReason = getAlreadyClosedDispatchReason(
|
|
222
259
|
pendingRetry.unitType,
|
|
@@ -238,8 +275,8 @@ export async function decideOrchestratorDispatch(
|
|
|
238
275
|
|
|
239
276
|
const action = await resolveDispatch({
|
|
240
277
|
basePath: activeDispatchBasePath,
|
|
241
|
-
mid:
|
|
242
|
-
midTitle:
|
|
278
|
+
mid: dispatchMid,
|
|
279
|
+
midTitle: dispatchMidTitle,
|
|
243
280
|
state,
|
|
244
281
|
prefs,
|
|
245
282
|
session: activeSession,
|
|
@@ -248,6 +285,7 @@ export async function decideOrchestratorDispatch(
|
|
|
248
285
|
sessionProvider,
|
|
249
286
|
modelRegistry,
|
|
250
287
|
activeTools,
|
|
288
|
+
registeredTools,
|
|
251
289
|
sessionAuthMode: authMode,
|
|
252
290
|
sessionBaseUrl: ctx.model?.baseUrl,
|
|
253
291
|
});
|
|
@@ -282,8 +320,8 @@ export async function decideOrchestratorDispatch(
|
|
|
282
320
|
prompt: action.prompt,
|
|
283
321
|
pauseAfterUatDispatch: action.pauseAfterDispatch ?? false,
|
|
284
322
|
state,
|
|
285
|
-
mid:
|
|
286
|
-
midTitle:
|
|
323
|
+
mid: dispatchMid,
|
|
324
|
+
midTitle: dispatchMidTitle,
|
|
287
325
|
};
|
|
288
326
|
session.pendingOrchestrationDispatch = pending;
|
|
289
327
|
}
|
|
@@ -309,7 +347,13 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
309
347
|
private seq = 0;
|
|
310
348
|
private lastAdvanceKey: string | null = null;
|
|
311
349
|
private lastFinalizedUnitKey: string | null = null;
|
|
312
|
-
|
|
350
|
+
// Dispatch History module (#482): the dispatch-decision window with
|
|
351
|
+
// cross-session DB rehydration and full detect-stuck rules.
|
|
352
|
+
private readonly dispatchHistory: DispatchHistory;
|
|
353
|
+
// ADR-030 Phase Transition Invariant: the prior advance's reconciled Phase,
|
|
354
|
+
// the "from" endpoint of the edge check. In-memory; reset on start/resume/stop
|
|
355
|
+
// so the first advance of a session has no edge to assert.
|
|
356
|
+
private lastDerivedPhase: Phase | null = null;
|
|
313
357
|
// #442: the unit key we last attempted graduated stuck-recovery for. Bounds
|
|
314
358
|
// recovery to one attempt per stuck episode per run (reset on start/resume/
|
|
315
359
|
// stop), mirroring the legacy Level-1-then-Level-2 escalation in phases.ts.
|
|
@@ -322,6 +366,16 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
322
366
|
this.runtimeBasePath = context.runtimeBasePath;
|
|
323
367
|
this.s = context.session;
|
|
324
368
|
this.flowId = `auto-orchestrator-${Date.now()}`;
|
|
369
|
+
this.dispatchHistory = createDispatchHistory({
|
|
370
|
+
windowSize: STUCK_WINDOW_SIZE,
|
|
371
|
+
// Same stable scope the auto-loop uses for stuck-state persistence so
|
|
372
|
+
// rehydration reads the rows the dispatch ledger wrote for this project.
|
|
373
|
+
resolveScopeId: () =>
|
|
374
|
+
normalizeRealPath(
|
|
375
|
+
this.s.scope?.workspace.projectRoot ??
|
|
376
|
+
(this.s.originalBasePath || this.s.basePath || this.runtimeBasePath),
|
|
377
|
+
) || null,
|
|
378
|
+
});
|
|
325
379
|
}
|
|
326
380
|
|
|
327
381
|
// ── Live base-path resolution (was the wiring factory's getLiveDispatchBasePath) ──
|
|
@@ -532,6 +586,86 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
532
586
|
return decideOrchestratorDispatch(this.ctx, this.pi, this.dispatchBasePath, this.s, input);
|
|
533
587
|
}
|
|
534
588
|
|
|
589
|
+
private evaluateNoRemainingUnitsSettlement(stateSnapshot: GSDState): BlockedAdvanceResult | null {
|
|
590
|
+
const settlement = evaluateAllCompleteSettlement({
|
|
591
|
+
milestoneId: this.s.currentMilestoneId ?? stateSnapshot.activeMilestone?.id,
|
|
592
|
+
statePhase: stateSnapshot.phase,
|
|
593
|
+
basePath: this.s.basePath || this.getLiveDispatchBasePath(),
|
|
594
|
+
originalBasePath: this.s.originalBasePath || this.runtimeBasePath,
|
|
595
|
+
milestoneMerged: this.s.milestoneMergedInPhases,
|
|
596
|
+
});
|
|
597
|
+
this.s.milestoneSettlement = settlement;
|
|
598
|
+
if (settlement.ok) return null;
|
|
599
|
+
return {
|
|
600
|
+
kind: "blocked",
|
|
601
|
+
reason: settlement.message,
|
|
602
|
+
action: settlement.action,
|
|
603
|
+
stateSnapshot,
|
|
604
|
+
terminalOutcome: {
|
|
605
|
+
code: "settlement-blocked",
|
|
606
|
+
displayReason: settlement.message,
|
|
607
|
+
nextAction: settlement.nextAction,
|
|
608
|
+
milestoneId: settlement.milestoneId,
|
|
609
|
+
allMilestonesComplete: false,
|
|
610
|
+
},
|
|
611
|
+
};
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
private async mergePendingCompleteMilestone(milestoneId: string): Promise<{ ok: true } | { ok: false; reason: string }> {
|
|
615
|
+
const result = this.buildLifecycle().exitMilestone(
|
|
616
|
+
milestoneId,
|
|
617
|
+
{ merge: true },
|
|
618
|
+
this.ctx.ui,
|
|
619
|
+
);
|
|
620
|
+
if (!result.ok) {
|
|
621
|
+
const detail = result.cause instanceof Error
|
|
622
|
+
? result.cause.message
|
|
623
|
+
: result.reason;
|
|
624
|
+
return {
|
|
625
|
+
ok: false,
|
|
626
|
+
reason: `Milestone ${milestoneId} is complete, but the system-owned merge failed: ${detail}`,
|
|
627
|
+
};
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
this.s.milestoneMergedInPhases = true;
|
|
631
|
+
this.s.milestoneSettlement = { ok: true, reason: "settled" };
|
|
632
|
+
try {
|
|
633
|
+
const projectRoot = this.s.originalBasePath || this.s.canonicalProjectRoot || this.runtimeBasePath;
|
|
634
|
+
const { rebuildMarkdownProjectionsFromDb } = await import("../commands-maintenance.js");
|
|
635
|
+
await rebuildMarkdownProjectionsFromDb(projectRoot);
|
|
636
|
+
} catch (err) {
|
|
637
|
+
logWarning(
|
|
638
|
+
"engine",
|
|
639
|
+
`markdown projection rebuild after settlement merge failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
640
|
+
);
|
|
641
|
+
}
|
|
642
|
+
return { ok: true };
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
private clearPendingDispatch(): void {
|
|
646
|
+
this.s.pendingOrchestrationDispatch = null;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
private findPriorSliceCompletionBlocker(unitType: string, unitId: string): string | null {
|
|
650
|
+
const guardBasePath = resolveWorktreeProjectRoot(
|
|
651
|
+
this.getLiveDispatchBasePath(),
|
|
652
|
+
this.s.originalBasePath,
|
|
653
|
+
);
|
|
654
|
+
let mainBranch = "main";
|
|
655
|
+
try {
|
|
656
|
+
mainBranch = getMainBranch(guardBasePath);
|
|
657
|
+
} catch (err) {
|
|
658
|
+
// Preserve legacy dispatch behavior: fall back to main when branch
|
|
659
|
+
// discovery fails, then let the guard make the progression decision.
|
|
660
|
+
logWarning(
|
|
661
|
+
"engine",
|
|
662
|
+
`branch discovery failed, falling back to main: ${getErrorMessage(err)}`,
|
|
663
|
+
{ file: "orchestrator.ts" },
|
|
664
|
+
);
|
|
665
|
+
}
|
|
666
|
+
return getPriorSliceCompletionBlocker(guardBasePath, mainBranch, unitType, unitId);
|
|
667
|
+
}
|
|
668
|
+
|
|
535
669
|
// ── ToolContractAdapter (folded) ─────────────────────────────────────────
|
|
536
670
|
|
|
537
671
|
private compileUnitToolContract(unitType: string): { ok: true; reason: string } | { ok: false; reason: string } {
|
|
@@ -543,8 +677,11 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
543
677
|
// ── WorktreeAdapter (folded) ─────────────────────────────────────────────
|
|
544
678
|
|
|
545
679
|
private getEffectiveUnitIsolationMode(basePath: string): ReturnType<typeof getIsolationMode> {
|
|
546
|
-
|
|
547
|
-
|
|
680
|
+
return resolveEffectiveUnitIsolationMode(
|
|
681
|
+
getIsolationMode(basePath),
|
|
682
|
+
this.s.isolationDegraded,
|
|
683
|
+
this.s.strandedRecoveryIsolationMode,
|
|
684
|
+
);
|
|
548
685
|
}
|
|
549
686
|
|
|
550
687
|
private buildLifecycle(): WorktreeLifecycle {
|
|
@@ -554,7 +691,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
554
691
|
return new GitServiceImpl(basePath, gitConfig);
|
|
555
692
|
},
|
|
556
693
|
worktreeProjection: new WorktreeStateProjection(),
|
|
557
|
-
mergeMilestoneToMain,
|
|
694
|
+
mergeMilestoneToMain: createMilestoneMergeTransaction(mergeMilestoneToMain),
|
|
558
695
|
});
|
|
559
696
|
}
|
|
560
697
|
|
|
@@ -584,9 +721,6 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
584
721
|
reason: `No Unit manifest is registered for ${unitType}`,
|
|
585
722
|
};
|
|
586
723
|
}
|
|
587
|
-
if (isolationMode !== "worktree") {
|
|
588
|
-
return { ok: true, reason: "not-required" };
|
|
589
|
-
}
|
|
590
724
|
const writeScope =
|
|
591
725
|
manifest.tools.mode === "all" || manifest.tools.mode === "docs"
|
|
592
726
|
? "source-writing"
|
|
@@ -595,7 +729,23 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
595
729
|
const activeBasePath = this.getLiveDispatchBasePath();
|
|
596
730
|
const snapshot = await deriveState(activeBasePath);
|
|
597
731
|
const milestoneId = snapshot.activeMilestone?.id ?? null;
|
|
598
|
-
const
|
|
732
|
+
const buildExpectedBranch = (mode: ReturnType<typeof getIsolationMode>) =>
|
|
733
|
+
mode !== "none" && milestoneId ? autoWorktreeBranch(milestoneId) : null;
|
|
734
|
+
// The milestone lease coordinates concurrent workers on an isolated
|
|
735
|
+
// milestone worktree/branch. `none` mode has no per-milestone isolation
|
|
736
|
+
// and does not reliably claim a lease, so requiring one there would
|
|
737
|
+
// falsely fail dispatch; enforce it only in isolated modes.
|
|
738
|
+
const buildLease = (mode: ReturnType<typeof getIsolationMode>) =>
|
|
739
|
+
milestoneId && this.s.workerId
|
|
740
|
+
? {
|
|
741
|
+
required: writeScope === "source-writing" && mode !== "none",
|
|
742
|
+
held: hasHeldMilestoneLease(this.s, milestoneId),
|
|
743
|
+
owner: this.s.workerId,
|
|
744
|
+
}
|
|
745
|
+
: undefined;
|
|
746
|
+
if (writeScope === "source-writing") {
|
|
747
|
+
reclaimMissingMilestoneLease(this.s, milestoneId, isolationMode, "orchestrator");
|
|
748
|
+
}
|
|
599
749
|
let result = safety.validateUnitRoot({
|
|
600
750
|
unitType,
|
|
601
751
|
unitId,
|
|
@@ -604,7 +754,8 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
604
754
|
unitRoot: activeBasePath,
|
|
605
755
|
milestoneId,
|
|
606
756
|
isolationMode,
|
|
607
|
-
expectedBranch,
|
|
757
|
+
expectedBranch: buildExpectedBranch(isolationMode),
|
|
758
|
+
lease: buildLease(isolationMode),
|
|
608
759
|
});
|
|
609
760
|
if (!result.ok) {
|
|
610
761
|
const repaired = await repairAutoWorktreeSafetyFailure({
|
|
@@ -621,16 +772,20 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
621
772
|
this.rebuildScope(this.s.basePath, this.s.currentMilestoneId);
|
|
622
773
|
return { ok: true };
|
|
623
774
|
},
|
|
624
|
-
revalidate: () =>
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
775
|
+
revalidate: () => {
|
|
776
|
+
const revalidatedMode = this.getEffectiveUnitIsolationMode(this.runtimeBasePath);
|
|
777
|
+
return safety.validateUnitRoot({
|
|
778
|
+
unitType,
|
|
779
|
+
unitId,
|
|
780
|
+
writeScope,
|
|
781
|
+
projectRoot: this.runtimeBasePath,
|
|
782
|
+
unitRoot: this.getLiveDispatchBasePath(),
|
|
783
|
+
milestoneId,
|
|
784
|
+
isolationMode: revalidatedMode,
|
|
785
|
+
expectedBranch: buildExpectedBranch(revalidatedMode),
|
|
786
|
+
lease: buildLease(revalidatedMode),
|
|
787
|
+
});
|
|
788
|
+
},
|
|
634
789
|
});
|
|
635
790
|
result = repaired.result;
|
|
636
791
|
if (result.ok) {
|
|
@@ -655,6 +810,21 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
655
810
|
return { action: recovery.action, reason: recovery.reason };
|
|
656
811
|
}
|
|
657
812
|
|
|
813
|
+
/**
|
|
814
|
+
* ADR-030 Phase Transition Invariant (advisory mode). The matrix is an
|
|
815
|
+
* assertion, not a decision-maker — deriveState already chose the phase; we
|
|
816
|
+
* only observe illegal *derived* edges that survived reconciliation. The
|
|
817
|
+
* matrix is still a sparse hardening spec, so this is telemetry-only (no
|
|
818
|
+
* block) until it is expanded into a validated legal-edge graph. To enforce:
|
|
819
|
+
* `throw violation;` instead of logging — recovery-classification maps
|
|
820
|
+
* IllegalPhaseTransitionError to kind "illegal-transition" (escalate).
|
|
821
|
+
*/
|
|
822
|
+
private observePhaseTransition(from: Phase, to: Phase): void {
|
|
823
|
+
if (isLegalEdge(from, to)) return;
|
|
824
|
+
const violation = new IllegalPhaseTransitionError(from, to);
|
|
825
|
+
debugLog("phase-transition-advisory", { from, to, message: violation.message });
|
|
826
|
+
}
|
|
827
|
+
|
|
658
828
|
// ── Lifecycle verbs ──────────────────────────────────────────────────────
|
|
659
829
|
|
|
660
830
|
/**
|
|
@@ -673,7 +843,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
673
843
|
* skipped result) instead of stopping.
|
|
674
844
|
*/
|
|
675
845
|
private tryStuckArtifactRecovery(unitType: string, unitId: string): boolean {
|
|
676
|
-
const key =
|
|
846
|
+
const key = buildDispatchKey(unitType, unitId);
|
|
677
847
|
if (this.lastStuckRecoveryKey === key) return false; // already tried this episode
|
|
678
848
|
const basePath = this.getLiveDispatchBasePath();
|
|
679
849
|
if (!verifyExpectedArtifact(unitType, unitId, basePath)) return false;
|
|
@@ -685,7 +855,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
685
855
|
if (!refreshed.ok && refreshed.fatal) return false;
|
|
686
856
|
this.lastStuckRecoveryKey = key;
|
|
687
857
|
invalidateAllCaches();
|
|
688
|
-
this.
|
|
858
|
+
this.dispatchHistory.clearOnRecovery();
|
|
689
859
|
this.lastAdvanceKey = null;
|
|
690
860
|
this.lastFinalizedUnitKey = null;
|
|
691
861
|
return true;
|
|
@@ -716,8 +886,14 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
716
886
|
public async start(_sessionContext: AutoSessionContext): Promise<AutoAdvanceResult> {
|
|
717
887
|
this.lastAdvanceKey = null;
|
|
718
888
|
this.lastFinalizedUnitKey = null;
|
|
719
|
-
|
|
889
|
+
// #482: the DB dispatch ledger is the source of truth across sessions.
|
|
890
|
+
// Discard any in-memory window and rebuild it from the ledger so a unit
|
|
891
|
+
// that was re-dispatched in previous sessions is detected as stuck here
|
|
892
|
+
// instead of silently re-dispatching forever.
|
|
893
|
+
this.dispatchHistory.clearOnRecovery();
|
|
894
|
+
this.dispatchHistory.rehydrate();
|
|
720
895
|
this.lastStuckRecoveryKey = null;
|
|
896
|
+
this.lastDerivedPhase = null;
|
|
721
897
|
this.status.phase = "running";
|
|
722
898
|
this.bumpTransition();
|
|
723
899
|
this.journalTransition({ name: "start" });
|
|
@@ -807,17 +983,65 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
807
983
|
return blocked;
|
|
808
984
|
}
|
|
809
985
|
|
|
986
|
+
const reconciledPhase = reconciliation.stateSnapshot.phase;
|
|
987
|
+
if (this.lastDerivedPhase !== null) {
|
|
988
|
+
this.observePhaseTransition(this.lastDerivedPhase, reconciledPhase);
|
|
989
|
+
}
|
|
990
|
+
this.lastDerivedPhase = reconciledPhase;
|
|
991
|
+
|
|
810
992
|
const decision = await this.decideNextUnit({ stateSnapshot: reconciliation.stateSnapshot });
|
|
811
993
|
if (!decision) {
|
|
994
|
+
const settlementBlock = this.evaluateNoRemainingUnitsSettlement(reconciliation.stateSnapshot);
|
|
995
|
+
if (settlementBlock) {
|
|
996
|
+
const settlement = this.s.milestoneSettlement;
|
|
997
|
+
if (settlement && !settlement.ok && settlement.reason === "merge-pending") {
|
|
998
|
+
const merged = await this.mergePendingCompleteMilestone(settlement.milestoneId);
|
|
999
|
+
if (merged.ok) {
|
|
1000
|
+
const terminalOutcome = noRemainingUnitsOutcome(reconciliation.stateSnapshot);
|
|
1001
|
+
const stopped: AutoAdvanceResult = {
|
|
1002
|
+
kind: "stopped",
|
|
1003
|
+
reason: terminalOutcome.displayReason,
|
|
1004
|
+
stateSnapshot: reconciliation.stateSnapshot,
|
|
1005
|
+
terminalOutcome,
|
|
1006
|
+
};
|
|
1007
|
+
this.status.phase = "stopped";
|
|
1008
|
+
this.status.activeUnit = undefined;
|
|
1009
|
+
this.lastAdvanceKey = null;
|
|
1010
|
+
this.dispatchHistory.clearOnRecovery();
|
|
1011
|
+
this.bumpTransition();
|
|
1012
|
+
this.journalTransition({ name: "advance-stopped", reason: stopped.reason });
|
|
1013
|
+
this.postAdvanceRecord(stopped);
|
|
1014
|
+
return stopped;
|
|
1015
|
+
}
|
|
1016
|
+
settlementBlock.reason = merged.reason;
|
|
1017
|
+
settlementBlock.terminalOutcome = {
|
|
1018
|
+
code: "settlement-blocked",
|
|
1019
|
+
displayReason: merged.reason,
|
|
1020
|
+
nextAction: `Fix the merge failure, then retry \`/gsd dispatch complete-milestone ${settlement.milestoneId}\`.`,
|
|
1021
|
+
milestoneId: settlement.milestoneId,
|
|
1022
|
+
allMilestonesComplete: false,
|
|
1023
|
+
};
|
|
1024
|
+
}
|
|
1025
|
+
this.status.phase = "paused";
|
|
1026
|
+
this.status.activeUnit = undefined;
|
|
1027
|
+
this.lastAdvanceKey = null;
|
|
1028
|
+
this.dispatchHistory.clearOnRecovery();
|
|
1029
|
+
this.bumpTransition();
|
|
1030
|
+
this.journalTransition({ name: "advance-blocked", reason: settlementBlock.reason });
|
|
1031
|
+
this.postAdvanceRecord(settlementBlock);
|
|
1032
|
+
return settlementBlock;
|
|
1033
|
+
}
|
|
1034
|
+
const terminalOutcome = noRemainingUnitsOutcome(reconciliation.stateSnapshot);
|
|
812
1035
|
const stopped: AutoAdvanceResult = {
|
|
813
1036
|
kind: "stopped",
|
|
814
|
-
reason:
|
|
1037
|
+
reason: terminalOutcome.displayReason,
|
|
815
1038
|
stateSnapshot: reconciliation.stateSnapshot,
|
|
1039
|
+
terminalOutcome,
|
|
816
1040
|
};
|
|
817
1041
|
this.status.phase = "stopped";
|
|
818
1042
|
this.status.activeUnit = undefined;
|
|
819
1043
|
this.lastAdvanceKey = null;
|
|
820
|
-
this.
|
|
1044
|
+
this.dispatchHistory.clearOnRecovery();
|
|
821
1045
|
this.bumpTransition();
|
|
822
1046
|
this.journalTransition({ name: "advance-stopped", reason: stopped.reason });
|
|
823
1047
|
this.postAdvanceRecord(stopped);
|
|
@@ -848,25 +1072,41 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
848
1072
|
return blocked;
|
|
849
1073
|
}
|
|
850
1074
|
|
|
851
|
-
const
|
|
1075
|
+
const priorSliceBlocker = this.findPriorSliceCompletionBlocker(decision.unitType, decision.unitId);
|
|
1076
|
+
if (priorSliceBlocker) {
|
|
1077
|
+
this.clearPendingDispatch();
|
|
1078
|
+
const blocked: AutoAdvanceResult = {
|
|
1079
|
+
kind: "blocked",
|
|
1080
|
+
reason: priorSliceBlocker,
|
|
1081
|
+
action: "stop",
|
|
1082
|
+
stateSnapshot: reconciliation.stateSnapshot,
|
|
1083
|
+
};
|
|
1084
|
+
this.journalTransition({
|
|
1085
|
+
name: "advance-blocked",
|
|
1086
|
+
reason: blocked.reason,
|
|
1087
|
+
unitType: decision.unitType,
|
|
1088
|
+
unitId: decision.unitId,
|
|
1089
|
+
});
|
|
1090
|
+
this.postAdvanceRecord(blocked);
|
|
1091
|
+
return blocked;
|
|
1092
|
+
}
|
|
852
1093
|
|
|
853
|
-
// Record every dispatch decision in the
|
|
1094
|
+
// Record every dispatch decision in the history window before pre-flight
|
|
854
1095
|
// checks so the stuck-loop detector observes the full decision history
|
|
855
1096
|
// (including decisions that idempotency would otherwise short-circuit).
|
|
856
|
-
// The
|
|
857
|
-
this.
|
|
858
|
-
if (this.dispatchKeyWindow.length > STUCK_WINDOW_SIZE) {
|
|
859
|
-
this.dispatchKeyWindow.shift();
|
|
860
|
-
}
|
|
1097
|
+
// The window is capped at STUCK_WINDOW_SIZE and evicts oldest-first.
|
|
1098
|
+
const nextKey = this.dispatchHistory.recordDispatch(decision.unitType, decision.unitId);
|
|
861
1099
|
|
|
862
|
-
const matchingCount = this.
|
|
1100
|
+
const matchingCount = this.dispatchHistory.countMatching(nextKey);
|
|
863
1101
|
if (this.lastFinalizedUnitKey === nextKey) {
|
|
864
1102
|
// #442: the unit re-dispatched immediately after finalizing may have
|
|
865
1103
|
// actually completed on disk with a stale DB. Verify + recover before
|
|
866
1104
|
// hard-stopping (legacy graduated stuck-recovery parity).
|
|
867
1105
|
if (this.tryStuckArtifactRecovery(decision.unitType, decision.unitId)) {
|
|
1106
|
+
this.clearPendingDispatch();
|
|
868
1107
|
return this.stuckRecovered(decision, reconciliation.stateSnapshot);
|
|
869
1108
|
}
|
|
1109
|
+
this.clearPendingDispatch();
|
|
870
1110
|
const blocked: AutoAdvanceResult = {
|
|
871
1111
|
kind: "blocked",
|
|
872
1112
|
reason: `state did not advance after finalized ${decision.unitType} ${decision.unitId}`,
|
|
@@ -890,31 +1130,43 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
890
1130
|
// checks coexist: idempotency for the common immediate-repeat case,
|
|
891
1131
|
// stuck-loop for the saturated-window case.
|
|
892
1132
|
if (this.lastAdvanceKey === nextKey && matchingCount < STUCK_WINDOW_SIZE) {
|
|
893
|
-
|
|
1133
|
+
// Unit already active — benign no-op. Return skipped so the loop re-polls
|
|
1134
|
+
// without cancelling the in-flight unit (blocked+pause would force-cancel it).
|
|
1135
|
+
this.clearPendingDispatch();
|
|
1136
|
+
const skipped: AutoAdvanceResult = { kind: "skipped", reason: "idempotent advance: unit already active" };
|
|
894
1137
|
this.journalTransition({
|
|
895
|
-
name: "advance-
|
|
896
|
-
reason:
|
|
1138
|
+
name: "advance-skipped",
|
|
1139
|
+
reason: skipped.reason,
|
|
897
1140
|
unitType: decision.unitType,
|
|
898
1141
|
unitId: decision.unitId,
|
|
899
1142
|
});
|
|
900
|
-
this.postAdvanceRecord(
|
|
901
|
-
return
|
|
1143
|
+
this.postAdvanceRecord(skipped);
|
|
1144
|
+
return skipped;
|
|
902
1145
|
}
|
|
903
1146
|
|
|
904
|
-
// Stuck-loop detection: when the
|
|
905
|
-
// `nextKey` (count >= STUCK_WINDOW_SIZE), the
|
|
906
|
-
//
|
|
907
|
-
//
|
|
908
|
-
|
|
1147
|
+
// Stuck-loop detection: when the window is saturated with copies of
|
|
1148
|
+
// `nextKey` (count >= STUCK_WINDOW_SIZE), consult the Dispatch History
|
|
1149
|
+
// module's full detect-stuck rule set for the verdict instead of the old
|
|
1150
|
+
// bare saturation count. This keeps the saturation threshold (the window
|
|
1151
|
+
// deliberately records benign idempotent repeats, so earlier-firing
|
|
1152
|
+
// rules would false-positive on pause/resume re-advances) while gaining
|
|
1153
|
+
// retry-budget suppression and diagnosable rule reasons. A saturated
|
|
1154
|
+
// window with no verdict means the dispatch ledger says we are inside
|
|
1155
|
+
// the unit's retry-backoff budget — let the retry proceed.
|
|
1156
|
+
const stuckVerdict =
|
|
1157
|
+
matchingCount >= STUCK_WINDOW_SIZE ? this.dispatchHistory.detectStuck() : null;
|
|
1158
|
+
if (stuckVerdict) {
|
|
909
1159
|
// #442: before declaring a stuck loop, verify the unit didn't actually
|
|
910
1160
|
// complete on disk (stale DB) and recover if so — legacy graduated
|
|
911
1161
|
// stuck-recovery parity. Otherwise hard-stop with a diagnosable reason.
|
|
912
1162
|
if (this.tryStuckArtifactRecovery(decision.unitType, decision.unitId)) {
|
|
1163
|
+
this.clearPendingDispatch();
|
|
913
1164
|
return this.stuckRecovered(decision, reconciliation.stateSnapshot);
|
|
914
1165
|
}
|
|
1166
|
+
this.clearPendingDispatch();
|
|
915
1167
|
const blocked: AutoAdvanceResult = {
|
|
916
1168
|
kind: "blocked",
|
|
917
|
-
reason: `stuck-loop: ${
|
|
1169
|
+
reason: `stuck-loop: ${stuckVerdict.reason}`,
|
|
918
1170
|
action: "stop",
|
|
919
1171
|
};
|
|
920
1172
|
this.journalTransition({
|
|
@@ -929,6 +1181,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
929
1181
|
|
|
930
1182
|
const contract = this.compileUnitToolContract(decision.unitType);
|
|
931
1183
|
if (!contract.ok) {
|
|
1184
|
+
this.clearPendingDispatch();
|
|
932
1185
|
const blocked: AutoAdvanceResult = {
|
|
933
1186
|
kind: "blocked",
|
|
934
1187
|
reason: contract.reason,
|
|
@@ -947,6 +1200,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
947
1200
|
|
|
948
1201
|
const worktree = await this.prepareWorktreeForUnit(decision.unitType, decision.unitId);
|
|
949
1202
|
if (!worktree.ok) {
|
|
1203
|
+
this.clearPendingDispatch();
|
|
950
1204
|
const blocked: AutoAdvanceResult = {
|
|
951
1205
|
kind: "blocked",
|
|
952
1206
|
reason: worktree.reason,
|
|
@@ -1006,7 +1260,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1006
1260
|
if (result.kind === "stopped") {
|
|
1007
1261
|
this.lastAdvanceKey = null;
|
|
1008
1262
|
this.lastFinalizedUnitKey = null;
|
|
1009
|
-
this.
|
|
1263
|
+
this.dispatchHistory.clearOnRecovery();
|
|
1010
1264
|
this.status.activeUnit = undefined;
|
|
1011
1265
|
}
|
|
1012
1266
|
this.bumpTransition();
|
|
@@ -1035,8 +1289,18 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1035
1289
|
public async resume(): Promise<AutoAdvanceResult> {
|
|
1036
1290
|
this.lastAdvanceKey = null;
|
|
1037
1291
|
this.lastFinalizedUnitKey = null;
|
|
1038
|
-
|
|
1292
|
+
// Preserve the dispatch-history window across an in-process resume so
|
|
1293
|
+
// stuck-loop detection accumulates across pause/resume cycles rather than
|
|
1294
|
+
// resetting each time (#572 regression). When the window is empty (fresh
|
|
1295
|
+
// orchestrator resuming a prior session), rehydrate it from the DB
|
|
1296
|
+
// dispatch ledger so cross-session re-dispatch loops are detected (#482).
|
|
1297
|
+
if (this.dispatchHistory.getRecentWindow().length === 0) {
|
|
1298
|
+
this.dispatchHistory.rehydrate();
|
|
1299
|
+
}
|
|
1039
1300
|
this.lastStuckRecoveryKey = null;
|
|
1301
|
+
// ADR-030: drop the prior "from" — the first advance after resume has no
|
|
1302
|
+
// edge to assert (avoids a false illegal-edge across the pause boundary).
|
|
1303
|
+
this.lastDerivedPhase = null;
|
|
1040
1304
|
this.status.phase = "running";
|
|
1041
1305
|
this.bumpTransition();
|
|
1042
1306
|
this.journalTransition({ name: "resume" });
|
|
@@ -1053,7 +1317,12 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1053
1317
|
this.status.activeUnit = undefined;
|
|
1054
1318
|
this.lastAdvanceKey = null;
|
|
1055
1319
|
this.lastFinalizedUnitKey = null;
|
|
1056
|
-
this.
|
|
1320
|
+
this.lastDerivedPhase = null;
|
|
1321
|
+
// Preserve the dispatch-history window on pause so stuck-loop detection
|
|
1322
|
+
// accumulates across pause/resume cycles. Only clear on a hard stop.
|
|
1323
|
+
if (reason !== "pause") {
|
|
1324
|
+
this.dispatchHistory.clearOnRecovery();
|
|
1325
|
+
}
|
|
1057
1326
|
this.lastStuckRecoveryKey = null;
|
|
1058
1327
|
this.bumpTransition();
|
|
1059
1328
|
this.journalTransition({ name: "stop", reason });
|
|
@@ -1066,9 +1335,9 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1066
1335
|
}
|
|
1067
1336
|
|
|
1068
1337
|
public async completeActiveUnit(unit: { unitType: string; unitId: string }): Promise<void> {
|
|
1069
|
-
const unitKey =
|
|
1338
|
+
const unitKey = buildDispatchKey(unit.unitType, unit.unitId);
|
|
1070
1339
|
const activeUnitKey = this.status.activeUnit
|
|
1071
|
-
?
|
|
1340
|
+
? buildDispatchKey(this.status.activeUnit.unitType, this.status.activeUnit.unitId)
|
|
1072
1341
|
: null;
|
|
1073
1342
|
if (activeUnitKey !== unitKey) return;
|
|
1074
1343
|
|
|
@@ -1086,9 +1355,9 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1086
1355
|
}
|
|
1087
1356
|
|
|
1088
1357
|
public async retryActiveUnit(unit: { unitType: string; unitId: string }): Promise<void> {
|
|
1089
|
-
const unitKey =
|
|
1358
|
+
const unitKey = buildDispatchKey(unit.unitType, unit.unitId);
|
|
1090
1359
|
const activeUnitKey = this.status.activeUnit
|
|
1091
|
-
?
|
|
1360
|
+
? buildDispatchKey(this.status.activeUnit.unitType, this.status.activeUnit.unitId)
|
|
1092
1361
|
: null;
|
|
1093
1362
|
if (activeUnitKey !== unitKey && this.lastFinalizedUnitKey !== unitKey) return;
|
|
1094
1363
|
|