@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
|
@@ -10,6 +10,7 @@ import { logError } from "../workflow-logger.js";
|
|
|
10
10
|
import { getErrorMessage } from "../error-utils.js";
|
|
11
11
|
import { incrementLegacyTelemetry } from "../legacy-telemetry.js";
|
|
12
12
|
import { prepareSaveGateResultArguments } from "../tools/save-gate-result-args.js";
|
|
13
|
+
import { aliasesForWorkflowTool } from "../workflow-tool-surface.js";
|
|
13
14
|
async function loadWorkflowExecutors() {
|
|
14
15
|
return importWorkflowExecutorsModule();
|
|
15
16
|
}
|
|
@@ -41,6 +42,13 @@ function registerAlias(pi, toolDef, aliasName, canonicalName) {
|
|
|
41
42
|
execute,
|
|
42
43
|
});
|
|
43
44
|
}
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- toolDef shape matches ToolDefinition but varies by schema
|
|
46
|
+
function registerWorkflowTool(pi, toolDef) {
|
|
47
|
+
pi.registerTool(toolDef);
|
|
48
|
+
for (const alias of aliasesForWorkflowTool(toolDef.name)) {
|
|
49
|
+
registerAlias(pi, toolDef, alias, toolDef.name);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
44
52
|
function requirementRootWriteGuard(operation, basePath) {
|
|
45
53
|
const guard = shouldBlockRootArtifactSaveInSnapshot(loadWriteGateSnapshot(basePath), "REQUIREMENTS");
|
|
46
54
|
if (!guard.block)
|
|
@@ -155,8 +163,7 @@ export function registerDbTools(pi) {
|
|
|
155
163
|
return new Text(text, 0, 0);
|
|
156
164
|
},
|
|
157
165
|
};
|
|
158
|
-
pi
|
|
159
|
-
registerAlias(pi, decisionSaveTool, "gsd_save_decision", "gsd_decision_save");
|
|
166
|
+
registerWorkflowTool(pi, decisionSaveTool);
|
|
160
167
|
// ─── gsd_requirement_update (formerly gsd_update_requirement) ───────────
|
|
161
168
|
const requirementUpdateExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
162
169
|
const basePath = resolveCtxCwd(_ctx);
|
|
@@ -241,8 +248,7 @@ export function registerDbTools(pi) {
|
|
|
241
248
|
return new Text(text, 0, 0);
|
|
242
249
|
},
|
|
243
250
|
};
|
|
244
|
-
pi
|
|
245
|
-
registerAlias(pi, requirementUpdateTool, "gsd_update_requirement", "gsd_requirement_update");
|
|
251
|
+
registerWorkflowTool(pi, requirementUpdateTool);
|
|
246
252
|
// ─── gsd_requirement_save ─────────────────────────────────────────────
|
|
247
253
|
const requirementSaveExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
248
254
|
const basePath = resolveCtxCwd(_ctx);
|
|
@@ -340,8 +346,7 @@ export function registerDbTools(pi) {
|
|
|
340
346
|
return new Text(text, 0, 0);
|
|
341
347
|
},
|
|
342
348
|
};
|
|
343
|
-
pi
|
|
344
|
-
registerAlias(pi, requirementSaveTool, "gsd_save_requirement", "gsd_requirement_save");
|
|
349
|
+
registerWorkflowTool(pi, requirementSaveTool);
|
|
345
350
|
// ─── gsd_summary_save (formerly gsd_save_summary) ──────────────────────
|
|
346
351
|
const summarySaveExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
347
352
|
try {
|
|
@@ -397,8 +402,7 @@ export function registerDbTools(pi) {
|
|
|
397
402
|
return new Text(text, 0, 0);
|
|
398
403
|
},
|
|
399
404
|
};
|
|
400
|
-
pi
|
|
401
|
-
registerAlias(pi, summarySaveTool, "gsd_save_summary", "gsd_summary_save");
|
|
405
|
+
registerWorkflowTool(pi, summarySaveTool);
|
|
402
406
|
// ─── gsd_uat_result_save ─────────────────────────────────────────────────
|
|
403
407
|
const uatResultSaveExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
404
408
|
const { executeUatResultSave } = await loadWorkflowExecutors();
|
|
@@ -480,7 +484,7 @@ export function registerDbTools(pi) {
|
|
|
480
484
|
return new Text(theme.fg("success", `UAT ${d?.sliceId ?? ""}: ${d?.verdict ?? "saved"}`), 0, 0);
|
|
481
485
|
},
|
|
482
486
|
};
|
|
483
|
-
pi
|
|
487
|
+
registerWorkflowTool(pi, uatResultSaveTool);
|
|
484
488
|
// ─── gsd_milestone_generate_id (formerly gsd_generate_milestone_id) ────
|
|
485
489
|
const milestoneGenerateIdExecute = async (_toolCallId, _params, _signal, _onUpdate, _ctx) => {
|
|
486
490
|
try {
|
|
@@ -566,8 +570,7 @@ export function registerDbTools(pi) {
|
|
|
566
570
|
return new Text(text, 0, 0);
|
|
567
571
|
},
|
|
568
572
|
};
|
|
569
|
-
pi
|
|
570
|
-
registerAlias(pi, milestoneGenerateIdTool, "gsd_generate_milestone_id", "gsd_milestone_generate_id");
|
|
573
|
+
registerWorkflowTool(pi, milestoneGenerateIdTool);
|
|
571
574
|
// ─── gsd_plan_milestone (gsd_milestone_plan alias) ─────────────────────
|
|
572
575
|
const planMilestoneExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
573
576
|
const { executePlanMilestone } = await loadWorkflowExecutors();
|
|
@@ -633,8 +636,7 @@ export function registerDbTools(pi) {
|
|
|
633
636
|
}),
|
|
634
637
|
execute: planMilestoneExecute,
|
|
635
638
|
};
|
|
636
|
-
pi
|
|
637
|
-
registerAlias(pi, planMilestoneTool, "gsd_milestone_plan", "gsd_plan_milestone");
|
|
639
|
+
registerWorkflowTool(pi, planMilestoneTool);
|
|
638
640
|
// ─── gsd_plan_slice (gsd_slice_plan alias) ─────────────────────────────
|
|
639
641
|
const planSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
640
642
|
const { executePlanSlice } = await loadWorkflowExecutors();
|
|
@@ -678,8 +680,7 @@ export function registerDbTools(pi) {
|
|
|
678
680
|
}),
|
|
679
681
|
execute: planSliceExecute,
|
|
680
682
|
};
|
|
681
|
-
pi
|
|
682
|
-
registerAlias(pi, planSliceTool, "gsd_slice_plan", "gsd_plan_slice");
|
|
683
|
+
registerWorkflowTool(pi, planSliceTool);
|
|
683
684
|
// ─── gsd_plan_task (gsd_task_plan alias) ───────────────────────────────
|
|
684
685
|
const planTaskExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
685
686
|
const basePath = resolveCtxCwd(_ctx);
|
|
@@ -748,8 +749,7 @@ export function registerDbTools(pi) {
|
|
|
748
749
|
}),
|
|
749
750
|
execute: planTaskExecute,
|
|
750
751
|
};
|
|
751
|
-
pi
|
|
752
|
-
registerAlias(pi, planTaskTool, "gsd_task_plan", "gsd_plan_task");
|
|
752
|
+
registerWorkflowTool(pi, planTaskTool);
|
|
753
753
|
// ─── gsd_task_complete (gsd_complete_task alias) ────────────────────────
|
|
754
754
|
const taskCompleteExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
755
755
|
const { executeTaskComplete } = await loadWorkflowExecutors();
|
|
@@ -809,8 +809,7 @@ export function registerDbTools(pi) {
|
|
|
809
809
|
}),
|
|
810
810
|
execute: taskCompleteExecute,
|
|
811
811
|
};
|
|
812
|
-
pi
|
|
813
|
-
registerAlias(pi, taskCompleteTool, "gsd_complete_task", "gsd_task_complete");
|
|
812
|
+
registerWorkflowTool(pi, taskCompleteTool);
|
|
814
813
|
// ─── gsd_slice_complete (gsd_complete_slice alias) ─────────────────────
|
|
815
814
|
const sliceCompleteExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
816
815
|
const { executeSliceComplete } = await loadWorkflowExecutors();
|
|
@@ -875,8 +874,7 @@ export function registerDbTools(pi) {
|
|
|
875
874
|
}),
|
|
876
875
|
execute: sliceCompleteExecute,
|
|
877
876
|
};
|
|
878
|
-
pi
|
|
879
|
-
registerAlias(pi, sliceCompleteTool, "gsd_complete_slice", "gsd_slice_complete");
|
|
877
|
+
registerWorkflowTool(pi, sliceCompleteTool);
|
|
880
878
|
// ─── gsd_skip_slice (#3477 / #3487) ───────────────────────────────────
|
|
881
879
|
const skipSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
882
880
|
const basePath = resolveCtxCwd(_ctx);
|
|
@@ -941,7 +939,7 @@ export function registerDbTools(pi) {
|
|
|
941
939
|
};
|
|
942
940
|
}
|
|
943
941
|
};
|
|
944
|
-
pi
|
|
942
|
+
registerWorkflowTool(pi, {
|
|
945
943
|
name: "gsd_skip_slice",
|
|
946
944
|
label: "Skip Slice",
|
|
947
945
|
description: "Mark a slice as skipped so auto-mode advances past it without executing. " +
|
|
@@ -1000,8 +998,7 @@ export function registerDbTools(pi) {
|
|
|
1000
998
|
}),
|
|
1001
999
|
execute: milestoneCompleteExecute,
|
|
1002
1000
|
};
|
|
1003
|
-
pi
|
|
1004
|
-
registerAlias(pi, milestoneCompleteTool, "gsd_milestone_complete", "gsd_complete_milestone");
|
|
1001
|
+
registerWorkflowTool(pi, milestoneCompleteTool);
|
|
1005
1002
|
// ─── gsd_validate_milestone (gsd_milestone_validate alias) ─────────────
|
|
1006
1003
|
const milestoneValidateExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
1007
1004
|
const { executeValidateMilestone } = await loadWorkflowExecutors();
|
|
@@ -1035,8 +1032,7 @@ export function registerDbTools(pi) {
|
|
|
1035
1032
|
}),
|
|
1036
1033
|
execute: milestoneValidateExecute,
|
|
1037
1034
|
};
|
|
1038
|
-
pi
|
|
1039
|
-
registerAlias(pi, milestoneValidateTool, "gsd_milestone_validate", "gsd_validate_milestone");
|
|
1035
|
+
registerWorkflowTool(pi, milestoneValidateTool);
|
|
1040
1036
|
// ─── gsd_replan_slice (gsd_slice_replan alias) ─────────────────────────
|
|
1041
1037
|
const replanSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
1042
1038
|
const { executeReplanSlice } = await loadWorkflowExecutors();
|
|
@@ -1078,8 +1074,7 @@ export function registerDbTools(pi) {
|
|
|
1078
1074
|
}),
|
|
1079
1075
|
execute: replanSliceExecute,
|
|
1080
1076
|
};
|
|
1081
|
-
pi
|
|
1082
|
-
registerAlias(pi, replanSliceTool, "gsd_slice_replan", "gsd_replan_slice");
|
|
1077
|
+
registerWorkflowTool(pi, replanSliceTool);
|
|
1083
1078
|
// ─── gsd_reassess_roadmap (gsd_roadmap_reassess alias) ─────────────────
|
|
1084
1079
|
const reassessRoadmapExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
1085
1080
|
const { executeReassessRoadmap } = await loadWorkflowExecutors();
|
|
@@ -1126,8 +1121,7 @@ export function registerDbTools(pi) {
|
|
|
1126
1121
|
}),
|
|
1127
1122
|
execute: reassessRoadmapExecute,
|
|
1128
1123
|
};
|
|
1129
|
-
pi
|
|
1130
|
-
registerAlias(pi, reassessRoadmapTool, "gsd_roadmap_reassess", "gsd_reassess_roadmap");
|
|
1124
|
+
registerWorkflowTool(pi, reassessRoadmapTool);
|
|
1131
1125
|
// ─── gsd_task_reopen (gsd_reopen_task alias) ───────────────────────────
|
|
1132
1126
|
// Single-writer v3, Stream 3: reversibility tools for closed units.
|
|
1133
1127
|
const reopenTaskExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
@@ -1190,8 +1184,7 @@ export function registerDbTools(pi) {
|
|
|
1190
1184
|
}),
|
|
1191
1185
|
execute: reopenTaskExecute,
|
|
1192
1186
|
};
|
|
1193
|
-
pi
|
|
1194
|
-
registerAlias(pi, reopenTaskTool, "gsd_reopen_task", "gsd_task_reopen");
|
|
1187
|
+
registerWorkflowTool(pi, reopenTaskTool);
|
|
1195
1188
|
// ─── gsd_slice_reopen (gsd_reopen_slice alias) ─────────────────────────
|
|
1196
1189
|
const reopenSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
1197
1190
|
const basePath = resolveCtxCwd(_ctx);
|
|
@@ -1253,8 +1246,7 @@ export function registerDbTools(pi) {
|
|
|
1253
1246
|
}),
|
|
1254
1247
|
execute: reopenSliceExecute,
|
|
1255
1248
|
};
|
|
1256
|
-
pi
|
|
1257
|
-
registerAlias(pi, reopenSliceTool, "gsd_reopen_slice", "gsd_slice_reopen");
|
|
1249
|
+
registerWorkflowTool(pi, reopenSliceTool);
|
|
1258
1250
|
// ─── gsd_milestone_reopen (gsd_reopen_milestone alias) ─────────────────
|
|
1259
1251
|
const reopenMilestoneExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
1260
1252
|
const basePath = resolveCtxCwd(_ctx);
|
|
@@ -1314,8 +1306,7 @@ export function registerDbTools(pi) {
|
|
|
1314
1306
|
}),
|
|
1315
1307
|
execute: reopenMilestoneExecute,
|
|
1316
1308
|
};
|
|
1317
|
-
pi
|
|
1318
|
-
registerAlias(pi, reopenMilestoneTool, "gsd_reopen_milestone", "gsd_milestone_reopen");
|
|
1309
|
+
registerWorkflowTool(pi, reopenMilestoneTool);
|
|
1319
1310
|
// ─── gsd_save_gate_result ──────────────────────────────────────────────
|
|
1320
1311
|
const saveGateResultExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
1321
1312
|
const { executeSaveGateResult } = await loadWorkflowExecutors();
|
|
@@ -1378,5 +1369,5 @@ export function registerDbTools(pi) {
|
|
|
1378
1369
|
return new Text(theme.fg(color, `${d.gateId}: ${d.verdict}`), 0, 0);
|
|
1379
1370
|
},
|
|
1380
1371
|
};
|
|
1381
|
-
pi
|
|
1372
|
+
registerWorkflowTool(pi, saveGateResultTool);
|
|
1382
1373
|
}
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
// File Purpose: Registers workspace-aware dynamic filesystem and shell tools.
|
|
3
3
|
import { existsSync, readdirSync } from "node:fs";
|
|
4
4
|
import { homedir } from "node:os";
|
|
5
|
-
import {
|
|
5
|
+
import { join } from "node:path";
|
|
6
6
|
import { createBashTool, createEditTool, createReadTool, createWriteTool } from "@gsd/pi-coding-agent";
|
|
7
7
|
import { DEFAULT_BASH_TIMEOUT_SECS } from "../constants.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { logWarning } from "../workflow-logger.js";
|
|
9
|
+
import { openWorkflowDatabase } from "../db-workspace.js";
|
|
10
10
|
import { getAutoWorktreePath } from "../auto-worktree.js";
|
|
11
11
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
12
12
|
export function safeWorkspaceCwd() {
|
|
@@ -58,44 +58,18 @@ export function resolveWorkflowToolBasePath(ctx, scope) {
|
|
|
58
58
|
}
|
|
59
59
|
return cwd;
|
|
60
60
|
}
|
|
61
|
-
|
|
62
|
-
* Resolve the correct DB path for the current working directory.
|
|
63
|
-
* If `basePath` is inside a `.gsd/worktrees/<MID>/` directory, returns
|
|
64
|
-
* the project root's `.gsd/gsd.db` (shared WAL — R012). Otherwise
|
|
65
|
-
* returns `<basePath>/.gsd/gsd.db`.
|
|
66
|
-
*/
|
|
67
|
-
export function resolveProjectRootDbPath(basePath) {
|
|
68
|
-
return resolveGsdPathContract(basePath).projectDb;
|
|
69
|
-
}
|
|
61
|
+
export { resolveProjectRootDbPath } from "../db-workspace.js";
|
|
70
62
|
export async function ensureDbOpen(basePath = safeWorkspaceCwd()) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const gsdDir = contract.projectGsd;
|
|
76
|
-
const projectRoot = dirname(dirname(dbPath));
|
|
77
|
-
// Open existing DB file (may be at project root for worktrees)
|
|
78
|
-
if (existsSync(dbPath)) {
|
|
79
|
-
const opened = db.openDatabase(dbPath);
|
|
80
|
-
if (opened)
|
|
81
|
-
setLogBasePath(projectRoot);
|
|
82
|
-
return opened;
|
|
83
|
-
}
|
|
84
|
-
// No DB file — create an empty authoritative DB. Markdown migration is
|
|
85
|
-
// explicit-only; runtime startup must not import projections into state.
|
|
86
|
-
if (existsSync(gsdDir)) {
|
|
87
|
-
const opened = db.openDatabase(dbPath);
|
|
88
|
-
if (opened)
|
|
89
|
-
setLogBasePath(projectRoot);
|
|
90
|
-
return opened;
|
|
91
|
-
}
|
|
63
|
+
const result = openWorkflowDatabase(basePath);
|
|
64
|
+
if (result.ok)
|
|
65
|
+
return true;
|
|
66
|
+
if (result.reason === "missing-gsd-dir") {
|
|
92
67
|
logWarning("bootstrap", "ensureDbOpen failed — no .gsd directory found");
|
|
93
|
-
return false;
|
|
94
68
|
}
|
|
95
|
-
|
|
96
|
-
logWarning("bootstrap", `ensureDbOpen failed: ${
|
|
97
|
-
return false;
|
|
69
|
+
else {
|
|
70
|
+
logWarning("bootstrap", `ensureDbOpen failed: ${result.error?.message ?? "open failed"}`);
|
|
98
71
|
}
|
|
72
|
+
return false;
|
|
99
73
|
}
|
|
100
74
|
export function registerDynamicTools(pi) {
|
|
101
75
|
const fallbackRoot = safeWorkspaceCwd();
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// gsd-pi — Read-only query tools exposing DB state to the LLM via the WAL connection
|
|
4
4
|
import { Type } from "@sinclair/typebox";
|
|
5
5
|
import { ensureDbOpen, resolveCtxCwd } from "./dynamic-tools.js";
|
|
6
|
+
import { checkpointWorkflowDatabase } from "../db-workspace.js";
|
|
6
7
|
export function registerQueryTools(pi) {
|
|
7
8
|
pi.registerTool({
|
|
8
9
|
name: "gsd_milestone_status",
|
|
@@ -50,8 +51,7 @@ export function registerQueryTools(pi) {
|
|
|
50
51
|
details: { operation: "checkpoint_db", error: "db_unavailable" },
|
|
51
52
|
};
|
|
52
53
|
}
|
|
53
|
-
|
|
54
|
-
checkpointDatabase();
|
|
54
|
+
checkpointWorkflowDatabase();
|
|
55
55
|
return {
|
|
56
56
|
content: [{ type: "text", text: "WAL checkpoint complete. gsd.db is now up to date and safe to stage with git add." }],
|
|
57
57
|
details: { operation: "checkpoint_db", status: "ok" },
|
|
@@ -7,11 +7,12 @@ import { isToolCallEventType } from "@gsd/pi-coding-agent";
|
|
|
7
7
|
import { ALWAYS_PRESERVED_SHIM_TOOL_NAMES } from "@gsd/pi-ai";
|
|
8
8
|
import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
|
|
9
9
|
import { buildMilestoneFileName, clearPathCache, milestonesDir, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
|
|
10
|
-
import { canonicalToolName, clearDiscussionFlowState,
|
|
10
|
+
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";
|
|
11
11
|
import { resolveManifest } from "../unit-context-manifest.js";
|
|
12
12
|
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
13
13
|
import { loadFile, saveFile, formatContinue } from "../files.js";
|
|
14
|
-
import { clearToolInvocationError, getAutoRuntimeSnapshot, getSourceObservationStore, isAutoActive, isAutoCompletionStopInProgress, isAutoPaused, markToolEnd, markToolStart, recordToolInvocationError, } from "../auto-runtime-state.js";
|
|
14
|
+
import { clearAutoCompletionStopInProgress, clearToolInvocationError, getAutoRuntimeSnapshot, getSourceObservationStore, isAutoActive, isAutoCompletionStopInProgress, isAutoPaused, isInteractiveElicitationInFlight, markToolEnd, markToolStart, recordAutoToolSurfaceSnapshot, recordToolInvocationError, } from "../auto-runtime-state.js";
|
|
15
|
+
import { applyProviderPayloadPolicy } from "../provider-payload-policy.js";
|
|
15
16
|
import { checkToolCallLoop, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
|
|
16
17
|
import { maybePauseAutoForApprovalGate, resetPendingGatePauseGuard } from "./pending-gate-pause.js";
|
|
17
18
|
import { saveActivityLog } from "../activity-log.js";
|
|
@@ -22,16 +23,18 @@ import { logWarning as safetyLogWarning } from "../workflow-logger.js";
|
|
|
22
23
|
import { installNotifyInterceptor } from "./notify-interceptor.js";
|
|
23
24
|
import { initNotificationStore } from "../notification-store.js";
|
|
24
25
|
import { initNotificationWidget } from "../notification-widget.js";
|
|
26
|
+
import { notifyPreferenceDiagnostics } from "../preferences-diagnostics.js";
|
|
25
27
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
26
28
|
import { extractSubagentAgentClasses } from "./subagent-input.js";
|
|
27
|
-
import { approvalGateIdForUnit, isExplicitApprovalResponse, shouldPauseForUserApprovalQuestion } from "../user-input-boundary.js";
|
|
29
|
+
import { approvalGateIdForUnit, isExplicitApprovalResponse, messageHasPendingAskUserQuestionsTool, shouldPauseForUserApprovalQuestion, } from "../user-input-boundary.js";
|
|
28
30
|
import { applyUnitSkillVisibility, unitHasSkillManifest } from "../skill-scope.js";
|
|
29
31
|
import { getGuidedUnitContext } from "../guided-unit-context.js";
|
|
30
32
|
import { registerPlanMilestoneSchemaRecovery } from "./plan-milestone-schema-recovery.js";
|
|
31
|
-
import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
|
|
33
|
+
import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, canonicalWorkflowToolName, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
|
|
32
34
|
import { filterToolsForProvider } from "../model-router.js";
|
|
35
|
+
import { mcpToolMatchesBaseName } from "../mcp-tool-name.js";
|
|
33
36
|
import { RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES } from "../tool-presentation-plan.js";
|
|
34
|
-
import {
|
|
37
|
+
import { supportsSourceObservationsForUnit } from "../source-observations.js";
|
|
35
38
|
let approvalQuestionAbortInFlight = false;
|
|
36
39
|
async function loadWelcomeScreenModule() {
|
|
37
40
|
const candidates = [];
|
|
@@ -109,7 +112,9 @@ export const MINIMAL_GSD_TOOL_NAMES = [
|
|
|
109
112
|
"gsd_checkpoint_db",
|
|
110
113
|
"gsd_plan_milestone",
|
|
111
114
|
"memory_query",
|
|
115
|
+
"gsd_memory_query",
|
|
112
116
|
"capture_thought",
|
|
117
|
+
"gsd_capture_thought",
|
|
113
118
|
];
|
|
114
119
|
export const MINIMAL_AUTO_BASE_TOOL_NAMES = [
|
|
115
120
|
"ask_user_questions",
|
|
@@ -163,15 +168,19 @@ function resolveScopedToolNames(activeToolNames, requestedToolNames) {
|
|
|
163
168
|
const resolved = new Set();
|
|
164
169
|
for (const requested of requestedToolNames) {
|
|
165
170
|
const scopedMatches = [];
|
|
171
|
+
const aliasFallbacks = [];
|
|
166
172
|
for (const activeName of activeToolNames) {
|
|
167
|
-
if (
|
|
168
|
-
continue;
|
|
169
|
-
const toolSeparator = activeName.indexOf("__", "mcp__".length);
|
|
170
|
-
if (toolSeparator < 0)
|
|
171
|
-
continue;
|
|
172
|
-
if (activeName.slice(toolSeparator + 2) === requested) {
|
|
173
|
+
if (mcpToolMatchesBaseName(activeName, requested)) {
|
|
173
174
|
scopedMatches.push(activeName);
|
|
174
175
|
}
|
|
176
|
+
else if (isWorkflowAliasTool(activeName) && canonicalWorkflowToolName(activeName) === requested) {
|
|
177
|
+
aliasFallbacks.push(activeName);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Only use alias as fallback when canonical is absent — not directly and not via MCP scoping.
|
|
181
|
+
// Prevents the alias from resurfacing alongside the canonical when both are in the active set.
|
|
182
|
+
if (!exact.has(requested) && scopedMatches.length === 0) {
|
|
183
|
+
scopedMatches.push(...aliasFallbacks);
|
|
175
184
|
}
|
|
176
185
|
if (requested.startsWith("browser_") && scopedMatches.length > 0) {
|
|
177
186
|
for (const match of scopedMatches)
|
|
@@ -212,7 +221,7 @@ export function buildRunUatGsdToolSet(activeToolNames, registeredToolNames = act
|
|
|
212
221
|
...RUN_UAT_BROWSER_TOOL_NAMES,
|
|
213
222
|
]);
|
|
214
223
|
const resolved = [...new Set(scoped)];
|
|
215
|
-
const unresolved = RUN_UAT_WORKFLOW_TOOL_NAMES.filter((tool) => !resolved.some((name) => name === tool || (name
|
|
224
|
+
const unresolved = RUN_UAT_WORKFLOW_TOOL_NAMES.filter((tool) => !resolved.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)));
|
|
216
225
|
if (unresolved.length > 0) {
|
|
217
226
|
safetyLogWarning("bootstrap", `buildRunUatGsdToolSet: required run-uat workflow tool(s) not found in active/registered surface: ${unresolved.join(", ")}. Session may lack gsd-workflow MCP connection.`);
|
|
218
227
|
}
|
|
@@ -269,7 +278,17 @@ function applyMinimalGsdToolSurface(pi) {
|
|
|
269
278
|
return;
|
|
270
279
|
const dash = getAutoRuntimeSnapshot();
|
|
271
280
|
if (dash.active && dash.currentUnit) {
|
|
272
|
-
|
|
281
|
+
const currentToolNames = pi.getActiveTools();
|
|
282
|
+
const registeredToolNames = resolveRegisteredToolNames(pi, currentToolNames);
|
|
283
|
+
const scopedToolNames = buildMinimalAutoGsdToolSet(currentToolNames, dash.currentUnit.type, registeredToolNames);
|
|
284
|
+
recordAutoToolSurfaceSnapshot({
|
|
285
|
+
source: "runtime-scope",
|
|
286
|
+
unitType: dash.currentUnit.type,
|
|
287
|
+
modelFacingToolNames: scopedToolNames,
|
|
288
|
+
registeredToolNames,
|
|
289
|
+
scopedToolNames,
|
|
290
|
+
});
|
|
291
|
+
pi.setActiveTools(scopedToolNames);
|
|
273
292
|
return;
|
|
274
293
|
}
|
|
275
294
|
if (!isGeneralGsdToolScopingRequested())
|
|
@@ -284,6 +303,13 @@ export function scopeGsdWorkflowToolsForDispatch(pi, unitType) {
|
|
|
284
303
|
const scoped = unitType
|
|
285
304
|
? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames)
|
|
286
305
|
: buildMinimalGsdWorkflowToolSet(current, registeredToolNames);
|
|
306
|
+
recordAutoToolSurfaceSnapshot({
|
|
307
|
+
source: "dispatch-scope",
|
|
308
|
+
unitType,
|
|
309
|
+
modelFacingToolNames: scoped,
|
|
310
|
+
registeredToolNames,
|
|
311
|
+
scopedToolNames: scoped,
|
|
312
|
+
});
|
|
287
313
|
const toolsChanged = !(scoped.length === current.length && scoped.every((name, index) => name === current[index]));
|
|
288
314
|
const canScopeSkills = unitHasSkillManifest(unitType) && pi.getVisibleSkills && pi.setVisibleSkills;
|
|
289
315
|
if (!toolsChanged && !canScopeSkills) {
|
|
@@ -538,6 +564,7 @@ function initSessionNotifications(ctx) {
|
|
|
538
564
|
initNotificationStore(resolveNotificationStoreBasePath(contextBasePath(ctx)));
|
|
539
565
|
installNotifyInterceptor(ctx);
|
|
540
566
|
initNotificationWidget(ctx);
|
|
567
|
+
notifyPreferenceDiagnostics(ctx, contextBasePath(ctx), { surface: "session-start" });
|
|
541
568
|
}
|
|
542
569
|
async function prepareWorkflowMcpForHookContext(ctx, basePath) {
|
|
543
570
|
// Skip MCP auto-prep when running inside an auto-worktree. The worktree
|
|
@@ -624,6 +651,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
624
651
|
}
|
|
625
652
|
});
|
|
626
653
|
pi.on("before_agent_start", async (event, ctx) => {
|
|
654
|
+
clearAutoCompletionStopInProgress();
|
|
627
655
|
resetPendingGatePauseGuard();
|
|
628
656
|
applyMinimalGsdToolSurface(pi);
|
|
629
657
|
// Wait for ecosystem loader to finish (no-op after first turn).
|
|
@@ -800,6 +828,20 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
800
828
|
pi.on("message_update", async (event, ctx) => {
|
|
801
829
|
if (approvalQuestionAbortInFlight)
|
|
802
830
|
return;
|
|
831
|
+
// If the model asked via ask_user_questions, that in-flight elicitation IS
|
|
832
|
+
// the human boundary. Arming the pause/gate here (and emitting the "waiting
|
|
833
|
+
// for your approval - pausing" notice) would tear it down and trigger the
|
|
834
|
+
// foreground self-cancel/re-ask loop. The marker is set only by the
|
|
835
|
+
// claude-code-cli SDK elicitation handler and is ungated, so it is true in
|
|
836
|
+
// foreground; under the native-TUI provider it is always false and this path
|
|
837
|
+
// runs unchanged (#cc-elicitation-self-cancel).
|
|
838
|
+
if (isInteractiveElicitationInFlight())
|
|
839
|
+
return;
|
|
840
|
+
// Prose with "?" can stream before the MCP tool/elicitation starts. When the
|
|
841
|
+
// structured ask_user_questions call is already in the partial message, the
|
|
842
|
+
// tool IS the human boundary — do not arm the text-based approval pause.
|
|
843
|
+
if (messageHasPendingAskUserQuestionsTool(event.message))
|
|
844
|
+
return;
|
|
803
845
|
const dash = getAutoRuntimeSnapshot();
|
|
804
846
|
if (dash.active)
|
|
805
847
|
return;
|
|
@@ -1068,77 +1110,32 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1068
1110
|
const basePath = contextBasePath(ctx);
|
|
1069
1111
|
const milestoneId = await getDiscussionMilestoneIdFor(basePath);
|
|
1070
1112
|
const details = event.details;
|
|
1071
|
-
// ── Discussion gate enforcement: handle gate question responses ──
|
|
1072
|
-
// If the result is cancelled or has no response, the pending gate stays active
|
|
1073
|
-
// so the model is blocked from non-read-only tools until it re-asks.
|
|
1074
|
-
// If the user responded at all (even "needs adjustment"), clear the pending gate
|
|
1075
|
-
// because the user engaged — the prompt handles the re-ask-after-adjustment flow.
|
|
1076
1113
|
const questions = event.input?.questions ?? [];
|
|
1077
|
-
const
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
await maybePauseAutoForApprovalGate(ctx, pi, true, interrupted
|
|
1090
|
-
? "Depth confirmation was interrupted — pausing auto-mode until you respond."
|
|
1091
|
-
: "Depth confirmation is waiting for your answer — pausing auto-mode.");
|
|
1092
|
-
}
|
|
1093
|
-
return {
|
|
1094
|
-
content: [{
|
|
1095
|
-
type: "text",
|
|
1096
|
-
text: [
|
|
1097
|
-
`Waiting for depth confirmation on gate "${currentPendingGate}".`,
|
|
1098
|
-
interrupted
|
|
1099
|
-
? "The confirmation question was interrupted before a response was recorded."
|
|
1100
|
-
: "No user response was received for the confirmation question.",
|
|
1101
|
-
"Do not infer approval from earlier or prior messages.",
|
|
1102
|
-
"Do not proceed, write files, save artifacts, or call other tools.",
|
|
1103
|
-
`Re-call ask_user_questions with the same gate question id ("${currentPendingGate}") and wait for the user's response.`,
|
|
1104
|
-
].join(" "),
|
|
1105
|
-
}],
|
|
1106
|
-
};
|
|
1107
|
-
}
|
|
1108
|
-
else {
|
|
1109
|
-
const pendingQuestion = questions.find((question) => question?.id === currentPendingGate);
|
|
1110
|
-
if (pendingQuestion) {
|
|
1111
|
-
const answer = details.response?.answers?.[currentPendingGate];
|
|
1112
|
-
if (isDepthConfirmationAnswer(answer?.selected, pendingQuestion.options)) {
|
|
1113
|
-
markApprovalGateVerified(currentPendingGate, basePath);
|
|
1114
|
-
const milestoneIdFromGate = extractDepthVerificationMilestoneId(currentPendingGate);
|
|
1115
|
-
if (milestoneIdFromGate)
|
|
1116
|
-
markDepthVerified(milestoneIdFromGate, basePath);
|
|
1117
|
-
clearPendingGate(basePath);
|
|
1118
|
-
clearDeferredApprovalGate(basePath);
|
|
1119
|
-
}
|
|
1120
|
-
}
|
|
1114
|
+
const gateResult = applyAskUserQuestionsGateResult({
|
|
1115
|
+
basePath,
|
|
1116
|
+
questions,
|
|
1117
|
+
details,
|
|
1118
|
+
fallbackMilestoneId: milestoneId,
|
|
1119
|
+
});
|
|
1120
|
+
if (gateResult.status === "waiting") {
|
|
1121
|
+
resetToolCallLoopGuard();
|
|
1122
|
+
if (ctx) {
|
|
1123
|
+
await maybePauseAutoForApprovalGate(ctx, pi, true, gateResult.interrupted
|
|
1124
|
+
? "Depth confirmation was interrupted — pausing auto-mode until you respond."
|
|
1125
|
+
: "Depth confirmation is waiting for your answer — pausing auto-mode.");
|
|
1121
1126
|
}
|
|
1127
|
+
return {
|
|
1128
|
+
content: [{
|
|
1129
|
+
type: "text",
|
|
1130
|
+
text: formatPendingAskUserQuestionsGateMessage(gateResult.pendingGateId, gateResult.interrupted),
|
|
1131
|
+
}],
|
|
1132
|
+
};
|
|
1133
|
+
}
|
|
1134
|
+
if (gateResult.status === "verified") {
|
|
1135
|
+
clearDeferredApprovalGate(basePath);
|
|
1122
1136
|
}
|
|
1123
1137
|
if (details?.cancelled || !details?.response)
|
|
1124
1138
|
return;
|
|
1125
|
-
for (const question of questions) {
|
|
1126
|
-
if (typeof question.id === "string" && question.id.includes("depth_verification")) {
|
|
1127
|
-
// Only unlock the gate if the user selected the first option (confirmation).
|
|
1128
|
-
// Cross-references against the question's defined options to reject free-form "Other" text.
|
|
1129
|
-
const answer = details.response?.answers?.[question.id];
|
|
1130
|
-
const inferredMilestoneId = extractDepthVerificationMilestoneId(question.id) ?? milestoneId;
|
|
1131
|
-
if (isDepthConfirmationAnswer(answer?.selected, question.options)) {
|
|
1132
|
-
if (currentPendingGate && question.id !== currentPendingGate)
|
|
1133
|
-
break;
|
|
1134
|
-
markApprovalGateVerified(question.id, basePath);
|
|
1135
|
-
markDepthVerified(inferredMilestoneId, basePath);
|
|
1136
|
-
clearPendingGate(basePath);
|
|
1137
|
-
clearDeferredApprovalGate(basePath);
|
|
1138
|
-
}
|
|
1139
|
-
break;
|
|
1140
|
-
}
|
|
1141
|
-
}
|
|
1142
1139
|
if (!milestoneId)
|
|
1143
1140
|
return;
|
|
1144
1141
|
await saveDiscussionQuestionRound(basePath, milestoneId, questions, details);
|
|
@@ -1193,61 +1190,10 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1193
1190
|
const payload = event.payload;
|
|
1194
1191
|
if (!payload || typeof payload !== "object")
|
|
1195
1192
|
return;
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
const { createObservationMask, createResponsesInputObservationMask, truncateContextResultMessages, truncateResponsesInputResultItems, } = await import("../context-masker.js");
|
|
1201
|
-
const prefs = loadEffectiveGSDPreferences();
|
|
1202
|
-
const cmConfig = prefs?.preferences.context_management;
|
|
1203
|
-
// Observation masking: replace old tool results with placeholders.
|
|
1204
|
-
// Only active during auto-mode when context_management.observation_masking is enabled.
|
|
1205
|
-
if (isAutoActive() && cmConfig?.observation_masking !== false) {
|
|
1206
|
-
const keepTurns = cmConfig?.observation_mask_turns ?? 8;
|
|
1207
|
-
const messages = payload.messages;
|
|
1208
|
-
if (Array.isArray(messages)) {
|
|
1209
|
-
payload.messages = createObservationMask(keepTurns)(messages);
|
|
1210
|
-
}
|
|
1211
|
-
const input = payload.input;
|
|
1212
|
-
if (Array.isArray(input)) {
|
|
1213
|
-
payload.input = createResponsesInputObservationMask(keepTurns)(input);
|
|
1214
|
-
}
|
|
1215
|
-
}
|
|
1216
|
-
// Tool result truncation: cap individual tool result content length.
|
|
1217
|
-
// Applies in ALL modes (auto + interactive) to prevent context bloat.
|
|
1218
|
-
// In pi-ai format, toolResult messages have role: "toolResult" and content: TextContent[].
|
|
1219
|
-
// Creates new objects to avoid mutating shared conversation state.
|
|
1220
|
-
const maxChars = cmConfig?.tool_result_max_chars ?? 800;
|
|
1221
|
-
const msgs = payload.messages;
|
|
1222
|
-
if (Array.isArray(msgs)) {
|
|
1223
|
-
payload.messages = truncateContextResultMessages(msgs, maxChars);
|
|
1224
|
-
}
|
|
1225
|
-
const input = payload.input;
|
|
1226
|
-
if (Array.isArray(input)) {
|
|
1227
|
-
payload.input = truncateResponsesInputResultItems(input, maxChars);
|
|
1228
|
-
}
|
|
1229
|
-
}
|
|
1230
|
-
catch { /* non-fatal */ }
|
|
1231
|
-
try {
|
|
1232
|
-
if (isAutoActive()) {
|
|
1233
|
-
const sourceContextBlock = getSourceObservationStore().renderActiveBlock();
|
|
1234
|
-
if (sourceContextBlock) {
|
|
1235
|
-
const nextPayload = injectSourceContextBlockIntoPayload(payload, sourceContextBlock);
|
|
1236
|
-
Object.assign(payload, nextPayload);
|
|
1237
|
-
}
|
|
1238
|
-
}
|
|
1239
|
-
}
|
|
1240
|
-
catch { /* non-fatal */ }
|
|
1241
|
-
// ── Service Tier ────────────────────────────────────────────────────
|
|
1242
|
-
const modelId = event.model?.id;
|
|
1243
|
-
if (!modelId)
|
|
1244
|
-
return payload;
|
|
1245
|
-
const { getEffectiveServiceTier, supportsServiceTier } = await import("../service-tier.js");
|
|
1246
|
-
const tier = getEffectiveServiceTier();
|
|
1247
|
-
if (!tier || !supportsServiceTier(modelId))
|
|
1248
|
-
return payload;
|
|
1249
|
-
payload.service_tier = tier;
|
|
1250
|
-
return payload;
|
|
1193
|
+
return applyProviderPayloadPolicy({
|
|
1194
|
+
payload,
|
|
1195
|
+
modelId: event.model?.id,
|
|
1196
|
+
});
|
|
1251
1197
|
});
|
|
1252
1198
|
// Capability-aware model routing hook (ADR-004)
|
|
1253
1199
|
// Extensions can override model selection by returning { modelId: "..." }
|
|
@@ -1279,16 +1225,35 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1279
1225
|
const registeredToolNames = resolveRegisteredToolNames(pi, event.activeToolNames);
|
|
1280
1226
|
const compatibleRegisteredToolNames = filterToolsForProvider(registeredToolNames, event.selectedModelApi, event.selectedModelProvider).compatible.filter((name) => !(dropAliases && isWorkflowAliasTool(name)));
|
|
1281
1227
|
const guidedUnit = getGuidedUnitContext();
|
|
1282
|
-
const
|
|
1228
|
+
const requestRegisteredToolNames = guidedUnit?.unitType === "run-uat"
|
|
1229
|
+
? compatibleRegisteredToolNames
|
|
1230
|
+
: registeredToolNames;
|
|
1231
|
+
const requestScoped = buildRequestScopedGsdToolSet(guidedUnit?.unitType === "run-uat" ? aliasFilteredCompatible : providerCompatible, event.requestCustomMessages, requestRegisteredToolNames, guidedUnit?.unitType);
|
|
1283
1232
|
if (requestScoped) {
|
|
1233
|
+
recordAutoToolSurfaceSnapshot({
|
|
1234
|
+
source: "provider-adjustment",
|
|
1235
|
+
unitType: guidedUnit?.unitType,
|
|
1236
|
+
modelFacingToolNames: requestScoped,
|
|
1237
|
+
registeredToolNames: requestRegisteredToolNames,
|
|
1238
|
+
scopedToolNames: requestScoped,
|
|
1239
|
+
});
|
|
1284
1240
|
return { toolNames: requestScoped };
|
|
1285
1241
|
}
|
|
1286
1242
|
const dash = getAutoRuntimeSnapshot();
|
|
1287
1243
|
if (dash.active && dash.currentUnit) {
|
|
1244
|
+
const registeredForUnit = dash.currentUnit.type === "run-uat"
|
|
1245
|
+
? compatibleRegisteredToolNames
|
|
1246
|
+
: resolveRegisteredToolNames(pi, event.activeToolNames);
|
|
1247
|
+
const scopedToolNames = buildMinimalAutoGsdToolSet(dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible, dash.currentUnit.type, registeredForUnit);
|
|
1248
|
+
recordAutoToolSurfaceSnapshot({
|
|
1249
|
+
source: "provider-adjustment",
|
|
1250
|
+
unitType: dash.currentUnit.type,
|
|
1251
|
+
modelFacingToolNames: scopedToolNames,
|
|
1252
|
+
registeredToolNames: registeredForUnit,
|
|
1253
|
+
scopedToolNames,
|
|
1254
|
+
});
|
|
1288
1255
|
return {
|
|
1289
|
-
toolNames:
|
|
1290
|
-
? compatibleRegisteredToolNames
|
|
1291
|
-
: resolveRegisteredToolNames(pi, event.activeToolNames)),
|
|
1256
|
+
toolNames: scopedToolNames,
|
|
1292
1257
|
};
|
|
1293
1258
|
}
|
|
1294
1259
|
if (isGeneralGsdToolScopingRequested()) {
|