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
|
@@ -28,6 +28,8 @@ import { createRequire } from "node:module";
|
|
|
28
28
|
import { dirname, join } from "node:path";
|
|
29
29
|
import { PartialMessageBuilder, ZERO_USAGE, mapUsage } from "./partial-builder.js";
|
|
30
30
|
import { buildWorkflowMcpServers } from "../gsd/workflow-mcp.js";
|
|
31
|
+
import { loadProjectGSDPreferences } from "../gsd/preferences.js";
|
|
32
|
+
import { discoverMcpServerNames, computeMcpDisallowedTools } from "../gsd/mcp-filter.js";
|
|
31
33
|
import { showInterviewRound, type Question, type RoundResult } from "../shared/tui.js";
|
|
32
34
|
import type {
|
|
33
35
|
SDKAssistantMessage,
|
|
@@ -249,8 +251,8 @@ export function normalizeClaudePathForSdk(
|
|
|
249
251
|
bundledCliPath: string | null = resolveBundledClaudeCliPath(),
|
|
250
252
|
): string {
|
|
251
253
|
if (platform !== "win32") return resolvedPath;
|
|
252
|
-
if (/\.exe$/i.test(resolvedPath)) return resolvedPath;
|
|
253
|
-
if (bundledCliPath) return bundledCliPath;
|
|
254
|
+
if (/\.exe$/i.test(resolvedPath)) return resolvedPath.replaceAll("\\", "/");
|
|
255
|
+
if (bundledCliPath) return bundledCliPath.replaceAll("\\", "/");
|
|
254
256
|
return resolvedPath;
|
|
255
257
|
}
|
|
256
258
|
|
|
@@ -314,6 +316,21 @@ export function buildPromptFromContext(context: Context): string {
|
|
|
314
316
|
"Do not emit <user_message>, <assistant_message>, or <prior_system_context> tags in your response.",
|
|
315
317
|
];
|
|
316
318
|
|
|
319
|
+
// The prior system context lists pi-native tool names (lowercase: bash, read, gsd_exec, etc.)
|
|
320
|
+
// but this process runs inside Claude Code where tool names differ. Inject a remapping note
|
|
321
|
+
// before the prior context so the model uses correct names regardless of what the prior
|
|
322
|
+
// context describes.
|
|
323
|
+
parts.push(
|
|
324
|
+
"<tool_context>\n" +
|
|
325
|
+
"You are running inside Claude Code. Use these exact tool names — do not use lowercase or pi-native names:\n" +
|
|
326
|
+
"- Shell commands: 'Bash' (not 'bash')\n" +
|
|
327
|
+
"- File operations: 'Read', 'Write', 'Edit', 'Glob', 'Grep' (PascalCase, not lowercase)\n" +
|
|
328
|
+
"- GSD workflow tools (gsd_exec, gsd_slice_complete, gsd_task_complete, gsd_plan_slice, etc.) " +
|
|
329
|
+
"are MCP tools — call them as mcp__gsd-workflow__<tool_name> " +
|
|
330
|
+
"(e.g. mcp__gsd-workflow__gsd_exec, mcp__gsd-workflow__gsd_slice_complete)\n" +
|
|
331
|
+
"</tool_context>",
|
|
332
|
+
);
|
|
333
|
+
|
|
317
334
|
if (context.systemPrompt) {
|
|
318
335
|
parts.push(`<prior_system_context>\n${context.systemPrompt}\n</prior_system_context>`);
|
|
319
336
|
}
|
|
@@ -426,7 +443,7 @@ function makeErrorMessage(model: string, errorMsg: string): AssistantMessage {
|
|
|
426
443
|
|
|
427
444
|
export function isClaudeCodeAbortErrorMessage(message: string | undefined | null): boolean {
|
|
428
445
|
if (!message) return false;
|
|
429
|
-
return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
|
|
446
|
+
return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user|aborterror)\b/i.test(message);
|
|
430
447
|
}
|
|
431
448
|
|
|
432
449
|
function isBareClaudeCodeAbortErrorMessage(message: string | undefined | null): boolean {
|
|
@@ -1317,13 +1334,42 @@ export function buildSdkOptions(
|
|
|
1317
1334
|
const sdkCwd = typeof cwd === "string" && cwd.trim().length > 0 ? cwd : process.cwd();
|
|
1318
1335
|
const mcpServers = buildWorkflowMcpServers(sdkCwd);
|
|
1319
1336
|
const permissionMode = overrides?.permissionMode ?? "bypassPermissions";
|
|
1337
|
+
|
|
1338
|
+
const preferences = loadProjectGSDPreferences(sdkCwd);
|
|
1339
|
+
const mcpConfig = preferences?.preferences.claude_code_mcp;
|
|
1340
|
+
const workflowServerName = mcpServers ? Object.keys(mcpServers)[0] : undefined;
|
|
1341
|
+
|
|
1342
|
+
// Always discover project MCPs — needed for both duplicate detection and filtering.
|
|
1343
|
+
const discovered = discoverMcpServerNames(sdkCwd);
|
|
1344
|
+
|
|
1345
|
+
// If the workflow MCP is already declared in the project's .mcp.json or
|
|
1346
|
+
// .claude/settings.json, do not inject it again via mcpServers. Passing the
|
|
1347
|
+
// same server name from two sources causes a duplicate registration conflict
|
|
1348
|
+
// that prevents the MCP server from loading (tools become unavailable).
|
|
1349
|
+
const workflowAlreadyInProject = workflowServerName !== undefined && discovered.includes(workflowServerName);
|
|
1350
|
+
let filteredMcpServers = workflowAlreadyInProject ? undefined : mcpServers;
|
|
1351
|
+
let extraDisallowedTools: string[] = [];
|
|
1352
|
+
let workflowExplicitlyBlocked = false;
|
|
1353
|
+
|
|
1354
|
+
if (mcpConfig) {
|
|
1355
|
+
extraDisallowedTools = computeMcpDisallowedTools(modelId, mcpConfig, discovered, workflowServerName);
|
|
1356
|
+
if (workflowServerName && extraDisallowedTools.includes(`mcp__${workflowServerName}__*`)) {
|
|
1357
|
+
filteredMcpServers = undefined;
|
|
1358
|
+
workflowExplicitlyBlocked = true;
|
|
1359
|
+
}
|
|
1360
|
+
}
|
|
1361
|
+
|
|
1320
1362
|
// Globally unblock the tools GSD expects Claude Code to run. When the
|
|
1321
1363
|
// workflow MCP server is available, prefer its `ask_user_questions` tool over
|
|
1322
1364
|
// Claude Code's native `AskUserQuestion`; the MCP path carries stable IDs and
|
|
1323
1365
|
// routes responses through the GSD elicitation bridge.
|
|
1324
1366
|
// Opt back into gated mode with GSD_CLAUDE_CODE_PERMISSION_MODE=acceptEdits.
|
|
1325
|
-
|
|
1326
|
-
|
|
1367
|
+
// Include the workflow pattern in allowedTools whether the server is GSD-injected
|
|
1368
|
+
// or declared in the project config — but not if explicitly blocked by user prefs.
|
|
1369
|
+
const workflowMcpTools = filteredMcpServers
|
|
1370
|
+
? Object.keys(filteredMcpServers).map((serverName) => `mcp__${serverName}__*`)
|
|
1371
|
+
: (!workflowExplicitlyBlocked && workflowServerName ? [`mcp__${workflowServerName}__*`] : []);
|
|
1372
|
+
const disallowedTools: string[] = [...(workflowMcpTools.length > 0 ? ["AskUserQuestion"] : []), ...extraDisallowedTools];
|
|
1327
1373
|
const allowedTools = [
|
|
1328
1374
|
"Read",
|
|
1329
1375
|
"Write",
|
|
@@ -1363,7 +1409,7 @@ export function buildSdkOptions(
|
|
|
1363
1409
|
systemPrompt: { type: "preset", preset: "claude_code" },
|
|
1364
1410
|
disallowedTools,
|
|
1365
1411
|
...(allowedTools.length > 0 ? { allowedTools } : {}),
|
|
1366
|
-
...(
|
|
1412
|
+
...(filteredMcpServers ? { mcpServers: filteredMcpServers } : {}),
|
|
1367
1413
|
betas: (modelId.includes("sonnet") || modelId.includes("opus-4-7") || modelId.includes("opus-4.7")) ? ["context-1m-2025-08-07"] : [],
|
|
1368
1414
|
...(thinkingConfig ?? {}),
|
|
1369
1415
|
...(effort ? { effort } : {}),
|
|
@@ -1,7 +1,24 @@
|
|
|
1
1
|
import { describe, test } from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
-
import { mapContentBlock, parseMcpToolName, PartialMessageBuilder } from "../partial-builder.ts";
|
|
4
|
-
import type { BetaContentBlock, BetaRawMessageStreamEvent } from "../sdk-types.ts";
|
|
3
|
+
import { mapContentBlock, mapUsage, parseMcpToolName, PartialMessageBuilder } from "../partial-builder.ts";
|
|
4
|
+
import type { BetaContentBlock, BetaRawMessageStreamEvent, NonNullableUsage } from "../sdk-types.ts";
|
|
5
|
+
|
|
6
|
+
describe("mapUsage", () => {
|
|
7
|
+
test("excludes cumulative cache reads from context-sized totalTokens (#5243)", () => {
|
|
8
|
+
const usage: NonNullableUsage = {
|
|
9
|
+
input_tokens: 150_000,
|
|
10
|
+
output_tokens: 2_000,
|
|
11
|
+
cache_read_input_tokens: 900_000,
|
|
12
|
+
cache_creation_input_tokens: 3_000,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const mapped = mapUsage(usage, 1.23);
|
|
16
|
+
|
|
17
|
+
assert.equal(mapped.cacheRead, 900_000);
|
|
18
|
+
assert.equal(mapped.totalTokens, 155_000);
|
|
19
|
+
assert.equal(mapped.cost.total, 1.23);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
5
22
|
|
|
6
23
|
describe("PartialMessageBuilder — malformed tool arguments (#2574)", () => {
|
|
7
24
|
/**
|
|
@@ -54,6 +54,8 @@ const WORKFLOW_MCP_ENV_KEYS = [
|
|
|
54
54
|
"GSD_WORKFLOW_MCP_ARGS",
|
|
55
55
|
"GSD_WORKFLOW_MCP_ENV",
|
|
56
56
|
"GSD_WORKFLOW_MCP_CWD",
|
|
57
|
+
"GSD_PROJECT_ROOT",
|
|
58
|
+
"GSD_WORKFLOW_PROJECT_ROOT",
|
|
57
59
|
] as const;
|
|
58
60
|
|
|
59
61
|
type WorkflowMcpEnvKey = (typeof WORKFLOW_MCP_ENV_KEYS)[number];
|
|
@@ -64,6 +66,9 @@ function setWorkflowMcpEnv(
|
|
|
64
66
|
const prev: Partial<Record<WorkflowMcpEnvKey, string | undefined>> = {};
|
|
65
67
|
for (const key of WORKFLOW_MCP_ENV_KEYS) {
|
|
66
68
|
prev[key] = process.env[key];
|
|
69
|
+
// Clear all managed keys so tests run in a clean env state.
|
|
70
|
+
// Keys present in `values` are set to the desired test value below.
|
|
71
|
+
delete process.env[key];
|
|
67
72
|
}
|
|
68
73
|
for (const [key, value] of Object.entries(values)) {
|
|
69
74
|
process.env[key] = value;
|
|
@@ -978,6 +983,39 @@ describe("stream-adapter — session persistence (#2859)", () => {
|
|
|
978
983
|
}
|
|
979
984
|
});
|
|
980
985
|
|
|
986
|
+
test("buildSdkOptions does not inject workflow MCP when already declared in project .mcp.json (avoids duplicate registration)", () => {
|
|
987
|
+
const restore = setWorkflowMcpEnv({
|
|
988
|
+
GSD_WORKFLOW_MCP_COMMAND: "node",
|
|
989
|
+
GSD_WORKFLOW_MCP_NAME: "gsd-workflow",
|
|
990
|
+
GSD_WORKFLOW_MCP_ARGS: JSON.stringify(["packages/mcp-server/dist/cli.js"]),
|
|
991
|
+
GSD_WORKFLOW_MCP_ENV: JSON.stringify({ GSD_CLI_PATH: "/tmp/gsd" }),
|
|
992
|
+
GSD_WORKFLOW_MCP_CWD: "/tmp/project",
|
|
993
|
+
});
|
|
994
|
+
const originalCwd = process.cwd();
|
|
995
|
+
const projectDir = mkdtempSync(join(tmpdir(), "claude-mcp-dup-"));
|
|
996
|
+
try {
|
|
997
|
+
// Simulate a project that already has gsd-workflow in its .mcp.json
|
|
998
|
+
writeFileSync(
|
|
999
|
+
join(projectDir, ".mcp.json"),
|
|
1000
|
+
JSON.stringify({ mcpServers: { "gsd-workflow": { command: "node", args: ["old-cli.js"] }, "other-mcp": { command: "npx", args: ["other"] } } }),
|
|
1001
|
+
);
|
|
1002
|
+
process.chdir(projectDir);
|
|
1003
|
+
const options = buildSdkOptions("claude-sonnet-4-20250514", "test");
|
|
1004
|
+
// Should NOT inject gsd-workflow via mcpServers (project already has it)
|
|
1005
|
+
assert.equal(options.mcpServers, undefined, "mcpServers should be omitted when workflow already in .mcp.json");
|
|
1006
|
+
// But allowedTools should still include the workflow pattern
|
|
1007
|
+
const allowedTools = options.allowedTools as string[];
|
|
1008
|
+
assert.ok(allowedTools.includes("mcp__gsd-workflow__*"), "allowedTools must include workflow pattern even when not injected");
|
|
1009
|
+
// AskUserQuestion should be disallowed (workflow is available via project config)
|
|
1010
|
+
const disallowedTools = options.disallowedTools as string[];
|
|
1011
|
+
assert.ok(disallowedTools.includes("AskUserQuestion"), "AskUserQuestion should be suppressed when workflow is available");
|
|
1012
|
+
} finally {
|
|
1013
|
+
process.chdir(originalCwd);
|
|
1014
|
+
rmSync(projectDir, { recursive: true, force: true });
|
|
1015
|
+
restore();
|
|
1016
|
+
}
|
|
1017
|
+
});
|
|
1018
|
+
|
|
981
1019
|
test("buildSdkOptions preserves runtime callbacks such as onElicitation", () => {
|
|
982
1020
|
const restore = setWorkflowMcpEnv({});
|
|
983
1021
|
const onElicitation = async () => ({ action: "decline" as const });
|
|
@@ -1258,9 +1296,18 @@ describe("stream-adapter — abort classification (F2)", () => {
|
|
|
1258
1296
|
test("recognizes Claude Code SDK abort exceptions", () => {
|
|
1259
1297
|
assert.equal(isClaudeCodeAbortErrorMessage("Claude Code process aborted by user"), true);
|
|
1260
1298
|
assert.equal(isClaudeCodeAbortErrorMessage("Request aborted by user"), true);
|
|
1299
|
+
assert.equal(isClaudeCodeAbortErrorMessage("AbortError: The operation was aborted"), true);
|
|
1261
1300
|
assert.equal(isClaudeCodeAbortErrorMessage("rate limit exceeded"), false);
|
|
1262
1301
|
});
|
|
1263
1302
|
|
|
1303
|
+
test("does not misclassify non-user abort contexts", () => {
|
|
1304
|
+
assert.equal(isClaudeCodeAbortErrorMessage("Job aborted due to timeout"), false);
|
|
1305
|
+
assert.equal(isClaudeCodeAbortErrorMessage("Operation aborted: disk full"), false);
|
|
1306
|
+
assert.equal(isClaudeCodeAbortErrorMessage("aborted by system cleanup"), false);
|
|
1307
|
+
assert.equal(isClaudeCodeAbortErrorMessage("Database transaction aborted due to constraint violation"), false);
|
|
1308
|
+
assert.equal(isClaudeCodeAbortErrorMessage("Connection aborted unexpectedly"), false);
|
|
1309
|
+
});
|
|
1310
|
+
|
|
1264
1311
|
test("makeAbortedMessage sets stopReason to 'aborted', not 'error'", () => {
|
|
1265
1312
|
const message = makeAbortedMessage("claude-sonnet-4-6", "");
|
|
1266
1313
|
assert.equal(message.stopReason, "aborted");
|
|
@@ -1459,8 +1506,8 @@ describe("stream-adapter — Windows Claude path lookup (#3770)", () => {
|
|
|
1459
1506
|
test("normalizeClaudePathForSdk swaps Windows shim paths to bundled cli.js", () => {
|
|
1460
1507
|
const shimPath = "C:\\Users\\djeff\\AppData\\Roaming\\npm\\claude";
|
|
1461
1508
|
const bundled = "C:\\repo\\node_modules\\@anthropic-ai\\claude-agent-sdk\\cli.js";
|
|
1462
|
-
assert.equal(normalizeClaudePathForSdk(shimPath, "win32", bundled),
|
|
1463
|
-
assert.equal(normalizeClaudePathForSdk("C:\\Program Files\\Claude\\claude.exe", "win32", bundled), "C
|
|
1509
|
+
assert.equal(normalizeClaudePathForSdk(shimPath, "win32", bundled), "C:/repo/node_modules/@anthropic-ai/claude-agent-sdk/cli.js");
|
|
1510
|
+
assert.equal(normalizeClaudePathForSdk("C:\\Program Files\\Claude\\claude.exe", "win32", bundled), "C:/Program Files/Claude/claude.exe");
|
|
1464
1511
|
});
|
|
1465
1512
|
|
|
1466
1513
|
test("resolveBundledClaudeCliPath returns a .js path when SDK package is present", () => {
|
|
@@ -374,6 +374,12 @@ export class CmuxClient {
|
|
|
374
374
|
const stdout = await this.runAsync(["send-surface", "--surface", surfaceId, payload]);
|
|
375
375
|
return stdout !== null;
|
|
376
376
|
}
|
|
377
|
+
|
|
378
|
+
// Send Ctrl-C (ETX) to a surface to interrupt the running command.
|
|
379
|
+
async sendInterrupt(surfaceId: string): Promise<boolean> {
|
|
380
|
+
const stdout = await this.runAsync(["send-surface", "--surface", surfaceId, "\x03"]);
|
|
381
|
+
return stdout !== null;
|
|
382
|
+
}
|
|
377
383
|
}
|
|
378
384
|
|
|
379
385
|
export function syncCmuxSidebar(preferences: CmuxPreferences | undefined, state: CmuxState): void {
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import type { GSDState } from "../types.js";
|
|
5
5
|
import type { MinimalModelRegistry } from "../context-budget.js";
|
|
6
|
+
import type { AutoSession } from "./session.js";
|
|
6
7
|
|
|
7
8
|
export interface AutoSessionContext {
|
|
8
9
|
basePath: string;
|
|
@@ -22,6 +23,8 @@ export interface AutoStatus {
|
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
export type AutoAdvanceResult =
|
|
26
|
+
| { kind: "started" }
|
|
27
|
+
| { kind: "resumed" }
|
|
25
28
|
| { kind: "advanced"; unit: UnitRef; stateSnapshot: GSDState }
|
|
26
29
|
| { kind: "blocked"; reason: string; action: "pause" | "stop"; stateSnapshot?: GSDState }
|
|
27
30
|
| { kind: "stopped"; reason: string; stateSnapshot?: GSDState }
|
|
@@ -39,6 +42,8 @@ export interface AutoOrchestrationModule {
|
|
|
39
42
|
export interface DispatchAdapter {
|
|
40
43
|
decideNextUnit(input: {
|
|
41
44
|
stateSnapshot: GSDState;
|
|
45
|
+
/** Optional live session context, forwarded to dispatch rules that need session-derived state. */
|
|
46
|
+
session?: AutoSession;
|
|
42
47
|
/** Mirrors `DispatchContext.structuredQuestionsAvailable` — "true"/"false" string per the dispatch contract. */
|
|
43
48
|
structuredQuestionsAvailable?: "true" | "false";
|
|
44
49
|
/** Session model context window in tokens, forwarded to the budget engine. */
|
|
@@ -47,12 +52,20 @@ export interface DispatchAdapter {
|
|
|
47
52
|
sessionProvider?: string;
|
|
48
53
|
/** Model registry for executor-model lookups inside the budget engine. */
|
|
49
54
|
modelRegistry?: MinimalModelRegistry;
|
|
50
|
-
}): Promise<
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
55
|
+
}): Promise<
|
|
56
|
+
| {
|
|
57
|
+
kind: "blocked";
|
|
58
|
+
reason: string;
|
|
59
|
+
action: "pause" | "stop";
|
|
60
|
+
}
|
|
61
|
+
| {
|
|
62
|
+
unitType: string;
|
|
63
|
+
unitId: string;
|
|
64
|
+
reason: string;
|
|
65
|
+
preconditions: string[];
|
|
66
|
+
}
|
|
67
|
+
| null
|
|
68
|
+
>;
|
|
56
69
|
}
|
|
57
70
|
|
|
58
71
|
export interface RecoveryAdapter {
|
|
@@ -57,6 +57,7 @@ function retryBudgetSuppresses(unitKey: string): boolean {
|
|
|
57
57
|
*/
|
|
58
58
|
export function detectStuck(
|
|
59
59
|
window: readonly WindowEntry[],
|
|
60
|
+
_retryContext?: { pendingRetry?: boolean; retryAttempt?: number },
|
|
60
61
|
): { stuck: true; reason: string } | null {
|
|
61
62
|
if (window.length < 2) return null;
|
|
62
63
|
|
|
@@ -7,9 +7,14 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
* Error codes indicating infrastructure failures
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* Error codes indicating infrastructure-level failures from the OS,
|
|
11
|
+
* filesystem, or network. This set includes permanent resource failures
|
|
12
|
+
* (ENOSPC, ENOMEM, EROFS), transient resource exhaustion (EAGAIN, ENOBUFS),
|
|
13
|
+
* and network/offline errors (ECONNREFUSED, ENOTFOUND, ENETUNREACH).
|
|
14
|
+
*
|
|
15
|
+
* Transient git failures are retried separately through
|
|
16
|
+
* TRANSIENT_GIT_RETRY_CODES in native-git-bridge.ts before escalating to the
|
|
17
|
+
* auto-loop.
|
|
13
18
|
*/
|
|
14
19
|
export const INFRA_ERROR_CODES: ReadonlySet<string> = new Set([
|
|
15
20
|
"ENOSPC", // disk full
|
|
@@ -19,6 +24,7 @@ export const INFRA_ERROR_CODES: ReadonlySet<string> = new Set([
|
|
|
19
24
|
"EMFILE", // too many open files (process)
|
|
20
25
|
"ENFILE", // too many open files (system)
|
|
21
26
|
"EAGAIN", // resource temporarily unavailable (resource exhaustion)
|
|
27
|
+
"ENOBUFS", // no buffer space available (transient pipe exhaustion)
|
|
22
28
|
"ECONNREFUSED", // connection refused (offline / local server down)
|
|
23
29
|
"ENOTFOUND", // DNS lookup failed (offline / no network)
|
|
24
30
|
"ENETUNREACH", // network unreachable (offline / no route)
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Main auto-mode execution loop.
|
|
1
3
|
/**
|
|
2
4
|
* auto/loop.ts — Main auto-mode execution loop.
|
|
3
5
|
*
|
|
@@ -24,6 +26,7 @@ import {
|
|
|
24
26
|
runDispatch,
|
|
25
27
|
runGuards,
|
|
26
28
|
runFinalize,
|
|
29
|
+
STUCK_WINDOW_SIZE,
|
|
27
30
|
} from "./phases.js";
|
|
28
31
|
import { debugLog } from "../debug-logger.js";
|
|
29
32
|
import { isInfrastructureError, isTransientCooldownError, getCooldownRetryAfterMs, COOLDOWN_FALLBACK_WAIT_MS, MAX_COOLDOWN_RETRIES } from "./infra-errors.js";
|
|
@@ -78,7 +81,10 @@ import { createWorkflowTurnReporter } from "./workflow-turn-reporter.js";
|
|
|
78
81
|
import { validateWorkflowSessionLock } from "./workflow-session-lock.js";
|
|
79
82
|
import { dequeueSidecarItem } from "./workflow-sidecar-queue.js";
|
|
80
83
|
import { maintainWorkerHeartbeat } from "./workflow-worker-heartbeat.js";
|
|
81
|
-
import {
|
|
84
|
+
import {
|
|
85
|
+
measureMemoryPressure,
|
|
86
|
+
shouldCheckMemoryPressure,
|
|
87
|
+
} from "./workflow-memory-pressure.js";
|
|
82
88
|
import { buildSidecarIterationData } from "./workflow-sidecar-iteration.js";
|
|
83
89
|
import {
|
|
84
90
|
createExecutionGraphUnitDispatchDeps,
|
|
@@ -106,7 +112,6 @@ import { handleCustomEngineReconcileOutcome } from "./workflow-custom-engine-rec
|
|
|
106
112
|
// helpers degrade to the empty-state fallback that #3704 already
|
|
107
113
|
// tolerates — same behavior as a fresh session.
|
|
108
114
|
const STUCK_RECOVERY_ATTEMPTS_KEY = "stuck_recovery_attempts";
|
|
109
|
-
const RECENT_UNIT_KEYS_LIMIT = 20;
|
|
110
115
|
|
|
111
116
|
function stableStuckStateScopeId(s: AutoSession): string {
|
|
112
117
|
return normalizeRealPath(s.scope?.workspace.projectRoot ?? (s.originalBasePath || s.basePath));
|
|
@@ -116,7 +121,7 @@ function loadStuckState(s: AutoSession): { recentUnits: Array<{ key: string }>;
|
|
|
116
121
|
const scopeId = stableStuckStateScopeId(s);
|
|
117
122
|
if (!scopeId) return { recentUnits: [], stuckRecoveryAttempts: 0 };
|
|
118
123
|
try {
|
|
119
|
-
const recentUnits = getRecentUnitKeysForProjectRoot(scopeId,
|
|
124
|
+
const recentUnits = getRecentUnitKeysForProjectRoot(scopeId, STUCK_WINDOW_SIZE);
|
|
120
125
|
const stuckRecoveryAttempts =
|
|
121
126
|
getRuntimeKv<number>("global", scopeId, STUCK_RECOVERY_ATTEMPTS_KEY) ?? 0;
|
|
122
127
|
return { recentUnits, stuckRecoveryAttempts };
|
|
@@ -203,9 +208,9 @@ function logCustomVerifyRetrySaveFailure(err: unknown): void {
|
|
|
203
208
|
}
|
|
204
209
|
|
|
205
210
|
// ── Memory pressure monitoring (#3331) ──────────────────────────────────
|
|
206
|
-
// Check heap usage every N iterations and trigger
|
|
207
|
-
// the OS OOM killer sends SIGKILL. The threshold is
|
|
208
|
-
// limit (--max-old-space-size or default ~1.5-4GB depending on platform).
|
|
211
|
+
// Check heap usage on session startup, then every N iterations, and trigger
|
|
212
|
+
// graceful shutdown before the OS OOM killer sends SIGKILL. The threshold is
|
|
213
|
+
// 90% of the V8 heap limit (--max-old-space-size or default ~1.5-4GB depending on platform).
|
|
209
214
|
const MEMORY_CHECK_INTERVAL = 5; // check every 5 iterations
|
|
210
215
|
const MAX_CUSTOM_ENGINE_VERIFY_RETRIES = 3;
|
|
211
216
|
|
|
@@ -281,6 +286,9 @@ export async function autoLoop(
|
|
|
281
286
|
recentUnits: persisted.recentUnits,
|
|
282
287
|
stuckRecoveryAttempts: persisted.stuckRecoveryAttempts,
|
|
283
288
|
consecutiveFinalizeTimeouts: 0,
|
|
289
|
+
consecutiveDispatchCount: new Map<string, number>(),
|
|
290
|
+
lastDispatchedKey: null,
|
|
291
|
+
lastDispatchPhase: null,
|
|
284
292
|
};
|
|
285
293
|
let consecutiveErrors = 0;
|
|
286
294
|
let consecutiveCooldowns = 0;
|
|
@@ -372,7 +380,7 @@ export async function autoLoop(
|
|
|
372
380
|
|
|
373
381
|
// ── Memory pressure check (#3331) ──
|
|
374
382
|
// Graceful shutdown before OOM killer sends SIGKILL.
|
|
375
|
-
if (iteration
|
|
383
|
+
if (shouldCheckMemoryPressure(iteration, MEMORY_CHECK_INTERVAL)) {
|
|
376
384
|
const mem = measureMemoryPressure();
|
|
377
385
|
debugLog("autoLoop", { phase: "memory-check", ...mem });
|
|
378
386
|
const memoryDecision = decideMemoryPressure({ ...mem, iteration });
|
|
@@ -418,9 +426,11 @@ export async function autoLoop(
|
|
|
418
426
|
logIterationComplete: () => debugLog("autoLoop", { phase: "iteration-complete", iteration }),
|
|
419
427
|
});
|
|
420
428
|
};
|
|
429
|
+
let stuckStatePersistedThisIteration = false;
|
|
421
430
|
const finishIncompleteIteration = (details: Record<string, unknown>): void => {
|
|
422
431
|
emitIterationEnd(details);
|
|
423
432
|
saveStuckState(s, loopState);
|
|
433
|
+
stuckStatePersistedThisIteration = true;
|
|
424
434
|
};
|
|
425
435
|
|
|
426
436
|
try {
|
|
@@ -726,42 +736,98 @@ export async function autoLoop(
|
|
|
726
736
|
}
|
|
727
737
|
|
|
728
738
|
if (!sidecarItem) {
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
739
|
+
const orchestration = s.orchestration;
|
|
740
|
+
if (orchestration) {
|
|
741
|
+
const existingPendingDispatch = s.pendingOrchestrationDispatch;
|
|
742
|
+
const orchestrationResult = existingPendingDispatch
|
|
743
|
+
? {
|
|
744
|
+
kind: "advanced" as const,
|
|
745
|
+
unit: {
|
|
746
|
+
unitType: existingPendingDispatch.unitType,
|
|
747
|
+
unitId: existingPendingDispatch.unitId,
|
|
748
|
+
},
|
|
749
|
+
stateSnapshot: existingPendingDispatch.state,
|
|
750
|
+
}
|
|
751
|
+
: await orchestration.advance();
|
|
740
752
|
|
|
741
|
-
|
|
753
|
+
if (orchestrationResult.kind === "blocked") {
|
|
754
|
+
s.pendingOrchestrationDispatch = null;
|
|
755
|
+
if (orchestrationResult.action === "pause") {
|
|
756
|
+
await deps.pauseAuto(ctx, pi, {
|
|
757
|
+
message: orchestrationResult.reason,
|
|
758
|
+
category: "unknown",
|
|
759
|
+
});
|
|
760
|
+
} else {
|
|
761
|
+
await deps.stopAuto(ctx, pi, orchestrationResult.reason);
|
|
762
|
+
}
|
|
763
|
+
finishTurn("stopped", "manual-attention", "orchestration-blocked");
|
|
764
|
+
break;
|
|
765
|
+
}
|
|
742
766
|
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
}
|
|
767
|
+
if (orchestrationResult.kind === "stopped") {
|
|
768
|
+
s.pendingOrchestrationDispatch = null;
|
|
769
|
+
await deps.stopAuto(ctx, pi, orchestrationResult.reason);
|
|
770
|
+
finishTurn("stopped", "manual-attention", "orchestration-stopped");
|
|
771
|
+
break;
|
|
772
|
+
}
|
|
750
773
|
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
774
|
+
if (orchestrationResult.kind !== "advanced") {
|
|
775
|
+
s.pendingOrchestrationDispatch = null;
|
|
776
|
+
finishTurn("skipped");
|
|
777
|
+
continue;
|
|
778
|
+
}
|
|
779
|
+
const pendingDispatch = s.pendingOrchestrationDispatch;
|
|
780
|
+
iterData = {
|
|
781
|
+
unitType: pendingDispatch?.unitType ?? orchestrationResult.unit.unitType,
|
|
782
|
+
unitId: pendingDispatch?.unitId ?? orchestrationResult.unit.unitId,
|
|
783
|
+
prompt: pendingDispatch?.prompt ?? "",
|
|
784
|
+
finalPrompt: pendingDispatch?.prompt ?? "",
|
|
785
|
+
pauseAfterUatDispatch: pendingDispatch?.pauseAfterUatDispatch ?? false,
|
|
786
|
+
state: pendingDispatch?.state ?? orchestrationResult.stateSnapshot,
|
|
787
|
+
mid: pendingDispatch?.mid ?? s.currentMilestoneId ?? "workflow",
|
|
788
|
+
midTitle: pendingDispatch?.midTitle ?? orchestrationResult.stateSnapshot.activeMilestone?.title ?? "Workflow",
|
|
789
|
+
isRetry: false,
|
|
790
|
+
previousTier: undefined,
|
|
791
|
+
};
|
|
792
|
+
s.pendingOrchestrationDispatch = null;
|
|
793
|
+
phaseReporter.report("dispatch", "next", {
|
|
794
|
+
unitType: iterData.unitType,
|
|
795
|
+
unitId: iterData.unitId,
|
|
796
|
+
});
|
|
797
|
+
observedUnitType = iterData.unitType;
|
|
798
|
+
observedUnitId = iterData.unitId;
|
|
799
|
+
} else {
|
|
800
|
+
const preDispatchResult = await runPreDispatch(ic, loopState);
|
|
801
|
+
phaseReporter.report("pre-dispatch", preDispatchResult.action);
|
|
802
|
+
if (preDispatchResult.action === "break") {
|
|
803
|
+
finishTurn("stopped", "manual-attention", "pre-dispatch-break");
|
|
804
|
+
break;
|
|
805
|
+
}
|
|
806
|
+
if (preDispatchResult.action === "continue") {
|
|
807
|
+
finishTurn("skipped");
|
|
808
|
+
continue;
|
|
809
|
+
}
|
|
810
|
+
const preData = preDispatchResult.data;
|
|
811
|
+
const guardsResult = await runGuards(ic, preData.mid);
|
|
812
|
+
phaseReporter.report("guard", guardsResult.action);
|
|
813
|
+
if (guardsResult.action === "break") {
|
|
814
|
+
finishTurn("stopped", "manual-attention", "guard-break");
|
|
815
|
+
break;
|
|
816
|
+
}
|
|
817
|
+
const dispatchResult = await runDispatch(ic, preData, loopState);
|
|
818
|
+
phaseReporter.report("dispatch", dispatchResult.action);
|
|
819
|
+
if (dispatchResult.action === "break") {
|
|
820
|
+
finishTurn("stopped", "manual-attention", "dispatch-break");
|
|
821
|
+
break;
|
|
822
|
+
}
|
|
823
|
+
if (dispatchResult.action === "continue") {
|
|
824
|
+
finishTurn("skipped");
|
|
825
|
+
continue;
|
|
826
|
+
}
|
|
827
|
+
iterData = dispatchResult.data;
|
|
828
|
+
observedUnitType = iterData.unitType;
|
|
829
|
+
observedUnitId = iterData.unitId;
|
|
761
830
|
}
|
|
762
|
-
iterData = dispatchResult.data;
|
|
763
|
-
observedUnitType = iterData.unitType;
|
|
764
|
-
observedUnitId = iterData.unitId;
|
|
765
831
|
} else {
|
|
766
832
|
iterData = await buildSidecarIterationData({
|
|
767
833
|
sidecarItem,
|
|
@@ -942,11 +1008,18 @@ export async function autoLoop(
|
|
|
942
1008
|
unitId: iterData.unitId,
|
|
943
1009
|
});
|
|
944
1010
|
const finalizeReason = finalizeResult.action === "break" ? finalizeResult.reason : undefined;
|
|
1011
|
+
const finalizeStatus = finalizeReason === "step-wizard"
|
|
1012
|
+
? "completed"
|
|
1013
|
+
: finalizeResult.action === "next"
|
|
1014
|
+
? "completed"
|
|
1015
|
+
: finalizeResult.action === "continue"
|
|
1016
|
+
? "retry"
|
|
1017
|
+
: "stopped";
|
|
945
1018
|
journalReporter.emit("post-unit-finalize-end", {
|
|
946
1019
|
iteration,
|
|
947
1020
|
unitType: iterData.unitType,
|
|
948
1021
|
unitId: iterData.unitId,
|
|
949
|
-
status:
|
|
1022
|
+
status: finalizeStatus,
|
|
950
1023
|
action: finalizeResult.action,
|
|
951
1024
|
...(finalizeReason ? { reason: finalizeReason } : {}),
|
|
952
1025
|
});
|
|
@@ -980,6 +1053,7 @@ export async function autoLoop(
|
|
|
980
1053
|
finishIncompleteIteration({
|
|
981
1054
|
status: "retry",
|
|
982
1055
|
reason: "finalize-retry",
|
|
1056
|
+
retry: true,
|
|
983
1057
|
unitType: iterData.unitType,
|
|
984
1058
|
unitId: iterData.unitId,
|
|
985
1059
|
});
|
|
@@ -992,7 +1066,12 @@ export async function autoLoop(
|
|
|
992
1066
|
logWriteFailure: logDispatchLedgerWriteFailure,
|
|
993
1067
|
}) || dispatchSettled;
|
|
994
1068
|
completeIteration();
|
|
1069
|
+
stuckStatePersistedThisIteration = true;
|
|
995
1070
|
finishTurn("completed");
|
|
1071
|
+
if (finalizeDecision.action === "complete-and-break") {
|
|
1072
|
+
s.preserveStepSurfaceAfterLoopExit = true;
|
|
1073
|
+
break;
|
|
1074
|
+
}
|
|
996
1075
|
} catch (loopErr) {
|
|
997
1076
|
// ── Blanket catch: absorb unexpected exceptions, apply graduated recovery ──
|
|
998
1077
|
const msg = loopErr instanceof Error ? loopErr.message : String(loopErr);
|
|
@@ -1139,6 +1218,10 @@ export async function autoLoop(
|
|
|
1139
1218
|
ctx.ui.notify(errorDecision.notifyMessage, "warning");
|
|
1140
1219
|
}
|
|
1141
1220
|
finishTurn(errorDecision.turnStatus, "execution", msg);
|
|
1221
|
+
} finally {
|
|
1222
|
+
if (!stuckStatePersistedThisIteration) {
|
|
1223
|
+
saveStuckState(s, loopState);
|
|
1224
|
+
}
|
|
1142
1225
|
}
|
|
1143
1226
|
}
|
|
1144
1227
|
|
|
@@ -37,7 +37,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
37
37
|
this.bumpTransition();
|
|
38
38
|
await this.deps.runtime.journalTransition({ name: "start" });
|
|
39
39
|
await this.deps.notifications.notifyLifecycle({ name: "start" });
|
|
40
|
-
return
|
|
40
|
+
return { kind: "started" };
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
public async advance(): Promise<AutoAdvanceResult> {
|
|
@@ -54,7 +54,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
54
54
|
rationale: "resource version guard blocked dispatch",
|
|
55
55
|
findings: staleMsg,
|
|
56
56
|
});
|
|
57
|
-
const blocked: AutoAdvanceResult = { kind: "blocked", reason: staleMsg, action: "
|
|
57
|
+
const blocked: AutoAdvanceResult = { kind: "blocked", reason: staleMsg, action: "pause" };
|
|
58
58
|
await this.deps.runtime.journalTransition({ name: "advance-blocked", reason: blocked.reason });
|
|
59
59
|
await this.deps.health.postAdvanceRecord(blocked);
|
|
60
60
|
return blocked;
|
|
@@ -128,6 +128,17 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
128
128
|
await this.deps.health.postAdvanceRecord(stopped);
|
|
129
129
|
return stopped;
|
|
130
130
|
}
|
|
131
|
+
if (!("unitType" in decision)) {
|
|
132
|
+
const blocked: AutoAdvanceResult = {
|
|
133
|
+
kind: "blocked",
|
|
134
|
+
reason: decision.reason,
|
|
135
|
+
action: decision.action,
|
|
136
|
+
stateSnapshot: reconciliation.stateSnapshot,
|
|
137
|
+
};
|
|
138
|
+
await this.deps.runtime.journalTransition({ name: "advance-blocked", reason: blocked.reason });
|
|
139
|
+
await this.deps.health.postAdvanceRecord(blocked);
|
|
140
|
+
return blocked;
|
|
141
|
+
}
|
|
131
142
|
|
|
132
143
|
const nextKey = `${decision.unitType}:${decision.unitId}`;
|
|
133
144
|
|
|
@@ -148,7 +159,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
148
159
|
// stuck-loop for the saturated-window case.
|
|
149
160
|
const matchingCount = this.dispatchKeyWindow.filter((k) => k === nextKey).length;
|
|
150
161
|
if (this.lastAdvanceKey === nextKey && matchingCount < STUCK_WINDOW_SIZE) {
|
|
151
|
-
const blocked: AutoAdvanceResult = { kind: "blocked", reason: "idempotent advance: unit already active", action: "
|
|
162
|
+
const blocked: AutoAdvanceResult = { kind: "blocked", reason: "idempotent advance: unit already active", action: "pause" };
|
|
152
163
|
await this.deps.runtime.journalTransition({
|
|
153
164
|
name: "advance-blocked",
|
|
154
165
|
reason: blocked.reason,
|
|
@@ -288,7 +299,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
288
299
|
this.bumpTransition();
|
|
289
300
|
await this.deps.runtime.journalTransition({ name: "resume" });
|
|
290
301
|
await this.deps.notifications.notifyLifecycle({ name: "resume" });
|
|
291
|
-
return
|
|
302
|
+
return { kind: "resumed" };
|
|
292
303
|
}
|
|
293
304
|
|
|
294
305
|
public async stop(reason: string): Promise<AutoAdvanceResult> {
|