@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.9ad8ae33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.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/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 +3 -0
- 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/stream-adapter.js +30 -4
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +89 -54
- package/dist/resources/extensions/gsd/auto/phases.js +49 -6
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +35 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +41 -18
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +44 -91
- package/dist/resources/extensions/gsd/auto.js +41 -14
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +23 -6
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +212 -48
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
- 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 +4 -6
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
- package/dist/resources/extensions/gsd/db/queries.js +26 -0
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +2 -6
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +9 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +2 -1
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +23 -5
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +27 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/state.js +6 -20
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
- package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
- 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/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +337 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-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-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree-root.js +11 -0
- package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
- package/dist/resources/extensions/gsd/worktree.js +8 -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/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/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/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/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 +13 -13
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -15
- package/package.json +2 -2
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/cli.js +9 -1
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +116 -39
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/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/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 +35 -125
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +46 -120
- 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/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/bg-shell/utilities.ts +3 -0
- 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/stream-adapter.ts +34 -4
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +98 -56
- package/src/resources/extensions/gsd/auto/phases.ts +65 -26
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +40 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +42 -21
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +44 -94
- package/src/resources/extensions/gsd/auto.ts +52 -16
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +23 -6
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -47
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
- 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 +4 -6
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
- package/src/resources/extensions/gsd/db/queries.ts +37 -0
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +2 -7
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +11 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +4 -3
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +37 -28
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +33 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/state.ts +9 -21
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +73 -58
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/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 +76 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.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 +67 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
- package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
- 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/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +412 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-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-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree-root.ts +12 -0
- package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
- package/src/resources/extensions/gsd/worktree.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/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 -218
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_ssgManifest.js +0 -0
|
@@ -7,7 +7,8 @@ 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 { applyAskUserQuestionsGateResult,
|
|
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";
|
|
@@ -19,23 +20,28 @@ import { saveActivityLog } from "../activity-log.js";
|
|
|
19
20
|
import { recordToolCall as safetyRecordToolCall, recordToolResult as safetyRecordToolResult, saveEvidenceToDisk } from "../safety/evidence-collector.js";
|
|
20
21
|
import { parseUnitId } from "../unit-id.js";
|
|
21
22
|
import { classifyCommand } from "../safety/destructive-guard.js";
|
|
23
|
+
import { confirmDestructiveCommand, consumeDestructiveConfirmation, isDestructiveConfirmGateId, requestDestructiveConfirmation, } from "../safety/destructive-confirmation.js";
|
|
22
24
|
import { logWarning as safetyLogWarning } from "../workflow-logger.js";
|
|
25
|
+
import { isUnitCloseoutTool, runInteractiveUnitCloseout } from "../unit-closeout.js";
|
|
23
26
|
import { installNotifyInterceptor } from "./notify-interceptor.js";
|
|
24
27
|
import { initNotificationStore } from "../notification-store.js";
|
|
25
28
|
import { initNotificationWidget } from "../notification-widget.js";
|
|
26
29
|
import { notifyPreferenceDiagnostics } from "../preferences-diagnostics.js";
|
|
27
30
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
28
31
|
import { extractSubagentAgentClasses } from "./subagent-input.js";
|
|
29
|
-
import { approvalGateIdForUnit, isExplicitApprovalResponse, messageHasPendingAskUserQuestionsTool,
|
|
32
|
+
import { approvalGateIdForUnit, evaluateAskUserQuestionsRound, formatUnansweredConsentQuestionMessage, isExplicitApprovalResponse, messageHasPendingAskUserQuestionsTool, shouldPauseForQuestion, } from "../consent-question.js";
|
|
30
33
|
import { applyUnitSkillVisibility, unitHasSkillManifest } from "../skill-scope.js";
|
|
31
34
|
import { getGuidedUnitContext } from "../guided-unit-context.js";
|
|
32
35
|
import { registerPlanMilestoneSchemaRecovery } from "./plan-milestone-schema-recovery.js";
|
|
33
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";
|
|
34
38
|
import { filterToolsForProvider } from "../model-router.js";
|
|
35
39
|
import { mcpToolMatchesBaseName } from "../mcp-tool-name.js";
|
|
36
40
|
import { RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES } from "../tool-presentation-plan.js";
|
|
37
41
|
import { supportsSourceObservationsForUnit } from "../source-observations.js";
|
|
38
42
|
import { clearPendingAutoStart } from "../pending-auto-start.js";
|
|
43
|
+
import { resolveWorkflowToolBasePath } from "./dynamic-tools.js";
|
|
44
|
+
import { getRequiredWorkflowToolsForUnit } from "../unit-tool-contracts.js";
|
|
39
45
|
let approvalQuestionAbortInFlight = false;
|
|
40
46
|
async function loadWelcomeScreenModule() {
|
|
41
47
|
const candidates = [];
|
|
@@ -104,7 +110,13 @@ async function installWelcomeHeader(ctx) {
|
|
|
104
110
|
/* non-fatal */
|
|
105
111
|
}
|
|
106
112
|
}
|
|
107
|
-
|
|
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();
|
|
108
120
|
export const MINIMAL_GSD_TOOL_NAMES = [
|
|
109
121
|
"gsd_exec",
|
|
110
122
|
"gsd_exec_search",
|
|
@@ -138,7 +150,7 @@ function withPreservedShimTools(toolNames) {
|
|
|
138
150
|
}
|
|
139
151
|
/** True for the browser automation tools (browser_navigate, browser_click, ...). */
|
|
140
152
|
function isBrowserTool(toolName) {
|
|
141
|
-
return canonicalToolName(toolName)
|
|
153
|
+
return hasBrowserContractPrefix(canonicalToolName(toolName));
|
|
142
154
|
}
|
|
143
155
|
/**
|
|
144
156
|
* True when any message in the request is driven by a GSD workflow command
|
|
@@ -200,7 +212,7 @@ export function buildMinimalGsdToolSet(activeToolNames) {
|
|
|
200
212
|
const minimal = resolveScopedToolNames(activeToolNames, MINIMAL_GSD_TOOL_NAMES);
|
|
201
213
|
return withPreservedShimTools([...new Set([...preserved, ...minimal])]);
|
|
202
214
|
}
|
|
203
|
-
export function buildMinimalAutoGsdToolSet(activeToolNames, unitType, registeredToolNames = activeToolNames) {
|
|
215
|
+
export function buildMinimalAutoGsdToolSet(activeToolNames, unitType, registeredToolNames = activeToolNames, warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames) {
|
|
204
216
|
if (unitType === "run-uat") {
|
|
205
217
|
return buildRunUatGsdToolSet(activeToolNames, registeredToolNames);
|
|
206
218
|
}
|
|
@@ -212,7 +224,20 @@ export function buildMinimalAutoGsdToolSet(activeToolNames, unitType, registered
|
|
|
212
224
|
...availableBaseTools,
|
|
213
225
|
])];
|
|
214
226
|
const scoped = resolveScopedToolNames([...activeToolNames, ...registeredToolNames], [...MINIMAL_GSD_TOOL_NAMES, ...unitTools]);
|
|
215
|
-
|
|
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.`);
|
|
216
241
|
}
|
|
217
242
|
export function buildRunUatGsdToolSet(activeToolNames, registeredToolNames = activeToolNames) {
|
|
218
243
|
const scoped = resolveScopedToolNames([...activeToolNames, ...registeredToolNames], [
|
|
@@ -238,7 +263,7 @@ export function buildMinimalGsdWorkflowToolSet(activeToolNames, registeredToolNa
|
|
|
238
263
|
const scoped = resolveScopedToolNames([...activeToolNames, ...registeredToolNames], WORKFLOW_GSD_TOOL_NAMES);
|
|
239
264
|
return withPreservedShimTools([...new Set([...preserved, ...scoped])]);
|
|
240
265
|
}
|
|
241
|
-
export function buildRequestScopedGsdToolSet(activeToolNames, requestCustomMessages, registeredToolNames = activeToolNames, guidedUnitType) {
|
|
266
|
+
export function buildRequestScopedGsdToolSet(activeToolNames, requestCustomMessages, registeredToolNames = activeToolNames, guidedUnitType, warnOnUnresolvedRequiredTools = registeredToolNames !== activeToolNames) {
|
|
242
267
|
for (let index = (requestCustomMessages?.length ?? 0) - 1; index >= 0; index--) {
|
|
243
268
|
const currentCustomType = requestCustomMessages?.[index]?.customType;
|
|
244
269
|
if (currentCustomType === "gsd-run" ||
|
|
@@ -246,7 +271,7 @@ export function buildRequestScopedGsdToolSet(activeToolNames, requestCustomMessa
|
|
|
246
271
|
currentCustomType === "gsd-doctor-heal" ||
|
|
247
272
|
currentCustomType === "gsd-triage") {
|
|
248
273
|
if (guidedUnitType) {
|
|
249
|
-
return buildMinimalAutoGsdToolSet(activeToolNames, guidedUnitType, registeredToolNames);
|
|
274
|
+
return buildMinimalAutoGsdToolSet(activeToolNames, guidedUnitType, registeredToolNames, warnOnUnresolvedRequiredTools);
|
|
250
275
|
}
|
|
251
276
|
return buildMinimalGsdWorkflowToolSet(activeToolNames, registeredToolNames);
|
|
252
277
|
}
|
|
@@ -280,8 +305,9 @@ function applyMinimalGsdToolSurface(pi) {
|
|
|
280
305
|
const dash = getAutoRuntimeSnapshot();
|
|
281
306
|
if (dash.active && dash.currentUnit) {
|
|
282
307
|
const currentToolNames = pi.getActiveTools();
|
|
308
|
+
const hasRegisteredSurface = typeof pi.getAllTools === "function";
|
|
283
309
|
const registeredToolNames = resolveRegisteredToolNames(pi, currentToolNames);
|
|
284
|
-
const scopedToolNames = buildMinimalAutoGsdToolSet(currentToolNames, dash.currentUnit.type, registeredToolNames);
|
|
310
|
+
const scopedToolNames = buildMinimalAutoGsdToolSet(currentToolNames, dash.currentUnit.type, registeredToolNames, hasRegisteredSurface);
|
|
285
311
|
recordAutoToolSurfaceSnapshot({
|
|
286
312
|
source: "runtime-scope",
|
|
287
313
|
unitType: dash.currentUnit.type,
|
|
@@ -300,9 +326,10 @@ export function scopeGsdWorkflowToolsForDispatch(pi, unitType) {
|
|
|
300
326
|
if (isFullGsdToolSurfaceRequested())
|
|
301
327
|
return null;
|
|
302
328
|
const current = pi.getActiveTools();
|
|
329
|
+
const hasRegisteredSurface = typeof pi.getAllTools === "function";
|
|
303
330
|
const registeredToolNames = resolveRegisteredToolNames(pi, current);
|
|
304
331
|
const scoped = unitType
|
|
305
|
-
? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames)
|
|
332
|
+
? buildMinimalAutoGsdToolSet(current, unitType, registeredToolNames, hasRegisteredSurface)
|
|
306
333
|
: buildMinimalGsdWorkflowToolSet(current, registeredToolNames);
|
|
307
334
|
recordAutoToolSurfaceSnapshot({
|
|
308
335
|
source: "dispatch-scope",
|
|
@@ -388,12 +415,24 @@ async function applyCompactionThresholdOverride(ctx) {
|
|
|
388
415
|
}
|
|
389
416
|
}
|
|
390
417
|
function clearDeferredApprovalGate(basePath) {
|
|
391
|
-
if (!basePath
|
|
392
|
-
|
|
418
|
+
if (!basePath) {
|
|
419
|
+
deferredApprovalGates.clear();
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
deferredApprovalGates.delete(basePath);
|
|
393
423
|
}
|
|
394
424
|
}
|
|
395
425
|
function deferApprovalGate(gateId, basePath) {
|
|
396
|
-
|
|
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);
|
|
397
436
|
}
|
|
398
437
|
function contextBasePath(ctx) {
|
|
399
438
|
return typeof ctx?.cwd === "string" ? ctx.cwd : process.cwd();
|
|
@@ -443,18 +482,14 @@ function isShellExecutionTool(canonicalName) {
|
|
|
443
482
|
canonicalName === "powershell";
|
|
444
483
|
}
|
|
445
484
|
function activateDeferredApprovalGate(basePath) {
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
const gateId = deferredApprovalGate.gateId;
|
|
449
|
-
deferredApprovalGate = null;
|
|
450
|
-
refreshWriteGateStateFromDisk(basePath);
|
|
451
|
-
const snapshot = loadWriteGateSnapshot(basePath);
|
|
452
|
-
const milestoneId = extractDepthVerificationMilestoneId(gateId);
|
|
453
|
-
if (isApprovalGateVerifiedInSnapshot(snapshot, gateId))
|
|
454
|
-
return;
|
|
455
|
-
if (milestoneId && isMilestoneDepthVerifiedInSnapshot(snapshot, milestoneId))
|
|
485
|
+
const gateId = deferredApprovalGates.get(basePath);
|
|
486
|
+
if (gateId === undefined)
|
|
456
487
|
return;
|
|
457
|
-
|
|
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);
|
|
458
493
|
}
|
|
459
494
|
function extractGateQuestionId(input) {
|
|
460
495
|
const questions = input?.questions ?? [];
|
|
@@ -463,7 +498,7 @@ function extractGateQuestionId(input) {
|
|
|
463
498
|
}
|
|
464
499
|
function isApprovalGateBlocking(basePath) {
|
|
465
500
|
return Boolean(getPendingGate(basePath))
|
|
466
|
-
|| (
|
|
501
|
+
|| deferredApprovalGates.has(basePath);
|
|
467
502
|
}
|
|
468
503
|
function isContextDraftSummarySave(toolName, input) {
|
|
469
504
|
if (toolName !== "gsd_summary_save" && toolName !== "summary_save")
|
|
@@ -472,6 +507,25 @@ function isContextDraftSummarySave(toolName, input) {
|
|
|
472
507
|
return false;
|
|
473
508
|
return input.artifact_type === "CONTEXT-DRAFT";
|
|
474
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
|
+
}
|
|
475
529
|
function selectedAnswerLabel(selected) {
|
|
476
530
|
if (Array.isArray(selected))
|
|
477
531
|
return selected.map(String).join(", ");
|
|
@@ -551,7 +605,8 @@ function withDepthGateDisplayReason(result, displayReason = "Depth confirmation
|
|
|
551
605
|
return { ...result, displayReason };
|
|
552
606
|
}
|
|
553
607
|
function shouldBlockDeferredApprovalTool(toolName, input, basePath) {
|
|
554
|
-
|
|
608
|
+
const deferredGateId = deferredApprovalGates.get(basePath);
|
|
609
|
+
if (deferredGateId === undefined)
|
|
555
610
|
return { block: false };
|
|
556
611
|
if (toolName === "ask_user_questions")
|
|
557
612
|
return { block: false };
|
|
@@ -560,7 +615,7 @@ function shouldBlockDeferredApprovalTool(toolName, input, basePath) {
|
|
|
560
615
|
return withDepthGateDisplayReason({
|
|
561
616
|
block: true,
|
|
562
617
|
reason: [
|
|
563
|
-
`HARD BLOCK: Approval question "${
|
|
618
|
+
`HARD BLOCK: Approval question "${deferredGateId}" has been shown to the user.`,
|
|
564
619
|
`Only CONTEXT-DRAFT persistence may finish in this same assistant turn.`,
|
|
565
620
|
`Wait for the user's answer before calling additional tools.`,
|
|
566
621
|
].join(" "),
|
|
@@ -676,11 +731,13 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
676
731
|
const beforeAgentBasePath = contextBasePath(ctx);
|
|
677
732
|
const pendingApprovalGate = getPendingGate(beforeAgentBasePath);
|
|
678
733
|
if (pendingApprovalGate && isExplicitApprovalResponse(event.prompt, pendingApprovalGate)) {
|
|
679
|
-
|
|
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);
|
|
680
737
|
const milestoneId = extractDepthVerificationMilestoneId(pendingApprovalGate);
|
|
681
738
|
if (milestoneId)
|
|
682
|
-
markDepthVerified(milestoneId, beforeAgentBasePath);
|
|
683
|
-
|
|
739
|
+
hostWriteGateAdapter.markDepthVerified(milestoneId, beforeAgentBasePath);
|
|
740
|
+
hostWriteGateAdapter.clearPending(beforeAgentBasePath);
|
|
684
741
|
if (isAutoPaused() && !isAutoActive()) {
|
|
685
742
|
const { resumeAutoAfterProviderDelay } = await import("./provider-error-resume.js");
|
|
686
743
|
void resumeAutoAfterProviderDelay(pi, ctx).catch((err) => {
|
|
@@ -881,7 +938,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
881
938
|
unitId = milestoneId;
|
|
882
939
|
}
|
|
883
940
|
}
|
|
884
|
-
if (!
|
|
941
|
+
if (!shouldPauseForQuestion(unitType, [event.message]))
|
|
885
942
|
return;
|
|
886
943
|
const gateId = approvalGateIdForUnit(unitType, unitId);
|
|
887
944
|
if (gateId) {
|
|
@@ -895,7 +952,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
895
952
|
deferApprovalGate(gateId, contextBasePath(ctx));
|
|
896
953
|
}
|
|
897
954
|
approvalQuestionAbortInFlight = true;
|
|
898
|
-
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");
|
|
899
956
|
// The durable pending gate is activated at agent_end so same-turn
|
|
900
957
|
// CONTEXT-DRAFT persistence can finish after the text boundary streams.
|
|
901
958
|
// The tool_call hook below still blocks non-draft tools in this turn.
|
|
@@ -921,6 +978,13 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
921
978
|
saveActivityLog(ctx, dash.basePath, dash.currentUnit.type, dash.currentUnit.id);
|
|
922
979
|
}
|
|
923
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.
|
|
924
988
|
pi.on("tool_call", async (event, ctx) => {
|
|
925
989
|
const discussionBasePath = contextBasePath(ctx);
|
|
926
990
|
const toolName = canonicalToolName(event.toolName);
|
|
@@ -1055,6 +1119,11 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1055
1119
|
}
|
|
1056
1120
|
});
|
|
1057
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.
|
|
1058
1127
|
pi.on("tool_call", async (event, ctx) => {
|
|
1059
1128
|
markToolStart(event.toolCallId, event.toolName);
|
|
1060
1129
|
safetyRecordToolCall(event.toolCallId, event.toolName, event.input);
|
|
@@ -1072,24 +1141,45 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1072
1141
|
}
|
|
1073
1142
|
// Destructive command classification + hard gate in all modes.
|
|
1074
1143
|
if (isToolCallEventType("bash", event)) {
|
|
1075
|
-
const
|
|
1144
|
+
const command = event.input.command;
|
|
1145
|
+
const classification = classifyCommand(command);
|
|
1076
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);
|
|
1077
1161
|
const reason = [
|
|
1078
1162
|
"HARD BLOCK: destructive Bash command requires explicit human confirmation.",
|
|
1079
1163
|
`Detected: ${classification.labels.join(", ")}`,
|
|
1080
|
-
"
|
|
1081
|
-
"
|
|
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.",
|
|
1082
1167
|
].join(" ");
|
|
1083
1168
|
safetyLogWarning("safety", `destructive command: ${classification.labels.join(", ")}`, {
|
|
1084
|
-
command: String(
|
|
1169
|
+
command: String(command).slice(0, 200),
|
|
1085
1170
|
});
|
|
1086
1171
|
if (ctx) {
|
|
1087
|
-
await maybePauseAutoForApprovalGate(ctx, pi, isAutoActive(), "
|
|
1172
|
+
await maybePauseAutoForApprovalGate(ctx, pi, isAutoActive(), "Destructive-command confirmation is waiting for your answer — pausing auto-mode.");
|
|
1088
1173
|
}
|
|
1089
1174
|
return { block: true, reason };
|
|
1090
1175
|
}
|
|
1091
1176
|
}
|
|
1092
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.
|
|
1093
1183
|
pi.on("tool_result", async (event, ctx) => {
|
|
1094
1184
|
if (isAutoActive() && typeof event.toolCallId === "string") {
|
|
1095
1185
|
markToolEnd(event.toolCallId);
|
|
@@ -1121,12 +1211,27 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1121
1211
|
else if (isAutoActive()) {
|
|
1122
1212
|
clearToolInvocationError();
|
|
1123
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
|
+
}
|
|
1124
1229
|
if (toolName !== "ask_user_questions")
|
|
1125
1230
|
return;
|
|
1126
1231
|
const basePath = contextBasePath(ctx);
|
|
1127
1232
|
const milestoneId = await getDiscussionMilestoneIdFor(basePath);
|
|
1128
|
-
const details = event
|
|
1129
|
-
const questions = event.input?.questions ?? [];
|
|
1233
|
+
const details = resolveAskUserQuestionsGateDetails(event);
|
|
1234
|
+
const questions = event.input?.questions ?? details?.questions ?? [];
|
|
1130
1235
|
const gateResult = applyAskUserQuestionsGateResult({
|
|
1131
1236
|
basePath,
|
|
1132
1237
|
questions,
|
|
@@ -1150,27 +1255,82 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1150
1255
|
if (gateResult.status === "verified") {
|
|
1151
1256
|
clearDeferredApprovalGate(basePath);
|
|
1152
1257
|
}
|
|
1153
|
-
|
|
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.");
|
|
1269
|
+
}
|
|
1154
1270
|
return;
|
|
1271
|
+
}
|
|
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)
|
|
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.)
|
|
1294
|
+
for (const question of questions) {
|
|
1295
|
+
if (isDestructiveConfirmGateId(question?.id)) {
|
|
1296
|
+
const answer = details.response?.answers?.[question.id];
|
|
1297
|
+
if (isDepthConfirmationAnswer(answer?.selected, question.options)) {
|
|
1298
|
+
confirmDestructiveCommand(basePath);
|
|
1299
|
+
}
|
|
1300
|
+
break;
|
|
1301
|
+
}
|
|
1302
|
+
}
|
|
1155
1303
|
if (!milestoneId)
|
|
1156
1304
|
return;
|
|
1157
1305
|
await saveDiscussionQuestionRound(basePath, milestoneId, questions, details);
|
|
1158
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.
|
|
1159
1310
|
pi.on("tool_execution_start", async (event, ctx) => {
|
|
1160
1311
|
const basePath = contextBasePath(ctx);
|
|
1161
1312
|
const toolName = canonicalToolName(event.toolName);
|
|
1162
1313
|
if (toolName === "ask_user_questions") {
|
|
1163
1314
|
const questionId = extractGateQuestionId(event.args);
|
|
1164
1315
|
if (typeof questionId === "string") {
|
|
1165
|
-
|
|
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);
|
|
1166
1327
|
clearDeferredApprovalGate(basePath);
|
|
1167
1328
|
}
|
|
1168
1329
|
}
|
|
1169
|
-
// Safety harness: record evidence here, not only in tool_call
|
|
1170
|
-
//
|
|
1171
|
-
//
|
|
1172
|
-
//
|
|
1173
|
-
// toolCallId, so native tools (which hit both events) record once.
|
|
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.
|
|
1174
1334
|
safetyRecordToolCall(event.toolCallId, event.toolName, (event.args ?? {}));
|
|
1175
1335
|
const execDash = getAutoRuntimeSnapshot();
|
|
1176
1336
|
if (execDash.basePath && execDash.currentUnit?.type === "execute-task") {
|
|
@@ -1183,6 +1343,9 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1183
1343
|
return;
|
|
1184
1344
|
markToolStart(event.toolCallId, event.toolName);
|
|
1185
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.
|
|
1186
1349
|
pi.on("tool_execution_end", async (event) => {
|
|
1187
1350
|
markToolEnd(event.toolCallId);
|
|
1188
1351
|
// #2883/#4974: Capture deterministic invocation/policy errors
|
|
@@ -1252,12 +1415,13 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1252
1415
|
return surfaceReduced ? { toolNames: providerCompatible } : undefined;
|
|
1253
1416
|
}
|
|
1254
1417
|
const registeredToolNames = resolveRegisteredToolNames(pi, event.activeToolNames);
|
|
1418
|
+
const hasRegisteredSurface = typeof pi.getAllTools === "function";
|
|
1255
1419
|
const compatibleRegisteredToolNames = filterToolsForProvider(registeredToolNames, event.selectedModelApi, event.selectedModelProvider).compatible.filter((name) => !(dropAliases && isWorkflowAliasTool(name)));
|
|
1256
1420
|
const guidedUnit = getGuidedUnitContext();
|
|
1257
1421
|
const requestRegisteredToolNames = guidedUnit?.unitType === "run-uat"
|
|
1258
1422
|
? compatibleRegisteredToolNames
|
|
1259
1423
|
: registeredToolNames;
|
|
1260
|
-
const requestScoped = buildRequestScopedGsdToolSet(guidedUnit?.unitType === "run-uat" ? aliasFilteredCompatible : providerCompatible, event.requestCustomMessages, requestRegisteredToolNames, guidedUnit?.unitType);
|
|
1424
|
+
const requestScoped = buildRequestScopedGsdToolSet(guidedUnit?.unitType === "run-uat" ? aliasFilteredCompatible : providerCompatible, event.requestCustomMessages, requestRegisteredToolNames, guidedUnit?.unitType, hasRegisteredSurface);
|
|
1261
1425
|
if (requestScoped) {
|
|
1262
1426
|
recordAutoToolSurfaceSnapshot({
|
|
1263
1427
|
source: "provider-adjustment",
|
|
@@ -1273,7 +1437,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
1273
1437
|
const registeredForUnit = dash.currentUnit.type === "run-uat"
|
|
1274
1438
|
? compatibleRegisteredToolNames
|
|
1275
1439
|
: resolveRegisteredToolNames(pi, event.activeToolNames);
|
|
1276
|
-
const scopedToolNames = buildMinimalAutoGsdToolSet(dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible, dash.currentUnit.type, registeredForUnit);
|
|
1440
|
+
const scopedToolNames = buildMinimalAutoGsdToolSet(dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible, dash.currentUnit.type, registeredForUnit, hasRegisteredSurface);
|
|
1277
1441
|
recordAutoToolSurfaceSnapshot({
|
|
1278
1442
|
source: "provider-adjustment",
|
|
1279
1443
|
unitType: dash.currentUnit.type,
|