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
|
@@ -15,7 +15,7 @@ import { deriveState } from "./state.js";
|
|
|
15
15
|
import { parseUnitId } from "./unit-id.js";
|
|
16
16
|
import { assessInterruptedSession, readPausedSessionMetadata, PAUSED_SESSION_KV_KEY, } from "./interrupted-session.js";
|
|
17
17
|
import { setRuntimeKv, deleteRuntimeKv, } from "./db/runtime-kv.js";
|
|
18
|
-
import { getManifestStatus } from "./files.js";
|
|
18
|
+
import { extractSection, getManifestStatus, splitFrontmatter, parseFrontmatterMap } from "./files.js";
|
|
19
19
|
export { inlinePriorMilestoneSummary } from "./files.js";
|
|
20
20
|
import { collectSecretsFromManifest } from "../get-secrets-from-user.js";
|
|
21
21
|
import { gsdRoot, resolveMilestoneFile, resolveMilestonePath, resolveDir, milestonesDir, } from "./paths.js";
|
|
@@ -45,11 +45,10 @@ import { isAbsolute, join } from "node:path";
|
|
|
45
45
|
import { pathToFileURL } from "node:url";
|
|
46
46
|
import { readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
47
47
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
48
|
-
import {
|
|
48
|
+
import { captureIntegrationBranch, detectWorktreeName, getCurrentBranch, getMainBranch, setActiveMilestoneId, resolveProjectRoot, } from "./worktree.js";
|
|
49
49
|
import { GitServiceImpl } from "./git-service.js";
|
|
50
|
-
import { nativeCheckoutBranch } from "./native-git-bridge.js";
|
|
51
50
|
import { getPriorSliceCompletionBlocker } from "./dispatch-guard.js";
|
|
52
|
-
import { createAutoWorktree,
|
|
51
|
+
import { createAutoWorktree, teardownAutoWorktree, isInAutoWorktree, getAutoWorktreePath, mergeMilestoneToMain, autoWorktreeBranch, checkResourcesStale, escapeStaleWorktree, } from "./auto-worktree.js";
|
|
53
52
|
import { pruneQueueOrder } from "./queue-order.js";
|
|
54
53
|
import { startCommandPolling as _startCommandPolling, isRemoteConfigured } from "../remote-questions/manager.js";
|
|
55
54
|
import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
|
|
@@ -61,9 +60,9 @@ import { recoverFailedMigration } from "./migrate-external.js";
|
|
|
61
60
|
import { initRegistry, convertDispatchRules } from "./rule-registry.js";
|
|
62
61
|
import { emitJournalEvent as _emitJournalEvent } from "./journal.js";
|
|
63
62
|
import { isClosedStatus } from "./status-guards.js";
|
|
64
|
-
import { updateProgressWidget as _updateProgressWidget, updateSliceProgressCache, clearSliceProgressCache, } from "./auto-dashboard.js";
|
|
63
|
+
import { updateProgressWidget as _updateProgressWidget, setCompletionProgressWidget, setAutoOutcomeWidget, updateSliceProgressCache, clearSliceProgressCache, unitVerb, } from "./auto-dashboard.js";
|
|
65
64
|
import { registerSigtermHandler as _registerSigtermHandler, deregisterSigtermHandler as _deregisterSigtermHandler, } from "./auto-supervisor.js";
|
|
66
|
-
import { isDbAvailable, getMilestone } from "./gsd-db.js";
|
|
65
|
+
import { isDbAvailable, getMilestone, getMilestoneSlices } from "./gsd-db.js";
|
|
67
66
|
import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
|
|
68
67
|
import { writeUnitRuntimeRecord } from "./unit-runtime.js";
|
|
69
68
|
import { countPendingCaptures } from "./captures.js";
|
|
@@ -93,6 +92,7 @@ import { compileUnitToolContract } from "./tool-contract.js";
|
|
|
93
92
|
import { createWorktreeSafetyModule } from "./worktree-safety.js";
|
|
94
93
|
import { resolveManifest } from "./unit-context-manifest.js";
|
|
95
94
|
import { classifyFailure } from "./recovery-classification.js";
|
|
95
|
+
import { supportsStructuredQuestions } from "./workflow-mcp.js";
|
|
96
96
|
import { WorktreeLifecycle, } from "./worktree-lifecycle.js";
|
|
97
97
|
import { WorktreeStateProjection } from "./worktree-state-projection.js";
|
|
98
98
|
import { reorderForCaching } from "./prompt-ordering.js";
|
|
@@ -253,11 +253,10 @@ function synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile
|
|
|
253
253
|
export function _synthesizePausedSessionRecoveryForTest(basePath, unitType, unitId, sessionFile) {
|
|
254
254
|
return synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile);
|
|
255
255
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
}
|
|
256
|
+
// `_resolvePausedResumeBasePathForTest` was retired in ADR-016 phase 2 / B3
|
|
257
|
+
// (#5621). Production callers go through
|
|
258
|
+
// `WorktreeLifecycle.resumeFromPausedSession`; the pure helper for tests is
|
|
259
|
+
// `resolvePausedResumeBasePath` exported from `worktree-lifecycle.ts`.
|
|
261
260
|
const DETACHED_AUTO_KEEPALIVE_INTERVAL_MS = 30_000;
|
|
262
261
|
function withDetachedAutoKeepalive(run) {
|
|
263
262
|
const keepAlive = setInterval(() => { }, DETACHED_AUTO_KEEPALIVE_INTERVAL_MS);
|
|
@@ -415,6 +414,9 @@ export function getAutoDashboardData() {
|
|
|
415
414
|
export function isAutoActive() {
|
|
416
415
|
return s.active;
|
|
417
416
|
}
|
|
417
|
+
export function isAutoCompletionStopInProgress() {
|
|
418
|
+
return s.completionStopInProgress;
|
|
419
|
+
}
|
|
418
420
|
/** Test-only seam for validating auto-mode guards (#4704). Do not use in production code. */
|
|
419
421
|
export function _setAutoActiveForTest(active) {
|
|
420
422
|
s.active = active;
|
|
@@ -611,6 +613,21 @@ function buildSnapshotOpts(_unitType, _unitId) {
|
|
|
611
613
|
...(s.currentUnitRouting ?? {}),
|
|
612
614
|
};
|
|
613
615
|
}
|
|
616
|
+
function currentUnitLabel() {
|
|
617
|
+
if (!s.currentUnit)
|
|
618
|
+
return null;
|
|
619
|
+
return `${unitVerb(s.currentUnit.type)} ${s.currentUnit.id}`;
|
|
620
|
+
}
|
|
621
|
+
function setLifecycleOutcome(ctx, input) {
|
|
622
|
+
if (!ctx?.hasUI)
|
|
623
|
+
return;
|
|
624
|
+
const { unitLabel: unitLabelOverride, ...rest } = input;
|
|
625
|
+
setAutoOutcomeWidget(ctx, {
|
|
626
|
+
...rest,
|
|
627
|
+
unitLabel: unitLabelOverride !== undefined ? unitLabelOverride : currentUnitLabel(),
|
|
628
|
+
startedAt: s.autoStartTime,
|
|
629
|
+
});
|
|
630
|
+
}
|
|
614
631
|
function handleLostSessionLock(ctx, lockStatus) {
|
|
615
632
|
debugLog("session-lock-lost", {
|
|
616
633
|
lockBase: lockBase(),
|
|
@@ -690,33 +707,84 @@ export async function cleanupAfterLoopExit(ctx) {
|
|
|
690
707
|
// visible so the user still has a resumable auto-mode signal on screen.
|
|
691
708
|
if (!s.paused) {
|
|
692
709
|
ctx.ui.setStatus("gsd-auto", undefined);
|
|
693
|
-
|
|
710
|
+
if (s.completionStopInProgress) {
|
|
711
|
+
s.completionStopInProgress = false;
|
|
712
|
+
}
|
|
694
713
|
initHealthWidget(ctx);
|
|
695
714
|
}
|
|
696
|
-
//
|
|
715
|
+
// ADR-016 phase 3 (#5693): the stop-path basePath restore routes through
|
|
716
|
+
// `Lifecycle.restoreToProjectRoot()`, the sole owner of `s.basePath`
|
|
717
|
+
// mutation. The verb assigns `s.basePath` before any throwable work
|
|
718
|
+
// (rebuildGitService, cache invalidation), so a thrown error still leaves
|
|
719
|
+
// basePath restored — no fallback assignment needed at the call site.
|
|
720
|
+
// The chdir stays here because `restoreToProjectRoot` is a pure
|
|
721
|
+
// session-state mutation.
|
|
697
722
|
if (s.originalBasePath) {
|
|
698
|
-
s.basePath = s.originalBasePath;
|
|
699
723
|
try {
|
|
700
|
-
|
|
724
|
+
buildLifecycle().restoreToProjectRoot();
|
|
701
725
|
}
|
|
702
726
|
catch (err) {
|
|
703
|
-
|
|
704
|
-
|
|
727
|
+
logWarning("engine", `restore project root failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
728
|
+
}
|
|
729
|
+
try {
|
|
730
|
+
process.chdir(s.originalBasePath);
|
|
731
|
+
}
|
|
732
|
+
catch (err) {
|
|
733
|
+
logWarning("engine", `basePath restore/chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
705
734
|
}
|
|
706
735
|
}
|
|
707
736
|
if (s.originalBasePath && s.cmdCtx) {
|
|
708
|
-
const result = await rerootCommandSession(s.cmdCtx, s.
|
|
737
|
+
const result = await rerootCommandSession(s.cmdCtx, s.originalBasePath);
|
|
709
738
|
if (result.status === "cancelled") {
|
|
710
|
-
logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.
|
|
739
|
+
logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.originalBasePath });
|
|
711
740
|
}
|
|
712
741
|
else if (result.status === "failed") {
|
|
713
|
-
logWarning("engine", `post-loop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.
|
|
742
|
+
logWarning("engine", `post-loop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.originalBasePath });
|
|
714
743
|
}
|
|
715
744
|
}
|
|
716
745
|
}
|
|
717
746
|
export function _cleanupAfterLoopExitForTest(ctx) {
|
|
718
747
|
return cleanupAfterLoopExit(ctx);
|
|
719
748
|
}
|
|
749
|
+
function normalizeFrontmatterList(value) {
|
|
750
|
+
if (!Array.isArray(value))
|
|
751
|
+
return [];
|
|
752
|
+
return value
|
|
753
|
+
.map(item => typeof item === "string" ? item.trim() : "")
|
|
754
|
+
.filter(item => item.length > 0 && item !== "(none)");
|
|
755
|
+
}
|
|
756
|
+
function firstBoldParagraph(body) {
|
|
757
|
+
const match = body.match(/\*\*([^*\n][\s\S]*?)\*\*/);
|
|
758
|
+
return match?.[1]?.replace(/\s+/g, " ").trim() || undefined;
|
|
759
|
+
}
|
|
760
|
+
function loadMilestoneCompletionRollup(basePath, milestoneId) {
|
|
761
|
+
if (!milestoneId)
|
|
762
|
+
return {};
|
|
763
|
+
const summaryPath = resolveMilestoneFile(basePath, milestoneId, "SUMMARY");
|
|
764
|
+
if (!summaryPath || !existsSync(summaryPath))
|
|
765
|
+
return {};
|
|
766
|
+
try {
|
|
767
|
+
const raw = readFileSync(summaryPath, "utf-8");
|
|
768
|
+
const [frontmatterLines, body] = splitFrontmatter(raw);
|
|
769
|
+
const frontmatter = frontmatterLines ? parseFrontmatterMap(frontmatterLines) : {};
|
|
770
|
+
return {
|
|
771
|
+
milestoneTitle: typeof frontmatter.title === "string" ? frontmatter.title : undefined,
|
|
772
|
+
oneLiner: firstBoldParagraph(body),
|
|
773
|
+
successCriteriaResults: extractSection(body, "Success Criteria Results") ?? undefined,
|
|
774
|
+
definitionOfDoneResults: extractSection(body, "Definition of Done Results") ?? undefined,
|
|
775
|
+
requirementOutcomes: extractSection(body, "Requirement Outcomes") ?? undefined,
|
|
776
|
+
deviations: extractSection(body, "Deviations") ?? undefined,
|
|
777
|
+
followUps: extractSection(body, "Follow-ups") ?? undefined,
|
|
778
|
+
keyDecisions: normalizeFrontmatterList(frontmatter.key_decisions),
|
|
779
|
+
keyFiles: normalizeFrontmatterList(frontmatter.key_files),
|
|
780
|
+
lessonsLearned: normalizeFrontmatterList(frontmatter.lessons_learned),
|
|
781
|
+
};
|
|
782
|
+
}
|
|
783
|
+
catch (err) {
|
|
784
|
+
logWarning("dashboard", `completion roll-up summary read failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
785
|
+
return {};
|
|
786
|
+
}
|
|
787
|
+
}
|
|
720
788
|
export function _resolveAutoWorktreeExitActionForTest(currentMilestoneId, milestoneMergedInPhases, milestoneComplete) {
|
|
721
789
|
const action = _selectStopAutoWorktreeExit({
|
|
722
790
|
currentMilestoneId: currentMilestoneId ?? null,
|
|
@@ -725,15 +793,16 @@ export function _resolveAutoWorktreeExitActionForTest(currentMilestoneId, milest
|
|
|
725
793
|
});
|
|
726
794
|
return action === "none" ? "skip" : action;
|
|
727
795
|
}
|
|
728
|
-
export async function stopAuto(ctx, pi, reason) {
|
|
796
|
+
export async function stopAuto(ctx, pi, reason, options = {}) {
|
|
729
797
|
if (!s.active && !s.paused)
|
|
730
798
|
return;
|
|
731
799
|
const loadedPreferences = loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences;
|
|
732
800
|
const reasonSuffix = reason ? ` — ${reason}` : "";
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
//
|
|
736
|
-
//
|
|
801
|
+
const preserveCompletionSurface = Boolean(options.completionWidget);
|
|
802
|
+
s.completionStopInProgress = preserveCompletionSurface;
|
|
803
|
+
// #4764 — telemetry: record the exit reason, isolation mode, whether an auto
|
|
804
|
+
// worktree was active, and whether the current milestone was merged before
|
|
805
|
+
// stopAuto. The unmerged-work warning is only meaningful for real worktrees.
|
|
737
806
|
try {
|
|
738
807
|
const { emitAutoExit } = await import("./worktree-telemetry.js");
|
|
739
808
|
// Normalize the free-form reason to a closed set so the telemetry
|
|
@@ -755,10 +824,13 @@ export async function stopAuto(ctx, pi, reason) {
|
|
|
755
824
|
: rawReason === "stop" || rawReason === "pause"
|
|
756
825
|
? rawReason
|
|
757
826
|
: "other";
|
|
758
|
-
|
|
827
|
+
const telemetryBase = s.originalBasePath || s.basePath;
|
|
828
|
+
emitAutoExit(telemetryBase, {
|
|
759
829
|
reason: normalizedReason,
|
|
760
830
|
milestoneId: s.currentMilestoneId ?? undefined,
|
|
761
831
|
milestoneMerged: s.milestoneMergedInPhases === true,
|
|
832
|
+
isolationMode: getIsolationMode(telemetryBase),
|
|
833
|
+
worktreeActive: isInAutoWorktree(s.basePath),
|
|
762
834
|
});
|
|
763
835
|
}
|
|
764
836
|
catch (err) {
|
|
@@ -902,6 +974,21 @@ export async function stopAuto(ctx, pi, reason) {
|
|
|
902
974
|
});
|
|
903
975
|
}
|
|
904
976
|
}
|
|
977
|
+
// Pre-compute completion widget slice counts while the DB is still open.
|
|
978
|
+
// Step 8 runs after closeDatabase(), so DB-backed slice lookups must happen here.
|
|
979
|
+
const completionMilestoneId = options.completionWidget?.milestoneId ?? s.currentMilestoneId;
|
|
980
|
+
let completedSlices = null;
|
|
981
|
+
let totalSlices = null;
|
|
982
|
+
if (preserveCompletionSurface && options.completionWidget && completionMilestoneId && isDbAvailable()) {
|
|
983
|
+
try {
|
|
984
|
+
const slices = getMilestoneSlices(completionMilestoneId);
|
|
985
|
+
completedSlices = slices.filter(slice => isClosedStatus(slice.status)).length;
|
|
986
|
+
totalSlices = slices.length;
|
|
987
|
+
}
|
|
988
|
+
catch (err) {
|
|
989
|
+
logWarning("dashboard", `completion slice stats lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
990
|
+
}
|
|
991
|
+
}
|
|
905
992
|
// ── Step 6: DB cleanup ──
|
|
906
993
|
if (isDbAvailable()) {
|
|
907
994
|
try {
|
|
@@ -914,49 +1001,112 @@ export async function stopAuto(ctx, pi, reason) {
|
|
|
914
1001
|
});
|
|
915
1002
|
}
|
|
916
1003
|
}
|
|
917
|
-
// ── Step 7: Restore basePath and chdir ──
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
1004
|
+
// ── Step 7: Restore basePath and chdir (ADR-016 phase 3, #5693) ──
|
|
1005
|
+
// `restoreToProjectRoot` assigns s.basePath before any throwable work;
|
|
1006
|
+
// no fallback assignment is needed at the call site.
|
|
1007
|
+
if (s.originalBasePath) {
|
|
1008
|
+
try {
|
|
1009
|
+
buildLifecycle().restoreToProjectRoot();
|
|
1010
|
+
}
|
|
1011
|
+
catch (e) {
|
|
1012
|
+
debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
|
|
1013
|
+
}
|
|
1014
|
+
try {
|
|
1015
|
+
process.chdir(s.basePath);
|
|
1016
|
+
}
|
|
1017
|
+
catch (err) {
|
|
1018
|
+
/* best-effort */
|
|
1019
|
+
logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
928
1020
|
}
|
|
929
|
-
}
|
|
930
|
-
catch (e) {
|
|
931
|
-
debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
|
|
932
1021
|
}
|
|
933
1022
|
// Re-root the active command session/tool runtime after worktree teardown.
|
|
934
1023
|
// mergeAndExit restores process.cwd(), but AgentSession has already captured
|
|
935
1024
|
// its own cwd for tools and system prompt; refresh it before returning to the
|
|
936
1025
|
// user so follow-up commands do not target a removed milestone worktree.
|
|
937
1026
|
if (s.originalBasePath && ctx && s.cmdCtx) {
|
|
938
|
-
const result = await rerootCommandSession(s.cmdCtx, s.
|
|
1027
|
+
const result = await rerootCommandSession(s.cmdCtx, s.originalBasePath);
|
|
939
1028
|
if (result.status === "cancelled") {
|
|
940
|
-
logWarning("engine", "post-stop session re-root was cancelled", { file: "auto.ts", basePath: s.
|
|
1029
|
+
logWarning("engine", "post-stop session re-root was cancelled", { file: "auto.ts", basePath: s.originalBasePath });
|
|
941
1030
|
}
|
|
942
1031
|
else if (result.status === "failed") {
|
|
943
|
-
logWarning("engine", `post-stop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.
|
|
1032
|
+
logWarning("engine", `post-stop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.originalBasePath });
|
|
944
1033
|
}
|
|
945
1034
|
}
|
|
946
1035
|
// ── Step 8: Ledger notification ──
|
|
947
1036
|
try {
|
|
948
1037
|
const ledger = getLedger();
|
|
1038
|
+
const isAllComplete = reason === "All milestones complete";
|
|
1039
|
+
const isMilestoneComplete = /^Milestone\s+\S+\s+complete$/i.test(reason ?? "");
|
|
1040
|
+
const notificationPrefix = isAllComplete
|
|
1041
|
+
? "All milestones complete"
|
|
1042
|
+
: isMilestoneComplete
|
|
1043
|
+
? `${reason}. Auto-mode finished this milestone`
|
|
1044
|
+
: `Auto-mode stopped${reasonSuffix}`;
|
|
949
1045
|
if (ledger && ledger.units.length > 0) {
|
|
950
1046
|
const totals = getProjectTotals(ledger.units);
|
|
951
|
-
ctx?.ui.notify(
|
|
1047
|
+
ctx?.ui.notify(`${notificationPrefix}. Session: ${formatCost(totals.cost)} · ${formatTokenCount(totals.tokens.total)} tokens · ${ledger.units.length} units`, "info");
|
|
952
1048
|
}
|
|
953
1049
|
else {
|
|
954
|
-
ctx?.ui.notify(
|
|
1050
|
+
ctx?.ui.notify(`${notificationPrefix}.`, "info");
|
|
955
1051
|
}
|
|
956
1052
|
}
|
|
957
1053
|
catch (e) {
|
|
958
1054
|
debugLog("stop-cleanup-ledger", { error: e instanceof Error ? e.message : String(e) });
|
|
959
1055
|
}
|
|
1056
|
+
if (preserveCompletionSurface && ctx && options.completionWidget) {
|
|
1057
|
+
const ledger = getLedger();
|
|
1058
|
+
const units = ledger?.units ?? [];
|
|
1059
|
+
const totals = units.length > 0 ? getProjectTotals(units) : null;
|
|
1060
|
+
let totalInput = 0;
|
|
1061
|
+
let totalCacheRead = 0;
|
|
1062
|
+
try {
|
|
1063
|
+
for (const entry of s.cmdCtx?.sessionManager?.getEntries?.() ?? []) {
|
|
1064
|
+
if (entry.type === "message") {
|
|
1065
|
+
const msgEntry = entry;
|
|
1066
|
+
if (msgEntry.message?.role === "assistant") {
|
|
1067
|
+
const usage = msgEntry.message.usage;
|
|
1068
|
+
if (usage) {
|
|
1069
|
+
totalInput += usage.input || 0;
|
|
1070
|
+
totalCacheRead += usage.cacheRead || 0;
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
catch (err) {
|
|
1077
|
+
logWarning("dashboard", `completion stats lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1078
|
+
}
|
|
1079
|
+
const contextUsage = s.cmdCtx?.getContextUsage?.();
|
|
1080
|
+
const milestoneId = completionMilestoneId;
|
|
1081
|
+
const rollup = loadMilestoneCompletionRollup(s.originalBasePath || s.basePath, milestoneId);
|
|
1082
|
+
setCompletionProgressWidget(ctx, {
|
|
1083
|
+
milestoneId,
|
|
1084
|
+
milestoneTitle: options.completionWidget.milestoneTitle ?? rollup.milestoneTitle,
|
|
1085
|
+
oneLiner: rollup.oneLiner,
|
|
1086
|
+
successCriteriaResults: rollup.successCriteriaResults,
|
|
1087
|
+
definitionOfDoneResults: rollup.definitionOfDoneResults,
|
|
1088
|
+
requirementOutcomes: rollup.requirementOutcomes,
|
|
1089
|
+
deviations: rollup.deviations,
|
|
1090
|
+
followUps: rollup.followUps,
|
|
1091
|
+
keyDecisions: rollup.keyDecisions,
|
|
1092
|
+
keyFiles: rollup.keyFiles,
|
|
1093
|
+
lessonsLearned: rollup.lessonsLearned,
|
|
1094
|
+
reason: reason ?? "Milestone complete",
|
|
1095
|
+
startedAt: s.autoStartTime,
|
|
1096
|
+
totalCost: totals?.cost ?? 0,
|
|
1097
|
+
totalTokens: totals?.tokens.total ?? 0,
|
|
1098
|
+
unitCount: units.length,
|
|
1099
|
+
cacheHitRate: totalCacheRead + totalInput > 0
|
|
1100
|
+
? (totalCacheRead / (totalCacheRead + totalInput)) * 100
|
|
1101
|
+
: null,
|
|
1102
|
+
contextPercent: contextUsage?.percent ?? null,
|
|
1103
|
+
contextWindow: contextUsage?.contextWindow ?? s.cmdCtx?.model?.contextWindow ?? null,
|
|
1104
|
+
completedSlices,
|
|
1105
|
+
totalSlices,
|
|
1106
|
+
allMilestonesComplete: options.completionWidget.allMilestonesComplete,
|
|
1107
|
+
basePath: s.originalBasePath || s.basePath || null,
|
|
1108
|
+
});
|
|
1109
|
+
}
|
|
960
1110
|
// ── Step 9: Cmux sidebar / event log ──
|
|
961
1111
|
try {
|
|
962
1112
|
pi?.events.emit(CMUX_CHANNELS.SIDEBAR, { action: "clear", preferences: loadedPreferences });
|
|
@@ -1047,9 +1197,21 @@ export async function stopAuto(ctx, pi, reason) {
|
|
|
1047
1197
|
resetProactiveHealing();
|
|
1048
1198
|
// UI cleanup
|
|
1049
1199
|
ctx?.ui.setStatus("gsd-auto", undefined);
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1200
|
+
if (!preserveCompletionSurface) {
|
|
1201
|
+
ctx?.ui.setWidget("gsd-progress", undefined);
|
|
1202
|
+
const status = reason?.startsWith("Blocked:") ? "blocked" : reason?.toLowerCase().includes("fail") ? "failed" : "stopped";
|
|
1203
|
+
setLifecycleOutcome(ctx, {
|
|
1204
|
+
status,
|
|
1205
|
+
title: status === "blocked" ? "Auto-mode blocked" : status === "failed" ? "Auto-mode stopped with an issue" : "Auto-mode stopped",
|
|
1206
|
+
detail: reason ?? "Auto-mode stopped.",
|
|
1207
|
+
nextAction: status === "blocked"
|
|
1208
|
+
? "Fix the blocker, then run /gsd auto to resume."
|
|
1209
|
+
: "Run /gsd status for the current project state, or /gsd auto to continue.",
|
|
1210
|
+
commands: ["/gsd status for overview", "/gsd auto to run", "/gsd visualize to inspect", "/gsd notifications for history"],
|
|
1211
|
+
});
|
|
1212
|
+
if (ctx)
|
|
1213
|
+
initHealthWidget(ctx);
|
|
1214
|
+
}
|
|
1053
1215
|
restoreProjectRootEnv();
|
|
1054
1216
|
restoreMilestoneLockEnv();
|
|
1055
1217
|
// Drop the active-tool baseline so a subsequent /gsd auto run on the
|
|
@@ -1065,7 +1227,7 @@ export async function stopAuto(ctx, pi, reason) {
|
|
|
1065
1227
|
debugLog("stop-orchestration-stop", { error: err instanceof Error ? err.message : String(err) });
|
|
1066
1228
|
}
|
|
1067
1229
|
// Reset all session state in one call
|
|
1068
|
-
s.
|
|
1230
|
+
s.resetAfterStop({ preserveCompletionSurface });
|
|
1069
1231
|
}
|
|
1070
1232
|
}
|
|
1071
1233
|
export function _selectStopAutoWorktreeExit(args) {
|
|
@@ -1126,6 +1288,7 @@ export async function pauseAuto(ctx, _pi, _errorContext) {
|
|
|
1126
1288
|
// Non-fatal — resume will still work via full bootstrap, just without worktree context
|
|
1127
1289
|
logWarning("engine", `paused-session DB write failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
1128
1290
|
}
|
|
1291
|
+
const pausedUnitLabel = currentUnitLabel();
|
|
1129
1292
|
// Close out the current unit so its runtime record doesn't stay at "dispatched"
|
|
1130
1293
|
if (s.currentUnit && ctx) {
|
|
1131
1294
|
try {
|
|
@@ -1173,9 +1336,17 @@ export async function pauseAuto(ctx, _pi, _errorContext) {
|
|
|
1173
1336
|
s.verificationRetryCount.clear();
|
|
1174
1337
|
ctx?.ui.setStatus("gsd-auto", "paused");
|
|
1175
1338
|
ctx?.ui.setWidget("gsd-progress", undefined);
|
|
1339
|
+
const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
|
|
1340
|
+
setLifecycleOutcome(ctx, {
|
|
1341
|
+
status: "paused",
|
|
1342
|
+
title: `${s.stepMode ? "Step" : "Auto"}-mode paused`,
|
|
1343
|
+
detail: _errorContext?.message ?? "Paused by user request.",
|
|
1344
|
+
nextAction: `Type to steer, or run ${resumeCmd} to resume.`,
|
|
1345
|
+
commands: [resumeCmd, "/gsd status for overview", "/gsd notifications for history"],
|
|
1346
|
+
unitLabel: pausedUnitLabel,
|
|
1347
|
+
});
|
|
1176
1348
|
if (ctx)
|
|
1177
1349
|
initHealthWidget(ctx);
|
|
1178
|
-
const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
|
|
1179
1350
|
ctx?.ui.notify(`${s.stepMode ? "Step" : "Auto"}-mode paused (Escape). Type to interact, or ${resumeCmd} to resume.`, "info");
|
|
1180
1351
|
}
|
|
1181
1352
|
/**
|
|
@@ -1186,28 +1357,94 @@ export async function pauseAuto(ctx, _pi, _errorContext) {
|
|
|
1186
1357
|
* deps bag is intentionally focused — Lifecycle does not see the wider auto-
|
|
1187
1358
|
* mode dependency graph.
|
|
1188
1359
|
*/
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1360
|
+
/**
|
|
1361
|
+
* Construct a `WorktreeLifecycleDeps` bag without binding to any session.
|
|
1362
|
+
*
|
|
1363
|
+
* Exported so session-less callers (currently `parallel-merge.ts`) can build
|
|
1364
|
+
* the same deps and call `mergeMilestoneStandalone` through the Worktree
|
|
1365
|
+
* Lifecycle Module instead of bypassing it (ADR-016 phase 2 / A2).
|
|
1366
|
+
*/
|
|
1367
|
+
export function buildWorktreeLifecycleDeps() {
|
|
1368
|
+
// ADR-016 phase 2 / C-track close-out:
|
|
1369
|
+
// C1 (#5624) — fs + git-CLI primitives inlined
|
|
1370
|
+
// C2 (#5625) — worktree-manager helpers inlined
|
|
1371
|
+
// C3 (#5626) — cache + preferences + paths inlined
|
|
1372
|
+
// C4 (#5627) — GitServiceImpl constructor → gitServiceFactory
|
|
1373
|
+
//
|
|
1374
|
+
// Final WorktreeLifecycleDeps shape: 3 fields (gitServiceFactory,
|
|
1375
|
+
// worktreeProjection, mergeMilestoneToMain). Down from 18 at slice-7
|
|
1376
|
+
// closure.
|
|
1377
|
+
return {
|
|
1378
|
+
gitServiceFactory: (basePath) => {
|
|
1379
|
+
const gitConfig = loadEffectiveGSDPreferences()?.preferences?.git ?? {};
|
|
1380
|
+
return new GitServiceImpl(basePath, gitConfig);
|
|
1381
|
+
},
|
|
1199
1382
|
worktreeProjection: new WorktreeStateProjection(),
|
|
1200
|
-
isInAutoWorktree,
|
|
1201
|
-
autoCommitCurrentBranch,
|
|
1202
|
-
autoWorktreeBranch,
|
|
1203
|
-
teardownAutoWorktree,
|
|
1204
1383
|
mergeMilestoneToMain,
|
|
1205
|
-
getCurrentBranch,
|
|
1206
|
-
checkoutBranch: nativeCheckoutBranch,
|
|
1207
|
-
resolveMilestoneFile,
|
|
1208
|
-
readFileSync: (path, encoding) => readFileSync(path, encoding),
|
|
1209
1384
|
};
|
|
1210
|
-
|
|
1385
|
+
}
|
|
1386
|
+
function buildLifecycle() {
|
|
1387
|
+
return new WorktreeLifecycle(s, buildWorktreeLifecycleDeps());
|
|
1388
|
+
}
|
|
1389
|
+
/**
|
|
1390
|
+
* Build the production `DispatchAdapter` used by `createWiredAutoOrchestrationModule`.
|
|
1391
|
+
*
|
|
1392
|
+
* Exported so tests can verify parity with `runDispatch`'s `resolveDispatch` call —
|
|
1393
|
+
* the wired adapter must derive `structuredQuestionsAvailable`, `sessionContextWindow`,
|
|
1394
|
+
* `sessionProvider`, and `modelRegistry` the same way phases.ts:runDispatch does.
|
|
1395
|
+
*/
|
|
1396
|
+
export function createWiredDispatchAdapter(ctx, pi, dispatchBasePath) {
|
|
1397
|
+
return {
|
|
1398
|
+
async decideNextUnit(input) {
|
|
1399
|
+
const state = input.stateSnapshot;
|
|
1400
|
+
const active = state.activeMilestone;
|
|
1401
|
+
if (!active)
|
|
1402
|
+
return null;
|
|
1403
|
+
const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
|
|
1404
|
+
// Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
|
|
1405
|
+
// (#5789). Prefer caller-supplied values when present so test harnesses and
|
|
1406
|
+
// alternative wirings can inject deterministic snapshots; otherwise pull from
|
|
1407
|
+
// the captured pi/ctx references.
|
|
1408
|
+
const sessionProvider = input.sessionProvider ?? ctx.model?.provider;
|
|
1409
|
+
const sessionContextWindow = input.sessionContextWindow ?? ctx.model?.contextWindow;
|
|
1410
|
+
const modelRegistry = input.modelRegistry ?? ctx.modelRegistry;
|
|
1411
|
+
const authMode = sessionProvider && typeof ctx.modelRegistry?.getProviderAuthMode === "function"
|
|
1412
|
+
? ctx.modelRegistry.getProviderAuthMode(sessionProvider)
|
|
1413
|
+
: undefined;
|
|
1414
|
+
const activeTools = typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [];
|
|
1415
|
+
// Mirrors runDispatch: deep-planning keeps approval gates in plain chat
|
|
1416
|
+
// because structured questions can be cancelled outside the chat turn on
|
|
1417
|
+
// some transports.
|
|
1418
|
+
const structuredQuestionsAvailable = input.structuredQuestionsAvailable ??
|
|
1419
|
+
(prefs?.planning_depth === "deep"
|
|
1420
|
+
? "false"
|
|
1421
|
+
: supportsStructuredQuestions(activeTools, {
|
|
1422
|
+
authMode,
|
|
1423
|
+
baseUrl: ctx.model?.baseUrl,
|
|
1424
|
+
})
|
|
1425
|
+
? "true"
|
|
1426
|
+
: "false");
|
|
1427
|
+
const action = await resolveDispatch({
|
|
1428
|
+
basePath: dispatchBasePath,
|
|
1429
|
+
mid: active.id,
|
|
1430
|
+
midTitle: active.title,
|
|
1431
|
+
state,
|
|
1432
|
+
prefs,
|
|
1433
|
+
structuredQuestionsAvailable,
|
|
1434
|
+
sessionContextWindow,
|
|
1435
|
+
sessionProvider,
|
|
1436
|
+
modelRegistry,
|
|
1437
|
+
});
|
|
1438
|
+
if (action.action !== "dispatch")
|
|
1439
|
+
return null;
|
|
1440
|
+
return {
|
|
1441
|
+
unitType: action.unitType,
|
|
1442
|
+
unitId: action.unitId,
|
|
1443
|
+
reason: action.matchedRule ?? "dispatch",
|
|
1444
|
+
preconditions: [],
|
|
1445
|
+
};
|
|
1446
|
+
},
|
|
1447
|
+
};
|
|
1211
1448
|
}
|
|
1212
1449
|
/**
|
|
1213
1450
|
* Thin entry glue for the new Auto Orchestration module.
|
|
@@ -1216,51 +1453,31 @@ function buildLifecycle() {
|
|
|
1216
1453
|
* no behavior changes to the existing auto loop. It provides a concrete seam
|
|
1217
1454
|
* the next refactor steps can adopt incrementally.
|
|
1218
1455
|
*/
|
|
1219
|
-
export function createWiredAutoOrchestrationModule(ctx,
|
|
1456
|
+
export function createWiredAutoOrchestrationModule(ctx, pi, dispatchBasePath, runtimeBasePath = resolveProjectRoot(dispatchBasePath)) {
|
|
1220
1457
|
const flowId = `auto-orchestrator-${Date.now()}`;
|
|
1221
1458
|
let seq = 0;
|
|
1222
1459
|
const deps = {
|
|
1223
1460
|
stateReconciliation: {
|
|
1224
1461
|
async reconcileBeforeDispatch() {
|
|
1225
1462
|
const result = await reconcileBeforeDispatch(dispatchBasePath);
|
|
1226
|
-
if (
|
|
1463
|
+
if (result.blockers.length > 0) {
|
|
1227
1464
|
return {
|
|
1228
1465
|
ok: false,
|
|
1229
|
-
reason: result.
|
|
1466
|
+
reason: result.blockers[0],
|
|
1230
1467
|
stateSnapshot: result.stateSnapshot,
|
|
1231
1468
|
};
|
|
1232
1469
|
}
|
|
1470
|
+
const repairedKinds = result.repaired.map((d) => d.kind);
|
|
1233
1471
|
return {
|
|
1234
1472
|
ok: true,
|
|
1235
|
-
reason:
|
|
1473
|
+
reason: repairedKinds.length > 0
|
|
1474
|
+
? `repaired: ${repairedKinds.join(", ")}`
|
|
1475
|
+
: "clean",
|
|
1236
1476
|
stateSnapshot: result.stateSnapshot,
|
|
1237
1477
|
};
|
|
1238
1478
|
},
|
|
1239
1479
|
},
|
|
1240
|
-
dispatch:
|
|
1241
|
-
async decideNextUnit(input) {
|
|
1242
|
-
const state = input.stateSnapshot;
|
|
1243
|
-
const active = state.activeMilestone;
|
|
1244
|
-
if (!active)
|
|
1245
|
-
return null;
|
|
1246
|
-
const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
|
|
1247
|
-
const action = await resolveDispatch({
|
|
1248
|
-
basePath: dispatchBasePath,
|
|
1249
|
-
mid: active.id,
|
|
1250
|
-
midTitle: active.title,
|
|
1251
|
-
state,
|
|
1252
|
-
prefs,
|
|
1253
|
-
});
|
|
1254
|
-
if (action.action !== "dispatch")
|
|
1255
|
-
return null;
|
|
1256
|
-
return {
|
|
1257
|
-
unitType: action.unitType,
|
|
1258
|
-
unitId: action.unitId,
|
|
1259
|
-
reason: action.matchedRule ?? "dispatch",
|
|
1260
|
-
preconditions: [],
|
|
1261
|
-
};
|
|
1262
|
-
},
|
|
1263
|
-
},
|
|
1480
|
+
dispatch: createWiredDispatchAdapter(ctx, pi, dispatchBasePath),
|
|
1264
1481
|
recovery: {
|
|
1265
1482
|
async classifyAndRecover(input) {
|
|
1266
1483
|
const recovery = classifyFailure(input);
|
|
@@ -1309,12 +1526,26 @@ export function createWiredAutoOrchestrationModule(ctx, _pi, dispatchBasePath, r
|
|
|
1309
1526
|
async cleanupOnStop() { },
|
|
1310
1527
|
},
|
|
1311
1528
|
health: {
|
|
1529
|
+
checkResourcesStale() {
|
|
1530
|
+
return checkResourcesStale(s.resourceVersionOnStart);
|
|
1531
|
+
},
|
|
1312
1532
|
async preAdvanceGate() {
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1533
|
+
try {
|
|
1534
|
+
const gate = await preDispatchHealthGate(dispatchBasePath);
|
|
1535
|
+
if (gate.proceed) {
|
|
1536
|
+
return {
|
|
1537
|
+
kind: "pass",
|
|
1538
|
+
fixesApplied: gate.fixesApplied,
|
|
1539
|
+
};
|
|
1540
|
+
}
|
|
1541
|
+
return {
|
|
1542
|
+
kind: "fail",
|
|
1543
|
+
reason: gate.reason ?? "Pre-dispatch health check failed — run /gsd doctor for details.",
|
|
1544
|
+
};
|
|
1545
|
+
}
|
|
1546
|
+
catch (error) {
|
|
1547
|
+
return { kind: "threw", error };
|
|
1548
|
+
}
|
|
1318
1549
|
},
|
|
1319
1550
|
async postAdvanceRecord(result) {
|
|
1320
1551
|
if (result.kind === "error") {
|
|
@@ -1382,6 +1613,45 @@ export function createWiredAutoOrchestrationModule(ctx, _pi, dispatchBasePath, r
|
|
|
1382
1613
|
}
|
|
1383
1614
|
},
|
|
1384
1615
|
},
|
|
1616
|
+
uokGate: {
|
|
1617
|
+
async emit(input) {
|
|
1618
|
+
const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
|
|
1619
|
+
const uokFlags = resolveUokFlags(prefs);
|
|
1620
|
+
if (!uokFlags.gates)
|
|
1621
|
+
return;
|
|
1622
|
+
const milestoneId = input.milestoneId ?? s.currentMilestoneId ?? undefined;
|
|
1623
|
+
try {
|
|
1624
|
+
const { UokGateRunner } = await import("./uok/gate-runner.js");
|
|
1625
|
+
const runner = new UokGateRunner();
|
|
1626
|
+
runner.register({
|
|
1627
|
+
id: input.gateId,
|
|
1628
|
+
type: input.gateType,
|
|
1629
|
+
execute: async () => ({
|
|
1630
|
+
outcome: input.outcome,
|
|
1631
|
+
failureClass: input.failureClass,
|
|
1632
|
+
rationale: input.rationale,
|
|
1633
|
+
findings: input.findings ?? "",
|
|
1634
|
+
}),
|
|
1635
|
+
});
|
|
1636
|
+
await runner.run(input.gateId, {
|
|
1637
|
+
basePath: dispatchBasePath,
|
|
1638
|
+
traceId: `pre-dispatch:${flowId}`,
|
|
1639
|
+
turnId: `orch-${seq}`,
|
|
1640
|
+
milestoneId,
|
|
1641
|
+
unitType: "pre-dispatch",
|
|
1642
|
+
unitId: `orch-${seq}`,
|
|
1643
|
+
});
|
|
1644
|
+
}
|
|
1645
|
+
catch (err) {
|
|
1646
|
+
logWarning("engine", `uok gate emit failed: ${getErrorMessage(err)}`, {
|
|
1647
|
+
file: "auto.ts",
|
|
1648
|
+
gateId: input.gateId,
|
|
1649
|
+
gateType: input.gateType,
|
|
1650
|
+
...(milestoneId ? { milestoneId } : {}),
|
|
1651
|
+
});
|
|
1652
|
+
}
|
|
1653
|
+
},
|
|
1654
|
+
},
|
|
1385
1655
|
};
|
|
1386
1656
|
return createAutoOrchestrator(deps);
|
|
1387
1657
|
}
|
|
@@ -1431,7 +1701,6 @@ function buildLoopDeps(pi) {
|
|
|
1431
1701
|
pruneQueueOrder,
|
|
1432
1702
|
isInAutoWorktree,
|
|
1433
1703
|
shouldUseWorktreeIsolation,
|
|
1434
|
-
mergeMilestoneToMain,
|
|
1435
1704
|
teardownAutoWorktree,
|
|
1436
1705
|
createAutoWorktree,
|
|
1437
1706
|
captureIntegrationBranch,
|
|
@@ -1701,7 +1970,12 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1701
1970
|
s.verbose = verboseMode;
|
|
1702
1971
|
s.stepMode = requestedStepMode;
|
|
1703
1972
|
s.cmdCtx = ctx;
|
|
1704
|
-
|
|
1973
|
+
// ADR-016 phase 2 / B2 (#5620): bootstrap basePath transition before
|
|
1974
|
+
// the resume path consults persisted worktree state. Defensive about
|
|
1975
|
+
// s.originalBasePath — the meta-restore above (line 2003 / 2055) may
|
|
1976
|
+
// have already populated it from paused metadata; the verb preserves
|
|
1977
|
+
// that value.
|
|
1978
|
+
buildLifecycle().adoptSessionRoot(base);
|
|
1705
1979
|
// ── Resume worktree: if the paused session was inside a milestone worktree,
|
|
1706
1980
|
// apply that path as the dispatch basePath immediately (#3723).
|
|
1707
1981
|
// This ensures the dispatch loop runs from the worktree directory even when
|
|
@@ -1713,7 +1987,8 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1713
1987
|
if (resumeWorktreePath && !existsSync(resumeWorktreePath)) {
|
|
1714
1988
|
logWarning("session", `Worktree was expected at ${resumeWorktreePath} but is missing. Continuing in project-root mode. To restart with a fresh worktree, run /gsd-debug or recreate the milestone.`, { file: "auto.ts", milestoneId: s.currentMilestoneId ?? "" });
|
|
1715
1989
|
}
|
|
1716
|
-
|
|
1990
|
+
// ADR-016 phase 2 / B3 (#5621): paused-resume worktree-path adoption.
|
|
1991
|
+
buildLifecycle().resumeFromPausedSession(base, resumeWorktreePath);
|
|
1717
1992
|
// Rebuild scope now that s.basePath reflects the actual worktree (or project root).
|
|
1718
1993
|
rebuildScope(s.basePath, s.currentMilestoneId);
|
|
1719
1994
|
// Ensure the workflow-logger audit log is pinned to the project root
|
|
@@ -1936,7 +2211,12 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
|
|
|
1936
2211
|
s.currentUnit = null;
|
|
1937
2212
|
s.pendingQuickTasks = [];
|
|
1938
2213
|
}
|
|
1939
|
-
|
|
2214
|
+
// ADR-016 phase 2 / B2 (#5620): hook-trigger basePath transition. Treats
|
|
2215
|
+
// the trigger as a bootstrap variant — if the session is fresh,
|
|
2216
|
+
// `originalBasePath` gets set to `targetBasePath`; if the session was
|
|
2217
|
+
// already active with an established `originalBasePath`, the verb
|
|
2218
|
+
// preserves it.
|
|
2219
|
+
buildLifecycle().adoptSessionRoot(targetBasePath);
|
|
1940
2220
|
if (!s.orchestration) {
|
|
1941
2221
|
ensureOrchestrationModule(ctx, pi, s.basePath);
|
|
1942
2222
|
}
|