@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.84c56d87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +7 -29
- package/dist/help-text.js +5 -0
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.js +2 -14
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +78 -23
- 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 +122 -234
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
- package/dist/resources/extensions/github-sync/templates.js +3 -3
- package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
- package/dist/resources/extensions/gsd/auto/loop.js +74 -56
- package/dist/resources/extensions/gsd/auto/orchestrator.js +142 -15
- package/dist/resources/extensions/gsd/auto/phases.js +34 -4
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
- package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
- package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +23 -11
- package/dist/resources/extensions/gsd/auto-prompts.js +84 -8
- 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 +24 -37
- 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-tool-scope.js +11 -45
- package/dist/resources/extensions/gsd/auto-verification.js +7 -7
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +53 -368
- package/dist/resources/extensions/gsd/auto.js +19 -27
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +20 -43
- 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 +209 -149
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +93 -8
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -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/codebase-generator.js +8 -4
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
- package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
- package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
- package/dist/resources/extensions/gsd/commands-ship.js +2 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +372 -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/delegation-policy.js +2 -10
- package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
- 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/error-classifier.js +10 -1
- 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-db.js +183 -2048
- package/dist/resources/extensions/gsd/guidance.js +98 -0
- package/dist/resources/extensions/gsd/guided-flow.js +83 -471
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +2 -1
- 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/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 +12 -4
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
- package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
- package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
- package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +3 -0
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/parallel-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/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 +12 -46
- package/dist/resources/extensions/gsd/preferences.js +161 -29
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/system.md +1 -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/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
- 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/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +14 -25
- 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 +52 -8
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +24 -43
- package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
- 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/uat-policy.js +17 -10
- 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 +49 -21
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +337 -0
- package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
- package/dist/resources/extensions/gsd/user-input-boundary.js +23 -0
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/web-app-uat.js +117 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
- package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
- package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +9 -1
- package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
- package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
- 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 +72 -4
- package/dist/resources/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-cmd.js +20 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
- 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/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 +6 -6
- 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 +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
- package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
- package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +18 -26
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +14 -47
- package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
- package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
- package/dist/web/standalone/node_modules/postcss/lib/input.js +29 -54
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +37 -47
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +9 -26
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +55 -57
- package/dist/web/standalone/node_modules/postcss/lib/node.js +31 -99
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +9 -10
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +11 -30
- package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
- package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
- package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
- package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +28 -69
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +2 -6
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- 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 +2 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- 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/session/agent-session-extensions.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/cli.js +6 -3
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts +10 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +8 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +49 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +48 -22
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +455 -546
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +481 -599
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/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/package.json +7 -7
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/keys.d.ts.map +1 -1
- package/packages/pi-tui/dist/keys.js +39 -30
- package/packages/pi-tui/dist/keys.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +22 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +87 -24
- 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/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 +148 -285
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +268 -0
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
- package/src/resources/extensions/github-sync/templates.ts +3 -3
- package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
- package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
- package/src/resources/extensions/gsd/auto/loop.ts +83 -61
- package/src/resources/extensions/gsd/auto/orchestrator.ts +164 -17
- package/src/resources/extensions/gsd/auto/phases.ts +45 -4
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
- package/src/resources/extensions/gsd/auto/session.ts +4 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +29 -10
- package/src/resources/extensions/gsd/auto-prompts.ts +110 -9
- 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 +29 -35
- 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-tool-scope.ts +19 -47
- package/src/resources/extensions/gsd/auto-verification.ts +7 -8
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +68 -384
- package/src/resources/extensions/gsd/auto.ts +35 -32
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +20 -43
- 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 +251 -161
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +136 -6
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -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/codebase-generator.ts +9 -5
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
- package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
- package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
- package/src/resources/extensions/gsd/commands-ship.ts +2 -2
- package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
- package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
- package/src/resources/extensions/gsd/db/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +453 -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/delegation-policy.ts +3 -11
- package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
- 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/error-classifier.ts +12 -1
- 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-db.ts +185 -2373
- package/src/resources/extensions/gsd/guidance.ts +139 -0
- package/src/resources/extensions/gsd/guided-flow.ts +95 -561
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +2 -1
- 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/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 +12 -4
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
- package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
- package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
- package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +3 -0
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/parallel-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/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 +10 -46
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +191 -28
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/system.md +1 -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/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
- 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/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +19 -26
- 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-dashboard.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +444 -5
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +133 -4
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
- 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/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/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/dispatch-complete-milestone-guard.test.ts +34 -3
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
- 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/guidance.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/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 +25 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- 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/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 +46 -0
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/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/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -1
- 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 +144 -7
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
- 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 +155 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +24 -6
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +70 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +86 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +128 -11
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
- 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-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.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +121 -0
- package/src/resources/extensions/gsd/tool-contract.ts +86 -8
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +23 -58
- package/src/resources/extensions/gsd/tools/exec-tool.ts +5 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
- 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/uat-policy.ts +20 -10
- 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 +97 -21
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +412 -0
- package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
- package/src/resources/extensions/gsd/user-input-boundary.ts +18 -0
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/web-app-uat.ts +144 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
- package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +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 +17 -17
- package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
- package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
- 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 +88 -4
- package/src/resources/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/gsd-browser/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/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/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → AOpDeK_gJHU8OZjRo31gQ}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → AOpDeK_gJHU8OZjRo31gQ}/_ssgManifest.js +0 -0
|
@@ -13,7 +13,7 @@ import type { GSDEcosystemBeforeAgentStartHandler } from "../ecosystem/gsd-exten
|
|
|
13
13
|
import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
|
|
14
14
|
|
|
15
15
|
import { buildMilestoneFileName, clearPathCache, milestonesDir, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
|
|
16
|
-
import { canonicalToolName, clearDiscussionFlowState,
|
|
16
|
+
import { applyAskUserQuestionsGateResult, canonicalToolName, clearDiscussionFlowState, formatPendingAskUserQuestionsGateMessage, isApprovalGateVerifiedInSnapshot, isMilestoneDepthVerified, isMilestoneDepthVerifiedInSnapshot, isQueuePhaseActive, loadWriteGateSnapshot, markApprovalGateVerified, markDepthVerified, refreshWriteGateStateFromDisk, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
17
17
|
import { resolveManifest } from "../unit-context-manifest.js";
|
|
18
18
|
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
19
19
|
import { loadFile, saveFile, formatContinue } from "../files.js";
|
|
@@ -25,10 +25,13 @@ import {
|
|
|
25
25
|
isAutoActive,
|
|
26
26
|
isAutoCompletionStopInProgress,
|
|
27
27
|
isAutoPaused,
|
|
28
|
+
isInteractiveElicitationInFlight,
|
|
28
29
|
markToolEnd,
|
|
29
30
|
markToolStart,
|
|
31
|
+
recordAutoToolSurfaceSnapshot,
|
|
30
32
|
recordToolInvocationError,
|
|
31
33
|
} from "../auto-runtime-state.js";
|
|
34
|
+
import { applyProviderPayloadPolicy } from "../provider-payload-policy.js";
|
|
32
35
|
|
|
33
36
|
import { checkToolCallLoop, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
|
|
34
37
|
import { maybePauseAutoForApprovalGate, resetPendingGatePauseGuard } from "./pending-gate-pause.js";
|
|
@@ -37,20 +40,32 @@ import { recordToolCall as safetyRecordToolCall, recordToolResult as safetyRecor
|
|
|
37
40
|
import { parseUnitId } from "../unit-id.js";
|
|
38
41
|
import { classifyCommand } from "../safety/destructive-guard.js";
|
|
39
42
|
import { logWarning as safetyLogWarning } from "../workflow-logger.js";
|
|
43
|
+
import { isUnitCloseoutTool, runInteractiveUnitCloseout } from "../unit-closeout.js";
|
|
40
44
|
import { installNotifyInterceptor } from "./notify-interceptor.js";
|
|
41
45
|
import { initNotificationStore } from "../notification-store.js";
|
|
42
46
|
import { initNotificationWidget } from "../notification-widget.js";
|
|
47
|
+
import { notifyPreferenceDiagnostics } from "../preferences-diagnostics.js";
|
|
43
48
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
44
49
|
import { extractSubagentAgentClasses } from "./subagent-input.js";
|
|
45
|
-
import {
|
|
50
|
+
import {
|
|
51
|
+
approvalGateIdForUnit,
|
|
52
|
+
isExplicitApprovalResponse,
|
|
53
|
+
messageHasPendingAskUserQuestionsTool,
|
|
54
|
+
shouldPauseForUserApprovalQuestion,
|
|
55
|
+
} from "../user-input-boundary.js";
|
|
46
56
|
import { resolveSkillManifest } from "../skill-manifest.js";
|
|
47
57
|
import { applyUnitSkillVisibility, unitHasSkillManifest } from "../skill-scope.js";
|
|
48
58
|
import { getGuidedUnitContext } from "../guided-unit-context.js";
|
|
49
59
|
import { registerPlanMilestoneSchemaRecovery } from "./plan-milestone-schema-recovery.js";
|
|
50
|
-
import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
|
|
60
|
+
import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, canonicalWorkflowToolName, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
|
|
61
|
+
import { hasBrowserContractPrefix } from "../../shared/browser-contract.js";
|
|
51
62
|
import { filterToolsForProvider } from "../model-router.js";
|
|
63
|
+
import { mcpToolMatchesBaseName } from "../mcp-tool-name.js";
|
|
52
64
|
import { RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES } from "../tool-presentation-plan.js";
|
|
53
|
-
import {
|
|
65
|
+
import { supportsSourceObservationsForUnit } from "../source-observations.js";
|
|
66
|
+
import { clearPendingAutoStart } from "../pending-auto-start.js";
|
|
67
|
+
import { resolveWorkflowToolBasePath } from "./dynamic-tools.js";
|
|
68
|
+
import { getRequiredWorkflowToolsForUnit } from "../unit-tool-contracts.js";
|
|
54
69
|
|
|
55
70
|
let approvalQuestionAbortInFlight = false;
|
|
56
71
|
|
|
@@ -167,7 +182,7 @@ function withPreservedShimTools(toolNames: readonly string[]): string[] {
|
|
|
167
182
|
|
|
168
183
|
/** True for the browser automation tools (browser_navigate, browser_click, ...). */
|
|
169
184
|
function isBrowserTool(toolName: string): boolean {
|
|
170
|
-
return canonicalToolName(toolName)
|
|
185
|
+
return hasBrowserContractPrefix(canonicalToolName(toolName));
|
|
171
186
|
}
|
|
172
187
|
|
|
173
188
|
/**
|
|
@@ -210,16 +225,22 @@ function resolveScopedToolNames(
|
|
|
210
225
|
|
|
211
226
|
for (const requested of requestedToolNames) {
|
|
212
227
|
const scopedMatches: string[] = [];
|
|
228
|
+
const aliasFallbacks: string[] = [];
|
|
213
229
|
|
|
214
230
|
for (const activeName of activeToolNames) {
|
|
215
|
-
if (
|
|
216
|
-
const toolSeparator = activeName.indexOf("__", "mcp__".length);
|
|
217
|
-
if (toolSeparator < 0) continue;
|
|
218
|
-
if (activeName.slice(toolSeparator + 2) === requested) {
|
|
231
|
+
if (mcpToolMatchesBaseName(activeName, requested)) {
|
|
219
232
|
scopedMatches.push(activeName);
|
|
233
|
+
} else if (isWorkflowAliasTool(activeName) && canonicalWorkflowToolName(activeName) === requested) {
|
|
234
|
+
aliasFallbacks.push(activeName);
|
|
220
235
|
}
|
|
221
236
|
}
|
|
222
237
|
|
|
238
|
+
// Only use alias as fallback when canonical is absent — not directly and not via MCP scoping.
|
|
239
|
+
// Prevents the alias from resurfacing alongside the canonical when both are in the active set.
|
|
240
|
+
if (!exact.has(requested) && scopedMatches.length === 0) {
|
|
241
|
+
scopedMatches.push(...aliasFallbacks);
|
|
242
|
+
}
|
|
243
|
+
|
|
223
244
|
if (requested.startsWith("browser_") && scopedMatches.length > 0) {
|
|
224
245
|
for (const match of scopedMatches) resolved.add(match);
|
|
225
246
|
continue;
|
|
@@ -242,6 +263,7 @@ export function buildMinimalAutoGsdToolSet(
|
|
|
242
263
|
activeToolNames: readonly string[],
|
|
243
264
|
unitType: string | undefined,
|
|
244
265
|
registeredToolNames: readonly string[] = activeToolNames,
|
|
266
|
+
warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames,
|
|
245
267
|
): string[] {
|
|
246
268
|
if (unitType === "run-uat") {
|
|
247
269
|
return buildRunUatGsdToolSet(activeToolNames, registeredToolNames);
|
|
@@ -257,7 +279,36 @@ export function buildMinimalAutoGsdToolSet(
|
|
|
257
279
|
[...activeToolNames, ...registeredToolNames],
|
|
258
280
|
[...MINIMAL_GSD_TOOL_NAMES, ...unitTools],
|
|
259
281
|
);
|
|
260
|
-
|
|
282
|
+
const result = withPreservedShimTools([...new Set([...preserved, ...scoped])]);
|
|
283
|
+
warnIfRequiredWorkflowToolsUnresolved(unitType, result, warnOnUnresolvedRequiredTools);
|
|
284
|
+
return result;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function hasResolvedWorkflowTool(
|
|
288
|
+
resolvedToolNames: readonly string[],
|
|
289
|
+
requiredToolName: string,
|
|
290
|
+
): boolean {
|
|
291
|
+
return resolvedToolNames.some(
|
|
292
|
+
(name) => name === requiredToolName || mcpToolMatchesBaseName(name, requiredToolName),
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
function warnIfRequiredWorkflowToolsUnresolved(
|
|
297
|
+
unitType: string | undefined,
|
|
298
|
+
scopedToolNames: readonly string[],
|
|
299
|
+
shouldWarn: boolean,
|
|
300
|
+
): void {
|
|
301
|
+
if (!unitType || !shouldWarn) return;
|
|
302
|
+
|
|
303
|
+
const unresolved = getRequiredWorkflowToolsForUnit(unitType).filter(
|
|
304
|
+
(toolName) => !hasResolvedWorkflowTool(scopedToolNames, toolName),
|
|
305
|
+
);
|
|
306
|
+
if (unresolved.length === 0) return;
|
|
307
|
+
|
|
308
|
+
safetyLogWarning(
|
|
309
|
+
"bootstrap",
|
|
310
|
+
`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.`,
|
|
311
|
+
);
|
|
261
312
|
}
|
|
262
313
|
|
|
263
314
|
export function buildRunUatGsdToolSet(
|
|
@@ -276,7 +327,7 @@ export function buildRunUatGsdToolSet(
|
|
|
276
327
|
const resolved = [...new Set(scoped)];
|
|
277
328
|
|
|
278
329
|
const unresolved = RUN_UAT_WORKFLOW_TOOL_NAMES.filter(
|
|
279
|
-
(tool) => !resolved.some((name) => name === tool || (name
|
|
330
|
+
(tool) => !resolved.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)),
|
|
280
331
|
);
|
|
281
332
|
if (unresolved.length > 0) {
|
|
282
333
|
safetyLogWarning(
|
|
@@ -310,6 +361,7 @@ export function buildRequestScopedGsdToolSet(
|
|
|
310
361
|
requestCustomMessages: readonly { customType?: string }[] | undefined,
|
|
311
362
|
registeredToolNames: readonly string[] = activeToolNames,
|
|
312
363
|
guidedUnitType?: string,
|
|
364
|
+
warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames,
|
|
313
365
|
): string[] | undefined {
|
|
314
366
|
for (let index = (requestCustomMessages?.length ?? 0) - 1; index >= 0; index--) {
|
|
315
367
|
const currentCustomType = requestCustomMessages?.[index]?.customType;
|
|
@@ -320,7 +372,12 @@ export function buildRequestScopedGsdToolSet(
|
|
|
320
372
|
currentCustomType === "gsd-triage"
|
|
321
373
|
) {
|
|
322
374
|
if (guidedUnitType) {
|
|
323
|
-
return buildMinimalAutoGsdToolSet(
|
|
375
|
+
return buildMinimalAutoGsdToolSet(
|
|
376
|
+
activeToolNames,
|
|
377
|
+
guidedUnitType,
|
|
378
|
+
registeredToolNames,
|
|
379
|
+
warnOnUnresolvedRequiredTools,
|
|
380
|
+
);
|
|
324
381
|
}
|
|
325
382
|
return buildMinimalGsdWorkflowToolSet(activeToolNames, registeredToolNames);
|
|
326
383
|
}
|
|
@@ -368,11 +425,23 @@ function applyMinimalGsdToolSurface(pi: ExtensionAPI): void {
|
|
|
368
425
|
if (isFullGsdToolSurfaceRequested()) return;
|
|
369
426
|
const dash = getAutoRuntimeSnapshot();
|
|
370
427
|
if (dash.active && dash.currentUnit) {
|
|
371
|
-
pi.
|
|
372
|
-
|
|
428
|
+
const currentToolNames = pi.getActiveTools();
|
|
429
|
+
const hasRegisteredSurface = typeof pi.getAllTools === "function";
|
|
430
|
+
const registeredToolNames = resolveRegisteredToolNames(pi, currentToolNames);
|
|
431
|
+
const scopedToolNames = buildMinimalAutoGsdToolSet(
|
|
432
|
+
currentToolNames,
|
|
373
433
|
dash.currentUnit.type,
|
|
374
|
-
|
|
375
|
-
|
|
434
|
+
registeredToolNames,
|
|
435
|
+
hasRegisteredSurface,
|
|
436
|
+
);
|
|
437
|
+
recordAutoToolSurfaceSnapshot({
|
|
438
|
+
source: "runtime-scope",
|
|
439
|
+
unitType: dash.currentUnit.type,
|
|
440
|
+
modelFacingToolNames: scopedToolNames,
|
|
441
|
+
registeredToolNames,
|
|
442
|
+
scopedToolNames,
|
|
443
|
+
});
|
|
444
|
+
pi.setActiveTools(scopedToolNames);
|
|
376
445
|
return;
|
|
377
446
|
}
|
|
378
447
|
if (!isGeneralGsdToolScopingRequested()) return;
|
|
@@ -385,10 +454,18 @@ export function scopeGsdWorkflowToolsForDispatch(
|
|
|
385
454
|
): ScopedGsdWorkflowState | null {
|
|
386
455
|
if (isFullGsdToolSurfaceRequested()) return null;
|
|
387
456
|
const current = pi.getActiveTools();
|
|
457
|
+
const hasRegisteredSurface = typeof pi.getAllTools === "function";
|
|
388
458
|
const registeredToolNames = resolveRegisteredToolNames(pi, current);
|
|
389
459
|
const scoped = unitType
|
|
390
|
-
? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames)
|
|
460
|
+
? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames, hasRegisteredSurface)
|
|
391
461
|
: buildMinimalGsdWorkflowToolSet(current, registeredToolNames);
|
|
462
|
+
recordAutoToolSurfaceSnapshot({
|
|
463
|
+
source: "dispatch-scope",
|
|
464
|
+
unitType,
|
|
465
|
+
modelFacingToolNames: scoped,
|
|
466
|
+
registeredToolNames,
|
|
467
|
+
scopedToolNames: scoped,
|
|
468
|
+
});
|
|
392
469
|
const toolsChanged = !(scoped.length === current.length && scoped.every((name, index) => name === current[index]));
|
|
393
470
|
const canScopeSkills = unitHasSkillManifest(unitType) && pi.getVisibleSkills && pi.setVisibleSkills;
|
|
394
471
|
if (!toolsChanged && !canScopeSkills) {
|
|
@@ -539,8 +616,13 @@ function isShellExecutionTool(canonicalName: string): boolean {
|
|
|
539
616
|
|
|
540
617
|
function activateDeferredApprovalGate(basePath: string): void {
|
|
541
618
|
if (deferredApprovalGate?.basePath !== basePath) return;
|
|
542
|
-
|
|
619
|
+
const gateId = deferredApprovalGate.gateId;
|
|
543
620
|
deferredApprovalGate = null;
|
|
621
|
+
const snapshot = refreshWriteGateStateFromDisk(basePath);
|
|
622
|
+
const milestoneId = extractDepthVerificationMilestoneId(gateId);
|
|
623
|
+
if (isApprovalGateVerifiedInSnapshot(snapshot, gateId)) return;
|
|
624
|
+
if (milestoneId && isMilestoneDepthVerifiedInSnapshot(snapshot, milestoneId)) return;
|
|
625
|
+
setPendingGate(gateId, basePath);
|
|
544
626
|
}
|
|
545
627
|
|
|
546
628
|
function extractGateQuestionId(input: unknown): string | undefined {
|
|
@@ -560,6 +642,26 @@ function isContextDraftSummarySave(toolName: string, input: unknown): boolean {
|
|
|
560
642
|
return (input as { artifact_type?: unknown }).artifact_type === "CONTEXT-DRAFT";
|
|
561
643
|
}
|
|
562
644
|
|
|
645
|
+
/**
|
|
646
|
+
* External engines (claude-code-cli) deliver ask_user_questions results as
|
|
647
|
+
* relayed MCP tool results: the structured round payload arrives in
|
|
648
|
+
* `result.structuredContent`, not in pi-native `event.details`. Without this
|
|
649
|
+
* fallback, applyAskUserQuestionsGateResult sees no response for an answered
|
|
650
|
+
* gate question and lands in the "waiting" branch — leaving a re-armed gate
|
|
651
|
+
* permanently pending and the discuss→auto handoff blocked.
|
|
652
|
+
*/
|
|
653
|
+
function resolveAskUserQuestionsGateDetails(event: { details?: unknown; result?: unknown }): any {
|
|
654
|
+
const hasRoundShape = (value: any): boolean =>
|
|
655
|
+
!!value && typeof value === "object" &&
|
|
656
|
+
(value.cancelled !== undefined || value.response !== undefined);
|
|
657
|
+
|
|
658
|
+
const details = event.details as any;
|
|
659
|
+
if (hasRoundShape(details)) return details;
|
|
660
|
+
const structured = (event.result as { structuredContent?: unknown } | undefined)?.structuredContent;
|
|
661
|
+
if (hasRoundShape(structured)) return structured;
|
|
662
|
+
return details ?? {};
|
|
663
|
+
}
|
|
664
|
+
|
|
563
665
|
type StructuredQuestion = {
|
|
564
666
|
id?: string;
|
|
565
667
|
header?: string;
|
|
@@ -697,6 +799,7 @@ function initSessionNotifications(ctx: ExtensionContext): void {
|
|
|
697
799
|
initNotificationStore(resolveNotificationStoreBasePath(contextBasePath(ctx)));
|
|
698
800
|
installNotifyInterceptor(ctx);
|
|
699
801
|
initNotificationWidget(ctx);
|
|
802
|
+
notifyPreferenceDiagnostics(ctx, contextBasePath(ctx), { surface: "session-start" });
|
|
700
803
|
}
|
|
701
804
|
|
|
702
805
|
async function prepareWorkflowMcpForHookContext(
|
|
@@ -768,7 +871,7 @@ export function registerHooks(
|
|
|
768
871
|
}
|
|
769
872
|
});
|
|
770
873
|
|
|
771
|
-
pi.on("session_switch", async (
|
|
874
|
+
pi.on("session_switch", async (event, ctx) => {
|
|
772
875
|
const basePath = contextBasePath(ctx);
|
|
773
876
|
const preserveCloseoutSurface = isAutoCompletionStopInProgress();
|
|
774
877
|
initSessionNotifications(ctx);
|
|
@@ -777,6 +880,13 @@ export function registerHooks(
|
|
|
777
880
|
clearDeferredApprovalGate();
|
|
778
881
|
await resetAskUserQuestionsTurnCache();
|
|
779
882
|
clearDiscussionFlowState(basePath);
|
|
883
|
+
// /clear or /new destroys the conversation holding a discuss interview, so
|
|
884
|
+
// its pending discuss→auto handoff can never be answered — clear it. Resume
|
|
885
|
+
// restores the interview transcript, so the entry survives. Auto-mode's own
|
|
886
|
+
// newSession() calls are safe: the handoff consumes the entry on agent_end.
|
|
887
|
+
if (event.reason === "new") {
|
|
888
|
+
clearPendingAutoStart(basePath);
|
|
889
|
+
}
|
|
780
890
|
await syncServiceTierStatus(ctx);
|
|
781
891
|
await applyDisabledModelProviderPolicy(ctx);
|
|
782
892
|
await applyCompactionThresholdOverride(ctx);
|
|
@@ -994,6 +1104,18 @@ export function registerHooks(
|
|
|
994
1104
|
|
|
995
1105
|
pi.on("message_update", async (event, ctx: ExtensionContext) => {
|
|
996
1106
|
if (approvalQuestionAbortInFlight) return;
|
|
1107
|
+
// If the model asked via ask_user_questions, that in-flight elicitation IS
|
|
1108
|
+
// the human boundary. Arming the pause/gate here (and emitting the "waiting
|
|
1109
|
+
// for your approval - pausing" notice) would tear it down and trigger the
|
|
1110
|
+
// foreground self-cancel/re-ask loop. The marker is set only by the
|
|
1111
|
+
// claude-code-cli SDK elicitation handler and is ungated, so it is true in
|
|
1112
|
+
// foreground; under the native-TUI provider it is always false and this path
|
|
1113
|
+
// runs unchanged (#cc-elicitation-self-cancel).
|
|
1114
|
+
if (isInteractiveElicitationInFlight()) return;
|
|
1115
|
+
// Prose with "?" can stream before the MCP tool/elicitation starts. When the
|
|
1116
|
+
// structured ask_user_questions call is already in the partial message, the
|
|
1117
|
+
// tool IS the human boundary — do not arm the text-based approval pause.
|
|
1118
|
+
if (messageHasPendingAskUserQuestionsTool(event.message)) return;
|
|
997
1119
|
|
|
998
1120
|
const dash = getAutoRuntimeSnapshot();
|
|
999
1121
|
if (dash.active) return;
|
|
@@ -1322,87 +1444,57 @@ export function registerHooks(
|
|
|
1322
1444
|
} else if (isAutoActive()) {
|
|
1323
1445
|
clearToolInvocationError();
|
|
1324
1446
|
}
|
|
1447
|
+
// Interactive Closeout adapter (ADR-032): auto-mode owns closeout for its
|
|
1448
|
+
// own units; interactive completions get the durable git subset (commit +
|
|
1449
|
+
// Closeout Git Verdict) instead of silently bypassing git.isolation.
|
|
1450
|
+
if (!event.isError && !isAutoActive() && isUnitCloseoutTool(toolName)) {
|
|
1451
|
+
try {
|
|
1452
|
+
runInteractiveUnitCloseout({
|
|
1453
|
+
basePath: resolveWorkflowToolBasePath(ctx, event.input as { milestone_id?: string }),
|
|
1454
|
+
canonicalToolName: toolName,
|
|
1455
|
+
input: event.input,
|
|
1456
|
+
});
|
|
1457
|
+
} catch (err) {
|
|
1458
|
+
safetyLogWarning("engine", `interactive unit closeout failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1459
|
+
}
|
|
1460
|
+
}
|
|
1325
1461
|
if (toolName !== "ask_user_questions") return;
|
|
1326
1462
|
const basePath = contextBasePath(ctx);
|
|
1327
1463
|
const milestoneId = await getDiscussionMilestoneIdFor(basePath);
|
|
1328
1464
|
|
|
1329
|
-
const details = event
|
|
1330
|
-
|
|
1331
|
-
// ── Discussion gate enforcement: handle gate question responses ──
|
|
1332
|
-
// If the result is cancelled or has no response, the pending gate stays active
|
|
1333
|
-
// so the model is blocked from non-read-only tools until it re-asks.
|
|
1334
|
-
// If the user responded at all (even "needs adjustment"), clear the pending gate
|
|
1335
|
-
// because the user engaged — the prompt handles the re-ask-after-adjustment flow.
|
|
1336
|
-
const questions: any[] = (event.input as any)?.questions ?? [];
|
|
1337
|
-
const currentPendingGate = getPendingGate(basePath);
|
|
1338
|
-
if (currentPendingGate) {
|
|
1339
|
-
if (details?.cancelled || !details?.response) {
|
|
1340
|
-
// Gate stays pending. Direct the agent to the most reliable recovery
|
|
1341
|
-
// path — re-calling ask_user_questions with the same gate id — without
|
|
1342
|
-
// misrepresenting the plain-text path. The plain-text path also works
|
|
1343
|
-
// (isExplicitApprovalResponse on the next before_agent_start clears
|
|
1344
|
-
// the gate when the user replies with an approval keyword), but the
|
|
1345
|
-
// structured re-ask is more deterministic and gives the user a clear UI.
|
|
1346
|
-
resetToolCallLoopGuard();
|
|
1347
|
-
const interrupted = details?.interrupted === true;
|
|
1348
|
-
if (ctx) {
|
|
1349
|
-
await maybePauseAutoForApprovalGate(
|
|
1350
|
-
ctx,
|
|
1351
|
-
pi,
|
|
1352
|
-
true,
|
|
1353
|
-
interrupted
|
|
1354
|
-
? "Depth confirmation was interrupted — pausing auto-mode until you respond."
|
|
1355
|
-
: "Depth confirmation is waiting for your answer — pausing auto-mode.",
|
|
1356
|
-
);
|
|
1357
|
-
}
|
|
1358
|
-
return {
|
|
1359
|
-
content: [{
|
|
1360
|
-
type: "text" as const,
|
|
1361
|
-
text: [
|
|
1362
|
-
`Waiting for depth confirmation on gate "${currentPendingGate}".`,
|
|
1363
|
-
interrupted
|
|
1364
|
-
? "The confirmation question was interrupted before a response was recorded."
|
|
1365
|
-
: "No user response was received for the confirmation question.",
|
|
1366
|
-
"Do not infer approval from earlier or prior messages.",
|
|
1367
|
-
"Do not proceed, write files, save artifacts, or call other tools.",
|
|
1368
|
-
`Re-call ask_user_questions with the same gate question id ("${currentPendingGate}") and wait for the user's response.`,
|
|
1369
|
-
].join(" "),
|
|
1370
|
-
}],
|
|
1371
|
-
};
|
|
1372
|
-
} else {
|
|
1373
|
-
const pendingQuestion = questions.find((question) => question?.id === currentPendingGate);
|
|
1374
|
-
if (pendingQuestion) {
|
|
1375
|
-
const answer = details.response?.answers?.[currentPendingGate];
|
|
1376
|
-
if (isDepthConfirmationAnswer(answer?.selected, pendingQuestion.options)) {
|
|
1377
|
-
markApprovalGateVerified(currentPendingGate, basePath);
|
|
1378
|
-
const milestoneIdFromGate = extractDepthVerificationMilestoneId(currentPendingGate);
|
|
1379
|
-
if (milestoneIdFromGate) markDepthVerified(milestoneIdFromGate, basePath);
|
|
1380
|
-
clearPendingGate(basePath);
|
|
1381
|
-
clearDeferredApprovalGate(basePath);
|
|
1382
|
-
}
|
|
1383
|
-
}
|
|
1384
|
-
}
|
|
1385
|
-
}
|
|
1386
|
-
|
|
1387
|
-
if (details?.cancelled || !details?.response) return;
|
|
1465
|
+
const details = resolveAskUserQuestionsGateDetails(event);
|
|
1388
1466
|
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1467
|
+
const questions: any[] = (event.input as any)?.questions ?? details?.questions ?? [];
|
|
1468
|
+
const gateResult = applyAskUserQuestionsGateResult({
|
|
1469
|
+
basePath,
|
|
1470
|
+
questions,
|
|
1471
|
+
details,
|
|
1472
|
+
fallbackMilestoneId: milestoneId,
|
|
1473
|
+
});
|
|
1474
|
+
if (gateResult.status === "waiting") {
|
|
1475
|
+
resetToolCallLoopGuard();
|
|
1476
|
+
if (ctx) {
|
|
1477
|
+
await maybePauseAutoForApprovalGate(
|
|
1478
|
+
ctx,
|
|
1479
|
+
pi,
|
|
1480
|
+
true,
|
|
1481
|
+
gateResult.interrupted
|
|
1482
|
+
? "Depth confirmation was interrupted — pausing auto-mode until you respond."
|
|
1483
|
+
: "Depth confirmation is waiting for your answer — pausing auto-mode.",
|
|
1484
|
+
);
|
|
1403
1485
|
}
|
|
1486
|
+
return {
|
|
1487
|
+
content: [{
|
|
1488
|
+
type: "text" as const,
|
|
1489
|
+
text: formatPendingAskUserQuestionsGateMessage(gateResult.pendingGateId, gateResult.interrupted),
|
|
1490
|
+
}],
|
|
1491
|
+
};
|
|
1492
|
+
}
|
|
1493
|
+
if (gateResult.status === "verified") {
|
|
1494
|
+
clearDeferredApprovalGate(basePath);
|
|
1404
1495
|
}
|
|
1405
1496
|
|
|
1497
|
+
if (details?.cancelled || !details?.response) return;
|
|
1406
1498
|
if (!milestoneId) return;
|
|
1407
1499
|
await saveDiscussionQuestionRound(basePath, milestoneId, questions, details);
|
|
1408
1500
|
});
|
|
@@ -1413,10 +1505,42 @@ export function registerHooks(
|
|
|
1413
1505
|
if (toolName === "ask_user_questions") {
|
|
1414
1506
|
const questionId = extractGateQuestionId(event.args);
|
|
1415
1507
|
if (typeof questionId === "string") {
|
|
1416
|
-
|
|
1508
|
+
// External engines (claude-code-cli) ingest the SDK turn's tool blocks
|
|
1509
|
+
// post-hoc, so this event can fire AFTER the workflow MCP child already
|
|
1510
|
+
// verified this gate and allowed the CONTEXT save. setPendingGate also
|
|
1511
|
+
// revokes verifiedDepthMilestones/verifiedApprovalGates, so an
|
|
1512
|
+
// unconditional re-arm here wipes the child's verification and leaves
|
|
1513
|
+
// the discuss→auto handoff permanently blocked. Skip the re-arm when
|
|
1514
|
+
// the snapshot already records this exact gate as verified — mirrors
|
|
1515
|
+
// activateDeferredApprovalGate's guard. Stale verified state cannot
|
|
1516
|
+
// leak into a later re-discussion: a successful handoff deletes the
|
|
1517
|
+
// snapshot via clearDiscussionFlowState.
|
|
1518
|
+
const snapshot = refreshWriteGateStateFromDisk(basePath);
|
|
1519
|
+
const gateMilestoneId = extractDepthVerificationMilestoneId(questionId);
|
|
1520
|
+
const alreadyVerified =
|
|
1521
|
+
isApprovalGateVerifiedInSnapshot(snapshot, questionId) ||
|
|
1522
|
+
isMilestoneDepthVerifiedInSnapshot(snapshot, gateMilestoneId);
|
|
1523
|
+
if (!alreadyVerified) {
|
|
1524
|
+
setPendingGate(questionId, basePath);
|
|
1525
|
+
}
|
|
1417
1526
|
clearDeferredApprovalGate(basePath);
|
|
1418
1527
|
}
|
|
1419
1528
|
}
|
|
1529
|
+
|
|
1530
|
+
// Safety harness: record evidence here, not only in tool_call. External
|
|
1531
|
+
// engines (claude-code-cli) pre-execute tools, so the agent loop skips
|
|
1532
|
+
// beforeToolCall/tool_call for them — tool_execution_start is the only
|
|
1533
|
+
// event that fires for every tool call. recordToolCall dedupes by
|
|
1534
|
+
// toolCallId, so native tools (which hit both events) record once.
|
|
1535
|
+
safetyRecordToolCall(event.toolCallId, event.toolName, (event.args ?? {}) as Record<string, unknown>);
|
|
1536
|
+
const execDash = getAutoRuntimeSnapshot();
|
|
1537
|
+
if (execDash.basePath && execDash.currentUnit?.type === "execute-task") {
|
|
1538
|
+
const { milestone: xMid, slice: xSid, task: xTid } = parseUnitId(execDash.currentUnit.id);
|
|
1539
|
+
if (xMid && xSid && xTid) {
|
|
1540
|
+
saveEvidenceToDisk(execDash.basePath, xMid, xSid, xTid);
|
|
1541
|
+
}
|
|
1542
|
+
}
|
|
1543
|
+
|
|
1420
1544
|
if (!isAutoActive()) return;
|
|
1421
1545
|
markToolStart(event.toolCallId, event.toolName);
|
|
1422
1546
|
});
|
|
@@ -1458,66 +1582,10 @@ export function registerHooks(
|
|
|
1458
1582
|
const payload = event.payload as Record<string, unknown> | null;
|
|
1459
1583
|
if (!payload || typeof payload !== "object") return;
|
|
1460
1584
|
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
const {
|
|
1466
|
-
createObservationMask,
|
|
1467
|
-
createResponsesInputObservationMask,
|
|
1468
|
-
truncateContextResultMessages,
|
|
1469
|
-
truncateResponsesInputResultItems,
|
|
1470
|
-
} = await import("../context-masker.js");
|
|
1471
|
-
const prefs = loadEffectiveGSDPreferences();
|
|
1472
|
-
const cmConfig = prefs?.preferences.context_management;
|
|
1473
|
-
|
|
1474
|
-
// Observation masking: replace old tool results with placeholders.
|
|
1475
|
-
// Only active during auto-mode when context_management.observation_masking is enabled.
|
|
1476
|
-
if (isAutoActive() && cmConfig?.observation_masking !== false) {
|
|
1477
|
-
const keepTurns = cmConfig?.observation_mask_turns ?? 8;
|
|
1478
|
-
const messages = payload.messages;
|
|
1479
|
-
if (Array.isArray(messages)) {
|
|
1480
|
-
payload.messages = createObservationMask(keepTurns)(messages);
|
|
1481
|
-
}
|
|
1482
|
-
const input = payload.input;
|
|
1483
|
-
if (Array.isArray(input)) {
|
|
1484
|
-
payload.input = createResponsesInputObservationMask(keepTurns)(input);
|
|
1485
|
-
}
|
|
1486
|
-
}
|
|
1487
|
-
|
|
1488
|
-
// Tool result truncation: cap individual tool result content length.
|
|
1489
|
-
// Applies in ALL modes (auto + interactive) to prevent context bloat.
|
|
1490
|
-
// In pi-ai format, toolResult messages have role: "toolResult" and content: TextContent[].
|
|
1491
|
-
// Creates new objects to avoid mutating shared conversation state.
|
|
1492
|
-
const maxChars = cmConfig?.tool_result_max_chars ?? 800;
|
|
1493
|
-
const msgs = payload.messages;
|
|
1494
|
-
if (Array.isArray(msgs)) {
|
|
1495
|
-
payload.messages = truncateContextResultMessages(msgs as any, maxChars);
|
|
1496
|
-
}
|
|
1497
|
-
const input = payload.input;
|
|
1498
|
-
if (Array.isArray(input)) {
|
|
1499
|
-
payload.input = truncateResponsesInputResultItems(input as any, maxChars);
|
|
1500
|
-
}
|
|
1501
|
-
} catch { /* non-fatal */ }
|
|
1502
|
-
|
|
1503
|
-
try {
|
|
1504
|
-
if (isAutoActive()) {
|
|
1505
|
-
const sourceContextBlock = getSourceObservationStore().renderActiveBlock();
|
|
1506
|
-
if (sourceContextBlock) {
|
|
1507
|
-
const nextPayload = injectSourceContextBlockIntoPayload(payload, sourceContextBlock);
|
|
1508
|
-
Object.assign(payload, nextPayload);
|
|
1509
|
-
}
|
|
1510
|
-
}
|
|
1511
|
-
} catch { /* non-fatal */ }
|
|
1512
|
-
|
|
1513
|
-
// ── Service Tier ────────────────────────────────────────────────────
|
|
1514
|
-
const modelId = event.model?.id;
|
|
1515
|
-
if (!modelId) return payload;
|
|
1516
|
-
const { getEffectiveServiceTier, supportsServiceTier } = await import("../service-tier.js");
|
|
1517
|
-
const tier = getEffectiveServiceTier();
|
|
1518
|
-
if (!tier || !supportsServiceTier(modelId)) return payload;
|
|
1519
|
-
payload.service_tier = tier;
|
|
1520
|
-
return payload;
|
|
1585
|
+
return applyProviderPayloadPolicy({
|
|
1586
|
+
payload,
|
|
1587
|
+
modelId: event.model?.id,
|
|
1588
|
+
});
|
|
1521
1589
|
});
|
|
1522
1590
|
|
|
1523
1591
|
// Capability-aware model routing hook (ADR-004)
|
|
@@ -1553,31 +1621,53 @@ export function registerHooks(
|
|
|
1553
1621
|
return surfaceReduced ? { toolNames: providerCompatible } : undefined;
|
|
1554
1622
|
}
|
|
1555
1623
|
const registeredToolNames = resolveRegisteredToolNames(pi, event.activeToolNames);
|
|
1624
|
+
const hasRegisteredSurface = typeof pi.getAllTools === "function";
|
|
1556
1625
|
const compatibleRegisteredToolNames = filterToolsForProvider(
|
|
1557
1626
|
registeredToolNames,
|
|
1558
1627
|
event.selectedModelApi,
|
|
1559
1628
|
event.selectedModelProvider,
|
|
1560
1629
|
).compatible.filter((name) => !(dropAliases && isWorkflowAliasTool(name)));
|
|
1561
1630
|
const guidedUnit = getGuidedUnitContext();
|
|
1631
|
+
const requestRegisteredToolNames = guidedUnit?.unitType === "run-uat"
|
|
1632
|
+
? compatibleRegisteredToolNames
|
|
1633
|
+
: registeredToolNames;
|
|
1562
1634
|
const requestScoped = buildRequestScopedGsdToolSet(
|
|
1563
1635
|
guidedUnit?.unitType === "run-uat" ? aliasFilteredCompatible : providerCompatible,
|
|
1564
1636
|
event.requestCustomMessages,
|
|
1565
|
-
|
|
1637
|
+
requestRegisteredToolNames,
|
|
1566
1638
|
guidedUnit?.unitType,
|
|
1639
|
+
hasRegisteredSurface,
|
|
1567
1640
|
);
|
|
1568
1641
|
if (requestScoped) {
|
|
1642
|
+
recordAutoToolSurfaceSnapshot({
|
|
1643
|
+
source: "provider-adjustment",
|
|
1644
|
+
unitType: guidedUnit?.unitType,
|
|
1645
|
+
modelFacingToolNames: requestScoped,
|
|
1646
|
+
registeredToolNames: requestRegisteredToolNames,
|
|
1647
|
+
scopedToolNames: requestScoped,
|
|
1648
|
+
});
|
|
1569
1649
|
return { toolNames: requestScoped };
|
|
1570
1650
|
}
|
|
1571
1651
|
const dash = getAutoRuntimeSnapshot();
|
|
1572
1652
|
if (dash.active && dash.currentUnit) {
|
|
1653
|
+
const registeredForUnit = dash.currentUnit.type === "run-uat"
|
|
1654
|
+
? compatibleRegisteredToolNames
|
|
1655
|
+
: resolveRegisteredToolNames(pi, event.activeToolNames);
|
|
1656
|
+
const scopedToolNames = buildMinimalAutoGsdToolSet(
|
|
1657
|
+
dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible,
|
|
1658
|
+
dash.currentUnit.type,
|
|
1659
|
+
registeredForUnit,
|
|
1660
|
+
hasRegisteredSurface,
|
|
1661
|
+
);
|
|
1662
|
+
recordAutoToolSurfaceSnapshot({
|
|
1663
|
+
source: "provider-adjustment",
|
|
1664
|
+
unitType: dash.currentUnit.type,
|
|
1665
|
+
modelFacingToolNames: scopedToolNames,
|
|
1666
|
+
registeredToolNames: registeredForUnit,
|
|
1667
|
+
scopedToolNames,
|
|
1668
|
+
});
|
|
1573
1669
|
return {
|
|
1574
|
-
toolNames:
|
|
1575
|
-
dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible,
|
|
1576
|
-
dash.currentUnit.type,
|
|
1577
|
-
dash.currentUnit.type === "run-uat"
|
|
1578
|
-
? compatibleRegisteredToolNames
|
|
1579
|
-
: resolveRegisteredToolNames(pi, event.activeToolNames),
|
|
1580
|
-
),
|
|
1670
|
+
toolNames: scopedToolNames,
|
|
1581
1671
|
};
|
|
1582
1672
|
}
|
|
1583
1673
|
if (isGeneralGsdToolScopingRequested()) {
|