@opengsd/gsd-pi 1.2.0-dev.b1abb545 → 1.2.0-dev.e8563f58
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-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.js +2 -14
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- 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 +38 -6
- 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 +105 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +122 -58
- package/dist/resources/extensions/gsd/auto/phases.js +8 -3
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +40 -57
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +31 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +24 -26
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +9 -28
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
- package/dist/resources/extensions/gsd/auto.js +15 -20
- 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 +32 -12
- 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-handlers.js +46 -3
- 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 +4 -12
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +398 -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/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
- 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 +51 -5
- package/dist/resources/extensions/gsd/markdown-renderer.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/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/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/prompts/complete-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +6 -4
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- 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/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/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +6 -20
- 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-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +44 -53
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
- 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 +337 -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/web-app-uat.js +45 -8
- 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 +45 -28
- 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 +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- 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/references/executable-code.md +1 -1
- 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/gsd-browser/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- 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 +8 -8
- 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 +8 -8
- 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 +1 -1
- 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/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -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 +8 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.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-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/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/dist/cli.js +6 -3
- 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/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/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 +145 -59
- 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/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +192 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +166 -0
- 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/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/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/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- 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 +40 -4
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -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 +152 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
- package/src/resources/extensions/gsd/auto/phases.ts +12 -3
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -32
- package/src/resources/extensions/gsd/auto-dispatch.ts +38 -52
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +37 -13
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +24 -29
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +8 -26
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
- package/src/resources/extensions/gsd/auto.ts +28 -24
- 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 +33 -12
- 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-handlers.ts +46 -3
- 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 +3 -9
- package/src/resources/extensions/gsd/db/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +490 -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/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
- 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 +50 -5
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -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/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/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/prompts/complete-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +6 -4
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- 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/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/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +9 -21
- 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-loop.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- 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/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/deep-project-auto-loop.test.ts +10 -10
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- 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/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/integration/auto-worktree-milestone-merge.test.ts +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
- 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 +199 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- 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/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/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/parsers-legacy-importers.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- 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/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/runtime-invariant-modules.test.ts +1 -0
- 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/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-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
- 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 +155 -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/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- 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-reentry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -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 +2 -2
- 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-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +43 -68
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
- 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 +412 -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/web-app-uat.ts +51 -8
- 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 +47 -28
- 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 +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- 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/references/executable-code.md +1 -1
- 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/gsd-browser/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- 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/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → LDHRKiRBIVZmiuMjrL1Vy}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → LDHRKiRBIVZmiuMjrL1Vy}/_ssgManifest.js +0 -0
|
@@ -14,14 +14,15 @@ import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
|
|
|
14
14
|
|
|
15
15
|
import type { AutoAdvanceResult, AutoOrchestrationModule, AutoSessionContext, AutoStatus, AutoTerminalOutcome } from "./contracts.js";
|
|
16
16
|
import type { AutoSession, PendingOrchestrationDispatch } from "./session.js";
|
|
17
|
-
import type { GSDState } from "../types.js";
|
|
17
|
+
import type { GSDState, Phase } from "../types.js";
|
|
18
18
|
import type { MinimalModelRegistry } from "../context-budget.js";
|
|
19
19
|
|
|
20
20
|
type BlockedAdvanceResult = Extract<AutoAdvanceResult, { kind: "blocked" }>;
|
|
21
21
|
|
|
22
|
-
import { debugCount, debugTime } from "../debug-logger.js";
|
|
22
|
+
import { debugCount, debugLog, debugTime } from "../debug-logger.js";
|
|
23
23
|
import { reconcileBeforeDispatch } from "../state-reconciliation.js";
|
|
24
|
-
import {
|
|
24
|
+
import { isLegalEdge, IllegalPhaseTransitionError } from "../state-transition-matrix.js";
|
|
25
|
+
import { hasPendingDeepStage, resolveDispatch } from "../auto-dispatch.js";
|
|
25
26
|
import { classifyFailure } from "../recovery-classification.js";
|
|
26
27
|
import { verifyExpectedArtifact, refreshRecoveryDbForArtifact } from "../auto-recovery.js";
|
|
27
28
|
import { invalidateAllCaches } from "../cache.js";
|
|
@@ -37,7 +38,7 @@ import { checkResourcesStale, autoWorktreeBranch, mergeMilestoneToMain } from ".
|
|
|
37
38
|
import { getSessionLockStatus } from "../session-lock.js";
|
|
38
39
|
import { resolveUokFlags } from "../uok/flags.js";
|
|
39
40
|
import { emitJournalEvent as _emitJournalEvent } from "../journal.js";
|
|
40
|
-
import { loadEffectiveGSDPreferences, getIsolationMode } from "../preferences.js";
|
|
41
|
+
import { loadEffectiveGSDPreferences, getIsolationMode, resolveEffectiveUnitIsolationMode } from "../preferences.js";
|
|
41
42
|
import {
|
|
42
43
|
detectWorktreeName,
|
|
43
44
|
getMainBranch,
|
|
@@ -63,6 +64,13 @@ import {
|
|
|
63
64
|
import { refreshWorkflowDatabaseFromDisk } from "../db-workspace.js";
|
|
64
65
|
import { getErrorMessage } from "../error-utils.js";
|
|
65
66
|
import { logWarning } from "../workflow-logger.js";
|
|
67
|
+
import { normalizeRealPath } from "../paths.js";
|
|
68
|
+
import {
|
|
69
|
+
buildDispatchKey,
|
|
70
|
+
createDispatchHistory,
|
|
71
|
+
STUCK_WINDOW_SIZE,
|
|
72
|
+
type DispatchHistory,
|
|
73
|
+
} from "./dispatch-history.js";
|
|
66
74
|
import { existsSync, readFileSync } from "node:fs";
|
|
67
75
|
import { join } from "node:path";
|
|
68
76
|
import { evaluateAllCompleteSettlement } from "../milestone-settlement.js";
|
|
@@ -71,16 +79,6 @@ function now(): number {
|
|
|
71
79
|
return Date.now();
|
|
72
80
|
}
|
|
73
81
|
|
|
74
|
-
/**
|
|
75
|
-
* Size of the dispatch-decision ring buffer used by the Auto Orchestration
|
|
76
|
-
* module's stuck-loop detector. When the same `${unitType}:${unitId}` key
|
|
77
|
-
* fills the window, advance() blocks with `action: "stop"`.
|
|
78
|
-
*
|
|
79
|
-
* Mirrors the legacy `STUCK_WINDOW_SIZE` in auto/phases.ts so behaviour is
|
|
80
|
-
* preserved across the eventual cutover (issue #5791).
|
|
81
|
-
*/
|
|
82
|
-
export const STUCK_WINDOW_SIZE = 6;
|
|
83
|
-
|
|
84
82
|
function noRemainingUnitsOutcome(stateSnapshot: GSDState): AutoTerminalOutcome {
|
|
85
83
|
if (stateSnapshot.phase === "complete") {
|
|
86
84
|
return {
|
|
@@ -195,14 +193,25 @@ export async function decideOrchestratorDispatch(
|
|
|
195
193
|
): Promise<DispatchDecision> {
|
|
196
194
|
const state = input.stateSnapshot;
|
|
197
195
|
const active = state.activeMilestone;
|
|
198
|
-
if (!active) return null;
|
|
199
|
-
|
|
200
196
|
const activeSession = input.session ?? session;
|
|
201
197
|
const activeDispatchBasePath = activeSession?.basePath || dispatchBasePath;
|
|
202
|
-
|
|
198
|
+
const prefs = loadEffectiveGSDPreferences(activeDispatchBasePath)?.preferences;
|
|
199
|
+
if (!active) {
|
|
200
|
+
if (state.phase !== "pre-planning") return null;
|
|
201
|
+
if (!hasPendingDeepStage(prefs, activeDispatchBasePath)) {
|
|
202
|
+
return {
|
|
203
|
+
kind: "blocked",
|
|
204
|
+
reason: state.nextAction || "No active milestone. Run /gsd unpark <id> or create a new milestone.",
|
|
205
|
+
action: "stop",
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (active && activeSession && shouldAdoptActiveMilestone(state, activeSession, activeDispatchBasePath)) {
|
|
203
211
|
activeSession.currentMilestoneId = active.id;
|
|
204
212
|
}
|
|
205
|
-
const
|
|
213
|
+
const dispatchMid = active?.id ?? activeSession?.currentMilestoneId ?? "";
|
|
214
|
+
const dispatchMidTitle = active?.title ?? "";
|
|
206
215
|
|
|
207
216
|
// Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
|
|
208
217
|
// (#5789). Prefer caller-supplied values when present so test harnesses and
|
|
@@ -234,8 +243,15 @@ export async function decideOrchestratorDispatch(
|
|
|
234
243
|
? "true"
|
|
235
244
|
: "false");
|
|
236
245
|
|
|
246
|
+
// Only replay a milestone-scoped verification retry when a milestone is
|
|
247
|
+
// active. Pre-PR (#712 fix), `!active` returned null before reaching this
|
|
248
|
+
// block, so the retry was preserved for a future tick. The new
|
|
249
|
+
// pre-planning + deep-pending fall-through must keep that contract:
|
|
250
|
+
// otherwise a stale execute-task / complete-slice / complete-milestone
|
|
251
|
+
// retry whose target milestone has since been parked would preempt
|
|
252
|
+
// project-level deep rules like `discuss-project`.
|
|
237
253
|
const pendingRetry = session?.pendingVerificationRetryDispatch;
|
|
238
|
-
if (session && pendingRetry) {
|
|
254
|
+
if (session && pendingRetry && active) {
|
|
239
255
|
session.pendingVerificationRetryDispatch = null;
|
|
240
256
|
const alreadyClosedReason = getAlreadyClosedDispatchReason(
|
|
241
257
|
pendingRetry.unitType,
|
|
@@ -257,8 +273,8 @@ export async function decideOrchestratorDispatch(
|
|
|
257
273
|
|
|
258
274
|
const action = await resolveDispatch({
|
|
259
275
|
basePath: activeDispatchBasePath,
|
|
260
|
-
mid:
|
|
261
|
-
midTitle:
|
|
276
|
+
mid: dispatchMid,
|
|
277
|
+
midTitle: dispatchMidTitle,
|
|
262
278
|
state,
|
|
263
279
|
prefs,
|
|
264
280
|
session: activeSession,
|
|
@@ -302,8 +318,8 @@ export async function decideOrchestratorDispatch(
|
|
|
302
318
|
prompt: action.prompt,
|
|
303
319
|
pauseAfterUatDispatch: action.pauseAfterDispatch ?? false,
|
|
304
320
|
state,
|
|
305
|
-
mid:
|
|
306
|
-
midTitle:
|
|
321
|
+
mid: dispatchMid,
|
|
322
|
+
midTitle: dispatchMidTitle,
|
|
307
323
|
};
|
|
308
324
|
session.pendingOrchestrationDispatch = pending;
|
|
309
325
|
}
|
|
@@ -329,7 +345,13 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
329
345
|
private seq = 0;
|
|
330
346
|
private lastAdvanceKey: string | null = null;
|
|
331
347
|
private lastFinalizedUnitKey: string | null = null;
|
|
332
|
-
|
|
348
|
+
// Dispatch History module (#482): the dispatch-decision window with
|
|
349
|
+
// cross-session DB rehydration and full detect-stuck rules.
|
|
350
|
+
private readonly dispatchHistory: DispatchHistory;
|
|
351
|
+
// ADR-030 Phase Transition Invariant: the prior advance's reconciled Phase,
|
|
352
|
+
// the "from" endpoint of the edge check. In-memory; reset on start/resume/stop
|
|
353
|
+
// so the first advance of a session has no edge to assert.
|
|
354
|
+
private lastDerivedPhase: Phase | null = null;
|
|
333
355
|
// #442: the unit key we last attempted graduated stuck-recovery for. Bounds
|
|
334
356
|
// recovery to one attempt per stuck episode per run (reset on start/resume/
|
|
335
357
|
// stop), mirroring the legacy Level-1-then-Level-2 escalation in phases.ts.
|
|
@@ -342,6 +364,16 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
342
364
|
this.runtimeBasePath = context.runtimeBasePath;
|
|
343
365
|
this.s = context.session;
|
|
344
366
|
this.flowId = `auto-orchestrator-${Date.now()}`;
|
|
367
|
+
this.dispatchHistory = createDispatchHistory({
|
|
368
|
+
windowSize: STUCK_WINDOW_SIZE,
|
|
369
|
+
// Same stable scope the auto-loop uses for stuck-state persistence so
|
|
370
|
+
// rehydration reads the rows the dispatch ledger wrote for this project.
|
|
371
|
+
resolveScopeId: () =>
|
|
372
|
+
normalizeRealPath(
|
|
373
|
+
this.s.scope?.workspace.projectRoot ??
|
|
374
|
+
(this.s.originalBasePath || this.s.basePath || this.runtimeBasePath),
|
|
375
|
+
) || null,
|
|
376
|
+
});
|
|
345
377
|
}
|
|
346
378
|
|
|
347
379
|
// ── Live base-path resolution (was the wiring factory's getLiveDispatchBasePath) ──
|
|
@@ -612,8 +644,11 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
612
644
|
// ── WorktreeAdapter (folded) ─────────────────────────────────────────────
|
|
613
645
|
|
|
614
646
|
private getEffectiveUnitIsolationMode(basePath: string): ReturnType<typeof getIsolationMode> {
|
|
615
|
-
|
|
616
|
-
|
|
647
|
+
return resolveEffectiveUnitIsolationMode(
|
|
648
|
+
getIsolationMode(basePath),
|
|
649
|
+
this.s.isolationDegraded,
|
|
650
|
+
this.s.strandedRecoveryIsolationMode,
|
|
651
|
+
);
|
|
617
652
|
}
|
|
618
653
|
|
|
619
654
|
private buildLifecycle(): WorktreeLifecycle {
|
|
@@ -724,6 +759,21 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
724
759
|
return { action: recovery.action, reason: recovery.reason };
|
|
725
760
|
}
|
|
726
761
|
|
|
762
|
+
/**
|
|
763
|
+
* ADR-030 Phase Transition Invariant (advisory mode). The matrix is an
|
|
764
|
+
* assertion, not a decision-maker — deriveState already chose the phase; we
|
|
765
|
+
* only observe illegal *derived* edges that survived reconciliation. The
|
|
766
|
+
* matrix is still a sparse hardening spec, so this is telemetry-only (no
|
|
767
|
+
* block) until it is expanded into a validated legal-edge graph. To enforce:
|
|
768
|
+
* `throw violation;` instead of logging — recovery-classification maps
|
|
769
|
+
* IllegalPhaseTransitionError to kind "illegal-transition" (escalate).
|
|
770
|
+
*/
|
|
771
|
+
private observePhaseTransition(from: Phase, to: Phase): void {
|
|
772
|
+
if (isLegalEdge(from, to)) return;
|
|
773
|
+
const violation = new IllegalPhaseTransitionError(from, to);
|
|
774
|
+
debugLog("phase-transition-advisory", { from, to, message: violation.message });
|
|
775
|
+
}
|
|
776
|
+
|
|
727
777
|
// ── Lifecycle verbs ──────────────────────────────────────────────────────
|
|
728
778
|
|
|
729
779
|
/**
|
|
@@ -742,7 +792,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
742
792
|
* skipped result) instead of stopping.
|
|
743
793
|
*/
|
|
744
794
|
private tryStuckArtifactRecovery(unitType: string, unitId: string): boolean {
|
|
745
|
-
const key =
|
|
795
|
+
const key = buildDispatchKey(unitType, unitId);
|
|
746
796
|
if (this.lastStuckRecoveryKey === key) return false; // already tried this episode
|
|
747
797
|
const basePath = this.getLiveDispatchBasePath();
|
|
748
798
|
if (!verifyExpectedArtifact(unitType, unitId, basePath)) return false;
|
|
@@ -754,7 +804,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
754
804
|
if (!refreshed.ok && refreshed.fatal) return false;
|
|
755
805
|
this.lastStuckRecoveryKey = key;
|
|
756
806
|
invalidateAllCaches();
|
|
757
|
-
this.
|
|
807
|
+
this.dispatchHistory.clearOnRecovery();
|
|
758
808
|
this.lastAdvanceKey = null;
|
|
759
809
|
this.lastFinalizedUnitKey = null;
|
|
760
810
|
return true;
|
|
@@ -785,8 +835,14 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
785
835
|
public async start(_sessionContext: AutoSessionContext): Promise<AutoAdvanceResult> {
|
|
786
836
|
this.lastAdvanceKey = null;
|
|
787
837
|
this.lastFinalizedUnitKey = null;
|
|
788
|
-
|
|
838
|
+
// #482: the DB dispatch ledger is the source of truth across sessions.
|
|
839
|
+
// Discard any in-memory window and rebuild it from the ledger so a unit
|
|
840
|
+
// that was re-dispatched in previous sessions is detected as stuck here
|
|
841
|
+
// instead of silently re-dispatching forever.
|
|
842
|
+
this.dispatchHistory.clearOnRecovery();
|
|
843
|
+
this.dispatchHistory.rehydrate();
|
|
789
844
|
this.lastStuckRecoveryKey = null;
|
|
845
|
+
this.lastDerivedPhase = null;
|
|
790
846
|
this.status.phase = "running";
|
|
791
847
|
this.bumpTransition();
|
|
792
848
|
this.journalTransition({ name: "start" });
|
|
@@ -876,6 +932,12 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
876
932
|
return blocked;
|
|
877
933
|
}
|
|
878
934
|
|
|
935
|
+
const reconciledPhase = reconciliation.stateSnapshot.phase;
|
|
936
|
+
if (this.lastDerivedPhase !== null) {
|
|
937
|
+
this.observePhaseTransition(this.lastDerivedPhase, reconciledPhase);
|
|
938
|
+
}
|
|
939
|
+
this.lastDerivedPhase = reconciledPhase;
|
|
940
|
+
|
|
879
941
|
const decision = await this.decideNextUnit({ stateSnapshot: reconciliation.stateSnapshot });
|
|
880
942
|
if (!decision) {
|
|
881
943
|
const settlementBlock = this.evaluateNoRemainingUnitsSettlement(reconciliation.stateSnapshot);
|
|
@@ -883,7 +945,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
883
945
|
this.status.phase = "paused";
|
|
884
946
|
this.status.activeUnit = undefined;
|
|
885
947
|
this.lastAdvanceKey = null;
|
|
886
|
-
this.
|
|
948
|
+
this.dispatchHistory.clearOnRecovery();
|
|
887
949
|
this.bumpTransition();
|
|
888
950
|
this.journalTransition({ name: "advance-blocked", reason: settlementBlock.reason });
|
|
889
951
|
this.postAdvanceRecord(settlementBlock);
|
|
@@ -899,7 +961,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
899
961
|
this.status.phase = "stopped";
|
|
900
962
|
this.status.activeUnit = undefined;
|
|
901
963
|
this.lastAdvanceKey = null;
|
|
902
|
-
this.
|
|
964
|
+
this.dispatchHistory.clearOnRecovery();
|
|
903
965
|
this.bumpTransition();
|
|
904
966
|
this.journalTransition({ name: "advance-stopped", reason: stopped.reason });
|
|
905
967
|
this.postAdvanceRecord(stopped);
|
|
@@ -949,18 +1011,13 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
949
1011
|
return blocked;
|
|
950
1012
|
}
|
|
951
1013
|
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
// Record every dispatch decision in the ring buffer before pre-flight
|
|
1014
|
+
// Record every dispatch decision in the history window before pre-flight
|
|
955
1015
|
// checks so the stuck-loop detector observes the full decision history
|
|
956
1016
|
// (including decisions that idempotency would otherwise short-circuit).
|
|
957
|
-
// The
|
|
958
|
-
this.
|
|
959
|
-
if (this.dispatchKeyWindow.length > STUCK_WINDOW_SIZE) {
|
|
960
|
-
this.dispatchKeyWindow.shift();
|
|
961
|
-
}
|
|
1017
|
+
// The window is capped at STUCK_WINDOW_SIZE and evicts oldest-first.
|
|
1018
|
+
const nextKey = this.dispatchHistory.recordDispatch(decision.unitType, decision.unitId);
|
|
962
1019
|
|
|
963
|
-
const matchingCount = this.
|
|
1020
|
+
const matchingCount = this.dispatchHistory.countMatching(nextKey);
|
|
964
1021
|
if (this.lastFinalizedUnitKey === nextKey) {
|
|
965
1022
|
// #442: the unit re-dispatched immediately after finalizing may have
|
|
966
1023
|
// actually completed on disk with a stale DB. Verify + recover before
|
|
@@ -993,23 +1050,32 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
993
1050
|
// checks coexist: idempotency for the common immediate-repeat case,
|
|
994
1051
|
// stuck-loop for the saturated-window case.
|
|
995
1052
|
if (this.lastAdvanceKey === nextKey && matchingCount < STUCK_WINDOW_SIZE) {
|
|
1053
|
+
// Unit already active — benign no-op. Return skipped so the loop re-polls
|
|
1054
|
+
// without cancelling the in-flight unit (blocked+pause would force-cancel it).
|
|
996
1055
|
this.clearPendingDispatch();
|
|
997
|
-
const
|
|
1056
|
+
const skipped: AutoAdvanceResult = { kind: "skipped", reason: "idempotent advance: unit already active" };
|
|
998
1057
|
this.journalTransition({
|
|
999
|
-
name: "advance-
|
|
1000
|
-
reason:
|
|
1058
|
+
name: "advance-skipped",
|
|
1059
|
+
reason: skipped.reason,
|
|
1001
1060
|
unitType: decision.unitType,
|
|
1002
1061
|
unitId: decision.unitId,
|
|
1003
1062
|
});
|
|
1004
|
-
this.postAdvanceRecord(
|
|
1005
|
-
return
|
|
1063
|
+
this.postAdvanceRecord(skipped);
|
|
1064
|
+
return skipped;
|
|
1006
1065
|
}
|
|
1007
1066
|
|
|
1008
|
-
// Stuck-loop detection: when the
|
|
1009
|
-
// `nextKey` (count >= STUCK_WINDOW_SIZE), the
|
|
1010
|
-
//
|
|
1011
|
-
//
|
|
1012
|
-
|
|
1067
|
+
// Stuck-loop detection: when the window is saturated with copies of
|
|
1068
|
+
// `nextKey` (count >= STUCK_WINDOW_SIZE), consult the Dispatch History
|
|
1069
|
+
// module's full detect-stuck rule set for the verdict instead of the old
|
|
1070
|
+
// bare saturation count. This keeps the saturation threshold (the window
|
|
1071
|
+
// deliberately records benign idempotent repeats, so earlier-firing
|
|
1072
|
+
// rules would false-positive on pause/resume re-advances) while gaining
|
|
1073
|
+
// retry-budget suppression and diagnosable rule reasons. A saturated
|
|
1074
|
+
// window with no verdict means the dispatch ledger says we are inside
|
|
1075
|
+
// the unit's retry-backoff budget — let the retry proceed.
|
|
1076
|
+
const stuckVerdict =
|
|
1077
|
+
matchingCount >= STUCK_WINDOW_SIZE ? this.dispatchHistory.detectStuck() : null;
|
|
1078
|
+
if (stuckVerdict) {
|
|
1013
1079
|
// #442: before declaring a stuck loop, verify the unit didn't actually
|
|
1014
1080
|
// complete on disk (stale DB) and recover if so — legacy graduated
|
|
1015
1081
|
// stuck-recovery parity. Otherwise hard-stop with a diagnosable reason.
|
|
@@ -1020,7 +1086,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1020
1086
|
this.clearPendingDispatch();
|
|
1021
1087
|
const blocked: AutoAdvanceResult = {
|
|
1022
1088
|
kind: "blocked",
|
|
1023
|
-
reason: `stuck-loop: ${
|
|
1089
|
+
reason: `stuck-loop: ${stuckVerdict.reason}`,
|
|
1024
1090
|
action: "stop",
|
|
1025
1091
|
};
|
|
1026
1092
|
this.journalTransition({
|
|
@@ -1114,7 +1180,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1114
1180
|
if (result.kind === "stopped") {
|
|
1115
1181
|
this.lastAdvanceKey = null;
|
|
1116
1182
|
this.lastFinalizedUnitKey = null;
|
|
1117
|
-
this.
|
|
1183
|
+
this.dispatchHistory.clearOnRecovery();
|
|
1118
1184
|
this.status.activeUnit = undefined;
|
|
1119
1185
|
}
|
|
1120
1186
|
this.bumpTransition();
|
|
@@ -1143,9 +1209,18 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1143
1209
|
public async resume(): Promise<AutoAdvanceResult> {
|
|
1144
1210
|
this.lastAdvanceKey = null;
|
|
1145
1211
|
this.lastFinalizedUnitKey = null;
|
|
1146
|
-
// Preserve
|
|
1147
|
-
// accumulates across pause/resume cycles rather than
|
|
1212
|
+
// Preserve the dispatch-history window across an in-process resume so
|
|
1213
|
+
// stuck-loop detection accumulates across pause/resume cycles rather than
|
|
1214
|
+
// resetting each time (#572 regression). When the window is empty (fresh
|
|
1215
|
+
// orchestrator resuming a prior session), rehydrate it from the DB
|
|
1216
|
+
// dispatch ledger so cross-session re-dispatch loops are detected (#482).
|
|
1217
|
+
if (this.dispatchHistory.getRecentWindow().length === 0) {
|
|
1218
|
+
this.dispatchHistory.rehydrate();
|
|
1219
|
+
}
|
|
1148
1220
|
this.lastStuckRecoveryKey = null;
|
|
1221
|
+
// ADR-030: drop the prior "from" — the first advance after resume has no
|
|
1222
|
+
// edge to assert (avoids a false illegal-edge across the pause boundary).
|
|
1223
|
+
this.lastDerivedPhase = null;
|
|
1149
1224
|
this.status.phase = "running";
|
|
1150
1225
|
this.bumpTransition();
|
|
1151
1226
|
this.journalTransition({ name: "resume" });
|
|
@@ -1162,10 +1237,11 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1162
1237
|
this.status.activeUnit = undefined;
|
|
1163
1238
|
this.lastAdvanceKey = null;
|
|
1164
1239
|
this.lastFinalizedUnitKey = null;
|
|
1165
|
-
|
|
1166
|
-
//
|
|
1240
|
+
this.lastDerivedPhase = null;
|
|
1241
|
+
// Preserve the dispatch-history window on pause so stuck-loop detection
|
|
1242
|
+
// accumulates across pause/resume cycles. Only clear on a hard stop.
|
|
1167
1243
|
if (reason !== "pause") {
|
|
1168
|
-
this.
|
|
1244
|
+
this.dispatchHistory.clearOnRecovery();
|
|
1169
1245
|
}
|
|
1170
1246
|
this.lastStuckRecoveryKey = null;
|
|
1171
1247
|
this.bumpTransition();
|
|
@@ -1179,9 +1255,9 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1179
1255
|
}
|
|
1180
1256
|
|
|
1181
1257
|
public async completeActiveUnit(unit: { unitType: string; unitId: string }): Promise<void> {
|
|
1182
|
-
const unitKey =
|
|
1258
|
+
const unitKey = buildDispatchKey(unit.unitType, unit.unitId);
|
|
1183
1259
|
const activeUnitKey = this.status.activeUnit
|
|
1184
|
-
?
|
|
1260
|
+
? buildDispatchKey(this.status.activeUnit.unitType, this.status.activeUnit.unitId)
|
|
1185
1261
|
: null;
|
|
1186
1262
|
if (activeUnitKey !== unitKey) return;
|
|
1187
1263
|
|
|
@@ -1199,9 +1275,9 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
1199
1275
|
}
|
|
1200
1276
|
|
|
1201
1277
|
public async retryActiveUnit(unit: { unitType: string; unitId: string }): Promise<void> {
|
|
1202
|
-
const unitKey =
|
|
1278
|
+
const unitKey = buildDispatchKey(unit.unitType, unit.unitId);
|
|
1203
1279
|
const activeUnitKey = this.status.activeUnit
|
|
1204
|
-
?
|
|
1280
|
+
? buildDispatchKey(this.status.activeUnit.unitType, this.status.activeUnit.unitId)
|
|
1205
1281
|
: null;
|
|
1206
1282
|
if (activeUnitKey !== unitKey && this.lastFinalizedUnitKey !== unitKey) return;
|
|
1207
1283
|
|
|
@@ -19,7 +19,8 @@ import {
|
|
|
19
19
|
type PostUnitContext,
|
|
20
20
|
type PreVerificationOpts,
|
|
21
21
|
} from "../auto-post-unit.js";
|
|
22
|
-
import { lastAssistantText } from "../
|
|
22
|
+
import { lastAssistantText } from "../consent-question.js";
|
|
23
|
+
import { resolveEffectiveUnitIsolationMode } from "../preferences.js";
|
|
23
24
|
import type { Phase } from "../types.js";
|
|
24
25
|
import {
|
|
25
26
|
MAX_RECOVERY_CHARS,
|
|
@@ -32,6 +33,7 @@ import {
|
|
|
32
33
|
type IterationData,
|
|
33
34
|
} from "./types.js";
|
|
34
35
|
import { detectStuck } from "./detect-stuck.js";
|
|
36
|
+
import { STUCK_WINDOW_SIZE } from "./dispatch-history.js";
|
|
35
37
|
import { runUnit } from "./run-unit.js";
|
|
36
38
|
import { debugLog } from "../debug-logger.js";
|
|
37
39
|
import { resolveWorktreeProjectRoot, normalizeWorktreePathForCompare } from "../worktree-root.js";
|
|
@@ -106,7 +108,6 @@ import {
|
|
|
106
108
|
} from "../root-write-leak-guard.js";
|
|
107
109
|
import { classifyError, isTransient } from "../error-classifier.js";
|
|
108
110
|
|
|
109
|
-
export const STUCK_WINDOW_SIZE = 6;
|
|
110
111
|
const STUCK_RECOVERY_ATTEMPTS_KEY = "stuck_recovery_attempts";
|
|
111
112
|
const ZERO_TOOL_PROVIDER_ERROR_PREFIX_RE =
|
|
112
113
|
/^(?:api error(?::|$|\s*\()|provider error(?::|$|\s*\()|request failed\b|(?:http\s*)?(?:429|500|502|503)\b|\b(?:econnreset|etimedout|econnrefused|epipe)\b|socket hang up\b|fetch failed\b|(?:network|connection|server) error(?::|$)|connection (?:reset|refused)(?::|$|\s+by\b)|dns\b.*(?:fail|error|timeout)|unexpected eof\b|stream idle timeout\b|partial response received\b|stream_exhausted\b|terminated(?::|$)|(?:connection|stream|request)\b.{0,40}\bterminated\b|other side closed\b|rate.?limit(?:ed| exceeded| reached| error)|too many requests\b|you(?:'ve| have) (?:hit|reached) your (?:\w+ )?limit\b|.*\b(?:usage|session|weekly|daily|monthly|quota) limit\b|limit\b.{0,40}\bresets?\b|out of extra usage\b|service.?unavailable\b|internal(?: server)? error(?::|$)|internal(?:[_-]server)?[_-]error\b|server[_-]error\b|(?:provider|server|api|model|codex|claude|openai|anthropic|gemini)\b.{0,80}\boverloaded\b|overloaded\b.{0,80}\b(?:provider|server|api|model)\b|context (?:window|length) exceed|context window exceed)/i;
|
|
@@ -362,7 +363,15 @@ async function validateSourceWriteWorktreeSafety(
|
|
|
362
363
|
if (!writesSource) return null;
|
|
363
364
|
|
|
364
365
|
const projectRoot = s.canonicalProjectRoot ?? resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
|
|
365
|
-
|
|
366
|
+
// A degraded session already fell back to the milestone branch in the
|
|
367
|
+
// project root — validating against the canonical worktree root there
|
|
368
|
+
// would fail every dispatch with a false invalid-root. The same applies
|
|
369
|
+
// to a stranded-recovery session that adopted the milestone branch.
|
|
370
|
+
const isolationMode = resolveEffectiveUnitIsolationMode(
|
|
371
|
+
deps.getIsolationMode(projectRoot),
|
|
372
|
+
s.isolationDegraded,
|
|
373
|
+
s.strandedRecoveryIsolationMode,
|
|
374
|
+
);
|
|
366
375
|
if (isolationMode !== "worktree") return null;
|
|
367
376
|
|
|
368
377
|
const safety = createWorktreeSafetyModule();
|
|
@@ -10,10 +10,9 @@ import type {
|
|
|
10
10
|
|
|
11
11
|
import { deriveState } from "./state.js";
|
|
12
12
|
import { loadFile } from "./files.js";
|
|
13
|
-
import { isDbAvailable,
|
|
14
|
-
import { parseRoadmap } from "./parsers-legacy.js";
|
|
13
|
+
import { isDbAvailable, getClosedSliceIds } from "./gsd-db.js";
|
|
15
14
|
import {
|
|
16
|
-
|
|
15
|
+
resolveSliceFile, relSliceFile,
|
|
17
16
|
} from "./paths.js";
|
|
18
17
|
import {
|
|
19
18
|
buildResearchSlicePrompt,
|
|
@@ -182,21 +181,9 @@ export async function dispatchDirectPhase(
|
|
|
182
181
|
|
|
183
182
|
case "reassess":
|
|
184
183
|
case "reassess-roadmap": {
|
|
185
|
-
// DB
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
completedSliceIds = getMilestoneSlices(mid).filter(s => s.status === "complete").map(s => s.id);
|
|
189
|
-
}
|
|
190
|
-
if (completedSliceIds.length === 0) {
|
|
191
|
-
// File-based fallback: parse roadmap checkboxes
|
|
192
|
-
const roadmapPath = resolveMilestoneFile(dispatchBase, mid, "ROADMAP");
|
|
193
|
-
if (roadmapPath) {
|
|
194
|
-
const roadmapContent = await loadFile(roadmapPath);
|
|
195
|
-
if (roadmapContent) {
|
|
196
|
-
completedSliceIds = parseRoadmap(roadmapContent).slices.filter(s => s.done).map(s => s.id);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
184
|
+
// DB-authoritative read (ADR-017) — markdown projections are never
|
|
185
|
+
// consulted for dispatch decisions. No DB rows means no completed slices.
|
|
186
|
+
const completedSliceIds = isDbAvailable() ? getClosedSliceIds(mid) : [];
|
|
200
187
|
if (completedSliceIds.length === 0) {
|
|
201
188
|
ctx.ui.notify("Cannot dispatch reassess-roadmap: no completed slices.", "warning");
|
|
202
189
|
return;
|
|
@@ -222,20 +209,9 @@ export async function dispatchDirectPhase(
|
|
|
222
209
|
// incomplete) slice. After slice completion, state.activeSlice advances
|
|
223
210
|
// to the next incomplete slice, so we find the last done slice from the
|
|
224
211
|
// roadmap instead (#1693).
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
}
|
|
229
|
-
if (uatCompletedSliceIds.length === 0) {
|
|
230
|
-
// File-based fallback: parse roadmap checkboxes
|
|
231
|
-
const roadmapPath = resolveMilestoneFile(dispatchBase, mid, "ROADMAP");
|
|
232
|
-
if (roadmapPath) {
|
|
233
|
-
const roadmapContent = await loadFile(roadmapPath);
|
|
234
|
-
if (roadmapContent) {
|
|
235
|
-
uatCompletedSliceIds = parseRoadmap(roadmapContent).slices.filter(s => s.done).map(s => s.id);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}
|
|
212
|
+
// DB-authoritative read (ADR-017) — no markdown fallback for dispatch
|
|
213
|
+
// decisions.
|
|
214
|
+
const uatCompletedSliceIds = isDbAvailable() ? getClosedSliceIds(mid) : [];
|
|
239
215
|
if (uatCompletedSliceIds.length === 0) {
|
|
240
216
|
ctx.ui.notify("Cannot dispatch run-uat: no completed slices.", "warning");
|
|
241
217
|
return;
|