gsd-pi 2.82.0-dev.ed17d078d → 3.0.0
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 +6 -5
- 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 +1 -1
- 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 +19 -6
- package/dist/resources/extensions/gsd/auto/orchestrator.js +11 -0
- package/dist/resources/extensions/gsd/auto/phases.js +81 -31
- package/dist/resources/extensions/gsd/auto/session.js +4 -0
- 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 +20 -19
- package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +246 -133
- package/dist/resources/extensions/gsd/auto-prompts.js +2 -2
- package/dist/resources/extensions/gsd/auto-recovery.js +71 -14
- package/dist/resources/extensions/gsd/auto-start.js +87 -14
- package/dist/resources/extensions/gsd/auto-verification.js +45 -26
- package/dist/resources/extensions/gsd/auto-worktree.js +176 -10
- package/dist/resources/extensions/gsd/auto.js +57 -33
- 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 +4 -2
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +17 -3
- 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 +5 -0
- package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +7 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +43 -5
- 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/dispatch-guard.js +2 -2
- 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 +3 -3
- package/dist/resources/extensions/gsd/git-service.js +45 -3
- package/dist/resources/extensions/gsd/gsd-db.js +21 -6
- package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
- package/dist/resources/extensions/gsd/guided-flow.js +101 -116
- package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -8
- 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 +48 -12
- 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/post-execution-checks.js +73 -2
- package/dist/resources/extensions/gsd/pre-execution-checks.js +28 -1
- 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/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/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/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 +3 -3
- package/dist/resources/extensions/gsd/status-guards.js +11 -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 +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 +87 -14
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +32 -10
- package/dist/resources/extensions/gsd/validation.js +23 -1
- package/dist/resources/extensions/gsd/verification-gate.js +68 -7
- package/dist/resources/extensions/gsd/verification-verdict.js +26 -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 +54 -10
- package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
- package/dist/resources/extensions/shared/html-shell.js +388 -0
- 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/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- 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/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +5 -8
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -8
- 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 +11 -11
- package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- 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/middleware.js +2 -2
- 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/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-b23b3f6858dc6dc8.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.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/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- 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/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/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/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/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/sdk.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
- 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/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/package.json +1 -1
- package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
- package/packages/pi-tui/src/terminal.ts +11 -0
- 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 +1 -1
- 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 +9 -0
- package/src/resources/extensions/cmux/index.ts +6 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +14 -6
- package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
- package/src/resources/extensions/gsd/auto/loop.ts +22 -6
- package/src/resources/extensions/gsd/auto/orchestrator.ts +11 -0
- package/src/resources/extensions/gsd/auto/phases.ts +90 -38
- package/src/resources/extensions/gsd/auto/session.ts +4 -0
- 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 +21 -19
- package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +279 -144
- package/src/resources/extensions/gsd/auto-prompts.ts +2 -2
- package/src/resources/extensions/gsd/auto-recovery.ts +74 -11
- package/src/resources/extensions/gsd/auto-start.ts +94 -12
- package/src/resources/extensions/gsd/auto-verification.ts +58 -36
- package/src/resources/extensions/gsd/auto-worktree.ts +193 -10
- package/src/resources/extensions/gsd/auto.ts +59 -31
- 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 +4 -2
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +20 -4
- 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 +5 -0
- package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +8 -3
- package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +44 -4
- 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/dispatch-guard.ts +2 -2
- 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 +3 -3
- package/src/resources/extensions/gsd/git-service.ts +51 -4
- package/src/resources/extensions/gsd/gsd-db.ts +21 -6
- package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
- package/src/resources/extensions/gsd/guided-flow.ts +134 -133
- package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +10 -8
- 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 +54 -12
- 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/post-execution-checks.ts +87 -2
- package/src/resources/extensions/gsd/pre-execution-checks.ts +32 -1
- 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/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/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/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 +3 -3
- package/src/resources/extensions/gsd/status-guards.ts +13 -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/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 +56 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +80 -1
- 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 +91 -6
- 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/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 +11 -2
- 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 +86 -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/deep-project-auto-loop.test.ts +59 -2
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +11 -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/integration/doctor-runtime.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +112 -1
- 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 +46 -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 +63 -2
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
- 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 +251 -2
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +17 -0
- 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 +86 -0
- 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 +53 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +59 -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/run-uat-replay-cap.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +53 -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 +13 -1
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +103 -7
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +110 -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 +25 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +54 -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 +97 -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-manifest.ts +47 -11
- package/src/resources/extensions/gsd/validation.ts +23 -1
- package/src/resources/extensions/gsd/verification-gate.ts +78 -6
- package/src/resources/extensions/gsd/verification-verdict.ts +47 -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 +61 -10
- package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
- package/src/resources/extensions/shared/html-shell.ts +412 -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/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/chunks/app/page-752f1e2ebdaa3e45.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.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 → qoMxZh-xuwuvpFW0x0k01}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → qoMxZh-xuwuvpFW0x0k01}/_ssgManifest.js +0 -0
|
@@ -1,7 +1,24 @@
|
|
|
1
1
|
import { describe, test } from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
-
import { mapContentBlock, parseMcpToolName, PartialMessageBuilder } from "../partial-builder.ts";
|
|
4
|
-
import type { BetaContentBlock, BetaRawMessageStreamEvent } from "../sdk-types.ts";
|
|
3
|
+
import { mapContentBlock, mapUsage, parseMcpToolName, PartialMessageBuilder } from "../partial-builder.ts";
|
|
4
|
+
import type { BetaContentBlock, BetaRawMessageStreamEvent, NonNullableUsage } from "../sdk-types.ts";
|
|
5
|
+
|
|
6
|
+
describe("mapUsage", () => {
|
|
7
|
+
test("excludes cumulative cache reads from context-sized totalTokens (#5243)", () => {
|
|
8
|
+
const usage: NonNullableUsage = {
|
|
9
|
+
input_tokens: 150_000,
|
|
10
|
+
output_tokens: 2_000,
|
|
11
|
+
cache_read_input_tokens: 900_000,
|
|
12
|
+
cache_creation_input_tokens: 3_000,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const mapped = mapUsage(usage, 1.23);
|
|
16
|
+
|
|
17
|
+
assert.equal(mapped.cacheRead, 900_000);
|
|
18
|
+
assert.equal(mapped.totalTokens, 155_000);
|
|
19
|
+
assert.equal(mapped.cost.total, 1.23);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
5
22
|
|
|
6
23
|
describe("PartialMessageBuilder — malformed tool arguments (#2574)", () => {
|
|
7
24
|
/**
|
|
@@ -1258,9 +1258,18 @@ describe("stream-adapter — abort classification (F2)", () => {
|
|
|
1258
1258
|
test("recognizes Claude Code SDK abort exceptions", () => {
|
|
1259
1259
|
assert.equal(isClaudeCodeAbortErrorMessage("Claude Code process aborted by user"), true);
|
|
1260
1260
|
assert.equal(isClaudeCodeAbortErrorMessage("Request aborted by user"), true);
|
|
1261
|
+
assert.equal(isClaudeCodeAbortErrorMessage("AbortError: The operation was aborted"), true);
|
|
1261
1262
|
assert.equal(isClaudeCodeAbortErrorMessage("rate limit exceeded"), false);
|
|
1262
1263
|
});
|
|
1263
1264
|
|
|
1265
|
+
test("does not misclassify non-user abort contexts", () => {
|
|
1266
|
+
assert.equal(isClaudeCodeAbortErrorMessage("Job aborted due to timeout"), false);
|
|
1267
|
+
assert.equal(isClaudeCodeAbortErrorMessage("Operation aborted: disk full"), false);
|
|
1268
|
+
assert.equal(isClaudeCodeAbortErrorMessage("aborted by system cleanup"), false);
|
|
1269
|
+
assert.equal(isClaudeCodeAbortErrorMessage("Database transaction aborted due to constraint violation"), false);
|
|
1270
|
+
assert.equal(isClaudeCodeAbortErrorMessage("Connection aborted unexpectedly"), false);
|
|
1271
|
+
});
|
|
1272
|
+
|
|
1264
1273
|
test("makeAbortedMessage sets stopReason to 'aborted', not 'error'", () => {
|
|
1265
1274
|
const message = makeAbortedMessage("claude-sonnet-4-6", "");
|
|
1266
1275
|
assert.equal(message.stopReason, "aborted");
|
|
@@ -374,6 +374,12 @@ export class CmuxClient {
|
|
|
374
374
|
const stdout = await this.runAsync(["send-surface", "--surface", surfaceId, payload]);
|
|
375
375
|
return stdout !== null;
|
|
376
376
|
}
|
|
377
|
+
|
|
378
|
+
// Send Ctrl-C (ETX) to a surface to interrupt the running command.
|
|
379
|
+
async sendInterrupt(surfaceId: string): Promise<boolean> {
|
|
380
|
+
const stdout = await this.runAsync(["send-surface", "--surface", surfaceId, "\x03"]);
|
|
381
|
+
return stdout !== null;
|
|
382
|
+
}
|
|
377
383
|
}
|
|
378
384
|
|
|
379
385
|
export function syncCmuxSidebar(preferences: CmuxPreferences | undefined, state: CmuxState): void {
|
|
@@ -47,12 +47,20 @@ export interface DispatchAdapter {
|
|
|
47
47
|
sessionProvider?: string;
|
|
48
48
|
/** Model registry for executor-model lookups inside the budget engine. */
|
|
49
49
|
modelRegistry?: MinimalModelRegistry;
|
|
50
|
-
}): Promise<
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
50
|
+
}): Promise<
|
|
51
|
+
| {
|
|
52
|
+
kind: "blocked";
|
|
53
|
+
reason: string;
|
|
54
|
+
action: "pause" | "stop";
|
|
55
|
+
}
|
|
56
|
+
| {
|
|
57
|
+
unitType: string;
|
|
58
|
+
unitId: string;
|
|
59
|
+
reason: string;
|
|
60
|
+
preconditions: string[];
|
|
61
|
+
}
|
|
62
|
+
| null
|
|
63
|
+
>;
|
|
56
64
|
}
|
|
57
65
|
|
|
58
66
|
export interface RecoveryAdapter {
|
|
@@ -7,9 +7,14 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
* Error codes indicating infrastructure failures
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* Error codes indicating infrastructure-level failures from the OS,
|
|
11
|
+
* filesystem, or network. This set includes permanent resource failures
|
|
12
|
+
* (ENOSPC, ENOMEM, EROFS), transient resource exhaustion (EAGAIN, ENOBUFS),
|
|
13
|
+
* and network/offline errors (ECONNREFUSED, ENOTFOUND, ENETUNREACH).
|
|
14
|
+
*
|
|
15
|
+
* Transient git failures are retried separately through
|
|
16
|
+
* TRANSIENT_GIT_RETRY_CODES in native-git-bridge.ts before escalating to the
|
|
17
|
+
* auto-loop.
|
|
13
18
|
*/
|
|
14
19
|
export const INFRA_ERROR_CODES: ReadonlySet<string> = new Set([
|
|
15
20
|
"ENOSPC", // disk full
|
|
@@ -19,6 +24,7 @@ export const INFRA_ERROR_CODES: ReadonlySet<string> = new Set([
|
|
|
19
24
|
"EMFILE", // too many open files (process)
|
|
20
25
|
"ENFILE", // too many open files (system)
|
|
21
26
|
"EAGAIN", // resource temporarily unavailable (resource exhaustion)
|
|
27
|
+
"ENOBUFS", // no buffer space available (transient pipe exhaustion)
|
|
22
28
|
"ECONNREFUSED", // connection refused (offline / local server down)
|
|
23
29
|
"ENOTFOUND", // DNS lookup failed (offline / no network)
|
|
24
30
|
"ENETUNREACH", // network unreachable (offline / no route)
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Main auto-mode execution loop.
|
|
1
3
|
/**
|
|
2
4
|
* auto/loop.ts — Main auto-mode execution loop.
|
|
3
5
|
*
|
|
@@ -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
|
|
|
@@ -372,7 +377,7 @@ export async function autoLoop(
|
|
|
372
377
|
|
|
373
378
|
// ── Memory pressure check (#3331) ──
|
|
374
379
|
// Graceful shutdown before OOM killer sends SIGKILL.
|
|
375
|
-
if (iteration
|
|
380
|
+
if (shouldCheckMemoryPressure(iteration, MEMORY_CHECK_INTERVAL)) {
|
|
376
381
|
const mem = measureMemoryPressure();
|
|
377
382
|
debugLog("autoLoop", { phase: "memory-check", ...mem });
|
|
378
383
|
const memoryDecision = decideMemoryPressure({ ...mem, iteration });
|
|
@@ -942,11 +947,18 @@ export async function autoLoop(
|
|
|
942
947
|
unitId: iterData.unitId,
|
|
943
948
|
});
|
|
944
949
|
const finalizeReason = finalizeResult.action === "break" ? finalizeResult.reason : undefined;
|
|
950
|
+
const finalizeStatus = finalizeReason === "step-wizard"
|
|
951
|
+
? "completed"
|
|
952
|
+
: finalizeResult.action === "next"
|
|
953
|
+
? "completed"
|
|
954
|
+
: finalizeResult.action === "continue"
|
|
955
|
+
? "retry"
|
|
956
|
+
: "stopped";
|
|
945
957
|
journalReporter.emit("post-unit-finalize-end", {
|
|
946
958
|
iteration,
|
|
947
959
|
unitType: iterData.unitType,
|
|
948
960
|
unitId: iterData.unitId,
|
|
949
|
-
status:
|
|
961
|
+
status: finalizeStatus,
|
|
950
962
|
action: finalizeResult.action,
|
|
951
963
|
...(finalizeReason ? { reason: finalizeReason } : {}),
|
|
952
964
|
});
|
|
@@ -993,6 +1005,10 @@ export async function autoLoop(
|
|
|
993
1005
|
}) || dispatchSettled;
|
|
994
1006
|
completeIteration();
|
|
995
1007
|
finishTurn("completed");
|
|
1008
|
+
if (finalizeDecision.action === "complete-and-break") {
|
|
1009
|
+
s.preserveStepSurfaceAfterLoopExit = true;
|
|
1010
|
+
break;
|
|
1011
|
+
}
|
|
996
1012
|
} catch (loopErr) {
|
|
997
1013
|
// ── Blanket catch: absorb unexpected exceptions, apply graduated recovery ──
|
|
998
1014
|
const msg = loopErr instanceof Error ? loopErr.message : String(loopErr);
|
|
@@ -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
|
|
|
@@ -77,6 +77,7 @@ 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";
|
|
80
81
|
|
|
81
82
|
// ─── Path Comparison Helper ───────────────────────────────────────────────
|
|
82
83
|
/** Compare two paths for physical identity, tolerating trailing slashes and symlinks. */
|
|
@@ -155,6 +156,13 @@ function formatWorktreeSafetyFailure(result: Extract<WorktreeSafetyResult, { ok:
|
|
|
155
156
|
return `Worktree Safety failed (${result.kind}): ${result.reason} ${result.remediation}`;
|
|
156
157
|
}
|
|
157
158
|
|
|
159
|
+
function formatWorktreeSafetyStopReason(result: Extract<WorktreeSafetyResult, { ok: false }>): string {
|
|
160
|
+
if (result.kind === "empty-worktree-with-project-content") {
|
|
161
|
+
return `Worktree Safety failed (${result.kind}). Run /gsd doctor fix, then /gsd auto.`;
|
|
162
|
+
}
|
|
163
|
+
return `Worktree Safety failed (${result.kind}).`;
|
|
164
|
+
}
|
|
165
|
+
|
|
158
166
|
function resolveEmptyWorktreeWithProjectContent(
|
|
159
167
|
unitRoot: string,
|
|
160
168
|
projectRoot: string,
|
|
@@ -237,7 +245,7 @@ async function validateSourceWriteWorktreeSafety(
|
|
|
237
245
|
projectRoot,
|
|
238
246
|
});
|
|
239
247
|
ctx.ui.notify(msg, "error");
|
|
240
|
-
await deps.stopAuto(ctx, pi,
|
|
248
|
+
await deps.stopAuto(ctx, pi, formatWorktreeSafetyStopReason(result));
|
|
241
249
|
return { action: "break", reason: result.kind };
|
|
242
250
|
}
|
|
243
251
|
|
|
@@ -1327,9 +1335,15 @@ export async function runDispatch(
|
|
|
1327
1335
|
}
|
|
1328
1336
|
|
|
1329
1337
|
const guardBasePath = _resolveDispatchGuardBasePath(s);
|
|
1338
|
+
let mainBranch = "main";
|
|
1339
|
+
try {
|
|
1340
|
+
mainBranch = deps.getMainBranch(guardBasePath);
|
|
1341
|
+
} catch (err) {
|
|
1342
|
+
debugLog("autoLoop", { phase: "getMainBranch-failed", error: String(err) });
|
|
1343
|
+
}
|
|
1330
1344
|
const priorSliceBlocker = deps.getPriorSliceCompletionBlocker(
|
|
1331
1345
|
guardBasePath,
|
|
1332
|
-
|
|
1346
|
+
mainBranch,
|
|
1333
1347
|
unitType,
|
|
1334
1348
|
unitId,
|
|
1335
1349
|
);
|
|
@@ -1796,42 +1810,8 @@ export async function runUnitPhase(
|
|
|
1796
1810
|
s.currentUnit.id === unitId
|
|
1797
1811
|
);
|
|
1798
1812
|
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
1813
|
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
|
-
);
|
|
1814
|
+
const nextDispatchCount = (s.unitDispatchCount.get(dispatchKey) ?? 0) + 1;
|
|
1835
1815
|
|
|
1836
1816
|
// Status bar (widget + preconditions deferred until after model selection — see #2899)
|
|
1837
1817
|
ctx.ui.setStatus("gsd-auto", "auto");
|
|
@@ -1894,7 +1874,7 @@ export async function runUnitPhase(
|
|
|
1894
1874
|
: s.pendingCrashRecovery;
|
|
1895
1875
|
finalPrompt = `${capped}\n\n---\n\n${finalPrompt}`;
|
|
1896
1876
|
s.pendingCrashRecovery = null;
|
|
1897
|
-
} else if (
|
|
1877
|
+
} else if (nextDispatchCount > 1) {
|
|
1898
1878
|
const diagnostic = deps.getDeepDiagnostic(s.basePath);
|
|
1899
1879
|
if (diagnostic) {
|
|
1900
1880
|
const cappedDiag =
|
|
@@ -1937,6 +1917,11 @@ export async function runUnitPhase(
|
|
|
1937
1917
|
}
|
|
1938
1918
|
|
|
1939
1919
|
// Select and apply model (with tier escalation on retry — normal units only)
|
|
1920
|
+
const prevUnitRouting = s.currentUnitRouting;
|
|
1921
|
+
const prevUnitModel = s.currentUnitModel;
|
|
1922
|
+
const prevDispatchedModelId = s.currentDispatchedModelId;
|
|
1923
|
+
const prevSessionModel = ctx.model;
|
|
1924
|
+
const prevSessionThinkingLevel = pi.getThinkingLevel();
|
|
1940
1925
|
const modelResult = await deps.selectAndApplyModel(
|
|
1941
1926
|
ctx,
|
|
1942
1927
|
pi,
|
|
@@ -2003,14 +1988,67 @@ export async function runUnitPhase(
|
|
|
2003
1988
|
? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
|
|
2004
1989
|
: undefined,
|
|
2005
1990
|
baseUrl: (s.currentUnitModel as any)?.baseUrl ?? ctx.model?.baseUrl,
|
|
1991
|
+
activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
|
|
2006
1992
|
},
|
|
2007
1993
|
);
|
|
2008
1994
|
if (compatibilityError) {
|
|
1995
|
+
s.currentUnitRouting = prevUnitRouting;
|
|
1996
|
+
s.currentUnitModel = prevUnitModel;
|
|
1997
|
+
s.currentDispatchedModelId = prevDispatchedModelId;
|
|
1998
|
+
if (s.checkpointSha) {
|
|
1999
|
+
cleanupCheckpoint(s.basePath, unitId);
|
|
2000
|
+
s.checkpointSha = null;
|
|
2001
|
+
}
|
|
2002
|
+
if (prevSessionModel) {
|
|
2003
|
+
const ok = await pi.setModel(prevSessionModel, { persist: false });
|
|
2004
|
+
if (!ok) {
|
|
2005
|
+
ctx.ui.notify("Failed to restore previous session model after compatibility check failure.", "warning");
|
|
2006
|
+
}
|
|
2007
|
+
if (prevSessionThinkingLevel) {
|
|
2008
|
+
pi.setThinkingLevel(prevSessionThinkingLevel);
|
|
2009
|
+
}
|
|
2010
|
+
}
|
|
2009
2011
|
ctx.ui.notify(compatibilityError, "error");
|
|
2010
2012
|
await deps.stopAuto(ctx, pi, compatibilityError);
|
|
2011
2013
|
return { action: "break", reason: "workflow-capability" };
|
|
2012
2014
|
}
|
|
2013
2015
|
|
|
2016
|
+
// Scope workflow-logger buffer to this unit so post-finalize drains are
|
|
2017
|
+
// per-unit. Without this, the module-level _buffer accumulates across every
|
|
2018
|
+
// unit in the same Node process (see workflow-logger.ts module header).
|
|
2019
|
+
_resetLogs();
|
|
2020
|
+
const unitStartedAt = Date.now();
|
|
2021
|
+
s.unitDispatchCount.set(dispatchKey, nextDispatchCount);
|
|
2022
|
+
s.currentUnit = { type: unitType, id: unitId, startedAt: unitStartedAt };
|
|
2023
|
+
s.lastGitActionFailure = null;
|
|
2024
|
+
s.lastGitActionStatus = null;
|
|
2025
|
+
s.lastUnitAgentEndMessages = null;
|
|
2026
|
+
setCurrentPhase(unitType, {
|
|
2027
|
+
basePath: s.basePath,
|
|
2028
|
+
traceId: ic.flowId,
|
|
2029
|
+
turnId: `iter-${ic.iteration}`,
|
|
2030
|
+
causedBy: "unit-start",
|
|
2031
|
+
});
|
|
2032
|
+
s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
|
|
2033
|
+
const unitStartSeq = ic.nextSeq();
|
|
2034
|
+
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: unitStartSeq, eventType: "unit-start", data: { unitType, unitId } });
|
|
2035
|
+
deps.captureAvailableSkills();
|
|
2036
|
+
writeUnitRuntimeRecord(
|
|
2037
|
+
s.basePath,
|
|
2038
|
+
unitType,
|
|
2039
|
+
unitId,
|
|
2040
|
+
unitStartedAt,
|
|
2041
|
+
{
|
|
2042
|
+
phase: "dispatched",
|
|
2043
|
+
wrapupWarningSent: false,
|
|
2044
|
+
timeoutAt: null,
|
|
2045
|
+
lastProgressAt: unitStartedAt,
|
|
2046
|
+
progressCount: 0,
|
|
2047
|
+
lastProgressKind: "dispatch",
|
|
2048
|
+
recoveryAttempts: 0, // Reset so re-dispatched units get full recovery budget (#2322)
|
|
2049
|
+
},
|
|
2050
|
+
);
|
|
2051
|
+
|
|
2014
2052
|
// Progress widget + preconditions — deferred to after model selection so the
|
|
2015
2053
|
// widget's first render tick shows the correct model (#2899).
|
|
2016
2054
|
deps.updateProgressWidget(ctx, unitType, unitId, state);
|
|
@@ -2596,6 +2634,20 @@ export async function runFinalize(
|
|
|
2596
2634
|
lastProgressAt: Date.now(),
|
|
2597
2635
|
lastProgressKind: "finalize-success",
|
|
2598
2636
|
});
|
|
2637
|
+
if (
|
|
2638
|
+
!preUnitSnapshot.type.startsWith("hook/") &&
|
|
2639
|
+
preUnitSnapshot.type !== "custom-step" &&
|
|
2640
|
+
preUnitSnapshot.type !== "complete-milestone"
|
|
2641
|
+
) {
|
|
2642
|
+
setAutoOutcomeWidget(ctx, {
|
|
2643
|
+
...buildPhaseHandoffOutcome({
|
|
2644
|
+
unitType: preUnitSnapshot.type,
|
|
2645
|
+
unitId: preUnitSnapshot.id,
|
|
2646
|
+
agentEndMessages: s.lastUnitAgentEndMessages,
|
|
2647
|
+
}),
|
|
2648
|
+
startedAt: s.autoStartTime,
|
|
2649
|
+
});
|
|
2650
|
+
}
|
|
2599
2651
|
}
|
|
2600
2652
|
s.currentUnit = null;
|
|
2601
2653
|
clearCurrentPhase();
|
|
@@ -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
|
*
|
|
@@ -89,6 +91,7 @@ export class AutoSession {
|
|
|
89
91
|
active = false;
|
|
90
92
|
paused = false;
|
|
91
93
|
completionStopInProgress = false;
|
|
94
|
+
preserveStepSurfaceAfterLoopExit = false;
|
|
92
95
|
stepMode = false;
|
|
93
96
|
verbose = false;
|
|
94
97
|
activeEngineId: string | null = null;
|
|
@@ -289,6 +292,7 @@ export class AutoSession {
|
|
|
289
292
|
this.active = false;
|
|
290
293
|
this.paused = false;
|
|
291
294
|
this.completionStopInProgress = false;
|
|
295
|
+
this.preserveStepSurfaceAfterLoopExit = false;
|
|
292
296
|
this.stepMode = false;
|
|
293
297
|
this.verbose = false;
|
|
294
298
|
this.activeEngineId = null;
|
|
@@ -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 };
|
|
@@ -120,6 +120,26 @@ export interface AutoOutcomeSurfaceSnapshot {
|
|
|
120
120
|
startedAt?: number;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
+
export function buildPhaseHandoffOutcome(input: {
|
|
124
|
+
unitType: string;
|
|
125
|
+
unitId: string;
|
|
126
|
+
agentEndMessages?: unknown[] | null;
|
|
127
|
+
}): AutoOutcomeSurfaceSnapshot {
|
|
128
|
+
const phase = unitPhaseLabel(input.unitType);
|
|
129
|
+
const detail =
|
|
130
|
+
extractLastAssistantSummary(input.agentEndMessages) ??
|
|
131
|
+
`Completed ${unitVerb(input.unitType)} ${input.unitId}.`;
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
status: "complete",
|
|
135
|
+
title: `${phase} complete`,
|
|
136
|
+
detail,
|
|
137
|
+
unitLabel: `${unitVerb(input.unitType)} ${input.unitId}`,
|
|
138
|
+
nextAction: "Preparing the next phase. Review this handoff while the next session starts.",
|
|
139
|
+
commands: ["/gsd status for overview", "/gsd visualize to inspect", "/gsd notifications for history"],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
123
143
|
// ─── Unit Description Helpers ─────────────────────────────────────────────────
|
|
124
144
|
|
|
125
145
|
export function unitVerb(unitType: string): string {
|
|
@@ -631,7 +651,6 @@ export function updateProgressWidget(
|
|
|
631
651
|
tierBadge?: string,
|
|
632
652
|
): void {
|
|
633
653
|
if (!ctx.hasUI) return;
|
|
634
|
-
ctx.ui.setWidget("gsd-outcome", undefined);
|
|
635
654
|
|
|
636
655
|
// Welcome header is a startup-only banner — permanently suppress it once
|
|
637
656
|
// auto-mode activates. The dashboard widget owns all status from here.
|
|
@@ -1145,3 +1164,55 @@ function normalizeRollupText(value: string | null | undefined): string | null {
|
|
|
1145
1164
|
if (!clean || clean === "(none)" || clean === "None." || clean === "Not provided.") return null;
|
|
1146
1165
|
return clean;
|
|
1147
1166
|
}
|
|
1167
|
+
|
|
1168
|
+
function isAssistantMessage(value: unknown): boolean {
|
|
1169
|
+
if (!value || typeof value !== "object") return false;
|
|
1170
|
+
const record = value as Record<string, unknown>;
|
|
1171
|
+
if (record.role === "assistant") return true;
|
|
1172
|
+
|
|
1173
|
+
const message = record.message;
|
|
1174
|
+
if (message && typeof message === "object") {
|
|
1175
|
+
return (message as Record<string, unknown>).role === "assistant";
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
return false;
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
function extractLastAssistantSummary(messages: unknown[] | null | undefined): string | null {
|
|
1182
|
+
if (!messages || messages.length === 0) return null;
|
|
1183
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
1184
|
+
if (!isAssistantMessage(messages[i])) continue;
|
|
1185
|
+
const text = extractMessageText(messages[i]);
|
|
1186
|
+
const clean = normalizeRollupText(text);
|
|
1187
|
+
if (clean) return truncateToWidth(clean, 220, "…");
|
|
1188
|
+
}
|
|
1189
|
+
return null;
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
function extractMessageText(value: unknown): string | null {
|
|
1193
|
+
if (typeof value === "string") return value;
|
|
1194
|
+
if (!value || typeof value !== "object") return null;
|
|
1195
|
+
|
|
1196
|
+
const record = value as Record<string, unknown>;
|
|
1197
|
+
if (typeof record.content === "string") return record.content;
|
|
1198
|
+
|
|
1199
|
+
const message = record.message;
|
|
1200
|
+
if (message && typeof message === "object") {
|
|
1201
|
+
return extractMessageText(message);
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1204
|
+
const content = record.content;
|
|
1205
|
+
if (Array.isArray(content)) {
|
|
1206
|
+
const parts = content
|
|
1207
|
+
.map((part) => {
|
|
1208
|
+
if (typeof part === "string") return part;
|
|
1209
|
+
if (!part || typeof part !== "object") return "";
|
|
1210
|
+
const partRecord = part as Record<string, unknown>;
|
|
1211
|
+
return typeof partRecord.text === "string" ? partRecord.text : "";
|
|
1212
|
+
})
|
|
1213
|
+
.filter(Boolean);
|
|
1214
|
+
return parts.length > 0 ? parts.join(" ") : null;
|
|
1215
|
+
}
|
|
1216
|
+
|
|
1217
|
+
return null;
|
|
1218
|
+
}
|
|
@@ -280,6 +280,7 @@ export async function dispatchDirectPhase(
|
|
|
280
280
|
unitType,
|
|
281
281
|
authMode: ctx.model?.provider ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider) : undefined,
|
|
282
282
|
baseUrl: ctx.model?.baseUrl,
|
|
283
|
+
activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
|
|
283
284
|
},
|
|
284
285
|
);
|
|
285
286
|
if (compatibilityError) {
|