@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,547 @@
1
+ import {
2
+ parseTokenTtlValue
3
+ } from "./chunk-BGFM3PD7.js";
4
+ import {
5
+ resolveAuditActor
6
+ } from "./chunk-Q5GTM25S.js";
7
+ import "./chunk-7OCVIDC7.js";
8
+
9
+ // src/subcommands/handlers/hq.ts
10
+ import { HQ_AUTH_FILE_VERSION, HQ_CLI_DEFAULT_HOST, mutateHqAuthFile, mintHqToken, readHqAuthFile, resolveHqDataDir, logHqAuthAudit, hqAuthContentHash, hqAuthAuditPath, hqAuthFilePath } from "@wrongstack/core/hq";
11
+ import { HqInsecureExposureError } from "@wrongstack/core/hq";
12
+ import { expectDefined } from "@wrongstack/core/utils";
13
+ import * as fs from "node:fs/promises";
14
+ function resolveDataDir(deps) {
15
+ const override = typeof deps.flags?.["data-dir"] === "string" ? deps.flags["data-dir"] : void 0;
16
+ return resolveHqDataDir(override);
17
+ }
18
+ var hqCmd = async (args, deps) => {
19
+ const sub = args[0];
20
+ if (!sub || sub === "serve") {
21
+ return startServer(deps);
22
+ }
23
+ if (sub === "token") {
24
+ return hqTokenCmd(args.slice(1), deps);
25
+ }
26
+ if (sub === "audit") {
27
+ return hqAuditCmd(args.slice(1), deps);
28
+ }
29
+ if (sub === "help" || sub === "--help") {
30
+ printHelp(deps);
31
+ return 0;
32
+ }
33
+ deps.renderer.writeError(`Unknown hq subcommand: ${sub}
34
+ `);
35
+ printHelp(deps);
36
+ return 1;
37
+ };
38
+ async function startServer(deps) {
39
+ const { startHqServer } = await import("./hq-server-6AQ3BXZA.js");
40
+ const dataDir = resolveDataDir(deps);
41
+ const flags = deps.flags ?? {};
42
+ const host = typeof flags["host"] === "string" ? flags["host"] : HQ_CLI_DEFAULT_HOST;
43
+ const port = typeof flags["port"] === "string" ? Number.parseInt(flags["port"], 10) : 3499;
44
+ const strictPort = flags["strict-port"] === true;
45
+ const open = flags["open"] === true;
46
+ const password = typeof flags["password"] === "string" ? flags["password"] : process.env.WRONGSTACK_HQ_PASSWORD;
47
+ const allowInsecureOpen = flags["insecure-open"] === true;
48
+ const rawTtl = typeof flags["hq-token-ttl"] === "string" ? flags["hq-token-ttl"] : void 0;
49
+ let tokenTtlMs;
50
+ if (rawTtl !== void 0 && rawTtl.length > 0) {
51
+ const parsed = parseTokenTtlValue(rawTtl);
52
+ if (parsed.error) {
53
+ deps.renderer.writeError(`Invalid --hq-token-ttl: ${parsed.error}
54
+ `);
55
+ return 1;
56
+ }
57
+ tokenTtlMs = parsed.value;
58
+ }
59
+ if (password !== void 0 && password.length < 8) {
60
+ deps.renderer.writeError("HQ password must be at least 8 characters.\n");
61
+ return 1;
62
+ }
63
+ let handle;
64
+ try {
65
+ handle = await startHqServer({
66
+ host,
67
+ port,
68
+ strictPort,
69
+ dataDir,
70
+ allowInsecureOpen,
71
+ ...password !== void 0 ? { password } : {},
72
+ ...tokenTtlMs !== void 0 ? { tokenTtlMs } : {}
73
+ });
74
+ } catch (err) {
75
+ if (err instanceof HqInsecureExposureError) {
76
+ deps.renderer.writeError(`${err.message}
77
+ `);
78
+ return 1;
79
+ }
80
+ throw err;
81
+ }
82
+ if (open) {
83
+ try {
84
+ const { openBrowser } = await import("@wrongstack/webui-server");
85
+ openBrowser(handle.firstRunSetup?.browserUrl ?? `http://${handle.host}:${handle.port}`);
86
+ } catch {
87
+ }
88
+ }
89
+ writeStartupInfo(deps, handle);
90
+ await new Promise((resolve) => {
91
+ const shutdown = async () => {
92
+ try {
93
+ await handle.close();
94
+ } catch (err) {
95
+ deps.renderer.write(`HQ server close error: ${String(err)}
96
+ `);
97
+ }
98
+ resolve();
99
+ };
100
+ process.on("SIGINT", shutdown);
101
+ process.on("SIGTERM", shutdown);
102
+ });
103
+ return 0;
104
+ }
105
+ function writeStartupInfo(deps, handle) {
106
+ deps.renderer.write(`WrongStack HQ listening on http://${handle.host}:${handle.port}
107
+ `);
108
+ if (!handle.firstRunSetup) {
109
+ deps.renderer.write(`Client endpoint: ws://${handle.host}:${handle.port}/ws/client
110
+ `);
111
+ deps.renderer.write(`Browser endpoint: http://${handle.host}:${handle.port}
112
+ `);
113
+ return;
114
+ }
115
+ deps.renderer.write(`Browser endpoint: ${handle.firstRunSetup.browserUrl}
116
+ `);
117
+ deps.renderer.write(`Client endpoint: ${handle.firstRunSetup.clientUrl}
118
+ `);
119
+ deps.renderer.write(
120
+ handle.firstRunSetup.createdAuth ? `
121
+ First-run HQ auth created in ${handle.firstRunSetup.dataDir}
122
+ ` : `
123
+ HQ auth loaded from ${handle.firstRunSetup.dataDir}
124
+ `
125
+ );
126
+ deps.renderer.write(`Start clients with:
127
+ `);
128
+ deps.renderer.write(` WRONGSTACK_HQ_URL=${handle.firstRunSetup.clientEnv.WRONGSTACK_HQ_URL}
129
+ `);
130
+ if (handle.firstRunSetup.clientEnv.WRONGSTACK_HQ_TOKEN) {
131
+ deps.renderer.write(
132
+ ` WRONGSTACK_HQ_TOKEN=${handle.firstRunSetup.clientEnv.WRONGSTACK_HQ_TOKEN}
133
+ `
134
+ );
135
+ }
136
+ }
137
+ async function hqTokenCmd(args, deps) {
138
+ const action = args[0];
139
+ if (action === "create") {
140
+ return tokenCreate(args.slice(1), deps);
141
+ }
142
+ if (action === "list" || action === "ls" || !action) {
143
+ return tokenList(args.slice(1), deps);
144
+ }
145
+ if (action === "revoke" || action === "rm" || action === "remove") {
146
+ return tokenRevoke(args.slice(1), deps);
147
+ }
148
+ deps.renderer.writeError(`Unknown hq token subcommand: ${action ?? "(none)"}
149
+ `);
150
+ deps.renderer.write("Usage: wstack hq token <create|list|revoke>\n");
151
+ return 1;
152
+ }
153
+ async function hqAuditCmd(args, deps) {
154
+ const action = args[0];
155
+ if (action === "verify" || action === void 0) {
156
+ return hqAuditVerify(deps);
157
+ }
158
+ deps.renderer.writeError(`Unknown hq audit subcommand: ${action ?? "(none)"}
159
+ `);
160
+ deps.renderer.write("Usage: wstack hq audit <verify>\n");
161
+ return 1;
162
+ }
163
+ async function hqAuditVerify(deps) {
164
+ const dataDir = resolveDataDir(deps);
165
+ const authPath = hqAuthFilePath(dataDir);
166
+ const auditPath = hqAuthAuditPath(dataDir);
167
+ deps.renderer.write(`auth file: ${authPath}
168
+ `);
169
+ deps.renderer.write(`audit log: ${auditPath}
170
+ `);
171
+ const fileExists = await fileExistsQuiet(authPath);
172
+ if (!fileExists) {
173
+ deps.renderer.write(
174
+ `contentHash: (unavailable \u2014 auth.json does not exist)
175
+ `
176
+ );
177
+ deps.renderer.write(
178
+ `Compare historical entries in the audit log above against a known-good hash.
179
+ `
180
+ );
181
+ return 1;
182
+ }
183
+ const authFile = await readHqAuthFile(dataDir, {
184
+ warn: (msg) => deps.renderer.writeWarning(`${msg}
185
+ `)
186
+ });
187
+ const hash = hqAuthContentHash(authFile);
188
+ if (hash === void 0) {
189
+ deps.renderer.write(
190
+ `contentHash: (unavailable \u2014 auth.json is unreadable or malformed)
191
+ `
192
+ );
193
+ deps.renderer.write(
194
+ `Compare historical entries in the audit log above against a known-good hash.
195
+ `
196
+ );
197
+ return 1;
198
+ }
199
+ deps.renderer.write(`contentHash: ${hash}
200
+ `);
201
+ deps.renderer.write("\n");
202
+ deps.renderer.write(
203
+ `Compare this value against the 'contentHash' field of entries in the audit log.
204
+ `
205
+ );
206
+ deps.renderer.write(
207
+ `A match means the redacted projection of auth.json is identical to when that
208
+ `
209
+ );
210
+ deps.renderer.write(
211
+ `entry was emitted (secrets may differ \u2014 only the non-secret shape is hashed).
212
+ `
213
+ );
214
+ return 0;
215
+ }
216
+ async function fileExistsQuiet(filePath) {
217
+ try {
218
+ await fs.access(filePath);
219
+ return true;
220
+ } catch {
221
+ return false;
222
+ }
223
+ }
224
+ async function computeAuditHashField(dataDir, warn) {
225
+ const persisted = await readHqAuthFile(dataDir, { warn });
226
+ const hash = hqAuthContentHash(persisted);
227
+ return hash !== void 0 ? { contentHash: hash } : {};
228
+ }
229
+ var TOKEN_CAPABILITIES = {
230
+ browser: ["control.enqueue"],
231
+ client: ["telemetry.publish", "control.execute"]
232
+ };
233
+ var DEFAULT_TOKEN_CAPABILITIES = {
234
+ browser: ["control.enqueue"],
235
+ client: ["telemetry.publish"]
236
+ };
237
+ function resolveTokenScope(args, deps) {
238
+ return deps.flags?.["client"] === true || deps.flags?.["c"] === true || args.some((a) => a === "--client" || a === "-c") ? "client" : "browser";
239
+ }
240
+ function tokenPositionals(args) {
241
+ const result = [];
242
+ for (let i = 0; i < args.length; i++) {
243
+ const arg = args[i];
244
+ if (!arg) continue;
245
+ if (arg === "--client" || arg === "-c" || arg.startsWith("--capabilities=")) continue;
246
+ if (arg === "--capabilities") {
247
+ i += 1;
248
+ continue;
249
+ }
250
+ if (arg === "--ttl") {
251
+ i += 1;
252
+ continue;
253
+ }
254
+ if (arg.startsWith("--ttl=")) continue;
255
+ if (!arg.startsWith("-")) result.push(arg);
256
+ }
257
+ return result;
258
+ }
259
+ function readCapabilitiesFlag(args, deps) {
260
+ const parsed = deps.flags?.["capabilities"];
261
+ if (parsed !== void 0) return parsed;
262
+ const inline = args.find((arg) => arg.startsWith("--capabilities="));
263
+ if (inline) return inline.slice("--capabilities=".length);
264
+ const index = args.indexOf("--capabilities");
265
+ return index >= 0 ? args[index + 1] ?? true : void 0;
266
+ }
267
+ function resolveTokenCapabilities(scope, args, deps) {
268
+ const raw = readCapabilitiesFlag(args, deps);
269
+ if (raw === void 0) return { capabilities: [...DEFAULT_TOKEN_CAPABILITIES[scope]] };
270
+ if (typeof raw !== "string") {
271
+ return { error: "--capabilities requires a comma-separated value." };
272
+ }
273
+ const capabilities = [...new Set(raw.split(",").map((item) => item.trim()).filter(Boolean))];
274
+ const allowed = new Set(TOKEN_CAPABILITIES[scope]);
275
+ const invalid = capabilities.filter((capability) => !allowed.has(capability));
276
+ if (invalid.length > 0) {
277
+ return {
278
+ error: `Invalid ${scope} token capabilities: ${invalid.join(", ")}. Allowed: ${[...allowed].join(", ")}.`
279
+ };
280
+ }
281
+ return { capabilities };
282
+ }
283
+ async function tokenCreate(args, deps) {
284
+ const scope = resolveTokenScope(args, deps);
285
+ const resolvedCapabilities = resolveTokenCapabilities(scope, args, deps);
286
+ if (resolvedCapabilities.error) {
287
+ deps.renderer.writeError(`${resolvedCapabilities.error}
288
+ `);
289
+ return 1;
290
+ }
291
+ const ttlMs = resolveTokenTtl(args, deps);
292
+ if (ttlMs?.error) {
293
+ deps.renderer.writeError(`${ttlMs.error}
294
+ `);
295
+ return 1;
296
+ }
297
+ const pos = tokenPositionals(args);
298
+ const label = pos[0];
299
+ const dataDir = resolveDataDir(deps);
300
+ const tokenField = scope === "client" ? "clientTokens" : "browserTokens";
301
+ try {
302
+ const next = await mutateHqAuthFile(
303
+ dataDir,
304
+ (current) => {
305
+ const tokens = current[tokenField] ?? [];
306
+ const newToken = {
307
+ ...mintHqToken({ label, ttlMs: ttlMs?.value }),
308
+ capabilities: resolvedCapabilities.capabilities
309
+ };
310
+ return {
311
+ ...current,
312
+ [tokenField]: [...tokens, newToken]
313
+ };
314
+ },
315
+ { warn: (msg) => deps.renderer.writeWarning(`${msg}
316
+ `) }
317
+ );
318
+ const list = next[tokenField] ?? [];
319
+ const token = expectDefined(list[list.length - 1]);
320
+ const hashField = await computeAuditHashField(
321
+ dataDir,
322
+ (msg) => deps.renderer.writeWarning(`${msg}
323
+ `)
324
+ );
325
+ logHqAuthAudit(
326
+ dataDir,
327
+ {
328
+ kind: "create",
329
+ scope,
330
+ tokenId: token.id,
331
+ ...token.label ? { label: token.label } : {},
332
+ ...token.capabilities ? { capabilities: token.capabilities } : {},
333
+ ...token.expiresAt ? { expiresAt: token.expiresAt } : {},
334
+ actor: resolveAuditActor(),
335
+ ...hashField
336
+ },
337
+ {
338
+ onError: (err) => deps.renderer.writeWarning(`(audit write failed: ${err.message})
339
+ `)
340
+ }
341
+ );
342
+ const endpoint = scope === "client" ? "/ws/client" : "/ws/browser";
343
+ deps.renderer.write(`Created ${scope} token.
344
+ `);
345
+ deps.renderer.write(` id: ${token.id}
346
+ `);
347
+ if (token.label) deps.renderer.write(` label: ${token.label}
348
+ `);
349
+ deps.renderer.write(` capabilities: ${(token.capabilities ?? []).join(", ") || "(none)"}
350
+ `);
351
+ deps.renderer.write(` token: ${token.token}
352
+ `);
353
+ deps.renderer.write(` createdAt: ${token.createdAt}
354
+ `);
355
+ if (token.expiresAt) deps.renderer.write(` expiresAt: ${token.expiresAt}
356
+ `);
357
+ deps.renderer.write(`
358
+ `);
359
+ deps.renderer.write(`Connect with: ws://localhost:3499${endpoint}?token=${token.token}
360
+ `);
361
+ deps.renderer.write(`(Copy the token now \u2014 it will not be shown again in full.)
362
+ `);
363
+ return 0;
364
+ } catch (err) {
365
+ deps.renderer.writeError(`Failed to write auth.json: ${err.message}
366
+ `);
367
+ return 1;
368
+ }
369
+ }
370
+ function resolveTokenTtl(args, deps) {
371
+ const flagValue = deps.flags?.["ttl"];
372
+ if (typeof flagValue === "string" && flagValue.length > 0) {
373
+ return parseTokenTtlValue(flagValue);
374
+ }
375
+ const inline = args.find((a) => a?.startsWith("--ttl="));
376
+ if (inline) {
377
+ return parseTokenTtlValue(inline.slice("--ttl=".length));
378
+ }
379
+ const idx = args.indexOf("--ttl");
380
+ if (idx >= 0) {
381
+ const raw = args[idx + 1];
382
+ if (raw === void 0 || raw.startsWith("-")) {
383
+ return { error: "--ttl requires a value (e.g. --ttl 1h, --ttl 7d, --ttl 3600s)" };
384
+ }
385
+ return parseTokenTtlValue(raw);
386
+ }
387
+ return {};
388
+ }
389
+ async function tokenList(args, deps) {
390
+ const scope = resolveTokenScope(args, deps);
391
+ const dataDir = resolveDataDir(deps);
392
+ const tokenField = scope === "client" ? "clientTokens" : "browserTokens";
393
+ const authFile = await readHqAuthFile(dataDir, {
394
+ warn: (msg) => deps.renderer.writeWarning(`${msg}
395
+ `)
396
+ });
397
+ const tokens = authFile[tokenField] ?? [];
398
+ if (tokens.length === 0) {
399
+ deps.renderer.write(`No ${scope} tokens issued. ${scope === "browser" ? "Browsers" : "Clients"} are in OPEN MODE.
400
+ `);
401
+ deps.renderer.write(`Run \`wstack hq token create ${scope === "client" ? "--client " : ""}[label]\` to enter TOKEN MODE.
402
+ `);
403
+ return 0;
404
+ }
405
+ deps.renderer.write(`${scope === "client" ? "Client" : "Browser"} tokens (${tokens.length}) \u2014 TOKEN MODE:
406
+ `);
407
+ deps.renderer.write("\n");
408
+ for (const t of tokens) {
409
+ const masked = `${t.token.slice(0, 6)}\u2026${t.token.slice(-4)} (${t.token.length} chars)`;
410
+ const capabilities = t.capabilities === void 0 ? "legacy-unscoped" : t.capabilities.join(",") || "none";
411
+ const expires = t.expiresAt ?? "(never)";
412
+ deps.renderer.write(` ${t.id} ${masked} ${t.createdAt} expires ${expires}${t.label ? ` "${t.label}"` : ""} [${capabilities}]${t.lastUsedAt ? ` lastUsed ${t.lastUsedAt}` : ""}
413
+ `);
414
+ }
415
+ deps.renderer.write("\n");
416
+ deps.renderer.write(`${scope === "client" ? "Clients" : "Browsers"} must append ?token=<full-token> to /ws/${scope}.
417
+ `);
418
+ return 0;
419
+ }
420
+ async function tokenRevoke(args, deps) {
421
+ const scope = resolveTokenScope(args, deps);
422
+ const pos = tokenPositionals(args);
423
+ const idPrefix = pos[0];
424
+ if (!idPrefix) {
425
+ deps.renderer.writeError(`Usage: wstack hq token revoke ${scope === "client" ? "--client " : ""}<id-prefix>
426
+ `);
427
+ return 1;
428
+ }
429
+ const dataDir = resolveDataDir(deps);
430
+ const tokenField = scope === "client" ? "clientTokens" : "browserTokens";
431
+ let revoked;
432
+ try {
433
+ await mutateHqAuthFile(
434
+ dataDir,
435
+ (current) => {
436
+ const tokens = current[tokenField] ?? [];
437
+ const matches = tokens.filter((t) => t.id.startsWith(idPrefix));
438
+ if (matches.length === 0) {
439
+ revoked = void 0;
440
+ return current;
441
+ }
442
+ if (matches.length > 1) {
443
+ revoked = matches[0];
444
+ return current;
445
+ }
446
+ revoked = matches[0];
447
+ return {
448
+ ...current,
449
+ [tokenField]: tokens.filter((t) => t.id !== revoked.id)
450
+ };
451
+ },
452
+ { warn: (msg) => deps.renderer.writeWarning(`${msg}
453
+ `) }
454
+ );
455
+ } catch (err) {
456
+ deps.renderer.writeError(`Failed to write auth.json: ${err.message}
457
+ `);
458
+ return 1;
459
+ }
460
+ if (!revoked) {
461
+ deps.renderer.writeError(`No ${scope} token found matching id-prefix "${idPrefix}".
462
+ `);
463
+ return 1;
464
+ }
465
+ deps.renderer.write(`Revoked ${scope} token ${revoked.id}${revoked.label ? ` ("${revoked.label}")` : ""}.
466
+ `);
467
+ const hashField = await computeAuditHashField(
468
+ dataDir,
469
+ (msg) => deps.renderer.writeWarning(`${msg}
470
+ `)
471
+ );
472
+ logHqAuthAudit(
473
+ dataDir,
474
+ {
475
+ kind: "revoke",
476
+ scope,
477
+ tokenId: revoked.id,
478
+ ...revoked.label ? { label: revoked.label } : {},
479
+ ...revoked.capabilities ? { capabilities: revoked.capabilities } : {},
480
+ actor: resolveAuditActor(),
481
+ ...hashField
482
+ },
483
+ {
484
+ onError: (err) => deps.renderer.writeWarning(`(audit write failed: ${err.message})
485
+ `)
486
+ }
487
+ );
488
+ return 0;
489
+ }
490
+ function printHelp(deps) {
491
+ deps.renderer.write(`Usage: wstack hq <serve | token | audit>
492
+ `);
493
+ deps.renderer.write("\n");
494
+ deps.renderer.write(` wstack hq Start the HQ command center server.
495
+ `);
496
+ deps.renderer.write(` wstack hq serve Same as above (explicit form).
497
+ `);
498
+ deps.renderer.write(` wstack hq token create [label] [--ttl <dur>] Mint a browser token, enter token mode.
499
+ `);
500
+ deps.renderer.write(` wstack hq token create --client [label] [--ttl <dur>] Mint a client token (/ws/client).
501
+ `);
502
+ deps.renderer.write(` wstack hq token list List issued browser tokens.
503
+ `);
504
+ deps.renderer.write(` wstack hq token list --client List issued client tokens.
505
+ `);
506
+ deps.renderer.write(` wstack hq token revoke <id> Revoke a browser token (id prefix match).
507
+ `);
508
+ deps.renderer.write(` wstack hq token revoke --client <id> Revoke a client token.
509
+ `);
510
+ deps.renderer.write(` wstack hq audit verify Re-derive auth.json contentHash for forensic comparison.
511
+ `);
512
+ deps.renderer.write("\n");
513
+ deps.renderer.write(`Flags (apply to all subcommands):
514
+ `);
515
+ deps.renderer.write(` --data-dir <path> Override HQ data directory (default ~/.wrongstack/hq).
516
+ `);
517
+ deps.renderer.write(` --host <ip> Bind host (default 0.0.0.0; use 127.0.0.1 for local-only).
518
+ `);
519
+ deps.renderer.write(` --tunnel Publish a temporary *.trycloudflare.com URL (requires cloudflared).
520
+ `);
521
+ deps.renderer.write(` --password <value> Set or rotate the browser login password.
522
+ `);
523
+ deps.renderer.write(` --insecure-open Allow a non-loopback bind with no token/password set.
524
+ `);
525
+ deps.renderer.write(` --port <n> Bind port (default 3499).
526
+ `);
527
+ deps.renderer.write(` --strict-port Fail if port is in use.
528
+ `);
529
+ deps.renderer.write(` --hq-token-ttl <dur> Stamp an expiresAt on first-run tokens (e.g. 1h, 7d, 3600s).
530
+ `);
531
+ deps.renderer.write(` --open Open the dashboard in the default browser.
532
+ `);
533
+ deps.renderer.write(` --client, -c Operate on client tokens instead of browser tokens.
534
+ `);
535
+ deps.renderer.write(` --capabilities <csv> Token grants (browser: control.enqueue; client: telemetry.publish,control.execute).
536
+ `);
537
+ deps.renderer.write(` --ttl <duration> Stamp an expiresAt on the token (e.g. --ttl 1h, --ttl 7d, --ttl 3600s).
538
+ `);
539
+ deps.renderer.write("\n");
540
+ deps.renderer.write(`auth.json schema version: ${HQ_AUTH_FILE_VERSION}.
541
+ `);
542
+ }
543
+ export {
544
+ hqCmd,
545
+ resolveAuditActor
546
+ };
547
+ //# sourceMappingURL=hq-JUYKUNJX.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/subcommands/handlers/hq.ts"],
4
+ "sourcesContent": ["/**\n * `wstack hq` subcommand group \u2014 HQ command center lifecycle + browser\n * token management.\n *\n * Subcommand tree:\n * wstack hq \u2192 start HQ server (alias for `wstack --hq`)\n * wstack hq serve \u2192 start HQ server (explicit form)\n * wstack hq token create [label] [--ttl <duration>] \u2192 mint a browser token, write auth.json\n * wstack hq token create --client [label] [--ttl <duration>] \u2192 mint a client token (/ws/client)\n * wstack hq token list \u2192 list issued browser tokens\n * wstack hq token list --client \u2192 list issued client tokens\n * wstack hq token revoke <id> \u2192 revoke a browser token (prefix match)\n * wstack hq token revoke --client <id> \u2192 revoke a client token\n *\n * All subcommands accept `--data-dir <path>` to override the HQ data\n * directory (default `~/.wrongstack/hq`, honors `WRONGSTACK_HOME` /\n * `WRONGSTACK_HQ_DATA_DIR`).\n *\n * @module subcommands/handlers/hq\n */\nimport { HQ_AUTH_FILE_VERSION, HQ_CLI_DEFAULT_HOST, mutateHqAuthFile, mintHqToken, readHqAuthFile, resolveHqDataDir, logHqAuthAudit, hqAuthContentHash, hqAuthAuditPath, hqAuthFilePath } from '@wrongstack/core/hq';\nimport { HqInsecureExposureError, type HqToken } from '@wrongstack/core/hq';\nimport { expectDefined } from '@wrongstack/core/utils';\nimport type { HqServerHandle } from '../../hq-server.js';\nimport { resolveAuditActor } from '../../hq-server/audit-actor.js';\nimport type { SubcommandDeps, SubcommandHandler } from '../index.js';\nimport * as fs from 'node:fs/promises';\n\nexport { resolveAuditActor } from '../../hq-server/audit-actor.js';\n\n/**\n * Build a free-form actor string for the auth audit log. Combines the OS\n * username (best-effort) with the hostname so an operator reviewing the\n * log can see \"who minted this token\" without parsing environment\n * variables. Never includes the token string.\n *\n * Shared by the `wstack hq token` create/revoke handlers and by\n * `startHqServer`'s first-run bootstrap so every audit entry point\n * produces the same actor shape.\n */\nfunction resolveDataDir(deps: SubcommandDeps): string {\n const override = typeof deps.flags?.['data-dir'] === 'string' ? deps.flags['data-dir'] : undefined;\n return resolveHqDataDir(override);\n}\n\nexport const hqCmd: SubcommandHandler = async (args, deps) => {\n const sub = args[0];\n\n // `wstack hq` and `wstack hq serve` start the server.\n if (!sub || sub === 'serve') {\n return startServer(deps);\n }\n\n if (sub === 'token') {\n return hqTokenCmd(args.slice(1), deps);\n }\n\n if (sub === 'audit') {\n return hqAuditCmd(args.slice(1), deps);\n }\n\n if (sub === 'help' || sub === '--help') {\n printHelp(deps);\n return 0;\n }\n\n deps.renderer.writeError(`Unknown hq subcommand: ${sub}\\n`);\n printHelp(deps);\n return 1;\n};\n\nasync function startServer(deps: SubcommandDeps): Promise<number> {\n const { startHqServer } = await import('../../hq-server.js');\n const dataDir = resolveDataDir(deps);\n const flags = deps.flags ?? {};\n const host = typeof flags['host'] === 'string' ? flags['host'] : HQ_CLI_DEFAULT_HOST;\n const port = typeof flags['port'] === 'string' ? Number.parseInt(flags['port'], 10) : 3499;\n const strictPort = flags['strict-port'] === true;\n const open = flags['open'] === true;\n const password =\n typeof flags['password'] === 'string' ? flags['password'] : process.env.WRONGSTACK_HQ_PASSWORD;\n const allowInsecureOpen = flags['insecure-open'] === true;\n const rawTtl = typeof flags['hq-token-ttl'] === 'string' ? flags['hq-token-ttl'] : undefined;\n let tokenTtlMs: number | undefined;\n if (rawTtl !== undefined && rawTtl.length > 0) {\n const parsed = parseTtlValue(rawTtl);\n if (parsed.error) {\n deps.renderer.writeError(`Invalid --hq-token-ttl: ${parsed.error}\\n`);\n return 1;\n }\n tokenTtlMs = parsed.value;\n }\n\n if (password !== undefined && password.length < 8) {\n deps.renderer.writeError('HQ password must be at least 8 characters.\\n');\n return 1;\n }\n\n let handle: HqServerHandle;\n try {\n handle = await startHqServer({\n host,\n port,\n strictPort,\n dataDir,\n allowInsecureOpen,\n ...(password !== undefined ? { password } : {}),\n ...(tokenTtlMs !== undefined ? { tokenTtlMs } : {}),\n });\n } catch (err) {\n // A refusal is operator-actionable guidance, not a crash \u2014 print the\n // remedies rather than a stack trace.\n if (err instanceof HqInsecureExposureError) {\n deps.renderer.writeError(`${err.message}\\n`);\n return 1;\n }\n throw err;\n }\n\n if (open) {\n try {\n const { openBrowser } = await import('@wrongstack/webui-server');\n openBrowser(handle.firstRunSetup?.browserUrl ?? `http://${handle.host}:${handle.port}`);\n } catch {\n // best-effort\n }\n }\n\n writeStartupInfo(deps, handle);\n\n // Keep the process alive until SIGINT/SIGTERM\n await new Promise<void>((resolve) => {\n const shutdown = async () => {\n try {\n await handle.close();\n } catch (err) {\n deps.renderer.write(`HQ server close error: ${String(err)}\\n`);\n }\n resolve();\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n });\n return 0;\n}\n\nfunction writeStartupInfo(deps: SubcommandDeps, handle: HqServerHandle): void {\n deps.renderer.write(`WrongStack HQ listening on http://${handle.host}:${handle.port}\\n`);\n if (!handle.firstRunSetup) {\n deps.renderer.write(`Client endpoint: ws://${handle.host}:${handle.port}/ws/client\\n`);\n deps.renderer.write(`Browser endpoint: http://${handle.host}:${handle.port}\\n`);\n return;\n }\n\n deps.renderer.write(`Browser endpoint: ${handle.firstRunSetup.browserUrl}\\n`);\n deps.renderer.write(`Client endpoint: ${handle.firstRunSetup.clientUrl}\\n`);\n deps.renderer.write(\n handle.firstRunSetup.createdAuth\n ? `\\nFirst-run HQ auth created in ${handle.firstRunSetup.dataDir}\\n`\n : `\\nHQ auth loaded from ${handle.firstRunSetup.dataDir}\\n`,\n );\n deps.renderer.write(`Start clients with:\\n`);\n deps.renderer.write(` WRONGSTACK_HQ_URL=${handle.firstRunSetup.clientEnv.WRONGSTACK_HQ_URL}\\n`);\n if (handle.firstRunSetup.clientEnv.WRONGSTACK_HQ_TOKEN) {\n deps.renderer.write(\n ` WRONGSTACK_HQ_TOKEN=${handle.firstRunSetup.clientEnv.WRONGSTACK_HQ_TOKEN}\\n`,\n );\n }\n}\n\nasync function hqTokenCmd(args: string[], deps: SubcommandDeps): Promise<number> {\n const action = args[0];\n\n if (action === 'create') {\n return tokenCreate(args.slice(1), deps);\n }\n if (action === 'list' || action === 'ls' || !action) {\n return tokenList(args.slice(1), deps);\n }\n if (action === 'revoke' || action === 'rm' || action === 'remove') {\n return tokenRevoke(args.slice(1), deps);\n }\n\n deps.renderer.writeError(`Unknown hq token subcommand: ${action ?? '(none)'}\\n`);\n deps.renderer.write('Usage: wstack hq token <create|list|revoke>\\n');\n return 1;\n}\n\n/**\n * `wstack hq audit verify` \u2014 re-derive the contentHash from the current\n * on-disk `auth.json` and print it so an operator can compare against a\n * `contentHash` field in an audit entry. This closes the forensic\n * tie-back loop without requiring the operator to write a script: copy\n * the hash from the audit log, run this command, eyeball (or `diff`)\n * the two values.\n *\n * Prints:\n * - the resolved `auth.json` path (so the operator knows which file\n * was hashed)\n * - the SHA-256 contentHash, or `(unavailable)` if the file is\n * missing/unreadable\n * - the `auth-audit.jsonl` path (so the operator knows where to look\n * for entries to compare against)\n *\n * Exit codes:\n * 0 \u2014 hash computed and printed\n * 1 \u2014 `auth.json` missing or unreadable (hash unavailable); the\n * audit-log path is still printed so the operator can inspect\n * historical entries\n */\nasync function hqAuditCmd(args: string[], deps: SubcommandDeps): Promise<number> {\n const action = args[0];\n\n if (action === 'verify' || action === undefined) {\n return hqAuditVerify(deps);\n }\n\n deps.renderer.writeError(`Unknown hq audit subcommand: ${action ?? '(none)'}\\n`);\n deps.renderer.write('Usage: wstack hq audit <verify>\\n');\n return 1;\n}\n\nasync function hqAuditVerify(deps: SubcommandDeps): Promise<number> {\n const dataDir = resolveDataDir(deps);\n const authPath = hqAuthFilePath(dataDir);\n const auditPath = hqAuthAuditPath(dataDir);\n\n deps.renderer.write(`auth file: ${authPath}\\n`);\n deps.renderer.write(`audit log: ${auditPath}\\n`);\n\n // readHqAuthFile returns a synthetic default when auth.json is missing\n // (it doesn't throw), so hqAuthContentHash would still produce a hash\n // over that default \u2014 which is misleading: no audit entry corresponds\n // to a file that isn't on disk. Check existence directly so the\n // operator gets an honest \"unavailable\" when there's nothing to hash.\n const fileExists = await fileExistsQuiet(authPath);\n if (!fileExists) {\n deps.renderer.write(\n `contentHash: (unavailable \u2014 auth.json does not exist)\\n`,\n );\n deps.renderer.write(\n `Compare historical entries in the audit log above against a known-good hash.\\n`,\n );\n return 1;\n }\n\n const authFile = await readHqAuthFile(dataDir, {\n warn: (msg) => deps.renderer.writeWarning(`${msg}\\n`),\n });\n\n const hash = hqAuthContentHash(authFile);\n if (hash === undefined) {\n deps.renderer.write(\n `contentHash: (unavailable \u2014 auth.json is unreadable or malformed)\\n`,\n );\n deps.renderer.write(\n `Compare historical entries in the audit log above against a known-good hash.\\n`,\n );\n return 1;\n }\n\n deps.renderer.write(`contentHash: ${hash}\\n`);\n deps.renderer.write('\\n');\n deps.renderer.write(\n `Compare this value against the 'contentHash' field of entries in the audit log.\\n`,\n );\n deps.renderer.write(\n `A match means the redacted projection of auth.json is identical to when that\\n`,\n );\n deps.renderer.write(\n `entry was emitted (secrets may differ \u2014 only the non-secret shape is hashed).\\n`,\n );\n return 0;\n}\n\nasync function fileExistsQuiet(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Re-read the persisted `auth.json` and return a conditional\n * `contentHash` field for embedding in an audit entry. This closes the\n * forensic tie-back loop: an operator reviewing `auth-audit.jsonl` can\n * compare the `contentHash` against the current on-disk file via\n * `wstack hq audit verify`.\n *\n * Re-reads rather than hashing the in-memory post-mutation snapshot\n * because `writeHqAuthFile` re-stamps `updatedAt` on the persisted\n * payload \u2014 hashing the in-memory `next` would diverge from what\n * `verify` computes. Matches the pattern established by the `first-run`\n * and `expired-prune` emitters in `auth-store.ts` / `hq-server.ts`.\n *\n * Returns `{}` (no `contentHash` key) when the file is unreadable, so\n * the audit entry still records the event without a tie-back \u2014 the\n * absence itself is meaningful. Conditional spread preserves\n * `exactOptionalPropertyTypes`.\n */\nasync function computeAuditHashField(\n dataDir: string,\n warn: (msg: string) => void,\n): Promise<{ contentHash?: string }> {\n const persisted = await readHqAuthFile(dataDir, { warn });\n const hash = hqAuthContentHash(persisted);\n return hash !== undefined ? { contentHash: hash } : {};\n}\n\n/**\n * Token scope: `browser` (validated on `/ws/browser`) or `client`\n * (validated on `/ws/client`). Defaults to `browser` for backward\n * compatibility with Phase 3.\n */\ntype TokenScope = 'browser' | 'client';\n\nconst TOKEN_CAPABILITIES: Record<TokenScope, readonly string[]> = {\n browser: ['control.enqueue'],\n client: ['telemetry.publish', 'control.execute'],\n};\n\nconst DEFAULT_TOKEN_CAPABILITIES: Record<TokenScope, readonly string[]> = {\n browser: ['control.enqueue'],\n client: ['telemetry.publish'],\n};\n\n/** Detect `--client` / `-c`, including flags already consumed by parseArgs(). */\nfunction resolveTokenScope(args: string[], deps: SubcommandDeps): TokenScope {\n return deps.flags?.['client'] === true ||\n deps.flags?.['c'] === true ||\n args.some((a) => a === '--client' || a === '-c')\n ? 'client'\n : 'browser';\n}\n\n/** Strip token flags and their values from direct-handler args. */\nfunction tokenPositionals(args: string[]): string[] {\n const result: string[] = [];\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (!arg) continue;\n if (arg === '--client' || arg === '-c' || arg.startsWith('--capabilities=')) continue;\n if (arg === '--capabilities') {\n i += 1;\n continue;\n }\n // Skip --ttl and its value (both bare `--ttl 1h` and inline `--ttl=1h`).\n if (arg === '--ttl') {\n i += 1;\n continue;\n }\n if (arg.startsWith('--ttl=')) continue;\n if (!arg.startsWith('-')) result.push(arg);\n }\n return result;\n}\n\nfunction readCapabilitiesFlag(args: string[], deps: SubcommandDeps): string | boolean | undefined {\n const parsed = deps.flags?.['capabilities'];\n if (parsed !== undefined) return parsed;\n const inline = args.find((arg) => arg.startsWith('--capabilities='));\n if (inline) return inline.slice('--capabilities='.length);\n const index = args.indexOf('--capabilities');\n return index >= 0 ? args[index + 1] ?? true : undefined;\n}\n\nfunction resolveTokenCapabilities(\n scope: TokenScope,\n args: string[],\n deps: SubcommandDeps,\n): { capabilities?: string[]; error?: string } {\n const raw = readCapabilitiesFlag(args, deps);\n if (raw === undefined) return { capabilities: [...DEFAULT_TOKEN_CAPABILITIES[scope]] };\n if (typeof raw !== 'string') {\n return { error: '--capabilities requires a comma-separated value.' };\n }\n\n const capabilities = [...new Set(raw.split(',').map((item) => item.trim()).filter(Boolean))];\n const allowed = new Set(TOKEN_CAPABILITIES[scope]);\n const invalid = capabilities.filter((capability) => !allowed.has(capability));\n if (invalid.length > 0) {\n return {\n error: `Invalid ${scope} token capabilities: ${invalid.join(', ')}. Allowed: ${[...allowed].join(', ')}.`,\n };\n }\n return { capabilities };\n}\n\nasync function tokenCreate(args: string[], deps: SubcommandDeps): Promise<number> {\n const scope = resolveTokenScope(args, deps);\n const resolvedCapabilities = resolveTokenCapabilities(scope, args, deps);\n if (resolvedCapabilities.error) {\n deps.renderer.writeError(`${resolvedCapabilities.error}\\n`);\n return 1;\n }\n const ttlMs = resolveTokenTtl(args, deps);\n if (ttlMs?.error) {\n deps.renderer.writeError(`${ttlMs.error}\\n`);\n return 1;\n }\n const pos = tokenPositionals(args);\n const label = pos[0]; // first positional is the label\n const dataDir = resolveDataDir(deps);\n const tokenField = scope === 'client' ? 'clientTokens' : 'browserTokens';\n\n try {\n const next = await mutateHqAuthFile(\n dataDir,\n (current) => {\n const tokens = current[tokenField] ?? [];\n const newToken = {\n ...mintHqToken({ label, ttlMs: ttlMs?.value }),\n capabilities: resolvedCapabilities.capabilities,\n };\n return {\n ...current,\n [tokenField]: [...tokens, newToken],\n };\n },\n { warn: (msg) => deps.renderer.writeWarning(`${msg}\\n`) },\n );\n const list = next[tokenField] ?? [];\n const token = expectDefined(list[list.length - 1]);\n const hashField = await computeAuditHashField(dataDir, (msg) =>\n deps.renderer.writeWarning(`${msg}\\n`),\n );\n logHqAuthAudit(\n dataDir,\n {\n kind: 'create',\n scope,\n tokenId: token.id,\n ...(token.label ? { label: token.label } : {}),\n ...(token.capabilities ? { capabilities: token.capabilities } : {}),\n ...(token.expiresAt ? { expiresAt: token.expiresAt } : {}),\n actor: resolveAuditActor(),\n ...hashField,\n },\n {\n onError: (err) =>\n deps.renderer.writeWarning(`(audit write failed: ${err.message})\\n`),\n },\n );\n const endpoint = scope === 'client' ? '/ws/client' : '/ws/browser';\n deps.renderer.write(`Created ${scope} token.\\n`);\n deps.renderer.write(` id: ${token.id}\\n`);\n if (token.label) deps.renderer.write(` label: ${token.label}\\n`);\n deps.renderer.write(` capabilities: ${(token.capabilities ?? []).join(', ') || '(none)'}\\n`);\n deps.renderer.write(` token: ${token.token}\\n`);\n deps.renderer.write(` createdAt: ${token.createdAt}\\n`);\n if (token.expiresAt) deps.renderer.write(` expiresAt: ${token.expiresAt}\\n`);\n deps.renderer.write(`\\n`);\n deps.renderer.write(`Connect with: ws://localhost:3499${endpoint}?token=${token.token}\\n`);\n deps.renderer.write(`(Copy the token now \u2014 it will not be shown again in full.)\\n`);\n return 0;\n } catch (err) {\n deps.renderer.writeError(`Failed to write auth.json: ${(err as Error).message}\\n`);\n return 1;\n }\n}\n\n// \u2500\u2500 --ttl parsing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// Delegates to the shared `parseTokenTtlValue` from utils/hq-ttl.ts so the\n// same syntax (1h, 7d, 3600s, bare ms) is accepted here and in the\n// server-startup `--hq-token-ttl` flag.\n\nimport { parseTokenTtlValue as parseTtlValue } from '../../utils/hq-ttl.js';\n\ninterface ResolvedTtl {\n value?: number | undefined;\n error?: string | undefined;\n}\n\nfunction resolveTokenTtl(args: string[], deps: SubcommandDeps): ResolvedTtl {\n // parseArgs may have already lifted `--ttl <value>` into deps.flags.\n const flagValue = deps.flags?.['ttl'];\n if (typeof flagValue === 'string' && flagValue.length > 0) {\n return parseTtlValue(flagValue);\n }\n // Inline `--ttl=1h`.\n const inline = args.find((a) => a?.startsWith('--ttl='));\n if (inline) {\n return parseTtlValue(inline.slice('--ttl='.length));\n }\n // Bare `--ttl <value>` \u2014 scan args manually so we don't depend on parseArgs.\n const idx = args.indexOf('--ttl');\n if (idx >= 0) {\n const raw = args[idx + 1];\n if (raw === undefined || raw.startsWith('-')) {\n return { error: '--ttl requires a value (e.g. --ttl 1h, --ttl 7d, --ttl 3600s)' };\n }\n return parseTtlValue(raw);\n }\n return {};\n}\n\nasync function tokenList(args: string[], deps: SubcommandDeps): Promise<number> {\n const scope = resolveTokenScope(args, deps);\n const dataDir = resolveDataDir(deps);\n const tokenField = scope === 'client' ? 'clientTokens' : 'browserTokens';\n const authFile = await readHqAuthFile(dataDir, {\n warn: (msg) => deps.renderer.writeWarning(`${msg}\\n`),\n });\n const tokens: HqToken[] = authFile[tokenField] ?? [];\n\n if (tokens.length === 0) {\n deps.renderer.write(`No ${scope} tokens issued. ${scope === 'browser' ? 'Browsers' : 'Clients'} are in OPEN MODE.\\n`);\n deps.renderer.write(`Run \\`wstack hq token create ${scope === 'client' ? '--client ' : ''}[label]\\` to enter TOKEN MODE.\\n`);\n return 0;\n }\n\n deps.renderer.write(`${scope === 'client' ? 'Client' : 'Browser'} tokens (${tokens.length}) \u2014 TOKEN MODE:\\n`);\n deps.renderer.write('\\n');\n for (const t of tokens) {\n const masked = `${t.token.slice(0, 6)}\u2026${t.token.slice(-4)} (${t.token.length} chars)`;\n const capabilities = t.capabilities === undefined ? 'legacy-unscoped' : t.capabilities.join(',') || 'none';\n const expires = t.expiresAt ?? '(never)';\n deps.renderer.write(` ${t.id} ${masked} ${t.createdAt} expires ${expires}${t.label ? ` \"${t.label}\"` : ''} [${capabilities}]${t.lastUsedAt ? ` lastUsed ${t.lastUsedAt}` : ''}\\n`);\n }\n deps.renderer.write('\\n');\n deps.renderer.write(`${scope === 'client' ? 'Clients' : 'Browsers'} must append ?token=<full-token> to /ws/${scope}.\\n`);\n return 0;\n}\n\nasync function tokenRevoke(args: string[], deps: SubcommandDeps): Promise<number> {\n const scope = resolveTokenScope(args, deps);\n const pos = tokenPositionals(args);\n const idPrefix = pos[0];\n if (!idPrefix) {\n deps.renderer.writeError(`Usage: wstack hq token revoke ${scope === 'client' ? '--client ' : ''}<id-prefix>\\n`);\n return 1;\n }\n\n const dataDir = resolveDataDir(deps);\n const tokenField = scope === 'client' ? 'clientTokens' : 'browserTokens';\n let revoked: HqToken | undefined;\n try {\n await mutateHqAuthFile(\n dataDir,\n (current) => {\n const tokens = current[tokenField] ?? [];\n // Prefix match: revoke the first token whose id starts with the\n // supplied prefix. The full id is long; users usually paste the\n // first 8 chars.\n const matches = tokens.filter((t) => t.id.startsWith(idPrefix));\n if (matches.length === 0) {\n revoked = undefined;\n return current;\n }\n if (matches.length > 1) {\n revoked = matches[0]; // caller will surface ambiguity below\n return current;\n }\n revoked = matches[0];\n return {\n ...current,\n [tokenField]: tokens.filter((t) => t.id !== (revoked as HqToken).id),\n };\n },\n { warn: (msg) => deps.renderer.writeWarning(`${msg}\\n`) },\n );\n } catch (err) {\n deps.renderer.writeError(`Failed to write auth.json: ${(err as Error).message}\\n`);\n return 1;\n }\n\n if (!revoked) {\n deps.renderer.writeError(`No ${scope} token found matching id-prefix \"${idPrefix}\".\\n`);\n return 1;\n }\n deps.renderer.write(`Revoked ${scope} token ${revoked.id}${revoked.label ? ` (\"${revoked.label}\")` : ''}.\\n`);\n const hashField = await computeAuditHashField(dataDir, (msg) =>\n deps.renderer.writeWarning(`${msg}\\n`),\n );\n logHqAuthAudit(\n dataDir,\n {\n kind: 'revoke',\n scope,\n tokenId: revoked.id,\n ...(revoked.label ? { label: revoked.label } : {}),\n ...(revoked.capabilities ? { capabilities: revoked.capabilities } : {}),\n actor: resolveAuditActor(),\n ...hashField,\n },\n {\n onError: (err) =>\n deps.renderer.writeWarning(`(audit write failed: ${err.message})\\n`),\n },\n );\n return 0;\n}\n\nfunction printHelp(deps: SubcommandDeps): void {\n deps.renderer.write(`Usage: wstack hq <serve | token | audit>\\n`);\n deps.renderer.write('\\n');\n deps.renderer.write(` wstack hq Start the HQ command center server.\\n`);\n deps.renderer.write(` wstack hq serve Same as above (explicit form).\\n`);\n deps.renderer.write(` wstack hq token create [label] [--ttl <dur>] Mint a browser token, enter token mode.\\n`);\n deps.renderer.write(` wstack hq token create --client [label] [--ttl <dur>] Mint a client token (/ws/client).\\n`);\n deps.renderer.write(` wstack hq token list List issued browser tokens.\\n`);\n deps.renderer.write(` wstack hq token list --client List issued client tokens.\\n`);\n deps.renderer.write(` wstack hq token revoke <id> Revoke a browser token (id prefix match).\\n`);\n deps.renderer.write(` wstack hq token revoke --client <id> Revoke a client token.\\n`);\n deps.renderer.write(` wstack hq audit verify Re-derive auth.json contentHash for forensic comparison.\\n`);\n deps.renderer.write('\\n');\n deps.renderer.write(`Flags (apply to all subcommands):\\n`);\n deps.renderer.write(` --data-dir <path> Override HQ data directory (default ~/.wrongstack/hq).\\n`);\n deps.renderer.write(` --host <ip> Bind host (default 0.0.0.0; use 127.0.0.1 for local-only).\\n`);\n deps.renderer.write(` --tunnel Publish a temporary *.trycloudflare.com URL (requires cloudflared).\\n`);\n deps.renderer.write(` --password <value> Set or rotate the browser login password.\\n`);\n deps.renderer.write(` --insecure-open Allow a non-loopback bind with no token/password set.\\n`);\n deps.renderer.write(` --port <n> Bind port (default 3499).\\n`);\n deps.renderer.write(` --strict-port Fail if port is in use.\\n`);\n deps.renderer.write(` --hq-token-ttl <dur> Stamp an expiresAt on first-run tokens (e.g. 1h, 7d, 3600s).\\n`);\n deps.renderer.write(` --open Open the dashboard in the default browser.\\n`);\n deps.renderer.write(` --client, -c Operate on client tokens instead of browser tokens.\\n`);\n deps.renderer.write(` --capabilities <csv> Token grants (browser: control.enqueue; client: telemetry.publish,control.execute).\\n`);\n deps.renderer.write(` --ttl <duration> Stamp an expiresAt on the token (e.g. --ttl 1h, --ttl 7d, --ttl 3600s).\\n`);\n deps.renderer.write('\\n');\n deps.renderer.write(`auth.json schema version: ${HQ_AUTH_FILE_VERSION}.\\n`);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -15,7 +15,7 @@
15
15
  * @module hq-command-controller
16
16
  */
17
17
  import type { HqPublisherCommandResult } from '@wrongstack/core/hq';
18
- import type { GlobalMailbox } from '@wrongstack/core/coordination';
18
+ import type { RemoteMailbox } from '@wrongstack/core/coordination';
19
19
  /**
20
20
  * Mutable holder for the command dispatch targets. Each field is populated
21
21
  * lazily as the corresponding subsystem comes online (director on
@@ -24,7 +24,7 @@ import type { GlobalMailbox } from '@wrongstack/core/coordination';
24
24
  */
25
25
  export interface HqCommandController {
26
26
  /** Project mailbox used to deliver steer/broadcast messages. */
27
- steerMailbox?: GlobalMailbox;
27
+ steerMailbox?: RemoteMailbox | undefined;
28
28
  /** Abort the session leader's running Agent.run(). Returns true if a run was aborted. */
29
29
  interruptLeader: () => boolean;
30
30
  /** Terminate a specific subagent by id. Returns true if terminated. */
@@ -1 +1 @@
1
- {"version":3,"file":"hq-command-controller.d.ts","sourceRoot":"","sources":["../src/hq-command-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAGnE;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,yFAAyF;IACzF,eAAe,EAAE,MAAM,OAAO,CAAC;IAC/B,uEAAuE;IACvE,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,sEAAsE;IACtE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtF,kFAAkF;IAClF,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,0EAA0E;IAC1E,eAAe,EAAE,MAAM,OAAO,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,mBAAmB,GAC9B,CAAC,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAcvG"}
1
+ {"version":3,"file":"hq-command-controller.d.ts","sourceRoot":"","sources":["../src/hq-command-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAGnE;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,YAAY,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IACzC,yFAAyF;IACzF,eAAe,EAAE,MAAM,OAAO,CAAC;IAC/B,uEAAuE;IACvE,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,sEAAsE;IACtE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtF,kFAAkF;IAClF,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,0EAA0E;IAC1E,eAAe,EAAE,MAAM,OAAO,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,mBAAmB,GAC9B,CAAC,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAcvG"}