gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.2e8b124f7
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/infra-errors.js +9 -3
- package/dist/resources/extensions/gsd/auto/loop.js +110 -37
- package/dist/resources/extensions/gsd/auto/orchestrator.js +13 -2
- package/dist/resources/extensions/gsd/auto/phases.js +104 -38
- 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-dashboard.js +66 -1
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +71 -20
- package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +278 -137
- package/dist/resources/extensions/gsd/auto-prompts.js +36 -10
- package/dist/resources/extensions/gsd/auto-recovery.js +79 -14
- package/dist/resources/extensions/gsd/auto-start.js +90 -14
- package/dist/resources/extensions/gsd/auto-timers.js +11 -3
- package/dist/resources/extensions/gsd/auto-verification.js +102 -34
- package/dist/resources/extensions/gsd/auto-worktree.js +178 -11
- package/dist/resources/extensions/gsd/auto.js +107 -54
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +5 -4
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
- package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
- package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +2 -0
- package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +52 -7
- 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 +8 -0
- package/dist/resources/extensions/gsd/doctor-git-checks.js +46 -1
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
- package/dist/resources/extensions/gsd/doctor.js +2 -28
- package/dist/resources/extensions/gsd/export-html.js +27 -425
- package/dist/resources/extensions/gsd/forensics.js +10 -3
- package/dist/resources/extensions/gsd/git-service.js +138 -10
- 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 +10 -0
- 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 +38 -11
- package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
- package/dist/resources/extensions/gsd/preferences-types.js +2 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +138 -0
- package/dist/resources/extensions/gsd/preferences.js +2 -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/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/slice-parallel-orchestrator.js +59 -2
- 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 +14 -4
- package/dist/resources/extensions/gsd/status-guards.js +14 -2
- 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 +6 -8
- package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
- 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/workflow-tool-executors.js +119 -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/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 +83 -19
- package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
- package/dist/resources/extensions/gsd/worktree-safety.js +33 -1
- package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -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/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 +10 -10
- 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 +10 -10
- package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
- package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
- package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
- package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/package.json +4 -4
- package/packages/contracts/dist/rpc.test.js +7 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +21 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +24 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/src/rpc.test.ts +8 -0
- package/packages/contracts/src/workflow.ts +24 -0
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/README.md +13 -4
- package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +80 -0
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
- package/packages/mcp-server/src/workflow-tools.ts +168 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/tsconfig.json +2 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +5 -6
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
- package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
- package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
- package/packages/pi-ai/src/providers/simple-options.ts +5 -6
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
- package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/terminal.d.ts +2 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +12 -0
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +106 -27
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
- package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
- package/packages/pi-tui/src/terminal.ts +11 -0
- package/packages/pi-tui/src/tui.ts +108 -27
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +10 -1
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
- package/src/resources/extensions/cmux/index.ts +6 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +17 -6
- package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
- package/src/resources/extensions/gsd/auto/loop.ts +111 -38
- package/src/resources/extensions/gsd/auto/orchestrator.ts +13 -2
- package/src/resources/extensions/gsd/auto/phases.ts +127 -49
- 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-dashboard.ts +72 -1
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +74 -20
- package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +312 -148
- package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
- package/src/resources/extensions/gsd/auto-recovery.ts +83 -11
- package/src/resources/extensions/gsd/auto-start.ts +99 -12
- package/src/resources/extensions/gsd/auto-timers.ts +10 -3
- package/src/resources/extensions/gsd/auto-verification.ts +124 -42
- package/src/resources/extensions/gsd/auto-worktree.ts +195 -11
- package/src/resources/extensions/gsd/auto.ts +100 -42
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +5 -4
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
- package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
- package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
- package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
- package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +11 -3
- package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +52 -6
- 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 +8 -0
- package/src/resources/extensions/gsd/doctor-git-checks.ts +45 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/doctor.ts +2 -27
- package/src/resources/extensions/gsd/export-html.ts +27 -427
- package/src/resources/extensions/gsd/forensics.ts +9 -3
- package/src/resources/extensions/gsd/git-service.ts +166 -11
- 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 +11 -0
- 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 +49 -11
- package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
- package/src/resources/extensions/gsd/preferences-types.ts +33 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +145 -0
- package/src/resources/extensions/gsd/preferences.ts +5 -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/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/slice-parallel-orchestrator.ts +52 -1
- 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 +15 -4
- package/src/resources/extensions/gsd/status-guards.ts +16 -2
- 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/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 +300 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +197 -11
- 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 +129 -6
- 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-worktree-registry.test.ts +69 -1
- package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
- package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +111 -1
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
- package/src/resources/extensions/gsd/tests/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/export-html-enhancements.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
- package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +199 -2
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
- 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/migrate-validator-parsers.test.ts +24 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
- package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -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 +59 -0
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +78 -0
- 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/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-switch-abort-misclassification.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +72 -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 +86 -2
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +173 -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 +1 -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 +57 -2
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -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 +8 -10
- package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
- 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/workflow-tool-executors.ts +135 -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/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 +93 -20
- package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
- package/src/resources/extensions/gsd/worktree-safety.ts +45 -6
- package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -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/tests/interview-notes-loop.test.ts +15 -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 → zCegwxH2e6vLp1vEZLLuZ}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → zCegwxH2e6vLp1vEZLLuZ}/_ssgManifest.js +0 -0
|
@@ -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
|
*
|
|
@@ -78,7 +80,10 @@ import { createWorkflowTurnReporter } from "./workflow-turn-reporter.js";
|
|
|
78
80
|
import { validateWorkflowSessionLock } from "./workflow-session-lock.js";
|
|
79
81
|
import { dequeueSidecarItem } from "./workflow-sidecar-queue.js";
|
|
80
82
|
import { maintainWorkerHeartbeat } from "./workflow-worker-heartbeat.js";
|
|
81
|
-
import {
|
|
83
|
+
import {
|
|
84
|
+
measureMemoryPressure,
|
|
85
|
+
shouldCheckMemoryPressure,
|
|
86
|
+
} from "./workflow-memory-pressure.js";
|
|
82
87
|
import { buildSidecarIterationData } from "./workflow-sidecar-iteration.js";
|
|
83
88
|
import {
|
|
84
89
|
createExecutionGraphUnitDispatchDeps,
|
|
@@ -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,88 @@ export async function autoLoop(
|
|
|
726
736
|
}
|
|
727
737
|
|
|
728
738
|
if (!sidecarItem) {
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
if (preDispatchResult.action === "break") {
|
|
733
|
-
finishTurn("stopped", "manual-attention", "pre-dispatch-break");
|
|
734
|
-
break;
|
|
735
|
-
}
|
|
736
|
-
if (preDispatchResult.action === "continue") {
|
|
737
|
-
finishTurn("skipped");
|
|
738
|
-
continue;
|
|
739
|
-
}
|
|
739
|
+
const orchestration = s.orchestration;
|
|
740
|
+
if (orchestration) {
|
|
741
|
+
const orchestrationResult = await orchestration.advance();
|
|
740
742
|
|
|
741
|
-
|
|
743
|
+
if (orchestrationResult.kind === "blocked") {
|
|
744
|
+
s.pendingOrchestrationDispatch = null;
|
|
745
|
+
if (orchestrationResult.action === "pause") {
|
|
746
|
+
await deps.pauseAuto(ctx, pi, {
|
|
747
|
+
message: orchestrationResult.reason,
|
|
748
|
+
category: "unknown",
|
|
749
|
+
});
|
|
750
|
+
} else {
|
|
751
|
+
await deps.stopAuto(ctx, pi, orchestrationResult.reason);
|
|
752
|
+
}
|
|
753
|
+
finishTurn("stopped", "manual-attention", "orchestration-blocked");
|
|
754
|
+
break;
|
|
755
|
+
}
|
|
742
756
|
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
}
|
|
757
|
+
if (orchestrationResult.kind === "stopped") {
|
|
758
|
+
s.pendingOrchestrationDispatch = null;
|
|
759
|
+
await deps.stopAuto(ctx, pi, orchestrationResult.reason);
|
|
760
|
+
finishTurn("stopped", "manual-attention", "orchestration-stopped");
|
|
761
|
+
break;
|
|
762
|
+
}
|
|
750
763
|
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
764
|
+
if (orchestrationResult.kind !== "advanced") {
|
|
765
|
+
s.pendingOrchestrationDispatch = null;
|
|
766
|
+
finishTurn("skipped");
|
|
767
|
+
continue;
|
|
768
|
+
}
|
|
769
|
+
const pendingDispatch = s.pendingOrchestrationDispatch;
|
|
770
|
+
iterData = {
|
|
771
|
+
unitType: pendingDispatch?.unitType ?? orchestrationResult.unit.unitType,
|
|
772
|
+
unitId: pendingDispatch?.unitId ?? orchestrationResult.unit.unitId,
|
|
773
|
+
prompt: pendingDispatch?.prompt ?? "",
|
|
774
|
+
finalPrompt: pendingDispatch?.prompt ?? "",
|
|
775
|
+
pauseAfterUatDispatch: pendingDispatch?.pauseAfterUatDispatch ?? false,
|
|
776
|
+
state: pendingDispatch?.state ?? orchestrationResult.stateSnapshot,
|
|
777
|
+
mid: pendingDispatch?.mid ?? s.currentMilestoneId ?? "workflow",
|
|
778
|
+
midTitle: pendingDispatch?.midTitle ?? orchestrationResult.stateSnapshot.activeMilestone?.title ?? "Workflow",
|
|
779
|
+
isRetry: false,
|
|
780
|
+
previousTier: undefined,
|
|
781
|
+
};
|
|
782
|
+
s.pendingOrchestrationDispatch = null;
|
|
783
|
+
phaseReporter.report("dispatch", "next", {
|
|
784
|
+
unitType: iterData.unitType,
|
|
785
|
+
unitId: iterData.unitId,
|
|
786
|
+
});
|
|
787
|
+
observedUnitType = iterData.unitType;
|
|
788
|
+
observedUnitId = iterData.unitId;
|
|
789
|
+
} else {
|
|
790
|
+
const preDispatchResult = await runPreDispatch(ic, loopState);
|
|
791
|
+
phaseReporter.report("pre-dispatch", preDispatchResult.action);
|
|
792
|
+
if (preDispatchResult.action === "break") {
|
|
793
|
+
finishTurn("stopped", "manual-attention", "pre-dispatch-break");
|
|
794
|
+
break;
|
|
795
|
+
}
|
|
796
|
+
if (preDispatchResult.action === "continue") {
|
|
797
|
+
finishTurn("skipped");
|
|
798
|
+
continue;
|
|
799
|
+
}
|
|
800
|
+
const preData = preDispatchResult.data;
|
|
801
|
+
const guardsResult = await runGuards(ic, preData.mid);
|
|
802
|
+
phaseReporter.report("guard", guardsResult.action);
|
|
803
|
+
if (guardsResult.action === "break") {
|
|
804
|
+
finishTurn("stopped", "manual-attention", "guard-break");
|
|
805
|
+
break;
|
|
806
|
+
}
|
|
807
|
+
const dispatchResult = await runDispatch(ic, preData, loopState);
|
|
808
|
+
phaseReporter.report("dispatch", dispatchResult.action);
|
|
809
|
+
if (dispatchResult.action === "break") {
|
|
810
|
+
finishTurn("stopped", "manual-attention", "dispatch-break");
|
|
811
|
+
break;
|
|
812
|
+
}
|
|
813
|
+
if (dispatchResult.action === "continue") {
|
|
814
|
+
finishTurn("skipped");
|
|
815
|
+
continue;
|
|
816
|
+
}
|
|
817
|
+
iterData = dispatchResult.data;
|
|
818
|
+
observedUnitType = iterData.unitType;
|
|
819
|
+
observedUnitId = iterData.unitId;
|
|
761
820
|
}
|
|
762
|
-
iterData = dispatchResult.data;
|
|
763
|
-
observedUnitType = iterData.unitType;
|
|
764
|
-
observedUnitId = iterData.unitId;
|
|
765
821
|
} else {
|
|
766
822
|
iterData = await buildSidecarIterationData({
|
|
767
823
|
sidecarItem,
|
|
@@ -942,11 +998,18 @@ export async function autoLoop(
|
|
|
942
998
|
unitId: iterData.unitId,
|
|
943
999
|
});
|
|
944
1000
|
const finalizeReason = finalizeResult.action === "break" ? finalizeResult.reason : undefined;
|
|
1001
|
+
const finalizeStatus = finalizeReason === "step-wizard"
|
|
1002
|
+
? "completed"
|
|
1003
|
+
: finalizeResult.action === "next"
|
|
1004
|
+
? "completed"
|
|
1005
|
+
: finalizeResult.action === "continue"
|
|
1006
|
+
? "retry"
|
|
1007
|
+
: "stopped";
|
|
945
1008
|
journalReporter.emit("post-unit-finalize-end", {
|
|
946
1009
|
iteration,
|
|
947
1010
|
unitType: iterData.unitType,
|
|
948
1011
|
unitId: iterData.unitId,
|
|
949
|
-
status:
|
|
1012
|
+
status: finalizeStatus,
|
|
950
1013
|
action: finalizeResult.action,
|
|
951
1014
|
...(finalizeReason ? { reason: finalizeReason } : {}),
|
|
952
1015
|
});
|
|
@@ -980,6 +1043,7 @@ export async function autoLoop(
|
|
|
980
1043
|
finishIncompleteIteration({
|
|
981
1044
|
status: "retry",
|
|
982
1045
|
reason: "finalize-retry",
|
|
1046
|
+
retry: true,
|
|
983
1047
|
unitType: iterData.unitType,
|
|
984
1048
|
unitId: iterData.unitId,
|
|
985
1049
|
});
|
|
@@ -992,7 +1056,12 @@ export async function autoLoop(
|
|
|
992
1056
|
logWriteFailure: logDispatchLedgerWriteFailure,
|
|
993
1057
|
}) || dispatchSettled;
|
|
994
1058
|
completeIteration();
|
|
1059
|
+
stuckStatePersistedThisIteration = true;
|
|
995
1060
|
finishTurn("completed");
|
|
1061
|
+
if (finalizeDecision.action === "complete-and-break") {
|
|
1062
|
+
s.preserveStepSurfaceAfterLoopExit = true;
|
|
1063
|
+
break;
|
|
1064
|
+
}
|
|
996
1065
|
} catch (loopErr) {
|
|
997
1066
|
// ── Blanket catch: absorb unexpected exceptions, apply graduated recovery ──
|
|
998
1067
|
const msg = loopErr instanceof Error ? loopErr.message : String(loopErr);
|
|
@@ -1139,6 +1208,10 @@ export async function autoLoop(
|
|
|
1139
1208
|
ctx.ui.notify(errorDecision.notifyMessage, "warning");
|
|
1140
1209
|
}
|
|
1141
1210
|
finishTurn(errorDecision.turnStatus, "execution", msg);
|
|
1211
|
+
} finally {
|
|
1212
|
+
if (!stuckStatePersistedThisIteration) {
|
|
1213
|
+
saveStuckState(s, loopState);
|
|
1214
|
+
}
|
|
1142
1215
|
}
|
|
1143
1216
|
}
|
|
1144
1217
|
|
|
@@ -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,
|
|
@@ -77,6 +77,8 @@ 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";
|
|
80
82
|
|
|
81
83
|
// ─── Path Comparison Helper ───────────────────────────────────────────────
|
|
82
84
|
/** Compare two paths for physical identity, tolerating trailing slashes and symlinks. */
|
|
@@ -155,6 +157,13 @@ function formatWorktreeSafetyFailure(result: Extract<WorktreeSafetyResult, { ok:
|
|
|
155
157
|
return `Worktree Safety failed (${result.kind}): ${result.reason} ${result.remediation}`;
|
|
156
158
|
}
|
|
157
159
|
|
|
160
|
+
function formatWorktreeSafetyStopReason(result: Extract<WorktreeSafetyResult, { ok: false }>): string {
|
|
161
|
+
if (result.kind === "empty-worktree-with-project-content") {
|
|
162
|
+
return `Worktree Safety failed (${result.kind}). Run /gsd doctor fix, then /gsd auto.`;
|
|
163
|
+
}
|
|
164
|
+
return `Worktree Safety failed (${result.kind}).`;
|
|
165
|
+
}
|
|
166
|
+
|
|
158
167
|
function resolveEmptyWorktreeWithProjectContent(
|
|
159
168
|
unitRoot: string,
|
|
160
169
|
projectRoot: string,
|
|
@@ -237,7 +246,7 @@ async function validateSourceWriteWorktreeSafety(
|
|
|
237
246
|
projectRoot,
|
|
238
247
|
});
|
|
239
248
|
ctx.ui.notify(msg, "error");
|
|
240
|
-
await deps.stopAuto(ctx, pi,
|
|
249
|
+
await deps.stopAuto(ctx, pi, formatWorktreeSafetyStopReason(result));
|
|
241
250
|
return { action: "break", reason: result.kind };
|
|
242
251
|
}
|
|
243
252
|
|
|
@@ -567,6 +576,13 @@ export function _buildCancelledUnitStopReason(
|
|
|
567
576
|
};
|
|
568
577
|
}
|
|
569
578
|
|
|
579
|
+
export function _isPauseOriginCancelledResult(
|
|
580
|
+
isPaused: boolean,
|
|
581
|
+
errorContext?: { message: string; category: string },
|
|
582
|
+
): boolean {
|
|
583
|
+
return isPaused && !errorContext;
|
|
584
|
+
}
|
|
585
|
+
|
|
570
586
|
async function failClosedOnFinalizeTimeout(
|
|
571
587
|
ic: IterationContext,
|
|
572
588
|
iterData: IterationData,
|
|
@@ -1327,9 +1343,15 @@ export async function runDispatch(
|
|
|
1327
1343
|
}
|
|
1328
1344
|
|
|
1329
1345
|
const guardBasePath = _resolveDispatchGuardBasePath(s);
|
|
1346
|
+
let mainBranch = "main";
|
|
1347
|
+
try {
|
|
1348
|
+
mainBranch = deps.getMainBranch(guardBasePath);
|
|
1349
|
+
} catch (err) {
|
|
1350
|
+
debugLog("autoLoop", { phase: "getMainBranch-failed", error: String(err) });
|
|
1351
|
+
}
|
|
1330
1352
|
const priorSliceBlocker = deps.getPriorSliceCompletionBlocker(
|
|
1331
1353
|
guardBasePath,
|
|
1332
|
-
|
|
1354
|
+
mainBranch,
|
|
1333
1355
|
unitType,
|
|
1334
1356
|
unitId,
|
|
1335
1357
|
);
|
|
@@ -1339,6 +1361,18 @@ export async function runDispatch(
|
|
|
1339
1361
|
return { action: "break", reason: "prior-slice-blocker" };
|
|
1340
1362
|
}
|
|
1341
1363
|
|
|
1364
|
+
const consecutiveDispatchBlocker = getConsecutiveDispatchBlocker(
|
|
1365
|
+
loopState,
|
|
1366
|
+
state.phase,
|
|
1367
|
+
unitType,
|
|
1368
|
+
unitId,
|
|
1369
|
+
);
|
|
1370
|
+
if (consecutiveDispatchBlocker) {
|
|
1371
|
+
await deps.stopAuto(ctx, pi, consecutiveDispatchBlocker);
|
|
1372
|
+
debugLog("autoLoop", { phase: "exit", reason: "consecutive-dispatch-blocker" });
|
|
1373
|
+
return { action: "break", reason: "consecutive-dispatch-blocker" };
|
|
1374
|
+
}
|
|
1375
|
+
|
|
1342
1376
|
const worktreeSafetyBlock = await validateSourceWriteWorktreeSafety(
|
|
1343
1377
|
ic,
|
|
1344
1378
|
unitType,
|
|
@@ -1412,7 +1446,6 @@ export async function runDispatch(
|
|
|
1412
1446
|
);
|
|
1413
1447
|
deps.invalidateAllCaches();
|
|
1414
1448
|
loopState.recentUnits.length = 0;
|
|
1415
|
-
loopState.stuckRecoveryAttempts = 0;
|
|
1416
1449
|
return { action: "continue" };
|
|
1417
1450
|
}
|
|
1418
1451
|
ctx.ui.notify(
|
|
@@ -1796,42 +1829,8 @@ export async function runUnitPhase(
|
|
|
1796
1829
|
s.currentUnit.id === unitId
|
|
1797
1830
|
);
|
|
1798
1831
|
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
1832
|
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
|
-
);
|
|
1833
|
+
const nextDispatchCount = (s.unitDispatchCount.get(dispatchKey) ?? 0) + 1;
|
|
1835
1834
|
|
|
1836
1835
|
// Status bar (widget + preconditions deferred until after model selection — see #2899)
|
|
1837
1836
|
ctx.ui.setStatus("gsd-auto", "auto");
|
|
@@ -1894,7 +1893,7 @@ export async function runUnitPhase(
|
|
|
1894
1893
|
: s.pendingCrashRecovery;
|
|
1895
1894
|
finalPrompt = `${capped}\n\n---\n\n${finalPrompt}`;
|
|
1896
1895
|
s.pendingCrashRecovery = null;
|
|
1897
|
-
} else if (
|
|
1896
|
+
} else if (nextDispatchCount > 1) {
|
|
1898
1897
|
const diagnostic = deps.getDeepDiagnostic(s.basePath);
|
|
1899
1898
|
if (diagnostic) {
|
|
1900
1899
|
const cappedDiag =
|
|
@@ -1937,6 +1936,11 @@ export async function runUnitPhase(
|
|
|
1937
1936
|
}
|
|
1938
1937
|
|
|
1939
1938
|
// Select and apply model (with tier escalation on retry — normal units only)
|
|
1939
|
+
const prevUnitRouting = s.currentUnitRouting;
|
|
1940
|
+
const prevUnitModel = s.currentUnitModel;
|
|
1941
|
+
const prevDispatchedModelId = s.currentDispatchedModelId;
|
|
1942
|
+
const prevSessionModel = ctx.model;
|
|
1943
|
+
const prevSessionThinkingLevel = pi.getThinkingLevel();
|
|
1940
1944
|
const modelResult = await deps.selectAndApplyModel(
|
|
1941
1945
|
ctx,
|
|
1942
1946
|
pi,
|
|
@@ -2003,14 +2007,67 @@ export async function runUnitPhase(
|
|
|
2003
2007
|
? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
|
|
2004
2008
|
: undefined,
|
|
2005
2009
|
baseUrl: (s.currentUnitModel as any)?.baseUrl ?? ctx.model?.baseUrl,
|
|
2010
|
+
activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
|
|
2006
2011
|
},
|
|
2007
2012
|
);
|
|
2008
2013
|
if (compatibilityError) {
|
|
2014
|
+
s.currentUnitRouting = prevUnitRouting;
|
|
2015
|
+
s.currentUnitModel = prevUnitModel;
|
|
2016
|
+
s.currentDispatchedModelId = prevDispatchedModelId;
|
|
2017
|
+
if (s.checkpointSha) {
|
|
2018
|
+
cleanupCheckpoint(s.basePath, unitId);
|
|
2019
|
+
s.checkpointSha = null;
|
|
2020
|
+
}
|
|
2021
|
+
if (prevSessionModel) {
|
|
2022
|
+
const ok = await pi.setModel(prevSessionModel, { persist: false });
|
|
2023
|
+
if (!ok) {
|
|
2024
|
+
ctx.ui.notify("Failed to restore previous session model after compatibility check failure.", "warning");
|
|
2025
|
+
}
|
|
2026
|
+
if (prevSessionThinkingLevel) {
|
|
2027
|
+
pi.setThinkingLevel(prevSessionThinkingLevel);
|
|
2028
|
+
}
|
|
2029
|
+
}
|
|
2009
2030
|
ctx.ui.notify(compatibilityError, "error");
|
|
2010
2031
|
await deps.stopAuto(ctx, pi, compatibilityError);
|
|
2011
2032
|
return { action: "break", reason: "workflow-capability" };
|
|
2012
2033
|
}
|
|
2013
2034
|
|
|
2035
|
+
// Scope workflow-logger buffer to this unit so post-finalize drains are
|
|
2036
|
+
// per-unit. Without this, the module-level _buffer accumulates across every
|
|
2037
|
+
// unit in the same Node process (see workflow-logger.ts module header).
|
|
2038
|
+
_resetLogs();
|
|
2039
|
+
const unitStartedAt = Date.now();
|
|
2040
|
+
s.unitDispatchCount.set(dispatchKey, nextDispatchCount);
|
|
2041
|
+
s.currentUnit = { type: unitType, id: unitId, startedAt: unitStartedAt };
|
|
2042
|
+
s.lastGitActionFailure = null;
|
|
2043
|
+
s.lastGitActionStatus = null;
|
|
2044
|
+
s.lastUnitAgentEndMessages = null;
|
|
2045
|
+
setCurrentPhase(unitType, {
|
|
2046
|
+
basePath: s.basePath,
|
|
2047
|
+
traceId: ic.flowId,
|
|
2048
|
+
turnId: `iter-${ic.iteration}`,
|
|
2049
|
+
causedBy: "unit-start",
|
|
2050
|
+
});
|
|
2051
|
+
s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
|
|
2052
|
+
const unitStartSeq = ic.nextSeq();
|
|
2053
|
+
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: unitStartSeq, eventType: "unit-start", data: { unitType, unitId } });
|
|
2054
|
+
deps.captureAvailableSkills();
|
|
2055
|
+
writeUnitRuntimeRecord(
|
|
2056
|
+
s.basePath,
|
|
2057
|
+
unitType,
|
|
2058
|
+
unitId,
|
|
2059
|
+
unitStartedAt,
|
|
2060
|
+
{
|
|
2061
|
+
phase: "dispatched",
|
|
2062
|
+
wrapupWarningSent: false,
|
|
2063
|
+
timeoutAt: null,
|
|
2064
|
+
lastProgressAt: unitStartedAt,
|
|
2065
|
+
progressCount: 0,
|
|
2066
|
+
lastProgressKind: "dispatch",
|
|
2067
|
+
recoveryAttempts: 0, // Reset so re-dispatched units get full recovery budget (#2322)
|
|
2068
|
+
},
|
|
2069
|
+
);
|
|
2070
|
+
|
|
2014
2071
|
// Progress widget + preconditions — deferred to after model selection so the
|
|
2015
2072
|
// widget's first render tick shows the correct model (#2899).
|
|
2016
2073
|
deps.updateProgressWidget(ctx, unitType, unitId, state);
|
|
@@ -2125,6 +2182,11 @@ export async function runUnitPhase(
|
|
|
2125
2182
|
}
|
|
2126
2183
|
|
|
2127
2184
|
if (unitResult.status === "cancelled") {
|
|
2185
|
+
if (_isPauseOriginCancelledResult(s.paused, unitResult.errorContext)) {
|
|
2186
|
+
debugLog("autoLoop", { phase: "cancelled-after-pause", unitType, unitId });
|
|
2187
|
+
return { action: "break", reason: "paused" };
|
|
2188
|
+
}
|
|
2189
|
+
|
|
2128
2190
|
const errorCategory = unitResult.errorContext?.category;
|
|
2129
2191
|
// Provider-error pause: agent_end recovery normally pauses before this
|
|
2130
2192
|
// branch. Provider readiness failures happen before dispatch, so pause here
|
|
@@ -2328,18 +2390,17 @@ export async function runUnitPhase(
|
|
|
2328
2390
|
}
|
|
2329
2391
|
}
|
|
2330
2392
|
|
|
2393
|
+
const skipArtifactVerification = unitType.startsWith("hook/") || unitType === "custom-step";
|
|
2394
|
+
const artifactVerified =
|
|
2395
|
+
skipArtifactVerification ||
|
|
2396
|
+
verifyExpectedArtifact(unitType, unitId, s.basePath);
|
|
2331
2397
|
if (s.currentUnitRouting) {
|
|
2332
2398
|
deps.recordOutcome(
|
|
2333
2399
|
unitType,
|
|
2334
2400
|
s.currentUnitRouting.tier as "light" | "standard" | "heavy",
|
|
2335
|
-
|
|
2401
|
+
artifactVerified,
|
|
2336
2402
|
);
|
|
2337
2403
|
}
|
|
2338
|
-
|
|
2339
|
-
const skipArtifactVerification = unitType.startsWith("hook/") || unitType === "custom-step";
|
|
2340
|
-
const artifactVerified =
|
|
2341
|
-
skipArtifactVerification ||
|
|
2342
|
-
verifyExpectedArtifact(unitType, unitId, s.basePath);
|
|
2343
2404
|
if (artifactVerified) {
|
|
2344
2405
|
s.unitDispatchCount.delete(dispatchKey);
|
|
2345
2406
|
s.unitRecoveryCount.delete(`${unitType}/${unitId}`);
|
|
@@ -2364,7 +2425,11 @@ export async function runUnitPhase(
|
|
|
2364
2425
|
}
|
|
2365
2426
|
}
|
|
2366
2427
|
|
|
2367
|
-
|
|
2428
|
+
const unitEndStatus =
|
|
2429
|
+
!artifactVerified && unitResult.status === "completed"
|
|
2430
|
+
? "no-artifact"
|
|
2431
|
+
: unitResult.status;
|
|
2432
|
+
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
2433
|
|
|
2369
2434
|
// ── Safety harness: checkpoint cleanup or rollback ──
|
|
2370
2435
|
if (s.checkpointSha) {
|
|
@@ -2439,6 +2504,8 @@ export async function runFinalize(
|
|
|
2439
2504
|
const preUnitSnapshot = s.currentUnit
|
|
2440
2505
|
? { type: s.currentUnit.type, id: s.currentUnit.id, startedAt: s.currentUnit.startedAt }
|
|
2441
2506
|
: null;
|
|
2507
|
+
s.currentUnit = null;
|
|
2508
|
+
clearCurrentPhase();
|
|
2442
2509
|
const preResultGuard = await withTimeout(
|
|
2443
2510
|
deps.postUnitPreVerification(postUnitCtx, preVerificationOpts),
|
|
2444
2511
|
FINALIZE_PRE_TIMEOUT_MS,
|
|
@@ -2596,10 +2663,21 @@ export async function runFinalize(
|
|
|
2596
2663
|
lastProgressAt: Date.now(),
|
|
2597
2664
|
lastProgressKind: "finalize-success",
|
|
2598
2665
|
});
|
|
2666
|
+
if (
|
|
2667
|
+
!preUnitSnapshot.type.startsWith("hook/") &&
|
|
2668
|
+
preUnitSnapshot.type !== "custom-step" &&
|
|
2669
|
+
preUnitSnapshot.type !== "complete-milestone"
|
|
2670
|
+
) {
|
|
2671
|
+
setAutoOutcomeWidget(ctx, {
|
|
2672
|
+
...buildPhaseHandoffOutcome({
|
|
2673
|
+
unitType: preUnitSnapshot.type,
|
|
2674
|
+
unitId: preUnitSnapshot.id,
|
|
2675
|
+
agentEndMessages: s.lastUnitAgentEndMessages,
|
|
2676
|
+
}),
|
|
2677
|
+
startedAt: s.autoStartTime,
|
|
2678
|
+
});
|
|
2679
|
+
}
|
|
2599
2680
|
}
|
|
2600
|
-
s.currentUnit = null;
|
|
2601
|
-
clearCurrentPhase();
|
|
2602
|
-
|
|
2603
2681
|
// Surface accumulated workflow-logger issues for this unit to the user.
|
|
2604
2682
|
// Warnings/errors logged during the unit are buffered in the logger and
|
|
2605
2683
|
// 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",
|