@wrongstack/cli 0.297.0 → 0.298.1

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 (510) hide show
  1. package/dist/{acp-A5OSIU2P.js → acp-S4LZQB66.js} +91 -23
  2. package/dist/{auth-CJWQJVRH.js → auth-NLLGEYQR.js} +3 -3
  3. package/dist/boot/governance-evidence-candidate.d.ts +3 -0
  4. package/dist/boot/governance-shadow-bridge.d.ts +19 -0
  5. package/dist/boot/governance-trace-context.d.ts +64 -0
  6. package/dist/boot/tui-session-resume.d.ts +10 -1
  7. package/dist/chimera-reviewer-policy.d.ts +89 -1
  8. package/dist/chimera-subagent-ladder.d.ts +72 -0
  9. package/dist/{chunk-AZESNNIC.js → chunk-4HH3YGG4.js} +3 -3
  10. package/dist/{chunk-QUNHS6O3.js → chunk-4U3DMA2Y.js} +2 -2
  11. package/dist/{chunk-IHBYBYGA.js → chunk-A6Q5KGLV.js} +51 -18
  12. package/dist/{chunk-ABXK4VVY.js → chunk-ARWGQUB3.js} +2 -1
  13. package/dist/{chunk-7JABKXET.js → chunk-C5GH4YBL.js} +1018 -175
  14. package/dist/{chunk-TADVX644.js → chunk-GO3TJICK.js} +11 -2
  15. package/dist/{chunk-JBTFWWKV.js → chunk-I2BM6FK6.js} +9 -4
  16. package/dist/{chunk-AXVZMEWG.js → chunk-I5MEUFDI.js} +2 -2
  17. package/dist/{chunk-XWEGWYDU.js → chunk-PEKUKUCH.js} +4 -71
  18. package/dist/chunk-U3SS4NRH.js +10 -0
  19. package/dist/{chunk-QZKWRNIP.js → chunk-V3XH6XBJ.js} +12 -9
  20. package/dist/{cli-main-GOY5YGVL.js → cli-main-7QLL2PY6.js} +957 -271
  21. package/dist/cli-main-helpers.d.ts +42 -2
  22. package/dist/{execution-A4PGK4XV.js → execution-HJ643JGZ.js} +834 -676
  23. package/dist/execution-chimera-cascade.d.ts +7 -1
  24. package/dist/execution-chimera-review.d.ts +35 -0
  25. package/dist/fleet/host-types.d.ts +6 -1
  26. package/dist/fleet-statusline.d.ts +1 -0
  27. package/dist/governance-V2Z42RBE.js +65 -0
  28. package/dist/governance-hq-telemetry.d.ts +17 -0
  29. package/dist/{hq-GBPGXIR5.js → hq-WO6CLUSI.js} +2 -2
  30. package/dist/hq-server/auth.d.ts +33 -2
  31. package/dist/hq-server/login-attempt-store.d.ts +73 -0
  32. package/dist/hq-server/routes/auth-handlers.d.ts +73 -5
  33. package/dist/hq-server/routes.d.ts +5 -5
  34. package/dist/hq-server/types.d.ts +36 -2
  35. package/dist/hq-server/utils.d.ts +51 -6
  36. package/dist/{hq-server-YQUUMTPU.js → hq-server-6TSAORAC.js} +2 -2
  37. package/dist/hq-server.d.ts +10 -0
  38. package/dist/index.js +52 -24
  39. package/dist/live-settings-input.d.ts +4 -3
  40. package/dist/plugin-management.d.ts +3 -8
  41. package/dist/{plugin-usage-OU6X6LM3.js → plugin-usage-VTL7ZTVC.js} +2 -2
  42. package/dist/{plugins-4LJ5IUBI.js → plugins-ETY6W3DC.js} +3 -3
  43. package/dist/settings-menu.d.ts +1 -1
  44. package/dist/slash-commands/fallback.d.ts +2 -0
  45. package/dist/slash-commands/goal-refiner.d.ts +1 -1
  46. package/dist/subcommands/handlers/acp-connection-gate.d.ts +20 -0
  47. package/dist/subcommands/handlers/governance.d.ts +8 -0
  48. package/dist/{update-YC4TYW2Y.js → update-MV6TUACD.js} +3 -3
  49. package/dist/utils/win32-cmd.d.ts +9 -6
  50. package/dist/{version-help-DROHZRW6.js → version-help-ASKQYXDJ.js} +2 -2
  51. package/dist/{webui-server-XKFUOKMJ.js → webui-server-PCLSXX6L.js} +10 -3
  52. package/dist/wiring/brain-and-orchestration.d.ts +2 -0
  53. package/dist/wiring/provider-runtime-setup.d.ts +2 -2
  54. package/package.json +24 -23
  55. package/dist/acp-A5OSIU2P.js.map +0 -7
  56. package/dist/acp-registry-cache.d.ts.map +0 -1
  57. package/dist/acp-server-agent.d.ts.map +0 -1
  58. package/dist/arg-parser.d.ts.map +0 -1
  59. package/dist/audit-2ZSFGNIF.js.map +0 -7
  60. package/dist/auth-CJWQJVRH.js.map +0 -7
  61. package/dist/auth-menu/add-provider.d.ts.map +0 -1
  62. package/dist/auth-menu/anthropic-oauth.d.ts.map +0 -1
  63. package/dist/auth-menu/auth-menu-audit.d.ts.map +0 -1
  64. package/dist/auth-menu/direct.d.ts.map +0 -1
  65. package/dist/auth-menu/github-copilot-oauth.d.ts.map +0 -1
  66. package/dist/auth-menu/helpers.d.ts.map +0 -1
  67. package/dist/auth-menu/index.d.ts.map +0 -1
  68. package/dist/auth-menu/local-presets.d.ts.map +0 -1
  69. package/dist/auth-menu/local.d.ts.map +0 -1
  70. package/dist/auth-menu/loopback-server.d.ts.map +0 -1
  71. package/dist/auth-menu/oauth-menu.d.ts.map +0 -1
  72. package/dist/auth-menu/openai-codex-oauth.d.ts.map +0 -1
  73. package/dist/auth-menu/panel-service.d.ts.map +0 -1
  74. package/dist/auth-menu/provider-menu.d.ts.map +0 -1
  75. package/dist/auth-menu/shared.d.ts.map +0 -1
  76. package/dist/auth-menu/top-menu.d.ts.map +0 -1
  77. package/dist/auth-menu/types.d.ts.map +0 -1
  78. package/dist/auth-menu.d.ts.map +0 -1
  79. package/dist/bench-7ZDWSNEF.js.map +0 -7
  80. package/dist/boot/auto-discover-providers.d.ts.map +0 -1
  81. package/dist/boot/brain-decision-log.d.ts.map +0 -1
  82. package/dist/boot/config-backup-recovery.d.ts.map +0 -1
  83. package/dist/boot/container-wiring.d.ts.map +0 -1
  84. package/dist/boot/dispatch-singleshot.d.ts.map +0 -1
  85. package/dist/boot/dispatch-tui.d.ts.map +0 -1
  86. package/dist/boot/dispatch-webui.d.ts.map +0 -1
  87. package/dist/boot/event-wiring.d.ts.map +0 -1
  88. package/dist/boot/execution-mode.d.ts.map +0 -1
  89. package/dist/boot/launch-banner.d.ts.map +0 -1
  90. package/dist/boot/launch-menu.d.ts.map +0 -1
  91. package/dist/boot/short-circuit-desktop.d.ts.map +0 -1
  92. package/dist/boot/short-circuit-flags.d.ts.map +0 -1
  93. package/dist/boot/short-circuit-hq.d.ts.map +0 -1
  94. package/dist/boot/simpleui-full-auto.d.ts.map +0 -1
  95. package/dist/boot/system-prompt-builder.d.ts.map +0 -1
  96. package/dist/boot/system-prompt.d.ts.map +0 -1
  97. package/dist/boot/tool-registry.d.ts.map +0 -1
  98. package/dist/boot/tui-coordinator-callbacks.d.ts.map +0 -1
  99. package/dist/boot/tui-coordinator-setup.d.ts.map +0 -1
  100. package/dist/boot/tui-debug-stream.d.ts.map +0 -1
  101. package/dist/boot/tui-goal-wiring.d.ts.map +0 -1
  102. package/dist/boot/tui-live-sessions.d.ts.map +0 -1
  103. package/dist/boot/tui-project-picker-callback.d.ts.map +0 -1
  104. package/dist/boot/tui-project-spawn.d.ts.map +0 -1
  105. package/dist/boot/tui-project-switch.d.ts.map +0 -1
  106. package/dist/boot/tui-runtime-state.d.ts.map +0 -1
  107. package/dist/boot/tui-sdd-callback.d.ts.map +0 -1
  108. package/dist/boot/tui-session-resume.d.ts.map +0 -1
  109. package/dist/boot/tui-settings-adapter.d.ts.map +0 -1
  110. package/dist/boot-config.d.ts.map +0 -1
  111. package/dist/boot.d.ts.map +0 -1
  112. package/dist/brain-menu/panel-service.d.ts.map +0 -1
  113. package/dist/chimera-review-task.d.ts.map +0 -1
  114. package/dist/chimera-reviewer-policy.d.ts.map +0 -1
  115. package/dist/chronicle-QQEQFSSE.js.map +0 -7
  116. package/dist/chunk-5N34EWJR.js.map +0 -7
  117. package/dist/chunk-66T43Q4Y.js.map +0 -7
  118. package/dist/chunk-7JABKXET.js.map +0 -7
  119. package/dist/chunk-7OCVIDC7.js.map +0 -7
  120. package/dist/chunk-ABXK4VVY.js.map +0 -7
  121. package/dist/chunk-AXVZMEWG.js.map +0 -7
  122. package/dist/chunk-AZESNNIC.js.map +0 -7
  123. package/dist/chunk-BGFM3PD7.js.map +0 -7
  124. package/dist/chunk-DPJZQCVP.js.map +0 -7
  125. package/dist/chunk-F4PEGAJZ.js.map +0 -7
  126. package/dist/chunk-IHBYBYGA.js.map +0 -7
  127. package/dist/chunk-JBSQ7ONN.js.map +0 -7
  128. package/dist/chunk-JBTFWWKV.js.map +0 -7
  129. package/dist/chunk-JUHRI6OV.js.map +0 -7
  130. package/dist/chunk-JW75HY4F.js.map +0 -7
  131. package/dist/chunk-OP47B3IX.js.map +0 -7
  132. package/dist/chunk-PJHET45A.js.map +0 -7
  133. package/dist/chunk-Q5GTM25S.js.map +0 -7
  134. package/dist/chunk-QD544J2B.js.map +0 -7
  135. package/dist/chunk-QUNHS6O3.js.map +0 -7
  136. package/dist/chunk-QZKWRNIP.js.map +0 -7
  137. package/dist/chunk-TADVX644.js.map +0 -7
  138. package/dist/chunk-TGDHN4LM.js.map +0 -7
  139. package/dist/chunk-TYO2OVAD.js.map +0 -7
  140. package/dist/chunk-VCYZ3WZV.js.map +0 -7
  141. package/dist/chunk-VJUEZZYB.js +0 -29
  142. package/dist/chunk-VJUEZZYB.js.map +0 -7
  143. package/dist/chunk-WHOIR577.js.map +0 -7
  144. package/dist/chunk-XJXDOF63.js.map +0 -7
  145. package/dist/chunk-XTIXVJXP.js.map +0 -7
  146. package/dist/chunk-XWEGWYDU.js.map +0 -7
  147. package/dist/chunk-YWUPHRGB.js.map +0 -7
  148. package/dist/cli-bundled-prompts.d.ts.map +0 -1
  149. package/dist/cli-bundled-skills.d.ts.map +0 -1
  150. package/dist/cli-context.d.ts.map +0 -1
  151. package/dist/cli-entry-main.d.ts.map +0 -1
  152. package/dist/cli-entry-point.d.ts.map +0 -1
  153. package/dist/cli-eternal-flag.d.ts.map +0 -1
  154. package/dist/cli-main-GOY5YGVL.js.map +0 -7
  155. package/dist/cli-main-helpers.d.ts.map +0 -1
  156. package/dist/cli-main.d.ts.map +0 -1
  157. package/dist/cli-update-notice.d.ts.map +0 -1
  158. package/dist/config-doctor.d.ts.map +0 -1
  159. package/dist/config-history.d.ts.map +0 -1
  160. package/dist/context-limit.d.ts.map +0 -1
  161. package/dist/context-overflow-diagnostic.d.ts.map +0 -1
  162. package/dist/diag-doctor-OQ3AA63O.js.map +0 -7
  163. package/dist/diff-renderer.d.ts.map +0 -1
  164. package/dist/execute-deps.d.ts.map +0 -1
  165. package/dist/execution-A4PGK4XV.js.map +0 -7
  166. package/dist/execution-chimera-ask.d.ts +0 -10
  167. package/dist/execution-chimera-ask.d.ts.map +0 -1
  168. package/dist/execution-chimera-cascade.d.ts.map +0 -1
  169. package/dist/execution-cleanup.d.ts.map +0 -1
  170. package/dist/execution-kanban-dispatch.d.ts.map +0 -1
  171. package/dist/execution-repl-fleet-callbacks.d.ts.map +0 -1
  172. package/dist/execution-storage-observability.d.ts.map +0 -1
  173. package/dist/execution-tui-next-step-callbacks.d.ts.map +0 -1
  174. package/dist/execution.d.ts.map +0 -1
  175. package/dist/export-TPORYVRZ.js.map +0 -7
  176. package/dist/fleet/host-acp-runner-cache.d.ts.map +0 -1
  177. package/dist/fleet/host-acp.d.ts.map +0 -1
  178. package/dist/fleet/host-concurrency.d.ts.map +0 -1
  179. package/dist/fleet/host-context.d.ts.map +0 -1
  180. package/dist/fleet/host-director-builder.d.ts.map +0 -1
  181. package/dist/fleet/host-director-event-bridges.d.ts.map +0 -1
  182. package/dist/fleet/host-director-services.d.ts.map +0 -1
  183. package/dist/fleet/host-event-bridge.d.ts.map +0 -1
  184. package/dist/fleet/host-helpers.d.ts.map +0 -1
  185. package/dist/fleet/host-learning-tracker.d.ts.map +0 -1
  186. package/dist/fleet/host-learning.d.ts.map +0 -1
  187. package/dist/fleet/host-lifecycle-events.d.ts.map +0 -1
  188. package/dist/fleet/host-paths.d.ts.map +0 -1
  189. package/dist/fleet/host-provider.d.ts.map +0 -1
  190. package/dist/fleet/host-session-writer.d.ts.map +0 -1
  191. package/dist/fleet/host-shadow-pass.d.ts.map +0 -1
  192. package/dist/fleet/host-spawn-types.d.ts.map +0 -1
  193. package/dist/fleet/host-status.d.ts.map +0 -1
  194. package/dist/fleet/host-subagent-factory.d.ts.map +0 -1
  195. package/dist/fleet/host-supervisor.d.ts.map +0 -1
  196. package/dist/fleet/host-task-result-report.d.ts.map +0 -1
  197. package/dist/fleet/host-types.d.ts.map +0 -1
  198. package/dist/fleet/host.d.ts.map +0 -1
  199. package/dist/fleet/routing.d.ts.map +0 -1
  200. package/dist/fleet/status-broadcast.d.ts.map +0 -1
  201. package/dist/fleet/supervisor-registry.d.ts.map +0 -1
  202. package/dist/fleet-statusline.d.ts.map +0 -1
  203. package/dist/goal-host.d.ts.map +0 -1
  204. package/dist/hooks-wiring.d.ts.map +0 -1
  205. package/dist/hq-GBPGXIR5.js.map +0 -7
  206. package/dist/hq-command-controller.d.ts.map +0 -1
  207. package/dist/hq-publisher.d.ts.map +0 -1
  208. package/dist/hq-recovery-html.d.ts.map +0 -1
  209. package/dist/hq-server/audit-actor.d.ts.map +0 -1
  210. package/dist/hq-server/auth-state.d.ts.map +0 -1
  211. package/dist/hq-server/auth.d.ts.map +0 -1
  212. package/dist/hq-server/preflight.d.ts.map +0 -1
  213. package/dist/hq-server/project-root.d.ts.map +0 -1
  214. package/dist/hq-server/routes/auth-handlers.d.ts.map +0 -1
  215. package/dist/hq-server/routes/session-handlers.d.ts.map +0 -1
  216. package/dist/hq-server/routes/system-handlers.d.ts.map +0 -1
  217. package/dist/hq-server/routes.d.ts.map +0 -1
  218. package/dist/hq-server/snapshot.d.ts.map +0 -1
  219. package/dist/hq-server/startup.d.ts.map +0 -1
  220. package/dist/hq-server/trust-boundary.d.ts.map +0 -1
  221. package/dist/hq-server/types.d.ts.map +0 -1
  222. package/dist/hq-server/utils.d.ts.map +0 -1
  223. package/dist/hq-server/ws.d.ts.map +0 -1
  224. package/dist/hq-server-YQUUMTPU.js.map +0 -7
  225. package/dist/hq-server.d.ts.map +0 -1
  226. package/dist/hq-static-serve.d.ts.map +0 -1
  227. package/dist/hq-ttl-U2FAYFAT.js.map +0 -7
  228. package/dist/hq-tunnel-RFKGC4HI.js.map +0 -7
  229. package/dist/hq-tunnel.d.ts.map +0 -1
  230. package/dist/index.d.ts.map +0 -1
  231. package/dist/index.js.map +0 -7
  232. package/dist/init-E2NDDOHI.js.map +0 -7
  233. package/dist/input-reader.d.ts.map +0 -1
  234. package/dist/kanban-dispatch-route.d.ts.map +0 -1
  235. package/dist/kanban-hq-sync.d.ts.map +0 -1
  236. package/dist/kanban-run-mirror-EKVNGXWW.js.map +0 -7
  237. package/dist/launch-hints.d.ts.map +0 -1
  238. package/dist/live-settings-input.d.ts.map +0 -1
  239. package/dist/mailbox-bridge-bootstrap.d.ts.map +0 -1
  240. package/dist/mailbox-serve-DBOOOOWZ.js.map +0 -7
  241. package/dist/mcp-CYLPUEHC.js.map +0 -7
  242. package/dist/mcp-serve.d.ts.map +0 -1
  243. package/dist/modeldiag-HENYJ4N7.js.map +0 -7
  244. package/dist/multi-agent.d.ts.map +0 -1
  245. package/dist/next-task-predictor.d.ts.map +0 -1
  246. package/dist/permission-prompt.d.ts.map +0 -1
  247. package/dist/permissions-FNYLZIL4.js.map +0 -7
  248. package/dist/picker-key-state.d.ts.map +0 -1
  249. package/dist/picker-model-picker.d.ts.map +0 -1
  250. package/dist/picker-ui.d.ts.map +0 -1
  251. package/dist/picker.d.ts.map +0 -1
  252. package/dist/plugin-api-factory.d.ts.map +0 -1
  253. package/dist/plugin-management.d.ts.map +0 -1
  254. package/dist/plugin-usage-OU6X6LM3.js.map +0 -7
  255. package/dist/plugins-4LJ5IUBI.js.map +0 -7
  256. package/dist/pre-launch/launch-prompts.d.ts.map +0 -1
  257. package/dist/pre-launch/project-check.d.ts.map +0 -1
  258. package/dist/pre-launch.d.ts.map +0 -1
  259. package/dist/preflight.d.ts.map +0 -1
  260. package/dist/profile-config-path.d.ts.map +0 -1
  261. package/dist/project-BLQ3ALVL.js.map +0 -7
  262. package/dist/project-manifest-GE25PW4S.js.map +0 -7
  263. package/dist/project-picker-BOCWHBXP.js.map +0 -7
  264. package/dist/project-picker.d.ts.map +0 -1
  265. package/dist/projects-XE76NFNZ.js.map +0 -7
  266. package/dist/provider-config-utils.d.ts.map +0 -1
  267. package/dist/provider-helpers.d.ts.map +0 -1
  268. package/dist/provider-id.d.ts.map +0 -1
  269. package/dist/providers-models-GDELBHZK.js.map +0 -7
  270. package/dist/quick-VIO2BEHS.js.map +0 -7
  271. package/dist/renderer.d.ts.map +0 -1
  272. package/dist/repl-auto-proceed.d.ts.map +0 -1
  273. package/dist/repl-client-registration.d.ts.map +0 -1
  274. package/dist/repl-input.d.ts.map +0 -1
  275. package/dist/repl-options.d.ts.map +0 -1
  276. package/dist/repl-rendering.d.ts.map +0 -1
  277. package/dist/repl-suggestions.d.ts.map +0 -1
  278. package/dist/repl.d.ts.map +0 -1
  279. package/dist/replay-KCTXNMZQ.js.map +0 -7
  280. package/dist/rewind-EJMVFVLS.js.map +0 -7
  281. package/dist/sdd-runtime-AIJCJGWC.js.map +0 -7
  282. package/dist/services/autonomy-mode.d.ts.map +0 -1
  283. package/dist/services/commit-message.d.ts.map +0 -1
  284. package/dist/services/dispatch-classifier.d.ts.map +0 -1
  285. package/dist/services/mcp-management.d.ts.map +0 -1
  286. package/dist/services/project-facts.d.ts.map +0 -1
  287. package/dist/services/project-manifest.d.ts.map +0 -1
  288. package/dist/services/sdd/project-context.d.ts.map +0 -1
  289. package/dist/services/sdd/spec-detection.d.ts.map +0 -1
  290. package/dist/services/sdd/state.d.ts.map +0 -1
  291. package/dist/services/sdd/task-manager.d.ts.map +0 -1
  292. package/dist/services/sdd-runtime.d.ts.map +0 -1
  293. package/dist/services/statusline-config.d.ts.map +0 -1
  294. package/dist/services/suggestion-store.d.ts.map +0 -1
  295. package/dist/session-event-wiring.d.ts.map +0 -1
  296. package/dist/session-stats.d.ts.map +0 -1
  297. package/dist/sessions-config-NLCMK3BY.js.map +0 -7
  298. package/dist/settings-menu.d.ts.map +0 -1
  299. package/dist/shutdown-cleanup.d.ts.map +0 -1
  300. package/dist/simpleui-dist-JIFGUJO7.js.map +0 -7
  301. package/dist/simpleui-dist.d.ts.map +0 -1
  302. package/dist/slash-commands/acp.d.ts.map +0 -1
  303. package/dist/slash-commands/agent-improve.d.ts.map +0 -1
  304. package/dist/slash-commands/agents.d.ts.map +0 -1
  305. package/dist/slash-commands/audit.d.ts.map +0 -1
  306. package/dist/slash-commands/auth.d.ts.map +0 -1
  307. package/dist/slash-commands/autonomy.d.ts.map +0 -1
  308. package/dist/slash-commands/brain.d.ts.map +0 -1
  309. package/dist/slash-commands/btw.d.ts.map +0 -1
  310. package/dist/slash-commands/clear.d.ts.map +0 -1
  311. package/dist/slash-commands/codebase-reindex.d.ts.map +0 -1
  312. package/dist/slash-commands/collab.d.ts.map +0 -1
  313. package/dist/slash-commands/command-context.d.ts.map +0 -1
  314. package/dist/slash-commands/commit-llm.d.ts.map +0 -1
  315. package/dist/slash-commands/compact.d.ts.map +0 -1
  316. package/dist/slash-commands/context.d.ts.map +0 -1
  317. package/dist/slash-commands/coordinator.d.ts.map +0 -1
  318. package/dist/slash-commands/delegate.d.ts.map +0 -1
  319. package/dist/slash-commands/design.d.ts.map +0 -1
  320. package/dist/slash-commands/dev.d.ts.map +0 -1
  321. package/dist/slash-commands/diag-stats.d.ts.map +0 -1
  322. package/dist/slash-commands/dispatch-llm.d.ts.map +0 -1
  323. package/dist/slash-commands/doctor.d.ts.map +0 -1
  324. package/dist/slash-commands/enhance.d.ts.map +0 -1
  325. package/dist/slash-commands/ensemble.d.ts.map +0 -1
  326. package/dist/slash-commands/f-keys.d.ts.map +0 -1
  327. package/dist/slash-commands/fallback.d.ts.map +0 -1
  328. package/dist/slash-commands/fix-classifier.d.ts.map +0 -1
  329. package/dist/slash-commands/fix.d.ts.map +0 -1
  330. package/dist/slash-commands/fleet.d.ts.map +0 -1
  331. package/dist/slash-commands/git.d.ts.map +0 -1
  332. package/dist/slash-commands/gitid.d.ts.map +0 -1
  333. package/dist/slash-commands/goal-refiner.d.ts.map +0 -1
  334. package/dist/slash-commands/goal.d.ts.map +0 -1
  335. package/dist/slash-commands/health.d.ts.map +0 -1
  336. package/dist/slash-commands/help.d.ts.map +0 -1
  337. package/dist/slash-commands/helpers.d.ts.map +0 -1
  338. package/dist/slash-commands/hq.d.ts.map +0 -1
  339. package/dist/slash-commands/index.d.ts.map +0 -1
  340. package/dist/slash-commands/init.d.ts.map +0 -1
  341. package/dist/slash-commands/interrupt.d.ts.map +0 -1
  342. package/dist/slash-commands/kanban-agent-helpers.d.ts.map +0 -1
  343. package/dist/slash-commands/kanban-format.d.ts.map +0 -1
  344. package/dist/slash-commands/kanban-help.d.ts.map +0 -1
  345. package/dist/slash-commands/kanban.d.ts.map +0 -1
  346. package/dist/slash-commands/mailbox-demo.d.ts.map +0 -1
  347. package/dist/slash-commands/mailbox-serve.d.ts.map +0 -1
  348. package/dist/slash-commands/mailbox.d.ts.map +0 -1
  349. package/dist/slash-commands/mcp-utils.d.ts.map +0 -1
  350. package/dist/slash-commands/mcp.d.ts.map +0 -1
  351. package/dist/slash-commands/memory-compact.d.ts.map +0 -1
  352. package/dist/slash-commands/memory-flags.d.ts.map +0 -1
  353. package/dist/slash-commands/memory-formatters.d.ts.map +0 -1
  354. package/dist/slash-commands/memory.d.ts.map +0 -1
  355. package/dist/slash-commands/metrics.d.ts.map +0 -1
  356. package/dist/slash-commands/mode.d.ts.map +0 -1
  357. package/dist/slash-commands/modelcaps.d.ts.map +0 -1
  358. package/dist/slash-commands/models.d.ts.map +0 -1
  359. package/dist/slash-commands/mouse.d.ts.map +0 -1
  360. package/dist/slash-commands/next.d.ts.map +0 -1
  361. package/dist/slash-commands/plan.d.ts.map +0 -1
  362. package/dist/slash-commands/plugin.d.ts.map +0 -1
  363. package/dist/slash-commands/profile.d.ts.map +0 -1
  364. package/dist/slash-commands/project-utils.d.ts.map +0 -1
  365. package/dist/slash-commands/project.d.ts.map +0 -1
  366. package/dist/slash-commands/provider-status.d.ts.map +0 -1
  367. package/dist/slash-commands/prune.d.ts.map +0 -1
  368. package/dist/slash-commands/refiner.d.ts.map +0 -1
  369. package/dist/slash-commands/review.d.ts.map +0 -1
  370. package/dist/slash-commands/sdd/rendering.d.ts.map +0 -1
  371. package/dist/slash-commands/sdd-command-helpers.d.ts.map +0 -1
  372. package/dist/slash-commands/sdd-format.d.ts.map +0 -1
  373. package/dist/slash-commands/sdd.d.ts.map +0 -1
  374. package/dist/slash-commands/security.d.ts.map +0 -1
  375. package/dist/slash-commands/session.d.ts.map +0 -1
  376. package/dist/slash-commands/setmodel.d.ts.map +0 -1
  377. package/dist/slash-commands/settings.d.ts.map +0 -1
  378. package/dist/slash-commands/shadow.d.ts.map +0 -1
  379. package/dist/slash-commands/slash-deep-help.d.ts.map +0 -1
  380. package/dist/slash-commands/spawn-agents.d.ts.map +0 -1
  381. package/dist/slash-commands/statusline.d.ts.map +0 -1
  382. package/dist/slash-commands/suggest.d.ts.map +0 -1
  383. package/dist/slash-commands/suggestion-store.d.ts.map +0 -1
  384. package/dist/slash-commands/supervisor.d.ts.map +0 -1
  385. package/dist/slash-commands/surfaces.d.ts.map +0 -1
  386. package/dist/slash-commands/tasks.d.ts.map +0 -1
  387. package/dist/slash-commands/techstack.d.ts.map +0 -1
  388. package/dist/slash-commands/telegram-pairing.d.ts.map +0 -1
  389. package/dist/slash-commands/telegram-settings.d.ts.map +0 -1
  390. package/dist/slash-commands/telegram-setup.d.ts.map +0 -1
  391. package/dist/slash-commands/todos.d.ts.map +0 -1
  392. package/dist/slash-commands/tool.d.ts.map +0 -1
  393. package/dist/slash-commands/tools.d.ts.map +0 -1
  394. package/dist/slash-commands/tuneup.d.ts.map +0 -1
  395. package/dist/slash-commands/working-dir.d.ts.map +0 -1
  396. package/dist/slash-commands/worktree.d.ts.map +0 -1
  397. package/dist/slash-commands/yolo.d.ts.map +0 -1
  398. package/dist/spinner.d.ts.map +0 -1
  399. package/dist/subcommands/contracts.d.ts.map +0 -1
  400. package/dist/subcommands/handlers/acp.d.ts.map +0 -1
  401. package/dist/subcommands/handlers/audit.d.ts.map +0 -1
  402. package/dist/subcommands/handlers/auth-local-help.d.ts.map +0 -1
  403. package/dist/subcommands/handlers/auth.d.ts.map +0 -1
  404. package/dist/subcommands/handlers/bench-run-help.d.ts.map +0 -1
  405. package/dist/subcommands/handlers/bench.d.ts.map +0 -1
  406. package/dist/subcommands/handlers/chronicle.d.ts.map +0 -1
  407. package/dist/subcommands/handlers/config-history.d.ts.map +0 -1
  408. package/dist/subcommands/handlers/diag-doctor.d.ts.map +0 -1
  409. package/dist/subcommands/handlers/export.d.ts.map +0 -1
  410. package/dist/subcommands/handlers/helpers.d.ts.map +0 -1
  411. package/dist/subcommands/handlers/hq.d.ts.map +0 -1
  412. package/dist/subcommands/handlers/init.d.ts.map +0 -1
  413. package/dist/subcommands/handlers/mailbox-serve.d.ts.map +0 -1
  414. package/dist/subcommands/handlers/mcp.d.ts.map +0 -1
  415. package/dist/subcommands/handlers/model-smoke-test.d.ts.map +0 -1
  416. package/dist/subcommands/handlers/modeldiag-profiles.d.ts.map +0 -1
  417. package/dist/subcommands/handlers/modeldiag.d.ts.map +0 -1
  418. package/dist/subcommands/handlers/models-add-help.d.ts.map +0 -1
  419. package/dist/subcommands/handlers/per-subcommand-deep-help-table.d.ts.map +0 -1
  420. package/dist/subcommands/handlers/per-subcommand-help-data.d.ts.map +0 -1
  421. package/dist/subcommands/handlers/per-subcommand-help-table.d.ts.map +0 -1
  422. package/dist/subcommands/handlers/per-subcommand-help-types.d.ts.map +0 -1
  423. package/dist/subcommands/handlers/per-subcommand-help.d.ts.map +0 -1
  424. package/dist/subcommands/handlers/permissions.d.ts.map +0 -1
  425. package/dist/subcommands/handlers/plugin-usage.d.ts.map +0 -1
  426. package/dist/subcommands/handlers/project.d.ts.map +0 -1
  427. package/dist/subcommands/handlers/projects.d.ts.map +0 -1
  428. package/dist/subcommands/handlers/providers-models.d.ts.map +0 -1
  429. package/dist/subcommands/handlers/quick.d.ts.map +0 -1
  430. package/dist/subcommands/handlers/replay.d.ts.map +0 -1
  431. package/dist/subcommands/handlers/rewind.d.ts.map +0 -1
  432. package/dist/subcommands/handlers/sessions-config.d.ts.map +0 -1
  433. package/dist/subcommands/handlers/sessions-fleet.d.ts.map +0 -1
  434. package/dist/subcommands/handlers/tools-skills.d.ts.map +0 -1
  435. package/dist/subcommands/handlers/update.d.ts.map +0 -1
  436. package/dist/subcommands/handlers/version-help.d.ts.map +0 -1
  437. package/dist/subcommands/index.d.ts.map +0 -1
  438. package/dist/theme.d.ts.map +0 -1
  439. package/dist/tools-skills-UNKLOB7M.js.map +0 -7
  440. package/dist/tui-thinking-word.d.ts.map +0 -1
  441. package/dist/tuneup.d.ts.map +0 -1
  442. package/dist/update-YC4TYW2Y.js.map +0 -7
  443. package/dist/update-check-UMYTOH7Z.js.map +0 -7
  444. package/dist/update-check.d.ts.map +0 -1
  445. package/dist/utils/delay-format.d.ts.map +0 -1
  446. package/dist/utils/hq-ttl.d.ts.map +0 -1
  447. package/dist/utils/win32-cmd.d.ts.map +0 -1
  448. package/dist/utils.d.ts.map +0 -1
  449. package/dist/version-help-DROHZRW6.js.map +0 -7
  450. package/dist/version.d.ts.map +0 -1
  451. package/dist/webui-server/client-registration.d.ts.map +0 -1
  452. package/dist/webui-server/connection-handler.d.ts.map +0 -1
  453. package/dist/webui-server/context-breakdown.d.ts.map +0 -1
  454. package/dist/webui-server/contracts.d.ts.map +0 -1
  455. package/dist/webui-server/cost-helpers.d.ts.map +0 -1
  456. package/dist/webui-server/kanban-host-adapter.d.ts.map +0 -1
  457. package/dist/webui-server/kanban-run-mirror.d.ts.map +0 -1
  458. package/dist/webui-server/kanban-supervisor.d.ts.map +0 -1
  459. package/dist/webui-server/lifecycle.d.ts.map +0 -1
  460. package/dist/webui-server/listen-helpers.d.ts.map +0 -1
  461. package/dist/webui-server/logger-shim.d.ts.map +0 -1
  462. package/dist/webui-server/node-pty-loader.d.ts.map +0 -1
  463. package/dist/webui-server/prefs-seeding.d.ts.map +0 -1
  464. package/dist/webui-server/privileged-actions.d.ts.map +0 -1
  465. package/dist/webui-server/provider-config.d.ts.map +0 -1
  466. package/dist/webui-server/session-start-payload.d.ts.map +0 -1
  467. package/dist/webui-server/setup-events.d.ts.map +0 -1
  468. package/dist/webui-server/static-serve.d.ts.map +0 -1
  469. package/dist/webui-server/stream-coalescer.d.ts.map +0 -1
  470. package/dist/webui-server/terminal-log-view.d.ts.map +0 -1
  471. package/dist/webui-server-XKFUOKMJ.js.map +0 -7
  472. package/dist/webui-server-options.d.ts.map +0 -1
  473. package/dist/webui-server.d.ts.map +0 -1
  474. package/dist/wiring/brain-and-orchestration.d.ts.map +0 -1
  475. package/dist/wiring/codebase-index.d.ts.map +0 -1
  476. package/dist/wiring/command-host-adapters.d.ts.map +0 -1
  477. package/dist/wiring/command-host-state.d.ts.map +0 -1
  478. package/dist/wiring/controllers.d.ts.map +0 -1
  479. package/dist/wiring/dep-watcher-bridge.d.ts.map +0 -1
  480. package/dist/wiring/dep-watcher.d.ts.map +0 -1
  481. package/dist/wiring/design-studio.d.ts.map +0 -1
  482. package/dist/wiring/director-setup.d.ts.map +0 -1
  483. package/dist/wiring/eternal-command-handlers.d.ts.map +0 -1
  484. package/dist/wiring/fleet-command-handlers.d.ts.map +0 -1
  485. package/dist/wiring/hq-telemetry.d.ts.map +0 -1
  486. package/dist/wiring/lifecycle-plugins.d.ts.map +0 -1
  487. package/dist/wiring/mailbox-bridge-bootstrap.d.ts.map +0 -1
  488. package/dist/wiring/management-tools.d.ts.map +0 -1
  489. package/dist/wiring/metrics.d.ts.map +0 -1
  490. package/dist/wiring/pipeline.d.ts.map +0 -1
  491. package/dist/wiring/plugins.d.ts.map +0 -1
  492. package/dist/wiring/provider-runtime-setup.d.ts.map +0 -1
  493. package/dist/wiring/provider-runtime.d.ts.map +0 -1
  494. package/dist/wiring/provider-status.d.ts.map +0 -1
  495. package/dist/wiring/provider-utility-tools.d.ts.map +0 -1
  496. package/dist/wiring/provider.d.ts.map +0 -1
  497. package/dist/wiring/replay.d.ts.map +0 -1
  498. package/dist/wiring/runtime-controller-deps.d.ts.map +0 -1
  499. package/dist/wiring/runtime-dispatch-state.d.ts.map +0 -1
  500. package/dist/wiring/runtime-lifecycle-deps.d.ts.map +0 -1
  501. package/dist/wiring/runtime-picker-deps.d.ts.map +0 -1
  502. package/dist/wiring/sage.d.ts.map +0 -1
  503. package/dist/wiring/sdd-handlers.d.ts.map +0 -1
  504. package/dist/wiring/security-command.d.ts.map +0 -1
  505. package/dist/wiring/session-command-handlers.d.ts.map +0 -1
  506. package/dist/wiring/session-registry.d.ts.map +0 -1
  507. package/dist/wiring/session.d.ts.map +0 -1
  508. package/dist/wiring/slash-commands.d.ts.map +0 -1
  509. package/dist/wiring/to-execute-deps.d.ts.map +0 -1
  510. package/dist/wiring/tools.d.ts.map +0 -1
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/subcommands/handlers/init.ts"],
4
- "sourcesContent": ["import { color } from '@wrongstack/core/utils';\nimport type { SubcommandHandler } from '../index.js';\n\n/**\n * @deprecated Use `wstack auth` instead. The auth command handles provider setup,\n * key management, and model selection in one interactive workflow.\n */\nexport const initCmd: SubcommandHandler = async (_args, deps) => {\n deps.renderer.write(color.bold('WrongStack init (deprecated)\\n'));\n deps.renderer.write(\n `\\n ${color.amber('\u26A0 This command is deprecated.')}\\n\\n` +\n ` Use ${color.bold('wstack auth')} to set up providers, add API keys,\\n` +\n ` and configure your default model in one interactive workflow.\\n\\n` +\n ` ${color.dim('Examples:')}\\n` +\n ` ${color.cyan('wstack auth')} Interactive setup menu\\n` +\n ` ${color.cyan('wstack auth anthropic')} Add Anthropic API key directly\\n` +\n ` ${color.cyan('wstack auth local')} Add local LLM (Ollama, vLLM, LM Studio)\\n\\n` +\n ` Run ${color.bold('wstack auth --help')} for more options.\\n`,\n );\n return 0;\n};\n"],
5
- "mappings": ";;;;AAAA,SAAS,aAAa;AAOf,IAAM,UAA6B,OAAO,OAAO,SAAS;AAC/D,OAAK,SAAS,MAAM,MAAM,KAAK,gCAAgC,CAAC;AAChE,OAAK,SAAS;AAAA,IACZ;AAAA,IAAO,MAAM,MAAM,oCAA+B,CAAC;AAAA;AAAA,QACxC,MAAM,KAAK,aAAa,CAAC;AAAA;AAAA;AAAA,IAE7B,MAAM,IAAI,WAAW,CAAC;AAAA,MACpB,MAAM,KAAK,aAAa,CAAC;AAAA,MACzB,MAAM,KAAK,uBAAuB,CAAC;AAAA,MACnC,MAAM,KAAK,mBAAmB,CAAC;AAAA;AAAA,QAC7B,MAAM,KAAK,oBAAoB,CAAC;AAAA;AAAA,EAC7C;AACA,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"input-reader.d.ts","sourceRoot":"","sources":["../src/input-reader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGxE,MAAM,WAAW,0BAA0B;IACzC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED,qBAAa,mBAAoB,YAAW,WAAW;IACrD,OAAO,CAAC,EAAE,CAAC,CAAiC;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,mBAAmB,CAAS;IAEpC,YAAY,IAAI,GAAE,0BAA+B,EAGhD;YAEa,WAAW;YASX,WAAW;IASzB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,MAAM;IAYR,QAAQ,CACZ,MAAM,CAAC,EAAE,MAAM,EACf,WAAW,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,GACrE,OAAO,CAAC,MAAM,CAAC,CA+FjB;IAED;;;;;;;;;;OAUG;IACH,OAAO,CAAC,kBAAkB;IA2BpB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAyCtE;IAED;;;;;;;;;OASG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA2FhD;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAK3B;CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"kanban-dispatch-route.d.ts","sourceRoot":"","sources":["../src/kanban-dispatch-route.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CACvC;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,wBAAwB,GAAG,SAAS,GAC/C,mBAAmB,CAcrB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"kanban-hq-sync.d.ts","sourceRoot":"","sources":["../src/kanban-hq-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,uBAAuB,EAEvB,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAkB7B,MAAM,WAAW,YAAY;IAC3B,eAAe,CAAC,SAAS,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,YAAY,CAAC,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,+EAA+E;IAC/E,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,IAAI,iBAAiB,CAAC;IAC9B,IAAI,IAAI,IAAI,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB,EAAE,MAAM,CAAC;CACjC;AA4BD,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,SAAS,SAAiC,EAC1C,SAAS,GAAE;IAAE,kBAAkB,CAAC,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAA;CAAO,GACzE,YAAY,CAsTd"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"launch-hints.d.ts","sourceRoot":"","sources":["../src/launch-hints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAsHtD;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,MAAuD,CAAC;AAEjF,qCAAqC;AACrC,eAAO,MAAM,gBAAgB,EAAE,MAAsB,CAAC;AAEtD,8DAA8D;AAC9D,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAA+B,CAAC;AAU/E,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC;AAuID;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,EACzC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EACvC,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"live-settings-input.d.ts","sourceRoot":"","sources":["../src/live-settings-input.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mailbox-bridge-bootstrap.d.ts","sourceRoot":"","sources":["../src/mailbox-bridge-bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGrF,eAAO,MAAM,mCAAmC,OAAQ,CAAC;AACzD,eAAO,MAAM,+BAA+B,MAAM,CAAC;AAEnD,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,GAAG,EAAE,MAAM,CAAC;IACZ,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;;;;;;OASG;IACH,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;CACvD;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;;;OAYG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,YAAY,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE3E;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,mBAAmB,CAAC,CA0F9B;AAiDD,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,CAAC;AAKhD,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAMjF"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/subcommands/handlers/mailbox-serve.ts"],
4
- "sourcesContent": ["/**\n * `wstack mailbox serve` \u2014 run a loopback HTTP fa\u00E7ade over the project's\n * shared project mailbox, so external coding agents (Claude Code, Aider,\n * custom scripts) can read and send messages on the same channel that\n * WrongStack-internal agents use.\n *\n * ## Design\n *\n * The server is intentionally tiny: one `node:http` server, a single\n * project mailbox client, and a bearer-token gate. Every route is a\n * thin JSON-in / JSON-out wrapper over a `Mailbox` method, so all\n * file locking, mtime-cached reads, agent heartbeats, and HQ telemetry\n * happen exactly as they do for WrongStack-internal callers. External\n * agents are NOT given raw file access \u2014 they go through the project owner\n * so they cannot race the file lock during acks.\n *\n * ## Single-instance lock\n *\n * Per-project isolation. The lock file lives at\n * `<projectDir>/.mailbox-bridge.lock` and records the owner process,\n * the OS-bound URL, and the bearer token. A second `wstack mailbox serve`\n * for the same project detects the live lock, prints the existing URL\n * and token to stdout, and exits 0 \u2014 so shell pipelines can capture\n * them with `$(wstack mailbox serve)`. Two different projects get\n * different lock files (different project slugs), so they never collide.\n *\n * When `--port N` is requested but another project on a different\n * project dir already owns that port, the second invocation fails\n * loud and prints the existing owner's URL on stderr \u2014 see\n * `--strict-port` for the deterministic variant.\n *\n * ## Authentication\n *\n * On first start we mint a 32-byte random bearer token and persist it\n * in BOTH the lock file AND `<projectDir>/.mailbox.token` (mode 0600).\n * Subsequent restarts of the SAME instance reuse the persisted token,\n * so external agents that read the token before a bridge restart\n * survive the restart without having to re-discover credentials. If\n * the lock file is missing or the recorded PID is dead, we treat this\n * as a fresh instance and mint a new token. Tokens are compared in\n * constant time. The token file is unlinked on clean shutdown when\n * we are still the recorded owner.\n *\n * ## Bind safety\n *\n * Default bind is `127.0.0.1` \u2014 loopback only. Pass `--host` to expose\n * to LAN (NOT recommended without a reverse proxy that re-authenticates\n * and rate-limits; the bearer token is the only auth).\n *\n * ## Routes\n *\n * POST /mailbox/send \u2192 send({from,to,type,subject,body,...})\n * POST /mailbox/query \u2192 query({to?,from?,unreadBy?,...})\n * POST /mailbox/check \u2192 check({agentId,baseId?,markRead?,completed?})\n * POST /mailbox/ack \u2192 ack({messageId,readerId,...})\n * POST /mailbox/ack-many \u2192 ackMany({acks:[...]})\n * POST /mailbox/unread-count \u2192 unreadCount({forAgentId})\n * POST /mailbox/agents/register \u2192 registerAgent({...}) source='http'\n * POST /mailbox/agents/heartbeat \u2192 heartbeat({...})\n * POST /mailbox/register-client \u2192 registerClient({...}) source='http'\n * POST /mailbox/heartbeat \u2192 clientHeartbeat({clientId,sessionId?})\n * POST /mailbox/purge-clients \u2192 purgeClients()\n * GET /mailbox/agents \u2192 getAgentStatuses()\n * GET /mailbox/agents/online \u2192 getOnlineAgents()\n *\n * @module subcommands/handlers/mailbox-serve\n */\nimport { createServer } from 'node:http';\nimport * as path from 'node:path';\nimport {\n acquireOrJoin,\n authorizeMailboxBearerToken,\n createMailboxHttpRouter,\n createProjectMailbox,\n finalize,\n MAILBOX_HTTP_DEFAULT_MAX_AGE_MS,\n type MailboxCredentialVerifier,\n MailboxEventEmitter,\n MailboxHttpRateLimiter,\n release,\n resolveProjectDir,\n} from '@wrongstack/core/coordination';\nimport { startSharedHeapWatchdog, wstackGlobalRoot } from '@wrongstack/core/utils';\nimport { type CliHqConnection, startCliHqConnection } from '../../hq-publisher.js';\nimport type { SubcommandDeps, SubcommandHandler } from '../index.js';\n\nconst DEFAULT_HOST = '127.0.0.1';\nconst DEFAULT_PORT = 7788;\n\nexport const mailboxServeCmd: SubcommandHandler = async (args, deps) => {\n const sub = args[0];\n\n if (!sub || sub === 'serve') {\n return startServer(deps);\n }\n if (sub === 'help' || sub === '--help' || sub === '-h') {\n printHelp(deps);\n return 0;\n }\n\n deps.renderer.writeError(`Unknown mailbox subcommand: ${sub}\\n`);\n printHelp(deps);\n return 1;\n};\n\nasync function startServer(deps: SubcommandDeps): Promise<number> {\n const flags = deps.flags ?? {};\n const host = typeof flags['host'] === 'string' ? flags['host'] : DEFAULT_HOST;\n const portRaw =\n typeof flags['port'] === 'string' ? Number.parseInt(flags['port'], 10) : DEFAULT_PORT;\n const strictPort = flags['strict-port'] === true;\n // `--port 0` is valid and means \"let the OS assign a free port\" \u2014 the\n // same thing the non-strict default does. Reject only NaN, negative,\n // or out-of-range ports.\n if (!Number.isInteger(portRaw) || portRaw < 0 || portRaw > 65535) {\n deps.renderer.writeError(`Invalid --port: ${String(flags['port'])}\\n`);\n return 1;\n }\n\n const projectDir = resolveProjectDir(deps.projectRoot, wstackGlobalRoot());\n\n // Phase 1 \u2014 lock acquire. If another instance already owns this\n // project's mailbox-bridge slot, we either join them (URL/token\n // reuse) or fail loud on port-conflict. Both paths skip the listen\n // step entirely \u2014 no HTTP server is started in this process.\n //\n // The user's --port is always forwarded so the lock can detect\n // cross-project port collisions; --strict-port only controls the\n // listen-phase behavior (fail on EADDRINUSE vs. fall back to OS port).\n const portExplicitlySet = typeof flags['port'] === 'string';\n const acquireResult = await acquireOrJoin({\n projectDir,\n host,\n requestedPort: portExplicitlySet ? portRaw : null,\n strictPort,\n });\n\n if (acquireResult.kind === 'joined') {\n const lock = acquireResult.lock;\n // Another live instance owns this project. Print its URL + token\n // so a shell pipeline can capture them with\n // `$(wstack mailbox serve)`. Exit 0 because the system as a whole\n // is in a valid state \u2014 the user's request (\"mailbox serve\") is\n // effectively satisfied.\n deps.renderer.write(\n `Mailbox bridge already running (PID ${lock.pid}).\\n` +\n ` URL: ${lock.url}\\n` +\n ` Token file: ${acquireResult.tokenPath}\\n` +\n ` Lock: ${projectDir}${process.platform === 'win32' ? '\\\\' : '/'}.mailbox-bridge.lock\\n\\n`,\n );\n return 0;\n }\n\n if (acquireResult.kind === 'port-conflict') {\n // Caller asked for an explicit port; another process on a\n // DIFFERENT project dir owns that port. We can't join them\n // (cross-project is forbidden \u2014 tokens and locks are per-project).\n // Loud-fail with the existing owner's URL so the caller can\n // either pick a different port or reuse that other bridge.\n const existing = acquireResult.existing;\n deps.renderer.writeError(\n `Port ${portRaw} already in use by another mailbox bridge on a different project.\\n` +\n ` Owner project: ${projectDir} (us)\\n` +\n ` Owner URL: ${existing.url}\\n` +\n ` Owner PID: ${existing.pid}\\n\\n` +\n `Either pick a different --port, run without --strict-port (OS will assign a free one),\\n` +\n `or stop the conflicting process and retry.\\n`,\n );\n // No tentative lock was written in this branch \u2014 acquireOrJoin\n // returns port-conflict before the write step. Nothing to\n // release.\n return 1;\n }\n\n // acquireResult.kind === 'acquired' \u2014 we own the slot. Now bind\n // the HTTP server.\n const tentative = acquireResult.lock;\n const eventEmitter = new MailboxEventEmitter();\n let hqConnection: CliHqConnection | undefined;\n const mailbox = createProjectMailbox({\n projectDir,\n hqPublisher: () => hqConnection?.getPublisher(),\n eventEmitter,\n });\n\n // Authentication and protocol handling are shared with HQ; this host keeps\n // ownership of the standalone bridge token, rate-limiter lifecycle, and\n // single-instance lock.\n const rateLimiter = new MailboxHttpRateLimiter();\n const rateLimitCleanup = setInterval(() => rateLimiter.cleanup(), 120_000);\n rateLimitCleanup.unref?.();\n const projectId = path.basename(projectDir);\n const credentialStore: MailboxCredentialVerifier = {\n load: async () => mailbox.initialize(),\n verify: (credentialId, secret) => mailbox.credentialVerify(credentialId, secret),\n verifyPersisted: (credentialId, secret) => mailbox.credentialVerify(credentialId, secret),\n };\n // Identity credentials must be ready before the socket starts accepting\n // requests. `verify()` intentionally fails closed while the store is\n // unloaded, so a fire-and-forget load creates a startup race for every\n // external agent reconnecting as the bridge comes online.\n try {\n await credentialStore.load();\n } catch (error) {\n clearInterval(rateLimitCleanup);\n await mailbox.close().catch(() => undefined);\n await release(projectDir, tentative.generation);\n deps.renderer.writeError(\n `Failed to load mailbox credentials: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n return 1;\n }\n const router = createMailboxHttpRouter({\n mailbox,\n eventEmitter,\n rateLimiter,\n credentialStore,\n projectId,\n authorize: (request) => {\n if (/^Credential\\s+/i.test(request.headers.authorization ?? '')) {\n // The shared router performs the authoritative async verification\n // against the project owner and injects the credential actor.\n return { allowed: true };\n }\n return authorizeMailboxBearerToken(request, tentative.token);\n },\n // Wire the 1h look-back that the router's docs promise at\n // mailbox-http-router.ts:25-32 / :47-62. The router itself is\n // opt-in (L146-152): without this option, every retained\n // message would be returned.\n //\n // Per-request override contract (mailbox-http-router.ts:64-80):\n // - `?sinceMs=0` \u2192 no filter (full retained history)\n // - `?sinceMs > 7d` \u2192 silently clamped to\n // MAILBOX_HTTP_MAX_AGE_CEILING_MS (7d)\n // - `?sinceMs=-1/NaN/\u221E` \u2192 disable sentinel (same as `undefined`)\n defaultMaxAgeMs: MAILBOX_HTTP_DEFAULT_MAX_AGE_MS,\n });\n\n const server = createServer((request, response) => {\n void router.handle(request, response);\n });\n\n // Listen semantics:\n // - An explicit --port is always honored. If the port is in use:\n // - strictPort: reject with EADDRINUSE so the operator knows.\n // - !strictPort: fall back to OS-assigned (pass 0).\n // - No explicit --port: ask the OS for a free port (pass 0).\n let boundPort = -1;\n try {\n await new Promise<void>((resolve, reject) => {\n const onError = (err: Error) => {\n server.off('listening', onListening);\n reject(err);\n };\n const onListening = () => {\n server.off('error', onError);\n resolve();\n };\n server.once('error', onError);\n server.once('listening', onListening);\n const listenPort = portExplicitlySet ? portRaw : 0;\n server.listen(listenPort, host);\n });\n const addr = server.address();\n boundPort = typeof addr === 'object' && addr !== null ? addr.port : portRaw;\n } catch (err) {\n // Listen failed.\n const msg = (err as Error).message;\n\n // Non-strict mode with an explicit port: fall back to OS-assigned.\n if (portExplicitlySet && !strictPort) {\n try {\n await new Promise<void>((resolve, reject) => {\n const onError = (e: Error) => {\n server.off('listening', onListening);\n reject(e);\n };\n const onListening = () => {\n server.off('error', onError);\n resolve();\n };\n server.once('error', onError);\n server.once('listening', onListening);\n server.listen(0, host);\n });\n const addr = server.address();\n boundPort = typeof addr === 'object' && addr !== null ? addr.port : 0;\n deps.renderer.writeWarning(\n `Port ${portRaw} was in use; bound to OS-assigned port ${boundPort} instead.\\n`,\n );\n } catch {\n // Both the explicit port and the fallback failed \u2014 give up.\n clearInterval(rateLimitCleanup);\n await release(projectDir, tentative.generation);\n deps.renderer.writeError(\n `Failed to bind ${host}: ${msg}\\n` +\n `This usually means no port is available (extremely rare). Retry or pick an explicit --port.\\n`,\n );\n return 1;\n }\n } else {\n // strictPort or no explicit port \u2014 the failure is fatal.\n clearInterval(rateLimitCleanup);\n await release(projectDir, tentative.generation);\n if (strictPort) {\n deps.renderer.writeError(\n `Failed to bind ${host}:${portRaw}: ${msg}\\n` +\n `Either pick a different --port, drop --strict-port to allow OS fallback, or stop the process holding this port.\\n`,\n );\n } else {\n deps.renderer.writeError(\n `Failed to bind ${host} on an OS-assigned port: ${msg}\\n` +\n `This usually means no port is available (extremely rare). Retry or pick an explicit --port.\\n`,\n );\n }\n return 1;\n }\n }\n\n // Phase 2 \u2014 finalize: write the lock + token with the actual\n // bound port and the same token, atomically.\n const finalized = await finalize(projectDir, tentative, boundPort);\n hqConnection = startCliHqConnection({\n clientKind: 'mailbox',\n // Mailbox telemetry is best-effort; keep a disconnected bridge from\n // retaining thousands of snapshots/events in the CLI process.\n maxQueuedMessages: 250,\n projectRoot: deps.projectRoot,\n projectName: path.basename(deps.projectRoot),\n appConfig: deps.config,\n capabilities: ['telemetry.publish', 'mailbox.summary', 'mailbox.serve'],\n onConnect: (publisher) => {\n // Announce the bridge immediately; subsequent HTTP mutations publish\n // mailbox events/snapshots through the mailbox getter above.\n void publisher\n .publishMailboxSnapshot(mailbox, { mailboxId: `${path.basename(projectDir)}:mailbox` })\n .catch(() => undefined);\n },\n });\n writeStartupInfo(deps, { host, port: boundPort, projectDir, tokenPath: acquireResult.tokenPath });\n const stopMemoryWatchdog = startSharedHeapWatchdog({\n collectStats: () => {\n const hqQueue = hqConnection?.getPublisher()?.getQueueStats();\n const hqSnapshot = mailbox.getHqSnapshotStats();\n const kanbanSync = hqConnection?.getKanbanSyncStats();\n return {\n surface: 'mailbox-http-server',\n projectId,\n boundPort,\n ...(hqQueue\n ? {\n hqQueueEntries: hqQueue.entries,\n hqQueueBytes: hqQueue.bytes,\n hqQueueMaxBytes: hqQueue.maxBytes,\n hqQueueDroppedFrames: hqQueue.droppedFrames,\n hqQueueDroppedBytes: hqQueue.droppedBytes,\n hqQueueCoalescedFrames: hqQueue.coalescedFrames,\n hqQueueCoalescedBytes: hqQueue.coalescedBytes,\n }\n : {}),\n hqSnapshotInFlight: hqSnapshot.inFlight ? 1 : 0,\n hqSnapshotPending: hqSnapshot.pending ? 1 : 0,\n hqSnapshotTimerScheduled: hqSnapshot.timerScheduled ? 1 : 0,\n hqEventInFlight: hqSnapshot.eventInFlight ? 1 : 0,\n hqEventPending: hqSnapshot.pendingEvents,\n hqEventCoalesced: hqSnapshot.coalescedEvents,\n hqEventDropped: hqSnapshot.droppedEvents,\n kanbanSyncActive: kanbanSync?.localPublishActive ? 1 : 0,\n kanbanSyncPendingBoards: kanbanSync?.pendingBoardIds ?? 0,\n kanbanSyncFullRescanPending: kanbanSync?.fullRescanPending ? 1 : 0,\n kanbanSyncRemoteApplyQueued: kanbanSync?.remoteApplyQueued ? 1 : 0,\n kanbanSyncPendingRemoteBoards: kanbanSync?.pendingRemoteBoards ?? 0,\n kanbanSyncPublishRuns: kanbanSync?.localPublishRuns ?? 0,\n kanbanSyncCoalescedRefreshes: kanbanSync?.coalescedLocalRefreshes ?? 0,\n };\n },\n });\n\n // Keep the process alive until SIGINT/SIGTERM. We resolve once the\n // server has fully closed and the lock + token files are gone.\n await new Promise<void>((resolve) => {\n let shuttingDown = false;\n const shutdown = async (sig: NodeJS.Signals) => {\n if (shuttingDown) return;\n shuttingDown = true;\n clearInterval(rateLimitCleanup);\n hqConnection?.stop();\n console.log(\n JSON.stringify({ event: 'mailbox_serve_stopping', signal: sig, host, port: boundPort }),\n );\n // Close long-lived SSE responses before waiting for server.close().\n router.close();\n // Stop accepting new connections; in-flight requests get to finish.\n await new Promise<void>((closeResolve) => server.close(() => closeResolve()));\n await mailbox.close().catch((err) => {\n deps.renderer.writeWarning(`mailbox close error: ${(err as Error).message}\\n`);\n });\n // Best-effort release. If we lost the lock race to another\n // acquire, release() will detect the generation mismatch and\n // leave their lock alone.\n await release(projectDir, finalized.generation);\n await stopMemoryWatchdog();\n resolve();\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n });\n return 0;\n}\n\n// \u2500\u2500 Startup info / help \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface StartupInfo {\n host: string;\n port: number;\n projectDir: string;\n tokenPath: string;\n}\n\nfunction writeStartupInfo(deps: SubcommandDeps, info: StartupInfo): void {\n // One structured JSON line to stdout for log-shippers; human-readable\n // mirror to stderr (renderer.writeWarning/etc. go to stderr).\n console.log(\n JSON.stringify({\n event: 'mailbox_serve_started',\n host: info.host,\n port: info.port,\n projectDir: info.projectDir,\n tokenFile: info.tokenPath,\n }),\n );\n deps.renderer.write(`WrongStack mailbox bridge listening on http://${info.host}:${info.port}\\n`);\n deps.renderer.write(`Project dir: ${info.projectDir}\\n`);\n deps.renderer.write(`Token file: ${info.tokenPath} (mode 0600)\\n`);\n deps.renderer.write('\\n');\n deps.renderer.write('Routes:\\n');\n deps.renderer.write(' POST /mailbox/send send a message\\n');\n deps.renderer.write(' POST /mailbox/query query messages\\n');\n deps.renderer.write(\n ' POST /mailbox/check check inbox and optionally mark read/completed\\n',\n );\n deps.renderer.write(' POST /mailbox/ack acknowledge one message\\n');\n deps.renderer.write(' POST /mailbox/ack-many acknowledge many in one batch\\n');\n deps.renderer.write(' POST /mailbox/unread-count count unread messages for an agent\\n');\n deps.renderer.write(' POST /mailbox/agents/register register an external agent\\n');\n deps.renderer.write(' POST /mailbox/agents/heartbeat update agent heartbeat\\n');\n deps.renderer.write(' POST /mailbox/register-client register an external client\\n');\n deps.renderer.write(' POST /mailbox/heartbeat update client heartbeat\\n');\n deps.renderer.write(' GET /mailbox/agents list all registered agents\\n');\n deps.renderer.write(' GET /mailbox/agents/online list agents with a live heartbeat\\n');\n deps.renderer.write(' GET /mailbox/events SSE stream \u2014 real-time mailbox push\\n');\n deps.renderer.write(' GET /healthz health probe (no auth)\\n');\n deps.renderer.write('\\n');\n deps.renderer.write('Send the bearer token in: Authorization: Bearer <token>\\n');\n deps.renderer.write('Cat the token from another shell:\\n');\n deps.renderer.write(` cat ${info.tokenPath}\\n`);\n deps.renderer.write('\\nPress Ctrl+C to stop.\\n');\n}\n\nfunction printHelp(deps: SubcommandDeps): void {\n deps.renderer.write(`Usage: wstack mailbox <serve>\\n`);\n deps.renderer.write('\\n');\n deps.renderer.write(` wstack mailbox serve Start the loopback HTTP bridge.\\n`);\n deps.renderer.write('\\n');\n deps.renderer.write('Flags:\\n');\n deps.renderer.write(\n ` --host <ip> Bind host (default ${DEFAULT_HOST}). Exposing beyond\\n`,\n );\n deps.renderer.write(' loopback requires network-layer protection.\\n');\n deps.renderer.write(` --port <n> Bind port (default ${DEFAULT_PORT}).\\n`);\n deps.renderer.write(' --strict-port Fail if the requested port is already in use.\\n');\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/subcommands/handlers/mcp.ts", "../src/mcp-serve.ts"],
4
- "sourcesContent": ["import { expectDefined } from '@wrongstack/core/utils';\nimport {\n jsonObjectFileExists,\n readJsonObjectFile,\n removeJsonPath,\n setJsonPath,\n updateJsonObjectFile,\n} from '@wrongstack/core/utils';\nimport { allServers } from '@wrongstack/core/infrastructure';\nimport { serveMcpStdio } from '../../mcp-serve.js';\nimport { activeProfileConfigPath } from '../../profile-config-path.js';\nimport type { SubcommandDeps, SubcommandHandler } from '../index.js';\n\nconst BUILT_IN_MCP = allServers();\n\nexport const mcpCmd: SubcommandHandler = async (args, deps) => {\n const sub = args[0];\n if (sub === 'serve') {\n // Run WrongStack as an MCP server over stdio. Blocks until stdin closes.\n // Flags (--yolo/--tools) come via deps.flags \u2014 the dispatcher strips them\n // from positional args.\n return serveMcpStdio(deps);\n }\n if (!sub || sub === 'list') {\n const servers = deps.config.mcpServers ?? {};\n if (Object.keys(servers).length === 0) {\n deps.renderer.write('No MCP servers configured.\\n');\n deps.renderer.write('Use `wstack mcp add <name>` or set mcpServers in your config.\\n');\n return 0;\n }\n for (const [name, cfg] of Object.entries(servers)) {\n const status = cfg.enabled === false ? 'disabled' : 'enabled';\n const desc = cfg.description ? ` # ${cfg.description}` : '';\n deps.renderer.write(` ${name.padEnd(20)} ${cfg.transport.padEnd(16)} ${status}${desc}\\n`);\n }\n return 0;\n }\n if (sub === 'add') {\n return addMcpServer(args, deps);\n }\n if (sub === 'remove') {\n const name = args[1];\n if (!name) {\n deps.renderer.writeError('Usage: wstack mcp remove <name>\\n');\n return 1;\n }\n return removeMcpServer(name, deps);\n }\n if (sub === 'restart') {\n deps.renderer.writeWarning(\n 'mcp restart is only available in REPL mode. Use /mcp restart instead.',\n );\n return 0;\n }\n deps.renderer.writeError(`Unknown mcp subcommand: ${sub}`);\n return 1;\n};\n\nasync function addMcpServer(args: string[], deps: SubcommandDeps): Promise<number> {\n const configPath = activeProfileConfigPath(deps.paths, deps.config);\n const name = args[1];\n const enable = args.includes('--enable') || args.includes('-e');\n if (!name) {\n deps.renderer.writeError('Usage: wstack mcp add <name>\\n');\n deps.renderer.write('Available servers:\\n');\n for (const [sname, scfg] of Object.entries(deps.config.mcpServers ?? {}))\n deps.renderer.write(` ${sname.padEnd(20)} ${scfg.description ?? scfg.transport}\\n`);\n if (Object.keys(deps.config.mcpServers ?? {}).length === 0)\n for (const k of Object.keys(BUILT_IN_MCP)) {\n const s = expectDefined(BUILT_IN_MCP[k]);\n deps.renderer.write(` ${k.padEnd(20)} ${s.description}\\n`);\n }\n deps.renderer.write('\\nRun `wstack mcp add <name> --enable` to enable immediately.\\n');\n return 1;\n }\n const factory = BUILT_IN_MCP[name];\n if (!factory) {\n deps.renderer.writeError(\n `Unknown server \"${name}\". Run \\`wstack mcp add\\` without args to see available servers.\\n`,\n );\n return 1;\n }\n const serverCfg = { ...factory };\n serverCfg.enabled = enable;\n const existing = await readJsonObjectFile(configPath);\n const mcpServers = isRecord(existing.mcpServers) ? existing.mcpServers : {};\n if (mcpServers[name])\n deps.renderer.writeWarning(`Server \"${name}\" already in config. Updating.\\n`);\n await updateJsonObjectFile(configPath, (config) => {\n setJsonPath(config, ['mcpServers', name], serverCfg);\n });\n const verb = enable ? 'Enabled' : 'Added (disabled \u2014 set enabled:true to activate)';\n deps.renderer.writeInfo(\n `${verb} \"${name}\" (${serverCfg.transport}). Config written to ${configPath}.\\n`,\n );\n return 0;\n}\n\nasync function removeMcpServer(name: string, deps: SubcommandDeps): Promise<number> {\n const configPath = activeProfileConfigPath(deps.paths, deps.config);\n if (!(await jsonObjectFileExists(configPath))) {\n deps.renderer.writeError('No config file found.\\n');\n return 1;\n }\n const existing = await readJsonObjectFile(configPath);\n const mcpServers = isRecord(existing.mcpServers) ? existing.mcpServers : {};\n if (!mcpServers[name]) {\n deps.renderer.writeError(`Server \"${name}\" not in config.\\n`);\n return 1;\n }\n await updateJsonObjectFile(configPath, (config) => {\n removeJsonPath(config, ['mcpServers', name]);\n });\n deps.renderer.writeInfo(`Removed \"${name}\" from config.\\n`);\n return 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "/**\n * `wstack mcp serve` \u2014 run WrongStack itself as an MCP server over stdio.\n *\n * Exposes the built-in tool registry to any MCP client (Claude Desktop, another\n * agent, an IDE). stdout is the JSON-RPC channel \u2014 every status/log line goes to\n * stderr. By default a safe `AutoApprovePermissionPolicy` is used: read-only\n * tools are exposed, while shell/write/edit and dangerous-capability tools are\n * withheld. `--yolo` exposes everything; `--tools a,b,c` restricts the set.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { AutoApprovePermissionPolicy, DefaultSecretScrubber } from '@wrongstack/core/security';\nimport { Context } from '@wrongstack/core/agent';\nimport { normalizeTokenSavingTier } from '@wrongstack/core/types';\nimport type { PermissionPolicy, Provider, SessionWriter, TokenCounter, Tool } from '@wrongstack/core/types';\nimport { ToolRegistry } from '@wrongstack/core/registry';\nimport { ToolExecutor } from '@wrongstack/core/execution';\nimport {\n DEFAULT_MCP_INSERTION_MAX_BYTES,\n MCPServer,\n type MCPServerPrompt,\n type MCPServerResource,\n type MCPServerToolHost,\n serveHttp,\n serveStdio,\n} from '@wrongstack/mcp';\nimport { registerBuiltinToolTier } from '@wrongstack/tools/tool-tier';\nimport type { SubcommandDeps } from './subcommands/index.js';\n\n/** `--yolo` policy: auto-approve everything (inherits the rest of the contract). */\nclass AllowAllPermissionPolicy extends AutoApprovePermissionPolicy {\n override async evaluate(): ReturnType<AutoApprovePermissionPolicy['evaluate']> {\n return { permission: 'auto', source: 'default' };\n }\n}\n\nfunction parseToolsFlag(flags: Record<string, string | boolean>): Set<string> | null {\n const raw = flags['tools'];\n if (typeof raw !== 'string') return null;\n const set = new Set(\n raw\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean),\n );\n return set.size > 0 ? set : null;\n}\n\nexport interface SelectedMcpServeContent {\n resources: MCPServerResource[];\n prompts: MCPServerPrompt[];\n}\n\n/** Load only files explicitly named by trusted CLI flags; nothing is auto-discovered. */\nexport async function loadSelectedMcpServeContent(\n flags: Record<string, string | boolean>,\n cwd: string,\n): Promise<SelectedMcpServeContent> {\n const resources: MCPServerResource[] = [];\n const prompts: MCPServerPrompt[] = [];\n const resourceUris = new Set<string>();\n const promptNames = new Set<string>();\n for (const selected of commaSeparatedFlag(flags, 'resources')) {\n const file = path.resolve(cwd, selected);\n const data = await readSelectedFile(file);\n const uri = pathToFileURL(file).toString();\n if (resourceUris.has(uri)) throw new Error(`Duplicate MCP resource selection: ${selected}`);\n resourceUris.add(uri);\n const mimeType = mimeTypeFor(file);\n resources.push({\n uri,\n name: path.basename(file),\n mimeType,\n size: data.byteLength,\n contents: [\n isTextMime(mimeType)\n ? { uri, mimeType, text: data.toString('utf8') }\n : { uri, mimeType, blob: data.toString('base64') },\n ],\n });\n }\n for (const selected of commaSeparatedFlag(flags, 'prompts')) {\n const file = path.resolve(cwd, selected);\n const data = await readSelectedFile(file);\n const name = path\n .basename(file, path.extname(file))\n .replace(/[^A-Za-z0-9_.-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n if (!name) throw new Error(`Cannot derive an MCP prompt name from: ${selected}`);\n if (promptNames.has(name)) throw new Error(`Duplicate MCP prompt name: ${name}`);\n promptNames.add(name);\n const template = data.toString('utf8');\n const argumentNames = Array.from(\n template.matchAll(/\\{\\{([A-Za-z_][A-Za-z0-9_.-]*)\\}\\}/g),\n (match) => match[1],\n ).filter((value, index, all): value is string => !!value && all.indexOf(value) === index);\n prompts.push({\n name,\n description: `Explicitly selected local prompt: ${path.basename(file)}`,\n arguments: argumentNames.map((argument) => ({ name: argument, required: true })),\n template,\n });\n }\n return { resources, prompts };\n}\n\nfunction commaSeparatedFlag(\n flags: Record<string, string | boolean>,\n name: 'resources' | 'prompts',\n): string[] {\n const value = flags[name];\n if (value === undefined) return [];\n if (typeof value !== 'string' || value.trim() === '') {\n throw new Error(`--${name} requires a comma-separated file list`);\n }\n return value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nasync function readSelectedFile(file: string): Promise<Buffer> {\n const stat = await fs.stat(file);\n if (!stat.isFile()) throw new Error(`Selected MCP content is not a regular file: ${file}`);\n if (stat.size > DEFAULT_MCP_INSERTION_MAX_BYTES) {\n throw new Error(\n `Selected MCP content exceeds ${DEFAULT_MCP_INSERTION_MAX_BYTES} bytes: ${file}`,\n );\n }\n return fs.readFile(file);\n}\n\nfunction mimeTypeFor(file: string): string {\n switch (path.extname(file).toLowerCase()) {\n case '.md':\n case '.mdx':\n return 'text/markdown';\n case '.json':\n return 'application/json';\n case '.yaml':\n case '.yml':\n return 'application/yaml';\n case '.html':\n return 'text/html';\n case '.css':\n return 'text/css';\n case '.js':\n case '.mjs':\n return 'text/javascript';\n case '.ts':\n case '.tsx':\n return 'text/typescript';\n case '.txt':\n case '.log':\n return 'text/plain';\n case '.png':\n return 'image/png';\n case '.jpg':\n case '.jpeg':\n return 'image/jpeg';\n case '.gif':\n return 'image/gif';\n case '.webp':\n return 'image/webp';\n default:\n return 'application/octet-stream';\n }\n}\n\nfunction isTextMime(mimeType: string): boolean {\n return (\n mimeType.startsWith('text/') ||\n mimeType === 'application/json' ||\n mimeType === 'application/yaml'\n );\n}\n\n/** Minimal run context \u2014 tools read cwd/projectRoot/signal; provider/session are stubs. */\nexport function makeServeContext(\n cwd: string,\n projectRoot: string,\n signal: AbortSignal,\n restrictFsToRoot = true,\n): Context {\n const provider = {\n id: 'mcp-serve',\n capabilities: { maxContext: 0 },\n complete: async () => {\n throw new Error('no model provider in `mcp serve` mode');\n },\n stream: () => {\n throw new Error('no model provider in `mcp serve` mode');\n },\n } as never as Provider;\n const session = { append: async () => {} } as never as SessionWriter;\n const tokenCounter = {\n account: () => {},\n total: () => ({ input: 0, output: 0 }),\n estimateCost: () => ({ total: 0 }),\n } as never as TokenCounter;\n return new Context({\n systemPrompt: [],\n provider,\n session,\n signal,\n tokenCounter,\n cwd,\n projectRoot,\n allowOutsideProjectRoot: !restrictFsToRoot,\n model: 'mcp-serve',\n tools: [],\n });\n}\n\n/**\n * Compute the set of tools an MCP-serve session exposes: a tool is included\n * only if it passes the whitelist (when set) AND the permission policy returns\n * `auto`. With `AutoApprovePermissionPolicy` this withholds shell/write/edit and\n * dangerous-capability tools; with the `--yolo` policy everything passes.\n * Exported for testing \u2014 the live path calls it inside `serveMcpStdio`.\n */\nexport async function selectExposedTools(\n registry: ToolRegistry,\n ctx: Context,\n policy: PermissionPolicy,\n whitelist: Set<string> | null,\n): Promise<Tool[]> {\n const allowed: Tool[] = [];\n for (const tool of registry.list()) {\n if (whitelist && !whitelist.has(tool.name)) continue;\n const decision = await policy.evaluate(tool, {}, ctx);\n if (decision.permission === 'auto') allowed.push(tool);\n }\n return allowed;\n}\n\nexport async function serveMcpStdio(deps: SubcommandDeps): Promise<number> {\n const flags = deps.flags ?? {};\n const yolo = flags['yolo'] === true || flags['allow-all'] === true;\n const whitelist = parseToolsFlag(flags);\n const log = (m: string) => process.stderr.write(`${m}\\n`);\n let selectedContent: SelectedMcpServeContent;\n try {\n selectedContent = await loadSelectedMcpServeContent(flags, deps.cwd);\n } catch (err) {\n log(`wrongstack MCP server: ${err instanceof Error ? err.message : String(err)}`);\n return 1;\n }\n\n // Reuse the subcommand's pre-populated registry; fall back to a fresh one.\n let registry = deps.toolRegistry as ToolRegistry | undefined;\n if (!registry) {\n registry = new ToolRegistry();\n registerBuiltinToolTier({\n registry,\n tier: normalizeTokenSavingTier(deps.config.features.tokenSavingMode),\n });\n }\n\n const controller = new AbortController();\n const ctx = makeServeContext(\n deps.cwd,\n deps.projectRoot,\n controller.signal,\n deps.config.tools?.restrictToProjectRoot ?? false,\n );\n const permissionPolicy: PermissionPolicy = yolo\n ? new AllowAllPermissionPolicy()\n : new AutoApprovePermissionPolicy();\n const executor = new ToolExecutor(registry, {\n permissionPolicy,\n secretScrubber: new DefaultSecretScrubber(),\n maxToolTimeoutMs: deps.config.tools?.maxToolTimeoutMs ?? 300_000,\n perIterationOutputCapBytes: 1_000_000,\n });\n\n // Pre-compute the exposed set so tools/list and tools/call agree, and so a\n // withheld tool can never be invoked even if a client guesses its name.\n const allowed = await selectExposedTools(registry, ctx, permissionPolicy, whitelist);\n const allowedNames = new Set(allowed.map((t) => t.name));\n\n if (allowed.length === 0) {\n log(\n 'wrongstack MCP server: no tools to expose (all withheld by policy or filtered out). ' +\n 'Pass --yolo to expose write/exec tools, or --tools <names> to whitelist.',\n );\n }\n\n let counter = 0;\n const host: MCPServerToolHost = {\n listTools: () =>\n allowed.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: (t.inputSchema as Record<string, unknown>) ?? { type: 'object' },\n })),\n callTool: async (name, callArgs) => {\n if (!allowedNames.has(name)) {\n return { content: `Tool \"${name}\" is not exposed by this server`, isError: true };\n }\n const use = {\n type: 'tool_use' as const,\n id: `srv_${++counter}`,\n name,\n input: callArgs,\n };\n const batch = await executor.executeBatch([use], ctx, 'sequential');\n const result = batch.outputs[0]?.result;\n if (!result || result.type === 'tool_confirm_pending') {\n return {\n content: `Tool \"${name}\" requires interactive confirmation, which is unavailable over MCP`,\n isError: true,\n };\n }\n return { content: result.content, isError: Boolean(result.is_error) };\n },\n };\n\n const server = new MCPServer({\n host,\n resources: selectedContent.resources,\n prompts: selectedContent.prompts,\n logger: { warn: (m) => log(`[mcp-serve] ${m}`) },\n });\n\n const mode = yolo ? 'yolo: all tools' : 'safe: read-only tools';\n\n // HTTP transport \u2014 network-reachable. Loopback by default; non-loopback\n // requires a token (enforced in serveHttp).\n if (\n flags['http'] === true ||\n typeof flags['http'] === 'string' ||\n flags['port'] ||\n flags['host']\n ) {\n const port = Number(flags['port'] ?? flags['http'] ?? 0) || 0;\n const httpHost = typeof flags['host'] === 'string' ? flags['host'] : '127.0.0.1';\n const token = typeof flags['token'] === 'string' ? flags['token'] : undefined;\n let handle: Awaited<ReturnType<typeof serveHttp>>;\n try {\n handle = await serveHttp(server, {\n port,\n host: httpHost,\n token,\n logger: { warn: (m) => log(`[mcp-serve] ${m}`) },\n });\n } catch (err) {\n log(`wrongstack MCP server: ${err instanceof Error ? err.message : String(err)}`);\n return 1;\n }\n log(\n `wrongstack MCP server ready at ${handle.url} \u2014 exposing ${allowed.length} tool(s), ` +\n `${selectedContent.resources.length} resource(s), ${selectedContent.prompts.length} prompt(s) (${mode})` +\n `${token ? ' [token auth]' : ''}.`,\n );\n await new Promise<void>((resolve) => {\n const stop = () => resolve();\n process.once('SIGINT', stop);\n process.once('SIGTERM', stop);\n });\n await handle.close();\n controller.abort();\n return 0;\n }\n\n log(\n `wrongstack MCP server ready on stdio \u2014 exposing ${allowed.length} tool(s), ` +\n `${selectedContent.resources.length} resource(s), ${selectedContent.prompts.length} prompt(s) (${mode}).`,\n );\n\n const handle = serveStdio(server);\n await handle.done;\n controller.abort();\n return 0;\n}\n"],
5
- "mappings": "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",
6
- "names": ["stat", "handle", "resolve"]
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-serve.d.ts","sourceRoot":"","sources":["../src/mcp-serve.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,KAAK,EAAE,gBAAgB,EAAyC,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC5G,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAIvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAqB7D,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,yFAAyF;AACzF,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EACvC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,uBAAuB,CAAC,CA+ClC;AAyED,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,gBAAgB,UAAO,GACtB,OAAO,CA6BT;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,YAAY,EACtB,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,GAC5B,OAAO,CAAC,IAAI,EAAE,CAAC,CAQjB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA0IzE"}
@@ -1,7 +0,0 @@
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
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"multi-agent.d.ts","sourceRoot":"","sources":["../src/multi-agent.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"next-task-predictor.d.ts","sourceRoot":"","sources":["../src/next-task-predictor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,mFAAmF;AACnF,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,gBAAgB,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,oEAAoE;IACpE,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC;AAaD,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAoBpE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAI,GAAG,MAAM,EAAE,CAmB/D;AAYD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,MAAM,EAAE,CAAC,CA6BnB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"permission-prompt.d.ts","sourceRoot":"","sources":["../src/permission-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAKhE,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,IAAI,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE9D,6DAA6D;AAC7D,MAAM,MAAM,cAAc,GAAG,CAC3B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,KACrB,OAAO,CAAC,KAAK,GAAG,IAAI,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC;AAE/C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,UAChC,IAAI,SAAS,OAAO,oBAAoB,MAAM,KAAG,OAAO,CAAC,cAAc,CAAC,CA4B7F;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,CAMtE"}
@@ -1,7 +0,0 @@
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
- }
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-api-factory.d.ts","sourceRoot":"","sources":["../src/plugin-api-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE/F,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,GACrC,SAAS,CAEX"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-management.d.ts","sourceRoot":"","sources":["../src/plugin-management.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAGxF,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,QAAQ,GAAG,UAAU,CAAC;IACpC,UAAU,EAAE,OAAO,CAAC;CACrB;AAqED,eAAO,MAAM,oBAAoB,EAAE,SAAS,gBAAgB,EAG1D,CAAC;AAEH,eAAO,MAAM,gBAAgB;aAEzB,KAAK,EAAE,UAAU;aACjB,SAAS,EAAE,sBAAsB;aACjC,WAAW,EAAE,iEAAiE;;aAG9E,KAAK,EAAE,KAAK;aACZ,SAAS,EAAE,sBAAsB;aACjC,WAAW,EAAE,uDAAuD;EAE9D,CAAC;AAEX,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,YAAY,CAAC,EAAE,GAAG,SAAS,CAAC;QAChD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,aAAa,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;QAChD;;;WAGG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;KAClE,CAAC;IACF,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACvC;AASD,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,sBAAsB,CAAC,CAsEjC;AAgQD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5D;AAQD,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAiB9D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAqC9D"}
@@ -1,7 +0,0 @@
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
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"launch-prompts.d.ts","sourceRoot":"","sources":["../../src/pre-launch/launch-prompts.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,yBAAyB;IACzB,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,0DAA0D;IAC1D,IAAI,EAAE,OAAO,CAAC;IACd,mFAAmF;IACnF,QAAQ,EAAE,KAAK,GAAG,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,QAAQ,KAAK;IACtB,cAGC;CACF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IACxC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,cAAc,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5C,8EAA8E;IAC9E,WAAW,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CAC7C,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoJ7B;AAWD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"project-check.d.ts","sourceRoot":"","sources":["../../src/pre-launch/project-check.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,MAAM,MAAM,WAAW;AACrB,qDAAqD;AACnD,aAAa;AACf,6FAA6F;GAC3F,SAAS;AACX,uEAAuE;GACrE,OAAO,CAAC;AAeZ,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAgBjF;AAYD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB;;oBAEgB;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,mBAAmB,CAAC;CAC7B,GAAG,OAAO,CAAC,OAAO,CAAC,CAqGnB"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,MAAM,WAAW,eAAe;IAC9B;2DACuD;IACvD,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;IACnC;;0CAEsC;IACtC,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAK1C;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,iBAAiB,EAAE,UAAU,GAAG,SAAS,GACxC,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAEjC;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxE;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,UAAU,GAAG,SAAS,GACxC,OAAO,CAAC,eAAe,CAAC,CAS1B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"profile-config-path.d.ts","sourceRoot":"","sources":["../src/profile-config-path.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,yFAAyF;AACzF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,MAAM,CAI/E;AAED,kEAAkE;AAClE,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EACzC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,GACpC,MAAM,CAER"}