@opengsd/gsd-pi 1.2.0-dev.4c756166 → 1.2.0-dev.822c9439
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.d.ts +9 -5
- package/dist/resource-loader.js +116 -20
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/bg-shell/utilities.js +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 +122 -58
- package/dist/resources/extensions/gsd/auto/phases.js +54 -6
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +43 -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-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +49 -353
- package/dist/resources/extensions/gsd/auto.js +45 -21
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +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/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
- package/dist/resources/extensions/gsd/db/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-engine-checks.js +5 -5
- 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 +6 -21
- 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-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +57 -8
- 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 +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/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/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/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-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
- package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- 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/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- 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 +11 -11
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -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 +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/cli.js +9 -1
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +145 -59
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +158 -17
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +132 -17
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/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 +40 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +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 +137 -61
- package/src/resources/extensions/gsd/auto/phases.ts +74 -26
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +52 -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-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +55 -365
- package/src/resources/extensions/gsd/auto.ts +64 -25
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +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/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
- package/src/resources/extensions/gsd/db/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-engine-checks.ts +5 -4
- 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 +5 -22
- 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-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +71 -31
- 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 +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/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/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/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 +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -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-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/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 +351 -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/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/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-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +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/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/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/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/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/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- package/src/resources/extensions/gsd/tests/worktree-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 +24 -2
- 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 +109 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
- package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- 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/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
- package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → yWwBo-w09Y_W-nmeeWFRp}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → yWwBo-w09Y_W-nmeeWFRp}/_ssgManifest.js +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** browser-tools — Pi Browser Automation Contract adapter. */
|
|
2
2
|
import { importExtensionModule } from "@gsd/pi-coding-agent";
|
|
3
3
|
import { closeManagedGsdBrowser, registerManagedGsdBrowserTools, warmUpManagedGsdBrowser } from "./engine/managed-gsd-browser.js";
|
|
4
|
-
import {
|
|
4
|
+
import { commitBrowserEngineResolution, resolveAmbientBrowserEngineResolution } from "./engine/selection.js";
|
|
5
5
|
import { setArtifactRootForCwd } from "./state.js";
|
|
6
6
|
import { detectWebApp } from "./web-app-detect.js";
|
|
7
7
|
let legacyRegistrationPromise = null;
|
|
@@ -130,12 +130,56 @@ function withBrowserArtifactCwdScope(pi) {
|
|
|
130
130
|
},
|
|
131
131
|
};
|
|
132
132
|
}
|
|
133
|
-
|
|
134
|
-
|
|
133
|
+
/** Daemon-connect budget when the probe-resolved managed engine is verified at session start. */
|
|
134
|
+
const PROBE_WARMUP_TIMEOUT_MS = 10_000;
|
|
135
|
+
async function registerBrowserTools(pi, ctx) {
|
|
136
|
+
const projectRoot = ctx.cwd || process.cwd();
|
|
137
|
+
const resolution = resolveAmbientBrowserEngineResolution(projectRoot);
|
|
138
|
+
let engine = resolution.engine;
|
|
135
139
|
if (engine === "off")
|
|
136
140
|
return;
|
|
141
|
+
// A probe-resolved managed engine is only a prediction that gsd-browser
|
|
142
|
+
// works — prove it by connecting the daemon before committing the session's
|
|
143
|
+
// tool registrations to it. Connect failure falls back to legacy Playwright
|
|
144
|
+
// (the failure mode that made ADR-024 freeze the old default) and commits
|
|
145
|
+
// the outcome so ambient readers see the engine actually in use. When eager
|
|
146
|
+
// warm-up is disabled the daemon-connect proof cannot run, so the probe
|
|
147
|
+
// default treats the managed engine as unprovable and falls back to legacy
|
|
148
|
+
// rather than registering it unverified. An explicit
|
|
149
|
+
// GSD_BROWSER_ENGINE=gsd-browser override skips the gate and is honored
|
|
150
|
+
// verbatim, matching prior behavior.
|
|
151
|
+
if (engine === "gsd-browser" && resolution.source === "probe" && !registeredEngine) {
|
|
152
|
+
if (isWarmUpDisabled()) {
|
|
153
|
+
engine = commitLegacyFallback(projectRoot, "warm-up disabled; managed engine unverifiable; using legacy Playwright");
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
const warmUp = await warmUpManagedGsdBrowser(ctx, AbortSignal.timeout(PROBE_WARMUP_TIMEOUT_MS));
|
|
157
|
+
if (!warmUp.ok) {
|
|
158
|
+
engine = commitLegacyFallback(projectRoot, `gsd-browser daemon connect failed (${warmUp.error}); using legacy Playwright`);
|
|
159
|
+
if (ctx.hasUI) {
|
|
160
|
+
ctx.ui.notify(`gsd-browser engine unavailable (${warmUp.error}); using Playwright browser tools for this session.`, "warning");
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else if (warmUp.coverageWarning && ctx.hasUI) {
|
|
164
|
+
ctx.ui.notify(warmUp.coverageWarning, "warning");
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Browser tool registrations are process-global and cannot be swapped once
|
|
169
|
+
// live. When an earlier session in this process already registered an engine
|
|
170
|
+
// and this project resolved a different one (per-project probe resolution can
|
|
171
|
+
// diverge across projects in a multi-session process), adopt the registered
|
|
172
|
+
// engine rather than throwing — a throw surfaces as "browser-tools failed to
|
|
173
|
+
// load" and leaves this session with no browser tools at all. Commit the
|
|
174
|
+
// adoption so ambient readers (UAT guidance, warm-up) describe the engine
|
|
175
|
+
// actually in use.
|
|
137
176
|
if (registeredEngine && registeredEngine !== engine) {
|
|
138
|
-
|
|
177
|
+
engine = registeredEngine;
|
|
178
|
+
commitBrowserEngineResolution(projectRoot, {
|
|
179
|
+
engine,
|
|
180
|
+
source: "probe",
|
|
181
|
+
reason: `browser tools already registered with ${engine} earlier in this process; adopting it`,
|
|
182
|
+
});
|
|
139
183
|
}
|
|
140
184
|
let registration;
|
|
141
185
|
if (engine === "legacy") {
|
|
@@ -165,27 +209,40 @@ async function registerBrowserTools(pi) {
|
|
|
165
209
|
throw error;
|
|
166
210
|
}
|
|
167
211
|
}
|
|
212
|
+
function commitLegacyFallback(projectRoot, reason) {
|
|
213
|
+
commitBrowserEngineResolution(projectRoot, { engine: "legacy", source: "probe", reason });
|
|
214
|
+
return "legacy";
|
|
215
|
+
}
|
|
168
216
|
function isWarmUpDisabled() {
|
|
169
217
|
const value = process.env.GSD_BROWSER_WARMUP?.trim().toLowerCase();
|
|
170
218
|
return value === "0" || value === "false" || value === "off";
|
|
171
219
|
}
|
|
172
220
|
/**
|
|
173
|
-
* Auto-initialize the managed gsd-browser engine
|
|
174
|
-
*
|
|
175
|
-
*
|
|
221
|
+
* Auto-initialize the managed gsd-browser engine when it was selected via the
|
|
222
|
+
* explicit GSD_BROWSER_ENGINE override, which registers without the
|
|
223
|
+
* daemon-connect gate. Best-effort and non-blocking: warm-up runs in the
|
|
224
|
+
* background and only surfaces a warning if it fails. Probe-resolved sessions
|
|
225
|
+
* already connected (or fell back) during registration, so they are excluded
|
|
226
|
+
* to avoid re-warming and double-notifying.
|
|
176
227
|
*/
|
|
177
228
|
function maybeWarmUpManagedEngine(pi, ctx) {
|
|
178
229
|
if (isWarmUpDisabled())
|
|
179
230
|
return;
|
|
180
|
-
if (resolveBrowserEngineMode() !== "gsd-browser")
|
|
181
|
-
return;
|
|
182
231
|
const projectRoot = ctx.cwd || process.cwd();
|
|
232
|
+
const resolution = resolveAmbientBrowserEngineResolution(projectRoot);
|
|
233
|
+
if (resolution.engine !== "gsd-browser" || resolution.source !== "env")
|
|
234
|
+
return;
|
|
183
235
|
if (!detectWebApp(projectRoot))
|
|
184
236
|
return;
|
|
185
237
|
void warmUpManagedGsdBrowser(ctx).then((result) => {
|
|
186
|
-
if (!
|
|
238
|
+
if (!ctx.hasUI)
|
|
239
|
+
return;
|
|
240
|
+
if (!result.ok) {
|
|
187
241
|
ctx.ui.notify(`gsd-browser auto-init failed: ${result.error}. Browser UAT tools will retry on first use; run /gsd doctor if this persists.`, "warning");
|
|
188
242
|
}
|
|
243
|
+
else if (result.coverageWarning) {
|
|
244
|
+
ctx.ui.notify(result.coverageWarning, "warning");
|
|
245
|
+
}
|
|
189
246
|
});
|
|
190
247
|
}
|
|
191
248
|
async function closeActiveBrowserEngines() {
|
|
@@ -198,14 +255,14 @@ async function closeActiveBrowserEngines() {
|
|
|
198
255
|
export default function (pi) {
|
|
199
256
|
pi.on("session_start", async (_event, ctx) => {
|
|
200
257
|
if (ctx.hasUI) {
|
|
201
|
-
void registerBrowserTools(pi)
|
|
258
|
+
void registerBrowserTools(pi, ctx)
|
|
202
259
|
.then(() => maybeWarmUpManagedEngine(pi, ctx))
|
|
203
260
|
.catch((error) => {
|
|
204
261
|
ctx.ui.notify(`browser-tools failed to load: ${error instanceof Error ? error.message : String(error)}`, "warning");
|
|
205
262
|
});
|
|
206
263
|
return;
|
|
207
264
|
}
|
|
208
|
-
await registerBrowserTools(pi);
|
|
265
|
+
await registerBrowserTools(pi, ctx);
|
|
209
266
|
maybeWarmUpManagedEngine(pi, ctx);
|
|
210
267
|
});
|
|
211
268
|
pi.on("session_shutdown", async () => {
|
|
@@ -37,6 +37,15 @@ export const CLAUDE_CODE_MODELS = [
|
|
|
37
37
|
contextWindow: 1_000_000,
|
|
38
38
|
maxTokens: 128_000,
|
|
39
39
|
},
|
|
40
|
+
{
|
|
41
|
+
id: "claude-fable-5",
|
|
42
|
+
name: "Claude Fable 5 (via Claude Code)",
|
|
43
|
+
reasoning: true,
|
|
44
|
+
input: ["text", "image"],
|
|
45
|
+
cost: ZERO_COST,
|
|
46
|
+
contextWindow: 1_000_000,
|
|
47
|
+
maxTokens: 128_000,
|
|
48
|
+
},
|
|
40
49
|
{
|
|
41
50
|
id: "claude-sonnet-4-6",
|
|
42
51
|
name: "Claude Sonnet 4.6 (via Claude Code)",
|
|
@@ -24,6 +24,8 @@ import { markToolStart, markToolEnd } from "../gsd/auto.js";
|
|
|
24
24
|
import { markInteractiveElicitationStart, markInteractiveElicitationEnd, } from "../gsd/auto-tool-tracking.js";
|
|
25
25
|
import { discoverBrowserMcpServerName, discoverMcpServers, discoverMcpServerNames, discoverUserMcpServerNames, discoverWorkflowMcpServerName, computeMcpDisallowedTools, } from "../gsd/mcp-filter.js";
|
|
26
26
|
import { RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES, RUN_UAT_FORBIDDEN_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES, resolveToolPresentationPlan } from "../gsd/tool-presentation-plan.js";
|
|
27
|
+
import { getToolSurfaceReadinessError } from "../gsd/tool-surface-readiness.js";
|
|
28
|
+
import { hasBrowserContractPrefix } from "../shared/browser-contract.js";
|
|
27
29
|
import { showInterviewRound } from "../shared/tui.js";
|
|
28
30
|
export { buildFinalAssistantContent, extractToolResultsFromSdkUserMessage, handleClaudeCodePartialStreamEvent, mergePendingToolCalls, } from "./turn-assembler.js";
|
|
29
31
|
export function serverToolUseToToolCallLike(block) {
|
|
@@ -1242,6 +1244,8 @@ function modelSupportsAdaptiveThinking(modelId) {
|
|
|
1242
1244
|
|| modelId.includes("opus-4.7")
|
|
1243
1245
|
|| modelId.includes("opus-4-8")
|
|
1244
1246
|
|| modelId.includes("opus-4.8")
|
|
1247
|
+
|| modelId.includes("fable-5")
|
|
1248
|
+
|| modelId.includes("fable.5")
|
|
1245
1249
|
|| modelId.includes("sonnet-4-6")
|
|
1246
1250
|
|| modelId.includes("sonnet-4.6")
|
|
1247
1251
|
|| modelId.includes("sonnet-4-7")
|
|
@@ -1263,7 +1267,9 @@ function mapThinkingLevelToAnthropicEffort(level, modelId) {
|
|
|
1263
1267
|
if (modelId.includes("opus-4-7")
|
|
1264
1268
|
|| modelId.includes("opus-4.7")
|
|
1265
1269
|
|| modelId.includes("opus-4-8")
|
|
1266
|
-
|| modelId.includes("opus-4.8")
|
|
1270
|
+
|| modelId.includes("opus-4.8")
|
|
1271
|
+
|| modelId.includes("fable-5")
|
|
1272
|
+
|| modelId.includes("fable.5"))
|
|
1267
1273
|
return "xhigh";
|
|
1268
1274
|
if (modelId.includes("opus-4-6") || modelId.includes("opus-4.6"))
|
|
1269
1275
|
return "max";
|
|
@@ -1285,7 +1291,7 @@ function browserMcpServerNameFromAllowedTools(allowedTools) {
|
|
|
1285
1291
|
const parsed = parseAllowedMcpToolName(toolName);
|
|
1286
1292
|
if (!parsed)
|
|
1287
1293
|
continue;
|
|
1288
|
-
if (parsed.server === "gsd-browser" || parsed.tool
|
|
1294
|
+
if (parsed.server === "gsd-browser" || hasBrowserContractPrefix(parsed.tool)) {
|
|
1289
1295
|
return parsed.server;
|
|
1290
1296
|
}
|
|
1291
1297
|
}
|
|
@@ -1299,7 +1305,7 @@ function workflowMcpServerNameFromAllowedTools(allowedTools) {
|
|
|
1299
1305
|
if (typeof toolName !== "string")
|
|
1300
1306
|
continue;
|
|
1301
1307
|
const parsed = parseAllowedMcpToolName(toolName);
|
|
1302
|
-
if (!parsed || parsed.server === browserServerName || parsed.tool
|
|
1308
|
+
if (!parsed || parsed.server === browserServerName || hasBrowserContractPrefix(parsed.tool))
|
|
1303
1309
|
continue;
|
|
1304
1310
|
return parsed.server;
|
|
1305
1311
|
}
|
|
@@ -1564,7 +1570,9 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
|
|
|
1564
1570
|
|| modelId.includes("opus-4-7")
|
|
1565
1571
|
|| modelId.includes("opus-4.7")
|
|
1566
1572
|
|| modelId.includes("opus-4-8")
|
|
1567
|
-
|| modelId.includes("opus-4.8")
|
|
1573
|
+
|| modelId.includes("opus-4.8")
|
|
1574
|
+
|| modelId.includes("fable-5")
|
|
1575
|
+
|| modelId.includes("fable.5")) ? ["context-1m-2025-08-07"] : [],
|
|
1568
1576
|
...(thinkingConfig ?? {}),
|
|
1569
1577
|
...(effort ? { effort } : {}),
|
|
1570
1578
|
...sdkExtraOptions,
|
|
@@ -1629,8 +1637,9 @@ async function pumpSdkMessages(model, context, options, stream) {
|
|
|
1629
1637
|
}
|
|
1630
1638
|
: {}),
|
|
1631
1639
|
});
|
|
1640
|
+
const workflowMcpServerName = workflowMcpServerNameFromAllowedTools(sdkOpts.allowedTools);
|
|
1632
1641
|
const prompt = buildPromptFromContext(context, {
|
|
1633
|
-
workflowMcpServerName
|
|
1642
|
+
workflowMcpServerName,
|
|
1634
1643
|
browserMcpServerName: browserMcpServerNameFromAllowedTools(sdkOpts.allowedTools),
|
|
1635
1644
|
});
|
|
1636
1645
|
const queryPrompt = buildSdkQueryPrompt(context, prompt);
|
|
@@ -1668,7 +1677,30 @@ async function pumpSdkMessages(model, context, options, stream) {
|
|
|
1668
1677
|
switch (msg.type) {
|
|
1669
1678
|
// -- Init --
|
|
1670
1679
|
case "system": {
|
|
1671
|
-
//
|
|
1680
|
+
// Tool Surface Readiness gate: the init message is the first (and
|
|
1681
|
+
// only) point where the session reports its live tool surface and
|
|
1682
|
+
// MCP server statuses. If the workflow server failed or has not
|
|
1683
|
+
// registered this Unit's required tools, abort before the first
|
|
1684
|
+
// model turn with a transient, recovery-classifiable error
|
|
1685
|
+
// (tool-unavailable → retry) instead of letting the model hit
|
|
1686
|
+
// "No such tool available" mid-Unit and improvise around it.
|
|
1687
|
+
const init = msg;
|
|
1688
|
+
if (init.subtype === "init") {
|
|
1689
|
+
const readinessError = getToolSurfaceReadinessError({
|
|
1690
|
+
unitType: gsdPhase,
|
|
1691
|
+
workflowServerName: workflowMcpServerName,
|
|
1692
|
+
observation: { tools: init.tools ?? [], mcpServers: init.mcp_servers ?? [] },
|
|
1693
|
+
});
|
|
1694
|
+
if (readinessError) {
|
|
1695
|
+
controller.abort();
|
|
1696
|
+
stream.push({
|
|
1697
|
+
type: "error",
|
|
1698
|
+
reason: "error",
|
|
1699
|
+
error: makeErrorMessage(modelId, readinessError),
|
|
1700
|
+
});
|
|
1701
|
+
return;
|
|
1702
|
+
}
|
|
1703
|
+
}
|
|
1672
1704
|
break;
|
|
1673
1705
|
}
|
|
1674
1706
|
// -- Streaming partial messages --
|
|
@@ -4,6 +4,12 @@ import { readFileSync, mkdirSync, unlinkSync } from "node:fs";
|
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { atomicWriteSync } from "../atomic-write.js";
|
|
6
6
|
import { gsdRoot } from "../paths.js";
|
|
7
|
+
function ensureExhaustedVerificationUnits(s) {
|
|
8
|
+
if (!s.exhaustedVerificationUnits) {
|
|
9
|
+
s.exhaustedVerificationUnits = new Set();
|
|
10
|
+
}
|
|
11
|
+
return s.exhaustedVerificationUnits;
|
|
12
|
+
}
|
|
7
13
|
export function customVerifyRetryStateDir(s) {
|
|
8
14
|
return s.activeRunDir ? join(s.activeRunDir, "runtime") : join(gsdRoot(s.basePath), "runtime");
|
|
9
15
|
}
|
|
@@ -11,7 +17,8 @@ export function customVerifyRetryStatePath(s) {
|
|
|
11
17
|
return join(customVerifyRetryStateDir(s), "custom-verify-retries.json");
|
|
12
18
|
}
|
|
13
19
|
export function hydrateCustomVerifyRetryCounts(s, deps) {
|
|
14
|
-
|
|
20
|
+
const exhaustedUnits = ensureExhaustedVerificationUnits(s);
|
|
21
|
+
if (s.verificationRetryCount.size > 0 || exhaustedUnits.size > 0) {
|
|
15
22
|
return s.verificationRetryCount;
|
|
16
23
|
}
|
|
17
24
|
try {
|
|
@@ -24,6 +31,12 @@ export function hydrateCustomVerifyRetryCounts(s, deps) {
|
|
|
24
31
|
s.verificationRetryCount.set(key, Math.floor(value));
|
|
25
32
|
}
|
|
26
33
|
}
|
|
34
|
+
const exhausted = raw && typeof raw === "object" && Array.isArray(raw.exhausted) ? raw.exhausted : [];
|
|
35
|
+
for (const key of exhausted) {
|
|
36
|
+
if (typeof key === "string" && key.length > 0) {
|
|
37
|
+
exhaustedUnits.add(key);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
27
40
|
}
|
|
28
41
|
catch (err) {
|
|
29
42
|
deps.logFailure(err);
|
|
@@ -32,15 +45,17 @@ export function hydrateCustomVerifyRetryCounts(s, deps) {
|
|
|
32
45
|
}
|
|
33
46
|
export function saveCustomVerifyRetryCounts(s, deps) {
|
|
34
47
|
const retryCounts = s.verificationRetryCount;
|
|
48
|
+
const exhaustedUnits = ensureExhaustedVerificationUnits(s);
|
|
35
49
|
const filePath = customVerifyRetryStatePath(s);
|
|
36
50
|
try {
|
|
37
|
-
if (!retryCounts || retryCounts.size === 0) {
|
|
51
|
+
if ((!retryCounts || retryCounts.size === 0) && (!exhaustedUnits || exhaustedUnits.size === 0)) {
|
|
38
52
|
unlinkSync(filePath);
|
|
39
53
|
return;
|
|
40
54
|
}
|
|
41
55
|
mkdirSync(customVerifyRetryStateDir(s), { recursive: true });
|
|
42
56
|
atomicWriteSync(filePath, JSON.stringify({
|
|
43
57
|
counts: Object.fromEntries(retryCounts),
|
|
58
|
+
exhausted: [...exhaustedUnits],
|
|
44
59
|
updatedAt: new Date().toISOString(),
|
|
45
60
|
}) + "\n");
|
|
46
61
|
}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Leaf node in the import DAG.
|
|
5
5
|
*/
|
|
6
|
+
import { parseDispatchKey } from "./dispatch-key.js";
|
|
6
7
|
import { summarizeLogs } from "../workflow-logger.js";
|
|
7
8
|
import { getLatestForUnit } from "../db/unit-dispatches.js";
|
|
8
9
|
/**
|
|
@@ -11,6 +12,18 @@ import { getLatestForUnit } from "../db/unit-dispatches.js";
|
|
|
11
12
|
* and similar Node.js filesystem error messages.
|
|
12
13
|
*/
|
|
13
14
|
const ENOENT_PATH_RE = /ENOENT[^']*'([^']+)'/;
|
|
15
|
+
function rowInsideRetryBudget(row) {
|
|
16
|
+
if (!row)
|
|
17
|
+
return false;
|
|
18
|
+
if (row.attempt_n >= row.max_attempts)
|
|
19
|
+
return false;
|
|
20
|
+
if (!row.next_run_at)
|
|
21
|
+
return false;
|
|
22
|
+
const nextRun = Date.parse(row.next_run_at);
|
|
23
|
+
if (!Number.isFinite(nextRun))
|
|
24
|
+
return false;
|
|
25
|
+
return nextRun > Date.now();
|
|
26
|
+
}
|
|
14
27
|
/**
|
|
15
28
|
* Phase B / codex review MEDIUM B3 — retry coupling.
|
|
16
29
|
*
|
|
@@ -20,23 +33,26 @@ const ENOENT_PATH_RE = /ENOENT[^']*'([^']+)'/;
|
|
|
20
33
|
* waiting on its own backoff. Suppress the stuck verdict in that case so
|
|
21
34
|
* the retry budget can fully drain before we declare stuck.
|
|
22
35
|
*
|
|
36
|
+
* Window keys are compound (`unitType:unitId`, legacy `unitType/unitId`)
|
|
37
|
+
* while the production dispatch ledger keys rows by the bare unit id with
|
|
38
|
+
* the unit type in its own column. Look the bare unit id up first (with a
|
|
39
|
+
* unit_type match — the production shape), then fall back to the full
|
|
40
|
+
* compound key (test fixtures / legacy rows).
|
|
41
|
+
*
|
|
23
42
|
* Returns true if the dispatch ledger says we should suppress the stuck
|
|
24
43
|
* signal; false (no suppression) when the ledger is unavailable or has
|
|
25
44
|
* no opinion.
|
|
26
45
|
*/
|
|
27
46
|
function retryBudgetSuppresses(unitKey) {
|
|
28
47
|
try {
|
|
29
|
-
const
|
|
30
|
-
if (
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if (!Number.isFinite(nextRun))
|
|
38
|
-
return false;
|
|
39
|
-
return nextRun > Date.now();
|
|
48
|
+
const parsed = parseDispatchKey(unitKey);
|
|
49
|
+
if (parsed) {
|
|
50
|
+
const bare = getLatestForUnit(parsed.unitId);
|
|
51
|
+
if (bare && bare.unit_type === parsed.unitType && rowInsideRetryBudget(bare)) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return rowInsideRetryBudget(getLatestForUnit(unitKey));
|
|
40
56
|
}
|
|
41
57
|
catch {
|
|
42
58
|
return false;
|
|
@@ -66,6 +82,10 @@ export function detectStuck(window, _retryContext) {
|
|
|
66
82
|
const suffix = loggerSummary ? ` — ${loggerSummary}` : "";
|
|
67
83
|
const last = window[window.length - 1];
|
|
68
84
|
const prev = window[window.length - 2];
|
|
85
|
+
// Rules 2 and 2b share one retry-budget verdict for `last.key` — compute it
|
|
86
|
+
// at most once per invocation (it hits the dispatch ledger).
|
|
87
|
+
let suppressionVerdict;
|
|
88
|
+
const suppressed = () => (suppressionVerdict ??= retryBudgetSuppresses(last.key));
|
|
69
89
|
// Rule 1: Same error repeated consecutively
|
|
70
90
|
if (last.error && prev.error && last.error === prev.error) {
|
|
71
91
|
return {
|
|
@@ -77,7 +97,7 @@ export function detectStuck(window, _retryContext) {
|
|
|
77
97
|
// says we're inside the retry-backoff window (codex MEDIUM B3).
|
|
78
98
|
if (window.length >= 3) {
|
|
79
99
|
const lastThree = window.slice(-3);
|
|
80
|
-
if (lastThree.every((u) => u.key === last.key) && !
|
|
100
|
+
if (lastThree.every((u) => u.key === last.key) && !suppressed()) {
|
|
81
101
|
return {
|
|
82
102
|
stuck: true,
|
|
83
103
|
reason: `${last.key} derived 3 consecutive times without progress${suffix}`,
|
|
@@ -87,7 +107,7 @@ export function detectStuck(window, _retryContext) {
|
|
|
87
107
|
// Rule 2b: Same unit key 3+ times anywhere in the active window — same
|
|
88
108
|
// retry-budget suppression as Rule 2.
|
|
89
109
|
const countInWindow = window.filter((entry) => entry.key === last.key).length;
|
|
90
|
-
if (countInWindow >= 3 && !
|
|
110
|
+
if (countInWindow >= 3 && !suppressed()) {
|
|
91
111
|
return {
|
|
92
112
|
stuck: true,
|
|
93
113
|
reason: `${last.key} derived ${countInWindow} times in last ${window.length} attempts without progress${suffix}`,
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Dispatch History module — the single home for the auto
|
|
3
|
+
// orchestrator's dispatch-decision window, cross-session rehydration, and
|
|
4
|
+
// stuck detection (#482 / #442 deepening).
|
|
5
|
+
/**
|
|
6
|
+
* auto/dispatch-history.ts — Dispatch History module.
|
|
7
|
+
*
|
|
8
|
+
* Owns the sliding window of recent dispatch decisions that the Auto
|
|
9
|
+
* Orchestration module consults for idempotency and stuck-loop detection.
|
|
10
|
+
*
|
|
11
|
+
* Before this module existed the orchestrator kept a private in-memory
|
|
12
|
+
* `dispatchKeyWindow: string[]` that was reset to `[]` in start()/resume().
|
|
13
|
+
* Because a fresh orchestrator is constructed per session, the window never
|
|
14
|
+
* saw dispatches from a previous session — a unit could be re-dispatched
|
|
15
|
+
* across session restarts indefinitely (issue #482: 146 re-dispatches of the
|
|
16
|
+
* same unit). This module rehydrates the window from the DB dispatch ledger
|
|
17
|
+
* (`unit_dispatches`, via getRecentUnitKeysForProjectRoot) so stuck detection
|
|
18
|
+
* survives process restarts, and it delegates the verdict to the full
|
|
19
|
+
* detect-stuck rule set (repeat-error / consecutive / oscillation / ENOENT,
|
|
20
|
+
* with retry-budget suppression) instead of the bare saturation count.
|
|
21
|
+
*
|
|
22
|
+
* Key format: the canonical dispatch key is `${unitType}:${unitId}`
|
|
23
|
+
* (e.g. "execute-task:M001/S01/T01"). The legacy auto/phases.ts path and the
|
|
24
|
+
* DB rehydration helper use `${unitType}/${unitId}`; normalizeDispatchKey
|
|
25
|
+
* converts those on rehydrate so one format lives in the window. The key
|
|
26
|
+
* grammar itself lives in auto/dispatch-key.ts and is re-exported here for
|
|
27
|
+
* import stability.
|
|
28
|
+
*/
|
|
29
|
+
import { buildDispatchKey, normalizeDispatchKey } from "./dispatch-key.js";
|
|
30
|
+
import { detectStuck } from "./detect-stuck.js";
|
|
31
|
+
import { getLatestForUnit, getRecentUnitKeysForProjectRoot, } from "../db/unit-dispatches.js";
|
|
32
|
+
import { debugLog } from "../debug-logger.js";
|
|
33
|
+
export { buildDispatchKey, normalizeDispatchKey, parseDispatchKey } from "./dispatch-key.js";
|
|
34
|
+
/**
|
|
35
|
+
* Size of the dispatch-decision ring buffer. Mirrors the legacy
|
|
36
|
+
* `STUCK_WINDOW_SIZE` in auto/phases.ts so behaviour is preserved across the
|
|
37
|
+
* cutover (issue #5791).
|
|
38
|
+
*/
|
|
39
|
+
export const STUCK_WINDOW_SIZE = 6;
|
|
40
|
+
function lookupLatestLedgerError(unitType, unitId) {
|
|
41
|
+
try {
|
|
42
|
+
const row = getLatestForUnit(unitId);
|
|
43
|
+
// The ledger keys rows by bare unit id; require a unit_type match so
|
|
44
|
+
// another unit type's error on the same id is never attached (it would
|
|
45
|
+
// trip the repeat-error rule spuriously).
|
|
46
|
+
if (!row || row.unit_type !== unitType)
|
|
47
|
+
return undefined;
|
|
48
|
+
return row.error_summary ?? undefined;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export function createDispatchHistory(options) {
|
|
55
|
+
const windowSize = options.windowSize ?? STUCK_WINDOW_SIZE;
|
|
56
|
+
let window = [];
|
|
57
|
+
return {
|
|
58
|
+
recordDispatch(unitType, unitId) {
|
|
59
|
+
const key = buildDispatchKey(unitType, unitId);
|
|
60
|
+
// Ledger errors only feed the repeat-error/ENOENT rules, which need a
|
|
61
|
+
// prior occurrence of the same unit in the window — first-dispatch
|
|
62
|
+
// advances (the common case) pay zero DB cost.
|
|
63
|
+
const error = window.some((entry) => entry.key === key)
|
|
64
|
+
? lookupLatestLedgerError(unitType, unitId)
|
|
65
|
+
: undefined;
|
|
66
|
+
window.push({ key, error });
|
|
67
|
+
while (window.length > windowSize)
|
|
68
|
+
window.shift();
|
|
69
|
+
return key;
|
|
70
|
+
},
|
|
71
|
+
getRecentWindow() {
|
|
72
|
+
return window;
|
|
73
|
+
},
|
|
74
|
+
countMatching(key) {
|
|
75
|
+
return window.filter((entry) => entry.key === key).length;
|
|
76
|
+
},
|
|
77
|
+
detectStuck() {
|
|
78
|
+
return detectStuck(window);
|
|
79
|
+
},
|
|
80
|
+
rehydrate() {
|
|
81
|
+
const scopeId = options.resolveScopeId();
|
|
82
|
+
if (!scopeId)
|
|
83
|
+
return 0;
|
|
84
|
+
try {
|
|
85
|
+
const persisted = getRecentUnitKeysForProjectRoot(scopeId, windowSize);
|
|
86
|
+
if (persisted.length === 0)
|
|
87
|
+
return 0;
|
|
88
|
+
window = persisted.map(({ key }) => ({ key: normalizeDispatchKey(key) }));
|
|
89
|
+
while (window.length > windowSize)
|
|
90
|
+
window.shift();
|
|
91
|
+
return window.length;
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
debugLog("dispatchHistory", {
|
|
95
|
+
phase: "rehydrate-failed",
|
|
96
|
+
error: err instanceof Error ? err.message : String(err),
|
|
97
|
+
});
|
|
98
|
+
return 0;
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
clearOnRecovery() {
|
|
102
|
+
window = [];
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Dispatch-key grammar — the single home for building, parsing,
|
|
3
|
+
// and normalizing the auto orchestrator's dispatch keys.
|
|
4
|
+
/**
|
|
5
|
+
* auto/dispatch-key.ts — Dispatch-key grammar.
|
|
6
|
+
*
|
|
7
|
+
* Canonical key: `${unitType}:${unitId}` (e.g. "execute-task:M001/S01/T01").
|
|
8
|
+
* Legacy key: `${unitType}/${unitId}` (auto/phases.ts, DB rehydration). Unit
|
|
9
|
+
* ids themselves contain "/" (M001/S01/T01) — the first segment is the unit
|
|
10
|
+
* type.
|
|
11
|
+
*
|
|
12
|
+
* Leaf node in the import DAG: both dispatch-history.ts and detect-stuck.ts
|
|
13
|
+
* consume this grammar, so it lives below them.
|
|
14
|
+
*/
|
|
15
|
+
/** Build the canonical dispatch key for a unit. One format, one home. */
|
|
16
|
+
export function buildDispatchKey(unitType, unitId) {
|
|
17
|
+
return `${unitType}:${unitId}`;
|
|
18
|
+
}
|
|
19
|
+
/** Split a canonical or legacy dispatch key into its unit type and id. */
|
|
20
|
+
export function parseDispatchKey(key) {
|
|
21
|
+
const colon = key.indexOf(":");
|
|
22
|
+
if (colon > 0) {
|
|
23
|
+
return { unitType: key.slice(0, colon), unitId: key.slice(colon + 1) };
|
|
24
|
+
}
|
|
25
|
+
const slash = key.indexOf("/");
|
|
26
|
+
if (slash > 0) {
|
|
27
|
+
return { unitType: key.slice(0, slash), unitId: key.slice(slash + 1) };
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
/** Normalize a legacy `${unitType}/${unitId}` key to the canonical format. */
|
|
32
|
+
export function normalizeDispatchKey(key) {
|
|
33
|
+
if (key.includes(":"))
|
|
34
|
+
return key;
|
|
35
|
+
const parsed = parseDispatchKey(key);
|
|
36
|
+
return parsed ? buildDispatchKey(parsed.unitType, parsed.unitId) : key;
|
|
37
|
+
}
|
|
@@ -13,7 +13,8 @@ import { mkdirSync, writeFileSync } from "node:fs";
|
|
|
13
13
|
import { join } from "node:path";
|
|
14
14
|
import { MAX_LOOP_ITERATIONS, } from "./types.js";
|
|
15
15
|
import { _clearCurrentResolve } from "./resolve.js";
|
|
16
|
-
import { runGuards, runFinalize
|
|
16
|
+
import { runGuards, runFinalize } from "./phases.js";
|
|
17
|
+
import { STUCK_WINDOW_SIZE } from "./dispatch-history.js";
|
|
17
18
|
import { debugLog } from "../debug-logger.js";
|
|
18
19
|
import { isInfrastructureError, isTransientCooldownError, getCooldownRetryAfterMs, COOLDOWN_FALLBACK_WAIT_MS, MAX_COOLDOWN_RETRIES } from "./infra-errors.js";
|
|
19
20
|
import { ModelPolicyDispatchBlockedError } from "../auto-model-selection.js";
|
|
@@ -278,6 +279,8 @@ export async function autoLoop(ctx, pi, s, deps, options) {
|
|
|
278
279
|
const unitDispatchDeps = createExecutionGraphUnitDispatchDeps();
|
|
279
280
|
// Load persisted stuck state so counters survive session restarts (#3704)
|
|
280
281
|
const persisted = loadStuckState(s);
|
|
282
|
+
// Load persisted verification retry state so the exhausted-unit guard fires on restart (#651)
|
|
283
|
+
hydrateCustomVerifyRetryCounts(s, { logFailure: logCustomVerifyRetryLoadFailure });
|
|
281
284
|
const loopState = {
|
|
282
285
|
recentUnits: persisted.recentUnits,
|
|
283
286
|
stuckRecoveryAttempts: persisted.stuckRecoveryAttempts,
|