gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.1b44e695b
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 +134 -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 +66 -1
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +144 -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 +170 -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 +10 -2
- 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 +46 -1
- 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-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-types.js +3 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +147 -0
- package/dist/resources/extensions/gsd/preferences.js +6 -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/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/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 +7 -7
- 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 +7 -7
- 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/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/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/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/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__/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 +45 -2
- package/packages/pi-tui/dist/__tests__/tui.test.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.map +1 -1
- package/packages/pi-tui/dist/tui.js +106 -27
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
- package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
- package/packages/pi-tui/src/terminal.ts +11 -0
- package/packages/pi-tui/src/tui.ts +108 -27
- 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 +160 -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 +72 -1
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +164 -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 +174 -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 +11 -3
- 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 +45 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
- package/src/resources/extensions/gsd/doctor-types.ts +1 -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-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-types.ts +35 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +154 -0
- package/src/resources/extensions/gsd/preferences.ts +9 -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 +107 -2
- 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 +111 -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-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/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-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/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/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/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 → Z8H5evS-hDo0qdP22XJPA}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → Z8H5evS-hDo0qdP22XJPA}/_ssgManifest.js +0 -0
|
@@ -22,7 +22,7 @@ import { gsdRoot, resolveMilestoneFile, resolveMilestonePath, resolveDir, milest
|
|
|
22
22
|
import { invalidateAllCaches } from "./cache.js";
|
|
23
23
|
import { clearActivityLogState } from "./activity-log.js";
|
|
24
24
|
import { synthesizeCrashRecovery, getDeepDiagnostic, readActiveMilestoneId, } from "./session-forensics.js";
|
|
25
|
-
import { writeLock, clearLock, readCrashLock, isLockProcessAlive, formatCrashInfo, emitCrashRecoveredUnitEnd, emitOpenUnitEndForUnit, } from "./crash-recovery.js";
|
|
25
|
+
import { writeLock, clearLock, clearStaleWorkerLock, readCrashLock, isLockProcessAlive, formatCrashInfo, emitCrashRecoveredUnitEnd, emitOpenUnitEndForUnit, } from "./crash-recovery.js";
|
|
26
26
|
import { acquireSessionLock, getSessionLockStatus, releaseSessionLock, updateSessionLock, } from "./session-lock.js";
|
|
27
27
|
import { resolveAutoSupervisorConfig, loadEffectiveGSDPreferences, getIsolationMode, } from "./preferences.js";
|
|
28
28
|
import { sendDesktopNotification } from "./notifications.js";
|
|
@@ -52,7 +52,7 @@ import { createAutoWorktree, teardownAutoWorktree, isInAutoWorktree, getAutoWork
|
|
|
52
52
|
import { pruneQueueOrder } from "./queue-order.js";
|
|
53
53
|
import { startCommandPolling as _startCommandPolling, isRemoteConfigured } from "../remote-questions/manager.js";
|
|
54
54
|
import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
|
|
55
|
-
import { reconcileMergeState, } from "./auto-recovery.js";
|
|
55
|
+
import { reconcileMergeState, verifyExpectedArtifact, } from "./auto-recovery.js";
|
|
56
56
|
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
57
57
|
import { resolveDispatch, DISPATCH_RULES } from "./auto-dispatch.js";
|
|
58
58
|
import { getErrorMessage } from "./error-utils.js";
|
|
@@ -110,7 +110,7 @@ export { STUB_RECOVERY_THRESHOLD, NEW_SESSION_TIMEOUT_MS, } from "./auto/session
|
|
|
110
110
|
import { autoSession as s } from "./auto-runtime-state.js";
|
|
111
111
|
import { gsdHome } from "./gsd-home.js";
|
|
112
112
|
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
113
|
-
import { registerAutoWorker, markWorkerStopping } from "./db/auto-workers.js";
|
|
113
|
+
import { registerAutoWorker, markWorkerStopping, } from "./db/auto-workers.js";
|
|
114
114
|
import { releaseMilestoneLease } from "./db/milestone-leases.js";
|
|
115
115
|
import { normalizeRealPath } from "./paths.js";
|
|
116
116
|
// ── ENCAPSULATION INVARIANT ─────────────────────────────────────────────────
|
|
@@ -127,6 +127,12 @@ import { normalizeRealPath } from "./paths.js";
|
|
|
127
127
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
128
128
|
/** Throttle STATE.md rebuilds — at most once per 30 seconds */
|
|
129
129
|
const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
|
|
130
|
+
export function formatAutoStopNotification(prefix, totals, unitCount) {
|
|
131
|
+
return [
|
|
132
|
+
`${prefix}.`,
|
|
133
|
+
`Session: ${formatCost(totals.cost)} · ${formatTokenCount(totals.tokens.total)} tokens · ${unitCount} units`,
|
|
134
|
+
].join("\n");
|
|
135
|
+
}
|
|
130
136
|
/**
|
|
131
137
|
* Phase B — register this auto-mode process in the workers table so other
|
|
132
138
|
* workers and janitors can detect liveness via heartbeat. Best-effort: if
|
|
@@ -253,6 +259,32 @@ function synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile
|
|
|
253
259
|
export function _synthesizePausedSessionRecoveryForTest(basePath, unitType, unitId, sessionFile) {
|
|
254
260
|
return synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile);
|
|
255
261
|
}
|
|
262
|
+
function handlePausedSessionResumeRecovery(basePath, state, notify) {
|
|
263
|
+
if (!state.pausedSessionFile)
|
|
264
|
+
return { skippedReplay: false };
|
|
265
|
+
const pausedRecoveryUnitType = state.currentUnit?.type ?? state.pausedUnitType ?? "unknown";
|
|
266
|
+
const pausedRecoveryUnitId = state.currentUnit?.id ?? state.pausedUnitId ?? "unknown";
|
|
267
|
+
const completedPausedUnit = verifyExpectedArtifact(pausedRecoveryUnitType, pausedRecoveryUnitId, basePath);
|
|
268
|
+
if (completedPausedUnit) {
|
|
269
|
+
state.pausedSessionFile = null;
|
|
270
|
+
state.pausedUnitType = null;
|
|
271
|
+
state.pausedUnitId = null;
|
|
272
|
+
state.pendingCrashRecovery = null;
|
|
273
|
+
return { skippedReplay: true };
|
|
274
|
+
}
|
|
275
|
+
const recovery = synthesizePausedSessionRecovery(basePath, pausedRecoveryUnitType, pausedRecoveryUnitId, state.pausedSessionFile);
|
|
276
|
+
if (recovery && recovery.trace.toolCallCount > 0) {
|
|
277
|
+
state.pendingCrashRecovery = recovery.prompt;
|
|
278
|
+
notify(`Recovered ${recovery.trace.toolCallCount} tool calls from paused session. Resuming with context.`);
|
|
279
|
+
}
|
|
280
|
+
state.pausedSessionFile = null;
|
|
281
|
+
state.pausedUnitType = null;
|
|
282
|
+
state.pausedUnitId = null;
|
|
283
|
+
return { skippedReplay: false };
|
|
284
|
+
}
|
|
285
|
+
export function _handlePausedSessionResumeRecoveryForTest(basePath, state) {
|
|
286
|
+
return handlePausedSessionResumeRecovery(basePath, state, () => { });
|
|
287
|
+
}
|
|
256
288
|
// `_resolvePausedResumeBasePathForTest` was retired in ADR-016 phase 2 / B3
|
|
257
289
|
// (#5621). Production callers go through
|
|
258
290
|
// `WorktreeLifecycle.resumeFromPausedSession`; the pure helper for tests is
|
|
@@ -560,6 +592,7 @@ export function checkRemoteAutoSession(projectRoot) {
|
|
|
560
592
|
return { running: false };
|
|
561
593
|
if (!isLockProcessAlive(lock)) {
|
|
562
594
|
// Stale lock from a dead process — not a live remote session
|
|
595
|
+
clearLock(projectRoot);
|
|
563
596
|
return { running: false };
|
|
564
597
|
}
|
|
565
598
|
return {
|
|
@@ -683,6 +716,8 @@ export async function rerootCommandSession(cmdCtx, workspaceRoot) {
|
|
|
683
716
|
}
|
|
684
717
|
}
|
|
685
718
|
export async function cleanupAfterLoopExit(ctx) {
|
|
719
|
+
const preserveStepSurface = s.preserveStepSurfaceAfterLoopExit;
|
|
720
|
+
const preservePausedSurface = s.paused;
|
|
686
721
|
s.currentUnit = null;
|
|
687
722
|
s.active = false;
|
|
688
723
|
deactivateGSD();
|
|
@@ -706,34 +741,32 @@ export async function cleanupAfterLoopExit(ctx) {
|
|
|
706
741
|
// A transient provider-error pause intentionally leaves the paused badge
|
|
707
742
|
// visible so the user still has a resumable auto-mode signal on screen.
|
|
708
743
|
if (!s.paused) {
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
744
|
+
if (preserveStepSurface) {
|
|
745
|
+
s.preserveStepSurfaceAfterLoopExit = false;
|
|
746
|
+
}
|
|
747
|
+
else {
|
|
748
|
+
ctx.ui.setStatus("gsd-auto", undefined);
|
|
749
|
+
ctx.ui.setWidget("gsd-progress", undefined);
|
|
750
|
+
if (s.completionStopInProgress) {
|
|
751
|
+
s.completionStopInProgress = false;
|
|
752
|
+
}
|
|
753
|
+
initHealthWidget(ctx);
|
|
712
754
|
}
|
|
713
|
-
initHealthWidget(ctx);
|
|
714
755
|
}
|
|
715
|
-
// ADR-016 phase 3 (#5693): the stop-path basePath restore routes
|
|
716
|
-
// `Lifecycle.restoreToProjectRoot()`, the sole owner of
|
|
717
|
-
//
|
|
718
|
-
//
|
|
719
|
-
//
|
|
720
|
-
|
|
721
|
-
// session-state mutation.
|
|
722
|
-
if (s.originalBasePath) {
|
|
756
|
+
// ADR-016 phase 3 (#5693): the stop-path basePath restore + chdir routes
|
|
757
|
+
// through `Lifecycle.restoreToProjectRoot()`, the sole owner of both
|
|
758
|
+
// `s.basePath` mutation and the paired `process.chdir` for auto-loop
|
|
759
|
+
// transitions. The verb assigns `s.basePath` before any throwable work, so
|
|
760
|
+
// a thrown error still leaves basePath restored.
|
|
761
|
+
if (s.originalBasePath && !preserveStepSurface && !preservePausedSurface) {
|
|
723
762
|
try {
|
|
724
763
|
buildLifecycle().restoreToProjectRoot();
|
|
725
764
|
}
|
|
726
765
|
catch (err) {
|
|
727
766
|
logWarning("engine", `restore project root failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
728
767
|
}
|
|
729
|
-
try {
|
|
730
|
-
process.chdir(s.originalBasePath);
|
|
731
|
-
}
|
|
732
|
-
catch (err) {
|
|
733
|
-
logWarning("engine", `basePath restore/chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
734
|
-
}
|
|
735
768
|
}
|
|
736
|
-
if (s.originalBasePath && s.cmdCtx) {
|
|
769
|
+
if (s.originalBasePath && s.cmdCtx && !preserveStepSurface && !preservePausedSurface) {
|
|
737
770
|
const result = await rerootCommandSession(s.cmdCtx, s.originalBasePath);
|
|
738
771
|
if (result.status === "cancelled") {
|
|
739
772
|
logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.originalBasePath });
|
|
@@ -804,29 +837,16 @@ export async function stopAuto(ctx, pi, reason, options = {}) {
|
|
|
804
837
|
// worktree was active, and whether the current milestone was merged before
|
|
805
838
|
// stopAuto. The unmerged-work warning is only meaningful for real worktrees.
|
|
806
839
|
try {
|
|
807
|
-
const { emitAutoExit } = await import("./worktree-telemetry.js");
|
|
840
|
+
const { emitAutoExit, normalizeAutoExitReason } = await import("./worktree-telemetry.js");
|
|
808
841
|
// Normalize the free-form reason to a closed set so the telemetry
|
|
809
842
|
// aggregator buckets stably. Raw detail is preserved in the phases.ts
|
|
810
843
|
// notification and the notify'd error string.
|
|
811
844
|
const rawReason = reason ?? "stop";
|
|
812
|
-
const normalizedReason = rawReason
|
|
813
|
-
? "blocked"
|
|
814
|
-
: rawReason.startsWith("Merge conflict")
|
|
815
|
-
? "merge-conflict"
|
|
816
|
-
: rawReason.startsWith("Merge error") || rawReason.startsWith("Merge failed")
|
|
817
|
-
? "merge-failed"
|
|
818
|
-
: rawReason.startsWith("slice-merge-conflict")
|
|
819
|
-
? "slice-merge-conflict"
|
|
820
|
-
: rawReason === "All milestones complete"
|
|
821
|
-
? "all-complete"
|
|
822
|
-
: rawReason === "No active milestone"
|
|
823
|
-
? "no-active-milestone"
|
|
824
|
-
: rawReason === "stop" || rawReason === "pause"
|
|
825
|
-
? rawReason
|
|
826
|
-
: "other";
|
|
845
|
+
const normalizedReason = normalizeAutoExitReason(rawReason);
|
|
827
846
|
const telemetryBase = s.originalBasePath || s.basePath;
|
|
828
847
|
emitAutoExit(telemetryBase, {
|
|
829
848
|
reason: normalizedReason,
|
|
849
|
+
rawReason,
|
|
830
850
|
milestoneId: s.currentMilestoneId ?? undefined,
|
|
831
851
|
milestoneMerged: s.milestoneMergedInPhases === true,
|
|
832
852
|
isolationMode: getIsolationMode(telemetryBase),
|
|
@@ -1002,8 +1022,8 @@ export async function stopAuto(ctx, pi, reason, options = {}) {
|
|
|
1002
1022
|
}
|
|
1003
1023
|
}
|
|
1004
1024
|
// ── Step 7: Restore basePath and chdir (ADR-016 phase 3, #5693) ──
|
|
1005
|
-
// `restoreToProjectRoot`
|
|
1006
|
-
// no
|
|
1025
|
+
// `restoreToProjectRoot` owns both s.basePath restore and process.chdir;
|
|
1026
|
+
// no paired chdir is needed at the call site.
|
|
1007
1027
|
if (s.originalBasePath) {
|
|
1008
1028
|
try {
|
|
1009
1029
|
buildLifecycle().restoreToProjectRoot();
|
|
@@ -1011,13 +1031,6 @@ export async function stopAuto(ctx, pi, reason, options = {}) {
|
|
|
1011
1031
|
catch (e) {
|
|
1012
1032
|
debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
|
|
1013
1033
|
}
|
|
1014
|
-
try {
|
|
1015
|
-
process.chdir(s.basePath);
|
|
1016
|
-
}
|
|
1017
|
-
catch (err) {
|
|
1018
|
-
/* best-effort */
|
|
1019
|
-
logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
1020
|
-
}
|
|
1021
1034
|
}
|
|
1022
1035
|
// Re-root the active command session/tool runtime after worktree teardown.
|
|
1023
1036
|
// mergeAndExit restores process.cwd(), but AgentSession has already captured
|
|
@@ -1044,7 +1057,7 @@ export async function stopAuto(ctx, pi, reason, options = {}) {
|
|
|
1044
1057
|
: `Auto-mode stopped${reasonSuffix}`;
|
|
1045
1058
|
if (ledger && ledger.units.length > 0) {
|
|
1046
1059
|
const totals = getProjectTotals(ledger.units);
|
|
1047
|
-
ctx?.ui.notify(
|
|
1060
|
+
ctx?.ui.notify(formatAutoStopNotification(notificationPrefix, totals, ledger.units.length), "info");
|
|
1048
1061
|
}
|
|
1049
1062
|
else {
|
|
1050
1063
|
ctx?.ui.notify(`${notificationPrefix}.`, "info");
|
|
@@ -1333,7 +1346,6 @@ export async function pauseAuto(ctx, _pi, _errorContext) {
|
|
|
1333
1346
|
restoreProjectRootEnv();
|
|
1334
1347
|
restoreMilestoneLockEnv();
|
|
1335
1348
|
s.pendingVerificationRetry = null;
|
|
1336
|
-
s.verificationRetryCount.clear();
|
|
1337
1349
|
ctx?.ui.setStatus("gsd-auto", "paused");
|
|
1338
1350
|
ctx?.ui.setWidget("gsd-progress", undefined);
|
|
1339
1351
|
const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
|
|
@@ -1393,14 +1405,16 @@ function buildLifecycle() {
|
|
|
1393
1405
|
* the wired adapter must derive `structuredQuestionsAvailable`, `sessionContextWindow`,
|
|
1394
1406
|
* `sessionProvider`, and `modelRegistry` the same way phases.ts:runDispatch does.
|
|
1395
1407
|
*/
|
|
1396
|
-
export function createWiredDispatchAdapter(ctx, pi, dispatchBasePath) {
|
|
1408
|
+
export function createWiredDispatchAdapter(ctx, pi, dispatchBasePath, session) {
|
|
1397
1409
|
return {
|
|
1398
1410
|
async decideNextUnit(input) {
|
|
1399
1411
|
const state = input.stateSnapshot;
|
|
1400
1412
|
const active = state.activeMilestone;
|
|
1401
1413
|
if (!active)
|
|
1402
1414
|
return null;
|
|
1403
|
-
const
|
|
1415
|
+
const activeSession = input.session ?? session;
|
|
1416
|
+
const activeDispatchBasePath = activeSession?.basePath || dispatchBasePath;
|
|
1417
|
+
const prefs = loadEffectiveGSDPreferences(activeDispatchBasePath)?.preferences;
|
|
1404
1418
|
// Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
|
|
1405
1419
|
// (#5789). Prefer caller-supplied values when present so test harnesses and
|
|
1406
1420
|
// alternative wirings can inject deterministic snapshots; otherwise pull from
|
|
@@ -1425,18 +1439,43 @@ export function createWiredDispatchAdapter(ctx, pi, dispatchBasePath) {
|
|
|
1425
1439
|
? "true"
|
|
1426
1440
|
: "false");
|
|
1427
1441
|
const action = await resolveDispatch({
|
|
1428
|
-
basePath:
|
|
1442
|
+
basePath: activeDispatchBasePath,
|
|
1429
1443
|
mid: active.id,
|
|
1430
1444
|
midTitle: active.title,
|
|
1431
1445
|
state,
|
|
1432
1446
|
prefs,
|
|
1447
|
+
session: activeSession,
|
|
1433
1448
|
structuredQuestionsAvailable,
|
|
1434
1449
|
sessionContextWindow,
|
|
1435
1450
|
sessionProvider,
|
|
1436
1451
|
modelRegistry,
|
|
1437
1452
|
});
|
|
1438
|
-
if (action.action
|
|
1453
|
+
if (action.action === "stop") {
|
|
1454
|
+
if (session)
|
|
1455
|
+
session.pendingOrchestrationDispatch = null;
|
|
1456
|
+
return {
|
|
1457
|
+
kind: "blocked",
|
|
1458
|
+
reason: action.reason,
|
|
1459
|
+
action: action.level === "warning" ? "pause" : "stop",
|
|
1460
|
+
};
|
|
1461
|
+
}
|
|
1462
|
+
if (action.action !== "dispatch") {
|
|
1463
|
+
if (session)
|
|
1464
|
+
session.pendingOrchestrationDispatch = null;
|
|
1439
1465
|
return null;
|
|
1466
|
+
}
|
|
1467
|
+
if (session) {
|
|
1468
|
+
const pending = {
|
|
1469
|
+
unitType: action.unitType,
|
|
1470
|
+
unitId: action.unitId,
|
|
1471
|
+
prompt: action.prompt,
|
|
1472
|
+
pauseAfterUatDispatch: action.pauseAfterDispatch ?? false,
|
|
1473
|
+
state,
|
|
1474
|
+
mid: active.id,
|
|
1475
|
+
midTitle: active.title,
|
|
1476
|
+
};
|
|
1477
|
+
session.pendingOrchestrationDispatch = pending;
|
|
1478
|
+
}
|
|
1440
1479
|
return {
|
|
1441
1480
|
unitType: action.unitType,
|
|
1442
1481
|
unitId: action.unitId,
|
|
@@ -1477,7 +1516,7 @@ export function createWiredAutoOrchestrationModule(ctx, pi, dispatchBasePath, ru
|
|
|
1477
1516
|
};
|
|
1478
1517
|
},
|
|
1479
1518
|
},
|
|
1480
|
-
dispatch: createWiredDispatchAdapter(ctx, pi, dispatchBasePath),
|
|
1519
|
+
dispatch: createWiredDispatchAdapter(ctx, pi, dispatchBasePath, s),
|
|
1481
1520
|
recovery: {
|
|
1482
1521
|
async classifyAndRecover(input) {
|
|
1483
1522
|
const recovery = classifyFailure(input);
|
|
@@ -1501,9 +1540,15 @@ export function createWiredAutoOrchestrationModule(ctx, pi, dispatchBasePath, ru
|
|
|
1501
1540
|
reason: `No Unit manifest is registered for ${unitType}`,
|
|
1502
1541
|
};
|
|
1503
1542
|
}
|
|
1543
|
+
if (getIsolationMode(runtimeBasePath) !== "worktree") {
|
|
1544
|
+
return { ok: true, reason: "not-required" };
|
|
1545
|
+
}
|
|
1504
1546
|
const writeScope = manifest.tools.mode === "all" || manifest.tools.mode === "docs"
|
|
1505
1547
|
? "source-writing"
|
|
1506
1548
|
: "planning-only";
|
|
1549
|
+
if (getIsolationMode(runtimeBasePath) !== "worktree") {
|
|
1550
|
+
return { ok: true, reason: "isolation-not-worktree" };
|
|
1551
|
+
}
|
|
1507
1552
|
const safety = createWorktreeSafetyModule();
|
|
1508
1553
|
const snapshot = await deriveState(dispatchBasePath);
|
|
1509
1554
|
const milestoneId = snapshot.activeMilestone?.id ?? null;
|
|
@@ -1515,6 +1560,7 @@ export function createWiredAutoOrchestrationModule(ctx, pi, dispatchBasePath, ru
|
|
|
1515
1560
|
projectRoot: runtimeBasePath,
|
|
1516
1561
|
unitRoot: dispatchBasePath,
|
|
1517
1562
|
milestoneId,
|
|
1563
|
+
isolationMode: getIsolationMode(runtimeBasePath),
|
|
1518
1564
|
expectedBranch,
|
|
1519
1565
|
});
|
|
1520
1566
|
if (!result.ok) {
|
|
@@ -1575,22 +1621,22 @@ export function createWiredAutoOrchestrationModule(ctx, pi, dispatchBasePath, ru
|
|
|
1575
1621
|
},
|
|
1576
1622
|
async journalTransition(event) {
|
|
1577
1623
|
const eventType = event.name === "start"
|
|
1578
|
-
? "iteration-start"
|
|
1624
|
+
? "orchestrator-iteration-start"
|
|
1579
1625
|
: event.name === "resume"
|
|
1580
|
-
? "iteration-start"
|
|
1626
|
+
? "orchestrator-iteration-start"
|
|
1581
1627
|
: event.name === "advance"
|
|
1582
|
-
? "dispatch-match"
|
|
1628
|
+
? "orchestrator-dispatch-match"
|
|
1583
1629
|
: event.name === "advance-blocked"
|
|
1584
|
-
? "guard-block"
|
|
1630
|
+
? "orchestrator-guard-block"
|
|
1585
1631
|
: event.name === "advance-stopped"
|
|
1586
|
-
? "dispatch-stop"
|
|
1632
|
+
? "orchestrator-dispatch-stop"
|
|
1587
1633
|
: event.name === "advance-error"
|
|
1588
|
-
? "iteration-end"
|
|
1634
|
+
? "orchestrator-iteration-end"
|
|
1589
1635
|
: event.name === "advance-paused" || event.name === "advance-retry"
|
|
1590
|
-
? "guard-block"
|
|
1636
|
+
? "orchestrator-guard-block"
|
|
1591
1637
|
: event.name === "stop"
|
|
1592
|
-
? "terminal"
|
|
1593
|
-
: "iteration-end";
|
|
1638
|
+
? "orchestrator-terminal"
|
|
1639
|
+
: "orchestrator-iteration-end";
|
|
1594
1640
|
_emitJournalEvent(runtimeBasePath, {
|
|
1595
1641
|
ts: new Date().toISOString(),
|
|
1596
1642
|
flowId,
|
|
@@ -1655,6 +1701,17 @@ export function createWiredAutoOrchestrationModule(ctx, pi, dispatchBasePath, ru
|
|
|
1655
1701
|
};
|
|
1656
1702
|
return createAutoOrchestrator(deps);
|
|
1657
1703
|
}
|
|
1704
|
+
function notifyResumeBlocked(ctx, result) {
|
|
1705
|
+
const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
|
|
1706
|
+
ctx.ui.notify(`Auto-mode blocked: ${result.reason}. Fix and run ${resumeCmd} to resume.`, "warning");
|
|
1707
|
+
setLifecycleOutcome(ctx, {
|
|
1708
|
+
status: "blocked",
|
|
1709
|
+
title: "Auto-mode blocked",
|
|
1710
|
+
detail: result.reason,
|
|
1711
|
+
nextAction: `Fix the blocker, then run ${resumeCmd} to resume.`,
|
|
1712
|
+
commands: ["/gsd status for overview", `${resumeCmd} to resume`, "/gsd doctor to diagnose"],
|
|
1713
|
+
});
|
|
1714
|
+
}
|
|
1658
1715
|
function ensureOrchestrationModule(ctx, pi, basePath) {
|
|
1659
1716
|
s.orchestration = createWiredAutoOrchestrationModule(ctx, pi, basePath, lockBase());
|
|
1660
1717
|
}
|
|
@@ -1939,7 +1996,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1939
1996
|
// This closes the journal gap reported in #3348 where the worker wrote side
|
|
1940
1997
|
// effects (SUMMARY.md, DB updates) but died before emitting unit-end.
|
|
1941
1998
|
emitCrashRecoveredUnitEnd(base, freshStartAssessment.lock);
|
|
1942
|
-
|
|
1999
|
+
clearStaleWorkerLock(base);
|
|
1943
2000
|
}
|
|
1944
2001
|
if (!s.paused) {
|
|
1945
2002
|
s.pendingCrashRecovery =
|
|
@@ -2002,6 +2059,8 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
2002
2059
|
initMetrics(base);
|
|
2003
2060
|
if (s.currentMilestoneId)
|
|
2004
2061
|
setActiveMilestoneId(base, s.currentMilestoneId);
|
|
2062
|
+
await openProjectDbIfPresent(base);
|
|
2063
|
+
registerAutoWorkerForSession(s, base);
|
|
2005
2064
|
// Re-register health level notification callback lost across process restart
|
|
2006
2065
|
setLevelChangeCallback((_from, to, summary) => {
|
|
2007
2066
|
const level = to === "red" ? "error" : to === "yellow" ? "warning" : "info";
|
|
@@ -2060,24 +2119,25 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
2060
2119
|
});
|
|
2061
2120
|
}
|
|
2062
2121
|
invalidateAllCaches();
|
|
2063
|
-
|
|
2064
|
-
const recovery = synthesizePausedSessionRecovery(s.basePath, s.currentUnit?.type ?? s.pausedUnitType ?? "unknown", s.currentUnit?.id ?? s.pausedUnitId ?? "unknown", s.pausedSessionFile);
|
|
2065
|
-
if (recovery && recovery.trace.toolCallCount > 0) {
|
|
2066
|
-
s.pendingCrashRecovery = recovery.prompt;
|
|
2067
|
-
ctx.ui.notify(`Recovered ${recovery.trace.toolCallCount} tool calls from paused session. Resuming with context.`, "info");
|
|
2068
|
-
}
|
|
2069
|
-
s.pausedSessionFile = null;
|
|
2070
|
-
}
|
|
2122
|
+
handlePausedSessionResumeRecovery(s.basePath, s, (message) => ctx.ui.notify(message, "info"));
|
|
2071
2123
|
captureProjectRootEnv(s.originalBasePath || s.basePath);
|
|
2072
2124
|
registerAutoWorkerForSession(s);
|
|
2073
2125
|
updateSessionLock(lockBase(), "resuming", s.currentMilestoneId ?? "unknown");
|
|
2074
2126
|
if (s.workerId) {
|
|
2075
2127
|
writeLock(lockBase(), "resuming", s.currentMilestoneId ?? "unknown");
|
|
2076
|
-
clearPausedSession("paused-session DB cleanup failed (resume activation)");
|
|
2077
2128
|
}
|
|
2129
|
+
clearPausedSession("paused-session DB cleanup failed (resume activation)");
|
|
2078
2130
|
pi.events.emit(CMUX_CHANNELS.LOG, { preferences: loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences, message: s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.", level: "progress" });
|
|
2079
2131
|
try {
|
|
2080
|
-
await s.orchestration?.resume();
|
|
2132
|
+
const resumeResult = await s.orchestration?.resume();
|
|
2133
|
+
if (resumeResult?.kind === "blocked" && resumeResult.action === "stop") {
|
|
2134
|
+
notifyResumeBlocked(ctx, resumeResult);
|
|
2135
|
+
await cleanupAfterLoopExit(ctx);
|
|
2136
|
+
return;
|
|
2137
|
+
}
|
|
2138
|
+
if (resumeResult?.kind === "blocked") {
|
|
2139
|
+
notifyResumeBlocked(ctx, resumeResult);
|
|
2140
|
+
}
|
|
2081
2141
|
}
|
|
2082
2142
|
catch (err) {
|
|
2083
2143
|
debugLog("resume-orchestration-resume", { error: err instanceof Error ? err.message : String(err) });
|
|
@@ -2098,6 +2158,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
2098
2158
|
const bootstrapDeps = {
|
|
2099
2159
|
shouldUseWorktreeIsolation,
|
|
2100
2160
|
registerSigtermHandler,
|
|
2161
|
+
registerAutoWorkerForSession: (projectRoot) => registerAutoWorkerForSession(s, projectRoot),
|
|
2101
2162
|
lockBase,
|
|
2102
2163
|
buildLifecycle,
|
|
2103
2164
|
};
|
|
@@ -10,6 +10,7 @@ import { shouldIgnoreAgentEndForActiveUnit } from "../auto/unit-runner-events.js
|
|
|
10
10
|
import { resolveModelId } from "../auto-model-selection.js";
|
|
11
11
|
import { resolveProjectRoot } from "../worktree.js";
|
|
12
12
|
import { clearDiscussionFlowState } from "./write-gate.js";
|
|
13
|
+
import { clearGuidedUnitContext } from "../guided-unit-context.js";
|
|
13
14
|
import { resumeAutoAfterProviderDelay } from "./provider-error-resume.js";
|
|
14
15
|
import { classifyError, createRetryState, resetRetryState, isTransient, } from "../error-classifier.js";
|
|
15
16
|
import { blockModel, isModelBlocked } from "../blocked-models.js";
|
|
@@ -18,6 +19,22 @@ const MAX_NETWORK_RETRIES = 2;
|
|
|
18
19
|
function isObjectRecord(value) {
|
|
19
20
|
return !!value && typeof value === "object";
|
|
20
21
|
}
|
|
22
|
+
export function _hasEmptyAgentEndContent(content) {
|
|
23
|
+
if (content == null)
|
|
24
|
+
return true;
|
|
25
|
+
if (!Array.isArray(content))
|
|
26
|
+
return false;
|
|
27
|
+
if (content.length === 0)
|
|
28
|
+
return true;
|
|
29
|
+
return content.every((block) => {
|
|
30
|
+
if (!block || typeof block !== "object")
|
|
31
|
+
return true;
|
|
32
|
+
const typedBlock = block;
|
|
33
|
+
if (typedBlock.type !== "text")
|
|
34
|
+
return false;
|
|
35
|
+
return typeof typedBlock.text !== "string" || typedBlock.text.trim() === "";
|
|
36
|
+
});
|
|
37
|
+
}
|
|
21
38
|
/**
|
|
22
39
|
* Cap on auto-resume attempts for sustained transient-provider errors.
|
|
23
40
|
*
|
|
@@ -57,6 +74,11 @@ export function isUserInitiatedAbortMessage(message) {
|
|
|
57
74
|
return false;
|
|
58
75
|
return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
|
|
59
76
|
}
|
|
77
|
+
export function shouldDeferTransientErrorToCoreRetry(cls, rawErrorMsg) {
|
|
78
|
+
if (!isTransient(cls) || cls.kind === "rate-limit")
|
|
79
|
+
return false;
|
|
80
|
+
return !/retry failed after \d+ attempts:/i.test(rawErrorMsg);
|
|
81
|
+
}
|
|
60
82
|
function isBareClaudeCodeSessionSwitchAbortMarker(message) {
|
|
61
83
|
if (!message)
|
|
62
84
|
return false;
|
|
@@ -150,6 +172,13 @@ export function resolveAgentEndErrorDisplay(rawErrorMsg, content) {
|
|
|
150
172
|
}
|
|
151
173
|
return rawErrorMsg;
|
|
152
174
|
}
|
|
175
|
+
export function isTerminalDeletedWorktreeProviderError(message) {
|
|
176
|
+
if (!message)
|
|
177
|
+
return false;
|
|
178
|
+
if (!/\bdoes not exist\b/i.test(message))
|
|
179
|
+
return false;
|
|
180
|
+
return /[/\\]\.gsd[/\\](?:projects[/\\][^/\\]+[/\\])?worktrees[/\\][^/\\\s"']+/i.test(message);
|
|
181
|
+
}
|
|
153
182
|
async function pauseTransientWithBackoff(cls, pi, ctx, errorDetail, isRateLimit) {
|
|
154
183
|
retryState.consecutiveTransientCount += 1;
|
|
155
184
|
const baseRetryAfterMs = "retryAfterMs" in cls ? cls.retryAfterMs : 15_000;
|
|
@@ -187,8 +216,10 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
187
216
|
// falsely report files as missing — producing a spurious "ready signal
|
|
188
217
|
// rejected" loop even though the files are on disk.
|
|
189
218
|
clearPathCache();
|
|
219
|
+
const basePath = resolveAgentEndBasePath();
|
|
220
|
+
clearGuidedUnitContext(basePath);
|
|
190
221
|
try {
|
|
191
|
-
if (await checkDeepProjectSetupAfterTurn(event, ctx,
|
|
222
|
+
if (await checkDeepProjectSetupAfterTurn(event, ctx, basePath)) {
|
|
192
223
|
return;
|
|
193
224
|
}
|
|
194
225
|
}
|
|
@@ -196,22 +227,22 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
196
227
|
const message = err instanceof Error ? err.message : String(err);
|
|
197
228
|
logWarning("bootstrap", `checkDeepProjectSetupAfterTurn failed: ${message}`);
|
|
198
229
|
}
|
|
199
|
-
if (checkAutoStartAfterDiscuss()) {
|
|
200
|
-
clearDiscussionFlowState(
|
|
230
|
+
if (checkAutoStartAfterDiscuss(basePath)) {
|
|
231
|
+
clearDiscussionFlowState(basePath ?? process.cwd());
|
|
201
232
|
return;
|
|
202
233
|
}
|
|
203
234
|
// #4573 — When the LLM emits "Milestone X ready." but the required files
|
|
204
235
|
// are missing, `checkAutoStartAfterDiscuss` returns false silently. Surface
|
|
205
236
|
// that and nudge the LLM to complete the writes before the user hits the
|
|
206
237
|
// downstream "All milestones complete" warning loop.
|
|
207
|
-
if (maybeHandleReadyPhraseWithoutFiles(event))
|
|
238
|
+
if (maybeHandleReadyPhraseWithoutFiles(event, basePath))
|
|
208
239
|
return;
|
|
209
240
|
// #4573 — Empty-turn recovery: if the LLM announced intent in prose but
|
|
210
241
|
// emitted no tool calls, nudge it to execute. Fires only when auto-mode is
|
|
211
242
|
// active or a discussion autostart is pending (non-auto interactive discuss
|
|
212
243
|
// is user-driven). Runs before `isAutoActive` early return so pending
|
|
213
244
|
// discussions (where isAutoActive may be false) still get recovered.
|
|
214
|
-
if (maybeHandleEmptyIntentTurn(event, isAutoActive()))
|
|
245
|
+
if (maybeHandleEmptyIntentTurn(event, isAutoActive(), basePath))
|
|
215
246
|
return;
|
|
216
247
|
if (!isAutoActive())
|
|
217
248
|
return;
|
|
@@ -230,9 +261,27 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
230
261
|
return;
|
|
231
262
|
}
|
|
232
263
|
if (isBareClaudeCodeStreamAbortPlaceholder(lastMsg)) {
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
264
|
+
if (isSessionSwitchAbortGraceActive()) {
|
|
265
|
+
// Old turn leaking through after a session switch — drop it.
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
// Mid-unit stream abort with no diagnostic. Treat as non-fatal so the loop
|
|
269
|
+
// can continue, but surface it to the user and resolve the in-flight unit.
|
|
270
|
+
ctx.ui.notify("Claude Code stream aborted mid-unit (no diagnostic). Continuing.", "warning");
|
|
271
|
+
try {
|
|
272
|
+
resetRetryState(retryState);
|
|
273
|
+
resolveAgentEnd(event);
|
|
274
|
+
}
|
|
275
|
+
catch (err) {
|
|
276
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
277
|
+
ctx.ui.notify(`Auto-mode error after stream-abort placeholder: ${message}. Stopping auto-mode.`, "error");
|
|
278
|
+
try {
|
|
279
|
+
await pauseAuto(ctx, pi);
|
|
280
|
+
}
|
|
281
|
+
catch (e) {
|
|
282
|
+
logWarning("bootstrap", `pauseAuto failed after stream-abort placeholder: ${e.message}`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
236
285
|
return;
|
|
237
286
|
}
|
|
238
287
|
if (isObjectRecord(lastMsg) && "stopReason" in lastMsg && lastMsg.stopReason === "aborted") {
|
|
@@ -246,7 +295,7 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
246
295
|
// that carry error context — e.g. errorMessage field or non-empty content
|
|
247
296
|
// indicating a mid-stream failure. (#2695)
|
|
248
297
|
const content = "content" in lastMsg ? lastMsg.content : undefined;
|
|
249
|
-
const hasEmptyContent =
|
|
298
|
+
const hasEmptyContent = _hasEmptyAgentEndContent(content);
|
|
250
299
|
const hasErrorMessage = "errorMessage" in lastMsg && !!lastMsg.errorMessage;
|
|
251
300
|
if (hasEmptyContent && !hasErrorMessage) {
|
|
252
301
|
// Non-fatal: treat as a normal agent end so the loop can continue
|
|
@@ -292,6 +341,12 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
292
341
|
// the assistant message text content for display purposes only.
|
|
293
342
|
// Classification still uses rawErrorMsg to avoid false positives from prose.
|
|
294
343
|
const displayMsg = resolveAgentEndErrorDisplay(rawErrorMsg, "content" in lastMsg ? lastMsg.content : undefined);
|
|
344
|
+
if (isAutoCompletionStopInProgress() &&
|
|
345
|
+
isTerminalDeletedWorktreeProviderError(`${rawErrorMsg}\n${displayMsg}`)) {
|
|
346
|
+
resetRetryState(retryState);
|
|
347
|
+
logWarning("bootstrap", `Ignoring stale deleted-worktree provider error during terminal completion reroot: ${displayMsg || rawErrorMsg}`);
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
295
350
|
const errorDetail = displayMsg ? `: ${displayMsg}` : "";
|
|
296
351
|
const explicitRetryAfterMs = ("retryAfterMs" in lastMsg && typeof lastMsg.retryAfterMs === "number") ? lastMsg.retryAfterMs : undefined;
|
|
297
352
|
// ── 1. Classify using rawErrorMsg to avoid prose false-positives ────
|
|
@@ -375,7 +430,7 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
375
430
|
// Core retries transient failures in-session after this handler.
|
|
376
431
|
// Keep that behavior for non-rate-limit classes to avoid pause/retry races,
|
|
377
432
|
// but let rate-limit continue into model fallback logic below (#4373).
|
|
378
|
-
if (
|
|
433
|
+
if (shouldDeferTransientErrorToCoreRetry(cls, rawErrorMsg)) {
|
|
379
434
|
return;
|
|
380
435
|
}
|
|
381
436
|
// Cap rate-limit backoff for CLI-style providers (openai-codex, google-gemini-cli)
|