@opengsd/gsd-pi 1.2.0-dev.4c756166 → 1.2.0-dev.6ccd27b3
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.js +2 -19
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- 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 +3 -2
- 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 +464 -200
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
- 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 +7 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +207 -73
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2324
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -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-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +43 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +47 -29
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +50 -354
- package/dist/resources/extensions/gsd/auto.js +49 -22
- 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/dynamic-tools.js +69 -19
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
- 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-recovery.js +3 -2
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- 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.js +46 -3
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -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 +755 -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-writer.js +8 -17
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- 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/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +9 -0
- 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-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 +172 -2048
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +144 -9
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
- package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
- 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-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
- 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-models.js +14 -48
- package/dist/resources/extensions/gsd/preferences.js +14 -0
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -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 +2 -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 +5 -2
- 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-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -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 +25 -3
- 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/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +12 -22
- 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/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -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-slice.js +14 -8
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -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/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- 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 +74 -1
- 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-tool-contracts.js +9 -182
- 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 +45 -8
- 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-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- 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.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/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 +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
- 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 +1 -1
- 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 +10 -10
- 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/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.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/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +3 -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/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 +55 -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 +7 -0
- 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-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.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -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 +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +207 -102
- 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/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- 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 +158 -17
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +132 -17
- 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/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/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 +7 -2
- 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 +543 -202
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +700 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- 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 +1 -1
- package/src/resources/extensions/gsd/auto/loop.ts +7 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +232 -76
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3013
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -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-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +52 -13
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +48 -33
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +56 -366
- package/src/resources/extensions/gsd/auto.ts +69 -26
- 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/dynamic-tools.ts +89 -18
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
- 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-recovery.ts +2 -1
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- 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.ts +46 -3
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -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 +809 -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-writer.ts +11 -19
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- 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/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +11 -0
- 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-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 +176 -2375
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +195 -29
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
- package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
- 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-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
- 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-models.ts +12 -47
- package/src/resources/extensions/gsd/preferences.ts +18 -0
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -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 +2 -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 +5 -2
- 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-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -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 +28 -3
- 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/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +16 -22
- 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/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-loop.test.ts +329 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
- 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 +54 -1
- 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-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/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/commands-verdict.test.ts +8 -7
- 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-history.test.ts +328 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- 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/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/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/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/migration-auto-check.test.ts +85 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- 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/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/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/prompt-contracts.test.ts +10 -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 +2 -4
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -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 +248 -1
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +27 -2
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -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 +43 -6
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- 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-invocation-error-loop-break.test.ts +8 -0
- 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 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -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/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- 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 +67 -4
- 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/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 +22 -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-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.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 +109 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -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-slice.ts +14 -8
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -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/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- 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 +111 -1
- 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-tool-contracts.ts +27 -192
- 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 +51 -8
- 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-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
- 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.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/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 -218
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → avEtvPrImYTq2gGe-hVNp}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → avEtvPrImYTq2gGe-hVNp}/_ssgManifest.js +0 -0
|
@@ -9,9 +9,10 @@
|
|
|
9
9
|
// the real collaborators (state-reconciliation, doctor-proactive,
|
|
10
10
|
// auto-dispatch, recovery-classification, tool-contract, worktree-safety,
|
|
11
11
|
// uok/gate-runner, journal, session-lock, ctx.ui.notify) directly.
|
|
12
|
-
import { debugCount, debugTime } from "../debug-logger.js";
|
|
12
|
+
import { debugCount, debugLog, debugTime } from "../debug-logger.js";
|
|
13
13
|
import { reconcileBeforeDispatch } from "../state-reconciliation.js";
|
|
14
|
-
import {
|
|
14
|
+
import { isLegalEdge, IllegalPhaseTransitionError } from "../state-transition-matrix.js";
|
|
15
|
+
import { hasPendingDeepStage, resolveDispatch } from "../auto-dispatch.js";
|
|
15
16
|
import { classifyFailure } from "../recovery-classification.js";
|
|
16
17
|
import { verifyExpectedArtifact, refreshRecoveryDbForArtifact } from "../auto-recovery.js";
|
|
17
18
|
import { invalidateAllCaches } from "../cache.js";
|
|
@@ -24,7 +25,7 @@ import { checkResourcesStale, autoWorktreeBranch, mergeMilestoneToMain } from ".
|
|
|
24
25
|
import { getSessionLockStatus } from "../session-lock.js";
|
|
25
26
|
import { resolveUokFlags } from "../uok/flags.js";
|
|
26
27
|
import { emitJournalEvent as _emitJournalEvent } from "../journal.js";
|
|
27
|
-
import { loadEffectiveGSDPreferences, getIsolationMode } from "../preferences.js";
|
|
28
|
+
import { loadEffectiveGSDPreferences, getIsolationMode, resolveEffectiveUnitIsolationMode } from "../preferences.js";
|
|
28
29
|
import { detectWorktreeName, getMainBranch, resolveProjectRoot, resolveWorktreeProjectRoot, } from "../worktree.js";
|
|
29
30
|
import { getPriorSliceCompletionBlocker } from "../dispatch-guard.js";
|
|
30
31
|
import { GitServiceImpl } from "../git-service.js";
|
|
@@ -41,21 +42,15 @@ import { isDbAvailable, getSlice, getTask, } from "../gsd-db.js";
|
|
|
41
42
|
import { refreshWorkflowDatabaseFromDisk } from "../db-workspace.js";
|
|
42
43
|
import { getErrorMessage } from "../error-utils.js";
|
|
43
44
|
import { logWarning } from "../workflow-logger.js";
|
|
45
|
+
import { normalizeRealPath } from "../paths.js";
|
|
46
|
+
import { buildDispatchKey, createDispatchHistory, STUCK_WINDOW_SIZE, } from "./dispatch-history.js";
|
|
44
47
|
import { existsSync, readFileSync } from "node:fs";
|
|
45
48
|
import { join } from "node:path";
|
|
46
49
|
import { evaluateAllCompleteSettlement } from "../milestone-settlement.js";
|
|
50
|
+
import { hasHeldMilestoneLease, reclaimMissingMilestoneLease } from "./milestone-lease-reclaim.js";
|
|
47
51
|
function now() {
|
|
48
52
|
return Date.now();
|
|
49
53
|
}
|
|
50
|
-
/**
|
|
51
|
-
* Size of the dispatch-decision ring buffer used by the Auto Orchestration
|
|
52
|
-
* module's stuck-loop detector. When the same `${unitType}:${unitId}` key
|
|
53
|
-
* fills the window, advance() blocks with `action: "stop"`.
|
|
54
|
-
*
|
|
55
|
-
* Mirrors the legacy `STUCK_WINDOW_SIZE` in auto/phases.ts so behaviour is
|
|
56
|
-
* preserved across the eventual cutover (issue #5791).
|
|
57
|
-
*/
|
|
58
|
-
export const STUCK_WINDOW_SIZE = 6;
|
|
59
54
|
function noRemainingUnitsOutcome(stateSnapshot) {
|
|
60
55
|
if (stateSnapshot.phase === "complete") {
|
|
61
56
|
return {
|
|
@@ -117,14 +112,26 @@ function shouldAdoptActiveMilestone(state, activeSession, activeDispatchBasePath
|
|
|
117
112
|
export async function decideOrchestratorDispatch(ctx, pi, dispatchBasePath, session, input) {
|
|
118
113
|
const state = input.stateSnapshot;
|
|
119
114
|
const active = state.activeMilestone;
|
|
120
|
-
if (!active)
|
|
121
|
-
return null;
|
|
122
115
|
const activeSession = input.session ?? session;
|
|
123
116
|
const activeDispatchBasePath = activeSession?.basePath || dispatchBasePath;
|
|
124
|
-
|
|
117
|
+
const prefs = loadEffectiveGSDPreferences(activeDispatchBasePath)?.preferences;
|
|
118
|
+
if (!active) {
|
|
119
|
+
if (state.phase !== "pre-planning")
|
|
120
|
+
return null;
|
|
121
|
+
if (!hasPendingDeepStage(prefs, activeDispatchBasePath)) {
|
|
122
|
+
return {
|
|
123
|
+
kind: "blocked",
|
|
124
|
+
reason: state.nextAction || "No active milestone. Run /gsd unpark <id> or create a new milestone.",
|
|
125
|
+
action: "stop",
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (active && activeSession && shouldAdoptActiveMilestone(state, activeSession, activeDispatchBasePath)) {
|
|
125
130
|
activeSession.currentMilestoneId = active.id;
|
|
131
|
+
activeSession.milestoneLeaseToken = null;
|
|
126
132
|
}
|
|
127
|
-
const
|
|
133
|
+
const dispatchMid = active?.id ?? activeSession?.currentMilestoneId ?? "";
|
|
134
|
+
const dispatchMidTitle = active?.title ?? "";
|
|
128
135
|
// Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
|
|
129
136
|
// (#5789). Prefer caller-supplied values when present so test harnesses and
|
|
130
137
|
// alternative wirings can inject deterministic snapshots; otherwise pull from
|
|
@@ -152,8 +159,15 @@ export async function decideOrchestratorDispatch(ctx, pi, dispatchBasePath, sess
|
|
|
152
159
|
})
|
|
153
160
|
? "true"
|
|
154
161
|
: "false");
|
|
162
|
+
// Only replay a milestone-scoped verification retry when a milestone is
|
|
163
|
+
// active. Pre-PR (#712 fix), `!active` returned null before reaching this
|
|
164
|
+
// block, so the retry was preserved for a future tick. The new
|
|
165
|
+
// pre-planning + deep-pending fall-through must keep that contract:
|
|
166
|
+
// otherwise a stale execute-task / complete-slice / complete-milestone
|
|
167
|
+
// retry whose target milestone has since been parked would preempt
|
|
168
|
+
// project-level deep rules like `discuss-project`.
|
|
155
169
|
const pendingRetry = session?.pendingVerificationRetryDispatch;
|
|
156
|
-
if (session && pendingRetry) {
|
|
170
|
+
if (session && pendingRetry && active) {
|
|
157
171
|
session.pendingVerificationRetryDispatch = null;
|
|
158
172
|
const alreadyClosedReason = getAlreadyClosedDispatchReason(pendingRetry.unitType, pendingRetry.unitId);
|
|
159
173
|
if (alreadyClosedReason) {
|
|
@@ -171,8 +185,8 @@ export async function decideOrchestratorDispatch(ctx, pi, dispatchBasePath, sess
|
|
|
171
185
|
}
|
|
172
186
|
const action = await resolveDispatch({
|
|
173
187
|
basePath: activeDispatchBasePath,
|
|
174
|
-
mid:
|
|
175
|
-
midTitle:
|
|
188
|
+
mid: dispatchMid,
|
|
189
|
+
midTitle: dispatchMidTitle,
|
|
176
190
|
state,
|
|
177
191
|
prefs,
|
|
178
192
|
session: activeSession,
|
|
@@ -217,8 +231,8 @@ export async function decideOrchestratorDispatch(ctx, pi, dispatchBasePath, sess
|
|
|
217
231
|
prompt: action.prompt,
|
|
218
232
|
pauseAfterUatDispatch: action.pauseAfterDispatch ?? false,
|
|
219
233
|
state,
|
|
220
|
-
mid:
|
|
221
|
-
midTitle:
|
|
234
|
+
mid: dispatchMid,
|
|
235
|
+
midTitle: dispatchMidTitle,
|
|
222
236
|
};
|
|
223
237
|
session.pendingOrchestrationDispatch = pending;
|
|
224
238
|
}
|
|
@@ -243,7 +257,13 @@ export class AutoOrchestrator {
|
|
|
243
257
|
seq = 0;
|
|
244
258
|
lastAdvanceKey = null;
|
|
245
259
|
lastFinalizedUnitKey = null;
|
|
246
|
-
|
|
260
|
+
// Dispatch History module (#482): the dispatch-decision window with
|
|
261
|
+
// cross-session DB rehydration and full detect-stuck rules.
|
|
262
|
+
dispatchHistory;
|
|
263
|
+
// ADR-030 Phase Transition Invariant: the prior advance's reconciled Phase,
|
|
264
|
+
// the "from" endpoint of the edge check. In-memory; reset on start/resume/stop
|
|
265
|
+
// so the first advance of a session has no edge to assert.
|
|
266
|
+
lastDerivedPhase = null;
|
|
247
267
|
// #442: the unit key we last attempted graduated stuck-recovery for. Bounds
|
|
248
268
|
// recovery to one attempt per stuck episode per run (reset on start/resume/
|
|
249
269
|
// stop), mirroring the legacy Level-1-then-Level-2 escalation in phases.ts.
|
|
@@ -255,6 +275,13 @@ export class AutoOrchestrator {
|
|
|
255
275
|
this.runtimeBasePath = context.runtimeBasePath;
|
|
256
276
|
this.s = context.session;
|
|
257
277
|
this.flowId = `auto-orchestrator-${Date.now()}`;
|
|
278
|
+
this.dispatchHistory = createDispatchHistory({
|
|
279
|
+
windowSize: STUCK_WINDOW_SIZE,
|
|
280
|
+
// Same stable scope the auto-loop uses for stuck-state persistence so
|
|
281
|
+
// rehydration reads the rows the dispatch ledger wrote for this project.
|
|
282
|
+
resolveScopeId: () => normalizeRealPath(this.s.scope?.workspace.projectRoot ??
|
|
283
|
+
(this.s.originalBasePath || this.s.basePath || this.runtimeBasePath)) || null,
|
|
284
|
+
});
|
|
258
285
|
}
|
|
259
286
|
// ── Live base-path resolution (was the wiring factory's getLiveDispatchBasePath) ──
|
|
260
287
|
getLiveDispatchBasePath() {
|
|
@@ -451,6 +478,29 @@ export class AutoOrchestrator {
|
|
|
451
478
|
},
|
|
452
479
|
};
|
|
453
480
|
}
|
|
481
|
+
async mergePendingCompleteMilestone(milestoneId) {
|
|
482
|
+
const result = this.buildLifecycle().exitMilestone(milestoneId, { merge: true }, this.ctx.ui);
|
|
483
|
+
if (!result.ok) {
|
|
484
|
+
const detail = result.cause instanceof Error
|
|
485
|
+
? result.cause.message
|
|
486
|
+
: result.reason;
|
|
487
|
+
return {
|
|
488
|
+
ok: false,
|
|
489
|
+
reason: `Milestone ${milestoneId} is complete, but the system-owned merge failed: ${detail}`,
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
this.s.milestoneMergedInPhases = true;
|
|
493
|
+
this.s.milestoneSettlement = { ok: true, reason: "settled" };
|
|
494
|
+
try {
|
|
495
|
+
const projectRoot = this.s.originalBasePath || this.s.canonicalProjectRoot || this.runtimeBasePath;
|
|
496
|
+
const { rebuildMarkdownProjectionsFromDb } = await import("../commands-maintenance.js");
|
|
497
|
+
await rebuildMarkdownProjectionsFromDb(projectRoot);
|
|
498
|
+
}
|
|
499
|
+
catch (err) {
|
|
500
|
+
logWarning("engine", `markdown projection rebuild after settlement merge failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
501
|
+
}
|
|
502
|
+
return { ok: true };
|
|
503
|
+
}
|
|
454
504
|
clearPendingDispatch() {
|
|
455
505
|
this.s.pendingOrchestrationDispatch = null;
|
|
456
506
|
}
|
|
@@ -476,8 +526,7 @@ export class AutoOrchestrator {
|
|
|
476
526
|
}
|
|
477
527
|
// ── WorktreeAdapter (folded) ─────────────────────────────────────────────
|
|
478
528
|
getEffectiveUnitIsolationMode(basePath) {
|
|
479
|
-
|
|
480
|
-
return configuredMode === "worktree" && this.s.isolationDegraded ? "branch" : configuredMode;
|
|
529
|
+
return resolveEffectiveUnitIsolationMode(getIsolationMode(basePath), this.s.isolationDegraded, this.s.strandedRecoveryIsolationMode);
|
|
481
530
|
}
|
|
482
531
|
buildLifecycle() {
|
|
483
532
|
return new WorktreeLifecycle(this.s, {
|
|
@@ -512,9 +561,6 @@ export class AutoOrchestrator {
|
|
|
512
561
|
reason: `No Unit manifest is registered for ${unitType}`,
|
|
513
562
|
};
|
|
514
563
|
}
|
|
515
|
-
if (isolationMode !== "worktree") {
|
|
516
|
-
return { ok: true, reason: "not-required" };
|
|
517
|
-
}
|
|
518
564
|
const writeScope = manifest.tools.mode === "all" || manifest.tools.mode === "docs"
|
|
519
565
|
? "source-writing"
|
|
520
566
|
: "planning-only";
|
|
@@ -522,7 +568,21 @@ export class AutoOrchestrator {
|
|
|
522
568
|
const activeBasePath = this.getLiveDispatchBasePath();
|
|
523
569
|
const snapshot = await deriveState(activeBasePath);
|
|
524
570
|
const milestoneId = snapshot.activeMilestone?.id ?? null;
|
|
525
|
-
const
|
|
571
|
+
const buildExpectedBranch = (mode) => mode !== "none" && milestoneId ? autoWorktreeBranch(milestoneId) : null;
|
|
572
|
+
// The milestone lease coordinates concurrent workers on an isolated
|
|
573
|
+
// milestone worktree/branch. `none` mode has no per-milestone isolation
|
|
574
|
+
// and does not reliably claim a lease, so requiring one there would
|
|
575
|
+
// falsely fail dispatch; enforce it only in isolated modes.
|
|
576
|
+
const buildLease = (mode) => milestoneId && this.s.workerId
|
|
577
|
+
? {
|
|
578
|
+
required: writeScope === "source-writing" && mode !== "none",
|
|
579
|
+
held: hasHeldMilestoneLease(this.s, milestoneId),
|
|
580
|
+
owner: this.s.workerId,
|
|
581
|
+
}
|
|
582
|
+
: undefined;
|
|
583
|
+
if (writeScope === "source-writing") {
|
|
584
|
+
reclaimMissingMilestoneLease(this.s, milestoneId, isolationMode, "orchestrator");
|
|
585
|
+
}
|
|
526
586
|
let result = safety.validateUnitRoot({
|
|
527
587
|
unitType,
|
|
528
588
|
unitId,
|
|
@@ -531,7 +591,8 @@ export class AutoOrchestrator {
|
|
|
531
591
|
unitRoot: activeBasePath,
|
|
532
592
|
milestoneId,
|
|
533
593
|
isolationMode,
|
|
534
|
-
expectedBranch,
|
|
594
|
+
expectedBranch: buildExpectedBranch(isolationMode),
|
|
595
|
+
lease: buildLease(isolationMode),
|
|
535
596
|
});
|
|
536
597
|
if (!result.ok) {
|
|
537
598
|
const repaired = await repairAutoWorktreeSafetyFailure({
|
|
@@ -549,16 +610,20 @@ export class AutoOrchestrator {
|
|
|
549
610
|
this.rebuildScope(this.s.basePath, this.s.currentMilestoneId);
|
|
550
611
|
return { ok: true };
|
|
551
612
|
},
|
|
552
|
-
revalidate: () =>
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
613
|
+
revalidate: () => {
|
|
614
|
+
const revalidatedMode = this.getEffectiveUnitIsolationMode(this.runtimeBasePath);
|
|
615
|
+
return safety.validateUnitRoot({
|
|
616
|
+
unitType,
|
|
617
|
+
unitId,
|
|
618
|
+
writeScope,
|
|
619
|
+
projectRoot: this.runtimeBasePath,
|
|
620
|
+
unitRoot: this.getLiveDispatchBasePath(),
|
|
621
|
+
milestoneId,
|
|
622
|
+
isolationMode: revalidatedMode,
|
|
623
|
+
expectedBranch: buildExpectedBranch(revalidatedMode),
|
|
624
|
+
lease: buildLease(revalidatedMode),
|
|
625
|
+
});
|
|
626
|
+
},
|
|
562
627
|
});
|
|
563
628
|
result = repaired.result;
|
|
564
629
|
if (result.ok) {
|
|
@@ -576,6 +641,21 @@ export class AutoOrchestrator {
|
|
|
576
641
|
const recovery = classifyFailure(input);
|
|
577
642
|
return { action: recovery.action, reason: recovery.reason };
|
|
578
643
|
}
|
|
644
|
+
/**
|
|
645
|
+
* ADR-030 Phase Transition Invariant (advisory mode). The matrix is an
|
|
646
|
+
* assertion, not a decision-maker — deriveState already chose the phase; we
|
|
647
|
+
* only observe illegal *derived* edges that survived reconciliation. The
|
|
648
|
+
* matrix is still a sparse hardening spec, so this is telemetry-only (no
|
|
649
|
+
* block) until it is expanded into a validated legal-edge graph. To enforce:
|
|
650
|
+
* `throw violation;` instead of logging — recovery-classification maps
|
|
651
|
+
* IllegalPhaseTransitionError to kind "illegal-transition" (escalate).
|
|
652
|
+
*/
|
|
653
|
+
observePhaseTransition(from, to) {
|
|
654
|
+
if (isLegalEdge(from, to))
|
|
655
|
+
return;
|
|
656
|
+
const violation = new IllegalPhaseTransitionError(from, to);
|
|
657
|
+
debugLog("phase-transition-advisory", { from, to, message: violation.message });
|
|
658
|
+
}
|
|
579
659
|
// ── Lifecycle verbs ──────────────────────────────────────────────────────
|
|
580
660
|
/**
|
|
581
661
|
* #442: graduated stuck recovery, ported from the legacy
|
|
@@ -593,7 +673,7 @@ export class AutoOrchestrator {
|
|
|
593
673
|
* skipped result) instead of stopping.
|
|
594
674
|
*/
|
|
595
675
|
tryStuckArtifactRecovery(unitType, unitId) {
|
|
596
|
-
const key =
|
|
676
|
+
const key = buildDispatchKey(unitType, unitId);
|
|
597
677
|
if (this.lastStuckRecoveryKey === key)
|
|
598
678
|
return false; // already tried this episode
|
|
599
679
|
const basePath = this.getLiveDispatchBasePath();
|
|
@@ -608,7 +688,7 @@ export class AutoOrchestrator {
|
|
|
608
688
|
return false;
|
|
609
689
|
this.lastStuckRecoveryKey = key;
|
|
610
690
|
invalidateAllCaches();
|
|
611
|
-
this.
|
|
691
|
+
this.dispatchHistory.clearOnRecovery();
|
|
612
692
|
this.lastAdvanceKey = null;
|
|
613
693
|
this.lastFinalizedUnitKey = null;
|
|
614
694
|
return true;
|
|
@@ -634,8 +714,14 @@ export class AutoOrchestrator {
|
|
|
634
714
|
async start(_sessionContext) {
|
|
635
715
|
this.lastAdvanceKey = null;
|
|
636
716
|
this.lastFinalizedUnitKey = null;
|
|
637
|
-
|
|
717
|
+
// #482: the DB dispatch ledger is the source of truth across sessions.
|
|
718
|
+
// Discard any in-memory window and rebuild it from the ledger so a unit
|
|
719
|
+
// that was re-dispatched in previous sessions is detected as stuck here
|
|
720
|
+
// instead of silently re-dispatching forever.
|
|
721
|
+
this.dispatchHistory.clearOnRecovery();
|
|
722
|
+
this.dispatchHistory.rehydrate();
|
|
638
723
|
this.lastStuckRecoveryKey = null;
|
|
724
|
+
this.lastDerivedPhase = null;
|
|
639
725
|
this.status.phase = "running";
|
|
640
726
|
this.bumpTransition();
|
|
641
727
|
this.journalTransition({ name: "start" });
|
|
@@ -721,14 +807,48 @@ export class AutoOrchestrator {
|
|
|
721
807
|
this.postAdvanceRecord(blocked);
|
|
722
808
|
return blocked;
|
|
723
809
|
}
|
|
810
|
+
const reconciledPhase = reconciliation.stateSnapshot.phase;
|
|
811
|
+
if (this.lastDerivedPhase !== null) {
|
|
812
|
+
this.observePhaseTransition(this.lastDerivedPhase, reconciledPhase);
|
|
813
|
+
}
|
|
814
|
+
this.lastDerivedPhase = reconciledPhase;
|
|
724
815
|
const decision = await this.decideNextUnit({ stateSnapshot: reconciliation.stateSnapshot });
|
|
725
816
|
if (!decision) {
|
|
726
817
|
const settlementBlock = this.evaluateNoRemainingUnitsSettlement(reconciliation.stateSnapshot);
|
|
727
818
|
if (settlementBlock) {
|
|
819
|
+
const settlement = this.s.milestoneSettlement;
|
|
820
|
+
if (settlement && !settlement.ok && settlement.reason === "merge-pending") {
|
|
821
|
+
const merged = await this.mergePendingCompleteMilestone(settlement.milestoneId);
|
|
822
|
+
if (merged.ok) {
|
|
823
|
+
const terminalOutcome = noRemainingUnitsOutcome(reconciliation.stateSnapshot);
|
|
824
|
+
const stopped = {
|
|
825
|
+
kind: "stopped",
|
|
826
|
+
reason: terminalOutcome.displayReason,
|
|
827
|
+
stateSnapshot: reconciliation.stateSnapshot,
|
|
828
|
+
terminalOutcome,
|
|
829
|
+
};
|
|
830
|
+
this.status.phase = "stopped";
|
|
831
|
+
this.status.activeUnit = undefined;
|
|
832
|
+
this.lastAdvanceKey = null;
|
|
833
|
+
this.dispatchHistory.clearOnRecovery();
|
|
834
|
+
this.bumpTransition();
|
|
835
|
+
this.journalTransition({ name: "advance-stopped", reason: stopped.reason });
|
|
836
|
+
this.postAdvanceRecord(stopped);
|
|
837
|
+
return stopped;
|
|
838
|
+
}
|
|
839
|
+
settlementBlock.reason = merged.reason;
|
|
840
|
+
settlementBlock.terminalOutcome = {
|
|
841
|
+
code: "settlement-blocked",
|
|
842
|
+
displayReason: merged.reason,
|
|
843
|
+
nextAction: `Fix the merge failure, then retry \`/gsd dispatch complete-milestone ${settlement.milestoneId}\`.`,
|
|
844
|
+
milestoneId: settlement.milestoneId,
|
|
845
|
+
allMilestonesComplete: false,
|
|
846
|
+
};
|
|
847
|
+
}
|
|
728
848
|
this.status.phase = "paused";
|
|
729
849
|
this.status.activeUnit = undefined;
|
|
730
850
|
this.lastAdvanceKey = null;
|
|
731
|
-
this.
|
|
851
|
+
this.dispatchHistory.clearOnRecovery();
|
|
732
852
|
this.bumpTransition();
|
|
733
853
|
this.journalTransition({ name: "advance-blocked", reason: settlementBlock.reason });
|
|
734
854
|
this.postAdvanceRecord(settlementBlock);
|
|
@@ -744,7 +864,7 @@ export class AutoOrchestrator {
|
|
|
744
864
|
this.status.phase = "stopped";
|
|
745
865
|
this.status.activeUnit = undefined;
|
|
746
866
|
this.lastAdvanceKey = null;
|
|
747
|
-
this.
|
|
867
|
+
this.dispatchHistory.clearOnRecovery();
|
|
748
868
|
this.bumpTransition();
|
|
749
869
|
this.journalTransition({ name: "advance-stopped", reason: stopped.reason });
|
|
750
870
|
this.postAdvanceRecord(stopped);
|
|
@@ -792,16 +912,12 @@ export class AutoOrchestrator {
|
|
|
792
912
|
this.postAdvanceRecord(blocked);
|
|
793
913
|
return blocked;
|
|
794
914
|
}
|
|
795
|
-
|
|
796
|
-
// Record every dispatch decision in the ring buffer before pre-flight
|
|
915
|
+
// Record every dispatch decision in the history window before pre-flight
|
|
797
916
|
// checks so the stuck-loop detector observes the full decision history
|
|
798
917
|
// (including decisions that idempotency would otherwise short-circuit).
|
|
799
|
-
// The
|
|
800
|
-
this.
|
|
801
|
-
|
|
802
|
-
this.dispatchKeyWindow.shift();
|
|
803
|
-
}
|
|
804
|
-
const matchingCount = this.dispatchKeyWindow.filter((k) => k === nextKey).length;
|
|
918
|
+
// The window is capped at STUCK_WINDOW_SIZE and evicts oldest-first.
|
|
919
|
+
const nextKey = this.dispatchHistory.recordDispatch(decision.unitType, decision.unitId);
|
|
920
|
+
const matchingCount = this.dispatchHistory.countMatching(nextKey);
|
|
805
921
|
if (this.lastFinalizedUnitKey === nextKey) {
|
|
806
922
|
// #442: the unit re-dispatched immediately after finalizing may have
|
|
807
923
|
// actually completed on disk with a stale DB. Verify + recover before
|
|
@@ -833,22 +949,30 @@ export class AutoOrchestrator {
|
|
|
833
949
|
// checks coexist: idempotency for the common immediate-repeat case,
|
|
834
950
|
// stuck-loop for the saturated-window case.
|
|
835
951
|
if (this.lastAdvanceKey === nextKey && matchingCount < STUCK_WINDOW_SIZE) {
|
|
952
|
+
// Unit already active — benign no-op. Return skipped so the loop re-polls
|
|
953
|
+
// without cancelling the in-flight unit (blocked+pause would force-cancel it).
|
|
836
954
|
this.clearPendingDispatch();
|
|
837
|
-
const
|
|
955
|
+
const skipped = { kind: "skipped", reason: "idempotent advance: unit already active" };
|
|
838
956
|
this.journalTransition({
|
|
839
|
-
name: "advance-
|
|
840
|
-
reason:
|
|
957
|
+
name: "advance-skipped",
|
|
958
|
+
reason: skipped.reason,
|
|
841
959
|
unitType: decision.unitType,
|
|
842
960
|
unitId: decision.unitId,
|
|
843
961
|
});
|
|
844
|
-
this.postAdvanceRecord(
|
|
845
|
-
return
|
|
962
|
+
this.postAdvanceRecord(skipped);
|
|
963
|
+
return skipped;
|
|
846
964
|
}
|
|
847
|
-
// Stuck-loop detection: when the
|
|
848
|
-
// `nextKey` (count >= STUCK_WINDOW_SIZE), the
|
|
849
|
-
//
|
|
850
|
-
//
|
|
851
|
-
|
|
965
|
+
// Stuck-loop detection: when the window is saturated with copies of
|
|
966
|
+
// `nextKey` (count >= STUCK_WINDOW_SIZE), consult the Dispatch History
|
|
967
|
+
// module's full detect-stuck rule set for the verdict instead of the old
|
|
968
|
+
// bare saturation count. This keeps the saturation threshold (the window
|
|
969
|
+
// deliberately records benign idempotent repeats, so earlier-firing
|
|
970
|
+
// rules would false-positive on pause/resume re-advances) while gaining
|
|
971
|
+
// retry-budget suppression and diagnosable rule reasons. A saturated
|
|
972
|
+
// window with no verdict means the dispatch ledger says we are inside
|
|
973
|
+
// the unit's retry-backoff budget — let the retry proceed.
|
|
974
|
+
const stuckVerdict = matchingCount >= STUCK_WINDOW_SIZE ? this.dispatchHistory.detectStuck() : null;
|
|
975
|
+
if (stuckVerdict) {
|
|
852
976
|
// #442: before declaring a stuck loop, verify the unit didn't actually
|
|
853
977
|
// complete on disk (stale DB) and recover if so — legacy graduated
|
|
854
978
|
// stuck-recovery parity. Otherwise hard-stop with a diagnosable reason.
|
|
@@ -859,7 +983,7 @@ export class AutoOrchestrator {
|
|
|
859
983
|
this.clearPendingDispatch();
|
|
860
984
|
const blocked = {
|
|
861
985
|
kind: "blocked",
|
|
862
|
-
reason: `stuck-loop: ${
|
|
986
|
+
reason: `stuck-loop: ${stuckVerdict.reason}`,
|
|
863
987
|
action: "stop",
|
|
864
988
|
};
|
|
865
989
|
this.journalTransition({
|
|
@@ -949,7 +1073,7 @@ export class AutoOrchestrator {
|
|
|
949
1073
|
if (result.kind === "stopped") {
|
|
950
1074
|
this.lastAdvanceKey = null;
|
|
951
1075
|
this.lastFinalizedUnitKey = null;
|
|
952
|
-
this.
|
|
1076
|
+
this.dispatchHistory.clearOnRecovery();
|
|
953
1077
|
this.status.activeUnit = undefined;
|
|
954
1078
|
}
|
|
955
1079
|
this.bumpTransition();
|
|
@@ -978,9 +1102,18 @@ export class AutoOrchestrator {
|
|
|
978
1102
|
async resume() {
|
|
979
1103
|
this.lastAdvanceKey = null;
|
|
980
1104
|
this.lastFinalizedUnitKey = null;
|
|
981
|
-
// Preserve
|
|
982
|
-
// accumulates across pause/resume cycles rather than
|
|
1105
|
+
// Preserve the dispatch-history window across an in-process resume so
|
|
1106
|
+
// stuck-loop detection accumulates across pause/resume cycles rather than
|
|
1107
|
+
// resetting each time (#572 regression). When the window is empty (fresh
|
|
1108
|
+
// orchestrator resuming a prior session), rehydrate it from the DB
|
|
1109
|
+
// dispatch ledger so cross-session re-dispatch loops are detected (#482).
|
|
1110
|
+
if (this.dispatchHistory.getRecentWindow().length === 0) {
|
|
1111
|
+
this.dispatchHistory.rehydrate();
|
|
1112
|
+
}
|
|
983
1113
|
this.lastStuckRecoveryKey = null;
|
|
1114
|
+
// ADR-030: drop the prior "from" — the first advance after resume has no
|
|
1115
|
+
// edge to assert (avoids a false illegal-edge across the pause boundary).
|
|
1116
|
+
this.lastDerivedPhase = null;
|
|
984
1117
|
this.status.phase = "running";
|
|
985
1118
|
this.bumpTransition();
|
|
986
1119
|
this.journalTransition({ name: "resume" });
|
|
@@ -996,10 +1129,11 @@ export class AutoOrchestrator {
|
|
|
996
1129
|
this.status.activeUnit = undefined;
|
|
997
1130
|
this.lastAdvanceKey = null;
|
|
998
1131
|
this.lastFinalizedUnitKey = null;
|
|
999
|
-
|
|
1000
|
-
//
|
|
1132
|
+
this.lastDerivedPhase = null;
|
|
1133
|
+
// Preserve the dispatch-history window on pause so stuck-loop detection
|
|
1134
|
+
// accumulates across pause/resume cycles. Only clear on a hard stop.
|
|
1001
1135
|
if (reason !== "pause") {
|
|
1002
|
-
this.
|
|
1136
|
+
this.dispatchHistory.clearOnRecovery();
|
|
1003
1137
|
}
|
|
1004
1138
|
this.lastStuckRecoveryKey = null;
|
|
1005
1139
|
this.bumpTransition();
|
|
@@ -1011,9 +1145,9 @@ export class AutoOrchestrator {
|
|
|
1011
1145
|
return { ...this.status, activeUnit: this.status.activeUnit ? { ...this.status.activeUnit } : undefined };
|
|
1012
1146
|
}
|
|
1013
1147
|
async completeActiveUnit(unit) {
|
|
1014
|
-
const unitKey =
|
|
1148
|
+
const unitKey = buildDispatchKey(unit.unitType, unit.unitId);
|
|
1015
1149
|
const activeUnitKey = this.status.activeUnit
|
|
1016
|
-
?
|
|
1150
|
+
? buildDispatchKey(this.status.activeUnit.unitType, this.status.activeUnit.unitId)
|
|
1017
1151
|
: null;
|
|
1018
1152
|
if (activeUnitKey !== unitKey)
|
|
1019
1153
|
return;
|
|
@@ -1030,9 +1164,9 @@ export class AutoOrchestrator {
|
|
|
1030
1164
|
});
|
|
1031
1165
|
}
|
|
1032
1166
|
async retryActiveUnit(unit) {
|
|
1033
|
-
const unitKey =
|
|
1167
|
+
const unitKey = buildDispatchKey(unit.unitType, unit.unitId);
|
|
1034
1168
|
const activeUnitKey = this.status.activeUnit
|
|
1035
|
-
?
|
|
1169
|
+
? buildDispatchKey(this.status.activeUnit.unitType, this.status.activeUnit.unitId)
|
|
1036
1170
|
: null;
|
|
1037
1171
|
if (activeUnitKey !== unitKey && this.lastFinalizedUnitKey !== unitKey)
|
|
1038
1172
|
return;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Shared helpers used across auto-loop phase modules.
|
|
3
|
+
import { setRuntimeKv } from "../db/runtime-kv.js";
|
|
4
|
+
import { debugLog } from "../debug-logger.js";
|
|
5
|
+
import { normalizeRealPath } from "../paths.js";
|
|
6
|
+
import { resolveWorktreeProjectRoot, normalizeWorktreePathForCompare } from "../worktree-root.js";
|
|
7
|
+
import { decideVerificationRetry, verificationRetryKey } from "./verification-retry-policy.js";
|
|
8
|
+
const STUCK_RECOVERY_ATTEMPTS_KEY = "stuck_recovery_attempts";
|
|
9
|
+
/** Compare two paths for physical identity, tolerating trailing slashes and symlinks. */
|
|
10
|
+
export function isSamePathLocal(a, b) {
|
|
11
|
+
return normalizeWorktreePathForCompare(a) === normalizeWorktreePathForCompare(b);
|
|
12
|
+
}
|
|
13
|
+
export function isIsolatedWorktreeSession(s) {
|
|
14
|
+
return Boolean(s.originalBasePath)
|
|
15
|
+
&& Boolean(s.basePath)
|
|
16
|
+
&& !isSamePathLocal(s.originalBasePath, s.basePath);
|
|
17
|
+
}
|
|
18
|
+
export function persistStuckRecoveryAttempts(s, loopState) {
|
|
19
|
+
const scopeId = normalizeRealPath(s.scope?.workspace.projectRoot ?? (s.originalBasePath || s.basePath));
|
|
20
|
+
if (!scopeId)
|
|
21
|
+
return;
|
|
22
|
+
try {
|
|
23
|
+
setRuntimeKv("global", scopeId, STUCK_RECOVERY_ATTEMPTS_KEY, loopState.stuckRecoveryAttempts);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
debugLog("autoLoop", {
|
|
27
|
+
phase: "save-stuck-state-failed",
|
|
28
|
+
error: err instanceof Error ? err.message : String(err),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export async function applyVerificationRetryPolicy(ic, unitType, phase) {
|
|
33
|
+
const { ctx, pi, s, deps } = ic;
|
|
34
|
+
const retryInfo = s.pendingVerificationRetry;
|
|
35
|
+
const key = unitType && retryInfo
|
|
36
|
+
? verificationRetryKey(unitType, retryInfo.unitId)
|
|
37
|
+
: undefined;
|
|
38
|
+
const decision = decideVerificationRetry({
|
|
39
|
+
unitType,
|
|
40
|
+
retryInfo,
|
|
41
|
+
previousFailureHash: key ? s.verificationRetryFailureHashes.get(key) : undefined,
|
|
42
|
+
});
|
|
43
|
+
if (decision.action === "pause") {
|
|
44
|
+
s.pendingVerificationRetry = null;
|
|
45
|
+
debugLog("autoLoop", {
|
|
46
|
+
phase: `${phase}-paused`,
|
|
47
|
+
reason: decision.reason,
|
|
48
|
+
unitType,
|
|
49
|
+
unitId: retryInfo?.unitId,
|
|
50
|
+
failureHash: decision.failureHash,
|
|
51
|
+
});
|
|
52
|
+
ctx.ui.notify(decision.reason === "duplicate-failure-context"
|
|
53
|
+
? `Verification retry for ${unitType ?? "unit"} ${retryInfo?.unitId ?? "unknown"} produced the same failure context. Pausing auto-mode instead of re-dispatching.`
|
|
54
|
+
: "Verification retry requested without retry context. Pausing auto-mode instead of re-dispatching.", "warning");
|
|
55
|
+
await deps.pauseAuto(ctx, pi);
|
|
56
|
+
return { action: "break", reason: decision.reason };
|
|
57
|
+
}
|
|
58
|
+
s.verificationRetryFailureHashes.set(decision.key, decision.failureHash);
|
|
59
|
+
debugLog("autoLoop", {
|
|
60
|
+
phase: `${phase}-backoff`,
|
|
61
|
+
iteration: ic.iteration,
|
|
62
|
+
unitType,
|
|
63
|
+
unitId: retryInfo?.unitId,
|
|
64
|
+
attempt: retryInfo?.attempt,
|
|
65
|
+
delayMs: decision.delayMs,
|
|
66
|
+
baseDelayMs: decision.baseDelayMs,
|
|
67
|
+
failureHash: decision.failureHash,
|
|
68
|
+
});
|
|
69
|
+
await new Promise((resolve) => setTimeout(resolve, decision.delayMs));
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
export function rememberRetryDispatch(s, unit, iterData) {
|
|
73
|
+
if (!unit)
|
|
74
|
+
return;
|
|
75
|
+
s.pendingVerificationRetryDispatch = {
|
|
76
|
+
unitType: unit.type,
|
|
77
|
+
unitId: unit.id,
|
|
78
|
+
prompt: iterData.prompt,
|
|
79
|
+
pauseAfterUatDispatch: iterData.pauseAfterUatDispatch,
|
|
80
|
+
state: iterData.state,
|
|
81
|
+
mid: iterData.mid,
|
|
82
|
+
midTitle: iterData.midTitle,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Resolve the base path for milestone reports.
|
|
87
|
+
* Prefers originalBasePath (project root) over basePath (which may be a worktree).
|
|
88
|
+
*/
|
|
89
|
+
export function _resolveReportBasePath(s) {
|
|
90
|
+
return resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Resolve the authoritative project base for dispatch guards.
|
|
94
|
+
* Prior-milestone completion lives at the project root, even when the active
|
|
95
|
+
* unit is running inside an auto worktree.
|
|
96
|
+
*/
|
|
97
|
+
export function _resolveDispatchGuardBasePath(s) {
|
|
98
|
+
return resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
|
|
99
|
+
}
|
|
100
|
+
const PLAN_V2_GATE_PHASES = new Set([
|
|
101
|
+
"executing",
|
|
102
|
+
"summarizing",
|
|
103
|
+
"validating-milestone",
|
|
104
|
+
"completing-milestone",
|
|
105
|
+
]);
|
|
106
|
+
export function shouldRunPlanV2Gate(phase) {
|
|
107
|
+
return PLAN_V2_GATE_PHASES.has(phase);
|
|
108
|
+
}
|
|
109
|
+
export function _resolveCurrentUnitStartedAtForTest(currentUnit) {
|
|
110
|
+
return currentUnit?.startedAt;
|
|
111
|
+
}
|
|
112
|
+
export async function emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, errorContext) {
|
|
113
|
+
ic.deps.emitJournalEvent({
|
|
114
|
+
ts: new Date().toISOString(),
|
|
115
|
+
flowId: ic.flowId,
|
|
116
|
+
seq: ic.nextSeq(),
|
|
117
|
+
eventType: "unit-end",
|
|
118
|
+
data: {
|
|
119
|
+
unitType,
|
|
120
|
+
unitId,
|
|
121
|
+
status: "cancelled",
|
|
122
|
+
artifactVerified: false,
|
|
123
|
+
...(errorContext ? { errorContext } : {}),
|
|
124
|
+
},
|
|
125
|
+
causedBy: { flowId: ic.flowId, seq: unitStartSeq },
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
export function _buildCancelledUnitStopReason(unitType, unitId, errorContext) {
|
|
129
|
+
const cancellationMessage = errorContext?.message ?? "unknown";
|
|
130
|
+
const isSessionCreationFailure = errorContext?.category === "session-failed";
|
|
131
|
+
if (isSessionCreationFailure) {
|
|
132
|
+
return {
|
|
133
|
+
notifyMessage: `Session creation failed for ${unitType} ${unitId}: ${cancellationMessage}. Stopping auto-mode.`,
|
|
134
|
+
stopReason: `Session creation failed: ${cancellationMessage}`,
|
|
135
|
+
loopReason: "session-failed",
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
notifyMessage: `Unit ${unitType} ${unitId} aborted after dispatch: ${cancellationMessage}. Stopping auto-mode.`,
|
|
140
|
+
stopReason: `Unit aborted: ${cancellationMessage}`,
|
|
141
|
+
loopReason: "unit-aborted",
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
export function _isPauseOriginCancelledResult(isPaused, errorContext) {
|
|
145
|
+
return isPaused && !errorContext;
|
|
146
|
+
}
|