gsd-pi 2.81.0 → 2.82.0-dev.ed17d078d
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 +60 -30
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
- package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
- package/dist/resources/extensions/gsd/auto/loop.js +111 -8
- package/dist/resources/extensions/gsd/auto/orchestrator.js +113 -6
- package/dist/resources/extensions/gsd/auto/phases.js +199 -97
- package/dist/resources/extensions/gsd/auto/run-unit.js +66 -3
- package/dist/resources/extensions/gsd/auto/session.js +9 -0
- package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +43 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +182 -178
- package/dist/resources/extensions/gsd/auto-dispatch.js +14 -11
- package/dist/resources/extensions/gsd/auto-post-unit.js +7 -1
- package/dist/resources/extensions/gsd/auto-prompts.js +11 -3
- package/dist/resources/extensions/gsd/auto-recovery.js +6 -181
- package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -0
- package/dist/resources/extensions/gsd/auto-start.js +20 -23
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +33 -5
- package/dist/resources/extensions/gsd/auto-verification.js +12 -6
- package/dist/resources/extensions/gsd/auto-worktree.js +8 -0
- package/dist/resources/extensions/gsd/auto.js +386 -106
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +13 -6
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +13 -2
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +4 -8
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
- package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -1
- package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +4 -10
- package/dist/resources/extensions/gsd/commands/handlers/parallel.js +9 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +15 -2
- package/dist/resources/extensions/gsd/context-store.js +112 -0
- package/dist/resources/extensions/gsd/db-writer.js +150 -84
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +41 -6
- package/dist/resources/extensions/gsd/git-service.js +2 -1
- package/dist/resources/extensions/gsd/gsd-db.js +7 -23
- package/dist/resources/extensions/gsd/health-widget-core.js +1 -1
- package/dist/resources/extensions/gsd/health-widget.js +4 -10
- package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
- package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
- package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
- package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +6 -96
- package/dist/resources/extensions/gsd/md-importer.js +1 -1
- package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
- package/dist/resources/extensions/gsd/migrate/command.js +5 -0
- package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
- package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
- package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
- package/dist/resources/extensions/gsd/native-git-bridge.js +14 -14
- package/dist/resources/extensions/gsd/notification-overlay.js +35 -40
- package/dist/resources/extensions/gsd/parallel-merge.js +53 -30
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +25 -33
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +14 -12
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
- package/dist/resources/extensions/gsd/prompts/discuss.md +20 -2
- package/dist/resources/extensions/gsd/prompts/system.md +2 -2
- package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
- package/dist/resources/extensions/gsd/recovery-classification.js +15 -1
- package/dist/resources/extensions/gsd/session-lock.js +40 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +131 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +247 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +50 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +87 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.js +50 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +124 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +32 -0
- package/dist/resources/extensions/gsd/state-reconciliation/errors.js +41 -0
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +99 -0
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +24 -0
- package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +43 -0
- package/dist/resources/extensions/gsd/state-reconciliation/types.js +3 -0
- package/dist/resources/extensions/gsd/state-reconciliation.js +5 -26
- package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
- package/dist/resources/extensions/gsd/tui/render-kit.js +74 -0
- package/dist/resources/extensions/gsd/watch/header-renderer.js +92 -69
- package/dist/resources/extensions/gsd/watch/splash-palette.js +10 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +722 -316
- package/dist/resources/extensions/gsd/worktree-telemetry.js +3 -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 +6 -6
- 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/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_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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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 +1 -1
- 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 +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
- 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.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/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +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/dist/welcome-screen.d.ts +0 -7
- package/dist/welcome-screen.js +60 -69
- package/package.json +3 -2
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/README.md +2 -0
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -2
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -1
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
- package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
- package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/index.ts +7 -2
- package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +47 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +76 -9
- 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/__tests__/user-message-design.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +40 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +0 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +30 -29
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +10 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +13 -13
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +58 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts +2 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +12 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.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 +14 -41
- 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.d.ts +0 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +86 -82
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts +35 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +152 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts +16 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js +73 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +12 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +105 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +27 -26
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +9 -6
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +56 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +113 -9
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +48 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +10 -3
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +43 -42
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +14 -14
- package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +64 -3
- package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +13 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +15 -42
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +84 -104
- package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +196 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tui-style-kit.ts +94 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +14 -9
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +106 -1
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +27 -26
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +9 -6
- package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +14 -1
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
- package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
- package/packages/pi-tui/dist/overlay-layout.js +9 -6
- package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +5 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +20 -1
- package/packages/pi-tui/src/overlay-layout.ts +10 -7
- package/packages/pi-tui/src/tui.ts +6 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +105 -1
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +27 -26
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
- package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +46 -11
- package/src/resources/extensions/gsd/auto/loop-deps.ts +9 -5
- package/src/resources/extensions/gsd/auto/loop.ts +113 -9
- package/src/resources/extensions/gsd/auto/orchestrator.ts +118 -6
- package/src/resources/extensions/gsd/auto/phases.ts +158 -19
- package/src/resources/extensions/gsd/auto/run-unit.ts +69 -4
- package/src/resources/extensions/gsd/auto/session.ts +10 -0
- package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +230 -183
- package/src/resources/extensions/gsd/auto-dispatch.ts +15 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +7 -1
- package/src/resources/extensions/gsd/auto-prompts.ts +11 -3
- package/src/resources/extensions/gsd/auto-recovery.ts +7 -209
- package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
- package/src/resources/extensions/gsd/auto-start.ts +22 -22
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +51 -0
- package/src/resources/extensions/gsd/auto-verification.ts +12 -6
- package/src/resources/extensions/gsd/auto-worktree.ts +8 -0
- package/src/resources/extensions/gsd/auto.ts +424 -106
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +21 -6
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +12 -2
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +5 -8
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
- package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -1
- package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +4 -10
- package/src/resources/extensions/gsd/commands/handlers/parallel.ts +12 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
- package/src/resources/extensions/gsd/context-store.ts +120 -1
- package/src/resources/extensions/gsd/db-writer.ts +167 -84
- package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +44 -6
- package/src/resources/extensions/gsd/doctor-types.ts +2 -0
- package/src/resources/extensions/gsd/git-service.ts +2 -0
- package/src/resources/extensions/gsd/gsd-db.ts +7 -23
- package/src/resources/extensions/gsd/health-widget-core.ts +1 -1
- package/src/resources/extensions/gsd/health-widget.ts +6 -10
- package/src/resources/extensions/gsd/journal.ts +2 -0
- package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
- package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
- package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
- package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +10 -96
- package/src/resources/extensions/gsd/md-importer.ts +1 -1
- package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
- package/src/resources/extensions/gsd/migrate/command.ts +5 -0
- package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
- package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
- package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +14 -13
- package/src/resources/extensions/gsd/notification-overlay.ts +50 -46
- package/src/resources/extensions/gsd/parallel-merge.ts +61 -34
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +33 -35
- package/src/resources/extensions/gsd/prompts/complete-slice.md +14 -12
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
- package/src/resources/extensions/gsd/prompts/discuss.md +20 -2
- package/src/resources/extensions/gsd/prompts/system.md +2 -2
- package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
- package/src/resources/extensions/gsd/recovery-classification.ts +18 -1
- package/src/resources/extensions/gsd/session-lock.ts +41 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +172 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +337 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +69 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +109 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +68 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +185 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +46 -0
- package/src/resources/extensions/gsd/state-reconciliation/errors.ts +67 -0
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +142 -0
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +27 -0
- package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +60 -0
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +83 -0
- package/src/resources/extensions/gsd/state-reconciliation.ts +21 -53
- package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +729 -176
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +408 -4
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +291 -4
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +20 -5
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +28 -1
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
- package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +20 -2
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
- package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +14 -4
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
- package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +116 -24
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -1
- package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
- package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
- package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +46 -11
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +78 -41
- package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +12 -217
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +38 -6
- package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
- package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +65 -58
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +952 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +158 -58
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +572 -118
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +59 -2
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +18 -0
- package/src/resources/extensions/gsd/tui/render-kit.ts +109 -0
- package/src/resources/extensions/gsd/watch/header-renderer.ts +121 -79
- package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +1151 -524
- package/src/resources/extensions/gsd/worktree-telemetry.ts +7 -2
- package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -1544
- /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → YEvjuT-fsFfYQhDSWtueS}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → YEvjuT-fsFfYQhDSWtueS}/_ssgManifest.js +0 -0
|
@@ -16,6 +16,7 @@ import type {
|
|
|
16
16
|
ExtensionAPI,
|
|
17
17
|
ExtensionContext,
|
|
18
18
|
ExtensionCommandContext,
|
|
19
|
+
SessionMessageEntry,
|
|
19
20
|
} from "@gsd/pi-coding-agent";
|
|
20
21
|
|
|
21
22
|
import { deriveState } from "./state.js";
|
|
@@ -32,7 +33,7 @@ import {
|
|
|
32
33
|
setRuntimeKv,
|
|
33
34
|
deleteRuntimeKv,
|
|
34
35
|
} from "./db/runtime-kv.js";
|
|
35
|
-
import { getManifestStatus } from "./files.js";
|
|
36
|
+
import { extractSection, getManifestStatus, splitFrontmatter, parseFrontmatterMap } from "./files.js";
|
|
36
37
|
export { inlinePriorMilestoneSummary } from "./files.js";
|
|
37
38
|
import { collectSecretsFromManifest } from "../get-secrets-from-user.js";
|
|
38
39
|
import {
|
|
@@ -188,6 +189,8 @@ import { isClosedStatus } from "./status-guards.js";
|
|
|
188
189
|
import {
|
|
189
190
|
type AutoDashboardData,
|
|
190
191
|
updateProgressWidget as _updateProgressWidget,
|
|
192
|
+
setCompletionProgressWidget,
|
|
193
|
+
setAutoOutcomeWidget,
|
|
191
194
|
updateSliceProgressCache,
|
|
192
195
|
clearSliceProgressCache,
|
|
193
196
|
describeNextUnit as _describeNextUnit,
|
|
@@ -201,7 +204,7 @@ import {
|
|
|
201
204
|
deregisterSigtermHandler as _deregisterSigtermHandler,
|
|
202
205
|
detectWorkingTreeActivity,
|
|
203
206
|
} from "./auto-supervisor.js";
|
|
204
|
-
import { isDbAvailable, getMilestone } from "./gsd-db.js";
|
|
207
|
+
import { isDbAvailable, getMilestone, getMilestoneSlices } from "./gsd-db.js";
|
|
205
208
|
import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
|
|
206
209
|
import { writeUnitRuntimeRecord } from "./unit-runtime.js";
|
|
207
210
|
import { countPendingCaptures } from "./captures.js";
|
|
@@ -231,18 +234,20 @@ import { bootstrapAutoSession, openProjectDbIfPresent, type BootstrapDeps } from
|
|
|
231
234
|
import { initHealthWidget } from "./health-widget.js";
|
|
232
235
|
import { runLegacyAutoLoop, runUokKernelLoop } from "./auto/loop.js";
|
|
233
236
|
import { resolveAgentEnd, resolveAgentEndCancelled, _resetPendingResolve, isSessionSwitchInFlight } from "./auto/resolve.js";
|
|
234
|
-
import type { LoopDeps } from "./auto/loop-deps.js";
|
|
237
|
+
import type { LoopDeps, StopAutoOptions } from "./auto/loop-deps.js";
|
|
235
238
|
import type { ErrorContext } from "./auto/types.js";
|
|
236
239
|
import { runAutoLoopWithUok } from "./uok/kernel.js";
|
|
237
240
|
import { resolveUokFlags } from "./uok/flags.js";
|
|
238
241
|
import { validateDirectory } from "./validate-directory.js";
|
|
239
242
|
import { createAutoOrchestrator } from "./auto/orchestrator.js";
|
|
240
|
-
import type { AutoOrchestrationModule, AutoOrchestratorDeps } from "./auto/contracts.js";
|
|
243
|
+
import type { AutoOrchestrationModule, AutoOrchestratorDeps, DispatchAdapter } from "./auto/contracts.js";
|
|
241
244
|
import { reconcileBeforeDispatch } from "./state-reconciliation.js";
|
|
242
245
|
import { compileUnitToolContract } from "./tool-contract.js";
|
|
243
246
|
import { createWorktreeSafetyModule } from "./worktree-safety.js";
|
|
244
247
|
import { resolveManifest } from "./unit-context-manifest.js";
|
|
245
248
|
import { classifyFailure } from "./recovery-classification.js";
|
|
249
|
+
import { supportsStructuredQuestions } from "./workflow-mcp.js";
|
|
250
|
+
import type { MinimalModelRegistry } from "./context-budget.js";
|
|
246
251
|
// Slice-level parallelism (#2340)
|
|
247
252
|
import { getEligibleSlices } from "./slice-parallel-eligibility.js";
|
|
248
253
|
import { startSliceParallel } from "./slice-parallel-orchestrator.js";
|
|
@@ -456,15 +461,10 @@ export function _synthesizePausedSessionRecoveryForTest(
|
|
|
456
461
|
return synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile);
|
|
457
462
|
}
|
|
458
463
|
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
): string {
|
|
464
|
-
return pausedWorktreePath && pathExists(pausedWorktreePath)
|
|
465
|
-
? pausedWorktreePath
|
|
466
|
-
: basePath;
|
|
467
|
-
}
|
|
464
|
+
// `_resolvePausedResumeBasePathForTest` was retired in ADR-016 phase 2 / B3
|
|
465
|
+
// (#5621). Production callers go through
|
|
466
|
+
// `WorktreeLifecycle.resumeFromPausedSession`; the pure helper for tests is
|
|
467
|
+
// `resolvePausedResumeBasePath` exported from `worktree-lifecycle.ts`.
|
|
468
468
|
|
|
469
469
|
const DETACHED_AUTO_KEEPALIVE_INTERVAL_MS = 30_000;
|
|
470
470
|
|
|
@@ -668,6 +668,10 @@ export function isAutoActive(): boolean {
|
|
|
668
668
|
return s.active;
|
|
669
669
|
}
|
|
670
670
|
|
|
671
|
+
export function isAutoCompletionStopInProgress(): boolean {
|
|
672
|
+
return s.completionStopInProgress;
|
|
673
|
+
}
|
|
674
|
+
|
|
671
675
|
/** Test-only seam for validating auto-mode guards (#4704). Do not use in production code. */
|
|
672
676
|
export function _setAutoActiveForTest(active: boolean): void {
|
|
673
677
|
s.active = active;
|
|
@@ -928,6 +932,31 @@ function buildSnapshotOpts(
|
|
|
928
932
|
};
|
|
929
933
|
}
|
|
930
934
|
|
|
935
|
+
function currentUnitLabel(): string | null {
|
|
936
|
+
if (!s.currentUnit) return null;
|
|
937
|
+
return `${unitVerb(s.currentUnit.type)} ${s.currentUnit.id}`;
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
function setLifecycleOutcome(
|
|
941
|
+
ctx: ExtensionContext | undefined,
|
|
942
|
+
input: {
|
|
943
|
+
status: "paused" | "stopped" | "blocked" | "failed" | "complete" | "waiting" | "step";
|
|
944
|
+
title: string;
|
|
945
|
+
detail?: string | null;
|
|
946
|
+
nextAction: string;
|
|
947
|
+
commands?: string[];
|
|
948
|
+
unitLabel?: string | null;
|
|
949
|
+
},
|
|
950
|
+
): void {
|
|
951
|
+
if (!ctx?.hasUI) return;
|
|
952
|
+
const { unitLabel: unitLabelOverride, ...rest } = input;
|
|
953
|
+
setAutoOutcomeWidget(ctx, {
|
|
954
|
+
...rest,
|
|
955
|
+
unitLabel: unitLabelOverride !== undefined ? unitLabelOverride : currentUnitLabel(),
|
|
956
|
+
startedAt: s.autoStartTime,
|
|
957
|
+
});
|
|
958
|
+
}
|
|
959
|
+
|
|
931
960
|
function handleLostSessionLock(
|
|
932
961
|
ctx?: ExtensionContext,
|
|
933
962
|
lockStatus?: SessionLockStatus,
|
|
@@ -1015,27 +1044,42 @@ export async function cleanupAfterLoopExit(ctx: ExtensionContext): Promise<void>
|
|
|
1015
1044
|
// visible so the user still has a resumable auto-mode signal on screen.
|
|
1016
1045
|
if (!s.paused) {
|
|
1017
1046
|
ctx.ui.setStatus("gsd-auto", undefined);
|
|
1018
|
-
|
|
1047
|
+
if (s.completionStopInProgress) {
|
|
1048
|
+
s.completionStopInProgress = false;
|
|
1049
|
+
}
|
|
1019
1050
|
initHealthWidget(ctx);
|
|
1020
1051
|
}
|
|
1021
1052
|
|
|
1022
|
-
//
|
|
1053
|
+
// ADR-016 phase 3 (#5693): the stop-path basePath restore routes through
|
|
1054
|
+
// `Lifecycle.restoreToProjectRoot()`, the sole owner of `s.basePath`
|
|
1055
|
+
// mutation. The verb assigns `s.basePath` before any throwable work
|
|
1056
|
+
// (rebuildGitService, cache invalidation), so a thrown error still leaves
|
|
1057
|
+
// basePath restored — no fallback assignment needed at the call site.
|
|
1058
|
+
// The chdir stays here because `restoreToProjectRoot` is a pure
|
|
1059
|
+
// session-state mutation.
|
|
1023
1060
|
if (s.originalBasePath) {
|
|
1024
|
-
s.basePath = s.originalBasePath;
|
|
1025
1061
|
try {
|
|
1026
|
-
|
|
1062
|
+
buildLifecycle().restoreToProjectRoot();
|
|
1027
1063
|
} catch (err) {
|
|
1028
|
-
|
|
1029
|
-
|
|
1064
|
+
logWarning(
|
|
1065
|
+
"engine",
|
|
1066
|
+
`restore project root failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
1067
|
+
{ file: "auto.ts" },
|
|
1068
|
+
);
|
|
1069
|
+
}
|
|
1070
|
+
try {
|
|
1071
|
+
process.chdir(s.originalBasePath);
|
|
1072
|
+
} catch (err) {
|
|
1073
|
+
logWarning("engine", `basePath restore/chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
1030
1074
|
}
|
|
1031
1075
|
}
|
|
1032
1076
|
|
|
1033
1077
|
if (s.originalBasePath && s.cmdCtx) {
|
|
1034
|
-
const result = await rerootCommandSession(s.cmdCtx, s.
|
|
1078
|
+
const result = await rerootCommandSession(s.cmdCtx, s.originalBasePath);
|
|
1035
1079
|
if (result.status === "cancelled") {
|
|
1036
|
-
logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.
|
|
1080
|
+
logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.originalBasePath });
|
|
1037
1081
|
} else if (result.status === "failed") {
|
|
1038
|
-
logWarning("engine", `post-loop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.
|
|
1082
|
+
logWarning("engine", `post-loop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.originalBasePath });
|
|
1039
1083
|
}
|
|
1040
1084
|
}
|
|
1041
1085
|
}
|
|
@@ -1046,6 +1090,58 @@ export function _cleanupAfterLoopExitForTest(ctx: ExtensionContext): Promise<voi
|
|
|
1046
1090
|
|
|
1047
1091
|
export type AutoWorktreeExitAction = "skip" | "merge" | "preserve";
|
|
1048
1092
|
|
|
1093
|
+
interface MilestoneCompletionRollup {
|
|
1094
|
+
milestoneTitle?: string;
|
|
1095
|
+
oneLiner?: string;
|
|
1096
|
+
successCriteriaResults?: string;
|
|
1097
|
+
definitionOfDoneResults?: string;
|
|
1098
|
+
requirementOutcomes?: string;
|
|
1099
|
+
deviations?: string;
|
|
1100
|
+
followUps?: string;
|
|
1101
|
+
keyDecisions?: string[];
|
|
1102
|
+
keyFiles?: string[];
|
|
1103
|
+
lessonsLearned?: string[];
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
function normalizeFrontmatterList(value: unknown): string[] {
|
|
1107
|
+
if (!Array.isArray(value)) return [];
|
|
1108
|
+
return value
|
|
1109
|
+
.map(item => typeof item === "string" ? item.trim() : "")
|
|
1110
|
+
.filter(item => item.length > 0 && item !== "(none)");
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
function firstBoldParagraph(body: string): string | undefined {
|
|
1114
|
+
const match = body.match(/\*\*([^*\n][\s\S]*?)\*\*/);
|
|
1115
|
+
return match?.[1]?.replace(/\s+/g, " ").trim() || undefined;
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1118
|
+
function loadMilestoneCompletionRollup(basePath: string, milestoneId: string | null | undefined): MilestoneCompletionRollup {
|
|
1119
|
+
if (!milestoneId) return {};
|
|
1120
|
+
const summaryPath = resolveMilestoneFile(basePath, milestoneId, "SUMMARY");
|
|
1121
|
+
if (!summaryPath || !existsSync(summaryPath)) return {};
|
|
1122
|
+
|
|
1123
|
+
try {
|
|
1124
|
+
const raw = readFileSync(summaryPath, "utf-8");
|
|
1125
|
+
const [frontmatterLines, body] = splitFrontmatter(raw);
|
|
1126
|
+
const frontmatter = frontmatterLines ? parseFrontmatterMap(frontmatterLines) : {};
|
|
1127
|
+
return {
|
|
1128
|
+
milestoneTitle: typeof frontmatter.title === "string" ? frontmatter.title : undefined,
|
|
1129
|
+
oneLiner: firstBoldParagraph(body),
|
|
1130
|
+
successCriteriaResults: extractSection(body, "Success Criteria Results") ?? undefined,
|
|
1131
|
+
definitionOfDoneResults: extractSection(body, "Definition of Done Results") ?? undefined,
|
|
1132
|
+
requirementOutcomes: extractSection(body, "Requirement Outcomes") ?? undefined,
|
|
1133
|
+
deviations: extractSection(body, "Deviations") ?? undefined,
|
|
1134
|
+
followUps: extractSection(body, "Follow-ups") ?? undefined,
|
|
1135
|
+
keyDecisions: normalizeFrontmatterList(frontmatter.key_decisions),
|
|
1136
|
+
keyFiles: normalizeFrontmatterList(frontmatter.key_files),
|
|
1137
|
+
lessonsLearned: normalizeFrontmatterList(frontmatter.lessons_learned),
|
|
1138
|
+
};
|
|
1139
|
+
} catch (err) {
|
|
1140
|
+
logWarning("dashboard", `completion roll-up summary read failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1141
|
+
return {};
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1049
1145
|
export function _resolveAutoWorktreeExitActionForTest(
|
|
1050
1146
|
currentMilestoneId: string | null | undefined,
|
|
1051
1147
|
milestoneMergedInPhases: boolean,
|
|
@@ -1063,15 +1159,17 @@ export async function stopAuto(
|
|
|
1063
1159
|
ctx?: ExtensionContext,
|
|
1064
1160
|
pi?: ExtensionAPI,
|
|
1065
1161
|
reason?: string,
|
|
1162
|
+
options: StopAutoOptions = {},
|
|
1066
1163
|
): Promise<void> {
|
|
1067
1164
|
if (!s.active && !s.paused) return;
|
|
1068
1165
|
const loadedPreferences = loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences;
|
|
1069
1166
|
const reasonSuffix = reason ? ` — ${reason}` : "";
|
|
1167
|
+
const preserveCompletionSurface = Boolean(options.completionWidget);
|
|
1168
|
+
s.completionStopInProgress = preserveCompletionSurface;
|
|
1070
1169
|
|
|
1071
|
-
// #4764 — telemetry: record the exit reason
|
|
1072
|
-
// was
|
|
1073
|
-
//
|
|
1074
|
-
// is exactly the pattern that strands work.
|
|
1170
|
+
// #4764 — telemetry: record the exit reason, isolation mode, whether an auto
|
|
1171
|
+
// worktree was active, and whether the current milestone was merged before
|
|
1172
|
+
// stopAuto. The unmerged-work warning is only meaningful for real worktrees.
|
|
1075
1173
|
try {
|
|
1076
1174
|
const { emitAutoExit } = await import("./worktree-telemetry.js");
|
|
1077
1175
|
type AutoExitReason =
|
|
@@ -1096,10 +1194,13 @@ export async function stopAuto(
|
|
|
1096
1194
|
: rawReason === "stop" || rawReason === "pause"
|
|
1097
1195
|
? rawReason
|
|
1098
1196
|
: "other";
|
|
1099
|
-
|
|
1197
|
+
const telemetryBase = s.originalBasePath || s.basePath;
|
|
1198
|
+
emitAutoExit(telemetryBase, {
|
|
1100
1199
|
reason: normalizedReason,
|
|
1101
1200
|
milestoneId: s.currentMilestoneId ?? undefined,
|
|
1102
1201
|
milestoneMerged: s.milestoneMergedInPhases === true,
|
|
1202
|
+
isolationMode: getIsolationMode(telemetryBase),
|
|
1203
|
+
worktreeActive: isInAutoWorktree(s.basePath),
|
|
1103
1204
|
});
|
|
1104
1205
|
} catch (err) {
|
|
1105
1206
|
logWarning("engine", `auto-exit telemetry failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -1257,6 +1358,21 @@ export async function stopAuto(
|
|
|
1257
1358
|
}
|
|
1258
1359
|
}
|
|
1259
1360
|
|
|
1361
|
+
// Pre-compute completion widget slice counts while the DB is still open.
|
|
1362
|
+
// Step 8 runs after closeDatabase(), so DB-backed slice lookups must happen here.
|
|
1363
|
+
const completionMilestoneId = options.completionWidget?.milestoneId ?? s.currentMilestoneId;
|
|
1364
|
+
let completedSlices: number | null = null;
|
|
1365
|
+
let totalSlices: number | null = null;
|
|
1366
|
+
if (preserveCompletionSurface && options.completionWidget && completionMilestoneId && isDbAvailable()) {
|
|
1367
|
+
try {
|
|
1368
|
+
const slices = getMilestoneSlices(completionMilestoneId);
|
|
1369
|
+
completedSlices = slices.filter(slice => isClosedStatus(slice.status)).length;
|
|
1370
|
+
totalSlices = slices.length;
|
|
1371
|
+
} catch (err) {
|
|
1372
|
+
logWarning("dashboard", `completion slice stats lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
|
|
1260
1376
|
// ── Step 6: DB cleanup ──
|
|
1261
1377
|
if (isDbAvailable()) {
|
|
1262
1378
|
try {
|
|
@@ -1269,19 +1385,21 @@ export async function stopAuto(
|
|
|
1269
1385
|
}
|
|
1270
1386
|
}
|
|
1271
1387
|
|
|
1272
|
-
// ── Step 7: Restore basePath and chdir ──
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1388
|
+
// ── Step 7: Restore basePath and chdir (ADR-016 phase 3, #5693) ──
|
|
1389
|
+
// `restoreToProjectRoot` assigns s.basePath before any throwable work;
|
|
1390
|
+
// no fallback assignment is needed at the call site.
|
|
1391
|
+
if (s.originalBasePath) {
|
|
1392
|
+
try {
|
|
1393
|
+
buildLifecycle().restoreToProjectRoot();
|
|
1394
|
+
} catch (e) {
|
|
1395
|
+
debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
|
|
1396
|
+
}
|
|
1397
|
+
try {
|
|
1398
|
+
process.chdir(s.basePath);
|
|
1399
|
+
} catch (err) {
|
|
1400
|
+
/* best-effort */
|
|
1401
|
+
logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
1282
1402
|
}
|
|
1283
|
-
} catch (e) {
|
|
1284
|
-
debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
|
|
1285
1403
|
}
|
|
1286
1404
|
|
|
1287
1405
|
// Re-root the active command session/tool runtime after worktree teardown.
|
|
@@ -1289,30 +1407,91 @@ export async function stopAuto(
|
|
|
1289
1407
|
// its own cwd for tools and system prompt; refresh it before returning to the
|
|
1290
1408
|
// user so follow-up commands do not target a removed milestone worktree.
|
|
1291
1409
|
if (s.originalBasePath && ctx && s.cmdCtx) {
|
|
1292
|
-
const result = await rerootCommandSession(s.cmdCtx, s.
|
|
1410
|
+
const result = await rerootCommandSession(s.cmdCtx, s.originalBasePath);
|
|
1293
1411
|
if (result.status === "cancelled") {
|
|
1294
|
-
logWarning("engine", "post-stop session re-root was cancelled", { file: "auto.ts", basePath: s.
|
|
1412
|
+
logWarning("engine", "post-stop session re-root was cancelled", { file: "auto.ts", basePath: s.originalBasePath });
|
|
1295
1413
|
} else if (result.status === "failed") {
|
|
1296
|
-
logWarning("engine", `post-stop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.
|
|
1414
|
+
logWarning("engine", `post-stop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.originalBasePath });
|
|
1297
1415
|
}
|
|
1298
1416
|
}
|
|
1299
1417
|
|
|
1300
1418
|
// ── Step 8: Ledger notification ──
|
|
1301
1419
|
try {
|
|
1302
1420
|
const ledger = getLedger();
|
|
1421
|
+
const isAllComplete = reason === "All milestones complete";
|
|
1422
|
+
const isMilestoneComplete = /^Milestone\s+\S+\s+complete$/i.test(reason ?? "");
|
|
1423
|
+
const notificationPrefix = isAllComplete
|
|
1424
|
+
? "All milestones complete"
|
|
1425
|
+
: isMilestoneComplete
|
|
1426
|
+
? `${reason}. Auto-mode finished this milestone`
|
|
1427
|
+
: `Auto-mode stopped${reasonSuffix}`;
|
|
1303
1428
|
if (ledger && ledger.units.length > 0) {
|
|
1304
1429
|
const totals = getProjectTotals(ledger.units);
|
|
1305
1430
|
ctx?.ui.notify(
|
|
1306
|
-
|
|
1431
|
+
`${notificationPrefix}. Session: ${formatCost(totals.cost)} · ${formatTokenCount(totals.tokens.total)} tokens · ${ledger.units.length} units`,
|
|
1307
1432
|
"info",
|
|
1308
1433
|
);
|
|
1309
1434
|
} else {
|
|
1310
|
-
ctx?.ui.notify(
|
|
1435
|
+
ctx?.ui.notify(`${notificationPrefix}.`, "info");
|
|
1311
1436
|
}
|
|
1312
1437
|
} catch (e) {
|
|
1313
1438
|
debugLog("stop-cleanup-ledger", { error: e instanceof Error ? e.message : String(e) });
|
|
1314
1439
|
}
|
|
1315
1440
|
|
|
1441
|
+
if (preserveCompletionSurface && ctx && options.completionWidget) {
|
|
1442
|
+
const ledger = getLedger();
|
|
1443
|
+
const units = ledger?.units ?? [];
|
|
1444
|
+
const totals = units.length > 0 ? getProjectTotals(units) : null;
|
|
1445
|
+
let totalInput = 0;
|
|
1446
|
+
let totalCacheRead = 0;
|
|
1447
|
+
try {
|
|
1448
|
+
for (const entry of s.cmdCtx?.sessionManager?.getEntries?.() ?? []) {
|
|
1449
|
+
if (entry.type === "message") {
|
|
1450
|
+
const msgEntry = entry as SessionMessageEntry;
|
|
1451
|
+
if (msgEntry.message?.role === "assistant") {
|
|
1452
|
+
const usage = (msgEntry.message as any).usage;
|
|
1453
|
+
if (usage) {
|
|
1454
|
+
totalInput += usage.input || 0;
|
|
1455
|
+
totalCacheRead += usage.cacheRead || 0;
|
|
1456
|
+
}
|
|
1457
|
+
}
|
|
1458
|
+
}
|
|
1459
|
+
}
|
|
1460
|
+
} catch (err) {
|
|
1461
|
+
logWarning("dashboard", `completion stats lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1462
|
+
}
|
|
1463
|
+
const contextUsage = s.cmdCtx?.getContextUsage?.();
|
|
1464
|
+
const milestoneId = completionMilestoneId;
|
|
1465
|
+
const rollup = loadMilestoneCompletionRollup(s.originalBasePath || s.basePath, milestoneId);
|
|
1466
|
+
setCompletionProgressWidget(ctx, {
|
|
1467
|
+
milestoneId,
|
|
1468
|
+
milestoneTitle: options.completionWidget.milestoneTitle ?? rollup.milestoneTitle,
|
|
1469
|
+
oneLiner: rollup.oneLiner,
|
|
1470
|
+
successCriteriaResults: rollup.successCriteriaResults,
|
|
1471
|
+
definitionOfDoneResults: rollup.definitionOfDoneResults,
|
|
1472
|
+
requirementOutcomes: rollup.requirementOutcomes,
|
|
1473
|
+
deviations: rollup.deviations,
|
|
1474
|
+
followUps: rollup.followUps,
|
|
1475
|
+
keyDecisions: rollup.keyDecisions,
|
|
1476
|
+
keyFiles: rollup.keyFiles,
|
|
1477
|
+
lessonsLearned: rollup.lessonsLearned,
|
|
1478
|
+
reason: reason ?? "Milestone complete",
|
|
1479
|
+
startedAt: s.autoStartTime,
|
|
1480
|
+
totalCost: totals?.cost ?? 0,
|
|
1481
|
+
totalTokens: totals?.tokens.total ?? 0,
|
|
1482
|
+
unitCount: units.length,
|
|
1483
|
+
cacheHitRate: totalCacheRead + totalInput > 0
|
|
1484
|
+
? (totalCacheRead / (totalCacheRead + totalInput)) * 100
|
|
1485
|
+
: null,
|
|
1486
|
+
contextPercent: contextUsage?.percent ?? null,
|
|
1487
|
+
contextWindow: contextUsage?.contextWindow ?? s.cmdCtx?.model?.contextWindow ?? null,
|
|
1488
|
+
completedSlices,
|
|
1489
|
+
totalSlices,
|
|
1490
|
+
allMilestonesComplete: options.completionWidget.allMilestonesComplete,
|
|
1491
|
+
basePath: s.originalBasePath || s.basePath || null,
|
|
1492
|
+
});
|
|
1493
|
+
}
|
|
1494
|
+
|
|
1316
1495
|
// ── Step 9: Cmux sidebar / event log ──
|
|
1317
1496
|
try {
|
|
1318
1497
|
pi?.events.emit(CMUX_CHANNELS.SIDEBAR, { action: "clear" as const, preferences: loadedPreferences });
|
|
@@ -1403,8 +1582,20 @@ export async function stopAuto(
|
|
|
1403
1582
|
|
|
1404
1583
|
// UI cleanup
|
|
1405
1584
|
ctx?.ui.setStatus("gsd-auto", undefined);
|
|
1406
|
-
|
|
1407
|
-
|
|
1585
|
+
if (!preserveCompletionSurface) {
|
|
1586
|
+
ctx?.ui.setWidget("gsd-progress", undefined);
|
|
1587
|
+
const status = reason?.startsWith("Blocked:") ? "blocked" : reason?.toLowerCase().includes("fail") ? "failed" : "stopped";
|
|
1588
|
+
setLifecycleOutcome(ctx, {
|
|
1589
|
+
status,
|
|
1590
|
+
title: status === "blocked" ? "Auto-mode blocked" : status === "failed" ? "Auto-mode stopped with an issue" : "Auto-mode stopped",
|
|
1591
|
+
detail: reason ?? "Auto-mode stopped.",
|
|
1592
|
+
nextAction: status === "blocked"
|
|
1593
|
+
? "Fix the blocker, then run /gsd auto to resume."
|
|
1594
|
+
: "Run /gsd status for the current project state, or /gsd auto to continue.",
|
|
1595
|
+
commands: ["/gsd status for overview", "/gsd auto to run", "/gsd visualize to inspect", "/gsd notifications for history"],
|
|
1596
|
+
});
|
|
1597
|
+
if (ctx) initHealthWidget(ctx);
|
|
1598
|
+
}
|
|
1408
1599
|
restoreProjectRootEnv();
|
|
1409
1600
|
restoreMilestoneLockEnv();
|
|
1410
1601
|
|
|
@@ -1421,7 +1612,7 @@ export async function stopAuto(
|
|
|
1421
1612
|
}
|
|
1422
1613
|
|
|
1423
1614
|
// Reset all session state in one call
|
|
1424
|
-
s.
|
|
1615
|
+
s.resetAfterStop({ preserveCompletionSurface });
|
|
1425
1616
|
}
|
|
1426
1617
|
}
|
|
1427
1618
|
|
|
@@ -1495,6 +1686,8 @@ export async function pauseAuto(
|
|
|
1495
1686
|
logWarning("engine", `paused-session DB write failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
1496
1687
|
}
|
|
1497
1688
|
|
|
1689
|
+
const pausedUnitLabel = currentUnitLabel();
|
|
1690
|
+
|
|
1498
1691
|
// Close out the current unit so its runtime record doesn't stay at "dispatched"
|
|
1499
1692
|
if (s.currentUnit && ctx) {
|
|
1500
1693
|
try {
|
|
@@ -1545,8 +1738,16 @@ export async function pauseAuto(
|
|
|
1545
1738
|
s.verificationRetryCount.clear();
|
|
1546
1739
|
ctx?.ui.setStatus("gsd-auto", "paused");
|
|
1547
1740
|
ctx?.ui.setWidget("gsd-progress", undefined);
|
|
1548
|
-
if (ctx) initHealthWidget(ctx);
|
|
1549
1741
|
const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
|
|
1742
|
+
setLifecycleOutcome(ctx, {
|
|
1743
|
+
status: "paused",
|
|
1744
|
+
title: `${s.stepMode ? "Step" : "Auto"}-mode paused`,
|
|
1745
|
+
detail: _errorContext?.message ?? "Paused by user request.",
|
|
1746
|
+
nextAction: `Type to steer, or run ${resumeCmd} to resume.`,
|
|
1747
|
+
commands: [resumeCmd, "/gsd status for overview", "/gsd notifications for history"],
|
|
1748
|
+
unitLabel: pausedUnitLabel,
|
|
1749
|
+
});
|
|
1750
|
+
if (ctx) initHealthWidget(ctx);
|
|
1550
1751
|
ctx?.ui.notify(
|
|
1551
1752
|
`${s.stepMode ? "Step" : "Auto"}-mode paused (Escape). Type to interact, or ${resumeCmd} to resume.`,
|
|
1552
1753
|
"info",
|
|
@@ -1561,29 +1762,105 @@ export async function pauseAuto(
|
|
|
1561
1762
|
* deps bag is intentionally focused — Lifecycle does not see the wider auto-
|
|
1562
1763
|
* mode dependency graph.
|
|
1563
1764
|
*/
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1765
|
+
/**
|
|
1766
|
+
* Construct a `WorktreeLifecycleDeps` bag without binding to any session.
|
|
1767
|
+
*
|
|
1768
|
+
* Exported so session-less callers (currently `parallel-merge.ts`) can build
|
|
1769
|
+
* the same deps and call `mergeMilestoneStandalone` through the Worktree
|
|
1770
|
+
* Lifecycle Module instead of bypassing it (ADR-016 phase 2 / A2).
|
|
1771
|
+
*/
|
|
1772
|
+
export function buildWorktreeLifecycleDeps(): WorktreeLifecycleDeps {
|
|
1773
|
+
// ADR-016 phase 2 / C-track close-out:
|
|
1774
|
+
// C1 (#5624) — fs + git-CLI primitives inlined
|
|
1775
|
+
// C2 (#5625) — worktree-manager helpers inlined
|
|
1776
|
+
// C3 (#5626) — cache + preferences + paths inlined
|
|
1777
|
+
// C4 (#5627) — GitServiceImpl constructor → gitServiceFactory
|
|
1778
|
+
//
|
|
1779
|
+
// Final WorktreeLifecycleDeps shape: 3 fields (gitServiceFactory,
|
|
1780
|
+
// worktreeProjection, mergeMilestoneToMain). Down from 18 at slice-7
|
|
1781
|
+
// closure.
|
|
1782
|
+
return {
|
|
1783
|
+
gitServiceFactory: (basePath: string) => {
|
|
1784
|
+
const gitConfig =
|
|
1785
|
+
loadEffectiveGSDPreferences()?.preferences?.git ?? {};
|
|
1786
|
+
return new GitServiceImpl(basePath, gitConfig);
|
|
1787
|
+
},
|
|
1574
1788
|
worktreeProjection: new WorktreeStateProjection(),
|
|
1575
|
-
isInAutoWorktree,
|
|
1576
|
-
autoCommitCurrentBranch,
|
|
1577
|
-
autoWorktreeBranch,
|
|
1578
|
-
teardownAutoWorktree,
|
|
1579
1789
|
mergeMilestoneToMain,
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1790
|
+
};
|
|
1791
|
+
}
|
|
1792
|
+
|
|
1793
|
+
function buildLifecycle(): WorktreeLifecycle {
|
|
1794
|
+
return new WorktreeLifecycle(s, buildWorktreeLifecycleDeps());
|
|
1795
|
+
}
|
|
1796
|
+
|
|
1797
|
+
/**
|
|
1798
|
+
* Build the production `DispatchAdapter` used by `createWiredAutoOrchestrationModule`.
|
|
1799
|
+
*
|
|
1800
|
+
* Exported so tests can verify parity with `runDispatch`'s `resolveDispatch` call —
|
|
1801
|
+
* the wired adapter must derive `structuredQuestionsAvailable`, `sessionContextWindow`,
|
|
1802
|
+
* `sessionProvider`, and `modelRegistry` the same way phases.ts:runDispatch does.
|
|
1803
|
+
*/
|
|
1804
|
+
export function createWiredDispatchAdapter(
|
|
1805
|
+
ctx: ExtensionContext,
|
|
1806
|
+
pi: ExtensionAPI,
|
|
1807
|
+
dispatchBasePath: string,
|
|
1808
|
+
): DispatchAdapter {
|
|
1809
|
+
return {
|
|
1810
|
+
async decideNextUnit(input) {
|
|
1811
|
+
const state = input.stateSnapshot;
|
|
1812
|
+
const active = state.activeMilestone;
|
|
1813
|
+
if (!active) return null;
|
|
1814
|
+
|
|
1815
|
+
const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
|
|
1816
|
+
|
|
1817
|
+
// Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
|
|
1818
|
+
// (#5789). Prefer caller-supplied values when present so test harnesses and
|
|
1819
|
+
// alternative wirings can inject deterministic snapshots; otherwise pull from
|
|
1820
|
+
// the captured pi/ctx references.
|
|
1821
|
+
const sessionProvider = input.sessionProvider ?? ctx.model?.provider;
|
|
1822
|
+
const sessionContextWindow = input.sessionContextWindow ?? ctx.model?.contextWindow;
|
|
1823
|
+
const modelRegistry = input.modelRegistry ?? (ctx.modelRegistry as MinimalModelRegistry | undefined);
|
|
1824
|
+
const authMode =
|
|
1825
|
+
sessionProvider && typeof ctx.modelRegistry?.getProviderAuthMode === "function"
|
|
1826
|
+
? ctx.modelRegistry.getProviderAuthMode(sessionProvider)
|
|
1827
|
+
: undefined;
|
|
1828
|
+
const activeTools = typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [];
|
|
1829
|
+
// Mirrors runDispatch: deep-planning keeps approval gates in plain chat
|
|
1830
|
+
// because structured questions can be cancelled outside the chat turn on
|
|
1831
|
+
// some transports.
|
|
1832
|
+
const structuredQuestionsAvailable =
|
|
1833
|
+
input.structuredQuestionsAvailable ??
|
|
1834
|
+
(prefs?.planning_depth === "deep"
|
|
1835
|
+
? "false"
|
|
1836
|
+
: supportsStructuredQuestions(activeTools, {
|
|
1837
|
+
authMode,
|
|
1838
|
+
baseUrl: ctx.model?.baseUrl,
|
|
1839
|
+
})
|
|
1840
|
+
? "true"
|
|
1841
|
+
: "false");
|
|
1842
|
+
|
|
1843
|
+
const action = await resolveDispatch({
|
|
1844
|
+
basePath: dispatchBasePath,
|
|
1845
|
+
mid: active.id,
|
|
1846
|
+
midTitle: active.title,
|
|
1847
|
+
state,
|
|
1848
|
+
prefs,
|
|
1849
|
+
structuredQuestionsAvailable,
|
|
1850
|
+
sessionContextWindow,
|
|
1851
|
+
sessionProvider,
|
|
1852
|
+
modelRegistry,
|
|
1853
|
+
});
|
|
1854
|
+
|
|
1855
|
+
if (action.action !== "dispatch") return null;
|
|
1856
|
+
return {
|
|
1857
|
+
unitType: action.unitType,
|
|
1858
|
+
unitId: action.unitId,
|
|
1859
|
+
reason: action.matchedRule ?? "dispatch",
|
|
1860
|
+
preconditions: [],
|
|
1861
|
+
};
|
|
1862
|
+
},
|
|
1863
|
+
};
|
|
1587
1864
|
}
|
|
1588
1865
|
|
|
1589
1866
|
/**
|
|
@@ -1595,7 +1872,7 @@ function buildLifecycle(): WorktreeLifecycle {
|
|
|
1595
1872
|
*/
|
|
1596
1873
|
export function createWiredAutoOrchestrationModule(
|
|
1597
1874
|
ctx: ExtensionContext,
|
|
1598
|
-
|
|
1875
|
+
pi: ExtensionAPI,
|
|
1599
1876
|
dispatchBasePath: string,
|
|
1600
1877
|
runtimeBasePath = resolveProjectRoot(dispatchBasePath),
|
|
1601
1878
|
): AutoOrchestrationModule {
|
|
@@ -1606,44 +1883,25 @@ export function createWiredAutoOrchestrationModule(
|
|
|
1606
1883
|
stateReconciliation: {
|
|
1607
1884
|
async reconcileBeforeDispatch() {
|
|
1608
1885
|
const result = await reconcileBeforeDispatch(dispatchBasePath);
|
|
1609
|
-
if (
|
|
1886
|
+
if (result.blockers.length > 0) {
|
|
1610
1887
|
return {
|
|
1611
1888
|
ok: false,
|
|
1612
|
-
reason: result.
|
|
1889
|
+
reason: result.blockers[0],
|
|
1613
1890
|
stateSnapshot: result.stateSnapshot,
|
|
1614
1891
|
};
|
|
1615
1892
|
}
|
|
1893
|
+
const repairedKinds = result.repaired.map((d) => d.kind);
|
|
1616
1894
|
return {
|
|
1617
1895
|
ok: true,
|
|
1618
|
-
reason:
|
|
1896
|
+
reason:
|
|
1897
|
+
repairedKinds.length > 0
|
|
1898
|
+
? `repaired: ${repairedKinds.join(", ")}`
|
|
1899
|
+
: "clean",
|
|
1619
1900
|
stateSnapshot: result.stateSnapshot,
|
|
1620
1901
|
};
|
|
1621
1902
|
},
|
|
1622
1903
|
},
|
|
1623
|
-
dispatch:
|
|
1624
|
-
async decideNextUnit(input) {
|
|
1625
|
-
const state = input.stateSnapshot;
|
|
1626
|
-
const active = state.activeMilestone;
|
|
1627
|
-
if (!active) return null;
|
|
1628
|
-
|
|
1629
|
-
const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
|
|
1630
|
-
const action = await resolveDispatch({
|
|
1631
|
-
basePath: dispatchBasePath,
|
|
1632
|
-
mid: active.id,
|
|
1633
|
-
midTitle: active.title,
|
|
1634
|
-
state,
|
|
1635
|
-
prefs,
|
|
1636
|
-
});
|
|
1637
|
-
|
|
1638
|
-
if (action.action !== "dispatch") return null;
|
|
1639
|
-
return {
|
|
1640
|
-
unitType: action.unitType,
|
|
1641
|
-
unitId: action.unitId,
|
|
1642
|
-
reason: action.matchedRule ?? "dispatch",
|
|
1643
|
-
preconditions: [],
|
|
1644
|
-
};
|
|
1645
|
-
},
|
|
1646
|
-
},
|
|
1904
|
+
dispatch: createWiredDispatchAdapter(ctx, pi, dispatchBasePath),
|
|
1647
1905
|
recovery: {
|
|
1648
1906
|
async classifyAndRecover(input) {
|
|
1649
1907
|
const recovery = classifyFailure(input);
|
|
@@ -1692,12 +1950,25 @@ export function createWiredAutoOrchestrationModule(
|
|
|
1692
1950
|
async cleanupOnStop() {},
|
|
1693
1951
|
},
|
|
1694
1952
|
health: {
|
|
1953
|
+
checkResourcesStale() {
|
|
1954
|
+
return checkResourcesStale(s.resourceVersionOnStart);
|
|
1955
|
+
},
|
|
1695
1956
|
async preAdvanceGate() {
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1957
|
+
try {
|
|
1958
|
+
const gate = await preDispatchHealthGate(dispatchBasePath);
|
|
1959
|
+
if (gate.proceed) {
|
|
1960
|
+
return {
|
|
1961
|
+
kind: "pass",
|
|
1962
|
+
fixesApplied: gate.fixesApplied,
|
|
1963
|
+
};
|
|
1964
|
+
}
|
|
1965
|
+
return {
|
|
1966
|
+
kind: "fail",
|
|
1967
|
+
reason: gate.reason ?? "Pre-dispatch health check failed — run /gsd doctor for details.",
|
|
1968
|
+
};
|
|
1969
|
+
} catch (error) {
|
|
1970
|
+
return { kind: "threw", error };
|
|
1971
|
+
}
|
|
1701
1972
|
},
|
|
1702
1973
|
async postAdvanceRecord(result) {
|
|
1703
1974
|
if (result.kind === "error") {
|
|
@@ -1765,6 +2036,43 @@ export function createWiredAutoOrchestrationModule(
|
|
|
1765
2036
|
}
|
|
1766
2037
|
},
|
|
1767
2038
|
},
|
|
2039
|
+
uokGate: {
|
|
2040
|
+
async emit(input) {
|
|
2041
|
+
const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
|
|
2042
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
2043
|
+
if (!uokFlags.gates) return;
|
|
2044
|
+
const milestoneId = input.milestoneId ?? s.currentMilestoneId ?? undefined;
|
|
2045
|
+
try {
|
|
2046
|
+
const { UokGateRunner } = await import("./uok/gate-runner.js");
|
|
2047
|
+
const runner = new UokGateRunner();
|
|
2048
|
+
runner.register({
|
|
2049
|
+
id: input.gateId,
|
|
2050
|
+
type: input.gateType,
|
|
2051
|
+
execute: async () => ({
|
|
2052
|
+
outcome: input.outcome,
|
|
2053
|
+
failureClass: input.failureClass,
|
|
2054
|
+
rationale: input.rationale,
|
|
2055
|
+
findings: input.findings ?? "",
|
|
2056
|
+
}),
|
|
2057
|
+
});
|
|
2058
|
+
await runner.run(input.gateId, {
|
|
2059
|
+
basePath: dispatchBasePath,
|
|
2060
|
+
traceId: `pre-dispatch:${flowId}`,
|
|
2061
|
+
turnId: `orch-${seq}`,
|
|
2062
|
+
milestoneId,
|
|
2063
|
+
unitType: "pre-dispatch",
|
|
2064
|
+
unitId: `orch-${seq}`,
|
|
2065
|
+
});
|
|
2066
|
+
} catch (err) {
|
|
2067
|
+
logWarning("engine", `uok gate emit failed: ${getErrorMessage(err)}`, {
|
|
2068
|
+
file: "auto.ts",
|
|
2069
|
+
gateId: input.gateId,
|
|
2070
|
+
gateType: input.gateType,
|
|
2071
|
+
...(milestoneId ? { milestoneId } : {}),
|
|
2072
|
+
});
|
|
2073
|
+
}
|
|
2074
|
+
},
|
|
2075
|
+
},
|
|
1768
2076
|
};
|
|
1769
2077
|
|
|
1770
2078
|
return createAutoOrchestrator(deps);
|
|
@@ -1825,7 +2133,6 @@ function buildLoopDeps(pi: ExtensionAPI): LoopDeps {
|
|
|
1825
2133
|
pruneQueueOrder,
|
|
1826
2134
|
isInAutoWorktree,
|
|
1827
2135
|
shouldUseWorktreeIsolation,
|
|
1828
|
-
mergeMilestoneToMain,
|
|
1829
2136
|
teardownAutoWorktree,
|
|
1830
2137
|
createAutoWorktree,
|
|
1831
2138
|
captureIntegrationBranch,
|
|
@@ -2145,7 +2452,12 @@ export async function startAuto(
|
|
|
2145
2452
|
s.verbose = verboseMode;
|
|
2146
2453
|
s.stepMode = requestedStepMode;
|
|
2147
2454
|
s.cmdCtx = ctx;
|
|
2148
|
-
|
|
2455
|
+
// ADR-016 phase 2 / B2 (#5620): bootstrap basePath transition before
|
|
2456
|
+
// the resume path consults persisted worktree state. Defensive about
|
|
2457
|
+
// s.originalBasePath — the meta-restore above (line 2003 / 2055) may
|
|
2458
|
+
// have already populated it from paused metadata; the verb preserves
|
|
2459
|
+
// that value.
|
|
2460
|
+
buildLifecycle().adoptSessionRoot(base);
|
|
2149
2461
|
// ── Resume worktree: if the paused session was inside a milestone worktree,
|
|
2150
2462
|
// apply that path as the dispatch basePath immediately (#3723).
|
|
2151
2463
|
// This ensures the dispatch loop runs from the worktree directory even when
|
|
@@ -2161,7 +2473,8 @@ export async function startAuto(
|
|
|
2161
2473
|
{ file: "auto.ts", milestoneId: s.currentMilestoneId ?? "" },
|
|
2162
2474
|
);
|
|
2163
2475
|
}
|
|
2164
|
-
|
|
2476
|
+
// ADR-016 phase 2 / B3 (#5621): paused-resume worktree-path adoption.
|
|
2477
|
+
buildLifecycle().resumeFromPausedSession(base, resumeWorktreePath);
|
|
2165
2478
|
// Rebuild scope now that s.basePath reflects the actual worktree (or project root).
|
|
2166
2479
|
rebuildScope(s.basePath, s.currentMilestoneId);
|
|
2167
2480
|
// Ensure the workflow-logger audit log is pinned to the project root
|
|
@@ -2463,7 +2776,12 @@ export async function dispatchHookUnit(
|
|
|
2463
2776
|
s.pendingQuickTasks = [];
|
|
2464
2777
|
}
|
|
2465
2778
|
|
|
2466
|
-
|
|
2779
|
+
// ADR-016 phase 2 / B2 (#5620): hook-trigger basePath transition. Treats
|
|
2780
|
+
// the trigger as a bootstrap variant — if the session is fresh,
|
|
2781
|
+
// `originalBasePath` gets set to `targetBasePath`; if the session was
|
|
2782
|
+
// already active with an established `originalBasePath`, the verb
|
|
2783
|
+
// preserves it.
|
|
2784
|
+
buildLifecycle().adoptSessionRoot(targetBasePath);
|
|
2467
2785
|
if (!s.orchestration) {
|
|
2468
2786
|
ensureOrchestrationModule(ctx, pi, s.basePath);
|
|
2469
2787
|
}
|