rovecode 0.4.0-beta.3 → 0.4.0

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 (432) hide show
  1. package/README.md +57 -72
  2. package/THIRD_PARTY_NOTICES.md +0 -44
  3. package/bin/rovecode.ts +21 -0
  4. package/package.json +16 -38
  5. package/src/account/keys.ts +97 -0
  6. package/src/account/login.ts +158 -0
  7. package/src/account/provision.ts +47 -0
  8. package/src/account/store.ts +63 -0
  9. package/src/acp/server.ts +373 -0
  10. package/src/cli/account-cmd.ts +116 -0
  11. package/src/cli/connect.ts +244 -0
  12. package/src/cli/context-cmd.ts +199 -0
  13. package/src/cli/dispatch.ts +109 -0
  14. package/src/cli/doctor.ts +324 -0
  15. package/src/cli/export.ts +278 -0
  16. package/src/cli/help.ts +240 -0
  17. package/src/cli/is-tui-invocation.ts +8 -0
  18. package/src/cli/main.ts +599 -0
  19. package/src/cli/market-cmd.ts +658 -0
  20. package/src/cli/mcp-market-cmd.ts +299 -0
  21. package/src/cli/output.ts +382 -0
  22. package/src/cli/repl.ts +172 -0
  23. package/src/cli/resume.ts +32 -0
  24. package/src/cli/run-limits.ts +78 -0
  25. package/src/cli/runtime.ts +792 -0
  26. package/src/cli/setup.ts +187 -0
  27. package/src/cli/update-cmd.ts +78 -0
  28. package/src/cli/workflow-cmd.ts +100 -0
  29. package/src/coding/checkpoints.ts +270 -0
  30. package/src/coding/diff.ts +136 -0
  31. package/src/coding/files.ts +339 -0
  32. package/src/coding/hashline.ts +319 -0
  33. package/src/coding/lsp.ts +406 -0
  34. package/src/coding/repomap-cache.ts +99 -0
  35. package/src/coding/repomap-files.ts +110 -0
  36. package/src/coding/repomap.ts +392 -0
  37. package/src/core/compaction.ts +399 -0
  38. package/src/core/config.ts +289 -0
  39. package/src/core/context-report.ts +228 -0
  40. package/src/core/context.ts +60 -0
  41. package/src/core/count-remote.ts +107 -0
  42. package/src/core/execpolicy-rules.ts +196 -0
  43. package/src/core/execpolicy.ts +385 -0
  44. package/src/core/executor.ts +397 -0
  45. package/src/core/guardrails.ts +400 -0
  46. package/src/core/hooks.ts +398 -0
  47. package/src/core/images.ts +230 -0
  48. package/src/core/intro.ts +236 -0
  49. package/src/core/loop.ts +621 -0
  50. package/src/core/modes.ts +372 -0
  51. package/src/core/orchestrator.ts +207 -0
  52. package/src/core/reflection.ts +165 -0
  53. package/src/core/sandbox-config.ts +167 -0
  54. package/src/core/session-images.ts +73 -0
  55. package/src/core/session.ts +398 -0
  56. package/src/core/settings.ts +98 -0
  57. package/src/core/stuck-detector.ts +273 -0
  58. package/src/core/tasks.ts +374 -0
  59. package/src/core/token-scale.ts +108 -0
  60. package/src/core/tool-output-budget.ts +166 -0
  61. package/src/core/tools.ts +288 -0
  62. package/src/core/types.ts +330 -0
  63. package/src/core/update-check.ts +171 -0
  64. package/src/core/update.ts +158 -0
  65. package/src/core/usage.ts +204 -0
  66. package/src/core/validate.ts +121 -0
  67. package/src/core/verify-gate.ts +159 -0
  68. package/src/core/verify.ts +237 -0
  69. package/src/core/voice.ts +158 -0
  70. package/src/core/win-job.ts +183 -0
  71. package/src/design/audit.ts +797 -0
  72. package/src/design/direction.ts +190 -0
  73. package/src/design/rules.ts +157 -0
  74. package/src/eval/bench.ts +150 -0
  75. package/src/eval/gauntlet-runner.ts +218 -0
  76. package/src/eval/gauntlet.ts +226 -0
  77. package/src/eval/grader.ts +186 -0
  78. package/src/eval/record.ts +202 -0
  79. package/src/eval/redact.ts +141 -0
  80. package/src/eval/replay.ts +147 -0
  81. package/src/eval/trajectory.ts +373 -0
  82. package/src/index.ts +17 -0
  83. package/src/market/catalogs/mcp-docs.json +111 -0
  84. package/src/market/catalogs/plugins.json +111 -0
  85. package/src/market/catalogs/skills.json +478 -0
  86. package/src/market/clone.ts +72 -0
  87. package/src/market/context-cost.ts +121 -0
  88. package/src/market/digest.ts +106 -0
  89. package/src/market/index.ts +22 -0
  90. package/src/market/install.ts +578 -0
  91. package/src/market/manifest.ts +187 -0
  92. package/src/market/prereq.ts +145 -0
  93. package/src/market/registry.ts +363 -0
  94. package/src/market/resolve.ts +111 -0
  95. package/src/market/types.ts +236 -0
  96. package/src/market/validate.ts +227 -0
  97. package/src/mcp/client.ts +431 -0
  98. package/src/mcp/config.ts +239 -0
  99. package/src/mcp/local-package.ts +211 -0
  100. package/src/mcp/market-catalog.ts +84 -0
  101. package/src/mcp/market-install.ts +289 -0
  102. package/src/mcp/market.ts +0 -0
  103. package/src/mcp/tools.ts +131 -0
  104. package/src/mcp/trust.ts +49 -0
  105. package/src/memory/blocks.ts +175 -0
  106. package/src/memory/recall.ts +355 -0
  107. package/src/memory/store.ts +105 -0
  108. package/src/memory/tools.ts +99 -0
  109. package/src/plugins/cli.ts +123 -0
  110. package/src/plugins/discover.ts +108 -0
  111. package/src/plugins/index.ts +50 -0
  112. package/src/plugins/init.ts +140 -0
  113. package/src/plugins/install.ts +184 -0
  114. package/src/plugins/load.ts +149 -0
  115. package/src/plugins/manifest.ts +106 -0
  116. package/src/plugins/state.ts +83 -0
  117. package/src/providers/auth.ts +293 -0
  118. package/src/providers/cache.ts +223 -0
  119. package/src/providers/catalog-local.ts +160 -0
  120. package/src/providers/catalog.ts +408 -0
  121. package/src/providers/middleware-context.ts +86 -0
  122. package/src/providers/middleware.ts +373 -0
  123. package/src/providers/profile-glm53.ts +111 -0
  124. package/src/providers/profile-sonnet5-persona.ts +65 -0
  125. package/src/providers/profile-sonnet5-voice.ts +23 -0
  126. package/src/providers/profiles.ts +156 -0
  127. package/src/providers/provider-config.ts +311 -0
  128. package/src/providers/registry.ts +302 -0
  129. package/src/providers/response-validation.ts +80 -0
  130. package/src/providers/retry.ts +234 -0
  131. package/src/providers/router.ts +294 -0
  132. package/src/providers/sse.ts +26 -0
  133. package/src/providers/stream-errors.ts +117 -0
  134. package/src/providers/stream.ts +569 -0
  135. package/src/providers/thinking.ts +189 -0
  136. package/src/providers/wire-messages.ts +129 -0
  137. package/src/sdk/client.ts +225 -0
  138. package/src/sdk/index.ts +3 -0
  139. package/src/server/dashboard.ts +144 -0
  140. package/src/server/http.ts +343 -0
  141. package/src/server/openapi.ts +246 -0
  142. package/src/sextant/card-hits.ts +102 -0
  143. package/src/sextant/card-keys.ts +55 -0
  144. package/src/sextant/context-source.ts +157 -0
  145. package/src/sextant/draw-agents.ts +273 -0
  146. package/src/sextant/draw-code.ts +388 -0
  147. package/src/sextant/draw-context.ts +222 -0
  148. package/src/sextant/draw-frame.ts +164 -0
  149. package/src/sextant/draw-market.ts +573 -0
  150. package/src/sextant/draw-messages.ts +386 -0
  151. package/src/sextant/draw-pet.ts +230 -0
  152. package/src/sextant/draw-plan.ts +159 -0
  153. package/src/sextant/draw-tabs.ts +85 -0
  154. package/src/sextant/draw-util.ts +65 -0
  155. package/src/sextant/engine.ts +230 -0
  156. package/src/sextant/frame-hits.ts +25 -0
  157. package/src/sextant/frame.ts +101 -0
  158. package/src/sextant/git-status.ts +197 -0
  159. package/src/sextant/grid.ts +59 -0
  160. package/src/sextant/input.ts +119 -0
  161. package/src/sextant/keys.ts +488 -0
  162. package/src/sextant/layout.ts +86 -0
  163. package/src/sextant/local-commands.ts +156 -0
  164. package/src/sextant/market-source.ts +287 -0
  165. package/src/sextant/mentions.ts +141 -0
  166. package/src/sextant/message-hits.ts +26 -0
  167. package/src/sextant/model.ts +387 -0
  168. package/src/sextant/overlays.ts +451 -0
  169. package/src/sextant/panel-hits.ts +38 -0
  170. package/src/sextant/pet.ts +399 -0
  171. package/src/sextant/screen.ts +324 -0
  172. package/src/sextant/scroll-hits.ts +66 -0
  173. package/src/sextant/scrollbar.ts +82 -0
  174. package/src/sextant/selection.ts +123 -0
  175. package/src/sextant/sextant-bridge.ts +174 -0
  176. package/src/sextant/sextant-cards.ts +142 -0
  177. package/src/sextant/sextant-diff-base.ts +63 -0
  178. package/src/sextant/sextant-files.ts +154 -0
  179. package/src/sextant/sextant-frame-loop.ts +314 -0
  180. package/src/sextant/sextant-renderer.ts +478 -0
  181. package/src/sextant/sextant-repo.ts +131 -0
  182. package/src/sextant/theme.ts +66 -0
  183. package/src/sextant/tool-rows.ts +189 -0
  184. package/src/sextant/types.ts +473 -0
  185. package/src/skills/index.ts +306 -0
  186. package/src/skills/tools.ts +69 -0
  187. package/src/skills/versioned.ts +227 -0
  188. package/src/telemetry/otel.ts +353 -0
  189. package/src/telemetry/otlp.ts +68 -0
  190. package/src/tools/ask-user.ts +156 -0
  191. package/src/tools/design.ts +151 -0
  192. package/src/tools/evalcell.ts +338 -0
  193. package/src/tools/html-text.ts +139 -0
  194. package/src/tools/provider.ts +149 -0
  195. package/src/tools/task.ts +216 -0
  196. package/src/tools/todo.ts +320 -0
  197. package/src/tools/webfetch.ts +331 -0
  198. package/src/tui/app.ts +608 -0
  199. package/src/tui/attach.ts +127 -0
  200. package/src/tui/checkpoints-cmd.ts +70 -0
  201. package/src/tui/clipboard-image.ts +81 -0
  202. package/src/tui/commands.ts +277 -0
  203. package/src/tui/cost.ts +108 -0
  204. package/src/tui/info-cmd.ts +144 -0
  205. package/src/tui/mcp-cmd.ts +128 -0
  206. package/src/tui/modes-cmd.ts +45 -0
  207. package/src/tui/overlays.ts +97 -0
  208. package/src/tui/pi-renderer.ts +424 -0
  209. package/src/tui/providers-cmd.ts +366 -0
  210. package/src/tui/renderer.ts +101 -0
  211. package/src/tui/replay-marker.ts +29 -0
  212. package/src/tui/session-cmd.ts +146 -0
  213. package/src/tui/sextant-attach.ts +68 -0
  214. package/src/tui/sextant-io.ts +184 -0
  215. package/src/tui/sextant-smoke.ts +110 -0
  216. package/src/tui/smoke.ts +72 -0
  217. package/src/tui/theme.ts +59 -0
  218. package/src/tui/todo-label.ts +7 -0
  219. package/src/workflow/engine.ts +266 -0
  220. package/tsconfig.json +30 -0
  221. package/vendor/pi-tui/LICENSE +21 -0
  222. package/vendor/pi-tui/PATCHES.md +12 -0
  223. package/vendor/pi-tui/PROVENANCE.md +12 -0
  224. package/vendor/pi-tui/README.upstream.md +854 -0
  225. package/vendor/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  226. package/vendor/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  227. package/vendor/pi-tui/src/alt-screen-search.ts +158 -0
  228. package/vendor/pi-tui/src/autocomplete.ts +827 -0
  229. package/vendor/pi-tui/src/components/alt-screen-flash.ts +52 -0
  230. package/vendor/pi-tui/src/components/box.ts +138 -0
  231. package/vendor/pi-tui/src/components/cancellable-loader.ts +41 -0
  232. package/vendor/pi-tui/src/components/editor.ts +2364 -0
  233. package/vendor/pi-tui/src/components/h-stack.ts +45 -0
  234. package/vendor/pi-tui/src/components/image.ts +128 -0
  235. package/vendor/pi-tui/src/components/input.ts +448 -0
  236. package/vendor/pi-tui/src/components/loader.ts +93 -0
  237. package/vendor/pi-tui/src/components/markdown.ts +1016 -0
  238. package/vendor/pi-tui/src/components/scroll-view.ts +217 -0
  239. package/vendor/pi-tui/src/components/select-list.ts +230 -0
  240. package/vendor/pi-tui/src/components/settings-list.ts +277 -0
  241. package/vendor/pi-tui/src/components/spacer.ts +29 -0
  242. package/vendor/pi-tui/src/components/stack.ts +155 -0
  243. package/vendor/pi-tui/src/components/text.ts +108 -0
  244. package/vendor/pi-tui/src/components/truncated-text.ts +66 -0
  245. package/vendor/pi-tui/src/components/v-stack.ts +34 -0
  246. package/vendor/pi-tui/src/editor-component.ts +75 -0
  247. package/vendor/pi-tui/src/fuzzy.ts +138 -0
  248. package/vendor/pi-tui/src/index.ts +149 -0
  249. package/vendor/pi-tui/src/keybindings.ts +321 -0
  250. package/vendor/pi-tui/src/keys.ts +1402 -0
  251. package/vendor/pi-tui/src/kill-ring.ts +47 -0
  252. package/vendor/pi-tui/src/latex.ts +1381 -0
  253. package/vendor/pi-tui/src/layout-node.ts +52 -0
  254. package/vendor/pi-tui/src/layout.ts +411 -0
  255. package/vendor/pi-tui/src/native-modifiers.ts +60 -0
  256. package/vendor/pi-tui/src/native-module-path.ts +32 -0
  257. package/vendor/pi-tui/src/stdin-buffer.ts +445 -0
  258. package/vendor/pi-tui/src/terminal-colors.ts +74 -0
  259. package/vendor/pi-tui/src/terminal-image.ts +701 -0
  260. package/vendor/pi-tui/src/terminal.ts +554 -0
  261. package/vendor/pi-tui/src/tui-alt-screen.ts +1379 -0
  262. package/vendor/pi-tui/src/tui-main-screen.ts +655 -0
  263. package/vendor/pi-tui/src/tui.ts +1264 -0
  264. package/vendor/pi-tui/src/undo-stack.ts +29 -0
  265. package/vendor/pi-tui/src/utils.ts +1327 -0
  266. package/vendor/pi-tui/src/word-navigation.ts +118 -0
  267. package/vendor/pi-tui/test/test-themes.ts +39 -0
  268. package/vendor/pi-tui/test/virtual-terminal.ts +219 -0
  269. package/CHANGELOG.md +0 -527
  270. package/bin/rovecode.js +0 -24
  271. package/dist/cli/app-j6gn14w3.js +0 -2
  272. package/dist/cli/ask-user-cwstt8fz.js +0 -2
  273. package/dist/cli/auth-login-9bbp9915.js +0 -2
  274. package/dist/cli/auth-m8p9grty.js +0 -2
  275. package/dist/cli/bench-16zqdms5.js +0 -9
  276. package/dist/cli/catalog-1xchffa4.js +0 -2
  277. package/dist/cli/cli-1n1zb64f.js +0 -2
  278. package/dist/cli/client-2t9gjkck.js +0 -2
  279. package/dist/cli/commands-exafvm2b.js +0 -2
  280. package/dist/cli/connect-6zde0kn3.js +0 -2
  281. package/dist/cli/context-cmd-5t43wgqt.js +0 -2
  282. package/dist/cli/context-report-kt01pw8y.js +0 -2
  283. package/dist/cli/count-remote-ap7x3vh6.js +0 -2
  284. package/dist/cli/design-ne5zszyh.js +0 -2
  285. package/dist/cli/dispatch-2r5myxye.js +0 -2
  286. package/dist/cli/doctor-ws4fh4tn.js +0 -3
  287. package/dist/cli/executor-bdrjn634.js +0 -2
  288. package/dist/cli/export-1mxb9g5p.js +0 -2
  289. package/dist/cli/files-g104xghh.js +0 -2
  290. package/dist/cli/gauntlet-07xrjpj7.js +0 -2
  291. package/dist/cli/gauntlet-runner-xvy64436.js +0 -10
  292. package/dist/cli/gauntlet-wave3-jm91yt5w.js +0 -5
  293. package/dist/cli/gauntlet-wave4-r13py7p1.js +0 -14
  294. package/dist/cli/hashline-znvrat11.js +0 -2
  295. package/dist/cli/http-xafw6fsh.js +0 -143
  296. package/dist/cli/index-1sgjm25y.js +0 -2
  297. package/dist/cli/init-g2m0tn4m.js +0 -51
  298. package/dist/cli/install-avaqjjqq.js +0 -2
  299. package/dist/cli/loop-mmpfft01.js +0 -2
  300. package/dist/cli/main-0904f6ps.js +0 -5
  301. package/dist/cli/main-0ab9fc26.js +0 -9
  302. package/dist/cli/main-0jys2ccn.js +0 -3
  303. package/dist/cli/main-0mtcdbs7.js +0 -3
  304. package/dist/cli/main-0z1w2zsg.js +0 -3
  305. package/dist/cli/main-1dchs7xv.js +0 -18
  306. package/dist/cli/main-1ereejm1.js +0 -3
  307. package/dist/cli/main-1k1kw6b5.js +0 -3
  308. package/dist/cli/main-27y4sm2k.js +0 -38
  309. package/dist/cli/main-2wwjex5j.js +0 -58
  310. package/dist/cli/main-2yeveeve.js +0 -6
  311. package/dist/cli/main-2yfck9b5.js +0 -3
  312. package/dist/cli/main-2zmzgkwh.js +0 -3
  313. package/dist/cli/main-351pz3z7.js +0 -7
  314. package/dist/cli/main-3gjqfh7a.js +0 -6
  315. package/dist/cli/main-3nf3kgve.js +0 -3
  316. package/dist/cli/main-3pjrb2hd.js +0 -3
  317. package/dist/cli/main-3rxcvgna.js +0 -19
  318. package/dist/cli/main-4b3jgy66.js +0 -19
  319. package/dist/cli/main-4wndhjdc.js +0 -7
  320. package/dist/cli/main-4xcmvxnk.js +0 -3
  321. package/dist/cli/main-5tbz0wbz.js +0 -4
  322. package/dist/cli/main-5ywnwthm.js +0 -3
  323. package/dist/cli/main-6b62vkz0.js +0 -14
  324. package/dist/cli/main-6dnk69vp.js +0 -3
  325. package/dist/cli/main-6genrmhs.js +0 -136
  326. package/dist/cli/main-73g7eff4.js +0 -15
  327. package/dist/cli/main-7c5thhjd.js +0 -5
  328. package/dist/cli/main-7rn6bqje.js +0 -3
  329. package/dist/cli/main-80haw7qk.js +0 -4
  330. package/dist/cli/main-875s60s2.js +0 -4
  331. package/dist/cli/main-8kjxbpw4.js +0 -8
  332. package/dist/cli/main-90ds1z4e.js +0 -10
  333. package/dist/cli/main-9etavkew.js +0 -3
  334. package/dist/cli/main-a9njrkk1.js +0 -3
  335. package/dist/cli/main-aecrjq2d.js +0 -12
  336. package/dist/cli/main-ck9asesq.js +0 -9
  337. package/dist/cli/main-cta9racd.js +0 -4
  338. package/dist/cli/main-ddv7j2ag.js +0 -3
  339. package/dist/cli/main-dfreez27.js +0 -10
  340. package/dist/cli/main-f7rw7des.js +0 -3
  341. package/dist/cli/main-ggcn7rd7.js +0 -5
  342. package/dist/cli/main-gzkmycnv.js +0 -3
  343. package/dist/cli/main-hq51jg8v.js +0 -18
  344. package/dist/cli/main-jft389w9.js +0 -8
  345. package/dist/cli/main-k1eqkg83.js +0 -3
  346. package/dist/cli/main-k2y8a2aw.js +0 -9
  347. package/dist/cli/main-kcpbykxz.js +0 -4
  348. package/dist/cli/main-kd488vje.js +0 -22
  349. package/dist/cli/main-kh32yvgk.js +0 -5
  350. package/dist/cli/main-kqxnqjnv.js +0 -25
  351. package/dist/cli/main-kyn0xnsg.js +0 -3
  352. package/dist/cli/main-m1kk6fp5.js +0 -21
  353. package/dist/cli/main-mv40pcr2.js +0 -4
  354. package/dist/cli/main-n0t3973w.js +0 -3
  355. package/dist/cli/main-nqveez48.js +0 -4
  356. package/dist/cli/main-pknhvrmj.js +0 -3
  357. package/dist/cli/main-pn1w7a7j.js +0 -3
  358. package/dist/cli/main-prxxs70n.js +0 -4
  359. package/dist/cli/main-q3vsesf9.js +0 -3
  360. package/dist/cli/main-qsevpgsv.js +0 -3
  361. package/dist/cli/main-rdgdw24b.js +0 -25
  362. package/dist/cli/main-rfth4tbm.js +0 -16
  363. package/dist/cli/main-rg0wn0xf.js +0 -5
  364. package/dist/cli/main-sdmxhtv8.js +0 -4
  365. package/dist/cli/main-skbp13js.js +0 -18
  366. package/dist/cli/main-t4xnd213.js +0 -7
  367. package/dist/cli/main-vqak588n.js +0 -4
  368. package/dist/cli/main-w2n1303f.js +0 -9
  369. package/dist/cli/main-wbrdspr2.js +0 -5
  370. package/dist/cli/main-wsrg79c1.js +0 -7
  371. package/dist/cli/main-x4r0fne4.js +0 -5
  372. package/dist/cli/main-xea2f3tn.js +0 -6
  373. package/dist/cli/main-xg704a3c.js +0 -3
  374. package/dist/cli/main-xvnrabfp.js +0 -16
  375. package/dist/cli/main-xy53xf0r.js +0 -4
  376. package/dist/cli/main-y1fqy60y.js +0 -3
  377. package/dist/cli/main-yn8cd281.js +0 -34
  378. package/dist/cli/main-yr0ksc0h.js +0 -4
  379. package/dist/cli/main-z2ex2vyf.js +0 -4
  380. package/dist/cli/main-z3aayzvq.js +0 -3
  381. package/dist/cli/main-zaqh35jg.js +0 -3
  382. package/dist/cli/main-zc2e8e46.js +0 -4
  383. package/dist/cli/main-zzrfw6cf.js +0 -13
  384. package/dist/cli/main.js +0 -280
  385. package/dist/cli/market-cmd-e14kmx9n.js +0 -5
  386. package/dist/cli/mcp-login-wq7ktdek.js +0 -2
  387. package/dist/cli/mcp-market-cmd-9mg3jecy.js +0 -2
  388. package/dist/cli/notify-b7qc0cjb.js +0 -2
  389. package/dist/cli/oauth-z8whcgfx.js +0 -2
  390. package/dist/cli/output-b3ewj3ps.js +0 -16
  391. package/dist/cli/profiles-6mr5he5e.js +0 -2
  392. package/dist/cli/provider-config-g7j42q8x.js +0 -2
  393. package/dist/cli/provider-jr1y8vvm.js +0 -2
  394. package/dist/cli/registry-s8yk86g0.js +0 -2
  395. package/dist/cli/registry-t6p8d4mn.js +0 -2
  396. package/dist/cli/repl-bajwe1mh.js +0 -11
  397. package/dist/cli/resume-rwn9nz7y.js +0 -2
  398. package/dist/cli/run-flags-nah7ndpt.js +0 -2
  399. package/dist/cli/runtime-n7gafzhb.js +0 -2
  400. package/dist/cli/sandbox-config-emdy18x4.js +0 -2
  401. package/dist/cli/server-b0nvs2bn.js +0 -5
  402. package/dist/cli/session-arg-y75wd4kj.js +0 -2
  403. package/dist/cli/session-j62evmjq.js +0 -2
  404. package/dist/cli/sessions-cmd-tsnwz0ns.js +0 -7
  405. package/dist/cli/settings-df10wfez.js +0 -2
  406. package/dist/cli/setup-jzvv72fg.js +0 -2
  407. package/dist/cli/sextant-smoke-37m81ke6.js +0 -5
  408. package/dist/cli/skills-cmd-gjxnxnhx.js +0 -2
  409. package/dist/cli/smoke-p7748apt.js +0 -8
  410. package/dist/cli/start-chat-s4st3mm0.js +0 -12
  411. package/dist/cli/stream-gmeyewds.js +0 -2
  412. package/dist/cli/task-gh0kkp3n.js +0 -2
  413. package/dist/cli/tasks-z1kfpe8e.js +0 -2
  414. package/dist/cli/thinking-0eqkrz6t.js +0 -2
  415. package/dist/cli/todo-5brcrt9m.js +0 -2
  416. package/dist/cli/tools-7pzm0vj9.js +0 -2
  417. package/dist/cli/tools-s635p6s8.js +0 -2
  418. package/dist/cli/trust-cmd-cjav8zgm.js +0 -2
  419. package/dist/cli/update-check-pt31bm2f.js +0 -2
  420. package/dist/cli/update-cmd-tk131s9t.js +0 -2
  421. package/dist/cli/voice-56nabd8d.js +0 -2
  422. package/dist/cli/webfetch-xd8q596m.js +0 -2
  423. package/dist/cli/websearch-5hkf98k1.js +0 -2
  424. package/dist/cli/workflow-cmd-cy3cvzjp.js +0 -4
  425. package/dist/cli/workspace-q10g5z3e.js +0 -2
  426. package/dist/lib/index.js +0 -62
  427. package/dist/lib/models-index.json +0 -1
  428. package/dist/lib/plugins.js +0 -55
  429. package/dist/lib/providers.js +0 -17
  430. package/dist/lib/public-api.js +0 -20
  431. package/dist/lib/sdk.js +0 -360
  432. /package/{dist/cli → src/providers}/models-index.json +0 -0
package/dist/cli/main.js DELETED
@@ -1,280 +0,0 @@
1
- #!/usr/bin/env bun
2
- // @bun
3
- import{Sh as e}from"./main-z3aayzvq.js";import{Th as Yq,Uh as k}from"./main-0z1w2zsg.js";import{Xh as t}from"./main-k1eqkg83.js";import{dk as d,ek as f,uk as Jq}from"./main-8kjxbpw4.js";import{om as w,pm as Qq}from"./main-n0t3973w.js";import{xn as q}from"./main-qsevpgsv.js";Qq();Jq();var u=`rovecode \u2014 a coding agent in your terminal
4
-
5
- start here
6
- rovecode open the cockpit (--classic: the plain chat \xB7 --plain: a bare REPL)
7
- rovecode "fix the failing test" one task, then exit
8
- rovecode connect connect a model: pick a provider, paste the key (hidden), one test call
9
- rovecode connect <id> [<url>] the same in one line \u2014 rovecode connect anthropic \xB7 rovecode connect me https://host/v1
10
-
11
- everyday
12
- rovecode run "<prompt>" --yolo one task in ${f} mode
13
- rovecode run "<prompt>" --output json machine-readable result (ndjson: one line per event)
14
- rovecode model pick the default from a menu \xB7 model use <provider/model> sets it (--project pins it here)
15
- rovecode market search <q> MCP servers, skills and plugins on one shelf; install any with market install <id>
16
- --effort auto|off|low|medium|high how hard I think before answering (/effort in the TUI, ROVECODE_EFFORT=\u2026)
17
- rovecode provider list|add|remove|test endpoints in ~/.rovecode/providers.json \u2014 live, no restart
18
- rovecode auth set <id> \xB7 auth login <id> store an API key (hidden) \xB7 sign in (github-copilot, openrouter, openai) \xB7 list \xB7 remove
19
- rovecode doctor \xB7 --resume <id> what is wrong with my setup, in one pass \xB7 reopen a session (export <id> \u2192 markdown)
20
-
21
- safety
22
- ${d} (default) I read freely; I ask before every write, shell command and subagent
23
- accept edits (--accept-edits) I write inside this folder without asking; shell, subagents,
24
- network and writes OUTSIDE it still ask (/accept-edits, ROVECODE_ACCEPT_EDITS=1)
25
- auto (--yolo, ROVECODE_YOLO=1) I never ask \u2014 deny rules and plan mode still hold
26
- /yolo --save \xB7 /accept-edits --save make the level stick (add --project to pin it to this repo);
27
- without --save a toggle lasts one session. ROVECODE_PERMISSION=ask|accept-edits|auto
28
- plan mode (/plan in the TUI) read-only: I can look and plan, not change anything
29
-
30
- more
31
- rovecode help env every ROVECODE_* setting (incl. the bash sandbox rungs)
32
- rovecode help advanced market \xB7 context \xB7 mcp \xB7 plugins \xB7 acp \xB7 serve \xB7 gauntlet \xB7 bench \xB7 trace \xB7 tools
33
- rovecode help all everything on one page`,p=`advanced \u2014 the full command reference
34
- rovecode interactive TUI chat \u2014 the full cockpit (files \xB7 code \xB7 messages \xB7 plan \xB7 usage \xB7 pet)
35
- on a colour TTY of at least 100x30 (truecolor, or 256 colours through the
36
- quantizer), else the classic chat;
37
- --classic forces the classic chat \xB7 --pet <name> names the pet \xB7 --plain = readline REPL
38
- --no-intro (or ROVECODE_INTRO=0) skips the ~0.9s opening animation
39
- rovecode chat \xB7 rovecode repl the same as bare rovecode (repl still needs --plain for the readline REPL)
40
- rovecode --help | -h this help (only with no command in front of it) \xB7 rovecode --version prints the
41
- version to stdout and the update check\u2019s answer to stderr
42
- rovecode --resume <id> open the TUI resuming a session (full id or unique prefix); an unknown, ambiguous or
43
- malformed id is refused with the reason (exit 2) \u2014 never a new session under that name
44
- rovecode --continue reopen the newest session that holds something (also: --resume with no id);
45
- nothing to continue from \u2192 a fresh session, and the startup card says so
46
- rovecode "prompt" one-shot task (same as run; a lone path-shaped word \u2014 ./x, x.ts, an existing
47
- name \u2014 is confirmed on a TTY and refused with exit 2 off one: use "rovecode run" to send it)
48
- rovecode setup connect a model step by step (TTY only; piped stdin prints the recipe and exits 2)
49
- TUI: /agents list the subagent definitions loaded from .rovecode/agents/*.md (the bare /agents
50
- is the crew board) \xB7 /config [all] the settings this session loaded
51
- rovecode connect the same wizard when given no arguments
52
- rovecode connect <id> [<baseUrl>] [--model <id>] [--key | --key-stdin | --key-env NAME | --no-key]
53
- [--protocol openai|anthropic] [--project] [--no-test]
54
- one line: register the endpoint, store the key, pick the model, one tiny real
55
- call, persist the default. A key is never a flag value (shell history, ps):
56
- --key prompts hidden, --key-stdin reads one piped line (CI), --key-env names
57
- an env var, --no-key marks a local server.
58
- exit 0 connected \xB7 1 the test call failed (config still written) \xB7 2 usage
59
- rovecode smoke-tui render check: full pipeline into an 80x24 terminal emulator (dev-only)
60
- rovecode smoke-tui --sextant render check: the full cockpit at 160x44 through the pipeline (no emulator needed)
61
- rovecode run "<prompt>" run an agent task (--yolo = ${f}; with no provider configured this is a
62
- startup error, exit 2 \u2014 ROVECODE_MOCK=1 asks for the scripted mock on purpose)
63
- "/name args" expands a custom command (.rovecode/commands/<name>.md, else ~/.rovecode/commands)
64
- the way the TUI does; an unknown /name is sent verbatim; model:/mode: frontmatter is
65
- TUI-only and not applied headlessly
66
- piped stdin is appended to the prompt as a fenced block \u2014 git diff | rovecode run "review this"
67
- (never read from a terminal; --no-stdin ignores it; an open pipe that sends nothing
68
- for 3 s is skipped with a note; capped at 1 MB)
69
- --max-turns N \xB7 --max-seconds S|off ceilings on one run; a hit ends it cleanly with status
70
- "budget" (exit 1) and the work so far, instead of an external kill. Headless runs
71
- default to a 20-minute wall clock; --max-seconds off removes it
72
- --max-cost D|off a spend ceiling in dollars for one run, priced from each turn's usage as it lands
73
- (the catalog's rates for the model that served it); the same clean "budget" end.
74
- A turn the catalog cannot price adds nothing and is counted in the summary
75
- --output <text|json|ndjson> text (default): progress + the final answer on stdout
76
- json: exactly ONE result object on stdout {status, summary, sessionId,
77
- model:{provider,model}, origin (served model|null), usage:{input,output,cacheRead,
78
- cacheWrite}, costUsd (null when unpriced), toolCalls:[{tool,ok,ms?}], durationMs, exitCode}
79
- ndjson: one JSON line per RunEvent, then a final {type:"result"} line
80
- json/ndjson: stdout carries only JSON, progress goes to stderr
81
- exit codes: 0 done \xB7 1 error/budget \xB7 2 usage/startup error \xB7 130 aborted (Ctrl-C)
82
- exit 2 = usage/startup error (bad --output value, sandbox misconfig or unavailable rung):
83
- one stderr line, nothing on stdout; --output=<mode> is accepted as well
84
- rovecode bench run cross-harness micro-benchmarks (edits, sessions)
85
- rovecode gauntlet run the adversarial evaluation suite (offline, scripted model)
86
- rovecode gauntlet --live the gauntlet's tasks minus loop-guard (9) against the configured REAL model through
87
- the real prompt \u2014 --model <provider/model> and --effort pick; compare pass/calls/tokens
88
- rovecode tools list registered tools
89
- rovecode plugin list plugins in ~/.rovecode/plugins and .rovecode/plugins with status (active \xB7 disabled \xB7 untrusted \xB7 broken)
90
- rovecode plugin add <folder|git-url> [--project] [--force] install a plugin folder (tools, hooks, commands, skills, MCP in one manifest)
91
- rovecode plugin trust <name> approve a PROJECT plugin's current files on this machine (show <name> lists them first)
92
- rovecode plugin remove|enable|disable|untrust|show <name> (docs/plugins.md; restart to load \u2014 read once per process, like hooks)
93
- rovecode mcp search [query] MCP servers to install: the curated shelf, then the official registry (cached a day)
94
- rovecode mcp info <name> publisher, version, the exact command or URL, the keys it asks for
95
- rovecode mcp add <name> [--project] [--pick N] [--as <name>] [--yes] [--force] show the plan, ask for keys
96
- masked, write ~/.rovecode/mcp.json (or .rovecode/mcp.json); --as renames it, --force replaces an entry
97
- rovecode mcp remove <name> [--project] \xB7 rovecode mcp list (docs/mcp-market.md; /mcp does the same inside the TUI)
98
- rovecode mcp show this repo's .rovecode/mcp.json + .mcp.json: exact commands/URLs, env names, trusted or not
99
- rovecode mcp trust [--yes] \xB7 rovecode mcp untrust approve those files as they are now, or withdraw that
100
- approval \u2014 until trusted nothing in them loads; your own add --project is trusted as you approve it
101
- rovecode trust show every project file that could make rovecode RUN or IMPORT something, with what it would do:
102
- .rovecode/settings.json (verify, lsp, notify_command), hooks.ts, sandbox.json, mcp.json, .mcp.json
103
- rovecode trust [--yes] \xB7 rovecode trust untrust approve them as they are now (one store with mcp trust: path \u2192 sha256,
104
- an edit asks again) \u2014 until trusted a cloned repo's files contribute NOTHING; the user files never ask
105
- rovecode skills list [--json] every installed skill, its scope and path \u2014 and every SKILL.md the loader
106
- refused or warned about, which is the only place those warnings are visible
107
- rovecode skills validate <dir> the agentskills.io spec check, strictly: findings on stderr, exit 1, nothing written
108
- rovecode skills pack <dir> [--out <file>] [--force] a <name>.tar.gz of one skill (a symlink inside refuses the pack)
109
- rovecode skills install <dir|file.tar.gz|http(s)-url> [--user] [--force] staged, validated, then renamed into
110
- place; a URL goes through the same SSRF guard as web_fetch, on the URL AND every redirect hop
111
- rovecode market search [query] [--kind mcp|skill|plugin] one shelf over MCP servers, skills and plugins
112
- rovecode market info <id> publisher, licence, version, exactly what an install would write
113
- rovecode market docs <id> the item's own documentation, as the catalog carries it \u2014 no network
114
- rovecode market install <id|kind:id|git-url|npm-pkg> [--project] [--ref <branch|tag|commit>] [--yes]
115
- plan first, write only after you agree
116
- rovecode market list|remove|update|sources what is installed, what is behind, where each shelf came from
117
- rovecode market verify [id] re-hash what is installed and say what has changed since
118
- rovecode market validate <path|url> [--kind skill|plugin] check a catalog before anyone trusts it
119
- (docs/market.md; /market does the same inside the TUI; every subcommand takes --json)
120
- rovecode doctor [--json] [--no-connect] one pass over the setup: home (and a legacy ~/.cumulus), the default
121
- provider and where its key comes from (names, never values), the permission level and
122
- which rung set it, git/node/npm/npx/uvx on PATH with what each absence costs HERE,
123
- every configured MCP server (loads? skipped for a placeholder or an unset variable?
124
- untrusted file? connects?), the shadow checkpoints' size \u2014 and a list of what it did
125
- NOT check. exit 0 nothing broken \xB7 1 something to fix \xB7 a missing provider is a note
126
- rovecode context [session] [--json] what fills the window, item by item, and how far our estimate is from
127
- the provider's own count of the same prompt (cache reads included \u2014 they are the prompt too)
128
- (--exact asks Anthropic to count it for real; --no-runtime skips the system prompt and tool schemas)
129
- rovecode auth set <provider> [--key <name>] store an API key (prompts on stdin; ~/.rovecode/credentials.json)
130
- rovecode auth login <provider> OAuth sign-in, stored next to the keys: github-copilot (GitHub device code \u2014 open the URL,
131
- type the code) \xB7 openrouter (PKCE in your browser, back to a loopback port on this machine) \xB7
132
- openai (ChatGPT device code; the token is sent over the Codex Responses wire only \u2014 see
133
- ROVECODE_OPENAI_WIRE). anthropic is refused (the Claude subscription login is an owner
134
- decision, not a port). Ctrl-C cancels (exit 130)
135
- rovecode auth list stored providers: kind (api | oauth), key name, redacted value, and for oauth the expiry
136
- rovecode auth remove <provider> delete a stored credential (api or oauth)
137
- rovecode provider list [--all] providers with a key + every providers.json entry, and the default provider/model
138
- rovecode provider add <id> <baseUrl> [--protocol openai|anthropic] [--key-env NAME] [--model <id>] [--no-key]
139
- [--project | --user | --scope user|project] [--key]
140
- register any OpenAI-compatible or Anthropic endpoint in ~/.rovecode/providers.json
141
- (--project: ./.rovecode/providers.json); --key prompts for the secret (never echoed);
142
- running TUIs/servers pick the change up live \u2014 no restart
143
- rovecode provider remove <id> delete a providers.json entry (built-ins: rovecode auth remove <id> drops the key)
144
- rovecode provider test <id> [model] one tiny real call \u2014 proves url + key + model together
145
- rovecode model list [provider] model ids (providers.json "models" or the endpoint's /models); * = current default
146
- rovecode models [provider] alias for model list
147
- rovecode model no arguments on a terminal: every configured provider's models in one
148
- numbered menu, the current one first; a pipe gets the usage line instead
149
- rovecode model use <provider/model> [--project] persist the default (in the TUI: /model <provider/model> --save)
150
- rovecode model show [provider/model] the model, its protocol, and the exact thinking field each /effort
151
- level puts on the wire (docs/thinking.md)
152
- rovecode sessions [--json] this folder's sessions, newest first: id \xB7 created \xB7 turns \xB7 first prompt (or the title);
153
- reads only the sessions that hold something, and a footer counts the empty session
154
- directories (a meta.json, nothing ever written) so they stay visible without being rows
155
- rovecode sessions rename <id|prefix> <title\u2026> name a session (one line, \u2264 120 chars; shown in place of the first prompt)
156
- rovecode sessions delete <id|prefix> [--yes] remove the session AND its checkpoints shadow dir; asks y/N on a
157
- terminal, needs --yes off one; prints every path it removed
158
- rovecode sessions fork <id|prefix> [--json] copy a session (entries, meta, attachments; up to 256 MB of attachments)
159
- into a new id titled "\u2026 (fork #N)" \u2014 the source is untouched
160
- rovecode sessions search <terms\u2026> [--json] title hits first, then the recall index (all terms, exact before partial)
161
- every id here is exact or a unique prefix: ambiguous or unknown \u2192 exit 2 naming the
162
- candidates, nothing created or removed
163
- rovecode trace <id|prefix> the session's messages, one line each (role \xB7 first 120 chars \xB7 tool-call count)
164
- rovecode export <session> write a session as markdown (--json: raw JSONL copy; --out <path>; --force)
165
- rovecode workflow run <file> run a defineWorkflow DAG (agent+gate steps, retry, budget, --resume <runId>) \xB7 workflow list
166
- rovecode eval alias for gauntlet
167
- rovecode acp Agent Client Protocol v1 endpoint over stdio (Zed/JetBrains)
168
- rovecode serve headless HTTP server (ROVECODE_PORT, default 4100; loopback-only)`,n=`env \u2014 every ROVECODE_* setting
169
- ROVECODE_BASE_URL any OpenAI-compatible or Anthropic endpoint
170
- ROVECODE_API_KEY API key (falls back to OPENAI_API_KEY)
171
- ROVECODE_MODEL model id (e.g. zai-org/glm-5.3)
172
- ROVECODE_MODEL_<ROLE> role fallback chain, comma-separated provider/model list; on 429/5xx
173
- the next candidate serves. Roles: DEFAULT SMOL PLAN COMMIT TASK
174
- (e.g. ROVECODE_MODEL_DEFAULT=kaesra/zai-org/glm-5.3-flash,openai/gpt-4o-mini)
175
- ROVECODE_STREAM streaming is on by default (both protocols); off|json|0|false|none use the one-shot JSON
176
- adapters; sse forces the raw SSE adapter, without the tool-call middleware, for one-shot runs
177
- ROVECODE_OPENAI_WIRE responses | chat \u2014 which OpenAI wire a request takes. Unset: a stored ChatGPT login
178
- (auth login openai) always takes /responses; provider openai takes /responses for models the
179
- catalog does not mark non-reasoning (gpt-5, o3, ids it does not know) and /chat/completions
180
- for the gpt-4o class; every other provider stays on /chat/completions. Not done yet on
181
- /responses: the model's own reasoning items are NOT sent back to it on the next turn (each
182
- turn reasons afresh; reasoning text still streams live) \u2014 that needs a reasoning part in
183
- the message store, a change across the session store, export and both other wires
184
- ROVECODE_EFFORT auto|off|low|medium|high thinking before the answer (default auto: the provider's
185
- own default stands). Anthropic gets output_config.effort or a thinking budget,
186
- whichever the model takes (learned from its own 400, then remembered); OpenAI gets
187
- reasoning_effort. Thinking is billed as output and delays the first word.
188
- ROVECODE_PROFILE model profile: off, or an id (glm-5.3 | glm-5.3-plain) whose PROMPT section is forced onto
189
- every model (request fields always follow the model id). Unset = by model id: GLM-5.3 / -Flash
190
- get the Claude Sonnet 5 persona + the working agreement appended to the system prompt
191
- (glm-5.3-plain = agreement only) plus, on OpenAI-compatible providers, Z.ai's
192
- request fields (thinking always on, reasoning_effort low|high|max \u2014 off leaves the endpoint's
193
- max, medium rounds up to high, high means max \u2014 and tool_stream when streaming). The text
194
- comes from .rovecode/profiles/<id>.md (project) or ~/.rovecode/profiles/<id>.md when present.
195
- ROVECODE_DESIGN off drops the interface-design section from the system prompt (for runs with no UI in
196
- them). Otherwise every run carries it: propose three distinct directions before the first
197
- UI in a project, let the human choose, record it with design_direction, then build to it.
198
- The section prescribes NO palette, typeface or layout -- there is no default look, on
199
- purpose -- and names the patterns to climb out of (amber accents, the reflex full-viewport
200
- hero, Inter/Roboto/Poppins, hairlines round everything, all-square corners, everything
201
- centred, violet gradients). The choice lives in .rovecode/design.json; design_audit counts
202
- those patterns in the files you touched and checks them against it.
203
- ROVECODE_PERMISSION ask|accept-edits|auto \u2014 the level this run starts at. Ladder, widest first:
204
- a CLI flag, then this, then <cwd>/.rovecode/settings.json, then ~/.rovecode/settings.json,
205
- then "ask". Write the files with /yolo --save or /accept-edits --save [--project].
206
- ROVECODE_ACCEPT_EDITS=1 start in accept-edits (writes inside the workspace do not ask)
207
- ROVECODE_YOLO=1 ${f}: allow all tool actions
208
- ROVECODE_TUI cockpit | classic \u2014 force the TUI surface (the cockpit still needs a TTY; --classic wins)
209
- ROVECODE_THEME cockpit palette: night (default) | ember | contrast (/theme switches it live)
210
- ROVECODE_PET=0 hide the pet panel (rovecode); --pet <name> renames it
211
- ROVECODE_NOTIFY off | auto | bell | osc9 | osc777 \u2014 how the TUI tells you a run ended or a card needs you, ONLY while
212
- the terminal is unfocused (auto = an OSC 9 toast on Ghostty/iTerm2/kitty/Warp/WezTerm, else the bell;
213
- settings.json "bell": false is off; a terminal that never reports focus stays silent)
214
- ROVECODE_NOTIFY_WHEN unfocused (default; the terminal must report focus \u2014 Windows Terminal \u2265 1.14, Ghostty, kitty, WezTerm,
215
- iTerm2, xterm, VTE) | always (every run, as before 2026-09-07)
216
- ROVECODE_NOTIFY_COMMAND a desktop hook under the same gate: argv as a JSON string array (["notify-send","rovecode"]) or
217
- whitespace-split words, the JSON payload appended as its last argument; never a shell. From a project
218
- settings.json it applies only once that file is trusted; the user file and this variable always may
219
- ROVECODE_SANDBOX executor rung for bash: direct (default) | wsl | docker; beats .rovecode/sandbox.json {"rung","dockerImage"}
220
- ROVECODE_SANDBOX_IMAGE image for the docker rung (default debian:stable-slim; must contain bash)
221
- ROVECODE_RETRY_MAX same-model retries after a 429/5xx/transport failure (default 3 = 4 attempts; 0 = off)
222
- The wait is announced live, while it is happening, not in a summary after the run
223
- ROVECODE_RETRY_BASE_MS cap of the FIRST backoff, ms (default 1000; full jitter; a Retry-After hint is a floor)
224
- It doubles per attempt up to 20 s, and a server hint can raise the wait, never shorten it
225
- ROVECODE_FIRST_BYTE_TIMEOUT_MS how long a provider may go without ANY response before the request
226
- counts as failed and is retried (default 60000). Only the FIRST byte is on this clock:
227
- once the model is talking, the body may take as long as it takes
228
- ROVECODE_WEBFETCH_TIMEOUT_MS web_fetch request timeout in ms (default 30000)
229
- EXA_API_KEY optional Exa key for web_search; without it the search runs keyless against the
230
- same hosted endpoint. Read only where the tool is registered, never stored, and
231
- stripped from every URL and error line the tool prints
232
- ROVECODE_WEBFETCH_ALLOW_PRIVATE=1 let web_fetch reach loopback/private hosts (SSRF guard escape for local dev)
233
- ROVECODE_COMPACTION history compaction strategy: head-summarize (default) | keep-window | provider-native
234
- /compact runs the same set on demand (TUI + --plain); on this build it keeps
235
- the window and notes "no summarizer wired on this surface" \u2014 a manual compaction
236
- is durable (new session branch, marker persisted) even when it falls back
237
- ROVECODE_TASKS_MAX concurrent background tasks (default 3; further task starts queue FIFO)
238
- ROVECODE_OTEL_ENDPOINT OTLP/HTTP collector, e.g. http://host:4318 \u2014 one trace per run (run \u2283 turn \u2283 tool); unset = off
239
- ROVECODE_OTEL_HEADERS extra OTLP headers as k=v,k2=v2 (e.g. authorization=Bearer \u2026)
240
- ROVECODE_REFLECTION=0 disable reflection nudges after failed edits; ROVECODE_REFLECTION_MAX caps them per run (default 2)
241
- ROVECODE_PORT port for rovecode serve (default 4100; loopback-only)
242
- ROVECODE_IMAGE_MAX_BYTES per-image cap in bytes for pasted and attached images (default 5 MB;
243
- at most 8 images per message). Over it, the image is refused by name, not silently dropped.
244
- ROVECODE_REPOMAP_TOKENS repo-map budget in tokens (default 1024); ROVECODE_NO_REPOMAP=1 drops the map entirely
245
- ROVECODE_HOOK_TIMEOUT_MS per-hook-call budget in ms (default 5000); ROVECODE_NO_HOOKS=1 skips hook files
246
- ROVECODE_PLUGIN_TIMEOUT_MS per-plugin import + tools() budget in ms (default 5000);
247
- ROVECODE_NO_PLUGINS=1 skips plugin discovery
248
- ROVECODE_NO_CHECKPOINTS=1 turn off the shadow-git checkpoints taken after mutating tools
249
- ROVECODE_TOOL_MIDDLEWARE=1 force the text tool-call protocol (a prompt block + a parser) even for a model
250
- the catalog says has native tool calling; ROVECODE_NO_TOOL_MIDDLEWARE=1 forces native only
251
- ROVECODE_EVAL_CELL=1 register the persistent eval cell tool (a REPL that keeps state between calls)
252
- ROVECODE_MAX_TURNS turn ceiling for one run, every surface (TUI included); a hit ends it with status
253
- "budget" and exit 1
254
- ROVECODE_MAX_SECONDS the same as a wall clock, or "off". Every surface honours it, but only
255
- one-shot runs have a DEFAULT (1200 s) \u2014 the TUI has no clock unless this sets one
256
- ROVECODE_MAX_COST the same in dollars for one run (--max-cost on a one-shot run), or "off"; no default
257
- ROVECODE_FINISH_CHECK=0 turn off the once-per-run finish check: when the model stops right after a failed tool
258
- call or an unanswered question, it is asked ONCE to finish or say what is left; the next
259
- reply ends the run either way. "done \xB7 \u2026" on run_end still names what was left
260
- ROVECODE_VERIFY=1 turn ON the verify gate (off by default): a run that wrote files runs the project's configured
261
- check before "done"; a failure goes back to the model once, then "done \xB7 check failed (\u2026)" says
262
- so. No check configured \u2192 nothing runs, run_end says "not verified". ROVECODE_VERIFY_TIMEOUT=<s> (120)
263
- ROVECODE_LSP the language-server table behind the per-edit diagnostics gate: "ext[,ext]=argv;\u2026" merged over
264
- the built-in ".ts,.tsx,.mts,.cts,.js,.jsx,.mjs,.cjs=typescript-language-server --stdio"; "ext=off"
265
- drops one, "off" drops all; overrides the settings key lsp. A server not on PATH is named at boot
266
- ROVECODE_HOME credentials + user-scope providers/commands dir (default ~/.rovecode)
267
- providers: built in \u2014 kaesra openai anthropic deepseek groq openrouter ollama lmstudio
268
- together mistral cerebras fireworks perplexity xai moondream vllm
269
- plus anything in ~/.rovecode/providers.json or ./.rovecode/providers.json (rovecode provider add)
270
- key: rovecode auth set <id>, or set <ID>_API_KEY \u2014 stored creds beat env;
271
- default: providers.json "default" ("provider/model"), ROVECODE_MODEL overrides the model,
272
- ROVECODE_BASE_URL/ROVECODE_API_KEY always wins`;function a(Q=""){switch(Q){case"":return u;case"env":return n;case"advanced":return p;case"all":return`${u}
273
-
274
- ${p}
275
-
276
- ${n}`;default:return`${u}
277
-
278
- no help topic "${Q}" \u2014 topics: env \xB7 advanced \xB7 all`}}Yq();import{join as v}from"path";if(process.env.ROVECODE_TRACE_BOOT==="1")process.env._ROVECODE_BOOT_T0=String(Date.now());var C=t(process.argv),S=C.cmd;if(process.argv.includes("--version")){console.log(k.version);let{checkForUpdate:Q,updateLine:z}=await import("./update-check-pt31bm2f.js"),Z=z(await Q(k.version,{cacheOnly:!0}),!0);if(Z!==null)console.error(Z);process.exit(0)}async function Zq(){let{resolveProvider:Q,providerStream:z,providerStreaming:Z,wantsStreaming:V}=await import("./stream-gmeyewds.js"),{mockStream:B,textTurn:F}=await import("./stream-gmeyewds.js"),{MOCK_PROVIDER_TEXT:W}=await import("./voice-56nabd8d.js"),X=Q();if(X)return{stream:V({ROVECODE_STREAM:process.env.ROVECODE_STREAM})?Z(X):z(X),model:{provider:X.id,model:process.env.ROVECODE_MODEL??X.defaultModel??"gpt-4o-mini"},real:!0,providerId:X.id};return{stream:B({turns:[F(W)]}),model:{provider:"mock",model:"default"},real:!1,providerId:"mock"}}async function $q(){let{providerPreflight:Q}=await import("./gauntlet-07xrjpj7.js"),{stream:z,model:Z}=await Zq();try{await Q(z,Z)}catch(V){let B=V instanceof Error?V.message:String(V);console.error(`error: ${B}`),console.error(`hint: check ROVECODE_BASE_URL (${process.env.ROVECODE_BASE_URL??"not set"}) and ROVECODE_API_KEY; aborting before running tasks.`),process.exit(2)}}async function i(Q){let{agentLoop:z}=await import("./loop-mmpfft01.js"),{bootRuntime:Z}=await import("./runtime-n7gafzhb.js"),{SandboxConfigError:V}=await import("./sandbox-config-emdy18x4.js"),{WorkspaceRootError:B}=await import("./workspace-q10g5z3e.js"),{parseAddDirs:F}=await import("./run-flags-nah7ndpt.js"),{mockStream:W,textTurn:X,resolveProvider:K,providerStreaming:j}=await import("./stream-gmeyewds.js"),{MOCK_PROVIDER_TEXT:Y}=await import("./voice-56nabd8d.js"),{summarizePlugins:J}=await import("./index-1sgjm25y.js"),{resolvePermission:G}=await import("./settings-df10wfez.js"),{buildRunDeps:$,createOutputSink:N,guardStdout:I,parseOutputMode:U,runPromptWords:R}=await import("./output-b3ewj3ps.js"),{expandSlashPrompt:O}=await import("./commands-exafvm2b.js"),{resetTurnFailureCount:b}=await import("./tools-7pzm0vj9.js"),E=U(process.argv),L=e(process.argv,process.env,{defaultSeconds:1200});if("error"in L)console.error(`error: ${L.error}`),process.exit(2);let x=F(process.argv),P={write:process.stdout.write.bind(process.stdout)};if(E!=="text")I(process.stderr);let M=process.argv.includes("--yolo")||process.env.ROVECODE_YOLO==="1",y=K(),T=y&&process.env.ROVECODE_STREAM==="sse"?j(y):void 0,H=await Z({...T?{stream:T}:{},...x.length>0?{addDirs:x}:{}}).catch((_)=>{if(_ instanceof V||_ instanceof B)console.error(`error: ${_.message}`),process.exit(2);throw _}),A=process.env.ROVECODE_MOCK==="1",g=H.provider&&!A?{provider:H.provider.id,model:process.env.ROVECODE_MODEL??H.provider.defaultModel??"gpt-4o-mini"}:{provider:"mock",model:"default"},r=!A&&H.stream!==null&&H.noProviderReason()===null?H.stream:W({turns:[X(Y)]});H.hooks.onWarning((_)=>console.error(`hooks: ${_}`)),H.plugins.onWarning((_)=>console.error(_));let l=J(H.plugins.found);if(l!==null)console.error(l);H.onRouterNote((_)=>console.error(_));let m=async(_)=>{return H.tasks.cancelAll(),await H.tasks.drain(2000),H.bashJobs.dispose(),await H.hooks.close(),await H.mcp?.close().catch(()=>{}),process.exit(_)},h=N(E,{stdout:E==="text"?process.stdout:P,stderr:process.stderr,model:g,messages:()=>H.store.messages()});if(H.noProviderReason()!==null&&!A){let _=H.noProviderReason();if(E==="text")console.error(`error: ${_}`);else P.write(`${JSON.stringify({status:"error",summary:_,error:_,exitCode:2})}
279
- `);await m(2)}let c=w(process.argv[process.argv.indexOf("--effort")+1]);if(c!==void 0)H.setEffort(c);H.setRunLimits(L);let qq=G(H.cwd,M?"auto":process.argv.includes("--accept-edits")?"accept-edits":void 0,{ROVECODE_PERMISSION:process.env.ROVECODE_PERMISSION,ROVECODE_YOLO:process.env.ROVECODE_YOLO,ROVECODE_ACCEPT_EDITS:process.env.ROVECODE_ACCEPT_EDITS});for await(let _ of z(H.buildDef(g),Q,{},H.buildCfg(qq),$(H,r,h),H.steering)){if(_.type==="turn_start")b();if(h.onEvent(_),_.type==="run_end")await m(h.finish(_))}await m(h.finish())}async function zq(){if(process.argv.includes("--live"))return Bq();await $q();let{runGauntlet:Q,reportResults:z,basicTasks:Z,codingTasks:V,failureTasks:B,adversarialTasks:F}=await import("./gauntlet-07xrjpj7.js"),{wave3Tasks:W}=await import("./gauntlet-wave3-jm91yt5w.js"),{wave4Tasks:X}=await import("./gauntlet-wave4-r13py7p1.js"),{runTask:K}=await import("./gauntlet-runner-xvy64436.js"),j=[...Z(),...V(),...B(),...F(),...W(),...X()],Y=await Q({tasks:j,runner:(J,G)=>K(J,G)});console.log(z(Y)),process.exit(Y.some((J)=>!J.pass)?1:0)}async function Bq(){let{bootRuntime:Q}=await import("./runtime-n7gafzhb.js"),{SandboxConfigError:z}=await import("./sandbox-config-emdy18x4.js"),{runGauntlet:Z,reportResults:V,providerPreflight:B}=await import("./gauntlet-07xrjpj7.js"),{liveGauntletTasks:F,runTaskLive:W}=await import("./gauntlet-runner-xvy64436.js"),{profileFor:X,profileHint:K}=await import("./profiles-6mr5he5e.js"),{ProviderRegistry:j}=await import("./registry-s8yk86g0.js"),{rmSync:Y}=await import("fs"),J=await Q().catch((M)=>{if(M instanceof z)console.error(`error: ${M.message}`),process.exit(2);throw M}),G=async(M)=>{if(J.bashJobs.dispose(),await J.hooks.close(),await J.mcp?.close().catch(()=>{}),J.store.messages().length===0)Y(v(J.cwd,".rovecode","sessions",J.sessionId),{recursive:!0,force:!0});return process.exit(M)},$=J.noProviderReason();if($!==null||J.stream===null||J.provider===null)console.error(`error: ${$??"no provider configured"}`),await G(2);let{provider:N,stream:I}=J,U=process.argv.indexOf("--model"),R=U>=0?process.argv[U+1]:void 0,O=R?J.providers.resolveSelector(R,N.id):{provider:N.id,model:J.defaultModel||N.defaultModel||""};if("error"in O)console.error(`error: ${O.error}`),await G(2);let b=O;if(!b.model)console.error("error: no model \u2014 pass --model <provider/model> or set a default (rovecode model use \u2026)"),await G(2);let E=w(process.argv[process.argv.indexOf("--effort")+1]);if(E!==void 0)J.setEffort(E);let L=K();if(L)console.error(`note: ${L}`);try{await B(I,b)}catch(M){console.error(`error: ${M instanceof Error?M.message:String(M)}`),await G(2)}let x=F();console.log(`Gauntlet (live): ${b.provider}/${b.model} \xB7 effort ${J.effort} \xB7 profile ${X(b)?.id??"none"} \xB7 ${x.length} tasks`);let P=await Z({tasks:x,runner:(M,y,T)=>W(M,y,J,b,T)});console.log(V(P)),await G(P.some((M)=>!M.pass)?1:0)}async function Xq(){let{runBenchmarks:Q}=await import("./bench-16zqdms5.js"),z=await Q();for(let Z of z)console.log(`${Z.harness.padEnd(8)} ${Z.task.padEnd(28)} ${Z.pass?"PASS":"FAIL"} ${Z.durationMs}ms ${Z.toolCalls} calls`);process.exit(z.some((Z)=>!Z.pass)?1:0)}async function Kq(){let{ToolRegistry:Q}=await import("./tools-s635p6s8.js"),{readTool:z,editTool:Z,writeTool:V,bashTool:B}=await import("./hashline-znvrat11.js"),{globTool:F,grepTool:W,lsTool:X}=await import("./files-g104xghh.js"),{webFetchTool:K}=await import("./webfetch-xd8q596m.js"),{webSearchTool:j}=await import("./websearch-5hkf98k1.js"),{todoTools:Y}=await import("./todo-5brcrt9m.js"),{askUserTool:J}=await import("./ask-user-cwstt8fz.js"),{TaskManager:G}=await import("./tasks-z1kfpe8e.js"),{createTaskTool:$,createTaskStatusTool:N}=await import("./task-gh0kkp3n.js"),{ProviderRegistry:I}=await import("./registry-s8yk86g0.js"),{providerListTool:U,providerEditTool:R}=await import("./provider-jr1y8vvm.js"),{designAuditTool:O,designDirectionTool:b}=await import("./design-ne5zszyh.js"),{loadPlugins:E}=await import("./index-1sgjm25y.js"),L=new Q;L.register(z,Z,V,B,F,W,X),L.register(K,j),L.register(...Y(v(process.cwd(),".rovecode","sessions"))),L.register(J(()=>{return}));let x=new G({deps:()=>null});L.register($(x),N(x));let P=new I(process.cwd());L.register(U(P),R(P)),L.register(O(),b());let{plugins:M,warnings:y}=await E(process.cwd()),T=new Set(L.list().map((H)=>H.schema.name));for(let H of M)for(let A of H.tools){if(T.has(A.schema.name)){y.push(`plugin ${H.name}: tool "${A.schema.name}" is already registered \u2014 refused`);continue}T.add(A.schema.name),L.register(A)}for(let H of y)console.error(`plugins: ${H}`);for(let H of L.list())console.log(`${H.schema.name.padEnd(8)} ${H.kind.padEnd(8)} sequential=${H.sequential!==!1}`),console.log(` ${H.schema.description}`)}function o(Q=""){console.log(a(Q))}async function Wq(Q){let{saveCredential:z,removeCredential:Z,listProviders:V,credentialsPath:B,readSecret:F}=await import("./auth-m8p9grty.js"),{ProviderRegistry:W}=await import("./registry-s8yk86g0.js"),{isConfigured:X}=await import("./provider-config-g7j42q8x.js"),K=Q[0]??"",j=process.argv.indexOf("--key"),Y=j!==-1?process.argv[j+1]:void 0,J=Y!==void 0&&!Y.startsWith("-")?Y:void 0,G=Q.slice(1).filter((I)=>I!==J),$=G[0];if(K==="list"){let I=V();if(process.argv.includes("--json")){console.log(JSON.stringify({path:B(),credentials:I.map((U)=>({provider:U.provider,kind:U.kind,keyName:U.keyName,redacted:U.redacted,...U.expires!==void 0?{expires:U.expires}:{}}))},null,2));return}(await import("./auth-login-9bbp9915.js")).printAuthList();return}if(K==="login"){process.exitCode=await(await import("./auth-login-9bbp9915.js")).cmdAuthLogin(G);return}if(K==="set"&&$!==void 0){let I=new W(process.cwd()),U=I.get($);if(U===void 0)console.error(`error: unknown provider "${$}" \u2014 known: ${I.ids().join(" ")}`),console.error(`hint: register a custom endpoint first: rovecode provider add ${$} <baseUrl>`),process.exit(1);let R=J??U.keyEnv,O=await F(`${R} for ${$}: `);if(O.length===0)console.error("error: empty secret \u2014 nothing stored"),process.exit(1);z($,O,J),console.log(`stored ${R} for ${$} in ${B()}`);return}if(K==="remove"&&$!==void 0){if(!Z($))console.error(`error: no stored credential for ${$}`),process.exit(1);console.log(`removed credential for ${$}`);return}let{AUTH_LOGIN_USAGE:N}=await import("./auth-login-9bbp9915.js");console.error(`usage: rovecode auth set <provider> [--key <name>] | rovecode auth list | rovecode auth remove <provider> | ${N.replace(/^usage: /,"")}`),process.exit(1)}function D(Q){let z=process.argv.indexOf(Q);return z===-1?[]:process.argv.slice(z+1).filter((Z)=>Z!=="--yolo"&&Z!=="--plain"&&Z!=="--classic")}async function jq(Q){let{ProviderRegistry:z,formatProviderList:Z,parseAddArgs:V,ADD_USAGE:B}=await import("./registry-s8yk86g0.js"),{isConfigured:F,providersPathFor:W}=await import("./provider-config-g7j42q8x.js"),{saveCredential:X,credentialsPath:K,readSecret:j}=await import("./auth-m8p9grty.js"),Y=new z(process.cwd()),[J,...G]=Q;if(J===void 0||J==="list"){if(G.includes("--json")){let $=Y.defaultRef(),N=G.includes("--all"),I=Y.list().filter((U)=>N||F(U)||U.scope!=="builtin").map((U)=>({id:U.id,protocol:U.protocol,baseUrl:U.baseUrl,keyEnv:U.keyEnv,defaultModel:U.defaultModel??null,configured:F(U),scope:U.scope??null}));console.log(JSON.stringify({default:$??null,providers:I,warnings:Y.warnings()},null,2));return}console.log(Z(Y,{all:G.includes("--all")}));return}if(J==="add"){let $=V(G);if("error"in $)console.error(`error: ${$.error}`),process.exit(2);let N=Y.add($.spec,$.scope);if("error"in N)console.error(`error: ${N.error}`),process.exit(1);if(console.log(`added ${N.id} (${N.protocol}, ${N.baseUrl}) to ${W($.scope,process.cwd())}`),$.promptKey){let I=await j(`${N.keyEnv} for ${N.id}: `);if(I.length===0)console.error("error: empty secret \u2014 provider kept, no key stored"),process.exit(1);X(N.id,I,N.keyEnv),console.log(`stored ${N.keyEnv} for ${N.id} in ${K()}`)}else if(!F(N))console.log(`no key yet: rovecode auth set ${N.id} (or set ${N.keyEnv}; picked up live, no restart)`);if(Y.refresh()&&Y.defaultRef()?.provider!==N.id)console.log(`make it the default: rovecode model use ${N.id}/${N.defaultModel??"<model>"}`);return}if(J==="remove"&&G[0]!==void 0){let $=Y.remove(G[0]);if("error"in $)console.error(`error: ${$.error}`),process.exit(1);console.log($.removed.length>0?`removed ${G[0]} from the ${$.removed.join(" and ")} providers.json`:`${G[0]} was not in any providers.json`);return}if(J==="test"&&G[0]!==void 0){let $=await Y.probe(G[0],G[1]);console.log(`${G[0]}/${$.model}: ${$.detail}`),process.exit($.ok?0:1)}console.error(`usage: rovecode provider list [--all] | rovecode provider ${B} [--key] | rovecode provider remove <id> | rovecode provider test <id> [model]`),process.exit(2)}async function s(Q){let{ProviderRegistry:z}=await import("./registry-s8yk86g0.js"),{isConfigured:Z,providersPathFor:V}=await import("./provider-config-g7j42q8x.js"),B=new z(process.cwd()),F=Q.filter((K)=>!K.startsWith("-")),[W,X]=F;if(W==="list"){let K=X??B.defaultRef()?.provider;if(K===void 0)console.error("error: no provider configured \u2014 rovecode provider add <id> <baseUrl>"),process.exit(1);let j=await B.models(K);if(!j.ok)console.error(`error: ${j.error}`),process.exit(1);let Y=B.defaultRef();if(Q.includes("--json")){console.log(JSON.stringify({provider:K,models:j.models.map((J)=>({id:J,ref:`${K}/${J}`,default:Y?.provider===K&&Y.model===J}))},null,2));return}if(j.models.length===0)console.log(`${K}: the endpoint listed no models (no /models route?) \u2014 pass one directly: rovecode model use ${K}/<model>`);for(let J of j.models)console.log(`${Y?.provider===K&&Y.model===J?"*":" "} ${K}/${J}`);return}if((W===void 0||W==="use"&&X===void 0)&&process.stdin.isTTY===!0){let K=await Hq(B);if(K===null)return;let j=B.setDefault(K,Q.includes("--project")?"project":"user");if("error"in j)console.error(`error: ${j.error}`),process.exit(1);console.log(`default \u2192 ${j.provider}/${j.model} (${V(Q.includes("--project")?"project":"user",process.cwd())}; running TUIs switch live)`);return}if(W==="use"&&X!==void 0){let K=Q.includes("--project")?"project":"user",j=B.setDefault(X,K);if("error"in j)console.error(`error: ${j.error}`),process.exit(1);console.log(`default \u2192 ${j.provider}/${j.model} (${V(K,process.cwd())}; running TUIs switch live)`);let Y=B.get(j.provider);if(Y!==void 0&&!Z(Y))console.log(B.keyHint(Y));return}if(W==="show"){let{ModelCatalog:K,describePricing:j}=await import("./catalog-1xchffa4.js"),{thinkingReport:Y}=await import("./thinking-0eqkrz6t.js"),J=X!==void 0?B.resolveSelector(X,B.defaultRef()?.provider??""):B.defaultRef();if(J===null)console.error("error: no default model \u2014 rovecode model use <provider/model>"),process.exit(1);if("error"in J)console.error(`error: ${J.error}`),process.exit(1);let G=B.get(J.provider),$=new K().lookup(J.provider,J.model),N={...J,effort:w(process.env.ROVECODE_EFFORT)??"auto",...$?.supportsReasoning!==void 0?{reasoning:$.supportsReasoning}:{}},I=$===void 0?"unpriced \u2014 not in models.dev, not in rovecode's own table (/cost shows tokens only)":$.source==="local"?`priced from rovecode's own table, not models.dev (${$.sourceNote})`:"models.dev";for(let U of Y(N,G?.protocol??"openai",{source:X!==void 0?"as named":"the default",catalog:I}))console.log(U);if($!==void 0)for(let U of j($))console.log(` ${U}`);return}console.error("usage: rovecode model list [provider] | rovecode model use <provider/model> [--project] | rovecode model show [provider/model]"),process.exit(2)}async function Vq(Q){let{ProviderRegistry:z}=await import("./registry-s8yk86g0.js"),{askLine:Z,runSetup:V}=await import("./setup-jzvv72fg.js"),B=new z(process.cwd());if(Q.length===0)return V({registry:B});let{parseConnectArgs:F,runConnect:W}=await import("./connect-6zde0kn3.js"),X=F(Q);if("error"in X)return console.error(`error: ${X.error}`),2;return W(X,{registry:B})}async function Hq(Q){let{isConfigured:z}=await import("./provider-config-g7j42q8x.js"),{askLine:Z}=await import("./setup-jzvv72fg.js"),V=Q.list().filter(z).map((Y)=>Y.id);if(V.length===0)console.error("error: no provider is configured yet \u2014 run: rovecode connect"),process.exit(1);console.log(`fetching models from ${V.length} provider${V.length===1?"":"s"}\u2026`);let B=await Promise.all(V.map(async(Y)=>({id:Y,r:await Q.models(Y)}))),F=Q.defaultRef(),W=[];for(let{id:Y,r:J}of B){if(!J.ok){console.log(` (${Y}: ${J.error})`);continue}for(let G of J.models)W.push(`${Y}/${G}`)}if(W.length===0)console.error("error: no models to choose from"),process.exit(1);let X=F?`${F.provider}/${F.model}`:null;W.sort((Y,J)=>Number(J===X)-Number(Y===X)),W.forEach((Y,J)=>console.log(` ${String(J+1).padStart(2)} ${Y===X?"* ":" "}${Y}`));let K=(await Z(`Which one? [1-${W.length}, empty = cancel]: `)).trim();if(K.length===0)return console.log("cancelled \u2014 nothing changed"),null;let j=Number(K);if(!Number.isInteger(j)||j<1||j>W.length)console.error(`error: "${K}" is not one of 1-${W.length}`),process.exit(2);return W[j-1]}async function Gq(Q){let{SessionStore:z}=await import("./session-j62evmjq.js"),Z=new z(v(process.cwd(),".rovecode","sessions"),Q),V=Z.reload();if(V.length>0)console.error(`warning: ${V.length} corruption(s):`,V);for(let B of Z.messages()){let F=B.parts.filter((X)=>X.kind==="text").map((X)=>X.text).join(""),W=B.parts.filter((X)=>X.kind==="tool_call").length;console.log(`${B.role.padEnd(10)} ${F.slice(0,120)}${W?` [+${W} tool call(s)]`:""}`)}}var Nq=new Set(["run","gauntlet","eval","bench","tools","plugin","skills","mcp","market","context","doctor","auth","provider","model","models","setup","connect","trace","help","chat","repl","smoke-tui","acp","serve","export","sessions","trust","update","workflow"]);if(S===""||S==="chat"||S==="repl")await(await import("./start-chat-s4st3mm0.js")).startChat(C);else if(Nq.has(S))switch(S){case"run":{let{expandSlashPrompt:Q}=await import("./commands-exafvm2b.js"),{runPromptWords:z,readPipedStdin:Z,withPipedInput:V}=await import("./output-b3ewj3ps.js"),B=z(C,process.argv).join(" "),F=process.argv.includes("--no-stdin")?"":await Z(process.stdin,{note:(W)=>console.error(W)});await i(Q(V(B,F)||"hello",process.cwd()));break}case"gauntlet":case"eval":await zq();break;case"bench":await Xq();break;case"tools":await Kq();break;case"plugin":process.exitCode=await(await import("./cli-1n1zb64f.js")).cmdPlugin(D("plugin"));break;case"mcp":process.exitCode=await(await import("./mcp-market-cmd-9mg3jecy.js")).cmdMcp(D("mcp"));break;case"trust":process.exitCode=await(await import("./trust-cmd-cjav8zgm.js")).cmdTrust(D("trust"),process.cwd());break;case"market":process.exitCode=await(await import("./market-cmd-e14kmx9n.js")).cmdMarket(D("market"));break;case"skills":process.exitCode=await(await import("./skills-cmd-gjxnxnhx.js")).cmdSkills(D("skills"),process.cwd());break;case"context":process.exitCode=await(await import("./context-cmd-5t43wgqt.js")).cmdContext(D("context"));break;case"doctor":process.exitCode=await(await import("./doctor-ws4fh4tn.js")).cmdDoctor(D("doctor"));break;case"setup":{let{runSetup:Q}=await import("./setup-jzvv72fg.js"),{ProviderRegistry:z}=await import("./registry-s8yk86g0.js");process.exitCode=await Q({registry:new z(process.cwd())});break}case"connect":process.exitCode=await Vq(D("connect"));break;case"help":o(C.rest[0]??"");break;case"auth":await Wq(C.rest);break;case"provider":await jq(D("provider"));break;case"model":await s(D("model"));break;case"update":process.exitCode=await(await import("./update-cmd-tk131s9t.js")).cmdUpdate(D("update"),k.version,import.meta.path);break;case"models":await s(["list",...D("models")]);break;case"trace":{let{resolveSessionArg:Q}=await import("./session-arg-y75wd4kj.js");await Gq(Q("rovecode trace",v(process.cwd(),".rovecode","sessions"),C.rest[0]));break}case"export":(await import("./export-1mxb9g5p.js")).cmdExport(process.argv);break;case"workflow":process.exitCode=await(await import("./workflow-cmd-cy3cvzjp.js")).cmdWorkflow(D("workflow"));break;case"sessions":process.exitCode=(await import("./sessions-cmd-tsnwz0ns.js")).cmdSessions(process.argv,process.cwd());break;case"smoke-tui":{if(process.argv.includes("--sextant")){await(await import("./sextant-smoke-37m81ke6.js")).runSextantSmoke();break}let Q=await import("./smoke-p7748apt.js").catch((z)=>{if(z?.code==="ERR_MODULE_NOT_FOUND")return null;throw z});if(Q===null)console.error("smoke-tui is dev-only \u2014 run from a source checkout with devDependencies installed"),process.exit(1);await Q.runTuiSmoke();break}case"acp":await(await import("./server-b0nvs2bn.js")).runAcpStdio({yolo:C.yolo});break;case"serve":{let{startServer:Q}=await import("./http-xafw6fsh.js"),z=Number(process.env.ROVECODE_PORT??"")||void 0,Z=Q({...z!==void 0?{port:z}:{},yolo:C.yolo});for(let V of["SIGTERM","SIGINT"])process.once(V,()=>{Promise.resolve(Z.stop()).then(()=>process.exit(0),()=>process.exit(1))});console.log(`rovecode server listening on ${Z.url} \u2014 POST /session \xB7 POST /session/:id/prompt (SSE) \xB7 DELETE /session/:id/prompt \xB7 GET /session/:id/tasks \xB7 GET /sessions \xB7 GET /events (SSE bus) \xB7 GET /ui (mission control) \xB7 GET /doc`);break}default:o();break}else{let{pathShaped:Q}=await import("./dispatch-2r5myxye.js");if(Q(S)){let W=process.argv.slice(process.argv.indexOf(S)).map((Y)=>/\s/.test(Y)?JSON.stringify(Y):Y).join(" "),X=`"${S}" looks like a path, not a prompt. A bare prompt is sent to your provider and billed; for a command see \`rovecode help\`, to send it as a prompt anyway: rovecode run ${W}`;if(!process.stdin.isTTY||!process.stderr.isTTY)console.error(`error: ${X}`),process.exit(2);let{askLine:K}=await import("./setup-jzvv72fg.js"),j=(await K(`${X}
280
- Send it as a prompt? [y/N] `)).trim().toLowerCase();if(j!=="y"&&j!=="yes")console.error("nothing sent"),process.exit(2)}let{expandSlashPrompt:z}=await import("./commands-exafvm2b.js"),{runPromptWords:Z,readPipedStdin:V,withPipedInput:B}=await import("./output-b3ewj3ps.js"),F=process.argv.includes("--no-stdin")?"":await V(process.stdin,{note:(W)=>console.error(W)});await i(z(B(Z(C,process.argv).join(" "),F),process.cwd()))}
@@ -1,5 +0,0 @@
1
- // @bun
2
- import{a as DJ,b as KJ,c as gJ,f as EJ,g as UJ,h as PJ,i as u,j as g,k as CJ,l as uJ}from"./main-x4r0fne4.js";import"./main-f7rw7des.js";import{S as WJ,V as k,X as HJ,Y as fJ}from"./main-yr0ksc0h.js";import{Z as e,ha as AJ}from"./main-xy53xf0r.js";import{ia as BJ,qa as kJ}from"./main-7c5thhjd.js";import{Ac as f,Bc as c,nc as q,oc as JJ,pc as _,qc as d,rc as p,wc as XJ,yc as h,zc as w}from"./main-zaqh35jg.js";import"./main-vqak588n.js";import"./main-0ab9fc26.js";import"./main-6dnk69vp.js";import"./main-pn1w7a7j.js";import"./main-351pz3z7.js";import{Hh as YJ,Ph as xJ}from"./main-kcpbykxz.js";import"./main-q3vsesf9.js";import"./main-a9njrkk1.js";import"./main-7rn6bqje.js";import{$m as hJ,Lm as VJ,_m as o}from"./main-2yeveeve.js";import"./main-0jys2ccn.js";import"./main-nqveez48.js";import{xn as yJ}from"./main-qsevpgsv.js";hJ();p();c();p();c();AJ();var FJ=/^(?:https?:\/\/|git@|ssh:\/\/|git:\/\/)|\.git$/i,qJ=/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/i,TJ=/^(?:\.{1,2}[\\/]|[A-Za-z]:[\\/]|[\\/])/,MJ=(J)=>FJ.test(J),SJ=(J)=>TJ.test(J),LJ=(J)=>qJ.test(J)&&(J.startsWith("@")||J.includes("-"));function x(J,Z,X,$){return{id:Z,kind:J,title:Z,publisher:"unknown (you named this source)",description:$,source:"catalog",tags:[],env:[],install:X}}function t(J,Z){let X=J.trim();if(MJ(X)){if(Z==="mcp")return null;return Z==="skill"?x("skill",s(X),{kind:"skill",source:{git:X}},`a skill cloned from ${X}`):x("plugin",s(X),{kind:"plugin",source:X,git:!0},`a plugin cloned from ${X}`)}if(SJ(X)){if(Z!==void 0&&Z!=="plugin")return null;return x("plugin",X.split(/[\\/]/).filter(Boolean).pop()??"plugin",{kind:"plugin",source:X,git:!1},`a plugin copied from ${X}`)}if((Z===void 0||Z==="mcp")&&LJ(X)){let $={key:X,title:X,description:`an MCP server run with npx ${X}`,source:"registry",publisher:X.startsWith("@")?X.slice(1).split("/")[0]:"unknown",installs:[{kind:"stdio",runtime:"npx",command:"npx",args:["-y",X],env:[],pending:[]}]};return x("mcp",e(X),{kind:"mcp",entry:$},`an MCP server run with npx ${X}`)}return null}function s(J){return(J.replace(/\.git$/i,"").split(/[\\/]/).filter(Boolean).pop()??"item").toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^[^a-z0-9]+/,"").slice(0,64)||"item"}async function j(J,Z={}){let X=JJ(J);if(X===null)return{ok:!1,error:`"${J.slice(0,60)}" is not something rovecode can install`};let{kind:$,id:V}=X;if($!==void 0){let E=await w($,V,Z);if(E.item)return{ok:!0,item:E.item};let D=t(V,$);if(D)return{ok:!0,item:D};return{ok:!1,error:`no ${$} called "${V}"${E.notes.length?` \u2014 ${E.notes[0]}`:""}`}}let B=[];for(let E of["mcp","skill","plugin"]){let D=await w(E,V,Z);if(D.item&&D.item.id===V)B.push(D.item)}if(B.length===1)return{ok:!0,item:B[0]};if(B.length>1)return{ok:!1,ambiguous:B,error:`"${V}" exists in ${B.length} kinds \u2014 say which: ${B.map(_).join(" \xB7 ")}`};let Q=t(V);if(Q)return{ok:!0,item:Q};let C=(await h(V,Z)).items.slice(0,5);if(C.length===0)return{ok:!1,error:`nothing in the market matches "${V}"`};return{ok:!1,ambiguous:C,error:`no item is called "${V}" \u2014 did you mean: ${C.map(_).join(" \xB7 ")}`}}uJ();kJ();fJ();gJ();xJ();c();p();var b=(J)=>typeof J==="object"&&J!==null&&!Array.isArray(J),OJ=/^[a-z0-9][a-z0-9._-]{0,63}$/,vJ={skill:new Set(["id","name","title","publisher","description","version","license","tags","repository","homepage","source","files","bytes","docs","env","status","planNote"]),plugin:new Set(["id","name","title","publisher","description","version","apiVersion","license","tags","repository","homepage","install","contributes","docs","env","status","planNote"])};function l(J){if(typeof J!=="string"||J==="")return!1;let Z=J.split("\\").join("/");return Z.startsWith("/")||/^[A-Za-z]:/.test(Z)||Z.split("/").includes("..")}function bJ(J,Z={}){if(Z.kind!==void 0)return Z.kind;if(b(J)&&(J.kind==="skill"||J.kind==="plugin"))return J.kind;let X=(Z.filename??"").toLowerCase();if(X.includes("skill"))return"skill";if(X.includes("plugin"))return"plugin";return}function ZJ(J,Z={}){let X=[],$=(D,S,G="error")=>X.push({path:D,message:S,severity:G});if(J.length>q.body)return{ok:!1,kind:Z.kind??"skill",accepted:0,dropped:0,findings:[{path:"",message:`the file is ${Math.round(J.length/1024)} KB; rovecode reads at most ${q.body/1024} KB`,severity:"error"}]};let V;try{V=JSON.parse(J)}catch(D){return{ok:!1,kind:Z.kind??"skill",accepted:0,dropped:0,findings:[{path:"",message:`not valid JSON: ${D instanceof Error?D.message:String(D)}`,severity:"error"}]}}let B=bJ(V,Z);if(B===void 0)return{ok:!1,kind:"skill",accepted:0,dropped:0,findings:[{path:"",message:'cannot tell whether this is a skill or a plugin catalog \u2014 pass --kind skill|plugin, or give the document a "kind" field',severity:"error"}]};if(!b(V))return{ok:!1,kind:B,accepted:0,dropped:0,findings:[{path:"",message:"the top level must be an object",severity:"error"}]};if(V.version===void 0)$("version","missing; rovecode assumes 1","warning");else if(V.version!==1)$("version",`is ${JSON.stringify(V.version)}; this rovecode reads version 1`);if(!Array.isArray(V.items))return $("items","missing or not an array \u2014 a catalog is { version, items: [...] }"),{ok:!1,kind:B,accepted:0,dropped:0,findings:X};let Q=V.items;if(Q.length===0)$("items","no rows: this catalog would show nothing","warning");if(Q.length>q.items)$("items",`${Q.length} rows; rovecode reads the first ${q.items} and ignores the rest`,"warning");let F=new Map,C=0,E=0;return Q.forEach((D,S)=>{let G=`items[${S}]`,A=X.length;if(!b(D)){$(G,"not an object"),E++;return}let O=typeof D.id==="string"?D.id:typeof D.name==="string"?D.name:void 0;if(O===void 0)$(`${G}.id`,"missing (a row needs an id, or a name to use as one)");else if(!OJ.test(O))$(`${G}.id`,`"${O}" is not a bare slug \u2014 lowercase letters, digits, dot, dash, underscore, at most 64`);else{let Y=F.get(O);if(Y!==void 0)$(`${G}.id`,`"${O}" is already used by items[${Y}]; ids are unique within a kind`);else F.set(O,S)}if(typeof D.description!=="string"||D.description.trim()==="")$(`${G}.description`,"missing (a row needs one line describing it)");else if(D.description.length>q.desc)$(`${G}.description`,`${D.description.length} characters; will be cut to ${q.desc}`,"warning");for(let Y of["title","publisher","version","license","repository","homepage"]){let H=D[Y];if(H!==void 0&&typeof H!=="string")$(`${G}.${Y}`,`must be a string, not ${Array.isArray(H)?"an array":typeof H}`,"warning");else if(typeof H==="string"&&H.length>q.str)$(`${G}.${Y}`,`${H.length} characters; will be cut to ${q.str}`,"warning")}if(D.publisher===void 0)$(`${G}.publisher`,'missing; the row will say "unknown"',"warning");if(D.tags!==void 0){if(!Array.isArray(D.tags))$(`${G}.tags`,"must be an array of strings","warning");else if(D.tags.length>q.list)$(`${G}.tags`,`${D.tags.length} tags; only the first ${q.list} are read`,"warning")}IJ(B,D,G,$),jJ(D.docs,`${G}.docs`,$);for(let Y of Object.keys(D))if(!vJ[B].has(Y))$(`${G}.${Y}`,"not a field rovecode reads \u2014 a typo, or something it will ignore","warning");let I=[],R=XJ(B,D,I),z=X.slice(A).some((Y)=>Y.severity==="error");if(R===null){if(E++,!z)$(G,`rovecode drops this row${I.length?`: ${I[I.length-1]}`:""} \u2014 the checks above did not explain why, which is a gap in this validator`)}else{if(z)$(G,"the row loads despite the errors above; treat them as the more careful reading","warning");C++}}),{ok:X.every((D)=>D.severity!=="error"),kind:B,accepted:C,dropped:E,findings:X}}function IJ(J,Z,X,$){if(J==="skill"){let B=b(Z.source)?Z.source:void 0,Q=Array.isArray(Z.files)?Z.files:void 0;if(B===void 0&&Q===void 0){$(`${X}.source`,"missing: a skill needs either source.git (a repository) or files (the text itself)");return}if(B!==void 0){if(typeof B.git!=="string"||!/^https?:\/\//.test(B.git))$(`${X}.source.git`,"must be an http(s) repository URL");if(l(B.subfolder))$(`${X}.source.subfolder`,`"${String(B.subfolder)}" climbs out of the clone`)}if(Q?.forEach((F,C)=>{let E=b(F)?F.path:void 0;if(typeof E!=="string"||E==="")$(`${X}.files[${C}].path`,"missing");else if(l(E))$(`${X}.files[${C}].path`,`"${E}" writes outside the skill's folder`);if(b(F)&&typeof F.text!=="string")$(`${X}.files[${C}].text`,"missing (the file's contents)")}),Q!==void 0&&Q.length>q.list)$(`${X}.files`,`${Q.length} files; only the first ${q.list} are read`,"warning");return}let V=b(Z.install)?Z.install:void 0;if(V===void 0){$(`${X}.install`,"missing: a plugin needs install.source (a repository URL or a folder)");return}if(typeof V.source!=="string"||V.source===""){$(`${X}.install.source`,"missing");return}if(V.git===!0&&!/^https?:\/\//.test(V.source))$(`${X}.install.source`,`"${V.source}" is marked git: true but is not an http(s) URL`);if(l(V.subfolder))$(`${X}.install.subfolder`,`"${String(V.subfolder)}" climbs out of the clone`);if(V.subfolder===void 0)$(`${X}.install.subfolder`,"absent: the plugin.json must then be at the repository root","warning")}function jJ(J,Z,X){if(J===void 0)return;if(!b(J)){X(Z,"must be an object","warning");return}if(typeof J.source!=="string"||!/^https?:\/\//.test(J.source))X(`${Z}.source`,"must be the http(s) URL the document was read from \u2014 the docs are dropped without it","warning");if(J.format!=="markdown")X(`${Z}.format`,'must be "markdown"; the docs are dropped otherwise',"warning");if(typeof J.body!=="string"||J.body.trim()==="")X(`${Z}.body`,"empty: the docs are dropped and the row keeps no documentation","warning");else if(Buffer.byteLength(J.body,"utf8")>q.docs)X(`${Z}.body`,`${Math.round(Buffer.byteLength(J.body,"utf8")/1024)} KB; will be cut to ${q.docs/1024} KB`,"warning");if(J.truncated===!0&&typeof J.bytes==="number"&&typeof J.body==="string"&&J.bytes<=Buffer.byteLength(J.body,"utf8"))X(`${Z}.bytes`,"marked truncated, but bytes is not larger than the body \u2014 bytes should be the size BEFORE truncation","warning")}function $J(J,Z){let X=J.findings.filter((B)=>B.severity==="error"),$=J.findings.filter((B)=>B.severity==="warning"),V=[`${Z}: ${J.kind} catalog \u2014 ${J.ok?"valid":"INVALID"}`];V.push(` ${J.accepted} row${J.accepted===1?"":"s"} would load, ${J.dropped} dropped, ${X.length} error${X.length===1?"":"s"}, ${$.length} warning${$.length===1?"":"s"}`);for(let B of[...X,...$])V.push(` ${B.severity==="error"?"error ":"warning"} ${B.path===""?"(file)":B.path}: ${B.message}`);if(J.ok&&$.length>0)V.push(" warnings do not stop a catalog loading; they are fields that will not survive as written");return V}import{readFileSync as mJ}from"fs";import{createInterface as wJ}from"readline";var n=["usage: rovecode market <command>"," search [query] [--kind mcp|skill|plugin] every source at once: the curated MCP shelf, the MCP registry,"," rovecode's skill and plugin catalogs (skills/plugins work offline)"," info <id> one item in full: publisher, version, what it installs, what it asks"," docs <id> the item's own documentation, as the catalog carries it"," install <id|kind:id|git-url|npm-package> [--project] [--as <name>] [--pick N] [--ref <branch|tag|commit>] [--yes] [--force]"," shows the plan, asks (masked) for keys by name, then writes"," --local / --no-local: an npx server installed ONCE (npm, ~25 MB, starts in 0.4 s not 2 s)"," or the npx line as it is; without either, a terminal asks and --yes keeps npx"," --dry-run shows the plan and stops; nothing is fetched or written"," remove <id|kind:id> [--project] undo an install of any kind"," list [--all] [--kind mcp|skill|plugin] what is installed here (--all: the whole market, with badges)"," update [id] [--all] [--yes] what is out of date; with an id or --all: plan, approve, reinstall"," --all --yes skips plugins (new code): name one, or pass --yes-plugins"," sources [probe] where rows come from right now; really asks the registry (--offline to skip)"," verify [id] re-hash what is installed and say what has changed since"," validate <path|url> [--kind skill|plugin] check a catalog you wrote before anyone trusts it: what would"," load, what would be dropped, and which fields will not survive","every command takes --json \xB7 --offline skips the network entirely","an id is a bare slug inside its kind (filesystem); say mcp:filesystem when two kinds share a name"],GJ=new Set(["--json","--offline"]),pJ=new Set(["--as","--pick","--kind","--ref"]),_J={search:new Set(["--kind"]),info:new Set,docs:new Set,install:new Set(["--project","--as","--pick","--ref","--yes","--force","--dry-run","--local","--no-local"]),remove:new Set(["--project","--yes"]),list:new Set(["--all","--kind"]),update:new Set(["--all","--yes","--yes-plugins","--dry-run"]),sources:new Set,verify:new Set,validate:new Set(["--kind"]),help:new Set},cJ=new Set([...GJ,...Object.values(_J).flatMap((J)=>[...J])]),lJ=/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/g,nJ=(J)=>J.replace(/\r\n?/g,`
3
- `).replace(lJ,""),NJ=(J)=>J<1024?`${J} B`:`${(J/1024).toFixed(1)} KB`,N=(J,Z)=>(J.out??console.log)(JSON.stringify(Z,null,2));function zJ(J){let Z=J.status?` [${J.status}]`:"";if(!J.installed)return Z;if(J.installed.updateAvailable)return`${Z} [installed ${J.installed.version??"?"} \xB7 update ${"available"}]`;if(J.installed.trusted===!1)return`${Z} [installed \xB7 NOT approved on this machine]`;return`${Z} [installed]`}function iJ(J,Z,X){let $=[`${J.title}${J.version?` ${J.version}`:""}${J.status?` [${J.status}]`:""}`,` id ${_(J)}`,` kind ${J.kind==="mcp"?"MCP server \u2014 rovecode launches it and the model gets its tools":J.kind==="skill"?"skill \u2014 instructions the model reads; files only, nothing runs":"plugin \u2014 a folder of code rovecode loads and runs"}`,` publisher ${J.publisher}`,` source ${J.source==="curated"?"curated list (built into rovecode)":J.source==="registry"?"MCP registry (registry.modelcontextprotocol.io)":"rovecode catalog (in the repository)"}`,` ${J.description}`];if(J.license)$.push(` licence ${J.license}`);if($.push(J.docs?` docs ${NJ(J.docs.bytes)} from ${J.docs.source}${J.docs.truncated?" (truncated)":""} \u2014 rovecode market docs ${_(J)}`:` docs none${J.repository?` \u2014 try ${J.repository}`:""}`),J.repository)$.push(` repo ${J.repository}`);if(J.homepage)$.push(` home ${J.homepage}`);if(J.tags.length)$.push(` tags ${J.tags.join(", ")}`);let{install:V}=J;if(V.kind==="mcp")for(let Q of V.entry.installs)$.push(Q.kind==="stdio"?` runs ${Q.command} ${Q.args.join(" ")}`:` connects ${Q.url}`);else if(V.kind==="plugin")$.push(` installs ${V.git?`git clone ${V.source}`:`copy of ${V.source}`}${V.subfolder?` (subfolder ${V.subfolder})`:""}`);else $.push(V.source?` installs git clone ${V.source.git}${V.source.subfolder?` (${V.source.subfolder})`:""}`:` installs ${(V.files??[]).length} file(s) from the catalog`);for(let Q of J.env)$.push(` needs ${Q.name}${Q.secret?" (secret, asked masked)":""}${Q.required?"":" (optional)"}${Q.description?` \u2014 ${Q.description}`:""}`);let B=u(J,Z,X);return $.push(B?` installed ${B.path} (${B.scope}${B.version?`, ${B.version}`:""}${B.trusted===!1?", NOT approved here":""})`:" installed no"),$}async function oJ(J,Z){let X={};for(let $ of J.asks){if(!Z.tty){Z.err(`${$.name} is not set \u2014 it will be written as \${${$.name}} and read from your environment`);continue}let V=`${$.name}${$.description?` (${$.description})`:""}: `,B=(await($.secret?Z.secret(V):Z.plain(V))).trim();if(B.length>0)X[$.name]=B}for(let $ of J.pending??[]){if(!Z.tty)continue;let V=(await Z.plain(`${$}: `)).trim();if(V.length>0)X[$]=V}return X}function dJ(J,Z){if(J.install.kind!=="mcp")return;if(Z.scope==="project")return;let X=J.install.entry.installs[Z.pick??0];return X===void 0?void 0:BJ(X)}function aJ(J){return[`${J.spec} would start through npx: ~2 s at every start, re-resolving the package (and asking the npm registry) each time.`,"Install it once instead? npm puts the package's code under ~/.rovecode/mcp \u2014 typically 20\u201330 MB and a few seconds, one time;","it then starts in ~0.4 s and needs no network to start. No keeps the npx line exactly as it is today."]}async function QJ(J,Z,X){let $=(E)=>{if(X.collect)X.collect(E);else N({out:X.out},E)},V=Z.local,B=dJ(J,Z);if(B!==void 0&&V===void 0&&!X.yes&&!X.json&&!X.dryRun&&X.tty){for(let D of aJ(B))X.out(D);let E=(await X.plain(`install ${B.spec} once? [y/N] `)).trim().toLowerCase();V=E==="y"||E==="yes"}let Q=EJ(J,V===void 0?Z:{...Z,local:V});if("error"in Q){if(X.err(Q.error),X.json)$({ok:!1,error:Q.error,id:_(J)});return 1}if(!X.json){for(let E of Q.preview)X.out(E);if(Q.replaces)X.out(` replaces ${Q.replaces}`);for(let E of Q.pending)X.out(` fill in ${E} \u2014 after the install, in ${Q.target}`)}if(X.dryRun){if(X.json)return $({dryRun:!0,item:J,target:Q.target,scope:Q.scope,preview:Q.preview,asks:Q.asks,pending:Q.pending,...Q.replaces?{replaces:Q.replaces}:{}}),0;return X.out(`nothing written \u2014 --dry-run. ${PJ(J.install)?"The source was not fetched, so this is the plan, not its contents.":"This is the whole plan."}`),0}if(!X.yes){if(X.json)return $({ok:!1,needsApproval:!0,item:J,target:Q.target,scope:Q.scope,preview:Q.preview,asks:Q.asks,pending:Q.pending,...Q.replaces?{replaces:Q.replaces}:{}}),X.err("nothing written: pass --yes to accept this plan, or --dry-run to read it"),1;if(!X.tty)return X.err("nothing written: rerun on a terminal, or pass --yes to accept this plan in a script"),1;let E=(await X.plain(`${X.verb} this? [y/N] `)).trim().toLowerCase();if(E!=="y"&&E!=="yes")return X.out("nothing written"),1}let F=await oJ(Q,{secret:X.secret,plain:X.plain,tty:X.tty&&!(Z.scope==="project"&&Q.asks.some((E)=>E.secret)),err:X.err}),C=await UJ(Q,F,V===void 0?Z:{...Z,local:V},X.run);if(!C.ok){if(X.err(C.error),X.json)$(C);return 1}if(X.json)return $(C),0;if(X.out(`${X.verb==="update"?"updated":"installed"} ${_(J)} \u2192 ${C.target}${C.trusted===!0?" (trusted as written)":""}`),C.package){if(X.out(` package ${C.package.name} ${C.package.version} \u2192 ${C.package.prefix}${C.package.integrity!==void 0?" (integrity recorded in installed.json)":""}`),C.package.missing)X.err(` record incomplete: ${C.package.missing.join("; ")}`)}if(C.trusted===!1)X.err("that file already held entries you have not approved, so it is NOT trusted yet \u2014 rovecode mcp trust");if(C.envNames.length)X.err(`set ${C.envNames.join(", ")} in your environment before the restart`);if(C.next)X.out(C.next);return 0}async function GX(J,Z={}){let X=new Map;try{return await rJ(J,{...Z,run:{...Z.run,cloneCache:X}})}catch($){return(Z.err??((V)=>console.error(V)))(`market: ${$ instanceof Error?$.message:String($)}`),1}finally{YJ(X)}}async function rJ(J,Z){let X=Z.out??console.log,$=Z.err??((z)=>console.error(z)),V=Z.cwd??process.cwd(),B=Z.home??VJ(),Q=J.includes("--json"),F=J.includes("--offline"),C=J.includes("--project")?"project":"user",E={...Z.registry,...F?{offline:!0}:{}},D=(z)=>{let Y=J.indexOf(z);return Y>=0?J[Y+1]:void 0},S=J.filter((z,Y)=>!z.startsWith("--")&&!(Y>0&&pJ.has(J[Y-1]))),G=(z)=>{if($(z),$(n.join(`
4
- `)),Q)N(Z,{ok:!1,error:z,usage:n});return 2},A=S[0];if(A===void 0)return G("market needs a command");let O=_J[A];if(O===void 0)return G(`unknown command "${A}"`);for(let z of J){if(!z.startsWith("--"))continue;if(GJ.has(z)||O.has(z))continue;return G(cJ.has(z)?`market ${A} does not take ${z}`:`unknown flag ${z}`)}if(A==="help")return X(n.join(`
5
- `)),0;let I=()=>{let z=D("--kind");if(z===void 0)return;return["mcp","skill","plugin"].includes(z)?z:G("--kind takes mcp, skill or plugin")};if(A==="search"){let z=I();if(z===2)return 2;let Y=S.slice(1).join(" "),H=await h(Y,E),K=z?H.items.filter((W)=>W.kind===z):H.items,P=g(K,V,B);if(Q)return N(Z,{items:P,sources:H.sources,notes:H.notes}),P.length===0?1:0;for(let W of H.notes)$(`market: ${W}`);if(P.length===0){let W=Object.entries(H.sources).filter(([,T])=>!T.ok);$(Y?`nothing matches "${Y}"`:"the market is empty");for(let[T,M]of W)if(!M.ok)$(` ${T}: ${M.reason}`);return 1}for(let W of P)X(`${d(W)}${zJ(W)}`);return 0}if(A==="sources"){let z=S.slice(1).join(" ")||"mcp",Y=F?await f(E):await h(z,E);if(Q)return N(Z,{sources:Y.sources,notes:Y.notes,count:Y.items.length,probe:F?null:z,offline:F}),Object.values(Y.sources).every((H)=>H.ok)?0:1;if(F)X("--offline: the registry was not asked");else X(`probed with "${z}"`);for(let[H,K]of Object.entries(Y.sources)){let P=!K.ok?`FAILED \u2014 ${K.reason}`:K.from==="live"?"answered just now":K.from==="cache"?`from the cache${K.ageMs?` (${Math.round(K.ageMs/1000)}s old)`:""}`:K.from==="skipped"?`not consulted \u2014 ${K.why}`:"built in / on disk";X(`${H.padEnd(14)} ${P}`)}return X(`${String(Y.items.length).padStart(14)} items visible right now`),Object.values(Y.sources).every((H)=>H.ok)?0:1}if(A==="verify"){let z=S[1],Y=[];for(let K of["user","project"])for(let P of WJ(K,V,B)){let W=`${P.kind}:${P.id}`;if(z!==void 0&&z!==W&&z!==P.id)continue;Y.push({id:W,result:P.kind==="mcp"?{state:"not-applicable",why:"an MCP entry is a line inside a shared mcp.json, not a folder of its own"}:DJ(P.digest,P.target)})}if(Q){if(N(Z,Y),Y.length===0)return z!==void 0?1:0;return Y.some((K)=>K.result.state==="changed"||K.result.state==="missing")?1:0}if(Y.length===0)return X(z!==void 0?`nothing recorded for "${z}"`:"nothing installed through the market yet"),z!==void 0?1:0;for(let K of Y)X(KJ(K.id,K.result));let H=Y.filter((K)=>K.result.state==="changed"||K.result.state==="missing").length;if(H>0)$(`${H} item${H===1?" is":"s are"} not what was installed \u2014 reinstall with \`market install <id> --force\`, or keep the edit`);return H>0?1:0}if(A==="list"){let z=J.includes("--all"),Y=I();if(Y===2)return 2;let H=await f(E),K=g(H.items,V,B).filter((W)=>(z||W.installed)&&(Y===void 0||W.kind===Y)),P=K.map((W)=>W.installed?{...W,origin:k(W,W.installed.scope,V,B)??null}:W);if(Q)return N(Z,P),0;if(K.length===0){let W=Y===void 0?"":`${Y==="mcp"?"MCP server":Y} `;return X(z?Y===void 0?"the market is empty":`the market has no ${W}items`:`${Y===void 0?"nothing ":`no ${W}`}installed here yet \u2014 \`rovecode market search${Y?` --kind ${Y}`:""}\` to look around`),0}for(let W of K)if(X(`${d(W)}${zJ(W)}`),W.installed)X(` from ${HJ(k(W,W.installed.scope,V,B))}`);return 0}if(A==="update"){let z=await f(E),Y=g(z.items,V,B).filter((U)=>U.installed),H=Y.filter((U)=>U.installed.updateAvailable===!0||U.version===void 0||U.installed.version===void 0),K=S[1],P=J.includes("--all");if(K===void 0&&!P){if(Q)return N(Z,H),0;if(H.length===0)return X("everything installed is at the catalog's version"),0;for(let U of H){let v=U.installed.version,L=U.version;X(v!==void 0&&L!==void 0?`${_(U)} ${v} \u2192 ${L}`:`${_(U)} version unknown (${v===void 0?"nothing on disk says one":"the catalog states none"}) \u2014 updating reinstalls it`)}return X("rovecode market update <id> \xB7 rovecode market update --all"),0}let W=P&&J.includes("--yes")&&!J.includes("--yes-plugins"),T=H;if(K!==void 0){let U=await j(K,E);if(!U.ok){if($(U.error),Q)N(Z,{ok:!1,error:U.error,candidates:U.ambiguous??[]});return U.ambiguous?2:1}let v=Y.find((L)=>L.id===U.item.id&&L.kind===U.item.kind);if(v===void 0){let L=`${_(U.item)} is not installed here \u2014 rovecode market install ${_(U.item)}`;if($(L),Q)N(Z,{ok:!1,error:L,id:_(U.item),installed:!1});return 1}T=[v]}let M=W?T.filter((U)=>U.kind==="plugin"):[];if(M.length)T=T.filter((U)=>U.kind!=="plugin");let y=[],a=(U)=>{if(Q)N(Z,{ok:U,results:y,skipped:M.map(_)})};if(T.length===0&&M.length===0){if(Q)a(!0);else X("everything installed is at the catalog's version");return 0}let RJ={out:X,err:$,json:Q,yes:J.includes("--yes"),tty:Z.tty??process.stdin.isTTY===!0,secret:Z.secret??o,plain:Z.plain??i,verb:"update",dryRun:J.includes("--dry-run"),run:{...Z.run,force:!0,...F?{offline:!0}:{}},...Q?{collect:(U)=>{y.push(U)}}:{}},m=0;if(M.length&&!Q)X(`${M.length} plugin${M.length>1?"s":""} skipped \u2014 a plugin update runs new code: ${M.map(_).join(", ")}`),X(" rovecode market update <id> --yes \xB7 or --yes-plugins to take them all");for(let U of T){let v=U.kind==="mcp"?k(U,U.installed.scope,V,B)?.package!==void 0:void 0,L={scope:U.installed.scope,cwd:V,home:B,...Z.prereqEnv!==void 0?{prereqEnv:Z.prereqEnv}:{},...v!==void 0?{local:v}:{}},r=await QJ(U,L,RJ);if(r!==0)m=r}return a(m===0),m}let R=S[1];if(["info","install","remove","docs"].includes(A)&&R===void 0)return G(`market ${A} needs a name`);if(A==="info"){let z=await j(R,E);if(z.ok&&z.item.source==="catalog"&&z.item.publisher.startsWith("unknown (")&&z.item.kind==="mcp"){if($(`"${R}" is not in the catalog or the registry \u2014 \`market install\` would treat it as an npm package, but there is nothing here to describe`),Q)N(Z,{error:"not found",id:R});return 1}if(!z.ok){if($(z.error),Q)N(Z,{error:z.error,candidates:z.ambiguous??[]});return z.ambiguous?2:1}if(Q)return N(Z,{...z.item,installed:u(z.item,V,B)}),0;for(let Y of iJ(z.item,V,B))X(Y);return 0}if(A==="docs"){let z=await j(R,E);if(z.ok&&z.item.source==="catalog"&&z.item.publisher.startsWith("unknown (")&&z.item.kind==="mcp"){if($(`"${R}" is not in the catalog or the registry \u2014 nothing here has documentation`),Q)N(Z,{error:"not found",id:R});return 1}if(!z.ok){if($(z.error),Q)N(Z,{error:z.error,candidates:z.ambiguous??[]});return z.ambiguous?2:1}let Y=z.item.docs;if(!Y||Y.body===void 0){let H=z.item.repository??z.item.homepage;if($(`${_(z.item)} carries no documentation in the catalog${H?` \u2014 the publisher's own is at ${H}`:""}`),Q)N(Z,{id:_(z.item),docs:null,...H?{repository:H}:{}});return 1}if(Q)return N(Z,{id:_(z.item),docs:Y}),0;if(X(nJ(Y.body)),Y.truncated)$(`\u2014 truncated: ${NJ(Y.bytes)} upstream, read the rest at ${Y.source}`);return 0}if(A==="validate"){if(R===void 0)return G("usage: rovecode market validate <path|url> [--kind skill|plugin]");let z=D("--kind");if(z!==void 0&&z!=="skill"&&z!=="plugin")return G("validate takes --kind skill or --kind plugin");let Y,H=/^https?:\/\//i.test(R),K=(W)=>{if($(W),Q)N(Z,{ok:!1,error:W,source:R});return 1};if(H){if(F)return G("--offline and a URL cannot both be meant \u2014 give a local path, or drop --offline");try{let W=await fetch(R,{headers:{"user-agent":"rovecode-market-validate"}});if(!W.ok)return K(`${R}: HTTP ${W.status}`);Y=await W.text()}catch(W){return K(`${R}: ${W instanceof Error?W.message:String(W)}`)}}else try{Y=mJ(R,"utf8")}catch(W){return K(`${R}: ${W instanceof Error?W.message:String(W)}`)}let P=ZJ(Y,{...z?{kind:z}:{},filename:R});if(Q)return N(Z,P),P.ok?0:1;for(let W of $J(P,R))X(W);return P.ok?0:1}if(A==="remove"){let z=await j(R,E);if(!z.ok){if($(z.error),Q)N(Z,{ok:!1,error:z.error,candidates:z.ambiguous??[]});return z.ambiguous?2:1}let Y=u(z.item,V,B,J.includes("--project")?"project":void 0);if(Y===void 0){let P=`${_(z.item)} is not installed here`;if($(P),Q)N(Z,{ok:!1,error:P,id:_(z.item),installed:!1});return 1}let H=Z.tty??process.stdin.isTTY===!0;if(!J.includes("--yes")){if(Q)return N(Z,{ok:!1,needsApproval:!0,id:_(z.item),path:Y.path,scope:Y.scope}),$("nothing removed: pass --yes to confirm"),1;if(!H)return $(`nothing removed: ${_(z.item)} lives at ${Y.path} \u2014 rerun on a terminal, or pass --yes`),1;X(`${_(z.item)} ${Y.path}${Y.scope==="project"?" (this repo)":""}`);let P=(await(Z.plain??i)("remove this? [y/N] ")).trim().toLowerCase();if(P!=="y"&&P!=="yes")return X("nothing removed"),1}let K=CJ(z.item,V,B,J.includes("--project")?"project":void 0);if(!K.ok){if($(K.error),Q)N(Z,{ok:!1,error:K.error,id:_(z.item)});return 1}if(Q)return N(Z,{ok:!0,removed:_(z.item),path:K.path}),0;return X(`removed ${_(z.item)} from ${K.path}`),0}if(A==="install"){let z=await j(R,E);if(!z.ok){if($(z.error),Q)N(Z,{error:z.error,candidates:z.ambiguous??[]});else for(let y of z.ambiguous??[])$(` ${_(y)} ${y.description}`);return z.ambiguous?2:1}let Y=D("--pick"),H=Y===void 0?void 0:Number(Y);if(H!==void 0&&!Number.isInteger(H))return G("--pick takes a number");let K=D("--as"),P=Z.model??await tJ(),W=D("--ref");if(W!==void 0&&W.trim()==="")return G("--ref needs a branch, tag or commit");let T=J.includes("--local")?!0:J.includes("--no-local")?!1:void 0,M={scope:C,cwd:V,home:B,...H!==void 0?{pick:H}:{},...K!==void 0?{as:K}:{},...W!==void 0?{ref:W}:{},...Z.prereqEnv!==void 0?{prereqEnv:Z.prereqEnv}:{},...P!==void 0?{model:P}:{},...T!==void 0?{local:T}:{}};return QJ(z.item,M,{out:X,err:$,json:Q,yes:J.includes("--yes"),tty:Z.tty??process.stdin.isTTY===!0,secret:Z.secret??o,plain:Z.plain??i,verb:"install",dryRun:J.includes("--dry-run"),run:{...Z.run,...J.includes("--force")?{force:!0}:{},...F?{offline:!0}:{}}})}return G(`unknown command "${A}"`)}async function tJ(){try{let{resolveProvider:J}=await import("./stream-gmeyewds.js"),Z=J();if(!Z)return;let X=process.env.ROVECODE_MODEL??Z.defaultModel;return X?{provider:Z.id,model:X}:void 0}catch{return}}async function i(J){let Z=wJ({input:process.stdin,output:process.stderr});try{return await new Promise((X)=>Z.question(J,X))}finally{Z.close()}}export{nJ as safeForTerminal,iJ as infoLines,GX as cmdMarket,_J as SUBCOMMAND_FLAGS,n as MARKET_USAGE};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Hc as F,Kc as G}from"./main-5ywnwthm.js";import{id as _,kd as v}from"./main-kyn0xnsg.js";import{Pd as x,Rd as P}from"./main-0mtcdbs7.js";import{Wd as C}from"./main-pn1w7a7j.js";import"./main-rg0wn0xf.js";import"./main-0z1w2zsg.js";import{lj as k}from"./main-pknhvrmj.js";import"./main-9etavkew.js";import{Am as X,Em as T,Fm as j,xm as A,zm as O}from"./main-7rn6bqje.js";import{$m as L,Lm as H,Nm as R}from"./main-2yeveeve.js";import"./main-0jys2ccn.js";import{dn as U,kn as N,mn as b}from"./main-nqveez48.js";import"./main-qsevpgsv.js";P();j();v();C();N();L();import{existsSync as y,readFileSync as S}from"fs";import{join as M}from"path";var w="usage: rovecode mcp login <name> \u2014 a url server from ~/.rovecode/mcp.json or a TRUSTED .rovecode/mcp.json / .mcp.json";function u(z){if(!y(z))return;let J;try{J=JSON.parse(S(z,"utf8"))}catch(q){throw Error(`${z}: invalid JSON (${X(q)}) \u2014 fix or remove it by hand; refusing to overwrite`)}if(!O(J))throw Error(`${z}: root is not an object \u2014 fix or remove it by hand; refusing to overwrite`)}async function f(z,J,q){if(z.length===0)return q.err(w),1;let K=A(J);try{u(K)}catch(B){return q.err(`error: ${X(B)}`),2}let V=q.home??H(),W=[],Q=T(J,W,{home:V,trusted:b(U(V))}).find((B)=>B.name===z);for(let B of W)q.err(`warning: ${B}`);if(!Q)return q.err(`error: no MCP server "${z}" in ${K}, .mcp.json (trusted files only \u2014 rovecode mcp trust) or ${M(V,"mcp.json")}`),1;if(Q.transport==="stdio"||Q.url===void 0)return q.err(`error: MCP server "${z}" is a stdio server \u2014 OAuth login applies to url servers only`),1;if(Q.enabled===!1)return q.err(`error: MCP server "${z}" is disabled (enabled: false) \u2014 enable it first`),1;let Y=q.signal??new AbortController().signal,Z={...k(),...q.oauth};q.out(`rovecode mcp login ${z} \u2014 ${Q.transport} ${Q.url}`);let $;try{$=await _(Q,{notify:(B)=>{for(let I of G(B))q.out(` ${I}`)},signal:Y},{...Z,...q.timeoutMs!==void 0?{timeoutMs:q.timeoutMs}:{}})}catch(B){if(Y.aborted)return q.err("login cancelled"),130;return q.err(`error: ${B instanceof Error?B.message:String(B)}`),1}let D=`stored OAuth token for MCP server "${z}" in ${R()} (${F($.expires,Z.now())})`,E=await l(Q,q.connectTimeoutMs);if(E===void 0)return q.out(`${D} \u2014 connected`),0;return q.out(D),q.err(`error: verification connect failed: ${E}`),1}async function l(z,J=1e4){let q=new x([z],{connectTimeoutMs:J});try{let K=await q.connect();return K.failed[0]?.error??(K.connected.includes(z.name)?void 0:"not connected")}finally{await q.close()}}async function p(z,J,q){let K=new AbortController,V=()=>K.abort();process.once("SIGINT",V);try{return await f(z[0]??"",J,{out:(W)=>q.out(W),err:(W)=>q.err(W),signal:K.signal,...q.home!==void 0?{home:q.home}:{}})}finally{process.removeListener("SIGINT",V)}}export{f as runMcpLogin,p as cmdMcpLogin,w as MCP_LOGIN_USAGE};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{T as $q,W as Dq,Y as Kq}from"./main-yr0ksc0h.js";import{$ as zq,_ as L,aa as Bq,ba as Jq,ca as Qq,da as Xq,ea as v,fa as Yq,ga as Zq,ha as Uq}from"./main-xy53xf0r.js";import{ia as a,ka as s,la as r,oa as e,pa as qq,qa as Tq}from"./main-7c5thhjd.js";import{Cc as p,Dc as b,Ec as l,Fc as Eq}from"./main-vqak588n.js";import{Sd as R,Td as t,Ud as n,Vd as S,Wd as jq}from"./main-pn1w7a7j.js";import{Dm as o,Fm as Vq,ym as y}from"./main-7rn6bqje.js";import{$m as i,Lm as c,_m as d}from"./main-2yeveeve.js";import"./main-0jys2ccn.js";import"./main-nqveez48.js";import{xn as Hq}from"./main-qsevpgsv.js";i();i();Eq();Uq();Vq();jq();Tq();Kq();import{createInterface as Wq}from"readline";var f=["usage: rovecode mcp <command>"," search [query] the curated list, then the MCP registry's name matches (cached a day)"," info <name> everything about one server: publisher, version, what it runs or connects to, what it asks"," add <name> [--project] [--pick N] [--as <name>] [--yes] [--force] [--local | --no-local]"," install: shows the exact command/URL + source, asks (masked) for keys by name, then writes"," ~/.rovecode/mcp.json \u2014 or .rovecode/mcp.json with --project (keys stay out of it: ${NAME})"," --local: an npx server is installed ONCE (npm, ~25 MB under ~/.rovecode/mcp) and started with"," node in ~0.4 s instead of ~2 s; --no-local keeps npx; neither \u2192 a terminal asks, --yes keeps npx"," remove <name> [--project] delete the entry from that file"," list every configured server, by file (user \xB7 .mcp.json \xB7 project), with the project files' trust"," show --project each project file's servers \u2014 exact command/URL, env NAMES \u2014 and whether it is trusted here"," trust \xB7 untrust approve this repo's .rovecode/mcp.json and .mcp.json as they are now (any edit asks again);"," files you write through `add --project` are trusted as you approve them"," login <name> OAuth sign-in to a url server through the browser (port #76, mcp-login.ts): the token"," lands in credentials.json under mcp:<name>; only servers the runtime itself would load","restart rovecode after add/remove/trust \u2014 servers are read once per process (docs/mcp-market.md)"];function u(z,J){let Q=S(z);if(Q.length===0)return["no project MCP files here (.rovecode/mcp.json, .mcp.json)"];let B=new Proxy({},{get:()=>"set"}),q=[];for(let Z of Q){let G=R(J,Z);q.push(`${Z} \u2014 ${G==="trusted"?"trusted on this machine":"NOT trusted: nothing in it loads until `rovecode mcp trust`"}`);let U=[];for(let _ of o(Z,U,B))q.push(` ${v(_)}`);for(let _ of U)q.push(` ! ${_}`)}return q}async function Aq(z){process.stderr.write(z);let J=Wq({input:process.stdin});return new Promise((Q)=>{J.once("line",(B)=>{J.close(),Q(B.trim())}),J.once("close",()=>Q(""))})}function A(z,J){return z.includes(J)}function m(z,J){let Q=z.indexOf(J);return Q===-1?void 0:z[Q+1]}function Gq(z){let J=[];for(let Q=0;Q<z.length;Q++){let B=z[Q];if(B==="--pick"||B==="--as"){Q++;continue}if(!B.startsWith("--"))J.push(B)}return J}function _q(z){let J=z.source==="curated"?"curated ":"registry",Q=[z.title,z.version,z.status?`[${z.status}]`:void 0].filter((B)=>B!==void 0).join(" ");return`${z.key.padEnd(40)} ${J} ${Q}${z.description?`${Q?" \u2014 ":""}${z.description}`:""}`.trimEnd()}function xq(z){let J=[`${z.key}${z.title?` (${z.title})`:""}${z.version?` v${z.version}`:""}${z.status?` [${z.status}]`:""}`,` ${z.description}`,` source ${z.source==="curated"?"curated list":"MCP registry"}`,` publisher ${z.publisher??"unknown"}`];if(z.repository)J.push(` repo ${z.repository}`);if(z.homepage)J.push(` home ${z.homepage}`);if(z.installs.length===0)J.push(" install nothing rovecode can launch (no stdio package, no streamable-http remote)");if(z.installs.forEach((Q,B)=>{if(J.push(` install ${B} ${Q.kind==="stdio"?`runs ${l(Q)}`:`connects ${Q.url}`}`),Q.kind==="stdio"){for(let q of Q.env)J.push(` env ${q.name}${q.secret?" (secret)":""}${q.required?"":" optional"}${q.description?` \u2014 ${q.description}`:""}`);for(let q of Q.pending)J.push(` needs ${q}`)}else for(let q of Q.headers)J.push(` header ${q.name}${q.template?`: ${q.template}`:""}${q.secret?" (secret)":""}${q.required?"":" optional"}`)}),z.installs.length>1)J.push(` pick one with: rovecode mcp add ${z.key} --pick N`);return J}async function Nq(z,J){let Q={};for(let B of z.asks){let q=B.secret&&z.scope==="project";if(!J.tty||q){if(B.required)J.err(`${B.name} is not set \u2014 it will be written as \${${B.name}} and read from your environment at launch`);continue}let Z=`${B.name}${B.description?` (${B.description})`:""}${B.required?"":" [optional, enter to skip]"}: `;if(Q[B.name]=B.secret?await J.secret(Z):await J.plain(Z),B.required&&Q[B.name].length===0)J.err(`${B.name} is not set \u2014 it will be written as \${${B.name}} and read from your environment at launch`)}for(let B of z.pending){if(!J.tty)continue;let q=(await J.plain(`${B}: `)).trim();if(q.length>0)Q[B]=q}return Q}async function Rq(z,J={}){let Q=J.cwd??process.cwd(),B=J.home??c(),q=J.out??console.log,Z=J.err??console.error,G={home:B,...J.market},U=J.tty??process.stdin.isTTY===!0,_=J.secret??((X)=>d(X)),x=J.plain??Aq,[K,...j]=z,k={search:[],info:[],add:["--project","--pick","--as","--yes","--force","--local","--no-local"],remove:["--project"],list:[],show:["--project"],trust:["--yes","--project"],untrust:[],login:[],help:[]};if(K!==void 0&&K in k){let X=new Set(["--pick","--as"]),Y=!1;for(let D of j){if(Y){Y=!1;continue}if(D.startsWith("--")){if(!k[K].includes(D))return Z(`unknown flag ${D} for "rovecode mcp ${K}" \u2014 see: rovecode mcp help`),2;if(X.has(D))Y=!0}}}let E=Gq(j),W=A(j,"--project")?"project":"user";switch(K){case void 0:case"help":case"--help":case"-h":for(let X of f)q(X);return K===void 0?2:0;case"search":{let X=await p(E.join(" "),G);for(let Y of X.notes)Z(`note: ${Y}`);if(X.entries.length===0)return q(`nothing matches "${E.join(" ")}"`),0;for(let Y of X.entries)q(_q(Y));return q(`\u2192 rovecode mcp info <name> \xB7 rovecode mcp add <name>${X.fromCache?" (registry results from cache)":""}`),0}case"info":{if(!E[0])return Z("usage: rovecode mcp info <name>"),2;let X=await b(E[0],G);for(let Y of X.notes)Z(`note: ${Y}`);if(!X.entry)return 1;for(let Y of xq(X.entry))q(Y);return 0}case"add":{if(!E[0])return Z("usage: rovecode mcp add <name> [--project] [--pick N] [--as <name>] [--yes] [--force]"),2;let X=await b(E[0],G);for(let $ of X.notes)Z(`note: ${$}`);if(!X.entry)return 1;let Y=m(j,"--pick"),D=Y===void 0?void 0:Number(Y);if(D!==void 0&&(!Number.isInteger(D)||D<0))return Z(`--pick wants a whole number, not "${Y}"`),2;let V=m(j,"--as"),N={scope:W,cwd:Q,home:B,...D!==void 0?{pick:D}:{},...V!==void 0?{name:V}:{}},O=L(X.entry,N);if("error"in O)return Z(O.error),1;let I=A(j,"--local")?!0:A(j,"--no-local")?!1:void 0,C=a(O.install);if(C!==void 0&&I===void 0&&W==="user"&&!A(j,"--yes")&&U){q(`${C.spec} would start through npx: ~2 s at every start, re-resolving the package (and asking the npm registry) each time.`),q("Install it once instead? npm puts the package's code under ~/.rovecode/mcp \u2014 typically 20\u201330 MB and a few seconds, one time;"),q("it then starts in ~0.4 s and needs no network to start. No keeps the npx line exactly as it is today.");let $=(await x(`install ${C.spec} once? [y/N] `)).trim().toLowerCase();I=$==="y"||$==="yes"}let H=I===!0?L(X.entry,{...N,local:!0}):O;if("error"in H)return Z(H.error),1;for(let $ of Jq(H))q($);if(!A(j,"--yes")){if(!U)return Z("nothing written: no terminal to confirm on \u2014 re-run with --yes after reading the lines above"),1;let $=(await x("install this? [y/N] ")).toLowerCase();if($!=="y"&&$!=="yes")return q("nothing written"),1}let h=await Nq(H,{secret:_,plain:x,tty:U,err:Z});if(h===null)return q("nothing written"),1;let w,T;if(H.local){let $=await s(H.local.pkg,H.local.prefix,J.spawn?{spawn:J.spawn}:{});if(!$.ok)return Z($.error),q("nothing written"),1;w=r($.pkg,H.local.pkg.rest),T={name:$.pkg.name,version:$.pkg.version,prefix:H.local.prefix,bin:$.pkg.bin,missing:$.pkg.missing,...$.pkg.integrity!==void 0?{integrity:$.pkg.integrity}:{},...$.pkg.resolved!==void 0?{resolved:$.pkg.resolved}:{}}}let M,P=zq(H,h,w);try{M=Qq(H.file,H.name,P,{replace:A(j,"--force"),...W==="project"?{trustHome:B}:{}}).trusted}catch($){return Z($ instanceof Error?$.message:String($)),1}if(q(`added "${H.name}" \u2192 ${H.file}${M===!0?" (trusted on this machine as written)":""}`),T){if($q(Dq({kind:"mcp",id:X.entry.key,source:X.entry.source,...X.entry.version!==void 0?{version:X.entry.version}:{}},{scope:W,target:H.file,package:T,installedBy:"mcp add"}),{cwd:Q,home:B}),q(`installed ${T.name} ${T.version} once \u2192 ${H.local.prefix}${T.integrity!==void 0?" (integrity recorded in installed.json)":""}`),T.missing?.length)Z(`record incomplete: ${T.missing.join("; ")}`)}if(M===!1)q("NOT trusted yet: that file already held servers you have not approved \u2014 rovecode mcp show, then rovecode mcp trust");let F=Zq(H,P);if(F.length)q(`fill in before use: ${F.join(", ")} \u2014 edit the args in that file; until then this server is skipped`);let g=Bq(H,P);if(g.length)q(`set ${g.join(", ")} in your environment \u2014 the file only names them`);if(F.length===0)q("restart rovecode to connect (servers are read once per process)");return 0}case"remove":{if(!E[0])return Z("usage: rovecode mcp remove <name> [--project]"),2;let X=y(Q,B),Y=W==="project"?X.project:X.user;try{if(!Xq(Y,E[0],W==="project"?{trustHome:B}:{}))return Z(`${Y} has no server named "${E[0]}"${W==="user"?" (project entries: add --project)":""}`),1}catch(D){return Z(D instanceof Error?D.message:String(D)),1}return q(`removed "${E[0]}" from ${Y}`),0}case"list":{let X=[],Y=Yq(Q,B,X);for(let V of X)Z(V);if(Y.length===0)return q("no MCP servers configured \u2014 rovecode mcp search <query>"),0;for(let V of Y){let N=V.scope==="user"?"":R(B,V.file)==="trusted"?"":" (file not trusted \u2014 off; rovecode mcp trust)";q(`${V.scope.padEnd(8)} ${v(V.server)}${N}`)}let D=qq(Y.filter((V)=>e(V.server)).map((V)=>V.server.name));if(D!==void 0)q(D);return 0}case"show":{for(let X of u(Q,B))q(X);return 0}case"login":return(await import("./mcp-login-wq7ktdek.js")).cmdMcpLogin(E,Q,{out:q,err:Z,home:B});case"trust":{let X=S(Q);if(X.length===0)return q("no project MCP files here (.rovecode/mcp.json, .mcp.json) \u2014 nothing to trust"),1;for(let Y of u(Q,B))q(Y);if(!A(j,"--yes")){if(!U)return Z("nothing trusted: no terminal to confirm on \u2014 re-run with --yes after reading the lines above"),1;let Y=(await x("trust these files as they are now? [y/N] ")).toLowerCase();if(Y!=="y"&&Y!=="yes")return q("nothing trusted"),1}for(let Y of X){let D=t(B,Y);q(D.ok?`trusted ${Y} (${D.digest.slice(0,12)}\u2026)`:D.reason)}return q("restart rovecode to connect \u2014 an edit to either file asks again"),0}case"untrust":{let Y=[y(Q).harvest,y(Q).project].filter((D)=>n(B,D));return q(Y.length?`untrusted ${Y.join(", ")}`:"nothing was trusted here"),0}default:Z(`unknown mcp command "${K}"`);for(let X of f)Z(X);return 2}}export{u as showLines,xq as infoLines,Rq as cmdMcp,Nq as askPlan,f as MCP_USAGE};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{t as w}from"./main-kqxnqjnv.js";import{N as l,O as p,Q as c,R as v}from"./main-2wwjex5j.js";import"./main-7c5thhjd.js";import"./main-73g7eff4.js";import{Jd as x,Kd as k}from"./main-w2n1303f.js";import"./main-3pjrb2hd.js";import"./main-t4xnd213.js";import"./main-1dchs7xv.js";import"./main-0z1w2zsg.js";import"./main-3gjqfh7a.js";import"./main-q3vsesf9.js";import"./main-8kjxbpw4.js";import"./main-3rxcvgna.js";import"./main-4wndhjdc.js";import"./main-ggcn7rd7.js";import"./main-0904f6ps.js";import{fm as b,mm as h}from"./main-prxxs70n.js";import"./main-n0t3973w.js";import"./main-mv40pcr2.js";import"./main-2yeveeve.js";import"./main-0jys2ccn.js";import"./main-nqveez48.js";import{un as M}from"./main-qsevpgsv.js";h();class _{inner;tracker;constructor(j,B){this.inner=j;this.tracker=B}start(j,B){this.inner.start((G)=>{let J=this.tracker.feed(G);if(J.length>0)j(J)},B)}stop(){this.inner.stop()}drainInput(j,B){return this.inner.drainInput(j,B)}write(j){this.inner.write(j)}get columns(){return this.inner.columns}get rows(){return this.inner.rows}get kittyProtocolActive(){return this.inner.kittyProtocolActive}moveBy(j){this.inner.moveBy(j)}hideCursor(){this.inner.hideCursor()}showCursor(){this.inner.showCursor()}clearLine(){this.inner.clearLine()}clearFromCursor(){this.inner.clearFromCursor()}clearScreen(){this.inner.clearScreen()}setTitle(j){this.inner.setTitle(j)}setProgress(j){this.inner.setProgress(j)}}var E="\x1B[?1004h",N="\x1B[?1004l";function z(j,B){let G=j.replace(/[\x00-\x1f\x7f-\x9f]/g,(J)=>/\s/.test(J)?" ":"").replace(/\s+/g," ").trim();if(B<=0)return"";return G.length>B?`${G.slice(0,B-1)}\u2026`:G}var Y=(j,B)=>(j[B]??"")!=="",g=(j)=>(j.TERM_PROGRAM??"").replace(/[\s_.-]/g,"").toLowerCase();function O(j){let B=g(j),G=j.TERM??"",J=B==="ghostty"||G==="xterm-ghostty"||Y(j,"GHOSTTY_RESOURCES_DIR"),$=B==="itermapp"||B==="iterm"||B==="iterm2"||Y(j,"ITERM_SESSION_ID"),L=B==="kitty"||G==="xterm-kitty"||Y(j,"KITTY_WINDOW_ID"),D=B==="warpterminal"||B==="warp",H=B==="wezterm"||Y(j,"WEZTERM_VERSION");return J||$||L||D||H?"osc9":"bell"}var C=(j)=>Y(j,"TMUX");function I(j,B,G){if(j==="bell")return"\x07";let J=j==="osc9"?`\x1B]9;${B}\x07`:`\x1B]777;notify;rovecode;${B}\x07`;return G?`\x1BPtmux;${J.replace(/\x1b/g,"\x1B\x1B")}\x1B\\`:J}function P(j,B){if(j==="approval")return`approval needed: ${z(B.tool??"",40)} ${z(B.argsPreview??"",40)}`.trimEnd();if(j==="question")return`question: ${z(B.question??"",60)}`;let G=z(B.lastText??"",120);return G?`run finished: ${G}`:"run finished"}var S=(j)=>!Array.isArray(j);function F(j){let B=j.trim();if(B.startsWith("[")){let J;try{J=JSON.parse(B)}catch($){return{error:`not a JSON array (${$ instanceof Error?$.message:String($)})`}}if(!Array.isArray(J)||J.length===0||!J.every(($)=>typeof $==="string"&&$.length>0))return{error:"a JSON array must hold one or more non-empty strings"};return J}let G=B.split(/\s+/).filter((J)=>J.length>0);return G.length===0?{error:"empty command"}:G}class q{focused=!0;feed(j){if(!j.includes("\x1B["))return j;return j.replace(/\x1b\[([IO])/g,(B,G)=>{return this.focused=G==="I",""})}}var i=["auto","bell","osc9","osc777"],s=["unfocused","always"],T=(j)=>(j??"").trim().toLowerCase();function a(j,B={}){let G=B.env??process.env,J=B.settings??b(j),$={...J.user,...J.project},L=[],D,H=T(G.ROVECODE_NOTIFY);if(H==="off")D=void 0;else if(i.includes(H))D=H;else{if(H!=="")L.push(`notify: unknown value "${H}" in ROVECODE_NOTIFY \u2014 off | auto | bell | osc9 | osc777; using the settings files`);D=$.bell===!1?void 0:$.notify??"auto"}let Q=D==="auto"?O(G):D,K=$.notify_when??"unfocused",Z=T(G.ROVECODE_NOTIFY_WHEN);if(s.includes(Z))K=Z;else if(Z!=="")L.push(`notify_when: unknown value "${Z}" in ROVECODE_NOTIFY_WHEN \u2014 unfocused | always; using ${K}`);let V,U,A=G.ROVECODE_NOTIFY_COMMAND;if(A!==void 0&&A.trim()!=="")V=A,U="ROVECODE_NOTIFY_COMMAND";else{if(J.project.notify_command!==void 0)V=J.project.notify_command,U=J.projectPath;else if(J.dropped.includes("notify_command"))L.push(`notify_command: set by ${J.projectPath}, a repository file this machine has not approved \u2014 ignored (rovecode trust show \xB7 rovecode trust; in the TUI: /trust); set it in ~/.rovecode/settings.json or ROVECODE_NOTIFY_COMMAND to use your own`);if(V===void 0&&J.user.notify_command!==void 0)V=J.user.notify_command,U="~/.rovecode/settings.json"}let R;if(V!==void 0){let X=F(V);if(S(X))L.push(`notify_command (${U}): ${X.error} \u2014 the hook is off`);else{let W=x(X),u=k().check(X).decision;if(W!==null)L.push(`notify_command (${U}): "${X.join(" ")}" is a dangerous command (${W}) \u2014 the hook is off`);else if(u==="forbidden")L.push(`notify_command (${U}): execpolicy forbids "${X.join(" ")}" \u2014 the hook is off`);else R=X}}return{...Q!==void 0?{method:Q}:{},when:K,...R!==void 0?{hook:R,hookSource:U}:{},tmux:C(G),notes:L}}var y=400;function o(j,B,G){if(j==="approval")return{type:"approval-requested",cwd:G,tool:B.tool??"","args-preview":B.argsPreview??""};if(j==="question")return{type:"question-requested",cwd:G,question:B.question??""};return{type:"agent-turn-complete",cwd:G,"last-assistant-message":B.lastText??null}}var d=(j,B)=>Bun.spawn(j,B);function r(j=d){return(B)=>{j(B,{stdio:["ignore","ignore","ignore"]}).unref()}}var f=(j)=>j instanceof Error?j.message:String(j);class m{config;cwd;write;focused;spawn;note;seqOff=!1;hookOff=!1;notesShown=!1;decset=!1;constructor(j){this.config=j.config,this.cwd=j.cwd??process.cwd(),this.write=j.write??(()=>{}),this.focused=j.focused??(()=>!0),this.spawn=j.spawn??r(),this.note=j.note??(()=>{})}active(){return this.config.method!==void 0||this.config.hook!==void 0}showNotes(){if(this.notesShown)return;this.notesShown=!0;for(let j of this.config.notes)this.note(j,"warn")}focusOn(){if(this.showNotes(),!this.active())return!1;return this.decset=!0,this.emit(E),!0}focusOff(){if(!this.decset)return;this.decset=!1,this.emit(N)}fire(j,B){if(this.showNotes(),!(this.config.when==="always"||!this.focused()))return;let{method:G,hook:J}=this.config;if(G!==void 0)this.emit(I(G,P(j,B),this.config.tmux));if(J!==void 0&&!this.hookOff)this.runHook(J,o(j,B,this.cwd))}emit(j){if(this.seqOff)return;try{this.write(j)}catch(B){this.seqOff=!0,this.note(`notify: the terminal write failed (${f(B)}) \u2014 terminal notifications are off for this session`,"warn")}}runHook(j,B){try{this.spawn([...j,JSON.stringify(B)])}catch(G){this.hookOff=!0,this.note(`notify_command: could not start ${j[0]} (${f(G)}) \u2014 the hook is off for this session`,"warn")}}}function n(j,B){let G=!1,J=!1,$=!1,L=0,D,H={start(Q,K){let Z=L,V=j.start(Q,K),U=()=>{if(Z===L&&!J)J=!0,$=B.focusOn()};if(V)return V.then(U);U()},stop(){if(L++,$)$=!1,B.focusOff();J=!1,j.stop()},askApproval(Q,K,Z){if(J)B.fire("approval",{tool:Q,argsPreview:K});return j.askApproval(Q,K,Z)},askQuestion(Q,K){if(J)B.fire("question",{question:Q.question});return j.askQuestion(Q,K)},setBusy(Q,K){if(j.setBusy(Q,K),Q){G=!0,D=void 0;return}let Z=G&&K===void 0;if(G=!1,Z&&J)B.fire("run_end",{...D!==void 0?{lastText:D}:{}})},beginAssistant(){let Q=j.beginAssistant(),K="";return{append(Z){if(Q.append(Z),K.length<y)K=(K+Z).slice(0,y)},done(){Q.done(),D=K}}}};return new Proxy(j,{get(Q,K){if(typeof K==="string"&&Object.hasOwn(H,K))return H[K];let Z=Reflect.get(Q,K,Q);return typeof Z==="function"?Z.bind(Q):Z}})}function Qj(j,B=process.env,G=process.stdout,J=process.stdin,$=process.cwd()){let L=G.isTTY===!0,D=L?new q:void 0,H=w(j,B,G,{stdin:J,...D?{focus:D}:{}});if(!H){let{PiTuiRenderer:K}=(v(),M(c)),{ProcessTerminal:Z}=(p(),M(l));H=new K({cwd:$,terminal:D?new _(new Z,D):new Z})}if(J.isTTY!==!0)J.on?.("end",()=>{try{process.exit(0)}catch{}});let Q=new m({config:a($,{env:B}),cwd:$,write:L?(K)=>{G.write(K)}:()=>{},focused:()=>D?.focused??!0,note:(K,Z)=>H.addSystemNote(K,Z)});return n(H,Q)}export{n as withNotifications,a as resolveNotifyConfig,o as payloadFor,Qj as interactiveRenderer,r as defaultSpawner,m as Notifier,s as NOTIFY_WHENS,i as NOTIFY_METHODS};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{dd as d,ed as e,fd as f,gd as g,hd as h,id as i,jd as j,kd as k}from"./main-kyn0xnsg.js";import{hh as a,ih as b,jh as c}from"./main-rg0wn0xf.js";import"./main-0z1w2zsg.js";import"./main-9etavkew.js";import"./main-7rn6bqje.js";import"./main-2yeveeve.js";import"./main-0jys2ccn.js";import"./main-nqveez48.js";import"./main-qsevpgsv.js";k();export{f as saveMcpOAuth,j as runtimeAuthProvider,i as runMcpLoginFlow,a as needsLoginText,d as mcpOAuthId,e as loadMcpOAuth,c as hasStaticAuthorization,g as McpRuntimeAuthProvider,b as McpNeedsLoginError,h as McpLoginAuthProvider};
@@ -1,16 +0,0 @@
1
- // @bun
2
- import{Vh as T}from"./main-k1eqkg83.js";import{Wj as y,Yj as A}from"./main-q3vsesf9.js";import{$j as L,ck as w}from"./main-xg704a3c.js";import{kl as O,ol as _}from"./main-3rxcvgna.js";import"./main-4wndhjdc.js";import"./main-ggcn7rd7.js";import"./main-0904f6ps.js";import"./main-prxxs70n.js";import"./main-n0t3973w.js";import"./main-mv40pcr2.js";import"./main-2yeveeve.js";import"./main-0jys2ccn.js";import"./main-nqveez48.js";import"./main-qsevpgsv.js";_();A();w();import{format as F}from"util";var S=["text","json","ndjson"],U="--output <mode>: text (default) | json | ndjson",M=(j)=>{return process.stderr.write(`error: ${j} \u2014 ${U}
3
- `),process.exit(2)};function E(j){return S.includes(j)}function m(j,J=M){let K=j.slice(2),H;for(let R=0;R<K.length;R++){let Y=K[R];if(Y==="--output"){let $=K[++R];if($===void 0||$.startsWith("-"))return J("--output needs a value");H=$}else if(Y.startsWith("--output="))H=Y.slice(9)}if(H===void 0)return"text";return E(H)?H:J(`unknown --output mode "${H}"`)}function v(j,J){let K=j.cmd==="run"?[...j.rest]:[j.cmd,...j.rest],H=J.slice(2),R=(N)=>N.startsWith("-"),Y=H.findIndex((N,X)=>!R(N)&&!(X>0&&T.has(H[X-1])));if(Y===-1)return K;let $=j.cmd==="run"?Y+1:Y,z=[];H.forEach((N,X)=>{let W=H[X+1];if(!T.has(N)||X<Y||W===void 0||R(W))return;z.push(H.slice($,X+1).filter((D)=>!R(D)).length)});for(let N of z.reverse())K.splice(N,1);return K}async function l(j,J={}){if(j.isTTY===!0)return"";let K=J.firstByteMs??3000,H=J.maxChars??1e6;return new Promise((R)=>{let Y=[],$=!1,z=!1,N=()=>{if(z)return;z=!0,clearTimeout(X);let W=Buffer.concat(Y).toString("utf8");if(W.length>H)J.note?.(`stdin: ${W.length.toLocaleString("en-US")} characters piped in \u2014 kept the first ${H.toLocaleString("en-US")}`);R(W.slice(0,H))},X=setTimeout(()=>{if($||z)return;J.note?.(`stdin: not a terminal, but nothing arrived in ${K/1000} s \u2014 ignored (pipe your input, or pass --no-stdin)`);try{j.pause?.()}catch{}N()},K);j.on("data",(W)=>{$=!0,Y.push(Buffer.isBuffer(W)?W:Buffer.from(W))}),j.on("end",N),j.on("close",N),j.on("error",N);try{j.resume?.()}catch{N()}})}function c(j,J){let K=J.replace(/\r\n?/g,`
4
- `).replace(/\n+$/,"");if(K.length===0)return j;let H="```";while(K.includes(H))H+="`";return`${j.trim().length>0?j.trim():"Here is the input:"}
5
-
6
- ${H}
7
- ${K}
8
- ${H}`}function I(j){let J={log:console.log,info:console.info,debug:console.debug,write:process.stdout.write},K=(...H)=>{j.write(`${F(...H)}
9
- `)};return console.log=K,console.info=K,console.debug=K,process.stdout.write=(H)=>{return j.write(typeof H==="string"?H:new TextDecoder().decode(H)),!0},{restore(){console.log=J.log,console.info=J.info,console.debug=J.debug,process.stdout.write=J.write}}}function C(j){if(j==="done")return 0;if(j==="stopped")return 130;return 1}var k=(j)=>{try{process.once("SIGINT",j)}catch{return()=>{}}return()=>{try{process.off("SIGINT",j)}catch{}}};function r(j,J){let K=Date.now(),H=J.stdout===process.stdout,R=H?{write:process.stdout.write.bind(process.stdout)}:J.stdout,Y=j!=="text"&&H?I(J.stderr):null,$=new AbortController,z=(J.onInterrupt??k)(()=>$.abort()),N=null,X=0,W=0,D=new Map,b=(q)=>{let Q=`${W}:${q}`,Z=D.get(Q)??{id:q,ok:!1};return D.set(Q,Z),Z},P=(q)=>{if(j==="text")R.write(`${q}
10
- `);else if(j==="json")J.stderr.write(`${q}
11
- `)};return{mode:j,signal:$.signal,onEvent(q){if(j==="ndjson")R.write(`${JSON.stringify(q)}
12
- `);if(q.type==="run_start")N=q.sessionId,X=J.messages().length;else if(q.type==="turn_start")W=q.turn;else if(q.type==="tool_execution_start")b(q.callId).tool=q.tool,P(`\u2192 ${q.tool} ${String(JSON.stringify(q.args)).slice(0,100)}`);else if(q.type==="tool_execution_end")Object.assign(b(q.callId),{ok:q.ok,ms:q.durationMs}),P(`\u2190 ${q.ok?"ok":"FAIL"} ${q.output.slice(0,200).replace(/\n/g," \u23CE ")}`);else if(q.type==="tool_call_failed")b(q.callId).ok=!1;else if(q.type==="verify")P(q.state==="running"?`\u2192 verify ${q.command.slice(0,100)}`:`\u2190 ${q.state==="passed"?"ok":"FAIL"} verify ${q.detail??q.state}`)},finish(q){z();let Q=C(q?.status);if(j==="text"){if(q)R.write(`
13
- ${q.summary}
14
- `);if(q?.status==="done"&&q.outstanding){let B=O(q.outstanding);if(B!==null)R.write(`done \xB7 ${B}
15
- `)}return Q}let Z=f(q??{status:"error",summary:"stream ended without run_end"},Q,N,J.model,J.messages().slice(X),[...D.values()],J.catalog??new L,Date.now()-K);return R.write(`${JSON.stringify(j==="json"?Z:{type:"result",...Z})}
16
- `),Q},close(){Y?.restore()}}}function i(j,J,K){return{stream:J,registry:j.registry,store:j.store,tools:j.registry.list().map((H)=>H.schema),guard:j.guard,planReminder:j.planReminder,cwd:j.cwd,signal:K.signal,hooks:j.hooks}}function f(j,J,K,H,R,Y,$,z){let N=R.filter((q)=>q.role==="assistant"),X={input:0,output:0,cacheRead:0,cacheWrite:0},W=0;for(let q of N){let Q=q.usage;if(!Q)continue;let Z={input:Q.input,output:Q.output,cacheRead:Q.cacheRead??0,cacheWrite:Q.cacheWrite??0};if(X.input+=Z.input,X.output+=Z.output,X.cacheRead+=Z.cacheRead,X.cacheWrite+=Z.cacheWrite,W===null||Z.input===0&&Z.output===0&&Z.cacheRead===0&&Z.cacheWrite===0)continue;let B=q.origin??H,V=$.lookup(B.provider,B.model)?.pricing,G=V?y(Z,V):void 0;W=G===void 0?null:W+G}let D=new Map;for(let q of N)for(let Q of q.parts)if(Q.kind==="tool_call")D.set(Q.id,[...D.get(Q.id)??[],Q.tool]);let b=new Map,P=N.at(-1)?.origin;return{status:j.status,summary:j.summary,sessionId:K,...j.outstanding?{outstanding:j.outstanding}:{},model:{provider:H.provider,model:H.model},origin:P?{provider:P.provider,model:P.model}:null,usage:X,costUsd:W,toolCalls:Y.map((q)=>{let Q=b.get(q.id)??0;return b.set(q.id,Q+1),{tool:q.tool??D.get(q.id)?.[Q]??"unknown",ok:q.ok,...q.ms!==void 0?{ms:q.ms}:{}}}),durationMs:z,exitCode:J}}export{c as withPipedInput,v as runPromptWords,l as readPipedStdin,m as parseOutputMode,I as guardStdout,C as exitCodeFor,r as createOutputSink,i as buildRunDeps,S as OUTPUT_MODES};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Aj as h,Bj as i,Cj as j,Dj as k,Ej as l,Fj as m,tj as a,uj as b,vj as c,wj as d,xj as e,yj as f,zj as g}from"./main-90ds1z4e.js";import"./main-2yeveeve.js";import"./main-0jys2ccn.js";import"./main-qsevpgsv.js";export{i as wireProfileFor,m as profileWire,l as profilePromptSection,k as profileOverridePaths,j as profileHint,h as profileFor,c as SONNET_5_VOICE,b as SONNET_5_PERSONA,g as PROFILES,e as GLM_53_PROFILE,f as GLM_53_PLAIN_PROFILE,d as GLM_53_MODEL_RE,a as GLM_53_AGENT_CONTRACT};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{$i as i,Ti as a,Ui as b,Vi as c,Wi as d,Xi as e,Yi as f,Zi as g,_i as h,aj as j,bj as k,cj as l,dj as m,ej as n,fj as o,gj as p}from"./main-sdmxhtv8.js";import"./main-2yeveeve.js";import"./main-0jys2ccn.js";import"./main-qsevpgsv.js";export{i as writeProvidersFile,g as validateSpec,b as userProvidersPath,j as resolveKey,h as readProvidersFile,d as providersPathFor,c as projectProvidersPath,o as pickDefault,n as parseSelector,l as isConfigured,f as inferProtocol,k as envCustomProvider,m as buildSnapshot,p as ProviderConfig,e as PROVIDER_ID_RE,a as BUILTIN_PROVIDERS};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{he as a,ie as b,je as c}from"./main-ck9asesq.js";import"./main-cta9racd.js";import"./main-k2y8a2aw.js";import"./main-875s60s2.js";import"./main-sdmxhtv8.js";import"./main-pknhvrmj.js";import"./main-1k1kw6b5.js";import"./main-90ds1z4e.js";import"./main-9etavkew.js";import"./main-q3vsesf9.js";import"./main-xg704a3c.js";import"./main-8kjxbpw4.js";import"./main-3rxcvgna.js";import"./main-4wndhjdc.js";import"./main-ggcn7rd7.js";import"./main-0904f6ps.js";import"./main-prxxs70n.js";import"./main-n0t3973w.js";import"./main-mv40pcr2.js";import"./main-2yeveeve.js";import"./main-0jys2ccn.js";import"./main-nqveez48.js";import"./main-qsevpgsv.js";export{b as providerListTool,c as providerEditTool,a as looksLikeSecret};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Bg as a,Cg as b,Dg as c,Eg as d,Fg as e,Gg as f,Hg as g,Ig as h,Jg as i,Kg as j}from"./main-cta9racd.js";import"./main-k2y8a2aw.js";import"./main-875s60s2.js";import"./main-sdmxhtv8.js";import"./main-pknhvrmj.js";import"./main-1k1kw6b5.js";import"./main-90ds1z4e.js";import"./main-9etavkew.js";import"./main-q3vsesf9.js";import"./main-xg704a3c.js";import"./main-8kjxbpw4.js";import"./main-3rxcvgna.js";import"./main-4wndhjdc.js";import"./main-ggcn7rd7.js";import"./main-0904f6ps.js";import"./main-prxxs70n.js";import"./main-n0t3973w.js";import"./main-mv40pcr2.js";import"./main-2yeveeve.js";import"./main-0jys2ccn.js";import"./main-nqveez48.js";import"./main-qsevpgsv.js";export{a as toWireConfig,e as scrubSecret,h as parseAddArgs,j as formatProviderList,i as formatProviderLine,b as defaultAdapterFactory,d as configErrorTurn,f as ProviderRegistry,c as CONFIG_ERROR_PREFIX,g as ADD_USAGE};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Ac as i,Bc as j,sc as a,tc as b,uc as c,vc as d,wc as e,xc as f,yc as g,zc as h}from"./main-zaqh35jg.js";import"./main-vqak588n.js";import"./main-7rn6bqje.js";import"./main-2yeveeve.js";import"./main-0jys2ccn.js";import"./main-nqveez48.js";import"./main-qsevpgsv.js";j();export{g as searchMarket,f as itemFromMcp,e as itemFromCatalog,h as findItem,d as capBytes,i as allItems,c as MCP_DOCS_FILE,b as CATALOG_FILES,a as CATALOG_DIR};