@wrongstack/cli 0.295.1 → 0.296.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/data/providers.json +0 -24
  2. package/dist/acp-A5OSIU2P.js +824 -0
  3. package/dist/acp-A5OSIU2P.js.map +7 -0
  4. package/dist/acp-server-agent.d.ts.map +1 -1
  5. package/dist/arg-parser.d.ts.map +1 -1
  6. package/dist/audit-2ZSFGNIF.js +102 -0
  7. package/dist/audit-2ZSFGNIF.js.map +7 -0
  8. package/dist/auth-CJWQJVRH.js +504 -0
  9. package/dist/auth-CJWQJVRH.js.map +7 -0
  10. package/dist/auth-menu/auth-menu-audit.d.ts +0 -4
  11. package/dist/auth-menu/auth-menu-audit.d.ts.map +1 -1
  12. package/dist/bench-7ZDWSNEF.js +278 -0
  13. package/dist/bench-7ZDWSNEF.js.map +7 -0
  14. package/dist/boot/brain-decision-log.d.ts +7 -5
  15. package/dist/boot/brain-decision-log.d.ts.map +1 -1
  16. package/dist/boot/dispatch-webui.d.ts +5 -8
  17. package/dist/boot/dispatch-webui.d.ts.map +1 -1
  18. package/dist/boot/system-prompt-builder.d.ts +3 -0
  19. package/dist/boot/system-prompt-builder.d.ts.map +1 -1
  20. package/dist/boot/tui-coordinator-callbacks.d.ts +45 -0
  21. package/dist/boot/tui-coordinator-callbacks.d.ts.map +1 -0
  22. package/dist/boot/tui-project-switch.d.ts +2 -3
  23. package/dist/boot/tui-project-switch.d.ts.map +1 -1
  24. package/dist/boot/tui-runtime-state.d.ts +5 -6
  25. package/dist/boot/tui-runtime-state.d.ts.map +1 -1
  26. package/dist/boot/tui-session-resume.d.ts.map +1 -1
  27. package/dist/boot/tui-settings-adapter.d.ts +2 -3
  28. package/dist/boot/tui-settings-adapter.d.ts.map +1 -1
  29. package/dist/boot.d.ts.map +1 -1
  30. package/dist/brain-menu/panel-service.d.ts.map +1 -1
  31. package/dist/chimera-review-task.d.ts +6 -0
  32. package/dist/chimera-review-task.d.ts.map +1 -0
  33. package/dist/chimera-reviewer-policy.d.ts +34 -0
  34. package/dist/chimera-reviewer-policy.d.ts.map +1 -0
  35. package/dist/chronicle-QQEQFSSE.js +256 -0
  36. package/dist/chronicle-QQEQFSSE.js.map +7 -0
  37. package/dist/chunk-5N34EWJR.js +418 -0
  38. package/dist/chunk-5N34EWJR.js.map +7 -0
  39. package/dist/chunk-66T43Q4Y.js +90 -0
  40. package/dist/chunk-66T43Q4Y.js.map +7 -0
  41. package/dist/chunk-7OCVIDC7.js +11 -0
  42. package/dist/chunk-7OCVIDC7.js.map +7 -0
  43. package/dist/chunk-ABXK4VVY.js +84 -0
  44. package/dist/chunk-ABXK4VVY.js.map +7 -0
  45. package/dist/chunk-AXVZMEWG.js +306 -0
  46. package/dist/chunk-AXVZMEWG.js.map +7 -0
  47. package/dist/chunk-AZESNNIC.js +216 -0
  48. package/dist/chunk-AZESNNIC.js.map +7 -0
  49. package/dist/chunk-BGFM3PD7.js +41 -0
  50. package/dist/chunk-BGFM3PD7.js.map +7 -0
  51. package/dist/chunk-BQCAJ7FI.js +425 -0
  52. package/dist/chunk-BQCAJ7FI.js.map +7 -0
  53. package/dist/chunk-DPJZQCVP.js +13 -0
  54. package/dist/chunk-DPJZQCVP.js.map +7 -0
  55. package/dist/chunk-F4PEGAJZ.js +176 -0
  56. package/dist/chunk-F4PEGAJZ.js.map +7 -0
  57. package/dist/chunk-IHBYBYGA.js +443 -0
  58. package/dist/chunk-IHBYBYGA.js.map +7 -0
  59. package/dist/chunk-JBSQ7ONN.js +1023 -0
  60. package/dist/chunk-JBSQ7ONN.js.map +7 -0
  61. package/dist/chunk-JBTFWWKV.js +1325 -0
  62. package/dist/chunk-JBTFWWKV.js.map +7 -0
  63. package/dist/chunk-JUHRI6OV.js +100 -0
  64. package/dist/chunk-JUHRI6OV.js.map +7 -0
  65. package/dist/chunk-OI7GWJDS.js +3303 -0
  66. package/dist/chunk-OI7GWJDS.js.map +7 -0
  67. package/dist/chunk-OP47B3IX.js +142 -0
  68. package/dist/chunk-OP47B3IX.js.map +7 -0
  69. package/dist/chunk-PJHET45A.js +158 -0
  70. package/dist/chunk-PJHET45A.js.map +7 -0
  71. package/dist/chunk-Q5GTM25S.js +17 -0
  72. package/dist/chunk-Q5GTM25S.js.map +7 -0
  73. package/dist/chunk-QD544J2B.js +19 -0
  74. package/dist/chunk-QD544J2B.js.map +7 -0
  75. package/dist/chunk-QUNHS6O3.js +258 -0
  76. package/dist/chunk-QUNHS6O3.js.map +7 -0
  77. package/dist/chunk-TADVX644.js +480 -0
  78. package/dist/chunk-TADVX644.js.map +7 -0
  79. package/dist/chunk-TGDHN4LM.js +81 -0
  80. package/dist/chunk-TGDHN4LM.js.map +7 -0
  81. package/dist/chunk-TYO2OVAD.js +50 -0
  82. package/dist/chunk-TYO2OVAD.js.map +7 -0
  83. package/dist/chunk-VCYZ3WZV.js +14 -0
  84. package/dist/chunk-VCYZ3WZV.js.map +7 -0
  85. package/dist/chunk-VJUEZZYB.js +29 -0
  86. package/dist/chunk-VJUEZZYB.js.map +7 -0
  87. package/dist/chunk-WHOIR577.js +1 -0
  88. package/dist/chunk-WHOIR577.js.map +7 -0
  89. package/dist/chunk-WY7KKOUK.js +460 -0
  90. package/dist/chunk-WY7KKOUK.js.map +7 -0
  91. package/dist/chunk-XJXDOF63.js +28 -0
  92. package/dist/chunk-XJXDOF63.js.map +7 -0
  93. package/dist/chunk-XWEGWYDU.js +560 -0
  94. package/dist/chunk-XWEGWYDU.js.map +7 -0
  95. package/dist/chunk-YWUPHRGB.js +346 -0
  96. package/dist/chunk-YWUPHRGB.js.map +7 -0
  97. package/dist/chunk-Z7YGASQP.js +313 -0
  98. package/dist/chunk-Z7YGASQP.js.map +7 -0
  99. package/dist/cli-entry-main.d.ts +2 -0
  100. package/dist/cli-entry-main.d.ts.map +1 -0
  101. package/dist/cli-entry-point.d.ts +3 -3
  102. package/dist/cli-entry-point.d.ts.map +1 -1
  103. package/dist/cli-main-RTY35OPD.js +29268 -0
  104. package/dist/cli-main-RTY35OPD.js.map +7 -0
  105. package/dist/cli-main-helpers.d.ts +21 -0
  106. package/dist/cli-main-helpers.d.ts.map +1 -0
  107. package/dist/cli-main.d.ts +25 -1
  108. package/dist/cli-main.d.ts.map +1 -1
  109. package/dist/context-limit.d.ts +48 -0
  110. package/dist/context-limit.d.ts.map +1 -1
  111. package/dist/diag-doctor-OQ3AA63O.js +170 -0
  112. package/dist/diag-doctor-OQ3AA63O.js.map +7 -0
  113. package/dist/execute-deps.d.ts +11 -12
  114. package/dist/execute-deps.d.ts.map +1 -1
  115. package/dist/execution-O7I5DYE6.js +4682 -0
  116. package/dist/execution-O7I5DYE6.js.map +7 -0
  117. package/dist/execution-chimera-ask.d.ts +10 -0
  118. package/dist/execution-chimera-ask.d.ts.map +1 -0
  119. package/dist/execution-chimera-cascade.d.ts +15 -0
  120. package/dist/execution-chimera-cascade.d.ts.map +1 -0
  121. package/dist/execution-cleanup.d.ts +23 -0
  122. package/dist/execution-cleanup.d.ts.map +1 -0
  123. package/dist/execution-kanban-dispatch.d.ts +10 -0
  124. package/dist/execution-kanban-dispatch.d.ts.map +1 -0
  125. package/dist/execution-repl-fleet-callbacks.d.ts +11 -0
  126. package/dist/execution-repl-fleet-callbacks.d.ts.map +1 -0
  127. package/dist/execution-storage-observability.d.ts +3 -0
  128. package/dist/execution-storage-observability.d.ts.map +1 -0
  129. package/dist/execution-tui-next-step-callbacks.d.ts +20 -0
  130. package/dist/execution-tui-next-step-callbacks.d.ts.map +1 -0
  131. package/dist/execution.d.ts +2 -139
  132. package/dist/execution.d.ts.map +1 -1
  133. package/dist/export-TPORYVRZ.js +64 -0
  134. package/dist/export-TPORYVRZ.js.map +7 -0
  135. package/dist/fleet/host-acp-runner-cache.d.ts +9 -0
  136. package/dist/fleet/host-acp-runner-cache.d.ts.map +1 -0
  137. package/dist/fleet/host-acp.d.ts +3 -0
  138. package/dist/fleet/host-acp.d.ts.map +1 -0
  139. package/dist/fleet/host-concurrency.d.ts +2 -0
  140. package/dist/fleet/host-concurrency.d.ts.map +1 -0
  141. package/dist/fleet/host-context.d.ts +5 -0
  142. package/dist/fleet/host-context.d.ts.map +1 -0
  143. package/dist/fleet/host-director-builder.d.ts +24 -0
  144. package/dist/fleet/host-director-builder.d.ts.map +1 -0
  145. package/dist/fleet/host-director-event-bridges.d.ts +37 -0
  146. package/dist/fleet/host-director-event-bridges.d.ts.map +1 -0
  147. package/dist/fleet/host-director-services.d.ts +20 -0
  148. package/dist/fleet/host-director-services.d.ts.map +1 -0
  149. package/dist/fleet/host-event-bridge.d.ts +17 -0
  150. package/dist/fleet/host-event-bridge.d.ts.map +1 -0
  151. package/dist/fleet/host-helpers.d.ts +22 -0
  152. package/dist/fleet/host-helpers.d.ts.map +1 -0
  153. package/dist/fleet/host-learning-tracker.d.ts +11 -0
  154. package/dist/fleet/host-learning-tracker.d.ts.map +1 -0
  155. package/dist/fleet/host-learning.d.ts +4 -0
  156. package/dist/fleet/host-learning.d.ts.map +1 -0
  157. package/dist/fleet/host-lifecycle-events.d.ts +4 -0
  158. package/dist/fleet/host-lifecycle-events.d.ts.map +1 -0
  159. package/dist/fleet/host-paths.d.ts +3 -0
  160. package/dist/fleet/host-paths.d.ts.map +1 -0
  161. package/dist/fleet/host-provider.d.ts +22 -0
  162. package/dist/fleet/host-provider.d.ts.map +1 -0
  163. package/dist/fleet/host-session-writer.d.ts +3 -0
  164. package/dist/fleet/host-session-writer.d.ts.map +1 -0
  165. package/dist/fleet/host-shadow-pass.d.ts +21 -0
  166. package/dist/fleet/host-shadow-pass.d.ts.map +1 -0
  167. package/dist/fleet/host-spawn-types.d.ts +25 -0
  168. package/dist/fleet/host-spawn-types.d.ts.map +1 -0
  169. package/dist/fleet/host-status.d.ts +48 -0
  170. package/dist/fleet/host-status.d.ts.map +1 -0
  171. package/dist/fleet/host-subagent-factory.d.ts +16 -0
  172. package/dist/fleet/host-subagent-factory.d.ts.map +1 -0
  173. package/dist/fleet/host-supervisor.d.ts +16 -0
  174. package/dist/fleet/host-supervisor.d.ts.map +1 -0
  175. package/dist/fleet/host-task-result-report.d.ts +11 -0
  176. package/dist/fleet/host-task-result-report.d.ts.map +1 -0
  177. package/dist/fleet/host-types.d.ts +89 -0
  178. package/dist/fleet/host-types.d.ts.map +1 -0
  179. package/dist/fleet/host.d.ts +10 -357
  180. package/dist/fleet/host.d.ts.map +1 -1
  181. package/dist/hq-JUYKUNJX.js +547 -0
  182. package/dist/hq-JUYKUNJX.js.map +7 -0
  183. package/dist/hq-command-controller.d.ts +2 -2
  184. package/dist/hq-command-controller.d.ts.map +1 -1
  185. package/dist/hq-server/auth.d.ts +15 -4
  186. package/dist/hq-server/auth.d.ts.map +1 -1
  187. package/dist/hq-server/project-root.d.ts +5 -0
  188. package/dist/hq-server/project-root.d.ts.map +1 -0
  189. package/dist/hq-server/routes/auth-handlers.d.ts +25 -0
  190. package/dist/hq-server/routes/auth-handlers.d.ts.map +1 -0
  191. package/dist/hq-server/routes/session-handlers.d.ts +8 -0
  192. package/dist/hq-server/routes/session-handlers.d.ts.map +1 -0
  193. package/dist/hq-server/routes.d.ts +8 -6
  194. package/dist/hq-server/routes.d.ts.map +1 -1
  195. package/dist/hq-server/snapshot.d.ts +44 -0
  196. package/dist/hq-server/snapshot.d.ts.map +1 -1
  197. package/dist/hq-server/types.d.ts +22 -4
  198. package/dist/hq-server/types.d.ts.map +1 -1
  199. package/dist/hq-server/utils.d.ts +8 -0
  200. package/dist/hq-server/utils.d.ts.map +1 -1
  201. package/dist/hq-server/ws.d.ts +1 -1
  202. package/dist/hq-server/ws.d.ts.map +1 -1
  203. package/dist/hq-server-6AQ3BXZA.js +39 -0
  204. package/dist/hq-server-6AQ3BXZA.js.map +7 -0
  205. package/dist/hq-server.d.ts +3 -3
  206. package/dist/hq-server.d.ts.map +1 -1
  207. package/dist/hq-ttl-U2FAYFAT.js +8 -0
  208. package/dist/hq-ttl-U2FAYFAT.js.map +7 -0
  209. package/dist/hq-tunnel-RFKGC4HI.js +114 -0
  210. package/dist/hq-tunnel-RFKGC4HI.js.map +7 -0
  211. package/dist/hq-tunnel.d.ts +1 -1
  212. package/dist/hq-tunnel.d.ts.map +1 -1
  213. package/dist/index.d.ts +2 -1
  214. package/dist/index.d.ts.map +1 -1
  215. package/dist/index.js +2503 -53026
  216. package/dist/index.js.map +4 -4
  217. package/dist/init-E2NDDOHI.js +27 -0
  218. package/dist/init-E2NDDOHI.js.map +7 -0
  219. package/dist/kanban-dispatch-route.d.ts +14 -0
  220. package/dist/kanban-dispatch-route.d.ts.map +1 -0
  221. package/dist/kanban-hq-sync.d.ts +2 -0
  222. package/dist/kanban-hq-sync.d.ts.map +1 -1
  223. package/dist/kanban-run-mirror-EKVNGXWW.js +12 -0
  224. package/dist/kanban-run-mirror-EKVNGXWW.js.map +7 -0
  225. package/dist/live-settings-input.d.ts +69 -0
  226. package/dist/live-settings-input.d.ts.map +1 -0
  227. package/dist/mailbox-serve-2UWHEN3M.js +302 -0
  228. package/dist/mailbox-serve-2UWHEN3M.js.map +7 -0
  229. package/dist/mcp-CYLPUEHC.js +413 -0
  230. package/dist/mcp-CYLPUEHC.js.map +7 -0
  231. package/dist/modeldiag-HENYJ4N7.js +1290 -0
  232. package/dist/modeldiag-HENYJ4N7.js.map +7 -0
  233. package/dist/permissions-FNYLZIL4.js +115 -0
  234. package/dist/permissions-FNYLZIL4.js.map +7 -0
  235. package/dist/picker-key-state.d.ts +7 -0
  236. package/dist/picker-key-state.d.ts.map +1 -0
  237. package/dist/picker-model-picker.d.ts +6 -0
  238. package/dist/picker-model-picker.d.ts.map +1 -0
  239. package/dist/picker-ui.d.ts +17 -0
  240. package/dist/picker-ui.d.ts.map +1 -0
  241. package/dist/picker.d.ts +4 -37
  242. package/dist/picker.d.ts.map +1 -1
  243. package/dist/plugin-usage-OU6X6LM3.js +40 -0
  244. package/dist/plugin-usage-OU6X6LM3.js.map +7 -0
  245. package/dist/plugins-4LJ5IUBI.js +24 -0
  246. package/dist/plugins-4LJ5IUBI.js.map +7 -0
  247. package/dist/pre-launch.d.ts +0 -1
  248. package/dist/pre-launch.d.ts.map +1 -1
  249. package/dist/project-BLQ3ALVL.js +76 -0
  250. package/dist/project-BLQ3ALVL.js.map +7 -0
  251. package/dist/project-manifest-GE25PW4S.js +18 -0
  252. package/dist/project-manifest-GE25PW4S.js.map +7 -0
  253. package/dist/project-picker-BOCWHBXP.js +17 -0
  254. package/dist/project-picker-BOCWHBXP.js.map +7 -0
  255. package/dist/projects-XE76NFNZ.js +38 -0
  256. package/dist/projects-XE76NFNZ.js.map +7 -0
  257. package/dist/provider-helpers.d.ts +22 -6
  258. package/dist/provider-helpers.d.ts.map +1 -1
  259. package/dist/providers-models-GDELBHZK.js +589 -0
  260. package/dist/providers-models-GDELBHZK.js.map +7 -0
  261. package/dist/quick-VIO2BEHS.js +10 -0
  262. package/dist/quick-VIO2BEHS.js.map +7 -0
  263. package/dist/repl-auto-proceed.d.ts +19 -0
  264. package/dist/repl-auto-proceed.d.ts.map +1 -0
  265. package/dist/repl-client-registration.d.ts +7 -0
  266. package/dist/repl-client-registration.d.ts.map +1 -0
  267. package/dist/repl-input.d.ts +11 -0
  268. package/dist/repl-input.d.ts.map +1 -0
  269. package/dist/repl-options.d.ts +54 -0
  270. package/dist/repl-options.d.ts.map +1 -0
  271. package/dist/repl-rendering.d.ts +4 -0
  272. package/dist/repl-rendering.d.ts.map +1 -0
  273. package/dist/repl-suggestions.d.ts +21 -0
  274. package/dist/repl-suggestions.d.ts.map +1 -0
  275. package/dist/repl.d.ts +3 -162
  276. package/dist/repl.d.ts.map +1 -1
  277. package/dist/replay-KCTXNMZQ.js +75 -0
  278. package/dist/replay-KCTXNMZQ.js.map +7 -0
  279. package/dist/rewind-EJMVFVLS.js +185 -0
  280. package/dist/rewind-EJMVFVLS.js.map +7 -0
  281. package/dist/sdd-runtime-JG4EEKL6.js +54 -0
  282. package/dist/sdd-runtime-JG4EEKL6.js.map +7 -0
  283. package/dist/services/sdd/project-context.d.ts +1 -1
  284. package/dist/services/sdd/project-context.d.ts.map +1 -1
  285. package/dist/services/sdd/task-manager.d.ts.map +1 -1
  286. package/dist/services/statusline-config.d.ts +1 -1
  287. package/dist/services/statusline-config.d.ts.map +1 -1
  288. package/dist/session-event-wiring.d.ts +2 -2
  289. package/dist/session-event-wiring.d.ts.map +1 -1
  290. package/dist/sessions-config-NLCMK3BY.js +409 -0
  291. package/dist/sessions-config-NLCMK3BY.js.map +7 -0
  292. package/dist/settings-menu.d.ts +3 -18
  293. package/dist/settings-menu.d.ts.map +1 -1
  294. package/dist/simpleui-dist-JIFGUJO7.js +93 -0
  295. package/dist/simpleui-dist-JIFGUJO7.js.map +7 -0
  296. package/dist/slash-commands/brain.d.ts.map +1 -1
  297. package/dist/slash-commands/clear.d.ts.map +1 -1
  298. package/dist/slash-commands/fallback.d.ts.map +1 -1
  299. package/dist/slash-commands/kanban-agent-helpers.d.ts +18 -0
  300. package/dist/slash-commands/kanban-agent-helpers.d.ts.map +1 -0
  301. package/dist/slash-commands/kanban-format.d.ts +16 -0
  302. package/dist/slash-commands/kanban-format.d.ts.map +1 -0
  303. package/dist/slash-commands/kanban-help.d.ts +2 -0
  304. package/dist/slash-commands/kanban-help.d.ts.map +1 -0
  305. package/dist/slash-commands/kanban.d.ts.map +1 -1
  306. package/dist/slash-commands/mailbox-demo.d.ts.map +1 -1
  307. package/dist/slash-commands/mailbox.d.ts +2 -1
  308. package/dist/slash-commands/mailbox.d.ts.map +1 -1
  309. package/dist/slash-commands/memory-compact.d.ts +5 -0
  310. package/dist/slash-commands/memory-compact.d.ts.map +1 -0
  311. package/dist/slash-commands/memory-flags.d.ts +36 -0
  312. package/dist/slash-commands/memory-flags.d.ts.map +1 -0
  313. package/dist/slash-commands/memory-formatters.d.ts +16 -0
  314. package/dist/slash-commands/memory-formatters.d.ts.map +1 -0
  315. package/dist/slash-commands/memory.d.ts.map +1 -1
  316. package/dist/slash-commands/mouse.d.ts +2 -2
  317. package/dist/slash-commands/review.d.ts.map +1 -1
  318. package/dist/slash-commands/sdd-command-helpers.d.ts +23 -0
  319. package/dist/slash-commands/sdd-command-helpers.d.ts.map +1 -0
  320. package/dist/slash-commands/sdd-format.d.ts +32 -0
  321. package/dist/slash-commands/sdd-format.d.ts.map +1 -0
  322. package/dist/slash-commands/sdd.d.ts.map +1 -1
  323. package/dist/slash-commands/settings.d.ts.map +1 -1
  324. package/dist/subcommands/handlers/chronicle.d.ts.map +1 -1
  325. package/dist/subcommands/handlers/mailbox-serve.d.ts.map +1 -1
  326. package/dist/subcommands/handlers/model-smoke-test.d.ts +51 -0
  327. package/dist/subcommands/handlers/model-smoke-test.d.ts.map +1 -0
  328. package/dist/subcommands/handlers/modeldiag-profiles.d.ts +64 -0
  329. package/dist/subcommands/handlers/modeldiag-profiles.d.ts.map +1 -0
  330. package/dist/subcommands/handlers/modeldiag.d.ts.map +1 -1
  331. package/dist/subcommands/handlers/per-subcommand-deep-help-table.d.ts +3 -0
  332. package/dist/subcommands/handlers/per-subcommand-deep-help-table.d.ts.map +1 -0
  333. package/dist/subcommands/handlers/per-subcommand-help-data.d.ts +3 -0
  334. package/dist/subcommands/handlers/per-subcommand-help-data.d.ts.map +1 -0
  335. package/dist/subcommands/handlers/per-subcommand-help-table.d.ts +36 -0
  336. package/dist/subcommands/handlers/per-subcommand-help-table.d.ts.map +1 -0
  337. package/dist/subcommands/handlers/per-subcommand-help-types.d.ts +18 -0
  338. package/dist/subcommands/handlers/per-subcommand-help-types.d.ts.map +1 -0
  339. package/dist/subcommands/handlers/per-subcommand-help.d.ts +2 -80
  340. package/dist/subcommands/handlers/per-subcommand-help.d.ts.map +1 -1
  341. package/dist/subcommands/handlers/rewind.d.ts.map +1 -1
  342. package/dist/subcommands/index.d.ts +7 -0
  343. package/dist/subcommands/index.d.ts.map +1 -1
  344. package/dist/tools-skills-UNKLOB7M.js +29 -0
  345. package/dist/tools-skills-UNKLOB7M.js.map +7 -0
  346. package/dist/update-YC4TYW2Y.js +16 -0
  347. package/dist/update-YC4TYW2Y.js.map +7 -0
  348. package/dist/update-check-UMYTOH7Z.js +18 -0
  349. package/dist/update-check-UMYTOH7Z.js.map +7 -0
  350. package/dist/version-help-DROHZRW6.js +11 -0
  351. package/dist/version-help-DROHZRW6.js.map +7 -0
  352. package/dist/webui-server/connection-handler.d.ts.map +1 -1
  353. package/dist/webui-server/kanban-host-adapter.d.ts +5 -1
  354. package/dist/webui-server/kanban-host-adapter.d.ts.map +1 -1
  355. package/dist/webui-server/listen-helpers.d.ts +18 -0
  356. package/dist/webui-server/listen-helpers.d.ts.map +1 -0
  357. package/dist/webui-server/node-pty-loader.d.ts +6 -0
  358. package/dist/webui-server/node-pty-loader.d.ts.map +1 -0
  359. package/dist/webui-server-ZF5KVGC5.js +1460 -0
  360. package/dist/webui-server-ZF5KVGC5.js.map +7 -0
  361. package/dist/webui-server-options.d.ts +191 -0
  362. package/dist/webui-server-options.d.ts.map +1 -0
  363. package/dist/webui-server.d.ts +2 -178
  364. package/dist/webui-server.d.ts.map +1 -1
  365. package/dist/wiring/brain-and-orchestration.d.ts.map +1 -1
  366. package/dist/wiring/codebase-index.d.ts.map +1 -1
  367. package/dist/wiring/command-host-state.d.ts +4 -4
  368. package/dist/wiring/dep-watcher-bridge.d.ts +23 -0
  369. package/dist/wiring/dep-watcher-bridge.d.ts.map +1 -0
  370. package/dist/wiring/dep-watcher.d.ts.map +1 -1
  371. package/dist/wiring/hq-telemetry.d.ts +2 -2
  372. package/dist/wiring/lifecycle-plugins.d.ts +4 -3
  373. package/dist/wiring/lifecycle-plugins.d.ts.map +1 -1
  374. package/dist/wiring/mailbox-bridge-bootstrap.d.ts +1 -1
  375. package/dist/wiring/management-tools.d.ts +15 -0
  376. package/dist/wiring/management-tools.d.ts.map +1 -0
  377. package/dist/wiring/pipeline.d.ts +2 -1
  378. package/dist/wiring/pipeline.d.ts.map +1 -1
  379. package/dist/wiring/plugins.d.ts +1 -1
  380. package/dist/wiring/plugins.d.ts.map +1 -1
  381. package/dist/wiring/provider-runtime-setup.d.ts +14 -1
  382. package/dist/wiring/provider-runtime-setup.d.ts.map +1 -1
  383. package/dist/wiring/provider.d.ts.map +1 -1
  384. package/dist/wiring/runtime-controller-deps.d.ts +1 -1
  385. package/dist/wiring/runtime-controller-deps.d.ts.map +1 -1
  386. package/dist/wiring/sage.d.ts.map +1 -1
  387. package/dist/wiring/session-registry.d.ts +38 -0
  388. package/dist/wiring/session-registry.d.ts.map +1 -0
  389. package/dist/wiring/session.d.ts +10 -6
  390. package/dist/wiring/session.d.ts.map +1 -1
  391. package/dist/wiring/tools.d.ts.map +1 -1
  392. package/package.json +22 -22
  393. package/dist/cli-recovery-prompt.d.ts +0 -19
  394. package/dist/cli-recovery-prompt.d.ts.map +0 -1
  395. package/dist/first-run-auth-gate.d.ts +0 -20
  396. package/dist/first-run-auth-gate.d.ts.map +0 -1
  397. package/dist/pre-launch/indexing-question.d.ts +0 -28
  398. package/dist/pre-launch/indexing-question.d.ts.map +0 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/subcommands/handlers/modeldiag.ts", "../src/subcommands/handlers/model-smoke-test.ts", "../src/subcommands/handlers/modeldiag-profiles.ts"],
4
+ "sourcesContent": ["import * as fs from 'node:fs/promises';\nimport { color } from '@wrongstack/core/utils';\nimport type { Config, ModelMatrixEntry, ProviderConfig } from '@wrongstack/core/types';\nimport { toErrorMessage } from '@wrongstack/core/utils';\nimport { makeProviderFromConfig, setOAuthTokenPersister } from '@wrongstack/providers';\nimport type { DefaultModelsRegistry } from '@wrongstack/core/models';\nimport type { SubcommandHandler } from '../index.js';\nimport { discoverAndMergeProviders } from '../../boot/auto-discover-providers.js';\nimport { mutateConfigProviders, normalizeKeys, writeKeysBack } from '../../provider-config-utils.js';\nimport { activeProfileConfigPath } from '../../profile-config-path.js';\nimport {\n buildModelSmokeTargets,\n parseModelSmokeOptions,\n runModelSmokeTests,\n type ModelSmokeResult,\n} from './model-smoke-test.js';\n\n/**\n * `wrongstack modeldiag` \u2014 read-only diagnostics: key check, capability scan,\n * heuristic suggestions, and real model benchmarking. Never modifies config.\n *\n * Ported from the now-removed /modeldiag slash command.\n */\n\n// ---------------------------------------------------------------------------\n// Model profiles (inlined to avoid cross-package build dependency)\n// ---------------------------------------------------------------------------\n\nimport {\n checkMark,\n costLabel,\n EVAL_CATEGORIES,\n EVAL_TASKS,\n findProfile,\n fmtMs,\n fmtPrice,\n fmtTokens,\n rankModels,\n roleCat,\n scoreBar,\n speedLabel,\n type CacheModel,\n type CacheProvider,\n} from './modeldiag-profiles.js';\n\nfunction createProviderForId(\n providerId: string,\n cfg: { providers?: Record<string, ProviderConfig>; apiKey?: string; baseUrl?: string },\n): ReturnType<typeof makeProviderFromConfig> | undefined {\n const savedCfg = cfg.providers?.[providerId];\n // Match the startup path (packages/cli/src/wiring/provider.ts:82): keep\n // `cfg.type === providerId` so the resulting Provider's `id` is the user's\n // chosen id. The wire family is read from `savedCfg.family` inside\n // `makeProviderFromConfig`, so OAuth/subscription aliases (e.g.\n // `minimax-coding-plan` with `type: 'anthropic'`) get the right protocol\n // without their saved `type` leaking into the Provider's id.\n const cfgWithType = Object.assign(\n { type: providerId },\n savedCfg ?? { apiKey: cfg.apiKey, baseUrl: cfg.baseUrl },\n );\n try {\n return makeProviderFromConfig(providerId, cfgWithType);\n } catch {\n return undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Leader ranking\n// ---------------------------------------------------------------------------\n\nasync function rankResponses(\n provider: ReturnType<typeof makeProviderFromConfig>,\n leaderModel: string,\n taskPrompt: string,\n responses: Array<{ model: string; text: string }>,\n): Promise<number[]> {\n const labelToIdx = new Map<string, number>();\n const responseBlock = responses\n .map((r, i) => {\n const label = String.fromCharCode(65 + i);\n labelToIdx.set(label, i);\n return `=== Response ${label} ===\\n${r.text.slice(0, 800)}`;\n })\n .join('\\n\\n');\n\n const rankingPrompt =\n `Rank these responses from BEST (1) to WORST.\\n\\nTASK:\\n${taskPrompt.slice(0, 600)}\\n\\n` +\n `RESPONSES:\\n${responseBlock}\\n\\n` +\n 'Output ONLY a ranked list, one per line:\\n1. Response X \u2014 brief reason\\n2. Response Y \u2014 brief reason';\n\n try {\n const resp = await provider.complete(\n {\n model: leaderModel,\n system: [\n {\n type: 'text' as const,\n text: 'You are an expert evaluator. Rank responses concisely. Output ONLY the ranked list.',\n },\n ],\n messages: [{ role: 'user', content: [{ type: 'text' as const, text: rankingPrompt }] }],\n maxTokens: 400,\n },\n { signal: AbortSignal.timeout(30_000) },\n );\n\n const text: string =\n resp.content[0] && 'text' in resp.content[0]\n ? (resp.content[0] as { text: string }).text\n : '';\n const rankings: number[] = [];\n for (const line of text.split('\\n')) {\n const m = line.match(/^\\s*(\\d+)[.)]\\s*Response\\s+([A-Z])/i);\n if (m) {\n const label = m[2]?.toUpperCase();\n const idx = label !== undefined ? labelToIdx.get(label) : undefined;\n if (idx !== undefined && !rankings.includes(idx)) {\n rankings.push(idx);\n }\n }\n }\n return rankings.length > 0 ? rankings : responses.map((_, i) => i);\n } catch {\n return responses.map((_, i) => i);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Cache parsing\n// ---------------------------------------------------------------------------\n\nasync function readProviders(cachePath: string | undefined): Promise<CacheProvider[] | string> {\n if (!cachePath) {\n return `${color.red('Models cache not available')}.`;\n }\n try {\n const raw = await fs.readFile(cachePath, 'utf8');\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const payload = (parsed.payload ?? parsed) as Record<string, Record<string, unknown>>;\n return Object.entries(payload).map(([id, p]) => ({\n id: (p.id as string) ?? id,\n name: (p.name as string) ?? id,\n family: (p.npm as string) ?? id,\n models: Object.values((p.models as Record<string, Record<string, unknown>>) ?? {}).map(\n (m) => ({\n id: m.id as string,\n name: m.name as string | undefined,\n capabilities: {\n contextWindow: (m.limit as { context?: number } | undefined)?.context,\n maxOutputTokens: (m.limit as { output?: number } | undefined)?.output,\n },\n pricing: m.cost as { input?: number; output?: number } | undefined,\n }),\n ),\n }));\n } catch {\n return `${color.amber('Models cache not available')}. Run wstack sync-models.`;\n }\n}\n\ntype ModelDiagConfig = {\n provider: string;\n model?: string;\n providers?: Record<string, ProviderConfig>;\n modelMatrix?: Record<string, ModelMatrixEntry>;\n apiKey?: string;\n baseUrl?: string;\n};\n\nfunction checkHasKey(pid: string, config: ModelDiagConfig): boolean {\n if (pid === config.provider && config.provider) return true;\n const pc = config.providers?.[pid];\n if (!pc) return false;\n if (typeof pc.apiKey === 'string' && pc.apiKey.length > 0) return true;\n if (Array.isArray(pc.apiKeys) && pc.apiKeys.some((k) => k?.apiKey)) return true;\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Main handler\n// ---------------------------------------------------------------------------\n\nexport const modeldiagCmd: SubcommandHandler = async (args, deps) => {\n const sub = args[0]?.toLowerCase() || 'full';\n\n // --------------- load cache ---------------\n const cacheResult = await readProviders(deps.paths.modelsCache);\n if (typeof cacheResult === 'string') {\n deps.renderer.write(`${cacheResult}\\n`);\n return cacheResult.includes(color.red('')) ? 1 : 0;\n }\n const providers = cacheResult;\n\n const config = deps.config as ModelDiagConfig;\n const modelMatrix = (config.modelMatrix ?? {}) as Record<string, ModelMatrixEntry>;\n\n function hasKey(pid: string): boolean {\n return checkHasKey(pid, config);\n }\n\n function writeLine(line = '') {\n deps.renderer.write(`${line}\\n`);\n }\n\n // \u2500\u2500 keys \u2500\u2500\n if (sub === 'keys') {\n writeLine(`${color.bold('API Key Status')}`);\n writeLine();\n for (const prov of providers) {\n const k = hasKey(prov.id);\n writeLine(` ${checkMark(k)} ${color.bold(prov.id.padEnd(18))} ${color.dim(prov.name)}`);\n }\n writeLine();\n writeLine(`${color.dim(`Leader: ${config.provider}/${config.model}`)}`);\n return 0;\n }\n\n // \u2500\u2500 caps \u2500\u2500\n if (sub === 'caps') {\n writeLine(`${color.bold('Model Capabilities')} ${color.dim('\u2014 matched to known profiles')}`);\n writeLine();\n\n for (const prov of providers) {\n if (!hasKey(prov.id)) continue;\n writeLine(` ${color.bold(prov.id)} ${color.dim(`(${prov.name})`)}`);\n\n const tiers: Record<string, CacheModel[]> = {\n premium: [],\n standard: [],\n budget: [],\n unknown: [],\n };\n for (const m of prov.models ?? []) {\n const profile = findProfile(prov.id, m.id);\n tiers[profile?.costTier ?? 'unknown']?.push(m);\n }\n\n for (const tier of ['premium', 'standard', 'budget', 'unknown'] as const) {\n const tierModels = tiers[tier]!;\n if (tierModels.length === 0) continue;\n const label = tier === 'unknown' ? color.dim('unmatched') : `${costLabel(tier)} ${tier}`;\n writeLine(` ${label}`);\n for (const m of tierModels) {\n const cap = m.capabilities;\n const ctx = cap?.contextWindow ?? 0;\n const maxOut = cap?.maxOutputTokens ?? 0;\n const profile = findProfile(prov.id, m.id);\n const family = profile\n ? `${speedLabel(profile.speedTier)} ${color.green(profile.family)}`\n : color.dim('no profile match');\n const pricing = m.pricing\n ? `${color.dim('in')}${fmtPrice(m.pricing.input)} ${color.dim('out')}${fmtPrice(m.pricing.output)}`\n : color.dim('pricing ?');\n writeLine(\n ` ${color.cyan(m.id.padEnd(34))}` +\n `${ctx > 0 ? `ctx ${fmtTokens(ctx).padEnd(6)}` : color.dim('ctx ? ')}` +\n `${maxOut > 0 ? `out ${fmtTokens(maxOut).padEnd(6)}` : ' '}` +\n `${family} ${pricing}`,\n );\n }\n }\n writeLine();\n }\n\n writeLine(\n color.dim(\n 'Prices in USD per 1M tokens (input/output). ctx = context window, out = max output.',\n ),\n );\n return 0;\n }\n\n // \u2500\u2500 suggest (also called from 'full') \u2500\u2500\n async function renderSuggest(): Promise<void> {\n writeLine();\n writeLine(\n `${color.bold('Agent \u2192 Model Suggestions')} ${color.amber('(heuristic \u2014 untested)')}`,\n );\n writeLine(\n color.dim(\n 'These are profile-based best guesses. Test them with wstack modeldiag bench <role> \"<prompt>\".',\n ),\n );\n writeLine();\n\n const keyedProviders = providers.filter((p) => hasKey(p.id));\n if (keyedProviders.length === 0) {\n writeLine(\n ` ${color.amber('No providers have API keys configured. Add keys with wstack auth.')}`,\n );\n } else {\n const roles = [\n 'security-scanner',\n 'bug-hunter',\n 'planner',\n 'architect',\n 'refactor-planner',\n 'verifier',\n 'test',\n 'document',\n 'reviewer',\n 'code-reviewer',\n 'executor',\n 'debugger',\n ];\n\n for (const role of roles) {\n if (modelMatrix[role]) {\n const entry = modelMatrix[role]!;\n const p = entry.provider ?? config.provider;\n writeLine(\n ` ${color.dim(role.padEnd(20))} \u2192 ${color.cyan(`${p}/${entry.model}`)} ${color.dim('(user-configured)')}`,\n );\n continue;\n }\n\n const cat = roleCat(role);\n const ranked = rankModels(providers, hasKey, cat, 3);\n\n if (ranked.length === 0) {\n writeLine(` ${color.dim(role.padEnd(20))} \u2192 ${color.dim('no candidates')}`);\n continue;\n }\n\n const best = ranked[0]!;\n const family = best.profile ? ` ${color.dim(`(${best.profile.family})`)}` : '';\n const bar = scoreBar(best.score, 110);\n writeLine(\n ` ${color.amber(role.padEnd(20))} \u2192 ${color.cyan(`${best.provider}/${best.model}`)}${family}`,\n );\n writeLine(` ${' '.repeat(22)} ${bar} ${color.dim(cat)}`);\n\n if (\n ranked.length > 1 &&\n (ranked[1]?.score ?? Number.NEGATIVE_INFINITY) >= best.score - 15\n ) {\n for (const alt of ranked.slice(1)) {\n const af = alt.profile ? ` (${alt.profile.family})` : '';\n writeLine(\n ` ${' '.repeat(22)} ${color.dim(`${alt.provider}/${alt.model}${af} score ${alt.score}`)}`,\n );\n }\n }\n }\n\n writeLine();\n writeLine(\n ` ${color.bold('leader'.padEnd(20))} \u2192 ${color.cyan(`${config.provider}/${config.model}`)}`,\n );\n }\n }\n\n // \u2500\u2500 suggest subcommand \u2500\u2500\n if (sub === 'suggest') {\n await renderSuggest();\n writeLine();\n writeLine(color.dim('Pin a suggestion: wstack setmodel set <role> <provider>/<model>'));\n writeLine(color.dim('Test candidates: wstack modeldiag bench <role> \"<test prompt>\"'));\n return 0;\n }\n\n // \u2500\u2500 test \u2500\u2500\n if (sub === 'test') {\n if (args.slice(1).includes('--help') || deps.flags?.['help'] === true) {\n writeLine(`${color.bold('Usage:')} wstack modeldiag test [options]`);\n writeLine();\n writeLine(' (no flags) Probe one representative model per configured provider');\n writeLine(' --all-models Probe every catalog-visible model sequentially');\n writeLine(' --plan Show targets without making model calls');\n writeLine(' --provider=<id,...> Restrict provider ids');\n writeLine(' --model=<id,...> Restrict model ids');\n writeLine(' --timeout=<ms> Per-model timeout (default 45000)');\n writeLine(' --max-tokens=<n> Output cap for the tiny probe (default 32)');\n writeLine(' --json Emit machine-readable output');\n writeLine(' --yes Confirm a run larger than 50 requests');\n return 0;\n }\n let smokeOptions;\n try {\n smokeOptions = parseModelSmokeOptions(args.slice(1), deps.flags);\n } catch (err) {\n writeLine(`${color.red('Invalid smoke-test options:')} ${toErrorMessage(err)}`);\n return 2;\n }\n\n if ('mergeOverlay' in deps.modelsRegistry) {\n await discoverAndMergeProviders({\n config: config as Config,\n registry: deps.modelsRegistry as DefaultModelsRegistry,\n cacheDir: deps.paths.cacheDir,\n });\n }\n const targets = await buildModelSmokeTargets(config as Config, deps.modelsRegistry, smokeOptions);\n const byProvider = new Map<string, number>();\n for (const target of targets) {\n byProvider.set(target.providerId, (byProvider.get(target.providerId) ?? 0) + 1);\n }\n\n if (smokeOptions.planOnly) {\n const plan = {\n mode: smokeOptions.allModels ? 'all-models' : 'representative',\n targetCount: targets.length,\n providers: Object.fromEntries(byProvider),\n targets,\n };\n if (smokeOptions.json) {\n writeLine(JSON.stringify(plan, null, 2));\n } else {\n writeLine(`${color.bold('Provider/Model Smoke Test Plan')}`);\n writeLine();\n for (const [providerId, count] of byProvider) {\n writeLine(` ${color.cyan(providerId.padEnd(24))} ${count} model(s)`);\n }\n writeLine();\n writeLine(\n color.dim(\n `${targets.length} request(s) would run sequentially. Remove --plan to execute.`,\n ),\n );\n }\n return targets.length > 0 ? 0 : 2;\n }\n\n if (targets.length === 0) {\n const message =\n 'No provider/model targets matched. Check the active profile or remove filters.';\n if (smokeOptions.json) {\n writeLine(JSON.stringify({ results: [], summary: { passed: 0, failed: 0 }, error: message }));\n } else {\n writeLine(color.amber(message));\n }\n return 2;\n }\n\n const confirmed =\n deps.flags?.['yes'] === true ||\n deps.flags?.['yes'] === 'true' ||\n args.slice(1).includes('--yes');\n if (targets.length > 50 && !confirmed) {\n const message =\n `${targets.length} live requests are planned. Review with --plan, then add --yes to run them.`;\n if (smokeOptions.json) {\n writeLine(JSON.stringify({ error: message, targetCount: targets.length }));\n } else {\n writeLine(color.amber(message));\n }\n return 2;\n }\n\n if (!smokeOptions.json) {\n writeLine(`${color.bold('Live Provider/Model Smoke Test')}`);\n writeLine(\n color.dim(\n `${targets.length} request(s), sequential, ${smokeOptions.timeoutMs}ms timeout, max ${smokeOptions.maxTokens} output tokens.`,\n ),\n );\n writeLine();\n }\n\n const resultLines = (result: ModelSmokeResult, index: number, total: number): void => {\n if (smokeOptions.json) return;\n const label = `[${String(index + 1).padStart(String(total).length)}/${total}]`;\n const target = `${result.providerId}/${result.modelId}`;\n if (result.status === 'passed') {\n writeLine(\n ` ${color.green('\u2713')} ${color.dim(label)} ${color.cyan(target)} ${color.dim(\n `${fmtMs(result.latencyMs)} \u00B7 in${result.usage.input}/out${result.usage.output} \u00B7 ${result.stopReason}`,\n )}`,\n );\n } else {\n const status = result.httpStatus ? `HTTP ${result.httpStatus} \u00B7 ` : '';\n writeLine(\n ` ${color.red('\u2717')} ${color.dim(label)} ${color.red(target)} ${color.dim(\n `${fmtMs(result.latencyMs)} \u00B7 ${status}${result.errorKind}`,\n )}`,\n );\n writeLine(` ${color.red(result.error.slice(0, 240))}`);\n }\n };\n\n let oauthWriteChain = Promise.resolve();\n let oauthWriteScheduled = false;\n const profilePath = activeProfileConfigPath(deps.paths, config as Config);\n setOAuthTokenPersister((providerId, credentials) => {\n oauthWriteScheduled = true;\n oauthWriteChain = oauthWriteChain.then(() =>\n mutateConfigProviders(profilePath, deps.vault, (all) => {\n const providerConfig = all[providerId];\n if (!providerConfig) return;\n const keys = normalizeKeys(providerConfig);\n const active = providerConfig.activeKey\n ? keys.find((key) => key.label === providerConfig.activeKey)\n : keys[0];\n if (!active) return;\n active.apiKey = credentials.accessToken;\n active.refreshToken = credentials.refreshToken;\n active.expiresAt = new Date(credentials.expiresAt).toISOString();\n if (credentials.accountId) active.accountId = credentials.accountId;\n writeKeysBack(providerConfig, keys);\n }),\n );\n });\n\n let results;\n try {\n results = await runModelSmokeTests({\n targets,\n options: smokeOptions,\n createProvider: async (providerId) => {\n const saved = config.providers?.[providerId];\n const resolved =\n (await deps.modelsRegistry.getProvider(providerId).catch(() => undefined)) ??\n (saved?.type && saved.type !== providerId\n ? await deps.modelsRegistry.getProvider(saved.type).catch(() => undefined)\n : undefined);\n const providerConfig: ProviderConfig = {\n ...(providerId === config.provider\n ? {\n ...(config.apiKey ? { apiKey: config.apiKey } : {}),\n ...(config.baseUrl ? { baseUrl: config.baseUrl } : {}),\n }\n : {}),\n ...saved,\n type: providerId,\n ...(saved?.family ?? resolved?.family\n ? { family: saved?.family ?? resolved?.family }\n : {}),\n ...(saved?.baseUrl ?? resolved?.apiBase\n ? { baseUrl: saved?.baseUrl ?? resolved?.apiBase }\n : {}),\n ...(saved?.envVars ?? resolved?.envVars\n ? { envVars: saved?.envVars ?? resolved?.envVars }\n : {}),\n };\n return makeProviderFromConfig(providerId, providerConfig);\n },\n onTargetComplete: resultLines,\n });\n } finally {\n setOAuthTokenPersister(undefined);\n }\n let oauthPersistenceError: string | undefined;\n if (oauthWriteScheduled) {\n try {\n await oauthWriteChain;\n } catch (err) {\n oauthPersistenceError = toErrorMessage(err);\n }\n }\n const passed = results.filter((result) => result.status === 'passed').length;\n const failed = results.length - passed;\n const summary = { passed, failed, total: results.length };\n\n if (smokeOptions.json) {\n writeLine(\n JSON.stringify(\n {\n results,\n summary,\n ...(oauthPersistenceError\n ? { warning: `OAuth token refresh worked in-memory but could not be saved: ${oauthPersistenceError}` }\n : {}),\n },\n null,\n 2,\n ),\n );\n } else {\n writeLine();\n writeLine(\n `${color.bold('Summary:')} ${color.green(`${passed} passed`)} \u00B7 ${\n failed > 0 ? color.red(`${failed} failed`) : color.dim('0 failed')\n }`,\n );\n if (!smokeOptions.allModels) {\n writeLine(\n color.dim('Use --all-models to test every catalog-visible model sequentially.'),\n );\n }\n if (oauthPersistenceError) {\n writeLine(\n color.amber(\n `OAuth token refresh worked in-memory but could not be saved: ${oauthPersistenceError}`,\n ),\n );\n }\n }\n return failed === 0 ? 0 : 1;\n }\n\n // \u2500\u2500 bench <role> <prompt> [--providers p1,p2] \u2500\u2500\n if (sub === 'bench') {\n const benchArgs = args.slice(1);\n if (benchArgs.length < 2) {\n writeLine(\n `${color.amber('Usage:')} wstack modeldiag bench <role> \"<test prompt>\" [--providers=p1,p2]`,\n );\n writeLine();\n writeLine(\n color.dim(\n 'Example: wstack modeldiag bench verify \"Write a function that checks if a string is a palindrome\"',\n ),\n );\n writeLine(\n color.dim(\n 'Tests the top 5 candidate models for the role with your prompt and reports results.',\n ),\n );\n writeLine(color.dim('Add --providers=anthropic,google to test across multiple providers.'));\n return 0;\n }\n\n const providersEqIdx = benchArgs.findIndex((a) => a.startsWith('--providers='));\n let providerFilter: string[] | undefined;\n if (providersEqIdx >= 0) {\n const rawFilter = benchArgs[providersEqIdx]?.replace('--providers=', '').split(',');\n if (rawFilter) {\n providerFilter = rawFilter.map((s) => s.trim()).filter(Boolean);\n benchArgs.splice(providersEqIdx, 1);\n }\n } else {\n const rawFilter = deps.flags?.['providers'] ?? deps.flags?.['provider'];\n if (typeof rawFilter === 'string') {\n providerFilter = rawFilter\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n }\n }\n\n const benchRole = benchArgs[0];\n if (!benchRole) {\n writeLine(\n `${color.amber('No benchmark role specified')}. Usage: wstack diag bench <role> [prompt]`,\n );\n return 1;\n }\n const benchPrompt = benchArgs.slice(1).join(' ');\n\n const cat = roleCat(benchRole);\n const candidates = rankModels(providers, hasKey, cat, 5);\n\n if (candidates.length === 0) {\n writeLine(\n `${color.amber('No candidate models found')} for role \"${benchRole}\" (category: ${cat}).`,\n );\n return 0;\n }\n\n let targetCandidates: typeof candidates;\n if (providerFilter && providerFilter.length > 0) {\n targetCandidates = candidates.filter((c) => providerFilter.includes(c.provider));\n if (targetCandidates.length === 0) {\n writeLine(\n `${color.amber('No candidates match the specified providers')}: ${providerFilter.join(', ')}`,\n );\n writeLine(\n `Candidate providers: ${[...new Set(candidates.map((c) => c.provider))].join(', ')}`,\n );\n return 0;\n }\n } else {\n targetCandidates = candidates;\n }\n\n writeLine(\n `${color.bold('Model Benchmark')} \u2014 ${color.amber(benchRole)} ${color.dim(`(category: ${cat})`)}`,\n );\n writeLine(\n `${color.dim('Prompt:')} \"${benchPrompt.slice(0, 120)}${benchPrompt.length > 120 ? '\u2026' : ''}\"`,\n );\n writeLine();\n\n writeLine(\n ` ${color.dim('# model'.padEnd(52))} ${color.dim('score'.padEnd(12))} ${color.dim('latency'.padEnd(10))} ${color.dim('tokens'.padEnd(14))} ${color.dim('first line')}`,\n );\n writeLine(` ${color.dim('\u2500'.repeat(108))}`);\n\n const providerInstances = new Map<string, ReturnType<typeof makeProviderFromConfig>>();\n for (const pid of [...new Set(targetCandidates.map((c) => c.provider))]) {\n const prov = createProviderForId(pid, config);\n if (prov) providerInstances.set(pid, prov);\n }\n\n let idx = 0;\n for (const c of targetCandidates.slice(0, 20)) {\n idx++;\n const label = `${idx}`.padStart(2);\n const modelKey = `${c.provider}/${c.model}`;\n const prov = providerInstances.get(c.provider);\n\n if (!prov) {\n writeLine(\n ` ${label} ${color.red(modelKey.padEnd(50))} ${scoreBar(c.score, 110).slice(0, 11)} ${color.red('NO PROVIDER')}`,\n );\n continue;\n }\n\n try {\n const start = Date.now();\n const resp = await prov.complete(\n {\n model: c.model,\n messages: [{ role: 'user', content: [{ type: 'text' as const, text: benchPrompt }] }],\n maxTokens: 256,\n },\n { signal: AbortSignal.timeout(30_000) },\n );\n const latency = Date.now() - start;\n const firstText: string =\n resp.content[0] && 'text' in resp.content[0]\n ? (resp.content[0] as { text: string }).text\n : '';\n const firstLineClean = firstText.replace(/\\n/g, ' ').slice(0, 80) || color.dim('(empty)');\n\n const provColor = c.provider === config.provider ? color.green : color.cyan;\n const usage = resp.usage;\n writeLine(\n ` ${label} ${provColor(modelKey.padEnd(50))} ${scoreBar(c.score, 110).slice(0, 11)} ${color.amber(fmtMs(latency).padEnd(8))} ${color.dim(`in${usage?.input ?? '?'}/out${usage?.output ?? '?'}`.padEnd(12))} ${firstLineClean}`,\n );\n } catch (err) {\n const errMsg = toErrorMessage(err);\n writeLine(\n ` ${label} ${color.red(modelKey.padEnd(50))} ${scoreBar(c.score, 110).slice(0, 11)} ${color.red('FAILED')} ${color.dim(errMsg.slice(0, 40))}`,\n );\n }\n }\n\n const testedProviders = [...new Set(targetCandidates.map((c) => c.provider))];\n writeLine();\n writeLine(\n color.dim(\n `Tested ${idx} model(s) across ${testedProviders.length} provider(s): ${testedProviders.join(', ')}.`,\n ),\n );\n writeLine(color.dim('Pin the best: wstack setmodel set <role> <provider>/<model>'));\n return 0;\n }\n\n // \u2500\u2500 eval [categories] [--providers p1,p2] [--max N] [--quick] \u2500\u2500\n if (sub === 'eval' || sub === 'evall') {\n const evalArgs = args.slice(1);\n\n const providersEq = evalArgs.find((a) => a.startsWith('--providers='));\n const providersValue =\n providersEq?.replace('--providers=', '') ??\n (typeof deps.flags?.['providers'] === 'string'\n ? deps.flags['providers']\n : typeof deps.flags?.['provider'] === 'string'\n ? deps.flags['provider']\n : undefined);\n const providerFilter = providersValue\n ? providersValue\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n : undefined;\n\n const maxEq = evalArgs.find((a) => a.startsWith('--max='));\n const maxValue =\n maxEq?.replace('--max=', '') ??\n (typeof deps.flags?.['max'] === 'string' ? deps.flags['max'] : undefined);\n const maxModels = maxValue ? Math.max(1, parseInt(maxValue, 10) || 2) : 2;\n\n const quick =\n evalArgs.includes('--quick') ||\n deps.flags?.['quick'] === true ||\n deps.flags?.['quick'] === 'true';\n const modelsPerCat = quick ? 1 : maxModels;\n\n const roleFilter = evalArgs.find((a) => !a.startsWith('--'));\n const targetCategories = roleFilter\n ? EVAL_CATEGORIES.includes(roleCat(roleFilter))\n ? [roleCat(roleFilter)]\n : []\n : EVAL_CATEGORIES;\n\n if (targetCategories.length === 0 && roleFilter) {\n writeLine(\n `${color.amber('Unknown role/category')}: \"${roleFilter}\". Try: ${EVAL_CATEGORIES.join(', ')}`,\n );\n return 1;\n }\n\n const keyedProviderIds = providers.filter((p) => hasKey(p.id)).map((p) => p.id);\n let targetProviderIds: string[];\n\n if (providerFilter && providerFilter.length > 0) {\n const unknown = providerFilter.filter((pid) => !keyedProviderIds.includes(pid));\n targetProviderIds = providerFilter.filter((pid) => keyedProviderIds.includes(pid));\n if (targetProviderIds.length === 0) {\n const noKeyMsg =\n unknown.length > 0\n ? `None of the specified providers (${unknown.join(', ')}) have API keys. Add keys with wstack auth.`\n : 'None of the specified providers have API keys configured.';\n writeLine(`${color.amber(noKeyMsg)}`);\n return 0;\n }\n } else if (keyedProviderIds.length === 0) {\n writeLine(`${color.amber('No providers have API keys. Add keys with wstack auth.')}`);\n return 0;\n } else if (keyedProviderIds.length === 1) {\n targetProviderIds = keyedProviderIds;\n } else {\n // Interactive: ask user to select providers\n const providerList = keyedProviderIds\n .map((pid, i) => {\n const info = providers.find((p) => p.id === pid);\n return ` ${color.cyan(String(i + 1))}) ${color.bold(pid.padEnd(16))} ${color.dim(info?.name ?? '')}`;\n })\n .join('\\n');\n\n deps.renderer.write(\n `\\n${color.bold('Select providers to evaluate')}\\n\\n${providerList}\\n\\n${color.dim('Enter numbers or provider IDs (comma-separated, or \"all\"):')}\\n`,\n );\n const input = await deps.reader.readLine(' > ');\n const selected = input.trim().toLowerCase();\n\n if (selected === '' || selected === 'all') {\n targetProviderIds = keyedProviderIds;\n } else {\n targetProviderIds = [];\n for (const part of selected.split(',').map((s) => s.trim())) {\n const idx = parseInt(part, 10);\n if (idx >= 1 && idx <= keyedProviderIds.length) {\n const pid = keyedProviderIds[idx - 1]!;\n if (!targetProviderIds.includes(pid)) targetProviderIds.push(pid);\n } else if (keyedProviderIds.includes(part)) {\n if (!targetProviderIds.includes(part)) targetProviderIds.push(part);\n }\n }\n }\n\n if (targetProviderIds.length === 0) {\n writeLine(color.dim('No providers selected.'));\n return 0;\n }\n }\n\n // Build header\n const leaderModel = config.model ?? 'unknown';\n const unknownProviders = providerFilter\n ? providerFilter.filter((pid) => !keyedProviderIds.includes(pid))\n : [];\n const warningLine =\n unknownProviders.length > 0\n ? ` ${color.amber('\u26A0 skipped (no key):')} ${unknownProviders.join(', ')}\\n`\n : '';\n\n writeLine(`${color.bold('Model Competency Evaluation')}`);\n writeLine(\n color.dim(\n `Providers: ${targetProviderIds.join(', ')} | ${targetCategories.length} cats | ${modelsPerCat} model(s)/cat/provider`,\n ),\n );\n writeLine(warningLine);\n writeLine(color.dim(`Leader (ranker): ${config.provider}/${leaderModel}`));\n writeLine();\n\n // Phase 1: collect responses from all providers\n type EvalResult = { model: string; latency: number; tokens: number; text: string };\n const collected = new Map<string, Map<string, EvalResult>>();\n let total = 0;\n let ok = 0;\n\n for (const pid of targetProviderIds) {\n const prov = createProviderForId(pid, config);\n if (!prov) {\n writeLine(color.dim(` \u2298 ${pid}: provider unavailable, skipping`));\n continue;\n }\n\n for (const cat of targetCategories) {\n const task = EVAL_TASKS[cat];\n if (!task) continue;\n\n const candidates = rankModels(\n providers,\n (providerId) => providerId === pid && hasKey(providerId),\n cat,\n modelsPerCat,\n );\n if (candidates.length === 0) continue;\n\n if (!collected.has(cat)) collected.set(cat, new Map());\n\n for (const c of candidates) {\n total++;\n const modelKey = `${pid}/${c.model}`;\n try {\n const start = Date.now();\n const resp = await prov.complete(\n {\n model: c.model,\n system: [{ type: 'text' as const, text: 'Be thorough and correct.' }],\n messages: [\n { role: 'user', content: [{ type: 'text' as const, text: task.prompt }] },\n ],\n maxTokens: 1024,\n },\n { signal: AbortSignal.timeout(45_000) },\n );\n const respText =\n resp.content[0] && 'text' in resp.content[0]\n ? (resp.content[0] as { text: string }).text\n : '';\n const respUsage = resp.usage;\n collected.get(cat)?.set(modelKey, {\n model: modelKey,\n latency: Date.now() - start,\n tokens: (respUsage?.input ?? 0) + (respUsage?.output ?? 0),\n text: respText,\n });\n ok++;\n } catch {\n collected.get(cat)?.set(modelKey, {\n model: modelKey,\n latency: -1,\n tokens: 0,\n text: '',\n });\n }\n }\n }\n }\n\n writeLine(`${color.dim(`Phase 1: ${ok}/${total} calls succeeded`)}`);\n writeLine();\n\n if (collected.size === 0) {\n writeLine(color.amber('No responses collected. Check provider configuration.'));\n return 0;\n }\n\n // Phase 2: leader ranking\n const leaderProvider = createProviderForId(config.provider, config);\n if (leaderProvider) {\n writeLine(`${color.bold('Phase 2')} \u2014 ${color.dim('leader ranks responses')}`);\n writeLine();\n }\n const rankings = new Map<string, Map<string, { rank: number; total: number }>>();\n\n for (const [cat, responses] of collected) {\n const valid = Array.from(responses.values()).filter((r) => r.latency >= 0);\n if (valid.length < 2) {\n if (valid.length === 1) {\n const m = valid[0]?.model;\n if (m !== undefined) {\n if (!rankings.has(m)) rankings.set(m, new Map());\n rankings.get(m)?.set(cat, { rank: 1, total: 1 });\n }\n }\n continue;\n }\n const task = EVAL_TASKS[cat]!;\n if (leaderProvider) {\n const ranked = await rankResponses(leaderProvider, leaderModel, task.prompt, valid);\n for (let i = 0; i < valid.length; i++) {\n const m = valid[ranked[i] ?? i]?.model;\n if (m === undefined) continue;\n if (!rankings.has(m)) rankings.set(m, new Map());\n rankings.get(m)?.set(cat, { rank: i + 1, total: valid.length });\n }\n } else {\n for (const r of valid) {\n if (!rankings.has(r.model)) rankings.set(r.model, new Map());\n rankings.get(r.model)?.set(cat, { rank: 1, total: valid.length });\n }\n }\n }\n\n // Phase 3: report matrix\n writeLine(`${color.bold('Competency Report')}`);\n writeLine();\n const allModels = [...new Set([...rankings.keys()])].sort();\n const catList = [...collected.keys()];\n const modelColWidth = Math.max(24, ...allModels.map((m) => m.length)) + 2;\n const cw = 12;\n\n writeLine(\n ` ${color.dim('model'.padEnd(modelColWidth))}` +\n catList\n .map((c) => color.dim((EVAL_TASKS[c]?.label ?? c).slice(0, cw).padEnd(cw + 2)))\n .join(''),\n );\n writeLine(` ${color.dim('\u2500'.repeat(modelColWidth + catList.length * (cw + 2)))}`);\n\n for (const model of allModels) {\n const mr = rankings.get(model)!;\n const provFromModel = model.split('/')[0] ?? '';\n const modelColor = provFromModel === config.provider ? color.cyan : color.green;\n let row = ` ${modelColor(model.padEnd(modelColWidth))}`;\n for (const cat of catList) {\n const e = mr.get(cat);\n if (e) {\n const pct = Math.round((1 - (e.rank - 1) / Math.max(1, e.total - 1)) * 100);\n const pc = pct >= 80 ? color.green : pct >= 50 ? color.amber : color.red;\n row += `${pc(`#${e.rank} ${pct}%`.padEnd(cw + 2))}`;\n } else {\n row += color.dim('\u2014'.padEnd(cw + 2));\n }\n }\n writeLine(row);\n }\n\n writeLine();\n writeLine(color.dim('#1 100% = best in category. \u2014 = not tested.'));\n writeLine();\n writeLine(color.dim('Pin: wstack setmodel set <role> <provider>/<model>'));\n writeLine(\n color.dim(\n 'Full: wstack modeldiag eval Providers: wstack modeldiag eval --providers=id1,id2',\n ),\n );\n writeLine(\n color.dim('Max: wstack modeldiag eval --max=3 Quick: wstack modeldiag eval --quick'),\n );\n return 0;\n }\n\n // \u2500\u2500 full (default) \u2500\u2500\n // keys\n writeLine(`${color.bold('API Key Status')}`);\n writeLine();\n for (const prov of providers) {\n const k = hasKey(prov.id);\n writeLine(` ${checkMark(k)} ${color.bold(prov.id.padEnd(18))} ${color.dim(prov.name)}`);\n }\n writeLine();\n writeLine(`${color.dim(`Leader: ${config.provider}/${config.model}`)}`);\n\n // caps\n writeLine();\n writeLine(`${color.bold('Model Capabilities')} ${color.dim('\u2014 matched to known profiles')}`);\n writeLine();\n\n for (const prov of providers) {\n if (!hasKey(prov.id)) continue;\n writeLine(` ${color.bold(prov.id)} ${color.dim(`(${prov.name})`)}`);\n\n const tiers: Record<string, CacheModel[]> = {\n premium: [],\n standard: [],\n budget: [],\n unknown: [],\n };\n for (const m of prov.models ?? []) {\n const profile = findProfile(prov.id, m.id);\n tiers[profile?.costTier ?? 'unknown']?.push(m);\n }\n\n for (const tier of ['premium', 'standard', 'budget', 'unknown'] as const) {\n const tierModels = tiers[tier]!;\n if (tierModels.length === 0) continue;\n const label = tier === 'unknown' ? color.dim('unmatched') : `${costLabel(tier)} ${tier}`;\n writeLine(` ${label}`);\n for (const m of tierModels) {\n const cap = m.capabilities;\n const ctx = cap?.contextWindow ?? 0;\n const maxOut = cap?.maxOutputTokens ?? 0;\n const profile = findProfile(prov.id, m.id);\n const family = profile\n ? `${speedLabel(profile.speedTier)} ${color.green(profile.family)}`\n : color.dim('no profile match');\n const pricing = m.pricing\n ? `${color.dim('in')}${fmtPrice(m.pricing.input)} ${color.dim('out')}${fmtPrice(m.pricing.output)}`\n : color.dim('pricing ?');\n writeLine(\n ` ${color.cyan(m.id.padEnd(34))}` +\n `${ctx > 0 ? `ctx ${fmtTokens(ctx).padEnd(6)}` : color.dim('ctx ? ')}` +\n `${maxOut > 0 ? `out ${fmtTokens(maxOut).padEnd(6)}` : ' '}` +\n `${family} ${pricing}`,\n );\n }\n }\n writeLine();\n }\n\n // suggest\n await renderSuggest();\n writeLine();\n writeLine(color.dim('Pin a suggestion: wstack setmodel set <role> <provider>/<model>'));\n writeLine(color.dim('Test candidates: wstack modeldiag bench <role> \"<test prompt>\"'));\n return 0;\n};\n", "import type {\n Config,\n ModelsDevModel,\n ModelsRegistry,\n Provider,\n ProviderConfig,\n ProviderErrorKind,\n Response,\n} from '@wrongstack/core/types';\nimport { ProviderError } from '@wrongstack/core/types';\nimport { toErrorMessage } from '@wrongstack/core/utils';\n\nexport interface ModelSmokeTarget {\n providerId: string;\n modelId: string;\n}\n\nexport interface ModelSmokeOptions {\n allModels: boolean;\n planOnly: boolean;\n json: boolean;\n timeoutMs: number;\n maxTokens: number;\n providerFilter?: string[] | undefined;\n modelFilter?: string[] | undefined;\n}\n\nexport type ModelSmokeResult =\n | {\n providerId: string;\n modelId: string;\n status: 'passed';\n latencyMs: number;\n stopReason: Response['stopReason'];\n usage: Response['usage'];\n }\n | {\n providerId: string;\n modelId: string;\n status: 'failed';\n latencyMs: number;\n error: string;\n errorKind: ProviderErrorKind | 'unknown';\n httpStatus?: number | undefined;\n };\n\nconst DEFAULT_TIMEOUT_MS = 45_000;\nconst DEFAULT_MAX_TOKENS = 32;\n\nfunction csv(value: string | boolean | undefined): string[] | undefined {\n if (typeof value !== 'string') return undefined;\n const values = value\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean);\n return values.length > 0 ? values : undefined;\n}\n\nfunction positiveInteger(\n value: string | boolean | undefined,\n fallback: number,\n label: string,\n): number {\n if (value === undefined) return fallback;\n const parsed = typeof value === 'string' ? Number(value) : Number.NaN;\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new Error(`${label} must be a positive integer.`);\n }\n return parsed;\n}\n\n/**\n * Subcommand flags are normally removed from positional args by the top-level\n * parser. Accept both sources so direct handler tests and programmatic callers\n * behave the same as `wstack modeldiag test ...`.\n */\nexport function parseModelSmokeOptions(\n args: string[],\n flags: Record<string, string | boolean> = {},\n): ModelSmokeOptions {\n const local = new Map<string, string | boolean>();\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (!arg?.startsWith('--')) continue;\n const eq = arg.indexOf('=');\n if (eq >= 0) {\n local.set(arg.slice(2, eq), arg.slice(eq + 1));\n continue;\n }\n const name = arg.slice(2);\n const next = args[i + 1];\n if (next && !next.startsWith('--')) {\n local.set(name, next);\n i++;\n } else {\n local.set(name, true);\n }\n }\n const get = (name: string): string | boolean | undefined => local.get(name) ?? flags[name];\n const providerFilter = csv(get('providers') ?? get('provider'));\n const modelFilter = csv(get('models') ?? get('model'));\n\n return {\n allModels: get('all-models') === true || get('all-models') === 'true',\n planOnly: get('plan') === true || get('plan') === 'true',\n json: get('json') === true || get('json') === 'true',\n timeoutMs: positiveInteger(get('timeout'), DEFAULT_TIMEOUT_MS, '--timeout'),\n maxTokens: positiveInteger(get('max-tokens'), DEFAULT_MAX_TOKENS, '--max-tokens'),\n ...(providerFilter ? { providerFilter } : {}),\n ...(modelFilter ? { modelFilter } : {}),\n };\n}\n\nfunction pushUnique(target: string[], values: Iterable<string | undefined>): void {\n const seen = new Set(target);\n for (const value of values) {\n const normalized = value?.trim();\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n target.push(normalized);\n }\n}\n\nasync function catalogModelsFor(\n providerId: string,\n providerConfig: ProviderConfig | undefined,\n registry: ModelsRegistry,\n): Promise<ModelsDevModel[]> {\n const direct = await registry.getProvider(providerId).catch(() => undefined);\n const inherited =\n direct ??\n (providerConfig?.type && providerConfig.type !== providerId\n ? await registry.getProvider(providerConfig.type).catch(() => undefined)\n : undefined);\n return inherited?.models ?? [];\n}\n\nfunction supportsTextCompletion(model: ModelsDevModel | undefined): boolean {\n const outputs = model?.modalities?.output;\n return !outputs?.length || outputs.includes('text');\n}\n\n/**\n * Build a deterministic provider-major target list from the already-decrypted\n * active config. The normal mode probes one representative model per provider;\n * `--all-models` expands to every catalog-visible plus explicitly configured\n * model.\n */\nexport async function buildModelSmokeTargets(\n config: Config,\n registry: ModelsRegistry,\n options: Pick<ModelSmokeOptions, 'allModels' | 'providerFilter' | 'modelFilter'>,\n): Promise<ModelSmokeTarget[]> {\n const providerIds = Object.keys(config.providers ?? {});\n if (config.provider && !providerIds.includes(config.provider)) providerIds.push(config.provider);\n const providerFilter = options.providerFilter\n ? new Set(options.providerFilter.map((id) => id.toLowerCase()))\n : undefined;\n const modelFilter = options.modelFilter ? new Set(options.modelFilter) : undefined;\n const targets: ModelSmokeTarget[] = [];\n\n for (const providerId of providerIds) {\n if (providerFilter && !providerFilter.has(providerId.toLowerCase())) continue;\n const saved = config.providers?.[providerId];\n const catalogModels = await catalogModelsFor(providerId, saved, registry);\n const catalogById = new Map(catalogModels.map((model) => [model.id, model]));\n const textCatalogModels = catalogModels.filter(supportsTextCompletion);\n const candidates: string[] = [];\n\n if (options.allModels) {\n pushUnique(candidates, saved?.models ?? []);\n pushUnique(candidates, Object.keys(saved?.customModels ?? {}));\n pushUnique(\n candidates,\n textCatalogModels.map((model) => model.id),\n );\n if (providerId === config.provider) pushUnique(candidates, [config.model]);\n pushUnique(candidates, [saved?.model]);\n } else {\n const representative =\n (providerId === config.provider ? config.model : undefined) ??\n saved?.model ??\n saved?.models?.find(Boolean) ??\n Object.keys(saved?.customModels ?? {})[0] ??\n (await registry.suggestModel(providerId).catch(() => undefined)) ??\n textCatalogModels[0]?.id;\n pushUnique(candidates, [representative]);\n }\n\n for (const modelId of candidates) {\n if (modelFilter && !modelFilter.has(modelId)) continue;\n if (!supportsTextCompletion(catalogById.get(modelId))) continue;\n targets.push({ providerId, modelId });\n }\n }\n\n return targets;\n}\n\nfunction classifyFailure(\n err: unknown,\n): Pick<Extract<ModelSmokeResult, { status: 'failed' }>, 'error' | 'errorKind' | 'httpStatus'> {\n if (err instanceof ProviderError || ProviderError.isProviderError(err)) {\n const providerError = err as ProviderError;\n return {\n error: providerError.describe(),\n errorKind: providerError.kind,\n httpStatus: providerError.status,\n };\n }\n const isTimeout =\n (err instanceof Error && (err.name === 'TimeoutError' || err.name === 'AbortError')) ||\n /timed?\\s*out/i.test(toErrorMessage(err));\n return {\n error: toErrorMessage(err),\n errorKind: isTimeout ? 'timeout' : 'unknown',\n };\n}\n\nexport async function runModelSmokeTests(params: {\n targets: ModelSmokeTarget[];\n options: Pick<ModelSmokeOptions, 'timeoutMs' | 'maxTokens'>;\n createProvider: (providerId: string) => Promise<Provider> | Provider;\n onTargetStart?: ((target: ModelSmokeTarget, index: number, total: number) => void) | undefined;\n onTargetComplete?: ((result: ModelSmokeResult, index: number, total: number) => void) | undefined;\n}): Promise<ModelSmokeResult[]> {\n const results: ModelSmokeResult[] = [];\n let providerId: string | undefined;\n let provider: Provider | undefined;\n let providerError: unknown;\n\n for (let index = 0; index < params.targets.length; index++) {\n const target = params.targets[index]!;\n params.onTargetStart?.(target, index, params.targets.length);\n const started = Date.now();\n\n if (target.providerId !== providerId) {\n providerId = target.providerId;\n provider = undefined;\n providerError = undefined;\n try {\n provider = await params.createProvider(target.providerId);\n } catch (err) {\n providerError = err;\n }\n }\n\n if (!provider) {\n const failure = classifyFailure(providerError ?? new Error('Provider could not be created.'));\n const result: ModelSmokeResult = {\n providerId: target.providerId,\n modelId: target.modelId,\n status: 'failed',\n latencyMs: Date.now() - started,\n ...failure,\n };\n results.push(result);\n params.onTargetComplete?.(result, index, params.targets.length);\n continue;\n }\n\n try {\n const response = await provider.complete(\n {\n model: target.modelId,\n messages: [\n {\n role: 'user',\n content: [{ type: 'text', text: 'Reply with exactly: OK' }],\n },\n ],\n maxTokens: params.options.maxTokens,\n },\n { signal: AbortSignal.timeout(params.options.timeoutMs) },\n );\n const result: ModelSmokeResult = {\n providerId: target.providerId,\n modelId: target.modelId,\n status: 'passed',\n latencyMs: Date.now() - started,\n stopReason: response.stopReason,\n usage: response.usage,\n };\n results.push(result);\n params.onTargetComplete?.(result, index, params.targets.length);\n } catch (err) {\n const result: ModelSmokeResult = {\n providerId: target.providerId,\n modelId: target.modelId,\n status: 'failed',\n latencyMs: Date.now() - started,\n ...classifyFailure(err),\n };\n results.push(result);\n params.onTargetComplete?.(result, index, params.targets.length);\n }\n }\n\n return results;\n}\n", "import { color } from '@wrongstack/core/utils';\n\nexport interface ModelProfile {\n provider: string;\n pattern: RegExp;\n family: string;\n strengths: string[];\n weaknesses?: string[];\n bestFor: string[];\n avoidFor?: string[];\n costTier: 'budget' | 'standard' | 'premium';\n speedTier: 'fast' | 'normal' | 'slow';\n minContext?: number;\n}\n\nexport const MODEL_PROFILES: ModelProfile[] = [\n {\n provider: 'anthropic',\n pattern: /claude-opus/i,\n family: 'Claude Opus',\n strengths: ['reasoning', 'planning'],\n bestFor: ['planning', 'security', 'debugging'],\n costTier: 'premium',\n speedTier: 'slow',\n },\n {\n provider: 'anthropic',\n pattern: /claude-haiku/i,\n family: 'Claude Haiku',\n strengths: ['speed'],\n bestFor: ['lightweight', 'docs'],\n avoidFor: ['planning'],\n costTier: 'budget',\n speedTier: 'fast',\n },\n {\n provider: 'openai',\n pattern: /gpt-5|o3|o4/i,\n family: 'GPT-5/o3/o4',\n strengths: ['reasoning', 'coding'],\n bestFor: ['planning', 'coding', 'debugging'],\n costTier: 'premium',\n speedTier: 'normal',\n },\n {\n provider: 'openai',\n pattern: /gpt-4/i,\n family: 'GPT-4',\n strengths: ['coding'],\n bestFor: ['coding', 'docs'],\n costTier: 'standard',\n speedTier: 'fast',\n },\n {\n provider: 'openai',\n pattern: /gpt-4o-mini/i,\n family: 'GPT-4o Mini',\n strengths: ['speed'],\n bestFor: ['lightweight', 'docs'],\n avoidFor: ['planning'],\n costTier: 'budget',\n speedTier: 'fast',\n },\n {\n provider: 'google',\n pattern: /gemini-(?:2\\.5|3)/i,\n family: 'Gemini 2.5/3',\n strengths: ['context', 'coding'],\n bestFor: ['coding', 'data'],\n costTier: 'standard',\n speedTier: 'normal',\n },\n {\n provider: 'google',\n pattern: /gemini.*flash/i,\n family: 'Gemini Flash',\n strengths: ['speed'],\n bestFor: ['lightweight', 'docs'],\n avoidFor: ['planning'],\n costTier: 'budget',\n speedTier: 'fast',\n },\n {\n provider: 'deepseek',\n pattern: /deepseek/i,\n family: 'DeepSeek',\n strengths: ['coding', 'cost-effective'],\n bestFor: ['coding', 'general'],\n costTier: 'standard',\n speedTier: 'normal',\n },\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nexport function fmtTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n return String(n);\n}\n\nexport function fmtMs(ms: number): string {\n if (ms >= 1000) return `${(ms / 1000).toFixed(1)}s`;\n return `${ms}ms`;\n}\n\nexport function fmtPrice(usdPer1M: number | undefined): string {\n if (usdPer1M === undefined) return color.dim('?');\n if (usdPer1M >= 10) return `$${usdPer1M.toFixed(1)}`;\n return `$${usdPer1M.toFixed(2)}`;\n}\n\nexport function checkMark(ok: boolean): string {\n return ok ? color.green('\u2713') : color.red('\u2717');\n}\n\nexport function costLabel(tier: string): string {\n switch (tier) {\n case 'premium':\n return color.red('$$$');\n case 'standard':\n return color.amber('$$');\n case 'budget':\n return color.green('$');\n default:\n return color.dim('?');\n }\n}\n\nexport function speedLabel(tier: string): string {\n switch (tier) {\n case 'fast':\n return color.green('\u26A1');\n case 'normal':\n return color.amber('\u2192');\n case 'slow':\n return color.red('\uD83D\uDC22');\n default:\n return color.dim('?');\n }\n}\n\nexport function scoreBar(score: number, max: number): string {\n const pct = Math.min(1, Math.max(0, score / max));\n const filled = Math.round(pct * 10);\n const bar = color.green('\u2588'.repeat(filled)) + color.dim('\u2591'.repeat(10 - filled));\n return `${bar} ${score}/${max}`;\n}\n\nexport interface CacheModel {\n id: string;\n name?: string | undefined;\n capabilities?:\n | { contextWindow?: number | undefined; maxOutputTokens?: number | undefined }\n | undefined;\n pricing?: { input?: number; output?: number } | undefined;\n}\n\nexport interface CacheProvider {\n id: string;\n name: string;\n family: string;\n models?: CacheModel[];\n}\n\nexport interface ScoredModel {\n provider: string;\n model: string;\n profile?: ModelProfile | undefined;\n score: number;\n ctxWindow: number;\n maxOutput: number;\n inputPrice?: number | undefined;\n outputPrice?: number | undefined;\n}\n\nexport const ROLE_CATEGORY: Record<string, string> = {\n 'security-scanner': 'security',\n 'security-reviewer': 'security',\n 'bug-hunter': 'debugging',\n debugger: 'debugging',\n tracer: 'debugging',\n planner: 'planning',\n architect: 'planning',\n 'refactor-planner': 'planning',\n verifier: 'testing',\n test: 'testing',\n e2e: 'testing',\n document: 'docs',\n simplifier: 'docs',\n 'code-reviewer': 'review',\n reviewer: 'review',\n critic: 'review',\n executor: 'coding',\n refactor: 'refactoring',\n migration: 'coding',\n frontend: 'frontend',\n backend: 'backend',\n api: 'backend',\n auth: 'backend',\n designer: 'frontend',\n analyst: 'data',\n data: 'data',\n database: 'data',\n explore: 'planning',\n search: 'planning',\n researcher: 'planning',\n};\n\nexport function findProfile(pid: string, mid: string): ModelProfile | undefined {\n for (const p of MODEL_PROFILES) {\n if (p.provider === pid && p.pattern.test(mid)) return p;\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Candidate scoring\n// ---------------------------------------------------------------------------\n\nexport function scoreModel(\n pid: string,\n mid: string,\n category: string,\n ctxWindow: number,\n): { score: number; profile?: ModelProfile | undefined } {\n const profile = findProfile(pid, mid);\n let score = 50;\n\n if (profile) {\n if (profile.bestFor.includes(category as never)) score += 35;\n if (profile.avoidFor?.includes(category as never)) score -= 50;\n if (category === 'planning' && profile.costTier === 'premium') score += 15;\n if (profile.speedTier === 'slow' && category === 'planning') score += 10;\n if (profile.costTier === 'budget' && category !== 'planning' && category !== 'security')\n score += 10;\n }\n\n if (ctxWindow > 200_000) score += 10;\n else if (ctxWindow > 100_000) score += 5;\n else if (ctxWindow > 32_000) score += 2;\n\n return { score, profile };\n}\n\nexport function rankModels(\n providers: CacheProvider[],\n hasKey: (pid: string) => boolean,\n category: string,\n limit: number,\n): ScoredModel[] {\n const candidates: ScoredModel[] = [];\n\n for (const prov of providers) {\n if (!hasKey(prov.id)) continue;\n for (const m of prov.models ?? []) {\n const ctxWindow = m.capabilities?.contextWindow ?? 0;\n const { score, profile } = scoreModel(prov.id, m.id, category, ctxWindow);\n if (score > 0) {\n candidates.push({\n provider: prov.id,\n model: m.id,\n profile,\n score,\n ctxWindow,\n maxOutput: m.capabilities?.maxOutputTokens ?? 0,\n inputPrice: m.pricing?.input,\n outputPrice: m.pricing?.output,\n });\n }\n }\n }\n\n candidates.sort((a, b) => b.score - a.score);\n return candidates.slice(0, limit);\n}\n\n// ---------------------------------------------------------------------------\n// Standardized evaluation prompts\n// ---------------------------------------------------------------------------\n\ninterface EvalTask {\n label: string;\n prompt: string;\n}\n\nexport const EVAL_TASKS: Record<string, EvalTask> = {\n coding: {\n label: 'Code Generation',\n prompt:\n 'Write a TypeScript function parseCSV(input: string): { headers: string[]; rows: string[][] } that handles quoted fields, escaped quotes, and empty lines. Return an error string on malformed input. Keep under 40 lines.',\n },\n planning: {\n label: 'Architecture Planning',\n prompt:\n 'Design the folder structure and key interfaces for a monorepo CLI tool with slash commands, model routing, subagent spawning, and config persistence. List packages, their responsibilities, and the 5 most important TypeScript interfaces.',\n },\n security: {\n label: 'Vulnerability Detection',\n prompt:\n 'Review this code for security issues:\\n```ts\\napp.get(\"/api/user\", (req, res) => {\\n const id = req.query.id;\\n const user = db.query(\"SELECT * FROM users WHERE id = \" + id);\\n res.json(user);\\n});\\n\\napp.post(\"/api/run\", (req, res) => {\\n const { cmd } = req.body;\\n exec(\"echo \" + cmd, (err, stdout) => res.send(stdout));\\n});\\n```\\nList every vulnerability, its severity (critical/high/medium), and the exact fix.',\n },\n debugging: {\n label: 'Bug Diagnosis',\n prompt:\n 'This async function has 2 bugs. Find and fix both:\\n```ts\\nasync function processBatch(items: string[]) {\\n const results = [];\\n for (const item of items) {\\n const result = await fetch(\"https://api.example.com/\" + item);\\n results.push(result);\\n }\\n return results.map(r => r.json());\\n}\\n```\\nExplain what each bug is, why it fails, and write the corrected version.',\n },\n testing: {\n label: 'Test Authoring',\n prompt:\n 'Write vitest test cases for this deepMerge function:\\n```ts\\nfunction deepMerge(base: Record<string, unknown>, overrides: Record<string, unknown>): Record<string, unknown> {\\n const merged = { ...base };\\n for (const [key, val] of Object.entries(overrides)) {\\n if (val === null) { delete merged[key]; continue; }\\n if (typeof val === \"object\" && !Array.isArray(val) && typeof merged[key] === \"object\" && !Array.isArray(merged[key])) {\\n merged[key] = deepMerge(merged[key] as Record<string, unknown>, val as Record<string, unknown>);\\n } else { merged[key] = val; }\\n }\\n return merged;\\n}\\n```\\nCover: happy path, edge cases, and error conditions.',\n },\n docs: {\n label: 'Documentation',\n prompt:\n 'Write TSDoc comments for this RateLimiter interface. Include @param, @returns, @throws, and @example for each method:\\n```ts\\ninterface RateLimiter {\\n tryAcquire(key: string, maxPerWindow: number, windowMs: number): Promise<boolean>;\\n getRemaining(key: string): Promise<number>;\\n reset(key: string): Promise<void>;\\n}\\n```',\n },\n review: {\n label: 'Code Review',\n prompt:\n 'Review this PR change:\\n```diff\\n async function loadConfig(path: string) {\\n- const raw = await fs.readFile(path, \"utf8\");\\n- return JSON.parse(raw);\\n+ const raw = await fs.readFile(path);\\n+ const config = JSON.parse(raw);\\n+ process.env.API_KEY = config.apiKey;\\n+ return config;\\n }\\n```\\nList issues by severity (blocking / should-fix / nit) and explain your reasoning.',\n },\n refactoring: {\n label: 'Refactoring',\n prompt:\n 'Refactor this nested condition into a cleaner pattern:\\n```ts\\nfunction getDiscount(user: { type: string; years: number; coupon?: string }): number {\\n if (user.type === \"premium\") {\\n if (user.years > 5) {\\n if (user.coupon === \"BLACKFRIDAY\") return 0.5;\\n return 0.3;\\n }\\n return 0.2;\\n }\\n if (user.type === \"standard\") {\\n if (user.years > 3) return 0.15;\\n return 0.1;\\n }\\n return 0;\\n}\\n```\\nShow your refactored code and explain why your approach is cleaner.',\n },\n};\n\nexport const EVAL_CATEGORIES = Object.keys(EVAL_TASKS);\n\nexport function roleCat(role: string): string {\n return ROLE_CATEGORY[role] ?? 'general';\n}\n\n// ---------------------------------------------------------------------------\n// Provider construction\n// ---------------------------------------------------------------------------\n"],
5
+ "mappings": "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",
6
+ "names": ["color", "toErrorMessage", "color", "toErrorMessage"]
7
+ }
@@ -0,0 +1,115 @@
1
+ import "./chunk-7OCVIDC7.js";
2
+
3
+ // src/subcommands/handlers/permissions.ts
4
+ import { DefaultPermissionPolicy } from "@wrongstack/core/security";
5
+ import { resolveWstackPaths } from "@wrongstack/core/utils";
6
+ var permissionsCmd = async (args, deps) => {
7
+ const subCmd = args[0];
8
+ if (subCmd === "help" || subCmd === "--help" || subCmd === "-h" || !subCmd || subCmd === "explain" && !args[1]) {
9
+ if (subCmd !== "explain" && subCmd !== "help" && subCmd !== void 0) {
10
+ deps.renderer.writeError(`Unknown permissions subcommand: ${subCmd}
11
+ `);
12
+ }
13
+ deps.renderer.write(usage());
14
+ return subCmd && subCmd !== "explain" && subCmd !== "help" && subCmd !== void 0 ? 1 : 0;
15
+ }
16
+ if (subCmd !== "explain") {
17
+ deps.renderer.writeError(`Unknown permissions subcommand: ${subCmd}
18
+ `);
19
+ deps.renderer.write(usage());
20
+ return 1;
21
+ }
22
+ const toolName = args[1];
23
+ if (!toolName) {
24
+ deps.renderer.writeError("Missing tool name.\n");
25
+ deps.renderer.write(usage());
26
+ return 1;
27
+ }
28
+ const inputIdx = args.indexOf("--input");
29
+ const flagInput = deps.flags?.["input"];
30
+ const rawInput = typeof flagInput === "string" ? flagInput : inputIdx >= 0 && inputIdx + 1 < args.length ? args[inputIdx + 1] : void 0;
31
+ const jsonOutput = deps.flags?.["json"] === true || args.includes("--json");
32
+ let input = {};
33
+ if (rawInput) {
34
+ try {
35
+ input = JSON.parse(rawInput);
36
+ } catch {
37
+ deps.renderer.writeError(`Invalid --input JSON: ${rawInput}
38
+ `);
39
+ return 1;
40
+ }
41
+ }
42
+ if (!deps.toolRegistry) {
43
+ deps.renderer.writeError("Tool registry is not available.\n");
44
+ return 1;
45
+ }
46
+ const tool = deps.toolRegistry.get(toolName);
47
+ if (!tool) {
48
+ deps.renderer.writeError(`Unknown tool: "${toolName}". Available tools: ${deps.toolRegistry.list().map((t) => t.name).join(", ")}
49
+ `);
50
+ return 1;
51
+ }
52
+ const paths = resolveWstackPaths({ projectRoot: deps.projectRoot, userHome: deps.userHome });
53
+ const trustFile = paths.projectTrust;
54
+ const readSubjects = /* @__PURE__ */ new Set();
55
+ const ctx = {
56
+ projectRoot: deps.projectRoot,
57
+ cwd: deps.cwd,
58
+ hasRead(subject) {
59
+ return readSubjects.has(subject);
60
+ }
61
+ };
62
+ const policy = new DefaultPermissionPolicy({
63
+ trustFile,
64
+ yolo: deps.flags?.["yolo"] ?? false
65
+ });
66
+ await policy.reload();
67
+ const trace = await policy.explain(tool, input, ctx);
68
+ if (jsonOutput) {
69
+ deps.renderer.write(JSON.stringify(trace, null, 2) + "\n");
70
+ } else {
71
+ deps.renderer.write(formatTrace(trace) + "\n");
72
+ }
73
+ return 0;
74
+ };
75
+ function formatTrace(trace) {
76
+ const lines = [];
77
+ lines.push(`Permission trace for "${trace.toolName}"`);
78
+ lines.push(`Subject: ${trace.subject ?? "(none)"}`);
79
+ lines.push("");
80
+ for (let i = 0; i < trace.steps.length; i++) {
81
+ const step = trace.steps[i];
82
+ const winner = i === trace.winnerIndex ? " \u2190 WINNER" : "";
83
+ const matched = step.matched ? "\u2713" : " ";
84
+ lines.push(` ${matched} [${i}] ${step.rule}${winner}`);
85
+ lines.push(` decision: ${step.decision} source: ${step.source}`);
86
+ lines.push(` ${step.detail}`);
87
+ if (i < trace.steps.length - 1) lines.push("");
88
+ }
89
+ lines.push("");
90
+ lines.push(`Effective: ${trace.decision.permission} (source: ${trace.decision.source})`);
91
+ if (trace.decision.reason) {
92
+ lines.push(`Reason: ${trace.decision.reason}`);
93
+ }
94
+ if (trace.decision.riskTier) {
95
+ lines.push(`Risk tier: ${trace.decision.riskTier}`);
96
+ }
97
+ return lines.join("\n");
98
+ }
99
+ function usage() {
100
+ return `Usage:
101
+ wstack permissions explain <tool> --input '<json>' [--json]
102
+
103
+ Examples:
104
+ wstack permissions explain bash --input '{"command":"rm -rf /"}'
105
+ wstack permissions explain read --input '{"path":".env"}' --json
106
+
107
+ Flags:
108
+ --input <json> Tool input arguments as a JSON object
109
+ --json Output as structured JSON instead of human-readable text
110
+ `;
111
+ }
112
+ export {
113
+ permissionsCmd
114
+ };
115
+ //# sourceMappingURL=permissions-FNYLZIL4.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/subcommands/handlers/permissions.ts"],
4
+ "sourcesContent": ["import { DefaultPermissionPolicy } from '@wrongstack/core/security';\nimport type { PermissionTrace } from '@wrongstack/core/types';\nimport { resolveWstackPaths } from '@wrongstack/core/utils';\nimport type { Context } from '@wrongstack/core/agent';\nimport type { SubcommandHandler } from '../contracts.js';\n\n/**\n * `wstack permissions explain <tool> --input '<json>' [--json]`\n *\n * Side-effect-free permission decision explainer. Evaluates the same\n * rules as `DefaultPermissionPolicy.evaluate()` without prompting the\n * user, writing to trust files, or mutating session state.\n */\nexport const permissionsCmd: SubcommandHandler = async (args, deps) => {\n const subCmd = args[0];\n\n if (subCmd === 'help' || subCmd === '--help' || subCmd === '-h' || !subCmd || subCmd === 'explain' && !args[1]) {\n if (subCmd !== 'explain' && subCmd !== 'help' && subCmd !== undefined) {\n deps.renderer.writeError(`Unknown permissions subcommand: ${subCmd}\\n`);\n }\n deps.renderer.write(usage());\n return subCmd && subCmd !== 'explain' && subCmd !== 'help' && subCmd !== undefined ? 1 : 0;\n }\n\n if (subCmd !== 'explain') {\n deps.renderer.writeError(`Unknown permissions subcommand: ${subCmd}\\n`);\n deps.renderer.write(usage());\n return 1;\n }\n\n // `wstack permissions explain <tool> [--input '<json>'] [--json]`\n const toolName = args[1];\n if (!toolName) {\n deps.renderer.writeError('Missing tool name.\\n');\n deps.renderer.write(usage());\n return 1;\n }\n\n // Parse flags\n const inputIdx = args.indexOf('--input');\n const flagInput = deps.flags?.['input'];\n // Precedence: parsed top-level flags first, then positional --input/<value> as fallback.\n const rawInput =\n typeof flagInput === 'string'\n ? flagInput\n : inputIdx >= 0 && inputIdx + 1 < args.length\n ? args[inputIdx + 1]\n : undefined;\n const jsonOutput = deps.flags?.['json'] === true || args.includes('--json');\n\n // Parse input JSON\n let input: unknown = {};\n if (rawInput) {\n try {\n input = JSON.parse(rawInput);\n } catch {\n deps.renderer.writeError(`Invalid --input JSON: ${rawInput}\\n`);\n return 1;\n }\n }\n\n // Resolve tool from registry\n if (!deps.toolRegistry) {\n deps.renderer.writeError('Tool registry is not available.\\n');\n return 1;\n }\n const tool = deps.toolRegistry.get(toolName);\n if (!tool) {\n deps.renderer.writeError(`Unknown tool: \"${toolName}\". Available tools: ${deps.toolRegistry.list().map(t => t.name).join(', ')}\\n`);\n return 1;\n }\n\n // Build trust file path\n const paths = resolveWstackPaths({ projectRoot: deps.projectRoot, userHome: deps.userHome });\n const trustFile = paths.projectTrust;\n\n // Build a minimal Context with hasRead stub\n const readSubjects = new Set<string>();\n const ctx: Context = {\n projectRoot: deps.projectRoot,\n cwd: deps.cwd,\n hasRead(subject: string) {\n return readSubjects.has(subject);\n },\n } as unknown as Context;\n\n // Create the policy and run explain\n const policy = new DefaultPermissionPolicy({\n trustFile,\n yolo: (deps.flags?.['yolo'] as boolean) ?? false,\n });\n await policy.reload();\n\n const trace: PermissionTrace = await policy.explain(tool, input, ctx);\n\n if (jsonOutput) {\n deps.renderer.write(JSON.stringify(trace, null, 2) + '\\n');\n } else {\n deps.renderer.write(formatTrace(trace) + '\\n');\n }\n\n return 0;\n};\n\nfunction formatTrace(trace: PermissionTrace): string {\n const lines: string[] = [];\n lines.push(`Permission trace for \"${trace.toolName}\"`);\n lines.push(`Subject: ${trace.subject ?? '(none)'}`);\n lines.push('');\n\n for (let i = 0; i < trace.steps.length; i++) {\n const step = trace.steps[i]!;\n const winner = i === trace.winnerIndex ? ' \u2190 WINNER' : '';\n const matched = step.matched ? '\u2713' : ' ';\n lines.push(` ${matched} [${i}] ${step.rule}${winner}`);\n lines.push(` decision: ${step.decision} source: ${step.source}`);\n lines.push(` ${step.detail}`);\n if (i < trace.steps.length - 1) lines.push('');\n }\n\n lines.push('');\n lines.push(`Effective: ${trace.decision.permission} (source: ${trace.decision.source})`);\n if (trace.decision.reason) {\n lines.push(`Reason: ${trace.decision.reason}`);\n }\n if (trace.decision.riskTier) {\n lines.push(`Risk tier: ${trace.decision.riskTier}`);\n }\n\n return lines.join('\\n');\n}\n\nfunction usage(): string {\n return (\n 'Usage:\\n' +\n ' wstack permissions explain <tool> --input \\'<json>\\' [--json]\\n\\n' +\n 'Examples:\\n' +\n ' wstack permissions explain bash --input \\'{\"command\":\"rm -rf /\"}\\'\\n' +\n ' wstack permissions explain read --input \\'{\"path\":\".env\"}\\' --json\\n\\n' +\n 'Flags:\\n' +\n ' --input <json> Tool input arguments as a JSON object\\n' +\n ' --json Output as structured JSON instead of human-readable text\\n'\n );\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ export interface ProviderPickerState {
2
+ query: string;
3
+ selected: number;
4
+ status: 'typing' | 'submitted' | 'cancelled';
5
+ }
6
+ export declare function applyPickerKey(state: ProviderPickerState, chunk: string, matchCount: number): ProviderPickerState;
7
+ //# sourceMappingURL=picker-key-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker-key-state.d.ts","sourceRoot":"","sources":["../src/picker-key-state.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;CAC9C;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,mBAAmB,EAC1B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,mBAAmB,CA+BrB"}
@@ -0,0 +1,6 @@
1
+ import type { ModelsDevModel, ResolvedProvider } from '@wrongstack/core/types';
2
+ export declare const LIVE_PICKER_MAX_VISIBLE = 15;
3
+ export declare function filterModels(query: string, models: ModelsDevModel[]): ModelsDevModel[];
4
+ export declare function renderLiveModelList(query: string, filtered: ModelsDevModel[], selectedIdx: number, header: string): string;
5
+ export declare function runLiveModelPicker(provider: ResolvedProvider, defaultModel?: string): Promise<ModelsDevModel | undefined>;
6
+ //# sourceMappingURL=picker-model-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker-model-picker.d.ts","sourceRoot":"","sources":["../src/picker-model-picker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAc/E,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAItF;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,EAAE,EAC1B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,MAAM,CAiDR;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,gBAAgB,EAC1B,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CA6ErC"}
@@ -0,0 +1,17 @@
1
+ import type { ResolvedProvider } from '@wrongstack/core/types';
2
+ export declare const theme: {
3
+ accent: (s: string) => string;
4
+ chrome: (s: string) => string;
5
+ cursor: (s: string) => string;
6
+ ctx: (s: string) => string;
7
+ cost: (s: string) => string;
8
+ caps: (s: string) => string;
9
+ };
10
+ export declare function padVisible(s: string, width: number): string;
11
+ export declare function boxTop(title: string): string;
12
+ export declare function boxBottom(): string;
13
+ export declare function boxRow(content: string): string;
14
+ export declare function boxDivider(): string;
15
+ export declare function keyHints(pairs: Array<[string, string]>): string;
16
+ export declare function codexPickerPreamble(provider: ResolvedProvider): string;
17
+ //# sourceMappingURL=picker-ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker-ui.d.ts","sourceRoot":"","sources":["../src/picker-ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/D,eAAO,MAAM,KAAK;IAChB,MAAM;IACN,MAAM;IACN,MAAM,MAAM,MAAM,KAAG,MAAM;IAC3B,GAAG;IACH,IAAI;IACJ,IAAI;CACL,CAAC;AA0BF,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAM3D;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO5C;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAE/D;AAOD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAGtE"}
package/dist/picker.d.ts CHANGED
@@ -1,6 +1,9 @@
1
- import type { Config, ModelsDevModel, ModelsRegistry, ResolvedProvider } from '@wrongstack/core/types';
1
+ import type { Config, ModelsRegistry, ResolvedProvider } from '@wrongstack/core/types';
2
2
  import type { ReadlineInputReader } from './input-reader.js';
3
3
  import type { TerminalRenderer } from './renderer.js';
4
+ export { applyPickerKey, type ProviderPickerState } from './picker-key-state.js';
5
+ export { filterModels, LIVE_PICKER_MAX_VISIBLE, renderLiveModelList } from './picker-model-picker.js';
6
+ export { codexPickerPreamble } from './picker-ui.js';
4
7
  /**
5
8
  * Filter providers by a free-text query: case-insensitive substring match
6
9
  * against the provider id OR display name. An empty/whitespace query returns
@@ -20,22 +23,6 @@ import type { TerminalRenderer } from './renderer.js';
20
23
  */
21
24
  export declare function appendLocalPresetProviders(merged: ResolvedProvider[]): ResolvedProvider[];
22
25
  export declare function filterProviders(query: string, providers: ResolvedProvider[]): ResolvedProvider[];
23
- export interface ProviderPickerState {
24
- query: string;
25
- selected: number;
26
- status: 'typing' | 'submitted' | 'cancelled';
27
- }
28
- /**
29
- * Advance the live type-to-filter provider picker by one raw input chunk.
30
- * Pure: given the current state, a key chunk (a single keystroke, a paste, or
31
- * a multi-byte arrow escape sequence), and the number of providers matching
32
- * the CURRENT query, returns the next state. The raw-stdin loop in
33
- * runLiveProviderPicker is a thin shell around this so the input logic is
34
- * fully unit-testable.
35
- */
36
- export declare function applyPickerKey(state: ProviderPickerState, chunk: string, matchCount: number): ProviderPickerState;
37
- /** Max providers rendered in one live-picker frame (keeps a frame in-viewport). */
38
- export declare const LIVE_PICKER_MAX_VISIBLE = 15;
39
26
  /**
40
27
  * Render the live type-to-filter provider view as one string: the query line,
41
28
  * providers grouped by wire family (preferred order, alphabetical within each
@@ -44,26 +31,6 @@ export declare const LIVE_PICKER_MAX_VISIBLE = 15;
44
31
  * loop redraws by moving the cursor up and clearing). Pure.
45
32
  */
46
33
  export declare function renderLiveProviderList(query: string, filtered: ResolvedProvider[], selectedIdx: number, savedSet?: Set<string>): string;
47
- /**
48
- * Filter models by a free-text query: case-insensitive substring match against
49
- * the model id OR display name. Empty/whitespace query returns all (copy).
50
- * Powers the live type-to-filter model picker.
51
- */
52
- export declare function filterModels(query: string, models: ModelsDevModel[]): ModelsDevModel[];
53
- /**
54
- * Render the live type-to-filter model view as one string: the provider header,
55
- * the query line, models sorted newest-first (release_date desc) with context /
56
- * cost / capability columns, the selected model marked with ▶, and a key hint.
57
- * Capped to LIVE_PICKER_MAX_VISIBLE rows so a frame fits the viewport. Pure.
58
- */
59
- export declare function renderLiveModelList(query: string, filtered: ModelsDevModel[], selectedIdx: number, header: string): string;
60
- /**
61
- * openai-codex picker preamble — the "Select Model and Effort" header + the
62
- * legacy-models note, rendered above the live type-to-filter list (and mirrored
63
- * by the numbered picker's codex block). Returns an empty string for any other
64
- * provider. Pure so it can be unit-tested without a TTY.
65
- */
66
- export declare function codexPickerPreamble(provider: ResolvedProvider): string;
67
34
  /**
68
35
  * Save provider + model to the global config file.
69
36
  * Creates backups + history entries before writing.
@@ -1 +1 @@
1
- {"version":3,"file":"picker.d.ts","sourceRoot":"","sources":["../src/picker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAKvG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AA+HtD;;;;;GAKG;AACH;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAoBzF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAMhG;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;CAC9C;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,mBAAmB,EAC1B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,mBAAmB,CAiCrB;AAaD,mFAAmF;AACnF,eAAO,MAAM,uBAAuB,KAAK,CAAC;AA6B1C;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACrB,MAAM,CA8DR;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAItF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,EAAE,EAC1B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,MAAM,CA6DR;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAGtE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,MAAM,MAA+C,GAC5D,OAAO,CAAC,OAAO,CAAC,CA0DlB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAiDD,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,gBAAgB,EAAE,EAC/B,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACrB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAwEvC;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CA6OpC"}
1
+ {"version":3,"file":"picker.d.ts","sourceRoot":"","sources":["../src/picker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAKvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAiB7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACtG,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD;;;;;GAKG;AACH;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAoBzF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAMhG;AAwCD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACrB,MAAM,CA8DR;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,MAAM,MAA+C,GAC5D,OAAO,CAAC,OAAO,CAAC,CA0DlB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAiDD,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,gBAAgB,EAAE,EAC/B,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACrB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAwEvC;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CA6OpC"}
@@ -0,0 +1,40 @@
1
+ import {
2
+ runPluginManagementCommand
3
+ } from "./chunk-XWEGWYDU.js";
4
+ import {
5
+ activeProfileConfigPath
6
+ } from "./chunk-DPJZQCVP.js";
7
+ import "./chunk-7OCVIDC7.js";
8
+
9
+ // src/subcommands/handlers/plugin-usage.ts
10
+ var pluginCmd = async (args, deps) => {
11
+ const result = await runPluginManagementCommand(args, {
12
+ config: deps.config,
13
+ configPath: activeProfileConfigPath(deps.paths, deps.config)
14
+ });
15
+ if (result.level === "error") {
16
+ deps.renderer.writeError(`${result.message}
17
+ `);
18
+ } else if (result.level === "info") {
19
+ deps.renderer.writeInfo(`${result.message}
20
+ `);
21
+ } else {
22
+ deps.renderer.write(`${result.message}
23
+ `);
24
+ }
25
+ return result.code;
26
+ };
27
+ var usageCmd = async (_args, deps) => {
28
+ if (!deps.sessionStore) return 0;
29
+ const list = await deps.sessionStore.list(100);
30
+ let totalIn = 0;
31
+ for (const s of list) totalIn += s.tokenTotal;
32
+ deps.renderer.write(`Sessions: ${list.length} total tokens: ${totalIn}
33
+ `);
34
+ return 0;
35
+ };
36
+ export {
37
+ pluginCmd,
38
+ usageCmd
39
+ };
40
+ //# sourceMappingURL=plugin-usage-OU6X6LM3.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/subcommands/handlers/plugin-usage.ts"],
4
+ "sourcesContent": ["import { runPluginManagementCommand } from '../../plugin-management.js';\nimport { activeProfileConfigPath } from '../../profile-config-path.js';\nimport type { SubcommandHandler } from '../index.js';\n\nexport const pluginCmd: SubcommandHandler = async (args, deps) => {\n const result = await runPluginManagementCommand(args, {\n config: deps.config,\n configPath: activeProfileConfigPath(deps.paths, deps.config),\n });\n if (result.level === 'error') {\n deps.renderer.writeError(`${result.message}\\n`);\n } else if (result.level === 'info') {\n deps.renderer.writeInfo(`${result.message}\\n`);\n } else {\n deps.renderer.write(`${result.message}\\n`);\n }\n return result.code;\n};\n\nexport const usageCmd: SubcommandHandler = async (_args, deps) => {\n if (!deps.sessionStore) return 0;\n const list = await deps.sessionStore.list(100);\n let totalIn = 0;\n for (const s of list) totalIn += s.tokenTotal;\n deps.renderer.write(`Sessions: ${list.length} total tokens: ${totalIn}\\n`);\n return 0;\n};\n"],
5
+ "mappings": ";;;;;;;;;;AAIO,IAAM,YAA+B,OAAO,MAAM,SAAS;AAChE,QAAM,SAAS,MAAM,2BAA2B,MAAM;AAAA,IACpD,QAAQ,KAAK;AAAA,IACb,YAAY,wBAAwB,KAAK,OAAO,KAAK,MAAM;AAAA,EAC7D,CAAC;AACD,MAAI,OAAO,UAAU,SAAS;AAC5B,SAAK,SAAS,WAAW,GAAG,OAAO,OAAO;AAAA,CAAI;AAAA,EAChD,WAAW,OAAO,UAAU,QAAQ;AAClC,SAAK,SAAS,UAAU,GAAG,OAAO,OAAO;AAAA,CAAI;AAAA,EAC/C,OAAO;AACL,SAAK,SAAS,MAAM,GAAG,OAAO,OAAO;AAAA,CAAI;AAAA,EAC3C;AACA,SAAO,OAAO;AAChB;AAEO,IAAM,WAA8B,OAAO,OAAO,SAAS;AAChE,MAAI,CAAC,KAAK,aAAc,QAAO;AAC/B,QAAM,OAAO,MAAM,KAAK,aAAa,KAAK,GAAG;AAC7C,MAAI,UAAU;AACd,aAAW,KAAK,KAAM,YAAW,EAAE;AACnC,OAAK,SAAS,MAAM,aAAa,KAAK,MAAM,mBAAmB,OAAO;AAAA,CAAI;AAC1E,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,24 @@
1
+ import {
2
+ BUILTIN_PLUGIN_CONFIG_NAMES,
3
+ BUILTIN_PLUGIN_FACTORIES,
4
+ DEPRECATED_PLUGIN_NAMES,
5
+ _resetDeprecatedWarningsForTests,
6
+ builtinPluginNameFromSpec,
7
+ pluginNameFromSpec,
8
+ setupPlugins,
9
+ warnIfDeprecatedPluginName
10
+ } from "./chunk-QUNHS6O3.js";
11
+ import "./chunk-XWEGWYDU.js";
12
+ import "./chunk-TYO2OVAD.js";
13
+ import "./chunk-7OCVIDC7.js";
14
+ export {
15
+ BUILTIN_PLUGIN_CONFIG_NAMES,
16
+ BUILTIN_PLUGIN_FACTORIES,
17
+ DEPRECATED_PLUGIN_NAMES,
18
+ _resetDeprecatedWarningsForTests,
19
+ builtinPluginNameFromSpec,
20
+ pluginNameFromSpec,
21
+ setupPlugins,
22
+ warnIfDeprecatedPluginName
23
+ };
24
+ //# sourceMappingURL=plugins-4LJ5IUBI.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -1,4 +1,3 @@
1
1
  export { type ProjectKind, detectProjectKind, runProjectCheck, } from './pre-launch/project-check.js';
2
2
  export { type LaunchModeChoices, LaunchAbortedError, persistLaunchChoices, runLaunchPrompts, } from './pre-launch/launch-prompts.js';
3
- export { maybeAskAboutIndexing, resolveIndexThreshold, } from './pre-launch/indexing-question.js';
4
3
  //# sourceMappingURL=pre-launch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pre-launch.d.ts","sourceRoot":"","sources":["../src/pre-launch.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,WAAW,EAChB,iBAAiB,EACjB,eAAe,GAChB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,KAAK,iBAAiB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,mCAAmC,CAAC"}
1
+ {"version":3,"file":"pre-launch.d.ts","sourceRoot":"","sources":["../src/pre-launch.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,WAAW,EAChB,iBAAiB,EACjB,eAAe,GAChB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,KAAK,iBAAiB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,gCAAgC,CAAC"}