@wrongstack/cli 0.295.1 → 0.296.3

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 (398) hide show
  1. package/data/providers.json +0 -24
  2. package/dist/acp-A5OSIU2P.js +824 -0
  3. package/dist/acp-A5OSIU2P.js.map +7 -0
  4. package/dist/acp-server-agent.d.ts.map +1 -1
  5. package/dist/arg-parser.d.ts.map +1 -1
  6. package/dist/audit-2ZSFGNIF.js +102 -0
  7. package/dist/audit-2ZSFGNIF.js.map +7 -0
  8. package/dist/auth-CJWQJVRH.js +504 -0
  9. package/dist/auth-CJWQJVRH.js.map +7 -0
  10. package/dist/auth-menu/auth-menu-audit.d.ts +0 -4
  11. package/dist/auth-menu/auth-menu-audit.d.ts.map +1 -1
  12. package/dist/bench-7ZDWSNEF.js +278 -0
  13. package/dist/bench-7ZDWSNEF.js.map +7 -0
  14. package/dist/boot/brain-decision-log.d.ts +7 -5
  15. package/dist/boot/brain-decision-log.d.ts.map +1 -1
  16. package/dist/boot/dispatch-webui.d.ts +5 -8
  17. package/dist/boot/dispatch-webui.d.ts.map +1 -1
  18. package/dist/boot/system-prompt-builder.d.ts +3 -0
  19. package/dist/boot/system-prompt-builder.d.ts.map +1 -1
  20. package/dist/boot/tui-coordinator-callbacks.d.ts +45 -0
  21. package/dist/boot/tui-coordinator-callbacks.d.ts.map +1 -0
  22. package/dist/boot/tui-project-switch.d.ts +2 -3
  23. package/dist/boot/tui-project-switch.d.ts.map +1 -1
  24. package/dist/boot/tui-runtime-state.d.ts +5 -6
  25. package/dist/boot/tui-runtime-state.d.ts.map +1 -1
  26. package/dist/boot/tui-session-resume.d.ts.map +1 -1
  27. package/dist/boot/tui-settings-adapter.d.ts +2 -3
  28. package/dist/boot/tui-settings-adapter.d.ts.map +1 -1
  29. package/dist/boot.d.ts.map +1 -1
  30. package/dist/brain-menu/panel-service.d.ts.map +1 -1
  31. package/dist/chimera-review-task.d.ts +6 -0
  32. package/dist/chimera-review-task.d.ts.map +1 -0
  33. package/dist/chimera-reviewer-policy.d.ts +34 -0
  34. package/dist/chimera-reviewer-policy.d.ts.map +1 -0
  35. package/dist/chronicle-QQEQFSSE.js +256 -0
  36. package/dist/chronicle-QQEQFSSE.js.map +7 -0
  37. package/dist/chunk-5N34EWJR.js +418 -0
  38. package/dist/chunk-5N34EWJR.js.map +7 -0
  39. package/dist/chunk-66T43Q4Y.js +90 -0
  40. package/dist/chunk-66T43Q4Y.js.map +7 -0
  41. package/dist/chunk-7OCVIDC7.js +11 -0
  42. package/dist/chunk-7OCVIDC7.js.map +7 -0
  43. package/dist/chunk-ABXK4VVY.js +84 -0
  44. package/dist/chunk-ABXK4VVY.js.map +7 -0
  45. package/dist/chunk-AXVZMEWG.js +306 -0
  46. package/dist/chunk-AXVZMEWG.js.map +7 -0
  47. package/dist/chunk-AZESNNIC.js +216 -0
  48. package/dist/chunk-AZESNNIC.js.map +7 -0
  49. package/dist/chunk-BGFM3PD7.js +41 -0
  50. package/dist/chunk-BGFM3PD7.js.map +7 -0
  51. package/dist/chunk-BQCAJ7FI.js +425 -0
  52. package/dist/chunk-BQCAJ7FI.js.map +7 -0
  53. package/dist/chunk-DPJZQCVP.js +13 -0
  54. package/dist/chunk-DPJZQCVP.js.map +7 -0
  55. package/dist/chunk-F4PEGAJZ.js +176 -0
  56. package/dist/chunk-F4PEGAJZ.js.map +7 -0
  57. package/dist/chunk-IHBYBYGA.js +443 -0
  58. package/dist/chunk-IHBYBYGA.js.map +7 -0
  59. package/dist/chunk-JBSQ7ONN.js +1023 -0
  60. package/dist/chunk-JBSQ7ONN.js.map +7 -0
  61. package/dist/chunk-JBTFWWKV.js +1325 -0
  62. package/dist/chunk-JBTFWWKV.js.map +7 -0
  63. package/dist/chunk-JUHRI6OV.js +100 -0
  64. package/dist/chunk-JUHRI6OV.js.map +7 -0
  65. package/dist/chunk-OI7GWJDS.js +3303 -0
  66. package/dist/chunk-OI7GWJDS.js.map +7 -0
  67. package/dist/chunk-OP47B3IX.js +142 -0
  68. package/dist/chunk-OP47B3IX.js.map +7 -0
  69. package/dist/chunk-PJHET45A.js +158 -0
  70. package/dist/chunk-PJHET45A.js.map +7 -0
  71. package/dist/chunk-Q5GTM25S.js +17 -0
  72. package/dist/chunk-Q5GTM25S.js.map +7 -0
  73. package/dist/chunk-QD544J2B.js +19 -0
  74. package/dist/chunk-QD544J2B.js.map +7 -0
  75. package/dist/chunk-QUNHS6O3.js +258 -0
  76. package/dist/chunk-QUNHS6O3.js.map +7 -0
  77. package/dist/chunk-TADVX644.js +480 -0
  78. package/dist/chunk-TADVX644.js.map +7 -0
  79. package/dist/chunk-TGDHN4LM.js +81 -0
  80. package/dist/chunk-TGDHN4LM.js.map +7 -0
  81. package/dist/chunk-TYO2OVAD.js +50 -0
  82. package/dist/chunk-TYO2OVAD.js.map +7 -0
  83. package/dist/chunk-VCYZ3WZV.js +14 -0
  84. package/dist/chunk-VCYZ3WZV.js.map +7 -0
  85. package/dist/chunk-VJUEZZYB.js +29 -0
  86. package/dist/chunk-VJUEZZYB.js.map +7 -0
  87. package/dist/chunk-WHOIR577.js +1 -0
  88. package/dist/chunk-WHOIR577.js.map +7 -0
  89. package/dist/chunk-WY7KKOUK.js +460 -0
  90. package/dist/chunk-WY7KKOUK.js.map +7 -0
  91. package/dist/chunk-XJXDOF63.js +28 -0
  92. package/dist/chunk-XJXDOF63.js.map +7 -0
  93. package/dist/chunk-XWEGWYDU.js +560 -0
  94. package/dist/chunk-XWEGWYDU.js.map +7 -0
  95. package/dist/chunk-YWUPHRGB.js +346 -0
  96. package/dist/chunk-YWUPHRGB.js.map +7 -0
  97. package/dist/chunk-Z7YGASQP.js +313 -0
  98. package/dist/chunk-Z7YGASQP.js.map +7 -0
  99. package/dist/cli-entry-main.d.ts +2 -0
  100. package/dist/cli-entry-main.d.ts.map +1 -0
  101. package/dist/cli-entry-point.d.ts +3 -3
  102. package/dist/cli-entry-point.d.ts.map +1 -1
  103. package/dist/cli-main-RTY35OPD.js +29268 -0
  104. package/dist/cli-main-RTY35OPD.js.map +7 -0
  105. package/dist/cli-main-helpers.d.ts +21 -0
  106. package/dist/cli-main-helpers.d.ts.map +1 -0
  107. package/dist/cli-main.d.ts +25 -1
  108. package/dist/cli-main.d.ts.map +1 -1
  109. package/dist/context-limit.d.ts +48 -0
  110. package/dist/context-limit.d.ts.map +1 -1
  111. package/dist/diag-doctor-OQ3AA63O.js +170 -0
  112. package/dist/diag-doctor-OQ3AA63O.js.map +7 -0
  113. package/dist/execute-deps.d.ts +11 -12
  114. package/dist/execute-deps.d.ts.map +1 -1
  115. package/dist/execution-O7I5DYE6.js +4682 -0
  116. package/dist/execution-O7I5DYE6.js.map +7 -0
  117. package/dist/execution-chimera-ask.d.ts +10 -0
  118. package/dist/execution-chimera-ask.d.ts.map +1 -0
  119. package/dist/execution-chimera-cascade.d.ts +15 -0
  120. package/dist/execution-chimera-cascade.d.ts.map +1 -0
  121. package/dist/execution-cleanup.d.ts +23 -0
  122. package/dist/execution-cleanup.d.ts.map +1 -0
  123. package/dist/execution-kanban-dispatch.d.ts +10 -0
  124. package/dist/execution-kanban-dispatch.d.ts.map +1 -0
  125. package/dist/execution-repl-fleet-callbacks.d.ts +11 -0
  126. package/dist/execution-repl-fleet-callbacks.d.ts.map +1 -0
  127. package/dist/execution-storage-observability.d.ts +3 -0
  128. package/dist/execution-storage-observability.d.ts.map +1 -0
  129. package/dist/execution-tui-next-step-callbacks.d.ts +20 -0
  130. package/dist/execution-tui-next-step-callbacks.d.ts.map +1 -0
  131. package/dist/execution.d.ts +2 -139
  132. package/dist/execution.d.ts.map +1 -1
  133. package/dist/export-TPORYVRZ.js +64 -0
  134. package/dist/export-TPORYVRZ.js.map +7 -0
  135. package/dist/fleet/host-acp-runner-cache.d.ts +9 -0
  136. package/dist/fleet/host-acp-runner-cache.d.ts.map +1 -0
  137. package/dist/fleet/host-acp.d.ts +3 -0
  138. package/dist/fleet/host-acp.d.ts.map +1 -0
  139. package/dist/fleet/host-concurrency.d.ts +2 -0
  140. package/dist/fleet/host-concurrency.d.ts.map +1 -0
  141. package/dist/fleet/host-context.d.ts +5 -0
  142. package/dist/fleet/host-context.d.ts.map +1 -0
  143. package/dist/fleet/host-director-builder.d.ts +24 -0
  144. package/dist/fleet/host-director-builder.d.ts.map +1 -0
  145. package/dist/fleet/host-director-event-bridges.d.ts +37 -0
  146. package/dist/fleet/host-director-event-bridges.d.ts.map +1 -0
  147. package/dist/fleet/host-director-services.d.ts +20 -0
  148. package/dist/fleet/host-director-services.d.ts.map +1 -0
  149. package/dist/fleet/host-event-bridge.d.ts +17 -0
  150. package/dist/fleet/host-event-bridge.d.ts.map +1 -0
  151. package/dist/fleet/host-helpers.d.ts +22 -0
  152. package/dist/fleet/host-helpers.d.ts.map +1 -0
  153. package/dist/fleet/host-learning-tracker.d.ts +11 -0
  154. package/dist/fleet/host-learning-tracker.d.ts.map +1 -0
  155. package/dist/fleet/host-learning.d.ts +4 -0
  156. package/dist/fleet/host-learning.d.ts.map +1 -0
  157. package/dist/fleet/host-lifecycle-events.d.ts +4 -0
  158. package/dist/fleet/host-lifecycle-events.d.ts.map +1 -0
  159. package/dist/fleet/host-paths.d.ts +3 -0
  160. package/dist/fleet/host-paths.d.ts.map +1 -0
  161. package/dist/fleet/host-provider.d.ts +22 -0
  162. package/dist/fleet/host-provider.d.ts.map +1 -0
  163. package/dist/fleet/host-session-writer.d.ts +3 -0
  164. package/dist/fleet/host-session-writer.d.ts.map +1 -0
  165. package/dist/fleet/host-shadow-pass.d.ts +21 -0
  166. package/dist/fleet/host-shadow-pass.d.ts.map +1 -0
  167. package/dist/fleet/host-spawn-types.d.ts +25 -0
  168. package/dist/fleet/host-spawn-types.d.ts.map +1 -0
  169. package/dist/fleet/host-status.d.ts +48 -0
  170. package/dist/fleet/host-status.d.ts.map +1 -0
  171. package/dist/fleet/host-subagent-factory.d.ts +16 -0
  172. package/dist/fleet/host-subagent-factory.d.ts.map +1 -0
  173. package/dist/fleet/host-supervisor.d.ts +16 -0
  174. package/dist/fleet/host-supervisor.d.ts.map +1 -0
  175. package/dist/fleet/host-task-result-report.d.ts +11 -0
  176. package/dist/fleet/host-task-result-report.d.ts.map +1 -0
  177. package/dist/fleet/host-types.d.ts +89 -0
  178. package/dist/fleet/host-types.d.ts.map +1 -0
  179. package/dist/fleet/host.d.ts +10 -357
  180. package/dist/fleet/host.d.ts.map +1 -1
  181. package/dist/hq-JUYKUNJX.js +547 -0
  182. package/dist/hq-JUYKUNJX.js.map +7 -0
  183. package/dist/hq-command-controller.d.ts +2 -2
  184. package/dist/hq-command-controller.d.ts.map +1 -1
  185. package/dist/hq-server/auth.d.ts +15 -4
  186. package/dist/hq-server/auth.d.ts.map +1 -1
  187. package/dist/hq-server/project-root.d.ts +5 -0
  188. package/dist/hq-server/project-root.d.ts.map +1 -0
  189. package/dist/hq-server/routes/auth-handlers.d.ts +25 -0
  190. package/dist/hq-server/routes/auth-handlers.d.ts.map +1 -0
  191. package/dist/hq-server/routes/session-handlers.d.ts +8 -0
  192. package/dist/hq-server/routes/session-handlers.d.ts.map +1 -0
  193. package/dist/hq-server/routes.d.ts +8 -6
  194. package/dist/hq-server/routes.d.ts.map +1 -1
  195. package/dist/hq-server/snapshot.d.ts +44 -0
  196. package/dist/hq-server/snapshot.d.ts.map +1 -1
  197. package/dist/hq-server/types.d.ts +22 -4
  198. package/dist/hq-server/types.d.ts.map +1 -1
  199. package/dist/hq-server/utils.d.ts +8 -0
  200. package/dist/hq-server/utils.d.ts.map +1 -1
  201. package/dist/hq-server/ws.d.ts +1 -1
  202. package/dist/hq-server/ws.d.ts.map +1 -1
  203. package/dist/hq-server-6AQ3BXZA.js +39 -0
  204. package/dist/hq-server-6AQ3BXZA.js.map +7 -0
  205. package/dist/hq-server.d.ts +3 -3
  206. package/dist/hq-server.d.ts.map +1 -1
  207. package/dist/hq-ttl-U2FAYFAT.js +8 -0
  208. package/dist/hq-ttl-U2FAYFAT.js.map +7 -0
  209. package/dist/hq-tunnel-RFKGC4HI.js +114 -0
  210. package/dist/hq-tunnel-RFKGC4HI.js.map +7 -0
  211. package/dist/hq-tunnel.d.ts +1 -1
  212. package/dist/hq-tunnel.d.ts.map +1 -1
  213. package/dist/index.d.ts +2 -1
  214. package/dist/index.d.ts.map +1 -1
  215. package/dist/index.js +2503 -53026
  216. package/dist/index.js.map +4 -4
  217. package/dist/init-E2NDDOHI.js +27 -0
  218. package/dist/init-E2NDDOHI.js.map +7 -0
  219. package/dist/kanban-dispatch-route.d.ts +14 -0
  220. package/dist/kanban-dispatch-route.d.ts.map +1 -0
  221. package/dist/kanban-hq-sync.d.ts +2 -0
  222. package/dist/kanban-hq-sync.d.ts.map +1 -1
  223. package/dist/kanban-run-mirror-EKVNGXWW.js +12 -0
  224. package/dist/kanban-run-mirror-EKVNGXWW.js.map +7 -0
  225. package/dist/live-settings-input.d.ts +69 -0
  226. package/dist/live-settings-input.d.ts.map +1 -0
  227. package/dist/mailbox-serve-2UWHEN3M.js +302 -0
  228. package/dist/mailbox-serve-2UWHEN3M.js.map +7 -0
  229. package/dist/mcp-CYLPUEHC.js +413 -0
  230. package/dist/mcp-CYLPUEHC.js.map +7 -0
  231. package/dist/modeldiag-HENYJ4N7.js +1290 -0
  232. package/dist/modeldiag-HENYJ4N7.js.map +7 -0
  233. package/dist/permissions-FNYLZIL4.js +115 -0
  234. package/dist/permissions-FNYLZIL4.js.map +7 -0
  235. package/dist/picker-key-state.d.ts +7 -0
  236. package/dist/picker-key-state.d.ts.map +1 -0
  237. package/dist/picker-model-picker.d.ts +6 -0
  238. package/dist/picker-model-picker.d.ts.map +1 -0
  239. package/dist/picker-ui.d.ts +17 -0
  240. package/dist/picker-ui.d.ts.map +1 -0
  241. package/dist/picker.d.ts +4 -37
  242. package/dist/picker.d.ts.map +1 -1
  243. package/dist/plugin-usage-OU6X6LM3.js +40 -0
  244. package/dist/plugin-usage-OU6X6LM3.js.map +7 -0
  245. package/dist/plugins-4LJ5IUBI.js +24 -0
  246. package/dist/plugins-4LJ5IUBI.js.map +7 -0
  247. package/dist/pre-launch.d.ts +0 -1
  248. package/dist/pre-launch.d.ts.map +1 -1
  249. package/dist/project-BLQ3ALVL.js +76 -0
  250. package/dist/project-BLQ3ALVL.js.map +7 -0
  251. package/dist/project-manifest-GE25PW4S.js +18 -0
  252. package/dist/project-manifest-GE25PW4S.js.map +7 -0
  253. package/dist/project-picker-BOCWHBXP.js +17 -0
  254. package/dist/project-picker-BOCWHBXP.js.map +7 -0
  255. package/dist/projects-XE76NFNZ.js +38 -0
  256. package/dist/projects-XE76NFNZ.js.map +7 -0
  257. package/dist/provider-helpers.d.ts +22 -6
  258. package/dist/provider-helpers.d.ts.map +1 -1
  259. package/dist/providers-models-GDELBHZK.js +589 -0
  260. package/dist/providers-models-GDELBHZK.js.map +7 -0
  261. package/dist/quick-VIO2BEHS.js +10 -0
  262. package/dist/quick-VIO2BEHS.js.map +7 -0
  263. package/dist/repl-auto-proceed.d.ts +19 -0
  264. package/dist/repl-auto-proceed.d.ts.map +1 -0
  265. package/dist/repl-client-registration.d.ts +7 -0
  266. package/dist/repl-client-registration.d.ts.map +1 -0
  267. package/dist/repl-input.d.ts +11 -0
  268. package/dist/repl-input.d.ts.map +1 -0
  269. package/dist/repl-options.d.ts +54 -0
  270. package/dist/repl-options.d.ts.map +1 -0
  271. package/dist/repl-rendering.d.ts +4 -0
  272. package/dist/repl-rendering.d.ts.map +1 -0
  273. package/dist/repl-suggestions.d.ts +21 -0
  274. package/dist/repl-suggestions.d.ts.map +1 -0
  275. package/dist/repl.d.ts +3 -162
  276. package/dist/repl.d.ts.map +1 -1
  277. package/dist/replay-KCTXNMZQ.js +75 -0
  278. package/dist/replay-KCTXNMZQ.js.map +7 -0
  279. package/dist/rewind-EJMVFVLS.js +185 -0
  280. package/dist/rewind-EJMVFVLS.js.map +7 -0
  281. package/dist/sdd-runtime-JG4EEKL6.js +54 -0
  282. package/dist/sdd-runtime-JG4EEKL6.js.map +7 -0
  283. package/dist/services/sdd/project-context.d.ts +1 -1
  284. package/dist/services/sdd/project-context.d.ts.map +1 -1
  285. package/dist/services/sdd/task-manager.d.ts.map +1 -1
  286. package/dist/services/statusline-config.d.ts +1 -1
  287. package/dist/services/statusline-config.d.ts.map +1 -1
  288. package/dist/session-event-wiring.d.ts +2 -2
  289. package/dist/session-event-wiring.d.ts.map +1 -1
  290. package/dist/sessions-config-NLCMK3BY.js +409 -0
  291. package/dist/sessions-config-NLCMK3BY.js.map +7 -0
  292. package/dist/settings-menu.d.ts +3 -18
  293. package/dist/settings-menu.d.ts.map +1 -1
  294. package/dist/simpleui-dist-JIFGUJO7.js +93 -0
  295. package/dist/simpleui-dist-JIFGUJO7.js.map +7 -0
  296. package/dist/slash-commands/brain.d.ts.map +1 -1
  297. package/dist/slash-commands/clear.d.ts.map +1 -1
  298. package/dist/slash-commands/fallback.d.ts.map +1 -1
  299. package/dist/slash-commands/kanban-agent-helpers.d.ts +18 -0
  300. package/dist/slash-commands/kanban-agent-helpers.d.ts.map +1 -0
  301. package/dist/slash-commands/kanban-format.d.ts +16 -0
  302. package/dist/slash-commands/kanban-format.d.ts.map +1 -0
  303. package/dist/slash-commands/kanban-help.d.ts +2 -0
  304. package/dist/slash-commands/kanban-help.d.ts.map +1 -0
  305. package/dist/slash-commands/kanban.d.ts.map +1 -1
  306. package/dist/slash-commands/mailbox-demo.d.ts.map +1 -1
  307. package/dist/slash-commands/mailbox.d.ts +2 -1
  308. package/dist/slash-commands/mailbox.d.ts.map +1 -1
  309. package/dist/slash-commands/memory-compact.d.ts +5 -0
  310. package/dist/slash-commands/memory-compact.d.ts.map +1 -0
  311. package/dist/slash-commands/memory-flags.d.ts +36 -0
  312. package/dist/slash-commands/memory-flags.d.ts.map +1 -0
  313. package/dist/slash-commands/memory-formatters.d.ts +16 -0
  314. package/dist/slash-commands/memory-formatters.d.ts.map +1 -0
  315. package/dist/slash-commands/memory.d.ts.map +1 -1
  316. package/dist/slash-commands/mouse.d.ts +2 -2
  317. package/dist/slash-commands/review.d.ts.map +1 -1
  318. package/dist/slash-commands/sdd-command-helpers.d.ts +23 -0
  319. package/dist/slash-commands/sdd-command-helpers.d.ts.map +1 -0
  320. package/dist/slash-commands/sdd-format.d.ts +32 -0
  321. package/dist/slash-commands/sdd-format.d.ts.map +1 -0
  322. package/dist/slash-commands/sdd.d.ts.map +1 -1
  323. package/dist/slash-commands/settings.d.ts.map +1 -1
  324. package/dist/subcommands/handlers/chronicle.d.ts.map +1 -1
  325. package/dist/subcommands/handlers/mailbox-serve.d.ts.map +1 -1
  326. package/dist/subcommands/handlers/model-smoke-test.d.ts +51 -0
  327. package/dist/subcommands/handlers/model-smoke-test.d.ts.map +1 -0
  328. package/dist/subcommands/handlers/modeldiag-profiles.d.ts +64 -0
  329. package/dist/subcommands/handlers/modeldiag-profiles.d.ts.map +1 -0
  330. package/dist/subcommands/handlers/modeldiag.d.ts.map +1 -1
  331. package/dist/subcommands/handlers/per-subcommand-deep-help-table.d.ts +3 -0
  332. package/dist/subcommands/handlers/per-subcommand-deep-help-table.d.ts.map +1 -0
  333. package/dist/subcommands/handlers/per-subcommand-help-data.d.ts +3 -0
  334. package/dist/subcommands/handlers/per-subcommand-help-data.d.ts.map +1 -0
  335. package/dist/subcommands/handlers/per-subcommand-help-table.d.ts +36 -0
  336. package/dist/subcommands/handlers/per-subcommand-help-table.d.ts.map +1 -0
  337. package/dist/subcommands/handlers/per-subcommand-help-types.d.ts +18 -0
  338. package/dist/subcommands/handlers/per-subcommand-help-types.d.ts.map +1 -0
  339. package/dist/subcommands/handlers/per-subcommand-help.d.ts +2 -80
  340. package/dist/subcommands/handlers/per-subcommand-help.d.ts.map +1 -1
  341. package/dist/subcommands/handlers/rewind.d.ts.map +1 -1
  342. package/dist/subcommands/index.d.ts +7 -0
  343. package/dist/subcommands/index.d.ts.map +1 -1
  344. package/dist/tools-skills-UNKLOB7M.js +29 -0
  345. package/dist/tools-skills-UNKLOB7M.js.map +7 -0
  346. package/dist/update-YC4TYW2Y.js +16 -0
  347. package/dist/update-YC4TYW2Y.js.map +7 -0
  348. package/dist/update-check-UMYTOH7Z.js +18 -0
  349. package/dist/update-check-UMYTOH7Z.js.map +7 -0
  350. package/dist/version-help-DROHZRW6.js +11 -0
  351. package/dist/version-help-DROHZRW6.js.map +7 -0
  352. package/dist/webui-server/connection-handler.d.ts.map +1 -1
  353. package/dist/webui-server/kanban-host-adapter.d.ts +5 -1
  354. package/dist/webui-server/kanban-host-adapter.d.ts.map +1 -1
  355. package/dist/webui-server/listen-helpers.d.ts +18 -0
  356. package/dist/webui-server/listen-helpers.d.ts.map +1 -0
  357. package/dist/webui-server/node-pty-loader.d.ts +6 -0
  358. package/dist/webui-server/node-pty-loader.d.ts.map +1 -0
  359. package/dist/webui-server-ZF5KVGC5.js +1460 -0
  360. package/dist/webui-server-ZF5KVGC5.js.map +7 -0
  361. package/dist/webui-server-options.d.ts +191 -0
  362. package/dist/webui-server-options.d.ts.map +1 -0
  363. package/dist/webui-server.d.ts +2 -178
  364. package/dist/webui-server.d.ts.map +1 -1
  365. package/dist/wiring/brain-and-orchestration.d.ts.map +1 -1
  366. package/dist/wiring/codebase-index.d.ts.map +1 -1
  367. package/dist/wiring/command-host-state.d.ts +4 -4
  368. package/dist/wiring/dep-watcher-bridge.d.ts +23 -0
  369. package/dist/wiring/dep-watcher-bridge.d.ts.map +1 -0
  370. package/dist/wiring/dep-watcher.d.ts.map +1 -1
  371. package/dist/wiring/hq-telemetry.d.ts +2 -2
  372. package/dist/wiring/lifecycle-plugins.d.ts +4 -3
  373. package/dist/wiring/lifecycle-plugins.d.ts.map +1 -1
  374. package/dist/wiring/mailbox-bridge-bootstrap.d.ts +1 -1
  375. package/dist/wiring/management-tools.d.ts +15 -0
  376. package/dist/wiring/management-tools.d.ts.map +1 -0
  377. package/dist/wiring/pipeline.d.ts +2 -1
  378. package/dist/wiring/pipeline.d.ts.map +1 -1
  379. package/dist/wiring/plugins.d.ts +1 -1
  380. package/dist/wiring/plugins.d.ts.map +1 -1
  381. package/dist/wiring/provider-runtime-setup.d.ts +14 -1
  382. package/dist/wiring/provider-runtime-setup.d.ts.map +1 -1
  383. package/dist/wiring/provider.d.ts.map +1 -1
  384. package/dist/wiring/runtime-controller-deps.d.ts +1 -1
  385. package/dist/wiring/runtime-controller-deps.d.ts.map +1 -1
  386. package/dist/wiring/sage.d.ts.map +1 -1
  387. package/dist/wiring/session-registry.d.ts +38 -0
  388. package/dist/wiring/session-registry.d.ts.map +1 -0
  389. package/dist/wiring/session.d.ts +10 -6
  390. package/dist/wiring/session.d.ts.map +1 -1
  391. package/dist/wiring/tools.d.ts.map +1 -1
  392. package/package.json +22 -22
  393. package/dist/cli-recovery-prompt.d.ts +0 -19
  394. package/dist/cli-recovery-prompt.d.ts.map +0 -1
  395. package/dist/first-run-auth-gate.d.ts +0 -20
  396. package/dist/first-run-auth-gate.d.ts.map +0 -1
  397. package/dist/pre-launch/indexing-question.d.ts +0 -28
  398. package/dist/pre-launch/indexing-question.d.ts.map +0 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/acp-registry-cache.ts", "../src/shutdown-cleanup.ts", "../src/wiring/provider.ts"],
4
+ "sourcesContent": ["/**\n * Local cache for the official ACP registry snapshot.\n *\n * `wstack acp sync` / `/acp sync` call `refreshAcpRegistry`, which fetches the\n * CDN snapshot (via `@wrongstack/acp`'s `fetchAcpRegistry`) and writes it to\n * `~/.wrongstack/cache/acp-registry.json`. `loadCachedAcpRegistry` reads it\n * back into the `AcpLiveCatalog` shape the resolver consumes. No network at\n * load time; resolution falls back to the bundled static catalog when no\n * cache exists.\n */\nimport {\n type ACPAgentDescriptor,\n type AcpLiveCatalog,\n fetchAcpRegistry,\n} from '@wrongstack/acp';\nimport type { WstackPaths } from '@wrongstack/core/utils';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\ninterface CacheEnvelope {\n fetchedAt: string;\n agents: ACPAgentDescriptor[];\n}\n\nexport interface LoadedAcpRegistry {\n fetchedAt: string;\n /** Resolver input: registry-id \u2192 spawn command. */\n byId: AcpLiveCatalog;\n /** Full descriptors, for listing. */\n agents: ACPAgentDescriptor[];\n}\n\n/** Where the synced registry snapshot lives. */\nexport function acpRegistryCachePath(paths: WstackPaths): string {\n return path.join(paths.cacheDir, 'acp-registry.json');\n}\n\n/** Read the cached registry, or `null` if it's missing or unreadable. */\nexport async function loadCachedAcpRegistry(\n paths: WstackPaths,\n): Promise<LoadedAcpRegistry | null> {\n try {\n const raw = await fs.readFile(acpRegistryCachePath(paths), 'utf8');\n const env = JSON.parse(raw) as CacheEnvelope;\n if (!Array.isArray(env.agents)) return null;\n const byId: AcpLiveCatalog = {};\n for (const a of env.agents) {\n if (!a?.id || !a.acp?.command) continue;\n byId[a.id] = {\n command: a.acp.command,\n args: a.acp.args ?? [],\n ...(a.acp.env ? { env: a.acp.env } : {}),\n };\n }\n return { fetchedAt: env.fetchedAt ?? '', byId, agents: env.agents };\n } catch {\n return null;\n }\n}\n\n/** Fetch the live registry and persist it. Throws on network/parse failure. */\nexport async function refreshAcpRegistry(\n paths: WstackPaths,\n opts?: { signal?: AbortSignal; timeoutMs?: number },\n): Promise<{ count: number; location: string; fetchedAt: string }> {\n const result = await fetchAcpRegistry({\n ...(opts?.signal ? { signal: opts.signal } : {}),\n ...(opts?.timeoutMs ? { timeoutMs: opts.timeoutMs } : {}),\n });\n const location = acpRegistryCachePath(paths);\n await fs.mkdir(path.dirname(location), { recursive: true });\n const env: CacheEnvelope = { fetchedAt: result.fetchedAt, agents: result.agents };\n await fs.writeFile(location, JSON.stringify(env), 'utf8');\n return { count: result.agents.length, location, fetchedAt: result.fetchedAt };\n}\n", "/**\n * Graceful shutdown for the CLI host process.\n *\n * Bug history: cli-main.ts used to call `process.exit(0)` immediately in its\n * SIGINT/SIGTERM handlers, after kicking off async cleanup with `void\n * cleanup()`. The async work (most importantly `registry.markClosing()`, an\n * awaited atomic disk write) was being cut off \u2014 leaving the cross-process\n * session registry thinking the host was still alive after Ctrl+C.\n *\n * This helper is the same pattern `webui-server/lifecycle.ts` uses\n * (`createWebuiShutdown`) and `cli-entry-point.ts` uses for its natural-exit\n * drain: idempotent guard, await the work, set `exitCode`, give the event\n * loop a bounded grace period, then force exit. A repeated signal that\n * somehow re-fires our handler (e.g. someone re-installs it, or the\n * `beforeExit` and a `SIGINT` race) short-circuits to immediate exit instead\n * of waiting for the cleanup to settle a second time.\n *\n * The cleanup function is responsible for whatever the caller needs to flush\n * \u2014 registry writes, unsubscribe, dispose, etc. The wrapper only handles the\n * process-exit handshake around it.\n */\n\nexport interface ShutdownCleanup {\n /**\n * Async cleanup. Called exactly once across all signals. May throw \u2014 errors\n * are swallowed so a stuck cleanup can't wedge the exit path.\n */\n run: () => Promise<void>;\n /** Exit code to use on a clean shutdown (default 0). */\n exitCode?: number;\n}\n\nexport interface ShutdownHandle {\n /** Install SIGINT + SIGTERM + beforeExit listeners. Idempotent. */\n install: () => void;\n /** Uninstall listeners (for tests). */\n uninstall: () => void;\n /** True iff cleanup has been kicked off (by any signal). */\n get cleanupStarted(): boolean;\n}\n\n/**\n * Build a graceful-shutdown handle. Pass the cleanup function; the wrapper\n * installs signal handlers that call it once and let the event loop drain.\n */\nexport function createGracefulShutdown(cleanup: ShutdownCleanup): ShutdownHandle {\n const exitCode = cleanup.exitCode ?? 0;\n let started = false;\n let installed = false;\n\n const runOnce = (force: boolean): void => {\n if (started) {\n if (force) process.exit(exitCode);\n return;\n }\n started = true;\n void cleanup\n .run()\n .catch(() => {\n /* swallow \u2014 a stuck cleanup cannot wedge the exit path */\n })\n .finally(() => {\n if (force) {\n // SIGINT/SIGTERM path: set exitCode and let Node drain naturally,\n // then force exit after a 500ms grace. Matches cli-entry-point.ts.\n process.exitCode = exitCode;\n const t = setTimeout(() => process.exit(exitCode), 500);\n // Allow the timer to be cleared by Node's normal exit drain if the\n // loop empties before it fires. unref prevents it from holding the\n // loop open by itself.\n t.unref();\n }\n // beforeExit path: do nothing further \u2014 Node is already draining.\n });\n };\n\n const signalHandler = (): void => runOnce(true);\n const beforeExitHandler = (): void => runOnce(false);\n\n return {\n install() {\n if (installed) return;\n installed = true;\n process.once('SIGINT', signalHandler);\n process.once('SIGTERM', signalHandler);\n process.once('beforeExit', beforeExitHandler);\n },\n uninstall() {\n if (!installed) return;\n installed = false;\n process.removeListener('SIGINT', signalHandler);\n process.removeListener('SIGTERM', signalHandler);\n process.removeListener('beforeExit', beforeExitHandler);\n },\n get cleanupStarted() {\n return started;\n },\n };\n}", "import type { ResolvedProvider } from '@wrongstack/core/types';\nimport { ConfigError, type Config, type Logger, type ModelsRegistry } from '@wrongstack/core/types';\nimport { ProviderRegistry } from '@wrongstack/core/registry';\nimport {\n buildProviderFactoriesFromRegistry,\n installCatalogModelOutputLimits,\n makeProviderFromConfig,\n withCatalogCapabilities,\n} from '@wrongstack/providers';\nimport {\n fallbackCodexProviderModels,\n filterCurrentCodexModelIds,\n isCodexCatalogModel,\n} from '../auth-menu/openai-codex-oauth.js';\n\nexport interface ProviderSetupResult {\n resolvedProvider: ResolvedProvider | undefined;\n provider: ReturnType<ProviderRegistry['create']>;\n providerRegistry: ProviderRegistry;\n}\n\nexport async function setupProvider(params: {\n config: Config;\n modelsRegistry: ModelsRegistry;\n logger: Logger;\n}): Promise<ProviderSetupResult> {\n const { config, modelsRegistry, logger } = params;\n\n // Resolve provider details from models.dev.\n const savedProviderCfg = config.providers?.[config.provider];\n let resolvedProvider = await modelsRegistry.getProvider(config.provider).catch(() => undefined);\n if (!resolvedProvider && savedProviderCfg?.type && savedProviderCfg.type !== config.provider) {\n resolvedProvider = await modelsRegistry\n .getProvider(savedProviderCfg.type)\n .catch(() => undefined);\n }\n if (!resolvedProvider) {\n if (savedProviderCfg?.family) {\n // Config-only provider not in the models.dev catalog \u2014 e.g. the OAuth\n // subscription families (openai-codex, anthropic-oauth, github-copilot)\n // or any user-defined provider with an explicit `family`. Synthesize a\n // ResolvedProvider from config so boot proceeds (the actual transport is\n // still built below via makeProviderFromConfig / the registry).\n // When the saved config carries no models but the family is one of\n // the OAuth/subscription wire families, seed with the canonical\n // model list so the provider shows up in pickers and the WebUI.\n const family = savedProviderCfg.family;\n const savedModels = savedProviderCfg.models;\n let models: Array<{ id: string; name: string }>;\n if (savedModels && savedModels.length > 0) {\n models = savedModels.map((m) => ({ id: m, name: m }));\n } else if (family === 'openai-codex') {\n // Resolve from the models.dev catalog: pick all models with\n // family=gpt-codex* under the `openai` provider. When the\n // catalog is unavailable, fall back to the documented defaults.\n const openaiProvider = await modelsRegistry.getProvider('openai').catch(() => undefined);\n if (openaiProvider) {\n const catalogById = new Map(\n openaiProvider.models\n .filter(isCodexCatalogModel)\n .map((m) => [m.id, { id: m.id, name: m.name }] as const),\n );\n const catalogModels = filterCurrentCodexModelIds(catalogById.keys())\n .map((id) => catalogById.get(id))\n .filter((m): m is { id: string; name: string } => Boolean(m));\n if (catalogModels.length > 0) {\n models = catalogModels;\n } else {\n models = fallbackCodexProviderModels();\n }\n } else {\n models = fallbackCodexProviderModels();\n }\n } else {\n models = [];\n }\n\n resolvedProvider = {\n id: config.provider,\n name: config.provider,\n family,\n apiBase: savedProviderCfg.baseUrl,\n envVars: savedProviderCfg.envVars ?? [],\n models,\n npm: undefined,\n };\n } else {\n logger.warn(\n `Provider \"${config.provider}\" not found in models.dev. Continuing with raw config.`,\n );\n }\n } else if (resolvedProvider.family === 'unsupported' && !savedProviderCfg?.family) {\n throw new ConfigError({\n message:\n `Provider \"${config.provider}\" uses an unsupported wire family (${resolvedProvider.npm}). ` +\n `Install a plugin to enable it, or pick a different provider.`,\n code: 'CONFIG_INVALID',\n context: { provider: config.provider, family: resolvedProvider.npm, kind: 'unsupported' },\n });\n }\n\n // Per-request output ceilings. The capability overlay below is resolved\n // ONCE, for `config.model`; this index is keyed on the model of the request\n // being built, so `/model` switches, fallback hops and subagents running a\n // model-matrix entry all get their own model's `limit.output` instead of the\n // adapters' 8192 last-resort literal.\n if (config.features.modelsRegistry) {\n await installCatalogModelOutputLimits({\n registry: modelsRegistry,\n getConfig: () => config,\n log: (message) => logger.debug(message),\n });\n }\n\n // Provider registry \u2014 populated dynamically from models.dev catalog.\n const providerRegistry = new ProviderRegistry();\n if (config.features.modelsRegistry) {\n try {\n const factories = await buildProviderFactoriesFromRegistry({\n registry: modelsRegistry,\n log: logger,\n });\n for (const f of factories) providerRegistry.register(f);\n } catch (err) {\n throw new ConfigError({\n message:\n `Failed to load models.dev registry: ${err instanceof Error ? err.message : err}\\n` +\n `Try \\`wstack models refresh\\` once you have network access, or run with --no-features.`,\n code: 'CONFIG_INVALID',\n context: { phase: 'registry-build', provider: config.provider },\n cause: err,\n });\n }\n }\n\n // Provider instance \u2014 registry-driven by default, falls through to config-only.\n const providerConfig = config.providers?.[config.provider] ?? {\n type: config.provider,\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n };\n let provider: ReturnType<ProviderRegistry['create']>;\n try {\n const cfgWithType = { ...providerConfig, type: config.provider };\n if (config.features.modelsRegistry && providerRegistry.has(config.provider)) {\n provider = providerRegistry.create(cfgWithType);\n } else {\n provider = makeProviderFromConfig(config.provider, cfgWithType);\n }\n } catch (err) {\n throw new ConfigError({\n message: `Failed to create provider: ${err instanceof Error ? err.message : err}`,\n code: 'CONFIG_INVALID',\n context: { phase: 'provider-create', provider: config.provider },\n cause: err,\n });\n }\n\n // Resolve per-model capabilities (maxOutput, maxContext, etc.) from the\n // models.dev catalog and overlay them on the provider's family baseline.\n // Without this step `provider.capabilities.maxOutput` stays at the\n // family default \u2014 and Chimera / other subagents would default to a\n // conservative 8K instead of the model's actual output ceiling.\n //\n // The overlay helper is exported from @wrongstack/providers so the\n // same resolution rules (customCaps \u2192 catalog \u2192 base) are shared with\n // any other caller that constructs a Provider post-init. Failures\n // inside are swallowed inside the helper \u2014 the family default stands\n // and the per-request output-limit lookup installed above still resolves\n // the ceiling from the catalog.\n if (config.features.modelsRegistry) {\n provider = await withCatalogCapabilities(\n modelsRegistry,\n config.provider,\n provider,\n { ...providerConfig, type: config.provider, model: config.model },\n logger,\n );\n }\n\n return { resolvedProvider, provider, providerRegistry };\n}\n"],
5
+ "mappings": ";;;;;;;;AAUA;AAAA,EAGE;AAAA,OACK;AAEP,YAAY,QAAQ;AACpB,YAAY,UAAU;AAgBf,SAAS,qBAAqB,OAA4B;AAC/D,SAAY,UAAK,MAAM,UAAU,mBAAmB;AACtD;AAGA,eAAsB,sBACpB,OACmC;AACnC,MAAI;AACF,UAAM,MAAM,MAAS,YAAS,qBAAqB,KAAK,GAAG,MAAM;AACjE,UAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,QAAI,CAAC,MAAM,QAAQ,IAAI,MAAM,EAAG,QAAO;AACvC,UAAM,OAAuB,CAAC;AAC9B,eAAW,KAAK,IAAI,QAAQ;AAC1B,UAAI,CAAC,GAAG,MAAM,CAAC,EAAE,KAAK,QAAS;AAC/B,WAAK,EAAE,EAAE,IAAI;AAAA,QACX,SAAS,EAAE,IAAI;AAAA,QACf,MAAM,EAAE,IAAI,QAAQ,CAAC;AAAA,QACrB,GAAI,EAAE,IAAI,MAAM,EAAE,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC;AAAA,MACxC;AAAA,IACF;AACA,WAAO,EAAE,WAAW,IAAI,aAAa,IAAI,MAAM,QAAQ,IAAI,OAAO;AAAA,EACpE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,eAAsB,mBACpB,OACA,MACiE;AACjE,QAAM,SAAS,MAAM,iBAAiB;AAAA,IACpC,GAAI,MAAM,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,IAC9C,GAAI,MAAM,YAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,EACzD,CAAC;AACD,QAAM,WAAW,qBAAqB,KAAK;AAC3C,QAAS,SAAW,aAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,QAAM,MAAqB,EAAE,WAAW,OAAO,WAAW,QAAQ,OAAO,OAAO;AAChF,QAAS,aAAU,UAAU,KAAK,UAAU,GAAG,GAAG,MAAM;AACxD,SAAO,EAAE,OAAO,OAAO,OAAO,QAAQ,UAAU,WAAW,OAAO,UAAU;AAC9E;;;AC7BO,SAAS,uBAAuB,SAA0C;AAC/E,QAAM,WAAW,QAAQ,YAAY;AACrC,MAAI,UAAU;AACd,MAAI,YAAY;AAEhB,QAAM,UAAU,CAAC,UAAyB;AACxC,QAAI,SAAS;AACX,UAAI,MAAO,SAAQ,KAAK,QAAQ;AAChC;AAAA,IACF;AACA,cAAU;AACV,SAAK,QACF,IAAI,EACJ,MAAM,MAAM;AAAA,IAEb,CAAC,EACA,QAAQ,MAAM;AACb,UAAI,OAAO;AAGT,gBAAQ,WAAW;AACnB,cAAM,IAAI,WAAW,MAAM,QAAQ,KAAK,QAAQ,GAAG,GAAG;AAItD,UAAE,MAAM;AAAA,MACV;AAAA,IAEF,CAAC;AAAA,EACL;AAEA,QAAM,gBAAgB,MAAY,QAAQ,IAAI;AAC9C,QAAM,oBAAoB,MAAY,QAAQ,KAAK;AAEnD,SAAO;AAAA,IACL,UAAU;AACR,UAAI,UAAW;AACf,kBAAY;AACZ,cAAQ,KAAK,UAAU,aAAa;AACpC,cAAQ,KAAK,WAAW,aAAa;AACrC,cAAQ,KAAK,cAAc,iBAAiB;AAAA,IAC9C;AAAA,IACA,YAAY;AACV,UAAI,CAAC,UAAW;AAChB,kBAAY;AACZ,cAAQ,eAAe,UAAU,aAAa;AAC9C,cAAQ,eAAe,WAAW,aAAa;AAC/C,cAAQ,eAAe,cAAc,iBAAiB;AAAA,IACxD;AAAA,IACA,IAAI,iBAAiB;AACnB,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACjGA,SAAS,mBAAkE;AAC3E,SAAS,wBAAwB;AACjC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAaP,eAAsB,cAAc,QAIH;AAC/B,QAAM,EAAE,QAAQ,gBAAgB,OAAO,IAAI;AAG3C,QAAM,mBAAmB,OAAO,YAAY,OAAO,QAAQ;AAC3D,MAAI,mBAAmB,MAAM,eAAe,YAAY,OAAO,QAAQ,EAAE,MAAM,MAAM,MAAS;AAC9F,MAAI,CAAC,oBAAoB,kBAAkB,QAAQ,iBAAiB,SAAS,OAAO,UAAU;AAC5F,uBAAmB,MAAM,eACtB,YAAY,iBAAiB,IAAI,EACjC,MAAM,MAAM,MAAS;AAAA,EAC1B;AACA,MAAI,CAAC,kBAAkB;AACrB,QAAI,kBAAkB,QAAQ;AAS5B,YAAM,SAAS,iBAAiB;AAChC,YAAM,cAAc,iBAAiB;AACrC,UAAI;AACJ,UAAI,eAAe,YAAY,SAAS,GAAG;AACzC,iBAAS,YAAY,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,EAAE,EAAE;AAAA,MACtD,WAAW,WAAW,gBAAgB;AAIpC,cAAM,iBAAiB,MAAM,eAAe,YAAY,QAAQ,EAAE,MAAM,MAAM,MAAS;AACvF,YAAI,gBAAgB;AAClB,gBAAM,cAAc,IAAI;AAAA,YACtB,eAAe,OACZ,OAAO,mBAAmB,EAC1B,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,KAAK,CAAC,CAAU;AAAA,UAC3D;AACA,gBAAM,gBAAgB,2BAA2B,YAAY,KAAK,CAAC,EAChE,IAAI,CAAC,OAAO,YAAY,IAAI,EAAE,CAAC,EAC/B,OAAO,CAAC,MAAyC,QAAQ,CAAC,CAAC;AAC9D,cAAI,cAAc,SAAS,GAAG;AAC5B,qBAAS;AAAA,UACX,OAAO;AACL,qBAAS,4BAA4B;AAAA,UACvC;AAAA,QACF,OAAO;AACL,mBAAS,4BAA4B;AAAA,QACvC;AAAA,MACF,OAAO;AACL,iBAAS,CAAC;AAAA,MACZ;AAEA,yBAAmB;AAAA,QACjB,IAAI,OAAO;AAAA,QACX,MAAM,OAAO;AAAA,QACb;AAAA,QACA,SAAS,iBAAiB;AAAA,QAC1B,SAAS,iBAAiB,WAAW,CAAC;AAAA,QACtC;AAAA,QACA,KAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,aAAO;AAAA,QACL,aAAa,OAAO,QAAQ;AAAA,MAC9B;AAAA,IACF;AAAA,EACF,WAAW,iBAAiB,WAAW,iBAAiB,CAAC,kBAAkB,QAAQ;AACjF,UAAM,IAAI,YAAY;AAAA,MACpB,SACE,aAAa,OAAO,QAAQ,sCAAsC,iBAAiB,GAAG;AAAA,MAExF,MAAM;AAAA,MACN,SAAS,EAAE,UAAU,OAAO,UAAU,QAAQ,iBAAiB,KAAK,MAAM,cAAc;AAAA,IAC1F,CAAC;AAAA,EACH;AAOA,MAAI,OAAO,SAAS,gBAAgB;AAClC,UAAM,gCAAgC;AAAA,MACpC,UAAU;AAAA,MACV,WAAW,MAAM;AAAA,MACjB,KAAK,CAAC,YAAY,OAAO,MAAM,OAAO;AAAA,IACxC,CAAC;AAAA,EACH;AAGA,QAAM,mBAAmB,IAAI,iBAAiB;AAC9C,MAAI,OAAO,SAAS,gBAAgB;AAClC,QAAI;AACF,YAAM,YAAY,MAAM,mCAAmC;AAAA,QACzD,UAAU;AAAA,QACV,KAAK;AAAA,MACP,CAAC;AACD,iBAAW,KAAK,UAAW,kBAAiB,SAAS,CAAC;AAAA,IACxD,SAAS,KAAK;AACZ,YAAM,IAAI,YAAY;AAAA,QACpB,SACE,uCAAuC,eAAe,QAAQ,IAAI,UAAU,GAAG;AAAA;AAAA,QAEjF,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,kBAAkB,UAAU,OAAO,SAAS;AAAA,QAC9D,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,iBAAiB,OAAO,YAAY,OAAO,QAAQ,KAAK;AAAA,IAC5D,MAAM,OAAO;AAAA,IACb,QAAQ,OAAO;AAAA,IACf,SAAS,OAAO;AAAA,EAClB;AACA,MAAI;AACJ,MAAI;AACF,UAAM,cAAc,EAAE,GAAG,gBAAgB,MAAM,OAAO,SAAS;AAC/D,QAAI,OAAO,SAAS,kBAAkB,iBAAiB,IAAI,OAAO,QAAQ,GAAG;AAC3E,iBAAW,iBAAiB,OAAO,WAAW;AAAA,IAChD,OAAO;AACL,iBAAW,uBAAuB,OAAO,UAAU,WAAW;AAAA,IAChE;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,IAAI,YAAY;AAAA,MACpB,SAAS,8BAA8B,eAAe,QAAQ,IAAI,UAAU,GAAG;AAAA,MAC/E,MAAM;AAAA,MACN,SAAS,EAAE,OAAO,mBAAmB,UAAU,OAAO,SAAS;AAAA,MAC/D,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAcA,MAAI,OAAO,SAAS,gBAAgB;AAClC,eAAW,MAAM;AAAA,MACf;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,EAAE,GAAG,gBAAgB,MAAM,OAAO,UAAU,OAAO,OAAO,MAAM;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,kBAAkB,UAAU,iBAAiB;AACxD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,41 @@
1
+
2
+ // src/utils/hq-ttl.ts
3
+ var TTL_UNIT_MS = {
4
+ ms: 1,
5
+ s: 1e3,
6
+ m: 6e4,
7
+ h: 36e5,
8
+ d: 864e5,
9
+ w: 6048e5
10
+ };
11
+ function parseTokenTtlValue(raw) {
12
+ const trimmed = raw.trim();
13
+ if (trimmed.length === 0) {
14
+ return { error: "TTL value is empty" };
15
+ }
16
+ if (/^\d+$/.test(trimmed)) {
17
+ const ms = Number.parseInt(trimmed, 10);
18
+ if (!Number.isFinite(ms) || ms <= 0) {
19
+ return { error: `TTL value must be positive (got ${raw})` };
20
+ }
21
+ return { value: ms };
22
+ }
23
+ const match = /^(?<value>\d+)(?<unit>ms|s|m|h|d|w)$/i.exec(trimmed);
24
+ if (match?.groups) {
25
+ const value = Number.parseInt(match.groups.value, 10);
26
+ const unit = match.groups.unit.toLowerCase();
27
+ const multiplier = TTL_UNIT_MS[unit];
28
+ if (!Number.isFinite(value) || value <= 0 || multiplier === void 0) {
29
+ return { error: `TTL value must be positive with a valid unit (got ${raw})` };
30
+ }
31
+ return { value: value * multiplier };
32
+ }
33
+ return {
34
+ error: `TTL must be a positive integer (milliseconds) or <number><unit> where unit is one of ms, s, m, h, d, w (got ${raw})`
35
+ };
36
+ }
37
+
38
+ export {
39
+ parseTokenTtlValue
40
+ };
41
+ //# sourceMappingURL=chunk-BGFM3PD7.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/hq-ttl.ts"],
4
+ "sourcesContent": ["/**\n * Shared TTL (time-to-live) duration parser.\n *\n * Accepts:\n * \"1h\" \u2192 1 hour\n * \"7d\" \u2192 7 days\n * \"30m\" \u2192 30 minutes\n * \"3600s\" \u2192 1 hour\n * \"86400000\" \u2192 1 day (bare milliseconds)\n *\n * Compound durations (\"1h30m\") are intentionally NOT supported \u2014 a single\n * unit is always sufficient for a rotation cadence.\n *\n * @module cli/utils/hq-ttl\n */\n\nconst TTL_UNIT_MS: Record<string, number> = {\n ms: 1,\n s: 1_000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n w: 604_800_000,\n};\n\nexport interface ParsedTtl {\n value?: number | undefined;\n error?: string | undefined;\n}\n\nexport function parseTokenTtlValue(raw: string): ParsedTtl {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n return { error: 'TTL value is empty' };\n }\n // Bare integer \u2192 milliseconds.\n if (/^\\d+$/.test(trimmed)) {\n const ms = Number.parseInt(trimmed, 10);\n if (!Number.isFinite(ms) || ms <= 0) {\n return { error: `TTL value must be positive (got ${raw})` };\n }\n return { value: ms };\n }\n // <number><unit> \u2014 capture the trailing unit suffix.\n const match = /^(?<value>\\d+)(?<unit>ms|s|m|h|d|w)$/i.exec(trimmed);\n if (match?.groups) {\n const value = Number.parseInt(match.groups.value!, 10);\n const unit = match.groups.unit!.toLowerCase();\n const multiplier = TTL_UNIT_MS[unit];\n if (!Number.isFinite(value) || value <= 0 || multiplier === undefined) {\n return { error: `TTL value must be positive with a valid unit (got ${raw})` };\n }\n return { value: value * multiplier };\n }\n return {\n error:\n `TTL must be a positive integer (milliseconds) or <number><unit> ` +\n `where unit is one of ms, s, m, h, d, w (got ${raw})`,\n };\n}\n"],
5
+ "mappings": ";;;AAgBA,IAAM,cAAsC;AAAA,EAC1C,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAOO,SAAS,mBAAmB,KAAwB;AACzD,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,OAAO,qBAAqB;AAAA,EACvC;AAEA,MAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,UAAM,KAAK,OAAO,SAAS,SAAS,EAAE;AACtC,QAAI,CAAC,OAAO,SAAS,EAAE,KAAK,MAAM,GAAG;AACnC,aAAO,EAAE,OAAO,mCAAmC,GAAG,IAAI;AAAA,IAC5D;AACA,WAAO,EAAE,OAAO,GAAG;AAAA,EACrB;AAEA,QAAM,QAAQ,wCAAwC,KAAK,OAAO;AAClE,MAAI,OAAO,QAAQ;AACjB,UAAM,QAAQ,OAAO,SAAS,MAAM,OAAO,OAAQ,EAAE;AACrD,UAAM,OAAO,MAAM,OAAO,KAAM,YAAY;AAC5C,UAAM,aAAa,YAAY,IAAI;AACnC,QAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,KAAK,eAAe,QAAW;AACrE,aAAO,EAAE,OAAO,qDAAqD,GAAG,IAAI;AAAA,IAC9E;AACA,WAAO,EAAE,OAAO,QAAQ,WAAW;AAAA,EACrC;AACA,SAAO;AAAA,IACL,OACE,+GAC+C,GAAG;AAAA,EACtD;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,425 @@
1
+
2
+ // src/services/sdd/state.ts
3
+ import {
4
+ SpecVersioning
5
+ } from "@wrongstack/sdd";
6
+ var SDD_META_KEY = "sdd.state";
7
+ var SDDState = class {
8
+ builder = null;
9
+ taskStore = null;
10
+ taskTracker = null;
11
+ taskGraphId = null;
12
+ sessionStartTime = Date.now();
13
+ phaseStartTime = Date.now();
14
+ versioning = null;
15
+ getBuilder() {
16
+ return this.builder;
17
+ }
18
+ setBuilder(b) {
19
+ this.builder = b;
20
+ }
21
+ getTaskStore() {
22
+ return this.taskStore;
23
+ }
24
+ setTaskStore(s) {
25
+ this.taskStore = s;
26
+ }
27
+ getTaskTracker() {
28
+ return this.taskTracker;
29
+ }
30
+ setTaskTracker(t) {
31
+ this.taskTracker = t;
32
+ }
33
+ getTaskGraphId() {
34
+ return this.taskGraphId;
35
+ }
36
+ setTaskGraphId(id) {
37
+ this.taskGraphId = id;
38
+ }
39
+ getSessionStartTime() {
40
+ return this.sessionStartTime;
41
+ }
42
+ setSessionStartTime(t) {
43
+ this.sessionStartTime = t;
44
+ }
45
+ setPhaseStartTime(t) {
46
+ this.phaseStartTime = t;
47
+ }
48
+ getPhaseStartTime() {
49
+ return this.phaseStartTime;
50
+ }
51
+ getSessionElapsed() {
52
+ return Date.now() - this.sessionStartTime;
53
+ }
54
+ getPhaseElapsed() {
55
+ return Date.now() - this.phaseStartTime;
56
+ }
57
+ getVersioning() {
58
+ if (this.versioning === null) this.versioning = new SpecVersioning();
59
+ return this.versioning;
60
+ }
61
+ clearTaskState() {
62
+ this.taskStore = null;
63
+ this.taskTracker = null;
64
+ this.taskGraphId = null;
65
+ }
66
+ getContext() {
67
+ if (!this.builder) return null;
68
+ const session = this.builder.getSession();
69
+ if (session.phase === "done") return null;
70
+ return this.builder.getAIPrompt();
71
+ }
72
+ getPhase() {
73
+ return this.builder?.getPhase() ?? null;
74
+ }
75
+ };
76
+ var sddState = new SDDState();
77
+ function getSessionState(ctx) {
78
+ if (!ctx) return sddState;
79
+ let state = ctx.meta[SDD_META_KEY];
80
+ if (!state) {
81
+ state = new SDDState();
82
+ ctx.meta[SDD_META_KEY] = state;
83
+ }
84
+ return state;
85
+ }
86
+
87
+ // src/services/sdd/project-context.ts
88
+ import { gatherProjectContext } from "@wrongstack/sdd";
89
+ function getActiveBuilder() {
90
+ return sddState.getBuilder();
91
+ }
92
+ function getActiveSDDContext() {
93
+ return sddState.getContext();
94
+ }
95
+ function getActiveSDDPhase() {
96
+ return sddState.getPhase();
97
+ }
98
+ async function findSpec(store, idOrTitle) {
99
+ if (!idOrTitle) return null;
100
+ const byId = await store.load(idOrTitle);
101
+ if (byId) return byId;
102
+ const all = await store.list();
103
+ const match = all.find(
104
+ (e) => e.id.startsWith(idOrTitle) || e.title.toLowerCase().includes(idOrTitle.toLowerCase())
105
+ );
106
+ if (match) return store.load(match.id);
107
+ return null;
108
+ }
109
+
110
+ // src/services/sdd/spec-detection.ts
111
+ function isExplanatoryText(text) {
112
+ const lower = text.toLowerCase();
113
+ return lower.startsWith("i'") || lower.startsWith("i will") || lower.startsWith("let me") || lower.startsWith("here's my") || lower.startsWith("here is my") || lower.startsWith("i'm going to") || lower.startsWith("first, let me") || lower.startsWith("sure") || lower.startsWith("of course") || lower.startsWith("okay") || lower.startsWith("ok,") || lower.startsWith("sounds good") || lower.startsWith("no problem") || text.split("\n").length < 3 && !text.includes(".");
114
+ }
115
+ async function trySaveSpecFromAIOutput(aiOutput) {
116
+ const builder = sddState.getBuilder();
117
+ if (!builder) return false;
118
+ const spec = builder.tryParseSpecFromOutput(aiOutput);
119
+ if (!spec) return false;
120
+ builder.setSpec(spec);
121
+ return true;
122
+ }
123
+ function trySaveImplementationPlan(aiOutput) {
124
+ const builder = sddState.getBuilder();
125
+ if (!builder) return false;
126
+ const session = builder.getSession();
127
+ if (session.phase !== "implementation") return false;
128
+ const current = session.implementation ?? "";
129
+ const jsonMatch = aiOutput.match(/```json\s*\[/);
130
+ if (jsonMatch?.index && jsonMatch.index > 0) {
131
+ const plan = aiOutput.substring(0, jsonMatch.index).trim();
132
+ if (plan.length > 50 && plan !== current && !isExplanatoryText(plan)) {
133
+ builder.setImplementation(plan);
134
+ return true;
135
+ }
136
+ }
137
+ if (aiOutput.length > 100 && !aiOutput.includes("```json") && aiOutput !== current && !isExplanatoryText(aiOutput)) {
138
+ builder.setImplementation(aiOutput.trim());
139
+ return true;
140
+ }
141
+ return false;
142
+ }
143
+ function autoDetectTaskCompletion(aiOutput) {
144
+ const tracker = sddState.getTaskTracker();
145
+ if (!tracker) return 0;
146
+ const pending = tracker.getAllNodes({ status: ["pending", "in_progress"] });
147
+ if (pending.length === 0) return 0;
148
+ let completed = 0;
149
+ const lines = aiOutput.split("\n");
150
+ for (const line of lines) {
151
+ const trimmed = line.trim();
152
+ const sddDoneMatch = trimmed.match(/\/sdd\s+done\s+(.+)/i);
153
+ if (sddDoneMatch?.[1]) {
154
+ const target = sddDoneMatch[1].trim();
155
+ const num = Number(target);
156
+ if (!Number.isNaN(num) && num >= 1 && num <= pending.length) {
157
+ const node = pending[num - 1];
158
+ if (node && node.status !== "completed") {
159
+ tracker.updateNodeStatus(node.id, "completed");
160
+ completed++;
161
+ }
162
+ } else {
163
+ const match = pending.find(
164
+ (n) => n.title.toLowerCase().includes(target.toLowerCase()) || target.toLowerCase().includes(n.title.toLowerCase())
165
+ );
166
+ if (match && match.status !== "completed") {
167
+ tracker.updateNodeStatus(match.id, "completed");
168
+ completed++;
169
+ }
170
+ }
171
+ continue;
172
+ }
173
+ const checkmarkMatch = trimmed.match(/^✅\s*(?:Task:\s*)?(.+)/i);
174
+ if (checkmarkMatch?.[1]) {
175
+ const title = checkmarkMatch[1].trim();
176
+ const match = pending.find(
177
+ (n) => n.title.toLowerCase().includes(title.toLowerCase()) || title.toLowerCase().includes(n.title.toLowerCase())
178
+ );
179
+ if (match && match.status !== "completed") {
180
+ tracker.updateNodeStatus(match.id, "completed");
181
+ completed++;
182
+ }
183
+ continue;
184
+ }
185
+ const taskNumMatch = trimmed.match(/Task\s+(\d+)\s*[:]\s*(?:complete|done|finished)/i);
186
+ if (taskNumMatch?.[1]) {
187
+ const num = Number(taskNumMatch[1]);
188
+ if (num >= 1 && num <= pending.length) {
189
+ const node = pending[num - 1];
190
+ if (node && node.status !== "completed") {
191
+ tracker.updateNodeStatus(node.id, "completed");
192
+ completed++;
193
+ }
194
+ }
195
+ continue;
196
+ }
197
+ const completedMatch = trimmed.match(/^(?:Completed|Done|Finished)\s*[:]\s*(.+)/i);
198
+ if (completedMatch?.[1]) {
199
+ const title = completedMatch[1].trim();
200
+ const match = pending.find(
201
+ (n) => n.title.toLowerCase().includes(title.toLowerCase()) || title.toLowerCase().includes(n.title.toLowerCase())
202
+ );
203
+ if (match && match.status !== "completed") {
204
+ tracker.updateNodeStatus(match.id, "completed");
205
+ completed++;
206
+ }
207
+ }
208
+ }
209
+ return completed;
210
+ }
211
+
212
+ // src/services/sdd/task-manager.ts
213
+ import { expectDefined } from "@wrongstack/core/utils";
214
+ import { DefaultTaskStore, renderProgress, TaskTracker } from "@wrongstack/sdd";
215
+ function formatElapsed(ms) {
216
+ if (ms < 1e3) return `${ms}ms`;
217
+ const s = Math.floor(ms / 1e3);
218
+ if (s < 60) return `${s}s`;
219
+ const m = Math.floor(s / 60);
220
+ const remS = s % 60;
221
+ if (m < 60) return remS > 0 ? `${m}m ${remS}s` : `${m}m`;
222
+ const h = Math.floor(m / 60);
223
+ const remM = m % 60;
224
+ return `${h}h ${remM}m`;
225
+ }
226
+ function addTaskToTracker(tracker, task) {
227
+ tracker.addNode({
228
+ title: String(task.title),
229
+ description: String(task.description ?? ""),
230
+ type: ["feature", "bugfix", "refactor", "docs", "test", "chore"].includes(String(task.type)) ? String(task.type) : "feature",
231
+ priority: ["critical", "high", "medium", "low"].includes(String(task.priority)) ? String(task.priority) : "medium",
232
+ status: "pending",
233
+ estimateHours: Number(task.estimateHours) || 2,
234
+ tags: Array.isArray(task.tags) ? task.tags.map(String) : []
235
+ });
236
+ }
237
+ async function trySaveTasksFromAIOutput(aiOutput) {
238
+ const builder = sddState.getBuilder();
239
+ if (!builder) return false;
240
+ const session = builder.getSession();
241
+ if (!session.spec) return false;
242
+ const json = builder.extractJSONArray(aiOutput);
243
+ if (!json) return false;
244
+ let tasks;
245
+ try {
246
+ tasks = JSON.parse(json);
247
+ } catch {
248
+ return false;
249
+ }
250
+ if (!Array.isArray(tasks) || tasks.length === 0) return false;
251
+ const validTasks = tasks.filter(
252
+ (t) => t && typeof t === "object" && typeof t.title === "string" && t.title.length > 0
253
+ );
254
+ if (validTasks.length === 0) return false;
255
+ const existingTracker = sddState.getTaskTracker();
256
+ if (existingTracker) {
257
+ for (const task of validTasks) addTaskToTracker(existingTracker, task);
258
+ return true;
259
+ }
260
+ const store = new DefaultTaskStore();
261
+ const tracker = new TaskTracker({ store });
262
+ const graph = await tracker.createGraph(session.spec.id, session.spec.title);
263
+ for (const task of validTasks) addTaskToTracker(tracker, task);
264
+ sddState.setTaskStore(store);
265
+ sddState.setTaskTracker(tracker);
266
+ sddState.setTaskGraphId(graph.id);
267
+ await builder.setTaskGraphId(graph.id);
268
+ return true;
269
+ }
270
+ function getTaskProgress() {
271
+ const tracker = sddState.getTaskTracker();
272
+ if (!tracker) return null;
273
+ return tracker.getProgress();
274
+ }
275
+ function getCurrentTask() {
276
+ const tracker = sddState.getTaskTracker();
277
+ if (!tracker) return null;
278
+ const nodes = tracker.getAllNodes({ status: ["in_progress"] });
279
+ if (nodes.length === 0) return null;
280
+ const n = expectDefined(nodes[0]);
281
+ return {
282
+ id: n.id,
283
+ title: n.title,
284
+ description: n.description,
285
+ priority: n.priority,
286
+ estimateHours: n.estimateHours ?? 0,
287
+ tags: n.tags ?? [],
288
+ startedAt: n.startedAt
289
+ };
290
+ }
291
+ function advanceToNextTask() {
292
+ const tracker = sddState.getTaskTracker();
293
+ if (!tracker) return false;
294
+ const pending = tracker.getAllNodes({ status: ["pending"] });
295
+ for (const n of pending) {
296
+ if (tracker.canStart(n.id)) {
297
+ tracker.updateNodeStatus(n.id, "in_progress");
298
+ return true;
299
+ }
300
+ }
301
+ return false;
302
+ }
303
+ function getTaskListText() {
304
+ const tracker = sddState.getTaskTracker();
305
+ if (!tracker) return null;
306
+ const nodes = tracker.getAllNodes();
307
+ if (nodes.length === 0) return null;
308
+ return nodes.map((n, i) => {
309
+ const status = n.status === "completed" ? "\u2705" : n.status === "in_progress" ? "\u{1F504}" : "\u23F3";
310
+ return `${i + 1}. ${status} [${n.priority}] ${n.title}`;
311
+ }).join("\n");
312
+ }
313
+ function renderTaskListWithProgress() {
314
+ const tracker = sddState.getTaskTracker();
315
+ if (!tracker) return null;
316
+ const nodes = tracker.getAllNodes();
317
+ if (nodes.length === 0) return null;
318
+ const progress = tracker.getProgress();
319
+ const phase = sddState.getPhase();
320
+ const phaseLabel = {
321
+ questioning: "\u2753 Questioning",
322
+ spec_review: "\u{1F4CB} Spec Review",
323
+ implementation: "\u{1F3D7}\uFE0F Implementation",
324
+ task_review: "\u{1F4DD} Task Review",
325
+ executing: "\u26A1 Executing",
326
+ done: "\u2705 Done"
327
+ };
328
+ const lines = [
329
+ `**${phaseLabel[phase ?? ""] ?? phase} \u2014 Task Status**`,
330
+ "",
331
+ renderProgress(progress),
332
+ ""
333
+ ];
334
+ const sorted = [...nodes].sort((a, b) => {
335
+ const order = {
336
+ in_progress: 0,
337
+ pending: 1,
338
+ review: 2,
339
+ blocked: 3,
340
+ failed: 4,
341
+ completed: 5
342
+ };
343
+ return (order[a.status] ?? 6) - (order[b.status] ?? 6);
344
+ });
345
+ for (let i = 0; i < sorted.length; i++) {
346
+ const n = expectDefined(sorted[i]);
347
+ const status = n.status === "completed" ? "\u2705" : n.status === "in_progress" ? "\u{1F504}" : n.status === "failed" ? "\u274C" : n.status === "blocked" ? "\u{1F6AB}" : n.status === "review" ? "\u{1F441}" : "\u23F3";
348
+ const title = n.title.length > 50 ? n.title.slice(0, 49) + "\u2026" : n.title;
349
+ let elapsed = "";
350
+ if (n.status === "in_progress" && n.startedAt)
351
+ elapsed = ` \xB7 ${formatElapsed(Date.now() - n.startedAt)}`;
352
+ lines.push(`${i + 1}. ${status} ${title}${elapsed}`);
353
+ }
354
+ return lines.join("\n");
355
+ }
356
+ function getCurrentExecutingContext() {
357
+ const tracker = sddState.getTaskTracker();
358
+ if (!tracker) return null;
359
+ const nodes = tracker.getAllNodes({ status: ["in_progress"] });
360
+ if (nodes.length === 0) return null;
361
+ const n = expectDefined(nodes[0]);
362
+ const elapsed = n.startedAt ? ` \xB7 elapsed: ${formatElapsed(Date.now() - n.startedAt)}` : "";
363
+ const progress = tracker.getProgress();
364
+ return [
365
+ `**NOW EXECUTING:** "${n.title}"${elapsed}`,
366
+ `Description: ${n.description.split("\n")[0] ?? "(none)"}`,
367
+ `Priority: ${n.priority} \xB7 Est: ${n.estimateHours ?? 0}h \xB7 Tags: ${(n.tags ?? []).join(", ") || "none"}`,
368
+ `Progress: ${progress.completed}/${progress.total} tasks (${progress.percentComplete}%)`
369
+ ].join("\n");
370
+ }
371
+ function matchTaskNode(nodes, query) {
372
+ const trimmed = query.trim();
373
+ if (!trimmed) return null;
374
+ const num = Number(trimmed);
375
+ if (!Number.isNaN(num) && num >= 1 && num <= nodes.length) {
376
+ return nodes[num - 1] ?? null;
377
+ }
378
+ const q = trimmed.toLowerCase();
379
+ return nodes.find((n) => n.title.toLowerCase().includes(q) || q.includes(n.title.toLowerCase())) ?? null;
380
+ }
381
+ function markTaskCompleted(taskTitle) {
382
+ const tracker = sddState.getTaskTracker();
383
+ if (!tracker) return false;
384
+ const nodes = tracker.getAllNodes({ status: ["pending", "in_progress"] });
385
+ const match = nodes.find(
386
+ (n) => n.title.toLowerCase().includes(taskTitle.toLowerCase()) || taskTitle.toLowerCase().includes(n.title.toLowerCase())
387
+ );
388
+ if (!match) return false;
389
+ tracker.updateNodeStatus(match.id, "completed");
390
+ return true;
391
+ }
392
+ function getTaskGraphId() {
393
+ return sddState.getTaskGraphId();
394
+ }
395
+ function getTaskTrackerExport() {
396
+ return sddState.getTaskTracker();
397
+ }
398
+
399
+ export {
400
+ SDDState,
401
+ sddState,
402
+ getSessionState,
403
+ getActiveBuilder,
404
+ getActiveSDDContext,
405
+ getActiveSDDPhase,
406
+ findSpec,
407
+ gatherProjectContext,
408
+ isExplanatoryText,
409
+ trySaveSpecFromAIOutput,
410
+ trySaveImplementationPlan,
411
+ autoDetectTaskCompletion,
412
+ formatElapsed,
413
+ trySaveTasksFromAIOutput,
414
+ getTaskProgress,
415
+ getCurrentTask,
416
+ advanceToNextTask,
417
+ getTaskListText,
418
+ renderTaskListWithProgress,
419
+ getCurrentExecutingContext,
420
+ matchTaskNode,
421
+ markTaskCompleted,
422
+ getTaskGraphId,
423
+ getTaskTrackerExport
424
+ };
425
+ //# sourceMappingURL=chunk-BQCAJ7FI.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/services/sdd/state.ts", "../src/services/sdd/project-context.ts", "../src/services/sdd/spec-detection.ts", "../src/services/sdd/task-manager.ts"],
4
+ "sourcesContent": ["import type { Context } from '@wrongstack/core/agent';\nimport {\n type AISpecBuilder,\n type AISpecPhase,\n type DefaultTaskStore,\n SpecVersioning,\n type TaskTracker,\n} from '@wrongstack/sdd';\n\n/** Key used to store SDD session state in ctx.meta for session isolation. */\nexport const SDD_META_KEY = 'sdd.state';\n\n/** Single shared SDD session state for the process lifetime. */\nexport class SDDState {\n private builder: AISpecBuilder | null = null;\n private taskStore: DefaultTaskStore | null = null;\n private taskTracker: TaskTracker | null = null;\n private taskGraphId: string | null = null;\n private sessionStartTime: number = Date.now();\n private phaseStartTime: number = Date.now();\n private versioning: SpecVersioning | null = null;\n\n getBuilder(): AISpecBuilder | null {\n return this.builder;\n }\n setBuilder(b: AISpecBuilder | null) {\n this.builder = b;\n }\n getTaskStore(): DefaultTaskStore | null {\n return this.taskStore;\n }\n setTaskStore(s: DefaultTaskStore | null) {\n this.taskStore = s;\n }\n getTaskTracker(): TaskTracker | null {\n return this.taskTracker;\n }\n setTaskTracker(t: TaskTracker | null) {\n this.taskTracker = t;\n }\n getTaskGraphId(): string | null {\n return this.taskGraphId;\n }\n setTaskGraphId(id: string | null) {\n this.taskGraphId = id;\n }\n getSessionStartTime(): number {\n return this.sessionStartTime;\n }\n setSessionStartTime(t: number) {\n this.sessionStartTime = t;\n }\n setPhaseStartTime(t: number) {\n this.phaseStartTime = t;\n }\n getPhaseStartTime(): number {\n return this.phaseStartTime;\n }\n getSessionElapsed(): number {\n return Date.now() - this.sessionStartTime;\n }\n getPhaseElapsed(): number {\n return Date.now() - this.phaseStartTime;\n }\n getVersioning(): SpecVersioning {\n if (this.versioning === null) this.versioning = new SpecVersioning();\n return this.versioning;\n }\n\n clearTaskState(): void {\n this.taskStore = null;\n this.taskTracker = null;\n this.taskGraphId = null;\n }\n\n getContext(): string | null {\n if (!this.builder) return null;\n const session = this.builder.getSession();\n if (session.phase === 'done') return null;\n return this.builder.getAIPrompt();\n }\n\n getPhase(): AISpecPhase | null {\n return this.builder?.getPhase() ?? null;\n }\n}\n\n/** Process-lifetime singleton \u2014 used when no Context is available (CLI single-session mode). */\nexport const sddState = new SDDState();\n\n/**\n * Get or create the SDD state for the current session.\n * Uses ctx.meta so each concurrent browser/REPL session has isolated state.\n */\nexport function getSessionState(ctx: Context | undefined): SDDState {\n if (!ctx) return sddState;\n let state = ctx.meta[SDD_META_KEY] as SDDState | undefined;\n if (!state) {\n state = new SDDState();\n ctx.meta[SDD_META_KEY] = state;\n }\n return state;\n}\n", "import type { AISpecBuilder, AISpecPhase, SpecIndexEntry, SpecStore } from '@wrongstack/sdd';\n// Shared with the WebUI wizard \u2014 single implementation in @wrongstack/sdd.\nexport { gatherProjectContext } from '@wrongstack/sdd';\nimport { sddState } from './state.js';\n\nexport function getActiveBuilder(): AISpecBuilder | null {\n return sddState.getBuilder();\n}\n\nexport function getActiveSDDContext(): string | null {\n return sddState.getContext();\n}\n\nexport function getActiveSDDPhase(): AISpecPhase | null {\n return sddState.getPhase();\n}\n\nexport async function findSpec(store: SpecStore, idOrTitle: string) {\n if (!idOrTitle) return null;\n const byId = await store.load(idOrTitle);\n if (byId) return byId;\n const all = await store.list();\n const match = all.find(\n (e: SpecIndexEntry) =>\n e.id.startsWith(idOrTitle) || e.title.toLowerCase().includes(idOrTitle.toLowerCase()),\n );\n if (match) return store.load(match.id);\n return null;\n}\n", "import { sddState } from './state.js';\n\n/**\n * Returns true if the text looks like conversational/explanatory output\n * rather than a structured implementation plan.\n */\nexport function isExplanatoryText(text: string): boolean {\n const lower = text.toLowerCase();\n return (\n lower.startsWith(\"i'\") ||\n lower.startsWith('i will') ||\n lower.startsWith('let me') ||\n lower.startsWith(\"here's my\") ||\n lower.startsWith('here is my') ||\n lower.startsWith(\"i'm going to\") ||\n lower.startsWith('first, let me') ||\n lower.startsWith('sure') ||\n lower.startsWith('of course') ||\n lower.startsWith('okay') ||\n lower.startsWith('ok,') ||\n lower.startsWith('sounds good') ||\n lower.startsWith('no problem') ||\n (text.split('\\n').length < 3 && !text.includes('.'))\n );\n}\n\n/**\n * Parse a spec from AI output text and save it to the active session.\n * Returns true if a spec was found and saved.\n */\nexport async function trySaveSpecFromAIOutput(aiOutput: string): Promise<boolean> {\n const builder = sddState.getBuilder();\n if (!builder) return false;\n const spec = builder.tryParseSpecFromOutput(aiOutput);\n if (!spec) return false;\n builder.setSpec(spec);\n return true;\n}\n\n/**\n * Try to save implementation plan from AI output during implementation phase.\n * Returns true if a plan was saved.\n */\nexport function trySaveImplementationPlan(aiOutput: string): boolean {\n const builder = sddState.getBuilder();\n if (!builder) return false;\n const session = builder.getSession();\n if (session.phase !== 'implementation') return false;\n\n const current = session.implementation ?? '';\n\n const jsonMatch = aiOutput.match(/```json\\s*\\[/);\n if (jsonMatch?.index && jsonMatch.index > 0) {\n const plan = aiOutput.substring(0, jsonMatch.index).trim();\n if (plan.length > 50 && plan !== current && !isExplanatoryText(plan)) {\n builder.setImplementation(plan);\n return true;\n }\n }\n\n if (\n aiOutput.length > 100 &&\n !aiOutput.includes('```json') &&\n aiOutput !== current &&\n !isExplanatoryText(aiOutput)\n ) {\n builder.setImplementation(aiOutput.trim());\n return true;\n }\n\n return false;\n}\n\n/**\n * Auto-detect task completion patterns in AI output and mark tasks.\n * Returns the number of tasks marked as completed.\n */\nexport function autoDetectTaskCompletion(aiOutput: string): number {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return 0;\n const pending = tracker.getAllNodes({ status: ['pending', 'in_progress'] });\n if (pending.length === 0) return 0;\n\n let completed = 0;\n const lines = aiOutput.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n const sddDoneMatch = trimmed.match(/\\/sdd\\s+done\\s+(.+)/i);\n if (sddDoneMatch?.[1]) {\n const target = sddDoneMatch[1].trim();\n const num = Number(target);\n if (!Number.isNaN(num) && num >= 1 && num <= pending.length) {\n const node = pending[num - 1];\n if (node && node.status !== 'completed') {\n tracker.updateNodeStatus(node.id, 'completed');\n completed++;\n }\n } else {\n const match = pending.find(\n (n) =>\n n.title.toLowerCase().includes(target.toLowerCase()) ||\n target.toLowerCase().includes(n.title.toLowerCase()),\n );\n if (match && match.status !== 'completed') {\n tracker.updateNodeStatus(match.id, 'completed');\n completed++;\n }\n }\n continue;\n }\n\n const checkmarkMatch = trimmed.match(/^\u2705\\s*(?:Task:\\s*)?(.+)/i);\n if (checkmarkMatch?.[1]) {\n const title = checkmarkMatch[1].trim();\n const match = pending.find(\n (n) =>\n n.title.toLowerCase().includes(title.toLowerCase()) ||\n title.toLowerCase().includes(n.title.toLowerCase()),\n );\n if (match && match.status !== 'completed') {\n tracker.updateNodeStatus(match.id, 'completed');\n completed++;\n }\n continue;\n }\n\n const taskNumMatch = trimmed.match(/Task\\s+(\\d+)\\s*[:]\\s*(?:complete|done|finished)/i);\n if (taskNumMatch?.[1]) {\n const num = Number(taskNumMatch[1]);\n if (num >= 1 && num <= pending.length) {\n const node = pending[num - 1];\n if (node && node.status !== 'completed') {\n tracker.updateNodeStatus(node.id, 'completed');\n completed++;\n }\n }\n continue;\n }\n\n const completedMatch = trimmed.match(/^(?:Completed|Done|Finished)\\s*[:]\\s*(.+)/i);\n if (completedMatch?.[1]) {\n const title = completedMatch[1].trim();\n const match = pending.find(\n (n) =>\n n.title.toLowerCase().includes(title.toLowerCase()) ||\n title.toLowerCase().includes(n.title.toLowerCase()),\n );\n if (match && match.status !== 'completed') {\n tracker.updateNodeStatus(match.id, 'completed');\n completed++;\n }\n }\n }\n\n return completed;\n}\n", "import { expectDefined } from '@wrongstack/core/utils';\nimport type { TaskProgress } from '@wrongstack/core/types';\nimport { DefaultTaskStore, renderProgress, TaskTracker } from '@wrongstack/sdd';\nimport { sddState } from './state.js';\n\nexport type { TaskProgress };\nexport { renderProgress };\n\n/**\n * Format elapsed milliseconds as a human-readable string.\n */\nexport function formatElapsed(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n const remS = s % 60;\n if (m < 60) return remS > 0 ? `${m}m ${remS}s` : `${m}m`;\n const h = Math.floor(m / 60);\n const remM = m % 60;\n return `${h}h ${remM}m`;\n}\n\nfunction addTaskToTracker(tracker: TaskTracker, task: Record<string, unknown>): void {\n tracker.addNode({\n title: String(task.title),\n description: String(task.description ?? ''),\n type: (['feature', 'bugfix', 'refactor', 'docs', 'test', 'chore'].includes(String(task.type))\n ? String(task.type)\n : 'feature') as 'feature' | 'bugfix' | 'refactor' | 'docs' | 'test' | 'chore',\n priority: (['critical', 'high', 'medium', 'low'].includes(String(task.priority))\n ? String(task.priority)\n : 'medium') as 'critical' | 'high' | 'medium' | 'low',\n status: 'pending',\n estimateHours: Number(task.estimateHours) || 2,\n tags: Array.isArray(task.tags) ? task.tags.map(String) : [],\n });\n}\n\nexport async function trySaveTasksFromAIOutput(aiOutput: string): Promise<boolean> {\n const builder = sddState.getBuilder();\n if (!builder) return false;\n const session = builder.getSession();\n if (!session.spec) return false;\n\n const json = builder.extractJSONArray(aiOutput);\n if (!json) return false;\n\n let tasks: Array<Record<string, unknown>>;\n try {\n tasks = JSON.parse(json);\n } catch {\n return false;\n }\n if (!Array.isArray(tasks) || tasks.length === 0) return false;\n\n const validTasks = tasks.filter(\n (t) => t && typeof t === 'object' && typeof t.title === 'string' && t.title.length > 0,\n );\n if (validTasks.length === 0) return false;\n\n const existingTracker = sddState.getTaskTracker();\n if (existingTracker) {\n for (const task of validTasks) addTaskToTracker(existingTracker, task);\n return true;\n }\n\n const store = new DefaultTaskStore();\n const tracker = new TaskTracker({ store });\n const graph = await tracker.createGraph(session.spec.id, session.spec.title);\n for (const task of validTasks) addTaskToTracker(tracker, task);\n sddState.setTaskStore(store);\n sddState.setTaskTracker(tracker);\n sddState.setTaskGraphId(graph.id);\n // Fire-and-forget save is unsafe here \u2014 `setTaskGraphId` is awaited precisely\n // because the next mutation or caller's own `await saveSession()` must not\n // race a stale fire-and-forget rename that silently reverts the persisted\n // taskGraphId. The awaited save ensures the persisted snapshot matches\n // sddState.setTaskGraphId before this function returns.\n await builder.setTaskGraphId(graph.id);\n return true;\n}\n\nexport function getTaskProgress(): TaskProgress | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n return tracker.getProgress();\n}\n\nexport function getCurrentTask(): {\n id: string;\n title: string;\n description: string;\n priority: string;\n estimateHours: number;\n tags: string[];\n startedAt: number | undefined;\n} | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n const nodes = tracker.getAllNodes({ status: ['in_progress'] });\n if (nodes.length === 0) return null;\n const n = expectDefined(nodes[0]);\n return {\n id: n.id,\n title: n.title,\n description: n.description,\n priority: n.priority,\n estimateHours: n.estimateHours ?? 0,\n tags: n.tags ?? [],\n startedAt: n.startedAt,\n };\n}\n\nexport function advanceToNextTask(): boolean {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return false;\n const pending = tracker.getAllNodes({ status: ['pending'] });\n for (const n of pending) {\n if (tracker.canStart(n.id)) {\n tracker.updateNodeStatus(n.id, 'in_progress');\n return true;\n }\n }\n return false;\n}\n\nexport function getTaskListText(): string | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n const nodes = tracker.getAllNodes();\n if (nodes.length === 0) return null;\n return nodes\n .map((n, i) => {\n const status = n.status === 'completed' ? '\u2705' : n.status === 'in_progress' ? '\uD83D\uDD04' : '\u23F3';\n return `${i + 1}. ${status} [${n.priority}] ${n.title}`;\n })\n .join('\\n');\n}\n\nexport function renderTaskListWithProgress(): string | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n const nodes = tracker.getAllNodes();\n if (nodes.length === 0) return null;\n\n const progress = tracker.getProgress();\n const phase = sddState.getPhase();\n const phaseLabel: Record<string, string> = {\n questioning: '\u2753 Questioning',\n spec_review: '\uD83D\uDCCB Spec Review',\n implementation: '\uD83C\uDFD7\uFE0F Implementation',\n task_review: '\uD83D\uDCDD Task Review',\n executing: '\u26A1 Executing',\n done: '\u2705 Done',\n };\n const lines = [\n `**${phaseLabel[phase ?? ''] ?? phase} \u2014 Task Status**`,\n '',\n renderProgress(progress),\n '',\n ];\n\n const sorted = [...nodes].sort((a, b) => {\n const order: Record<string, number> = {\n in_progress: 0,\n pending: 1,\n review: 2,\n blocked: 3,\n failed: 4,\n completed: 5,\n };\n return (order[a.status] ?? 6) - (order[b.status] ?? 6);\n });\n for (let i = 0; i < sorted.length; i++) {\n const n = expectDefined(sorted[i]);\n const status =\n n.status === 'completed'\n ? '\u2705'\n : n.status === 'in_progress'\n ? '\uD83D\uDD04'\n : n.status === 'failed'\n ? '\u274C'\n : n.status === 'blocked'\n ? '\uD83D\uDEAB'\n : n.status === 'review'\n ? '\uD83D\uDC41'\n : '\u23F3';\n const title = n.title.length > 50 ? n.title.slice(0, 49) + '\u2026' : n.title;\n let elapsed = '';\n if (n.status === 'in_progress' && n.startedAt)\n elapsed = ` \u00B7 ${formatElapsed(Date.now() - n.startedAt)}`;\n lines.push(`${i + 1}. ${status} ${title}${elapsed}`);\n }\n return lines.join('\\n');\n}\n\nexport function getCurrentExecutingContext(): string | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n const nodes = tracker.getAllNodes({ status: ['in_progress'] });\n if (nodes.length === 0) return null;\n const n = expectDefined(nodes[0]);\n const elapsed = n.startedAt ? ` \u00B7 elapsed: ${formatElapsed(Date.now() - n.startedAt)}` : '';\n const progress = tracker.getProgress();\n return [\n `**NOW EXECUTING:** \"${n.title}\"${elapsed}`,\n `Description: ${n.description.split('\\n')[0] ?? '(none)'}`,\n `Priority: ${n.priority} \u00B7 Est: ${n.estimateHours ?? 0}h \u00B7 Tags: ${(n.tags ?? []).join(', ') || 'none'}`,\n `Progress: ${progress.completed}/${progress.total} tasks (${progress.percentComplete}%)`,\n ].join('\\n');\n}\n\n/**\n * Resolve a `/sdd done|skip|fail|review <N|title>` argument to a single task\n * node. Tries a 1-based index into the given (already filtered/sorted) node\n * list first, then a bidirectional case-insensitive title-substring match.\n * Centralizes the matching the four mutation subcommands used to duplicate.\n */\nexport function matchTaskNode<T extends { id: string; title: string }>(\n nodes: T[],\n query: string,\n): T | null {\n const trimmed = query.trim();\n if (!trimmed) return null;\n const num = Number(trimmed);\n if (!Number.isNaN(num) && num >= 1 && num <= nodes.length) {\n return nodes[num - 1] ?? null;\n }\n const q = trimmed.toLowerCase();\n return (\n nodes.find((n) => n.title.toLowerCase().includes(q) || q.includes(n.title.toLowerCase())) ??\n null\n );\n}\n\nexport function markTaskCompleted(taskTitle: string): boolean {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return false;\n const nodes = tracker.getAllNodes({ status: ['pending', 'in_progress'] });\n const match = nodes.find(\n (n) =>\n n.title.toLowerCase().includes(taskTitle.toLowerCase()) ||\n taskTitle.toLowerCase().includes(n.title.toLowerCase()),\n );\n if (!match) return false;\n tracker.updateNodeStatus(match.id, 'completed');\n return true;\n}\n\nexport function getTaskGraphId(): string | null {\n return sddState.getTaskGraphId();\n}\nexport function getTaskTrackerExport(): TaskTracker | null {\n return sddState.getTaskTracker();\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,13 @@
1
+
2
+ // src/profile-config-path.ts
3
+ function activeProfileName(config) {
4
+ return typeof config.activeProfile === "string" && config.activeProfile.trim() ? config.activeProfile : "default";
5
+ }
6
+ function activeProfileConfigPath(paths, config) {
7
+ return paths.profileConfig(activeProfileName(config));
8
+ }
9
+
10
+ export {
11
+ activeProfileConfigPath
12
+ };
13
+ //# sourceMappingURL=chunk-DPJZQCVP.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/profile-config-path.ts"],
4
+ "sourcesContent": ["import type { Config } from '@wrongstack/core/types';\nimport type { WstackPaths } from '@wrongstack/core/utils';\n\n/** Resolve the selected profile without ever treating the root bootstrap as settings. */\nexport function activeProfileName(config: Pick<Config, 'activeProfile'>): string {\n return typeof config.activeProfile === 'string' && config.activeProfile.trim()\n ? config.activeProfile\n : 'default';\n}\n\n/** Canonical settings file for the currently selected profile. */\nexport function activeProfileConfigPath(\n paths: Pick<WstackPaths, 'profileConfig'>,\n config: Pick<Config, 'activeProfile'>,\n): string {\n return paths.profileConfig(activeProfileName(config));\n}\n"],
5
+ "mappings": ";;;AAIO,SAAS,kBAAkB,QAA+C;AAC/E,SAAO,OAAO,OAAO,kBAAkB,YAAY,OAAO,cAAc,KAAK,IACzE,OAAO,gBACP;AACN;AAGO,SAAS,wBACd,OACA,QACQ;AACR,SAAO,MAAM,cAAc,kBAAkB,MAAM,CAAC;AACtD;",
6
+ "names": []
7
+ }