@opengsd/gsd-pi 1.2.0-dev.fb12b103 → 1.2.0-dev.fbdca60b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli.js +1 -18
- package/dist/headless-events.js +7 -5
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +121 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +7 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +167 -64
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +39 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +11 -7
- package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
- package/dist/resources/extensions/gsd/auto-prompts.js +66 -9
- package/dist/resources/extensions/gsd/auto-start.js +26 -8
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
- package/dist/resources/extensions/gsd/auto.js +52 -2
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +107 -45
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
- 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/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
- package/dist/resources/extensions/gsd/db/engine.js +24 -6
- package/dist/resources/extensions/gsd/db/queries.js +56 -0
- package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
- package/dist/resources/extensions/gsd/db-transaction.js +27 -23
- 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 +256 -125
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- 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 +17 -21
- package/dist/resources/extensions/gsd/guidance.js +60 -0
- package/dist/resources/extensions/gsd/guided-flow.js +93 -4
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/memory-relations.js +1 -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/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- 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 +3 -2
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- 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 +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- 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 +8 -4
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state.js +11 -2
- 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 +83 -31
- 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 +65 -2
- package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
- 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 +40 -15
- package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
- package/dist/resources/extensions/gsd/unit-registry.js +34 -4
- 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/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- 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-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/extensions/shared/gsd-browser-cli.js +21 -2
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- 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 +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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/{5942.js → 1128.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/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/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
- 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 +54 -29
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
- package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
- 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 +69 -28
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/package.json +3 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -4
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +8 -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 +50 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +17 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -53
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +459 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.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/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +161 -81
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/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 +419 -221
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +468 -269
- 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/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/README.md +15 -0
- package/packages/pi-tui/dist/index.d.ts +2 -2
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +2 -2
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/terminal.d.ts +12 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +70 -25
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +15 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +106 -21
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +11 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop.ts +7 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +186 -66
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +37 -62
- package/src/resources/extensions/gsd/auto-model-selection.ts +16 -7
- package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
- package/src/resources/extensions/gsd/auto-prompts.ts +78 -9
- package/src/resources/extensions/gsd/auto-start.ts +27 -11
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
- package/src/resources/extensions/gsd/auto.ts +64 -2
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +118 -50
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
- 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/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
- package/src/resources/extensions/gsd/db/engine.ts +26 -6
- package/src/resources/extensions/gsd/db/queries.ts +66 -0
- package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
- package/src/resources/extensions/gsd/db-transaction.ts +37 -20
- 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 +267 -142
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- 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 +19 -22
- package/src/resources/extensions/gsd/guidance.ts +78 -0
- package/src/resources/extensions/gsd/guided-flow.ts +145 -24
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/memory-relations.ts +1 -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/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- 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 +3 -2
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- 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 +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- 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 +8 -4
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state.ts +12 -1
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +75 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +257 -18
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- 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/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
- package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- 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 +4 -2
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
- 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 +88 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
- 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 +126 -19
- 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 +90 -2
- package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
- 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 +60 -15
- package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
- package/src/resources/extensions/gsd/unit-registry.ts +34 -4
- 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/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- 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-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/extensions/shared/gsd-browser-cli.ts +23 -2
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- 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/{mU4QIDlpVHDdjDpeEKh5W → 2T9IOdiiM3o3gZ4UbPi8E}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{mU4QIDlpVHDdjDpeEKh5W → 2T9IOdiiM3o3gZ4UbPi8E}/_ssgManifest.js +0 -0
|
@@ -23,6 +23,15 @@ interface BlockedModelsFile {
|
|
|
23
23
|
blocked: BlockedModelEntry[];
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
interface TemporaryBlockedModelEntry {
|
|
27
|
+
provider: string;
|
|
28
|
+
id: string;
|
|
29
|
+
reason: string;
|
|
30
|
+
blockedUntil: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const temporaryBlockedModels = new Map<string, TemporaryBlockedModelEntry>();
|
|
34
|
+
|
|
26
35
|
function blockedModelsPath(basePath: string): string {
|
|
27
36
|
return join(gsdRoot(basePath), "runtime", "blocked-models.json");
|
|
28
37
|
}
|
|
@@ -31,6 +40,10 @@ function modelKey(provider: string, id: string): string {
|
|
|
31
40
|
return `${provider.toLowerCase()}/${id.toLowerCase()}`;
|
|
32
41
|
}
|
|
33
42
|
|
|
43
|
+
function temporaryModelKey(basePath: string, provider: string, id: string): string {
|
|
44
|
+
return `${basePath}:${modelKey(provider, id)}`;
|
|
45
|
+
}
|
|
46
|
+
|
|
34
47
|
function readFileSafe(path: string): BlockedModelsFile {
|
|
35
48
|
if (!existsSync(path)) return { version: 1, blocked: [] };
|
|
36
49
|
try {
|
|
@@ -66,6 +79,42 @@ export function isModelBlocked(
|
|
|
66
79
|
);
|
|
67
80
|
}
|
|
68
81
|
|
|
82
|
+
export function blockModelUntil(
|
|
83
|
+
basePath: string,
|
|
84
|
+
provider: string,
|
|
85
|
+
id: string,
|
|
86
|
+
blockedUntil: number,
|
|
87
|
+
reason: string,
|
|
88
|
+
): void {
|
|
89
|
+
const key = temporaryModelKey(basePath, provider, id);
|
|
90
|
+
if (blockedUntil <= Date.now()) {
|
|
91
|
+
temporaryBlockedModels.delete(key);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
temporaryBlockedModels.set(key, { provider, id, reason, blockedUntil });
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function isModelTemporarilyUnavailable(
|
|
98
|
+
basePath: string,
|
|
99
|
+
provider: string | undefined,
|
|
100
|
+
id: string | undefined,
|
|
101
|
+
now = Date.now(),
|
|
102
|
+
): boolean {
|
|
103
|
+
if (!provider || !id) return false;
|
|
104
|
+
const key = temporaryModelKey(basePath, provider, id);
|
|
105
|
+
const entry = temporaryBlockedModels.get(key);
|
|
106
|
+
if (!entry) return false;
|
|
107
|
+
if (entry.blockedUntil <= now) {
|
|
108
|
+
temporaryBlockedModels.delete(key);
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export function clearTemporaryModelBlocksForTest(): void {
|
|
115
|
+
temporaryBlockedModels.clear();
|
|
116
|
+
}
|
|
117
|
+
|
|
69
118
|
export function blockModel(
|
|
70
119
|
basePath: string,
|
|
71
120
|
provider: string,
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
isAutoCompletionStopInProgress,
|
|
20
20
|
pauseAuto,
|
|
21
21
|
setCurrentDispatchedModelId,
|
|
22
|
+
setCurrentUnitModelForRecovery,
|
|
22
23
|
} from "../auto.js";
|
|
23
24
|
import { getNextFallbackModel, resolveModelWithFallbacksForUnit } from "../preferences.js";
|
|
24
25
|
import { pauseAutoForProviderError } from "../provider-error-pause.js";
|
|
@@ -41,7 +42,7 @@ import {
|
|
|
41
42
|
isTransient,
|
|
42
43
|
type ErrorClass,
|
|
43
44
|
} from "../error-classifier.js";
|
|
44
|
-
import { blockModel, isModelBlocked } from "../blocked-models.js";
|
|
45
|
+
import { blockModel, blockModelUntil, isModelBlocked, isModelTemporarilyUnavailable } from "../blocked-models.js";
|
|
45
46
|
import { getProjectGSDPreferencesPath } from "../preferences.js";
|
|
46
47
|
import { resolveProviderErrorGuidance } from "../provider-error-guidance.js";
|
|
47
48
|
import { formatGuidance } from "../guidance.js";
|
|
@@ -143,9 +144,14 @@ async function tryProviderModelFallback(params: ProviderModelFallbackParams): Pr
|
|
|
143
144
|
const nextModelId = getNextFallbackModel(cursorModelId, modelConfig);
|
|
144
145
|
if (!nextModelId) break;
|
|
145
146
|
const candidate = resolveModelId(nextModelId, availableModels, rejectedProvider);
|
|
146
|
-
if (
|
|
147
|
+
if (
|
|
148
|
+
candidate &&
|
|
149
|
+
!isModelBlocked(basePath, candidate.provider, candidate.id) &&
|
|
150
|
+
!isModelTemporarilyUnavailable(basePath, candidate.provider, candidate.id)
|
|
151
|
+
) {
|
|
147
152
|
const ok = await pi.setModel(candidate, { persist: false });
|
|
148
153
|
if (ok) {
|
|
154
|
+
setCurrentUnitModelForRecovery(candidate);
|
|
149
155
|
setCurrentDispatchedModelId({ provider: candidate.provider, id: candidate.id });
|
|
150
156
|
switchedNotify(`${candidate.provider}/${candidate.id}`);
|
|
151
157
|
pi.sendMessage(
|
|
@@ -163,7 +169,8 @@ async function tryProviderModelFallback(params: ProviderModelFallbackParams): Pr
|
|
|
163
169
|
if (
|
|
164
170
|
sessionModel &&
|
|
165
171
|
!(sessionModel.provider === rejectedProvider && sessionModel.id === rejectedId) &&
|
|
166
|
-
!isModelBlocked(basePath, sessionModel.provider, sessionModel.id)
|
|
172
|
+
!isModelBlocked(basePath, sessionModel.provider, sessionModel.id) &&
|
|
173
|
+
!isModelTemporarilyUnavailable(basePath, sessionModel.provider, sessionModel.id)
|
|
167
174
|
) {
|
|
168
175
|
const startModel = availableModels.find(
|
|
169
176
|
(m) => m.provider === sessionModel.provider && m.id === sessionModel.id,
|
|
@@ -171,6 +178,7 @@ async function tryProviderModelFallback(params: ProviderModelFallbackParams): Pr
|
|
|
171
178
|
if (startModel) {
|
|
172
179
|
const ok = await pi.setModel(startModel, { persist: false });
|
|
173
180
|
if (ok) {
|
|
181
|
+
setCurrentUnitModelForRecovery(startModel);
|
|
174
182
|
setCurrentDispatchedModelId({ provider: startModel.provider, id: startModel.id });
|
|
175
183
|
switchedNotify(`${startModel.provider}/${startModel.id}`);
|
|
176
184
|
pi.sendMessage(
|
|
@@ -676,6 +684,16 @@ export async function handleAgentEnd(
|
|
|
676
684
|
if (currentProvider === "openai-codex" || currentProvider === "google-gemini-cli") {
|
|
677
685
|
cls.retryAfterMs = Math.min(cls.retryAfterMs, 30_000);
|
|
678
686
|
}
|
|
687
|
+
const dash = getAutoDashboardData();
|
|
688
|
+
if (dash.basePath && ctx.model?.provider && ctx.model?.id) {
|
|
689
|
+
blockModelUntil(
|
|
690
|
+
dash.basePath,
|
|
691
|
+
ctx.model.provider,
|
|
692
|
+
ctx.model.id,
|
|
693
|
+
Date.now() + cls.retryAfterMs,
|
|
694
|
+
rawErrorMsg || displayMsg || "rate limit",
|
|
695
|
+
);
|
|
696
|
+
}
|
|
679
697
|
}
|
|
680
698
|
|
|
681
699
|
// ── 2. Decide & Act ──────────────────────────────────────────────────
|
|
@@ -721,9 +739,14 @@ export async function handleAgentEnd(
|
|
|
721
739
|
retryState.networkRetryCount = 0;
|
|
722
740
|
retryState.currentRetryModelId = undefined;
|
|
723
741
|
const modelToSet = resolveModelId(nextModelId, availableModels, ctx.model?.provider);
|
|
724
|
-
|
|
742
|
+
const modelUnavailable = dash.basePath && modelToSet
|
|
743
|
+
? isModelBlocked(dash.basePath, modelToSet.provider, modelToSet.id) ||
|
|
744
|
+
isModelTemporarilyUnavailable(dash.basePath, modelToSet.provider, modelToSet.id)
|
|
745
|
+
: false;
|
|
746
|
+
if (modelToSet && !modelUnavailable) {
|
|
725
747
|
const ok = await pi.setModel(modelToSet, { persist: false });
|
|
726
748
|
if (ok) {
|
|
749
|
+
setCurrentUnitModelForRecovery(modelToSet);
|
|
727
750
|
setCurrentDispatchedModelId({ provider: modelToSet.provider, id: modelToSet.id });
|
|
728
751
|
ctx.ui.notify(`Model error${errorDetail}. Switched to fallback: ${nextModelId} and resuming.`, "warning");
|
|
729
752
|
pi.sendMessage({ customType: "gsd-auto-timeout-recovery", content: "Continue execution.", display: false }, { triggerTurn: true });
|
|
@@ -737,11 +760,17 @@ export async function handleAgentEnd(
|
|
|
737
760
|
// Try restoring session model
|
|
738
761
|
const sessionModel = getAutoModeStartModel();
|
|
739
762
|
if (sessionModel) {
|
|
740
|
-
|
|
763
|
+
const dash = getAutoDashboardData();
|
|
764
|
+
const sessionModelUnavailable = dash.basePath
|
|
765
|
+
? isModelBlocked(dash.basePath, sessionModel.provider, sessionModel.id) ||
|
|
766
|
+
isModelTemporarilyUnavailable(dash.basePath, sessionModel.provider, sessionModel.id)
|
|
767
|
+
: false;
|
|
768
|
+
if (!sessionModelUnavailable && (ctx.model?.id !== sessionModel.id || ctx.model?.provider !== sessionModel.provider)) {
|
|
741
769
|
const startModel = ctx.modelRegistry.getAvailable().find((m) => m.provider === sessionModel.provider && m.id === sessionModel.id);
|
|
742
770
|
if (startModel) {
|
|
743
771
|
const ok = await pi.setModel(startModel, { persist: false });
|
|
744
772
|
if (ok) {
|
|
773
|
+
setCurrentUnitModelForRecovery(startModel);
|
|
745
774
|
setCurrentDispatchedModelId({ provider: startModel.provider, id: startModel.id });
|
|
746
775
|
retryState.networkRetryCount = 0;
|
|
747
776
|
retryState.currentRetryModelId = undefined;
|
|
@@ -8,7 +8,12 @@ import type { ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
|
8
8
|
import { createBashTool, createEditTool, createReadTool, createWriteTool } from "@gsd/pi-coding-agent";
|
|
9
9
|
|
|
10
10
|
import { logWarning } from "../workflow-logger.js";
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
getWorkflowDatabaseStatus,
|
|
13
|
+
openWorkflowDatabase,
|
|
14
|
+
type WorkflowDatabaseOpenResult,
|
|
15
|
+
type WorkflowDatabaseStatus,
|
|
16
|
+
} from "../db-workspace.js";
|
|
12
17
|
import { getAutoWorktreePath } from "../auto-worktree.js";
|
|
13
18
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
14
19
|
import { worktreesDirs } from "../worktree-placement.js";
|
|
@@ -69,15 +74,60 @@ export function resolveWorkflowToolBasePath(
|
|
|
69
74
|
|
|
70
75
|
export { resolveProjectRootDbPath } from "../db-workspace.js";
|
|
71
76
|
|
|
77
|
+
type WorkflowDatabaseOpenFailure = Extract<WorkflowDatabaseOpenResult, { ok: false }>;
|
|
78
|
+
|
|
79
|
+
function sqliteProviderHint(status: WorkflowDatabaseStatus, nodeVersion: string): string {
|
|
80
|
+
if (status.provider) return `Provider: ${status.provider}.`;
|
|
81
|
+
|
|
82
|
+
const major = Number.parseInt(nodeVersion.split(".")[0] ?? "", 10);
|
|
83
|
+
if (Number.isFinite(major) && major < 22) {
|
|
84
|
+
return (
|
|
85
|
+
`No SQLite provider available. Upgrade Node to >= 22.0.0 (current: v${nodeVersion}), ` +
|
|
86
|
+
"use the packaged GSD runtime, or install/restore better-sqlite3 in this runtime."
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return (
|
|
91
|
+
"No SQLite provider available. Use a Node build with node:sqlite enabled, " +
|
|
92
|
+
"run the packaged GSD runtime, or install/restore better-sqlite3 in this runtime."
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function dbOpenPhaseHint(status: WorkflowDatabaseStatus): string {
|
|
97
|
+
if (status.lastPhase === "open") return "The database file could not be opened";
|
|
98
|
+
if (status.lastPhase === "initSchema") return "The database schema could not be initialized";
|
|
99
|
+
if (status.lastPhase === "vacuum-recovery") return "Corruption recovery (VACUUM) failed";
|
|
100
|
+
if (status.attempted) return "The database could not be opened";
|
|
101
|
+
return "The database provider could not be loaded";
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function formatWorkflowDatabaseOpenFailure(
|
|
105
|
+
result: WorkflowDatabaseOpenFailure,
|
|
106
|
+
status?: WorkflowDatabaseStatus,
|
|
107
|
+
nodeVersion: string = process.versions.node,
|
|
108
|
+
): string {
|
|
109
|
+
if (result.reason === "missing-gsd-dir") {
|
|
110
|
+
return `ensureDbOpen failed — no .gsd directory found at ${result.location.projectGsd}`;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (result.reason === "missing-database") {
|
|
114
|
+
return `ensureDbOpen failed — no GSD database found at ${result.location.projectDb}`;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const resolvedStatus = status ?? getWorkflowDatabaseStatus();
|
|
118
|
+
const detail = result.error?.message ?? resolvedStatus.lastError?.message ?? "";
|
|
119
|
+
const detailSuffix = detail ? ` (${detail})` : "";
|
|
120
|
+
return (
|
|
121
|
+
`ensureDbOpen failed for ${result.location.projectDb}: ` +
|
|
122
|
+
`${dbOpenPhaseHint(resolvedStatus)}${detailSuffix}. ${sqliteProviderHint(resolvedStatus, nodeVersion)}`
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
72
126
|
export async function ensureDbOpen(basePath: string = safeWorkspaceCwd()): Promise<boolean> {
|
|
73
127
|
const result = openWorkflowDatabase(basePath);
|
|
74
128
|
if (result.ok) return true;
|
|
75
129
|
|
|
76
|
-
|
|
77
|
-
logWarning("bootstrap", "ensureDbOpen failed — no .gsd directory found");
|
|
78
|
-
} else {
|
|
79
|
-
logWarning("bootstrap", `ensureDbOpen failed: ${result.error?.message ?? "open failed"}`);
|
|
80
|
-
}
|
|
130
|
+
logWarning("bootstrap", formatWorkflowDatabaseOpenFailure(result));
|
|
81
131
|
return false;
|
|
82
132
|
}
|
|
83
133
|
|
|
@@ -137,8 +137,8 @@ export function registerExecTools(pi: ExtensionAPI): void {
|
|
|
137
137
|
parameters: Type.Object({
|
|
138
138
|
query: Type.Optional(Type.String({ description: "Substring matched against id and purpose (case-insensitive)." })),
|
|
139
139
|
runtime: Type.Optional(
|
|
140
|
-
Type.
|
|
141
|
-
description: "Restrict to one runtime.",
|
|
140
|
+
Type.String({
|
|
141
|
+
description: "Restrict to one runtime: bash, node, or python.",
|
|
142
142
|
}),
|
|
143
143
|
),
|
|
144
144
|
failing_only: Type.Optional(Type.Boolean({ description: "Only non-zero exit codes and timeouts." })),
|
|
@@ -13,7 +13,8 @@ import type { GSDEcosystemBeforeAgentStartHandler } from "../ecosystem/gsd-exten
|
|
|
13
13
|
import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
|
|
14
14
|
|
|
15
15
|
import { buildMilestoneFileName, clearPathCache, milestonesDir, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
|
|
16
|
-
import { applyAskUserQuestionsGateResult,
|
|
16
|
+
import { applyAskUserQuestionsGateResult, clearDiscussionFlowState, formatPendingAskUserQuestionsGateMessage, hostWriteGateAdapter, isApprovalGateVerifiedInSnapshot, isDepthConfirmationAnswer, isMilestoneDepthVerified, isMilestoneDepthVerifiedInSnapshot, isQueuePhaseActive, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
17
|
+
import { canonicalToolName } from "../engine-hook-contract.js";
|
|
17
18
|
import { resolveManifest } from "../unit-context-manifest.js";
|
|
18
19
|
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
19
20
|
import { loadFile, saveFile, formatContinue } from "../files.js";
|
|
@@ -55,10 +56,12 @@ import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
|
55
56
|
import { extractSubagentAgentClasses } from "./subagent-input.js";
|
|
56
57
|
import {
|
|
57
58
|
approvalGateIdForUnit,
|
|
59
|
+
evaluateAskUserQuestionsRound,
|
|
60
|
+
formatUnansweredConsentQuestionMessage,
|
|
58
61
|
isExplicitApprovalResponse,
|
|
59
62
|
messageHasPendingAskUserQuestionsTool,
|
|
60
|
-
|
|
61
|
-
} from "../
|
|
63
|
+
shouldPauseForQuestion,
|
|
64
|
+
} from "../consent-question.js";
|
|
62
65
|
import { resolveSkillManifest } from "../skill-manifest.js";
|
|
63
66
|
import { applyUnitSkillVisibility, unitHasSkillManifest } from "../skill-scope.js";
|
|
64
67
|
import { getGuidedUnitContext } from "../guided-unit-context.js";
|
|
@@ -75,11 +78,6 @@ import { getRequiredWorkflowToolsForUnit } from "../unit-tool-contracts.js";
|
|
|
75
78
|
|
|
76
79
|
let approvalQuestionAbortInFlight = false;
|
|
77
80
|
|
|
78
|
-
interface DeferredApprovalGate {
|
|
79
|
-
gateId: string;
|
|
80
|
-
basePath: string;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
81
|
type WelcomeScreenModule = {
|
|
84
82
|
buildWelcomeScreenLines(opts: { version: string; remoteChannel?: string; width?: number }): string[];
|
|
85
83
|
};
|
|
@@ -150,7 +148,13 @@ async function installWelcomeHeader(ctx: ExtensionContext): Promise<void> {
|
|
|
150
148
|
}
|
|
151
149
|
}
|
|
152
150
|
|
|
153
|
-
|
|
151
|
+
/**
|
|
152
|
+
* Approval gates whose durable arming is deferred until tool execution /
|
|
153
|
+
* agent end, keyed by basePath. A Map (not a single slot) so concurrent
|
|
154
|
+
* projects in one process cannot lose each other's deferred gate; entries
|
|
155
|
+
* are bounded — cleared on activation, session boundaries, and verification.
|
|
156
|
+
*/
|
|
157
|
+
const deferredApprovalGates = new Map<string, string>();
|
|
154
158
|
|
|
155
159
|
export const MINIMAL_GSD_TOOL_NAMES = [
|
|
156
160
|
"gsd_exec",
|
|
@@ -558,13 +562,22 @@ async function applyCompactionThresholdOverride(ctx: ExtensionContext): Promise<
|
|
|
558
562
|
}
|
|
559
563
|
|
|
560
564
|
function clearDeferredApprovalGate(basePath?: string): void {
|
|
561
|
-
if (!basePath
|
|
562
|
-
|
|
565
|
+
if (!basePath) {
|
|
566
|
+
deferredApprovalGates.clear();
|
|
567
|
+
} else {
|
|
568
|
+
deferredApprovalGates.delete(basePath);
|
|
563
569
|
}
|
|
564
570
|
}
|
|
565
571
|
|
|
566
572
|
function deferApprovalGate(gateId: string, basePath: string): void {
|
|
567
|
-
|
|
573
|
+
// Verified-on-disk wins (same adapter policy as activation/re-arm): if the
|
|
574
|
+
// workflow MCP child already verified this gate, deferring would block
|
|
575
|
+
// tools for a gate that can never legitimately arm.
|
|
576
|
+
const snapshot = hostWriteGateAdapter.readState(basePath);
|
|
577
|
+
if (isApprovalGateVerifiedInSnapshot(snapshot, gateId)) return;
|
|
578
|
+
const milestoneId = extractDepthVerificationMilestoneId(gateId);
|
|
579
|
+
if (milestoneId && isMilestoneDepthVerifiedInSnapshot(snapshot, milestoneId)) return;
|
|
580
|
+
deferredApprovalGates.set(basePath, gateId);
|
|
568
581
|
}
|
|
569
582
|
|
|
570
583
|
function contextBasePath(ctx?: { cwd?: string }): string {
|
|
@@ -621,14 +634,13 @@ function isShellExecutionTool(canonicalName: string): boolean {
|
|
|
621
634
|
}
|
|
622
635
|
|
|
623
636
|
function activateDeferredApprovalGate(basePath: string): void {
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
setPendingGate(gateId, basePath);
|
|
637
|
+
const gateId = deferredApprovalGates.get(basePath);
|
|
638
|
+
if (gateId === undefined) return;
|
|
639
|
+
deferredApprovalGates.delete(basePath);
|
|
640
|
+
// hostWriteGateAdapter.setPending applies the verified-on-disk-wins merge
|
|
641
|
+
// policy: it refuses to arm (and thereby clobber) a gate the workflow MCP
|
|
642
|
+
// child already verified on disk.
|
|
643
|
+
hostWriteGateAdapter.setPending(gateId, basePath);
|
|
632
644
|
}
|
|
633
645
|
|
|
634
646
|
function extractGateQuestionId(input: unknown): string | undefined {
|
|
@@ -639,7 +651,7 @@ function extractGateQuestionId(input: unknown): string | undefined {
|
|
|
639
651
|
|
|
640
652
|
function isApprovalGateBlocking(basePath: string): boolean {
|
|
641
653
|
return Boolean(getPendingGate(basePath))
|
|
642
|
-
|| (
|
|
654
|
+
|| deferredApprovalGates.has(basePath);
|
|
643
655
|
}
|
|
644
656
|
|
|
645
657
|
function isContextDraftSummarySave(toolName: string, input: unknown): boolean {
|
|
@@ -784,13 +796,14 @@ function shouldBlockDeferredApprovalTool(
|
|
|
784
796
|
input: unknown,
|
|
785
797
|
basePath: string,
|
|
786
798
|
): { block: boolean; reason?: string; displayReason?: string } {
|
|
787
|
-
|
|
799
|
+
const deferredGateId = deferredApprovalGates.get(basePath);
|
|
800
|
+
if (deferredGateId === undefined) return { block: false };
|
|
788
801
|
if (toolName === "ask_user_questions") return { block: false };
|
|
789
802
|
if (isContextDraftSummarySave(toolName, input)) return { block: false };
|
|
790
803
|
return withDepthGateDisplayReason({
|
|
791
804
|
block: true,
|
|
792
805
|
reason: [
|
|
793
|
-
`HARD BLOCK: Approval question "${
|
|
806
|
+
`HARD BLOCK: Approval question "${deferredGateId}" has been shown to the user.`,
|
|
794
807
|
`Only CONTEXT-DRAFT persistence may finish in this same assistant turn.`,
|
|
795
808
|
`Wait for the user's answer before calling additional tools.`,
|
|
796
809
|
].join(" "),
|
|
@@ -920,10 +933,12 @@ export function registerHooks(
|
|
|
920
933
|
const beforeAgentBasePath = contextBasePath(ctx);
|
|
921
934
|
const pendingApprovalGate = getPendingGate(beforeAgentBasePath);
|
|
922
935
|
if (pendingApprovalGate && isExplicitApprovalResponse(event.prompt, pendingApprovalGate)) {
|
|
923
|
-
|
|
936
|
+
// Host adapter explicitly: the ambient write-gate exports env-sniff the
|
|
937
|
+
// adapter per call and are reserved for the MCP child's import surface.
|
|
938
|
+
hostWriteGateAdapter.markApprovalGateVerified(pendingApprovalGate, beforeAgentBasePath);
|
|
924
939
|
const milestoneId = extractDepthVerificationMilestoneId(pendingApprovalGate);
|
|
925
|
-
if (milestoneId) markDepthVerified(milestoneId, beforeAgentBasePath);
|
|
926
|
-
|
|
940
|
+
if (milestoneId) hostWriteGateAdapter.markDepthVerified(milestoneId, beforeAgentBasePath);
|
|
941
|
+
hostWriteGateAdapter.clearPending(beforeAgentBasePath);
|
|
927
942
|
if (isAutoPaused() && !isAutoActive()) {
|
|
928
943
|
const { resumeAutoAfterProviderDelay } = await import("./provider-error-resume.js");
|
|
929
944
|
void resumeAutoAfterProviderDelay(pi, ctx).catch((err) => {
|
|
@@ -1147,7 +1162,7 @@ export function registerHooks(
|
|
|
1147
1162
|
}
|
|
1148
1163
|
}
|
|
1149
1164
|
|
|
1150
|
-
if (!
|
|
1165
|
+
if (!shouldPauseForQuestion(unitType, [event.message])) return;
|
|
1151
1166
|
|
|
1152
1167
|
const gateId = approvalGateIdForUnit(unitType, unitId);
|
|
1153
1168
|
if (gateId) {
|
|
@@ -1162,7 +1177,7 @@ export function registerHooks(
|
|
|
1162
1177
|
|
|
1163
1178
|
approvalQuestionAbortInFlight = true;
|
|
1164
1179
|
ctx.ui.notify(
|
|
1165
|
-
`${unitType}${unitId ? ` ${unitId}` : ""} is waiting for your approval - pausing before more tool calls run.`,
|
|
1180
|
+
`${unitType ?? "The discussion"}${unitId ? ` ${unitId}` : ""} is waiting for your approval - pausing before more tool calls run.`,
|
|
1166
1181
|
"info",
|
|
1167
1182
|
);
|
|
1168
1183
|
// The durable pending gate is activated at agent_end so same-turn
|
|
@@ -1190,6 +1205,13 @@ export function registerHooks(
|
|
|
1190
1205
|
}
|
|
1191
1206
|
});
|
|
1192
1207
|
|
|
1208
|
+
// Engine hook contract (../engine-hook-contract.ts): tool_call is
|
|
1209
|
+
// NATIVE_ONLY_TOOL_HOOKS — it never fires under external engines
|
|
1210
|
+
// (claude-code-cli pre-executes tools). The guards below (loop guard,
|
|
1211
|
+
// pending/deferred gate blocks, queue guard, planning-unit tools policy,
|
|
1212
|
+
// worktree write gate, STATE.md single-writer, context-write depth gate)
|
|
1213
|
+
// are therefore native-engine enforcement only. The write-gate arming
|
|
1214
|
+
// concern has a universal mirror at tool_execution_start below.
|
|
1193
1215
|
pi.on("tool_call", async (event, ctx) => {
|
|
1194
1216
|
const discussionBasePath = contextBasePath(ctx);
|
|
1195
1217
|
const toolName = canonicalToolName(event.toolName);
|
|
@@ -1377,6 +1399,11 @@ export function registerHooks(
|
|
|
1377
1399
|
});
|
|
1378
1400
|
|
|
1379
1401
|
// ── Safety harness: evidence collection + destructive command blocking ──
|
|
1402
|
+
// Engine hook contract: tool_call is NATIVE_ONLY_TOOL_HOOKS. Evidence
|
|
1403
|
+
// collection here is mirrored universally at tool_execution_start
|
|
1404
|
+
// (safetyRecordToolCall dedupes by toolCallId); the destructive-command
|
|
1405
|
+
// hard gate has NO universal mirror — blocking is impossible once an
|
|
1406
|
+
// external engine has already executed the command.
|
|
1380
1407
|
pi.on("tool_call", async (event, ctx) => {
|
|
1381
1408
|
markToolStart(event.toolCallId, event.toolName);
|
|
1382
1409
|
safetyRecordToolCall(event.toolCallId, event.toolName, event.input as Record<string, unknown>);
|
|
@@ -1436,6 +1463,11 @@ export function registerHooks(
|
|
|
1436
1463
|
}
|
|
1437
1464
|
});
|
|
1438
1465
|
|
|
1466
|
+
// Engine hook contract: tool_result is NATIVE_ONLY_TOOL_HOOKS — external
|
|
1467
|
+
// engines skip it. Error classification and markToolEnd are mirrored
|
|
1468
|
+
// universally at tool_execution_end; the ask_user_questions gate lifecycle
|
|
1469
|
+
// here is paired with the tool_execution_start arming path, which external
|
|
1470
|
+
// engines do reach.
|
|
1439
1471
|
pi.on("tool_result", async (event, ctx) => {
|
|
1440
1472
|
if (isAutoActive() && typeof event.toolCallId === "string") {
|
|
1441
1473
|
markToolEnd(event.toolCallId);
|
|
@@ -1516,7 +1548,45 @@ export function registerHooks(
|
|
|
1516
1548
|
clearDeferredApprovalGate(basePath);
|
|
1517
1549
|
}
|
|
1518
1550
|
|
|
1519
|
-
|
|
1551
|
+
// ── Consent Question policy (consent-question.ts): one home for the
|
|
1552
|
+
// answer lifecycle of every ask_user_questions round. Per-question
|
|
1553
|
+
// verdicts come from the consent-verdict leaf — the same engine
|
|
1554
|
+
// applyAskUserQuestionsGateResult consumed above for gate persistence —
|
|
1555
|
+
// so empty answers on fail-closed kinds never pass as real answers (#528)
|
|
1556
|
+
// and cancellations get one unified handler.
|
|
1557
|
+
const roundOutcome = evaluateAskUserQuestionsRound(questions, details ?? {});
|
|
1558
|
+
if (roundOutcome === "cancelled") {
|
|
1559
|
+
resetToolCallLoopGuard();
|
|
1560
|
+
if (ctx) {
|
|
1561
|
+
await maybePauseAutoForApprovalGate(
|
|
1562
|
+
ctx,
|
|
1563
|
+
pi,
|
|
1564
|
+
true,
|
|
1565
|
+
"ask_user_questions was cancelled before receiving a response — pausing auto-mode until you respond.",
|
|
1566
|
+
);
|
|
1567
|
+
}
|
|
1568
|
+
return;
|
|
1569
|
+
}
|
|
1570
|
+
if (roundOutcome === "waiting") {
|
|
1571
|
+
resetToolCallLoopGuard();
|
|
1572
|
+
if (ctx) {
|
|
1573
|
+
await maybePauseAutoForApprovalGate(
|
|
1574
|
+
ctx,
|
|
1575
|
+
pi,
|
|
1576
|
+
true,
|
|
1577
|
+
"A user question received no answer — pausing auto-mode until you respond.",
|
|
1578
|
+
);
|
|
1579
|
+
}
|
|
1580
|
+
return {
|
|
1581
|
+
content: [{
|
|
1582
|
+
type: "text" as const,
|
|
1583
|
+
text: formatUnansweredConsentQuestionMessage(questions),
|
|
1584
|
+
}],
|
|
1585
|
+
};
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1588
|
+
// Cancelled rounds already returned via roundOutcome === "cancelled".
|
|
1589
|
+
if (!details?.response) return;
|
|
1520
1590
|
|
|
1521
1591
|
// Destructive-command confirmation: an affirmative answer to a
|
|
1522
1592
|
// destructive_confirm gate promotes the pending blocked command to a
|
|
@@ -1539,6 +1609,9 @@ export function registerHooks(
|
|
|
1539
1609
|
await saveDiscussionQuestionRound(basePath, milestoneId, questions, details);
|
|
1540
1610
|
});
|
|
1541
1611
|
|
|
1612
|
+
// Engine hook contract: tool_execution_start is UNIVERSAL_TOOL_HOOKS — the
|
|
1613
|
+
// only pre-execution event that fires for every tool call on every engine.
|
|
1614
|
+
// Universal mirrors live here: write-gate arming and evidence collection.
|
|
1542
1615
|
pi.on("tool_execution_start", async (event, ctx) => {
|
|
1543
1616
|
const basePath = contextBasePath(ctx);
|
|
1544
1617
|
const toolName = canonicalToolName(event.toolName);
|
|
@@ -1547,31 +1620,23 @@ export function registerHooks(
|
|
|
1547
1620
|
if (typeof questionId === "string") {
|
|
1548
1621
|
// External engines (claude-code-cli) ingest the SDK turn's tool blocks
|
|
1549
1622
|
// post-hoc, so this event can fire AFTER the workflow MCP child already
|
|
1550
|
-
// verified this gate and allowed the CONTEXT save.
|
|
1551
|
-
//
|
|
1552
|
-
//
|
|
1553
|
-
//
|
|
1554
|
-
//
|
|
1555
|
-
//
|
|
1556
|
-
//
|
|
1557
|
-
//
|
|
1558
|
-
|
|
1559
|
-
const gateMilestoneId = extractDepthVerificationMilestoneId(questionId);
|
|
1560
|
-
const alreadyVerified =
|
|
1561
|
-
isApprovalGateVerifiedInSnapshot(snapshot, questionId) ||
|
|
1562
|
-
isMilestoneDepthVerifiedInSnapshot(snapshot, gateMilestoneId);
|
|
1563
|
-
if (!alreadyVerified) {
|
|
1564
|
-
setPendingGate(questionId, basePath);
|
|
1565
|
-
}
|
|
1623
|
+
// verified this gate and allowed the CONTEXT save. Arming also revokes
|
|
1624
|
+
// verifiedDepthMilestones/verifiedApprovalGates, so an unconditional
|
|
1625
|
+
// re-arm here would wipe the child's verification and leave the
|
|
1626
|
+
// discuss→auto handoff permanently blocked. hostWriteGateAdapter
|
|
1627
|
+
// .setPending applies the verified-on-disk-wins policy and skips the
|
|
1628
|
+
// re-arm in that case. Stale verified state cannot leak into a later
|
|
1629
|
+
// re-discussion: a successful handoff deletes the snapshot via
|
|
1630
|
+
// clearDiscussionFlowState.
|
|
1631
|
+
hostWriteGateAdapter.setPending(questionId, basePath);
|
|
1566
1632
|
clearDeferredApprovalGate(basePath);
|
|
1567
1633
|
}
|
|
1568
1634
|
}
|
|
1569
1635
|
|
|
1570
|
-
// Safety harness: record evidence here, not only in tool_call
|
|
1571
|
-
//
|
|
1572
|
-
//
|
|
1573
|
-
//
|
|
1574
|
-
// toolCallId, so native tools (which hit both events) record once.
|
|
1636
|
+
// Safety harness: record evidence here, not only in tool_call — see
|
|
1637
|
+
// ../engine-hook-contract.ts for why tool_call never fires under external
|
|
1638
|
+
// engines. recordToolCall dedupes by toolCallId, so native tools (which
|
|
1639
|
+
// hit both events) record once.
|
|
1575
1640
|
safetyRecordToolCall(event.toolCallId, event.toolName, (event.args ?? {}) as Record<string, unknown>);
|
|
1576
1641
|
const execDash = getAutoRuntimeSnapshot();
|
|
1577
1642
|
if (execDash.basePath && execDash.currentUnit?.type === "execute-task") {
|
|
@@ -1585,6 +1650,9 @@ export function registerHooks(
|
|
|
1585
1650
|
markToolStart(event.toolCallId, event.toolName);
|
|
1586
1651
|
});
|
|
1587
1652
|
|
|
1653
|
+
// Engine hook contract: tool_execution_end is UNIVERSAL_TOOL_HOOKS — fires
|
|
1654
|
+
// for every finalized tool call on every engine, so error classification
|
|
1655
|
+
// and evidence persistence here cover external engines that skip tool_result.
|
|
1588
1656
|
pi.on("tool_execution_end", async (event) => {
|
|
1589
1657
|
markToolEnd(event.toolCallId);
|
|
1590
1658
|
// #2883/#4974: Capture deterministic invocation/policy errors
|