@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
|
@@ -7,31 +7,41 @@ import { isToolCallEventType } from "@gsd/pi-coding-agent";
|
|
|
7
7
|
import { ALWAYS_PRESERVED_SHIM_TOOL_NAMES } from "@gsd/pi-ai";
|
|
8
8
|
import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
|
|
9
9
|
import { buildMilestoneFileName, clearPathCache, milestonesDir, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
|
|
10
|
-
import {
|
|
10
|
+
import { applyAskUserQuestionsGateResult, clearDiscussionFlowState, formatPendingAskUserQuestionsGateMessage, hostWriteGateAdapter, isApprovalGateVerifiedInSnapshot, isDepthConfirmationAnswer, isMilestoneDepthVerified, isMilestoneDepthVerifiedInSnapshot, isQueuePhaseActive, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
11
|
+
import { canonicalToolName } from "../engine-hook-contract.js";
|
|
11
12
|
import { resolveManifest } from "../unit-context-manifest.js";
|
|
12
13
|
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
13
14
|
import { loadFile, saveFile, formatContinue } from "../files.js";
|
|
14
|
-
import { clearAutoCompletionStopInProgress, clearToolInvocationError, getAutoRuntimeSnapshot, getSourceObservationStore, isAutoActive, isAutoCompletionStopInProgress, isAutoPaused, markToolEnd, markToolStart, recordToolInvocationError, } from "../auto-runtime-state.js";
|
|
15
|
+
import { clearAutoCompletionStopInProgress, clearToolInvocationError, getAutoRuntimeSnapshot, getSourceObservationStore, isAutoActive, isAutoCompletionStopInProgress, isAutoPaused, isInteractiveElicitationInFlight, markToolEnd, markToolStart, recordAutoToolSurfaceSnapshot, recordToolInvocationError, } from "../auto-runtime-state.js";
|
|
16
|
+
import { applyProviderPayloadPolicy } from "../provider-payload-policy.js";
|
|
15
17
|
import { checkToolCallLoop, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
|
|
16
18
|
import { maybePauseAutoForApprovalGate, resetPendingGatePauseGuard } from "./pending-gate-pause.js";
|
|
17
19
|
import { saveActivityLog } from "../activity-log.js";
|
|
18
20
|
import { recordToolCall as safetyRecordToolCall, recordToolResult as safetyRecordToolResult, saveEvidenceToDisk } from "../safety/evidence-collector.js";
|
|
19
21
|
import { parseUnitId } from "../unit-id.js";
|
|
20
22
|
import { classifyCommand } from "../safety/destructive-guard.js";
|
|
23
|
+
import { confirmDestructiveCommand, consumeDestructiveConfirmation, isDestructiveConfirmGateId, requestDestructiveConfirmation, } from "../safety/destructive-confirmation.js";
|
|
21
24
|
import { logWarning as safetyLogWarning } from "../workflow-logger.js";
|
|
25
|
+
import { isUnitCloseoutTool, runInteractiveUnitCloseout } from "../unit-closeout.js";
|
|
22
26
|
import { installNotifyInterceptor } from "./notify-interceptor.js";
|
|
23
27
|
import { initNotificationStore } from "../notification-store.js";
|
|
24
28
|
import { initNotificationWidget } from "../notification-widget.js";
|
|
29
|
+
import { notifyPreferenceDiagnostics } from "../preferences-diagnostics.js";
|
|
25
30
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
26
31
|
import { extractSubagentAgentClasses } from "./subagent-input.js";
|
|
27
|
-
import { approvalGateIdForUnit, isExplicitApprovalResponse,
|
|
32
|
+
import { approvalGateIdForUnit, evaluateAskUserQuestionsRound, formatUnansweredConsentQuestionMessage, isExplicitApprovalResponse, messageHasPendingAskUserQuestionsTool, shouldPauseForQuestion, } from "../consent-question.js";
|
|
28
33
|
import { applyUnitSkillVisibility, unitHasSkillManifest } from "../skill-scope.js";
|
|
29
34
|
import { getGuidedUnitContext } from "../guided-unit-context.js";
|
|
30
35
|
import { registerPlanMilestoneSchemaRecovery } from "./plan-milestone-schema-recovery.js";
|
|
31
|
-
import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
|
|
36
|
+
import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, canonicalWorkflowToolName, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
|
|
37
|
+
import { hasBrowserContractPrefix } from "../../shared/browser-contract.js";
|
|
32
38
|
import { filterToolsForProvider } from "../model-router.js";
|
|
39
|
+
import { mcpToolMatchesBaseName } from "../mcp-tool-name.js";
|
|
33
40
|
import { RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES } from "../tool-presentation-plan.js";
|
|
34
|
-
import {
|
|
41
|
+
import { supportsSourceObservationsForUnit } from "../source-observations.js";
|
|
42
|
+
import { clearPendingAutoStart } from "../pending-auto-start.js";
|
|
43
|
+
import { resolveWorkflowToolBasePath } from "./dynamic-tools.js";
|
|
44
|
+
import { getRequiredWorkflowToolsForUnit } from "../unit-tool-contracts.js";
|
|
35
45
|
let approvalQuestionAbortInFlight = false;
|
|
36
46
|
async function loadWelcomeScreenModule() {
|
|
37
47
|
const candidates = [];
|
|
@@ -100,7 +110,13 @@ async function installWelcomeHeader(ctx) {
|
|
|
100
110
|
/* non-fatal */
|
|
101
111
|
}
|
|
102
112
|
}
|
|
103
|
-
|
|
113
|
+
/**
|
|
114
|
+
* Approval gates whose durable arming is deferred until tool execution /
|
|
115
|
+
* agent end, keyed by basePath. A Map (not a single slot) so concurrent
|
|
116
|
+
* projects in one process cannot lose each other's deferred gate; entries
|
|
117
|
+
* are bounded — cleared on activation, session boundaries, and verification.
|
|
118
|
+
*/
|
|
119
|
+
const deferredApprovalGates = new Map();
|
|
104
120
|
export const MINIMAL_GSD_TOOL_NAMES = [
|
|
105
121
|
"gsd_exec",
|
|
106
122
|
"gsd_exec_search",
|
|
@@ -134,7 +150,7 @@ function withPreservedShimTools(toolNames) {
|
|
|
134
150
|
}
|
|
135
151
|
/** True for the browser automation tools (browser_navigate, browser_click, ...). */
|
|
136
152
|
function isBrowserTool(toolName) {
|
|
137
|
-
return canonicalToolName(toolName)
|
|
153
|
+
return hasBrowserContractPrefix(canonicalToolName(toolName));
|
|
138
154
|
}
|
|
139
155
|
/**
|
|
140
156
|
* True when any message in the request is driven by a GSD workflow command
|
|
@@ -165,15 +181,19 @@ function resolveScopedToolNames(activeToolNames, requestedToolNames) {
|
|
|
165
181
|
const resolved = new Set();
|
|
166
182
|
for (const requested of requestedToolNames) {
|
|
167
183
|
const scopedMatches = [];
|
|
184
|
+
const aliasFallbacks = [];
|
|
168
185
|
for (const activeName of activeToolNames) {
|
|
169
|
-
if (
|
|
170
|
-
continue;
|
|
171
|
-
const toolSeparator = activeName.indexOf("__", "mcp__".length);
|
|
172
|
-
if (toolSeparator < 0)
|
|
173
|
-
continue;
|
|
174
|
-
if (activeName.slice(toolSeparator + 2) === requested) {
|
|
186
|
+
if (mcpToolMatchesBaseName(activeName, requested)) {
|
|
175
187
|
scopedMatches.push(activeName);
|
|
176
188
|
}
|
|
189
|
+
else if (isWorkflowAliasTool(activeName) && canonicalWorkflowToolName(activeName) === requested) {
|
|
190
|
+
aliasFallbacks.push(activeName);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Only use alias as fallback when canonical is absent — not directly and not via MCP scoping.
|
|
194
|
+
// Prevents the alias from resurfacing alongside the canonical when both are in the active set.
|
|
195
|
+
if (!exact.has(requested) && scopedMatches.length === 0) {
|
|
196
|
+
scopedMatches.push(...aliasFallbacks);
|
|
177
197
|
}
|
|
178
198
|
if (requested.startsWith("browser_") && scopedMatches.length > 0) {
|
|
179
199
|
for (const match of scopedMatches)
|
|
@@ -192,7 +212,7 @@ export function buildMinimalGsdToolSet(activeToolNames) {
|
|
|
192
212
|
const minimal = resolveScopedToolNames(activeToolNames, MINIMAL_GSD_TOOL_NAMES);
|
|
193
213
|
return withPreservedShimTools([...new Set([...preserved, ...minimal])]);
|
|
194
214
|
}
|
|
195
|
-
export function buildMinimalAutoGsdToolSet(activeToolNames, unitType, registeredToolNames = activeToolNames) {
|
|
215
|
+
export function buildMinimalAutoGsdToolSet(activeToolNames, unitType, registeredToolNames = activeToolNames, warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames) {
|
|
196
216
|
if (unitType === "run-uat") {
|
|
197
217
|
return buildRunUatGsdToolSet(activeToolNames, registeredToolNames);
|
|
198
218
|
}
|
|
@@ -204,7 +224,20 @@ export function buildMinimalAutoGsdToolSet(activeToolNames, unitType, registered
|
|
|
204
224
|
...availableBaseTools,
|
|
205
225
|
])];
|
|
206
226
|
const scoped = resolveScopedToolNames([...activeToolNames, ...registeredToolNames], [...MINIMAL_GSD_TOOL_NAMES, ...unitTools]);
|
|
207
|
-
|
|
227
|
+
const result = withPreservedShimTools([...new Set([...preserved, ...scoped])]);
|
|
228
|
+
warnIfRequiredWorkflowToolsUnresolved(unitType, result, warnOnUnresolvedRequiredTools);
|
|
229
|
+
return result;
|
|
230
|
+
}
|
|
231
|
+
function hasResolvedWorkflowTool(resolvedToolNames, requiredToolName) {
|
|
232
|
+
return resolvedToolNames.some((name) => name === requiredToolName || mcpToolMatchesBaseName(name, requiredToolName));
|
|
233
|
+
}
|
|
234
|
+
function warnIfRequiredWorkflowToolsUnresolved(unitType, scopedToolNames, shouldWarn) {
|
|
235
|
+
if (!unitType || !shouldWarn)
|
|
236
|
+
return;
|
|
237
|
+
const unresolved = getRequiredWorkflowToolsForUnit(unitType).filter((toolName) => !hasResolvedWorkflowTool(scopedToolNames, toolName));
|
|
238
|
+
if (unresolved.length === 0)
|
|
239
|
+
return;
|
|
240
|
+
safetyLogWarning("bootstrap", `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.`);
|
|
208
241
|
}
|
|
209
242
|
export function buildRunUatGsdToolSet(activeToolNames, registeredToolNames = activeToolNames) {
|
|
210
243
|
const scoped = resolveScopedToolNames([...activeToolNames, ...registeredToolNames], [
|
|
@@ -214,7 +247,7 @@ export function buildRunUatGsdToolSet(activeToolNames, registeredToolNames = act
|
|
|
214
247
|
...RUN_UAT_BROWSER_TOOL_NAMES,
|
|
215
248
|
]);
|
|
216
249
|
const resolved = [...new Set(scoped)];
|
|
217
|
-
const unresolved = RUN_UAT_WORKFLOW_TOOL_NAMES.filter((tool) => !resolved.some((name) => name === tool || (name
|
|
250
|
+
const unresolved = RUN_UAT_WORKFLOW_TOOL_NAMES.filter((tool) => !resolved.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)));
|
|
218
251
|
if (unresolved.length > 0) {
|
|
219
252
|
safetyLogWarning("bootstrap", `buildRunUatGsdToolSet: required run-uat workflow tool(s) not found in active/registered surface: ${unresolved.join(", ")}. Session may lack gsd-workflow MCP connection.`);
|
|
220
253
|
}
|
|
@@ -230,7 +263,7 @@ export function buildMinimalGsdWorkflowToolSet(activeToolNames, registeredToolNa
|
|
|
230
263
|
const scoped = resolveScopedToolNames([...activeToolNames, ...registeredToolNames], WORKFLOW_GSD_TOOL_NAMES);
|
|
231
264
|
return withPreservedShimTools([...new Set([...preserved, ...scoped])]);
|
|
232
265
|
}
|
|
233
|
-
export function buildRequestScopedGsdToolSet(activeToolNames, requestCustomMessages, registeredToolNames = activeToolNames, guidedUnitType) {
|
|
266
|
+
export function buildRequestScopedGsdToolSet(activeToolNames, requestCustomMessages, registeredToolNames = activeToolNames, guidedUnitType, warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames) {
|
|
234
267
|
for (let index = (requestCustomMessages?.length ?? 0) - 1; index >= 0; index--) {
|
|
235
268
|
const currentCustomType = requestCustomMessages?.[index]?.customType;
|
|
236
269
|
if (currentCustomType === "gsd-run" ||
|
|
@@ -238,7 +271,7 @@ export function buildRequestScopedGsdToolSet(activeToolNames, requestCustomMessa
|
|
|
238
271
|
currentCustomType === "gsd-doctor-heal" ||
|
|
239
272
|
currentCustomType === "gsd-triage") {
|
|
240
273
|
if (guidedUnitType) {
|
|
241
|
-
return buildMinimalAutoGsdToolSet(activeToolNames, guidedUnitType, registeredToolNames);
|
|
274
|
+
return buildMinimalAutoGsdToolSet(activeToolNames, guidedUnitType, registeredToolNames, warnOnUnresolvedRequiredTools);
|
|
242
275
|
}
|
|
243
276
|
return buildMinimalGsdWorkflowToolSet(activeToolNames, registeredToolNames);
|
|
244
277
|
}
|
|
@@ -271,7 +304,18 @@ function applyMinimalGsdToolSurface(pi) {
|
|
|
271
304
|
return;
|
|
272
305
|
const dash = getAutoRuntimeSnapshot();
|
|
273
306
|
if (dash.active && dash.currentUnit) {
|
|
274
|
-
|
|
307
|
+
const currentToolNames = pi.getActiveTools();
|
|
308
|
+
const hasRegisteredSurface = typeof pi.getAllTools === "function";
|
|
309
|
+
const registeredToolNames = resolveRegisteredToolNames(pi, currentToolNames);
|
|
310
|
+
const scopedToolNames = buildMinimalAutoGsdToolSet(currentToolNames, dash.currentUnit.type, registeredToolNames, hasRegisteredSurface);
|
|
311
|
+
recordAutoToolSurfaceSnapshot({
|
|
312
|
+
source: "runtime-scope",
|
|
313
|
+
unitType: dash.currentUnit.type,
|
|
314
|
+
modelFacingToolNames: scopedToolNames,
|
|
315
|
+
registeredToolNames,
|
|
316
|
+
scopedToolNames,
|
|
317
|
+
});
|
|
318
|
+
pi.setActiveTools(scopedToolNames);
|
|
275
319
|
return;
|
|
276
320
|
}
|
|
277
321
|
if (!isGeneralGsdToolScopingRequested())
|
|
@@ -282,10 +326,18 @@ export function scopeGsdWorkflowToolsForDispatch(pi, unitType) {
|
|
|
282
326
|
if (isFullGsdToolSurfaceRequested())
|
|
283
327
|
return null;
|
|
284
328
|
const current = pi.getActiveTools();
|
|
329
|
+
const hasRegisteredSurface = typeof pi.getAllTools === "function";
|
|
285
330
|
const registeredToolNames = resolveRegisteredToolNames(pi, current);
|
|
286
331
|
const scoped = unitType
|
|
287
|
-
? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames)
|
|
332
|
+
? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames, hasRegisteredSurface)
|
|
288
333
|
: buildMinimalGsdWorkflowToolSet(current, registeredToolNames);
|
|
334
|
+
recordAutoToolSurfaceSnapshot({
|
|
335
|
+
source: "dispatch-scope",
|
|
336
|
+
unitType,
|
|
337
|
+
modelFacingToolNames: scoped,
|
|
338
|
+
registeredToolNames,
|
|
339
|
+
scopedToolNames: scoped,
|
|
340
|
+
});
|
|
289
341
|
const toolsChanged = !(scoped.length === current.length && scoped.every((name, index) => name === current[index]));
|
|
290
342
|
const canScopeSkills = unitHasSkillManifest(unitType) && pi.getVisibleSkills && pi.setVisibleSkills;
|
|
291
343
|
if (!toolsChanged && !canScopeSkills) {
|
|
@@ -363,12 +415,24 @@ async function applyCompactionThresholdOverride(ctx) {
|
|
|
363
415
|
}
|
|
364
416
|
}
|
|
365
417
|
function clearDeferredApprovalGate(basePath) {
|
|
366
|
-
if (!basePath
|
|
367
|
-
|
|
418
|
+
if (!basePath) {
|
|
419
|
+
deferredApprovalGates.clear();
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
deferredApprovalGates.delete(basePath);
|
|
368
423
|
}
|
|
369
424
|
}
|
|
370
425
|
function deferApprovalGate(gateId, basePath) {
|
|
371
|
-
|
|
426
|
+
// Verified-on-disk wins (same adapter policy as activation/re-arm): if the
|
|
427
|
+
// workflow MCP child already verified this gate, deferring would block
|
|
428
|
+
// tools for a gate that can never legitimately arm.
|
|
429
|
+
const snapshot = hostWriteGateAdapter.readState(basePath);
|
|
430
|
+
if (isApprovalGateVerifiedInSnapshot(snapshot, gateId))
|
|
431
|
+
return;
|
|
432
|
+
const milestoneId = extractDepthVerificationMilestoneId(gateId);
|
|
433
|
+
if (milestoneId && isMilestoneDepthVerifiedInSnapshot(snapshot, milestoneId))
|
|
434
|
+
return;
|
|
435
|
+
deferredApprovalGates.set(basePath, gateId);
|
|
372
436
|
}
|
|
373
437
|
function contextBasePath(ctx) {
|
|
374
438
|
return typeof ctx?.cwd === "string" ? ctx.cwd : process.cwd();
|
|
@@ -418,10 +482,14 @@ function isShellExecutionTool(canonicalName) {
|
|
|
418
482
|
canonicalName === "powershell";
|
|
419
483
|
}
|
|
420
484
|
function activateDeferredApprovalGate(basePath) {
|
|
421
|
-
|
|
485
|
+
const gateId = deferredApprovalGates.get(basePath);
|
|
486
|
+
if (gateId === undefined)
|
|
422
487
|
return;
|
|
423
|
-
|
|
424
|
-
|
|
488
|
+
deferredApprovalGates.delete(basePath);
|
|
489
|
+
// hostWriteGateAdapter.setPending applies the verified-on-disk-wins merge
|
|
490
|
+
// policy: it refuses to arm (and thereby clobber) a gate the workflow MCP
|
|
491
|
+
// child already verified on disk.
|
|
492
|
+
hostWriteGateAdapter.setPending(gateId, basePath);
|
|
425
493
|
}
|
|
426
494
|
function extractGateQuestionId(input) {
|
|
427
495
|
const questions = input?.questions ?? [];
|
|
@@ -430,7 +498,7 @@ function extractGateQuestionId(input) {
|
|
|
430
498
|
}
|
|
431
499
|
function isApprovalGateBlocking(basePath) {
|
|
432
500
|
return Boolean(getPendingGate(basePath))
|
|
433
|
-
|| (
|
|
501
|
+
|| deferredApprovalGates.has(basePath);
|
|
434
502
|
}
|
|
435
503
|
function isContextDraftSummarySave(toolName, input) {
|
|
436
504
|
if (toolName !== "gsd_summary_save" && toolName !== "summary_save")
|
|
@@ -439,6 +507,25 @@ function isContextDraftSummarySave(toolName, input) {
|
|
|
439
507
|
return false;
|
|
440
508
|
return input.artifact_type === "CONTEXT-DRAFT";
|
|
441
509
|
}
|
|
510
|
+
/**
|
|
511
|
+
* External engines (claude-code-cli) deliver ask_user_questions results as
|
|
512
|
+
* relayed MCP tool results: the structured round payload arrives in
|
|
513
|
+
* `result.structuredContent`, not in pi-native `event.details`. Without this
|
|
514
|
+
* fallback, applyAskUserQuestionsGateResult sees no response for an answered
|
|
515
|
+
* gate question and lands in the "waiting" branch — leaving a re-armed gate
|
|
516
|
+
* permanently pending and the discuss→auto handoff blocked.
|
|
517
|
+
*/
|
|
518
|
+
function resolveAskUserQuestionsGateDetails(event) {
|
|
519
|
+
const hasRoundShape = (value) => !!value && typeof value === "object" &&
|
|
520
|
+
(value.cancelled !== undefined || value.response !== undefined);
|
|
521
|
+
const details = event.details;
|
|
522
|
+
if (hasRoundShape(details))
|
|
523
|
+
return details;
|
|
524
|
+
const structured = event.result?.structuredContent;
|
|
525
|
+
if (hasRoundShape(structured))
|
|
526
|
+
return structured;
|
|
527
|
+
return details ?? {};
|
|
528
|
+
}
|
|
442
529
|
function selectedAnswerLabel(selected) {
|
|
443
530
|
if (Array.isArray(selected))
|
|
444
531
|
return selected.map(String).join(", ");
|
|
@@ -518,7 +605,8 @@ function withDepthGateDisplayReason(result, displayReason = "Depth confirmation
|
|
|
518
605
|
return { ...result, displayReason };
|
|
519
606
|
}
|
|
520
607
|
function shouldBlockDeferredApprovalTool(toolName, input, basePath) {
|
|
521
|
-
|
|
608
|
+
const deferredGateId = deferredApprovalGates.get(basePath);
|
|
609
|
+
if (deferredGateId === undefined)
|
|
522
610
|
return { block: false };
|
|
523
611
|
if (toolName === "ask_user_questions")
|
|
524
612
|
return { block: false };
|
|
@@ -527,7 +615,7 @@ function shouldBlockDeferredApprovalTool(toolName, input, basePath) {
|
|
|
527
615
|
return withDepthGateDisplayReason({
|
|
528
616
|
block: true,
|
|
529
617
|
reason: [
|
|
530
|
-
`HARD BLOCK: Approval question "${
|
|
618
|
+
`HARD BLOCK: Approval question "${deferredGateId}" has been shown to the user.`,
|
|
531
619
|
`Only CONTEXT-DRAFT persistence may finish in this same assistant turn.`,
|
|
532
620
|
`Wait for the user's answer before calling additional tools.`,
|
|
533
621
|
].join(" "),
|
|
@@ -540,6 +628,7 @@ function initSessionNotifications(ctx) {
|
|
|
540
628
|
initNotificationStore(resolveNotificationStoreBasePath(contextBasePath(ctx)));
|
|
541
629
|
installNotifyInterceptor(ctx);
|
|
542
630
|
initNotificationWidget(ctx);
|
|
631
|
+
notifyPreferenceDiagnostics(ctx, contextBasePath(ctx), { surface: "session-start" });
|
|
543
632
|
}
|
|
544
633
|
async function prepareWorkflowMcpForHookContext(ctx, basePath) {
|
|
545
634
|
// Skip MCP auto-prep when running inside an auto-worktree. The worktree
|
|
@@ -601,7 +690,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
601
690
|
catch { /* non-fatal */ }
|
|
602
691
|
}
|
|
603
692
|
});
|
|
604
|
-
pi.on("session_switch", async (
|
|
693
|
+
pi.on("session_switch", async (event, ctx) => {
|
|
605
694
|
const basePath = contextBasePath(ctx);
|
|
606
695
|
const preserveCloseoutSurface = isAutoCompletionStopInProgress();
|
|
607
696
|
initSessionNotifications(ctx);
|
|
@@ -610,6 +699,13 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
610
699
|
clearDeferredApprovalGate();
|
|
611
700
|
await resetAskUserQuestionsTurnCache();
|
|
612
701
|
clearDiscussionFlowState(basePath);
|
|
702
|
+
// /clear or /new destroys the conversation holding a discuss interview, so
|
|
703
|
+
// its pending discuss→auto handoff can never be answered — clear it. Resume
|
|
704
|
+
// restores the interview transcript, so the entry survives. Auto-mode's own
|
|
705
|
+
// newSession() calls are safe: the handoff consumes the entry on agent_end.
|
|
706
|
+
if (event.reason === "new") {
|
|
707
|
+
clearPendingAutoStart(basePath);
|
|
708
|
+
}
|
|
613
709
|
await syncServiceTierStatus(ctx);
|
|
614
710
|
await applyDisabledModelProviderPolicy(ctx);
|
|
615
711
|
await applyCompactionThresholdOverride(ctx);
|
|
@@ -635,11 +731,13 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
635
731
|
const beforeAgentBasePath = contextBasePath(ctx);
|
|
636
732
|
const pendingApprovalGate = getPendingGate(beforeAgentBasePath);
|
|
637
733
|
if (pendingApprovalGate && isExplicitApprovalResponse(event.prompt, pendingApprovalGate)) {
|
|
638
|
-
|
|
734
|
+
// Host adapter explicitly: the ambient write-gate exports env-sniff the
|
|
735
|
+
// adapter per call and are reserved for the MCP child's import surface.
|
|
736
|
+
hostWriteGateAdapter.markApprovalGateVerified(pendingApprovalGate, beforeAgentBasePath);
|
|
639
737
|
const milestoneId = extractDepthVerificationMilestoneId(pendingApprovalGate);
|
|
640
738
|
if (milestoneId)
|
|
641
|
-
markDepthVerified(milestoneId, beforeAgentBasePath);
|
|
642
|
-
|
|
739
|
+
hostWriteGateAdapter.markDepthVerified(milestoneId, beforeAgentBasePath);
|
|
740
|
+
hostWriteGateAdapter.clearPending(beforeAgentBasePath);
|
|
643
741
|
if (isAutoPaused() && !isAutoActive()) {
|
|
644
742
|
const { resumeAutoAfterProviderDelay } = await import("./provider-error-resume.js");
|
|
645
743
|
void resumeAutoAfterProviderDelay(pi, ctx).catch((err) => {
|
|
@@ -803,6 +901,20 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
803
901
|
pi.on("message_update", async (event, ctx) => {
|
|
804
902
|
if (approvalQuestionAbortInFlight)
|
|
805
903
|
return;
|
|
904
|
+
// If the model asked via ask_user_questions, that in-flight elicitation IS
|
|
905
|
+
// the human boundary. Arming the pause/gate here (and emitting the "waiting
|
|
906
|
+
// for your approval - pausing" notice) would tear it down and trigger the
|
|
907
|
+
// foreground self-cancel/re-ask loop. The marker is set only by the
|
|
908
|
+
// claude-code-cli SDK elicitation handler and is ungated, so it is true in
|
|
909
|
+
// foreground; under the native-TUI provider it is always false and this path
|
|
910
|
+
// runs unchanged (#cc-elicitation-self-cancel).
|
|
911
|
+
if (isInteractiveElicitationInFlight())
|
|
912
|
+
return;
|
|
913
|
+
// Prose with "?" can stream before the MCP tool/elicitation starts. When the
|
|
914
|
+
// structured ask_user_questions call is already in the partial message, the
|
|
915
|
+
// tool IS the human boundary — do not arm the text-based approval pause.
|
|
916
|
+
if (messageHasPendingAskUserQuestionsTool(event.message))
|
|
917
|
+
return;
|
|
806
918
|
const dash = getAutoRuntimeSnapshot();
|
|
807
919
|
if (dash.active)
|
|
808
920
|
return;
|
|
@@ -826,7 +938,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
826
938
|
unitId = milestoneId;
|
|
827
939
|
}
|
|
828
940
|
}
|
|
829
|
-
if (!
|
|
941
|
+
if (!shouldPauseForQuestion(unitType, [event.message]))
|
|
830
942
|
return;
|
|
831
943
|
const gateId = approvalGateIdForUnit(unitType, unitId);
|
|
832
944
|
if (gateId) {
|
|
@@ -840,7 +952,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
840
952
|
deferApprovalGate(gateId, contextBasePath(ctx));
|
|
841
953
|
}
|
|
842
954
|
approvalQuestionAbortInFlight = true;
|
|
843
|
-
ctx.ui.notify(`${unitType}${unitId ? ` ${unitId}` : ""} is waiting for your approval - pausing before more tool calls run.`, "info");
|
|
955
|
+
ctx.ui.notify(`${unitType ?? "The discussion"}${unitId ? ` ${unitId}` : ""} is waiting for your approval - pausing before more tool calls run.`, "info");
|
|
844
956
|
// The durable pending gate is activated at agent_end so same-turn
|
|
845
957
|
// CONTEXT-DRAFT persistence can finish after the text boundary streams.
|
|
846
958
|
// The tool_call hook below still blocks non-draft tools in this turn.
|
|
@@ -866,6 +978,13 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
866
978
|
saveActivityLog(ctx, dash.basePath, dash.currentUnit.type, dash.currentUnit.id);
|
|
867
979
|
}
|
|
868
980
|
});
|
|
981
|
+
// Engine hook contract (../engine-hook-contract.ts): tool_call is
|
|
982
|
+
// NATIVE_ONLY_TOOL_HOOKS — it never fires under external engines
|
|
983
|
+
// (claude-code-cli pre-executes tools). The guards below (loop guard,
|
|
984
|
+
// pending/deferred gate blocks, queue guard, planning-unit tools policy,
|
|
985
|
+
// worktree write gate, STATE.md single-writer, context-write depth gate)
|
|
986
|
+
// are therefore native-engine enforcement only. The write-gate arming
|
|
987
|
+
// concern has a universal mirror at tool_execution_start below.
|
|
869
988
|
pi.on("tool_call", async (event, ctx) => {
|
|
870
989
|
const discussionBasePath = contextBasePath(ctx);
|
|
871
990
|
const toolName = canonicalToolName(event.toolName);
|
|
@@ -1000,6 +1119,11 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1000
1119
|
}
|
|
1001
1120
|
});
|
|
1002
1121
|
// ── Safety harness: evidence collection + destructive command blocking ──
|
|
1122
|
+
// Engine hook contract: tool_call is NATIVE_ONLY_TOOL_HOOKS. Evidence
|
|
1123
|
+
// collection here is mirrored universally at tool_execution_start
|
|
1124
|
+
// (safetyRecordToolCall dedupes by toolCallId); the destructive-command
|
|
1125
|
+
// hard gate has NO universal mirror — blocking is impossible once an
|
|
1126
|
+
// external engine has already executed the command.
|
|
1003
1127
|
pi.on("tool_call", async (event, ctx) => {
|
|
1004
1128
|
markToolStart(event.toolCallId, event.toolName);
|
|
1005
1129
|
safetyRecordToolCall(event.toolCallId, event.toolName, event.input);
|
|
@@ -1017,24 +1141,45 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1017
1141
|
}
|
|
1018
1142
|
// Destructive command classification + hard gate in all modes.
|
|
1019
1143
|
if (isToolCallEventType("bash", event)) {
|
|
1020
|
-
const
|
|
1144
|
+
const command = event.input.command;
|
|
1145
|
+
const classification = classifyCommand(command);
|
|
1021
1146
|
if (classification.destructive) {
|
|
1147
|
+
const guardBasePath = contextBasePath(ctx);
|
|
1148
|
+
// Escape hatch: if the user already confirmed this exact command via a
|
|
1149
|
+
// destructive_confirm gate, consume the one-shot token and let it run.
|
|
1150
|
+
// Without this, the block below loops forever — the model cannot satisfy
|
|
1151
|
+
// "confirm in the current turn" because nothing ever clears the gate.
|
|
1152
|
+
if (consumeDestructiveConfirmation(command, guardBasePath)) {
|
|
1153
|
+
safetyLogWarning("safety", `destructive command confirmed: ${classification.labels.join(", ")}`, {
|
|
1154
|
+
command: String(command).slice(0, 200),
|
|
1155
|
+
});
|
|
1156
|
+
return;
|
|
1157
|
+
}
|
|
1158
|
+
// Record the command as pending so an affirmative answer to a
|
|
1159
|
+
// destructive_confirm gate (handled in tool_result) can confirm it.
|
|
1160
|
+
requestDestructiveConfirmation(command, guardBasePath);
|
|
1022
1161
|
const reason = [
|
|
1023
1162
|
"HARD BLOCK: destructive Bash command requires explicit human confirmation.",
|
|
1024
1163
|
`Detected: ${classification.labels.join(", ")}`,
|
|
1025
|
-
"
|
|
1026
|
-
"
|
|
1164
|
+
"Call ask_user_questions with a question id containing \"destructive_confirm\"",
|
|
1165
|
+
"and a first option that affirms the action; wait for the user's response,",
|
|
1166
|
+
"then re-issue this exact command in the same turn to run it once.",
|
|
1027
1167
|
].join(" ");
|
|
1028
1168
|
safetyLogWarning("safety", `destructive command: ${classification.labels.join(", ")}`, {
|
|
1029
|
-
command: String(
|
|
1169
|
+
command: String(command).slice(0, 200),
|
|
1030
1170
|
});
|
|
1031
1171
|
if (ctx) {
|
|
1032
|
-
await maybePauseAutoForApprovalGate(ctx, pi, isAutoActive(), "
|
|
1172
|
+
await maybePauseAutoForApprovalGate(ctx, pi, isAutoActive(), "Destructive-command confirmation is waiting for your answer — pausing auto-mode.");
|
|
1033
1173
|
}
|
|
1034
1174
|
return { block: true, reason };
|
|
1035
1175
|
}
|
|
1036
1176
|
}
|
|
1037
1177
|
});
|
|
1178
|
+
// Engine hook contract: tool_result is NATIVE_ONLY_TOOL_HOOKS — external
|
|
1179
|
+
// engines skip it. Error classification and markToolEnd are mirrored
|
|
1180
|
+
// universally at tool_execution_end; the ask_user_questions gate lifecycle
|
|
1181
|
+
// here is paired with the tool_execution_start arming path, which external
|
|
1182
|
+
// engines do reach.
|
|
1038
1183
|
pi.on("tool_result", async (event, ctx) => {
|
|
1039
1184
|
if (isAutoActive() && typeof event.toolCallId === "string") {
|
|
1040
1185
|
markToolEnd(event.toolCallId);
|
|
@@ -1066,78 +1211,91 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1066
1211
|
else if (isAutoActive()) {
|
|
1067
1212
|
clearToolInvocationError();
|
|
1068
1213
|
}
|
|
1214
|
+
// Interactive Closeout adapter (ADR-032): auto-mode owns closeout for its
|
|
1215
|
+
// own units; interactive completions get the durable git subset (commit +
|
|
1216
|
+
// Closeout Git Verdict) instead of silently bypassing git.isolation.
|
|
1217
|
+
if (!event.isError && !isAutoActive() && isUnitCloseoutTool(toolName)) {
|
|
1218
|
+
try {
|
|
1219
|
+
runInteractiveUnitCloseout({
|
|
1220
|
+
basePath: resolveWorkflowToolBasePath(ctx, event.input),
|
|
1221
|
+
canonicalToolName: toolName,
|
|
1222
|
+
input: event.input,
|
|
1223
|
+
});
|
|
1224
|
+
}
|
|
1225
|
+
catch (err) {
|
|
1226
|
+
safetyLogWarning("engine", `interactive unit closeout failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1069
1229
|
if (toolName !== "ask_user_questions")
|
|
1070
1230
|
return;
|
|
1071
1231
|
const basePath = contextBasePath(ctx);
|
|
1072
1232
|
const milestoneId = await getDiscussionMilestoneIdFor(basePath);
|
|
1073
|
-
const details = event
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
if (
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
// the gate when the user replies with an approval keyword), but the
|
|
1088
|
-
// structured re-ask is more deterministic and gives the user a clear UI.
|
|
1089
|
-
resetToolCallLoopGuard();
|
|
1090
|
-
const interrupted = details?.interrupted === true;
|
|
1091
|
-
if (ctx) {
|
|
1092
|
-
await maybePauseAutoForApprovalGate(ctx, pi, true, interrupted
|
|
1093
|
-
? "Depth confirmation was interrupted — pausing auto-mode until you respond."
|
|
1094
|
-
: "Depth confirmation is waiting for your answer — pausing auto-mode.");
|
|
1095
|
-
}
|
|
1096
|
-
return {
|
|
1097
|
-
content: [{
|
|
1098
|
-
type: "text",
|
|
1099
|
-
text: [
|
|
1100
|
-
`Waiting for depth confirmation on gate "${currentPendingGate}".`,
|
|
1101
|
-
interrupted
|
|
1102
|
-
? "The confirmation question was interrupted before a response was recorded."
|
|
1103
|
-
: "No user response was received for the confirmation question.",
|
|
1104
|
-
"Do not infer approval from earlier or prior messages.",
|
|
1105
|
-
"Do not proceed, write files, save artifacts, or call other tools.",
|
|
1106
|
-
`Re-call ask_user_questions with the same gate question id ("${currentPendingGate}") and wait for the user's response.`,
|
|
1107
|
-
].join(" "),
|
|
1108
|
-
}],
|
|
1109
|
-
};
|
|
1233
|
+
const details = resolveAskUserQuestionsGateDetails(event);
|
|
1234
|
+
const questions = event.input?.questions ?? details?.questions ?? [];
|
|
1235
|
+
const gateResult = applyAskUserQuestionsGateResult({
|
|
1236
|
+
basePath,
|
|
1237
|
+
questions,
|
|
1238
|
+
details,
|
|
1239
|
+
fallbackMilestoneId: milestoneId,
|
|
1240
|
+
});
|
|
1241
|
+
if (gateResult.status === "waiting") {
|
|
1242
|
+
resetToolCallLoopGuard();
|
|
1243
|
+
if (ctx) {
|
|
1244
|
+
await maybePauseAutoForApprovalGate(ctx, pi, true, gateResult.interrupted
|
|
1245
|
+
? "Depth confirmation was interrupted — pausing auto-mode until you respond."
|
|
1246
|
+
: "Depth confirmation is waiting for your answer — pausing auto-mode.");
|
|
1110
1247
|
}
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1248
|
+
return {
|
|
1249
|
+
content: [{
|
|
1250
|
+
type: "text",
|
|
1251
|
+
text: formatPendingAskUserQuestionsGateMessage(gateResult.pendingGateId, gateResult.interrupted),
|
|
1252
|
+
}],
|
|
1253
|
+
};
|
|
1254
|
+
}
|
|
1255
|
+
if (gateResult.status === "verified") {
|
|
1256
|
+
clearDeferredApprovalGate(basePath);
|
|
1257
|
+
}
|
|
1258
|
+
// ── Consent Question policy (consent-question.ts): one home for the
|
|
1259
|
+
// answer lifecycle of every ask_user_questions round. Per-question
|
|
1260
|
+
// verdicts come from the consent-verdict leaf — the same engine
|
|
1261
|
+
// applyAskUserQuestionsGateResult consumed above for gate persistence —
|
|
1262
|
+
// so empty answers on fail-closed kinds never pass as real answers (#528)
|
|
1263
|
+
// and cancellations get one unified handler.
|
|
1264
|
+
const roundOutcome = evaluateAskUserQuestionsRound(questions, details ?? {});
|
|
1265
|
+
if (roundOutcome === "cancelled") {
|
|
1266
|
+
resetToolCallLoopGuard();
|
|
1267
|
+
if (ctx) {
|
|
1268
|
+
await maybePauseAutoForApprovalGate(ctx, pi, true, "ask_user_questions was cancelled before receiving a response — pausing auto-mode until you respond.");
|
|
1124
1269
|
}
|
|
1270
|
+
return;
|
|
1125
1271
|
}
|
|
1126
|
-
if (
|
|
1272
|
+
if (roundOutcome === "waiting") {
|
|
1273
|
+
resetToolCallLoopGuard();
|
|
1274
|
+
if (ctx) {
|
|
1275
|
+
await maybePauseAutoForApprovalGate(ctx, pi, true, "A user question received no answer — pausing auto-mode until you respond.");
|
|
1276
|
+
}
|
|
1277
|
+
return {
|
|
1278
|
+
content: [{
|
|
1279
|
+
type: "text",
|
|
1280
|
+
text: formatUnansweredConsentQuestionMessage(questions),
|
|
1281
|
+
}],
|
|
1282
|
+
};
|
|
1283
|
+
}
|
|
1284
|
+
// Cancelled rounds already returned via roundOutcome === "cancelled".
|
|
1285
|
+
if (!details?.response)
|
|
1127
1286
|
return;
|
|
1287
|
+
// Destructive-command confirmation: an affirmative answer to a
|
|
1288
|
+
// destructive_confirm gate promotes the pending blocked command to a
|
|
1289
|
+
// one-shot confirmed token, which the bash tool_call guard consumes on the
|
|
1290
|
+
// next attempt. Rejecting/declining leaves the command blocked.
|
|
1291
|
+
// (Depth-verification gate handling now lives in
|
|
1292
|
+
// applyAskUserQuestionsGateResult above; only the destructive-confirm gate
|
|
1293
|
+
// is handled inline here.)
|
|
1128
1294
|
for (const question of questions) {
|
|
1129
|
-
if (
|
|
1130
|
-
// Only unlock the gate if the user selected the first option (confirmation).
|
|
1131
|
-
// Cross-references against the question's defined options to reject free-form "Other" text.
|
|
1295
|
+
if (isDestructiveConfirmGateId(question?.id)) {
|
|
1132
1296
|
const answer = details.response?.answers?.[question.id];
|
|
1133
|
-
const inferredMilestoneId = extractDepthVerificationMilestoneId(question.id) ?? milestoneId;
|
|
1134
1297
|
if (isDepthConfirmationAnswer(answer?.selected, question.options)) {
|
|
1135
|
-
|
|
1136
|
-
break;
|
|
1137
|
-
markApprovalGateVerified(question.id, basePath);
|
|
1138
|
-
markDepthVerified(inferredMilestoneId, basePath);
|
|
1139
|
-
clearPendingGate(basePath);
|
|
1140
|
-
clearDeferredApprovalGate(basePath);
|
|
1298
|
+
confirmDestructiveCommand(basePath);
|
|
1141
1299
|
}
|
|
1142
1300
|
break;
|
|
1143
1301
|
}
|
|
@@ -1146,20 +1304,48 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1146
1304
|
return;
|
|
1147
1305
|
await saveDiscussionQuestionRound(basePath, milestoneId, questions, details);
|
|
1148
1306
|
});
|
|
1307
|
+
// Engine hook contract: tool_execution_start is UNIVERSAL_TOOL_HOOKS — the
|
|
1308
|
+
// only pre-execution event that fires for every tool call on every engine.
|
|
1309
|
+
// Universal mirrors live here: write-gate arming and evidence collection.
|
|
1149
1310
|
pi.on("tool_execution_start", async (event, ctx) => {
|
|
1150
1311
|
const basePath = contextBasePath(ctx);
|
|
1151
1312
|
const toolName = canonicalToolName(event.toolName);
|
|
1152
1313
|
if (toolName === "ask_user_questions") {
|
|
1153
1314
|
const questionId = extractGateQuestionId(event.args);
|
|
1154
1315
|
if (typeof questionId === "string") {
|
|
1155
|
-
|
|
1316
|
+
// External engines (claude-code-cli) ingest the SDK turn's tool blocks
|
|
1317
|
+
// post-hoc, so this event can fire AFTER the workflow MCP child already
|
|
1318
|
+
// verified this gate and allowed the CONTEXT save. Arming also revokes
|
|
1319
|
+
// verifiedDepthMilestones/verifiedApprovalGates, so an unconditional
|
|
1320
|
+
// re-arm here would wipe the child's verification and leave the
|
|
1321
|
+
// discuss→auto handoff permanently blocked. hostWriteGateAdapter
|
|
1322
|
+
// .setPending applies the verified-on-disk-wins policy and skips the
|
|
1323
|
+
// re-arm in that case. Stale verified state cannot leak into a later
|
|
1324
|
+
// re-discussion: a successful handoff deletes the snapshot via
|
|
1325
|
+
// clearDiscussionFlowState.
|
|
1326
|
+
hostWriteGateAdapter.setPending(questionId, basePath);
|
|
1156
1327
|
clearDeferredApprovalGate(basePath);
|
|
1157
1328
|
}
|
|
1158
1329
|
}
|
|
1330
|
+
// Safety harness: record evidence here, not only in tool_call — see
|
|
1331
|
+
// ../engine-hook-contract.ts for why tool_call never fires under external
|
|
1332
|
+
// engines. recordToolCall dedupes by toolCallId, so native tools (which
|
|
1333
|
+
// hit both events) record once.
|
|
1334
|
+
safetyRecordToolCall(event.toolCallId, event.toolName, (event.args ?? {}));
|
|
1335
|
+
const execDash = getAutoRuntimeSnapshot();
|
|
1336
|
+
if (execDash.basePath && execDash.currentUnit?.type === "execute-task") {
|
|
1337
|
+
const { milestone: xMid, slice: xSid, task: xTid } = parseUnitId(execDash.currentUnit.id);
|
|
1338
|
+
if (xMid && xSid && xTid) {
|
|
1339
|
+
saveEvidenceToDisk(execDash.basePath, xMid, xSid, xTid);
|
|
1340
|
+
}
|
|
1341
|
+
}
|
|
1159
1342
|
if (!isAutoActive())
|
|
1160
1343
|
return;
|
|
1161
1344
|
markToolStart(event.toolCallId, event.toolName);
|
|
1162
1345
|
});
|
|
1346
|
+
// Engine hook contract: tool_execution_end is UNIVERSAL_TOOL_HOOKS — fires
|
|
1347
|
+
// for every finalized tool call on every engine, so error classification
|
|
1348
|
+
// and evidence persistence here cover external engines that skip tool_result.
|
|
1163
1349
|
pi.on("tool_execution_end", async (event) => {
|
|
1164
1350
|
markToolEnd(event.toolCallId);
|
|
1165
1351
|
// #2883/#4974: Capture deterministic invocation/policy errors
|
|
@@ -1196,61 +1382,10 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1196
1382
|
const payload = event.payload;
|
|
1197
1383
|
if (!payload || typeof payload !== "object")
|
|
1198
1384
|
return;
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
const { createObservationMask, createResponsesInputObservationMask, truncateContextResultMessages, truncateResponsesInputResultItems, } = await import("../context-masker.js");
|
|
1204
|
-
const prefs = loadEffectiveGSDPreferences();
|
|
1205
|
-
const cmConfig = prefs?.preferences.context_management;
|
|
1206
|
-
// Observation masking: replace old tool results with placeholders.
|
|
1207
|
-
// Only active during auto-mode when context_management.observation_masking is enabled.
|
|
1208
|
-
if (isAutoActive() && cmConfig?.observation_masking !== false) {
|
|
1209
|
-
const keepTurns = cmConfig?.observation_mask_turns ?? 8;
|
|
1210
|
-
const messages = payload.messages;
|
|
1211
|
-
if (Array.isArray(messages)) {
|
|
1212
|
-
payload.messages = createObservationMask(keepTurns)(messages);
|
|
1213
|
-
}
|
|
1214
|
-
const input = payload.input;
|
|
1215
|
-
if (Array.isArray(input)) {
|
|
1216
|
-
payload.input = createResponsesInputObservationMask(keepTurns)(input);
|
|
1217
|
-
}
|
|
1218
|
-
}
|
|
1219
|
-
// Tool result truncation: cap individual tool result content length.
|
|
1220
|
-
// Applies in ALL modes (auto + interactive) to prevent context bloat.
|
|
1221
|
-
// In pi-ai format, toolResult messages have role: "toolResult" and content: TextContent[].
|
|
1222
|
-
// Creates new objects to avoid mutating shared conversation state.
|
|
1223
|
-
const maxChars = cmConfig?.tool_result_max_chars ?? 800;
|
|
1224
|
-
const msgs = payload.messages;
|
|
1225
|
-
if (Array.isArray(msgs)) {
|
|
1226
|
-
payload.messages = truncateContextResultMessages(msgs, maxChars);
|
|
1227
|
-
}
|
|
1228
|
-
const input = payload.input;
|
|
1229
|
-
if (Array.isArray(input)) {
|
|
1230
|
-
payload.input = truncateResponsesInputResultItems(input, maxChars);
|
|
1231
|
-
}
|
|
1232
|
-
}
|
|
1233
|
-
catch { /* non-fatal */ }
|
|
1234
|
-
try {
|
|
1235
|
-
if (isAutoActive()) {
|
|
1236
|
-
const sourceContextBlock = getSourceObservationStore().renderActiveBlock();
|
|
1237
|
-
if (sourceContextBlock) {
|
|
1238
|
-
const nextPayload = injectSourceContextBlockIntoPayload(payload, sourceContextBlock);
|
|
1239
|
-
Object.assign(payload, nextPayload);
|
|
1240
|
-
}
|
|
1241
|
-
}
|
|
1242
|
-
}
|
|
1243
|
-
catch { /* non-fatal */ }
|
|
1244
|
-
// ── Service Tier ────────────────────────────────────────────────────
|
|
1245
|
-
const modelId = event.model?.id;
|
|
1246
|
-
if (!modelId)
|
|
1247
|
-
return payload;
|
|
1248
|
-
const { getEffectiveServiceTier, supportsServiceTier } = await import("../service-tier.js");
|
|
1249
|
-
const tier = getEffectiveServiceTier();
|
|
1250
|
-
if (!tier || !supportsServiceTier(modelId))
|
|
1251
|
-
return payload;
|
|
1252
|
-
payload.service_tier = tier;
|
|
1253
|
-
return payload;
|
|
1385
|
+
return applyProviderPayloadPolicy({
|
|
1386
|
+
payload,
|
|
1387
|
+
modelId: event.model?.id,
|
|
1388
|
+
});
|
|
1254
1389
|
});
|
|
1255
1390
|
// Capability-aware model routing hook (ADR-004)
|
|
1256
1391
|
// Extensions can override model selection by returning { modelId: "..." }
|
|
@@ -1280,18 +1415,38 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1280
1415
|
return surfaceReduced ? { toolNames: providerCompatible } : undefined;
|
|
1281
1416
|
}
|
|
1282
1417
|
const registeredToolNames = resolveRegisteredToolNames(pi, event.activeToolNames);
|
|
1418
|
+
const hasRegisteredSurface = typeof pi.getAllTools === "function";
|
|
1283
1419
|
const compatibleRegisteredToolNames = filterToolsForProvider(registeredToolNames, event.selectedModelApi, event.selectedModelProvider).compatible.filter((name) => !(dropAliases && isWorkflowAliasTool(name)));
|
|
1284
1420
|
const guidedUnit = getGuidedUnitContext();
|
|
1285
|
-
const
|
|
1421
|
+
const requestRegisteredToolNames = guidedUnit?.unitType === "run-uat"
|
|
1422
|
+
? compatibleRegisteredToolNames
|
|
1423
|
+
: registeredToolNames;
|
|
1424
|
+
const requestScoped = buildRequestScopedGsdToolSet(guidedUnit?.unitType === "run-uat" ? aliasFilteredCompatible : providerCompatible, event.requestCustomMessages, requestRegisteredToolNames, guidedUnit?.unitType, hasRegisteredSurface);
|
|
1286
1425
|
if (requestScoped) {
|
|
1426
|
+
recordAutoToolSurfaceSnapshot({
|
|
1427
|
+
source: "provider-adjustment",
|
|
1428
|
+
unitType: guidedUnit?.unitType,
|
|
1429
|
+
modelFacingToolNames: requestScoped,
|
|
1430
|
+
registeredToolNames: requestRegisteredToolNames,
|
|
1431
|
+
scopedToolNames: requestScoped,
|
|
1432
|
+
});
|
|
1287
1433
|
return { toolNames: requestScoped };
|
|
1288
1434
|
}
|
|
1289
1435
|
const dash = getAutoRuntimeSnapshot();
|
|
1290
1436
|
if (dash.active && dash.currentUnit) {
|
|
1437
|
+
const registeredForUnit = dash.currentUnit.type === "run-uat"
|
|
1438
|
+
? compatibleRegisteredToolNames
|
|
1439
|
+
: resolveRegisteredToolNames(pi, event.activeToolNames);
|
|
1440
|
+
const scopedToolNames = buildMinimalAutoGsdToolSet(dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible, dash.currentUnit.type, registeredForUnit, hasRegisteredSurface);
|
|
1441
|
+
recordAutoToolSurfaceSnapshot({
|
|
1442
|
+
source: "provider-adjustment",
|
|
1443
|
+
unitType: dash.currentUnit.type,
|
|
1444
|
+
modelFacingToolNames: scopedToolNames,
|
|
1445
|
+
registeredToolNames: registeredForUnit,
|
|
1446
|
+
scopedToolNames,
|
|
1447
|
+
});
|
|
1291
1448
|
return {
|
|
1292
|
-
toolNames:
|
|
1293
|
-
? compatibleRegisteredToolNames
|
|
1294
|
-
: resolveRegisteredToolNames(pi, event.activeToolNames)),
|
|
1449
|
+
toolNames: scopedToolNames,
|
|
1295
1450
|
};
|
|
1296
1451
|
}
|
|
1297
1452
|
if (isGeneralGsdToolScopingRequested()) {
|