@opengsd/gsd-pi 1.2.0-dev.b1abb545 → 1.2.0-dev.ddc97c10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.js +2 -14
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/bg-shell/utilities.js +5 -2
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +122 -58
- package/dist/resources/extensions/gsd/auto/phases.js +54 -6
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +43 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +24 -26
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
- package/dist/resources/extensions/gsd/auto.js +45 -21
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +5 -15
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +398 -0
- package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
- package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
- package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
- package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
- package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +3 -3
- package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +9 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +3 -0
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +57 -8
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
- package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +3 -0
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +37 -24
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/preferences.js +14 -0
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +6 -20
- package/dist/resources/extensions/gsd/status-guards.js +56 -8
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
- package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +337 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +8 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/cli.js +9 -1
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +145 -59
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +192 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +166 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/bg-shell/utilities.ts +5 -2
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
- package/src/resources/extensions/gsd/auto/phases.ts +74 -26
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +52 -13
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +24 -29
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
- package/src/resources/extensions/gsd/auto.ts +64 -25
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +5 -16
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
- package/src/resources/extensions/gsd/db/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +490 -0
- package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
- package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
- package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
- package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
- package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +3 -3
- package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +11 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +3 -0
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +71 -31
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
- package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +3 -0
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +42 -22
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/preferences.ts +18 -0
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +9 -21
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
- package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- package/src/resources/extensions/gsd/undo.ts +9 -8
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +412 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
- package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/gsd-browser/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → McokybTayhff1xEVc-d3T}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → McokybTayhff1xEVc-d3T}/_ssgManifest.js +0 -0
|
@@ -13,7 +13,8 @@ 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 { applyAskUserQuestionsGateResult,
|
|
16
|
+
import { applyAskUserQuestionsGateResult, clearDiscussionFlowState, formatPendingAskUserQuestionsGateMessage, hostWriteGateAdapter, isApprovalGateVerifiedInSnapshot, isDepthConfirmationAnswer, isMilestoneDepthVerified, isMilestoneDepthVerifiedInSnapshot, isQueuePhaseActive, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
17
|
+
import { canonicalToolName } from "../engine-hook-contract.js";
|
|
17
18
|
import { resolveManifest } from "../unit-context-manifest.js";
|
|
18
19
|
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
19
20
|
import { loadFile, saveFile, formatContinue } from "../files.js";
|
|
@@ -39,7 +40,14 @@ import { saveActivityLog } from "../activity-log.js";
|
|
|
39
40
|
import { recordToolCall as safetyRecordToolCall, recordToolResult as safetyRecordToolResult, saveEvidenceToDisk } from "../safety/evidence-collector.js";
|
|
40
41
|
import { parseUnitId } from "../unit-id.js";
|
|
41
42
|
import { classifyCommand } from "../safety/destructive-guard.js";
|
|
43
|
+
import {
|
|
44
|
+
confirmDestructiveCommand,
|
|
45
|
+
consumeDestructiveConfirmation,
|
|
46
|
+
isDestructiveConfirmGateId,
|
|
47
|
+
requestDestructiveConfirmation,
|
|
48
|
+
} from "../safety/destructive-confirmation.js";
|
|
42
49
|
import { logWarning as safetyLogWarning } from "../workflow-logger.js";
|
|
50
|
+
import { isUnitCloseoutTool, runInteractiveUnitCloseout } from "../unit-closeout.js";
|
|
43
51
|
import { installNotifyInterceptor } from "./notify-interceptor.js";
|
|
44
52
|
import { initNotificationStore } from "../notification-store.js";
|
|
45
53
|
import { initNotificationWidget } from "../notification-widget.js";
|
|
@@ -48,27 +56,28 @@ import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
|
48
56
|
import { extractSubagentAgentClasses } from "./subagent-input.js";
|
|
49
57
|
import {
|
|
50
58
|
approvalGateIdForUnit,
|
|
59
|
+
evaluateAskUserQuestionsRound,
|
|
60
|
+
formatUnansweredConsentQuestionMessage,
|
|
51
61
|
isExplicitApprovalResponse,
|
|
52
62
|
messageHasPendingAskUserQuestionsTool,
|
|
53
|
-
|
|
54
|
-
} from "../
|
|
63
|
+
shouldPauseForQuestion,
|
|
64
|
+
} from "../consent-question.js";
|
|
55
65
|
import { resolveSkillManifest } from "../skill-manifest.js";
|
|
56
66
|
import { applyUnitSkillVisibility, unitHasSkillManifest } from "../skill-scope.js";
|
|
57
67
|
import { getGuidedUnitContext } from "../guided-unit-context.js";
|
|
58
68
|
import { registerPlanMilestoneSchemaRecovery } from "./plan-milestone-schema-recovery.js";
|
|
59
69
|
import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, canonicalWorkflowToolName, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
|
|
70
|
+
import { hasBrowserContractPrefix } from "../../shared/browser-contract.js";
|
|
60
71
|
import { filterToolsForProvider } from "../model-router.js";
|
|
61
72
|
import { mcpToolMatchesBaseName } from "../mcp-tool-name.js";
|
|
62
73
|
import { RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES } from "../tool-presentation-plan.js";
|
|
63
74
|
import { supportsSourceObservationsForUnit } from "../source-observations.js";
|
|
75
|
+
import { clearPendingAutoStart } from "../pending-auto-start.js";
|
|
76
|
+
import { resolveWorkflowToolBasePath } from "./dynamic-tools.js";
|
|
77
|
+
import { getRequiredWorkflowToolsForUnit } from "../unit-tool-contracts.js";
|
|
64
78
|
|
|
65
79
|
let approvalQuestionAbortInFlight = false;
|
|
66
80
|
|
|
67
|
-
interface DeferredApprovalGate {
|
|
68
|
-
gateId: string;
|
|
69
|
-
basePath: string;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
81
|
type WelcomeScreenModule = {
|
|
73
82
|
buildWelcomeScreenLines(opts: { version: string; remoteChannel?: string; width?: number }): string[];
|
|
74
83
|
};
|
|
@@ -139,7 +148,13 @@ async function installWelcomeHeader(ctx: ExtensionContext): Promise<void> {
|
|
|
139
148
|
}
|
|
140
149
|
}
|
|
141
150
|
|
|
142
|
-
|
|
151
|
+
/**
|
|
152
|
+
* Approval gates whose durable arming is deferred until tool execution /
|
|
153
|
+
* agent end, keyed by basePath. A Map (not a single slot) so concurrent
|
|
154
|
+
* projects in one process cannot lose each other's deferred gate; entries
|
|
155
|
+
* are bounded — cleared on activation, session boundaries, and verification.
|
|
156
|
+
*/
|
|
157
|
+
const deferredApprovalGates = new Map<string, string>();
|
|
143
158
|
|
|
144
159
|
export const MINIMAL_GSD_TOOL_NAMES = [
|
|
145
160
|
"gsd_exec",
|
|
@@ -177,7 +192,7 @@ function withPreservedShimTools(toolNames: readonly string[]): string[] {
|
|
|
177
192
|
|
|
178
193
|
/** True for the browser automation tools (browser_navigate, browser_click, ...). */
|
|
179
194
|
function isBrowserTool(toolName: string): boolean {
|
|
180
|
-
return canonicalToolName(toolName)
|
|
195
|
+
return hasBrowserContractPrefix(canonicalToolName(toolName));
|
|
181
196
|
}
|
|
182
197
|
|
|
183
198
|
/**
|
|
@@ -258,6 +273,7 @@ export function buildMinimalAutoGsdToolSet(
|
|
|
258
273
|
activeToolNames: readonly string[],
|
|
259
274
|
unitType: string | undefined,
|
|
260
275
|
registeredToolNames: readonly string[] = activeToolNames,
|
|
276
|
+
warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames,
|
|
261
277
|
): string[] {
|
|
262
278
|
if (unitType === "run-uat") {
|
|
263
279
|
return buildRunUatGsdToolSet(activeToolNames, registeredToolNames);
|
|
@@ -273,7 +289,36 @@ export function buildMinimalAutoGsdToolSet(
|
|
|
273
289
|
[...activeToolNames, ...registeredToolNames],
|
|
274
290
|
[...MINIMAL_GSD_TOOL_NAMES, ...unitTools],
|
|
275
291
|
);
|
|
276
|
-
|
|
292
|
+
const result = withPreservedShimTools([...new Set([...preserved, ...scoped])]);
|
|
293
|
+
warnIfRequiredWorkflowToolsUnresolved(unitType, result, warnOnUnresolvedRequiredTools);
|
|
294
|
+
return result;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function hasResolvedWorkflowTool(
|
|
298
|
+
resolvedToolNames: readonly string[],
|
|
299
|
+
requiredToolName: string,
|
|
300
|
+
): boolean {
|
|
301
|
+
return resolvedToolNames.some(
|
|
302
|
+
(name) => name === requiredToolName || mcpToolMatchesBaseName(name, requiredToolName),
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function warnIfRequiredWorkflowToolsUnresolved(
|
|
307
|
+
unitType: string | undefined,
|
|
308
|
+
scopedToolNames: readonly string[],
|
|
309
|
+
shouldWarn: boolean,
|
|
310
|
+
): void {
|
|
311
|
+
if (!unitType || !shouldWarn) return;
|
|
312
|
+
|
|
313
|
+
const unresolved = getRequiredWorkflowToolsForUnit(unitType).filter(
|
|
314
|
+
(toolName) => !hasResolvedWorkflowTool(scopedToolNames, toolName),
|
|
315
|
+
);
|
|
316
|
+
if (unresolved.length === 0) return;
|
|
317
|
+
|
|
318
|
+
safetyLogWarning(
|
|
319
|
+
"bootstrap",
|
|
320
|
+
`buildMinimalAutoGsdToolSet(${unitType}): required workflow tool(s) not in active/registered surface after scoping: ${unresolved.join(", ")}. Tool registration may have partially failed, provider filtering may have removed a required tool, or workflow MCP may be disconnected.`,
|
|
321
|
+
);
|
|
277
322
|
}
|
|
278
323
|
|
|
279
324
|
export function buildRunUatGsdToolSet(
|
|
@@ -326,6 +371,7 @@ export function buildRequestScopedGsdToolSet(
|
|
|
326
371
|
requestCustomMessages: readonly { customType?: string }[] | undefined,
|
|
327
372
|
registeredToolNames: readonly string[] = activeToolNames,
|
|
328
373
|
guidedUnitType?: string,
|
|
374
|
+
warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames,
|
|
329
375
|
): string[] | undefined {
|
|
330
376
|
for (let index = (requestCustomMessages?.length ?? 0) - 1; index >= 0; index--) {
|
|
331
377
|
const currentCustomType = requestCustomMessages?.[index]?.customType;
|
|
@@ -336,7 +382,12 @@ export function buildRequestScopedGsdToolSet(
|
|
|
336
382
|
currentCustomType === "gsd-triage"
|
|
337
383
|
) {
|
|
338
384
|
if (guidedUnitType) {
|
|
339
|
-
return buildMinimalAutoGsdToolSet(
|
|
385
|
+
return buildMinimalAutoGsdToolSet(
|
|
386
|
+
activeToolNames,
|
|
387
|
+
guidedUnitType,
|
|
388
|
+
registeredToolNames,
|
|
389
|
+
warnOnUnresolvedRequiredTools,
|
|
390
|
+
);
|
|
340
391
|
}
|
|
341
392
|
return buildMinimalGsdWorkflowToolSet(activeToolNames, registeredToolNames);
|
|
342
393
|
}
|
|
@@ -385,11 +436,13 @@ function applyMinimalGsdToolSurface(pi: ExtensionAPI): void {
|
|
|
385
436
|
const dash = getAutoRuntimeSnapshot();
|
|
386
437
|
if (dash.active && dash.currentUnit) {
|
|
387
438
|
const currentToolNames = pi.getActiveTools();
|
|
439
|
+
const hasRegisteredSurface = typeof pi.getAllTools === "function";
|
|
388
440
|
const registeredToolNames = resolveRegisteredToolNames(pi, currentToolNames);
|
|
389
441
|
const scopedToolNames = buildMinimalAutoGsdToolSet(
|
|
390
442
|
currentToolNames,
|
|
391
443
|
dash.currentUnit.type,
|
|
392
444
|
registeredToolNames,
|
|
445
|
+
hasRegisteredSurface,
|
|
393
446
|
);
|
|
394
447
|
recordAutoToolSurfaceSnapshot({
|
|
395
448
|
source: "runtime-scope",
|
|
@@ -411,9 +464,10 @@ export function scopeGsdWorkflowToolsForDispatch(
|
|
|
411
464
|
): ScopedGsdWorkflowState | null {
|
|
412
465
|
if (isFullGsdToolSurfaceRequested()) return null;
|
|
413
466
|
const current = pi.getActiveTools();
|
|
467
|
+
const hasRegisteredSurface = typeof pi.getAllTools === "function";
|
|
414
468
|
const registeredToolNames = resolveRegisteredToolNames(pi, current);
|
|
415
469
|
const scoped = unitType
|
|
416
|
-
? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames)
|
|
470
|
+
? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames, hasRegisteredSurface)
|
|
417
471
|
: buildMinimalGsdWorkflowToolSet(current, registeredToolNames);
|
|
418
472
|
recordAutoToolSurfaceSnapshot({
|
|
419
473
|
source: "dispatch-scope",
|
|
@@ -508,13 +562,22 @@ async function applyCompactionThresholdOverride(ctx: ExtensionContext): Promise<
|
|
|
508
562
|
}
|
|
509
563
|
|
|
510
564
|
function clearDeferredApprovalGate(basePath?: string): void {
|
|
511
|
-
if (!basePath
|
|
512
|
-
|
|
565
|
+
if (!basePath) {
|
|
566
|
+
deferredApprovalGates.clear();
|
|
567
|
+
} else {
|
|
568
|
+
deferredApprovalGates.delete(basePath);
|
|
513
569
|
}
|
|
514
570
|
}
|
|
515
571
|
|
|
516
572
|
function deferApprovalGate(gateId: string, basePath: string): void {
|
|
517
|
-
|
|
573
|
+
// Verified-on-disk wins (same adapter policy as activation/re-arm): if the
|
|
574
|
+
// workflow MCP child already verified this gate, deferring would block
|
|
575
|
+
// tools for a gate that can never legitimately arm.
|
|
576
|
+
const snapshot = hostWriteGateAdapter.readState(basePath);
|
|
577
|
+
if (isApprovalGateVerifiedInSnapshot(snapshot, gateId)) return;
|
|
578
|
+
const milestoneId = extractDepthVerificationMilestoneId(gateId);
|
|
579
|
+
if (milestoneId && isMilestoneDepthVerifiedInSnapshot(snapshot, milestoneId)) return;
|
|
580
|
+
deferredApprovalGates.set(basePath, gateId);
|
|
518
581
|
}
|
|
519
582
|
|
|
520
583
|
function contextBasePath(ctx?: { cwd?: string }): string {
|
|
@@ -571,9 +634,13 @@ function isShellExecutionTool(canonicalName: string): boolean {
|
|
|
571
634
|
}
|
|
572
635
|
|
|
573
636
|
function activateDeferredApprovalGate(basePath: string): void {
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
637
|
+
const gateId = deferredApprovalGates.get(basePath);
|
|
638
|
+
if (gateId === undefined) return;
|
|
639
|
+
deferredApprovalGates.delete(basePath);
|
|
640
|
+
// hostWriteGateAdapter.setPending applies the verified-on-disk-wins merge
|
|
641
|
+
// policy: it refuses to arm (and thereby clobber) a gate the workflow MCP
|
|
642
|
+
// child already verified on disk.
|
|
643
|
+
hostWriteGateAdapter.setPending(gateId, basePath);
|
|
577
644
|
}
|
|
578
645
|
|
|
579
646
|
function extractGateQuestionId(input: unknown): string | undefined {
|
|
@@ -584,7 +651,7 @@ function extractGateQuestionId(input: unknown): string | undefined {
|
|
|
584
651
|
|
|
585
652
|
function isApprovalGateBlocking(basePath: string): boolean {
|
|
586
653
|
return Boolean(getPendingGate(basePath))
|
|
587
|
-
|| (
|
|
654
|
+
|| deferredApprovalGates.has(basePath);
|
|
588
655
|
}
|
|
589
656
|
|
|
590
657
|
function isContextDraftSummarySave(toolName: string, input: unknown): boolean {
|
|
@@ -593,6 +660,26 @@ function isContextDraftSummarySave(toolName: string, input: unknown): boolean {
|
|
|
593
660
|
return (input as { artifact_type?: unknown }).artifact_type === "CONTEXT-DRAFT";
|
|
594
661
|
}
|
|
595
662
|
|
|
663
|
+
/**
|
|
664
|
+
* External engines (claude-code-cli) deliver ask_user_questions results as
|
|
665
|
+
* relayed MCP tool results: the structured round payload arrives in
|
|
666
|
+
* `result.structuredContent`, not in pi-native `event.details`. Without this
|
|
667
|
+
* fallback, applyAskUserQuestionsGateResult sees no response for an answered
|
|
668
|
+
* gate question and lands in the "waiting" branch — leaving a re-armed gate
|
|
669
|
+
* permanently pending and the discuss→auto handoff blocked.
|
|
670
|
+
*/
|
|
671
|
+
function resolveAskUserQuestionsGateDetails(event: { details?: unknown; result?: unknown }): any {
|
|
672
|
+
const hasRoundShape = (value: any): boolean =>
|
|
673
|
+
!!value && typeof value === "object" &&
|
|
674
|
+
(value.cancelled !== undefined || value.response !== undefined);
|
|
675
|
+
|
|
676
|
+
const details = event.details as any;
|
|
677
|
+
if (hasRoundShape(details)) return details;
|
|
678
|
+
const structured = (event.result as { structuredContent?: unknown } | undefined)?.structuredContent;
|
|
679
|
+
if (hasRoundShape(structured)) return structured;
|
|
680
|
+
return details ?? {};
|
|
681
|
+
}
|
|
682
|
+
|
|
596
683
|
type StructuredQuestion = {
|
|
597
684
|
id?: string;
|
|
598
685
|
header?: string;
|
|
@@ -709,13 +796,14 @@ function shouldBlockDeferredApprovalTool(
|
|
|
709
796
|
input: unknown,
|
|
710
797
|
basePath: string,
|
|
711
798
|
): { block: boolean; reason?: string; displayReason?: string } {
|
|
712
|
-
|
|
799
|
+
const deferredGateId = deferredApprovalGates.get(basePath);
|
|
800
|
+
if (deferredGateId === undefined) return { block: false };
|
|
713
801
|
if (toolName === "ask_user_questions") return { block: false };
|
|
714
802
|
if (isContextDraftSummarySave(toolName, input)) return { block: false };
|
|
715
803
|
return withDepthGateDisplayReason({
|
|
716
804
|
block: true,
|
|
717
805
|
reason: [
|
|
718
|
-
`HARD BLOCK: Approval question "${
|
|
806
|
+
`HARD BLOCK: Approval question "${deferredGateId}" has been shown to the user.`,
|
|
719
807
|
`Only CONTEXT-DRAFT persistence may finish in this same assistant turn.`,
|
|
720
808
|
`Wait for the user's answer before calling additional tools.`,
|
|
721
809
|
].join(" "),
|
|
@@ -802,7 +890,7 @@ export function registerHooks(
|
|
|
802
890
|
}
|
|
803
891
|
});
|
|
804
892
|
|
|
805
|
-
pi.on("session_switch", async (
|
|
893
|
+
pi.on("session_switch", async (event, ctx) => {
|
|
806
894
|
const basePath = contextBasePath(ctx);
|
|
807
895
|
const preserveCloseoutSurface = isAutoCompletionStopInProgress();
|
|
808
896
|
initSessionNotifications(ctx);
|
|
@@ -811,6 +899,13 @@ export function registerHooks(
|
|
|
811
899
|
clearDeferredApprovalGate();
|
|
812
900
|
await resetAskUserQuestionsTurnCache();
|
|
813
901
|
clearDiscussionFlowState(basePath);
|
|
902
|
+
// /clear or /new destroys the conversation holding a discuss interview, so
|
|
903
|
+
// its pending discuss→auto handoff can never be answered — clear it. Resume
|
|
904
|
+
// restores the interview transcript, so the entry survives. Auto-mode's own
|
|
905
|
+
// newSession() calls are safe: the handoff consumes the entry on agent_end.
|
|
906
|
+
if (event.reason === "new") {
|
|
907
|
+
clearPendingAutoStart(basePath);
|
|
908
|
+
}
|
|
814
909
|
await syncServiceTierStatus(ctx);
|
|
815
910
|
await applyDisabledModelProviderPolicy(ctx);
|
|
816
911
|
await applyCompactionThresholdOverride(ctx);
|
|
@@ -838,10 +933,12 @@ export function registerHooks(
|
|
|
838
933
|
const beforeAgentBasePath = contextBasePath(ctx);
|
|
839
934
|
const pendingApprovalGate = getPendingGate(beforeAgentBasePath);
|
|
840
935
|
if (pendingApprovalGate && isExplicitApprovalResponse(event.prompt, pendingApprovalGate)) {
|
|
841
|
-
|
|
936
|
+
// Host adapter explicitly: the ambient write-gate exports env-sniff the
|
|
937
|
+
// adapter per call and are reserved for the MCP child's import surface.
|
|
938
|
+
hostWriteGateAdapter.markApprovalGateVerified(pendingApprovalGate, beforeAgentBasePath);
|
|
842
939
|
const milestoneId = extractDepthVerificationMilestoneId(pendingApprovalGate);
|
|
843
|
-
if (milestoneId) markDepthVerified(milestoneId, beforeAgentBasePath);
|
|
844
|
-
|
|
940
|
+
if (milestoneId) hostWriteGateAdapter.markDepthVerified(milestoneId, beforeAgentBasePath);
|
|
941
|
+
hostWriteGateAdapter.clearPending(beforeAgentBasePath);
|
|
845
942
|
if (isAutoPaused() && !isAutoActive()) {
|
|
846
943
|
const { resumeAutoAfterProviderDelay } = await import("./provider-error-resume.js");
|
|
847
944
|
void resumeAutoAfterProviderDelay(pi, ctx).catch((err) => {
|
|
@@ -1065,7 +1162,7 @@ export function registerHooks(
|
|
|
1065
1162
|
}
|
|
1066
1163
|
}
|
|
1067
1164
|
|
|
1068
|
-
if (!
|
|
1165
|
+
if (!shouldPauseForQuestion(unitType, [event.message])) return;
|
|
1069
1166
|
|
|
1070
1167
|
const gateId = approvalGateIdForUnit(unitType, unitId);
|
|
1071
1168
|
if (gateId) {
|
|
@@ -1080,7 +1177,7 @@ export function registerHooks(
|
|
|
1080
1177
|
|
|
1081
1178
|
approvalQuestionAbortInFlight = true;
|
|
1082
1179
|
ctx.ui.notify(
|
|
1083
|
-
`${unitType}${unitId ? ` ${unitId}` : ""} is waiting for your approval - pausing before more tool calls run.`,
|
|
1180
|
+
`${unitType ?? "The discussion"}${unitId ? ` ${unitId}` : ""} is waiting for your approval - pausing before more tool calls run.`,
|
|
1084
1181
|
"info",
|
|
1085
1182
|
);
|
|
1086
1183
|
// The durable pending gate is activated at agent_end so same-turn
|
|
@@ -1108,6 +1205,13 @@ export function registerHooks(
|
|
|
1108
1205
|
}
|
|
1109
1206
|
});
|
|
1110
1207
|
|
|
1208
|
+
// Engine hook contract (../engine-hook-contract.ts): tool_call is
|
|
1209
|
+
// NATIVE_ONLY_TOOL_HOOKS — it never fires under external engines
|
|
1210
|
+
// (claude-code-cli pre-executes tools). The guards below (loop guard,
|
|
1211
|
+
// pending/deferred gate blocks, queue guard, planning-unit tools policy,
|
|
1212
|
+
// worktree write gate, STATE.md single-writer, context-write depth gate)
|
|
1213
|
+
// are therefore native-engine enforcement only. The write-gate arming
|
|
1214
|
+
// concern has a universal mirror at tool_execution_start below.
|
|
1111
1215
|
pi.on("tool_call", async (event, ctx) => {
|
|
1112
1216
|
const discussionBasePath = contextBasePath(ctx);
|
|
1113
1217
|
const toolName = canonicalToolName(event.toolName);
|
|
@@ -1295,6 +1399,11 @@ export function registerHooks(
|
|
|
1295
1399
|
});
|
|
1296
1400
|
|
|
1297
1401
|
// ── Safety harness: evidence collection + destructive command blocking ──
|
|
1402
|
+
// Engine hook contract: tool_call is NATIVE_ONLY_TOOL_HOOKS. Evidence
|
|
1403
|
+
// collection here is mirrored universally at tool_execution_start
|
|
1404
|
+
// (safetyRecordToolCall dedupes by toolCallId); the destructive-command
|
|
1405
|
+
// hard gate has NO universal mirror — blocking is impossible once an
|
|
1406
|
+
// external engine has already executed the command.
|
|
1298
1407
|
pi.on("tool_call", async (event, ctx) => {
|
|
1299
1408
|
markToolStart(event.toolCallId, event.toolName);
|
|
1300
1409
|
safetyRecordToolCall(event.toolCallId, event.toolName, event.input as Record<string, unknown>);
|
|
@@ -1314,23 +1423,39 @@ export function registerHooks(
|
|
|
1314
1423
|
|
|
1315
1424
|
// Destructive command classification + hard gate in all modes.
|
|
1316
1425
|
if (isToolCallEventType("bash", event)) {
|
|
1317
|
-
const
|
|
1426
|
+
const command = event.input.command;
|
|
1427
|
+
const classification = classifyCommand(command);
|
|
1318
1428
|
if (classification.destructive) {
|
|
1429
|
+
const guardBasePath = contextBasePath(ctx);
|
|
1430
|
+
// Escape hatch: if the user already confirmed this exact command via a
|
|
1431
|
+
// destructive_confirm gate, consume the one-shot token and let it run.
|
|
1432
|
+
// Without this, the block below loops forever — the model cannot satisfy
|
|
1433
|
+
// "confirm in the current turn" because nothing ever clears the gate.
|
|
1434
|
+
if (consumeDestructiveConfirmation(command, guardBasePath)) {
|
|
1435
|
+
safetyLogWarning("safety", `destructive command confirmed: ${classification.labels.join(", ")}`, {
|
|
1436
|
+
command: String(command).slice(0, 200),
|
|
1437
|
+
});
|
|
1438
|
+
return;
|
|
1439
|
+
}
|
|
1440
|
+
// Record the command as pending so an affirmative answer to a
|
|
1441
|
+
// destructive_confirm gate (handled in tool_result) can confirm it.
|
|
1442
|
+
requestDestructiveConfirmation(command, guardBasePath);
|
|
1319
1443
|
const reason = [
|
|
1320
1444
|
"HARD BLOCK: destructive Bash command requires explicit human confirmation.",
|
|
1321
1445
|
`Detected: ${classification.labels.join(", ")}`,
|
|
1322
|
-
"
|
|
1323
|
-
"
|
|
1446
|
+
"Call ask_user_questions with a question id containing \"destructive_confirm\"",
|
|
1447
|
+
"and a first option that affirms the action; wait for the user's response,",
|
|
1448
|
+
"then re-issue this exact command in the same turn to run it once.",
|
|
1324
1449
|
].join(" ");
|
|
1325
1450
|
safetyLogWarning("safety", `destructive command: ${classification.labels.join(", ")}`, {
|
|
1326
|
-
command: String(
|
|
1451
|
+
command: String(command).slice(0, 200),
|
|
1327
1452
|
});
|
|
1328
1453
|
if (ctx) {
|
|
1329
1454
|
await maybePauseAutoForApprovalGate(
|
|
1330
1455
|
ctx,
|
|
1331
1456
|
pi,
|
|
1332
1457
|
isAutoActive(),
|
|
1333
|
-
"
|
|
1458
|
+
"Destructive-command confirmation is waiting for your answer — pausing auto-mode.",
|
|
1334
1459
|
);
|
|
1335
1460
|
}
|
|
1336
1461
|
return { block: true, reason };
|
|
@@ -1338,6 +1463,11 @@ export function registerHooks(
|
|
|
1338
1463
|
}
|
|
1339
1464
|
});
|
|
1340
1465
|
|
|
1466
|
+
// Engine hook contract: tool_result is NATIVE_ONLY_TOOL_HOOKS — external
|
|
1467
|
+
// engines skip it. Error classification and markToolEnd are mirrored
|
|
1468
|
+
// universally at tool_execution_end; the ask_user_questions gate lifecycle
|
|
1469
|
+
// here is paired with the tool_execution_start arming path, which external
|
|
1470
|
+
// engines do reach.
|
|
1341
1471
|
pi.on("tool_result", async (event, ctx) => {
|
|
1342
1472
|
if (isAutoActive() && typeof event.toolCallId === "string") {
|
|
1343
1473
|
markToolEnd(event.toolCallId);
|
|
@@ -1368,13 +1498,27 @@ export function registerHooks(
|
|
|
1368
1498
|
} else if (isAutoActive()) {
|
|
1369
1499
|
clearToolInvocationError();
|
|
1370
1500
|
}
|
|
1501
|
+
// Interactive Closeout adapter (ADR-032): auto-mode owns closeout for its
|
|
1502
|
+
// own units; interactive completions get the durable git subset (commit +
|
|
1503
|
+
// Closeout Git Verdict) instead of silently bypassing git.isolation.
|
|
1504
|
+
if (!event.isError && !isAutoActive() && isUnitCloseoutTool(toolName)) {
|
|
1505
|
+
try {
|
|
1506
|
+
runInteractiveUnitCloseout({
|
|
1507
|
+
basePath: resolveWorkflowToolBasePath(ctx, event.input as { milestone_id?: string }),
|
|
1508
|
+
canonicalToolName: toolName,
|
|
1509
|
+
input: event.input,
|
|
1510
|
+
});
|
|
1511
|
+
} catch (err) {
|
|
1512
|
+
safetyLogWarning("engine", `interactive unit closeout failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1513
|
+
}
|
|
1514
|
+
}
|
|
1371
1515
|
if (toolName !== "ask_user_questions") return;
|
|
1372
1516
|
const basePath = contextBasePath(ctx);
|
|
1373
1517
|
const milestoneId = await getDiscussionMilestoneIdFor(basePath);
|
|
1374
1518
|
|
|
1375
|
-
const details = event
|
|
1519
|
+
const details = resolveAskUserQuestionsGateDetails(event);
|
|
1376
1520
|
|
|
1377
|
-
const questions: any[] = (event.input as any)?.questions ?? [];
|
|
1521
|
+
const questions: any[] = (event.input as any)?.questions ?? details?.questions ?? [];
|
|
1378
1522
|
const gateResult = applyAskUserQuestionsGateResult({
|
|
1379
1523
|
basePath,
|
|
1380
1524
|
questions,
|
|
@@ -1404,25 +1548,111 @@ export function registerHooks(
|
|
|
1404
1548
|
clearDeferredApprovalGate(basePath);
|
|
1405
1549
|
}
|
|
1406
1550
|
|
|
1407
|
-
|
|
1551
|
+
// ── Consent Question policy (consent-question.ts): one home for the
|
|
1552
|
+
// answer lifecycle of every ask_user_questions round. Per-question
|
|
1553
|
+
// verdicts come from the consent-verdict leaf — the same engine
|
|
1554
|
+
// applyAskUserQuestionsGateResult consumed above for gate persistence —
|
|
1555
|
+
// so empty answers on fail-closed kinds never pass as real answers (#528)
|
|
1556
|
+
// and cancellations get one unified handler.
|
|
1557
|
+
const roundOutcome = evaluateAskUserQuestionsRound(questions, details ?? {});
|
|
1558
|
+
if (roundOutcome === "cancelled") {
|
|
1559
|
+
resetToolCallLoopGuard();
|
|
1560
|
+
if (ctx) {
|
|
1561
|
+
await maybePauseAutoForApprovalGate(
|
|
1562
|
+
ctx,
|
|
1563
|
+
pi,
|
|
1564
|
+
true,
|
|
1565
|
+
"ask_user_questions was cancelled before receiving a response — pausing auto-mode until you respond.",
|
|
1566
|
+
);
|
|
1567
|
+
}
|
|
1568
|
+
return;
|
|
1569
|
+
}
|
|
1570
|
+
if (roundOutcome === "waiting") {
|
|
1571
|
+
resetToolCallLoopGuard();
|
|
1572
|
+
if (ctx) {
|
|
1573
|
+
await maybePauseAutoForApprovalGate(
|
|
1574
|
+
ctx,
|
|
1575
|
+
pi,
|
|
1576
|
+
true,
|
|
1577
|
+
"A user question received no answer — pausing auto-mode until you respond.",
|
|
1578
|
+
);
|
|
1579
|
+
}
|
|
1580
|
+
return {
|
|
1581
|
+
content: [{
|
|
1582
|
+
type: "text" as const,
|
|
1583
|
+
text: formatUnansweredConsentQuestionMessage(questions),
|
|
1584
|
+
}],
|
|
1585
|
+
};
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1588
|
+
// Cancelled rounds already returned via roundOutcome === "cancelled".
|
|
1589
|
+
if (!details?.response) return;
|
|
1590
|
+
|
|
1591
|
+
// Destructive-command confirmation: an affirmative answer to a
|
|
1592
|
+
// destructive_confirm gate promotes the pending blocked command to a
|
|
1593
|
+
// one-shot confirmed token, which the bash tool_call guard consumes on the
|
|
1594
|
+
// next attempt. Rejecting/declining leaves the command blocked.
|
|
1595
|
+
// (Depth-verification gate handling now lives in
|
|
1596
|
+
// applyAskUserQuestionsGateResult above; only the destructive-confirm gate
|
|
1597
|
+
// is handled inline here.)
|
|
1598
|
+
for (const question of questions) {
|
|
1599
|
+
if (isDestructiveConfirmGateId(question?.id)) {
|
|
1600
|
+
const answer = details.response?.answers?.[question.id];
|
|
1601
|
+
if (isDepthConfirmationAnswer(answer?.selected, question.options)) {
|
|
1602
|
+
confirmDestructiveCommand(basePath);
|
|
1603
|
+
}
|
|
1604
|
+
break;
|
|
1605
|
+
}
|
|
1606
|
+
}
|
|
1607
|
+
|
|
1408
1608
|
if (!milestoneId) return;
|
|
1409
1609
|
await saveDiscussionQuestionRound(basePath, milestoneId, questions, details);
|
|
1410
1610
|
});
|
|
1411
1611
|
|
|
1612
|
+
// Engine hook contract: tool_execution_start is UNIVERSAL_TOOL_HOOKS — the
|
|
1613
|
+
// only pre-execution event that fires for every tool call on every engine.
|
|
1614
|
+
// Universal mirrors live here: write-gate arming and evidence collection.
|
|
1412
1615
|
pi.on("tool_execution_start", async (event, ctx) => {
|
|
1413
1616
|
const basePath = contextBasePath(ctx);
|
|
1414
1617
|
const toolName = canonicalToolName(event.toolName);
|
|
1415
1618
|
if (toolName === "ask_user_questions") {
|
|
1416
1619
|
const questionId = extractGateQuestionId(event.args);
|
|
1417
1620
|
if (typeof questionId === "string") {
|
|
1418
|
-
|
|
1621
|
+
// External engines (claude-code-cli) ingest the SDK turn's tool blocks
|
|
1622
|
+
// post-hoc, so this event can fire AFTER the workflow MCP child already
|
|
1623
|
+
// verified this gate and allowed the CONTEXT save. Arming also revokes
|
|
1624
|
+
// verifiedDepthMilestones/verifiedApprovalGates, so an unconditional
|
|
1625
|
+
// re-arm here would wipe the child's verification and leave the
|
|
1626
|
+
// discuss→auto handoff permanently blocked. hostWriteGateAdapter
|
|
1627
|
+
// .setPending applies the verified-on-disk-wins policy and skips the
|
|
1628
|
+
// re-arm in that case. Stale verified state cannot leak into a later
|
|
1629
|
+
// re-discussion: a successful handoff deletes the snapshot via
|
|
1630
|
+
// clearDiscussionFlowState.
|
|
1631
|
+
hostWriteGateAdapter.setPending(questionId, basePath);
|
|
1419
1632
|
clearDeferredApprovalGate(basePath);
|
|
1420
1633
|
}
|
|
1421
1634
|
}
|
|
1635
|
+
|
|
1636
|
+
// Safety harness: record evidence here, not only in tool_call — see
|
|
1637
|
+
// ../engine-hook-contract.ts for why tool_call never fires under external
|
|
1638
|
+
// engines. recordToolCall dedupes by toolCallId, so native tools (which
|
|
1639
|
+
// hit both events) record once.
|
|
1640
|
+
safetyRecordToolCall(event.toolCallId, event.toolName, (event.args ?? {}) as Record<string, unknown>);
|
|
1641
|
+
const execDash = getAutoRuntimeSnapshot();
|
|
1642
|
+
if (execDash.basePath && execDash.currentUnit?.type === "execute-task") {
|
|
1643
|
+
const { milestone: xMid, slice: xSid, task: xTid } = parseUnitId(execDash.currentUnit.id);
|
|
1644
|
+
if (xMid && xSid && xTid) {
|
|
1645
|
+
saveEvidenceToDisk(execDash.basePath, xMid, xSid, xTid);
|
|
1646
|
+
}
|
|
1647
|
+
}
|
|
1648
|
+
|
|
1422
1649
|
if (!isAutoActive()) return;
|
|
1423
1650
|
markToolStart(event.toolCallId, event.toolName);
|
|
1424
1651
|
});
|
|
1425
1652
|
|
|
1653
|
+
// Engine hook contract: tool_execution_end is UNIVERSAL_TOOL_HOOKS — fires
|
|
1654
|
+
// for every finalized tool call on every engine, so error classification
|
|
1655
|
+
// and evidence persistence here cover external engines that skip tool_result.
|
|
1426
1656
|
pi.on("tool_execution_end", async (event) => {
|
|
1427
1657
|
markToolEnd(event.toolCallId);
|
|
1428
1658
|
// #2883/#4974: Capture deterministic invocation/policy errors
|
|
@@ -1499,6 +1729,7 @@ export function registerHooks(
|
|
|
1499
1729
|
return surfaceReduced ? { toolNames: providerCompatible } : undefined;
|
|
1500
1730
|
}
|
|
1501
1731
|
const registeredToolNames = resolveRegisteredToolNames(pi, event.activeToolNames);
|
|
1732
|
+
const hasRegisteredSurface = typeof pi.getAllTools === "function";
|
|
1502
1733
|
const compatibleRegisteredToolNames = filterToolsForProvider(
|
|
1503
1734
|
registeredToolNames,
|
|
1504
1735
|
event.selectedModelApi,
|
|
@@ -1513,6 +1744,7 @@ export function registerHooks(
|
|
|
1513
1744
|
event.requestCustomMessages,
|
|
1514
1745
|
requestRegisteredToolNames,
|
|
1515
1746
|
guidedUnit?.unitType,
|
|
1747
|
+
hasRegisteredSurface,
|
|
1516
1748
|
);
|
|
1517
1749
|
if (requestScoped) {
|
|
1518
1750
|
recordAutoToolSurfaceSnapshot({
|
|
@@ -1533,6 +1765,7 @@ export function registerHooks(
|
|
|
1533
1765
|
dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible,
|
|
1534
1766
|
dash.currentUnit.type,
|
|
1535
1767
|
registeredForUnit,
|
|
1768
|
+
hasRegisteredSurface,
|
|
1536
1769
|
);
|
|
1537
1770
|
recordAutoToolSurfaceSnapshot({
|
|
1538
1771
|
source: "provider-adjustment",
|