@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.9ad8ae33
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.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/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 +3 -0
- 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/stream-adapter.js +30 -4
- 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 +89 -54
- package/dist/resources/extensions/gsd/auto/phases.js +49 -6
- package/dist/resources/extensions/gsd/auto/session.js +3 -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 +35 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +41 -18
- 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.js +44 -91
- package/dist/resources/extensions/gsd/auto.js +41 -14
- 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 +23 -6
- 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 +212 -48
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
- 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 +4 -6
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- 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/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/queries.js +26 -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 +2 -6
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
- 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/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +2 -1
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +23 -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 +4 -1
- 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/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +27 -0
- 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/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
- 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 +7 -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/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 +37 -94
- 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/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/state.js +6 -20
- 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 +56 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
- package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
- 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 +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
- 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/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- 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/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-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree-root.js +11 -0
- package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
- package/dist/resources/extensions/gsd/worktree.js +8 -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/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 +13 -13
- 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/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/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 +13 -13
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- 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 -15
- package/package.json +2 -2
- 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 +5 -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 +9 -1
- 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 +116 -39
- 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/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 +35 -125
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +46 -120
- 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/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 +3 -0
- 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/stream-adapter.ts +34 -4
- 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.ts +4 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +98 -56
- package/src/resources/extensions/gsd/auto/phases.ts +65 -26
- package/src/resources/extensions/gsd/auto/session.ts +3 -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 +40 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +42 -21
- 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.ts +44 -94
- package/src/resources/extensions/gsd/auto.ts +52 -16
- 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 +23 -6
- 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 +251 -47
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
- 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 +4 -6
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- 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/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/queries.ts +37 -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 +2 -7
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
- 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/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +4 -3
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +37 -28
- 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 +4 -1
- 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/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +33 -0
- 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/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
- 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 +7 -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/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 +42 -96
- 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/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/state.ts +9 -21
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
- 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/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 +22 -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/db-writer.test.ts +15 -4
- 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/discuss-routing-fixes.test.ts +12 -2
- 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/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/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 +2 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +73 -58
- 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/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/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/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/register-hooks-depth-verification.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -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 +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/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/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.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -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 +76 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
- package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
- 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 +2 -2
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
- 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/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- 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/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-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree-root.ts +12 -0
- package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
- package/src/resources/extensions/gsd/worktree.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/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_ssgManifest.js +0 -0
|
@@ -19,9 +19,9 @@ import {
|
|
|
19
19
|
type PostUnitContext,
|
|
20
20
|
type PreVerificationOpts,
|
|
21
21
|
} from "../auto-post-unit.js";
|
|
22
|
-
import { lastAssistantText } from "../
|
|
23
|
-
import { resolveEffectiveUnitIsolationMode } from "../preferences.js";
|
|
24
|
-
import type { Phase } from "../types.js";
|
|
22
|
+
import { lastAssistantText } from "../consent-question.js";
|
|
23
|
+
import { resolveEffectiveUnitIsolationMode, getIsolationMode } from "../preferences.js";
|
|
24
|
+
import type { GSDState, Phase } from "../types.js";
|
|
25
25
|
import {
|
|
26
26
|
MAX_RECOVERY_CHARS,
|
|
27
27
|
BUDGET_THRESHOLDS,
|
|
@@ -33,6 +33,7 @@ import {
|
|
|
33
33
|
type IterationData,
|
|
34
34
|
} from "./types.js";
|
|
35
35
|
import { detectStuck } from "./detect-stuck.js";
|
|
36
|
+
import { STUCK_WINDOW_SIZE } from "./dispatch-history.js";
|
|
36
37
|
import { runUnit } from "./run-unit.js";
|
|
37
38
|
import { debugLog } from "../debug-logger.js";
|
|
38
39
|
import { resolveWorktreeProjectRoot, normalizeWorktreePathForCompare } from "../worktree-root.js";
|
|
@@ -61,9 +62,10 @@ import { writeUnitRuntimeRecord } from "../unit-runtime.js";
|
|
|
61
62
|
import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "./finalize-timeout.js";
|
|
62
63
|
import { getEligibleSlices } from "../slice-parallel-eligibility.js";
|
|
63
64
|
import { isSliceParallelActive, startSliceParallel } from "../slice-parallel-orchestrator.js";
|
|
64
|
-
import { isDbAvailable, getMilestoneSlices, getSlice, getTask } from "../gsd-db.js";
|
|
65
|
+
import { isDbAvailable, getMilestone, getMilestoneSlices, getSlice, getTask } from "../gsd-db.js";
|
|
65
66
|
import { refreshWorkflowDatabaseFromDisk } from "../db-workspace.js";
|
|
66
67
|
import { isClosedStatus } from "../status-guards.js";
|
|
68
|
+
import { findUnmergedCompletedMilestones } from "../unmerged-milestone-guard.js";
|
|
67
69
|
import { setRuntimeKv } from "../db/runtime-kv.js";
|
|
68
70
|
import { getLatestForUnit } from "../db/unit-dispatches.js";
|
|
69
71
|
import { reconcileBeforeSpawn } from "../state-reconciliation.js";
|
|
@@ -81,11 +83,8 @@ import { parseUnitId } from "../unit-id.js";
|
|
|
81
83
|
import { createCheckpoint, cleanupCheckpoint, rollbackToCheckpoint } from "../safety/git-checkpoint.js";
|
|
82
84
|
import { resolveSafetyHarnessConfig } from "../safety/safety-harness.js";
|
|
83
85
|
import { getContextPauseAction } from "../auto-budget.js";
|
|
84
|
-
import {
|
|
85
|
-
|
|
86
|
-
getRequiredWorkflowToolsForAutoUnit,
|
|
87
|
-
supportsStructuredQuestions,
|
|
88
|
-
} from "../workflow-mcp.js";
|
|
86
|
+
import { supportsStructuredQuestions } from "../workflow-mcp.js";
|
|
87
|
+
import { getUnitWorkflowDispatchReadinessError } from "../tool-contract.js";
|
|
89
88
|
import { prepareWorkflowMcpForProject } from "../workflow-mcp-auto-prep.js";
|
|
90
89
|
import {
|
|
91
90
|
applyThinkingLevelForModel,
|
|
@@ -107,7 +106,6 @@ import {
|
|
|
107
106
|
} from "../root-write-leak-guard.js";
|
|
108
107
|
import { classifyError, isTransient } from "../error-classifier.js";
|
|
109
108
|
|
|
110
|
-
export const STUCK_WINDOW_SIZE = 6;
|
|
111
109
|
const STUCK_RECOVERY_ATTEMPTS_KEY = "stuck_recovery_attempts";
|
|
112
110
|
const ZERO_TOOL_PROVIDER_ERROR_PREFIX_RE =
|
|
113
111
|
/^(?: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;
|
|
@@ -838,6 +836,39 @@ async function failClosedOnFinalizeTimeout(
|
|
|
838
836
|
return { action: "break", reason: progressKind };
|
|
839
837
|
}
|
|
840
838
|
|
|
839
|
+
export async function shouldSkipTerminalMilestoneCloseout(
|
|
840
|
+
s: AutoSession,
|
|
841
|
+
state: Pick<GSDState, "phase" | "lastCompletedMilestone" | "activeMilestone">,
|
|
842
|
+
mid?: string | null,
|
|
843
|
+
): Promise<{ skip: boolean; milestoneId?: string }> {
|
|
844
|
+
const closeoutMilestoneId = mid ?? s.currentMilestoneId ?? state.lastCompletedMilestone?.id;
|
|
845
|
+
if (s.completionStopInProgress) {
|
|
846
|
+
return { skip: true, milestoneId: closeoutMilestoneId };
|
|
847
|
+
}
|
|
848
|
+
if (!closeoutMilestoneId) {
|
|
849
|
+
return { skip: false };
|
|
850
|
+
}
|
|
851
|
+
if (isDbAvailable()) refreshWorkflowDatabaseFromDisk();
|
|
852
|
+
const closeoutBasePath = s.originalBasePath || s.canonicalProjectRoot || s.basePath;
|
|
853
|
+
let closeoutMergePending = false;
|
|
854
|
+
if (getIsolationMode(closeoutBasePath) !== "none") {
|
|
855
|
+
try {
|
|
856
|
+
const blockers = await findUnmergedCompletedMilestones(closeoutBasePath);
|
|
857
|
+
closeoutMergePending = blockers.some((blocker) => blocker.milestoneId === closeoutMilestoneId);
|
|
858
|
+
} catch {
|
|
859
|
+
// Fail open: without git/DB inspection we cannot safely treat closeout as done.
|
|
860
|
+
closeoutMergePending = true;
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
const milestoneAlreadyClosedOut = isDbAvailable()
|
|
864
|
+
&& isClosedStatus(getMilestone(closeoutMilestoneId)?.status ?? "")
|
|
865
|
+
&& !closeoutMergePending;
|
|
866
|
+
if (milestoneAlreadyClosedOut) {
|
|
867
|
+
return { skip: true, milestoneId: closeoutMilestoneId };
|
|
868
|
+
}
|
|
869
|
+
return { skip: false, milestoneId: closeoutMilestoneId };
|
|
870
|
+
}
|
|
871
|
+
|
|
841
872
|
// ─── runPreDispatch ───────────────────────────────────────────────────────────
|
|
842
873
|
|
|
843
874
|
/**
|
|
@@ -1279,6 +1310,14 @@ export async function runPreDispatch(
|
|
|
1279
1310
|
|
|
1280
1311
|
// ── Terminal conditions ──────────────────────────────────────────────
|
|
1281
1312
|
|
|
1313
|
+
if (state.phase === "complete") {
|
|
1314
|
+
const closeoutSkip = await shouldSkipTerminalMilestoneCloseout(s, state, mid);
|
|
1315
|
+
if (closeoutSkip.skip) {
|
|
1316
|
+
debugLog("autoLoop", { phase: "complete", reason: "milestone-already-closed", milestoneId: closeoutSkip.milestoneId });
|
|
1317
|
+
return { action: "break", reason: "milestone-complete" };
|
|
1318
|
+
}
|
|
1319
|
+
}
|
|
1320
|
+
|
|
1282
1321
|
if (!mid) {
|
|
1283
1322
|
if (s.currentUnit) {
|
|
1284
1323
|
await deps.closeoutUnit(
|
|
@@ -2324,22 +2363,19 @@ export async function runUnitPhase(
|
|
|
2324
2363
|
? `${(s.currentUnitModel as any).provider ?? ""}/${(s.currentUnitModel as any).id ?? ""}`
|
|
2325
2364
|
: null;
|
|
2326
2365
|
|
|
2327
|
-
const compatibilityError =
|
|
2328
|
-
s.currentUnitModel?.provider ?? ctx.model?.provider,
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
|
|
2335
|
-
? ctx.modelRegistry.getProviderAuthMode(
|
|
2336
|
-
:
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
|
|
2341
|
-
},
|
|
2342
|
-
);
|
|
2366
|
+
const compatibilityError = getUnitWorkflowDispatchReadinessError({
|
|
2367
|
+
provider: s.currentUnitModel?.provider ?? ctx.model?.provider,
|
|
2368
|
+
projectRoot: s.basePath,
|
|
2369
|
+
surface: "auto-mode",
|
|
2370
|
+
unitType,
|
|
2371
|
+
authMode: s.currentUnitModel?.provider
|
|
2372
|
+
? ctx.modelRegistry.getProviderAuthMode(s.currentUnitModel.provider)
|
|
2373
|
+
: ctx.model?.provider
|
|
2374
|
+
? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
|
|
2375
|
+
: undefined,
|
|
2376
|
+
baseUrl: (s.currentUnitModel as any)?.baseUrl ?? ctx.model?.baseUrl,
|
|
2377
|
+
activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
|
|
2378
|
+
});
|
|
2343
2379
|
const workflowMcpPrepModel = s.currentUnitModel;
|
|
2344
2380
|
if (compatibilityError) {
|
|
2345
2381
|
s.currentUnitRouting = prevUnitRouting;
|
|
@@ -2409,6 +2445,9 @@ export async function runUnitPhase(
|
|
|
2409
2445
|
causedBy: "unit-start",
|
|
2410
2446
|
});
|
|
2411
2447
|
s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
|
|
2448
|
+
if (nextDispatchCount <= 1) {
|
|
2449
|
+
s.toolUnavailableRetries = 0;
|
|
2450
|
+
}
|
|
2412
2451
|
const unitStartSeq = ic.nextSeq();
|
|
2413
2452
|
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: unitStartSeq, eventType: "unit-start", data: { unitType, unitId } });
|
|
2414
2453
|
deps.captureAvailableSkills();
|
|
@@ -212,6 +212,8 @@ export class AutoSession {
|
|
|
212
212
|
/** Set when a GSD tool execution ends with isError due to malformed/truncated
|
|
213
213
|
* JSON arguments. Checked by postUnitPreVerification to break retry loops. */
|
|
214
214
|
lastToolInvocationError: string | null = null;
|
|
215
|
+
/** Consecutive tool-unavailable retries for the current unit (MCP startup race). */
|
|
216
|
+
toolUnavailableRetries = 0;
|
|
215
217
|
/** Agent-end messages from the just-finished unit, consumed during finalize. */
|
|
216
218
|
lastUnitAgentEndMessages: unknown[] | null = null;
|
|
217
219
|
/** Set when turn-level git action fails during closeout. */
|
|
@@ -406,6 +408,7 @@ export class AutoSession {
|
|
|
406
408
|
this.lastPreExecFailure = null;
|
|
407
409
|
this.preExecRetryCount.clear();
|
|
408
410
|
this.lastToolInvocationError = null;
|
|
411
|
+
this.toolUnavailableRetries = 0;
|
|
409
412
|
this.lastUnitAgentEndMessages = null;
|
|
410
413
|
this.lastGitActionFailure = null;
|
|
411
414
|
this.lastGitActionStatus = null;
|
|
@@ -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,
|
|
@@ -32,10 +31,7 @@ import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
|
32
31
|
import type { MinimalModelRegistry } from "./context-budget.js";
|
|
33
32
|
import { pauseAuto } from "./auto.js";
|
|
34
33
|
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
35
|
-
import {
|
|
36
|
-
getWorkflowTransportSupportError,
|
|
37
|
-
getRequiredWorkflowToolsForAutoUnit,
|
|
38
|
-
} from "./workflow-mcp.js";
|
|
34
|
+
import { getUnitWorkflowDispatchReadinessError } from "./tool-contract.js";
|
|
39
35
|
|
|
40
36
|
export async function dispatchDirectPhase(
|
|
41
37
|
ctx: ExtensionCommandContext,
|
|
@@ -182,21 +178,9 @@ export async function dispatchDirectPhase(
|
|
|
182
178
|
|
|
183
179
|
case "reassess":
|
|
184
180
|
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
|
-
}
|
|
181
|
+
// DB-authoritative read (ADR-017) — markdown projections are never
|
|
182
|
+
// consulted for dispatch decisions. No DB rows means no completed slices.
|
|
183
|
+
const completedSliceIds = isDbAvailable() ? getClosedSliceIds(mid) : [];
|
|
200
184
|
if (completedSliceIds.length === 0) {
|
|
201
185
|
ctx.ui.notify("Cannot dispatch reassess-roadmap: no completed slices.", "warning");
|
|
202
186
|
return;
|
|
@@ -222,20 +206,9 @@ export async function dispatchDirectPhase(
|
|
|
222
206
|
// incomplete) slice. After slice completion, state.activeSlice advances
|
|
223
207
|
// to the next incomplete slice, so we find the last done slice from the
|
|
224
208
|
// 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
|
-
}
|
|
209
|
+
// DB-authoritative read (ADR-017) — no markdown fallback for dispatch
|
|
210
|
+
// decisions.
|
|
211
|
+
const uatCompletedSliceIds = isDbAvailable() ? getClosedSliceIds(mid) : [];
|
|
239
212
|
if (uatCompletedSliceIds.length === 0) {
|
|
240
213
|
ctx.ui.notify("Cannot dispatch run-uat: no completed slices.", "warning");
|
|
241
214
|
return;
|
|
@@ -280,18 +253,15 @@ export async function dispatchDirectPhase(
|
|
|
280
253
|
return;
|
|
281
254
|
}
|
|
282
255
|
|
|
283
|
-
const compatibilityError =
|
|
284
|
-
ctx.model?.provider,
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
|
|
293
|
-
},
|
|
294
|
-
);
|
|
256
|
+
const compatibilityError = getUnitWorkflowDispatchReadinessError({
|
|
257
|
+
provider: ctx.model?.provider,
|
|
258
|
+
projectRoot,
|
|
259
|
+
surface: "direct phase dispatch",
|
|
260
|
+
unitType,
|
|
261
|
+
authMode: ctx.model?.provider ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider) : undefined,
|
|
262
|
+
baseUrl: ctx.model?.baseUrl,
|
|
263
|
+
activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
|
|
264
|
+
});
|
|
295
265
|
if (compatibilityError) {
|
|
296
266
|
ctx.ui.notify(compatibilityError, "error");
|
|
297
267
|
return;
|
|
@@ -20,6 +20,8 @@ import { getUatBrowserToolSupportError, type UatType } from "./uat-policy.js";
|
|
|
20
20
|
import {
|
|
21
21
|
isDbAvailable,
|
|
22
22
|
getMilestoneSlices,
|
|
23
|
+
getMilestoneSliceSummaries,
|
|
24
|
+
getClosedSliceIds,
|
|
23
25
|
getPendingGatesForTurn,
|
|
24
26
|
markPendingGatesOmittedForTurn,
|
|
25
27
|
getMilestone,
|
|
@@ -47,7 +49,6 @@ import {
|
|
|
47
49
|
buildTaskFileName,
|
|
48
50
|
gsdProjectionRoot,
|
|
49
51
|
} from "./paths.js";
|
|
50
|
-
import { parseRoadmap } from "./parsers-legacy.js";
|
|
51
52
|
import { validateArtifact } from "./schemas/validate.js";
|
|
52
53
|
import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, readdirSync } from "node:fs";
|
|
53
54
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
@@ -84,13 +85,15 @@ import { selectReactiveDispatchBatch } from "./uok/execution-graph.js";
|
|
|
84
85
|
import { getMilestonePipelineVariant } from "./milestone-scope-classifier.js";
|
|
85
86
|
import { EXECUTION_ENTRY_PHASES, hasFinalizedMilestoneContext } from "./uok/plan-v2.js";
|
|
86
87
|
import { isAutoActive } from "./auto.js";
|
|
87
|
-
|
|
88
|
+
// Host adapter explicitly: auto-dispatch runs in the extension host, and the
|
|
89
|
+
// ambient write-gate exports env-sniff the adapter per call (they are reserved
|
|
90
|
+
// for the workflow MCP child's dynamic-import surface).
|
|
91
|
+
import { hostWriteGateAdapter } from "./bootstrap/write-gate.js";
|
|
88
92
|
import { ensureWorkflowPreferencesCaptured } from "./planning-depth.js";
|
|
89
93
|
import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
90
|
-
import {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
} from "./workflow-mcp.js";
|
|
94
|
+
import { resolveWorkflowMcpProjectRoot } from "./workflow-mcp.js";
|
|
95
|
+
import { getUnitWorkflowDispatchReadinessError } from "./tool-contract.js";
|
|
96
|
+
import { prepareBrowserDaemonForUat } from "./browser-daemon-auto-prep.js";
|
|
94
97
|
import {
|
|
95
98
|
PROJECT_RESEARCH_INFLIGHT_MARKER,
|
|
96
99
|
} from "./project-research-policy.js";
|
|
@@ -490,27 +493,12 @@ function persistSliceAssessmentBackfill(
|
|
|
490
493
|
}
|
|
491
494
|
|
|
492
495
|
function backfillMissingAssessmentsFromSummaries(basePath: string, mid: string): void {
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
}
|
|
500
|
-
} else {
|
|
501
|
-
const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
502
|
-
if (!roadmapFile) return;
|
|
503
|
-
try {
|
|
504
|
-
const roadmap = parseRoadmap(readFileSync(roadmapFile, "utf-8"));
|
|
505
|
-
for (const slice of roadmap.slices) {
|
|
506
|
-
if (slice.done) completedSliceIds.add(slice.id);
|
|
507
|
-
}
|
|
508
|
-
} catch {
|
|
509
|
-
return;
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
for (const sliceId of completedSliceIds) {
|
|
496
|
+
// DB-authoritative (ADR-017): no markdown fallback. Without DB rows there
|
|
497
|
+
// is nothing to backfill.
|
|
498
|
+
if (!isDbAvailable()) return;
|
|
499
|
+
// Canonical closed vocabulary (complete/done/skipped/closed) — a skipped or
|
|
500
|
+
// closed slice with a SUMMARY gets the same assessment backfill treatment.
|
|
501
|
+
for (const sliceId of getClosedSliceIds(mid)) {
|
|
514
502
|
const summaryPath = resolveSliceFile(basePath, mid, sliceId, "SUMMARY");
|
|
515
503
|
if (!summaryPath || !existsSync(summaryPath)) continue;
|
|
516
504
|
|
|
@@ -696,7 +684,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
696
684
|
// deadlock. Deep planning is still user-driven even inside auto-mode,
|
|
697
685
|
// so it must wait for explicit approval instead of taking this bypass.
|
|
698
686
|
if (shouldBypassMilestoneDepthGateInAuto(prefs)) {
|
|
699
|
-
markDepthVerified(mid, basePath);
|
|
687
|
+
hostWriteGateAdapter.markDepthVerified(mid, basePath);
|
|
700
688
|
}
|
|
701
689
|
return {
|
|
702
690
|
action: "dispatch",
|
|
@@ -754,11 +742,15 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
754
742
|
// Transport preflight: verify required MCP tools are actually connected
|
|
755
743
|
// before consuming a retry attempt. Fixes tool-starved sessions burning
|
|
756
744
|
// all MAX_UAT_ATTEMPTS before stopping (#477).
|
|
757
|
-
const transportError =
|
|
758
|
-
sessionProvider,
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
745
|
+
const transportError = getUnitWorkflowDispatchReadinessError({
|
|
746
|
+
provider: sessionProvider,
|
|
747
|
+
projectRoot: basePath,
|
|
748
|
+
surface: "auto-mode",
|
|
749
|
+
unitType: "run-uat",
|
|
750
|
+
authMode: sessionAuthMode,
|
|
751
|
+
baseUrl: sessionBaseUrl,
|
|
752
|
+
activeTools,
|
|
753
|
+
});
|
|
762
754
|
if (transportError) {
|
|
763
755
|
return { action: "stop" as const, reason: transportError, level: "warning" as const };
|
|
764
756
|
}
|
|
@@ -772,6 +764,16 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
772
764
|
if (browserToolError) {
|
|
773
765
|
return { action: "stop" as const, reason: browserToolError, level: "warning" as const };
|
|
774
766
|
}
|
|
767
|
+
const browserDaemonError = prepareBrowserDaemonForUat({
|
|
768
|
+
uatType,
|
|
769
|
+
sessionProvider,
|
|
770
|
+
sessionAuthMode,
|
|
771
|
+
sessionBaseUrl,
|
|
772
|
+
projectRoot: resolveWorkflowMcpProjectRoot(basePath),
|
|
773
|
+
});
|
|
774
|
+
if (browserDaemonError) {
|
|
775
|
+
return { action: "stop" as const, reason: browserDaemonError, level: "warning" as const };
|
|
776
|
+
}
|
|
775
777
|
|
|
776
778
|
// Cap run-uat dispatch attempts to prevent infinite replay (#3624).
|
|
777
779
|
// Check before incrementing so an exhausted counter cannot create a
|
|
@@ -808,23 +810,10 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
808
810
|
// Only applies when UAT dispatch is enabled
|
|
809
811
|
if (!prefs?.uat_dispatch) return null;
|
|
810
812
|
|
|
811
|
-
// DB-
|
|
812
|
-
|
|
813
|
-
if (isDbAvailable())
|
|
814
|
-
|
|
815
|
-
.filter(s => isClosedStatus(s.status))
|
|
816
|
-
.map(s => s.id);
|
|
817
|
-
} else {
|
|
818
|
-
// Filesystem fallback for degraded / unmigrated projects.
|
|
819
|
-
// `slice.done` in the parsed ROADMAP is the disk-level closed signal.
|
|
820
|
-
const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
821
|
-
const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
|
|
822
|
-
if (!roadmapContent) return null;
|
|
823
|
-
const roadmap = parseRoadmap(roadmapContent);
|
|
824
|
-
closedSliceIds = roadmap.slices.filter(s => s.done).map(s => s.id);
|
|
825
|
-
}
|
|
826
|
-
|
|
827
|
-
for (const sliceId of closedSliceIds) {
|
|
813
|
+
// DB-authoritative (ADR-017): closed slices come from the DB only; the
|
|
814
|
+
// ROADMAP projection is never parsed for gate decisions.
|
|
815
|
+
if (!isDbAvailable()) return null;
|
|
816
|
+
for (const sliceId of getClosedSliceIds(mid)) {
|
|
828
817
|
const result = await readUatGateVerdict(basePath, mid, sliceId);
|
|
829
818
|
if (!result) continue;
|
|
830
819
|
const { verdict, uatType } = result;
|
|
@@ -879,7 +868,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
879
868
|
// H6 fix (#4973): keep the non-deep auto-mode bypass, but do not
|
|
880
869
|
// pre-verify deep planning's user-facing milestone approval gate.
|
|
881
870
|
if (shouldBypassMilestoneDepthGateInAuto(prefs)) {
|
|
882
|
-
markDepthVerified(mid, basePath);
|
|
871
|
+
hostWriteGateAdapter.markDepthVerified(mid, basePath);
|
|
883
872
|
}
|
|
884
873
|
return {
|
|
885
874
|
action: "dispatch",
|
|
@@ -1050,7 +1039,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
1050
1039
|
// H6 fix (#4973): keep the non-deep auto-mode bypass, but do not
|
|
1051
1040
|
// pre-verify deep planning's user-facing milestone approval gate.
|
|
1052
1041
|
if (shouldBypassMilestoneDepthGateInAuto(prefs)) {
|
|
1053
|
-
markDepthVerified(mid, basePath);
|
|
1042
|
+
hostWriteGateAdapter.markDepthVerified(mid, basePath);
|
|
1054
1043
|
}
|
|
1055
1044
|
return {
|
|
1056
1045
|
action: "dispatch",
|
|
@@ -1128,13 +1117,11 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
1128
1117
|
// behavior.
|
|
1129
1118
|
if (await getMilestonePipelineVariant(mid) === "trivial") return null;
|
|
1130
1119
|
|
|
1131
|
-
//
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
if (!roadmapContent) return null;
|
|
1137
|
-
const roadmap = parseRoadmap(roadmapContent);
|
|
1120
|
+
// DB-authoritative slice list (ADR-017): the ROADMAP projection is
|
|
1121
|
+
// never parsed for dispatch decisions. No DB / no rows → skip this rule.
|
|
1122
|
+
if (!isDbAvailable()) return null;
|
|
1123
|
+
const dbSlices = getMilestoneSliceSummaries(mid);
|
|
1124
|
+
if (dbSlices.length === 0) return null;
|
|
1138
1125
|
|
|
1139
1126
|
// Find slices that need research (no RESEARCH file, dependencies done)
|
|
1140
1127
|
const milestoneResearchFile =
|
|
@@ -1142,14 +1129,14 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
1142
1129
|
resolveMilestoneFile(basePath, mid, "RESEARCH");
|
|
1143
1130
|
const researchReadySlices: Array<{ id: string; title: string }> = [];
|
|
1144
1131
|
|
|
1145
|
-
for (const slice of
|
|
1132
|
+
for (const slice of dbSlices) {
|
|
1146
1133
|
if (slice.done) continue;
|
|
1147
1134
|
// Skip S01 when milestone research exists
|
|
1148
1135
|
if (milestoneResearchFile && slice.id === "S01") continue;
|
|
1149
1136
|
// Skip if already has research
|
|
1150
1137
|
if (resolveExistingExpectedArtifact("research-slice", `${mid}/${slice.id}`, basePath)) continue;
|
|
1151
1138
|
// Skip if dependencies aren't done (check for SUMMARY files)
|
|
1152
|
-
const depsComplete =
|
|
1139
|
+
const depsComplete = slice.depends.every((depId) =>
|
|
1153
1140
|
!!resolveExistingExpectedArtifact("complete-slice", `${mid}/${depId}`, basePath),
|
|
1154
1141
|
);
|
|
1155
1142
|
if (!depsComplete) continue;
|
|
@@ -18,7 +18,7 @@ import { getSessionModelOverride } from "./session-model-override.js";
|
|
|
18
18
|
import { logWarning } from "./workflow-logger.js";
|
|
19
19
|
import { resolveUokFlags } from "./uok/flags.js";
|
|
20
20
|
import { applyModelPolicyFilter } from "./uok/model-policy.js";
|
|
21
|
-
import { isModelBlocked } from "./blocked-models.js";
|
|
21
|
+
import { isModelBlocked, isModelTemporarilyUnavailable } from "./blocked-models.js";
|
|
22
22
|
import { getRequiredWorkflowToolsForAutoUnit, isWorkflowMcpSurfaceTool } from "./workflow-mcp.js";
|
|
23
23
|
|
|
24
24
|
/**
|
|
@@ -272,6 +272,15 @@ function buildModelPolicyBlockReasons(
|
|
|
272
272
|
}];
|
|
273
273
|
}
|
|
274
274
|
|
|
275
|
+
function isModelUnavailable(
|
|
276
|
+
basePath: string,
|
|
277
|
+
provider: string | undefined,
|
|
278
|
+
id: string | undefined,
|
|
279
|
+
): boolean {
|
|
280
|
+
return isModelBlocked(basePath, provider, id) ||
|
|
281
|
+
isModelTemporarilyUnavailable(basePath, provider, id);
|
|
282
|
+
}
|
|
283
|
+
|
|
275
284
|
function restoreToolBaseline(pi: ExtensionAPI): void {
|
|
276
285
|
const key = pi as unknown as object;
|
|
277
286
|
const baseline = TOOL_BASELINE.get(key);
|
|
@@ -817,9 +826,9 @@ export async function selectAndApplyModel(
|
|
|
817
826
|
// (issue #4513). The block is persisted in .gsd/runtime/blocked-models.json
|
|
818
827
|
// so it survives /gsd auto restarts — without this, the same dead model
|
|
819
828
|
// gets reselected after every restart.
|
|
820
|
-
if (
|
|
829
|
+
if (isModelUnavailable(basePath, model.provider, model.id)) {
|
|
821
830
|
ctx.ui.notify(
|
|
822
|
-
`Skipping
|
|
831
|
+
`Skipping unavailable model ${model.provider}/${model.id}.`,
|
|
823
832
|
"warning",
|
|
824
833
|
);
|
|
825
834
|
continue;
|
|
@@ -896,7 +905,7 @@ export async function selectAndApplyModel(
|
|
|
896
905
|
for (const model of buildPolicyEligibleFallbackOrder(ctx, routingEligibleModels, autoModeStartModel)) {
|
|
897
906
|
const key = `${model.provider.toLowerCase()}/${model.id.toLowerCase()}`;
|
|
898
907
|
if (!policyAllowedModelKeys.has(key)) continue;
|
|
899
|
-
if (
|
|
908
|
+
if (isModelUnavailable(basePath, model.provider, model.id)) continue;
|
|
900
909
|
const ok = await pi.setModel(model, { persist: false });
|
|
901
910
|
if (!ok) continue;
|
|
902
911
|
appliedModel = model;
|
|
@@ -926,10 +935,10 @@ export async function selectAndApplyModel(
|
|
|
926
935
|
autoModeStartModel,
|
|
927
936
|
effectiveSessionModelOverride,
|
|
928
937
|
);
|
|
929
|
-
const startBlocked =
|
|
938
|
+
const startBlocked = isModelUnavailable(basePath, autoModeStartModel.provider, autoModeStartModel.id);
|
|
930
939
|
if (startBlocked) {
|
|
931
940
|
ctx.ui.notify(
|
|
932
|
-
`Auto-mode start model ${autoModeStartModel.provider}/${autoModeStartModel.id} is
|
|
941
|
+
`Auto-mode start model ${autoModeStartModel.provider}/${autoModeStartModel.id} is unavailable. Using current session model instead.`,
|
|
933
942
|
"warning",
|
|
934
943
|
);
|
|
935
944
|
} else {
|
|
@@ -940,7 +949,7 @@ export async function selectAndApplyModel(
|
|
|
940
949
|
const ok = await pi.setModel(startModel, { persist: false });
|
|
941
950
|
if (!ok) {
|
|
942
951
|
const byId = availableModels.find(
|
|
943
|
-
m => m.id === autoModeStartModel.id && !
|
|
952
|
+
m => m.id === autoModeStartModel.id && !isModelUnavailable(basePath, m.provider, m.id),
|
|
944
953
|
);
|
|
945
954
|
if (byId) {
|
|
946
955
|
const fallbackOk = await pi.setModel(byId, { persist: false });
|
|
@@ -1041,16 +1050,36 @@ export function resolveModelId<T extends { id: string; provider: string }>(
|
|
|
1041
1050
|
if (providerMatch) return providerMatch;
|
|
1042
1051
|
}
|
|
1043
1052
|
|
|
1044
|
-
//
|
|
1045
|
-
//
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1053
|
+
// Subscription/OAuth routes beat pay-per-token API when the same model ID
|
|
1054
|
+
// exists on multiple providers. Order matters — first match wins.
|
|
1055
|
+
for (const provider of BARE_ID_SUBSCRIPTION_PROVIDER_PRECEDENCE) {
|
|
1056
|
+
const match = candidates.find(m => m.provider === provider);
|
|
1057
|
+
if (match) return match;
|
|
1058
|
+
}
|
|
1049
1059
|
|
|
1050
1060
|
// Fall back to first non-extension candidate, or any candidate
|
|
1051
1061
|
return candidates.find(m => !EXTENSION_PROVIDERS.has(m.provider)) ?? candidates[0];
|
|
1052
1062
|
}
|
|
1053
1063
|
|
|
1064
|
+
/**
|
|
1065
|
+
* When a bare model ID exists on multiple providers, prefer subscription/OAuth
|
|
1066
|
+
* routes over pay-per-token API keys. Matches PROVIDER_ROUTES in doctor-providers
|
|
1067
|
+
* but applies when *both* sides are authenticated.
|
|
1068
|
+
*
|
|
1069
|
+
* Order rationale:
|
|
1070
|
+
* - openai-codex before github-copilot: ChatGPT-native for shared GPT IDs
|
|
1071
|
+
* - google-gemini-cli before github-copilot: first-party Gemini CLI
|
|
1072
|
+
* - anthropic before github-copilot: first-party Claude API/OAuth over Copilot
|
|
1073
|
+
* - github-copilot before openai/google: Copilot OAuth over platform API keys
|
|
1074
|
+
*/
|
|
1075
|
+
export const BARE_ID_SUBSCRIPTION_PROVIDER_PRECEDENCE = [
|
|
1076
|
+
"openai-codex",
|
|
1077
|
+
"google-gemini-cli",
|
|
1078
|
+
"anthropic",
|
|
1079
|
+
"github-copilot",
|
|
1080
|
+
"google-antigravity",
|
|
1081
|
+
] as const;
|
|
1082
|
+
|
|
1054
1083
|
/**
|
|
1055
1084
|
* Flat-rate providers charge the same per request regardless of model.
|
|
1056
1085
|
* Dynamic routing provides no cost benefit — it only degrades quality (#3453).
|