gsd-pi 2.33.1-dev.ee47f1b → 2.34.0-dev.0150ae9

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 (356) hide show
  1. package/dist/bundled-resource-path.d.ts +8 -0
  2. package/dist/bundled-resource-path.js +14 -0
  3. package/dist/headless-query.js +6 -6
  4. package/dist/resources/extensions/gsd/auto/session.js +27 -32
  5. package/dist/resources/extensions/gsd/auto-dashboard.js +29 -109
  6. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +6 -1
  7. package/dist/resources/extensions/gsd/auto-dispatch.js +52 -81
  8. package/dist/resources/extensions/gsd/auto-loop.js +956 -0
  9. package/dist/resources/extensions/gsd/auto-observability.js +4 -2
  10. package/dist/resources/extensions/gsd/auto-post-unit.js +75 -185
  11. package/dist/resources/extensions/gsd/auto-prompts.js +133 -101
  12. package/dist/resources/extensions/gsd/auto-recovery.js +59 -97
  13. package/dist/resources/extensions/gsd/auto-start.js +330 -309
  14. package/dist/resources/extensions/gsd/auto-supervisor.js +5 -11
  15. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +7 -7
  16. package/dist/resources/extensions/gsd/auto-timers.js +3 -4
  17. package/dist/resources/extensions/gsd/auto-verification.js +35 -73
  18. package/dist/resources/extensions/gsd/auto-worktree-sync.js +167 -0
  19. package/dist/resources/extensions/gsd/auto-worktree.js +291 -126
  20. package/dist/resources/extensions/gsd/auto.js +283 -1013
  21. package/dist/resources/extensions/gsd/captures.js +10 -4
  22. package/dist/resources/extensions/gsd/dispatch-guard.js +7 -8
  23. package/dist/resources/extensions/gsd/docs/preferences-reference.md +25 -18
  24. package/dist/resources/extensions/gsd/doctor-checks.js +3 -4
  25. package/dist/resources/extensions/gsd/git-service.js +1 -1
  26. package/dist/resources/extensions/gsd/gsd-db.js +296 -151
  27. package/dist/resources/extensions/gsd/index.js +92 -228
  28. package/dist/resources/extensions/gsd/post-unit-hooks.js +13 -13
  29. package/dist/resources/extensions/gsd/progress-score.js +61 -156
  30. package/dist/resources/extensions/gsd/quick.js +98 -122
  31. package/dist/resources/extensions/gsd/session-lock.js +13 -0
  32. package/dist/resources/extensions/gsd/templates/preferences.md +1 -0
  33. package/dist/resources/extensions/gsd/undo.js +43 -48
  34. package/dist/resources/extensions/gsd/unit-runtime.js +16 -15
  35. package/dist/resources/extensions/gsd/verification-evidence.js +0 -1
  36. package/dist/resources/extensions/gsd/verification-gate.js +6 -35
  37. package/dist/resources/extensions/gsd/worktree-command.js +30 -24
  38. package/dist/resources/extensions/gsd/worktree-manager.js +2 -3
  39. package/dist/resources/extensions/gsd/worktree-resolver.js +344 -0
  40. package/dist/resources/extensions/gsd/worktree.js +7 -44
  41. package/dist/resources/extensions/mcp-client/index.js +2 -1
  42. package/dist/tool-bootstrap.js +59 -11
  43. package/dist/worktree-cli.js +7 -7
  44. package/package.json +1 -1
  45. package/packages/native/dist/native.d.ts +0 -2
  46. package/packages/native/dist/native.js +0 -2
  47. package/packages/native/src/native.ts +0 -3
  48. package/packages/pi-agent-core/dist/proxy.d.ts +1 -25
  49. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  50. package/packages/pi-agent-core/dist/proxy.js +1 -1
  51. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  52. package/packages/pi-agent-core/src/proxy.ts +1 -1
  53. package/packages/pi-ai/dist/api-registry.d.ts +0 -2
  54. package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
  55. package/packages/pi-ai/dist/api-registry.js +0 -10
  56. package/packages/pi-ai/dist/api-registry.js.map +1 -1
  57. package/packages/pi-ai/dist/models.generated.d.ts +3630 -5483
  58. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  59. package/packages/pi-ai/dist/models.generated.js +735 -2588
  60. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  61. package/packages/pi-ai/dist/providers/anthropic.d.ts +0 -8
  62. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  63. package/packages/pi-ai/dist/providers/anthropic.js +1 -1
  64. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  65. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts +0 -1
  66. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts.map +1 -1
  67. package/packages/pi-ai/dist/providers/github-copilot-headers.js +1 -1
  68. package/packages/pi-ai/dist/providers/github-copilot-headers.js.map +1 -1
  69. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts +1 -43
  70. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  71. package/packages/pi-ai/dist/providers/google-gemini-cli.js +2 -2
  72. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  73. package/packages/pi-ai/dist/providers/google-shared.d.ts +0 -4
  74. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  75. package/packages/pi-ai/dist/providers/google-shared.js +1 -1
  76. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  77. package/packages/pi-ai/dist/providers/register-builtins.d.ts +0 -1
  78. package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  79. package/packages/pi-ai/dist/providers/register-builtins.js +1 -1
  80. package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
  81. package/packages/pi-ai/dist/utils/event-stream.d.ts +0 -2
  82. package/packages/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
  83. package/packages/pi-ai/dist/utils/event-stream.js +0 -4
  84. package/packages/pi-ai/dist/utils/event-stream.js.map +1 -1
  85. package/packages/pi-ai/dist/utils/overflow.d.ts +0 -4
  86. package/packages/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  87. package/packages/pi-ai/dist/utils/overflow.js +0 -6
  88. package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
  89. package/packages/pi-ai/dist/utils/validation.d.ts +0 -8
  90. package/packages/pi-ai/dist/utils/validation.d.ts.map +1 -1
  91. package/packages/pi-ai/dist/utils/validation.js +0 -14
  92. package/packages/pi-ai/dist/utils/validation.js.map +1 -1
  93. package/packages/pi-ai/src/api-registry.ts +0 -12
  94. package/packages/pi-ai/src/models.generated.ts +1039 -2892
  95. package/packages/pi-ai/src/providers/anthropic.ts +1 -1
  96. package/packages/pi-ai/src/providers/github-copilot-headers.ts +1 -1
  97. package/packages/pi-ai/src/providers/google-gemini-cli.ts +2 -2
  98. package/packages/pi-ai/src/providers/google-shared.ts +1 -1
  99. package/packages/pi-ai/src/providers/register-builtins.ts +1 -1
  100. package/packages/pi-ai/src/utils/event-stream.ts +0 -5
  101. package/packages/pi-ai/src/utils/overflow.ts +1 -8
  102. package/packages/pi-ai/src/utils/validation.ts +0 -15
  103. package/packages/pi-coding-agent/dist/config.d.ts +0 -9
  104. package/packages/pi-coding-agent/dist/config.d.ts.map +1 -1
  105. package/packages/pi-coding-agent/dist/config.js +4 -8
  106. package/packages/pi-coding-agent/dist/config.js.map +1 -1
  107. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts +0 -4
  108. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  109. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js +1 -1
  110. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js.map +1 -1
  111. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +0 -5
  112. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  113. package/packages/pi-coding-agent/dist/core/extensions/runner.js +0 -13
  114. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  115. package/packages/pi-coding-agent/dist/core/keybindings.d.ts +0 -8
  116. package/packages/pi-coding-agent/dist/core/keybindings.d.ts.map +1 -1
  117. package/packages/pi-coding-agent/dist/core/keybindings.js +2 -2
  118. package/packages/pi-coding-agent/dist/core/keybindings.js.map +1 -1
  119. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +0 -17
  120. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  121. package/packages/pi-coding-agent/dist/core/lsp/client.js +3 -62
  122. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  123. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts +0 -2
  124. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
  125. package/packages/pi-coding-agent/dist/core/lsp/config.js +0 -7
  126. package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
  127. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts +0 -5
  128. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts.map +1 -1
  129. package/packages/pi-coding-agent/dist/core/lsp/edits.js +1 -1
  130. package/packages/pi-coding-agent/dist/core/lsp/edits.js.map +1 -1
  131. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts +0 -1
  132. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  133. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +1 -1
  134. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  135. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts +1 -6
  136. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts.map +1 -1
  137. package/packages/pi-coding-agent/dist/core/lsp/utils.js +1 -28
  138. package/packages/pi-coding-agent/dist/core/lsp/utils.js.map +1 -1
  139. package/packages/pi-coding-agent/dist/core/messages.d.ts +0 -8
  140. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  141. package/packages/pi-coding-agent/dist/core/messages.js +5 -5
  142. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  143. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +0 -3
  144. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  145. package/packages/pi-coding-agent/dist/core/model-registry.js +1 -3
  146. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  147. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts +1 -26
  148. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  149. package/packages/pi-coding-agent/dist/core/model-resolver.js +3 -59
  150. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  151. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts +0 -17
  152. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts.map +1 -1
  153. package/packages/pi-coding-agent/dist/core/prompt-templates.js +2 -2
  154. package/packages/pi-coding-agent/dist/core/prompt-templates.js.map +1 -1
  155. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +0 -4
  156. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  157. package/packages/pi-coding-agent/dist/core/session-manager.js +2 -4
  158. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  159. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +0 -12
  160. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  161. package/packages/pi-coding-agent/dist/core/settings-manager.js +2 -2
  162. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  163. package/packages/pi-coding-agent/dist/migrations.d.ts +0 -16
  164. package/packages/pi-coding-agent/dist/migrations.d.ts.map +1 -1
  165. package/packages/pi-coding-agent/dist/migrations.js +2 -2
  166. package/packages/pi-coding-agent/dist/migrations.js.map +1 -1
  167. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts +0 -2
  168. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  169. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js +2 -2
  170. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  171. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -24
  172. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  173. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +50 -512
  174. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  175. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +71 -0
  176. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -0
  177. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +514 -0
  178. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -0
  179. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +65 -4
  180. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  181. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +6 -23
  182. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  183. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +12 -0
  184. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  185. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +175 -0
  186. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -0
  187. package/packages/pi-coding-agent/dist/utils/changelog.d.ts +0 -4
  188. package/packages/pi-coding-agent/dist/utils/changelog.d.ts.map +1 -1
  189. package/packages/pi-coding-agent/dist/utils/changelog.js +1 -1
  190. package/packages/pi-coding-agent/dist/utils/changelog.js.map +1 -1
  191. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts +0 -1
  192. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts.map +1 -1
  193. package/packages/pi-coding-agent/dist/utils/clipboard-image.js +1 -1
  194. package/packages/pi-coding-agent/dist/utils/clipboard-image.js.map +1 -1
  195. package/packages/pi-coding-agent/dist/utils/photon.d.ts +0 -19
  196. package/packages/pi-coding-agent/dist/utils/photon.d.ts.map +1 -1
  197. package/packages/pi-coding-agent/dist/utils/photon.js +1 -120
  198. package/packages/pi-coding-agent/dist/utils/photon.js.map +1 -1
  199. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts +0 -1
  200. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts.map +1 -1
  201. package/packages/pi-coding-agent/dist/utils/tools-manager.js +1 -1
  202. package/packages/pi-coding-agent/dist/utils/tools-manager.js.map +1 -1
  203. package/packages/pi-coding-agent/package.json +1 -1
  204. package/packages/pi-coding-agent/src/config.ts +5 -10
  205. package/packages/pi-coding-agent/src/core/export-html/ansi-to-html.ts +1 -1
  206. package/packages/pi-coding-agent/src/core/extensions/runner.ts +0 -13
  207. package/packages/pi-coding-agent/src/core/keybindings.ts +2 -2
  208. package/packages/pi-coding-agent/src/core/lsp/client.ts +3 -73
  209. package/packages/pi-coding-agent/src/core/lsp/config.ts +0 -11
  210. package/packages/pi-coding-agent/src/core/lsp/edits.ts +1 -1
  211. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +1 -1
  212. package/packages/pi-coding-agent/src/core/lsp/utils.ts +1 -33
  213. package/packages/pi-coding-agent/src/core/messages.ts +5 -5
  214. package/packages/pi-coding-agent/src/core/model-registry.ts +0 -2
  215. package/packages/pi-coding-agent/src/core/model-resolver.ts +3 -77
  216. package/packages/pi-coding-agent/src/core/prompt-templates.ts +2 -2
  217. package/packages/pi-coding-agent/src/core/session-manager.ts +2 -4
  218. package/packages/pi-coding-agent/src/core/settings-manager.ts +2 -2
  219. package/packages/pi-coding-agent/src/migrations.ts +2 -2
  220. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector-search.ts +2 -2
  221. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -561
  222. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +653 -0
  223. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +7 -26
  224. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +196 -0
  225. package/packages/pi-coding-agent/src/utils/changelog.ts +1 -1
  226. package/packages/pi-coding-agent/src/utils/clipboard-image.ts +1 -1
  227. package/packages/pi-coding-agent/src/utils/photon.ts +0 -137
  228. package/packages/pi-coding-agent/src/utils/tools-manager.ts +1 -1
  229. package/packages/pi-tui/dist/components/editor.d.ts +0 -10
  230. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  231. package/packages/pi-tui/dist/components/editor.js +1 -1
  232. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  233. package/packages/pi-tui/dist/overlay-layout.d.ts +55 -0
  234. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -0
  235. package/packages/pi-tui/dist/overlay-layout.js +288 -0
  236. package/packages/pi-tui/dist/overlay-layout.js.map +1 -0
  237. package/packages/pi-tui/dist/tui.d.ts +0 -22
  238. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  239. package/packages/pi-tui/dist/tui.js +6 -272
  240. package/packages/pi-tui/dist/tui.js.map +1 -1
  241. package/packages/pi-tui/dist/utils.d.ts +0 -7
  242. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  243. package/packages/pi-tui/dist/utils.js +0 -44
  244. package/packages/pi-tui/dist/utils.js.map +1 -1
  245. package/packages/pi-tui/src/components/editor.ts +1 -1
  246. package/packages/pi-tui/src/overlay-layout.ts +372 -0
  247. package/packages/pi-tui/src/tui.ts +11 -312
  248. package/packages/pi-tui/src/utils.ts +0 -43
  249. package/pkg/dist/core/export-html/ansi-to-html.d.ts +0 -4
  250. package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  251. package/pkg/dist/core/export-html/ansi-to-html.js +1 -1
  252. package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -1
  253. package/pkg/dist/modes/interactive/theme/theme.d.ts +65 -4
  254. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  255. package/pkg/dist/modes/interactive/theme/theme.js +6 -23
  256. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  257. package/pkg/dist/modes/interactive/theme/themes.d.ts +12 -0
  258. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  259. package/pkg/dist/modes/interactive/theme/themes.js +175 -0
  260. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -0
  261. package/pkg/package.json +1 -1
  262. package/src/resources/extensions/gsd/auto/session.ts +47 -30
  263. package/src/resources/extensions/gsd/auto-dashboard.ts +28 -131
  264. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +6 -1
  265. package/src/resources/extensions/gsd/auto-dispatch.ts +135 -91
  266. package/src/resources/extensions/gsd/auto-loop.ts +1665 -0
  267. package/src/resources/extensions/gsd/auto-observability.ts +4 -2
  268. package/src/resources/extensions/gsd/auto-post-unit.ts +85 -228
  269. package/src/resources/extensions/gsd/auto-prompts.ts +138 -109
  270. package/src/resources/extensions/gsd/auto-recovery.ts +124 -118
  271. package/src/resources/extensions/gsd/auto-start.ts +440 -354
  272. package/src/resources/extensions/gsd/auto-supervisor.ts +5 -12
  273. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +8 -8
  274. package/src/resources/extensions/gsd/auto-timers.ts +3 -4
  275. package/src/resources/extensions/gsd/auto-verification.ts +76 -90
  276. package/src/resources/extensions/gsd/auto-worktree-sync.ts +204 -0
  277. package/src/resources/extensions/gsd/auto-worktree.ts +389 -141
  278. package/src/resources/extensions/gsd/auto.ts +515 -1199
  279. package/src/resources/extensions/gsd/captures.ts +10 -4
  280. package/src/resources/extensions/gsd/dispatch-guard.ts +13 -9
  281. package/src/resources/extensions/gsd/docs/preferences-reference.md +25 -18
  282. package/src/resources/extensions/gsd/doctor-checks.ts +3 -4
  283. package/src/resources/extensions/gsd/git-service.ts +8 -1
  284. package/src/resources/extensions/gsd/gitignore.ts +4 -2
  285. package/src/resources/extensions/gsd/gsd-db.ts +375 -180
  286. package/src/resources/extensions/gsd/index.ts +104 -263
  287. package/src/resources/extensions/gsd/post-unit-hooks.ts +13 -13
  288. package/src/resources/extensions/gsd/progress-score.ts +65 -200
  289. package/src/resources/extensions/gsd/quick.ts +121 -125
  290. package/src/resources/extensions/gsd/session-lock.ts +11 -0
  291. package/src/resources/extensions/gsd/templates/preferences.md +1 -0
  292. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +32 -59
  293. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +75 -27
  294. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
  295. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +37 -0
  296. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1458 -0
  297. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +8 -162
  298. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +2 -108
  299. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +1 -3
  300. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -3
  301. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +58 -0
  302. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -55
  303. package/src/resources/extensions/gsd/tests/headless-query.test.ts +22 -0
  304. package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +8 -11
  305. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +4 -6
  306. package/src/resources/extensions/gsd/tests/run-uat.test.ts +3 -3
  307. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +64 -0
  308. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +181 -0
  309. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -3
  310. package/src/resources/extensions/gsd/tests/token-profile.test.ts +6 -6
  311. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +6 -6
  312. package/src/resources/extensions/gsd/tests/undo.test.ts +6 -0
  313. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +24 -26
  314. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +7 -201
  315. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +205 -0
  316. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +442 -0
  317. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -3
  318. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +705 -0
  319. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +57 -106
  320. package/src/resources/extensions/gsd/tests/worktree.test.ts +5 -1
  321. package/src/resources/extensions/gsd/tests/write-gate.test.ts +43 -132
  322. package/src/resources/extensions/gsd/types.ts +90 -81
  323. package/src/resources/extensions/gsd/undo.ts +42 -46
  324. package/src/resources/extensions/gsd/unit-runtime.ts +14 -18
  325. package/src/resources/extensions/gsd/verification-evidence.ts +1 -3
  326. package/src/resources/extensions/gsd/verification-gate.ts +6 -39
  327. package/src/resources/extensions/gsd/worktree-command.ts +36 -24
  328. package/src/resources/extensions/gsd/worktree-manager.ts +2 -3
  329. package/src/resources/extensions/gsd/worktree-resolver.ts +485 -0
  330. package/src/resources/extensions/gsd/worktree.ts +7 -44
  331. package/src/resources/extensions/mcp-client/index.ts +2 -1
  332. package/dist/resources/extensions/gsd/auto-constants.js +0 -5
  333. package/dist/resources/extensions/gsd/auto-idempotency.js +0 -106
  334. package/dist/resources/extensions/gsd/auto-stuck-detection.js +0 -165
  335. package/dist/resources/extensions/gsd/mechanical-completion.js +0 -351
  336. package/packages/pi-coding-agent/dist/modes/interactive/theme/dark.json +0 -85
  337. package/packages/pi-coding-agent/dist/modes/interactive/theme/light.json +0 -84
  338. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.json +0 -335
  339. package/packages/pi-coding-agent/src/modes/interactive/theme/dark.json +0 -85
  340. package/packages/pi-coding-agent/src/modes/interactive/theme/light.json +0 -84
  341. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.json +0 -335
  342. package/pkg/dist/modes/interactive/theme/dark.json +0 -85
  343. package/pkg/dist/modes/interactive/theme/light.json +0 -84
  344. package/pkg/dist/modes/interactive/theme/theme-schema.json +0 -335
  345. package/src/resources/extensions/gsd/auto-constants.ts +0 -6
  346. package/src/resources/extensions/gsd/auto-idempotency.ts +0 -151
  347. package/src/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
  348. package/src/resources/extensions/gsd/mechanical-completion.ts +0 -430
  349. package/src/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
  350. package/src/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
  351. package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
  352. package/src/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
  353. package/src/resources/extensions/gsd/tests/loop-regression.test.ts +0 -874
  354. package/src/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
  355. package/src/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
  356. package/src/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
@@ -4,12 +4,14 @@
4
4
  * for the agent to fix gaps before proceeding with the unit.
5
5
  */
6
6
  import { validatePlanBoundary, validateExecuteBoundary, validateCompleteBoundary, formatValidationIssues, } from "./observability-validator.js";
7
- import { parseUnitId } from "./unit-id.js";
8
7
  export async function collectObservabilityWarnings(ctx, basePath, unitType, unitId) {
9
8
  // Hook units have custom artifacts — skip standard observability checks
10
9
  if (unitType.startsWith("hook/"))
11
10
  return [];
12
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
11
+ const parts = unitId.split("/");
12
+ const mid = parts[0];
13
+ const sid = parts[1];
14
+ const tid = parts[2];
13
15
  if (!mid || !sid)
14
16
  return [];
15
17
  let issues = [];
@@ -17,38 +17,19 @@ import { resolveSliceFile, resolveTaskFile, resolveMilestoneFile, } from "./path
17
17
  import { invalidateAllCaches } from "./cache.js";
18
18
  import { closeoutUnit } from "./auto-unit-closeout.js";
19
19
  import { autoCommitCurrentBranch, } from "./worktree.js";
20
- import { verifyExpectedArtifact, persistCompletedKey, removePersistedKey, } from "./auto-recovery.js";
20
+ import { verifyExpectedArtifact, } from "./auto-recovery.js";
21
21
  import { writeUnitRuntimeRecord, clearUnitRuntimeRecord } from "./unit-runtime.js";
22
- import { resolveAutoSupervisorConfig } from "./preferences.js";
23
22
  import { runGSDDoctor, rebuildState, summarizeDoctorIssues } from "./doctor.js";
24
- import { COMPLETION_TRANSITION_CODES } from "./doctor-types.js";
25
23
  import { recordHealthSnapshot, checkHealEscalation } from "./doctor-proactive.js";
24
+ import { syncStateToProjectRoot } from "./auto-worktree-sync.js";
26
25
  import { resetRewriteCircuitBreaker } from "./auto-dispatch.js";
27
26
  import { isDbAvailable } from "./gsd-db.js";
28
27
  import { consumeSignal } from "./session-status-io.js";
29
- import { checkPostUnitHooks, getActiveHook, resetHookState, isRetryPending, consumeRetryTrigger, persistHookState, } from "./post-unit-hooks.js";
28
+ import { checkPostUnitHooks, isRetryPending, consumeRetryTrigger, persistHookState, } from "./post-unit-hooks.js";
30
29
  import { hasPendingCaptures, loadPendingCaptures } from "./captures.js";
31
- import { writeLock } from "./crash-recovery.js";
32
- import { STATE_REBUILD_MIN_INTERVAL_MS } from "./auto-constants.js";
33
- import { parseUnitId } from "./unit-id.js";
34
- /**
35
- * Initialize a unit dispatch: stamp the current time, set `s.currentUnit`,
36
- * and persist the initial runtime record. Returns `startedAt` for callers
37
- * that need the timestamp.
38
- */
39
- function dispatchUnit(s, basePath, unitType, unitId) {
40
- const startedAt = Date.now();
41
- s.currentUnit = { type: unitType, id: unitId, startedAt };
42
- writeUnitRuntimeRecord(basePath, unitType, unitId, startedAt, {
43
- phase: "dispatched",
44
- wrapupWarningSent: false,
45
- timeoutAt: null,
46
- lastProgressAt: startedAt,
47
- progressCount: 0,
48
- lastProgressKind: "dispatch",
49
- });
50
- return startedAt;
51
- }
30
+ import { debugLog } from "./debug-logger.js";
31
+ /** Throttle STATE.md rebuilds at most once per 30 seconds */
32
+ const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
52
33
  /**
53
34
  * Pre-verification processing: parallel worker signal check, cache invalidation,
54
35
  * auto-commit, doctor run, state rebuild, worktree sync, artifact verification.
@@ -81,7 +62,8 @@ export async function postUnitPreVerification(pctx) {
81
62
  try {
82
63
  let taskContext;
83
64
  if (s.currentUnit.type === "execute-task") {
84
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(s.currentUnit.id);
65
+ const parts = s.currentUnit.id.split("/");
66
+ const [mid, sid, tid] = parts;
85
67
  if (mid && sid && tid) {
86
68
  const summaryPath = resolveTaskFile(s.basePath, mid, sid, tid, "SUMMARY");
87
69
  if (summaryPath) {
@@ -113,24 +95,20 @@ export async function postUnitPreVerification(pctx) {
113
95
  }
114
96
  // Doctor: fix mechanical bookkeeping
115
97
  try {
116
- const { milestone, slice } = parseUnitId(s.currentUnit.id);
117
- const doctorScope = slice ? `${milestone}/${slice}` : milestone;
98
+ const scopeParts = s.currentUnit.id.split("/").slice(0, 2);
99
+ const doctorScope = scopeParts.join("/");
118
100
  const sliceTerminalUnits = new Set(["complete-slice", "run-uat"]);
119
101
  const effectiveFixLevel = sliceTerminalUnits.has(s.currentUnit.type) ? "all" : "task";
120
102
  const report = await runGSDDoctor(s.basePath, { fix: true, scope: doctorScope, fixLevel: effectiveFixLevel });
121
103
  if (report.fixesApplied.length > 0) {
122
104
  ctx.ui.notify(`Post-hook: applied ${report.fixesApplied.length} fix(es).`, "info");
123
105
  }
124
- // Proactive health tracking — exclude completion-transition codes at task level
125
- // since they are expected after the last task and resolved by complete-slice
126
- const issuesForHealth = effectiveFixLevel === "task"
127
- ? report.issues.filter(i => !COMPLETION_TRANSITION_CODES.has(i.code))
128
- : report.issues;
129
- const summary = summarizeDoctorIssues(issuesForHealth);
106
+ // Proactive health tracking
107
+ const summary = summarizeDoctorIssues(report.issues);
130
108
  recordHealthSnapshot(summary.errors, summary.warnings, report.fixesApplied.length);
131
109
  // Check if we should escalate to LLM-assisted heal
132
110
  if (summary.errors > 0) {
133
- const unresolvedErrors = issuesForHealth
111
+ const unresolvedErrors = report.issues
134
112
  .filter(i => i.severity === "error" && !i.fixable)
135
113
  .map(i => ({ code: i.code, message: i.message, unitId: i.unitId }));
136
114
  const escalation = checkHealEscalation(summary.errors, unresolvedErrors);
@@ -165,17 +143,23 @@ export async function postUnitPreVerification(pctx) {
165
143
  // Non-fatal
166
144
  }
167
145
  }
168
- // Prune dead bg-shell processes and kill non-persistent live ones.
169
- // Without killing live processes between units, dev servers spawned during
170
- // one task keep ports bound, causing conflicts in subsequent tasks (#1209).
146
+ // Prune dead bg-shell processes
171
147
  try {
172
- const { pruneDeadProcesses, killSessionProcesses } = await import("../bg-shell/process-manager.js");
148
+ const { pruneDeadProcesses } = await import("../bg-shell/process-manager.js");
173
149
  pruneDeadProcesses();
174
- killSessionProcesses();
175
150
  }
176
151
  catch {
177
152
  // Non-fatal
178
153
  }
154
+ // Sync worktree state back to project root
155
+ if (s.originalBasePath && s.originalBasePath !== s.basePath) {
156
+ try {
157
+ syncStateToProjectRoot(s.basePath, s.originalBasePath, s.currentMilestoneId);
158
+ }
159
+ catch {
160
+ // Non-fatal
161
+ }
162
+ }
179
163
  // Rewrite-docs completion
180
164
  if (s.currentUnit.type === "rewrite-docs") {
181
165
  try {
@@ -217,17 +201,12 @@ export async function postUnitPreVerification(pctx) {
217
201
  process.stderr.write(`gsd-triage: resolution execution failed: ${err.message}\n`);
218
202
  }
219
203
  }
220
- // Artifact verification and completion persistence
204
+ // Artifact verification
221
205
  let triggerArtifactVerified = false;
222
206
  if (!s.currentUnit.type.startsWith("hook/")) {
223
207
  try {
224
208
  triggerArtifactVerified = verifyExpectedArtifact(s.currentUnit.type, s.currentUnit.id, s.basePath);
225
209
  if (triggerArtifactVerified) {
226
- const completionKey = `${s.currentUnit.type}/${s.currentUnit.id}`;
227
- if (!s.completedKeySet.has(completionKey)) {
228
- persistCompletedKey(s.basePath, completionKey);
229
- s.completedKeySet.add(completionKey);
230
- }
231
210
  invalidateAllCaches();
232
211
  }
233
212
  }
@@ -256,9 +235,11 @@ export async function postUnitPreVerification(pctx) {
256
235
  * Post-verification processing: DB dual-write, post-unit hooks, triage
257
236
  * capture dispatch, quick-task dispatch.
258
237
  *
238
+ * Sidecar work (hooks, triage, quick-tasks) is enqueued on `s.sidecarQueue`
239
+ * for the main loop to drain via `runUnit()`.
240
+ *
259
241
  * Returns:
260
- * - "dispatched" — a hook/triage/quick-task was dispatched (sendMessage sent)
261
- * - "continue" — proceed to normal dispatchNextUnit
242
+ * - "continue" — proceed to sidecar drain / normal dispatch
262
243
  * - "step-wizard" — step mode, show wizard instead
263
244
  * - "stopped" — stopAuto was called
264
245
  */
@@ -274,44 +255,6 @@ export async function postUnitPostVerification(pctx) {
274
255
  process.stderr.write(`gsd-db: re-import failed: ${err.message}\n`);
275
256
  }
276
257
  }
277
- // ── Mechanical completion (ADR-003) ──
278
- // After task execution, attempt mechanical slice and milestone completion
279
- // instead of dispatching LLM sessions for complete-slice / validate-milestone.
280
- if (s.currentUnit?.type === "execute-task" && !s.stepMode) {
281
- try {
282
- const { milestone: mid, slice: sid } = parseUnitId(s.currentUnit.id);
283
- if (mid && sid) {
284
- const state = await deriveState(s.basePath);
285
- if (state.phase === "summarizing" && state.activeSlice?.id === sid) {
286
- const { mechanicalSliceCompletion } = await import("./mechanical-completion.js");
287
- const ok = await mechanicalSliceCompletion(s.basePath, mid, sid);
288
- if (ok) {
289
- invalidateAllCaches();
290
- autoCommitCurrentBranch(s.basePath, "mechanical-completion", `${mid}/${sid}`);
291
- ctx.ui.notify(`Mechanical completion: ${sid} summary + roadmap updated.`, "info");
292
- // Re-derive state — check if milestone is now ready for validation
293
- invalidateAllCaches();
294
- const postSliceState = await deriveState(s.basePath);
295
- if (postSliceState.phase === "validating-milestone" || postSliceState.phase === "completing-milestone") {
296
- const { aggregateMilestoneVerification, generateMilestoneSummary } = await import("./mechanical-completion.js");
297
- const validation = await aggregateMilestoneVerification(s.basePath, mid);
298
- if (validation.verdict !== "failed") {
299
- await generateMilestoneSummary(s.basePath, mid);
300
- invalidateAllCaches();
301
- autoCommitCurrentBranch(s.basePath, "mechanical-milestone-completion", mid);
302
- ctx.ui.notify(`Mechanical completion: ${mid} validation + summary written.`, "info");
303
- }
304
- }
305
- }
306
- // If !ok, summarizing phase persists → dispatch rule fires as LLM fallback
307
- }
308
- }
309
- }
310
- catch (err) {
311
- process.stderr.write(`gsd-mechanical: completion failed: ${err.message}\n`);
312
- // Non-fatal — fall through to normal dispatch
313
- }
314
- }
315
258
  // ── Post-unit hooks ──
316
259
  if (s.currentUnit && !s.stepMode) {
317
260
  const hookUnit = checkPostUnitHooks(s.currentUnit.type, s.currentUnit.id, s.basePath);
@@ -319,62 +262,29 @@ export async function postUnitPostVerification(pctx) {
319
262
  if (s.currentUnit) {
320
263
  await closeoutUnit(ctx, s.basePath, s.currentUnit.type, s.currentUnit.id, s.currentUnit.startedAt, buildSnapshotOpts(s.currentUnit.type, s.currentUnit.id));
321
264
  }
322
- dispatchUnit(s, s.basePath, hookUnit.unitType, hookUnit.unitId);
323
- const state = await deriveState(s.basePath);
324
- updateProgressWidget(ctx, hookUnit.unitType, hookUnit.unitId, state);
325
- const hookState = getActiveHook();
326
- ctx.ui.notify(`Running post-unit hook: ${hookUnit.hookName} (cycle ${hookState?.cycle ?? 1})`, "info");
327
- // Switch model if the hook specifies one
328
- if (hookUnit.model) {
329
- const availableModels = ctx.modelRegistry.getAvailable();
330
- const match = availableModels.find(m => m.id === hookUnit.model || `${m.provider}/${m.id}` === hookUnit.model);
331
- if (match) {
332
- try {
333
- await pi.setModel(match);
334
- }
335
- catch { /* non-fatal */ }
336
- }
337
- }
338
- const result = await s.cmdCtx.newSession();
339
- if (result.cancelled) {
340
- resetHookState();
341
- await stopAuto(ctx, pi, "Hook session cancelled");
342
- return "stopped";
343
- }
344
- const sessionFile = ctx.sessionManager.getSessionFile();
345
- writeLock(lockBase(), hookUnit.unitType, hookUnit.unitId, s.completedUnits.length, sessionFile);
346
265
  persistHookState(s.basePath);
347
- // Start supervision timers for hook units
348
- const supervisor = resolveAutoSupervisorConfig();
349
- const hookHardTimeoutMs = (supervisor.hard_timeout_minutes ?? 30) * 60 * 1000;
350
- s.unitTimeoutHandle = setTimeout(async () => {
351
- s.unitTimeoutHandle = null;
352
- if (!s.active)
353
- return;
354
- if (s.currentUnit) {
355
- writeUnitRuntimeRecord(s.basePath, hookUnit.unitType, hookUnit.unitId, s.currentUnit.startedAt, {
356
- phase: "timeout",
357
- timeoutAt: Date.now(),
358
- });
359
- }
360
- ctx.ui.notify(`Hook ${hookUnit.hookName} exceeded ${supervisor.hard_timeout_minutes ?? 30}min timeout. Pausing auto-mode.`, "warning");
361
- resetHookState();
362
- await pauseAuto(ctx, pi);
363
- }, hookHardTimeoutMs);
364
- if (!s.active)
365
- return "stopped";
366
- pi.sendMessage({ customType: "gsd-auto", content: hookUnit.prompt, display: s.verbose }, { triggerTurn: true });
367
- return "dispatched";
266
+ s.sidecarQueue.push({
267
+ kind: "hook",
268
+ unitType: hookUnit.unitType,
269
+ unitId: hookUnit.unitId,
270
+ prompt: hookUnit.prompt,
271
+ model: hookUnit.model,
272
+ });
273
+ debugLog("postUnitPostVerification", {
274
+ phase: "sidecar-enqueue",
275
+ kind: "hook",
276
+ unitType: hookUnit.unitType,
277
+ unitId: hookUnit.unitId,
278
+ hookName: hookUnit.hookName,
279
+ });
280
+ return "continue";
368
281
  }
369
282
  // Check if a hook requested a retry of the trigger unit
370
283
  if (isRetryPending()) {
371
284
  const trigger = consumeRetryTrigger();
372
285
  if (trigger) {
373
- const triggerKey = `${trigger.unitType}/${trigger.unitId}`;
374
- s.completedKeySet.delete(triggerKey);
375
- removePersistedKey(s.basePath, triggerKey);
376
286
  ctx.ui.notify(`Hook requested retry of ${trigger.unitType} ${trigger.unitId}.`, "info");
377
- // Fall through to normal dispatch
287
+ // Fall through to normal dispatch — deriveState will re-derive the unit
378
288
  }
379
289
  }
380
290
  }
@@ -406,34 +316,24 @@ export async function postUnitPostVerification(pctx) {
406
316
  currentPlan: currentPlan || "(no active slice plan)",
407
317
  roadmapContext: roadmapContext || "(no active roadmap)",
408
318
  });
409
- ctx.ui.notify(`Triaging ${pending.length} pending capture${pending.length === 1 ? "" : "s"}...`, "info");
410
319
  if (s.currentUnit) {
411
320
  await closeoutUnit(ctx, s.basePath, s.currentUnit.type, s.currentUnit.id, s.currentUnit.startedAt);
412
321
  }
413
- const triageUnitType = "triage-captures";
414
322
  const triageUnitId = `${mid}/${sid}/triage`;
415
- dispatchUnit(s, s.basePath, triageUnitType, triageUnitId);
416
- updateProgressWidget(ctx, triageUnitType, triageUnitId, state);
417
- const result = await s.cmdCtx.newSession();
418
- if (result.cancelled) {
419
- await stopAuto(ctx, pi);
420
- return "stopped";
421
- }
422
- const sessionFile = ctx.sessionManager.getSessionFile();
423
- writeLock(lockBase(), triageUnitType, triageUnitId, s.completedUnits.length, sessionFile);
424
- const supervisor = resolveAutoSupervisorConfig();
425
- const triageTimeoutMs = (supervisor.hard_timeout_minutes ?? 30) * 60 * 1000;
426
- s.unitTimeoutHandle = setTimeout(async () => {
427
- s.unitTimeoutHandle = null;
428
- if (!s.active)
429
- return;
430
- ctx.ui.notify(`Triage unit exceeded timeout. Pausing auto-mode.`, "warning");
431
- await pauseAuto(ctx, pi);
432
- }, triageTimeoutMs);
433
- if (!s.active)
434
- return "stopped";
435
- pi.sendMessage({ customType: "gsd-auto", content: prompt, display: s.verbose }, { triggerTurn: true });
436
- return "dispatched";
323
+ s.sidecarQueue.push({
324
+ kind: "triage",
325
+ unitType: "triage-captures",
326
+ unitId: triageUnitId,
327
+ prompt,
328
+ });
329
+ debugLog("postUnitPostVerification", {
330
+ phase: "sidecar-enqueue",
331
+ kind: "triage",
332
+ unitId: triageUnitId,
333
+ pendingCount: pending.length,
334
+ });
335
+ ctx.ui.notify(`Triaging ${pending.length} pending capture${pending.length === 1 ? "" : "s"}...`, "info");
336
+ return "continue";
437
337
  }
438
338
  }
439
339
  }
@@ -452,36 +352,26 @@ export async function postUnitPostVerification(pctx) {
452
352
  const { buildQuickTaskPrompt } = await import("./triage-resolution.js");
453
353
  const { markCaptureExecuted } = await import("./captures.js");
454
354
  const prompt = buildQuickTaskPrompt(capture);
455
- ctx.ui.notify(`Executing quick-task: ${capture.id} — "${capture.text}"`, "info");
456
355
  if (s.currentUnit) {
457
356
  await closeoutUnit(ctx, s.basePath, s.currentUnit.type, s.currentUnit.id, s.currentUnit.startedAt);
458
357
  }
459
- const qtUnitType = "quick-task";
460
- const qtUnitId = `${s.currentMilestoneId}/${capture.id}`;
461
- dispatchUnit(s, s.basePath, qtUnitType, qtUnitId);
462
- const state = await deriveState(s.basePath);
463
- updateProgressWidget(ctx, qtUnitType, qtUnitId, state);
464
- const result = await s.cmdCtx.newSession();
465
- if (result.cancelled) {
466
- await stopAuto(ctx, pi);
467
- return "stopped";
468
- }
469
- const sessionFile = ctx.sessionManager.getSessionFile();
470
- writeLock(lockBase(), qtUnitType, qtUnitId, s.completedUnits.length, sessionFile);
471
358
  markCaptureExecuted(s.basePath, capture.id);
472
- const supervisor = resolveAutoSupervisorConfig();
473
- const qtTimeoutMs = (supervisor.hard_timeout_minutes ?? 30) * 60 * 1000;
474
- s.unitTimeoutHandle = setTimeout(async () => {
475
- s.unitTimeoutHandle = null;
476
- if (!s.active)
477
- return;
478
- ctx.ui.notify(`Quick-task ${capture.id} exceeded timeout. Pausing auto-mode.`, "warning");
479
- await pauseAuto(ctx, pi);
480
- }, qtTimeoutMs);
481
- if (!s.active)
482
- return "stopped";
483
- pi.sendMessage({ customType: "gsd-auto", content: prompt, display: s.verbose }, { triggerTurn: true });
484
- return "dispatched";
359
+ const qtUnitId = `${s.currentMilestoneId}/${capture.id}`;
360
+ s.sidecarQueue.push({
361
+ kind: "quick-task",
362
+ unitType: "quick-task",
363
+ unitId: qtUnitId,
364
+ prompt,
365
+ captureId: capture.id,
366
+ });
367
+ debugLog("postUnitPostVerification", {
368
+ phase: "sidecar-enqueue",
369
+ kind: "quick-task",
370
+ unitId: qtUnitId,
371
+ captureId: capture.id,
372
+ });
373
+ ctx.ui.notify(`Executing quick-task: ${capture.id} — "${capture.text}"`, "info");
374
+ return "continue";
485
375
  }
486
376
  catch {
487
377
  // Non-fatal — proceed to normal dispatch