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.
Files changed (503) hide show
  1. package/README.md +60 -30
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
  4. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  5. package/dist/resources/extensions/gsd/auto/loop.js +111 -8
  6. package/dist/resources/extensions/gsd/auto/orchestrator.js +113 -6
  7. package/dist/resources/extensions/gsd/auto/phases.js +199 -97
  8. package/dist/resources/extensions/gsd/auto/run-unit.js +66 -3
  9. package/dist/resources/extensions/gsd/auto/session.js +9 -0
  10. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +43 -0
  11. package/dist/resources/extensions/gsd/auto-dashboard.js +182 -178
  12. package/dist/resources/extensions/gsd/auto-dispatch.js +14 -11
  13. package/dist/resources/extensions/gsd/auto-post-unit.js +7 -1
  14. package/dist/resources/extensions/gsd/auto-prompts.js +11 -3
  15. package/dist/resources/extensions/gsd/auto-recovery.js +6 -181
  16. package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -0
  17. package/dist/resources/extensions/gsd/auto-start.js +20 -23
  18. package/dist/resources/extensions/gsd/auto-unit-closeout.js +33 -5
  19. package/dist/resources/extensions/gsd/auto-verification.js +12 -6
  20. package/dist/resources/extensions/gsd/auto-worktree.js +8 -0
  21. package/dist/resources/extensions/gsd/auto.js +386 -106
  22. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +13 -6
  23. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +13 -2
  24. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +4 -8
  25. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  26. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -1
  27. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +4 -10
  28. package/dist/resources/extensions/gsd/commands/handlers/parallel.js +9 -0
  29. package/dist/resources/extensions/gsd/commands-handlers.js +15 -2
  30. package/dist/resources/extensions/gsd/context-store.js +112 -0
  31. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  32. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  33. package/dist/resources/extensions/gsd/doctor-git-checks.js +41 -6
  34. package/dist/resources/extensions/gsd/git-service.js +2 -1
  35. package/dist/resources/extensions/gsd/gsd-db.js +7 -23
  36. package/dist/resources/extensions/gsd/health-widget-core.js +1 -1
  37. package/dist/resources/extensions/gsd/health-widget.js +4 -10
  38. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  39. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  40. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  41. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  42. package/dist/resources/extensions/gsd/markdown-renderer.js +6 -96
  43. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  44. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  45. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  46. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  47. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  48. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  49. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  50. package/dist/resources/extensions/gsd/native-git-bridge.js +14 -14
  51. package/dist/resources/extensions/gsd/notification-overlay.js +35 -40
  52. package/dist/resources/extensions/gsd/parallel-merge.js +53 -30
  53. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +25 -33
  54. package/dist/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  55. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  56. package/dist/resources/extensions/gsd/prompts/discuss.md +20 -2
  57. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  58. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  59. package/dist/resources/extensions/gsd/recovery-classification.js +15 -1
  60. package/dist/resources/extensions/gsd/session-lock.js +40 -0
  61. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +131 -0
  62. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +247 -0
  63. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +50 -0
  64. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +87 -0
  65. package/dist/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.js +50 -0
  66. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +124 -0
  67. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +32 -0
  68. package/dist/resources/extensions/gsd/state-reconciliation/errors.js +41 -0
  69. package/dist/resources/extensions/gsd/state-reconciliation/index.js +99 -0
  70. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +24 -0
  71. package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +43 -0
  72. package/dist/resources/extensions/gsd/state-reconciliation/types.js +3 -0
  73. package/dist/resources/extensions/gsd/state-reconciliation.js +5 -26
  74. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  75. package/dist/resources/extensions/gsd/tui/render-kit.js +74 -0
  76. package/dist/resources/extensions/gsd/watch/header-renderer.js +92 -69
  77. package/dist/resources/extensions/gsd/watch/splash-palette.js +10 -0
  78. package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
  79. package/dist/resources/extensions/gsd/worktree-lifecycle.js +722 -316
  80. package/dist/resources/extensions/gsd/worktree-telemetry.js +3 -1
  81. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  82. package/dist/web/standalone/.next/BUILD_ID +1 -1
  83. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  84. package/dist/web/standalone/.next/build-manifest.json +3 -3
  85. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  86. package/dist/web/standalone/.next/required-server-files.json +3 -3
  87. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  88. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  90. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  98. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  101. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  114. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  126. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  146. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  156. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  162. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  178. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  182. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/index.html +1 -1
  192. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  193. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  194. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  195. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  196. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  197. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  198. package/dist/web/standalone/.next/server/app/page.js +2 -2
  199. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  201. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  202. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  203. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/middleware.js +2 -2
  205. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  207. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  208. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  209. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  210. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  211. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  212. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  213. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  214. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  215. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  216. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  217. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  218. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  219. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  220. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  221. package/dist/web/standalone/server.js +1 -1
  222. package/dist/welcome-screen.d.ts +0 -7
  223. package/dist/welcome-screen.js +60 -69
  224. package/package.json +3 -2
  225. package/packages/daemon/package.json +2 -2
  226. package/packages/mcp-server/README.md +2 -0
  227. package/packages/mcp-server/package.json +2 -2
  228. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  229. package/packages/native/package.json +1 -1
  230. package/packages/pi-agent-core/package.json +1 -1
  231. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  232. package/packages/pi-ai/dist/index.d.ts +2 -2
  233. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  234. package/packages/pi-ai/dist/index.js +1 -1
  235. package/packages/pi-ai/dist/index.js.map +1 -1
  236. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  237. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  238. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  239. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  240. package/packages/pi-ai/package.json +1 -1
  241. package/packages/pi-ai/src/index.ts +7 -2
  242. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  243. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  244. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  245. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  246. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts +2 -0
  247. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts.map +1 -0
  248. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +47 -0
  249. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -0
  250. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +76 -9
  251. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  252. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts +2 -0
  253. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts.map +1 -0
  254. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +40 -0
  255. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -0
  256. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +0 -1
  257. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -1
  258. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +30 -29
  259. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  260. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +10 -3
  261. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
  262. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  263. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +13 -13
  264. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -3
  266. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  267. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +58 -3
  268. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts +2 -2
  270. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +12 -6
  272. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -41
  275. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +0 -1
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +86 -82
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts +35 -0
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts.map +1 -0
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +152 -0
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -0
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts +16 -0
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts.map +1 -0
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js +73 -0
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js.map +1 -0
  288. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +1 -1
  289. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +12 -8
  291. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  293. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  294. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  295. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  296. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  297. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +105 -1
  298. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +27 -26
  301. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +9 -6
  303. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  305. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  306. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  307. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  308. package/packages/pi-coding-agent/package.json +1 -1
  309. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  310. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +56 -0
  311. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +113 -9
  312. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +48 -0
  313. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +10 -3
  314. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +43 -42
  315. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +14 -14
  316. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +64 -3
  317. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +13 -7
  318. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +15 -42
  319. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +84 -104
  320. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +196 -0
  321. package/packages/pi-coding-agent/src/modes/interactive/components/tui-style-kit.ts +94 -0
  322. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +14 -9
  323. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
  324. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +106 -1
  325. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +27 -26
  326. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +9 -6
  327. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  328. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  329. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +14 -1
  330. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  331. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
  332. package/packages/pi-tui/dist/overlay-layout.js +9 -6
  333. package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
  334. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  335. package/packages/pi-tui/dist/tui.js +5 -0
  336. package/packages/pi-tui/dist/tui.js.map +1 -1
  337. package/packages/pi-tui/package.json +1 -1
  338. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +20 -1
  339. package/packages/pi-tui/src/overlay-layout.ts +10 -7
  340. package/packages/pi-tui/src/tui.ts +6 -0
  341. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  342. package/packages/rpc-client/package.json +1 -1
  343. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  344. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  345. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  346. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  347. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  348. package/pkg/dist/modes/interactive/theme/theme.js +105 -1
  349. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  350. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  351. package/pkg/dist/modes/interactive/theme/themes.js +27 -26
  352. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  353. package/pkg/package.json +1 -1
  354. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  355. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  356. package/src/resources/extensions/gsd/auto/contracts.ts +46 -11
  357. package/src/resources/extensions/gsd/auto/loop-deps.ts +9 -5
  358. package/src/resources/extensions/gsd/auto/loop.ts +113 -9
  359. package/src/resources/extensions/gsd/auto/orchestrator.ts +118 -6
  360. package/src/resources/extensions/gsd/auto/phases.ts +158 -19
  361. package/src/resources/extensions/gsd/auto/run-unit.ts +69 -4
  362. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  363. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
  364. package/src/resources/extensions/gsd/auto-dashboard.ts +230 -183
  365. package/src/resources/extensions/gsd/auto-dispatch.ts +15 -1
  366. package/src/resources/extensions/gsd/auto-post-unit.ts +7 -1
  367. package/src/resources/extensions/gsd/auto-prompts.ts +11 -3
  368. package/src/resources/extensions/gsd/auto-recovery.ts +7 -209
  369. package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
  370. package/src/resources/extensions/gsd/auto-start.ts +22 -22
  371. package/src/resources/extensions/gsd/auto-unit-closeout.ts +51 -0
  372. package/src/resources/extensions/gsd/auto-verification.ts +12 -6
  373. package/src/resources/extensions/gsd/auto-worktree.ts +8 -0
  374. package/src/resources/extensions/gsd/auto.ts +424 -106
  375. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +21 -6
  376. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +12 -2
  377. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +5 -8
  378. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  379. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -1
  380. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +4 -10
  381. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +12 -0
  382. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  383. package/src/resources/extensions/gsd/context-store.ts +120 -1
  384. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  385. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  386. package/src/resources/extensions/gsd/doctor-git-checks.ts +44 -6
  387. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  388. package/src/resources/extensions/gsd/git-service.ts +2 -0
  389. package/src/resources/extensions/gsd/gsd-db.ts +7 -23
  390. package/src/resources/extensions/gsd/health-widget-core.ts +1 -1
  391. package/src/resources/extensions/gsd/health-widget.ts +6 -10
  392. package/src/resources/extensions/gsd/journal.ts +2 -0
  393. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  394. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  395. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  396. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  397. package/src/resources/extensions/gsd/markdown-renderer.ts +10 -96
  398. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  399. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  400. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  401. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  402. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  403. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  404. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  405. package/src/resources/extensions/gsd/native-git-bridge.ts +14 -13
  406. package/src/resources/extensions/gsd/notification-overlay.ts +50 -46
  407. package/src/resources/extensions/gsd/parallel-merge.ts +61 -34
  408. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +33 -35
  409. package/src/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  410. package/src/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  411. package/src/resources/extensions/gsd/prompts/discuss.md +20 -2
  412. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  413. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  414. package/src/resources/extensions/gsd/recovery-classification.ts +18 -1
  415. package/src/resources/extensions/gsd/session-lock.ts +41 -0
  416. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +172 -0
  417. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +337 -0
  418. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +69 -0
  419. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +109 -0
  420. package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +68 -0
  421. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +185 -0
  422. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +46 -0
  423. package/src/resources/extensions/gsd/state-reconciliation/errors.ts +67 -0
  424. package/src/resources/extensions/gsd/state-reconciliation/index.ts +142 -0
  425. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +27 -0
  426. package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +60 -0
  427. package/src/resources/extensions/gsd/state-reconciliation/types.ts +83 -0
  428. package/src/resources/extensions/gsd/state-reconciliation.ts +21 -53
  429. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  430. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  431. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +99 -0
  432. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +729 -176
  433. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +408 -4
  434. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +291 -4
  435. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +20 -5
  436. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +18 -0
  437. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
  438. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  439. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  440. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +28 -1
  441. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  442. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  443. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  444. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +20 -2
  445. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +44 -0
  446. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  447. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  448. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
  449. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +10 -0
  450. package/src/resources/extensions/gsd/tests/health-widget.test.ts +14 -4
  451. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  452. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +26 -0
  453. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  454. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +1 -1
  455. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  456. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +116 -24
  457. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -1
  458. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  459. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  460. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  461. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  462. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1 -1
  463. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  464. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +46 -11
  465. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  466. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  467. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +78 -41
  468. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +44 -0
  469. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +12 -217
  470. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +38 -6
  471. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  472. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +2 -2
  473. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +1 -1
  474. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +32 -1
  475. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  476. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +7 -3
  477. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +6 -3
  478. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  479. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +24 -0
  480. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +65 -58
  481. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +952 -0
  482. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -0
  483. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +121 -1
  484. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +66 -0
  485. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
  486. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +6 -0
  487. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +158 -58
  488. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +572 -118
  489. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +59 -2
  490. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +18 -0
  491. package/src/resources/extensions/gsd/tui/render-kit.ts +109 -0
  492. package/src/resources/extensions/gsd/watch/header-renderer.ts +121 -79
  493. package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
  494. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  495. package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
  496. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1151 -524
  497. package/src/resources/extensions/gsd/worktree-telemetry.ts +7 -2
  498. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  499. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  500. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  501. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -1544
  502. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → YEvjuT-fsFfYQhDSWtueS}/_buildManifest.js +0 -0
  503. /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
- export function _resolvePausedResumeBasePathForTest(
460
- basePath: string,
461
- pausedWorktreePath: string | null | undefined,
462
- pathExists: (path: string) => boolean = existsSync,
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
- ctx.ui.setWidget("gsd-progress", undefined);
1047
+ if (s.completionStopInProgress) {
1048
+ s.completionStopInProgress = false;
1049
+ }
1019
1050
  initHealthWidget(ctx);
1020
1051
  }
1021
1052
 
1022
- // Restore CWD out of worktree back to original project root
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
- process.chdir(s.basePath);
1062
+ buildLifecycle().restoreToProjectRoot();
1027
1063
  } catch (err) {
1028
- /* best-effort */
1029
- logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
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.basePath);
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.basePath });
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.basePath });
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 and whether the current milestone
1072
- // was merged before we entered stopAuto. This is the producer-side signal for
1073
- // the #4761 orphan class: milestoneMerged=false + currentMilestoneId present
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
- emitAutoExit(s.originalBasePath || s.basePath, {
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
- try {
1274
- if (s.originalBasePath) {
1275
- s.basePath = s.originalBasePath;
1276
- try {
1277
- process.chdir(s.basePath);
1278
- } catch (err) {
1279
- /* best-effort */
1280
- logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
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.basePath);
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.basePath });
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.basePath });
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
- `Auto-mode stopped${reasonSuffix}. Session: ${formatCost(totals.cost)} · ${formatTokenCount(totals.tokens.total)} tokens · ${ledger.units.length} units`,
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(`Auto-mode stopped${reasonSuffix}.`, "info");
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
- ctx?.ui.setWidget("gsd-progress", undefined);
1407
- if (ctx) initHealthWidget(ctx);
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.reset();
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
- function buildLifecycle(): WorktreeLifecycle {
1565
- const lifecycleDeps = {
1566
- enterAutoWorktree,
1567
- createAutoWorktree,
1568
- enterBranchModeForMilestone,
1569
- getAutoWorktreePath,
1570
- getIsolationMode,
1571
- invalidateAllCaches,
1572
- GitServiceImpl,
1573
- loadEffectiveGSDPreferences,
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
- getCurrentBranch,
1581
- checkoutBranch: nativeCheckoutBranch,
1582
- resolveMilestoneFile,
1583
- readFileSync: (path: string, encoding: string) =>
1584
- readFileSync(path, encoding as BufferEncoding),
1585
- } as unknown as WorktreeLifecycleDeps;
1586
- return new WorktreeLifecycle(s, lifecycleDeps);
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
- _pi: ExtensionAPI,
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 (!result.ok) {
1886
+ if (result.blockers.length > 0) {
1610
1887
  return {
1611
1888
  ok: false,
1612
- reason: result.reason,
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: result.repaired.join(", "),
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
- const gate = await preDispatchHealthGate(dispatchBasePath);
1697
- return {
1698
- allow: gate.proceed,
1699
- reason: gate.reason,
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
- s.basePath = base;
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
- s.basePath = _resolvePausedResumeBasePathForTest(base, resumeWorktreePath);
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
- s.basePath = targetBasePath;
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
  }