@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.a6376d75
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +2 -19
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +123 -20
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/bg-shell/utilities.js +3 -0
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +456 -198
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +7 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +35 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +41 -18
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +45 -92
- package/dist/resources/extensions/gsd/auto.js +56 -15
- 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 +60 -13
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +212 -48
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +4 -6
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
- package/dist/resources/extensions/gsd/db/queries.js +56 -0
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +258 -131
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +9 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +2 -1
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +110 -6
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +27 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +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 +9 -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/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state.js +12 -22
- 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 +108 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
- package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +367 -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-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree-root.js +11 -0
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -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/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -15
- package/package.json +3 -3
- 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/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -4
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -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 +55 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/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-mode.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-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/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/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/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -50
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +452 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +178 -82
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +35 -125
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +46 -120
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/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/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/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/index.d.ts +1 -1
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +1 -1
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +72 -18
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/bg-shell/utilities.ts +3 -0
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +537 -202
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop.ts +7 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +40 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +42 -21
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +45 -95
- package/src/resources/extensions/gsd/auto.ts +72 -17
- 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 +79 -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 +251 -47
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +4 -6
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
- package/src/resources/extensions/gsd/db/queries.ts +66 -0
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +269 -149
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +11 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +4 -3
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +161 -26
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +33 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +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 +9 -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/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state.ts +16 -22
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
- 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 +328 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/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/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +88 -58
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/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/notifications.test.ts +64 -9
- 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/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +27 -2
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/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 +80 -2
- 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 +329 -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/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/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-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +67 -4
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
- package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +442 -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-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree-root.ts +12 -0
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_ssgManifest.js +0 -0
|
@@ -15,16 +15,15 @@ import { closeWorkflowDatabase, getWorkflowDatabasePath, openWorkflowDatabasePat
|
|
|
15
15
|
import { execFileSync } from "node:child_process";
|
|
16
16
|
import { gsdRoot, resolveGsdPathContract } from "./paths.js";
|
|
17
17
|
import { createWorktree, removeWorktree, worktreePath, isInsideWorktreesDir, } from "./worktree-manager.js";
|
|
18
|
+
import { worktreePathFor } from "./worktree-placement.js";
|
|
18
19
|
import { detectWorktreeName, nudgeGitBranchCache, } from "./worktree.js";
|
|
19
|
-
import {
|
|
20
|
+
import { isGsdWorktreePath, projectRootFromWorktreePath, normalizeWorktreePathForCompare, resolveWorktreeProjectRoot, } from "./worktree-root.js";
|
|
20
21
|
import { autoResolveSafeConflictPaths } from "./git-conflict-resolve.js";
|
|
21
22
|
import { MergeConflictError, readIntegrationBranch, resolveMilestoneIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
|
|
22
|
-
import {
|
|
23
|
+
import { publishMilestone } from "./publication.js";
|
|
23
24
|
import { debugLog } from "./debug-logger.js";
|
|
24
25
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
25
26
|
import { checkoutBranchWithStashGuard, cleanupConflictState, gsdJsonlFilesWithConflictMarkers, hasConflictMarkers, popStashByRef, removeMergeStateFiles, stashAlreadyExistsFilesFromError, stashRefFromError, } from "./worktree-git-recovery.js";
|
|
26
|
-
// Re-export for existing callers/tests (auto-start.ts, checkout-branch-stash-guard.test.ts).
|
|
27
|
-
export { checkoutBranchWithStashGuard } from "./worktree-git-recovery.js";
|
|
28
27
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
29
28
|
import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
30
29
|
import { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
|
|
@@ -184,19 +183,6 @@ function gitPathspecForWorktreePath(basePath, targetPath) {
|
|
|
184
183
|
export function _gitPathspecForWorktreePath(basePath, targetPath) {
|
|
185
184
|
return gitPathspecForWorktreePath(basePath, targetPath);
|
|
186
185
|
}
|
|
187
|
-
function gitRemoteExists(basePath, remote) {
|
|
188
|
-
try {
|
|
189
|
-
execFileSync("git", ["remote", "get-url", remote], {
|
|
190
|
-
cwd: basePath,
|
|
191
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
192
|
-
encoding: "utf-8",
|
|
193
|
-
});
|
|
194
|
-
return true;
|
|
195
|
-
}
|
|
196
|
-
catch {
|
|
197
|
-
return false;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
186
|
function findRegularMergeChangedPaths(basePath, milestoneBranch, mainBranch) {
|
|
201
187
|
const changedPaths = new Set();
|
|
202
188
|
let mergeLog = "";
|
|
@@ -392,12 +378,9 @@ export function checkResourcesStale(versionOnStart) {
|
|
|
392
378
|
* Returns the corrected base path.
|
|
393
379
|
*/
|
|
394
380
|
export function escapeStaleWorktree(base) {
|
|
395
|
-
const
|
|
396
|
-
if (
|
|
381
|
+
const projectRoot = projectRootFromWorktreePath(base);
|
|
382
|
+
if (projectRoot === null)
|
|
397
383
|
return base;
|
|
398
|
-
// base is inside .gsd/worktrees/<something> — extract the project root.
|
|
399
|
-
// Normalization is 1:1 on characters, so the segment index is valid in `base`.
|
|
400
|
-
const projectRoot = base.slice(0, segment.gsdIdx);
|
|
401
384
|
// Guard: If the candidate project root's .gsd IS the user-level ~/.gsd,
|
|
402
385
|
// the string-slice heuristic matched the wrong /.gsd/ boundary. This happens
|
|
403
386
|
// when .gsd is a symlink into ~/.gsd/projects/<hash> and process.cwd()
|
|
@@ -817,6 +800,14 @@ function _resolveIntegrationBranchForReuse(basePath, milestoneId) {
|
|
|
817
800
|
return null;
|
|
818
801
|
}
|
|
819
802
|
}
|
|
803
|
+
function safeCwd(fallback) {
|
|
804
|
+
try {
|
|
805
|
+
return process.cwd();
|
|
806
|
+
}
|
|
807
|
+
catch {
|
|
808
|
+
return fallback;
|
|
809
|
+
}
|
|
810
|
+
}
|
|
820
811
|
/**
|
|
821
812
|
* When reusing an existing milestone branch, fast-forward it onto the
|
|
822
813
|
* integration branch when that's safe (branch is a strict ancestor of
|
|
@@ -966,7 +957,7 @@ export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
|
|
|
966
957
|
originalBasePath = resolveWorktreeProjectRoot(originalBasePath);
|
|
967
958
|
const branch = autoWorktreeBranch(milestoneId);
|
|
968
959
|
const { preserveBranch = false, preserveWorktree = false } = opts;
|
|
969
|
-
const previousCwd =
|
|
960
|
+
const previousCwd = safeCwd(originalBasePath);
|
|
970
961
|
// Wrap the entire teardown body in a single try/finally so activeWorkspace
|
|
971
962
|
// is ALWAYS cleared — even if process.chdir throws (e.g. originalBasePath
|
|
972
963
|
// was deleted before teardown ran). Previously the finally only covered
|
|
@@ -1050,7 +1041,7 @@ export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
|
|
|
1050
1041
|
* still works after process restart when module state has been reset.
|
|
1051
1042
|
*/
|
|
1052
1043
|
export function isInAutoWorktree(basePath) {
|
|
1053
|
-
const targetPath = isGsdWorktreePath(basePath) ? basePath :
|
|
1044
|
+
const targetPath = isGsdWorktreePath(basePath) ? basePath : safeCwd("");
|
|
1054
1045
|
if (!isGsdWorktreePath(targetPath))
|
|
1055
1046
|
return false;
|
|
1056
1047
|
const storedBase = getAutoWorktreeOriginalBase();
|
|
@@ -1078,7 +1069,9 @@ export function isInAutoWorktree(basePath) {
|
|
|
1078
1069
|
*/
|
|
1079
1070
|
export function getAutoWorktreePath(basePath, milestoneId) {
|
|
1080
1071
|
basePath = resolveWorktreeProjectRoot(basePath);
|
|
1081
|
-
|
|
1072
|
+
// basePath is already the resolved project root — go straight to placement
|
|
1073
|
+
// instead of worktreePath(), which would re-resolve the root.
|
|
1074
|
+
const p = worktreePathFor(basePath, milestoneId);
|
|
1082
1075
|
if (!existsSync(p))
|
|
1083
1076
|
return null;
|
|
1084
1077
|
// Validate this is a real git worktree, not a stray directory.
|
|
@@ -1738,8 +1731,6 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1738
1731
|
const isUntrackedRestoreFailure = stashPopMessage.includes("could not restore untracked files from stash");
|
|
1739
1732
|
const gsdContentConflicts = [];
|
|
1740
1733
|
const alreadyExists = stashAlreadyExistsFilesFromError(e);
|
|
1741
|
-
const gsdAlreadyExists = alreadyExists.filter((f) => f.startsWith(".gsd/"));
|
|
1742
|
-
const nonGsdAlreadyExists = alreadyExists.filter((f) => !f.startsWith(".gsd/"));
|
|
1743
1734
|
// Untracked-file restore failures can leave marker conflicts in tracked
|
|
1744
1735
|
// .gsd JSONL files without producing `U` status entries.
|
|
1745
1736
|
if (isUntrackedRestoreFailure) {
|
|
@@ -1800,10 +1791,11 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1800
1791
|
}
|
|
1801
1792
|
else if (gsdUU.length === 0 &&
|
|
1802
1793
|
nonGsdUU.length === 0 &&
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
//
|
|
1806
|
-
//
|
|
1794
|
+
alreadyExists.length > 0) {
|
|
1795
|
+
// Untracked-file restore failure from stash pop where all collided paths
|
|
1796
|
+
// already exist after merge (committed on target). Safe to drop the stash
|
|
1797
|
+
// for the full alreadyExists set — they were untracked on source by
|
|
1798
|
+
// definition of the "already exists, no checkout" failure.
|
|
1807
1799
|
if (stashRefForDrop) {
|
|
1808
1800
|
try {
|
|
1809
1801
|
execFileSync("git", ["stash", "drop", stashRefForDrop], {
|
|
@@ -1826,11 +1818,6 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1826
1818
|
files: nonGsdUU.join(", "),
|
|
1827
1819
|
});
|
|
1828
1820
|
}
|
|
1829
|
-
else if (nonGsdAlreadyExists.length > 0) {
|
|
1830
|
-
logWarning("reconcile", "Stash pop restore collision on non-.gsd files after merge", {
|
|
1831
|
-
files: nonGsdAlreadyExists.join(", "),
|
|
1832
|
-
});
|
|
1833
|
-
}
|
|
1834
1821
|
else {
|
|
1835
1822
|
logWarning("worktree", "git stash pop failed without resolvable conflict files; leaving stash for manual recovery");
|
|
1836
1823
|
}
|
|
@@ -1922,66 +1909,32 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1922
1909
|
}
|
|
1923
1910
|
catch (err) {
|
|
1924
1911
|
logWarning("worktree", `chdir to project root after merge failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1912
|
+
debugLog("mergeMilestoneToMain", {
|
|
1913
|
+
phase: "post-merge-chdir-failed",
|
|
1914
|
+
target: originalBasePath_,
|
|
1915
|
+
error: err instanceof Error ? err.message : String(err),
|
|
1916
|
+
});
|
|
1925
1917
|
}
|
|
1926
1918
|
};
|
|
1927
1919
|
let shouldCleanup = false;
|
|
1928
|
-
let pushed = false;
|
|
1929
|
-
let prCreated = false;
|
|
1930
1920
|
try {
|
|
1931
|
-
// 10.
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
}
|
|
1949
|
-
// 9b. Auto-create PR if enabled (#2302: no longer gated on pushed/auto_push)
|
|
1950
|
-
if (prefs.auto_pr === true && !nothingToCommit) {
|
|
1951
|
-
const remote = prefs.remote ?? "origin";
|
|
1952
|
-
const prTarget = prefs.pr_target_branch ?? mainBranch;
|
|
1953
|
-
if (gitRemoteExists(originalBasePath_, remote)) {
|
|
1954
|
-
try {
|
|
1955
|
-
// Push the milestone branch to remote first
|
|
1956
|
-
execFileSync("git", ["push", remote, milestoneBranch], {
|
|
1957
|
-
cwd: originalBasePath_,
|
|
1958
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1959
|
-
encoding: "utf-8",
|
|
1960
|
-
});
|
|
1961
|
-
const prEvidence = buildPullRequestEvidence({
|
|
1962
|
-
milestoneId,
|
|
1963
|
-
milestoneTitle,
|
|
1964
|
-
changeType: "feat",
|
|
1965
|
-
summaries: completedSlices.map((slice) => `### ${slice.id}\n${slice.title}`),
|
|
1966
|
-
testsRun: ["Auto-created after milestone merge. Run `npm run verify:merge` before marking this draft ready."],
|
|
1967
|
-
rollbackNotes: ["Close the draft PR or revert the merge commit if review finds a behavior regression."],
|
|
1968
|
-
how: "Generated by git.auto_pr after the milestone branch was pushed and merged locally.",
|
|
1969
|
-
});
|
|
1970
|
-
const prUrl = createDraftPullRequestFromEvidence(originalBasePath_, milestoneId, prEvidence, {
|
|
1971
|
-
head: milestoneBranch,
|
|
1972
|
-
base: prTarget,
|
|
1973
|
-
});
|
|
1974
|
-
if (!prUrl) {
|
|
1975
|
-
throw new Error("gh pr create returned no URL");
|
|
1976
|
-
}
|
|
1977
|
-
prCreated = true;
|
|
1978
|
-
}
|
|
1979
|
-
catch (err) {
|
|
1980
|
-
// PR creation failure is non-fatal — gh may not be installed or authenticated
|
|
1981
|
-
logWarning("worktree", `PR creation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1982
|
-
}
|
|
1983
|
-
}
|
|
1984
|
-
}
|
|
1921
|
+
// 10/9b. Publication (auto-push / draft PR) — Publication module seam (ADR-034).
|
|
1922
|
+
const publication = publishMilestone({
|
|
1923
|
+
basePath: originalBasePath_,
|
|
1924
|
+
milestoneId,
|
|
1925
|
+
milestoneTitle,
|
|
1926
|
+
integrationBranch: mainBranch,
|
|
1927
|
+
milestoneBranch,
|
|
1928
|
+
sliceSummaries: completedSlices.map((slice) => `### ${slice.id}\n${slice.title}`),
|
|
1929
|
+
nothingToCommit,
|
|
1930
|
+
prefs: {
|
|
1931
|
+
autoPush: prefs.auto_push === true,
|
|
1932
|
+
autoPr: prefs.auto_pr === true,
|
|
1933
|
+
remote: prefs.remote,
|
|
1934
|
+
prTargetBranch: prefs.pr_target_branch,
|
|
1935
|
+
},
|
|
1936
|
+
});
|
|
1937
|
+
const { pushed, prCreated } = publication;
|
|
1985
1938
|
// 11. Guard removed — step 9b (#1792) now handles this with a smarter check:
|
|
1986
1939
|
// throws only when the milestone has unanchored code changes, passes
|
|
1987
1940
|
// through when the code is genuinely already on the integration branch.
|
|
@@ -117,6 +117,7 @@ import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
|
117
117
|
import { registerAutoWorker, markWorkerStopping, } from "./db/auto-workers.js";
|
|
118
118
|
import { releaseMilestoneLease } from "./db/milestone-leases.js";
|
|
119
119
|
import { normalizeRealPath } from "./paths.js";
|
|
120
|
+
import { formatStopNoticePrefix, isBlockedStopReason, stopNoticeDisplayReason, } from "./stop-notice.js";
|
|
120
121
|
// ── ENCAPSULATION INVARIANT ─────────────────────────────────────────────────
|
|
121
122
|
// ALL mutable auto-mode state lives in the AutoSession class (auto/session.ts).
|
|
122
123
|
// This file must NOT declare module-level `let` or `var` variables for state.
|
|
@@ -137,17 +138,7 @@ export function formatAutoStopNotification(prefix, totals, unitCount) {
|
|
|
137
138
|
`Session: ${formatCost(totals.cost)} · ${formatTokenCount(totals.tokens.total)} tokens · ${unitCount} units`,
|
|
138
139
|
].join("\n");
|
|
139
140
|
}
|
|
140
|
-
|
|
141
|
-
return /^Blocked:\s*/i.test(reason ?? "");
|
|
142
|
-
}
|
|
143
|
-
function formatAutoStopDisplayReason(reason) {
|
|
144
|
-
return (reason ?? "").replace(/^Blocked:\s*/i, "").trim();
|
|
145
|
-
}
|
|
146
|
-
export function formatAutoStopNotificationPrefix(reason) {
|
|
147
|
-
const displayReason = formatAutoStopDisplayReason(reason);
|
|
148
|
-
const prefix = isBlockedStopReason(reason) ? "Auto-mode blocked" : "Auto-mode stopped";
|
|
149
|
-
return displayReason ? `${prefix} — ${displayReason}` : prefix;
|
|
150
|
-
}
|
|
141
|
+
export { formatStopNoticePrefix as formatAutoStopNotificationPrefix } from "./stop-notice.js";
|
|
151
142
|
function clearSessionModelOverrideForCommandSession(ctx) {
|
|
152
143
|
const sessionId = s.cmdCtx?.sessionManager?.getSessionId?.() ??
|
|
153
144
|
ctx?.sessionManager?.getSessionId?.();
|
|
@@ -521,6 +512,16 @@ export function _warnIfWorktreeMissingForTest(worktreePath, milestoneId) {
|
|
|
521
512
|
}
|
|
522
513
|
return false;
|
|
523
514
|
}
|
|
515
|
+
export function anchorProcessCwdForAutoResume(basePath) {
|
|
516
|
+
try {
|
|
517
|
+
process.chdir(basePath);
|
|
518
|
+
return true;
|
|
519
|
+
}
|
|
520
|
+
catch (err) {
|
|
521
|
+
logWarning("session", `resume cwd anchor failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts", basePath });
|
|
522
|
+
return false;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
524
525
|
export function isAutoPaused() {
|
|
525
526
|
return s.paused;
|
|
526
527
|
}
|
|
@@ -566,6 +567,13 @@ export function getAutoModeStartModel() {
|
|
|
566
567
|
export function setCurrentDispatchedModelId(model) {
|
|
567
568
|
s.currentDispatchedModelId = model ? `${model.provider}/${model.id}` : null;
|
|
568
569
|
}
|
|
570
|
+
/**
|
|
571
|
+
* Update the active unit model after runtime recovery switches models mid-unit.
|
|
572
|
+
* The next session restore path reads this field before dispatching again.
|
|
573
|
+
*/
|
|
574
|
+
export function setCurrentUnitModelForRecovery(model) {
|
|
575
|
+
s.currentUnitModel = model;
|
|
576
|
+
}
|
|
569
577
|
// Tool tracking — delegates to auto-tool-tracking.ts
|
|
570
578
|
export function markToolStart(toolCallId, toolName) {
|
|
571
579
|
_markToolStart(toolCallId, s.active, toolName);
|
|
@@ -632,6 +640,35 @@ export function stopAutoRemote(projectRoot) {
|
|
|
632
640
|
return { found: false, error: err.message };
|
|
633
641
|
}
|
|
634
642
|
}
|
|
643
|
+
/**
|
|
644
|
+
* Force-stop a remote auto-mode session before stealing its lock.
|
|
645
|
+
* The normal stop path stays SIGTERM-only so cooperative sessions can clean up;
|
|
646
|
+
* this path is only for the explicit "Force start" action.
|
|
647
|
+
*/
|
|
648
|
+
export function forceStopAutoRemote(projectRoot) {
|
|
649
|
+
const lock = readCrashLock(projectRoot);
|
|
650
|
+
if (!lock)
|
|
651
|
+
return { found: false };
|
|
652
|
+
if (lock.pid === process.pid) {
|
|
653
|
+
clearLock(projectRoot);
|
|
654
|
+
return { found: false };
|
|
655
|
+
}
|
|
656
|
+
if (!isLockProcessAlive(lock)) {
|
|
657
|
+
clearLock(projectRoot);
|
|
658
|
+
return { found: false };
|
|
659
|
+
}
|
|
660
|
+
try {
|
|
661
|
+
process.kill(lock.pid, "SIGTERM");
|
|
662
|
+
if (isLockProcessAlive(lock)) {
|
|
663
|
+
process.kill(lock.pid, "SIGKILL");
|
|
664
|
+
}
|
|
665
|
+
clearLock(projectRoot);
|
|
666
|
+
return { found: true, pid: lock.pid };
|
|
667
|
+
}
|
|
668
|
+
catch (err) {
|
|
669
|
+
return { found: false, error: err.message };
|
|
670
|
+
}
|
|
671
|
+
}
|
|
635
672
|
/**
|
|
636
673
|
* Check if a remote auto-mode session is running (from a different process).
|
|
637
674
|
* Reads the crash lock, checks PID liveness, and returns session details.
|
|
@@ -724,6 +761,9 @@ function pauseAutoUnitIdentityMatches(expected) {
|
|
|
724
761
|
s.currentUnit.id === expected.id &&
|
|
725
762
|
s.currentUnit.startedAt === expected.startedAt;
|
|
726
763
|
}
|
|
764
|
+
function shouldPreserveCoordinationForPause(errorContext) {
|
|
765
|
+
return errorContext?.category === "provider" && errorContext.isTransient === true;
|
|
766
|
+
}
|
|
727
767
|
function setLifecycleOutcome(ctx, input) {
|
|
728
768
|
if (!ctx?.hasUI)
|
|
729
769
|
return;
|
|
@@ -990,8 +1030,8 @@ export async function stopAuto(ctx, pi, reason, options = {}) {
|
|
|
990
1030
|
if (!s.active && !s.paused)
|
|
991
1031
|
return;
|
|
992
1032
|
const loadedPreferences = loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences;
|
|
993
|
-
const stopNotificationPrefix =
|
|
994
|
-
const displayReason =
|
|
1033
|
+
const stopNotificationPrefix = formatStopNoticePrefix(reason);
|
|
1034
|
+
const displayReason = stopNoticeDisplayReason(reason);
|
|
995
1035
|
const isHeadlessStop = process.env.GSD_HEADLESS === "1";
|
|
996
1036
|
const completionStopRequested = Boolean(options.completionWidget);
|
|
997
1037
|
const preserveCloseoutTranscript = !isHeadlessStop && (options.preserveCloseoutTranscript ?? completionStopRequested);
|
|
@@ -1558,7 +1598,7 @@ export async function pauseAuto(ctx, _pi, _errorContext, options = {}) {
|
|
|
1558
1598
|
releaseSessionLock(lockBase());
|
|
1559
1599
|
clearLock(lockBase());
|
|
1560
1600
|
}
|
|
1561
|
-
if (s.workerId) {
|
|
1601
|
+
if (s.workerId && !shouldPreserveCoordinationForPause(_errorContext)) {
|
|
1562
1602
|
try {
|
|
1563
1603
|
if (s.currentMilestoneId && s.milestoneLeaseToken) {
|
|
1564
1604
|
releaseMilestoneLease(s.workerId, s.currentMilestoneId, s.milestoneLeaseToken);
|
|
@@ -1833,7 +1873,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1833
1873
|
if (freshStartAssessment.classification === "running") {
|
|
1834
1874
|
const pid = freshStartAssessment.lock?.pid;
|
|
1835
1875
|
ctx.ui.notify(pid
|
|
1836
|
-
? `Another auto-mode session (PID ${pid}) appears to be running.\
|
|
1876
|
+
? `Another auto-mode session (PID ${pid}) appears to be running.\nRun \`/gsd stop\` for graceful shutdown, or choose "Force start" from \`/gsd auto\` to terminate it.`
|
|
1837
1877
|
: "Another auto-mode session appears to be running.", "error");
|
|
1838
1878
|
return;
|
|
1839
1879
|
}
|
|
@@ -2003,6 +2043,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
2003
2043
|
}
|
|
2004
2044
|
// ADR-016 phase 2 / B3 (#5621): paused-resume worktree-path adoption.
|
|
2005
2045
|
buildLifecycle().resumeFromPausedSession(base, resumeWorktreePath);
|
|
2046
|
+
anchorProcessCwdForAutoResume(s.basePath || base);
|
|
2006
2047
|
// Rebuild scope now that s.basePath reflects the actual worktree (or project root).
|
|
2007
2048
|
rebuildScope(s.basePath, s.currentMilestoneId);
|
|
2008
2049
|
// Ensure the workflow-logger audit log is pinned to the project root
|
|
@@ -9,12 +9,16 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
|
9
9
|
import { dirname, join } from "node:path";
|
|
10
10
|
import { gsdRoot } from "./paths.js";
|
|
11
11
|
import { withFileLockSync } from "./file-lock.js";
|
|
12
|
+
const temporaryBlockedModels = new Map();
|
|
12
13
|
function blockedModelsPath(basePath) {
|
|
13
14
|
return join(gsdRoot(basePath), "runtime", "blocked-models.json");
|
|
14
15
|
}
|
|
15
16
|
function modelKey(provider, id) {
|
|
16
17
|
return `${provider.toLowerCase()}/${id.toLowerCase()}`;
|
|
17
18
|
}
|
|
19
|
+
function temporaryModelKey(basePath, provider, id) {
|
|
20
|
+
return `${basePath}:${modelKey(provider, id)}`;
|
|
21
|
+
}
|
|
18
22
|
function readFileSafe(path) {
|
|
19
23
|
if (!existsSync(path))
|
|
20
24
|
return { version: 1, blocked: [] };
|
|
@@ -41,6 +45,30 @@ export function isModelBlocked(basePath, provider, id) {
|
|
|
41
45
|
const target = modelKey(provider, id);
|
|
42
46
|
return loadBlockedModels(basePath).some((e) => modelKey(e.provider, e.id) === target);
|
|
43
47
|
}
|
|
48
|
+
export function blockModelUntil(basePath, provider, id, blockedUntil, reason) {
|
|
49
|
+
const key = temporaryModelKey(basePath, provider, id);
|
|
50
|
+
if (blockedUntil <= Date.now()) {
|
|
51
|
+
temporaryBlockedModels.delete(key);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
temporaryBlockedModels.set(key, { provider, id, reason, blockedUntil });
|
|
55
|
+
}
|
|
56
|
+
export function isModelTemporarilyUnavailable(basePath, provider, id, now = Date.now()) {
|
|
57
|
+
if (!provider || !id)
|
|
58
|
+
return false;
|
|
59
|
+
const key = temporaryModelKey(basePath, provider, id);
|
|
60
|
+
const entry = temporaryBlockedModels.get(key);
|
|
61
|
+
if (!entry)
|
|
62
|
+
return false;
|
|
63
|
+
if (entry.blockedUntil <= now) {
|
|
64
|
+
temporaryBlockedModels.delete(key);
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
export function clearTemporaryModelBlocksForTest() {
|
|
70
|
+
temporaryBlockedModels.clear();
|
|
71
|
+
}
|
|
44
72
|
export function blockModel(basePath, provider, id, reason) {
|
|
45
73
|
const path = blockedModelsPath(basePath);
|
|
46
74
|
mkdirSync(dirname(path), { recursive: true });
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { logWarning } from "../workflow-logger.js";
|
|
3
3
|
import { checkDeepProjectSetupAfterTurn, checkAutoStartAfterDiscuss, maybeHandleReadyPhraseWithoutFiles, maybeHandleEmptyIntentTurn, resetEmptyTurnCounter, } from "../guided-flow.js";
|
|
4
4
|
import { clearPathCache } from "../paths.js";
|
|
5
|
-
import { getAutoDashboardData, getAutoModeStartModel, isAutoActive, isAutoCompletionStopInProgress, pauseAuto, setCurrentDispatchedModelId, } from "../auto.js";
|
|
5
|
+
import { getAutoDashboardData, getAutoModeStartModel, isAutoActive, isAutoCompletionStopInProgress, pauseAuto, setCurrentDispatchedModelId, setCurrentUnitModelForRecovery, } from "../auto.js";
|
|
6
6
|
import { getNextFallbackModel, resolveModelWithFallbacksForUnit } from "../preferences.js";
|
|
7
7
|
import { pauseAutoForProviderError } from "../provider-error-pause.js";
|
|
8
8
|
import { isSessionSwitchAbortGraceActive, isSessionSwitchInFlight, resolveAgentEnd, resolveAgentEndCancelled, } from "../auto/resolve.js";
|
|
@@ -13,9 +13,10 @@ import { clearDiscussionFlowState } from "./write-gate.js";
|
|
|
13
13
|
import { clearGuidedUnitContext } from "../guided-unit-context.js";
|
|
14
14
|
import { resumeAutoAfterProviderDelay } from "./provider-error-resume.js";
|
|
15
15
|
import { classifyError, createRetryState, resetRetryState, isTransient, } from "../error-classifier.js";
|
|
16
|
-
import { blockModel, isModelBlocked } from "../blocked-models.js";
|
|
16
|
+
import { blockModel, blockModelUntil, isModelBlocked, isModelTemporarilyUnavailable } from "../blocked-models.js";
|
|
17
17
|
import { getProjectGSDPreferencesPath } from "../preferences.js";
|
|
18
|
-
import {
|
|
18
|
+
import { resolveProviderErrorGuidance } from "../provider-error-guidance.js";
|
|
19
|
+
import { formatGuidance } from "../guidance.js";
|
|
19
20
|
const retryState = createRetryState();
|
|
20
21
|
const MAX_NETWORK_RETRIES = 2;
|
|
21
22
|
function isObjectRecord(value) {
|
|
@@ -95,9 +96,12 @@ async function tryProviderModelFallback(params) {
|
|
|
95
96
|
if (!nextModelId)
|
|
96
97
|
break;
|
|
97
98
|
const candidate = resolveModelId(nextModelId, availableModels, rejectedProvider);
|
|
98
|
-
if (candidate &&
|
|
99
|
+
if (candidate &&
|
|
100
|
+
!isModelBlocked(basePath, candidate.provider, candidate.id) &&
|
|
101
|
+
!isModelTemporarilyUnavailable(basePath, candidate.provider, candidate.id)) {
|
|
99
102
|
const ok = await pi.setModel(candidate, { persist: false });
|
|
100
103
|
if (ok) {
|
|
104
|
+
setCurrentUnitModelForRecovery(candidate);
|
|
101
105
|
setCurrentDispatchedModelId({ provider: candidate.provider, id: candidate.id });
|
|
102
106
|
switchedNotify(`${candidate.provider}/${candidate.id}`);
|
|
103
107
|
pi.sendMessage({ customType: "gsd-auto-timeout-recovery", content: "Continue execution.", display: false }, { triggerTurn: true });
|
|
@@ -110,11 +114,13 @@ async function tryProviderModelFallback(params) {
|
|
|
110
114
|
const sessionModel = getAutoModeStartModel();
|
|
111
115
|
if (sessionModel &&
|
|
112
116
|
!(sessionModel.provider === rejectedProvider && sessionModel.id === rejectedId) &&
|
|
113
|
-
!isModelBlocked(basePath, sessionModel.provider, sessionModel.id)
|
|
117
|
+
!isModelBlocked(basePath, sessionModel.provider, sessionModel.id) &&
|
|
118
|
+
!isModelTemporarilyUnavailable(basePath, sessionModel.provider, sessionModel.id)) {
|
|
114
119
|
const startModel = availableModels.find((m) => m.provider === sessionModel.provider && m.id === sessionModel.id);
|
|
115
120
|
if (startModel) {
|
|
116
121
|
const ok = await pi.setModel(startModel, { persist: false });
|
|
117
122
|
if (ok) {
|
|
123
|
+
setCurrentUnitModelForRecovery(startModel);
|
|
118
124
|
setCurrentDispatchedModelId({ provider: startModel.provider, id: startModel.id });
|
|
119
125
|
switchedNotify(`${startModel.provider}/${startModel.id}`);
|
|
120
126
|
pi.sendMessage({ customType: "gsd-auto-timeout-recovery", content: "Continue execution.", display: false }, { triggerTurn: true });
|
|
@@ -486,7 +492,7 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
486
492
|
preferencesPath: dash.basePath ? getProjectGSDPreferencesPath(dash.basePath) : undefined,
|
|
487
493
|
hasConfiguredFallbacks: (modelConfig?.fallbacks.length ?? 0) > 0,
|
|
488
494
|
});
|
|
489
|
-
const guidanceText =
|
|
495
|
+
const guidanceText = formatGuidance(guidance);
|
|
490
496
|
await pauseForProviderModelRejection(ctx, pi, {
|
|
491
497
|
errorDetail,
|
|
492
498
|
rawErrorMsg,
|
|
@@ -532,6 +538,10 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
532
538
|
if (currentProvider === "openai-codex" || currentProvider === "google-gemini-cli") {
|
|
533
539
|
cls.retryAfterMs = Math.min(cls.retryAfterMs, 30_000);
|
|
534
540
|
}
|
|
541
|
+
const dash = getAutoDashboardData();
|
|
542
|
+
if (dash.basePath && ctx.model?.provider && ctx.model?.id) {
|
|
543
|
+
blockModelUntil(dash.basePath, ctx.model.provider, ctx.model.id, Date.now() + cls.retryAfterMs, rawErrorMsg || displayMsg || "rate limit");
|
|
544
|
+
}
|
|
535
545
|
}
|
|
536
546
|
// ── 2. Decide & Act ──────────────────────────────────────────────────
|
|
537
547
|
// --- Network errors: same-model retry with backoff ---
|
|
@@ -571,9 +581,14 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
571
581
|
retryState.networkRetryCount = 0;
|
|
572
582
|
retryState.currentRetryModelId = undefined;
|
|
573
583
|
const modelToSet = resolveModelId(nextModelId, availableModels, ctx.model?.provider);
|
|
574
|
-
|
|
584
|
+
const modelUnavailable = dash.basePath && modelToSet
|
|
585
|
+
? isModelBlocked(dash.basePath, modelToSet.provider, modelToSet.id) ||
|
|
586
|
+
isModelTemporarilyUnavailable(dash.basePath, modelToSet.provider, modelToSet.id)
|
|
587
|
+
: false;
|
|
588
|
+
if (modelToSet && !modelUnavailable) {
|
|
575
589
|
const ok = await pi.setModel(modelToSet, { persist: false });
|
|
576
590
|
if (ok) {
|
|
591
|
+
setCurrentUnitModelForRecovery(modelToSet);
|
|
577
592
|
setCurrentDispatchedModelId({ provider: modelToSet.provider, id: modelToSet.id });
|
|
578
593
|
ctx.ui.notify(`Model error${errorDetail}. Switched to fallback: ${nextModelId} and resuming.`, "warning");
|
|
579
594
|
pi.sendMessage({ customType: "gsd-auto-timeout-recovery", content: "Continue execution.", display: false }, { triggerTurn: true });
|
|
@@ -586,11 +601,17 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
586
601
|
// Try restoring session model
|
|
587
602
|
const sessionModel = getAutoModeStartModel();
|
|
588
603
|
if (sessionModel) {
|
|
589
|
-
|
|
604
|
+
const dash = getAutoDashboardData();
|
|
605
|
+
const sessionModelUnavailable = dash.basePath
|
|
606
|
+
? isModelBlocked(dash.basePath, sessionModel.provider, sessionModel.id) ||
|
|
607
|
+
isModelTemporarilyUnavailable(dash.basePath, sessionModel.provider, sessionModel.id)
|
|
608
|
+
: false;
|
|
609
|
+
if (!sessionModelUnavailable && (ctx.model?.id !== sessionModel.id || ctx.model?.provider !== sessionModel.provider)) {
|
|
590
610
|
const startModel = ctx.modelRegistry.getAvailable().find((m) => m.provider === sessionModel.provider && m.id === sessionModel.id);
|
|
591
611
|
if (startModel) {
|
|
592
612
|
const ok = await pi.setModel(startModel, { persist: false });
|
|
593
613
|
if (ok) {
|
|
614
|
+
setCurrentUnitModelForRecovery(startModel);
|
|
594
615
|
setCurrentDispatchedModelId({ provider: startModel.provider, id: startModel.id });
|
|
595
616
|
retryState.networkRetryCount = 0;
|
|
596
617
|
retryState.currentRetryModelId = undefined;
|
|
@@ -4,9 +4,8 @@ import { existsSync, readdirSync } from "node:fs";
|
|
|
4
4
|
import { homedir } from "node:os";
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
import { createBashTool, createEditTool, createReadTool, createWriteTool } from "@gsd/pi-coding-agent";
|
|
7
|
-
import { DEFAULT_BASH_TIMEOUT_SECS } from "../constants.js";
|
|
8
7
|
import { logWarning } from "../workflow-logger.js";
|
|
9
|
-
import { openWorkflowDatabase } from "../db-workspace.js";
|
|
8
|
+
import { getWorkflowDatabaseStatus, openWorkflowDatabase, } from "../db-workspace.js";
|
|
10
9
|
import { getAutoWorktreePath } from "../auto-worktree.js";
|
|
11
10
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
12
11
|
import { worktreesDirs } from "../worktree-placement.js";
|
|
@@ -62,16 +61,46 @@ export function resolveWorkflowToolBasePath(ctx, scope) {
|
|
|
62
61
|
return cwd;
|
|
63
62
|
}
|
|
64
63
|
export { resolveProjectRootDbPath } from "../db-workspace.js";
|
|
64
|
+
function sqliteProviderHint(status, nodeVersion) {
|
|
65
|
+
if (status.provider)
|
|
66
|
+
return `Provider: ${status.provider}.`;
|
|
67
|
+
const major = Number.parseInt(nodeVersion.split(".")[0] ?? "", 10);
|
|
68
|
+
if (Number.isFinite(major) && major < 22) {
|
|
69
|
+
return (`No SQLite provider available. Upgrade Node to >= 22.0.0 (current: v${nodeVersion}), ` +
|
|
70
|
+
"use the packaged GSD runtime, or install/restore better-sqlite3 in this runtime.");
|
|
71
|
+
}
|
|
72
|
+
return ("No SQLite provider available. Use a Node build with node:sqlite enabled, " +
|
|
73
|
+
"run the packaged GSD runtime, or install/restore better-sqlite3 in this runtime.");
|
|
74
|
+
}
|
|
75
|
+
function dbOpenPhaseHint(status) {
|
|
76
|
+
if (status.lastPhase === "open")
|
|
77
|
+
return "The database file could not be opened";
|
|
78
|
+
if (status.lastPhase === "initSchema")
|
|
79
|
+
return "The database schema could not be initialized";
|
|
80
|
+
if (status.lastPhase === "vacuum-recovery")
|
|
81
|
+
return "Corruption recovery (VACUUM) failed";
|
|
82
|
+
if (status.attempted)
|
|
83
|
+
return "The database could not be opened";
|
|
84
|
+
return "The database provider could not be loaded";
|
|
85
|
+
}
|
|
86
|
+
export function formatWorkflowDatabaseOpenFailure(result, status, nodeVersion = process.versions.node) {
|
|
87
|
+
if (result.reason === "missing-gsd-dir") {
|
|
88
|
+
return `ensureDbOpen failed — no .gsd directory found at ${result.location.projectGsd}`;
|
|
89
|
+
}
|
|
90
|
+
if (result.reason === "missing-database") {
|
|
91
|
+
return `ensureDbOpen failed — no GSD database found at ${result.location.projectDb}`;
|
|
92
|
+
}
|
|
93
|
+
const resolvedStatus = status ?? getWorkflowDatabaseStatus();
|
|
94
|
+
const detail = result.error?.message ?? resolvedStatus.lastError?.message ?? "";
|
|
95
|
+
const detailSuffix = detail ? ` (${detail})` : "";
|
|
96
|
+
return (`ensureDbOpen failed for ${result.location.projectDb}: ` +
|
|
97
|
+
`${dbOpenPhaseHint(resolvedStatus)}${detailSuffix}. ${sqliteProviderHint(resolvedStatus, nodeVersion)}`);
|
|
98
|
+
}
|
|
65
99
|
export async function ensureDbOpen(basePath = safeWorkspaceCwd()) {
|
|
66
100
|
const result = openWorkflowDatabase(basePath);
|
|
67
101
|
if (result.ok)
|
|
68
102
|
return true;
|
|
69
|
-
|
|
70
|
-
logWarning("bootstrap", "ensureDbOpen failed — no .gsd directory found");
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
logWarning("bootstrap", `ensureDbOpen failed: ${result.error?.message ?? "open failed"}`);
|
|
74
|
-
}
|
|
103
|
+
logWarning("bootstrap", formatWorkflowDatabaseOpenFailure(result));
|
|
75
104
|
return false;
|
|
76
105
|
}
|
|
77
106
|
export function registerDynamicTools(pi) {
|
|
@@ -79,18 +108,36 @@ export function registerDynamicTools(pi) {
|
|
|
79
108
|
const baseBash = createBashTool(fallbackRoot, {
|
|
80
109
|
spawnHook: (ctx) => ctx,
|
|
81
110
|
});
|
|
111
|
+
// The auto-mode stalled-tool watchdog only exists in GSD/auto-mode, so the
|
|
112
|
+
// watchdog verbiage is injected here (the GSD-registered tool) rather than in
|
|
113
|
+
// core bash.ts, which is reused by non-GSD embeddings that have no watchdog.
|
|
114
|
+
const WATCHDOG_DETAIL = "Genuine hangs are caught by the auto-mode stalled-tool watchdog (stalled: 5m / idle: 10m / soft: 20m / hard: 30m).";
|
|
115
|
+
const gsdBashDescription = `${baseBash.description} ${WATCHDOG_DETAIL}`;
|
|
116
|
+
const gsdBashParameters = (() => {
|
|
117
|
+
const params = baseBash.parameters;
|
|
118
|
+
if (!params?.properties?.timeout)
|
|
119
|
+
return params;
|
|
120
|
+
return {
|
|
121
|
+
...params,
|
|
122
|
+
properties: {
|
|
123
|
+
...params.properties,
|
|
124
|
+
timeout: {
|
|
125
|
+
...params.properties.timeout,
|
|
126
|
+
description: `${params.properties.timeout.description} ${WATCHDOG_DETAIL}`,
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
})();
|
|
82
131
|
const dynamicBash = {
|
|
83
132
|
...baseBash,
|
|
133
|
+
description: gsdBashDescription,
|
|
134
|
+
parameters: gsdBashParameters,
|
|
84
135
|
execute: async (toolCallId, params, signal, onUpdate, ctx) => {
|
|
85
136
|
const basePath = resolveCtxCwd(ctx);
|
|
86
137
|
const fresh = createBashTool(basePath, {
|
|
87
138
|
spawnHook: (spawnCtx) => ({ ...spawnCtx, cwd: basePath }),
|
|
88
139
|
});
|
|
89
|
-
|
|
90
|
-
...params,
|
|
91
|
-
timeout: params.timeout ?? DEFAULT_BASH_TIMEOUT_SECS,
|
|
92
|
-
};
|
|
93
|
-
return fresh.execute(toolCallId, paramsWithTimeout, signal, onUpdate, ctx);
|
|
140
|
+
return fresh.execute(toolCallId, params, signal, onUpdate, ctx);
|
|
94
141
|
},
|
|
95
142
|
};
|
|
96
143
|
pi.registerTool(dynamicBash);
|
|
@@ -114,8 +114,8 @@ export function registerExecTools(pi) {
|
|
|
114
114
|
],
|
|
115
115
|
parameters: Type.Object({
|
|
116
116
|
query: Type.Optional(Type.String({ description: "Substring matched against id and purpose (case-insensitive)." })),
|
|
117
|
-
runtime: Type.Optional(Type.
|
|
118
|
-
description: "Restrict to one runtime.",
|
|
117
|
+
runtime: Type.Optional(Type.String({
|
|
118
|
+
description: "Restrict to one runtime: bash, node, or python.",
|
|
119
119
|
})),
|
|
120
120
|
failing_only: Type.Optional(Type.Boolean({ description: "Only non-zero exit codes and timeouts." })),
|
|
121
121
|
limit: Type.Optional(Type.Number({ description: "Max results (default 20, cap 200)", minimum: 1, maximum: 200 })),
|