@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,346 @@
1
+
2
+ // src/config-history.ts
3
+ import { randomUUID } from "node:crypto";
4
+ import * as fs from "node:fs/promises";
5
+ import os from "node:os";
6
+ import * as path from "node:path";
7
+ import { atomicWrite, resolveWstackPaths, writeErr } from "@wrongstack/core/utils";
8
+ import { ERROR_CODES, FsError } from "@wrongstack/core/types";
9
+ import { isSecretField } from "@wrongstack/core/security";
10
+ import { toErrorMessage } from "@wrongstack/core/utils";
11
+ var defaultUidFn = () => os.userInfo().uid;
12
+ async function getFileUid(filePath) {
13
+ try {
14
+ const stat2 = await fs.stat(filePath);
15
+ return stat2.uid;
16
+ } catch {
17
+ return void 0;
18
+ }
19
+ }
20
+ async function checkConfigOwnership(homeFn, uidFn = defaultUidFn, targetConfigPath) {
21
+ if (os.platform() === "win32") return true;
22
+ const cfg = configPath(homeFn, targetConfigPath);
23
+ const fileUid = await getFileUid(cfg);
24
+ if (fileUid === void 0) return true;
25
+ const callerUid = uidFn();
26
+ if (callerUid === void 0) return true;
27
+ return fileUid === callerUid;
28
+ }
29
+ var PROTECTED_BASENAMES = /* @__PURE__ */ new Set(["config.json", ".key", "index.json"]);
30
+ var MAX_CONFIG_BACKUPS = 10;
31
+ var MAX_CONFIG_HISTORY_ENTRIES = 50;
32
+ function assertSafeToDelete(filename, parentDir) {
33
+ if (PROTECTED_BASENAMES.has(filename)) {
34
+ throw new FsError({
35
+ message: `Refusing to delete protected file: ${filename}`,
36
+ code: ERROR_CODES.FS_DELETE_FAILED,
37
+ path: path.join(parentDir, filename),
38
+ context: { reason: "protected_basename" }
39
+ });
40
+ }
41
+ if (filename !== path.basename(filename)) {
42
+ throw new FsError({
43
+ message: `Refusing to delete path with traversal: ${filename}`,
44
+ code: ERROR_CODES.FS_DELETE_FAILED,
45
+ path: filename,
46
+ context: { reason: "path_traversal" }
47
+ });
48
+ }
49
+ if (!filename.startsWith("config.json.") || !filename.endsWith(".bak")) {
50
+ throw new FsError({
51
+ message: `Refusing to delete unknown file: ${filename}`,
52
+ code: ERROR_CODES.FS_DELETE_FAILED,
53
+ path: path.join(parentDir, filename),
54
+ context: { reason: "unknown_file_pattern" }
55
+ });
56
+ }
57
+ const resolvedParent = path.resolve(parentDir);
58
+ const parentOfProfile = path.dirname(resolvedParent);
59
+ const isGlobalRoot = path.basename(resolvedParent) === ".wrongstack";
60
+ const isProfileDir = path.basename(parentOfProfile) === "profiles" && path.basename(path.dirname(parentOfProfile)) === ".wrongstack";
61
+ if (!isGlobalRoot && !isProfileDir) {
62
+ throw new FsError({
63
+ message: `Unexpected parent directory for bak prune: ${resolvedParent}`,
64
+ code: ERROR_CODES.FS_DELETE_FAILED,
65
+ path: resolvedParent,
66
+ context: { reason: "invalid_parent" }
67
+ });
68
+ }
69
+ }
70
+ async function safeDelete(filePath) {
71
+ const dir = path.dirname(filePath);
72
+ const filename = path.basename(filePath);
73
+ try {
74
+ assertSafeToDelete(filename, dir);
75
+ await fs.unlink(filePath);
76
+ } catch (err) {
77
+ if (err instanceof Error && err.message.startsWith("Refusing")) {
78
+ writeErr(`[config-history] SAFETY: ${err.message}
79
+ `);
80
+ }
81
+ }
82
+ }
83
+ function maskConfigSecrets(cfg) {
84
+ if (typeof cfg !== "object" || cfg === null) return {};
85
+ const out = {};
86
+ for (const [k, v] of Object.entries(cfg)) {
87
+ if (isSecretField(k)) {
88
+ out[k] = "[REDACTED]";
89
+ } else if (typeof v === "object" && v !== null && !Array.isArray(v)) {
90
+ out[k] = maskConfigSecrets(v);
91
+ } else {
92
+ out[k] = v;
93
+ }
94
+ }
95
+ return out;
96
+ }
97
+ function diffSummary(oldCfg, newCfg) {
98
+ const changes = [];
99
+ const allKeys = /* @__PURE__ */ new Set([...Object.keys(oldCfg), ...Object.keys(newCfg)]);
100
+ for (const k of allKeys) {
101
+ const o = JSON.stringify(oldCfg[k]);
102
+ const n = JSON.stringify(newCfg[k]);
103
+ if (o !== n) {
104
+ if (isSecretField(k)) {
105
+ changes.push(`${k}: [CHANGED]`);
106
+ } else if (typeof newCfg[k] !== "object") {
107
+ changes.push(`${k}: ${oldCfg[k] ?? "(unset)"} \u2192 ${newCfg[k]}`);
108
+ } else {
109
+ changes.push(`${k}: [CHANGED]`);
110
+ }
111
+ }
112
+ }
113
+ return changes.length > 0 ? changes.slice(0, 5).join(", ") : "no changes";
114
+ }
115
+ var defaultHomeDir = () => os.homedir();
116
+ function activeProfileConfigPath(homeFn) {
117
+ const paths = homeFn === defaultHomeDir ? resolveWstackPaths({ projectRoot: process.cwd() }) : resolveWstackPaths({ projectRoot: process.cwd(), userHome: homeFn() });
118
+ return paths.profileConfig(paths.profileName);
119
+ }
120
+ function historyDir(homeFn = defaultHomeDir, targetConfigPath) {
121
+ return path.join(path.dirname(configPath(homeFn, targetConfigPath)), "config.history", "entries");
122
+ }
123
+ function historyIndexPath(homeFn = defaultHomeDir, targetConfigPath) {
124
+ return path.join(path.dirname(configPath(homeFn, targetConfigPath)), "config.history", "index.json");
125
+ }
126
+ function configPath(homeFn = defaultHomeDir, targetConfigPath) {
127
+ return targetConfigPath ?? activeProfileConfigPath(homeFn);
128
+ }
129
+ function backupLastPath(homeFn = defaultHomeDir, targetConfigPath) {
130
+ return `${configPath(homeFn, targetConfigPath)}.last`;
131
+ }
132
+ function entryId(ts) {
133
+ return `${ts.replace(/[:.]/g, "-")}-${randomUUID().slice(0, 8)}`;
134
+ }
135
+ async function ensureHistoryDir(homeFn = defaultHomeDir, targetConfigPath) {
136
+ try {
137
+ await fs.mkdir(historyDir(homeFn, targetConfigPath), { recursive: true });
138
+ } catch (err) {
139
+ throw new FsError({
140
+ message: toErrorMessage(err),
141
+ code: ERROR_CODES.FS_MKDIR_FAILED,
142
+ path: historyDir(homeFn, targetConfigPath),
143
+ cause: err
144
+ });
145
+ }
146
+ }
147
+ async function readIndex(homeFn = defaultHomeDir, targetConfigPath) {
148
+ try {
149
+ const raw = await fs.readFile(historyIndexPath(homeFn, targetConfigPath), "utf8");
150
+ return JSON.parse(raw);
151
+ } catch {
152
+ return { version: 1, entries: [] };
153
+ }
154
+ }
155
+ async function writeIndex(idx, homeFn = defaultHomeDir, targetConfigPath) {
156
+ await ensureHistoryDir(homeFn, targetConfigPath);
157
+ try {
158
+ await atomicWrite(historyIndexPath(homeFn, targetConfigPath), JSON.stringify(idx, null, 2));
159
+ } catch (err) {
160
+ throw new FsError({
161
+ message: toErrorMessage(err),
162
+ code: ERROR_CODES.FS_ATOMIC_WRITE_FAILED,
163
+ path: historyIndexPath(homeFn, targetConfigPath),
164
+ cause: err
165
+ });
166
+ }
167
+ }
168
+ async function pruneHistoryEntries(idx, homeFn = defaultHomeDir, targetConfigPath) {
169
+ const removed = idx.entries.splice(MAX_CONFIG_HISTORY_ENTRIES);
170
+ const keep = new Set(idx.entries.map((entry) => `${entry.id}.json`));
171
+ const dir = historyDir(homeFn, targetConfigPath);
172
+ for (const entry of removed) {
173
+ try {
174
+ await fs.unlink(path.join(dir, `${entry.id}.json`));
175
+ } catch {
176
+ }
177
+ }
178
+ try {
179
+ const files = await fs.readdir(dir);
180
+ await Promise.all(
181
+ files.filter((file) => file.endsWith(".json") && !keep.has(file)).map(async (file) => {
182
+ try {
183
+ await fs.unlink(path.join(dir, file));
184
+ } catch {
185
+ }
186
+ })
187
+ );
188
+ } catch {
189
+ }
190
+ }
191
+ async function backupCurrent(homeFn = defaultHomeDir, targetConfigPath) {
192
+ const cfg = configPath(homeFn, targetConfigPath);
193
+ const last = backupLastPath(homeFn, targetConfigPath);
194
+ const ts = Date.now();
195
+ let content;
196
+ try {
197
+ content = await fs.readFile(cfg, "utf8");
198
+ } catch {
199
+ }
200
+ if (content !== void 0) {
201
+ try {
202
+ await atomicWrite(last, content);
203
+ } catch (err) {
204
+ writeErr(
205
+ `[config-history] .last backup failed: ${toErrorMessage(err)}`
206
+ );
207
+ }
208
+ }
209
+ if (content !== void 0) {
210
+ try {
211
+ const bakPath = `${cfg}.${ts}.bak`;
212
+ await atomicWrite(bakPath, content);
213
+ } catch (err) {
214
+ writeErr(
215
+ `[config-history] timestamped backup failed: ${toErrorMessage(err)}`
216
+ );
217
+ }
218
+ }
219
+ try {
220
+ const dir = path.dirname(cfg);
221
+ const files = await fs.readdir(dir);
222
+ const baks = files.filter((f) => f.startsWith("config.json.") && f.endsWith(".bak")).sort().reverse();
223
+ for (const f of baks.slice(MAX_CONFIG_BACKUPS)) {
224
+ await safeDelete(path.join(dir, f));
225
+ }
226
+ } catch (err) {
227
+ writeErr(
228
+ `[config-history] backup prune failed: ${toErrorMessage(err)}`
229
+ );
230
+ }
231
+ }
232
+ async function appendHistory(oldCfg, newCfg, description, homeFn = defaultHomeDir, targetConfigPath) {
233
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString();
234
+ const id = entryId(timestamp);
235
+ await ensureHistoryDir(homeFn, targetConfigPath);
236
+ const entry = {
237
+ id,
238
+ timestamp,
239
+ description,
240
+ snapshotMasked: maskConfigSecrets(newCfg),
241
+ diffSummary: diffSummary(oldCfg, newCfg)
242
+ };
243
+ try {
244
+ await fs.writeFile(
245
+ path.join(historyDir(homeFn, targetConfigPath), `${id}.json`),
246
+ JSON.stringify(entry, null, 2),
247
+ "utf8"
248
+ );
249
+ } catch (err) {
250
+ throw new FsError({
251
+ message: toErrorMessage(err),
252
+ code: ERROR_CODES.FS_WRITE_FAILED,
253
+ path: path.join(historyDir(homeFn, targetConfigPath), `${id}.json`),
254
+ cause: err
255
+ });
256
+ }
257
+ const idx = await readIndex(homeFn, targetConfigPath);
258
+ idx.entries.unshift({ id, timestamp, description });
259
+ await pruneHistoryEntries(idx, homeFn, targetConfigPath);
260
+ await writeIndex(idx, homeFn, targetConfigPath);
261
+ return id;
262
+ }
263
+ async function listHistory(homeFn = defaultHomeDir, targetConfigPath) {
264
+ const idx = await readIndex(homeFn, targetConfigPath);
265
+ return idx.entries;
266
+ }
267
+ async function getHistoryEntry(id, homeFn = defaultHomeDir, targetConfigPath) {
268
+ try {
269
+ const raw = await fs.readFile(
270
+ path.join(historyDir(homeFn, targetConfigPath), `${id}.json`),
271
+ "utf8"
272
+ );
273
+ return JSON.parse(raw);
274
+ } catch {
275
+ return null;
276
+ }
277
+ }
278
+ async function restoreFromHistory(id, homeFn = defaultHomeDir, targetConfigPath) {
279
+ const entry = await getHistoryEntry(id, homeFn, targetConfigPath);
280
+ if (!entry) return { ok: false, backupId: null, error: "History entry not found" };
281
+ if (!await checkConfigOwnership(homeFn, defaultUidFn, targetConfigPath)) {
282
+ return {
283
+ ok: false,
284
+ backupId: null,
285
+ error: "Operation denied: config file is not owned by current user"
286
+ };
287
+ }
288
+ await backupCurrent(homeFn, targetConfigPath);
289
+ let oldCfg = {};
290
+ try {
291
+ const raw = await fs.readFile(configPath(homeFn, targetConfigPath), "utf8");
292
+ oldCfg = JSON.parse(raw);
293
+ } catch {
294
+ }
295
+ try {
296
+ await atomicWrite(configPath(homeFn, targetConfigPath), JSON.stringify(entry.snapshotMasked, null, 2));
297
+ } catch (err) {
298
+ return { ok: false, backupId: null, error: String(err) };
299
+ }
300
+ const backupId = await appendHistory(
301
+ oldCfg,
302
+ entry.snapshotMasked,
303
+ `Restored from history ${id}`,
304
+ homeFn,
305
+ targetConfigPath
306
+ );
307
+ return { ok: true, backupId };
308
+ }
309
+ async function restoreLast(homeFn = defaultHomeDir, targetConfigPath) {
310
+ const last = backupLastPath(homeFn, targetConfigPath);
311
+ const cfg = configPath(homeFn, targetConfigPath);
312
+ let oldCfg = {};
313
+ try {
314
+ const raw = await fs.readFile(cfg, "utf8");
315
+ oldCfg = JSON.parse(raw);
316
+ } catch {
317
+ }
318
+ let lastCfg = {};
319
+ try {
320
+ const raw = await fs.readFile(last, "utf8");
321
+ lastCfg = JSON.parse(raw);
322
+ } catch {
323
+ return { ok: false, error: "No prior backup found" };
324
+ }
325
+ if (!await checkConfigOwnership(homeFn, defaultUidFn, targetConfigPath)) {
326
+ return { ok: false, error: "Operation denied: config file is not owned by current user" };
327
+ }
328
+ await backupCurrent(homeFn, targetConfigPath);
329
+ try {
330
+ await atomicWrite(cfg, JSON.stringify(lastCfg, null, 2));
331
+ } catch (err) {
332
+ return { ok: false, error: String(err) };
333
+ }
334
+ await appendHistory(oldCfg, lastCfg, "Restored from config.json.last", homeFn, targetConfigPath);
335
+ return { ok: true };
336
+ }
337
+
338
+ export {
339
+ backupCurrent,
340
+ appendHistory,
341
+ listHistory,
342
+ getHistoryEntry,
343
+ restoreFromHistory,
344
+ restoreLast
345
+ };
346
+ //# sourceMappingURL=chunk-YWUPHRGB.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/config-history.ts"],
4
+ "sourcesContent": ["import { randomUUID } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport os from 'node:os';\nimport * as path from 'node:path';\nimport { atomicWrite, resolveWstackPaths, writeErr } from '@wrongstack/core/utils';\nimport { ERROR_CODES, FsError } from '@wrongstack/core/types';\nimport { isSecretField } from '@wrongstack/core/security';\nimport { toErrorMessage } from '@wrongstack/core/utils';\n\n// \u2500\u2500 UID ownership \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\ntype UidFn = () => string | number | undefined;\nconst defaultUidFn: UidFn = () => os.userInfo().uid;\n\nasync function getFileUid(filePath: string): Promise<string | number | undefined> {\n try {\n const stat = await fs.stat(filePath);\n return stat.uid;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Verify the calling process owns config.json before allowing a write operation.\n * Guards against one user on a shared multi-user system overwriting another's config.\n *\n * On Windows, .uid is always undefined on the UserInfo object, and the NT ACL\n * model already restricts writes \u2014 so we skip the check on win32.\n * On Unix, we compare the process euid against the file's uid.\n * If config.json doesn't exist yet, we allow the write (first-time setup).\n */\nasync function checkConfigOwnership(\n homeFn: HomeDirFn,\n uidFn: UidFn = defaultUidFn,\n targetConfigPath?: string,\n): Promise<boolean> {\n if (os.platform() === 'win32') return true; // ACLs handle this on Windows\n\n const cfg = configPath(homeFn, targetConfigPath);\n const fileUid = await getFileUid(cfg);\n if (fileUid === undefined) return true; // file doesn't exist yet \u2014 allow\n\n const callerUid = uidFn();\n if (callerUid === undefined) return true; // can't determine \u2014 allow, don't block\n\n return fileUid === callerUid;\n}\n\n// \u2500\u2500 Protected files/directories \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// These are NEVER touched by any operation in this module.\n// Guards against bugs (glob patterns, typos, race conditions)\n// accidentally deleting critical user data.\nconst PROTECTED_BASENAMES = new Set(['config.json', '.key', 'index.json']);\nconst MAX_CONFIG_BACKUPS = 10;\nexport const MAX_CONFIG_HISTORY_ENTRIES = 50;\n\n// Top-level directories that should never be deleted even if a prune\n// pattern accidentally widens. These are absolute directory names\n// relative to the .wrongstack root.\n\n/**\n * Guard: throw if `filename` is a protected file or lives inside a protected\n * directory. Used before any unlink / rm call to make accidentally deleting\n * critical files impossible.\n */\nfunction assertSafeToDelete(filename: string, parentDir: string): void {\n // 1. Exact-match protected files\n if (PROTECTED_BASENAMES.has(filename)) {\n throw new FsError({\n message: `Refusing to delete protected file: ${filename}`,\n code: ERROR_CODES.FS_DELETE_FAILED,\n path: path.join(parentDir, filename),\n context: { reason: 'protected_basename' },\n });\n }\n // 2. No path traversal\n if (filename !== path.basename(filename)) {\n throw new FsError({\n message: `Refusing to delete path with traversal: ${filename}`,\n code: ERROR_CODES.FS_DELETE_FAILED,\n path: filename,\n context: { reason: 'path_traversal' },\n });\n }\n // 3. Validate it's a timestamped config backup (config.json.{ts}.bak)\n // before we ever consider deleting it.\n if (!filename.startsWith('config.json.') || !filename.endsWith('.bak')) {\n // Unknown files \u2014 be conservative, refuse\n throw new FsError({\n message: `Refusing to delete unknown file: ${filename}`,\n code: ERROR_CODES.FS_DELETE_FAILED,\n path: path.join(parentDir, filename),\n context: { reason: 'unknown_file_pattern' },\n });\n }\n // 4. Check parent is the .wrongstack root and the target is not a dir\n const resolvedParent = path.resolve(parentDir);\n const parentOfProfile = path.dirname(resolvedParent);\n const isGlobalRoot = path.basename(resolvedParent) === '.wrongstack';\n const isProfileDir =\n path.basename(parentOfProfile) === 'profiles' &&\n path.basename(path.dirname(parentOfProfile)) === '.wrongstack';\n if (!isGlobalRoot && !isProfileDir) {\n throw new FsError({\n message: `Unexpected parent directory for bak prune: ${resolvedParent}`,\n code: ERROR_CODES.FS_DELETE_FAILED,\n path: resolvedParent,\n context: { reason: 'invalid_parent' },\n });\n }\n}\n\n/**\n * Safely delete a file only if it passes safety checks.\n * Never throws \u2014 errors are swallowed (best-effort).\n */\nasync function safeDelete(filePath: string): Promise<void> {\n const dir = path.dirname(filePath);\n const filename = path.basename(filePath);\n try {\n assertSafeToDelete(filename, dir);\n await fs.unlink(filePath);\n } catch (err) {\n // Log but don't crash \u2014 safety check violations are logged for debugging\n if (err instanceof Error && err.message.startsWith('Refusing')) {\n writeErr(`[config-history] SAFETY: ${err.message}\\n`);\n }\n // Best-effort \u2014 ignore other errors (file doesn't exist, etc.)\n }\n}\n\nexport interface HistoryEntry {\n id: string;\n timestamp: string;\n description: string;\n snapshotMasked: Record<string, unknown>;\n diffSummary: string;\n}\n\ninterface HistoryIndex {\n version: 1;\n entries: Array<{ id: string; timestamp: string; description: string }>;\n}\n\nfunction maskConfigSecrets(cfg: Record<string, unknown>): Record<string, unknown> {\n if (typeof cfg !== 'object' || cfg === null) return {};\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(cfg)) {\n if (isSecretField(k)) {\n out[k] = '[REDACTED]';\n } else if (typeof v === 'object' && v !== null && !Array.isArray(v)) {\n out[k] = maskConfigSecrets(v as Record<string, unknown>);\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n\nfunction diffSummary(oldCfg: Record<string, unknown>, newCfg: Record<string, unknown>): string {\n const changes: string[] = [];\n const allKeys = new Set([...Object.keys(oldCfg), ...Object.keys(newCfg)]);\n for (const k of allKeys) {\n const o = JSON.stringify(oldCfg[k]);\n const n = JSON.stringify(newCfg[k]);\n if (o !== n) {\n if (isSecretField(k)) {\n changes.push(`${k}: [CHANGED]`);\n } else if (typeof newCfg[k] !== 'object') {\n changes.push(`${k}: ${oldCfg[k] ?? '(unset)'} \u2192 ${newCfg[k]}`);\n } else {\n changes.push(`${k}: [CHANGED]`);\n }\n }\n }\n return changes.length > 0 ? changes.slice(0, 5).join(', ') : 'no changes';\n}\n\ntype HomeDirFn = () => string;\nconst defaultHomeDir: HomeDirFn = () => os.homedir();\n\nfunction activeProfileConfigPath(homeFn: HomeDirFn): string {\n const paths =\n homeFn === defaultHomeDir\n ? resolveWstackPaths({ projectRoot: process.cwd() })\n : resolveWstackPaths({ projectRoot: process.cwd(), userHome: homeFn() });\n return paths.profileConfig(paths.profileName);\n}\n\nfunction historyDir(homeFn: HomeDirFn = defaultHomeDir, targetConfigPath?: string): string {\n return path.join(path.dirname(configPath(homeFn, targetConfigPath)), 'config.history', 'entries');\n}\n\nfunction historyIndexPath(homeFn: HomeDirFn = defaultHomeDir, targetConfigPath?: string): string {\n return path.join(path.dirname(configPath(homeFn, targetConfigPath)), 'config.history', 'index.json');\n}\n\nfunction configPath(homeFn: HomeDirFn = defaultHomeDir, targetConfigPath?: string): string {\n return targetConfigPath ?? activeProfileConfigPath(homeFn);\n}\n\nfunction backupLastPath(homeFn: HomeDirFn = defaultHomeDir, targetConfigPath?: string): string {\n return `${configPath(homeFn, targetConfigPath)}.last`;\n}\n\nfunction entryId(ts: string): string {\n return `${ts.replace(/[:.]/g, '-')}-${randomUUID().slice(0, 8)}`;\n}\n\nasync function ensureHistoryDir(\n homeFn: HomeDirFn = defaultHomeDir,\n targetConfigPath?: string,\n): Promise<void> {\n try {\n await fs.mkdir(historyDir(homeFn, targetConfigPath), { recursive: true });\n } catch (err) {\n throw new FsError({\n message: toErrorMessage(err),\n code: ERROR_CODES.FS_MKDIR_FAILED,\n path: historyDir(homeFn, targetConfigPath),\n cause: err,\n });\n }\n}\n\nasync function readIndex(\n homeFn: HomeDirFn = defaultHomeDir,\n targetConfigPath?: string,\n): Promise<HistoryIndex> {\n try {\n const raw = await fs.readFile(historyIndexPath(homeFn, targetConfigPath), 'utf8');\n return JSON.parse(raw) as HistoryIndex;\n } catch {\n return { version: 1, entries: [] };\n }\n}\n\nasync function writeIndex(\n idx: HistoryIndex,\n homeFn: HomeDirFn = defaultHomeDir,\n targetConfigPath?: string,\n): Promise<void> {\n await ensureHistoryDir(homeFn, targetConfigPath);\n // atomicWrite: torn write here would wipe the entire config-history\n // index, hiding the user's prior backups behind a \"no history\" UI.\n try {\n await atomicWrite(historyIndexPath(homeFn, targetConfigPath), JSON.stringify(idx, null, 2));\n } catch (err) {\n throw new FsError({\n message: toErrorMessage(err),\n code: ERROR_CODES.FS_ATOMIC_WRITE_FAILED,\n path: historyIndexPath(homeFn, targetConfigPath),\n cause: err,\n });\n }\n}\n\nasync function pruneHistoryEntries(\n idx: HistoryIndex,\n homeFn: HomeDirFn = defaultHomeDir,\n targetConfigPath?: string,\n): Promise<void> {\n const removed = idx.entries.splice(MAX_CONFIG_HISTORY_ENTRIES);\n const keep = new Set(idx.entries.map((entry) => `${entry.id}.json`));\n const dir = historyDir(homeFn, targetConfigPath);\n\n for (const entry of removed) {\n try {\n await fs.unlink(path.join(dir, `${entry.id}.json`));\n } catch {\n // best-effort: stale index entries should not block config writes\n }\n }\n\n try {\n const files = await fs.readdir(dir);\n await Promise.all(\n files\n .filter((file) => file.endsWith('.json') && !keep.has(file))\n .map(async (file) => {\n try {\n await fs.unlink(path.join(dir, file));\n } catch {\n // best-effort: orphan cleanup should not block config writes\n }\n }),\n );\n } catch {\n // best-effort: missing history dir or readdir failure should not block writes\n }\n}\n\n/**\n * Backup current config.json \u2192 config.json.last and timestamped .bak files.\n * Safe to call even if config.json doesn't exist. Never throws.\n *\n * IMPORTANT: config.json and .key are never deleted by this function.\n * Only config.json.*.bak timestamped snapshots are pruned.\n */\nexport async function backupCurrent(\n homeFn: HomeDirFn = defaultHomeDir,\n targetConfigPath?: string,\n): Promise<void> {\n const cfg = configPath(homeFn, targetConfigPath);\n const last = backupLastPath(homeFn, targetConfigPath);\n const ts = Date.now();\n\n // Read existing config content for .last backup\n let content: string | undefined;\n try {\n content = await fs.readFile(cfg, 'utf8');\n } catch {\n // May not exist yet \u2014 that's fine, we just skip the backup\n }\n\n if (content !== undefined) {\n try {\n await atomicWrite(last, content);\n } catch (err) {\n writeErr(\n `[config-history] .last backup failed: ${toErrorMessage(err)}`,\n );\n }\n }\n\n // Create timestamped snapshot\n if (content !== undefined) {\n try {\n const bakPath = `${cfg}.${ts}.bak`;\n await atomicWrite(bakPath, content);\n } catch (err) {\n writeErr(\n `[config-history] timestamped backup failed: ${toErrorMessage(err)}`,\n );\n }\n }\n\n // Prune old .bak files \u2014 keep last 10\n try {\n const dir = path.dirname(cfg);\n const files = await fs.readdir(dir);\n const baks = files\n .filter((f) => f.startsWith('config.json.') && f.endsWith('.bak'))\n .sort()\n .reverse();\n for (const f of baks.slice(MAX_CONFIG_BACKUPS)) {\n await safeDelete(path.join(dir, f));\n }\n } catch (err) {\n writeErr(\n `[config-history] backup prune failed: ${toErrorMessage(err)}`,\n );\n }\n}\n\n/**\n * Append a history entry for a config change.\n */\nexport async function appendHistory(\n oldCfg: Record<string, unknown>,\n newCfg: Record<string, unknown>,\n description: string,\n homeFn: HomeDirFn = defaultHomeDir,\n targetConfigPath?: string,\n): Promise<string> {\n const timestamp = new Date().toISOString();\n const id = entryId(timestamp);\n\n await ensureHistoryDir(homeFn, targetConfigPath);\n\n const entry: HistoryEntry = {\n id,\n timestamp,\n description,\n snapshotMasked: maskConfigSecrets(newCfg) as Record<string, unknown>,\n diffSummary: diffSummary(oldCfg, newCfg),\n };\n\n try {\n await fs.writeFile(\n path.join(historyDir(homeFn, targetConfigPath), `${id}.json`),\n JSON.stringify(entry, null, 2),\n 'utf8',\n );\n } catch (err) {\n throw new FsError({\n message: toErrorMessage(err),\n code: ERROR_CODES.FS_WRITE_FAILED,\n path: path.join(historyDir(homeFn, targetConfigPath), `${id}.json`),\n cause: err,\n });\n }\n\n const idx = await readIndex(homeFn, targetConfigPath);\n idx.entries.unshift({ id, timestamp, description });\n await pruneHistoryEntries(idx, homeFn, targetConfigPath);\n await writeIndex(idx, homeFn, targetConfigPath);\n\n return id;\n}\n\n/**\n * List all history entries (newest first).\n */\nexport async function listHistory(\n homeFn: HomeDirFn = defaultHomeDir,\n targetConfigPath?: string,\n): Promise<HistoryIndex['entries']> {\n const idx = await readIndex(homeFn, targetConfigPath);\n return idx.entries;\n}\n\n/**\n * Get a specific history entry by ID.\n */\nexport async function getHistoryEntry(\n id: string,\n homeFn: HomeDirFn = defaultHomeDir,\n targetConfigPath?: string,\n): Promise<HistoryEntry | null> {\n try {\n const raw = await fs.readFile(\n path.join(historyDir(homeFn, targetConfigPath), `${id}.json`),\n 'utf8',\n );\n return JSON.parse(raw) as HistoryEntry;\n } catch {\n return null;\n }\n}\n\n/**\n * Restore config.json to a given history entry's snapshot.\n */\nexport async function restoreFromHistory(\n id: string,\n homeFn: HomeDirFn = defaultHomeDir,\n targetConfigPath?: string,\n): Promise<{ ok: boolean; backupId: string | null; error?: string | undefined }> {\n const entry = await getHistoryEntry(id, homeFn, targetConfigPath);\n if (!entry) return { ok: false, backupId: null, error: 'History entry not found' };\n\n // Ownership guard \u2014 refuse to write config.json if the calling process\n // does not own the file. Prevents one user on a multi-user system from\n // overwriting another user's config via a shared wrongstack install.\n if (!(await checkConfigOwnership(homeFn, defaultUidFn, targetConfigPath))) {\n return {\n ok: false,\n backupId: null,\n error: 'Operation denied: config file is not owned by current user',\n };\n }\n\n await backupCurrent(homeFn, targetConfigPath);\n\n let oldCfg: Record<string, unknown> = {};\n try {\n const raw = await fs.readFile(configPath(homeFn, targetConfigPath), 'utf8');\n oldCfg = JSON.parse(raw);\n } catch {\n // No config to restore from\n }\n\n try {\n await atomicWrite(configPath(homeFn, targetConfigPath), JSON.stringify(entry.snapshotMasked, null, 2));\n } catch (err) {\n return { ok: false, backupId: null, error: String(err) };\n }\n\n const backupId = await appendHistory(\n oldCfg,\n entry.snapshotMasked as Record<string, unknown>,\n `Restored from history ${id}`,\n homeFn,\n targetConfigPath,\n );\n\n return { ok: true, backupId };\n}\n\n/**\n * Restore config.json to the .last backup.\n */\nexport async function restoreLast(\n homeFn: HomeDirFn = defaultHomeDir,\n targetConfigPath?: string,\n): Promise<{ ok: boolean; error?: string | undefined }> {\n const last = backupLastPath(homeFn, targetConfigPath);\n const cfg = configPath(homeFn, targetConfigPath);\n\n let oldCfg: Record<string, unknown> = {};\n try {\n const raw = await fs.readFile(cfg, 'utf8');\n oldCfg = JSON.parse(raw);\n } catch {\n // Ignore\n }\n\n let lastCfg: Record<string, unknown> = {};\n try {\n const raw = await fs.readFile(last, 'utf8');\n lastCfg = JSON.parse(raw);\n } catch {\n return { ok: false, error: 'No prior backup found' };\n }\n\n // Ownership guard \u2014 refuse to write config.json if the calling process\n // does not own the file. Prevents one user on a multi-user system from\n // overwriting another user's config via a shared wrongstack install.\n if (!(await checkConfigOwnership(homeFn, defaultUidFn, targetConfigPath))) {\n return { ok: false, error: 'Operation denied: config file is not owned by current user' };\n }\n\n await backupCurrent(homeFn, targetConfigPath);\n\n try {\n await atomicWrite(cfg, JSON.stringify(lastCfg, null, 2));\n } catch (err) {\n return { ok: false, error: String(err) };\n }\n\n await appendHistory(oldCfg, lastCfg, 'Restored from config.json.last', homeFn, targetConfigPath);\n\n return { ok: true };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["stat"]
7
+ }