@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.8e6112e9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/cli.js +2 -19
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/help-text.js +5 -0
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +123 -20
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/ask-user-questions.js +81 -25
- 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 +546 -426
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +256 -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/closeout.js +215 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +80 -56
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +310 -78
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2299
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
- package/dist/resources/extensions/gsd/auto/session.js +6 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +56 -63
- package/dist/resources/extensions/gsd/auto-model-selection.js +44 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +47 -17
- package/dist/resources/extensions/gsd/auto-prompts.js +161 -26
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
- package/dist/resources/extensions/gsd/auto-start.js +59 -52
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +14 -47
- package/dist/resources/extensions/gsd/auto-verification.js +30 -37
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +68 -370
- package/dist/resources/extensions/gsd/auto.js +71 -29
- 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/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +74 -50
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +316 -161
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +365 -58
- 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-consistency-gate.js +21 -4
- 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/codebase-generator.js +8 -4
- 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/auto.js +3 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +66 -3
- 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-mcp-status.js +2 -2
- 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/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
- package/dist/resources/extensions/gsd/db/engine.js +757 -0
- package/dist/resources/extensions/gsd/db/queries.js +428 -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/db-workspace.js +103 -0
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- 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/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +261 -136
- 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/doctor.js +16 -9
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +10 -1
- 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-conflict-state.js +16 -1
- 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 +186 -2048
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +174 -473
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/markdown-renderer.js +12 -1
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +4 -20
- package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/memory-relations.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +22 -11
- package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
- package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
- package/dist/resources/extensions/gsd/milestone-closeout.js +97 -28
- 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-reopen-events.js +3 -5
- 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/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/notifications.js +12 -7
- package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
- 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/parallel-orchestrator.js +3 -2
- 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-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/preferences.js +161 -29
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +5 -4
- package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -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 +3 -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 +9 -5
- package/dist/resources/extensions/gsd/prompts/system.md +6 -3
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
- 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/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/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/roadmap-slices.js +33 -5
- 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/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +24 -26
- 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/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 +66 -11
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +17 -36
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
- package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -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 +65 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- 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 +41 -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/validate-milestone.js +15 -78
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +57 -25
- package/dist/resources/extensions/gsd/uat-run.js +9 -14
- 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 +114 -21
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +367 -0
- package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- 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 +117 -0
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
- package/dist/resources/extensions/gsd/workflow-reconcile.js +25 -59
- 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-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
- 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 +36 -31
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- 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/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
- package/dist/resources/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +40 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +4 -4
- 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.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 +4 -4
- 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/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.e0bdc932325d7e03.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-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/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +4 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/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/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -4
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/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/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +58 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +113 -40
- 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-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/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -50
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +452 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts +10 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +12 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts +49 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +209 -103
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/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 +183 -76
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +193 -112
- 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/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/index.d.ts +1 -1
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +1 -1
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/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/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +72 -18
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/ask-user-questions.ts +94 -26
- 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 +651 -483
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +940 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +324 -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/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
- package/src/resources/extensions/gsd/auto/loop.ts +89 -61
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +350 -81
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -2981
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
- package/src/resources/extensions/gsd/auto/session.ts +7 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +68 -68
- package/src/resources/extensions/gsd/auto-model-selection.ts +49 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +56 -16
- package/src/resources/extensions/gsd/auto-prompts.ts +225 -44
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
- package/src/resources/extensions/gsd/auto-start.ts +65 -53
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +21 -49
- package/src/resources/extensions/gsd/auto-verification.ts +33 -36
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +83 -386
- package/src/resources/extensions/gsd/auto.ts +99 -34
- 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/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +93 -49
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +375 -177
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +452 -58
- 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-consistency-gate.ts +27 -5
- 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/codebase-generator.ts +9 -5
- 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/auto.ts +3 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +64 -3
- 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-mcp-status.ts +2 -2
- 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/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
- package/src/resources/extensions/gsd/db/engine.ts +811 -0
- package/src/resources/extensions/gsd/db/queries.ts +519 -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/db-workspace.ts +170 -0
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- 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/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +272 -155
- 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/doctor.ts +15 -5
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +12 -1
- 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-conflict-state.ts +17 -1
- 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 +190 -2375
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +240 -585
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/markdown-renderer.ts +13 -1
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +4 -24
- package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/memory-relations.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +20 -9
- package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
- package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
- package/src/resources/extensions/gsd/milestone-closeout.ts +121 -28
- 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-reopen-events.ts +3 -6
- 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/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/notifications.ts +13 -6
- package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
- 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/parallel-orchestrator.ts +6 -2
- 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-diagnostics.ts +98 -0
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +191 -28
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +5 -4
- package/src/resources/extensions/gsd/prompts/execute-task.md +5 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -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 +3 -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 +9 -5
- package/src/resources/extensions/gsd/prompts/system.md +6 -3
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
- 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/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/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/roadmap-slices.ts +36 -5
- 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/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +31 -27
- 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/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/ask-user-questions-render.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +649 -26
- 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-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +395 -30
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -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-runtime-state.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/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/canonical-milestone-root.test.ts +20 -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/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 +46 -8
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/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/execute-task-rendering.test.ts +1 -0
- 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/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/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 +18 -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 +89 -59
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- 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 +217 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +120 -4
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- 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-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/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/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/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -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/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 +56 -2
- 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/provider-errors.test.ts +11 -4
- package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -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 +342 -1
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +51 -2
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -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 +300 -41
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +9 -4
- 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-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -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 -6
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +114 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +193 -13
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +75 -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 +24 -2
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +188 -1
- package/src/resources/extensions/gsd/tool-contract.ts +124 -11
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +18 -35
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
- package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -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 +90 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- 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 +45 -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/validate-milestone.ts +25 -84
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +80 -25
- package/src/resources/extensions/gsd/uat-run.ts +10 -14
- 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 +196 -21
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +442 -0
- package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- 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 +144 -0
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
- package/src/resources/extensions/gsd/workflow-reconcile.ts +32 -65
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +76 -0
- package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +20 -25
- package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
- 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 +49 -44
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- 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/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
- package/src/resources/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -195
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- 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/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -88
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -198
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → pZbHa49xI-knmKlphIRq0}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → pZbHa49xI-knmKlphIRq0}/_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 {
|
|
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";
|
|
@@ -25,10 +26,13 @@ import {
|
|
|
25
26
|
isAutoActive,
|
|
26
27
|
isAutoCompletionStopInProgress,
|
|
27
28
|
isAutoPaused,
|
|
29
|
+
isInteractiveElicitationInFlight,
|
|
28
30
|
markToolEnd,
|
|
29
31
|
markToolStart,
|
|
32
|
+
recordAutoToolSurfaceSnapshot,
|
|
30
33
|
recordToolInvocationError,
|
|
31
34
|
} from "../auto-runtime-state.js";
|
|
35
|
+
import { applyProviderPayloadPolicy } from "../provider-payload-policy.js";
|
|
32
36
|
|
|
33
37
|
import { checkToolCallLoop, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
|
|
34
38
|
import { maybePauseAutoForApprovalGate, resetPendingGatePauseGuard } from "./pending-gate-pause.js";
|
|
@@ -36,29 +40,44 @@ import { saveActivityLog } from "../activity-log.js";
|
|
|
36
40
|
import { recordToolCall as safetyRecordToolCall, recordToolResult as safetyRecordToolResult, saveEvidenceToDisk } from "../safety/evidence-collector.js";
|
|
37
41
|
import { parseUnitId } from "../unit-id.js";
|
|
38
42
|
import { classifyCommand } from "../safety/destructive-guard.js";
|
|
43
|
+
import {
|
|
44
|
+
confirmDestructiveCommand,
|
|
45
|
+
consumeDestructiveConfirmation,
|
|
46
|
+
isDestructiveConfirmGateId,
|
|
47
|
+
requestDestructiveConfirmation,
|
|
48
|
+
} from "../safety/destructive-confirmation.js";
|
|
39
49
|
import { logWarning as safetyLogWarning } from "../workflow-logger.js";
|
|
50
|
+
import { isUnitCloseoutTool, runInteractiveUnitCloseout } from "../unit-closeout.js";
|
|
40
51
|
import { installNotifyInterceptor } from "./notify-interceptor.js";
|
|
41
52
|
import { initNotificationStore } from "../notification-store.js";
|
|
42
53
|
import { initNotificationWidget } from "../notification-widget.js";
|
|
54
|
+
import { notifyPreferenceDiagnostics } from "../preferences-diagnostics.js";
|
|
43
55
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
44
56
|
import { extractSubagentAgentClasses } from "./subagent-input.js";
|
|
45
|
-
import {
|
|
57
|
+
import {
|
|
58
|
+
approvalGateIdForUnit,
|
|
59
|
+
evaluateAskUserQuestionsRound,
|
|
60
|
+
formatUnansweredConsentQuestionMessage,
|
|
61
|
+
isExplicitApprovalResponse,
|
|
62
|
+
messageHasPendingAskUserQuestionsTool,
|
|
63
|
+
shouldPauseForQuestion,
|
|
64
|
+
} from "../consent-question.js";
|
|
46
65
|
import { resolveSkillManifest } from "../skill-manifest.js";
|
|
47
66
|
import { applyUnitSkillVisibility, unitHasSkillManifest } from "../skill-scope.js";
|
|
48
67
|
import { getGuidedUnitContext } from "../guided-unit-context.js";
|
|
49
68
|
import { registerPlanMilestoneSchemaRecovery } from "./plan-milestone-schema-recovery.js";
|
|
50
|
-
import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
|
|
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";
|
|
51
71
|
import { filterToolsForProvider } from "../model-router.js";
|
|
72
|
+
import { mcpToolMatchesBaseName } from "../mcp-tool-name.js";
|
|
52
73
|
import { RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES } from "../tool-presentation-plan.js";
|
|
53
|
-
import {
|
|
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";
|
|
54
78
|
|
|
55
79
|
let approvalQuestionAbortInFlight = false;
|
|
56
80
|
|
|
57
|
-
interface DeferredApprovalGate {
|
|
58
|
-
gateId: string;
|
|
59
|
-
basePath: string;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
81
|
type WelcomeScreenModule = {
|
|
63
82
|
buildWelcomeScreenLines(opts: { version: string; remoteChannel?: string; width?: number }): string[];
|
|
64
83
|
};
|
|
@@ -129,7 +148,13 @@ async function installWelcomeHeader(ctx: ExtensionContext): Promise<void> {
|
|
|
129
148
|
}
|
|
130
149
|
}
|
|
131
150
|
|
|
132
|
-
|
|
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>();
|
|
133
158
|
|
|
134
159
|
export const MINIMAL_GSD_TOOL_NAMES = [
|
|
135
160
|
"gsd_exec",
|
|
@@ -167,7 +192,7 @@ function withPreservedShimTools(toolNames: readonly string[]): string[] {
|
|
|
167
192
|
|
|
168
193
|
/** True for the browser automation tools (browser_navigate, browser_click, ...). */
|
|
169
194
|
function isBrowserTool(toolName: string): boolean {
|
|
170
|
-
return canonicalToolName(toolName)
|
|
195
|
+
return hasBrowserContractPrefix(canonicalToolName(toolName));
|
|
171
196
|
}
|
|
172
197
|
|
|
173
198
|
/**
|
|
@@ -210,16 +235,22 @@ function resolveScopedToolNames(
|
|
|
210
235
|
|
|
211
236
|
for (const requested of requestedToolNames) {
|
|
212
237
|
const scopedMatches: string[] = [];
|
|
238
|
+
const aliasFallbacks: string[] = [];
|
|
213
239
|
|
|
214
240
|
for (const activeName of activeToolNames) {
|
|
215
|
-
if (
|
|
216
|
-
const toolSeparator = activeName.indexOf("__", "mcp__".length);
|
|
217
|
-
if (toolSeparator < 0) continue;
|
|
218
|
-
if (activeName.slice(toolSeparator + 2) === requested) {
|
|
241
|
+
if (mcpToolMatchesBaseName(activeName, requested)) {
|
|
219
242
|
scopedMatches.push(activeName);
|
|
243
|
+
} else if (isWorkflowAliasTool(activeName) && canonicalWorkflowToolName(activeName) === requested) {
|
|
244
|
+
aliasFallbacks.push(activeName);
|
|
220
245
|
}
|
|
221
246
|
}
|
|
222
247
|
|
|
248
|
+
// Only use alias as fallback when canonical is absent — not directly and not via MCP scoping.
|
|
249
|
+
// Prevents the alias from resurfacing alongside the canonical when both are in the active set.
|
|
250
|
+
if (!exact.has(requested) && scopedMatches.length === 0) {
|
|
251
|
+
scopedMatches.push(...aliasFallbacks);
|
|
252
|
+
}
|
|
253
|
+
|
|
223
254
|
if (requested.startsWith("browser_") && scopedMatches.length > 0) {
|
|
224
255
|
for (const match of scopedMatches) resolved.add(match);
|
|
225
256
|
continue;
|
|
@@ -242,6 +273,7 @@ export function buildMinimalAutoGsdToolSet(
|
|
|
242
273
|
activeToolNames: readonly string[],
|
|
243
274
|
unitType: string | undefined,
|
|
244
275
|
registeredToolNames: readonly string[] = activeToolNames,
|
|
276
|
+
warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames,
|
|
245
277
|
): string[] {
|
|
246
278
|
if (unitType === "run-uat") {
|
|
247
279
|
return buildRunUatGsdToolSet(activeToolNames, registeredToolNames);
|
|
@@ -257,7 +289,36 @@ export function buildMinimalAutoGsdToolSet(
|
|
|
257
289
|
[...activeToolNames, ...registeredToolNames],
|
|
258
290
|
[...MINIMAL_GSD_TOOL_NAMES, ...unitTools],
|
|
259
291
|
);
|
|
260
|
-
|
|
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
|
+
);
|
|
261
322
|
}
|
|
262
323
|
|
|
263
324
|
export function buildRunUatGsdToolSet(
|
|
@@ -276,7 +337,7 @@ export function buildRunUatGsdToolSet(
|
|
|
276
337
|
const resolved = [...new Set(scoped)];
|
|
277
338
|
|
|
278
339
|
const unresolved = RUN_UAT_WORKFLOW_TOOL_NAMES.filter(
|
|
279
|
-
(tool) => !resolved.some((name) => name === tool || (name
|
|
340
|
+
(tool) => !resolved.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)),
|
|
280
341
|
);
|
|
281
342
|
if (unresolved.length > 0) {
|
|
282
343
|
safetyLogWarning(
|
|
@@ -310,6 +371,7 @@ export function buildRequestScopedGsdToolSet(
|
|
|
310
371
|
requestCustomMessages: readonly { customType?: string }[] | undefined,
|
|
311
372
|
registeredToolNames: readonly string[] = activeToolNames,
|
|
312
373
|
guidedUnitType?: string,
|
|
374
|
+
warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames,
|
|
313
375
|
): string[] | undefined {
|
|
314
376
|
for (let index = (requestCustomMessages?.length ?? 0) - 1; index >= 0; index--) {
|
|
315
377
|
const currentCustomType = requestCustomMessages?.[index]?.customType;
|
|
@@ -320,7 +382,12 @@ export function buildRequestScopedGsdToolSet(
|
|
|
320
382
|
currentCustomType === "gsd-triage"
|
|
321
383
|
) {
|
|
322
384
|
if (guidedUnitType) {
|
|
323
|
-
return buildMinimalAutoGsdToolSet(
|
|
385
|
+
return buildMinimalAutoGsdToolSet(
|
|
386
|
+
activeToolNames,
|
|
387
|
+
guidedUnitType,
|
|
388
|
+
registeredToolNames,
|
|
389
|
+
warnOnUnresolvedRequiredTools,
|
|
390
|
+
);
|
|
324
391
|
}
|
|
325
392
|
return buildMinimalGsdWorkflowToolSet(activeToolNames, registeredToolNames);
|
|
326
393
|
}
|
|
@@ -368,11 +435,23 @@ function applyMinimalGsdToolSurface(pi: ExtensionAPI): void {
|
|
|
368
435
|
if (isFullGsdToolSurfaceRequested()) return;
|
|
369
436
|
const dash = getAutoRuntimeSnapshot();
|
|
370
437
|
if (dash.active && dash.currentUnit) {
|
|
371
|
-
pi.
|
|
372
|
-
|
|
438
|
+
const currentToolNames = pi.getActiveTools();
|
|
439
|
+
const hasRegisteredSurface = typeof pi.getAllTools === "function";
|
|
440
|
+
const registeredToolNames = resolveRegisteredToolNames(pi, currentToolNames);
|
|
441
|
+
const scopedToolNames = buildMinimalAutoGsdToolSet(
|
|
442
|
+
currentToolNames,
|
|
373
443
|
dash.currentUnit.type,
|
|
374
|
-
|
|
375
|
-
|
|
444
|
+
registeredToolNames,
|
|
445
|
+
hasRegisteredSurface,
|
|
446
|
+
);
|
|
447
|
+
recordAutoToolSurfaceSnapshot({
|
|
448
|
+
source: "runtime-scope",
|
|
449
|
+
unitType: dash.currentUnit.type,
|
|
450
|
+
modelFacingToolNames: scopedToolNames,
|
|
451
|
+
registeredToolNames,
|
|
452
|
+
scopedToolNames,
|
|
453
|
+
});
|
|
454
|
+
pi.setActiveTools(scopedToolNames);
|
|
376
455
|
return;
|
|
377
456
|
}
|
|
378
457
|
if (!isGeneralGsdToolScopingRequested()) return;
|
|
@@ -385,10 +464,18 @@ export function scopeGsdWorkflowToolsForDispatch(
|
|
|
385
464
|
): ScopedGsdWorkflowState | null {
|
|
386
465
|
if (isFullGsdToolSurfaceRequested()) return null;
|
|
387
466
|
const current = pi.getActiveTools();
|
|
467
|
+
const hasRegisteredSurface = typeof pi.getAllTools === "function";
|
|
388
468
|
const registeredToolNames = resolveRegisteredToolNames(pi, current);
|
|
389
469
|
const scoped = unitType
|
|
390
|
-
? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames)
|
|
470
|
+
? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames, hasRegisteredSurface)
|
|
391
471
|
: buildMinimalGsdWorkflowToolSet(current, registeredToolNames);
|
|
472
|
+
recordAutoToolSurfaceSnapshot({
|
|
473
|
+
source: "dispatch-scope",
|
|
474
|
+
unitType,
|
|
475
|
+
modelFacingToolNames: scoped,
|
|
476
|
+
registeredToolNames,
|
|
477
|
+
scopedToolNames: scoped,
|
|
478
|
+
});
|
|
392
479
|
const toolsChanged = !(scoped.length === current.length && scoped.every((name, index) => name === current[index]));
|
|
393
480
|
const canScopeSkills = unitHasSkillManifest(unitType) && pi.getVisibleSkills && pi.setVisibleSkills;
|
|
394
481
|
if (!toolsChanged && !canScopeSkills) {
|
|
@@ -475,13 +562,22 @@ async function applyCompactionThresholdOverride(ctx: ExtensionContext): Promise<
|
|
|
475
562
|
}
|
|
476
563
|
|
|
477
564
|
function clearDeferredApprovalGate(basePath?: string): void {
|
|
478
|
-
if (!basePath
|
|
479
|
-
|
|
565
|
+
if (!basePath) {
|
|
566
|
+
deferredApprovalGates.clear();
|
|
567
|
+
} else {
|
|
568
|
+
deferredApprovalGates.delete(basePath);
|
|
480
569
|
}
|
|
481
570
|
}
|
|
482
571
|
|
|
483
572
|
function deferApprovalGate(gateId: string, basePath: string): void {
|
|
484
|
-
|
|
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);
|
|
485
581
|
}
|
|
486
582
|
|
|
487
583
|
function contextBasePath(ctx?: { cwd?: string }): string {
|
|
@@ -538,9 +634,13 @@ function isShellExecutionTool(canonicalName: string): boolean {
|
|
|
538
634
|
}
|
|
539
635
|
|
|
540
636
|
function activateDeferredApprovalGate(basePath: string): void {
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
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);
|
|
544
644
|
}
|
|
545
645
|
|
|
546
646
|
function extractGateQuestionId(input: unknown): string | undefined {
|
|
@@ -551,7 +651,7 @@ function extractGateQuestionId(input: unknown): string | undefined {
|
|
|
551
651
|
|
|
552
652
|
function isApprovalGateBlocking(basePath: string): boolean {
|
|
553
653
|
return Boolean(getPendingGate(basePath))
|
|
554
|
-
|| (
|
|
654
|
+
|| deferredApprovalGates.has(basePath);
|
|
555
655
|
}
|
|
556
656
|
|
|
557
657
|
function isContextDraftSummarySave(toolName: string, input: unknown): boolean {
|
|
@@ -560,6 +660,26 @@ function isContextDraftSummarySave(toolName: string, input: unknown): boolean {
|
|
|
560
660
|
return (input as { artifact_type?: unknown }).artifact_type === "CONTEXT-DRAFT";
|
|
561
661
|
}
|
|
562
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
|
+
|
|
563
683
|
type StructuredQuestion = {
|
|
564
684
|
id?: string;
|
|
565
685
|
header?: string;
|
|
@@ -676,13 +796,14 @@ function shouldBlockDeferredApprovalTool(
|
|
|
676
796
|
input: unknown,
|
|
677
797
|
basePath: string,
|
|
678
798
|
): { block: boolean; reason?: string; displayReason?: string } {
|
|
679
|
-
|
|
799
|
+
const deferredGateId = deferredApprovalGates.get(basePath);
|
|
800
|
+
if (deferredGateId === undefined) return { block: false };
|
|
680
801
|
if (toolName === "ask_user_questions") return { block: false };
|
|
681
802
|
if (isContextDraftSummarySave(toolName, input)) return { block: false };
|
|
682
803
|
return withDepthGateDisplayReason({
|
|
683
804
|
block: true,
|
|
684
805
|
reason: [
|
|
685
|
-
`HARD BLOCK: Approval question "${
|
|
806
|
+
`HARD BLOCK: Approval question "${deferredGateId}" has been shown to the user.`,
|
|
686
807
|
`Only CONTEXT-DRAFT persistence may finish in this same assistant turn.`,
|
|
687
808
|
`Wait for the user's answer before calling additional tools.`,
|
|
688
809
|
].join(" "),
|
|
@@ -697,6 +818,7 @@ function initSessionNotifications(ctx: ExtensionContext): void {
|
|
|
697
818
|
initNotificationStore(resolveNotificationStoreBasePath(contextBasePath(ctx)));
|
|
698
819
|
installNotifyInterceptor(ctx);
|
|
699
820
|
initNotificationWidget(ctx);
|
|
821
|
+
notifyPreferenceDiagnostics(ctx, contextBasePath(ctx), { surface: "session-start" });
|
|
700
822
|
}
|
|
701
823
|
|
|
702
824
|
async function prepareWorkflowMcpForHookContext(
|
|
@@ -768,7 +890,7 @@ export function registerHooks(
|
|
|
768
890
|
}
|
|
769
891
|
});
|
|
770
892
|
|
|
771
|
-
pi.on("session_switch", async (
|
|
893
|
+
pi.on("session_switch", async (event, ctx) => {
|
|
772
894
|
const basePath = contextBasePath(ctx);
|
|
773
895
|
const preserveCloseoutSurface = isAutoCompletionStopInProgress();
|
|
774
896
|
initSessionNotifications(ctx);
|
|
@@ -777,6 +899,13 @@ export function registerHooks(
|
|
|
777
899
|
clearDeferredApprovalGate();
|
|
778
900
|
await resetAskUserQuestionsTurnCache();
|
|
779
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
|
+
}
|
|
780
909
|
await syncServiceTierStatus(ctx);
|
|
781
910
|
await applyDisabledModelProviderPolicy(ctx);
|
|
782
911
|
await applyCompactionThresholdOverride(ctx);
|
|
@@ -804,10 +933,12 @@ export function registerHooks(
|
|
|
804
933
|
const beforeAgentBasePath = contextBasePath(ctx);
|
|
805
934
|
const pendingApprovalGate = getPendingGate(beforeAgentBasePath);
|
|
806
935
|
if (pendingApprovalGate && isExplicitApprovalResponse(event.prompt, pendingApprovalGate)) {
|
|
807
|
-
|
|
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);
|
|
808
939
|
const milestoneId = extractDepthVerificationMilestoneId(pendingApprovalGate);
|
|
809
|
-
if (milestoneId) markDepthVerified(milestoneId, beforeAgentBasePath);
|
|
810
|
-
|
|
940
|
+
if (milestoneId) hostWriteGateAdapter.markDepthVerified(milestoneId, beforeAgentBasePath);
|
|
941
|
+
hostWriteGateAdapter.clearPending(beforeAgentBasePath);
|
|
811
942
|
if (isAutoPaused() && !isAutoActive()) {
|
|
812
943
|
const { resumeAutoAfterProviderDelay } = await import("./provider-error-resume.js");
|
|
813
944
|
void resumeAutoAfterProviderDelay(pi, ctx).catch((err) => {
|
|
@@ -994,6 +1125,18 @@ export function registerHooks(
|
|
|
994
1125
|
|
|
995
1126
|
pi.on("message_update", async (event, ctx: ExtensionContext) => {
|
|
996
1127
|
if (approvalQuestionAbortInFlight) return;
|
|
1128
|
+
// If the model asked via ask_user_questions, that in-flight elicitation IS
|
|
1129
|
+
// the human boundary. Arming the pause/gate here (and emitting the "waiting
|
|
1130
|
+
// for your approval - pausing" notice) would tear it down and trigger the
|
|
1131
|
+
// foreground self-cancel/re-ask loop. The marker is set only by the
|
|
1132
|
+
// claude-code-cli SDK elicitation handler and is ungated, so it is true in
|
|
1133
|
+
// foreground; under the native-TUI provider it is always false and this path
|
|
1134
|
+
// runs unchanged (#cc-elicitation-self-cancel).
|
|
1135
|
+
if (isInteractiveElicitationInFlight()) return;
|
|
1136
|
+
// Prose with "?" can stream before the MCP tool/elicitation starts. When the
|
|
1137
|
+
// structured ask_user_questions call is already in the partial message, the
|
|
1138
|
+
// tool IS the human boundary — do not arm the text-based approval pause.
|
|
1139
|
+
if (messageHasPendingAskUserQuestionsTool(event.message)) return;
|
|
997
1140
|
|
|
998
1141
|
const dash = getAutoRuntimeSnapshot();
|
|
999
1142
|
if (dash.active) return;
|
|
@@ -1019,7 +1162,7 @@ export function registerHooks(
|
|
|
1019
1162
|
}
|
|
1020
1163
|
}
|
|
1021
1164
|
|
|
1022
|
-
if (!
|
|
1165
|
+
if (!shouldPauseForQuestion(unitType, [event.message])) return;
|
|
1023
1166
|
|
|
1024
1167
|
const gateId = approvalGateIdForUnit(unitType, unitId);
|
|
1025
1168
|
if (gateId) {
|
|
@@ -1034,7 +1177,7 @@ export function registerHooks(
|
|
|
1034
1177
|
|
|
1035
1178
|
approvalQuestionAbortInFlight = true;
|
|
1036
1179
|
ctx.ui.notify(
|
|
1037
|
-
`${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.`,
|
|
1038
1181
|
"info",
|
|
1039
1182
|
);
|
|
1040
1183
|
// The durable pending gate is activated at agent_end so same-turn
|
|
@@ -1062,6 +1205,13 @@ export function registerHooks(
|
|
|
1062
1205
|
}
|
|
1063
1206
|
});
|
|
1064
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.
|
|
1065
1215
|
pi.on("tool_call", async (event, ctx) => {
|
|
1066
1216
|
const discussionBasePath = contextBasePath(ctx);
|
|
1067
1217
|
const toolName = canonicalToolName(event.toolName);
|
|
@@ -1249,6 +1399,11 @@ export function registerHooks(
|
|
|
1249
1399
|
});
|
|
1250
1400
|
|
|
1251
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.
|
|
1252
1407
|
pi.on("tool_call", async (event, ctx) => {
|
|
1253
1408
|
markToolStart(event.toolCallId, event.toolName);
|
|
1254
1409
|
safetyRecordToolCall(event.toolCallId, event.toolName, event.input as Record<string, unknown>);
|
|
@@ -1268,23 +1423,39 @@ export function registerHooks(
|
|
|
1268
1423
|
|
|
1269
1424
|
// Destructive command classification + hard gate in all modes.
|
|
1270
1425
|
if (isToolCallEventType("bash", event)) {
|
|
1271
|
-
const
|
|
1426
|
+
const command = event.input.command;
|
|
1427
|
+
const classification = classifyCommand(command);
|
|
1272
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);
|
|
1273
1443
|
const reason = [
|
|
1274
1444
|
"HARD BLOCK: destructive Bash command requires explicit human confirmation.",
|
|
1275
1445
|
`Detected: ${classification.labels.join(", ")}`,
|
|
1276
|
-
"
|
|
1277
|
-
"
|
|
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.",
|
|
1278
1449
|
].join(" ");
|
|
1279
1450
|
safetyLogWarning("safety", `destructive command: ${classification.labels.join(", ")}`, {
|
|
1280
|
-
command: String(
|
|
1451
|
+
command: String(command).slice(0, 200),
|
|
1281
1452
|
});
|
|
1282
1453
|
if (ctx) {
|
|
1283
1454
|
await maybePauseAutoForApprovalGate(
|
|
1284
1455
|
ctx,
|
|
1285
1456
|
pi,
|
|
1286
1457
|
isAutoActive(),
|
|
1287
|
-
"
|
|
1458
|
+
"Destructive-command confirmation is waiting for your answer — pausing auto-mode.",
|
|
1288
1459
|
);
|
|
1289
1460
|
}
|
|
1290
1461
|
return { block: true, reason };
|
|
@@ -1292,6 +1463,11 @@ export function registerHooks(
|
|
|
1292
1463
|
}
|
|
1293
1464
|
});
|
|
1294
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.
|
|
1295
1471
|
pi.on("tool_result", async (event, ctx) => {
|
|
1296
1472
|
if (isAutoActive() && typeof event.toolCallId === "string") {
|
|
1297
1473
|
markToolEnd(event.toolCallId);
|
|
@@ -1322,82 +1498,108 @@ export function registerHooks(
|
|
|
1322
1498
|
} else if (isAutoActive()) {
|
|
1323
1499
|
clearToolInvocationError();
|
|
1324
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
|
+
}
|
|
1325
1515
|
if (toolName !== "ask_user_questions") return;
|
|
1326
1516
|
const basePath = contextBasePath(ctx);
|
|
1327
1517
|
const milestoneId = await getDiscussionMilestoneIdFor(basePath);
|
|
1328
1518
|
|
|
1329
|
-
const details = event
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
if (
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
await maybePauseAutoForApprovalGate(
|
|
1350
|
-
ctx,
|
|
1351
|
-
pi,
|
|
1352
|
-
true,
|
|
1353
|
-
interrupted
|
|
1354
|
-
? "Depth confirmation was interrupted — pausing auto-mode until you respond."
|
|
1355
|
-
: "Depth confirmation is waiting for your answer — pausing auto-mode.",
|
|
1356
|
-
);
|
|
1357
|
-
}
|
|
1358
|
-
return {
|
|
1359
|
-
content: [{
|
|
1360
|
-
type: "text" as const,
|
|
1361
|
-
text: [
|
|
1362
|
-
`Waiting for depth confirmation on gate "${currentPendingGate}".`,
|
|
1363
|
-
interrupted
|
|
1364
|
-
? "The confirmation question was interrupted before a response was recorded."
|
|
1365
|
-
: "No user response was received for the confirmation question.",
|
|
1366
|
-
"Do not infer approval from earlier or prior messages.",
|
|
1367
|
-
"Do not proceed, write files, save artifacts, or call other tools.",
|
|
1368
|
-
`Re-call ask_user_questions with the same gate question id ("${currentPendingGate}") and wait for the user's response.`,
|
|
1369
|
-
].join(" "),
|
|
1370
|
-
}],
|
|
1371
|
-
};
|
|
1372
|
-
} else {
|
|
1373
|
-
const pendingQuestion = questions.find((question) => question?.id === currentPendingGate);
|
|
1374
|
-
if (pendingQuestion) {
|
|
1375
|
-
const answer = details.response?.answers?.[currentPendingGate];
|
|
1376
|
-
if (isDepthConfirmationAnswer(answer?.selected, pendingQuestion.options)) {
|
|
1377
|
-
markApprovalGateVerified(currentPendingGate, basePath);
|
|
1378
|
-
const milestoneIdFromGate = extractDepthVerificationMilestoneId(currentPendingGate);
|
|
1379
|
-
if (milestoneIdFromGate) markDepthVerified(milestoneIdFromGate, basePath);
|
|
1380
|
-
clearPendingGate(basePath);
|
|
1381
|
-
clearDeferredApprovalGate(basePath);
|
|
1382
|
-
}
|
|
1383
|
-
}
|
|
1519
|
+
const details = resolveAskUserQuestionsGateDetails(event);
|
|
1520
|
+
|
|
1521
|
+
const questions: any[] = (event.input as any)?.questions ?? details?.questions ?? [];
|
|
1522
|
+
const gateResult = applyAskUserQuestionsGateResult({
|
|
1523
|
+
basePath,
|
|
1524
|
+
questions,
|
|
1525
|
+
details,
|
|
1526
|
+
fallbackMilestoneId: milestoneId,
|
|
1527
|
+
});
|
|
1528
|
+
if (gateResult.status === "waiting") {
|
|
1529
|
+
resetToolCallLoopGuard();
|
|
1530
|
+
if (ctx) {
|
|
1531
|
+
await maybePauseAutoForApprovalGate(
|
|
1532
|
+
ctx,
|
|
1533
|
+
pi,
|
|
1534
|
+
true,
|
|
1535
|
+
gateResult.interrupted
|
|
1536
|
+
? "Depth confirmation was interrupted — pausing auto-mode until you respond."
|
|
1537
|
+
: "Depth confirmation is waiting for your answer — pausing auto-mode.",
|
|
1538
|
+
);
|
|
1384
1539
|
}
|
|
1540
|
+
return {
|
|
1541
|
+
content: [{
|
|
1542
|
+
type: "text" as const,
|
|
1543
|
+
text: formatPendingAskUserQuestionsGateMessage(gateResult.pendingGateId, gateResult.interrupted),
|
|
1544
|
+
}],
|
|
1545
|
+
};
|
|
1546
|
+
}
|
|
1547
|
+
if (gateResult.status === "verified") {
|
|
1548
|
+
clearDeferredApprovalGate(basePath);
|
|
1385
1549
|
}
|
|
1386
1550
|
|
|
1387
|
-
|
|
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
|
+
}
|
|
1388
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.)
|
|
1389
1598
|
for (const question of questions) {
|
|
1390
|
-
if (
|
|
1391
|
-
// Only unlock the gate if the user selected the first option (confirmation).
|
|
1392
|
-
// Cross-references against the question's defined options to reject free-form "Other" text.
|
|
1599
|
+
if (isDestructiveConfirmGateId(question?.id)) {
|
|
1393
1600
|
const answer = details.response?.answers?.[question.id];
|
|
1394
|
-
const inferredMilestoneId = extractDepthVerificationMilestoneId(question.id) ?? milestoneId;
|
|
1395
1601
|
if (isDepthConfirmationAnswer(answer?.selected, question.options)) {
|
|
1396
|
-
|
|
1397
|
-
markApprovalGateVerified(question.id, basePath);
|
|
1398
|
-
markDepthVerified(inferredMilestoneId, basePath);
|
|
1399
|
-
clearPendingGate(basePath);
|
|
1400
|
-
clearDeferredApprovalGate(basePath);
|
|
1602
|
+
confirmDestructiveCommand(basePath);
|
|
1401
1603
|
}
|
|
1402
1604
|
break;
|
|
1403
1605
|
}
|
|
@@ -1407,20 +1609,50 @@ export function registerHooks(
|
|
|
1407
1609
|
await saveDiscussionQuestionRound(basePath, milestoneId, questions, details);
|
|
1408
1610
|
});
|
|
1409
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.
|
|
1410
1615
|
pi.on("tool_execution_start", async (event, ctx) => {
|
|
1411
1616
|
const basePath = contextBasePath(ctx);
|
|
1412
1617
|
const toolName = canonicalToolName(event.toolName);
|
|
1413
1618
|
if (toolName === "ask_user_questions") {
|
|
1414
1619
|
const questionId = extractGateQuestionId(event.args);
|
|
1415
1620
|
if (typeof questionId === "string") {
|
|
1416
|
-
|
|
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);
|
|
1417
1632
|
clearDeferredApprovalGate(basePath);
|
|
1418
1633
|
}
|
|
1419
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
|
+
|
|
1420
1649
|
if (!isAutoActive()) return;
|
|
1421
1650
|
markToolStart(event.toolCallId, event.toolName);
|
|
1422
1651
|
});
|
|
1423
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.
|
|
1424
1656
|
pi.on("tool_execution_end", async (event) => {
|
|
1425
1657
|
markToolEnd(event.toolCallId);
|
|
1426
1658
|
// #2883/#4974: Capture deterministic invocation/policy errors
|
|
@@ -1458,66 +1690,10 @@ export function registerHooks(
|
|
|
1458
1690
|
const payload = event.payload as Record<string, unknown> | null;
|
|
1459
1691
|
if (!payload || typeof payload !== "object") return;
|
|
1460
1692
|
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
const {
|
|
1466
|
-
createObservationMask,
|
|
1467
|
-
createResponsesInputObservationMask,
|
|
1468
|
-
truncateContextResultMessages,
|
|
1469
|
-
truncateResponsesInputResultItems,
|
|
1470
|
-
} = await import("../context-masker.js");
|
|
1471
|
-
const prefs = loadEffectiveGSDPreferences();
|
|
1472
|
-
const cmConfig = prefs?.preferences.context_management;
|
|
1473
|
-
|
|
1474
|
-
// Observation masking: replace old tool results with placeholders.
|
|
1475
|
-
// Only active during auto-mode when context_management.observation_masking is enabled.
|
|
1476
|
-
if (isAutoActive() && cmConfig?.observation_masking !== false) {
|
|
1477
|
-
const keepTurns = cmConfig?.observation_mask_turns ?? 8;
|
|
1478
|
-
const messages = payload.messages;
|
|
1479
|
-
if (Array.isArray(messages)) {
|
|
1480
|
-
payload.messages = createObservationMask(keepTurns)(messages);
|
|
1481
|
-
}
|
|
1482
|
-
const input = payload.input;
|
|
1483
|
-
if (Array.isArray(input)) {
|
|
1484
|
-
payload.input = createResponsesInputObservationMask(keepTurns)(input);
|
|
1485
|
-
}
|
|
1486
|
-
}
|
|
1487
|
-
|
|
1488
|
-
// Tool result truncation: cap individual tool result content length.
|
|
1489
|
-
// Applies in ALL modes (auto + interactive) to prevent context bloat.
|
|
1490
|
-
// In pi-ai format, toolResult messages have role: "toolResult" and content: TextContent[].
|
|
1491
|
-
// Creates new objects to avoid mutating shared conversation state.
|
|
1492
|
-
const maxChars = cmConfig?.tool_result_max_chars ?? 800;
|
|
1493
|
-
const msgs = payload.messages;
|
|
1494
|
-
if (Array.isArray(msgs)) {
|
|
1495
|
-
payload.messages = truncateContextResultMessages(msgs as any, maxChars);
|
|
1496
|
-
}
|
|
1497
|
-
const input = payload.input;
|
|
1498
|
-
if (Array.isArray(input)) {
|
|
1499
|
-
payload.input = truncateResponsesInputResultItems(input as any, maxChars);
|
|
1500
|
-
}
|
|
1501
|
-
} catch { /* non-fatal */ }
|
|
1502
|
-
|
|
1503
|
-
try {
|
|
1504
|
-
if (isAutoActive()) {
|
|
1505
|
-
const sourceContextBlock = getSourceObservationStore().renderActiveBlock();
|
|
1506
|
-
if (sourceContextBlock) {
|
|
1507
|
-
const nextPayload = injectSourceContextBlockIntoPayload(payload, sourceContextBlock);
|
|
1508
|
-
Object.assign(payload, nextPayload);
|
|
1509
|
-
}
|
|
1510
|
-
}
|
|
1511
|
-
} catch { /* non-fatal */ }
|
|
1512
|
-
|
|
1513
|
-
// ── Service Tier ────────────────────────────────────────────────────
|
|
1514
|
-
const modelId = event.model?.id;
|
|
1515
|
-
if (!modelId) return payload;
|
|
1516
|
-
const { getEffectiveServiceTier, supportsServiceTier } = await import("../service-tier.js");
|
|
1517
|
-
const tier = getEffectiveServiceTier();
|
|
1518
|
-
if (!tier || !supportsServiceTier(modelId)) return payload;
|
|
1519
|
-
payload.service_tier = tier;
|
|
1520
|
-
return payload;
|
|
1693
|
+
return applyProviderPayloadPolicy({
|
|
1694
|
+
payload,
|
|
1695
|
+
modelId: event.model?.id,
|
|
1696
|
+
});
|
|
1521
1697
|
});
|
|
1522
1698
|
|
|
1523
1699
|
// Capability-aware model routing hook (ADR-004)
|
|
@@ -1553,31 +1729,53 @@ export function registerHooks(
|
|
|
1553
1729
|
return surfaceReduced ? { toolNames: providerCompatible } : undefined;
|
|
1554
1730
|
}
|
|
1555
1731
|
const registeredToolNames = resolveRegisteredToolNames(pi, event.activeToolNames);
|
|
1732
|
+
const hasRegisteredSurface = typeof pi.getAllTools === "function";
|
|
1556
1733
|
const compatibleRegisteredToolNames = filterToolsForProvider(
|
|
1557
1734
|
registeredToolNames,
|
|
1558
1735
|
event.selectedModelApi,
|
|
1559
1736
|
event.selectedModelProvider,
|
|
1560
1737
|
).compatible.filter((name) => !(dropAliases && isWorkflowAliasTool(name)));
|
|
1561
1738
|
const guidedUnit = getGuidedUnitContext();
|
|
1739
|
+
const requestRegisteredToolNames = guidedUnit?.unitType === "run-uat"
|
|
1740
|
+
? compatibleRegisteredToolNames
|
|
1741
|
+
: registeredToolNames;
|
|
1562
1742
|
const requestScoped = buildRequestScopedGsdToolSet(
|
|
1563
1743
|
guidedUnit?.unitType === "run-uat" ? aliasFilteredCompatible : providerCompatible,
|
|
1564
1744
|
event.requestCustomMessages,
|
|
1565
|
-
|
|
1745
|
+
requestRegisteredToolNames,
|
|
1566
1746
|
guidedUnit?.unitType,
|
|
1747
|
+
hasRegisteredSurface,
|
|
1567
1748
|
);
|
|
1568
1749
|
if (requestScoped) {
|
|
1750
|
+
recordAutoToolSurfaceSnapshot({
|
|
1751
|
+
source: "provider-adjustment",
|
|
1752
|
+
unitType: guidedUnit?.unitType,
|
|
1753
|
+
modelFacingToolNames: requestScoped,
|
|
1754
|
+
registeredToolNames: requestRegisteredToolNames,
|
|
1755
|
+
scopedToolNames: requestScoped,
|
|
1756
|
+
});
|
|
1569
1757
|
return { toolNames: requestScoped };
|
|
1570
1758
|
}
|
|
1571
1759
|
const dash = getAutoRuntimeSnapshot();
|
|
1572
1760
|
if (dash.active && dash.currentUnit) {
|
|
1761
|
+
const registeredForUnit = dash.currentUnit.type === "run-uat"
|
|
1762
|
+
? compatibleRegisteredToolNames
|
|
1763
|
+
: resolveRegisteredToolNames(pi, event.activeToolNames);
|
|
1764
|
+
const scopedToolNames = buildMinimalAutoGsdToolSet(
|
|
1765
|
+
dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible,
|
|
1766
|
+
dash.currentUnit.type,
|
|
1767
|
+
registeredForUnit,
|
|
1768
|
+
hasRegisteredSurface,
|
|
1769
|
+
);
|
|
1770
|
+
recordAutoToolSurfaceSnapshot({
|
|
1771
|
+
source: "provider-adjustment",
|
|
1772
|
+
unitType: dash.currentUnit.type,
|
|
1773
|
+
modelFacingToolNames: scopedToolNames,
|
|
1774
|
+
registeredToolNames: registeredForUnit,
|
|
1775
|
+
scopedToolNames,
|
|
1776
|
+
});
|
|
1573
1777
|
return {
|
|
1574
|
-
toolNames:
|
|
1575
|
-
dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible,
|
|
1576
|
-
dash.currentUnit.type,
|
|
1577
|
-
dash.currentUnit.type === "run-uat"
|
|
1578
|
-
? compatibleRegisteredToolNames
|
|
1579
|
-
: resolveRegisteredToolNames(pi, event.activeToolNames),
|
|
1580
|
-
),
|
|
1778
|
+
toolNames: scopedToolNames,
|
|
1581
1779
|
};
|
|
1582
1780
|
}
|
|
1583
1781
|
if (isGeneralGsdToolScopingRequested()) {
|