gsd-pi 2.81.0 → 2.82.0-dev.c22380fc3

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 (521) 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 +371 -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/tools/workflow-tool-executors.js +119 -0
  76. package/dist/resources/extensions/gsd/tui/render-kit.js +74 -0
  77. package/dist/resources/extensions/gsd/watch/header-renderer.js +92 -69
  78. package/dist/resources/extensions/gsd/watch/splash-palette.js +10 -0
  79. package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
  80. package/dist/resources/extensions/gsd/worktree-lifecycle.js +743 -318
  81. package/dist/resources/extensions/gsd/worktree-telemetry.js +3 -1
  82. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  83. package/dist/web/standalone/.next/BUILD_ID +1 -1
  84. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  85. package/dist/web/standalone/.next/build-manifest.json +3 -3
  86. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  87. package/dist/web/standalone/.next/required-server-files.json +3 -3
  88. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  89. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  90. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  99. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  115. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  127. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  147. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  157. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  163. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  179. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  183. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/index.html +1 -1
  193. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  194. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  195. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  196. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  197. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  198. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  199. package/dist/web/standalone/.next/server/app/page.js +2 -2
  200. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  202. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  203. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  204. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/middleware.js +2 -2
  206. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  208. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  209. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  210. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  211. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  212. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  213. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  214. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  215. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  216. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  217. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  218. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  219. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  220. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  221. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  222. package/dist/web/standalone/server.js +1 -1
  223. package/dist/welcome-screen.d.ts +0 -7
  224. package/dist/welcome-screen.js +60 -69
  225. package/package.json +3 -2
  226. package/packages/contracts/dist/rpc.test.js +7 -0
  227. package/packages/contracts/dist/rpc.test.js.map +1 -1
  228. package/packages/contracts/dist/workflow.d.ts +21 -0
  229. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  230. package/packages/contracts/dist/workflow.js +24 -0
  231. package/packages/contracts/dist/workflow.js.map +1 -1
  232. package/packages/contracts/src/rpc.test.ts +8 -0
  233. package/packages/contracts/src/workflow.ts +24 -0
  234. package/packages/daemon/package.json +2 -2
  235. package/packages/mcp-server/README.md +14 -3
  236. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  237. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  238. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  239. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  240. package/packages/mcp-server/package.json +2 -2
  241. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  242. package/packages/mcp-server/src/workflow-tools.test.ts +22 -0
  243. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  244. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  245. package/packages/native/package.json +1 -1
  246. package/packages/pi-agent-core/package.json +1 -1
  247. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  248. package/packages/pi-ai/dist/index.d.ts +2 -2
  249. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  250. package/packages/pi-ai/dist/index.js +1 -1
  251. package/packages/pi-ai/dist/index.js.map +1 -1
  252. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  253. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  254. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  255. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  256. package/packages/pi-ai/package.json +1 -1
  257. package/packages/pi-ai/src/index.ts +7 -2
  258. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  259. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  260. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  261. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  262. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts +2 -0
  263. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts.map +1 -0
  264. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +47 -0
  265. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -0
  266. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +76 -9
  267. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts +2 -0
  269. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts.map +1 -0
  270. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +40 -0
  271. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -0
  272. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +0 -1
  273. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +30 -29
  275. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +10 -3
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +13 -13
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -3
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +58 -3
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts +2 -2
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +12 -6
  288. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  289. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -41
  291. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +0 -1
  293. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  294. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +86 -82
  295. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts +35 -0
  297. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts.map +1 -0
  298. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +152 -0
  299. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -0
  300. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts +16 -0
  301. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts.map +1 -0
  302. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js +73 -0
  303. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js.map +1 -0
  304. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +1 -1
  305. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  306. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +12 -8
  307. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  308. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  309. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  310. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  311. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  312. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  313. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +105 -1
  314. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  316. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +27 -26
  317. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +9 -6
  319. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  320. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  321. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  322. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  323. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  324. package/packages/pi-coding-agent/package.json +1 -1
  325. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  326. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +56 -0
  327. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +113 -9
  328. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +48 -0
  329. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +10 -3
  330. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +43 -42
  331. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +14 -14
  332. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +64 -3
  333. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +13 -7
  334. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +15 -42
  335. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +84 -104
  336. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +196 -0
  337. package/packages/pi-coding-agent/src/modes/interactive/components/tui-style-kit.ts +94 -0
  338. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +14 -9
  339. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
  340. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +106 -1
  341. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +27 -26
  342. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +9 -6
  343. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  344. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  345. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +14 -1
  346. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  347. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
  348. package/packages/pi-tui/dist/overlay-layout.js +9 -6
  349. package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
  350. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  351. package/packages/pi-tui/dist/tui.js +5 -0
  352. package/packages/pi-tui/dist/tui.js.map +1 -1
  353. package/packages/pi-tui/package.json +1 -1
  354. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +20 -1
  355. package/packages/pi-tui/src/overlay-layout.ts +10 -7
  356. package/packages/pi-tui/src/tui.ts +6 -0
  357. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  358. package/packages/rpc-client/package.json +1 -1
  359. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  360. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  361. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  362. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  363. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  364. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  365. package/pkg/dist/modes/interactive/theme/theme.js +105 -1
  366. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  367. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  368. package/pkg/dist/modes/interactive/theme/themes.js +27 -26
  369. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  370. package/pkg/package.json +1 -1
  371. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  372. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  373. package/src/resources/extensions/gsd/auto/contracts.ts +46 -11
  374. package/src/resources/extensions/gsd/auto/loop-deps.ts +9 -5
  375. package/src/resources/extensions/gsd/auto/loop.ts +113 -9
  376. package/src/resources/extensions/gsd/auto/orchestrator.ts +118 -6
  377. package/src/resources/extensions/gsd/auto/phases.ts +158 -19
  378. package/src/resources/extensions/gsd/auto/run-unit.ts +69 -4
  379. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  380. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
  381. package/src/resources/extensions/gsd/auto-dashboard.ts +230 -183
  382. package/src/resources/extensions/gsd/auto-dispatch.ts +15 -1
  383. package/src/resources/extensions/gsd/auto-post-unit.ts +7 -1
  384. package/src/resources/extensions/gsd/auto-prompts.ts +11 -3
  385. package/src/resources/extensions/gsd/auto-recovery.ts +7 -209
  386. package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
  387. package/src/resources/extensions/gsd/auto-start.ts +22 -22
  388. package/src/resources/extensions/gsd/auto-unit-closeout.ts +51 -0
  389. package/src/resources/extensions/gsd/auto-verification.ts +12 -6
  390. package/src/resources/extensions/gsd/auto-worktree.ts +8 -0
  391. package/src/resources/extensions/gsd/auto.ts +411 -106
  392. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +21 -6
  393. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +12 -2
  394. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +5 -8
  395. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  396. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -1
  397. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +4 -10
  398. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +12 -0
  399. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  400. package/src/resources/extensions/gsd/context-store.ts +120 -1
  401. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  402. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  403. package/src/resources/extensions/gsd/doctor-git-checks.ts +44 -6
  404. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  405. package/src/resources/extensions/gsd/git-service.ts +2 -0
  406. package/src/resources/extensions/gsd/gsd-db.ts +7 -23
  407. package/src/resources/extensions/gsd/health-widget-core.ts +1 -1
  408. package/src/resources/extensions/gsd/health-widget.ts +6 -10
  409. package/src/resources/extensions/gsd/journal.ts +2 -0
  410. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  411. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  412. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  413. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  414. package/src/resources/extensions/gsd/markdown-renderer.ts +10 -96
  415. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  416. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  417. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  418. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  419. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  420. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  421. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  422. package/src/resources/extensions/gsd/native-git-bridge.ts +14 -13
  423. package/src/resources/extensions/gsd/notification-overlay.ts +50 -46
  424. package/src/resources/extensions/gsd/parallel-merge.ts +61 -34
  425. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +33 -35
  426. package/src/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  427. package/src/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  428. package/src/resources/extensions/gsd/prompts/discuss.md +20 -2
  429. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  430. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  431. package/src/resources/extensions/gsd/recovery-classification.ts +18 -1
  432. package/src/resources/extensions/gsd/session-lock.ts +41 -0
  433. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +172 -0
  434. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +337 -0
  435. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +69 -0
  436. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +109 -0
  437. package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +68 -0
  438. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +185 -0
  439. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +46 -0
  440. package/src/resources/extensions/gsd/state-reconciliation/errors.ts +67 -0
  441. package/src/resources/extensions/gsd/state-reconciliation/index.ts +142 -0
  442. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +27 -0
  443. package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +60 -0
  444. package/src/resources/extensions/gsd/state-reconciliation/types.ts +83 -0
  445. package/src/resources/extensions/gsd/state-reconciliation.ts +21 -53
  446. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  447. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  448. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +99 -0
  449. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +729 -176
  450. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +408 -4
  451. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +292 -4
  452. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +20 -5
  453. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +18 -0
  454. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
  455. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  456. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  457. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +28 -1
  458. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  459. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  460. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  461. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +20 -2
  462. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +44 -0
  463. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  464. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  465. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
  466. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +10 -0
  467. package/src/resources/extensions/gsd/tests/health-widget.test.ts +14 -4
  468. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  469. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +26 -0
  470. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  471. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +1 -1
  472. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  473. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +116 -24
  474. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -1
  475. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  476. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  477. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  478. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  479. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1 -1
  480. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  481. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +46 -11
  482. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  483. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  484. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +78 -41
  485. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +44 -0
  486. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +12 -217
  487. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +38 -6
  488. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  489. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +2 -2
  490. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +1 -1
  491. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +32 -1
  492. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  493. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +7 -3
  494. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +6 -3
  495. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  496. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +24 -0
  497. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +71 -58
  498. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +952 -0
  499. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -0
  500. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +121 -1
  501. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +66 -0
  502. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
  503. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +6 -0
  504. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +158 -58
  505. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +597 -118
  506. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +59 -2
  507. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +18 -0
  508. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  509. package/src/resources/extensions/gsd/tui/render-kit.ts +109 -0
  510. package/src/resources/extensions/gsd/watch/header-renderer.ts +121 -79
  511. package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
  512. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  513. package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
  514. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1171 -526
  515. package/src/resources/extensions/gsd/worktree-telemetry.ts +7 -2
  516. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  517. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  518. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  519. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -1544
  520. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → Wop3A7KRGyR06H3rla_1-}/_buildManifest.js +0 -0
  521. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → Wop3A7KRGyR06H3rla_1-}/_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,35 @@ 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 + chdir routes
1054
+ // through `Lifecycle.restoreToProjectRoot()`, the sole owner of both
1055
+ // `s.basePath` mutation and the paired `process.chdir` for auto-loop
1056
+ // transitions. The verb assigns `s.basePath` before any throwable work, so
1057
+ // a thrown error still leaves basePath restored.
1023
1058
  if (s.originalBasePath) {
1024
- s.basePath = s.originalBasePath;
1025
1059
  try {
1026
- process.chdir(s.basePath);
1060
+ buildLifecycle().restoreToProjectRoot();
1027
1061
  } catch (err) {
1028
- /* best-effort */
1029
- logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
1062
+ logWarning(
1063
+ "engine",
1064
+ `restore project root failed: ${err instanceof Error ? err.message : String(err)}`,
1065
+ { file: "auto.ts" },
1066
+ );
1030
1067
  }
1031
1068
  }
1032
1069
 
1033
1070
  if (s.originalBasePath && s.cmdCtx) {
1034
- const result = await rerootCommandSession(s.cmdCtx, s.basePath);
1071
+ const result = await rerootCommandSession(s.cmdCtx, s.originalBasePath);
1035
1072
  if (result.status === "cancelled") {
1036
- logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.basePath });
1073
+ logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.originalBasePath });
1037
1074
  } else if (result.status === "failed") {
1038
- logWarning("engine", `post-loop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.basePath });
1075
+ logWarning("engine", `post-loop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.originalBasePath });
1039
1076
  }
1040
1077
  }
1041
1078
  }
@@ -1046,6 +1083,58 @@ export function _cleanupAfterLoopExitForTest(ctx: ExtensionContext): Promise<voi
1046
1083
 
1047
1084
  export type AutoWorktreeExitAction = "skip" | "merge" | "preserve";
1048
1085
 
1086
+ interface MilestoneCompletionRollup {
1087
+ milestoneTitle?: string;
1088
+ oneLiner?: string;
1089
+ successCriteriaResults?: string;
1090
+ definitionOfDoneResults?: string;
1091
+ requirementOutcomes?: string;
1092
+ deviations?: string;
1093
+ followUps?: string;
1094
+ keyDecisions?: string[];
1095
+ keyFiles?: string[];
1096
+ lessonsLearned?: string[];
1097
+ }
1098
+
1099
+ function normalizeFrontmatterList(value: unknown): string[] {
1100
+ if (!Array.isArray(value)) return [];
1101
+ return value
1102
+ .map(item => typeof item === "string" ? item.trim() : "")
1103
+ .filter(item => item.length > 0 && item !== "(none)");
1104
+ }
1105
+
1106
+ function firstBoldParagraph(body: string): string | undefined {
1107
+ const match = body.match(/\*\*([^*\n][\s\S]*?)\*\*/);
1108
+ return match?.[1]?.replace(/\s+/g, " ").trim() || undefined;
1109
+ }
1110
+
1111
+ function loadMilestoneCompletionRollup(basePath: string, milestoneId: string | null | undefined): MilestoneCompletionRollup {
1112
+ if (!milestoneId) return {};
1113
+ const summaryPath = resolveMilestoneFile(basePath, milestoneId, "SUMMARY");
1114
+ if (!summaryPath || !existsSync(summaryPath)) return {};
1115
+
1116
+ try {
1117
+ const raw = readFileSync(summaryPath, "utf-8");
1118
+ const [frontmatterLines, body] = splitFrontmatter(raw);
1119
+ const frontmatter = frontmatterLines ? parseFrontmatterMap(frontmatterLines) : {};
1120
+ return {
1121
+ milestoneTitle: typeof frontmatter.title === "string" ? frontmatter.title : undefined,
1122
+ oneLiner: firstBoldParagraph(body),
1123
+ successCriteriaResults: extractSection(body, "Success Criteria Results") ?? undefined,
1124
+ definitionOfDoneResults: extractSection(body, "Definition of Done Results") ?? undefined,
1125
+ requirementOutcomes: extractSection(body, "Requirement Outcomes") ?? undefined,
1126
+ deviations: extractSection(body, "Deviations") ?? undefined,
1127
+ followUps: extractSection(body, "Follow-ups") ?? undefined,
1128
+ keyDecisions: normalizeFrontmatterList(frontmatter.key_decisions),
1129
+ keyFiles: normalizeFrontmatterList(frontmatter.key_files),
1130
+ lessonsLearned: normalizeFrontmatterList(frontmatter.lessons_learned),
1131
+ };
1132
+ } catch (err) {
1133
+ logWarning("dashboard", `completion roll-up summary read failed: ${err instanceof Error ? err.message : String(err)}`);
1134
+ return {};
1135
+ }
1136
+ }
1137
+
1049
1138
  export function _resolveAutoWorktreeExitActionForTest(
1050
1139
  currentMilestoneId: string | null | undefined,
1051
1140
  milestoneMergedInPhases: boolean,
@@ -1063,15 +1152,17 @@ export async function stopAuto(
1063
1152
  ctx?: ExtensionContext,
1064
1153
  pi?: ExtensionAPI,
1065
1154
  reason?: string,
1155
+ options: StopAutoOptions = {},
1066
1156
  ): Promise<void> {
1067
1157
  if (!s.active && !s.paused) return;
1068
1158
  const loadedPreferences = loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences;
1069
1159
  const reasonSuffix = reason ? ` — ${reason}` : "";
1160
+ const preserveCompletionSurface = Boolean(options.completionWidget);
1161
+ s.completionStopInProgress = preserveCompletionSurface;
1070
1162
 
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.
1163
+ // #4764 — telemetry: record the exit reason, isolation mode, whether an auto
1164
+ // worktree was active, and whether the current milestone was merged before
1165
+ // stopAuto. The unmerged-work warning is only meaningful for real worktrees.
1075
1166
  try {
1076
1167
  const { emitAutoExit } = await import("./worktree-telemetry.js");
1077
1168
  type AutoExitReason =
@@ -1096,10 +1187,13 @@ export async function stopAuto(
1096
1187
  : rawReason === "stop" || rawReason === "pause"
1097
1188
  ? rawReason
1098
1189
  : "other";
1099
- emitAutoExit(s.originalBasePath || s.basePath, {
1190
+ const telemetryBase = s.originalBasePath || s.basePath;
1191
+ emitAutoExit(telemetryBase, {
1100
1192
  reason: normalizedReason,
1101
1193
  milestoneId: s.currentMilestoneId ?? undefined,
1102
1194
  milestoneMerged: s.milestoneMergedInPhases === true,
1195
+ isolationMode: getIsolationMode(telemetryBase),
1196
+ worktreeActive: isInAutoWorktree(s.basePath),
1103
1197
  });
1104
1198
  } catch (err) {
1105
1199
  logWarning("engine", `auto-exit telemetry failed: ${err instanceof Error ? err.message : String(err)}`);
@@ -1257,6 +1351,21 @@ export async function stopAuto(
1257
1351
  }
1258
1352
  }
1259
1353
 
1354
+ // Pre-compute completion widget slice counts while the DB is still open.
1355
+ // Step 8 runs after closeDatabase(), so DB-backed slice lookups must happen here.
1356
+ const completionMilestoneId = options.completionWidget?.milestoneId ?? s.currentMilestoneId;
1357
+ let completedSlices: number | null = null;
1358
+ let totalSlices: number | null = null;
1359
+ if (preserveCompletionSurface && options.completionWidget && completionMilestoneId && isDbAvailable()) {
1360
+ try {
1361
+ const slices = getMilestoneSlices(completionMilestoneId);
1362
+ completedSlices = slices.filter(slice => isClosedStatus(slice.status)).length;
1363
+ totalSlices = slices.length;
1364
+ } catch (err) {
1365
+ logWarning("dashboard", `completion slice stats lookup failed: ${err instanceof Error ? err.message : String(err)}`);
1366
+ }
1367
+ }
1368
+
1260
1369
  // ── Step 6: DB cleanup ──
1261
1370
  if (isDbAvailable()) {
1262
1371
  try {
@@ -1269,19 +1378,15 @@ export async function stopAuto(
1269
1378
  }
1270
1379
  }
1271
1380
 
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
- }
1381
+ // ── Step 7: Restore basePath and chdir (ADR-016 phase 3, #5693) ──
1382
+ // `restoreToProjectRoot` owns both s.basePath restore and process.chdir;
1383
+ // no paired chdir is needed at the call site.
1384
+ if (s.originalBasePath) {
1385
+ try {
1386
+ buildLifecycle().restoreToProjectRoot();
1387
+ } catch (e) {
1388
+ debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
1282
1389
  }
1283
- } catch (e) {
1284
- debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
1285
1390
  }
1286
1391
 
1287
1392
  // Re-root the active command session/tool runtime after worktree teardown.
@@ -1289,30 +1394,91 @@ export async function stopAuto(
1289
1394
  // its own cwd for tools and system prompt; refresh it before returning to the
1290
1395
  // user so follow-up commands do not target a removed milestone worktree.
1291
1396
  if (s.originalBasePath && ctx && s.cmdCtx) {
1292
- const result = await rerootCommandSession(s.cmdCtx, s.basePath);
1397
+ const result = await rerootCommandSession(s.cmdCtx, s.originalBasePath);
1293
1398
  if (result.status === "cancelled") {
1294
- logWarning("engine", "post-stop session re-root was cancelled", { file: "auto.ts", basePath: s.basePath });
1399
+ logWarning("engine", "post-stop session re-root was cancelled", { file: "auto.ts", basePath: s.originalBasePath });
1295
1400
  } else if (result.status === "failed") {
1296
- logWarning("engine", `post-stop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.basePath });
1401
+ logWarning("engine", `post-stop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.originalBasePath });
1297
1402
  }
1298
1403
  }
1299
1404
 
1300
1405
  // ── Step 8: Ledger notification ──
1301
1406
  try {
1302
1407
  const ledger = getLedger();
1408
+ const isAllComplete = reason === "All milestones complete";
1409
+ const isMilestoneComplete = /^Milestone\s+\S+\s+complete$/i.test(reason ?? "");
1410
+ const notificationPrefix = isAllComplete
1411
+ ? "All milestones complete"
1412
+ : isMilestoneComplete
1413
+ ? `${reason}. Auto-mode finished this milestone`
1414
+ : `Auto-mode stopped${reasonSuffix}`;
1303
1415
  if (ledger && ledger.units.length > 0) {
1304
1416
  const totals = getProjectTotals(ledger.units);
1305
1417
  ctx?.ui.notify(
1306
- `Auto-mode stopped${reasonSuffix}. Session: ${formatCost(totals.cost)} · ${formatTokenCount(totals.tokens.total)} tokens · ${ledger.units.length} units`,
1418
+ `${notificationPrefix}. Session: ${formatCost(totals.cost)} · ${formatTokenCount(totals.tokens.total)} tokens · ${ledger.units.length} units`,
1307
1419
  "info",
1308
1420
  );
1309
1421
  } else {
1310
- ctx?.ui.notify(`Auto-mode stopped${reasonSuffix}.`, "info");
1422
+ ctx?.ui.notify(`${notificationPrefix}.`, "info");
1311
1423
  }
1312
1424
  } catch (e) {
1313
1425
  debugLog("stop-cleanup-ledger", { error: e instanceof Error ? e.message : String(e) });
1314
1426
  }
1315
1427
 
1428
+ if (preserveCompletionSurface && ctx && options.completionWidget) {
1429
+ const ledger = getLedger();
1430
+ const units = ledger?.units ?? [];
1431
+ const totals = units.length > 0 ? getProjectTotals(units) : null;
1432
+ let totalInput = 0;
1433
+ let totalCacheRead = 0;
1434
+ try {
1435
+ for (const entry of s.cmdCtx?.sessionManager?.getEntries?.() ?? []) {
1436
+ if (entry.type === "message") {
1437
+ const msgEntry = entry as SessionMessageEntry;
1438
+ if (msgEntry.message?.role === "assistant") {
1439
+ const usage = (msgEntry.message as any).usage;
1440
+ if (usage) {
1441
+ totalInput += usage.input || 0;
1442
+ totalCacheRead += usage.cacheRead || 0;
1443
+ }
1444
+ }
1445
+ }
1446
+ }
1447
+ } catch (err) {
1448
+ logWarning("dashboard", `completion stats lookup failed: ${err instanceof Error ? err.message : String(err)}`);
1449
+ }
1450
+ const contextUsage = s.cmdCtx?.getContextUsage?.();
1451
+ const milestoneId = completionMilestoneId;
1452
+ const rollup = loadMilestoneCompletionRollup(s.originalBasePath || s.basePath, milestoneId);
1453
+ setCompletionProgressWidget(ctx, {
1454
+ milestoneId,
1455
+ milestoneTitle: options.completionWidget.milestoneTitle ?? rollup.milestoneTitle,
1456
+ oneLiner: rollup.oneLiner,
1457
+ successCriteriaResults: rollup.successCriteriaResults,
1458
+ definitionOfDoneResults: rollup.definitionOfDoneResults,
1459
+ requirementOutcomes: rollup.requirementOutcomes,
1460
+ deviations: rollup.deviations,
1461
+ followUps: rollup.followUps,
1462
+ keyDecisions: rollup.keyDecisions,
1463
+ keyFiles: rollup.keyFiles,
1464
+ lessonsLearned: rollup.lessonsLearned,
1465
+ reason: reason ?? "Milestone complete",
1466
+ startedAt: s.autoStartTime,
1467
+ totalCost: totals?.cost ?? 0,
1468
+ totalTokens: totals?.tokens.total ?? 0,
1469
+ unitCount: units.length,
1470
+ cacheHitRate: totalCacheRead + totalInput > 0
1471
+ ? (totalCacheRead / (totalCacheRead + totalInput)) * 100
1472
+ : null,
1473
+ contextPercent: contextUsage?.percent ?? null,
1474
+ contextWindow: contextUsage?.contextWindow ?? s.cmdCtx?.model?.contextWindow ?? null,
1475
+ completedSlices,
1476
+ totalSlices,
1477
+ allMilestonesComplete: options.completionWidget.allMilestonesComplete,
1478
+ basePath: s.originalBasePath || s.basePath || null,
1479
+ });
1480
+ }
1481
+
1316
1482
  // ── Step 9: Cmux sidebar / event log ──
1317
1483
  try {
1318
1484
  pi?.events.emit(CMUX_CHANNELS.SIDEBAR, { action: "clear" as const, preferences: loadedPreferences });
@@ -1403,8 +1569,20 @@ export async function stopAuto(
1403
1569
 
1404
1570
  // UI cleanup
1405
1571
  ctx?.ui.setStatus("gsd-auto", undefined);
1406
- ctx?.ui.setWidget("gsd-progress", undefined);
1407
- if (ctx) initHealthWidget(ctx);
1572
+ if (!preserveCompletionSurface) {
1573
+ ctx?.ui.setWidget("gsd-progress", undefined);
1574
+ const status = reason?.startsWith("Blocked:") ? "blocked" : reason?.toLowerCase().includes("fail") ? "failed" : "stopped";
1575
+ setLifecycleOutcome(ctx, {
1576
+ status,
1577
+ title: status === "blocked" ? "Auto-mode blocked" : status === "failed" ? "Auto-mode stopped with an issue" : "Auto-mode stopped",
1578
+ detail: reason ?? "Auto-mode stopped.",
1579
+ nextAction: status === "blocked"
1580
+ ? "Fix the blocker, then run /gsd auto to resume."
1581
+ : "Run /gsd status for the current project state, or /gsd auto to continue.",
1582
+ commands: ["/gsd status for overview", "/gsd auto to run", "/gsd visualize to inspect", "/gsd notifications for history"],
1583
+ });
1584
+ if (ctx) initHealthWidget(ctx);
1585
+ }
1408
1586
  restoreProjectRootEnv();
1409
1587
  restoreMilestoneLockEnv();
1410
1588
 
@@ -1421,7 +1599,7 @@ export async function stopAuto(
1421
1599
  }
1422
1600
 
1423
1601
  // Reset all session state in one call
1424
- s.reset();
1602
+ s.resetAfterStop({ preserveCompletionSurface });
1425
1603
  }
1426
1604
  }
1427
1605
 
@@ -1495,6 +1673,8 @@ export async function pauseAuto(
1495
1673
  logWarning("engine", `paused-session DB write failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
1496
1674
  }
1497
1675
 
1676
+ const pausedUnitLabel = currentUnitLabel();
1677
+
1498
1678
  // Close out the current unit so its runtime record doesn't stay at "dispatched"
1499
1679
  if (s.currentUnit && ctx) {
1500
1680
  try {
@@ -1545,8 +1725,16 @@ export async function pauseAuto(
1545
1725
  s.verificationRetryCount.clear();
1546
1726
  ctx?.ui.setStatus("gsd-auto", "paused");
1547
1727
  ctx?.ui.setWidget("gsd-progress", undefined);
1548
- if (ctx) initHealthWidget(ctx);
1549
1728
  const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
1729
+ setLifecycleOutcome(ctx, {
1730
+ status: "paused",
1731
+ title: `${s.stepMode ? "Step" : "Auto"}-mode paused`,
1732
+ detail: _errorContext?.message ?? "Paused by user request.",
1733
+ nextAction: `Type to steer, or run ${resumeCmd} to resume.`,
1734
+ commands: [resumeCmd, "/gsd status for overview", "/gsd notifications for history"],
1735
+ unitLabel: pausedUnitLabel,
1736
+ });
1737
+ if (ctx) initHealthWidget(ctx);
1550
1738
  ctx?.ui.notify(
1551
1739
  `${s.stepMode ? "Step" : "Auto"}-mode paused (Escape). Type to interact, or ${resumeCmd} to resume.`,
1552
1740
  "info",
@@ -1561,29 +1749,105 @@ export async function pauseAuto(
1561
1749
  * deps bag is intentionally focused — Lifecycle does not see the wider auto-
1562
1750
  * mode dependency graph.
1563
1751
  */
1564
- function buildLifecycle(): WorktreeLifecycle {
1565
- const lifecycleDeps = {
1566
- enterAutoWorktree,
1567
- createAutoWorktree,
1568
- enterBranchModeForMilestone,
1569
- getAutoWorktreePath,
1570
- getIsolationMode,
1571
- invalidateAllCaches,
1572
- GitServiceImpl,
1573
- loadEffectiveGSDPreferences,
1752
+ /**
1753
+ * Construct a `WorktreeLifecycleDeps` bag without binding to any session.
1754
+ *
1755
+ * Exported so session-less callers (currently `parallel-merge.ts`) can build
1756
+ * the same deps and call `mergeMilestoneStandalone` through the Worktree
1757
+ * Lifecycle Module instead of bypassing it (ADR-016 phase 2 / A2).
1758
+ */
1759
+ export function buildWorktreeLifecycleDeps(): WorktreeLifecycleDeps {
1760
+ // ADR-016 phase 2 / C-track close-out:
1761
+ // C1 (#5624) — fs + git-CLI primitives inlined
1762
+ // C2 (#5625) — worktree-manager helpers inlined
1763
+ // C3 (#5626) — cache + preferences + paths inlined
1764
+ // C4 (#5627) — GitServiceImpl constructor → gitServiceFactory
1765
+ //
1766
+ // Final WorktreeLifecycleDeps shape: 3 fields (gitServiceFactory,
1767
+ // worktreeProjection, mergeMilestoneToMain). Down from 18 at slice-7
1768
+ // closure.
1769
+ return {
1770
+ gitServiceFactory: (basePath: string) => {
1771
+ const gitConfig =
1772
+ loadEffectiveGSDPreferences()?.preferences?.git ?? {};
1773
+ return new GitServiceImpl(basePath, gitConfig);
1774
+ },
1574
1775
  worktreeProjection: new WorktreeStateProjection(),
1575
- isInAutoWorktree,
1576
- autoCommitCurrentBranch,
1577
- autoWorktreeBranch,
1578
- teardownAutoWorktree,
1579
1776
  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);
1777
+ };
1778
+ }
1779
+
1780
+ function buildLifecycle(): WorktreeLifecycle {
1781
+ return new WorktreeLifecycle(s, buildWorktreeLifecycleDeps());
1782
+ }
1783
+
1784
+ /**
1785
+ * Build the production `DispatchAdapter` used by `createWiredAutoOrchestrationModule`.
1786
+ *
1787
+ * Exported so tests can verify parity with `runDispatch`'s `resolveDispatch` call —
1788
+ * the wired adapter must derive `structuredQuestionsAvailable`, `sessionContextWindow`,
1789
+ * `sessionProvider`, and `modelRegistry` the same way phases.ts:runDispatch does.
1790
+ */
1791
+ export function createWiredDispatchAdapter(
1792
+ ctx: ExtensionContext,
1793
+ pi: ExtensionAPI,
1794
+ dispatchBasePath: string,
1795
+ ): DispatchAdapter {
1796
+ return {
1797
+ async decideNextUnit(input) {
1798
+ const state = input.stateSnapshot;
1799
+ const active = state.activeMilestone;
1800
+ if (!active) return null;
1801
+
1802
+ const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
1803
+
1804
+ // Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
1805
+ // (#5789). Prefer caller-supplied values when present so test harnesses and
1806
+ // alternative wirings can inject deterministic snapshots; otherwise pull from
1807
+ // the captured pi/ctx references.
1808
+ const sessionProvider = input.sessionProvider ?? ctx.model?.provider;
1809
+ const sessionContextWindow = input.sessionContextWindow ?? ctx.model?.contextWindow;
1810
+ const modelRegistry = input.modelRegistry ?? (ctx.modelRegistry as MinimalModelRegistry | undefined);
1811
+ const authMode =
1812
+ sessionProvider && typeof ctx.modelRegistry?.getProviderAuthMode === "function"
1813
+ ? ctx.modelRegistry.getProviderAuthMode(sessionProvider)
1814
+ : undefined;
1815
+ const activeTools = typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [];
1816
+ // Mirrors runDispatch: deep-planning keeps approval gates in plain chat
1817
+ // because structured questions can be cancelled outside the chat turn on
1818
+ // some transports.
1819
+ const structuredQuestionsAvailable =
1820
+ input.structuredQuestionsAvailable ??
1821
+ (prefs?.planning_depth === "deep"
1822
+ ? "false"
1823
+ : supportsStructuredQuestions(activeTools, {
1824
+ authMode,
1825
+ baseUrl: ctx.model?.baseUrl,
1826
+ })
1827
+ ? "true"
1828
+ : "false");
1829
+
1830
+ const action = await resolveDispatch({
1831
+ basePath: dispatchBasePath,
1832
+ mid: active.id,
1833
+ midTitle: active.title,
1834
+ state,
1835
+ prefs,
1836
+ structuredQuestionsAvailable,
1837
+ sessionContextWindow,
1838
+ sessionProvider,
1839
+ modelRegistry,
1840
+ });
1841
+
1842
+ if (action.action !== "dispatch") return null;
1843
+ return {
1844
+ unitType: action.unitType,
1845
+ unitId: action.unitId,
1846
+ reason: action.matchedRule ?? "dispatch",
1847
+ preconditions: [],
1848
+ };
1849
+ },
1850
+ };
1587
1851
  }
1588
1852
 
1589
1853
  /**
@@ -1595,7 +1859,7 @@ function buildLifecycle(): WorktreeLifecycle {
1595
1859
  */
1596
1860
  export function createWiredAutoOrchestrationModule(
1597
1861
  ctx: ExtensionContext,
1598
- _pi: ExtensionAPI,
1862
+ pi: ExtensionAPI,
1599
1863
  dispatchBasePath: string,
1600
1864
  runtimeBasePath = resolveProjectRoot(dispatchBasePath),
1601
1865
  ): AutoOrchestrationModule {
@@ -1606,44 +1870,25 @@ export function createWiredAutoOrchestrationModule(
1606
1870
  stateReconciliation: {
1607
1871
  async reconcileBeforeDispatch() {
1608
1872
  const result = await reconcileBeforeDispatch(dispatchBasePath);
1609
- if (!result.ok) {
1873
+ if (result.blockers.length > 0) {
1610
1874
  return {
1611
1875
  ok: false,
1612
- reason: result.reason,
1876
+ reason: result.blockers[0],
1613
1877
  stateSnapshot: result.stateSnapshot,
1614
1878
  };
1615
1879
  }
1880
+ const repairedKinds = result.repaired.map((d) => d.kind);
1616
1881
  return {
1617
1882
  ok: true,
1618
- reason: result.repaired.join(", "),
1883
+ reason:
1884
+ repairedKinds.length > 0
1885
+ ? `repaired: ${repairedKinds.join(", ")}`
1886
+ : "clean",
1619
1887
  stateSnapshot: result.stateSnapshot,
1620
1888
  };
1621
1889
  },
1622
1890
  },
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
- },
1891
+ dispatch: createWiredDispatchAdapter(ctx, pi, dispatchBasePath),
1647
1892
  recovery: {
1648
1893
  async classifyAndRecover(input) {
1649
1894
  const recovery = classifyFailure(input);
@@ -1692,12 +1937,25 @@ export function createWiredAutoOrchestrationModule(
1692
1937
  async cleanupOnStop() {},
1693
1938
  },
1694
1939
  health: {
1940
+ checkResourcesStale() {
1941
+ return checkResourcesStale(s.resourceVersionOnStart);
1942
+ },
1695
1943
  async preAdvanceGate() {
1696
- const gate = await preDispatchHealthGate(dispatchBasePath);
1697
- return {
1698
- allow: gate.proceed,
1699
- reason: gate.reason,
1700
- };
1944
+ try {
1945
+ const gate = await preDispatchHealthGate(dispatchBasePath);
1946
+ if (gate.proceed) {
1947
+ return {
1948
+ kind: "pass",
1949
+ fixesApplied: gate.fixesApplied,
1950
+ };
1951
+ }
1952
+ return {
1953
+ kind: "fail",
1954
+ reason: gate.reason ?? "Pre-dispatch health check failed — run /gsd doctor for details.",
1955
+ };
1956
+ } catch (error) {
1957
+ return { kind: "threw", error };
1958
+ }
1701
1959
  },
1702
1960
  async postAdvanceRecord(result) {
1703
1961
  if (result.kind === "error") {
@@ -1765,6 +2023,43 @@ export function createWiredAutoOrchestrationModule(
1765
2023
  }
1766
2024
  },
1767
2025
  },
2026
+ uokGate: {
2027
+ async emit(input) {
2028
+ const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
2029
+ const uokFlags = resolveUokFlags(prefs);
2030
+ if (!uokFlags.gates) return;
2031
+ const milestoneId = input.milestoneId ?? s.currentMilestoneId ?? undefined;
2032
+ try {
2033
+ const { UokGateRunner } = await import("./uok/gate-runner.js");
2034
+ const runner = new UokGateRunner();
2035
+ runner.register({
2036
+ id: input.gateId,
2037
+ type: input.gateType,
2038
+ execute: async () => ({
2039
+ outcome: input.outcome,
2040
+ failureClass: input.failureClass,
2041
+ rationale: input.rationale,
2042
+ findings: input.findings ?? "",
2043
+ }),
2044
+ });
2045
+ await runner.run(input.gateId, {
2046
+ basePath: dispatchBasePath,
2047
+ traceId: `pre-dispatch:${flowId}`,
2048
+ turnId: `orch-${seq}`,
2049
+ milestoneId,
2050
+ unitType: "pre-dispatch",
2051
+ unitId: `orch-${seq}`,
2052
+ });
2053
+ } catch (err) {
2054
+ logWarning("engine", `uok gate emit failed: ${getErrorMessage(err)}`, {
2055
+ file: "auto.ts",
2056
+ gateId: input.gateId,
2057
+ gateType: input.gateType,
2058
+ ...(milestoneId ? { milestoneId } : {}),
2059
+ });
2060
+ }
2061
+ },
2062
+ },
1768
2063
  };
1769
2064
 
1770
2065
  return createAutoOrchestrator(deps);
@@ -1825,7 +2120,6 @@ function buildLoopDeps(pi: ExtensionAPI): LoopDeps {
1825
2120
  pruneQueueOrder,
1826
2121
  isInAutoWorktree,
1827
2122
  shouldUseWorktreeIsolation,
1828
- mergeMilestoneToMain,
1829
2123
  teardownAutoWorktree,
1830
2124
  createAutoWorktree,
1831
2125
  captureIntegrationBranch,
@@ -2145,7 +2439,12 @@ export async function startAuto(
2145
2439
  s.verbose = verboseMode;
2146
2440
  s.stepMode = requestedStepMode;
2147
2441
  s.cmdCtx = ctx;
2148
- s.basePath = base;
2442
+ // ADR-016 phase 2 / B2 (#5620): bootstrap basePath transition before
2443
+ // the resume path consults persisted worktree state. Defensive about
2444
+ // s.originalBasePath — the meta-restore above (line 2003 / 2055) may
2445
+ // have already populated it from paused metadata; the verb preserves
2446
+ // that value.
2447
+ buildLifecycle().adoptSessionRoot(base);
2149
2448
  // ── Resume worktree: if the paused session was inside a milestone worktree,
2150
2449
  // apply that path as the dispatch basePath immediately (#3723).
2151
2450
  // This ensures the dispatch loop runs from the worktree directory even when
@@ -2161,7 +2460,8 @@ export async function startAuto(
2161
2460
  { file: "auto.ts", milestoneId: s.currentMilestoneId ?? "" },
2162
2461
  );
2163
2462
  }
2164
- s.basePath = _resolvePausedResumeBasePathForTest(base, resumeWorktreePath);
2463
+ // ADR-016 phase 2 / B3 (#5621): paused-resume worktree-path adoption.
2464
+ buildLifecycle().resumeFromPausedSession(base, resumeWorktreePath);
2165
2465
  // Rebuild scope now that s.basePath reflects the actual worktree (or project root).
2166
2466
  rebuildScope(s.basePath, s.currentMilestoneId);
2167
2467
  // Ensure the workflow-logger audit log is pinned to the project root
@@ -2463,7 +2763,12 @@ export async function dispatchHookUnit(
2463
2763
  s.pendingQuickTasks = [];
2464
2764
  }
2465
2765
 
2466
- s.basePath = targetBasePath;
2766
+ // ADR-016 phase 2 / B2 (#5620): hook-trigger basePath transition. Treats
2767
+ // the trigger as a bootstrap variant — if the session is fresh,
2768
+ // `originalBasePath` gets set to `targetBasePath`; if the session was
2769
+ // already active with an established `originalBasePath`, the verb
2770
+ // preserves it.
2771
+ buildLifecycle().adoptSessionRoot(targetBasePath);
2467
2772
  if (!s.orchestration) {
2468
2773
  ensureOrchestrationModule(ctx, pi, s.basePath);
2469
2774
  }