gsd-pi 2.73.0 → 2.73.1-dev.06e4302

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 (300) hide show
  1. package/dist/cli-web-branch.d.ts +4 -3
  2. package/dist/cli-web-branch.js +10 -7
  3. package/dist/cli.js +99 -253
  4. package/dist/help-text.js +1 -1
  5. package/dist/logo.d.ts +1 -1
  6. package/dist/logo.js +1 -1
  7. package/dist/onboarding.js +59 -53
  8. package/dist/resource-loader.js +2 -2
  9. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +68 -4
  10. package/dist/resources/extensions/gsd/auto/phases.js +15 -9
  11. package/dist/resources/extensions/gsd/auto-dispatch.js +16 -6
  12. package/dist/resources/extensions/gsd/auto-model-selection.js +54 -11
  13. package/dist/resources/extensions/gsd/auto-post-unit.js +41 -1
  14. package/dist/resources/extensions/gsd/auto-prompts.js +9 -6
  15. package/dist/resources/extensions/gsd/auto-start.js +23 -6
  16. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +13 -0
  17. package/dist/resources/extensions/gsd/auto-verification.js +88 -3
  18. package/dist/resources/extensions/gsd/auto.js +34 -9
  19. package/dist/resources/extensions/gsd/bootstrap/crash-log.js +31 -0
  20. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +18 -7
  21. package/dist/resources/extensions/gsd/bootstrap/system-context.js +6 -1
  22. package/dist/resources/extensions/gsd/commands-handlers.js +8 -2
  23. package/dist/resources/extensions/gsd/crash-recovery.js +51 -0
  24. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  25. package/dist/resources/extensions/gsd/gsd-db.js +36 -2
  26. package/dist/resources/extensions/gsd/milestone-actions.js +19 -1
  27. package/dist/resources/extensions/gsd/notification-widget.js +2 -2
  28. package/dist/resources/extensions/gsd/preferences-models.js +43 -0
  29. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  30. package/dist/resources/extensions/gsd/preferences-validation.js +22 -0
  31. package/dist/resources/extensions/gsd/state.js +61 -14
  32. package/dist/startup-model-validation.js +8 -5
  33. package/dist/update-check.d.ts +1 -0
  34. package/dist/update-check.js +13 -5
  35. package/dist/update-cmd.js +4 -3
  36. package/dist/web/standalone/.next/BUILD_ID +1 -1
  37. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  38. package/dist/web/standalone/.next/build-manifest.json +3 -3
  39. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  40. package/dist/web/standalone/.next/required-server-files.json +3 -3
  41. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  42. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  43. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  44. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  45. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  46. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  47. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  48. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  49. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  50. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  51. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  52. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  53. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  54. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  55. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  56. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  57. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  58. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  59. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  60. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  61. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  62. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  63. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  64. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  65. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  66. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  67. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  68. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  69. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  72. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  74. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  80. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  100. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  110. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  116. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  130. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  132. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  134. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  136. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/index.html +1 -1
  146. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  147. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  148. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  149. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  151. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/page.js +2 -2
  153. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  155. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  156. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  157. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  159. package/dist/web/standalone/.next/server/middleware.js +2 -2
  160. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  162. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  163. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  164. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  165. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  166. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  167. package/dist/web/standalone/.next/static/chunks/app/page-f1e30ab6bb269149.js +1 -0
  168. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  169. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  170. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  171. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  172. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  173. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  174. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  175. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  176. package/dist/web/standalone/server.js +1 -1
  177. package/package.json +1 -2
  178. package/packages/pi-ai/dist/index.d.ts +1 -0
  179. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  180. package/packages/pi-ai/dist/index.js +1 -0
  181. package/packages/pi-ai/dist/index.js.map +1 -1
  182. package/packages/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  183. package/packages/pi-ai/dist/utils/overflow.js +12 -0
  184. package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
  185. package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts +2 -0
  186. package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts.map +1 -0
  187. package/packages/pi-ai/dist/utils/tests/overflow.test.js +50 -0
  188. package/packages/pi-ai/dist/utils/tests/overflow.test.js.map +1 -0
  189. package/packages/pi-ai/src/index.ts +4 -0
  190. package/packages/pi-ai/src/utils/overflow.ts +14 -1
  191. package/packages/pi-ai/src/utils/tests/overflow.test.ts +58 -0
  192. package/packages/pi-coding-agent/dist/core/auth-storage.js +1 -1
  193. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  194. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +27 -0
  195. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  196. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +313 -8
  197. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  198. package/packages/pi-coding-agent/dist/core/compaction/utils.js +5 -5
  199. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  200. package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts +2 -0
  201. package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts.map +1 -0
  202. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +45 -0
  203. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -0
  204. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  205. package/packages/pi-coding-agent/dist/core/model-resolver.js +25 -68
  206. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  207. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +12 -2
  208. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  209. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +61 -28
  210. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  211. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts +2 -1
  212. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  213. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +9 -3
  214. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts +2 -0
  216. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts.map +1 -0
  217. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +52 -0
  218. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -0
  219. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +1 -0
  220. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  221. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +116 -25
  222. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  223. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.d.ts +2 -0
  224. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.d.ts.map +1 -0
  225. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +63 -0
  226. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -0
  227. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  228. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +11 -3
  229. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  230. package/packages/pi-coding-agent/package.json +1 -1
  231. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +38 -0
  232. package/packages/pi-coding-agent/src/core/auth-storage.ts +1 -1
  233. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +355 -8
  234. package/packages/pi-coding-agent/src/core/compaction/utils.ts +5 -5
  235. package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +50 -0
  236. package/packages/pi-coding-agent/src/core/model-resolver.ts +26 -70
  237. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +74 -32
  238. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +73 -0
  239. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +9 -3
  240. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +71 -0
  241. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +136 -30
  242. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +11 -3
  243. package/packages/pi-tui/dist/__tests__/tui.test.js +60 -1
  244. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  245. package/packages/pi-tui/dist/tui.d.ts +8 -0
  246. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  247. package/packages/pi-tui/dist/tui.js +32 -3
  248. package/packages/pi-tui/dist/tui.js.map +1 -1
  249. package/packages/pi-tui/src/__tests__/tui.test.ts +76 -1
  250. package/packages/pi-tui/src/tui.ts +31 -3
  251. package/pkg/package.json +1 -1
  252. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +107 -5
  253. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +111 -2
  254. package/src/resources/extensions/gsd/auto/phases.ts +22 -9
  255. package/src/resources/extensions/gsd/auto-dispatch.ts +15 -4
  256. package/src/resources/extensions/gsd/auto-model-selection.ts +85 -11
  257. package/src/resources/extensions/gsd/auto-post-unit.ts +47 -1
  258. package/src/resources/extensions/gsd/auto-prompts.ts +9 -3
  259. package/src/resources/extensions/gsd/auto-start.ts +30 -6
  260. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +17 -0
  261. package/src/resources/extensions/gsd/auto-verification.ts +98 -3
  262. package/src/resources/extensions/gsd/auto.ts +36 -14
  263. package/src/resources/extensions/gsd/bootstrap/crash-log.ts +32 -0
  264. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +19 -7
  265. package/src/resources/extensions/gsd/bootstrap/system-context.ts +8 -1
  266. package/src/resources/extensions/gsd/commands-handlers.ts +8 -2
  267. package/src/resources/extensions/gsd/crash-recovery.ts +59 -0
  268. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  269. package/src/resources/extensions/gsd/gsd-db.ts +52 -2
  270. package/src/resources/extensions/gsd/milestone-actions.ts +19 -1
  271. package/src/resources/extensions/gsd/notification-widget.ts +2 -2
  272. package/src/resources/extensions/gsd/preferences-models.ts +41 -0
  273. package/src/resources/extensions/gsd/preferences-types.ts +12 -0
  274. package/src/resources/extensions/gsd/preferences-validation.ts +23 -0
  275. package/src/resources/extensions/gsd/state.ts +71 -15
  276. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +2 -2
  277. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +53 -0
  278. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +51 -2
  279. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +142 -0
  280. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +42 -0
  281. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +235 -0
  282. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -2
  283. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +3 -2
  284. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +68 -8
  285. package/src/resources/extensions/gsd/tests/derive-state.test.ts +3 -3
  286. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +137 -1
  287. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +59 -1
  288. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
  289. package/src/resources/extensions/gsd/tests/model-isolation.test.ts +91 -2
  290. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +64 -0
  291. package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -0
  292. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +5 -7
  293. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +267 -0
  294. package/src/resources/extensions/gsd/tests/token-profile.test.ts +1 -1
  295. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +179 -0
  296. package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
  297. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  298. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  299. /package/dist/web/standalone/.next/static/{KSZ2dcC3p4z6lOmUpPpzr → RXD20AQgB9BHSQJ07MDdd}/_buildManifest.js +0 -0
  300. /package/dist/web/standalone/.next/static/{KSZ2dcC3p4z6lOmUpPpzr → RXD20AQgB9BHSQJ07MDdd}/_ssgManifest.js +0 -0
@@ -0,0 +1,179 @@
1
+ // gsd-pi — Regression tests for the validate-milestone stuck-loop guard (#4094)
2
+
3
+ import { describe, test, mock, beforeEach, afterEach } from "node:test";
4
+ import assert from "node:assert/strict";
5
+ import { tmpdir } from "node:os";
6
+ import { mkdirSync, writeFileSync, rmSync } from "node:fs";
7
+ import { join } from "node:path";
8
+
9
+ import { runPostUnitVerification, type VerificationContext } from "../auto-verification.ts";
10
+ import { AutoSession } from "../auto/session.ts";
11
+ import {
12
+ openDatabase,
13
+ closeDatabase,
14
+ insertMilestone,
15
+ insertSlice,
16
+ } from "../gsd-db.ts";
17
+ import { invalidateAllCaches } from "../cache.ts";
18
+ import { _clearGsdRootCache } from "../paths.ts";
19
+
20
+ let tempDir: string;
21
+ let dbPath: string;
22
+ let originalCwd: string;
23
+
24
+ function makeMockCtx() {
25
+ return {
26
+ ui: {
27
+ notify: mock.fn(),
28
+ setStatus: () => {},
29
+ setWidget: () => {},
30
+ setFooter: () => {},
31
+ },
32
+ model: { id: "test-model" },
33
+ } as any;
34
+ }
35
+
36
+ function makeMockPi() {
37
+ return {
38
+ sendMessage: mock.fn(),
39
+ setModel: mock.fn(async () => true),
40
+ } as any;
41
+ }
42
+
43
+ function makeMockSession(basePath: string, unitType: string, unitId: string): AutoSession {
44
+ const s = new AutoSession();
45
+ s.basePath = basePath;
46
+ s.active = true;
47
+ s.pendingVerificationRetry = null;
48
+ s.currentUnit = { type: unitType, id: unitId, startedAt: Date.now() };
49
+ return s;
50
+ }
51
+
52
+ function setupTestEnvironment(): void {
53
+ originalCwd = process.cwd();
54
+ tempDir = join(tmpdir(), `validate-milestone-guard-${Date.now()}-${Math.random().toString(36).slice(2)}`);
55
+ mkdirSync(tempDir, { recursive: true });
56
+
57
+ const milestoneDir = join(tempDir, ".gsd", "milestones", "M001");
58
+ mkdirSync(milestoneDir, { recursive: true });
59
+
60
+ process.chdir(tempDir);
61
+ _clearGsdRootCache();
62
+
63
+ dbPath = join(tempDir, ".gsd", "gsd.db");
64
+ openDatabase(dbPath);
65
+ invalidateAllCaches();
66
+ }
67
+
68
+ function cleanupTestEnvironment(): void {
69
+ try { process.chdir(originalCwd); } catch { /* ignore */ }
70
+ try { closeDatabase(); } catch { /* ignore */ }
71
+ try { rmSync(tempDir, { recursive: true, force: true }); } catch { /* ignore */ }
72
+ }
73
+
74
+ function writeValidationFile(verdict: string): void {
75
+ const path = join(tempDir, ".gsd", "milestones", "M001", "M001-VALIDATION.md");
76
+ const content = `---
77
+ verdict: ${verdict}
78
+ remediation_round: 1
79
+ ---
80
+
81
+ # Milestone Validation: M001
82
+
83
+ ## Verdict Rationale
84
+ Test fixture
85
+ `;
86
+ writeFileSync(path, content, "utf-8");
87
+ invalidateAllCaches();
88
+ }
89
+
90
+ describe("validate-milestone stuck-loop guard (#4094)", () => {
91
+ beforeEach(() => setupTestEnvironment());
92
+ afterEach(() => cleanupTestEnvironment());
93
+
94
+ test("pauses when verdict=needs-remediation and all slices are closed", async () => {
95
+ insertMilestone({ id: "M001" });
96
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Slice 1", status: "complete" });
97
+ insertSlice({ id: "S02", milestoneId: "M001", title: "Slice 2", status: "done" });
98
+ writeValidationFile("needs-remediation");
99
+
100
+ const ctx = makeMockCtx();
101
+ const pi = makeMockPi();
102
+ const pauseAutoMock = mock.fn(async () => {});
103
+ const s = makeMockSession(tempDir, "validate-milestone", "M001");
104
+
105
+ const result = await runPostUnitVerification({ s, ctx, pi } as VerificationContext, pauseAutoMock);
106
+
107
+ assert.equal(result, "pause");
108
+ assert.equal(pauseAutoMock.mock.callCount(), 1);
109
+ assert.equal(ctx.ui.notify.mock.callCount(), 1);
110
+ const notifyArgs = ctx.ui.notify.mock.calls[0].arguments;
111
+ assert.match(notifyArgs[0], /needs-remediation/);
112
+ assert.equal(notifyArgs[1], "error");
113
+ });
114
+
115
+ test("treats skipped slices as closed", async () => {
116
+ insertMilestone({ id: "M001" });
117
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Slice 1", status: "complete" });
118
+ insertSlice({ id: "S02", milestoneId: "M001", title: "Slice 2", status: "skipped" });
119
+ writeValidationFile("needs-remediation");
120
+
121
+ const ctx = makeMockCtx();
122
+ const pi = makeMockPi();
123
+ const pauseAutoMock = mock.fn(async () => {});
124
+ const s = makeMockSession(tempDir, "validate-milestone", "M001");
125
+
126
+ const result = await runPostUnitVerification({ s, ctx, pi } as VerificationContext, pauseAutoMock);
127
+
128
+ assert.equal(result, "pause");
129
+ assert.equal(pauseAutoMock.mock.callCount(), 1);
130
+ });
131
+
132
+ test("continues when verdict=needs-remediation but a queued remediation slice exists", async () => {
133
+ insertMilestone({ id: "M001" });
134
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Slice 1", status: "complete" });
135
+ insertSlice({ id: "S02", milestoneId: "M001", title: "Remediation", status: "queued" });
136
+ writeValidationFile("needs-remediation");
137
+
138
+ const ctx = makeMockCtx();
139
+ const pi = makeMockPi();
140
+ const pauseAutoMock = mock.fn(async () => {});
141
+ const s = makeMockSession(tempDir, "validate-milestone", "M001");
142
+
143
+ const result = await runPostUnitVerification({ s, ctx, pi } as VerificationContext, pauseAutoMock);
144
+
145
+ assert.equal(result, "continue");
146
+ assert.equal(pauseAutoMock.mock.callCount(), 0);
147
+ });
148
+
149
+ test("continues when verdict is pass", async () => {
150
+ insertMilestone({ id: "M001" });
151
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Slice 1", status: "complete" });
152
+ writeValidationFile("pass");
153
+
154
+ const ctx = makeMockCtx();
155
+ const pi = makeMockPi();
156
+ const pauseAutoMock = mock.fn(async () => {});
157
+ const s = makeMockSession(tempDir, "validate-milestone", "M001");
158
+
159
+ const result = await runPostUnitVerification({ s, ctx, pi } as VerificationContext, pauseAutoMock);
160
+
161
+ assert.equal(result, "continue");
162
+ assert.equal(pauseAutoMock.mock.callCount(), 0);
163
+ });
164
+
165
+ test("continues when no VALIDATION file exists yet", async () => {
166
+ insertMilestone({ id: "M001" });
167
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Slice 1", status: "complete" });
168
+
169
+ const ctx = makeMockCtx();
170
+ const pi = makeMockPi();
171
+ const pauseAutoMock = mock.fn(async () => {});
172
+ const s = makeMockSession(tempDir, "validate-milestone", "M001");
173
+
174
+ const result = await runPostUnitVerification({ s, ctx, pi } as VerificationContext, pauseAutoMock);
175
+
176
+ assert.equal(result, "continue");
177
+ assert.equal(pauseAutoMock.mock.callCount(), 0);
178
+ });
179
+ });
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8974],{5214:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"workAsyncStorage",{enumerable:!0,get:function(){return r.workAsyncStorageInstance}});let r=n(17828)},15726:(e,t,n)=>{Promise.resolve().then(n.bind(n,66919))},17828:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"workAsyncStorageInstance",{enumerable:!0,get:function(){return r}});let r=(0,n(64054).createAsyncLocalStorage)()},21957:(e,t,n)=>{"use strict";function r({moduleIds:e}){return null}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"PreloadChunks",{enumerable:!0,get:function(){return r}}),n(95155),n(47650),n(5214),n(2451),n(53887)},37206:(e,t,n)=>{"use strict";n.d(t,{default:()=>u.a});var r=n(75707),u=n.n(r)},41112:(e,t,n)=>{"use strict";function r({reason:e,children:t}){return t}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"BailoutToCSR",{enumerable:!0,get:function(){return r}}),n(1980)},64054:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={bindSnapshot:function(){return s},createAsyncLocalStorage:function(){return a},createSnapshot:function(){return i}};for(var r in n)Object.defineProperty(t,r,{enumerable:!0,get:n[r]});let u=Object.defineProperty(Error("Invariant: AsyncLocalStorage accessed in runtime where it is not available"),"__NEXT_ERROR_CODE",{value:"E504",enumerable:!1,configurable:!0});class l{disable(){throw u}getStore(){}run(){throw u}exit(){throw u}enterWith(){throw u}static bind(e){return e}}let o="u">typeof globalThis&&globalThis.AsyncLocalStorage;function a(){return o?new o:new l}function s(e){return o?o.bind(e):l.bind(e)}function i(){return o?o.snapshot():function(e,...t){return e(...t)}}},66919:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>l});var r=n(95155);let u=(0,n(37206).default)(()=>Promise.all([n.e(1838),n.e(6079),n.e(4986),n.e(2008),n.e(2826)]).then(n.bind(n,62826)).then(e=>e.GSDAppShell),{loadableGenerated:{webpack:()=>[62826]},ssr:!1,loading:()=>(0,r.jsx)("div",{className:"flex h-screen items-center justify-center bg-background text-sm text-muted-foreground",children:"Loading workspace…"})});function l(){return(0,r.jsx)(u,{})}},68635:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return s}});let r=n(95155),u=n(12115),l=n(41112);function o(e){return{default:e&&"default"in e?e.default:e}}n(21957);let a={loader:()=>Promise.resolve(o(()=>null)),loading:null,ssr:!0},s=function(e){let t={...a,...e},n=(0,u.lazy)(()=>t.loader().then(o)),s=t.loading;function i(e){let o=s?(0,r.jsx)(s,{isLoading:!0,pastDelay:!0,error:null}):null,a=!t.ssr||!!t.loading,i=a?u.Suspense:u.Fragment,c=t.ssr?(0,r.jsxs)(r.Fragment,{children:[null,(0,r.jsx)(n,{...e})]}):(0,r.jsx)(l.BailoutToCSR,{reason:"next/dynamic",children:(0,r.jsx)(n,{...e})});return(0,r.jsx)(i,{...a?{fallback:o}:{},children:c})}return i.displayName="LoadableComponent",i}},75707:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return u}});let r=n(73623)._(n(68635));function u(e,t){let n={};"function"==typeof e&&(n.loader=e);let u={...n,...t};return(0,r.default)({...u,modules:u.loadableGenerated?.modules})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)}},e=>{e.O(0,[8441,3794,7358],()=>e(e.s=15726)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7358],{2852:(e,s,n)=>{Promise.resolve().then(n.t.bind(n,27123,23)),Promise.resolve().then(n.t.bind(n,61304,23)),Promise.resolve().then(n.t.bind(n,78616,23)),Promise.resolve().then(n.t.bind(n,64777,23)),Promise.resolve().then(n.t.bind(n,57121,23)),Promise.resolve().then(n.t.bind(n,74581,23)),Promise.resolve().then(n.t.bind(n,90484,23)),Promise.resolve().then(n.bind(n,86869))},19393:()=>{}},e=>{var s=s=>e(e.s=s);e.O(0,[8441,3794],()=>(s(83861),s(2852))),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9337],{52560:(e,s,_)=>{Promise.resolve().then(_.t.bind(_,27123,23))}},e=>{e.O(0,[8441,3794,7358],()=>e(e.s=52560)),_N_E=e.O()}]);