gsd-pi 2.66.1 → 2.67.0-dev.43b0159

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 (397) hide show
  1. package/dist/claude-cli-check.d.ts +8 -0
  2. package/dist/claude-cli-check.js +36 -0
  3. package/dist/cli.js +40 -0
  4. package/dist/onboarding.js +19 -2
  5. package/dist/resources/extensions/ask-user-questions.js +79 -11
  6. package/dist/resources/extensions/claude-code-cli/partial-builder.js +4 -3
  7. package/dist/resources/extensions/claude-code-cli/readiness.js +63 -12
  8. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +10 -3
  9. package/dist/resources/extensions/gsd/auto/loop.js +13 -1
  10. package/dist/resources/extensions/gsd/auto/phases.js +22 -3
  11. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -2
  12. package/dist/resources/extensions/gsd/auto/session.js +1 -1
  13. package/dist/resources/extensions/gsd/auto-dashboard.js +65 -15
  14. package/dist/resources/extensions/gsd/auto-dispatch.js +30 -28
  15. package/dist/resources/extensions/gsd/auto-model-selection.js +12 -3
  16. package/dist/resources/extensions/gsd/auto-prompts.js +173 -25
  17. package/dist/resources/extensions/gsd/auto-recovery.js +11 -12
  18. package/dist/resources/extensions/gsd/auto.js +13 -1
  19. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +32 -1
  20. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +18 -6
  21. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -0
  22. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +59 -5
  23. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +8 -5
  24. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +186 -14
  25. package/dist/resources/extensions/gsd/codebase-generator.js +4 -0
  26. package/dist/resources/extensions/gsd/commands/catalog.js +2 -1
  27. package/dist/resources/extensions/gsd/commands/dispatcher.js +1 -1
  28. package/dist/resources/extensions/gsd/commands/handlers/core.js +94 -4
  29. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +49 -9
  30. package/dist/resources/extensions/gsd/context-store.js +134 -2
  31. package/dist/resources/extensions/gsd/custom-workflow-engine.js +3 -1
  32. package/dist/resources/extensions/gsd/detection.js +6 -0
  33. package/dist/resources/extensions/gsd/files.js +19 -2
  34. package/dist/resources/extensions/gsd/guided-flow.js +12 -8
  35. package/dist/resources/extensions/gsd/index.js +1 -1
  36. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +2 -0
  37. package/dist/resources/extensions/gsd/parsers-legacy.js +3 -1
  38. package/dist/resources/extensions/gsd/preferences.js +6 -1
  39. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  40. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  41. package/dist/resources/extensions/gsd/prompts/discuss-prepared.md +7 -7
  42. package/dist/resources/extensions/gsd/prompts/discuss.md +3 -3
  43. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -3
  44. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +3 -3
  45. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +3 -1
  46. package/dist/resources/extensions/gsd/prompts/rethink.md +6 -2
  47. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  48. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  49. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +11 -9
  50. package/dist/resources/extensions/gsd/prompts/worktree-merge.md +3 -1
  51. package/dist/resources/extensions/gsd/safety/file-change-validator.js +2 -1
  52. package/dist/resources/extensions/gsd/state.js +2 -1
  53. package/dist/resources/extensions/gsd/visualizer-overlay.js +27 -26
  54. package/dist/resources/extensions/gsd/workflow-reconcile.js +46 -7
  55. package/dist/resources/extensions/remote-questions/manager.js +8 -0
  56. package/dist/resources/extensions/shared/interview-ui.js +10 -0
  57. package/dist/web/standalone/.next/BUILD_ID +1 -1
  58. package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
  59. package/dist/web/standalone/.next/build-manifest.json +4 -4
  60. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  61. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  62. package/dist/web/standalone/.next/required-server-files.json +3 -3
  63. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  64. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  65. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  66. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  67. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  68. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  69. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  70. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  74. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  75. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  76. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  77. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  78. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  80. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  81. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  90. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  102. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  122. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  132. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  138. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  152. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  154. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  156. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  158. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/index.html +1 -1
  168. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  169. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  170. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  171. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  172. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  173. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  174. package/dist/web/standalone/.next/server/app/page.js +2 -2
  175. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
  177. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  178. package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
  179. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/middleware.js +2 -2
  182. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  184. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  185. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  186. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  187. package/dist/web/standalone/.next/static/chunks/{6502.8874bcae249c02e1.js → 6502.b804e48b7919f55e.js} +3 -3
  188. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  189. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  190. package/dist/web/standalone/.next/static/chunks/app/page-0c485498795110d6.js +1 -0
  191. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  192. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  193. package/dist/web/standalone/.next/static/chunks/{webpack-9fed74684e1c5bb1.js → webpack-65f0501b197d1c49.js} +1 -1
  194. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  195. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  196. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  197. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  198. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  199. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  200. package/dist/web/standalone/server.js +1 -1
  201. package/package.json +1 -1
  202. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  203. package/packages/pi-ai/dist/providers/anthropic-shared.js +4 -3
  204. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  205. package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
  206. package/packages/pi-ai/dist/utils/json-parse.js +11 -1
  207. package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
  208. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -1
  209. package/packages/pi-ai/dist/utils/repair-tool-json.js +60 -1
  210. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
  211. package/packages/pi-ai/dist/utils/tests/json-parse.test.d.ts +2 -0
  212. package/packages/pi-ai/dist/utils/tests/json-parse.test.d.ts.map +1 -0
  213. package/packages/pi-ai/dist/utils/tests/json-parse.test.js +14 -0
  214. package/packages/pi-ai/dist/utils/tests/json-parse.test.js.map +1 -0
  215. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +10 -0
  216. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
  217. package/packages/pi-ai/src/providers/anthropic-shared.ts +4 -3
  218. package/packages/pi-ai/src/utils/json-parse.ts +11 -1
  219. package/packages/pi-ai/src/utils/repair-tool-json.ts +69 -1
  220. package/packages/pi-ai/src/utils/tests/json-parse.test.ts +17 -0
  221. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +13 -0
  222. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +3 -0
  223. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  224. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -0
  225. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  226. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +16 -0
  227. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  228. package/packages/pi-coding-agent/dist/core/retry-handler.js +58 -1
  229. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  230. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +58 -0
  231. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  232. package/packages/pi-coding-agent/dist/core/sdk.d.ts +3 -0
  233. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  234. package/packages/pi-coding-agent/dist/core/sdk.js +1 -0
  235. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  236. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.d.ts +2 -0
  237. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.d.ts.map +1 -0
  238. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +17 -0
  239. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -0
  240. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  241. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +2 -1
  242. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  243. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +1 -0
  244. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  245. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +9 -2
  246. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
  247. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  248. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +2 -1
  249. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  251. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js +2 -1
  252. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  253. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +2 -2
  254. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  255. package/packages/pi-coding-agent/package.json +1 -1
  256. package/packages/pi-coding-agent/src/core/agent-session.ts +4 -0
  257. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +69 -0
  258. package/packages/pi-coding-agent/src/core/retry-handler.ts +66 -1
  259. package/packages/pi-coding-agent/src/core/sdk.ts +5 -0
  260. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +18 -0
  261. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +2 -1
  262. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +11 -2
  263. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +2 -1
  264. package/packages/pi-coding-agent/src/modes/interactive/components/scoped-models-selector.ts +2 -1
  265. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +2 -2
  266. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +13 -0
  267. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  268. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.d.ts +2 -0
  269. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.d.ts.map +1 -0
  270. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +35 -0
  271. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -0
  272. package/packages/pi-tui/dist/__tests__/tui.test.d.ts +2 -0
  273. package/packages/pi-tui/dist/__tests__/tui.test.d.ts.map +1 -0
  274. package/packages/pi-tui/dist/__tests__/tui.test.js +43 -0
  275. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -0
  276. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
  277. package/packages/pi-tui/dist/autocomplete.js +9 -7
  278. package/packages/pi-tui/dist/autocomplete.js.map +1 -1
  279. package/packages/pi-tui/dist/components/__tests__/editor.test.d.ts +2 -0
  280. package/packages/pi-tui/dist/components/__tests__/editor.test.d.ts.map +1 -0
  281. package/packages/pi-tui/dist/components/__tests__/editor.test.js +54 -0
  282. package/packages/pi-tui/dist/components/__tests__/editor.test.js.map +1 -0
  283. package/packages/pi-tui/dist/components/editor.d.ts +3 -1
  284. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  285. package/packages/pi-tui/dist/components/editor.js +14 -3
  286. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  287. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  288. package/packages/pi-tui/dist/stdin-buffer.js +6 -0
  289. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  290. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  291. package/packages/pi-tui/dist/tui.js +8 -0
  292. package/packages/pi-tui/dist/tui.js.map +1 -1
  293. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +15 -0
  294. package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +43 -0
  295. package/packages/pi-tui/src/__tests__/tui.test.ts +50 -0
  296. package/packages/pi-tui/src/autocomplete.ts +9 -7
  297. package/packages/pi-tui/src/components/__tests__/editor.test.ts +64 -0
  298. package/packages/pi-tui/src/components/editor.ts +14 -3
  299. package/packages/pi-tui/src/stdin-buffer.ts +7 -0
  300. package/packages/pi-tui/src/tui.ts +9 -0
  301. package/pkg/package.json +1 -1
  302. package/src/resources/extensions/ask-user-questions.ts +103 -11
  303. package/src/resources/extensions/claude-code-cli/partial-builder.ts +4 -3
  304. package/src/resources/extensions/claude-code-cli/readiness.ts +67 -12
  305. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +12 -3
  306. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +17 -0
  307. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +18 -0
  308. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -1
  309. package/src/resources/extensions/gsd/auto/loop.ts +14 -1
  310. package/src/resources/extensions/gsd/auto/phases.ts +27 -4
  311. package/src/resources/extensions/gsd/auto/run-unit.ts +14 -2
  312. package/src/resources/extensions/gsd/auto/session.ts +1 -1
  313. package/src/resources/extensions/gsd/auto-dashboard.ts +76 -16
  314. package/src/resources/extensions/gsd/auto-dispatch.ts +36 -35
  315. package/src/resources/extensions/gsd/auto-model-selection.ts +12 -3
  316. package/src/resources/extensions/gsd/auto-prompts.ts +195 -25
  317. package/src/resources/extensions/gsd/auto-recovery.ts +15 -15
  318. package/src/resources/extensions/gsd/auto.ts +12 -1
  319. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -1
  320. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +27 -6
  321. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +6 -0
  322. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +67 -6
  323. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +11 -8
  324. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +209 -16
  325. package/src/resources/extensions/gsd/codebase-generator.ts +4 -0
  326. package/src/resources/extensions/gsd/commands/catalog.ts +2 -1
  327. package/src/resources/extensions/gsd/commands/dispatcher.ts +1 -2
  328. package/src/resources/extensions/gsd/commands/handlers/core.ts +113 -8
  329. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +49 -11
  330. package/src/resources/extensions/gsd/context-store.ts +167 -2
  331. package/src/resources/extensions/gsd/custom-workflow-engine.ts +3 -1
  332. package/src/resources/extensions/gsd/detection.ts +6 -0
  333. package/src/resources/extensions/gsd/files.ts +21 -2
  334. package/src/resources/extensions/gsd/guided-flow.ts +15 -8
  335. package/src/resources/extensions/gsd/index.ts +6 -0
  336. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +2 -0
  337. package/src/resources/extensions/gsd/parsers-legacy.ts +3 -1
  338. package/src/resources/extensions/gsd/preferences.ts +6 -1
  339. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  340. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  341. package/src/resources/extensions/gsd/prompts/discuss-prepared.md +7 -7
  342. package/src/resources/extensions/gsd/prompts/discuss.md +3 -3
  343. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -3
  344. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +3 -3
  345. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +3 -1
  346. package/src/resources/extensions/gsd/prompts/rethink.md +6 -2
  347. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  348. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  349. package/src/resources/extensions/gsd/prompts/validate-milestone.md +11 -9
  350. package/src/resources/extensions/gsd/prompts/worktree-merge.md +3 -1
  351. package/src/resources/extensions/gsd/safety/file-change-validator.ts +4 -1
  352. package/src/resources/extensions/gsd/state.ts +2 -1
  353. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +52 -1
  354. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +50 -2
  355. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +21 -7
  356. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +48 -0
  357. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  358. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +12 -0
  359. package/src/resources/extensions/gsd/tests/context-store.test.ts +176 -0
  360. package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +76 -0
  361. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +7 -1
  362. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +31 -0
  363. package/src/resources/extensions/gsd/tests/decision-scope-cascade.test.ts +370 -0
  364. package/src/resources/extensions/gsd/tests/detection.test.ts +37 -0
  365. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +50 -0
  366. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +35 -0
  367. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +34 -0
  368. package/src/resources/extensions/gsd/tests/health-widget.test.ts +45 -0
  369. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +53 -13
  370. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -2
  371. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +3 -3
  372. package/src/resources/extensions/gsd/tests/measurement.test.ts +531 -0
  373. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +3 -4
  374. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +21 -0
  375. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +71 -2
  376. package/src/resources/extensions/gsd/tests/parsers.test.ts +25 -0
  377. package/src/resources/extensions/gsd/tests/preferences.test.ts +37 -0
  378. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +26 -4
  379. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +60 -0
  380. package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +9 -0
  381. package/src/resources/extensions/gsd/tests/reactive-graph.test.ts +19 -0
  382. package/src/resources/extensions/gsd/tests/register-shortcuts.test.ts +73 -0
  383. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +98 -0
  384. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +2 -2
  385. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +26 -0
  386. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +59 -0
  387. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +91 -0
  388. package/src/resources/extensions/gsd/tests/write-gate.test.ts +210 -35
  389. package/src/resources/extensions/gsd/visualizer-overlay.ts +31 -27
  390. package/src/resources/extensions/gsd/workflow-reconcile.ts +59 -8
  391. package/src/resources/extensions/remote-questions/manager.ts +9 -0
  392. package/src/resources/extensions/shared/interview-ui.ts +13 -0
  393. package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.js +0 -1
  394. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  395. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  396. /package/dist/web/standalone/.next/static/{y5P0reMrCMs-4-gswdawm → CrKrzIIxk55witDF1eS0L}/_buildManifest.js +0 -0
  397. /package/dist/web/standalone/.next/static/{y5P0reMrCMs-4-gswdawm → CrKrzIIxk55witDF1eS0L}/_ssgManifest.js +0 -0
@@ -10,11 +10,15 @@
10
10
 
11
11
  import { describe, test, beforeEach } from "node:test";
12
12
  import assert from "node:assert/strict";
13
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
14
+ import { join } from "node:path";
15
+ import { tmpdir } from "node:os";
13
16
 
14
17
  import {
15
18
  getDiscussionMilestoneId,
16
19
  setPendingAutoStart,
17
20
  clearPendingAutoStart,
21
+ checkAutoStartAfterDiscuss,
18
22
  } from "../guided-flow.ts";
19
23
 
20
24
  // ─── Tests ─────────────────────────────────────────────────────────────────
@@ -95,3 +99,33 @@ describe("#2985 Bug 4 — getDiscussionMilestoneId must be keyed by basePath", (
95
99
  assert.equal(result, "M001", "should return the only active milestone for backward compat");
96
100
  });
97
101
  });
102
+
103
+ test("checkAutoStartAfterDiscuss fails closed when a multi-milestone manifest is missing", () => {
104
+ const base = mkdtempSync(join(tmpdir(), "gsd-auto-start-manifest-"));
105
+ try {
106
+ const gsdDir = join(base, ".gsd");
107
+ const milestoneDir = join(gsdDir, "milestones", "M001");
108
+ mkdirSync(milestoneDir, { recursive: true });
109
+ mkdirSync(join(gsdDir, "milestones", "M002"), { recursive: true });
110
+ writeFileSync(
111
+ join(gsdDir, "PROJECT.md"),
112
+ `# Project\n\n| M001 | First milestone | active |\n| M002 | Second milestone | queued |\n`,
113
+ );
114
+ writeFileSync(join(gsdDir, "STATE.md"), "# State\n");
115
+ writeFileSync(join(milestoneDir, "M001-CONTEXT.md"), "# M001 Context\n");
116
+
117
+ clearPendingAutoStart();
118
+ setPendingAutoStart(base, {
119
+ basePath: base,
120
+ milestoneId: "M001",
121
+ ctx: { ui: { notify: () => undefined } } as any,
122
+ pi: { setActiveTools: () => undefined, getActiveTools: () => [] } as any,
123
+ });
124
+
125
+ const started = checkAutoStartAfterDiscuss();
126
+ assert.equal(started, false, "auto-start should fail closed without the manifest");
127
+ } finally {
128
+ clearPendingAutoStart();
129
+ rmSync(base, { recursive: true, force: true });
130
+ }
131
+ });
@@ -9,6 +9,7 @@ import {
9
9
  formatRelativeTime,
10
10
  type HealthWidgetData,
11
11
  } from "../health-widget-core.ts";
12
+ import { registerHooks } from "../bootstrap/register-hooks.ts";
12
13
 
13
14
  function makeTempDir(prefix: string): string {
14
15
  const dir = join(
@@ -177,3 +178,47 @@ test("detectHealthWidgetProjectState: metrics file alone does not imply project"
177
178
  );
178
179
  assert.equal(detectHealthWidgetProjectState(dir), "initialized");
179
180
  });
181
+
182
+ test("session_start bootstraps the health widget alongside notifications", async (t) => {
183
+ const dir = makeTempDir("bootstrap");
184
+ mkdirSync(join(dir, ".gsd"), { recursive: true });
185
+
186
+ const originalCwd = process.cwd();
187
+ process.chdir(dir);
188
+ t.after(() => {
189
+ process.chdir(originalCwd);
190
+ cleanup(dir);
191
+ });
192
+
193
+ const widgets: string[] = [];
194
+ const handlers = new Map<string, (event: unknown, ctx: any) => Promise<void> | void>();
195
+ const pi = {
196
+ on(event: string, handler: (event: unknown, ctx: any) => Promise<void> | void) {
197
+ handlers.set(event, handler);
198
+ },
199
+ } as any;
200
+
201
+ registerHooks(pi);
202
+ const sessionStart = handlers.get("session_start");
203
+ assert.ok(sessionStart, "session_start handler is registered");
204
+
205
+ await sessionStart!({}, {
206
+ hasUI: true,
207
+ ui: {
208
+ notify: () => {},
209
+ setStatus: () => {},
210
+ setWorkingMessage: () => {},
211
+ onTerminalInput: () => () => {},
212
+ setWidget: (key: string) => {
213
+ widgets.push(key);
214
+ },
215
+ },
216
+ sessionManager: {
217
+ getSessionId: () => null,
218
+ },
219
+ model: null,
220
+ } as any);
221
+
222
+ assert.ok(widgets.includes("gsd-health"), "health widget is bootstrapped");
223
+ assert.ok(widgets.includes("gsd-notifications"), "notification widget still boots");
224
+ });
@@ -1,9 +1,10 @@
1
1
  import test from "node:test";
2
2
  import assert from "node:assert/strict";
3
- import { mkdirSync, writeFileSync, existsSync, readFileSync, rmSync } from "node:fs";
3
+ import { mkdirSync, writeFileSync, existsSync, readFileSync, rmSync, chmodSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  import { tmpdir } from "node:os";
6
6
  import { randomUUID } from "node:crypto";
7
+ import { execFileSync } from "node:child_process";
7
8
 
8
9
  import {
9
10
  resolveExpectedArtifactPath,
@@ -11,6 +12,7 @@ import {
11
12
  diagnoseExpectedArtifact,
12
13
  buildLoopRemediationSteps,
13
14
  hasImplementationArtifacts,
15
+ reconcileMergeState,
14
16
  } from "../../auto-recovery.ts";
15
17
  import { parseRoadmap, parsePlan } from "../../parsers-legacy.ts";
16
18
  import { parseTaskPlanFile, clearParseCache } from "../../files.ts";
@@ -669,8 +671,6 @@ test("#793: invalidateAllCaches clears all caches so deriveState sees fresh disk
669
671
 
670
672
  // ─── hasImplementationArtifacts (#1703) ───────────────────────────────────
671
673
 
672
- import { execFileSync } from "node:child_process";
673
-
674
674
  function makeGitBase(): string {
675
675
  const base = join(tmpdir(), `gsd-test-git-${randomUUID()}`);
676
676
  mkdirSync(base, { recursive: true });
@@ -745,9 +745,6 @@ test("verifyExpectedArtifact complete-milestone fails with only .gsd/ files (#17
745
745
 
746
746
  // ─── reconcileMergeState: silent nativeCommit failure (#2542) ─────────────
747
747
 
748
- import { reconcileMergeState } from "../../auto-recovery.ts";
749
- import { chmodSync } from "node:fs";
750
-
751
748
  function makeMockCtx(): { ctx: any; notifications: Array<{ msg: string; level: string }> } {
752
749
  const notifications: Array<{ msg: string; level: string }> = [];
753
750
  const ctx = {
@@ -760,7 +757,7 @@ function makeMockCtx(): { ctx: any; notifications: Array<{ msg: string; level: s
760
757
  return { ctx, notifications };
761
758
  }
762
759
 
763
- test("reconcileMergeState returns false and notifies error when nativeCommit fails (#2542)", (t) => {
760
+ test("reconcileMergeState returns blocked and notifies error when nativeCommit fails (#2542)", (t) => {
764
761
  const base = makeGitBase();
765
762
  t.after(() => cleanup(base));
766
763
 
@@ -786,9 +783,7 @@ test("reconcileMergeState returns false and notifies error when nativeCommit fai
786
783
  const { ctx, notifications } = makeMockCtx();
787
784
  const result = reconcileMergeState(base, ctx);
788
785
 
789
- // The function should return false to signal reconciliation failure
790
- // (Currently it silently swallows the error and returns true — this test should FAIL before the fix)
791
- assert.equal(result, false, "reconcileMergeState should return false when nativeCommit fails");
786
+ assert.equal(result, "blocked", "reconcileMergeState should return blocked when nativeCommit fails");
792
787
  const errorNotifications = notifications.filter(n => n.level === "error");
793
788
  assert.ok(errorNotifications.length > 0, "should notify an error when nativeCommit fails");
794
789
  assert.ok(
@@ -797,18 +792,63 @@ test("reconcileMergeState returns false and notifies error when nativeCommit fai
797
792
  );
798
793
  });
799
794
 
800
- test("reconcileMergeState returns true when no merge state present", (t) => {
801
- // When there's no MERGE_HEAD or SQUASH_MSG, reconcileMergeState returns false (no dirty state)
795
+ test("reconcileMergeState returns clean when no merge state present", (t) => {
802
796
  const base = makeGitBase();
803
797
  t.after(() => cleanup(base));
804
798
 
805
799
  const { ctx, notifications } = makeMockCtx();
806
800
  const result = reconcileMergeState(base, ctx);
807
801
 
808
- assert.equal(result, false, "should return false when no merge state exists");
802
+ assert.equal(result, "clean", "should return clean when no merge state exists");
809
803
  assert.equal(notifications.length, 0, "should not notify when no merge state present");
810
804
  });
811
805
 
806
+ test("reconcileMergeState blocks and preserves unresolved code conflicts", (t) => {
807
+ const base = makeGitBase();
808
+ t.after(() => cleanup(base));
809
+
810
+ writeFileSync(join(base, "conflict.txt"), "base\n");
811
+ execFileSync("git", ["add", "conflict.txt"], { cwd: base, stdio: "ignore" });
812
+ execFileSync("git", ["commit", "-m", "add conflict base"], { cwd: base, stdio: "ignore" });
813
+
814
+ execFileSync("git", ["checkout", "-b", "feature"], { cwd: base, stdio: "ignore" });
815
+ writeFileSync(join(base, "conflict.txt"), "feature\n");
816
+ execFileSync("git", ["add", "conflict.txt"], { cwd: base, stdio: "ignore" });
817
+ execFileSync("git", ["commit", "-m", "feature change"], { cwd: base, stdio: "ignore" });
818
+
819
+ execFileSync("git", ["checkout", "main"], { cwd: base, stdio: "ignore" });
820
+ writeFileSync(join(base, "conflict.txt"), "main\n");
821
+ execFileSync("git", ["add", "conflict.txt"], { cwd: base, stdio: "ignore" });
822
+ execFileSync("git", ["commit", "-m", "main change"], { cwd: base, stdio: "ignore" });
823
+
824
+ let mergeFailed = false;
825
+ try {
826
+ execFileSync("git", ["merge", "--no-ff", "feature"], { cwd: base, stdio: "ignore" });
827
+ } catch {
828
+ mergeFailed = true;
829
+ }
830
+ assert.equal(mergeFailed, true, "merge should produce a conflict");
831
+ assert.ok(existsSync(join(base, ".git", "MERGE_HEAD")), "MERGE_HEAD should remain present before reconcile");
832
+
833
+ const beforeContents = readFileSync(join(base, "conflict.txt"), "utf8");
834
+ assert.match(beforeContents, /<<<<<<<|=======|>>>>>>>/, "fixture should contain conflict markers");
835
+
836
+ const { ctx, notifications } = makeMockCtx();
837
+ const result = reconcileMergeState(base, ctx);
838
+
839
+ assert.equal(result, "blocked", "code conflicts should block reconciliation");
840
+ assert.ok(existsSync(join(base, ".git", "MERGE_HEAD")), "MERGE_HEAD should be preserved for manual resolution");
841
+ assert.equal(
842
+ readFileSync(join(base, "conflict.txt"), "utf8"),
843
+ beforeContents,
844
+ "reconcile should preserve the conflicted file contents",
845
+ );
846
+ assert.ok(
847
+ notifications.some((n) => n.level === "error" && n.msg.includes("manual conflict resolution is preserved")),
848
+ "should notify that auto-mode paused and preserved manual work",
849
+ );
850
+ });
851
+
812
852
  test("verifyExpectedArtifact complete-milestone passes with impl files (#1703)", (t) => {
813
853
  const base = makeGitBase();
814
854
  t.after(() => cleanup(base));
@@ -360,8 +360,8 @@ describe("session management", () => {
360
360
  assert.equal(s.unitRecoveryCount.size, 0, "recovery counts cleared");
361
361
  });
362
362
 
363
- test("NEW_SESSION_TIMEOUT_MS is 30 seconds", () => {
364
- assert.equal(NEW_SESSION_TIMEOUT_MS, 30_000, "session timeout should be 30s");
363
+ test("NEW_SESSION_TIMEOUT_MS is 120 seconds", () => {
364
+ assert.equal(NEW_SESSION_TIMEOUT_MS, 120_000, "session timeout should be 120s");
365
365
  });
366
366
 
367
367
  test("MAX_UNIT_DISPATCHES limits retries for a single unit", () => {
@@ -72,7 +72,7 @@ function makeMockDeps(
72
72
  getCurrentBranch: () => "main",
73
73
  autoWorktreeBranch: () => "auto/M001",
74
74
  resolveMilestoneFile: () => null,
75
- reconcileMergeState: () => false,
75
+ reconcileMergeState: () => "clean",
76
76
  getLedger: () => ({ units: [] }),
77
77
  getProjectTotals: () => ({ cost: 0 }),
78
78
  formatCost: (c: number) => `$${c.toFixed(2)}`,
@@ -590,9 +590,9 @@ test("unit-end event contains errorContext when unit is cancelled with structure
590
590
  resolveAgentEndCancelled({ message: "Hard timeout error: exceeded limit", category: "timeout", isTransient: true });
591
591
 
592
592
  const result = await unitPromise;
593
- // Cancelled units break the loop before emitting unit-end
593
+ // Transient timeout cancellations pause (recoverable) instead of hard-stopping
594
594
  assert.equal(result.action, "break");
595
- assert.equal((result as any).reason, "session-failed");
595
+ assert.equal((result as any).reason, "session-timeout");
596
596
 
597
597
  // Verify error classification used structured errorContext on the window entry
598
598
  const entry = loopState.recentUnits[loopState.recentUnits.length - 1];