@opengsd/gsd-pi 1.2.0-dev.b1abb545 → 1.2.0-dev.d6c5343c
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/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.js +2 -14
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/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 +5 -2
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
- 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 +94 -48
- package/dist/resources/extensions/gsd/auto/phases.js +8 -3
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +40 -57
- package/dist/resources/extensions/gsd/auto-model-selection.js +25 -6
- package/dist/resources/extensions/gsd/auto-post-unit.js +31 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +24 -26
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +9 -28
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
- package/dist/resources/extensions/gsd/auto.js +8 -20
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +5 -15
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/consent-question.js +337 -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 +4 -12
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +398 -0
- package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
- package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
- package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
- package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
- package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- package/dist/resources/extensions/gsd/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/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +3 -0
- package/dist/resources/extensions/gsd/gsd-db.js +171 -2048
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +51 -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 +20 -9
- package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
- package/dist/resources/extensions/gsd/milestone-closeout.js +13 -23
- package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +3 -0
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +37 -24
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/preferences.js +14 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.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/run-uat.md +6 -4
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- 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 +41 -87
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +6 -20
- package/dist/resources/extensions/gsd/status-guards.js +56 -8
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +44 -53
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
- package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +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/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- package/dist/resources/extensions/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 +96 -5
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- 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/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{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/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +1 -1
- 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 +8 -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 +6 -3
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +8 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +46 -21
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/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/models.generated.d.ts +192 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +166 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/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 +5 -2
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +29 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -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 +152 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +109 -51
- package/src/resources/extensions/gsd/auto/phases.ts +12 -3
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -32
- package/src/resources/extensions/gsd/auto-dispatch.ts +38 -52
- package/src/resources/extensions/gsd/auto-model-selection.ts +25 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +37 -13
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +24 -29
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +8 -26
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
- package/src/resources/extensions/gsd/auto.ts +20 -24
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +5 -16
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/consent-question.ts +416 -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 +3 -9
- package/src/resources/extensions/gsd/db/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +490 -0
- package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
- package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
- package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
- package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
- package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- package/src/resources/extensions/gsd/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/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +3 -0
- package/src/resources/extensions/gsd/gsd-db.ts +173 -2373
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +50 -5
- 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 +18 -7
- package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
- package/src/resources/extensions/gsd/milestone-closeout.ts +13 -23
- package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +3 -0
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +42 -22
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/preferences.ts +18 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.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/run-uat.md +6 -4
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- 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 +47 -88
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +9 -21
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +101 -26
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/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 +44 -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 +336 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- 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/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/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/evidence-xref-gsd-exec.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/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/migration-auto-check.test.ts +85 -1
- 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 +139 -0
- 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/recovery-classification-illegal-transition.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +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/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/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
- 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-slice.ts +43 -68
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
- package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- package/src/resources/extensions/gsd/undo.ts +9 -8
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +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/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
- package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- package/src/resources/extensions/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 +119 -5
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/gsd-browser/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- 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/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → jmTLg6xZmAuq_LIqKOxrH}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → jmTLg6xZmAuq_LIqKOxrH}/_ssgManifest.js +0 -0
|
@@ -18,7 +18,7 @@ import { deriveState } from "./state.js";
|
|
|
18
18
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
19
19
|
import { loadFile, parseSummary, resolveAllOverrides } from "./files.js";
|
|
20
20
|
import { loadPrompt } from "./prompt-loader.js";
|
|
21
|
-
import { isAwaitingUserInput } from "./
|
|
21
|
+
import { isAwaitingUserInput } from "./consent-question.js";
|
|
22
22
|
import {
|
|
23
23
|
resolveMilestonePath,
|
|
24
24
|
resolveSliceFile,
|
|
@@ -51,8 +51,7 @@ import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
|
51
51
|
import { normalizeWorktreePathForCompare } from "./worktree-root.js";
|
|
52
52
|
import { isDbAvailable, getTask, getSlice, getMilestone, getMilestoneSlices, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
|
|
53
53
|
import { getWorkflowDatabasePath, refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
|
|
54
|
-
import { renderPlanCheckboxes, renderRoadmapFromDb } from "./markdown-renderer.js";
|
|
55
|
-
import { parseRoadmap as parseLegacyRoadmap } from "./parsers-legacy.js";
|
|
54
|
+
import { renderPlanCheckboxes, renderRoadmapFromDb, roadmapRenderMarksSliceDone } from "./markdown-renderer.js";
|
|
56
55
|
import { consumeSignal } from "./session-status-io.js";
|
|
57
56
|
import {
|
|
58
57
|
checkPostUnitHooks,
|
|
@@ -72,7 +71,7 @@ import {
|
|
|
72
71
|
} from "./milestone-closeout.js";
|
|
73
72
|
import type { AutoSession, SidecarItem } from "./auto/session.js";
|
|
74
73
|
import { getEvidence, clearEvidenceFromDisk, isExecutionToolName } from "./safety/evidence-collector.js";
|
|
75
|
-
import { validateFileChanges } from "./safety/file-change-validator.js";
|
|
74
|
+
import { validateFileChanges, effectiveFileChangeAllowlist } from "./safety/file-change-validator.js";
|
|
76
75
|
import { crossReferenceEvidence, type ClaimedEvidence } from "./safety/evidence-cross-ref.js";
|
|
77
76
|
import { validateContent } from "./safety/content-validator.js";
|
|
78
77
|
import { resolveSafetyHarnessConfig } from "./safety/safety-harness.js";
|
|
@@ -88,7 +87,7 @@ import { writeTurnGitTransaction } from "./uok/gitops.js";
|
|
|
88
87
|
import { isClosedStatus } from "./status-guards.js";
|
|
89
88
|
import { detectAbandonMilestone } from "./abandon-detect.js";
|
|
90
89
|
import { getPendingGate } from "./bootstrap/write-gate.js";
|
|
91
|
-
import { isDeterministicPolicyError } from "./auto-tool-tracking.js";
|
|
90
|
+
import { isDeterministicPolicyError, isToolUnavailableError } from "./auto-tool-tracking.js";
|
|
92
91
|
import { formatConnectedStepStack, formatPostUnitStatusCard } from "./auto-status-message.js";
|
|
93
92
|
import {
|
|
94
93
|
clearProjectResearchInflightMarker,
|
|
@@ -96,6 +95,7 @@ import {
|
|
|
96
95
|
} from "./project-research-policy.js";
|
|
97
96
|
import { validateArtifact } from "./schemas/validate.js";
|
|
98
97
|
import { verificationRetryKey } from "./auto/verification-retry-policy.js";
|
|
98
|
+
import { saveCustomVerifyRetryCounts } from "./auto/custom-verify-retry-store.js";
|
|
99
99
|
import { getLedger } from "./metrics.js";
|
|
100
100
|
import { getUnitCostSpikeAction, resolveUnitCostSpikeMultiplier } from "./auto-budget.js";
|
|
101
101
|
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
@@ -619,8 +619,10 @@ export function _hasExecutionToolCallsInSessionForTest(entries: readonly unknown
|
|
|
619
619
|
return true;
|
|
620
620
|
}
|
|
621
621
|
|
|
622
|
-
|
|
623
|
-
|
|
622
|
+
// Accept both session-manager entries ({type: "message", message}) and
|
|
623
|
+
// bare agent-end messages ({role, content}) — the auto loop passes the
|
|
624
|
+
// latter via opts.agentEndMessages.
|
|
625
|
+
const msg = e?.type === "message" ? e?.message : e;
|
|
624
626
|
if (!msg || msg.role !== "assistant" || !Array.isArray(msg.content)) continue;
|
|
625
627
|
for (const block of msg.content) {
|
|
626
628
|
if (block?.type !== "toolCall") continue;
|
|
@@ -899,7 +901,7 @@ export const USER_DRIVEN_DEEP_UNITS = new Set([
|
|
|
899
901
|
"discuss-milestone",
|
|
900
902
|
"research-decision",
|
|
901
903
|
]);
|
|
902
|
-
export { isAwaitingUserInput } from "./
|
|
904
|
+
export { isAwaitingUserInput } from "./consent-question.js";
|
|
903
905
|
|
|
904
906
|
function artifactValidationKind(unitType: string): "project" | "requirements" | null {
|
|
905
907
|
if (unitType === "discuss-project") return "project";
|
|
@@ -988,11 +990,13 @@ async function repairCompleteSliceRoadmapProjection(
|
|
|
988
990
|
return false;
|
|
989
991
|
}
|
|
990
992
|
|
|
993
|
+
// Stale-render detection (ADR-017): the DB already says the slice is closed;
|
|
994
|
+
// this only checks whether the rendered ROADMAP projection reflects it, to
|
|
995
|
+
// decide whether a repair re-render is needed.
|
|
991
996
|
const roadmapPath = resolveMilestoneFile(artifactBase, mid, "ROADMAP");
|
|
992
997
|
if (roadmapPath && existsSync(roadmapPath)) {
|
|
993
998
|
try {
|
|
994
|
-
|
|
995
|
-
if (roadmap.slices.find((roadmapSlice) => roadmapSlice.id === sid)?.done) {
|
|
999
|
+
if (roadmapRenderMarksSliceDone(readFileSync(roadmapPath, "utf-8"), sid)) {
|
|
996
1000
|
return false;
|
|
997
1001
|
}
|
|
998
1002
|
} catch (err) {
|
|
@@ -1535,6 +1539,11 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
1535
1539
|
if (safetyConfig.enabled) {
|
|
1536
1540
|
const { milestone: sMid, slice: sSid, task: sTid } = parseUnitId(s.currentUnit.id);
|
|
1537
1541
|
|
|
1542
|
+
const fileChangeAllowlist = effectiveFileChangeAllowlist(
|
|
1543
|
+
safetyConfig.file_change_allowlist,
|
|
1544
|
+
(prefs?.git as { manage_gitignore?: boolean } | undefined)?.manage_gitignore,
|
|
1545
|
+
);
|
|
1546
|
+
|
|
1538
1547
|
// File change validation (execute-task only, after unit execution)
|
|
1539
1548
|
if (safetyConfig.file_change_validation && s.currentUnit.type === "execute-task" && sMid && sSid && sTid) {
|
|
1540
1549
|
try {
|
|
@@ -1554,7 +1563,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
1554
1563
|
files: taskRow.files,
|
|
1555
1564
|
})),
|
|
1556
1565
|
);
|
|
1557
|
-
const audit = validateFileChanges(s.basePath, expectedOutput, plannedFiles,
|
|
1566
|
+
const audit = validateFileChanges(s.basePath, expectedOutput, plannedFiles, fileChangeAllowlist);
|
|
1558
1567
|
if (audit && audit.violations.length > 0) {
|
|
1559
1568
|
const warnings = audit.violations.filter(v => v.severity === "warning");
|
|
1560
1569
|
for (const v of warnings) {
|
|
@@ -1576,7 +1585,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
1576
1585
|
s.basePath,
|
|
1577
1586
|
expectedOutput,
|
|
1578
1587
|
plannedFiles,
|
|
1579
|
-
|
|
1588
|
+
fileChangeAllowlist,
|
|
1580
1589
|
);
|
|
1581
1590
|
if (audit && audit.violations.length > 0) {
|
|
1582
1591
|
const warnings = audit.violations.filter(v => v.severity === "warning");
|
|
@@ -2015,7 +2024,18 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
2015
2024
|
"error",
|
|
2016
2025
|
);
|
|
2017
2026
|
} else if (!triggerArtifactVerified) {
|
|
2018
|
-
if (s.lastToolInvocationError) {
|
|
2027
|
+
if (s.lastToolInvocationError && isToolUnavailableError(s.lastToolInvocationError)) {
|
|
2028
|
+
// Tool-unavailable is the one transient invocation error: the
|
|
2029
|
+
// workflow MCP server registers its surface asynchronously, so a
|
|
2030
|
+
// Unit's first call can race the registration. Fall through to the
|
|
2031
|
+
// bounded verification retry instead of pausing.
|
|
2032
|
+
debugLog("postUnit", { phase: "tool-unavailable-retry", unitType: s.currentUnit.type, unitId: s.currentUnit.id, error: s.lastToolInvocationError });
|
|
2033
|
+
ctx.ui.notify(
|
|
2034
|
+
`Tool unavailable for ${s.currentUnit.type}: ${s.lastToolInvocationError}. The tool surface may still be registering — retrying.`,
|
|
2035
|
+
"warning",
|
|
2036
|
+
);
|
|
2037
|
+
s.lastToolInvocationError = null;
|
|
2038
|
+
} else if (s.lastToolInvocationError) {
|
|
2019
2039
|
const isUserSkip = /queued user message/i.test(s.lastToolInvocationError);
|
|
2020
2040
|
const errMsg = isUserSkip
|
|
2021
2041
|
? `Tool skipped for ${s.currentUnit.type}: ${s.lastToolInvocationError}. Queued user message interrupted the turn — pausing auto-mode.`
|
|
@@ -2141,6 +2161,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
2141
2161
|
}
|
|
2142
2162
|
}
|
|
2143
2163
|
s.exhaustedVerificationUnits.add(retryKey);
|
|
2164
|
+
saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
|
|
2144
2165
|
debugLog("postUnit", { phase: "artifact-verify-exhausted", unitType: s.currentUnit.type, unitId: s.currentUnit.id, attempt });
|
|
2145
2166
|
ctx.ui.notify(
|
|
2146
2167
|
`${failureDetails} Pausing auto-mode after ${MAX_ARTIFACT_VERIFICATION_RETRIES} retries.`,
|
|
@@ -2150,6 +2171,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
2150
2171
|
return "dispatched";
|
|
2151
2172
|
}
|
|
2152
2173
|
s.verificationRetryCount.set(retryKey, attempt);
|
|
2174
|
+
saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
|
|
2153
2175
|
s.pendingVerificationRetry = {
|
|
2154
2176
|
unitId: s.currentUnit.id,
|
|
2155
2177
|
failureContext: `${failureDetails} (attempt ${attempt}/${MAX_ARTIFACT_VERIFICATION_RETRIES}).`,
|
|
@@ -2173,6 +2195,8 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
2173
2195
|
}
|
|
2174
2196
|
s.verificationRetryCount.delete(retryKey);
|
|
2175
2197
|
s.verificationRetryFailureHashes.delete(retryKey);
|
|
2198
|
+
s.exhaustedVerificationUnits.delete(retryKey);
|
|
2199
|
+
saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
|
|
2176
2200
|
|
|
2177
2201
|
if (s.currentUnit.type === "complete-milestone") {
|
|
2178
2202
|
const { milestone: mid } = parseUnitId(s.currentUnit.id);
|
|
@@ -40,6 +40,7 @@ import {
|
|
|
40
40
|
composeContextModeInstructions,
|
|
41
41
|
composeContractedUnitContext,
|
|
42
42
|
composeInlinedContext,
|
|
43
|
+
composeToolSurfaceInstructions,
|
|
43
44
|
composeUnitContext,
|
|
44
45
|
type ArtifactResolver,
|
|
45
46
|
type ComposedUnitContextBlock,
|
|
@@ -57,7 +58,11 @@ import { debugLog } from "./debug-logger.js";
|
|
|
57
58
|
import { buildSkillActivationBlock, buildSkillDiscoveryVars } from "./skill-activation.js";
|
|
58
59
|
import { findMilestoneIds } from "./milestone-ids.js";
|
|
59
60
|
import { buildRunUatPresentationForType, RUN_UAT_TOOL_PRESENTATION_PLAN_ID } from "./tool-presentation-plan.js";
|
|
60
|
-
import {
|
|
61
|
+
import {
|
|
62
|
+
classifyUatContentForRun,
|
|
63
|
+
shouldDispatchUatForContent,
|
|
64
|
+
type UatType,
|
|
65
|
+
} from "./uat-policy.js";
|
|
61
66
|
import { buildWebAppUatGuidanceBlock } from "./web-app-uat.js";
|
|
62
67
|
|
|
63
68
|
export { buildSkillActivationBlock, buildSkillDiscoveryVars };
|
|
@@ -292,10 +297,12 @@ function prependContextModeToBlock(
|
|
|
292
297
|
block: string,
|
|
293
298
|
renderMode: ContextModeRenderMode = "standalone",
|
|
294
299
|
): string {
|
|
300
|
+
const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode });
|
|
295
301
|
const contextMode = renderContextModeBlockForPrompt(unitType, base, renderMode);
|
|
296
|
-
|
|
297
|
-
if (!
|
|
298
|
-
return
|
|
302
|
+
const guidance = [toolSurface, contextMode].filter(Boolean).join("\n\n");
|
|
303
|
+
if (!guidance) return block;
|
|
304
|
+
if (!block.trim()) return guidance;
|
|
305
|
+
return `${guidance}\n\n${block}`;
|
|
299
306
|
}
|
|
300
307
|
|
|
301
308
|
function requireUnitPromptContextContract(unitType: string): UnitPromptContextContract {
|
|
@@ -969,7 +976,7 @@ export async function inlineDecisionsFromDb(
|
|
|
969
976
|
|
|
970
977
|
/**
|
|
971
978
|
* Inline requirements with optional milestone and slice scoping from the DB.
|
|
972
|
-
* Falls back to filesystem via inlineGsdRootFile when DB unavailable
|
|
979
|
+
* Falls back to filesystem via inlineGsdRootFile only when DB is unavailable.
|
|
973
980
|
*/
|
|
974
981
|
export async function inlineRequirementsFromDb(
|
|
975
982
|
base: string, milestoneId?: string, sliceId?: string, level?: InlineLevel,
|
|
@@ -979,14 +986,28 @@ export async function inlineRequirementsFromDb(
|
|
|
979
986
|
const { isDbAvailable } = await import("./gsd-db.js");
|
|
980
987
|
if (isDbAvailable()) {
|
|
981
988
|
const { queryRequirements, formatRequirementsForPrompt } = await import("./context-store.js");
|
|
982
|
-
|
|
989
|
+
let requirements = queryRequirements({ milestoneId, sliceId });
|
|
990
|
+
let broadenedScope = false;
|
|
991
|
+
if (requirements.length === 0 && sliceId) {
|
|
992
|
+
requirements = queryRequirements({ milestoneId });
|
|
993
|
+
broadenedScope = true;
|
|
994
|
+
}
|
|
995
|
+
if (requirements.length === 0 && milestoneId) {
|
|
996
|
+
requirements = queryRequirements({ status: "active" });
|
|
997
|
+
broadenedScope = true;
|
|
998
|
+
}
|
|
983
999
|
if (requirements.length > 0) {
|
|
984
|
-
// Use compact format for non-full levels
|
|
985
|
-
|
|
1000
|
+
// Use compact format for non-full levels, milestone-scoped calls, and
|
|
1001
|
+
// any cascade stage that broadened past the originally requested scope —
|
|
1002
|
+
// a slice-scoped "full" call that fell through to the project-wide
|
|
1003
|
+
// active fallback must not format those rows as full requirements.
|
|
1004
|
+
const useCompact = inlineLevel !== "full" || !sliceId || broadenedScope;
|
|
1005
|
+
const formatted = useCompact
|
|
986
1006
|
? formatRequirementsCompact(requirements)
|
|
987
1007
|
: formatRequirementsForPrompt(requirements);
|
|
988
1008
|
return `### Requirements\nSource: \`.gsd/REQUIREMENTS.md\`\n\n${formatted}`;
|
|
989
1009
|
}
|
|
1010
|
+
return null;
|
|
990
1011
|
}
|
|
991
1012
|
} catch (err) {
|
|
992
1013
|
logWarning("prompt", `inlineRequirementsFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -1442,6 +1463,40 @@ export async function checkNeedsReassessment(
|
|
|
1442
1463
|
* - No UAT file exists for the slice
|
|
1443
1464
|
* - UAT result file already exists (idempotent — already ran)
|
|
1444
1465
|
*/
|
|
1466
|
+
/**
|
|
1467
|
+
* Resolve the effective UAT mode for the dispatch gate the same way
|
|
1468
|
+
* `buildRunUatPrompt` does: classify the UAT body with the slice's SUMMARY as
|
|
1469
|
+
* supplemental context, so a `browser-executable` UAT whose slice references a
|
|
1470
|
+
* self-contained harness (`npm run test:uat`, `search-uat.mjs`, `npx
|
|
1471
|
+
* playwright test`) is promoted to `runtime-executable` for the gate too.
|
|
1472
|
+
*
|
|
1473
|
+
* Without this, `checkNeedsRunUat` returns `browser-executable` while the
|
|
1474
|
+
* prompt instructs runtime-only execution, causing the dispatch gate to
|
|
1475
|
+
* require browser tools / warm up the browser daemon (or stop dispatch when
|
|
1476
|
+
* browser MCP is unavailable) for UAT runs that never touch the browser. See
|
|
1477
|
+
* cursor[bot] review on PR #696 for the M007/S01 regression.
|
|
1478
|
+
*/
|
|
1479
|
+
async function resolveRunUatEffectiveType(
|
|
1480
|
+
base: string,
|
|
1481
|
+
mid: string,
|
|
1482
|
+
sliceId: string,
|
|
1483
|
+
uatContent: string,
|
|
1484
|
+
): Promise<UatType> {
|
|
1485
|
+
let summaryContent = "";
|
|
1486
|
+
try {
|
|
1487
|
+
const summaryPath = resolveSliceFile(base, mid, sliceId, "SUMMARY");
|
|
1488
|
+
if (summaryPath) {
|
|
1489
|
+
summaryContent = (await loadFile(summaryPath)) ?? "";
|
|
1490
|
+
}
|
|
1491
|
+
} catch (err) {
|
|
1492
|
+
logWarning(
|
|
1493
|
+
"prompt",
|
|
1494
|
+
`resolveRunUatEffectiveType SUMMARY load failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
1495
|
+
);
|
|
1496
|
+
}
|
|
1497
|
+
return classifyUatContentForRun(uatContent, summaryContent).effectiveType;
|
|
1498
|
+
}
|
|
1499
|
+
|
|
1445
1500
|
export async function checkNeedsRunUat(
|
|
1446
1501
|
base: string, mid: string, state: GSDState, prefs: GSDPreferences | undefined,
|
|
1447
1502
|
): Promise<{ sliceId: string; uatType: UatType } | null> {
|
|
@@ -1470,7 +1525,8 @@ export async function checkNeedsRunUat(
|
|
|
1470
1525
|
if (assessmentContent && hasVerdict(assessmentContent)) continue;
|
|
1471
1526
|
}
|
|
1472
1527
|
if (!shouldDispatchUatForContent(uatContent, prefs)) continue;
|
|
1473
|
-
|
|
1528
|
+
const uatType = await resolveRunUatEffectiveType(base, mid, sid, uatContent);
|
|
1529
|
+
return { sliceId: sid, uatType };
|
|
1474
1530
|
}
|
|
1475
1531
|
return null;
|
|
1476
1532
|
}
|
|
@@ -1503,7 +1559,8 @@ export async function checkNeedsRunUat(
|
|
|
1503
1559
|
if (assessmentContentFb && hasVerdict(assessmentContentFb)) continue;
|
|
1504
1560
|
}
|
|
1505
1561
|
if (!shouldDispatchUatForContent(uatContentFb, prefs)) continue;
|
|
1506
|
-
|
|
1562
|
+
const uatType = await resolveRunUatEffectiveType(base, mid, uatSid, uatContentFb);
|
|
1563
|
+
return { sliceId: uatSid, uatType };
|
|
1507
1564
|
}
|
|
1508
1565
|
return null;
|
|
1509
1566
|
}
|
|
@@ -2470,6 +2527,9 @@ export async function buildPlanSlicePrompt(
|
|
|
2470
2527
|
`Either (a) add an earlier task that creates X on disk before the task that needs it, ` +
|
|
2471
2528
|
`or (b) if this task IS the one that creates X, move X from inputs to expected_output. ` +
|
|
2472
2529
|
`Do NOT put X in a task's expected_output if that task only reads or verifies X — only tasks that actually write X to disk should list it in expected_output.\n` +
|
|
2530
|
+
`- **"[file] X: ... GSD planning artifacts are projections preloaded as context / written by workflow tools"**: ` +
|
|
2531
|
+
`Remove X from the task's inputs, files, and expectedOutput entirely. Planning artifacts (anything under .gsd/, .planning/, or .audits/, or names like M001-CONTEXT.md / S01-PLAN.md) are preloaded as context and written by workflow tools — ` +
|
|
2532
|
+
`do NOT add a task that creates X and do NOT move X to expectedOutput.\n` +
|
|
2473
2533
|
`- **"[file] X: Task T_early reads X but it's created by task T_late (sequence violation)"**: ` +
|
|
2474
2534
|
`Either (a) reorder tasks so T_late (the creator) runs before T_early (the reader), ` +
|
|
2475
2535
|
`or (b) if T_late doesn't actually create X (it only reads/tests it), remove X from T_late's expected_output entirely.\n` +
|
|
@@ -3554,15 +3614,30 @@ export async function buildRunUatPrompt(
|
|
|
3554
3614
|
null,
|
|
3555
3615
|
cappedInlinedContext.length < rawInlinedContext.length ? `dropped ${rawInlinedContext.length - cappedInlinedContext.length} chars` : "within budget",
|
|
3556
3616
|
);
|
|
3617
|
+
const uatPolicy = classifyUatContentForRun(uatContent, cappedInlinedContext);
|
|
3618
|
+
const uatType = uatPolicy.effectiveType;
|
|
3619
|
+
const runtimeHarnessOverride = uatPolicy.declaredType === "browser-executable" && uatType === "runtime-executable"
|
|
3620
|
+
? [
|
|
3621
|
+
"## Runtime harness override",
|
|
3622
|
+
"",
|
|
3623
|
+
"This UAT declares `browser-executable` but the slice references a self-contained verification command (`npm run test:uat`, `search-uat.mjs`, or similar).",
|
|
3624
|
+
"Run **only** that command via `gsd_uat_exec` with `uat-runtime-check` intent.",
|
|
3625
|
+
"Do **not** call `uat-service-start`, do **not** run `npm run start`, `npm run test:server`, or any separate server command.",
|
|
3626
|
+
"Do **not** use `browser_navigate` or other `browser_*` tools — the harness already exercises the browser.",
|
|
3627
|
+
"When the harness exits 0, save **PASS** with `uatType: \"runtime-executable\"` (the effective mode above, not the UAT file header) and **runtime** check modes only.",
|
|
3628
|
+
"",
|
|
3629
|
+
].join("\n")
|
|
3630
|
+
: "";
|
|
3557
3631
|
const inlinedContext = prependContextModeToBlock(
|
|
3558
3632
|
"run-uat",
|
|
3559
3633
|
base,
|
|
3560
|
-
|
|
3634
|
+
runtimeHarnessOverride
|
|
3635
|
+
? `${runtimeHarnessOverride}\n${cappedInlinedContext}`
|
|
3636
|
+
: cappedInlinedContext,
|
|
3561
3637
|
);
|
|
3562
3638
|
emitPromptContextTelemetry("run-uat", contextTelemetry, inlinedContext);
|
|
3563
3639
|
|
|
3564
3640
|
const uatResultPath = join(base, relSliceFile(base, mid, sliceId, "ASSESSMENT"));
|
|
3565
|
-
const uatType = resolveEffectiveUatType(uatContent);
|
|
3566
3641
|
const canonicalPresentation = JSON.stringify(buildRunUatPresentationForType(uatType), null, 2);
|
|
3567
3642
|
|
|
3568
3643
|
return loadPrompt("run-uat", {
|
|
@@ -3847,18 +3922,22 @@ export async function buildReactiveExecutePrompt(
|
|
|
3847
3922
|
const inlinedTemplates = inlineTemplate("task-summary", "Task Summary");
|
|
3848
3923
|
trackPromptContext(contextTelemetry, "templates", "inline", inlinedTemplates);
|
|
3849
3924
|
|
|
3850
|
-
const prompt =
|
|
3851
|
-
|
|
3852
|
-
|
|
3853
|
-
|
|
3854
|
-
|
|
3855
|
-
|
|
3856
|
-
|
|
3857
|
-
|
|
3858
|
-
|
|
3859
|
-
|
|
3860
|
-
|
|
3861
|
-
|
|
3925
|
+
const prompt = prependContextModeToBlock(
|
|
3926
|
+
"reactive-execute",
|
|
3927
|
+
base,
|
|
3928
|
+
loadPrompt("reactive-execute", {
|
|
3929
|
+
workingDirectory: base,
|
|
3930
|
+
milestoneId: mid,
|
|
3931
|
+
milestoneTitle: midTitle,
|
|
3932
|
+
sliceId: sid,
|
|
3933
|
+
sliceTitle: sTitle,
|
|
3934
|
+
graphContext,
|
|
3935
|
+
readyTaskCount: String(readyTaskIds.length),
|
|
3936
|
+
readyTaskList: readyTaskListLines.join("\n"),
|
|
3937
|
+
subagentPrompts: subagentSections.join("\n\n---\n\n"),
|
|
3938
|
+
inlinedTemplates,
|
|
3939
|
+
}),
|
|
3940
|
+
);
|
|
3862
3941
|
emitPromptContextTelemetry("reactive-execute", contextTelemetry, prompt);
|
|
3863
3942
|
return prompt;
|
|
3864
3943
|
}
|
|
@@ -4037,17 +4116,21 @@ export async function buildGateEvaluatePrompt(
|
|
|
4037
4116
|
].join("\n"));
|
|
4038
4117
|
}
|
|
4039
4118
|
|
|
4040
|
-
return
|
|
4041
|
-
|
|
4042
|
-
|
|
4043
|
-
|
|
4044
|
-
|
|
4045
|
-
|
|
4046
|
-
|
|
4047
|
-
|
|
4048
|
-
|
|
4049
|
-
|
|
4050
|
-
|
|
4119
|
+
return prependContextModeToBlock(
|
|
4120
|
+
"gate-evaluate",
|
|
4121
|
+
base,
|
|
4122
|
+
loadPrompt("gate-evaluate", {
|
|
4123
|
+
workingDirectory: base,
|
|
4124
|
+
milestoneId: mid,
|
|
4125
|
+
milestoneTitle: midTitle,
|
|
4126
|
+
sliceId: sid,
|
|
4127
|
+
sliceTitle: sTitle,
|
|
4128
|
+
slicePlanContent: planContent,
|
|
4129
|
+
gateCount: String(pending.length),
|
|
4130
|
+
gateList: gateListLines.join("\n"),
|
|
4131
|
+
subagentPrompts: subagentSections.join("\n\n---\n\n"),
|
|
4132
|
+
}),
|
|
4133
|
+
);
|
|
4051
4134
|
}
|
|
4052
4135
|
|
|
4053
4136
|
export async function buildRewriteDocsPrompt(
|
|
@@ -16,6 +16,7 @@ import type {
|
|
|
16
16
|
ExtensionCommandContext,
|
|
17
17
|
} from "@gsd/pi-coding-agent";
|
|
18
18
|
import { deriveState } from "./state.js";
|
|
19
|
+
import { findWorktreeSegment, isGsdWorktreePath } from "./worktree-root.js";
|
|
19
20
|
import { loadFile, getManifestStatus } from "./files.js";
|
|
20
21
|
import type { InterruptedSessionAssessment } from "./interrupted-session.js";
|
|
21
22
|
import {
|
|
@@ -27,6 +28,7 @@ import { ensureGsdSymlink, isInheritedRepo, validateProjectId } from "./repo-ide
|
|
|
27
28
|
import { migrateToExternalState, recoverFailedMigration } from "./migrate-external.js";
|
|
28
29
|
import { collectSecretsFromManifest } from "../get-secrets-from-user.js";
|
|
29
30
|
import { gsdRoot, resolveMilestoneFile } from "./paths.js";
|
|
31
|
+
import { milestoneEntryBlockedGuidance } from "./guidance.js";
|
|
30
32
|
import { invalidateAllCaches } from "./cache.js";
|
|
31
33
|
import { writeLock, clearLock, readCrashLock, isLockProcessAlive } from "./crash-recovery.js";
|
|
32
34
|
import {
|
|
@@ -56,7 +58,8 @@ import {
|
|
|
56
58
|
detectWorktreeName,
|
|
57
59
|
setActiveMilestoneId,
|
|
58
60
|
} from "./worktree.js";
|
|
59
|
-
import { getAutoWorktreePath, isInAutoWorktree
|
|
61
|
+
import { getAutoWorktreePath, isInAutoWorktree } from "./auto-worktree.js";
|
|
62
|
+
import { checkoutBranchWithStashGuard } from "./worktree-git-recovery.js";
|
|
60
63
|
import { readResourceVersion, cleanStaleRuntimeUnits } from "./auto-worktree.js";
|
|
61
64
|
import { worktreePath as getWorktreeDir, isInsideWorktreesDir } from "./worktree-manager.js";
|
|
62
65
|
import { emitWorktreeOrphaned } from "./worktree-telemetry.js";
|
|
@@ -96,7 +99,6 @@ import {
|
|
|
96
99
|
rmSync,
|
|
97
100
|
} from "node:fs";
|
|
98
101
|
import { join } from "node:path";
|
|
99
|
-
import { sep as pathSep } from "node:path";
|
|
100
102
|
|
|
101
103
|
import { validateDirectory } from "./validate-directory.js";
|
|
102
104
|
import {
|
|
@@ -601,7 +603,7 @@ export function auditOrphanedMilestoneBranches(
|
|
|
601
603
|
warnings.push(`Failed to remove worktree directory for ${milestoneId}: ${err2 instanceof Error ? err2.message : String(err2)}`);
|
|
602
604
|
}
|
|
603
605
|
} else {
|
|
604
|
-
warnings.push(`Orphaned worktree directory for ${milestoneId} is outside
|
|
606
|
+
warnings.push(`Orphaned worktree directory for ${milestoneId} is outside the GSD worktrees containers — skipping removal for safety.`);
|
|
605
607
|
}
|
|
606
608
|
} else {
|
|
607
609
|
pushAction({
|
|
@@ -717,7 +719,7 @@ export function auditOrphanedMilestoneBranches(
|
|
|
717
719
|
if (!existsSync(wtDir)) continue;
|
|
718
720
|
if (!isInsideWorktreesDir(basePath, wtDir)) {
|
|
719
721
|
warnings.push(
|
|
720
|
-
`Orphaned worktree directory for ${m.id} is outside
|
|
722
|
+
`Orphaned worktree directory for ${m.id} is outside the GSD worktrees containers — skipping removal for safety.`,
|
|
721
723
|
);
|
|
722
724
|
continue;
|
|
723
725
|
}
|
|
@@ -993,12 +995,14 @@ export async function bootstrapAutoSession(
|
|
|
993
995
|
// phase-specific planning model for a discuss turn (#2829).
|
|
994
996
|
//
|
|
995
997
|
// Precedence:
|
|
996
|
-
// 1) Explicit session override via /gsd model (this session)
|
|
997
|
-
// 2)
|
|
998
|
-
// 3)
|
|
998
|
+
// 1) Explicit session override via /gsd model or /gsd auto --model (this session)
|
|
999
|
+
// 2) GSD model preferences from PREFERENCES.md (validated against live auth)
|
|
1000
|
+
// 3) Current session model from settings/session restore (if provider ready)
|
|
999
1001
|
//
|
|
1000
|
-
//
|
|
1001
|
-
//
|
|
1002
|
+
// PREFERENCES.md wins over the ambient session default (#3517) so /gsd auto
|
|
1003
|
+
// does not stick on claude-code/claude-sonnet-4-6 when the user configured
|
|
1004
|
+
// models via /gsd workflow-preferences or PREFERENCES.md. Custom providers
|
|
1005
|
+
// still skip PREFERENCES.md entirely (#4122).
|
|
1002
1006
|
//
|
|
1003
1007
|
// Exception (#4122): when the session provider is a custom provider declared
|
|
1004
1008
|
// in ~/.gsd/agent/models.json (Ollama, vLLM, OpenAI-compatible proxy, etc.),
|
|
@@ -1010,7 +1014,7 @@ export async function bootstrapAutoSession(
|
|
|
1010
1014
|
const sessionProviderIsCustom = isCustomProvider(ctx.model?.provider);
|
|
1011
1015
|
const preferredModel = sessionProviderIsCustom
|
|
1012
1016
|
? null
|
|
1013
|
-
: resolveDefaultSessionModel(ctx.model?.provider);
|
|
1017
|
+
: resolveDefaultSessionModel(ctx.model?.provider, base);
|
|
1014
1018
|
// Validate the preferred model against the live registry + provider auth so
|
|
1015
1019
|
// an unconfigured PREFERENCES.md entry (no API key / OAuth) can't become the
|
|
1016
1020
|
// start-model snapshot. Without this, every subsequent unit would try to
|
|
@@ -1040,8 +1044,8 @@ export async function bootstrapAutoSession(
|
|
|
1040
1044
|
: null;
|
|
1041
1045
|
const startThinkingSnapshot = pi.getThinkingLevel();
|
|
1042
1046
|
const startModelSnapshot = manualSessionOverride
|
|
1043
|
-
?? currentSessionModel
|
|
1044
1047
|
?? validatedPreferredModel
|
|
1048
|
+
?? currentSessionModel
|
|
1045
1049
|
?? null;
|
|
1046
1050
|
|
|
1047
1051
|
try {
|
|
@@ -1325,7 +1329,7 @@ export async function bootstrapAutoSession(
|
|
|
1325
1329
|
(state.phase === "pre-planning" || state.phase === "complete") &&
|
|
1326
1330
|
survivorIsolationMode !== "none" &&
|
|
1327
1331
|
!detectWorktreeName(base) &&
|
|
1328
|
-
!base
|
|
1332
|
+
!isGsdWorktreePath(base)
|
|
1329
1333
|
) {
|
|
1330
1334
|
const milestoneBranch = `milestone/${survivorMilestoneId}`;
|
|
1331
1335
|
const { nativeBranchExists } = await import("./native-git-bridge.js");
|
|
@@ -1610,16 +1614,12 @@ export async function bootstrapAutoSession(
|
|
|
1610
1614
|
// live here is gone.
|
|
1611
1615
|
|
|
1612
1616
|
const isUnderGsdWorktrees = (p: string): boolean => {
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
const symlinkRe = new RegExp(
|
|
1620
|
-
`\\${pathSep}\\.gsd\\${pathSep}projects\\${pathSep}[a-f0-9]+\\${pathSep}worktrees(?:\\${pathSep}|$)`,
|
|
1621
|
-
);
|
|
1622
|
-
return symlinkRe.test(p);
|
|
1617
|
+
const normalized = p.replaceAll("\\", "/");
|
|
1618
|
+
if (findWorktreeSegment(normalized) !== null) return true;
|
|
1619
|
+
// The container directory itself (no trailing worktree name), in any layout.
|
|
1620
|
+
return normalized.endsWith("/.gsd/worktrees")
|
|
1621
|
+
|| normalized.endsWith("/.gsd-worktrees")
|
|
1622
|
+
|| /\/\.gsd\/projects\/[^/]+\/worktrees$/.test(normalized);
|
|
1623
1623
|
};
|
|
1624
1624
|
|
|
1625
1625
|
if (
|
|
@@ -1646,14 +1646,9 @@ export async function bootstrapAutoSession(
|
|
|
1646
1646
|
`Cannot enter milestone ${s.currentMilestoneId}: lease is held by another worker.`,
|
|
1647
1647
|
"error",
|
|
1648
1648
|
);
|
|
1649
|
-
} else if (enterResult.reason === "creation-failed") {
|
|
1650
|
-
ctx.ui.notify(
|
|
1651
|
-
`Cannot enter milestone ${s.currentMilestoneId}: worktree/branch creation failed. Isolation is degraded.`,
|
|
1652
|
-
"error",
|
|
1653
|
-
);
|
|
1654
|
-
} else if (enterResult.reason === "isolation-degraded") {
|
|
1649
|
+
} else if (enterResult.reason === "creation-failed" || enterResult.reason === "isolation-degraded") {
|
|
1655
1650
|
ctx.ui.notify(
|
|
1656
|
-
|
|
1651
|
+
milestoneEntryBlockedGuidance(s.currentMilestoneId, enterResult.reason),
|
|
1657
1652
|
"error",
|
|
1658
1653
|
);
|
|
1659
1654
|
} else if (enterResult.reason === "invalid-milestone-id") {
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { stripMcpToolPrefix } from "@gsd/pi-ai";
|
|
8
|
+
import { TOOL_SURFACE_NOT_READY } from "./tool-surface-readiness.js";
|
|
8
9
|
|
|
9
10
|
interface InFlightTool {
|
|
10
11
|
startedAt: number;
|
|
@@ -132,6 +133,15 @@ export function clearInFlightTools(): void {
|
|
|
132
133
|
const TOOL_INVOCATION_ERROR_RE = /Validation failed for tool|Input validation error|Invalid arguments for tool|MCP error -32602|No such tool available|Expected ',' or '\}'(?: after property value)?(?: in JSON)?|Unexpected end of JSON|Unexpected token.*in JSON|does not provide an export named|Named export .* not found|Cannot find module|ERR_MODULE_NOT_FOUND|ERR_MODULE_NOT_EXPORTED|ERR_PACKAGE_PATH_NOT_EXPORTED/i;
|
|
133
134
|
const DETERMINISTIC_POLICY_ERROR_RE = /(?:^|\b)(?:HARD BLOCK:|Blocked: \/gsd queue is a planning tool|Direct writes to \.gsd\/STATE\.md and \.gsd\/gsd\.db are blocked|This is a mechanical gate)/i;
|
|
134
135
|
|
|
136
|
+
/**
|
|
137
|
+
* Matches the runtime's "tool not registered" error. Unlike the deterministic
|
|
138
|
+
* invocation failures above, this one is usually transient: the workflow MCP
|
|
139
|
+
* server registers its tool surface asynchronously after session start, so a
|
|
140
|
+
* Unit's first tool call can race the registration. Callers should retry
|
|
141
|
+
* (bounded) instead of breaking the loop.
|
|
142
|
+
*/
|
|
143
|
+
const TOOL_UNAVAILABLE_ERROR_RE = new RegExp(`No such tool available|${TOOL_SURFACE_NOT_READY}`, "i");
|
|
144
|
+
|
|
135
145
|
/**
|
|
136
146
|
* Returns true if the error message indicates a deterministic invocation or
|
|
137
147
|
* policy failure (as opposed to a normal tool execution error).
|
|
@@ -141,6 +151,15 @@ export function isToolInvocationError(errorMsg: string): boolean {
|
|
|
141
151
|
return TOOL_INVOCATION_ERROR_RE.test(errorMsg) || isDeterministicPolicyError(errorMsg);
|
|
142
152
|
}
|
|
143
153
|
|
|
154
|
+
/**
|
|
155
|
+
* Returns true if the error message indicates the called tool was not on the
|
|
156
|
+
* session's tool surface (MCP startup race — see TOOL_UNAVAILABLE_ERROR_RE).
|
|
157
|
+
*/
|
|
158
|
+
export function isToolUnavailableError(errorMsg: string): boolean {
|
|
159
|
+
if (!errorMsg) return false;
|
|
160
|
+
return TOOL_UNAVAILABLE_ERROR_RE.test(errorMsg);
|
|
161
|
+
}
|
|
162
|
+
|
|
144
163
|
/**
|
|
145
164
|
* Returns true if the error message indicates the tool was skipped because
|
|
146
165
|
* a queued user message interrupted the turn (#3595). Retrying will produce
|
|
@@ -5,32 +5,25 @@ import {
|
|
|
5
5
|
} from "./unit-tool-contracts.js";
|
|
6
6
|
import {
|
|
7
7
|
WORKFLOW_TOOL_ALIAS_PAIRS,
|
|
8
|
-
canonicalWorkflowSurfaceToolName,
|
|
9
8
|
isWorkflowSurfaceAliasTool,
|
|
10
9
|
stripMcpToolPrefix,
|
|
11
10
|
} from "./workflow-tool-surface.js";
|
|
11
|
+
import { canonicalWorkflowToolName } from "./engine-hook-contract.js";
|
|
12
12
|
|
|
13
13
|
export {
|
|
14
14
|
AUTO_UNIT_SCOPED_TOOLS,
|
|
15
15
|
RUN_UAT_BROWSER_TOOL_NAMES,
|
|
16
16
|
} from "./unit-tool-contracts.js";
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const SECTION_CLOSE_GATE_UNIT_TYPES = new Set([
|
|
28
|
-
"execute-task",
|
|
29
|
-
"execute-task-simple",
|
|
30
|
-
"reactive-execute",
|
|
31
|
-
"complete-slice",
|
|
32
|
-
"validate-milestone",
|
|
33
|
-
]);
|
|
18
|
+
// Scope-class membership is declared per unit in the Unit Registry (ADR-033).
|
|
19
|
+
// EXECUTE_TASK_UNIT_TYPES = scopeClass "execute-task"; the section-close gate
|
|
20
|
+
// Set additionally includes scopeClass "section-close" — units whose completion
|
|
21
|
+
// handlers persist gate verdicts from artifact sections (gsd_save_gate_result
|
|
22
|
+
// belongs to gate-evaluate, so it is soft-blocked with a redirect below).
|
|
23
|
+
import {
|
|
24
|
+
EXECUTE_TASK_UNIT_TYPES,
|
|
25
|
+
SECTION_CLOSE_GATE_UNIT_TYPES,
|
|
26
|
+
} from "./unit-registry.js";
|
|
34
27
|
|
|
35
28
|
const EXTRA_SCOPED_GSD_LIFECYCLE_TOOLS = [
|
|
36
29
|
"gsd_skip_slice",
|
|
@@ -58,9 +51,9 @@ type AutoUnitToolScopeResult = {
|
|
|
58
51
|
displayReason?: string;
|
|
59
52
|
};
|
|
60
53
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
54
|
+
// Normalizer seam lives in engine-hook-contract.ts; re-exported here for
|
|
55
|
+
// existing scope importers.
|
|
56
|
+
export { canonicalWorkflowToolName };
|
|
64
57
|
|
|
65
58
|
export function isWorkflowAliasTool(toolName: string): boolean {
|
|
66
59
|
return isWorkflowSurfaceAliasTool(toolName);
|
|
@@ -110,7 +103,7 @@ function isNativeWorkflowTool(toolName: string): boolean {
|
|
|
110
103
|
return stripMcpToolPrefix(toolName) === "Workflow";
|
|
111
104
|
}
|
|
112
105
|
|
|
113
|
-
function readStringField(input: unknown, camel: string, snake: string): string | undefined {
|
|
106
|
+
export function readStringField(input: unknown, camel: string, snake: string): string | undefined {
|
|
114
107
|
if (!input || typeof input !== "object") return undefined;
|
|
115
108
|
const record = input as Record<string, unknown>;
|
|
116
109
|
const value = record[camel] ?? record[snake];
|