gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.04f5ccf82
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/README.md +93 -18
- package/dist/cli.js +20 -9
- package/dist/headless-ui.js +13 -6
- package/dist/headless.js +9 -2
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +10 -1
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
- package/dist/resources/extensions/cmux/index.js +5 -0
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +1 -1
- package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
- package/dist/resources/extensions/gsd/auto/loop.js +122 -40
- package/dist/resources/extensions/gsd/auto/orchestrator.js +15 -4
- package/dist/resources/extensions/gsd/auto/phases.js +146 -49
- package/dist/resources/extensions/gsd/auto/session.js +6 -0
- package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
- package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
- package/dist/resources/extensions/gsd/auto-budget.js +9 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +72 -5
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +185 -30
- package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +329 -137
- package/dist/resources/extensions/gsd/auto-prompts.js +36 -10
- package/dist/resources/extensions/gsd/auto-recovery.js +82 -16
- package/dist/resources/extensions/gsd/auto-start.js +99 -16
- package/dist/resources/extensions/gsd/auto-timers.js +11 -3
- package/dist/resources/extensions/gsd/auto-verification.js +146 -34
- package/dist/resources/extensions/gsd/auto-worktree.js +185 -26
- package/dist/resources/extensions/gsd/auto.js +135 -74
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +65 -10
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +13 -10
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +14 -4
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
- package/dist/resources/extensions/gsd/clean-root-preflight.js +267 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
- package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +2 -0
- package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +16 -4
- package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +55 -7
- package/dist/resources/extensions/gsd/db/auto-workers.js +30 -0
- package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
- package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
- package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
- package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
- package/dist/resources/extensions/gsd/doctor-git-checks.js +74 -3
- package/dist/resources/extensions/gsd/doctor-proactive.js +14 -2
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
- package/dist/resources/extensions/gsd/doctor.js +2 -28
- package/dist/resources/extensions/gsd/export-html.js +27 -425
- package/dist/resources/extensions/gsd/forensics.js +10 -3
- package/dist/resources/extensions/gsd/git-conflict-state.js +21 -0
- package/dist/resources/extensions/gsd/git-service.js +152 -15
- package/dist/resources/extensions/gsd/gsd-db.js +76 -33
- package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
- package/dist/resources/extensions/gsd/guided-flow.js +110 -117
- package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
- package/dist/resources/extensions/gsd/init-wizard.js +17 -2
- package/dist/resources/extensions/gsd/markdown-renderer.js +14 -11
- package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
- package/dist/resources/extensions/gsd/migrate/parsers.js +121 -2
- package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
- package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
- package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
- package/dist/resources/extensions/gsd/paths.js +4 -0
- package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
- package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
- package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
- package/dist/resources/extensions/gsd/pre-execution-checks.js +54 -19
- package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
- package/dist/resources/extensions/gsd/preferences-models.js +6 -4
- package/dist/resources/extensions/gsd/preferences-types.js +3 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +147 -0
- package/dist/resources/extensions/gsd/preferences.js +35 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
- package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
- package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
- package/dist/resources/extensions/gsd/repo-identity.js +39 -22
- package/dist/resources/extensions/gsd/repository-registry.js +44 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
- package/dist/resources/extensions/gsd/session-lock.js +15 -2
- package/dist/resources/extensions/gsd/slice-parallel-conflict.js +2 -2
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +84 -5
- package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
- package/dist/resources/extensions/gsd/state.js +28 -7
- package/dist/resources/extensions/gsd/status-guards.js +14 -2
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
- package/dist/resources/extensions/gsd/templates/plan.md +9 -5
- package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -9
- package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -10
- package/dist/resources/extensions/gsd/tools/exec-tool.js +87 -5
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
- package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +32 -1
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +185 -40
- package/dist/resources/extensions/gsd/tui/render-kit.js +33 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
- package/dist/resources/extensions/gsd/validation.js +23 -1
- package/dist/resources/extensions/gsd/verification-gate.js +142 -7
- package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
- package/dist/resources/extensions/gsd/watch/header-renderer.js +34 -25
- package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +86 -19
- package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
- package/dist/resources/extensions/gsd/worktree-safety.js +43 -4
- package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
- package/dist/resources/extensions/gsd/worktree-telemetry.js +32 -0
- package/dist/resources/extensions/shared/html-shell.js +388 -0
- package/dist/resources/extensions/shared/interview-ui.js +6 -4
- package/dist/resources/extensions/shared/next-action-ui.js +13 -5
- package/dist/resources/extensions/subagent/index.js +448 -78
- package/dist/resources/extensions/subagent/launch.js +77 -0
- package/dist/resources/extensions/subagent/run-store.js +148 -0
- package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
- package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
- package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/dist/resources/extensions/visual-brief/index.js +5 -0
- package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
- package/dist/resources/extensions/visual-brief/prompts.js +140 -0
- package/dist/resources/skills/forensics/SKILL.md +1 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +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/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
- 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 +4 -5
- 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 +2 -5
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -7
- 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 +4 -7
- 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 +4 -5
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
- package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
- 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/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +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/2973.33f26573894b6153.js +2 -0
- package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
- package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
- package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.js +7 -8
- package/package.json +4 -4
- package/packages/contracts/dist/rpc.test.js +7 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +21 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +24 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/src/rpc.test.ts +8 -0
- package/packages/contracts/src/workflow.ts +24 -0
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/README.md +13 -4
- package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +80 -0
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
- package/packages/mcp-server/src/workflow-tools.ts +168 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/src/__tests__/stream-process.test.mjs +32 -12
- package/packages/native/tsconfig.json +2 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +5 -6
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
- package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
- package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
- package/packages/pi-ai/src/providers/simple-options.ts +5 -6
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +3 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +16 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +82 -97
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
- package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +20 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +91 -102
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/loader.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/loader.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/loader.test.js +24 -0
- package/packages/pi-tui/dist/__tests__/loader.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/tui.test.js +72 -4
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/loader.js +3 -0
- package/packages/pi-tui/dist/components/loader.js.map +1 -1
- package/packages/pi-tui/dist/terminal.d.ts +2 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +12 -0
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +1 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +117 -33
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/loader.test.ts +30 -0
- package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
- package/packages/pi-tui/src/__tests__/tui.test.ts +90 -4
- package/packages/pi-tui/src/components/loader.ts +3 -0
- package/packages/pi-tui/src/terminal.ts +11 -0
- package/packages/pi-tui/src/tui.ts +116 -33
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +10 -1
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
- package/src/resources/extensions/cmux/index.ts +6 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +19 -6
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +1 -0
- package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
- package/src/resources/extensions/gsd/auto/loop.ts +123 -40
- package/src/resources/extensions/gsd/auto/orchestrator.ts +15 -4
- package/src/resources/extensions/gsd/auto/phases.ts +172 -60
- package/src/resources/extensions/gsd/auto/session.ts +16 -0
- package/src/resources/extensions/gsd/auto/types.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
- package/src/resources/extensions/gsd/auto-budget.ts +11 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +78 -5
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +208 -29
- package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +369 -148
- package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
- package/src/resources/extensions/gsd/auto-recovery.ts +86 -13
- package/src/resources/extensions/gsd/auto-start.ts +109 -14
- package/src/resources/extensions/gsd/auto-timers.ts +10 -3
- package/src/resources/extensions/gsd/auto-verification.ts +174 -42
- package/src/resources/extensions/gsd/auto-worktree.ts +202 -30
- package/src/resources/extensions/gsd/auto.ts +172 -81
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +66 -10
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -10
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +13 -4
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
- package/src/resources/extensions/gsd/clean-root-preflight.ts +284 -8
- package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
- package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
- package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +17 -4
- package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +55 -6
- package/src/resources/extensions/gsd/db/auto-workers.ts +37 -0
- package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
- package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
- package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
- package/src/resources/extensions/gsd/doctor-git-checks.ts +73 -3
- package/src/resources/extensions/gsd/doctor-proactive.ts +18 -2
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
- package/src/resources/extensions/gsd/doctor-types.ts +2 -0
- package/src/resources/extensions/gsd/doctor.ts +2 -27
- package/src/resources/extensions/gsd/export-html.ts +27 -427
- package/src/resources/extensions/gsd/forensics.ts +9 -3
- package/src/resources/extensions/gsd/git-conflict-state.ts +23 -0
- package/src/resources/extensions/gsd/git-service.ts +182 -16
- package/src/resources/extensions/gsd/gsd-db.ts +80 -31
- package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
- package/src/resources/extensions/gsd/guided-flow.ts +142 -134
- package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
- package/src/resources/extensions/gsd/init-wizard.ts +17 -2
- package/src/resources/extensions/gsd/journal.ts +8 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +14 -11
- package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
- package/src/resources/extensions/gsd/migrate/parsers.ts +139 -2
- package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
- package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
- package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
- package/src/resources/extensions/gsd/paths.ts +5 -0
- package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
- package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
- package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
- package/src/resources/extensions/gsd/pre-execution-checks.ts +67 -19
- package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
- package/src/resources/extensions/gsd/preferences-models.ts +6 -4
- package/src/resources/extensions/gsd/preferences-types.ts +35 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +154 -0
- package/src/resources/extensions/gsd/preferences.ts +39 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
- package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
- package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/queue.md +4 -4
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
- package/src/resources/extensions/gsd/repo-identity.ts +45 -25
- package/src/resources/extensions/gsd/repository-registry.ts +77 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
- package/src/resources/extensions/gsd/session-lock.ts +15 -2
- package/src/resources/extensions/gsd/slice-parallel-conflict.ts +2 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +75 -3
- package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
- package/src/resources/extensions/gsd/state.ts +33 -7
- package/src/resources/extensions/gsd/status-guards.ts +16 -2
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
- package/src/resources/extensions/gsd/templates/plan.md +9 -5
- package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +775 -34
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +245 -28
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
- package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +136 -13
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/auto-workers.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
- package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +170 -3
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
- package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +55 -2
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +60 -9
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +139 -1
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +140 -1
- package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +99 -1
- package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +15 -1
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
- package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +36 -1
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +226 -2
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +5 -21
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
- package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +21 -40
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +59 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
- package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +42 -1
- package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
- package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +28 -1
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +59 -1
- package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +112 -1
- package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +94 -2
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +188 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
- package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +153 -1
- package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +73 -2
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +18 -10
- package/src/resources/extensions/gsd/tools/complete-slice.ts +57 -10
- package/src/resources/extensions/gsd/tools/exec-tool.ts +98 -5
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
- package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +31 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +166 -17
- package/src/resources/extensions/gsd/tui/render-kit.ts +44 -0
- package/src/resources/extensions/gsd/types.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
- package/src/resources/extensions/gsd/validation.ts +23 -1
- package/src/resources/extensions/gsd/verification-gate.ts +170 -6
- package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
- package/src/resources/extensions/gsd/watch/header-renderer.ts +35 -24
- package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +98 -20
- package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
- package/src/resources/extensions/gsd/worktree-safety.ts +57 -10
- package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
- package/src/resources/extensions/gsd/worktree-telemetry.ts +39 -0
- package/src/resources/extensions/shared/html-shell.ts +412 -0
- package/src/resources/extensions/shared/interview-ui.ts +6 -4
- package/src/resources/extensions/shared/next-action-ui.ts +11 -5
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
- package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +32 -0
- package/src/resources/extensions/subagent/index.ts +567 -103
- package/src/resources/extensions/subagent/launch.ts +131 -0
- package/src/resources/extensions/subagent/run-store.ts +218 -0
- package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
- package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
- package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
- package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
- package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/src/resources/extensions/visual-brief/index.ts +8 -0
- package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
- package/src/resources/extensions/visual-brief/prompts.ts +183 -0
- package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
- package/src/resources/skills/forensics/SKILL.md +1 -1
- package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
- package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
- package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
- package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
- package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
- package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → w_ikFkx_-OHxisG9xjz4u}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → w_ikFkx_-OHxisG9xjz4u}/_ssgManifest.js +0 -0
|
@@ -58,6 +58,7 @@ import {
|
|
|
58
58
|
import {
|
|
59
59
|
writeLock,
|
|
60
60
|
clearLock,
|
|
61
|
+
clearStaleWorkerLock,
|
|
61
62
|
readCrashLock,
|
|
62
63
|
isLockProcessAlive,
|
|
63
64
|
formatCrashInfo,
|
|
@@ -178,6 +179,7 @@ import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
|
|
|
178
179
|
import {
|
|
179
180
|
buildLoopRemediationSteps,
|
|
180
181
|
reconcileMergeState,
|
|
182
|
+
verifyExpectedArtifact,
|
|
181
183
|
} from "./auto-recovery.js";
|
|
182
184
|
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
183
185
|
import { resolveDispatch, DISPATCH_RULES } from "./auto-dispatch.js";
|
|
@@ -240,7 +242,7 @@ import { runAutoLoopWithUok } from "./uok/kernel.js";
|
|
|
240
242
|
import { resolveUokFlags } from "./uok/flags.js";
|
|
241
243
|
import { validateDirectory } from "./validate-directory.js";
|
|
242
244
|
import { createAutoOrchestrator } from "./auto/orchestrator.js";
|
|
243
|
-
import type { AutoOrchestrationModule, AutoOrchestratorDeps, DispatchAdapter } from "./auto/contracts.js";
|
|
245
|
+
import type { AutoAdvanceResult, AutoOrchestrationModule, AutoOrchestratorDeps, DispatchAdapter } from "./auto/contracts.js";
|
|
244
246
|
import { reconcileBeforeDispatch } from "./state-reconciliation.js";
|
|
245
247
|
import { compileUnitToolContract } from "./tool-contract.js";
|
|
246
248
|
import { createWorktreeSafetyModule } from "./worktree-safety.js";
|
|
@@ -283,6 +285,7 @@ import type {
|
|
|
283
285
|
UnitRouting,
|
|
284
286
|
StartModel,
|
|
285
287
|
AutoSession,
|
|
288
|
+
PendingOrchestrationDispatch,
|
|
286
289
|
} from "./auto/session.js";
|
|
287
290
|
export {
|
|
288
291
|
STUB_RECOVERY_THRESHOLD,
|
|
@@ -296,7 +299,10 @@ export type {
|
|
|
296
299
|
import { autoSession as s } from "./auto-runtime-state.js";
|
|
297
300
|
import { gsdHome } from "./gsd-home.js";
|
|
298
301
|
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
299
|
-
import {
|
|
302
|
+
import {
|
|
303
|
+
registerAutoWorker,
|
|
304
|
+
markWorkerStopping,
|
|
305
|
+
} from "./db/auto-workers.js";
|
|
300
306
|
import { releaseMilestoneLease } from "./db/milestone-leases.js";
|
|
301
307
|
import { normalizeRealPath } from "./paths.js";
|
|
302
308
|
|
|
@@ -316,6 +322,13 @@ import { normalizeRealPath } from "./paths.js";
|
|
|
316
322
|
/** Throttle STATE.md rebuilds — at most once per 30 seconds */
|
|
317
323
|
const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
|
|
318
324
|
|
|
325
|
+
export function formatAutoStopNotification(prefix: string, totals: { cost: number; tokens: { total: number } }, unitCount: number): string {
|
|
326
|
+
return [
|
|
327
|
+
`${prefix}.`,
|
|
328
|
+
`Session: ${formatCost(totals.cost)} · ${formatTokenCount(totals.tokens.total)} tokens · ${unitCount} units`,
|
|
329
|
+
].join("\n");
|
|
330
|
+
}
|
|
331
|
+
|
|
319
332
|
/**
|
|
320
333
|
* Phase B — register this auto-mode process in the workers table so other
|
|
321
334
|
* workers and janitors can detect liveness via heartbeat. Best-effort: if
|
|
@@ -461,6 +474,60 @@ export function _synthesizePausedSessionRecoveryForTest(
|
|
|
461
474
|
return synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile);
|
|
462
475
|
}
|
|
463
476
|
|
|
477
|
+
type PausedResumeRecoverySessionState = {
|
|
478
|
+
pausedSessionFile: string | null;
|
|
479
|
+
currentUnit: { type: string; id: string } | null;
|
|
480
|
+
pausedUnitType: string | null;
|
|
481
|
+
pausedUnitId: string | null;
|
|
482
|
+
pendingCrashRecovery: string | null;
|
|
483
|
+
};
|
|
484
|
+
|
|
485
|
+
function handlePausedSessionResumeRecovery(
|
|
486
|
+
basePath: string,
|
|
487
|
+
state: PausedResumeRecoverySessionState,
|
|
488
|
+
notify: (message: string) => void,
|
|
489
|
+
): { skippedReplay: boolean } {
|
|
490
|
+
if (!state.pausedSessionFile) return { skippedReplay: false };
|
|
491
|
+
|
|
492
|
+
const pausedRecoveryUnitType = state.currentUnit?.type ?? state.pausedUnitType ?? "unknown";
|
|
493
|
+
const pausedRecoveryUnitId = state.currentUnit?.id ?? state.pausedUnitId ?? "unknown";
|
|
494
|
+
const completedPausedUnit = verifyExpectedArtifact(
|
|
495
|
+
pausedRecoveryUnitType,
|
|
496
|
+
pausedRecoveryUnitId,
|
|
497
|
+
basePath,
|
|
498
|
+
);
|
|
499
|
+
|
|
500
|
+
if (completedPausedUnit) {
|
|
501
|
+
state.pausedSessionFile = null;
|
|
502
|
+
state.pausedUnitType = null;
|
|
503
|
+
state.pausedUnitId = null;
|
|
504
|
+
state.pendingCrashRecovery = null;
|
|
505
|
+
return { skippedReplay: true };
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
const recovery = synthesizePausedSessionRecovery(
|
|
509
|
+
basePath,
|
|
510
|
+
pausedRecoveryUnitType,
|
|
511
|
+
pausedRecoveryUnitId,
|
|
512
|
+
state.pausedSessionFile,
|
|
513
|
+
);
|
|
514
|
+
if (recovery && recovery.trace.toolCallCount > 0) {
|
|
515
|
+
state.pendingCrashRecovery = recovery.prompt;
|
|
516
|
+
notify(`Recovered ${recovery.trace.toolCallCount} tool calls from paused session. Resuming with context.`);
|
|
517
|
+
}
|
|
518
|
+
state.pausedSessionFile = null;
|
|
519
|
+
state.pausedUnitType = null;
|
|
520
|
+
state.pausedUnitId = null;
|
|
521
|
+
return { skippedReplay: false };
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
export function _handlePausedSessionResumeRecoveryForTest(
|
|
525
|
+
basePath: string,
|
|
526
|
+
state: PausedResumeRecoverySessionState,
|
|
527
|
+
): { skippedReplay: boolean } {
|
|
528
|
+
return handlePausedSessionResumeRecovery(basePath, state, () => {});
|
|
529
|
+
}
|
|
530
|
+
|
|
464
531
|
// `_resolvePausedResumeBasePathForTest` was retired in ADR-016 phase 2 / B3
|
|
465
532
|
// (#5621). Production callers go through
|
|
466
533
|
// `WorktreeLifecycle.resumeFromPausedSession`; the pure helper for tests is
|
|
@@ -860,6 +927,7 @@ export function checkRemoteAutoSession(projectRoot: string): {
|
|
|
860
927
|
|
|
861
928
|
if (!isLockProcessAlive(lock)) {
|
|
862
929
|
// Stale lock from a dead process — not a live remote session
|
|
930
|
+
clearLock(projectRoot);
|
|
863
931
|
return { running: false };
|
|
864
932
|
}
|
|
865
933
|
|
|
@@ -1021,6 +1089,8 @@ export async function rerootCommandSession(
|
|
|
1021
1089
|
}
|
|
1022
1090
|
|
|
1023
1091
|
export async function cleanupAfterLoopExit(ctx: ExtensionContext): Promise<void> {
|
|
1092
|
+
const preserveStepSurface = s.preserveStepSurfaceAfterLoopExit;
|
|
1093
|
+
const preservePausedSurface = s.paused;
|
|
1024
1094
|
s.currentUnit = null;
|
|
1025
1095
|
s.active = false;
|
|
1026
1096
|
deactivateGSD();
|
|
@@ -1043,21 +1113,24 @@ export async function cleanupAfterLoopExit(ctx: ExtensionContext): Promise<void>
|
|
|
1043
1113
|
// A transient provider-error pause intentionally leaves the paused badge
|
|
1044
1114
|
// visible so the user still has a resumable auto-mode signal on screen.
|
|
1045
1115
|
if (!s.paused) {
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1116
|
+
if (preserveStepSurface) {
|
|
1117
|
+
s.preserveStepSurfaceAfterLoopExit = false;
|
|
1118
|
+
} else {
|
|
1119
|
+
ctx.ui.setStatus("gsd-auto", undefined);
|
|
1120
|
+
ctx.ui.setWidget("gsd-progress", undefined);
|
|
1121
|
+
if (s.completionStopInProgress) {
|
|
1122
|
+
s.completionStopInProgress = false;
|
|
1123
|
+
}
|
|
1124
|
+
initHealthWidget(ctx);
|
|
1049
1125
|
}
|
|
1050
|
-
initHealthWidget(ctx);
|
|
1051
1126
|
}
|
|
1052
1127
|
|
|
1053
|
-
// ADR-016 phase 3 (#5693): the stop-path basePath restore routes
|
|
1054
|
-
// `Lifecycle.restoreToProjectRoot()`, the sole owner of
|
|
1055
|
-
//
|
|
1056
|
-
//
|
|
1057
|
-
//
|
|
1058
|
-
|
|
1059
|
-
// session-state mutation.
|
|
1060
|
-
if (s.originalBasePath) {
|
|
1128
|
+
// ADR-016 phase 3 (#5693): the stop-path basePath restore + chdir routes
|
|
1129
|
+
// through `Lifecycle.restoreToProjectRoot()`, the sole owner of both
|
|
1130
|
+
// `s.basePath` mutation and the paired `process.chdir` for auto-loop
|
|
1131
|
+
// transitions. The verb assigns `s.basePath` before any throwable work, so
|
|
1132
|
+
// a thrown error still leaves basePath restored.
|
|
1133
|
+
if (s.originalBasePath && !preserveStepSurface && !preservePausedSurface) {
|
|
1061
1134
|
try {
|
|
1062
1135
|
buildLifecycle().restoreToProjectRoot();
|
|
1063
1136
|
} catch (err) {
|
|
@@ -1067,14 +1140,9 @@ export async function cleanupAfterLoopExit(ctx: ExtensionContext): Promise<void>
|
|
|
1067
1140
|
{ file: "auto.ts" },
|
|
1068
1141
|
);
|
|
1069
1142
|
}
|
|
1070
|
-
try {
|
|
1071
|
-
process.chdir(s.originalBasePath);
|
|
1072
|
-
} catch (err) {
|
|
1073
|
-
logWarning("engine", `basePath restore/chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
1074
|
-
}
|
|
1075
1143
|
}
|
|
1076
1144
|
|
|
1077
|
-
if (s.originalBasePath && s.cmdCtx) {
|
|
1145
|
+
if (s.originalBasePath && s.cmdCtx && !preserveStepSurface && !preservePausedSurface) {
|
|
1078
1146
|
const result = await rerootCommandSession(s.cmdCtx, s.originalBasePath);
|
|
1079
1147
|
if (result.status === "cancelled") {
|
|
1080
1148
|
logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.originalBasePath });
|
|
@@ -1171,32 +1239,16 @@ export async function stopAuto(
|
|
|
1171
1239
|
// worktree was active, and whether the current milestone was merged before
|
|
1172
1240
|
// stopAuto. The unmerged-work warning is only meaningful for real worktrees.
|
|
1173
1241
|
try {
|
|
1174
|
-
const { emitAutoExit } = await import("./worktree-telemetry.js");
|
|
1175
|
-
type AutoExitReason =
|
|
1176
|
-
| "pause" | "stop" | "blocked" | "merge-conflict" | "merge-failed"
|
|
1177
|
-
| "slice-merge-conflict" | "all-complete" | "no-active-milestone" | "other";
|
|
1242
|
+
const { emitAutoExit, normalizeAutoExitReason } = await import("./worktree-telemetry.js");
|
|
1178
1243
|
// Normalize the free-form reason to a closed set so the telemetry
|
|
1179
1244
|
// aggregator buckets stably. Raw detail is preserved in the phases.ts
|
|
1180
1245
|
// notification and the notify'd error string.
|
|
1181
1246
|
const rawReason = reason ?? "stop";
|
|
1182
|
-
const normalizedReason
|
|
1183
|
-
? "blocked"
|
|
1184
|
-
: rawReason.startsWith("Merge conflict")
|
|
1185
|
-
? "merge-conflict"
|
|
1186
|
-
: rawReason.startsWith("Merge error") || rawReason.startsWith("Merge failed")
|
|
1187
|
-
? "merge-failed"
|
|
1188
|
-
: rawReason.startsWith("slice-merge-conflict")
|
|
1189
|
-
? "slice-merge-conflict"
|
|
1190
|
-
: rawReason === "All milestones complete"
|
|
1191
|
-
? "all-complete"
|
|
1192
|
-
: rawReason === "No active milestone"
|
|
1193
|
-
? "no-active-milestone"
|
|
1194
|
-
: rawReason === "stop" || rawReason === "pause"
|
|
1195
|
-
? rawReason
|
|
1196
|
-
: "other";
|
|
1247
|
+
const normalizedReason = normalizeAutoExitReason(rawReason);
|
|
1197
1248
|
const telemetryBase = s.originalBasePath || s.basePath;
|
|
1198
1249
|
emitAutoExit(telemetryBase, {
|
|
1199
1250
|
reason: normalizedReason,
|
|
1251
|
+
rawReason,
|
|
1200
1252
|
milestoneId: s.currentMilestoneId ?? undefined,
|
|
1201
1253
|
milestoneMerged: s.milestoneMergedInPhases === true,
|
|
1202
1254
|
isolationMode: getIsolationMode(telemetryBase),
|
|
@@ -1386,20 +1438,14 @@ export async function stopAuto(
|
|
|
1386
1438
|
}
|
|
1387
1439
|
|
|
1388
1440
|
// ── Step 7: Restore basePath and chdir (ADR-016 phase 3, #5693) ──
|
|
1389
|
-
// `restoreToProjectRoot`
|
|
1390
|
-
// no
|
|
1441
|
+
// `restoreToProjectRoot` owns both s.basePath restore and process.chdir;
|
|
1442
|
+
// no paired chdir is needed at the call site.
|
|
1391
1443
|
if (s.originalBasePath) {
|
|
1392
1444
|
try {
|
|
1393
1445
|
buildLifecycle().restoreToProjectRoot();
|
|
1394
1446
|
} catch (e) {
|
|
1395
1447
|
debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
|
|
1396
1448
|
}
|
|
1397
|
-
try {
|
|
1398
|
-
process.chdir(s.basePath);
|
|
1399
|
-
} catch (err) {
|
|
1400
|
-
/* best-effort */
|
|
1401
|
-
logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
1402
|
-
}
|
|
1403
1449
|
}
|
|
1404
1450
|
|
|
1405
1451
|
// Re-root the active command session/tool runtime after worktree teardown.
|
|
@@ -1428,7 +1474,7 @@ export async function stopAuto(
|
|
|
1428
1474
|
if (ledger && ledger.units.length > 0) {
|
|
1429
1475
|
const totals = getProjectTotals(ledger.units);
|
|
1430
1476
|
ctx?.ui.notify(
|
|
1431
|
-
|
|
1477
|
+
formatAutoStopNotification(notificationPrefix, totals, ledger.units.length),
|
|
1432
1478
|
"info",
|
|
1433
1479
|
);
|
|
1434
1480
|
} else {
|
|
@@ -1735,7 +1781,6 @@ export async function pauseAuto(
|
|
|
1735
1781
|
restoreProjectRootEnv();
|
|
1736
1782
|
restoreMilestoneLockEnv();
|
|
1737
1783
|
s.pendingVerificationRetry = null;
|
|
1738
|
-
s.verificationRetryCount.clear();
|
|
1739
1784
|
ctx?.ui.setStatus("gsd-auto", "paused");
|
|
1740
1785
|
ctx?.ui.setWidget("gsd-progress", undefined);
|
|
1741
1786
|
const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
|
|
@@ -1805,6 +1850,7 @@ export function createWiredDispatchAdapter(
|
|
|
1805
1850
|
ctx: ExtensionContext,
|
|
1806
1851
|
pi: ExtensionAPI,
|
|
1807
1852
|
dispatchBasePath: string,
|
|
1853
|
+
session?: AutoSession,
|
|
1808
1854
|
): DispatchAdapter {
|
|
1809
1855
|
return {
|
|
1810
1856
|
async decideNextUnit(input) {
|
|
@@ -1812,7 +1858,9 @@ export function createWiredDispatchAdapter(
|
|
|
1812
1858
|
const active = state.activeMilestone;
|
|
1813
1859
|
if (!active) return null;
|
|
1814
1860
|
|
|
1815
|
-
const
|
|
1861
|
+
const activeSession = input.session ?? session;
|
|
1862
|
+
const activeDispatchBasePath = activeSession?.basePath || dispatchBasePath;
|
|
1863
|
+
const prefs = loadEffectiveGSDPreferences(activeDispatchBasePath)?.preferences;
|
|
1816
1864
|
|
|
1817
1865
|
// Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
|
|
1818
1866
|
// (#5789). Prefer caller-supplied values when present so test harnesses and
|
|
@@ -1841,18 +1889,42 @@ export function createWiredDispatchAdapter(
|
|
|
1841
1889
|
: "false");
|
|
1842
1890
|
|
|
1843
1891
|
const action = await resolveDispatch({
|
|
1844
|
-
basePath:
|
|
1892
|
+
basePath: activeDispatchBasePath,
|
|
1845
1893
|
mid: active.id,
|
|
1846
1894
|
midTitle: active.title,
|
|
1847
1895
|
state,
|
|
1848
1896
|
prefs,
|
|
1897
|
+
session: activeSession,
|
|
1849
1898
|
structuredQuestionsAvailable,
|
|
1850
1899
|
sessionContextWindow,
|
|
1851
1900
|
sessionProvider,
|
|
1852
1901
|
modelRegistry,
|
|
1853
1902
|
});
|
|
1854
1903
|
|
|
1855
|
-
if (action.action
|
|
1904
|
+
if (action.action === "stop") {
|
|
1905
|
+
if (session) session.pendingOrchestrationDispatch = null;
|
|
1906
|
+
return {
|
|
1907
|
+
kind: "blocked",
|
|
1908
|
+
reason: action.reason,
|
|
1909
|
+
action: action.level === "warning" ? "pause" : "stop",
|
|
1910
|
+
};
|
|
1911
|
+
}
|
|
1912
|
+
if (action.action !== "dispatch") {
|
|
1913
|
+
if (session) session.pendingOrchestrationDispatch = null;
|
|
1914
|
+
return null;
|
|
1915
|
+
}
|
|
1916
|
+
if (session) {
|
|
1917
|
+
const pending: PendingOrchestrationDispatch = {
|
|
1918
|
+
unitType: action.unitType,
|
|
1919
|
+
unitId: action.unitId,
|
|
1920
|
+
prompt: action.prompt,
|
|
1921
|
+
pauseAfterUatDispatch: action.pauseAfterDispatch ?? false,
|
|
1922
|
+
state,
|
|
1923
|
+
mid: active.id,
|
|
1924
|
+
midTitle: active.title,
|
|
1925
|
+
};
|
|
1926
|
+
session.pendingOrchestrationDispatch = pending;
|
|
1927
|
+
}
|
|
1856
1928
|
return {
|
|
1857
1929
|
unitType: action.unitType,
|
|
1858
1930
|
unitId: action.unitId,
|
|
@@ -1901,7 +1973,7 @@ export function createWiredAutoOrchestrationModule(
|
|
|
1901
1973
|
};
|
|
1902
1974
|
},
|
|
1903
1975
|
},
|
|
1904
|
-
dispatch: createWiredDispatchAdapter(ctx, pi, dispatchBasePath),
|
|
1976
|
+
dispatch: createWiredDispatchAdapter(ctx, pi, dispatchBasePath, s),
|
|
1905
1977
|
recovery: {
|
|
1906
1978
|
async classifyAndRecover(input) {
|
|
1907
1979
|
const recovery = classifyFailure(input);
|
|
@@ -1924,10 +1996,16 @@ export function createWiredAutoOrchestrationModule(
|
|
|
1924
1996
|
reason: `No Unit manifest is registered for ${unitType}`,
|
|
1925
1997
|
};
|
|
1926
1998
|
}
|
|
1999
|
+
if (getIsolationMode(runtimeBasePath) !== "worktree") {
|
|
2000
|
+
return { ok: true, reason: "not-required" };
|
|
2001
|
+
}
|
|
1927
2002
|
const writeScope =
|
|
1928
2003
|
manifest.tools.mode === "all" || manifest.tools.mode === "docs"
|
|
1929
2004
|
? "source-writing"
|
|
1930
2005
|
: "planning-only";
|
|
2006
|
+
if (getIsolationMode(runtimeBasePath) !== "worktree") {
|
|
2007
|
+
return { ok: true, reason: "isolation-not-worktree" };
|
|
2008
|
+
}
|
|
1931
2009
|
const safety = createWorktreeSafetyModule();
|
|
1932
2010
|
const snapshot = await deriveState(dispatchBasePath);
|
|
1933
2011
|
const milestoneId = snapshot.activeMilestone?.id ?? null;
|
|
@@ -1939,6 +2017,7 @@ export function createWiredAutoOrchestrationModule(
|
|
|
1939
2017
|
projectRoot: runtimeBasePath,
|
|
1940
2018
|
unitRoot: dispatchBasePath,
|
|
1941
2019
|
milestoneId,
|
|
2020
|
+
isolationMode: getIsolationMode(runtimeBasePath),
|
|
1942
2021
|
expectedBranch,
|
|
1943
2022
|
});
|
|
1944
2023
|
if (!result.ok) {
|
|
@@ -1997,22 +2076,22 @@ export function createWiredAutoOrchestrationModule(
|
|
|
1997
2076
|
},
|
|
1998
2077
|
async journalTransition(event) {
|
|
1999
2078
|
const eventType = event.name === "start"
|
|
2000
|
-
? "iteration-start"
|
|
2079
|
+
? "orchestrator-iteration-start"
|
|
2001
2080
|
: event.name === "resume"
|
|
2002
|
-
? "iteration-start"
|
|
2081
|
+
? "orchestrator-iteration-start"
|
|
2003
2082
|
: event.name === "advance"
|
|
2004
|
-
? "dispatch-match"
|
|
2083
|
+
? "orchestrator-dispatch-match"
|
|
2005
2084
|
: event.name === "advance-blocked"
|
|
2006
|
-
? "guard-block"
|
|
2085
|
+
? "orchestrator-guard-block"
|
|
2007
2086
|
: event.name === "advance-stopped"
|
|
2008
|
-
? "dispatch-stop"
|
|
2087
|
+
? "orchestrator-dispatch-stop"
|
|
2009
2088
|
: event.name === "advance-error"
|
|
2010
|
-
? "iteration-end"
|
|
2089
|
+
? "orchestrator-iteration-end"
|
|
2011
2090
|
: event.name === "advance-paused" || event.name === "advance-retry"
|
|
2012
|
-
? "guard-block"
|
|
2091
|
+
? "orchestrator-guard-block"
|
|
2013
2092
|
: event.name === "stop"
|
|
2014
|
-
? "terminal"
|
|
2015
|
-
: "iteration-end";
|
|
2093
|
+
? "orchestrator-terminal"
|
|
2094
|
+
: "orchestrator-iteration-end";
|
|
2016
2095
|
|
|
2017
2096
|
_emitJournalEvent(runtimeBasePath, {
|
|
2018
2097
|
ts: new Date().toISOString(),
|
|
@@ -2078,6 +2157,18 @@ export function createWiredAutoOrchestrationModule(
|
|
|
2078
2157
|
return createAutoOrchestrator(deps);
|
|
2079
2158
|
}
|
|
2080
2159
|
|
|
2160
|
+
function notifyResumeBlocked(ctx: ExtensionContext, result: Extract<AutoAdvanceResult, { kind: "blocked" }>): void {
|
|
2161
|
+
const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
|
|
2162
|
+
ctx.ui.notify(`Auto-mode blocked: ${result.reason}. Fix and run ${resumeCmd} to resume.`, "warning");
|
|
2163
|
+
setLifecycleOutcome(ctx, {
|
|
2164
|
+
status: "blocked",
|
|
2165
|
+
title: "Auto-mode blocked",
|
|
2166
|
+
detail: result.reason,
|
|
2167
|
+
nextAction: `Fix the blocker, then run ${resumeCmd} to resume.`,
|
|
2168
|
+
commands: ["/gsd status for overview", `${resumeCmd} to resume`, "/gsd doctor to diagnose"],
|
|
2169
|
+
});
|
|
2170
|
+
}
|
|
2171
|
+
|
|
2081
2172
|
function ensureOrchestrationModule(ctx: ExtensionContext, pi: ExtensionAPI, basePath: string): void {
|
|
2082
2173
|
s.orchestration = createWiredAutoOrchestrationModule(ctx, pi, basePath, lockBase());
|
|
2083
2174
|
}
|
|
@@ -2415,7 +2506,7 @@ export async function startAuto(
|
|
|
2415
2506
|
// This closes the journal gap reported in #3348 where the worker wrote side
|
|
2416
2507
|
// effects (SUMMARY.md, DB updates) but died before emitting unit-end.
|
|
2417
2508
|
emitCrashRecoveredUnitEnd(base, freshStartAssessment.lock);
|
|
2418
|
-
|
|
2509
|
+
clearStaleWorkerLock(base);
|
|
2419
2510
|
}
|
|
2420
2511
|
|
|
2421
2512
|
if (!s.paused) {
|
|
@@ -2486,6 +2577,8 @@ export async function startAuto(
|
|
|
2486
2577
|
s.unitLifetimeDispatches.clear();
|
|
2487
2578
|
if (!getLedger()) initMetrics(base);
|
|
2488
2579
|
if (s.currentMilestoneId) setActiveMilestoneId(base, s.currentMilestoneId);
|
|
2580
|
+
await openProjectDbIfPresent(base);
|
|
2581
|
+
registerAutoWorkerForSession(s, base);
|
|
2489
2582
|
|
|
2490
2583
|
// Re-register health level notification callback lost across process restart
|
|
2491
2584
|
setLevelChangeCallback((_from, to, summary) => {
|
|
@@ -2558,22 +2651,11 @@ export async function startAuto(
|
|
|
2558
2651
|
}
|
|
2559
2652
|
invalidateAllCaches();
|
|
2560
2653
|
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
s.pausedSessionFile,
|
|
2567
|
-
);
|
|
2568
|
-
if (recovery && recovery.trace.toolCallCount > 0) {
|
|
2569
|
-
s.pendingCrashRecovery = recovery.prompt;
|
|
2570
|
-
ctx.ui.notify(
|
|
2571
|
-
`Recovered ${recovery.trace.toolCallCount} tool calls from paused session. Resuming with context.`,
|
|
2572
|
-
"info",
|
|
2573
|
-
);
|
|
2574
|
-
}
|
|
2575
|
-
s.pausedSessionFile = null;
|
|
2576
|
-
}
|
|
2654
|
+
handlePausedSessionResumeRecovery(
|
|
2655
|
+
s.basePath,
|
|
2656
|
+
s,
|
|
2657
|
+
(message) => ctx.ui.notify(message, "info"),
|
|
2658
|
+
);
|
|
2577
2659
|
|
|
2578
2660
|
captureProjectRootEnv(s.originalBasePath || s.basePath);
|
|
2579
2661
|
registerAutoWorkerForSession(s);
|
|
@@ -2588,12 +2670,20 @@ export async function startAuto(
|
|
|
2588
2670
|
"resuming",
|
|
2589
2671
|
s.currentMilestoneId ?? "unknown",
|
|
2590
2672
|
);
|
|
2591
|
-
clearPausedSession("paused-session DB cleanup failed (resume activation)");
|
|
2592
2673
|
}
|
|
2674
|
+
clearPausedSession("paused-session DB cleanup failed (resume activation)");
|
|
2593
2675
|
pi.events.emit(CMUX_CHANNELS.LOG, { preferences: loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences, message: s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.", level: "progress" });
|
|
2594
2676
|
|
|
2595
2677
|
try {
|
|
2596
|
-
await s.orchestration?.resume();
|
|
2678
|
+
const resumeResult = await s.orchestration?.resume();
|
|
2679
|
+
if (resumeResult?.kind === "blocked" && resumeResult.action === "stop") {
|
|
2680
|
+
notifyResumeBlocked(ctx, resumeResult);
|
|
2681
|
+
await cleanupAfterLoopExit(ctx);
|
|
2682
|
+
return;
|
|
2683
|
+
}
|
|
2684
|
+
if (resumeResult?.kind === "blocked") {
|
|
2685
|
+
notifyResumeBlocked(ctx, resumeResult);
|
|
2686
|
+
}
|
|
2597
2687
|
} catch (err) {
|
|
2598
2688
|
debugLog("resume-orchestration-resume", { error: err instanceof Error ? err.message : String(err) });
|
|
2599
2689
|
}
|
|
@@ -2614,6 +2704,7 @@ export async function startAuto(
|
|
|
2614
2704
|
const bootstrapDeps: BootstrapDeps = {
|
|
2615
2705
|
shouldUseWorktreeIsolation,
|
|
2616
2706
|
registerSigtermHandler,
|
|
2707
|
+
registerAutoWorkerForSession: (projectRoot) => registerAutoWorkerForSession(s, projectRoot),
|
|
2617
2708
|
lockBase,
|
|
2618
2709
|
buildLifecycle,
|
|
2619
2710
|
};
|
|
@@ -32,6 +32,7 @@ import { shouldIgnoreAgentEndForActiveUnit } from "../auto/unit-runner-events.js
|
|
|
32
32
|
import { resolveModelId } from "../auto-model-selection.js";
|
|
33
33
|
import { resolveProjectRoot } from "../worktree.js";
|
|
34
34
|
import { clearDiscussionFlowState } from "./write-gate.js";
|
|
35
|
+
import { clearGuidedUnitContext } from "../guided-unit-context.js";
|
|
35
36
|
import { resumeAutoAfterProviderDelay } from "./provider-error-resume.js";
|
|
36
37
|
import {
|
|
37
38
|
classifyError,
|
|
@@ -48,6 +49,19 @@ const MAX_NETWORK_RETRIES = 2;
|
|
|
48
49
|
function isObjectRecord(value: unknown): value is Record<string, unknown> {
|
|
49
50
|
return !!value && typeof value === "object";
|
|
50
51
|
}
|
|
52
|
+
|
|
53
|
+
export function _hasEmptyAgentEndContent(content: unknown): boolean {
|
|
54
|
+
if (content == null) return true;
|
|
55
|
+
if (!Array.isArray(content)) return false;
|
|
56
|
+
if (content.length === 0) return true;
|
|
57
|
+
return content.every((block) => {
|
|
58
|
+
if (!block || typeof block !== "object") return true;
|
|
59
|
+
const typedBlock = block as { type?: unknown; text?: unknown };
|
|
60
|
+
if (typedBlock.type !== "text") return false;
|
|
61
|
+
return typeof typedBlock.text !== "string" || typedBlock.text.trim() === "";
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
51
65
|
/**
|
|
52
66
|
* Cap on auto-resume attempts for sustained transient-provider errors.
|
|
53
67
|
*
|
|
@@ -94,6 +108,14 @@ export function isUserInitiatedAbortMessage(message: string | undefined | null):
|
|
|
94
108
|
return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
|
|
95
109
|
}
|
|
96
110
|
|
|
111
|
+
export function shouldDeferTransientErrorToCoreRetry(
|
|
112
|
+
cls: ErrorClass,
|
|
113
|
+
rawErrorMsg: string,
|
|
114
|
+
): boolean {
|
|
115
|
+
if (!isTransient(cls) || cls.kind === "rate-limit") return false;
|
|
116
|
+
return !/retry failed after \d+ attempts:/i.test(rawErrorMsg);
|
|
117
|
+
}
|
|
118
|
+
|
|
97
119
|
function isBareClaudeCodeSessionSwitchAbortMarker(message: string | undefined | null): boolean {
|
|
98
120
|
if (!message) return false;
|
|
99
121
|
const normalized = message.trim().replace(/\s+/g, " ").toLowerCase();
|
|
@@ -196,6 +218,14 @@ export function resolveAgentEndErrorDisplay(
|
|
|
196
218
|
return rawErrorMsg;
|
|
197
219
|
}
|
|
198
220
|
|
|
221
|
+
export function isTerminalDeletedWorktreeProviderError(
|
|
222
|
+
message: string | undefined | null,
|
|
223
|
+
): boolean {
|
|
224
|
+
if (!message) return false;
|
|
225
|
+
if (!/\bdoes not exist\b/i.test(message)) return false;
|
|
226
|
+
return /[/\\]\.gsd[/\\](?:projects[/\\][^/\\]+[/\\])?worktrees[/\\][^/\\\s"']+/i.test(message);
|
|
227
|
+
}
|
|
228
|
+
|
|
199
229
|
async function pauseTransientWithBackoff(
|
|
200
230
|
cls: ErrorClass,
|
|
201
231
|
pi: ExtensionAPI,
|
|
@@ -244,9 +274,11 @@ export async function handleAgentEnd(
|
|
|
244
274
|
// falsely report files as missing — producing a spurious "ready signal
|
|
245
275
|
// rejected" loop even though the files are on disk.
|
|
246
276
|
clearPathCache();
|
|
277
|
+
const basePath = resolveAgentEndBasePath();
|
|
278
|
+
clearGuidedUnitContext(basePath);
|
|
247
279
|
|
|
248
280
|
try {
|
|
249
|
-
if (await checkDeepProjectSetupAfterTurn(event, ctx,
|
|
281
|
+
if (await checkDeepProjectSetupAfterTurn(event, ctx, basePath)) {
|
|
250
282
|
return;
|
|
251
283
|
}
|
|
252
284
|
} catch (err) {
|
|
@@ -254,8 +286,8 @@ export async function handleAgentEnd(
|
|
|
254
286
|
logWarning("bootstrap", `checkDeepProjectSetupAfterTurn failed: ${message}`);
|
|
255
287
|
}
|
|
256
288
|
|
|
257
|
-
if (checkAutoStartAfterDiscuss()) {
|
|
258
|
-
clearDiscussionFlowState(
|
|
289
|
+
if (checkAutoStartAfterDiscuss(basePath)) {
|
|
290
|
+
clearDiscussionFlowState(basePath ?? process.cwd());
|
|
259
291
|
return;
|
|
260
292
|
}
|
|
261
293
|
|
|
@@ -263,14 +295,14 @@ export async function handleAgentEnd(
|
|
|
263
295
|
// are missing, `checkAutoStartAfterDiscuss` returns false silently. Surface
|
|
264
296
|
// that and nudge the LLM to complete the writes before the user hits the
|
|
265
297
|
// downstream "All milestones complete" warning loop.
|
|
266
|
-
if (maybeHandleReadyPhraseWithoutFiles(event)) return;
|
|
298
|
+
if (maybeHandleReadyPhraseWithoutFiles(event, basePath)) return;
|
|
267
299
|
|
|
268
300
|
// #4573 — Empty-turn recovery: if the LLM announced intent in prose but
|
|
269
301
|
// emitted no tool calls, nudge it to execute. Fires only when auto-mode is
|
|
270
302
|
// active or a discussion autostart is pending (non-auto interactive discuss
|
|
271
303
|
// is user-driven). Runs before `isAutoActive` early return so pending
|
|
272
304
|
// discussions (where isAutoActive may be false) still get recovered.
|
|
273
|
-
if (maybeHandleEmptyIntentTurn(event, isAutoActive())) return;
|
|
305
|
+
if (maybeHandleEmptyIntentTurn(event, isAutoActive(), basePath)) return;
|
|
274
306
|
|
|
275
307
|
if (!isAutoActive()) return;
|
|
276
308
|
|
|
@@ -292,9 +324,22 @@ export async function handleAgentEnd(
|
|
|
292
324
|
}
|
|
293
325
|
|
|
294
326
|
if (isBareClaudeCodeStreamAbortPlaceholder(lastMsg)) {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
327
|
+
if (isSessionSwitchAbortGraceActive()) {
|
|
328
|
+
// Old turn leaking through after a session switch — drop it.
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Mid-unit stream abort with no diagnostic. Treat as non-fatal so the loop
|
|
333
|
+
// can continue, but surface it to the user and resolve the in-flight unit.
|
|
334
|
+
ctx.ui.notify("Claude Code stream aborted mid-unit (no diagnostic). Continuing.", "warning");
|
|
335
|
+
try {
|
|
336
|
+
resetRetryState(retryState);
|
|
337
|
+
resolveAgentEnd(event);
|
|
338
|
+
} catch (err) {
|
|
339
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
340
|
+
ctx.ui.notify(`Auto-mode error after stream-abort placeholder: ${message}. Stopping auto-mode.`, "error");
|
|
341
|
+
try { await pauseAuto(ctx, pi); } catch (e) { logWarning("bootstrap", `pauseAuto failed after stream-abort placeholder: ${(e as Error).message}`); }
|
|
342
|
+
}
|
|
298
343
|
return;
|
|
299
344
|
}
|
|
300
345
|
|
|
@@ -310,7 +355,7 @@ export async function handleAgentEnd(
|
|
|
310
355
|
// that carry error context — e.g. errorMessage field or non-empty content
|
|
311
356
|
// indicating a mid-stream failure. (#2695)
|
|
312
357
|
const content = "content" in lastMsg ? lastMsg.content : undefined;
|
|
313
|
-
const hasEmptyContent =
|
|
358
|
+
const hasEmptyContent = _hasEmptyAgentEndContent(content);
|
|
314
359
|
const hasErrorMessage = "errorMessage" in lastMsg && !!lastMsg.errorMessage;
|
|
315
360
|
|
|
316
361
|
if (hasEmptyContent && !hasErrorMessage) {
|
|
@@ -355,6 +400,17 @@ export async function handleAgentEnd(
|
|
|
355
400
|
rawErrorMsg,
|
|
356
401
|
"content" in lastMsg ? lastMsg.content : undefined,
|
|
357
402
|
);
|
|
403
|
+
if (
|
|
404
|
+
isAutoCompletionStopInProgress() &&
|
|
405
|
+
isTerminalDeletedWorktreeProviderError(`${rawErrorMsg}\n${displayMsg}`)
|
|
406
|
+
) {
|
|
407
|
+
resetRetryState(retryState);
|
|
408
|
+
logWarning(
|
|
409
|
+
"bootstrap",
|
|
410
|
+
`Ignoring stale deleted-worktree provider error during terminal completion reroot: ${displayMsg || rawErrorMsg}`,
|
|
411
|
+
);
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
358
414
|
const errorDetail = displayMsg ? `: ${displayMsg}` : "";
|
|
359
415
|
const explicitRetryAfterMs = ("retryAfterMs" in lastMsg && typeof lastMsg.retryAfterMs === "number") ? lastMsg.retryAfterMs : undefined;
|
|
360
416
|
|
|
@@ -461,7 +517,7 @@ export async function handleAgentEnd(
|
|
|
461
517
|
// Core retries transient failures in-session after this handler.
|
|
462
518
|
// Keep that behavior for non-rate-limit classes to avoid pause/retry races,
|
|
463
519
|
// but let rate-limit continue into model fallback logic below (#4373).
|
|
464
|
-
if (
|
|
520
|
+
if (shouldDeferTransientErrorToCoreRetry(cls, rawErrorMsg)) {
|
|
465
521
|
return;
|
|
466
522
|
}
|
|
467
523
|
|