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
|
@@ -56,7 +56,7 @@ import { verifyExpectedArtifact, diagnoseExpectedArtifact, buildLoopRemediationS
|
|
|
56
56
|
import { writeUnitRuntimeRecord } from "../unit-runtime.js";
|
|
57
57
|
import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "./finalize-timeout.js";
|
|
58
58
|
import { getEligibleSlices } from "../slice-parallel-eligibility.js";
|
|
59
|
-
import { startSliceParallel } from "../slice-parallel-orchestrator.js";
|
|
59
|
+
import { isSliceParallelActive, startSliceParallel } from "../slice-parallel-orchestrator.js";
|
|
60
60
|
import { isDbAvailable, getMilestoneSlices } from "../gsd-db.js";
|
|
61
61
|
import { reconcileBeforeSpawn } from "../state-reconciliation.js";
|
|
62
62
|
import type { MinimalModelRegistry } from "../context-budget.js";
|
|
@@ -77,6 +77,10 @@ import { resolveManifest } from "../unit-context-manifest.js";
|
|
|
77
77
|
import { createWorktreeSafetyModule, type WorktreeSafetyResult } from "../worktree-safety.js";
|
|
78
78
|
import { isSuspiciousGhostCompletion } from "../auto-unit-closeout.js";
|
|
79
79
|
import { decideVerificationRetry, verificationRetryKey } from "./verification-retry-policy.js";
|
|
80
|
+
import { buildPhaseHandoffOutcome, setAutoOutcomeWidget } from "../auto-dashboard.js";
|
|
81
|
+
import { getConsecutiveDispatchBlocker } from "../dispatch-guard.js";
|
|
82
|
+
|
|
83
|
+
export const STUCK_WINDOW_SIZE = 6;
|
|
80
84
|
|
|
81
85
|
// ─── Path Comparison Helper ───────────────────────────────────────────────
|
|
82
86
|
/** Compare two paths for physical identity, tolerating trailing slashes and symlinks. */
|
|
@@ -146,7 +150,12 @@ export function shouldDegradeEmptyWorktreeToProjectRoot(
|
|
|
146
150
|
}
|
|
147
151
|
|
|
148
152
|
function unitWritesSource(unitType: string): boolean | null {
|
|
149
|
-
|
|
153
|
+
// Backward compatibility: sidecar queues from older builds may persist
|
|
154
|
+
// prefixed unit types (e.g. "sidecar/quick-task").
|
|
155
|
+
const normalizedUnitType = unitType.startsWith("sidecar/")
|
|
156
|
+
? unitType.slice("sidecar/".length)
|
|
157
|
+
: unitType;
|
|
158
|
+
const manifest = resolveManifest(normalizedUnitType);
|
|
150
159
|
if (!manifest) return null;
|
|
151
160
|
return manifest.tools.mode === "all" || manifest.tools.mode === "docs";
|
|
152
161
|
}
|
|
@@ -155,6 +164,13 @@ function formatWorktreeSafetyFailure(result: Extract<WorktreeSafetyResult, { ok:
|
|
|
155
164
|
return `Worktree Safety failed (${result.kind}): ${result.reason} ${result.remediation}`;
|
|
156
165
|
}
|
|
157
166
|
|
|
167
|
+
function formatWorktreeSafetyStopReason(result: Extract<WorktreeSafetyResult, { ok: false }>): string {
|
|
168
|
+
if (result.kind === "empty-worktree-with-project-content") {
|
|
169
|
+
return `Worktree Safety failed (${result.kind}). Run /gsd doctor fix, then /gsd auto.`;
|
|
170
|
+
}
|
|
171
|
+
return `Worktree Safety failed (${result.kind}).`;
|
|
172
|
+
}
|
|
173
|
+
|
|
158
174
|
function resolveEmptyWorktreeWithProjectContent(
|
|
159
175
|
unitRoot: string,
|
|
160
176
|
projectRoot: string,
|
|
@@ -203,7 +219,8 @@ async function validateSourceWriteWorktreeSafety(
|
|
|
203
219
|
if (!writesSource) return null;
|
|
204
220
|
|
|
205
221
|
const projectRoot = s.canonicalProjectRoot ?? resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
|
|
206
|
-
|
|
222
|
+
const isolationMode = deps.getIsolationMode(projectRoot);
|
|
223
|
+
if (isolationMode !== "worktree") return null;
|
|
207
224
|
|
|
208
225
|
const safety = createWorktreeSafetyModule();
|
|
209
226
|
const result = safety.validateUnitRoot({
|
|
@@ -213,6 +230,7 @@ async function validateSourceWriteWorktreeSafety(
|
|
|
213
230
|
projectRoot,
|
|
214
231
|
unitRoot: s.basePath,
|
|
215
232
|
milestoneId,
|
|
233
|
+
isolationMode,
|
|
216
234
|
expectedBranch: milestoneId ? deps.autoWorktreeBranch(milestoneId) : null,
|
|
217
235
|
emptyWorktreeWithProjectContent: resolveEmptyWorktreeWithProjectContent(s.basePath, projectRoot),
|
|
218
236
|
lease: s.workerId
|
|
@@ -237,7 +255,7 @@ async function validateSourceWriteWorktreeSafety(
|
|
|
237
255
|
projectRoot,
|
|
238
256
|
});
|
|
239
257
|
ctx.ui.notify(msg, "error");
|
|
240
|
-
await deps.stopAuto(ctx, pi,
|
|
258
|
+
await deps.stopAuto(ctx, pi, formatWorktreeSafetyStopReason(result));
|
|
241
259
|
return { action: "break", reason: result.kind };
|
|
242
260
|
}
|
|
243
261
|
|
|
@@ -442,6 +460,18 @@ export async function _runMilestoneMergeWithStashRestore(
|
|
|
442
460
|
milestoneId,
|
|
443
461
|
ctx.ui.notify.bind(ctx.ui),
|
|
444
462
|
);
|
|
463
|
+
if (preflight.blocked) {
|
|
464
|
+
const reason = preflight.blockedReason === "unmerged-conflicts"
|
|
465
|
+
? `Pre-merge unresolved Git conflicts block milestone ${milestoneId}`
|
|
466
|
+
: `Pre-merge dirty working tree overlaps milestone ${milestoneId}`;
|
|
467
|
+
await deps.stopAuto(ctx, pi, reason);
|
|
468
|
+
return {
|
|
469
|
+
action: "break",
|
|
470
|
+
reason: preflight.blockedReason === "unmerged-conflicts"
|
|
471
|
+
? "preflight-unmerged-conflicts"
|
|
472
|
+
: "preflight-dirty-overlap",
|
|
473
|
+
};
|
|
474
|
+
}
|
|
445
475
|
|
|
446
476
|
let mergeError: unknown = null;
|
|
447
477
|
const exitResult = deps.lifecycle.exitMilestone(
|
|
@@ -567,6 +597,13 @@ export function _buildCancelledUnitStopReason(
|
|
|
567
597
|
};
|
|
568
598
|
}
|
|
569
599
|
|
|
600
|
+
export function _isPauseOriginCancelledResult(
|
|
601
|
+
isPaused: boolean,
|
|
602
|
+
errorContext?: { message: string; category: string },
|
|
603
|
+
): boolean {
|
|
604
|
+
return isPaused && !errorContext;
|
|
605
|
+
}
|
|
606
|
+
|
|
570
607
|
async function failClosedOnFinalizeTimeout(
|
|
571
608
|
ic: IterationContext,
|
|
572
609
|
iterData: IterationData,
|
|
@@ -859,6 +896,12 @@ export async function runPreDispatch(
|
|
|
859
896
|
isDbAvailable()
|
|
860
897
|
) {
|
|
861
898
|
try {
|
|
899
|
+
const projectRoot = _resolveDispatchGuardBasePath(s);
|
|
900
|
+
if (isSliceParallelActive(projectRoot)) {
|
|
901
|
+
ctx.ui.notify("Slice-parallel: workers are still running; waiting for completion before next dispatch.", "info");
|
|
902
|
+
await new Promise<void>((resolve) => setTimeout(resolve, 1000));
|
|
903
|
+
return { action: "continue" };
|
|
904
|
+
}
|
|
862
905
|
const dbSlices = getMilestoneSlices(mid);
|
|
863
906
|
if (dbSlices.length > 0) {
|
|
864
907
|
const doneIds = new Set(dbSlices.filter(sl => sl.status === "complete" || sl.status === "done").map(sl => sl.id));
|
|
@@ -881,7 +924,7 @@ export async function runPreDispatch(
|
|
|
881
924
|
);
|
|
882
925
|
// ADR-017 #5707: reconcile before spawning so each worker doesn't
|
|
883
926
|
// independently race on the same drift. Failure aborts the spawn.
|
|
884
|
-
const spawnGate = await reconcileBeforeSpawn(
|
|
927
|
+
const spawnGate = await reconcileBeforeSpawn(projectRoot);
|
|
885
928
|
if (!spawnGate.ok) {
|
|
886
929
|
ctx.ui.notify(
|
|
887
930
|
`Slice-parallel: aborting spawn — ${spawnGate.reason}`,
|
|
@@ -890,7 +933,7 @@ export async function runPreDispatch(
|
|
|
890
933
|
return { action: "break", reason: `slice-parallel-reconciliation-failed: ${spawnGate.reason}` };
|
|
891
934
|
}
|
|
892
935
|
const result = await startSliceParallel(
|
|
893
|
-
|
|
936
|
+
projectRoot,
|
|
894
937
|
mid,
|
|
895
938
|
eligible,
|
|
896
939
|
{
|
|
@@ -903,8 +946,7 @@ export async function runPreDispatch(
|
|
|
903
946
|
`Slice-parallel: started ${result.started.length} worker(s): ${result.started.join(", ")}.`,
|
|
904
947
|
"info",
|
|
905
948
|
);
|
|
906
|
-
|
|
907
|
-
return { action: "break", reason: "slice-parallel-dispatched" };
|
|
949
|
+
return { action: "continue" };
|
|
908
950
|
}
|
|
909
951
|
// Fall through to sequential if no workers started
|
|
910
952
|
}
|
|
@@ -1232,7 +1274,6 @@ export async function runDispatch(
|
|
|
1232
1274
|
): Promise<PhaseResult<IterationData>> {
|
|
1233
1275
|
const { ctx, pi, s, deps, prefs } = ic;
|
|
1234
1276
|
const { state, mid, midTitle } = preData;
|
|
1235
|
-
const STUCK_WINDOW_SIZE = 6;
|
|
1236
1277
|
const provider = ctx.model?.provider;
|
|
1237
1278
|
const authMode = provider && typeof ctx.modelRegistry?.getProviderAuthMode === "function"
|
|
1238
1279
|
? ctx.modelRegistry.getProviderAuthMode(provider)
|
|
@@ -1327,9 +1368,15 @@ export async function runDispatch(
|
|
|
1327
1368
|
}
|
|
1328
1369
|
|
|
1329
1370
|
const guardBasePath = _resolveDispatchGuardBasePath(s);
|
|
1371
|
+
let mainBranch = "main";
|
|
1372
|
+
try {
|
|
1373
|
+
mainBranch = deps.getMainBranch(guardBasePath);
|
|
1374
|
+
} catch (err) {
|
|
1375
|
+
debugLog("autoLoop", { phase: "getMainBranch-failed", error: String(err) });
|
|
1376
|
+
}
|
|
1330
1377
|
const priorSliceBlocker = deps.getPriorSliceCompletionBlocker(
|
|
1331
1378
|
guardBasePath,
|
|
1332
|
-
|
|
1379
|
+
mainBranch,
|
|
1333
1380
|
unitType,
|
|
1334
1381
|
unitId,
|
|
1335
1382
|
);
|
|
@@ -1339,6 +1386,18 @@ export async function runDispatch(
|
|
|
1339
1386
|
return { action: "break", reason: "prior-slice-blocker" };
|
|
1340
1387
|
}
|
|
1341
1388
|
|
|
1389
|
+
const consecutiveDispatchBlocker = getConsecutiveDispatchBlocker(
|
|
1390
|
+
loopState,
|
|
1391
|
+
state.phase,
|
|
1392
|
+
unitType,
|
|
1393
|
+
unitId,
|
|
1394
|
+
);
|
|
1395
|
+
if (consecutiveDispatchBlocker) {
|
|
1396
|
+
await deps.stopAuto(ctx, pi, consecutiveDispatchBlocker);
|
|
1397
|
+
debugLog("autoLoop", { phase: "exit", reason: "consecutive-dispatch-blocker" });
|
|
1398
|
+
return { action: "break", reason: "consecutive-dispatch-blocker" };
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1342
1401
|
const worktreeSafetyBlock = await validateSourceWriteWorktreeSafety(
|
|
1343
1402
|
ic,
|
|
1344
1403
|
unitType,
|
|
@@ -1355,9 +1414,14 @@ export async function runDispatch(
|
|
|
1355
1414
|
// Rules 1/3/4 can catch retry loops with repeated failure content (#5719).
|
|
1356
1415
|
// Rules 2/2b suppress legitimate retry backoff through the dispatch ledger.
|
|
1357
1416
|
loopState.recentUnits.push({ key: derivedKey });
|
|
1358
|
-
|
|
1417
|
+
while (loopState.recentUnits.length > STUCK_WINDOW_SIZE) {
|
|
1418
|
+
loopState.recentUnits.shift();
|
|
1419
|
+
}
|
|
1359
1420
|
|
|
1360
|
-
const stuckSignal = detectStuck(loopState.recentUnits
|
|
1421
|
+
const stuckSignal = detectStuck(loopState.recentUnits, {
|
|
1422
|
+
pendingRetry: !!s.pendingVerificationRetry,
|
|
1423
|
+
retryAttempt: s.pendingVerificationRetry?.attempt,
|
|
1424
|
+
});
|
|
1361
1425
|
if (stuckSignal) {
|
|
1362
1426
|
debugLog("autoLoop", {
|
|
1363
1427
|
phase: "stuck-check",
|
|
@@ -1412,7 +1476,6 @@ export async function runDispatch(
|
|
|
1412
1476
|
);
|
|
1413
1477
|
deps.invalidateAllCaches();
|
|
1414
1478
|
loopState.recentUnits.length = 0;
|
|
1415
|
-
loopState.stuckRecoveryAttempts = 0;
|
|
1416
1479
|
return { action: "continue" };
|
|
1417
1480
|
}
|
|
1418
1481
|
ctx.ui.notify(
|
|
@@ -1796,42 +1859,8 @@ export async function runUnitPhase(
|
|
|
1796
1859
|
s.currentUnit.id === unitId
|
|
1797
1860
|
);
|
|
1798
1861
|
const previousTier = s.currentUnitRouting?.tier;
|
|
1799
|
-
|
|
1800
|
-
// Scope workflow-logger buffer to this unit so post-finalize drains are
|
|
1801
|
-
// per-unit. Without this, the module-level _buffer accumulates across every
|
|
1802
|
-
// unit in the same Node process (see workflow-logger.ts module header).
|
|
1803
|
-
_resetLogs();
|
|
1804
1862
|
const dispatchKey = `${unitType}/${unitId}`;
|
|
1805
|
-
|
|
1806
|
-
s.currentUnit = { type: unitType, id: unitId, startedAt: Date.now() };
|
|
1807
|
-
s.lastGitActionFailure = null;
|
|
1808
|
-
s.lastGitActionStatus = null;
|
|
1809
|
-
s.lastUnitAgentEndMessages = null;
|
|
1810
|
-
setCurrentPhase(unitType, {
|
|
1811
|
-
basePath: s.basePath,
|
|
1812
|
-
traceId: ic.flowId,
|
|
1813
|
-
turnId: `iter-${ic.iteration}`,
|
|
1814
|
-
causedBy: "unit-start",
|
|
1815
|
-
});
|
|
1816
|
-
s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
|
|
1817
|
-
const unitStartSeq = ic.nextSeq();
|
|
1818
|
-
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: unitStartSeq, eventType: "unit-start", data: { unitType, unitId } });
|
|
1819
|
-
deps.captureAvailableSkills();
|
|
1820
|
-
writeUnitRuntimeRecord(
|
|
1821
|
-
s.basePath,
|
|
1822
|
-
unitType,
|
|
1823
|
-
unitId,
|
|
1824
|
-
s.currentUnit.startedAt,
|
|
1825
|
-
{
|
|
1826
|
-
phase: "dispatched",
|
|
1827
|
-
wrapupWarningSent: false,
|
|
1828
|
-
timeoutAt: null,
|
|
1829
|
-
lastProgressAt: s.currentUnit.startedAt,
|
|
1830
|
-
progressCount: 0,
|
|
1831
|
-
lastProgressKind: "dispatch",
|
|
1832
|
-
recoveryAttempts: 0, // Reset so re-dispatched units get full recovery budget (#2322)
|
|
1833
|
-
},
|
|
1834
|
-
);
|
|
1863
|
+
const nextDispatchCount = (s.unitDispatchCount.get(dispatchKey) ?? 0) + 1;
|
|
1835
1864
|
|
|
1836
1865
|
// Status bar (widget + preconditions deferred until after model selection — see #2899)
|
|
1837
1866
|
ctx.ui.setStatus("gsd-auto", "auto");
|
|
@@ -1894,7 +1923,7 @@ export async function runUnitPhase(
|
|
|
1894
1923
|
: s.pendingCrashRecovery;
|
|
1895
1924
|
finalPrompt = `${capped}\n\n---\n\n${finalPrompt}`;
|
|
1896
1925
|
s.pendingCrashRecovery = null;
|
|
1897
|
-
} else if (
|
|
1926
|
+
} else if (nextDispatchCount > 1) {
|
|
1898
1927
|
const diagnostic = deps.getDeepDiagnostic(s.basePath);
|
|
1899
1928
|
if (diagnostic) {
|
|
1900
1929
|
const cappedDiag =
|
|
@@ -1902,7 +1931,11 @@ export async function runUnitPhase(
|
|
|
1902
1931
|
? diagnostic.slice(0, MAX_RECOVERY_CHARS) +
|
|
1903
1932
|
"\n\n[...diagnostic truncated to prevent memory exhaustion]"
|
|
1904
1933
|
: diagnostic;
|
|
1905
|
-
|
|
1934
|
+
const retryInstruction =
|
|
1935
|
+
unitType === "execute-task"
|
|
1936
|
+
? "The required artifact is `T##-SUMMARY.md`. Do NOT manually write this file. Call `gsd_task_complete` with `milestoneId`, `sliceId`, `taskId`, and the required completion fields. Do not re-run implementation work — call the tool."
|
|
1937
|
+
: "Fix whatever went wrong and make sure you write the required file this time.";
|
|
1938
|
+
finalPrompt = `**RETRY — your previous attempt did not produce the required artifact.**\n\nDiagnostic from previous attempt:\n${cappedDiag}\n\n${retryInstruction}\n\n---\n\n${finalPrompt}`;
|
|
1906
1939
|
}
|
|
1907
1940
|
}
|
|
1908
1941
|
|
|
@@ -1937,6 +1970,11 @@ export async function runUnitPhase(
|
|
|
1937
1970
|
}
|
|
1938
1971
|
|
|
1939
1972
|
// Select and apply model (with tier escalation on retry — normal units only)
|
|
1973
|
+
const prevUnitRouting = s.currentUnitRouting;
|
|
1974
|
+
const prevUnitModel = s.currentUnitModel;
|
|
1975
|
+
const prevDispatchedModelId = s.currentDispatchedModelId;
|
|
1976
|
+
const prevSessionModel = ctx.model;
|
|
1977
|
+
const prevSessionThinkingLevel = pi.getThinkingLevel();
|
|
1940
1978
|
const modelResult = await deps.selectAndApplyModel(
|
|
1941
1979
|
ctx,
|
|
1942
1980
|
pi,
|
|
@@ -2003,14 +2041,67 @@ export async function runUnitPhase(
|
|
|
2003
2041
|
? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
|
|
2004
2042
|
: undefined,
|
|
2005
2043
|
baseUrl: (s.currentUnitModel as any)?.baseUrl ?? ctx.model?.baseUrl,
|
|
2044
|
+
activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
|
|
2006
2045
|
},
|
|
2007
2046
|
);
|
|
2008
2047
|
if (compatibilityError) {
|
|
2048
|
+
s.currentUnitRouting = prevUnitRouting;
|
|
2049
|
+
s.currentUnitModel = prevUnitModel;
|
|
2050
|
+
s.currentDispatchedModelId = prevDispatchedModelId;
|
|
2051
|
+
if (s.checkpointSha) {
|
|
2052
|
+
cleanupCheckpoint(s.basePath, unitId);
|
|
2053
|
+
s.checkpointSha = null;
|
|
2054
|
+
}
|
|
2055
|
+
if (prevSessionModel) {
|
|
2056
|
+
const ok = await pi.setModel(prevSessionModel, { persist: false });
|
|
2057
|
+
if (!ok) {
|
|
2058
|
+
ctx.ui.notify("Failed to restore previous session model after compatibility check failure.", "warning");
|
|
2059
|
+
}
|
|
2060
|
+
if (prevSessionThinkingLevel) {
|
|
2061
|
+
pi.setThinkingLevel(prevSessionThinkingLevel);
|
|
2062
|
+
}
|
|
2063
|
+
}
|
|
2009
2064
|
ctx.ui.notify(compatibilityError, "error");
|
|
2010
2065
|
await deps.stopAuto(ctx, pi, compatibilityError);
|
|
2011
2066
|
return { action: "break", reason: "workflow-capability" };
|
|
2012
2067
|
}
|
|
2013
2068
|
|
|
2069
|
+
// Scope workflow-logger buffer to this unit so post-finalize drains are
|
|
2070
|
+
// per-unit. Without this, the module-level _buffer accumulates across every
|
|
2071
|
+
// unit in the same Node process (see workflow-logger.ts module header).
|
|
2072
|
+
_resetLogs();
|
|
2073
|
+
const unitStartedAt = Date.now();
|
|
2074
|
+
s.unitDispatchCount.set(dispatchKey, nextDispatchCount);
|
|
2075
|
+
s.currentUnit = { type: unitType, id: unitId, startedAt: unitStartedAt };
|
|
2076
|
+
s.lastGitActionFailure = null;
|
|
2077
|
+
s.lastGitActionStatus = null;
|
|
2078
|
+
s.lastUnitAgentEndMessages = null;
|
|
2079
|
+
setCurrentPhase(unitType, {
|
|
2080
|
+
basePath: s.basePath,
|
|
2081
|
+
traceId: ic.flowId,
|
|
2082
|
+
turnId: `iter-${ic.iteration}`,
|
|
2083
|
+
causedBy: "unit-start",
|
|
2084
|
+
});
|
|
2085
|
+
s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
|
|
2086
|
+
const unitStartSeq = ic.nextSeq();
|
|
2087
|
+
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: unitStartSeq, eventType: "unit-start", data: { unitType, unitId } });
|
|
2088
|
+
deps.captureAvailableSkills();
|
|
2089
|
+
writeUnitRuntimeRecord(
|
|
2090
|
+
s.basePath,
|
|
2091
|
+
unitType,
|
|
2092
|
+
unitId,
|
|
2093
|
+
unitStartedAt,
|
|
2094
|
+
{
|
|
2095
|
+
phase: "dispatched",
|
|
2096
|
+
wrapupWarningSent: false,
|
|
2097
|
+
timeoutAt: null,
|
|
2098
|
+
lastProgressAt: unitStartedAt,
|
|
2099
|
+
progressCount: 0,
|
|
2100
|
+
lastProgressKind: "dispatch",
|
|
2101
|
+
recoveryAttempts: 0, // Reset so re-dispatched units get full recovery budget (#2322)
|
|
2102
|
+
},
|
|
2103
|
+
);
|
|
2104
|
+
|
|
2014
2105
|
// Progress widget + preconditions — deferred to after model selection so the
|
|
2015
2106
|
// widget's first render tick shows the correct model (#2899).
|
|
2016
2107
|
deps.updateProgressWidget(ctx, unitType, unitId, state);
|
|
@@ -2125,6 +2216,11 @@ export async function runUnitPhase(
|
|
|
2125
2216
|
}
|
|
2126
2217
|
|
|
2127
2218
|
if (unitResult.status === "cancelled") {
|
|
2219
|
+
if (_isPauseOriginCancelledResult(s.paused, unitResult.errorContext)) {
|
|
2220
|
+
debugLog("autoLoop", { phase: "cancelled-after-pause", unitType, unitId });
|
|
2221
|
+
return { action: "break", reason: "paused" };
|
|
2222
|
+
}
|
|
2223
|
+
|
|
2128
2224
|
const errorCategory = unitResult.errorContext?.category;
|
|
2129
2225
|
// Provider-error pause: agent_end recovery normally pauses before this
|
|
2130
2226
|
// branch. Provider readiness failures happen before dispatch, so pause here
|
|
@@ -2328,18 +2424,17 @@ export async function runUnitPhase(
|
|
|
2328
2424
|
}
|
|
2329
2425
|
}
|
|
2330
2426
|
|
|
2427
|
+
const skipArtifactVerification = unitType.startsWith("hook/") || unitType === "custom-step";
|
|
2428
|
+
const artifactVerified =
|
|
2429
|
+
skipArtifactVerification ||
|
|
2430
|
+
verifyExpectedArtifact(unitType, unitId, s.basePath);
|
|
2331
2431
|
if (s.currentUnitRouting) {
|
|
2332
2432
|
deps.recordOutcome(
|
|
2333
2433
|
unitType,
|
|
2334
2434
|
s.currentUnitRouting.tier as "light" | "standard" | "heavy",
|
|
2335
|
-
|
|
2435
|
+
artifactVerified,
|
|
2336
2436
|
);
|
|
2337
2437
|
}
|
|
2338
|
-
|
|
2339
|
-
const skipArtifactVerification = unitType.startsWith("hook/") || unitType === "custom-step";
|
|
2340
|
-
const artifactVerified =
|
|
2341
|
-
skipArtifactVerification ||
|
|
2342
|
-
verifyExpectedArtifact(unitType, unitId, s.basePath);
|
|
2343
2438
|
if (artifactVerified) {
|
|
2344
2439
|
s.unitDispatchCount.delete(dispatchKey);
|
|
2345
2440
|
s.unitRecoveryCount.delete(`${unitType}/${unitId}`);
|
|
@@ -2364,7 +2459,11 @@ export async function runUnitPhase(
|
|
|
2364
2459
|
}
|
|
2365
2460
|
}
|
|
2366
2461
|
|
|
2367
|
-
|
|
2462
|
+
const unitEndStatus =
|
|
2463
|
+
!artifactVerified && unitResult.status === "completed"
|
|
2464
|
+
? "no-artifact"
|
|
2465
|
+
: unitResult.status;
|
|
2466
|
+
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "unit-end", data: { unitType, unitId, status: unitEndStatus, artifactVerified, ...(unitResult.errorContext ? { errorContext: unitResult.errorContext } : {}) }, causedBy: { flowId: ic.flowId, seq: unitStartSeq } });
|
|
2368
2467
|
|
|
2369
2468
|
// ── Safety harness: checkpoint cleanup or rollback ──
|
|
2370
2469
|
if (s.checkpointSha) {
|
|
@@ -2439,6 +2538,8 @@ export async function runFinalize(
|
|
|
2439
2538
|
const preUnitSnapshot = s.currentUnit
|
|
2440
2539
|
? { type: s.currentUnit.type, id: s.currentUnit.id, startedAt: s.currentUnit.startedAt }
|
|
2441
2540
|
: null;
|
|
2541
|
+
s.currentUnit = null;
|
|
2542
|
+
clearCurrentPhase();
|
|
2442
2543
|
const preResultGuard = await withTimeout(
|
|
2443
2544
|
deps.postUnitPreVerification(postUnitCtx, preVerificationOpts),
|
|
2444
2545
|
FINALIZE_PRE_TIMEOUT_MS,
|
|
@@ -2596,10 +2697,21 @@ export async function runFinalize(
|
|
|
2596
2697
|
lastProgressAt: Date.now(),
|
|
2597
2698
|
lastProgressKind: "finalize-success",
|
|
2598
2699
|
});
|
|
2700
|
+
if (
|
|
2701
|
+
!preUnitSnapshot.type.startsWith("hook/") &&
|
|
2702
|
+
preUnitSnapshot.type !== "custom-step" &&
|
|
2703
|
+
preUnitSnapshot.type !== "complete-milestone"
|
|
2704
|
+
) {
|
|
2705
|
+
setAutoOutcomeWidget(ctx, {
|
|
2706
|
+
...buildPhaseHandoffOutcome({
|
|
2707
|
+
unitType: preUnitSnapshot.type,
|
|
2708
|
+
unitId: preUnitSnapshot.id,
|
|
2709
|
+
agentEndMessages: s.lastUnitAgentEndMessages,
|
|
2710
|
+
}),
|
|
2711
|
+
startedAt: s.autoStartTime,
|
|
2712
|
+
});
|
|
2713
|
+
}
|
|
2599
2714
|
}
|
|
2600
|
-
s.currentUnit = null;
|
|
2601
|
-
clearCurrentPhase();
|
|
2602
|
-
|
|
2603
2715
|
// Surface accumulated workflow-logger issues for this unit to the user.
|
|
2604
2716
|
// Warnings/errors logged during the unit are buffered in the logger and
|
|
2605
2717
|
// drained here so the user sees a single consolidated post-unit alert.
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Mutable auto-mode session state container.
|
|
1
3
|
/**
|
|
2
4
|
* AutoSession — encapsulates all mutable auto-mode state into a single instance.
|
|
3
5
|
*
|
|
@@ -52,6 +54,16 @@ export interface PendingVerificationRetry {
|
|
|
52
54
|
attempt: number;
|
|
53
55
|
}
|
|
54
56
|
|
|
57
|
+
export interface PendingOrchestrationDispatch {
|
|
58
|
+
unitType: string;
|
|
59
|
+
unitId: string;
|
|
60
|
+
prompt: string;
|
|
61
|
+
pauseAfterUatDispatch: boolean;
|
|
62
|
+
state: import("../types.js").GSDState;
|
|
63
|
+
mid: string | undefined;
|
|
64
|
+
midTitle: string | undefined;
|
|
65
|
+
}
|
|
66
|
+
|
|
55
67
|
/**
|
|
56
68
|
* A typed item enqueued by postUnitPostVerification for the main loop to
|
|
57
69
|
* drain via the standard runUnit path. Replaces inline dispatch
|
|
@@ -89,6 +101,7 @@ export class AutoSession {
|
|
|
89
101
|
active = false;
|
|
90
102
|
paused = false;
|
|
91
103
|
completionStopInProgress = false;
|
|
104
|
+
preserveStepSurfaceAfterLoopExit = false;
|
|
92
105
|
stepMode = false;
|
|
93
106
|
verbose = false;
|
|
94
107
|
activeEngineId: string | null = null;
|
|
@@ -241,6 +254,7 @@ export class AutoSession {
|
|
|
241
254
|
|
|
242
255
|
// ── Orchestration seam ───────────────────────────────────────────────────
|
|
243
256
|
orchestration: AutoOrchestrationModule | null = null;
|
|
257
|
+
pendingOrchestrationDispatch: PendingOrchestrationDispatch | null = null;
|
|
244
258
|
|
|
245
259
|
// ── Loop promise state ──────────────────────────────────────────────────
|
|
246
260
|
// Per-unit resolve function and session-switch guard live at module level
|
|
@@ -289,6 +303,7 @@ export class AutoSession {
|
|
|
289
303
|
this.active = false;
|
|
290
304
|
this.paused = false;
|
|
291
305
|
this.completionStopInProgress = false;
|
|
306
|
+
this.preserveStepSurfaceAfterLoopExit = false;
|
|
292
307
|
this.stepMode = false;
|
|
293
308
|
this.verbose = false;
|
|
294
309
|
this.activeEngineId = null;
|
|
@@ -372,6 +387,7 @@ export class AutoSession {
|
|
|
372
387
|
|
|
373
388
|
// Orchestration seam
|
|
374
389
|
this.orchestration = null;
|
|
390
|
+
this.pendingOrchestrationDispatch = null;
|
|
375
391
|
|
|
376
392
|
// Loop promise state lives in auto-loop.ts module scope
|
|
377
393
|
}
|
|
@@ -97,6 +97,9 @@ export interface LoopState {
|
|
|
97
97
|
stuckRecoveryAttempts: number;
|
|
98
98
|
/** Consecutive finalize timeout count — stops auto-mode after threshold. */
|
|
99
99
|
consecutiveFinalizeTimeouts: number;
|
|
100
|
+
consecutiveDispatchCount?: Map<string, number>;
|
|
101
|
+
lastDispatchedKey?: string | null;
|
|
102
|
+
lastDispatchPhase?: string | null;
|
|
100
103
|
}
|
|
101
104
|
|
|
102
105
|
/** Max consecutive finalize timeouts before hard-stopping auto-mode. */
|
|
@@ -9,7 +9,11 @@ export function isInternalSessionTransitionAbortEvent(
|
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export function shouldIgnoreAgentEndForActiveUnit(
|
|
12
|
-
event: Pick<AgentEndEvent, "abortOrigin">,
|
|
12
|
+
event: Pick<AgentEndEvent, "abortOrigin" | "messages">,
|
|
13
13
|
): boolean {
|
|
14
|
-
|
|
14
|
+
if (!isInternalSessionTransitionAbortEvent(event)) return false;
|
|
15
|
+
const lastMsg = event.messages[event.messages.length - 1];
|
|
16
|
+
if (!lastMsg || typeof lastMsg !== "object") return true;
|
|
17
|
+
const stopReason = (lastMsg as { stopReason?: unknown }).stopReason;
|
|
18
|
+
return stopReason === "aborted" || stopReason === "error";
|
|
15
19
|
}
|
|
@@ -48,7 +48,8 @@ export type FinalizeDecision =
|
|
|
48
48
|
action: "retry";
|
|
49
49
|
ledgerErrorSummary: "finalize-retry";
|
|
50
50
|
}
|
|
51
|
-
| { action: "complete" }
|
|
51
|
+
| { action: "complete" }
|
|
52
|
+
| { action: "complete-and-break" };
|
|
52
53
|
|
|
53
54
|
export type EngineReconcileInput =
|
|
54
55
|
| { outcome: "milestone-complete" }
|
|
@@ -278,6 +279,9 @@ export function decideEngineDispatch(input: EngineDispatchInput): EngineDispatch
|
|
|
278
279
|
export function decideFinalizeResult(input: FinalizeInput): FinalizeDecision {
|
|
279
280
|
if (input.action === "break") {
|
|
280
281
|
const reason = input.reason ?? "unknown";
|
|
282
|
+
if (reason === "step-wizard") {
|
|
283
|
+
return { action: "complete-and-break" };
|
|
284
|
+
}
|
|
281
285
|
return {
|
|
282
286
|
action: "stop",
|
|
283
287
|
failureClass: reason === "git-closeout-failure" ? "git" : "closeout",
|
|
@@ -19,6 +19,19 @@ export interface MeasureMemoryPressureDeps {
|
|
|
19
19
|
heapLimitBytes: () => number;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
/**
|
|
23
|
+
* Returns true on auto-mode startup, then every configured interval.
|
|
24
|
+
*
|
|
25
|
+
* Iteration 1 is checked explicitly so early session memory pressure cannot
|
|
26
|
+
* bypass the periodic interval guard.
|
|
27
|
+
*/
|
|
28
|
+
export function shouldCheckMemoryPressure(iteration: number, interval: number): boolean {
|
|
29
|
+
if (!Number.isInteger(interval) || interval <= 0) {
|
|
30
|
+
throw new Error("Memory pressure check interval must be a positive integer");
|
|
31
|
+
}
|
|
32
|
+
return iteration === 1 || iteration % interval === 0;
|
|
33
|
+
}
|
|
34
|
+
|
|
22
35
|
function defaultHeapLimitBytes(): number {
|
|
23
36
|
const v8 = require("node:v8") as {
|
|
24
37
|
getHeapStatistics?: () => { heap_size_limit?: number };
|
|
@@ -30,3 +30,14 @@ export function getBudgetEnforcementAction(
|
|
|
30
30
|
if (enforcement === "pause") return "pause";
|
|
31
31
|
return "warn";
|
|
32
32
|
}
|
|
33
|
+
|
|
34
|
+
export function getUnitCostSpikeAction(
|
|
35
|
+
unitCostUsd: number,
|
|
36
|
+
rollingAvgUsd: number,
|
|
37
|
+
multiplier = 3.0,
|
|
38
|
+
): "none" | "pause" {
|
|
39
|
+
if (!Number.isFinite(unitCostUsd) || unitCostUsd < 0) return "none";
|
|
40
|
+
if (!Number.isFinite(rollingAvgUsd) || rollingAvgUsd <= 0) return "none";
|
|
41
|
+
if (!Number.isFinite(multiplier) || multiplier <= 0) return "none";
|
|
42
|
+
return unitCostUsd >= (rollingAvgUsd * multiplier) ? "pause" : "none";
|
|
43
|
+
}
|