@opengsd/gsd-pi 1.2.0-dev.84c56d87 → 1.2.0-dev.8e6112e9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli.js +1 -18
- package/dist/headless-events.js +7 -5
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +121 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +7 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
- package/dist/resources/extensions/gsd/auto-prompts.js +78 -19
- package/dist/resources/extensions/gsd/auto-start.js +35 -15
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
- package/dist/resources/extensions/gsd/auto.js +52 -2
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +145 -50
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- 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/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
- package/dist/resources/extensions/gsd/db/engine.js +5 -3
- package/dist/resources/extensions/gsd/db/queries.js +56 -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 +256 -125
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -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 +11 -8
- package/dist/resources/extensions/gsd/guidance.js +60 -0
- package/dist/resources/extensions/gsd/guided-flow.js +93 -4
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/memory-relations.js +1 -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/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/preferences-models.js +2 -2
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- 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 +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- 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/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state.js +11 -2
- 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 +83 -31
- 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 +65 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
- 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 +40 -15
- package/dist/resources/extensions/gsd/unit-context-composer.js +65 -0
- package/dist/resources/extensions/gsd/unit-registry.js +34 -4
- 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/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/extensions/shared/gsd-browser-cli.js +45 -3
- 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/skill-structure.md +1 -0
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
- 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 +6 -6
- 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/node_modules/postcss/lib/container.js +26 -18
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
- package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
- package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
- package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
- package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
- package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
- package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
- package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
- package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/package.json +3 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -4
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -53
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +452 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +161 -81
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +419 -221
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +460 -261
- 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/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/index.d.ts +1 -1
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +1 -1
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +63 -18
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop.ts +7 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
- package/src/resources/extensions/gsd/auto-prompts.ts +115 -35
- package/src/resources/extensions/gsd/auto-start.ts +36 -18
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
- package/src/resources/extensions/gsd/auto.ts +64 -2
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -12
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +163 -55
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- 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/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
- package/src/resources/extensions/gsd/db/engine.ts +5 -3
- package/src/resources/extensions/gsd/db/queries.ts +66 -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 +267 -142
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -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 +13 -10
- package/src/resources/extensions/gsd/guidance.ts +78 -0
- package/src/resources/extensions/gsd/guided-flow.ts +145 -24
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/memory-relations.ts +1 -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/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/preferences-models.ts +2 -1
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- 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 +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- 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/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state.ts +12 -1
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/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/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 +23 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- 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 +45 -2
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
- 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 +88 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
- 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 +126 -19
- 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 +90 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
- 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 +60 -15
- package/src/resources/extensions/gsd/unit-context-composer.ts +99 -0
- package/src/resources/extensions/gsd/unit-registry.ts +34 -4
- 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/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/extensions/shared/gsd-browser-cli.ts +54 -3
- 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/skill-structure.md +1 -0
- 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/{AOpDeK_gJHU8OZjRo31gQ → pZbHa49xI-knmKlphIRq0}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{AOpDeK_gJHU8OZjRo31gQ → pZbHa49xI-knmKlphIRq0}/_ssgManifest.js +0 -0
|
@@ -10,7 +10,7 @@ import type {
|
|
|
10
10
|
} from "./types.js";
|
|
11
11
|
import { ExecutionGraphScheduler } from "../uok/execution-graph.js";
|
|
12
12
|
import type { UokGraphNode } from "../uok/contracts.js";
|
|
13
|
-
import { runUnitPhase } from "./
|
|
13
|
+
import { runUnitPhase } from "./unit-phase.js";
|
|
14
14
|
import { decideDispatchNodeKind } from "./workflow-kernel.js";
|
|
15
15
|
|
|
16
16
|
export type DispatchContract = "legacy-direct" | "uok-scheduler";
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Worktree-safety helpers shared across auto-loop phase modules.
|
|
3
|
+
|
|
4
|
+
import { classifyProject } from "../detection.js";
|
|
5
|
+
import { resolveEffectiveUnitIsolationMode, getIsolationMode } from "../preferences.js";
|
|
6
|
+
import { createWorktreeSafetyModule, type WorktreeSafetyResult } from "../worktree-safety.js";
|
|
7
|
+
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
8
|
+
import { resolveManifest } from "../unit-context-manifest.js";
|
|
9
|
+
import { debugLog } from "../debug-logger.js";
|
|
10
|
+
import { isSamePathLocal } from "./phase-helpers.js";
|
|
11
|
+
import { hasHeldMilestoneLease, reclaimMissingMilestoneLease } from "./milestone-lease-reclaim.js";
|
|
12
|
+
import type { IterationContext } from "./types.js";
|
|
13
|
+
|
|
14
|
+
export function shouldDegradeEmptyWorktreeToProjectRoot(
|
|
15
|
+
worktreeClassification: ReturnType<typeof classifyProject>,
|
|
16
|
+
projectRootClassification: ReturnType<typeof classifyProject>,
|
|
17
|
+
): boolean {
|
|
18
|
+
return (
|
|
19
|
+
worktreeClassification.kind === "greenfield" &&
|
|
20
|
+
projectRootClassification.kind !== "greenfield" &&
|
|
21
|
+
projectRootClassification.kind !== "invalid-repo"
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function unitWritesSource(unitType: string): boolean | null {
|
|
26
|
+
if (unitType.startsWith("hook/")) return false;
|
|
27
|
+
// Backward compatibility: sidecar queues from older builds may persist
|
|
28
|
+
// prefixed unit types (e.g. "sidecar/quick-task").
|
|
29
|
+
const normalizedUnitType = unitType.startsWith("sidecar/")
|
|
30
|
+
? unitType.slice("sidecar/".length)
|
|
31
|
+
: unitType;
|
|
32
|
+
const manifest = resolveManifest(normalizedUnitType);
|
|
33
|
+
if (!manifest) return null;
|
|
34
|
+
return manifest.tools.mode === "all" || manifest.tools.mode === "docs";
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function formatWorktreeSafetyFailure(result: Extract<WorktreeSafetyResult, { ok: false }>): string {
|
|
38
|
+
return `Worktree Safety failed (${result.kind}): ${result.reason} ${result.remediation}`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function formatWorktreeSafetyStopReason(result: Extract<WorktreeSafetyResult, { ok: false }>): string {
|
|
42
|
+
if (result.kind === "empty-worktree-with-project-content") {
|
|
43
|
+
return `Worktree Safety failed (${result.kind}). Run /gsd doctor fix, then /gsd auto.`;
|
|
44
|
+
}
|
|
45
|
+
return `Worktree Safety failed (${result.kind}).`;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function resolveEmptyWorktreeWithProjectContent(
|
|
49
|
+
unitRoot: string,
|
|
50
|
+
projectRoot: string,
|
|
51
|
+
): boolean {
|
|
52
|
+
if (isSamePathLocal(unitRoot, projectRoot)) return false;
|
|
53
|
+
const worktreeClassification = classifyProject(unitRoot);
|
|
54
|
+
if (worktreeClassification.kind !== "greenfield") return false;
|
|
55
|
+
const projectRootClassification = classifyProject(projectRoot);
|
|
56
|
+
return shouldDegradeEmptyWorktreeToProjectRoot(worktreeClassification, projectRootClassification);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function validateSourceWriteWorktreeSafety(
|
|
60
|
+
ic: IterationContext,
|
|
61
|
+
unitType: string,
|
|
62
|
+
unitId: string,
|
|
63
|
+
milestoneId: string | undefined,
|
|
64
|
+
phase: string,
|
|
65
|
+
): Promise<{ action: "break"; reason: string } | null> {
|
|
66
|
+
const { ctx, pi, s, deps } = ic;
|
|
67
|
+
if (!s.basePath) return null;
|
|
68
|
+
|
|
69
|
+
// Custom engine workflows (graph-driven, registered via run dirs) define
|
|
70
|
+
// their own step ids that are not in the GSD UnitContextManifest. Don't
|
|
71
|
+
// fail closed for those — the custom engine owns its own dispatch
|
|
72
|
+
// contract. The fail-closed safety check applies only to built-in GSD
|
|
73
|
+
// units whose Tool Contract is registered in the manifest. Use a truthy
|
|
74
|
+
// check so undefined (test sessions that never set the field) routes
|
|
75
|
+
// through the safety check, matching the regression test contract.
|
|
76
|
+
if (s.activeEngineId) return null;
|
|
77
|
+
|
|
78
|
+
const writesSource = unitWritesSource(unitType);
|
|
79
|
+
if (writesSource === null) {
|
|
80
|
+
const msg = `Worktree Safety failed (missing-tool-contract): missing Tool Contract for ${unitType}. Add a UnitContextManifest entry before dispatching this Unit.`;
|
|
81
|
+
debugLog("worktreeSafety", {
|
|
82
|
+
phase,
|
|
83
|
+
unitType,
|
|
84
|
+
unitId,
|
|
85
|
+
milestoneId,
|
|
86
|
+
result: { ok: false, kind: "missing-tool-contract", reason: msg },
|
|
87
|
+
basePath: s.basePath,
|
|
88
|
+
});
|
|
89
|
+
ctx.ui.notify(msg, "error");
|
|
90
|
+
await deps.stopAuto(ctx, pi, msg);
|
|
91
|
+
return { action: "break", reason: "missing-tool-contract" };
|
|
92
|
+
}
|
|
93
|
+
if (!writesSource) return null;
|
|
94
|
+
|
|
95
|
+
const projectRoot = s.canonicalProjectRoot ?? resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
|
|
96
|
+
// A degraded session already fell back to the milestone branch in the
|
|
97
|
+
// project root — validating against the canonical worktree root there
|
|
98
|
+
// would fail every dispatch with a false invalid-root. The same applies
|
|
99
|
+
// to a stranded-recovery session that adopted the milestone branch.
|
|
100
|
+
const isolationMode = resolveEffectiveUnitIsolationMode(
|
|
101
|
+
deps.getIsolationMode(projectRoot),
|
|
102
|
+
s.isolationDegraded,
|
|
103
|
+
s.strandedRecoveryIsolationMode,
|
|
104
|
+
);
|
|
105
|
+
reclaimMissingMilestoneLease(s, milestoneId, isolationMode, phase);
|
|
106
|
+
const safety = createWorktreeSafetyModule();
|
|
107
|
+
const result = safety.validateUnitRoot({
|
|
108
|
+
unitType,
|
|
109
|
+
unitId,
|
|
110
|
+
writeScope: "source-writing",
|
|
111
|
+
projectRoot,
|
|
112
|
+
unitRoot: s.basePath,
|
|
113
|
+
milestoneId,
|
|
114
|
+
isolationMode,
|
|
115
|
+
expectedBranch:
|
|
116
|
+
isolationMode !== "none" && milestoneId ? deps.autoWorktreeBranch(milestoneId) : null,
|
|
117
|
+
emptyWorktreeWithProjectContent: resolveEmptyWorktreeWithProjectContent(s.basePath, projectRoot),
|
|
118
|
+
// The milestone lease coordinates concurrent workers on an isolated
|
|
119
|
+
// milestone worktree/branch, which is established by enterMilestone in
|
|
120
|
+
// worktree/branch modes. `none` mode has no per-milestone isolation and
|
|
121
|
+
// does not reliably claim a lease (e.g. a fresh headless resume of an
|
|
122
|
+
// already-active milestone never re-enters it), so requiring a held lease
|
|
123
|
+
// there would falsely fail dispatch. Enforce the lease only in isolated
|
|
124
|
+
// modes; none-mode safety still validates the unit root.
|
|
125
|
+
lease: s.workerId
|
|
126
|
+
? {
|
|
127
|
+
required: isolationMode !== "none",
|
|
128
|
+
held: hasHeldMilestoneLease(s, milestoneId),
|
|
129
|
+
owner: s.workerId,
|
|
130
|
+
}
|
|
131
|
+
: undefined,
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
if (result.ok) return null;
|
|
135
|
+
|
|
136
|
+
const msg = formatWorktreeSafetyFailure(result);
|
|
137
|
+
debugLog("worktreeSafety", {
|
|
138
|
+
phase,
|
|
139
|
+
unitType,
|
|
140
|
+
unitId,
|
|
141
|
+
milestoneId,
|
|
142
|
+
result,
|
|
143
|
+
basePath: s.basePath,
|
|
144
|
+
projectRoot,
|
|
145
|
+
});
|
|
146
|
+
ctx.ui.notify(msg, "error");
|
|
147
|
+
await deps.stopAuto(ctx, pi, formatWorktreeSafetyStopReason(result));
|
|
148
|
+
return { action: "break", reason: result.kind };
|
|
149
|
+
}
|
|
@@ -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).
|