@opengsd/gsd-pi 1.1.1-dev.b2556262 → 1.2.0-dev.4813ead6
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-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/help-text.js +5 -0
- package/dist/project-sessions.js +4 -2
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +78 -23
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +101 -237
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
- package/dist/resources/extensions/github-sync/templates.js +3 -3
- package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
- package/dist/resources/extensions/gsd/auto/contracts.js +8 -1
- package/dist/resources/extensions/gsd/auto/loop.js +74 -56
- package/dist/resources/extensions/gsd/auto/orchestrator.js +763 -63
- package/dist/resources/extensions/gsd/auto/phases.js +28 -3
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
- package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
- package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
- package/dist/resources/extensions/gsd/auto-prompts.js +191 -9
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -0
- package/dist/resources/extensions/gsd/auto-start.js +12 -23
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +37 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +33 -29
- package/dist/resources/extensions/gsd/auto-verification.js +7 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +45 -36
- package/dist/resources/extensions/gsd/auto.js +73 -471
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +11 -37
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +103 -138
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +63 -4
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
- package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
- package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
- package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
- package/dist/resources/extensions/gsd/commands-ship.js +2 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
- package/dist/resources/extensions/gsd/db-workspace.js +103 -0
- package/dist/resources/extensions/gsd/debug-logger.js +10 -0
- package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
- package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/dist/resources/extensions/gsd/doctor-proactive.js +7 -2
- package/dist/resources/extensions/gsd/doctor.js +16 -9
- package/dist/resources/extensions/gsd/error-classifier.js +1 -1
- package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
- package/dist/resources/extensions/gsd/gsd-db.js +12 -0
- package/dist/resources/extensions/gsd/guided-flow.js +36 -470
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +33 -33
- package/dist/resources/extensions/gsd/mcp-filter.js +8 -1
- package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/migrate/safety.js +2 -2
- package/dist/resources/extensions/gsd/migration-auto-check.js +3 -2
- package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
- package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
- package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
- package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
- package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +45 -0
- package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences.js +147 -29
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/discuss.md +6 -7
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +2 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
- package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
- package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
- package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
- package/dist/resources/extensions/gsd/question-transport.js +86 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
- package/dist/resources/extensions/gsd/schemas/parsers.js +6 -1
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +21 -1
- package/dist/resources/extensions/gsd/state.js +13 -5
- package/dist/resources/extensions/gsd/templates/plan.md +7 -0
- package/dist/resources/extensions/gsd/templates/project.md +1 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/dist/resources/extensions/gsd/templates/uat.md +5 -1
- package/dist/resources/extensions/gsd/tool-contract.js +52 -8
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
- package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +169 -20
- package/dist/resources/extensions/gsd/uat-policy.js +16 -10
- package/dist/resources/extensions/gsd/uat-run.js +9 -14
- package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
- package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
- package/dist/resources/extensions/gsd/user-input-boundary.js +65 -4
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
- package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
- package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
- package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
- package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
- package/dist/resources/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -0
- package/dist/update-cmd.js +20 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
- package/dist/web/standalone/.next/server/chunks/5047.js +2 -0
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -0
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
- package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
- package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
- package/dist/web/standalone/node_modules/@gsd/native/package.json +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/dist/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/package.json +17 -11
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
- 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.js +1 -1
- 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 +106 -40
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/server.d.ts +10 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +8 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +2 -1
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +30 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/image-models.generated.js +30 -0
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +8 -127
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +47 -166
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +11 -3
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/keys.d.ts.map +1 -1
- package/packages/pi-tui/dist/keys.js +39 -30
- package/packages/pi-tui/dist/keys.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +22 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/scripts/install/deps.js +10 -0
- package/scripts/link-workspace-packages.cjs +7 -40
- package/src/resources/extensions/ask-user-questions.ts +87 -24
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +126 -289
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +242 -2
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
- package/src/resources/extensions/github-sync/templates.ts +3 -3
- package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
- package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +40 -121
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
- package/src/resources/extensions/gsd/auto/loop.ts +83 -61
- package/src/resources/extensions/gsd/auto/orchestrator.ts +913 -64
- package/src/resources/extensions/gsd/auto/phases.ts +35 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
- package/src/resources/extensions/gsd/auto/session.ts +4 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -3
- package/src/resources/extensions/gsd/auto-prompts.ts +220 -9
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +30 -0
- package/src/resources/extensions/gsd/auto-start.ts +17 -20
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +40 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +42 -30
- package/src/resources/extensions/gsd/auto-verification.ts +7 -8
- package/src/resources/extensions/gsd/auto-worktree.ts +57 -42
- package/src/resources/extensions/gsd/auto.ts +96 -508
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +10 -37
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +120 -151
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +107 -3
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
- package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
- package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
- package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
- package/src/resources/extensions/gsd/commands-ship.ts +2 -2
- package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
- package/src/resources/extensions/gsd/db-workspace.ts +170 -0
- package/src/resources/extensions/gsd/debug-logger.ts +11 -0
- package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
- package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/src/resources/extensions/gsd/doctor-proactive.ts +8 -2
- package/src/resources/extensions/gsd/doctor.ts +15 -5
- package/src/resources/extensions/gsd/error-classifier.ts +1 -1
- package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
- package/src/resources/extensions/gsd/gsd-db.ts +12 -0
- package/src/resources/extensions/gsd/guided-flow.ts +49 -560
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +40 -20
- package/src/resources/extensions/gsd/mcp-filter.ts +9 -1
- package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/migrate/safety.ts +2 -2
- package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
- package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
- package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
- package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
- package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
- package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +48 -0
- package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +173 -28
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/discuss.md +6 -7
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/research-milestone.md +2 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
- package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
- package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
- package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
- package/src/resources/extensions/gsd/question-transport.ts +138 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
- package/src/resources/extensions/gsd/schemas/parsers.ts +6 -1
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +31 -10
- package/src/resources/extensions/gsd/state.ts +15 -5
- package/src/resources/extensions/gsd/templates/plan.md +7 -0
- package/src/resources/extensions/gsd/templates/project.md +1 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/src/resources/extensions/gsd/templates/uat.md +5 -1
- package/src/resources/extensions/gsd/tests/artifact-db-drift-memo.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-dispatch-baseline-harness.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +321 -5
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +709 -845
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +38 -10
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/debug-logger.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/native-merge-regular.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/parse-project-milestone-bridge.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +75 -2
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +101 -1
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +21 -6
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +15 -3
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +79 -0
- package/src/resources/extensions/gsd/tool-contract.ts +86 -8
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
- package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +183 -21
- package/src/resources/extensions/gsd/uat-policy.ts +19 -10
- package/src/resources/extensions/gsd/uat-run.ts +10 -14
- package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
- package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
- package/src/resources/extensions/gsd/user-input-boundary.ts +55 -5
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
- package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
- package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +7 -16
- package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
- package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
- package/src/resources/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- package/dist/web/standalone/.next/server/chunks/678.js +0 -2
- package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
- package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
- package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +0 -21
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +0 -213
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts +0 -28
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js +0 -249
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts +0 -19
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js +0 -797
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js.map +0 -1
- package/scripts/ensure-workspace-builds.cjs +0 -129
- /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_ssgManifest.js +0 -0
|
@@ -13,21 +13,25 @@ import type { GSDEcosystemBeforeAgentStartHandler } from "../ecosystem/gsd-exten
|
|
|
13
13
|
import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
|
|
14
14
|
|
|
15
15
|
import { buildMilestoneFileName, clearPathCache, milestonesDir, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
|
|
16
|
-
import { canonicalToolName, clearDiscussionFlowState,
|
|
16
|
+
import { applyAskUserQuestionsGateResult, canonicalToolName, clearDiscussionFlowState, formatPendingAskUserQuestionsGateMessage, isMilestoneDepthVerified, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
17
17
|
import { resolveManifest } from "../unit-context-manifest.js";
|
|
18
18
|
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
19
19
|
import { loadFile, saveFile, formatContinue } from "../files.js";
|
|
20
20
|
import {
|
|
21
|
+
clearAutoCompletionStopInProgress,
|
|
21
22
|
clearToolInvocationError,
|
|
22
23
|
getAutoRuntimeSnapshot,
|
|
23
24
|
getSourceObservationStore,
|
|
24
25
|
isAutoActive,
|
|
25
26
|
isAutoCompletionStopInProgress,
|
|
26
27
|
isAutoPaused,
|
|
28
|
+
isInteractiveElicitationInFlight,
|
|
27
29
|
markToolEnd,
|
|
28
30
|
markToolStart,
|
|
31
|
+
recordAutoToolSurfaceSnapshot,
|
|
29
32
|
recordToolInvocationError,
|
|
30
33
|
} from "../auto-runtime-state.js";
|
|
34
|
+
import { applyProviderPayloadPolicy } from "../provider-payload-policy.js";
|
|
31
35
|
|
|
32
36
|
import { checkToolCallLoop, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
|
|
33
37
|
import { maybePauseAutoForApprovalGate, resetPendingGatePauseGuard } from "./pending-gate-pause.js";
|
|
@@ -39,17 +43,24 @@ import { logWarning as safetyLogWarning } from "../workflow-logger.js";
|
|
|
39
43
|
import { installNotifyInterceptor } from "./notify-interceptor.js";
|
|
40
44
|
import { initNotificationStore } from "../notification-store.js";
|
|
41
45
|
import { initNotificationWidget } from "../notification-widget.js";
|
|
46
|
+
import { notifyPreferenceDiagnostics } from "../preferences-diagnostics.js";
|
|
42
47
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
43
48
|
import { extractSubagentAgentClasses } from "./subagent-input.js";
|
|
44
|
-
import {
|
|
49
|
+
import {
|
|
50
|
+
approvalGateIdForUnit,
|
|
51
|
+
isExplicitApprovalResponse,
|
|
52
|
+
messageHasPendingAskUserQuestionsTool,
|
|
53
|
+
shouldPauseForUserApprovalQuestion,
|
|
54
|
+
} from "../user-input-boundary.js";
|
|
45
55
|
import { resolveSkillManifest } from "../skill-manifest.js";
|
|
46
56
|
import { applyUnitSkillVisibility, unitHasSkillManifest } from "../skill-scope.js";
|
|
47
57
|
import { getGuidedUnitContext } from "../guided-unit-context.js";
|
|
48
58
|
import { registerPlanMilestoneSchemaRecovery } from "./plan-milestone-schema-recovery.js";
|
|
49
|
-
import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
|
|
59
|
+
import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, canonicalWorkflowToolName, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
|
|
50
60
|
import { filterToolsForProvider } from "../model-router.js";
|
|
61
|
+
import { mcpToolMatchesBaseName } from "../mcp-tool-name.js";
|
|
51
62
|
import { RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES } from "../tool-presentation-plan.js";
|
|
52
|
-
import {
|
|
63
|
+
import { supportsSourceObservationsForUnit } from "../source-observations.js";
|
|
53
64
|
|
|
54
65
|
let approvalQuestionAbortInFlight = false;
|
|
55
66
|
|
|
@@ -138,7 +149,9 @@ export const MINIMAL_GSD_TOOL_NAMES = [
|
|
|
138
149
|
"gsd_checkpoint_db",
|
|
139
150
|
"gsd_plan_milestone",
|
|
140
151
|
"memory_query",
|
|
152
|
+
"gsd_memory_query",
|
|
141
153
|
"capture_thought",
|
|
154
|
+
"gsd_capture_thought",
|
|
142
155
|
] as const;
|
|
143
156
|
|
|
144
157
|
export const MINIMAL_AUTO_BASE_TOOL_NAMES = [
|
|
@@ -207,16 +220,22 @@ function resolveScopedToolNames(
|
|
|
207
220
|
|
|
208
221
|
for (const requested of requestedToolNames) {
|
|
209
222
|
const scopedMatches: string[] = [];
|
|
223
|
+
const aliasFallbacks: string[] = [];
|
|
210
224
|
|
|
211
225
|
for (const activeName of activeToolNames) {
|
|
212
|
-
if (
|
|
213
|
-
const toolSeparator = activeName.indexOf("__", "mcp__".length);
|
|
214
|
-
if (toolSeparator < 0) continue;
|
|
215
|
-
if (activeName.slice(toolSeparator + 2) === requested) {
|
|
226
|
+
if (mcpToolMatchesBaseName(activeName, requested)) {
|
|
216
227
|
scopedMatches.push(activeName);
|
|
228
|
+
} else if (isWorkflowAliasTool(activeName) && canonicalWorkflowToolName(activeName) === requested) {
|
|
229
|
+
aliasFallbacks.push(activeName);
|
|
217
230
|
}
|
|
218
231
|
}
|
|
219
232
|
|
|
233
|
+
// Only use alias as fallback when canonical is absent — not directly and not via MCP scoping.
|
|
234
|
+
// Prevents the alias from resurfacing alongside the canonical when both are in the active set.
|
|
235
|
+
if (!exact.has(requested) && scopedMatches.length === 0) {
|
|
236
|
+
scopedMatches.push(...aliasFallbacks);
|
|
237
|
+
}
|
|
238
|
+
|
|
220
239
|
if (requested.startsWith("browser_") && scopedMatches.length > 0) {
|
|
221
240
|
for (const match of scopedMatches) resolved.add(match);
|
|
222
241
|
continue;
|
|
@@ -273,7 +292,7 @@ export function buildRunUatGsdToolSet(
|
|
|
273
292
|
const resolved = [...new Set(scoped)];
|
|
274
293
|
|
|
275
294
|
const unresolved = RUN_UAT_WORKFLOW_TOOL_NAMES.filter(
|
|
276
|
-
(tool) => !resolved.some((name) => name === tool || (name
|
|
295
|
+
(tool) => !resolved.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)),
|
|
277
296
|
);
|
|
278
297
|
if (unresolved.length > 0) {
|
|
279
298
|
safetyLogWarning(
|
|
@@ -365,11 +384,21 @@ function applyMinimalGsdToolSurface(pi: ExtensionAPI): void {
|
|
|
365
384
|
if (isFullGsdToolSurfaceRequested()) return;
|
|
366
385
|
const dash = getAutoRuntimeSnapshot();
|
|
367
386
|
if (dash.active && dash.currentUnit) {
|
|
368
|
-
pi.
|
|
369
|
-
|
|
387
|
+
const currentToolNames = pi.getActiveTools();
|
|
388
|
+
const registeredToolNames = resolveRegisteredToolNames(pi, currentToolNames);
|
|
389
|
+
const scopedToolNames = buildMinimalAutoGsdToolSet(
|
|
390
|
+
currentToolNames,
|
|
370
391
|
dash.currentUnit.type,
|
|
371
|
-
|
|
372
|
-
)
|
|
392
|
+
registeredToolNames,
|
|
393
|
+
);
|
|
394
|
+
recordAutoToolSurfaceSnapshot({
|
|
395
|
+
source: "runtime-scope",
|
|
396
|
+
unitType: dash.currentUnit.type,
|
|
397
|
+
modelFacingToolNames: scopedToolNames,
|
|
398
|
+
registeredToolNames,
|
|
399
|
+
scopedToolNames,
|
|
400
|
+
});
|
|
401
|
+
pi.setActiveTools(scopedToolNames);
|
|
373
402
|
return;
|
|
374
403
|
}
|
|
375
404
|
if (!isGeneralGsdToolScopingRequested()) return;
|
|
@@ -386,6 +415,13 @@ export function scopeGsdWorkflowToolsForDispatch(
|
|
|
386
415
|
const scoped = unitType
|
|
387
416
|
? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames)
|
|
388
417
|
: buildMinimalGsdWorkflowToolSet(current, registeredToolNames);
|
|
418
|
+
recordAutoToolSurfaceSnapshot({
|
|
419
|
+
source: "dispatch-scope",
|
|
420
|
+
unitType,
|
|
421
|
+
modelFacingToolNames: scoped,
|
|
422
|
+
registeredToolNames,
|
|
423
|
+
scopedToolNames: scoped,
|
|
424
|
+
});
|
|
389
425
|
const toolsChanged = !(scoped.length === current.length && scoped.every((name, index) => name === current[index]));
|
|
390
426
|
const canScopeSkills = unitHasSkillManifest(unitType) && pi.getVisibleSkills && pi.setVisibleSkills;
|
|
391
427
|
if (!toolsChanged && !canScopeSkills) {
|
|
@@ -694,6 +730,7 @@ function initSessionNotifications(ctx: ExtensionContext): void {
|
|
|
694
730
|
initNotificationStore(resolveNotificationStoreBasePath(contextBasePath(ctx)));
|
|
695
731
|
installNotifyInterceptor(ctx);
|
|
696
732
|
initNotificationWidget(ctx);
|
|
733
|
+
notifyPreferenceDiagnostics(ctx, contextBasePath(ctx), { surface: "session-start" });
|
|
697
734
|
}
|
|
698
735
|
|
|
699
736
|
async function prepareWorkflowMcpForHookContext(
|
|
@@ -790,6 +827,7 @@ export function registerHooks(
|
|
|
790
827
|
});
|
|
791
828
|
|
|
792
829
|
pi.on("before_agent_start", async (event, ctx: ExtensionContext) => {
|
|
830
|
+
clearAutoCompletionStopInProgress();
|
|
793
831
|
resetPendingGatePauseGuard();
|
|
794
832
|
applyMinimalGsdToolSurface(pi);
|
|
795
833
|
|
|
@@ -990,6 +1028,18 @@ export function registerHooks(
|
|
|
990
1028
|
|
|
991
1029
|
pi.on("message_update", async (event, ctx: ExtensionContext) => {
|
|
992
1030
|
if (approvalQuestionAbortInFlight) return;
|
|
1031
|
+
// If the model asked via ask_user_questions, that in-flight elicitation IS
|
|
1032
|
+
// the human boundary. Arming the pause/gate here (and emitting the "waiting
|
|
1033
|
+
// for your approval - pausing" notice) would tear it down and trigger the
|
|
1034
|
+
// foreground self-cancel/re-ask loop. The marker is set only by the
|
|
1035
|
+
// claude-code-cli SDK elicitation handler and is ungated, so it is true in
|
|
1036
|
+
// foreground; under the native-TUI provider it is always false and this path
|
|
1037
|
+
// runs unchanged (#cc-elicitation-self-cancel).
|
|
1038
|
+
if (isInteractiveElicitationInFlight()) return;
|
|
1039
|
+
// Prose with "?" can stream before the MCP tool/elicitation starts. When the
|
|
1040
|
+
// structured ask_user_questions call is already in the partial message, the
|
|
1041
|
+
// tool IS the human boundary — do not arm the text-based approval pause.
|
|
1042
|
+
if (messageHasPendingAskUserQuestionsTool(event.message)) return;
|
|
993
1043
|
|
|
994
1044
|
const dash = getAutoRuntimeSnapshot();
|
|
995
1045
|
if (dash.active) return;
|
|
@@ -1324,81 +1374,37 @@ export function registerHooks(
|
|
|
1324
1374
|
|
|
1325
1375
|
const details = event.details as any;
|
|
1326
1376
|
|
|
1327
|
-
// ── Discussion gate enforcement: handle gate question responses ──
|
|
1328
|
-
// If the result is cancelled or has no response, the pending gate stays active
|
|
1329
|
-
// so the model is blocked from non-read-only tools until it re-asks.
|
|
1330
|
-
// If the user responded at all (even "needs adjustment"), clear the pending gate
|
|
1331
|
-
// because the user engaged — the prompt handles the re-ask-after-adjustment flow.
|
|
1332
1377
|
const questions: any[] = (event.input as any)?.questions ?? [];
|
|
1333
|
-
const
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
? "Depth confirmation was interrupted — pausing auto-mode until you respond."
|
|
1351
|
-
: "Depth confirmation is waiting for your answer — pausing auto-mode.",
|
|
1352
|
-
);
|
|
1353
|
-
}
|
|
1354
|
-
return {
|
|
1355
|
-
content: [{
|
|
1356
|
-
type: "text" as const,
|
|
1357
|
-
text: [
|
|
1358
|
-
`Waiting for depth confirmation on gate "${currentPendingGate}".`,
|
|
1359
|
-
interrupted
|
|
1360
|
-
? "The confirmation question was interrupted before a response was recorded."
|
|
1361
|
-
: "No user response was received for the confirmation question.",
|
|
1362
|
-
"Do not infer approval from earlier or prior messages.",
|
|
1363
|
-
"Do not proceed, write files, save artifacts, or call other tools.",
|
|
1364
|
-
`Re-call ask_user_questions with the same gate question id ("${currentPendingGate}") and wait for the user's response.`,
|
|
1365
|
-
].join(" "),
|
|
1366
|
-
}],
|
|
1367
|
-
};
|
|
1368
|
-
} else {
|
|
1369
|
-
const pendingQuestion = questions.find((question) => question?.id === currentPendingGate);
|
|
1370
|
-
if (pendingQuestion) {
|
|
1371
|
-
const answer = details.response?.answers?.[currentPendingGate];
|
|
1372
|
-
if (isDepthConfirmationAnswer(answer?.selected, pendingQuestion.options)) {
|
|
1373
|
-
markApprovalGateVerified(currentPendingGate, basePath);
|
|
1374
|
-
const milestoneIdFromGate = extractDepthVerificationMilestoneId(currentPendingGate);
|
|
1375
|
-
if (milestoneIdFromGate) markDepthVerified(milestoneIdFromGate, basePath);
|
|
1376
|
-
clearPendingGate(basePath);
|
|
1377
|
-
clearDeferredApprovalGate(basePath);
|
|
1378
|
-
}
|
|
1379
|
-
}
|
|
1378
|
+
const gateResult = applyAskUserQuestionsGateResult({
|
|
1379
|
+
basePath,
|
|
1380
|
+
questions,
|
|
1381
|
+
details,
|
|
1382
|
+
fallbackMilestoneId: milestoneId,
|
|
1383
|
+
});
|
|
1384
|
+
if (gateResult.status === "waiting") {
|
|
1385
|
+
resetToolCallLoopGuard();
|
|
1386
|
+
if (ctx) {
|
|
1387
|
+
await maybePauseAutoForApprovalGate(
|
|
1388
|
+
ctx,
|
|
1389
|
+
pi,
|
|
1390
|
+
true,
|
|
1391
|
+
gateResult.interrupted
|
|
1392
|
+
? "Depth confirmation was interrupted — pausing auto-mode until you respond."
|
|
1393
|
+
: "Depth confirmation is waiting for your answer — pausing auto-mode.",
|
|
1394
|
+
);
|
|
1380
1395
|
}
|
|
1396
|
+
return {
|
|
1397
|
+
content: [{
|
|
1398
|
+
type: "text" as const,
|
|
1399
|
+
text: formatPendingAskUserQuestionsGateMessage(gateResult.pendingGateId, gateResult.interrupted),
|
|
1400
|
+
}],
|
|
1401
|
+
};
|
|
1381
1402
|
}
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
for (const question of questions) {
|
|
1386
|
-
if (typeof question.id === "string" && question.id.includes("depth_verification")) {
|
|
1387
|
-
// Only unlock the gate if the user selected the first option (confirmation).
|
|
1388
|
-
// Cross-references against the question's defined options to reject free-form "Other" text.
|
|
1389
|
-
const answer = details.response?.answers?.[question.id];
|
|
1390
|
-
const inferredMilestoneId = extractDepthVerificationMilestoneId(question.id) ?? milestoneId;
|
|
1391
|
-
if (isDepthConfirmationAnswer(answer?.selected, question.options)) {
|
|
1392
|
-
if (currentPendingGate && question.id !== currentPendingGate) break;
|
|
1393
|
-
markApprovalGateVerified(question.id, basePath);
|
|
1394
|
-
markDepthVerified(inferredMilestoneId, basePath);
|
|
1395
|
-
clearPendingGate(basePath);
|
|
1396
|
-
clearDeferredApprovalGate(basePath);
|
|
1397
|
-
}
|
|
1398
|
-
break;
|
|
1399
|
-
}
|
|
1403
|
+
if (gateResult.status === "verified") {
|
|
1404
|
+
clearDeferredApprovalGate(basePath);
|
|
1400
1405
|
}
|
|
1401
1406
|
|
|
1407
|
+
if (details?.cancelled || !details?.response) return;
|
|
1402
1408
|
if (!milestoneId) return;
|
|
1403
1409
|
await saveDiscussionQuestionRound(basePath, milestoneId, questions, details);
|
|
1404
1410
|
});
|
|
@@ -1454,66 +1460,10 @@ export function registerHooks(
|
|
|
1454
1460
|
const payload = event.payload as Record<string, unknown> | null;
|
|
1455
1461
|
if (!payload || typeof payload !== "object") return;
|
|
1456
1462
|
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
const {
|
|
1462
|
-
createObservationMask,
|
|
1463
|
-
createResponsesInputObservationMask,
|
|
1464
|
-
truncateContextResultMessages,
|
|
1465
|
-
truncateResponsesInputResultItems,
|
|
1466
|
-
} = await import("../context-masker.js");
|
|
1467
|
-
const prefs = loadEffectiveGSDPreferences();
|
|
1468
|
-
const cmConfig = prefs?.preferences.context_management;
|
|
1469
|
-
|
|
1470
|
-
// Observation masking: replace old tool results with placeholders.
|
|
1471
|
-
// Only active during auto-mode when context_management.observation_masking is enabled.
|
|
1472
|
-
if (isAutoActive() && cmConfig?.observation_masking !== false) {
|
|
1473
|
-
const keepTurns = cmConfig?.observation_mask_turns ?? 8;
|
|
1474
|
-
const messages = payload.messages;
|
|
1475
|
-
if (Array.isArray(messages)) {
|
|
1476
|
-
payload.messages = createObservationMask(keepTurns)(messages);
|
|
1477
|
-
}
|
|
1478
|
-
const input = payload.input;
|
|
1479
|
-
if (Array.isArray(input)) {
|
|
1480
|
-
payload.input = createResponsesInputObservationMask(keepTurns)(input);
|
|
1481
|
-
}
|
|
1482
|
-
}
|
|
1483
|
-
|
|
1484
|
-
// Tool result truncation: cap individual tool result content length.
|
|
1485
|
-
// Applies in ALL modes (auto + interactive) to prevent context bloat.
|
|
1486
|
-
// In pi-ai format, toolResult messages have role: "toolResult" and content: TextContent[].
|
|
1487
|
-
// Creates new objects to avoid mutating shared conversation state.
|
|
1488
|
-
const maxChars = cmConfig?.tool_result_max_chars ?? 800;
|
|
1489
|
-
const msgs = payload.messages;
|
|
1490
|
-
if (Array.isArray(msgs)) {
|
|
1491
|
-
payload.messages = truncateContextResultMessages(msgs as any, maxChars);
|
|
1492
|
-
}
|
|
1493
|
-
const input = payload.input;
|
|
1494
|
-
if (Array.isArray(input)) {
|
|
1495
|
-
payload.input = truncateResponsesInputResultItems(input as any, maxChars);
|
|
1496
|
-
}
|
|
1497
|
-
} catch { /* non-fatal */ }
|
|
1498
|
-
|
|
1499
|
-
try {
|
|
1500
|
-
if (isAutoActive()) {
|
|
1501
|
-
const sourceContextBlock = getSourceObservationStore().renderActiveBlock();
|
|
1502
|
-
if (sourceContextBlock) {
|
|
1503
|
-
const nextPayload = injectSourceContextBlockIntoPayload(payload, sourceContextBlock);
|
|
1504
|
-
Object.assign(payload, nextPayload);
|
|
1505
|
-
}
|
|
1506
|
-
}
|
|
1507
|
-
} catch { /* non-fatal */ }
|
|
1508
|
-
|
|
1509
|
-
// ── Service Tier ────────────────────────────────────────────────────
|
|
1510
|
-
const modelId = event.model?.id;
|
|
1511
|
-
if (!modelId) return payload;
|
|
1512
|
-
const { getEffectiveServiceTier, supportsServiceTier } = await import("../service-tier.js");
|
|
1513
|
-
const tier = getEffectiveServiceTier();
|
|
1514
|
-
if (!tier || !supportsServiceTier(modelId)) return payload;
|
|
1515
|
-
payload.service_tier = tier;
|
|
1516
|
-
return payload;
|
|
1463
|
+
return applyProviderPayloadPolicy({
|
|
1464
|
+
payload,
|
|
1465
|
+
modelId: event.model?.id,
|
|
1466
|
+
});
|
|
1517
1467
|
});
|
|
1518
1468
|
|
|
1519
1469
|
// Capability-aware model routing hook (ADR-004)
|
|
@@ -1555,25 +1505,44 @@ export function registerHooks(
|
|
|
1555
1505
|
event.selectedModelProvider,
|
|
1556
1506
|
).compatible.filter((name) => !(dropAliases && isWorkflowAliasTool(name)));
|
|
1557
1507
|
const guidedUnit = getGuidedUnitContext();
|
|
1508
|
+
const requestRegisteredToolNames = guidedUnit?.unitType === "run-uat"
|
|
1509
|
+
? compatibleRegisteredToolNames
|
|
1510
|
+
: registeredToolNames;
|
|
1558
1511
|
const requestScoped = buildRequestScopedGsdToolSet(
|
|
1559
1512
|
guidedUnit?.unitType === "run-uat" ? aliasFilteredCompatible : providerCompatible,
|
|
1560
1513
|
event.requestCustomMessages,
|
|
1561
|
-
|
|
1514
|
+
requestRegisteredToolNames,
|
|
1562
1515
|
guidedUnit?.unitType,
|
|
1563
1516
|
);
|
|
1564
1517
|
if (requestScoped) {
|
|
1518
|
+
recordAutoToolSurfaceSnapshot({
|
|
1519
|
+
source: "provider-adjustment",
|
|
1520
|
+
unitType: guidedUnit?.unitType,
|
|
1521
|
+
modelFacingToolNames: requestScoped,
|
|
1522
|
+
registeredToolNames: requestRegisteredToolNames,
|
|
1523
|
+
scopedToolNames: requestScoped,
|
|
1524
|
+
});
|
|
1565
1525
|
return { toolNames: requestScoped };
|
|
1566
1526
|
}
|
|
1567
1527
|
const dash = getAutoRuntimeSnapshot();
|
|
1568
1528
|
if (dash.active && dash.currentUnit) {
|
|
1529
|
+
const registeredForUnit = dash.currentUnit.type === "run-uat"
|
|
1530
|
+
? compatibleRegisteredToolNames
|
|
1531
|
+
: resolveRegisteredToolNames(pi, event.activeToolNames);
|
|
1532
|
+
const scopedToolNames = buildMinimalAutoGsdToolSet(
|
|
1533
|
+
dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible,
|
|
1534
|
+
dash.currentUnit.type,
|
|
1535
|
+
registeredForUnit,
|
|
1536
|
+
);
|
|
1537
|
+
recordAutoToolSurfaceSnapshot({
|
|
1538
|
+
source: "provider-adjustment",
|
|
1539
|
+
unitType: dash.currentUnit.type,
|
|
1540
|
+
modelFacingToolNames: scopedToolNames,
|
|
1541
|
+
registeredToolNames: registeredForUnit,
|
|
1542
|
+
scopedToolNames,
|
|
1543
|
+
});
|
|
1569
1544
|
return {
|
|
1570
|
-
toolNames:
|
|
1571
|
-
dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible,
|
|
1572
|
-
dash.currentUnit.type,
|
|
1573
|
-
dash.currentUnit.type === "run-uat"
|
|
1574
|
-
? compatibleRegisteredToolNames
|
|
1575
|
-
: resolveRegisteredToolNames(pi, event.activeToolNames),
|
|
1576
|
-
),
|
|
1545
|
+
toolNames: scopedToolNames,
|
|
1577
1546
|
};
|
|
1578
1547
|
}
|
|
1579
1548
|
if (isGeneralGsdToolScopingRequested()) {
|
|
@@ -5,6 +5,7 @@ import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
|
5
5
|
import { minimatch } from "minimatch";
|
|
6
6
|
|
|
7
7
|
import { GSD_PHASE_SCOPE_DISPLAY_REASON, shouldBlockAutoUnitToolCall } from "../auto-unit-tool-scope.js";
|
|
8
|
+
import { stripMcpToolPrefix } from "../mcp-tool-name.js";
|
|
8
9
|
import { getIsolationMode } from "../preferences.js";
|
|
9
10
|
import { compileSubagentPermissionContract, type ToolsPolicy } from "../unit-context-manifest.js";
|
|
10
11
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -123,9 +124,7 @@ const GATE_SAFE_TOOLS = new Set([
|
|
|
123
124
|
]);
|
|
124
125
|
|
|
125
126
|
export function canonicalToolName(toolName: string): string {
|
|
126
|
-
|
|
127
|
-
const toolSeparator = toolName.indexOf("__", "mcp__".length);
|
|
128
|
-
return toolSeparator >= 0 ? toolName.slice(toolSeparator + 2) : toolName;
|
|
127
|
+
return stripMcpToolPrefix(toolName);
|
|
129
128
|
}
|
|
130
129
|
|
|
131
130
|
export interface WriteGateSnapshot {
|
|
@@ -462,6 +461,111 @@ export function isDepthConfirmationAnswer(
|
|
|
462
461
|
return false;
|
|
463
462
|
}
|
|
464
463
|
|
|
464
|
+
export interface AskUserQuestionsGateQuestion {
|
|
465
|
+
id?: unknown;
|
|
466
|
+
options?: Array<{ label?: string }>;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
export interface AskUserQuestionsGateDetails {
|
|
470
|
+
cancelled?: boolean;
|
|
471
|
+
interrupted?: boolean;
|
|
472
|
+
response?: {
|
|
473
|
+
answers?: Record<string, { selected?: unknown } | undefined>;
|
|
474
|
+
} | null;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
export type AskUserQuestionsGateResult =
|
|
478
|
+
| { status: "not-gate" }
|
|
479
|
+
| { status: "waiting"; pendingGateId: string; interrupted: boolean }
|
|
480
|
+
| { status: "verified"; gateId: string; milestoneId: string | null }
|
|
481
|
+
| { status: "answered"; gateId: string };
|
|
482
|
+
|
|
483
|
+
function findGateQuestion(
|
|
484
|
+
questions: AskUserQuestionsGateQuestion[],
|
|
485
|
+
gateId: string,
|
|
486
|
+
): AskUserQuestionsGateQuestion | undefined {
|
|
487
|
+
return questions.find((question) => question?.id === gateId);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
function readSelectedGateAnswer(
|
|
491
|
+
details: AskUserQuestionsGateDetails,
|
|
492
|
+
questionId: string,
|
|
493
|
+
): unknown {
|
|
494
|
+
return details.response?.answers?.[questionId]?.selected;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
function verifyAnsweredGate(
|
|
498
|
+
basePath: string,
|
|
499
|
+
question: AskUserQuestionsGateQuestion,
|
|
500
|
+
fallbackMilestoneId?: string | null,
|
|
501
|
+
): AskUserQuestionsGateResult {
|
|
502
|
+
const gateId = typeof question.id === "string" ? question.id : "";
|
|
503
|
+
const milestoneId = extractDepthVerificationMilestoneId(gateId) ?? fallbackMilestoneId ?? null;
|
|
504
|
+
markApprovalGateVerified(gateId, basePath);
|
|
505
|
+
markDepthVerified(milestoneId, basePath);
|
|
506
|
+
clearPendingGate(basePath);
|
|
507
|
+
return { status: "verified", gateId, milestoneId };
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
export function applyAskUserQuestionsGateResult(options: {
|
|
511
|
+
basePath: string;
|
|
512
|
+
questions: AskUserQuestionsGateQuestion[];
|
|
513
|
+
details: AskUserQuestionsGateDetails;
|
|
514
|
+
fallbackMilestoneId?: string | null;
|
|
515
|
+
}): AskUserQuestionsGateResult {
|
|
516
|
+
const { basePath, questions, details, fallbackMilestoneId } = options;
|
|
517
|
+
const currentPendingGate = getPendingGate(basePath);
|
|
518
|
+
if (currentPendingGate) {
|
|
519
|
+
if (details.cancelled || !details.response) {
|
|
520
|
+
return {
|
|
521
|
+
status: "waiting",
|
|
522
|
+
pendingGateId: currentPendingGate,
|
|
523
|
+
interrupted: details.interrupted === true,
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
const pendingQuestion = findGateQuestion(questions, currentPendingGate);
|
|
528
|
+
if (pendingQuestion) {
|
|
529
|
+
const selected = readSelectedGateAnswer(details, currentPendingGate);
|
|
530
|
+
if (isDepthConfirmationAnswer(selected, pendingQuestion.options)) {
|
|
531
|
+
return verifyAnsweredGate(basePath, pendingQuestion, fallbackMilestoneId);
|
|
532
|
+
}
|
|
533
|
+
return { status: "answered", gateId: currentPendingGate };
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
if (details.cancelled || !details.response) return { status: "not-gate" };
|
|
538
|
+
|
|
539
|
+
for (const question of questions) {
|
|
540
|
+
if (typeof question.id !== "string" || !isGateQuestionId(question.id)) continue;
|
|
541
|
+
const selected = readSelectedGateAnswer(details, question.id);
|
|
542
|
+
if (!isDepthConfirmationAnswer(selected, question.options)) {
|
|
543
|
+
return { status: "answered", gateId: question.id };
|
|
544
|
+
}
|
|
545
|
+
if (currentPendingGate && question.id !== currentPendingGate) {
|
|
546
|
+
return { status: "answered", gateId: currentPendingGate };
|
|
547
|
+
}
|
|
548
|
+
return verifyAnsweredGate(basePath, question, fallbackMilestoneId);
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
return { status: "not-gate" };
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
export function formatPendingAskUserQuestionsGateMessage(
|
|
555
|
+
pendingGateId: string,
|
|
556
|
+
interrupted: boolean,
|
|
557
|
+
): string {
|
|
558
|
+
return [
|
|
559
|
+
`Waiting for depth confirmation on gate "${pendingGateId}".`,
|
|
560
|
+
interrupted
|
|
561
|
+
? "The confirmation question was interrupted before a response was recorded."
|
|
562
|
+
: "No user response was received for the confirmation question.",
|
|
563
|
+
"Do not infer approval from earlier or prior messages.",
|
|
564
|
+
"Do not proceed, write files, save artifacts, or call other tools.",
|
|
565
|
+
`Re-call ask_user_questions with the same gate question id ("${pendingGateId}") and wait for the user's response.`,
|
|
566
|
+
].join(" ");
|
|
567
|
+
}
|
|
568
|
+
|
|
465
569
|
export function shouldBlockContextWrite(
|
|
466
570
|
toolName: string,
|
|
467
571
|
inputPath: string,
|
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Shared DB-backed guard for milestone closeout finalization.
|
|
3
3
|
|
|
4
|
+
import { dirname } from "node:path";
|
|
5
|
+
|
|
4
6
|
import {
|
|
5
|
-
getDbPath,
|
|
6
7
|
getLatestAssessmentByScope,
|
|
7
8
|
getMilestone,
|
|
8
9
|
getMilestoneSlices,
|
|
9
10
|
getPendingGates,
|
|
10
11
|
getSliceTasks,
|
|
11
12
|
isDbAvailable,
|
|
12
|
-
refreshOpenDatabaseFromDisk,
|
|
13
13
|
} from "./gsd-db.js";
|
|
14
|
+
import {
|
|
15
|
+
getWorkflowDatabasePath,
|
|
16
|
+
refreshWorkflowDatabaseFromDisk,
|
|
17
|
+
} from "./db-workspace.js";
|
|
14
18
|
import { isClosedStatus } from "./status-guards.js";
|
|
19
|
+
import { closeQualityGatesFromEvidence } from "./quality-gate-closure.js";
|
|
15
20
|
|
|
16
21
|
export const CLOSEOUT_CONSISTENCY_BLOCKED_REASON = "closeout-consistency-blocked";
|
|
17
22
|
|
|
@@ -37,6 +42,8 @@ export type CloseoutConsistencyResult =
|
|
|
37
42
|
|
|
38
43
|
export interface CloseoutConsistencyOptions {
|
|
39
44
|
refreshFromDisk?: boolean;
|
|
45
|
+
allowOpenMilestone?: boolean;
|
|
46
|
+
artifactBasePath?: string;
|
|
40
47
|
}
|
|
41
48
|
|
|
42
49
|
function blocked(reason: CloseoutConsistencyFailureReason, message: string): CloseoutConsistencyResult {
|
|
@@ -52,6 +59,12 @@ function isFileBackedDbPath(path: string | null): boolean {
|
|
|
52
59
|
return Boolean(path && path !== ":memory:");
|
|
53
60
|
}
|
|
54
61
|
|
|
62
|
+
function artifactBasePathFromDb(): string | undefined {
|
|
63
|
+
const dbPath = getWorkflowDatabasePath();
|
|
64
|
+
if (!isFileBackedDbPath(dbPath)) return undefined;
|
|
65
|
+
return dirname(dirname(dbPath!));
|
|
66
|
+
}
|
|
67
|
+
|
|
55
68
|
export function checkCloseoutConsistencyGate(
|
|
56
69
|
milestoneId: string,
|
|
57
70
|
options: CloseoutConsistencyOptions = {},
|
|
@@ -63,7 +76,7 @@ export function checkCloseoutConsistencyGate(
|
|
|
63
76
|
);
|
|
64
77
|
}
|
|
65
78
|
|
|
66
|
-
if (options.refreshFromDisk && isFileBackedDbPath(
|
|
79
|
+
if (options.refreshFromDisk && isFileBackedDbPath(getWorkflowDatabasePath()) && !refreshWorkflowDatabaseFromDisk()) {
|
|
67
80
|
return blocked(
|
|
68
81
|
"db-refresh-failed",
|
|
69
82
|
`Closeout consistency blocked for ${milestoneId}: canonical DB refresh failed.`,
|
|
@@ -77,15 +90,17 @@ export function checkCloseoutConsistencyGate(
|
|
|
77
90
|
`Closeout consistency blocked for ${milestoneId}: milestone is missing from canonical DB.`,
|
|
78
91
|
);
|
|
79
92
|
}
|
|
80
|
-
if (!isClosedStatus(milestone.status)) {
|
|
93
|
+
if (!isClosedStatus(milestone.status) && !options.allowOpenMilestone) {
|
|
81
94
|
return blocked(
|
|
82
95
|
"milestone-open",
|
|
83
96
|
`Closeout consistency blocked for ${milestoneId}: canonical DB milestone status is "${milestone.status}".`,
|
|
84
97
|
);
|
|
85
98
|
}
|
|
86
99
|
|
|
100
|
+
const validation = milestone.status === "skipped"
|
|
101
|
+
? null
|
|
102
|
+
: getLatestAssessmentByScope(milestoneId, "milestone-validation");
|
|
87
103
|
if (milestone.status !== "skipped") {
|
|
88
|
-
const validation = getLatestAssessmentByScope(milestoneId, "milestone-validation");
|
|
89
104
|
if (validation?.status !== "pass") {
|
|
90
105
|
return blocked(
|
|
91
106
|
"validation-not-pass",
|
|
@@ -102,6 +117,13 @@ export function checkCloseoutConsistencyGate(
|
|
|
102
117
|
);
|
|
103
118
|
}
|
|
104
119
|
|
|
120
|
+
if (milestone.status !== "skipped") {
|
|
121
|
+
closeQualityGatesFromEvidence(milestoneId, {
|
|
122
|
+
artifactBasePath: options.artifactBasePath ?? artifactBasePathFromDb(),
|
|
123
|
+
milestoneValidationPassed: validation?.status === "pass",
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
105
127
|
for (const slice of slices) {
|
|
106
128
|
if (!isClosedStatus(slice.status)) {
|
|
107
129
|
return blocked(
|
|
@@ -472,17 +472,21 @@ export function ensureCodebaseMapFresh(
|
|
|
472
472
|
const force = ensureOptions?.force === true;
|
|
473
473
|
const now = Date.now();
|
|
474
474
|
|
|
475
|
+
// Enumerate files and compute fingerprint before the TTL check so that
|
|
476
|
+
// file changes are always detected, even within the TTL window.
|
|
477
|
+
const existing = readCodebaseMap(basePath);
|
|
478
|
+
const listed = enumerateFiles(basePath, resolved.excludes, resolved.maxFiles);
|
|
479
|
+
const fingerprint = computeCodebaseFingerprint(listed.files, resolved, listed.truncated);
|
|
480
|
+
|
|
481
|
+
// TTL short-circuit: only bypass regeneration when the fingerprint matches,
|
|
482
|
+
// confirming that no tracked files changed since the last check.
|
|
475
483
|
if (!force && ttlMs > 0) {
|
|
476
484
|
const cached = freshnessCache.get(cacheKey);
|
|
477
|
-
if (cached && now - cached.checkedAt < ttlMs) {
|
|
485
|
+
if (cached && now - cached.checkedAt < ttlMs && cached.result.fingerprint === fingerprint) {
|
|
478
486
|
return cached.result;
|
|
479
487
|
}
|
|
480
488
|
}
|
|
481
489
|
|
|
482
|
-
const existing = readCodebaseMap(basePath);
|
|
483
|
-
const listed = enumerateFiles(basePath, resolved.excludes, resolved.maxFiles);
|
|
484
|
-
const fingerprint = computeCodebaseFingerprint(listed.files, resolved, listed.truncated);
|
|
485
|
-
|
|
486
490
|
const cacheAndReturn = (result: EnsureCodebaseMapResult): EnsureCodebaseMapResult => {
|
|
487
491
|
freshnessCache.set(cacheKey, { checkedAt: now, result });
|
|
488
492
|
return result;
|
|
@@ -6,6 +6,7 @@ import { resolve } from "node:path";
|
|
|
6
6
|
import { enableDebug } from "../../debug-logger.js";
|
|
7
7
|
import { getAutoDashboardData, isAutoActive, isAutoPaused, pauseAuto, startAutoDetached, stopAuto, stopAutoRemote } from "../../auto.js";
|
|
8
8
|
import { handleRate } from "../../commands-rate.js";
|
|
9
|
+
import { notifyPreferenceDiagnostics } from "../../preferences-diagnostics.js";
|
|
9
10
|
import { setSessionModelOverride } from "../../session-model-override.js";
|
|
10
11
|
import { guardRemoteSession, projectRoot } from "../context.js";
|
|
11
12
|
import { findMilestoneIds } from "../../milestone-id-utils.js";
|
|
@@ -91,6 +92,7 @@ export async function handleAutoCommand(trimmed: string, ctx: ExtensionCommandCo
|
|
|
91
92
|
if (!(await guardRemoteSession(ctx, pi))) return true;
|
|
92
93
|
const basePath = projectRoot();
|
|
93
94
|
if (await hasUnresolvedCloseoutBlocker(ctx, basePath)) return true;
|
|
95
|
+
notifyPreferenceDiagnostics(ctx, basePath, { surface: "auto-preflight" });
|
|
94
96
|
|
|
95
97
|
// Validate the milestone target exists and is not already complete.
|
|
96
98
|
if (milestoneId) {
|
|
@@ -118,6 +120,7 @@ export async function handleAutoCommand(trimmed: string, ctx: ExtensionCommandCo
|
|
|
118
120
|
if (!(await guardRemoteSession(ctx, pi))) return true;
|
|
119
121
|
const basePath = projectRoot();
|
|
120
122
|
if (await hasUnresolvedCloseoutBlocker(ctx, basePath)) return true;
|
|
123
|
+
notifyPreferenceDiagnostics(ctx, basePath, { surface: "auto-preflight" });
|
|
121
124
|
|
|
122
125
|
// Validate the milestone target exists and is not already complete.
|
|
123
126
|
if (milestoneId) {
|