rovecode 0.3.2 → 0.4.0-beta.2

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 (491) hide show
  1. package/CHANGELOG.md +512 -0
  2. package/README.md +33 -45
  3. package/bin/rovecode.js +24 -0
  4. package/dist/cli/app-dybnr56b.js +2 -0
  5. package/dist/cli/ask-user-p8hq4xgj.js +2 -0
  6. package/dist/cli/auth-login-ewpgw5sm.js +2 -0
  7. package/dist/cli/auth-m8p9grty.js +2 -0
  8. package/dist/cli/bench-xv3ypwev.js +9 -0
  9. package/dist/cli/catalog-737wb2s0.js +2 -0
  10. package/dist/cli/cli-arhg40m0.js +2 -0
  11. package/dist/cli/client-cf2pxx8q.js +2 -0
  12. package/dist/cli/commands-3p7e4xxs.js +2 -0
  13. package/dist/cli/connect-3q93d7cb.js +2 -0
  14. package/dist/cli/context-cmd-eqxmxhzq.js +2 -0
  15. package/dist/cli/context-report-hbw9zfes.js +2 -0
  16. package/dist/cli/count-remote-mby98cd0.js +2 -0
  17. package/dist/cli/design-122y0axd.js +2 -0
  18. package/dist/cli/dispatch-b4egzvvh.js +2 -0
  19. package/dist/cli/doctor-x4jkv72e.js +3 -0
  20. package/dist/cli/executor-ftvg6tsy.js +2 -0
  21. package/dist/cli/export-pdgdhkch.js +2 -0
  22. package/dist/cli/files-cez9a96p.js +2 -0
  23. package/dist/cli/gauntlet-r3xxaszc.js +2 -0
  24. package/dist/cli/gauntlet-runner-r515m7kk.js +10 -0
  25. package/dist/cli/gauntlet-wave3-bnkjk2v2.js +5 -0
  26. package/dist/cli/gauntlet-wave4-acs9s60q.js +14 -0
  27. package/dist/cli/hashline-ewg5hbe3.js +2 -0
  28. package/dist/cli/http-n0kehsk8.js +5 -0
  29. package/dist/cli/index-z5qt1s76.js +2 -0
  30. package/dist/cli/install-80mp63kx.js +2 -0
  31. package/dist/cli/loop-12twjcat.js +2 -0
  32. package/dist/cli/main-01pv9206.js +4 -0
  33. package/dist/cli/main-0jys2ccn.js +3 -0
  34. package/dist/cli/main-1ztz6fkj.js +10 -0
  35. package/dist/cli/main-23q7cmww.js +9 -0
  36. package/dist/cli/main-2rzbexn2.js +3 -0
  37. package/dist/cli/main-2wyax8k9.js +9 -0
  38. package/dist/cli/main-2yeveeve.js +6 -0
  39. package/dist/cli/main-2z3dek0b.js +3 -0
  40. package/dist/cli/main-2zgsknth.js +3 -0
  41. package/dist/cli/main-45ejth3a.js +4 -0
  42. package/dist/cli/main-45rn3trk.js +22 -0
  43. package/dist/cli/main-4p4e2w7x.js +4 -0
  44. package/dist/cli/main-4y0tnfpa.js +16 -0
  45. package/dist/cli/main-5py0rkmc.js +4 -0
  46. package/dist/cli/main-6dtqmbt6.js +7 -0
  47. package/dist/cli/main-6h9x282m.js +4 -0
  48. package/dist/cli/main-6vjeds42.js +3 -0
  49. package/dist/cli/main-78gq4bt9.js +6 -0
  50. package/dist/cli/main-7jd5vh3x.js +4 -0
  51. package/dist/cli/main-7kt6r53y.js +4 -0
  52. package/dist/cli/main-8c1tbazx.js +58 -0
  53. package/dist/cli/main-9a9rnh47.js +19 -0
  54. package/dist/cli/main-9ht36z12.js +3 -0
  55. package/dist/cli/main-a2yfvcy9.js +7 -0
  56. package/dist/cli/main-a3f51n0x.js +5 -0
  57. package/dist/cli/main-b8zq261k.js +3 -0
  58. package/dist/cli/main-bxtvnf6d.js +13 -0
  59. package/dist/cli/main-edxc3yzt.js +4 -0
  60. package/dist/cli/main-evgz4mp5.js +21 -0
  61. package/dist/cli/main-f33fc5je.js +9 -0
  62. package/dist/cli/main-fvnpq46y.js +12 -0
  63. package/dist/cli/main-gbbty4d4.js +3 -0
  64. package/dist/cli/main-gth53dnt.js +25 -0
  65. package/dist/cli/main-hqbz10aw.js +9 -0
  66. package/dist/cli/main-hrrvcfan.js +38 -0
  67. package/dist/cli/main-hzwtsb2m.js +5 -0
  68. package/dist/cli/main-j7ttv0sd.js +34 -0
  69. package/dist/cli/main-jak598k9.js +5 -0
  70. package/dist/cli/main-kba6zeyd.js +6 -0
  71. package/dist/cli/main-kwwsz6rq.js +3 -0
  72. package/dist/cli/main-m8vm17zq.js +3 -0
  73. package/dist/cli/main-mg4f96e1.js +3 -0
  74. package/dist/cli/main-mg9b20ac.js +18 -0
  75. package/dist/cli/main-mgb9ccnx.js +3 -0
  76. package/dist/cli/main-mjt2p7aj.js +3 -0
  77. package/dist/cli/main-n6qrdbmy.js +3 -0
  78. package/dist/cli/main-na7wse0x.js +5 -0
  79. package/dist/cli/main-nqveez48.js +4 -0
  80. package/dist/cli/main-ntqef02r.js +10 -0
  81. package/dist/cli/main-nvc3yjay.js +136 -0
  82. package/dist/cli/main-p0cfn6nr.js +16 -0
  83. package/dist/cli/main-qj2djy17.js +19 -0
  84. package/dist/cli/main-qsevpgsv.js +3 -0
  85. package/dist/cli/main-qvarybsp.js +3 -0
  86. package/dist/cli/main-rebtt91r.js +5 -0
  87. package/dist/cli/main-rpg7h8mb.js +3 -0
  88. package/dist/cli/main-rsy72qmw.js +15 -0
  89. package/dist/cli/main-rvetps99.js +18 -0
  90. package/dist/cli/main-s4bb0jav.js +3 -0
  91. package/dist/cli/main-s9v8k74e.js +3 -0
  92. package/dist/cli/main-tjvwmscs.js +3 -0
  93. package/dist/cli/main-tkgarpjj.js +4 -0
  94. package/dist/cli/main-v8y60bb2.js +3 -0
  95. package/dist/cli/main-vhrrq337.js +3 -0
  96. package/dist/cli/main-vp2dfb7s.js +4 -0
  97. package/dist/cli/main-vqbr22sz.js +8 -0
  98. package/dist/cli/main-vxnwe5xx.js +18 -0
  99. package/dist/cli/main-wgph00xf.js +5 -0
  100. package/dist/cli/main-wk2csfnj.js +5 -0
  101. package/dist/cli/main-wm997zjx.js +3 -0
  102. package/dist/cli/main-wpkyraxh.js +3 -0
  103. package/dist/cli/main-wqt32p5x.js +4 -0
  104. package/dist/cli/main-x9ct6y1a.js +3 -0
  105. package/dist/cli/main-xfekqh9m.js +7 -0
  106. package/dist/cli/main-xt9zc3n6.js +7 -0
  107. package/dist/cli/main-xx2z3zh5.js +4 -0
  108. package/dist/cli/main-y5c82rxr.js +3 -0
  109. package/dist/cli/main-yrjt2sqt.js +14 -0
  110. package/dist/cli/main-ys6zj3yr.js +3 -0
  111. package/dist/cli/main-ywbxshqc.js +8 -0
  112. package/dist/cli/main-z13755t8.js +25 -0
  113. package/dist/cli/main-zc7pyrbj.js +4 -0
  114. package/dist/cli/main.js +279 -0
  115. package/dist/cli/market-cmd-bm5xvn9f.js +5 -0
  116. package/dist/cli/mcp-login-bthtfpt7.js +2 -0
  117. package/dist/cli/mcp-market-cmd-mbeshfyd.js +2 -0
  118. package/dist/cli/notify-54v5z9dz.js +2 -0
  119. package/dist/cli/oauth-g5gme95c.js +2 -0
  120. package/dist/cli/output-satndjap.js +16 -0
  121. package/dist/cli/profiles-sfhpbq3m.js +2 -0
  122. package/dist/cli/provider-config-hv3xtdt4.js +2 -0
  123. package/dist/cli/provider-kwzq6g84.js +2 -0
  124. package/dist/cli/registry-fh0hdnyn.js +2 -0
  125. package/dist/cli/registry-y1y8e94r.js +2 -0
  126. package/dist/cli/repl-t4z03mqq.js +11 -0
  127. package/dist/cli/resume-fqt4chg8.js +2 -0
  128. package/dist/cli/run-flags-rysbag9t.js +2 -0
  129. package/dist/cli/runtime-j19fjbsa.js +2 -0
  130. package/dist/cli/sandbox-config-g4qxd7y5.js +2 -0
  131. package/dist/cli/server-r0b6bksk.js +5 -0
  132. package/dist/cli/session-arg-txmn5g4x.js +2 -0
  133. package/dist/cli/session-ed250d9j.js +2 -0
  134. package/dist/cli/sessions-cmd-adw7svfn.js +7 -0
  135. package/dist/cli/settings-y9rzcqx8.js +2 -0
  136. package/dist/cli/setup-jmbr11j0.js +2 -0
  137. package/dist/cli/sextant-smoke-tcth0vea.js +5 -0
  138. package/dist/cli/skills-cmd-zbdy99v6.js +2 -0
  139. package/dist/cli/smoke-1bg937kx.js +8 -0
  140. package/dist/cli/start-chat-p01cdks3.js +12 -0
  141. package/dist/cli/stream-4wmyaypz.js +2 -0
  142. package/dist/cli/task-eg4s093s.js +2 -0
  143. package/dist/cli/tasks-12v9rr9k.js +2 -0
  144. package/dist/cli/thinking-a5ngvqyh.js +2 -0
  145. package/dist/cli/todo-1wxpcecx.js +2 -0
  146. package/dist/cli/tools-2ftsya7w.js +2 -0
  147. package/dist/cli/tools-x1tj4fxm.js +2 -0
  148. package/dist/cli/trust-cmd-hccxehzb.js +2 -0
  149. package/dist/cli/update-check-ygt3vd7m.js +2 -0
  150. package/dist/cli/update-cmd-v23qhr8c.js +2 -0
  151. package/dist/cli/voice-g1gtck92.js +2 -0
  152. package/dist/cli/webfetch-0nnrjgb5.js +2 -0
  153. package/dist/cli/websearch-f0vr2p7d.js +2 -0
  154. package/dist/cli/workspace-9rq1w4ta.js +2 -0
  155. package/dist/lib/index.js +62 -0
  156. package/dist/lib/models-index.json +1 -0
  157. package/dist/lib/plugins.js +6 -0
  158. package/dist/lib/providers.js +17 -0
  159. package/dist/lib/public-api.js +20 -0
  160. package/dist/rovecode.exe +4 -0
  161. package/package.json +38 -11
  162. package/bin/rovecode.ts +0 -21
  163. package/src/acp/server.ts +0 -374
  164. package/src/cli/auth-login.ts +0 -122
  165. package/src/cli/connect.ts +0 -244
  166. package/src/cli/context-cmd.ts +0 -199
  167. package/src/cli/dispatch.ts +0 -82
  168. package/src/cli/doctor.ts +0 -362
  169. package/src/cli/export.ts +0 -276
  170. package/src/cli/help.ts +0 -293
  171. package/src/cli/is-tui-invocation.ts +0 -8
  172. package/src/cli/main.ts +0 -583
  173. package/src/cli/market-cmd.ts +0 -658
  174. package/src/cli/mcp-login.ts +0 -141
  175. package/src/cli/mcp-market-cmd.ts +0 -302
  176. package/src/cli/output.ts +0 -382
  177. package/src/cli/repl.ts +0 -250
  178. package/src/cli/repomap-root.ts +0 -14
  179. package/src/cli/resume.ts +0 -57
  180. package/src/cli/run-flags.ts +0 -43
  181. package/src/cli/run-limits.ts +0 -78
  182. package/src/cli/runtime.ts +0 -931
  183. package/src/cli/session-arg.ts +0 -30
  184. package/src/cli/sessions-cmd.ts +0 -145
  185. package/src/cli/setup.ts +0 -153
  186. package/src/cli/skills-cmd.ts +0 -194
  187. package/src/cli/start-chat.ts +0 -65
  188. package/src/cli/trust-cmd.ts +0 -52
  189. package/src/coding/bash.ts +0 -148
  190. package/src/coding/checkpoints.ts +0 -327
  191. package/src/coding/diff.ts +0 -138
  192. package/src/coding/files.ts +0 -341
  193. package/src/coding/hashline.ts +0 -274
  194. package/src/coding/lsp-gate.ts +0 -254
  195. package/src/coding/lsp-servers.ts +0 -147
  196. package/src/coding/lsp.ts +0 -283
  197. package/src/coding/repomap-cache.ts +0 -99
  198. package/src/coding/repomap-files.ts +0 -192
  199. package/src/coding/repomap.ts +0 -481
  200. package/src/core/agents.ts +0 -255
  201. package/src/core/compaction.ts +0 -259
  202. package/src/core/config.ts +0 -289
  203. package/src/core/context-report.ts +0 -228
  204. package/src/core/context.ts +0 -60
  205. package/src/core/count-remote.ts +0 -107
  206. package/src/core/execpolicy-rules.ts +0 -196
  207. package/src/core/execpolicy.ts +0 -385
  208. package/src/core/executor.ts +0 -454
  209. package/src/core/guardrails.ts +0 -400
  210. package/src/core/hooks.ts +0 -411
  211. package/src/core/images.ts +0 -230
  212. package/src/core/intro.ts +0 -266
  213. package/src/core/loop.ts +0 -567
  214. package/src/core/modes.ts +0 -372
  215. package/src/core/orchestrator.ts +0 -245
  216. package/src/core/proc-group.ts +0 -48
  217. package/src/core/project-trust.ts +0 -98
  218. package/src/core/reflection.ts +0 -165
  219. package/src/core/sandbox-config.ts +0 -186
  220. package/src/core/session-id.ts +0 -24
  221. package/src/core/session-images.ts +0 -73
  222. package/src/core/session-ops.ts +0 -183
  223. package/src/core/session-text.ts +0 -29
  224. package/src/core/session.ts +0 -469
  225. package/src/core/settings.ts +0 -170
  226. package/src/core/tasks.ts +0 -646
  227. package/src/core/token-scale.ts +0 -108
  228. package/src/core/tools.ts +0 -309
  229. package/src/core/trust.ts +0 -104
  230. package/src/core/types.ts +0 -330
  231. package/src/core/update-check.ts +0 -171
  232. package/src/core/usage.ts +0 -204
  233. package/src/core/validate.ts +0 -121
  234. package/src/core/verify-gate.ts +0 -159
  235. package/src/core/verify.ts +0 -236
  236. package/src/core/voice.ts +0 -158
  237. package/src/core/win-job.ts +0 -183
  238. package/src/core/workspace.ts +0 -184
  239. package/src/design/audit.ts +0 -797
  240. package/src/design/direction.ts +0 -190
  241. package/src/design/rules.ts +0 -157
  242. package/src/eval/bench.ts +0 -150
  243. package/src/eval/gauntlet-runner.ts +0 -215
  244. package/src/eval/gauntlet-support.ts +0 -84
  245. package/src/eval/gauntlet-wave3.ts +0 -269
  246. package/src/eval/gauntlet-wave4.ts +0 -217
  247. package/src/eval/gauntlet.ts +0 -253
  248. package/src/index.ts +0 -17
  249. package/src/lanes/agy.ts +0 -95
  250. package/src/lanes/approval.ts +0 -24
  251. package/src/lanes/claude.ts +0 -129
  252. package/src/lanes/codex.ts +0 -127
  253. package/src/lanes/events.ts +0 -130
  254. package/src/lanes/job.ts +0 -142
  255. package/src/lanes/opencode.ts +0 -122
  256. package/src/lanes/process.ts +0 -184
  257. package/src/lanes/progress.ts +0 -183
  258. package/src/lanes/registry.ts +0 -178
  259. package/src/lanes/runner.ts +0 -124
  260. package/src/lanes/types.ts +0 -112
  261. package/src/market/catalogs/mcp-docs.json +0 -111
  262. package/src/market/catalogs/plugins.json +0 -111
  263. package/src/market/catalogs/skills.json +0 -478
  264. package/src/market/clone.ts +0 -72
  265. package/src/market/context-cost.ts +0 -121
  266. package/src/market/digest.ts +0 -106
  267. package/src/market/index.ts +0 -22
  268. package/src/market/install.ts +0 -578
  269. package/src/market/manifest.ts +0 -187
  270. package/src/market/prereq.ts +0 -145
  271. package/src/market/registry.ts +0 -363
  272. package/src/market/resolve.ts +0 -111
  273. package/src/market/types.ts +0 -236
  274. package/src/market/validate.ts +0 -227
  275. package/src/mcp/client.ts +0 -449
  276. package/src/mcp/config.ts +0 -252
  277. package/src/mcp/local-package.ts +0 -211
  278. package/src/mcp/market-catalog.ts +0 -84
  279. package/src/mcp/market-install.ts +0 -289
  280. package/src/mcp/market.ts +0 -362
  281. package/src/mcp/oauth.ts +0 -251
  282. package/src/mcp/prompts-resources.ts +0 -249
  283. package/src/mcp/shared.ts +0 -149
  284. package/src/mcp/status.ts +0 -67
  285. package/src/mcp/tools.ts +0 -275
  286. package/src/mcp/transport.ts +0 -122
  287. package/src/mcp/trust.ts +0 -25
  288. package/src/memory/blocks.ts +0 -278
  289. package/src/memory/recall.ts +0 -355
  290. package/src/memory/scope.ts +0 -182
  291. package/src/memory/store.ts +0 -105
  292. package/src/memory/tools.ts +0 -99
  293. package/src/plugins/cli.ts +0 -119
  294. package/src/plugins/discover.ts +0 -108
  295. package/src/plugins/index.ts +0 -50
  296. package/src/plugins/install.ts +0 -184
  297. package/src/plugins/load.ts +0 -124
  298. package/src/plugins/manifest.ts +0 -92
  299. package/src/plugins/state.ts +0 -83
  300. package/src/providers/auth.ts +0 -408
  301. package/src/providers/cache.ts +0 -223
  302. package/src/providers/catalog-local.ts +0 -160
  303. package/src/providers/catalog.ts +0 -421
  304. package/src/providers/middleware-context.ts +0 -86
  305. package/src/providers/middleware.ts +0 -373
  306. package/src/providers/model-list.ts +0 -23
  307. package/src/providers/oauth/common.ts +0 -105
  308. package/src/providers/oauth/device-code.ts +0 -107
  309. package/src/providers/oauth/github-copilot.ts +0 -146
  310. package/src/providers/oauth/loopback.ts +0 -158
  311. package/src/providers/oauth/openai.ts +0 -163
  312. package/src/providers/oauth/openrouter.ts +0 -89
  313. package/src/providers/oauth/pkce.ts +0 -45
  314. package/src/providers/oauth/registry.ts +0 -39
  315. package/src/providers/oauth/seam.ts +0 -89
  316. package/src/providers/profile-glm53.ts +0 -111
  317. package/src/providers/profile-sonnet5-persona.ts +0 -65
  318. package/src/providers/profile-sonnet5-voice.ts +0 -23
  319. package/src/providers/profiles.ts +0 -156
  320. package/src/providers/provider-config.ts +0 -311
  321. package/src/providers/registry.ts +0 -333
  322. package/src/providers/responses.ts +0 -209
  323. package/src/providers/retry.ts +0 -234
  324. package/src/providers/router.ts +0 -294
  325. package/src/providers/sse.ts +0 -26
  326. package/src/providers/stream-errors.ts +0 -117
  327. package/src/providers/stream.ts +0 -566
  328. package/src/providers/thinking.ts +0 -189
  329. package/src/providers/wire-messages.ts +0 -129
  330. package/src/providers/wire-responses.ts +0 -79
  331. package/src/providers/wire-select.ts +0 -53
  332. package/src/server/http.ts +0 -291
  333. package/src/server/openapi.ts +0 -246
  334. package/src/sextant/card-hits.ts +0 -102
  335. package/src/sextant/card-keys.ts +0 -55
  336. package/src/sextant/context-source.ts +0 -157
  337. package/src/sextant/crew-cards.ts +0 -350
  338. package/src/sextant/draw-agents.ts +0 -273
  339. package/src/sextant/draw-code.ts +0 -388
  340. package/src/sextant/draw-context.ts +0 -222
  341. package/src/sextant/draw-frame.ts +0 -164
  342. package/src/sextant/draw-market.ts +0 -573
  343. package/src/sextant/draw-messages.ts +0 -386
  344. package/src/sextant/draw-pet.ts +0 -230
  345. package/src/sextant/draw-plan.ts +0 -187
  346. package/src/sextant/draw-tabs.ts +0 -85
  347. package/src/sextant/draw-util.ts +0 -65
  348. package/src/sextant/draw-wizard.ts +0 -378
  349. package/src/sextant/engine.ts +0 -230
  350. package/src/sextant/frame-hits.ts +0 -25
  351. package/src/sextant/frame.ts +0 -101
  352. package/src/sextant/git-status.ts +0 -197
  353. package/src/sextant/grid.ts +0 -59
  354. package/src/sextant/input.ts +0 -119
  355. package/src/sextant/keys.ts +0 -521
  356. package/src/sextant/layout.ts +0 -86
  357. package/src/sextant/local-commands.ts +0 -169
  358. package/src/sextant/market-source.ts +0 -287
  359. package/src/sextant/mentions.ts +0 -200
  360. package/src/sextant/message-hits.ts +0 -26
  361. package/src/sextant/model.ts +0 -387
  362. package/src/sextant/overlays.ts +0 -456
  363. package/src/sextant/panel-hits.ts +0 -38
  364. package/src/sextant/pet.ts +0 -399
  365. package/src/sextant/screen.ts +0 -324
  366. package/src/sextant/scroll-hits.ts +0 -66
  367. package/src/sextant/scrollbar.ts +0 -82
  368. package/src/sextant/sextant-bridge.ts +0 -174
  369. package/src/sextant/sextant-cards.ts +0 -142
  370. package/src/sextant/sextant-diff-base.ts +0 -63
  371. package/src/sextant/sextant-files.ts +0 -154
  372. package/src/sextant/sextant-frame-loop.ts +0 -335
  373. package/src/sextant/sextant-renderer.ts +0 -574
  374. package/src/sextant/sextant-repo.ts +0 -140
  375. package/src/sextant/theme.ts +0 -66
  376. package/src/sextant/tool-rows.ts +0 -189
  377. package/src/sextant/types.ts +0 -493
  378. package/src/skills/index.ts +0 -387
  379. package/src/skills/pack.ts +0 -220
  380. package/src/skills/spec.ts +0 -162
  381. package/src/skills/tools.ts +0 -69
  382. package/src/skills/versioned.ts +0 -227
  383. package/src/telemetry/otel-export.ts +0 -122
  384. package/src/telemetry/otel-lanes.ts +0 -89
  385. package/src/telemetry/otel-logs.ts +0 -131
  386. package/src/telemetry/otel-metrics.ts +0 -136
  387. package/src/telemetry/otel.ts +0 -397
  388. package/src/telemetry/otlp.ts +0 -76
  389. package/src/tools/ask-user.ts +0 -156
  390. package/src/tools/bash-bg.ts +0 -94
  391. package/src/tools/bash-jobs.ts +0 -237
  392. package/src/tools/design.ts +0 -151
  393. package/src/tools/evalcell.ts +0 -338
  394. package/src/tools/html-text.ts +0 -139
  395. package/src/tools/provider.ts +0 -149
  396. package/src/tools/task.ts +0 -250
  397. package/src/tools/todo.ts +0 -320
  398. package/src/tools/webfetch.ts +0 -332
  399. package/src/tools/websearch.ts +0 -359
  400. package/src/tui/agents-cmd.ts +0 -41
  401. package/src/tui/app.ts +0 -749
  402. package/src/tui/attach.ts +0 -127
  403. package/src/tui/boot-notes.ts +0 -41
  404. package/src/tui/builtin-prompts.ts +0 -59
  405. package/src/tui/checkpoints-cmd.ts +0 -70
  406. package/src/tui/clipboard-image.ts +0 -81
  407. package/src/tui/clipboard.ts +0 -78
  408. package/src/tui/commands.ts +0 -283
  409. package/src/tui/config-view.ts +0 -53
  410. package/src/tui/context-cmds.ts +0 -282
  411. package/src/tui/cost.ts +0 -108
  412. package/src/tui/crash-guard.ts +0 -173
  413. package/src/tui/focus-terminal.ts +0 -34
  414. package/src/tui/git-cmds.ts +0 -273
  415. package/src/tui/git-plain.ts +0 -58
  416. package/src/tui/info-cmd.ts +0 -150
  417. package/src/tui/input-plain.ts +0 -76
  418. package/src/tui/mcp-cmd.ts +0 -128
  419. package/src/tui/memory-note.ts +0 -77
  420. package/src/tui/modes-cmd.ts +0 -45
  421. package/src/tui/notify-seq.ts +0 -100
  422. package/src/tui/notify.ts +0 -318
  423. package/src/tui/overlays.ts +0 -97
  424. package/src/tui/pi-renderer.ts +0 -428
  425. package/src/tui/providers-cmd.ts +0 -377
  426. package/src/tui/reasoning-view.ts +0 -56
  427. package/src/tui/renderer.ts +0 -128
  428. package/src/tui/replay-marker.ts +0 -29
  429. package/src/tui/session-cmd.ts +0 -148
  430. package/src/tui/session-manage.ts +0 -95
  431. package/src/tui/sextant-attach.ts +0 -102
  432. package/src/tui/sextant-io.ts +0 -202
  433. package/src/tui/sextant-smoke.ts +0 -110
  434. package/src/tui/shell-cmd.ts +0 -158
  435. package/src/tui/smoke.ts +0 -72
  436. package/src/tui/staged-terminal.ts +0 -50
  437. package/src/tui/startup.ts +0 -12
  438. package/src/tui/theme.ts +0 -59
  439. package/src/tui/todo-label.ts +0 -7
  440. package/src/tui/trust-card.ts +0 -107
  441. package/src/tui/tui-commands.ts +0 -87
  442. package/tsconfig.json +0 -30
  443. package/vendor/pi-tui/LICENSE +0 -21
  444. package/vendor/pi-tui/PATCHES.md +0 -12
  445. package/vendor/pi-tui/PROVENANCE.md +0 -12
  446. package/vendor/pi-tui/README.upstream.md +0 -854
  447. package/vendor/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  448. package/vendor/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  449. package/vendor/pi-tui/src/alt-screen-search.ts +0 -158
  450. package/vendor/pi-tui/src/autocomplete.ts +0 -827
  451. package/vendor/pi-tui/src/components/alt-screen-flash.ts +0 -52
  452. package/vendor/pi-tui/src/components/box.ts +0 -138
  453. package/vendor/pi-tui/src/components/cancellable-loader.ts +0 -41
  454. package/vendor/pi-tui/src/components/editor.ts +0 -2364
  455. package/vendor/pi-tui/src/components/h-stack.ts +0 -45
  456. package/vendor/pi-tui/src/components/image.ts +0 -128
  457. package/vendor/pi-tui/src/components/input.ts +0 -448
  458. package/vendor/pi-tui/src/components/loader.ts +0 -93
  459. package/vendor/pi-tui/src/components/markdown.ts +0 -1016
  460. package/vendor/pi-tui/src/components/scroll-view.ts +0 -217
  461. package/vendor/pi-tui/src/components/select-list.ts +0 -230
  462. package/vendor/pi-tui/src/components/settings-list.ts +0 -277
  463. package/vendor/pi-tui/src/components/spacer.ts +0 -29
  464. package/vendor/pi-tui/src/components/stack.ts +0 -155
  465. package/vendor/pi-tui/src/components/text.ts +0 -108
  466. package/vendor/pi-tui/src/components/truncated-text.ts +0 -66
  467. package/vendor/pi-tui/src/components/v-stack.ts +0 -34
  468. package/vendor/pi-tui/src/editor-component.ts +0 -75
  469. package/vendor/pi-tui/src/fuzzy.ts +0 -138
  470. package/vendor/pi-tui/src/index.ts +0 -149
  471. package/vendor/pi-tui/src/keybindings.ts +0 -321
  472. package/vendor/pi-tui/src/keys.ts +0 -1402
  473. package/vendor/pi-tui/src/kill-ring.ts +0 -47
  474. package/vendor/pi-tui/src/latex.ts +0 -1381
  475. package/vendor/pi-tui/src/layout-node.ts +0 -52
  476. package/vendor/pi-tui/src/layout.ts +0 -411
  477. package/vendor/pi-tui/src/native-modifiers.ts +0 -60
  478. package/vendor/pi-tui/src/native-module-path.ts +0 -32
  479. package/vendor/pi-tui/src/stdin-buffer.ts +0 -445
  480. package/vendor/pi-tui/src/terminal-colors.ts +0 -74
  481. package/vendor/pi-tui/src/terminal-image.ts +0 -701
  482. package/vendor/pi-tui/src/terminal.ts +0 -554
  483. package/vendor/pi-tui/src/tui-alt-screen.ts +0 -1379
  484. package/vendor/pi-tui/src/tui-main-screen.ts +0 -655
  485. package/vendor/pi-tui/src/tui.ts +0 -1264
  486. package/vendor/pi-tui/src/undo-stack.ts +0 -29
  487. package/vendor/pi-tui/src/utils.ts +0 -1327
  488. package/vendor/pi-tui/src/word-navigation.ts +0 -118
  489. package/vendor/pi-tui/test/test-themes.ts +0 -39
  490. package/vendor/pi-tui/test/virtual-terminal.ts +0 -219
  491. /package/{src/providers → dist/cli}/models-index.json +0 -0
@@ -0,0 +1,34 @@
1
+ // @bun
2
+ import{i as N4,j as mZ,k as wZ,o as u4,r as b8}from"./main-vxnwe5xx.js";import{A as Q9,B as X9,t as p7,u as J9}from"./main-8c1tbazx.js";import{C as KZ,D as t0,E as e0,F as Z4,G as GZ}from"./main-edxc3yzt.js";import{H as I0,J as N0,K as A0}from"./main-na7wse0x.js";import{N as S7,O as v4,P as g4,Q as C7,R as k7,S as c4,T as o4,U as f7,V as w7,W as h7,X as s4,Y as r4,Z as T4,ba as v7,ca as M4,da as g7,ea as b4,fa as u7,ga as OZ,ha as m7,ia as l7,ja as hZ}from"./main-hrrvcfan.js";import{mb as lZ,nb as t4,ob as iZ,qb as J7,rb as Q7,sb as X7,tb as e4}from"./main-rpg7h8mb.js";import{_b as d0,bc as c0,dc as X8}from"./main-zc7pyrbj.js";import{fc as l0,gc as p0,hc as x0,ic as i0,jc as a0,lc as n0,oc as Q8}from"./main-45ejth3a.js";import{pc as g0,rc as u0,sc as m0,xc as J8}from"./main-jak598k9.js";import{Ac as SZ,Bc as $8,yc as v0}from"./main-7kt6r53y.js";import{Jc as t}from"./main-9ht36z12.js";import{Nc as D7,Oc as V4,Pc as K4,Rc as R7}from"./main-nvc3yjay.js";import{Ad as f0,Bd as w0,Dd as h0,Ed as Z8}from"./main-kwwsz6rq.js";import{me as FZ,ne as A7,oe as k4,te as f4}from"./main-gth53dnt.js";import{De as E7}from"./main-9a9rnh47.js";import{Cf as W0,tf as r,wf as C4,yf as XZ}from"./main-xfekqh9m.js";import{Rf as U0,Sf as D0,Uf as E0}from"./main-wqt32p5x.js";import{pg as sZ,sg as y4,tg as S4}from"./main-x9ct6y1a.js";import{Ag as L4}from"./main-mg4f96e1.js";import{Wg as _7,Xg as T7,Yg as UZ,Zg as n4,_g as d4,bh as M7,eh as b7,fh as w4,gh as y7,ih as h4}from"./main-fvnpq46y.js";import{Bh as rZ,Ch as N7,Dh as $9,wh as I7}from"./main-ntqef02r.js";import{Lh as z7,Mh as H7}from"./main-wm997zjx.js";import{qi as U7}from"./main-2wyax8k9.js";import{Pi as L7}from"./main-6vjeds42.js";import{Vi as P0,aj as S}from"./main-xx2z3zh5.js";import{Bj as BZ,Ej as L0}from"./main-v8y60bb2.js";import{Mj as m,Nj as G7,Qj as O4,Rj as P4,Sj as cZ,Tj as j7,Uj as LZ,Wj as TZ}from"./main-ywbxshqc.js";import{Jk as q7,Mk as O7,Nk as P7,Ok as i4,Qk as a4}from"./main-qj2djy17.js";import{Uk as E4,Wk as I4,bl as M8,el as $7,jl as qZ,ll as W7,ml as x4}from"./main-6dtqmbt6.js";import{Jl as fZ,Ll as H4,Ml as W4,Ol as oZ,Pl as jZ,Rl as F7,Sl as F4}from"./main-6h9x282m.js";import{Tl as WZ,Ul as K7,Vl as _4}from"./main-vhrrq337.js";import{tm as k0,vm as e7}from"./main-y5c82rxr.js";import{wm as Z9,xm as n}from"./main-ys6zj3yr.js";import{$m as e,Lm as w,Um as YZ,Wm as O0}from"./main-2yeveeve.js";import{pn as r0,tn as G8}from"./main-nqveez48.js";import{un as DZ,vn as gZ,wn as uZ,xn as V7}from"./main-qsevpgsv.js";var l4={};gZ(l4,{todoLabel:()=>g8,groupedHelp:()=>m4,cmdTodos:()=>v8,cmdTasks:()=>u8,cmdStatus:()=>C8,cmdSkills:()=>f8,cmdMemory:()=>w8,cmdHelp:()=>S8,cmdExport:()=>h8,cmdCost:()=>k8,HELP_GROUP_ORDER:()=>vZ});import{join as y8}from"path";function S8(Z){Z.renderer.addSystemNote(m4(Z.commands.builtin)+w4(Z.commands.custom))}function m4(Z){let Q=new Map;for(let Y of Z){let $=Y.group!==void 0&&vZ.includes(Y.group)?Y.group:"more",X=Q.get($)??[];X.push(Y),Q.set($,X)}return[...vZ,"more"].filter((Y)=>Q.has(Y)).map((Y)=>`${Y}
3
+ `+Q.get(Y).map(($)=>` /${$.name} \u2014 ${$.description}`).join(`
4
+ `)).join(`
5
+ `)}function C8(Z){let Q=Z.rt.projectContext,J=Q.sources.map(($)=>$.chars===0?`${$.path} (dropped)`:$.truncated?`${$.path} (truncated)`:$.path);if(Q.skippedFiles>0)J.push(`+${Q.skippedFiles} skipped (file cap)`);let Y=Z.state;Z.renderer.addSystemNote(`provider=${Y.provider} model=${Y.model} turns=${Y.turns} tokens=${Y.tokensIn}in/${Y.tokensOut}out
6
+ sandbox: ${y4(Z.rt.sandbox)}
7
+ config: ${J.length>0?J.join(", "):"(none)"}`)}function k8(Z,Q){if(Q==="refresh"){Z.catalog.refresh().then((J)=>Z.renderer.addSystemNote(J?"model catalog refreshed from models.dev":"catalog refresh failed \u2014 using the offline snapshot",J?"info":"warn"));return}Z.renderer.addSystemNote(mZ(Z.store().messages(),Z.catalog,{provider:Z.state.provider,model:Z.state.model}))}function f8(Z){let Q=Z.rt.skillStore.list().map((J)=>`${J.name} \u2014 ${J.description}`);Z.renderer.addSystemNote(Q.length?Q.join(`
8
+ `):"(no skills installed)")}function w8(Z,Q=""){let J=v4(Z.blocks(),Q);Z.renderer.addSystemNote(J.text,J.tone)}function h8(Z,Q){try{let J=Q.split(/\s+/).filter(Boolean),Y=u4(Z.sessionsDir,Z.store().id,{json:J.includes("--json"),force:J.includes("--force"),out:J.filter(($)=>!$.startsWith("-")).join(" ")||void 0,cwd:Z.rt.cwd});Z.renderer.addSystemNote(`exported ${Y.format} \u2192 ${Y.path}`)}catch(J){Z.renderer.addSystemNote(J instanceof Error?J.message:String(J),"error")}}function v8(Z){let{items:Q,note:J}=r(y8(Z.sessionsDir,Z.store().id));if(J)Z.renderer.addSystemNote(J,"warn");Z.renderer.addSystemNote(Q.length>0?C4(Q):"(no todos \u2014 the agent maintains the list with todo_write)")}function g8(Z){return XZ(r(Z).items)||void 0}function u8(Z,Q){let J=Q.split(/\s+/).filter(Boolean),Y=Z.rt.tasks;if(J.length===0){Z.renderer.addSystemNote(k4(Y.list()));return}if(J[0]!=="cancel"||J.length!==2){Z.renderer.addSystemNote("usage: /tasks [cancel <id>|cancel all]","warn");return}let $=J[1];if($==="all"){let V=Y.cancelAll();Z.renderer.addSystemNote(V===0?"no queued or running tasks to cancel":`cancelling ${V} task${V===1?"":"s"}`);return}let X=Y.status($);if(!X){Z.renderer.addSystemNote(`unknown task '${$}' \u2014 list with /tasks`,"warn");return}if(FZ(X.status)){Z.renderer.addSystemNote(`task ${$} already ${X.status}`);return}Y.cancel($),Z.renderer.addSystemNote(`cancelling task ${$} (${X.label})`)}var vZ;var p4=uZ(()=>{b8();S4();f4();W0();h4();g4();wZ();vZ=["start here","session","model & provider","modes & safety","files & history","info"]});var Z7={};gZ(Z7,{usageOf:()=>p8,resolveBootSession:()=>x8,replayTranscript:()=>l8,cmdSessions:()=>pZ,cmdRewind:()=>i8,cmdNew:()=>a8});import{randomUUID as m8}from"crypto";function l8(Z,Q){Z.clearTranscript();for(let J of Q.path()){if(!("role"in J)){let $=s4(J);if($!==null)Z.addSystemNote($);continue}let Y=i4(J.parts);if(J.role==="user"&&c4(Z,Y))continue;if(J.role==="user"){let $=OZ(Y,J.parts);if($)Z.addUser($)}else if(J.role==="assistant"){if(Y){let $=Z.beginAssistant();$.append(Y),$.done()}for(let $ of J.parts)if($.kind==="tool_call")Z.toolStart($.id,$.tool,JSON.stringify($.args).slice(0,120))}else if(J.role==="tool"){for(let $ of J.parts)if($.kind==="tool_result")Z.toolEnd($.callId,$.ok,$.output.slice(0,160).replace(/\n/g," \u23CE "),0)}else if(J.role==="system"&&Y)Z.addSystemNote(n4(J,Y))}}function p8(Z){let Q=0,J=0;for(let Y of Z.messages())Q+=Y.usage?.input??0,J+=Y.usage?.output??0;return{tokensIn:Q,tokensOut:J}}function x8(Z,Q){if(Q===void 0)return{id:Q};let J=lZ(qZ(Z,{includeHollow:!0}),Q);if(J.length===1)return{id:J[0].id};if(J.length>1)return{id:void 0,warn:`"${Q}" matches ${J.length} sessions \u2014 started fresh; use /resume to pick one`};return{id:Q}}async function i8(Z){if(Z.busy()){Z.renderer.addSystemNote("finish or interrupt the run first (Esc)","warn");return}let Q=Z.store().turnPoints();if(Q.length===0){Z.renderer.addSystemNote("nothing to rewind \u2014 no turns yet");return}let J=[...Q].reverse().map((X)=>({value:X.entryId,label:`#${X.index} ${X.text}`,description:X.branches>0?`\u25C6 ${X.branches} other branch${X.branches>1?"es":""}`:void 0})),Y=await Z.renderer.pickOne(J,"rewind to a turn (Enter = edit & resubmit, Esc = cancel)");if(!Y){Z.replayHistory();return}let $=Q.find((X)=>X.entryId===Y);if(!$)return;if($.parentId===null)Z.switchSession(m8(),!1),Z.renderer.addSystemNote("rewound to the start \u2014 fresh session, previous one kept");else{if(!Z.store().branch($.parentId)){Z.renderer.addSystemNote("rewind failed: turn not found","error");return}Z.replayHistory(),Z.renderer.addSystemNote(`rewound to before turn #${$.index} \u2014 edit and resubmit (branch kept)`)}Z.renderer.prefillEditor($.fullText),Z.pushStatus()}async function pZ(Z,Q){if(Z.busy()){Z.renderer.addSystemNote("finish or interrupt the run first (Esc)","warn");return}let J=qZ(Z.sessionsDir);if(Q){let X=lZ(qZ(Z.sessionsDir,{includeHollow:!0}),Q);if(X.length===1)Z.switchSession(X[0].id);else if(X.length>1)Z.renderer.addSystemNote(t4(Q,X),"warn");else Z.renderer.addSystemNote(`no session matching "${Q}"`,"warn");return}let Y=J.slice(0,20).map((X)=>({value:X.id,label:X.title??(X.preview||"(empty session)"),description:`${new Date(X.updatedAt).toLocaleString()} \xB7 ${X.entryCount} entries \xB7 ${X.id.slice(0,8)}${X.id===Z.store().id?" \xB7 current":""}`}));if(Y.length===0){Z.renderer.addSystemNote("no sessions found");return}let $=await Z.renderer.pickOne(Y,"resume a session (Esc = cancel)");if($&&$!==Z.store().id)Z.switchSession($);else if(!$)Z.replayHistory()}function a8(Z){if(Z.busy()){Z.renderer.addSystemNote("finish or interrupt the run first (Esc)","warn");return}let Q=Z.store();if(Q.branch(Q.messages()[0]?.id??""))Z.replayHistory(),Z.refreshUsage(),Z.pushStatus(),Z.renderer.addSystemNote("branched to session start");else Z.renderer.addSystemNote("nothing to branch \u2014 no turns yet")}var xZ=uZ(()=>{a4();x4();e4();hZ();d4();r4();o4()});var Y7={};gZ(Y7,{cmdSessionsVerb:()=>o8});import{randomUUID as n8}from"crypto";async function o8(Z,Q){let[J,...Y]=Q.split(/\s+/).filter(Boolean);if(J===void 0)return pZ(Z);if(Z.busy()){Z.renderer.addSystemNote(d8,"warn");return}switch(J){case"rename":return s8(Z,Y.join(" "));case"delete":return r8(Z,Y[0]);case"fork":return t8(Z,Y[0]);case"search":return e8(Z,Y.join(" "));default:Z.renderer.addSystemNote(`unknown /sessions verb "${J}" \u2014 ${c8}`,"warn")}}function s8(Z,Q){let J=$7(Q);if(J===void 0){Z.renderer.addSystemNote("usage: /sessions rename <title\u2026>","warn");return}let Y=Z.store();Y.patchMeta({title:J}),Z.renderer.addSystemNote(`session ${Y.id.slice(0,8)} titled "${J}"`)}async function r8(Z,Q){if(Q===void 0){Z.renderer.addSystemNote("usage: /sessions delete <id|prefix>","warn");return}let J=iZ(Z.sessionsDir,Q);if(!J.ok){Z.renderer.addSystemNote(J.error,"warn");return}let Y=J.summary,$=J.id===Z.store().id,X=Y.title??(Y.preview||"(empty session)");if(await Z.renderer.askApproval("sessions delete",`${Y.id.slice(0,8)} \xB7 ${X} \xB7 ${Y.entryCount} entries${$?" \xB7 the current session":""}`,"removes the session directory (entries, meta, attachments, todos) and its checkpoints shadow repo \u2014 not undoable")==="deny"){Z.renderer.addSystemNote("delete cancelled \u2014 nothing removed","warn");return}if($)Z.switchSession(n8(),!1),Z.renderer.addSystemNote("deleting the active session \u2014 switched to a fresh one first");let{removed:G}=Q7(Z.cwd,Z.sessionsDir,J.id);Z.renderer.addSystemNote(`deleted session ${J.id.slice(0,8)} (${G.length} path${G.length===1?"":"s"} removed)`)}function t8(Z,Q){let J=iZ(Z.sessionsDir,Q??Z.store().id);if(!J.ok){Z.renderer.addSystemNote(J.error,"warn");return}let Y;try{Y=J7(Z.sessionsDir,J.summary)}catch($){Z.renderer.addSystemNote($ instanceof Error?$.message:String($),"warn");return}Z.switchSession(Y.id),Z.renderer.addSystemNote(`forked ${Y.from.slice(0,8)} \u2192 ${Y.id.slice(0,8)} "${Y.title}"`)}async function e8(Z,Q){let J=Q.trim();if(J===""){Z.renderer.addSystemNote("usage: /sessions search <terms\u2026>","warn");return}let Y=X7(Z.sessionsDir,J,10);if(Y.length===0){Z.renderer.addSystemNote(`no matches for "${J}"`);return}let $=Z.store().id,X=Y.map((K,I)=>({value:String(I),label:K.preview||K.title||"(empty session)",description:`${K.title!==void 0?`${K.title} \xB7 `:""}${K.sessionId.slice(0,8)}${K.sessionId===$?" \xB7 current":""} \xB7 ${new Date(K.timestamp).toLocaleString()}`})),V=await Z.renderer.pickOne(X,"search hits (Enter = resume, Esc = cancel)");if(V===null){Z.replayHistory();return}let G=Y[Number(V)];if(G===void 0)return;if(G.sessionId===$){Z.renderer.addSystemNote("that hit is in the current session");return}Z.switchSession(G.sessionId)}var d8="finish or interrupt the run first (Esc)",c8="/sessions rename <title\u2026> | delete <id|prefix> | fork [<id|prefix>] | search <terms\u2026>";var B7=uZ(()=>{e4();xZ()});a4();S4();x4();g4();o4();L0();$9();f4();d4();var s7=["files","conversation","both"];async function z0(Z){if(Z.busy()){Z.renderer.addSystemNote("finish or interrupt the run first (Esc)","warn");return}let Q=await Z.checkpointsFor(Z.sessionId());if(!Q){Z.renderer.addSystemNote("checkpoints unavailable (git missing or ROVECODE_NO_CHECKPOINTS=1)","warn");return}let J=Q.list();if(J.length===0){Z.renderer.addSystemNote("no checkpoints yet \u2014 snapshots land after each mutating tool call");return}let Y=[...J].reverse().slice(0,20).map((X,V)=>({value:X.hash,label:`#${J.length-V} ${X.label} \xB7 ${X.hash.slice(0,8)}`,description:`${new Date(X.createdAt).toLocaleString()}${X.entryId?" \xB7 conversation anchor":""}`})),$=await Z.renderer.pickOne(Y,"checkpoints (Enter = show restore hint, Esc = close)");if(Z.replayAndRefresh(),$)Z.renderer.addSystemNote(`restore with: /restore ${$.slice(0,8)} [files|conversation|both]`)}async function H0(Z,Q){if(Z.busy()){Z.renderer.addSystemNote("finish or interrupt the run first (Esc)","warn");return}let[J,Y]=Q.split(/\s+/);if(!J){Z.renderer.addSystemNote("usage: /restore <checkpoint> [files|conversation|both] \u2014 list with /checkpoints","warn");return}let $=Y||"files";if(!s7.includes($)){Z.renderer.addSystemNote(`unknown restore mode "${Y}" (files|conversation|both)`,"warn");return}let X=await Z.checkpointsFor(Z.sessionId());if(!X){Z.renderer.addSystemNote("checkpoints unavailable (git missing or ROVECODE_NO_CHECKPOINTS=1)","warn");return}let V=[...new Map(X.list().filter((z)=>z.hash.startsWith(J)).map((z)=>[z.hash,z])).values()];if(V.length!==1){Z.renderer.addSystemNote(V.length===0?`no checkpoint matching "${J}"`:`"${J}" matches ${V.length} checkpoints \u2014 be more specific`,"warn");return}let G=await X.restore(V[0].hash,$);if(!G.ok){Z.renderer.addSystemNote(`restore failed: ${G.error}`,"error");return}let K="";if($==="conversation"||$==="both")if(G.entryId&&Z.branchTo(G.entryId))Z.replayAndRefresh(),K=" \xB7 conversation branched to the checkpoint's turn";else K=" \xB7 conversation anchor unavailable in this session tree (files unaffected by that)";let I=$==="conversation"?"":"workspace rolled back";Z.renderer.addSystemNote(`restored ${G.checkpoint.hash.slice(0,8)} (${$}) \u2014 ${I}${K}; snapshots keep history`)}W0();function F0(Z){return XZ(r(Z).items)||void 0}hZ();e();TZ();L0();function r7(Z){if(Z===void 0)return"";return Z>=1e6?`${(Z/1e6).toFixed(1)}M ctx`:Z>=1000?`${Math.round(Z/1000)}k ctx`:`${Z} ctx`}function t7(Z){if(Z?.inputPerMTok===void 0&&Z?.outputPerMTok===void 0)return"";let Q=(J)=>J===void 0?"?":`$${J}`;return`${Q(Z?.inputPerMTok)}/${Q(Z?.outputPerMTok)}`}function q0(Z){if(Z===void 0)return"";return[r7(Z.contextWindow),t7(Z.pricing),Z.supportsReasoning?"reasoning":"",Z.supportsTools===!1?"no tools":""].filter(Boolean).join(" \xB7 ")}var VZ={name:"model",description:"Switch the model I use: /model <provider/model | model> [--save]",group:"model & provider"};async function R0(Z){let Q=Z.list().filter(S).map((Y)=>Y.id);return(await Promise.all(Q.map(async(Y)=>({id:Y,r:await Z.models(Y,{background:!0})})))).flatMap(({id:Y,r:$})=>$.ok?$.models.map((X)=>`${Y}/${X}`):[])}var _0={name:"connect",description:"Connect a model: /connect (guided, same as /setup) \xB7 /connect <id> [<url>] [--model <id>] [--key-env NAME] [--no-key] [--project] [--no-test]",group:"start here"},T0=[{name:"models",description:"Pick a model from a list: /models [provider] [--save]",group:"model & provider"},{name:"provider",description:"Endpoints I can talk to: /provider list \xB7 add <id> <url> [--protocol \u2026] [--key-env \u2026] [--model \u2026] [--no-key] [--project] \xB7 remove <id> \xB7 use <provider/model> \xB7 test <id> [model] \xB7 key <id> <secret>",group:"model & provider"}],M0="Done. Tell me what you want done \u2014 try: explain this repo",f=!1,D=(Z,Q,J)=>{Z.renderer.addSystemNote(Q,J)};function ZZ(Z,Q){Z.modes.setModel({provider:Q.provider,model:Q.model});let J=Z.modes.modelFor();Z.state.model=J.model,Z.state.provider=J.provider,Z.pushStatus()}function MZ(Z,Q){let J=Q.split(/\s+/).filter((z)=>z.length>0),Y=J.includes("--save"),$=J.filter((z)=>z!=="--save").join(" ");if($.length===0)return bZ(Z,Y?"--save":"");let X=Z.rt.providers.resolveSelector($,Z.state.provider);if("error"in X){D(Z,`${X.error} \u2014 add one with /provider add <id> <baseUrl>`,"warn");return}let V=X.provider!==Z.state.provider;ZZ(Z,X);let G="";if(Y){f=!0;try{let z=Z.rt.providers.setDefault(`${X.provider}/${X.model}`);G="error"in z?` (not saved: ${z.error})`:" (saved as default)"}finally{f=!1}}let K=Z.rt.providers.get(X.provider),I=K!==void 0&&!S(K)?`
9
+ ${Z.rt.providers.keyHint(K)}`:"";D(Z,`model \u2192 ${V?`${X.provider}/`:""}${X.model}${G}${Z.modes.separate?` (${Z.modes.mode} mode)`:""}${I}`,I.length>0?"warn":void 0)}async function bZ(Z,Q){let J=Q.split(/\s+/).filter((U)=>U.length>0),Y=J.includes("--save"),$=J.filter((U)=>!U.startsWith("-"))[0],X=Z.rt.providers,V=$!==void 0?[$]:X.list().filter(S).map((U)=>U.id);if(V.length===0){D(Z,`no provider is configured yet. ${m("/connect")}`,"warn");return}D(Z,V.length===1?`fetching ${V[0]} models\u2026`:`fetching models from ${V.length} providers\u2026`);let G=await Promise.all(V.map(async(U)=>({id:U,r:await X.models(U,{background:!0})}))),K=[],I=[],z=Z.catalog??new BZ,E=(U,O)=>{let h=Z.state.provider===U&&Z.state.model===O,W=[h?"current":"",q0(z.lookup(U,O))].filter(Boolean).join(" \xB7 ");return{value:`${U}/${O}`,label:`${h?"* ":" "}${U}/${O}`,...W?{description:W}:{}}};for(let{id:U,r:O}of G){if(!O.ok){I.push(`${U}: ${O.error}`);continue}if(O.models.length===0){I.push(`${U}: the endpoint listed no models (no /models route?) \u2014 /model ${U}/<model> still works`);continue}for(let h of O.models)K.push(E(U,h))}for(let U of I)D(Z,U,"warn");let H=`${Z.state.provider}/${Z.state.model}`;if(Z.state.model&&V.includes(Z.state.provider)&&!K.some((U)=>U.value===H))K.unshift(E(Z.state.provider,Z.state.model));if(K.length===0)return;K.sort((U,O)=>Number(O.label.startsWith("*"))-Number(U.label.startsWith("*")));let A=await Z.renderer.pickOne(K,`pick a model \xB7 ${K.length} from ${V.length} provider${V.length===1?"":"s"}`);if(A===null||!Y&&A===`${Z.state.provider}/${Z.state.model}`)return;MZ(Z,Y?`${A} --save`:A)}async function b0(Z,Q){let J=Q.split(/\s+/).filter((V)=>V.length>0),[Y,...$]=J,X=Z.rt.providers;switch(Y){case void 0:case"list":D(Z,E0(X,{all:$.includes("--all")}));return;case"add":{let V=D0($);if("error"in V){D(Z,V.error,"warn");return}let G=X.add(V.spec,V.scope);if("error"in G){D(Z,G.error,"warn");return}let K=S(G)?"":`
10
+ key: /provider key ${G.id} <secret> \xB7 or set ${G.keyEnv} (live, no restart)`;D(Z,`added ${G.id} (${G.protocol}, ${G.baseUrl}) [${V.scope}]${K}
11
+ use it: /model ${G.id}/${G.defaultModel??"<model>"}`);return}case"remove":{if($[0]===void 0)break;let V=X.remove($[0]);if("error"in V){D(Z,V.error,"warn");return}D(Z,V.removed.length>0?`removed ${$[0]} (${V.removed.join(", ")} providers.json)`:`${$[0]} was not in any providers.json`);return}case"use":{if($[0]===void 0)break;f=!0;let V;try{V=X.setDefault($[0])}finally{f=!1}if("error"in V){D(Z,V.error,"warn");return}ZZ(Z,V);let G=X.get(V.provider),K=G!==void 0&&!S(G)?`
12
+ ${X.keyHint(G)}`:"";D(Z,`default \u2192 ${V.provider}/${V.model} (saved; this session switched)${K}`,K.length>0?"warn":void 0);return}case"test":{if($[0]===void 0)break;D(Z,`testing ${$[0]}${$[1]!==void 0?`/${$[1]}`:""}\u2026`);let V=await X.probe($[0],$[1]);D(Z,`${$[0]}/${V.model}: ${V.detail}`,V.ok?void 0:"warn");return}case"key":{let[V,G]=$;if(V===void 0||G===void 0)break;let K=X.get(V);if(K===void 0){D(Z,`unknown provider "${V}" \u2014 /provider add ${V} <baseUrl> first`,"warn");return}YZ(V,G,K.keyEnv),X.refresh(),D(Z,`stored ${K.keyEnv} for ${V} (${O0(G)}) \u2014 live now`);return}default:break}D(Z,`usage: /provider list [--all] \xB7 /provider ${U0} \xB7 remove <id> \xB7 use <provider/model> \xB7 test <id> [model] \xB7 key <id> <secret>`,"warn")}var l=null;async function yZ(Z){let Q=Z.rt.providers;l?.(),l=null;let J=t.map((z)=>({value:z.key,label:z.label})),Y=await Z.renderer.pickOne(J,"\u25C6 connect a model \u2014 which provider? (Esc = cancel)");if(Y===null){D(Z,"setup cancelled \u2014 nothing changed. /setup whenever you like");return}let $=t.find((z)=>z.key===Y);if($===void 0)return;let X=async(z)=>{return(await Z.renderer.askQuestion({question:z,options:[],allowFreeText:!0}).catch(()=>null))?.text?.trim()??null},V;if($.url!==void 0){let z=(await X("Short name for it? (letters, digits, - _ .)")??"").toLowerCase();if(!P0.test(z)){D(Z,`setup stopped \u2014 "${z}" won't work as an id. ${m("/setup, and pick a name like myproxy")}`,"warn");return}let E=await X(`Base URL for ${z}? (e.g. https://host/v1)`)??"";if(!/^https?:\/\//.test(E)){D(Z,`setup stopped \u2014 "${E}" is not an http(s) URL. ${m("/setup")}`,"warn");return}let A=(await Z.renderer.askQuestion({question:"Does it need an API key?",options:["yes","no \u2014 it is a local server"],allowFreeText:!1}).catch(()=>null))?.choice===1,U=Q.add({id:z,baseUrl:E,protocol:$.url,...A?{noKey:!0}:{}},"user");if("error"in U){D(Z,`setup stopped \u2014 ${U.error}`,"warn");return}V=z,D(Z,`\u25C6 ${V} registered (${$.url} protocol, ${E}).`)}else{V=$.id??"";let z=Q.get(V);if(z===void 0){D(Z,`setup stopped \u2014 ${V} is missing from the built-in table`,"warn");return}if($.local===!0&&z.noKey!==!0){let E=Q.add({id:V,baseUrl:z.baseUrl,protocol:z.protocol,noKey:!0,...z.defaultModel!==void 0?{defaultModel:z.defaultModel}:{}},"user");if("error"in E){D(Z,`setup stopped \u2014 ${E.error}`,"warn");return}D(Z,`\u25C6 ${V} marked as a local server (${z.baseUrl}, no key).`)}}let G=Q.get(V);if(G===void 0)return;let K=G.defaultModel;if(K===void 0){let z=await Z.renderer.askQuestion({question:`Which model id on ${V}?`,options:[],allowFreeText:!0}).catch(()=>null);if(K=z?.text?.trim()||z?.label,K===void 0||K.length===0){D(Z,`\u25C6 ${V} is set up but has no model yet. ${m(`/models ${V}, then /model ${V}/<model> --save`)}`);return}}else D(Z,`\u25C6 model \u2192 ${V}/${K} (change it any time: /model ${V}/<other> --save)`);let I=async()=>{D(Z,`\u25C6 testing ${V}/${K} \u2026`);let z=await Q.probe(V,K);if(z.ok)D(Z,` ${z.detail}`);else D(Z,` that didn't work: ${z.detail}
13
+ ${m(`check the key and the URL, then /provider test ${V} ${K}`)}`,"warn");f=!0;let E;try{E=Q.setDefault(`${V}/${K}`,"user")}finally{f=!1}if("error"in E){D(Z,` ${E.error}`,"warn");return}ZZ(Z,E),D(Z,`\u25C6 default \u2192 ${E.provider}/${E.model} \u2014 this session switched too.
14
+ ${M0}`)};if(S(G)){await I();return}D(Z,[`\u25C6 I need the key for ${V}. Paste it hidden in another terminal:`,` rovecode auth set ${V}`,` or here (this line only, redacted in the note): /provider key ${V} <secret>`,` or set ${G.keyEnv} in your environment.`," I'll notice as soon as it lands and finish the setup."].join(`
15
+ `)),y0(Q,V,I)}function y0(Z,Q,J){let Y=setInterval(()=>{Z.snapshot()},1000);Y.unref?.();let $=Z.onChange(()=>{let V=Z.get(Q);if(V===void 0||!S(V))return;X(),J()}),X=()=>{if(clearInterval(Y),$(),l===X)l=null};l=X}async function S0(Z,Q){let J=Q.split(/\s+/).filter((G)=>G.length>0);if(J.length===0){await yZ(Z);return}let Y=N0(J);if("error"in Y){D(Z,`${Y.error.replace("usage: rovecode connect","usage: /connect")}`,"warn");return}if(Y.key==="prompt"||Y.key==="stdin"){D(Z,`there is no hidden prompt in here \u2014 a key on this line would sit in the transcript.
16
+ ${m(`rovecode auth set ${Y.id} in another terminal, or /provider key ${Y.id} <secret>`)}`,"warn");return}let $=Z.rt.providers;l?.(),l=null;let X=(G)=>{if(G===I0||G===2)return;let K=$.defaultRef();if(K!==null&&K.provider===Y.id&&K.model.length>0)ZZ(Z,K)},V=async()=>{f=!0;try{return await A0(Y,{registry:$,tty:!1,out:(G)=>D(Z,G),done:M0,where:"tui",deferKey:(G)=>{D(Z,[`\u25C6 I need the key for ${Y.id}. Paste it hidden in another terminal:`,` rovecode auth set ${Y.id}`,` or here (this line only, redacted in the note): /provider key ${Y.id} <secret>`,` or set ${G.keyEnv} in your environment.`," I'll notice as soon as it lands and finish the job."].join(`
17
+ `)),y0($,Y.id,async()=>{X(await V())})}})}finally{f=!1}};X(await V())}function C0(Z){let Q=Z.rt.providers.defaultSelector(),J=Z.rt.noProviderReason()===null;return Z.rt.providers.onChange(()=>{let Y=Z.rt.providers.defaultSelector();if(Y!==Q){Q=Y;let X=Z.rt.providers.defaultRef();if(X!==null&&X.model.length>0&&!f)ZZ(Z,X),D(Z,`default model changed \u2192 ${X.provider}/${X.model}`)}let $=Z.rt.noProviderReason()===null;if($&&!J)D(Z,"provider configured \u2014 ready for the next prompt");J=$})}$8();Q8();e7();Z8();J8();X8();e();var Y8=["search","info","add","remove","list","show","trust","untrust"],o0={name:"mcp",choices:Y8,choicesThen:"complete",description:"Find and install an MCP server: /mcp [query] [--project] \u2014 the curated shelf, then the registry \xB7 /mcp trust approves this repo's MCP files",group:"modes & safety"};async function B8(Z,Q){let J=h0(Z.cwd);if(J.length===0){Z.renderer.addSystemNote("mcp: no project MCP files here (.rovecode/mcp.json, .mcp.json)");return}let Y=new Proxy({},{get:()=>"set"});for(let $ of J){if(f0(Q,$)==="trusted"){Z.renderer.addSystemNote(`mcp: ${$} is already trusted as it is now`);continue}let X=[],V=k0($,X,Y).map(n0).concat(X.map((I)=>`! ${I}`));if(await Z.renderer.askApproval("mcp trust",$,V.join(`
18
+ `)||"(no servers in it)")==="deny"){Z.renderer.addSystemNote(`mcp: ${$} stays untrusted \u2014 nothing in it loads`);continue}let K=w0(Q,$);Z.renderer.addSystemNote(K.ok?`mcp: trusted ${$} \u2014 restart me to connect; an edit asks again`:`mcp: ${K.reason}`,K.ok?"info":"warn")}}var V8=(Z,Q)=>Z.length>Q?Z.slice(0,Q-1)+"\u2026":Z;function K8(Z){let Q=Z.source==="curated"?"curated":`registry \xB7 ${Z.publisher??"?"}`;return{value:Z.key,label:Z.title??Z.key,description:`${Q}${Z.status?` \xB7 ${Z.status}`:""} \xB7 ${V8(Z.description,60)}`}}async function s0(Z,Q){let{renderer:J}=Z,Y=Q.split(/\s+/).filter(Boolean),$=Y.includes("--project")?"project":"user",X=Y.filter((N)=>!N.startsWith("--")).join(" "),V=Z.home??w();if(Y[0]==="trust"){await B8(Z,V);return}let G={home:V,...Z.market},K=await v0(X,G);for(let N of K.notes)J.addSystemNote(`mcp: ${N}`,"warn");if(K.entries.length===0){J.addSystemNote(`mcp: nothing matches "${X}" \u2014 the registry matches on the server's name`,"warn");return}let I=await J.pickOne(K.entries.map(K8),X?`mcp market \xB7 ${X}`:"mcp market");if(I===null)return;let z=K.entries.find((N)=>N.key===I);if(!z)return;let E=0;if(z.installs.length>1){let N=await J.pickOne(z.installs.map((c,R)=>({value:String(R),label:c.kind==="stdio"?`run ${SZ(c)}`:`connect ${c.url}`})),`${z.title??z.key} \xB7 how`);if(N===null)return;E=Number(N)}let H=z.installs[E],A=H!==void 0?g0(H):void 0,U=!1;if(A!==void 0&&$==="user"){let N=await J.pickOne([{value:"local",label:"install once \u2014 node starts it in ~0.4 s",description:`runs npm install now: ${A.spec}'s code lands under ~/.rovecode/mcp (typically 20\u201330 MB, one time); no network needed to start`},{value:"npx",label:"run through npx at every start \u2014 as today",description:"~2 s per start, re-resolves the package and asks the npm registry each time; nothing installed now"}],`${z.title??z.key} \xB7 how to start it`);if(N===null)return;U=N==="local"}let O=l0(z,{scope:$,cwd:Z.cwd,home:V,pick:E,...U?{local:!0}:{}});if("error"in O){J.addSystemNote(`mcp: ${O.error}`,"warn");return}if(await J.askApproval("mcp add",`${O.name} \u2190 ${O.local?`node ${O.local.pkg.spec} (installed once)`:SZ(O.install)}`,i0(O,"env").join(`
19
+ `))==="deny"){J.addSystemNote("mcp: nothing written");return}let W,M;if(O.local){J.addSystemNote(`mcp: npm install ${O.local.pkg.spec} \u2192 ${O.local.prefix} \u2026`);let N=await u0(O.local.pkg,O.local.prefix,Z.spawn?{spawn:Z.spawn}:{});if(!N.ok){J.addSystemNote(`mcp: ${N.error} \u2014 nothing written`,"error");return}W=m0(N.pkg,O.local.pkg.rest),M={name:N.pkg.name,version:N.pkg.version,prefix:O.local.prefix,bin:N.pkg.bin,missing:N.pkg.missing,...N.pkg.integrity!==void 0?{integrity:N.pkg.integrity}:{},...N.pkg.resolved!==void 0?{resolved:N.pkg.resolved}:{}}}let b,p=p0(O,{},W);try{b=a0(O.file,O.name,p,$==="project"?{trustHome:V}:{}).trusted}catch(N){J.addSystemNote(`mcp: ${N instanceof Error?N.message:String(N)}`,"error");return}if(J.addSystemNote(`mcp: added "${O.name}" \u2192 ${O.file}${b===!0?" (trusted as written)":""} \u2014 restart me to connect (servers are read once per process)`),M){if(d0(c0({kind:"mcp",id:z.key,source:z.source,...z.version!==void 0?{version:z.version}:{}},{scope:$,target:O.file,package:M,installedBy:"mcp add"}),{cwd:Z.cwd,home:V}),J.addSystemNote(`mcp: installed ${M.name} ${M.version} once \u2192 ${O.local.prefix}${M.integrity!==void 0?" (integrity recorded in installed.json)":""}`),M.missing?.length)J.addSystemNote(`mcp: record incomplete: ${M.missing.join("; ")}`,"warn")}if(b===!1)J.addSystemNote("mcp: that file already held servers you have not approved, so it is NOT trusted yet \u2014 /mcp trust shows them","warn");let d=x0(O,p);if(d.length)J.addSystemNote(`mcp: set ${d.join(", ")} in your environment before the restart \u2014 or run \`rovecode mcp add ${z.key}\` on a shell, which asks for them masked`,"warn");if(O.pending.length)J.addSystemNote(`mcp: fill in ${O.pending.join(", ")} in that file's args before use`,"warn")}import{relative as j8}from"path";G8();e();var z8="/trust \u2014 review this repo's gated files and approve them \xB7 /trust show \u2014 review only \xB7 /trust untrust \u2014 withdraw",H8=["show","untrust"],$4={name:"trust",choices:H8,choicesThen:"submit",description:"Review what this repo's config would run and approve it: /trust \xB7 /trust show \xB7 /trust untrust",group:"modes & safety"},J4="\x00keep-untrusted",Q4="\x00trust-all",W8="restart rovecode to apply \u2014 an edit to any of these files asks again";function F8(Z,Q){let J=[{value:J4,label:"keep them untrusted",description:"nothing from these files is used; you will be asked again next launch"}];for(let Y of Z)J.push({value:Y.file,label:`approve ${CZ(Y.file,Q)}`,description:Y.carries.join(" \xB7 ")});if(Z.length>1)J.push({value:Q4,label:`approve all ${Z.length} files`,description:Z.map((Y)=>CZ(Y.file,Q)).join(", ")});return J}var CZ=(Z,Q)=>{let J=j8(Q,Z);return J===""||J.startsWith("..")?Z:J};function q8(Z,Q){let J=Q.length===1?"1 file":`${Q.length} files`;return`${Z}: ${J} would make rovecode run something and ${Q.length===1?"is":"are"} not trusted on this machine \u2014 the lines above say what each one carries. Enter on the first item changes nothing (Esc the same).`}async function X4(Z,Q=""){let{renderer:J}=Z,Y=Z.home??w(),$=Q.trim().split(/\s+/).filter(Boolean)[0]??"";if($!==""&&$!=="show"&&$!=="untrust"){J.addSystemNote(`unknown /trust verb "${$}" \u2014 ${z8}`,"warn");return}let X=KZ(Z.cwd,Y);if($==="untrust"){for(let V of Z4(Y,X))J.addSystemNote(V);return}if(Y4(Z,X),$==="show"||X.length===0)return;if(GZ(X).length===0){J.addSystemNote("every gated file here is already trusted \u2014 nothing to approve");return}await O8(Z,Y)}function Y4(Z,Q){for(let J of t0([...Q]))Z.renderer.addSystemNote(J,J.startsWith("\xB7 UNTRUSTED")?"warn":"info")}async function O8(Z,Q){let{renderer:J}=Z,Y=0;for(;;){let $=GZ(KZ(Z.cwd,Q));if($.length===0)break;let X=await J.pickOne(F8($,Z.cwd),q8(Z.cwd,$));if(X===null||X===J4){J.addSystemNote(`${$.length} file${$.length===1?"":"s"} left untrusted \u2014 ${$.map((K)=>CZ(K.file,Z.cwd)).join(", ")} contribute nothing this session`,"warn");break}if(X===Q4){for(let K of e0(Q,$))J.addSystemNote(K);Y+=$.length;break}let V=$.find((K)=>K.file===X);if(V===void 0)break;let G=r0(Q,V.file);if(!G.ok){J.addSystemNote(G.reason,"warn");break}if(J.addSystemNote(`trusted ${V.file} (${G.digest.slice(0,12)}\u2026)`),Y++,$.length===1)break;Y4(Z,GZ(KZ(Z.cwd,Q)))}if(Y>0)Z.renderer.addSystemNote(W8)}function B4(Z,Q){return`reasoning \xB7 ${Z} tokens${Q?" \u2026":" \xB7 collapsed"}`}class kZ{renderer;open=null;constructor(Z){this.renderer=Z}onEvent(Z){if(Z.type==="reasoning_update"){if(this.open&&this.open.id!==Z.messageId)this.settle();if(!this.open)this.open={id:Z.messageId,view:this.renderer.beginReasoning?.()??null,tokens:0};this.open.tokens=Math.max(this.open.tokens,Z.tokens),this.open.view?.set?.(`\u2234 ${B4(this.open.tokens,!0)}`)}else if(Z.type==="message_update"||Z.type==="turn_end"||Z.type==="run_end")this.settle()}settle(){let Z=this.open;if(!Z)return;if(this.open=null,Z.view)Z.view.done();else this.renderer.addSystemNote(`\u2234 ${B4(Z.tokens,!1)}`)}get openTokens(){return this.open?.tokens??0}}var P8="main \u2014 built-in: the starting run's model and system prompt, every child tool (default for `task start`)";function L8(Z){let Q=Z.tools.includes("*")?"all child tools":Z.tools.join(", ");return`${Z.name} \u2014 ${Z.description} (${Z.scope}: ${Z.path}; model ${Z.model??"inherited"}; mode ${Z.mode??"act"}; tools ${Q})`}function U8(Z){let Q=[P8,...Z.agents.map(L8)],J=Z.agents.length===0?`
20
+ (no custom definitions \u2014 add ${K4}/${V4}/<name>.md: frontmatter description: / model: / mode: plan|act / tools: <allow-list>, body = system prompt)`:"",Y=Z.warnings.length>0?`
21
+ skipped:
22
+ `+Z.warnings.map(($)=>` ${$}`).join(`
23
+ `):"";return Q.join(`
24
+ `)+J+Y}function G4(Z){Z.renderer.addSystemNote(U8(Z.agents),Z.agents.warnings.length>0?"warn":"info")}F4();e();import{existsSync as j4}from"fs";var D8=["permission","effort","bell","notify","notify_when","notify_command","verify","lsp"],z4=(Z)=>{let Q=typeof Z==="string"?Z:JSON.stringify(Z);return Q.length>80?`${Q.slice(0,79)}\u2026`:Q};function E8(Z,Q,J=process.env,Y=w(),$){let X=fZ("user",Z),V=fZ("project",Z),G=H4(Z,Y),K=W4(Z),I=[];I.push(`settings \u2014 user: ${X}${j4(X)?"":" (absent)"} \xB7 project: ${V}${j4(V)?"":" (absent)"}`),I.push(`permission: ${jZ(Z,$,J)}${G.dropped.length>0?` \xB7 the project file's ${G.dropped.join(", ")} ${G.dropped.length===1?"is":"are"} ignored until you trust that file (rovecode trust show)`:""}`);let z=D8.filter((H)=>K[H]!==void 0&&H!=="permission");if(z.length===0)I.push("(no settings.json key is set \u2014 every knob is at its default)");for(let H of z){let A=G.project[H]!==void 0?"project":"user";I.push(`${H} = ${z4(K[H])} [${A}]`)}let E=Object.keys(J).filter((H)=>H.startsWith("ROVECODE_")&&J[H]!=="").sort();if(E.length>0)if(Q)for(let H of E)I.push(`${H} = ${/KEY|TOKEN|SECRET/i.test(H)?"(set \u2014 value not shown)":z4(J[H])} [env]`);else I.push(`env: ${E.length} ROVECODE_* variable${E.length===1?"":"s"} set (/config all names them)`);return I.join(`
25
+ `)}function q4(Z,Q){Z.renderer.addSystemNote(E8(Z.cwd,Q.trim()==="all",process.env,w(),Z.permissionFlag))}TZ();function U4({renderer:Z,rt:Q,yolo:J,modelRef:Y,mode:$,version:X,width:V,sessionId:G,bootWarn:K,commandWarnings:I}){let z=Q.stream&&Q.noProviderReason()===null?Y:null;if(G!==void 0)Z.addSystemNote(P4(G,Q.cwd,J));else{let H={skills:Q.skillStore.list().length,plugins:Q.plugins.found.filter((A)=>A.status==="active").length,mcp:Q.mcp?.serverNames().length??0};Z.addSystemNote(O4({connected:z,cwd:Q.cwd,yolo:J,mode:$,version:X,loaded:H,width:V}))}if(K)Z.addSystemNote(K);for(let H of I)Z.addSystemNote(H,"warn");for(let H of Q.providers.warnings())Z.addSystemNote(`providers: ${H}`,"warn");Q.hooks.onWarning((H)=>Z.addSystemNote(`hooks: ${H}`,"warn")),Q.plugins.onWarning((H)=>Z.addSystemNote(H,"warn"));let E=L4(Q.plugins.found);if(E!==null)Z.addSystemNote(E);Q.onRouterNote((H)=>Z.addSystemNote(H,"warn"))}function zZ(Z,Q){if(!Q)return Z;return new Promise((J,Y)=>{let $=()=>{Y(Q.reason??Error("startup cancelled"))};Q.addEventListener("abort",$,{once:!0});let X=()=>Q.removeEventListener("abort",$);if(Q.aborted)X(),$();Z.then(()=>{X(),J()},(V)=>{X(),Y(V)})})}TZ();Z9();e();import{appendFileSync as I8,mkdirSync as N8}from"fs";import{join as A8}from"path";function R8(Z,Q=0){let J=($,X=2)=>String($).padStart(X,"0"),Y=`${Z.getFullYear()}${J(Z.getMonth()+1)}${J(Z.getDate())}-${J(Z.getHours())}${J(Z.getMinutes())}${J(Z.getSeconds())}`;return Q===0?`crash-${Y}.log`:`crash-${Y}-${Q}.log`}function HZ(Z){if(Z instanceof Error){let Q=Z.cause!==void 0?`
26
+ caused by: ${HZ(Z.cause)}`:"";return`${Z.name}: ${Z.message}
27
+ ${Z.stack??"(no stack)"}${Q}`}if(typeof Z==="object"&&Z!==null)try{return`non-Error value thrown: ${JSON.stringify(Z)}`}catch{return`non-Error value thrown: ${String(Z)}`}return`non-Error value thrown: ${String(Z)}`}function _8(Z){let Q=Z instanceof Error?Z.message:typeof Z==="string"?Z:"";if(/\(ResolveMessage \{\}\)|getAddrInfo|EAI_AGAIN|ENOTFOUND|ECONNRESET|ECONNREFUSED|ECONNABORTED|ETIMEDOUT|EHOSTUNREACH|ENETUNREACH/.test(Q))return!0;if(typeof Z==="object"&&Z!==null){let{name:J,code:Y}=Z;if(String(J).includes("Resolve")||/^(EAI_AGAIN|ENOTFOUND|ECONNRESET|ECONNREFUSED|ECONNABORTED|ETIMEDOUT|EHOSTUNREACH|ENETUNREACH)$/.test(String(Y)))return!0}return!1}function T8(Z,Q,J,Y){return[`rovecode crash \u2014 ${Z}`,`when: ${J.toISOString()}`,`version: ${Y??"unknown"}`,`platform: ${process.platform} ${process.arch}`,`cwd: ${process.cwd()}`,"",HZ(Q),""].join(`
28
+ `)}function D4(Z){let Q=Z.process??process,J=Z.now??(()=>new Date),Y=Z.stderr??((H)=>{try{process.stderr.write(H+`
29
+ `)}catch{}}),$=Z.writeFile??((H,A)=>{I8(H,A,"utf8")}),X=!1,V=()=>{if(X)return;X=!0;try{Z.restore()}catch{}},G=(H,A)=>{let U=J();try{N8(Z.logDir,{recursive:!0});let O=A8(Z.logDir,R8(U));return $(O,T8(H,A,U,Z.version)),O}catch{return null}},K=(H)=>(A)=>{if(_8(A)){let O=G(`transient network error (recovered, ${H})`,A);if(O!==null)Y(`rovecode: a network call failed and was left behind (${HZ(A).split(`
30
+ `)[0]}) \u2014 details: ${O}`);return}V();let U=G(H,A);Y(`rovecode crashed (${H}). ${U!==null?`Details: ${U}`:"The crash log could not be written."}`),Y(HZ(A)),Q.exit(1)},I=K("uncaught exception"),z=K("unhandled rejection"),E=()=>{V()};return Q.on("uncaughtException",I),Q.on("unhandledRejection",z),Q.on("exit",E),()=>{Q.off("uncaughtException",I),Q.off("unhandledRejection",z),Q.off("exit",E)}}r4();J9();h4();wZ();M8();var A4=["theme","open","diff","focus","agents","notices","context"];function R4(Z){return{cwd:Z.cwd,sessionsDir:Z.sessionsDir,store:()=>({id:Z.store().id}),tasks:Z.tasks,model:Z.model,contextWindow:()=>{let Q=Z.model();return Z.catalog.lookup(Q.provider,Q.model)?.contextWindow},usage:()=>N4(Z.store().messages(),Z.catalog,Z.model()),contextInputs:()=>({messages:Z.store().messages(),lookup:(Q)=>{let J=Z.catalog.lookup(Q.provider,Q.model);if(!J)return;return{...J.contextWindow!==void 0?{contextWindow:J.contextWindow}:{},...J.pricing?{pricing:J.pricing}:{},...J.tier?{tier:J.tier}:{}}},runtime:Z.runtime?.()??null}),reloadMcp:async()=>{return await Z.runtime?.()?.reloadMcp?.()??{added:[],removed:[],failed:[],skipped:[]}},staged:()=>Z.store().stagedAttachments.map((Q)=>Q.name??"image"),attachImage:(Q)=>{let J=Z.store(),Y=E4(Q);if("error"in Y)return;let $=J.stagedAttachments;if(I4($.length+1)!==void 0)return;J.stageAttachments([...$,Y])},...Z.wizard!==void 0?{wizardProviders:()=>Z.wizard.providers(),wizardRegister:(Q,J,Y)=>Z.wizard.register(Q,J,Y),wizardStoreKey:(Q,J)=>Z.wizard.storeKey(Q,J),wizardModels:(Q)=>Z.wizard.models(Q),wizardActivateModels:(Q,J,Y)=>Z.wizard.activateModels(Q,J,Y),wizardTest:(Q,J)=>Z.wizard.test(Q,J)}:{},...Z.petName!==void 0?{petName:Z.petName}:{}}}_4();F4();_4();hZ();var $Z=[{name:"help",description:"This list, by topic",group:"start here"},_0,{name:"exit",description:"Quit (alias /quit; Ctrl+C does the same)",group:"start here"},{name:"new",description:"Start over in this session (branch back to the beginning)",group:"session"},{name:"sessions",description:"Pick an earlier session to continue \u2014 or manage them: /sessions rename <title\u2026> | delete <id> | fork [<id>] | search <terms\u2026>",group:"session",choices:["rename","delete","fork","search"],choicesThen:"complete"},{name:"resume",description:"Continue a session by id: /resume <id>",group:"session"},{name:"rewind",description:"Go back to an earlier turn and edit it (alias: /tree)",group:"session"},{name:"tree",description:"Alias of /rewind",group:"session"},{name:"export",description:"Save this session as markdown: /export [--json] [path] [--force]",group:"session"},VZ,...T0,{name:"yolo",description:"Toggle ask first / auto (never asks)",group:"modes & safety"},{name:"mouse",description:"Terminal mouse: /mouse off hands the drag to the terminal so you can select and copy text; on (default) keeps clicks, focus and scrollbars. Shift+drag selects without turning it off",group:"modes & safety",choices:["on","off","toggle"]},{name:"accept-edits",description:"Stop asking for writes inside this folder; shell, subagents and writes outside it still ask",group:"modes & safety"},{name:"effort",description:"How hard I think before answering: /effort auto | off | low | medium | high [--save [--project]] \u2014 the note says what the current model actually receives; --save makes it the default",group:"model & provider",choices:WZ},{name:"plan",description:"Plan mode: I only read and plan, nothing changes",group:"modes & safety"},{name:"act",description:"Act mode: I can edit and run again",group:"modes & safety"},{name:"checkpoints",description:"Snapshots I took before each change (shadow git)",group:"files & history"},{name:"restore",description:"Go back to a snapshot: /restore <ref> [files|conversation|both]",group:"files & history"},{name:"commit",description:"Commit the staged changes with a model-drafted conventional message (COMMIT role): /commit [message] \u2014 `git commit -m` runs through the bash tool's approval card",group:"files & history"},{name:"undo",description:"Undo the agent's last change: restore the previous checkpoint's files (a drifted workspace goes back to the last checkpoint; confirmation card; the conversation is untouched)",group:"files & history"},{...M4,group:"files & history"},{...b4,group:"files & history"},$4,{name:"agents",description:"My subagent definitions: /agents list (the bare /agents is the crew board)",group:"start here",choices:["list"]},{name:"config",description:"The settings this session actually loaded: /config [all] \u2014 files, set keys, ROVECODE_* env",group:"start here",choices:["all"]},o0,{name:"status",description:"Provider, model, turns, tokens, sandbox",group:"info"},{name:"update",description:"Update this installation in the background: /update [--check] [--channel beta|latest] \u2014 npm or source checkout; a restart runs the new version",group:"info"},{name:"cost",description:"Tokens, cache hits and the USD estimate (/cost refresh updates prices)",group:"info"},{name:"todos",description:"My step list for the current task",group:"info"},{name:"tasks",description:"Background subagents: /tasks [cancel <id>|cancel all]",group:"info"},{name:"skills",description:"Installed skills",group:"info"},{name:"memory",description:"What I remember across turns: /memory \xB7 /memory --user \xB7 /memory [--user] <text> to add a line",group:"info"},...T4];wZ();import{join as PZ}from"path";var aZ=null;function g(){if(aZ===null)aZ=(p4(),DZ(l4));return aZ}var nZ=null;function a(){if(nZ===null)nZ=(xZ(),DZ(Z7));return nZ}var dZ=null;function Y9(){if(dZ===null)dZ=(B7(),DZ(Y7));return dZ}async function jJ(Z={}){let Q=process.env.ROVECODE_TRACE_BOOT==="1"?Number(process.env._ROVECODE_BOOT_T0)||Date.now():-1,J=Q>=0?(B)=>process.stderr.write(`[boot] +${Date.now()-Q}ms ${B}
31
+ `):(B)=>{};J("runTui entered"),Z.startup?.signal?.throwIfAborted(),Z.startup?.status("loading workspace");let Y={id:Z.sessionId,warn:Z.bootNote},$=(()=>{try{J("createRuntime start");let B=R7({cwd:Z.cwd,stream:Z.stream,sessionId:Y.id,spawnRunner:Z.spawnRunner,platform:Z.platform,...Z.addDirs!==void 0?{addDirs:Z.addDirs}:{}});return J("createRuntime done"),B}catch(B){if(B instanceof sZ&&Z.exitOnClose!==!1)console.error(`error: ${B.message}`),process.exit(2);throw B}})(),X=Z.renderer??new((X9(),DZ(Q9))).PiTuiRenderer({cwd:$.cwd});J("renderer created"),$.setAskUser((B,F)=>X.askQuestion(B,F));let V=PZ($.cwd,".rovecode","sessions"),G=new BZ({fetchFn:fetch,cacheDir:PZ($.cwd,".rovecode","cache")}),K=$.store,I=$.blockStore,z=$.steering;$.tasks.subscribe((B)=>{if(FZ(B.status))X.addSystemNote(A7(B),B.status==="failed"?"warn":"info")});let E=I7($.cwd),H=new N7(E,{provider:$.provider?.id??"mock",model:Z.model??process.env.ROVECODE_MODEL??$.defaultModel??""});H.restore(rZ(K.messages())??H.mode);let A=$.plugins.found.flatMap((B)=>B.status==="active"&&B.commandsDir?[{dir:B.commandsDir,scope:B.scope}]:[]),U=M7($.cwd,{reserved:[...$Z.map((B)=>B.name),"quit",...A4],extraDirs:A});if(Z.effort!==void 0)$.setEffort(Z.effort);let O=Z.permission??(Z.yolo===!0?"auto":Z.acceptEdits===!0?"accept-edits":void 0),h=jZ($.cwd,O,{ROVECODE_PERMISSION:process.env.ROVECODE_PERMISSION,ROVECODE_YOLO:process.env.ROVECODE_YOLO,ROVECODE_ACCEPT_EDITS:process.env.ROVECODE_ACCEPT_EDITS}),W={yolo:h==="auto",acceptEdits:h==="accept-edits",provider:H.modelFor().provider,model:H.modelFor().model,mode:H.mode,turns:0,tokensIn:0,tokensOut:0,busy:!1},M=null,b=null,p=!1,d=()=>{},N=new Promise((B)=>{d=B}),c=()=>{let B=F0(PZ(V,K.id));return{provider:W.provider,model:W.model,yolo:W.yolo,mode:W.mode,permission:W.yolo?"auto":W.acceptEdits?"accept-edits":"ask",effort:$.effort,turns:W.turns,tokensIn:W.tokensIn,tokensOut:W.tokensOut,...B!==void 0?{todos:B}:{}}},R=()=>X.setStatus(c()),tZ,EZ=null,IZ=(B=!0)=>{if(p)return;p=!0,EZ?.(),EZ=null,UZ(H,K),b?.abort();let F=M?.return(void 0).then(()=>{return},()=>{return})??Promise.resolve(),P=$.stopRepoMapWarmup();$.tasks.cancelAll();let j=$.mcp?.close().catch(()=>{});tZ?.(),X.stop(),(async()=>{if(await Promise.all([F,P,j]),await $.hooks.close().catch(()=>{}),await X.drain?.()?.catch(()=>{}),d(),B&&Z.exitOnClose!==!1)process.exit(0)})()},x=()=>{let B=a().usageOf(K);W.tokensIn=B.tokensIn,W.tokensOut=B.tokensOut},o=()=>a().replayTranscript(X,K),NZ={renderer:X,cwd:$.cwd,store:()=>K,modelRef:()=>H.modelFor()},eZ=(B,F=!0)=>{UZ(H,K);let P=K.stagedAttachments;K=new W7(V,B);let j=D7($.cwd,V,B);if(j.blocks)I=j.blocks;if(j.note!==null)for(let T of j.note.split(`
32
+ `))X.addSystemNote(T);$.setBlockStore(I),$.setSessionStore(K),H.restore(rZ(K.messages())??E.defaultMode??"act");let L=H.modelFor();if(W.mode=H.mode,W.model=L.model,W.provider=L.provider,W.turns=0,o(),x(),R(),F)X.addSystemNote(`session ${B.slice(0,8)} (${K.messages().length} messages)`);l7(NZ,P)},Z0={renderer:X,busy:()=>W.busy,sessionId:()=>K.id,checkpointsFor:(B)=>$.checkpointsFor(B),branchTo:(B)=>K.branch(B),replayAndRefresh:()=>{o(),x(),R()}},s={renderer:X,cwd:$.cwd,sessionsDir:V,busy:()=>W.busy,store:()=>K,switchSession:eZ,replayHistory:o,refreshUsage:x,pushStatus:R},v={renderer:X,rt:$,sessionsDir:V,catalog:G,state:W,store:()=>K,blocks:()=>I,commands:{builtin:$Z,custom:U.commands}},x7={renderer:X,modes:H,state:W,pushStatus:R,submit:(B)=>RZ(B)},i7={renderer:X,cwd:$.cwd,busy:()=>W.busy,store:()=>K,modes:H,state:W,defaultMode:E.defaultMode??"act",buildCfg:()=>$.buildCfg(AZ(),QZ()),bindAbort:(B)=>{b=B},switchSession:eZ,replayHistory:o,refreshUsage:x,pushStatus:R,submit:(B)=>RZ(B)},i=()=>({rt:$,modes:H,state:W,renderer:X,pushStatus:R,catalog:G}),$0=(B)=>{let F=B.split(/\s+/).filter((L)=>L.length>0);if(!F.includes("--save"))return"this session only \u2014 add --save to make it the default (--project pins it to this repo)";let P=F.includes("--project")?"project":"user",j=W.yolo?"auto":W.acceptEdits?"accept-edits":"ask";try{let L=oZ("permission",j,P,$.cwd);return`saved: ${j} is the default now (${L})`}catch(L){return`could not save it: ${L instanceof Error?L.message:String(L)}`}},J0=(B)=>{let F=G.lookup(W.provider,W.model),P={provider:W.provider,model:W.model,effort:B,...F?.supportsReasoning!==void 0?{reasoning:F.supportsReasoning}:{}};return L7(P,$.providers.get(W.provider)?.protocol??"openai",{shape:U7(P)})},JZ=!0,a7=(B)=>{let[F,...P]=B.slice(1).split(/\s+/),j=P.join(" ").trim();switch(F){case"exit":case"quit":return IZ(),!0;case"help":return g().cmdHelp(v),!0;case"update":return X.addSystemNote("update: checking\u2026"),import("./update-cmd-v23qhr8c.js").then(({updateFlow:L})=>L(j.length>0?j.split(/\s+/):[],{version:n.version,entry:import.meta.path,log:(T)=>X.addSystemNote(`update: ${T}`,/failed|error/i.test(T)?"warn":void 0)})).catch((L)=>X.addSystemNote(`update failed: ${L instanceof Error?L.message:String(L)}`,"warn")),!0;case"mouse":{let L=(j.length>0?j:"toggle").toLowerCase();if(L!=="on"&&L!=="off"&&L!=="toggle")return X.addSystemNote('usage: /mouse on | off | toggle \u2014 "off" hands the drag to the terminal so you can select and copy text',"warn"),!0;if(!X.setMouse)return X.addSystemNote("this view never captures the mouse \u2014 select and copy with the terminal as usual"),!0;return JZ=L==="toggle"?!JZ:L==="on",X.setMouse(JZ),X.addSystemNote(JZ?"mouse on \u2014 clicks, panel focus and scrollbar dragging are back":"mouse off \u2014 drag to select and copy text in any panel; /mouse on brings the clicks back (Shift+drag also works while the mouse is on)"),!0}case"effort":{let L=j.split(/\s+/).filter((_)=>_.length>0),T=L.includes("--save"),k=L.filter((_)=>_!=="--save").join(" ").trim();if(k.length===0){if(!T)return X.addSystemNote(cZ($.effort,J0($.effort))),!0;return X.addSystemNote("usage: /effort auto | off | low | medium | high [--save [--project]]","warn"),!0}let y=K7(k);if(y===void 0)return X.addSystemNote(`"${k}" is not a level \u2014 ${WZ.join(" \xB7 ")} [--save]`,"warn"),!0;if($.setEffort(y),X.addSystemNote(cZ(y,J0(y))),T)try{let _=oZ("effort",y,L.includes("--project")?"project":"user",$.cwd);X.addSystemNote(`saved: effort ${y} is the default now (${_})`)}catch(_){X.addSystemNote(`could not save it: ${_ instanceof Error?_.message:String(_)}`,"warn")}return R(),!0}case"accept-edits":return W.acceptEdits=!W.acceptEdits,X.addSystemNote(W.yolo?`${LZ(W.acceptEdits)} (auto mode is on, so nothing asks either way \u2014 /yolo turns it off)`:LZ(W.acceptEdits)),X.addSystemNote($0(j)),R(),!0;case"yolo":return W.yolo=!W.yolo,X.addSystemNote(j7(W.yolo)),X.addSystemNote($0(j)),R(),!0;case"model":return MZ(i(),j),!0;case"models":return bZ(i(),j),!0;case"provider":return b0(i(),j),!0;case"setup":return yZ(i()),!0;case"connect":return S0(i(),j),!0;case"plan":case"act":return _7(H,F,W,X,R),!0;case"checkpoints":return z0(Z0),!0;case"restore":return H0(Z0,j),!0;case"commit":return f7(Q0,B.slice(1+(F??"").length)),!0;case"undo":return w7(Q0),!0;case"status":return g().cmdStatus(v),!0;case"cost":return g().cmdCost(v,j),!0;case"skills":return g().cmdSkills(v),!0;case"memory":return g().cmdMemory(v,j),!0;case"todos":return g().cmdTodos(v),!0;case"tasks":return g().cmdTasks(v,j),!0;case"new":return a().cmdNew(s),!0;case"rewind":case"tree":return a().cmdRewind(s),!0;case"sessions":return Y9().cmdSessionsVerb(s,j),!0;case"compact":case"clear":case"init":case"copy":return v7(i7,F??"",j),!0;case"trust":return X4({renderer:X,cwd:$.cwd},j),!0;case"agents":return G4({renderer:X,agents:$.agents}),!0;case"config":return q4({renderer:X,cwd:$.cwd},j),!0;case"resume":if(j)a().cmdSessions(s,j);else a().cmdSessions(s);return!0;case"export":return g().cmdExport(v,j),!0;case"attach":return g7(NZ,j),!0;case"paste":return u7(NZ),!0;case"mcp":return s0({renderer:X,cwd:$.cwd},j),!0;default:if(!y7(x7,U.commands,F??"",B.slice(1+(F??"").length)))X.addSystemNote(`unknown command: /${F} (try /help)`,"warn");return!0}},AZ=()=>W.yolo?"auto":W.acceptEdits?"accept-edits":"ask",QZ=()=>W.yolo?void 0:async(B)=>{let F=B.tool==="edit"||B.tool==="write";if(F&&W.acceptEdits)return"once";let P;if(F)try{P=p7(B.tool,B.revisedArgs,$.cwd).text||void 0}catch{P=void 0}let j=await X.askApproval(B.tool,JSON.stringify(B.revisedArgs).slice(0,140),P);if(j!=="all-edits")return j;return W.acceptEdits=!0,X.addSystemNote(LZ(!0)),R(),"once"},n7={renderer:X,rt:$,store:()=>K,level:AZ,approve:QZ,busy:()=>W.busy,setBusy:(B)=>{W.busy=B,R()},bindAbort:(B)=>{b=B}},Q0={renderer:X,rt:$,store:()=>K,approve:QZ,yolo:()=>W.yolo,busy:()=>W.busy,setBusy:(B)=>{W.busy=B,R()},bindAbort:(B)=>{b=B}},d7=async(B)=>{let F=$.stream,P=$.noProviderReason();if(!F||P!==null){X.addSystemNote(P!==null?G7("tui"):"no provider stream","error");return}W.busy=!0,X.setBusy(!0,"thinking\u2026"),R();let j=AZ(),L=$.buildCfg(j,QZ()),T=H.modelFor(),k=$.buildDef({provider:T.provider,model:T.model});T7(H,L,k);let y=new Map,_=new kZ(X),u=null;b=new AbortController,$.tasks.bindRun(b.signal,{label:B}),M=q7(k,B,{},L,{stream:F,registry:$.registry,store:K,tools:$.registry.list().map((q)=>q.schema),guard:$.guard,planReminder:$.planReminder,signal:b.signal,cwd:$.cwd,hooks:$.hooks},z);try{for await(let q of M)if(X.onEvent?.(q),_.onEvent(q),q.type==="turn_start")E7(),W.turns++,R();else if(q.type==="message_update"){let C=y.get(q.messageId);if(!C)C=X.beginAssistant(),y.set(q.messageId,C),u?.done(),u=C;C.append(q.delta)}else if(q.type==="tool_execution_start")X.toolStart(q.callId,q.tool,JSON.stringify(q.args).slice(0,120));else if(q.type==="tool_execution_update")X.toolUpdate(q.callId,q.note);else if(q.type==="tool_execution_end")X.toolEnd(q.callId,q.ok,q.output.slice(0,160).replace(/\n/g," \u23CE "),q.durationMs);else if(q.type==="tool_call_failed")X.toolEnd(q.callId,!1,`${q.reason}: ${q.detail}`.slice(0,160),0);else if(q.type==="compaction")X.addSystemNote(h7(q));else if(q.type==="steer")X.addSystemNote("\u21AA steering applied");else if(q.type==="verify")X.addSystemNote(q.state==="running"?`\u29D7 verify: ${q.command.slice(0,120)}`:`verify ${q.state}: ${q.detail??""}`,q.state==="running"||q.state==="passed"?"info":"warn");else if(q.type==="run_end"){if(u?.done(),q.status==="error")X.addSystemNote(q.summary,"error");else if(q.status!=="done")X.addSystemNote(`run ${q.status}: ${q.summary}`,"warn");else if(q.outstanding){let C=O7(q.outstanding);if(C!==null)X.addSystemNote(`done \xB7 ${C}`,P7(q.outstanding))}if(y.size===0&&q.status==="done"&&q.summary){let C=X.beginAssistant();C.append(q.summary),C.done()}}}finally{M=null,b=null,W.busy=!1,x();for(let q of $.drainRouterNotes())X.addSystemNote(q,"warn");X.setBusy(!1),R()}},RZ=(B)=>{if(!B.trim()){let F=K.stagedAttachments.length;return X.addSystemNote(F===0?"nothing to send \u2014 the message is empty":`type a message to send with the attached image${F===1?"":"s"}`,"warn"),Promise.resolve()}if(X.addUser(OZ(B,K.stagedAttachments)),UZ(H,K),W.busy)return z.push(B),X.addSystemNote(`queued as steering (applies before the next model turn)${m7(K)}`),Promise.resolve();return d7(B)},X0=async(B)=>{if(Z.startup?.finish(),IZ(!1),await N,B instanceof sZ&&Z.exitOnClose!==!1)console.error(`error: ${B.message}`),process.exit(2);throw B},Y0=async()=>{try{await zZ($.sandbox.ready,Z.startup?.signal)}catch(B){await X0(B)}};if(Z.startup)Z.startup.status("checking sandbox"),await Y0(),Z.startup.status("preparing interface");J("renderer.attach"),X.attach?.(R4({cwd:$.cwd,sessionsDir:V,store:()=>K,tasks:$.tasks,model:()=>H.modelFor(),catalog:G,runtime:()=>$,petName:Z.pet,wizard:{providers:()=>{let B=[],F=new Set,P=[...$.providers.list()].sort((j,L)=>Number(S(L))-Number(S(j)));for(let j of P){if(F.has(j.id)||j.id==="custom")continue;F.add(j.id),B.push({key:j.id,label:j.id==="kaesra"?"kaesra \u2014 the default host":j.id,...S(j)?{configured:!0}:{},...j.noKey===!0?{local:!0}:{}})}for(let j of t)if(j.url!==void 0)B.push({key:j.key,label:j.label,url:j.url});return B},register:(B,F,P)=>{let j=$.providers.add({id:B,baseUrl:F,protocol:P},"user");return"error"in j?{ok:!1,error:j.error}:{ok:!0}},storeKey:(B,F)=>{try{let P=$.providers.get(B),j=P?.id??B;if(P===void 0)return{ok:!1,error:`unknown provider "${B}"`};return YZ(P.id,F,P.keyEnv),$.providers.refresh(),{ok:!0}}catch(P){return{ok:!1,error:P instanceof Error?P.message:String(P)}}},models:async(B)=>{let F=B,P=$.providers.get(F),j=new Set(P?.models??[]),L=P?.defaultModel,T=[],k=(_)=>{T.push({id:_,...j.has(_)?{active:!0}:{},..._===L?{defaultModel:!0,note:"default"}:{}})},y=await $.providers.models(F);if(y.ok){for(let _ of y.models)if(!T.some((u)=>u.id===_))k(_)}for(let _ of j)if(!T.some((u)=>u.id===_))k(_);return T},activateModels:(B,F,P)=>{let j=B;if($.providers.get(j)===void 0)return{ok:!1,error:"no provider behind this row"};let L=$.providers.setModels(j,F,"user");if("error"in L)return{ok:!1,error:L.error};if(P!==void 0){let T=$.providers.setDefault(`${j}/${P}`,"user");if(!("error"in T))H.setModel({provider:T.provider,model:T.model}),W.provider=H.modelFor().provider,W.model=H.modelFor().model,R()}return{ok:!0,...L}},test:async(B,F)=>{let P=B;if($.providers.get(P)===void 0)return{ok:!1,detail:"no provider behind this row"};let j=await $.providers.probe(P,F);if(!j.ok)return{ok:!1,detail:j.detail};let L=$.providers.setDefault(`${P}/${F}`,"user");if("error"in L)return{ok:!1,detail:L.error};return H.setModel({provider:L.provider,model:L.model}),W.provider=H.modelFor().provider,W.model=H.modelFor().model,R(),{ok:!0,detail:`${j.detail} \u2014 default \u2192 ${P}/${F}`}}}}));let _Z=[],c7=()=>{R0($.providers).then((B)=>{_Z.splice(0,_Z.length,...B)}).catch(()=>{})};X.setCommands([...$Z.map((B)=>B.name===VZ.name?{...B,choices:()=>_Z}:B),...b7(U.commands)]),setTimeout(c7,0);let o7=process.listeners("warning");process.removeAllListeners("warning");let B0=(B)=>{let F=B.message.split(`
33
+ `)[0]??B.message;X.addSystemNote(`node: ${B.name==="Warning"?"":`${B.name}: `}${F}`,"warn")};process.on("warning",B0),tZ=()=>{process.off("warning",B0);for(let B of o7)process.on("warning",B)};let V0=!1,K0=()=>{if(V0)return;if(V0=!0,Y.id!==void 0)o(),x();U4({renderer:X,rt:$,yolo:W.yolo,modelRef:W,mode:W.mode,version:n.version,width:process.stdout.columns??80,sessionId:Y.id!==void 0?K.id:void 0,bootWarn:Y.warn,commandWarnings:U.warnings}),R()},G0=!1,j0=()=>{if(G0)return;Z.startup?.signal?.throwIfAborted(),G0=!0,J("complete first frame ready; releasing intro"),Z.startup?.finish()};J("renderer.start");try{let B=X.start({onSubmit:(F)=>{if(F.startsWith("/"))a7(F);else if(S7({renderer:X,blocks:()=>I},F))return;else if(C7(F)!==null)k7(n7,F);else RZ(F)},onInterrupt:()=>{b?.abort(),M?.return(void 0),X.addSystemNote("run interrupted","warn")},onExit:()=>IZ()},{beforeFirstRender:K0,onReveal:j0,...Z.startup?{animate:!1,beforeReveal:()=>{return J("first frame prepared; waiting for intro"),zZ(Z.startup?.animationDone??Promise.resolve(),Z.startup?.signal)}}:{}});if(K0(),$.warmRepoMap(),B)await zZ(B,Z.startup?.signal);j0()}catch(B){await X0(B)}if(p){await N;return}if(J("interface ready"),EZ=D4({restore:()=>X.restoreTerminal?.(),logDir:PZ(w(),"logs"),version:n.version}),Y.id===void 0)z7(n.version).then((B)=>{let F=H7(B);if(F!==null)X.addSystemNote(F);if(B.newer&&F7($.cwd,process.env))X.addSystemNote("auto-update: a newer release is out \u2014 updating in the background\u2026"),import("./update-cmd-v23qhr8c.js").then(({updateFlow:P})=>P([],{version:n.version,entry:import.meta.path,log:(j)=>X.addSystemNote(`update: ${j}`,/failed|error/i.test(j)?"warn":void 0)})).catch(()=>{})}).catch(()=>{});if(C0(i()),!Z.startup)await Y0();await N}
34
+ export{$Z as g,jJ as h};
@@ -0,0 +1,5 @@
1
+ // @bun
2
+ import{wn as X}from"./main-qsevpgsv.js";import{existsSync as Z,mkdirSync as C,readFileSync as U,writeFileSync as G}from"fs";import{join as W,resolve as I}from"path";function u(q){if(q.kind!=="stdio"||q.runtime!=="npx"||q.command!=="npx")return;let z=0;while(z<q.args.length&&q.args[z].startsWith("-")){if(!N.has(q.args[z]))return;z+=1}let D=q.args[z];if(D===void 0)return;let H=O.exec(D);if(!H)return;let B={name:H[1],spec:D,rest:q.args.slice(z+1)};if(H[2]!==void 0)B.version=H[2];return B}function w(q){return W(q,"mcp")}function V(q,z){return["npm","install","--prefix",z,"--save","--no-fund","--no-audit","--loglevel=error",q.spec]}async function S(q,z,D={}){let H=D.spawn??R;try{C(z,{recursive:!0});let B=W(z,"package.json");if(!Z(B))G(B,JSON.stringify({name:"rovecode-mcp-servers",private:!0,description:"MCP servers installed once by rovecode's market \u2014 launched with node, not npx (docs/mcp-market.md)"},null,2)+`
3
+ `);let J=await H(V(q,z),z);if(J.code!==0)return{ok:!1,error:`npm install ${q.spec} failed (exit ${J.code})${J.stderr.trim()?`: ${J.stderr.trim().split(`
4
+ `).slice(-3).join(" \xB7 ")}`:""}`}}catch(B){return{ok:!1,error:`npm install ${q.spec} could not run: ${B instanceof Error?B.message:String(B)}`}}return L(q.name,z)}function L(q,z){let D=W(z,"node_modules",...q.split("/")),H=W(D,"package.json");if(!Z(H))return{ok:!1,error:`npm reported success but ${H} is not there`};let B;try{B=JSON.parse(U(H,"utf8"))}catch(K){return{ok:!1,error:`${H}: ${K instanceof Error?K.message:String(K)}`}}let J=typeof B.version==="string"?B.version:void 0;if(J===void 0)return{ok:!1,error:`${H} states no version`};let Q=E(q,B.bin);if(Q===void 0)return{ok:!1,error:`${q} declares no bin \u2014 there is nothing for node to run; npx would have failed the same way`};let M=I(D,Q);if(!Z(M))return{ok:!1,error:`${q}'s bin ${M} is not on disk`};let T=[],Y=F(z,q,T),$={name:q,version:J,bin:M,missing:T};if(Y?.integrity!==void 0)$.integrity=Y.integrity;if(Y?.resolved!==void 0)$.resolved=Y.resolved;return{ok:!0,pkg:$}}function E(q,z){if(typeof z==="string")return z;if(typeof z!=="object"||z===null)return;let D=Object.entries(z).filter((B)=>typeof B[1]==="string");if(D.length===0)return;let H=q.split("/").pop();return(D.find(([B])=>B===H)??D[0])[1]}function F(q,z,D){let H=W(q,"package-lock.json");if(!Z(H)){D.push(`integrity: ${H} was not written by npm`);return}let B;try{B=JSON.parse(U(H,"utf8"))}catch{D.push(`integrity: ${H} is not valid JSON`);return}let J=typeof B==="object"&&B!==null?B.packages:void 0;if(typeof J!=="object"||J===null){D.push(`integrity: ${H} has no "packages" map (lockfileVersion 1?)`);return}let Q=J[`node_modules/${z}`];if(typeof Q!=="object"||Q===null){D.push(`integrity: ${H} has no entry for node_modules/${z}`);return}let M=Q,T={};if(typeof M.integrity==="string")T.integrity=M.integrity;else D.push(`integrity: the lockfile entry for ${z} carries no integrity field`);if(typeof M.resolved==="string")T.resolved=M.resolved;return T}function v(q,z){return{command:"node",args:[q.bin,...z]}}function y(q,z){return["node",`${W(z,"node_modules",...q.name.split("/"))}${process.platform==="win32"?"\\":"/"}<its bin, read after the install>`,...q.rest].join(" ")}function P(q,z){return[` installs ${V(q,z).join(" ")}`,` rovecode runs a package manager for you here. npm downloads ${q.spec} and everything it depends`,` on and puts their CODE on this machine, under ${z} \u2014 typically 20\u201330 MB and a few seconds, once.`," In return the server starts in ~0.4 s instead of ~2 s and needs no network to start."," Requires npm (it comes with Node.js, as npx does)."," records package name, version and npm's integrity hash in installed.json \u2014 what ran is on record",' (an npx line runs whatever "latest" is at every start, and records nothing)']}function h(q){return q.transport==="stdio"&&q.command==="npx"&&q.enabled!==!1}function b(q){if(q.length===0)return;let z=q.length;return`${z} server${z===1?"":"s"} start${z===1?"s":""} through npx, which re-resolves the package at every start (~2 s each): ${q.join(", ")}. To start in ~0.4 s, reinstall with \`rovecode mcp add <catalog name> --local --force\` (the name you installed it by; add \`--as <server name>\` if you renamed it; installs the package once, ~25 MB). Nothing changes until you do.`}var N,O,R=async(q,z)=>{let D=Bun.spawn(q,{cwd:z,stdout:"ignore",stderr:"pipe",stdin:"ignore"});return{code:await D.exited,stderr:await new Response(D.stderr).text()}};var _=X(()=>{N=new Set(["-y","--yes","-q","--quiet","--no-install","--prefer-offline","--prefer-online"]),O=/^(@[a-z0-9][a-z0-9._-]*\/[a-z0-9][a-z0-9._-]*|[a-z0-9][a-z0-9._-]*)(?:@([^@\s/]+))?$/});
5
+ export{u as pc,w as qc,S as rc,v as sc,y as tc,P as uc,h as vc,b as wc,_ as xc};
@@ -0,0 +1,6 @@
1
+ // @bun
2
+ import{wn as w}from"./main-qsevpgsv.js";import{dlopen as a,FFIType as J,ptr as U}from"bun:ffi";function zq(){if(N===void 0){if(N=null,process.platform==="win32")try{N=a("kernel32.dll",{CreateJobObjectW:{args:[J.ptr,J.ptr],returns:J.ptr},SetInformationJobObject:{args:[J.ptr,J.i32,J.ptr,J.u32],returns:J.i32},AssignProcessToJobObject:{args:[J.ptr,J.ptr],returns:J.i32},TerminateJobObject:{args:[J.ptr,J.u32],returns:J.i32},OpenProcess:{args:[J.u32,J.i32,J.u32],returns:J.ptr},CloseHandle:{args:[J.ptr],returns:J.i32},CreateToolhelp32Snapshot:{args:[J.u32,J.u32],returns:J.ptr},Process32FirstW:{args:[J.ptr,J.ptr],returns:J.i32},Process32NextW:{args:[J.ptr,J.ptr],returns:J.i32}})}catch{N=null}}return N?N.symbols:null}function I(){if(qq===!1)return null;let q=zq();if(!q)return null;let Q=q.CreateJobObjectW(null,null);if(!M(Q))return null;let z=new Uint8Array(D);if(new DataView(z.buffer).setUint32(t,s,!0),!q.SetInformationJobObject(Q,E,U(z),D))return q.CloseHandle(Q),null;let V=Q,W=()=>{if(V!==null)q.CloseHandle(V),V=null},Y=($)=>{if(V===null)return!1;let H=q.OpenProcess(o,0,$);if(!M(H))return!1;try{return q.AssignProcessToJobObject(V,H)!==0}finally{q.CloseHandle(H)}};return{assign($){if(!Y($))return W(),!1;for(let H of Qq(q,$))Y(H);return!0},terminate(){if(V===null)return;q.TerminateJobObject(V,1),W()},release(){if(V===null)return;q.SetInformationJobObject(V,E,U(new Uint8Array(D)),D),W()}}}function Qq(q,Q){let z=q.CreateToolhelp32Snapshot(n,0);if(!M(z))return[];let V=new Map;try{let H=new Uint8Array(m),Z=new DataView(H.buffer);if(Z.setUint32(0,m,!0),!q.Process32FirstW(z,U(H)))return[];do{let X=Z.getUint32(r,!0),G=Z.getUint32(e,!0),B=V.get(G);if(B)B.push(X);else V.set(G,[X])}while(q.Process32NextW(z,U(H)))}finally{q.CloseHandle(z)}let W=new Set([Q]),Y=[],$=[Q];while($.length>0)for(let H of V.get($.pop())??[])if(!W.has(H))W.add(H),Y.push(H),$.push(H);return Y}var s=8192,E=9,D=144,t=16,o=257,n=2,m=568,r=8,e=32,N,qq=null,M=(q)=>typeof q==="number"&&q>0&&q<=4294967295;var h=()=>{};function T(q){return q==="win32"?{}:{detached:!0}}function R(q,Q,z=Vq){if(!(q>0))return!1;try{return z(-q,Q),!0}catch{return!1}}var Vq=(q,Q)=>{process.kill(q,Q)};var F=()=>{};import{existsSync as Yq}from"fs";function b(q,Q){let z=[],V=q.getReader();return{done:(async()=>{for(let Y=await V.read();!Y.done;Y=await V.read())if(Y.value)z.push(Y.value),Q?.(Y.value)})().catch(()=>{}),text:()=>new TextDecoder().decode(Buffer.concat(z)),cancel:()=>{V.cancel().catch(()=>{})}}}function Jq(q,Q){if(!Q)return{treeKill:!1,grouped:!1};return q==="win32"?{treeKill:!0,grouped:!1}:{treeKill:!1,grouped:!0}}function _(q,Q){return(q+(Q?`
3
+ stderr:
4
+ ${Q}`:"")).slice(0,Xq)}function Zq(){if(K!==null)return K;if(process.platform!=="win32")return K="bash";let q="C:/Program Files/Git/bin/bash.exe";return K=Yq(q)?q:"bash",K}function c(q){return q.replace(/\u0000/g,"").trim().slice(0,200)}async function g(q,Q,z){let V={code:-1,stdout:"",stderr:`probe timed out after ${z}ms`},W,Y=new Promise(($)=>{W=setTimeout(()=>$(V),z)});try{let $=await Promise.race([q(Q,{signal:AbortSignal.timeout(z)}),Y]);return{r:$,timedOut:$===V}}finally{clearTimeout(W)}}async function d(q,Q=C,z=process.platform,V={}){let W=V.timeoutMs??Pq;switch(q){case"direct":return{rung:q,available:!0,detail:"always available \u2014 today's in-process bash (blocklist only, NOT a sandbox)"};case"wsl":{if(z!=="win32")return{rung:q,available:!1,detail:`wsl rung requires Windows wsl.exe (platform is ${z})`};let Y="wsl.exe --exec bash -c true",{r:$,timedOut:H}=await g(Q,["wsl.exe","--exec","bash","-c","true"],W);if(H)return{rung:q,available:!1,detail:`wsl trial (${Y}) timed out after ${W}ms \u2014 wrapper did not answer (a cold WSL utility-VM boot exceeds this cap); warm it with the same command and reconfigure`};return $.code===0?{rung:q,available:!0,detail:`wsl trial (${Y}) ok`}:{rung:q,available:!1,detail:`wsl trial (${Y}) exited ${$.code}: ${c($.stderr||$.stdout)||"no output"}`}}case"docker":{let Y=V.dockerImage??u,$=`docker run --rm ${Y} bash -c true`,{r:H,timedOut:Z}=await g(Q,["docker","run","--rm",Y,"bash","-c","true"],W);if(Z)return{rung:q,available:!1,detail:`docker trial (${$}) timed out after ${W}ms \u2014 daemon wedged or pulling the image; pre-pull it and retry`};return H.code===0?{rung:q,available:!0,detail:`docker trial (${$}) ok`}:{rung:q,available:!1,detail:`docker trial (${$}) exited ${H.code}: ${c(H.stderr||H.stdout)||"no output"}`}}}}function Cq(q=C,Q=process.platform,z={}){return Promise.all($q.map((V)=>d(V,q,Q,z)))}function l(q){return{rung:"direct",async run(Q,z,V,W){let Y=await q([Zq(),"-c",Q],{cwd:z,signal:V,...W?{observe:W}:{}});return{code:Y.code,text:_(Y.stdout,Y.stderr)}}}}function Gq(q){return{rung:"wsl",async run(Q,z,V,W){let Y=await q(["wsl.exe","--cd",z,"--exec","bash","-c",Q],{cwd:z,signal:V,...W?{observe:W}:{}});return{code:Y.code,text:_(Y.stdout,Y.stderr)}}}}function Bq(q,Q){return{rung:"docker",async run(z,V,W,Y){let $=["docker","run","--rm","-v",`${V}:/workspace`,"-w","/workspace",Q,"bash","-c",z],H=await q($,{cwd:V,signal:W,...Y?{observe:Y}:{}});return{code:H.code,text:_(H.stdout,H.stderr)}}}}async function Nq(q,Q={}){let z=Q.runner??C,V=await d(q,z,Q.platform??process.platform,{dockerImage:Q.dockerImage});if(!V.available)throw new A(q,V.detail);switch(q){case"direct":return l(z);case"wsl":return Gq(z);case"docker":return Bq(z,Q.dockerImage??u)}}async function Aq(q,Q){x=q;try{return L=await Nq(q,Q),O=null,L}catch(z){throw O=z instanceof A?z.detail:z instanceof Error?z.message:String(z),z}}function Sq(){if(L?.rung===x)return L;if(x==="direct")return L=l(C);throw new A(x,O??`configureExecutor('${x}') has not succeeded; the seam refuses to substitute another rung`)}function fq(){L=null,x="direct",O=null}var $q,Wq=500,Hq="[output truncated: process tree terminated on abort]",C=async(q,Q)=>{let z=Q.signal,{treeKill:V,grouped:W}=Jq(process.platform,z!==void 0);if((V||W)&&z?.aborted)return{code:143,stdout:"",stderr:"aborted before spawn"};let Y,$=null,H=!1,Z;try{let X=Bun.spawn([...q],{cwd:Q.cwd,signal:V||W?void 0:z,stdout:"pipe",stderr:"pipe",...W?T(process.platform):{}});Q.observe?.onSpawn?.(X.pid);let G=Q.observe,B=b(X.stdout,G?.onChunk?(P)=>G.onChunk("stdout",P):void 0),S=b(X.stderr,G?.onChunk?(P)=>G.onChunk("stderr",P):void 0),k=Promise.all([B.done,S.done,X.exited]).then(()=>"done"),v,p=new Promise((P)=>{v=()=>P("grace")});if(z){if(V){if($=I(),$&&!$.assign(X.pid))$=null}Y=()=>{let P=X.exitCode===null;if(H=V||W,V){if($?.terminate(),P)try{Bun.spawn(["taskkill","/T","/F","/PID",String(X.pid)],{stdout:"ignore",stderr:"ignore"})}catch{}}if(W){if(R(X.pid,"SIGTERM"),P)try{X.kill("SIGTERM")}catch{}}Z=setTimeout(v,Wq)},z.addEventListener("abort",Y,{once:!0}),k.then(()=>{if(Y)z.removeEventListener("abort",Y)},()=>{})}let j=await Promise.race([k,p]);if(j==="grace"&&W)R(X.pid,"SIGKILL");if(j==="grace")B.cancel(),S.cancel();let i=H||j==="grace"?143:await X.exited,f=S.text();if(j==="grace")f+=(f?`
5
+ `:"")+Hq;let y={code:i,stdout:B.text(),stderr:f};if(V)y.treeKill=$?"job":"taskkill-only";return y}catch(X){return{code:-1,stdout:"",stderr:`spawn failed: ${X instanceof Error?X.message:String(X)}`}}finally{if(clearTimeout(Z),H)$?.terminate();else $?.release();if(Y)z?.removeEventListener("abort",Y)}},Xq=1e4,K=null,Pq=500,A,u="debian:stable-slim",L=null,x="direct",O=null;var xq=w(()=>{h();F();$q=["direct","wsl","docker"];A=class A extends Error{rung;detail;constructor(q,Q){super(`executor rung '${q}' is unavailable: ${Q}. `+"Refusing to fall back down the ladder \u2014 pick an available rung explicitly "+`(probeLadder() reports availability) or make '${q}' usable and retry.`);this.name="RungUnavailableError",this.rung=q,this.detail=Q}}});
6
+ export{I as Nh,h as Oh,T as Ph,R as Qh,F as Rh,$q as Sh,Wq as Th,Hq as Uh,Jq as Vh,C as Wh,Xq as Xh,Pq as Yh,d as Zh,Cq as _h,A as $h,u as ai,Nq as bi,Aq as ci,Sq as di,fq as ei,xq as fi};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{om as A,vm as I}from"./main-y5c82rxr.js";import{nn as q,pn as v,qn as z,tn as H}from"./main-nqveez48.js";import{wn as G}from"./main-qsevpgsv.js";import{existsSync as J}from"fs";function W(B){let b=A(B);return[b.harvest,b.project].filter((E)=>J(E))}var R,U,V;var K=G(()=>{H();I();R=q,U=v,V=z});
3
+ export{R as Ad,U as Bd,V as Cd,W as Dd,K as Ed};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{wn as W}from"./main-qsevpgsv.js";import{existsSync as Y}from"fs";function D(z,B={}){let C=B.windows??process.platform==="win32",J=B.exists??Y,M=Z[z.toLowerCase()],K={program:z,found:!1,...M?{hint:M}:{}};if(z.includes("/")||z.includes("\\"))return J(z)?{...K,found:!0,path:z}:K;let Q=(B.PATH??process.env.PATH??"").split(C?";":":").map((G)=>G.trim().replace(/^"|"$/g,"")).filter((G)=>G!==""),R=C?["",...(B.PATHEXT??process.env.PATHEXT??$).split(";").map((G)=>G.trim()).filter((G)=>G!=="")]:[""];for(let G of Q)for(let V of R){let O=j(G,z+V,C);if(J(O))return{...K,found:!0,path:O}}return K}function X(z,B){let C=I(z);return C===void 0?void 0:D(C,B)}function I(z){let B=z.install;switch(B.kind){case"mcp":{let C=B.entry.installs?.[0];return C!==void 0&&C.kind==="stdio"?C.command:void 0}case"plugin":return B.git?"git":void 0;case"skill":return B.source?.git!==void 0?"git":void 0}}function _(z){if(z===void 0)return;if(z.found)return`${z.program} \u2713`;return`${z.program} \u2014 not on PATH${z.hint?` (install: ${z.hint})`:""}`}var Z,$=".COM;.EXE;.BAT;.CMD",j=(z,B,C)=>{let J=C?"\\":"/";return z.endsWith("/")||z.endsWith("\\")?`${z}${B}`:`${z}${J}${B}`};var L=W(()=>{Z={npx:"comes with Node.js \u2014 nodejs.org",npm:"comes with Node.js \u2014 nodejs.org",node:"nodejs.org",uvx:"pipx install uv \u2014 astral.sh/uv",uv:"pipx install uv \u2014 astral.sh/uv",docker:"docker.com/get-started",git:"git-scm.com/downloads",python:"python.org/downloads",python3:"python.org/downloads",deno:"deno.com",bun:"bun.sh"}});
3
+ export{D as Vb,X as Wb,_ as Xb,L as Yb};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{Eg as b,Ig as M,Kg as x,Lg as h,Vg as c}from"./main-7jd5vh3x.js";import{El as V,Hl as R}from"./main-5py0rkmc.js";import{pm as $,vm as N}from"./main-y5c82rxr.js";import{$m as u,Lm as U}from"./main-2yeveeve.js";import{dn as D,kn as v}from"./main-nqveez48.js";u();h();R();N();M();import{existsSync as E}from"fs";import{join as I}from"path";import{pathToFileURL as O}from"url";var S=5000;function _(z=process.env){let J=Number(z.ROVECODE_PLUGIN_TIMEOUT_MS);return Number.isFinite(J)&&J>=1?Math.floor(J):S}var A=["read","write","execute","spawn","memory","network","custom"],L=/^[a-z][a-z0-9_]{0,63}$/,G=Symbol("timed-out");async function y(z,J){let q,C=new Promise((B)=>{q=setTimeout(()=>B(G),J)});try{return await Promise.race([z,C])}finally{if(q!==void 0)clearTimeout(q)}}var P=(z)=>z instanceof Error?z.message:String(z);async function K(z,J){let q=[],C=[];for(let B of z)C.push(await T(B,J,q));return{plugins:C,warnings:q}}async function T(z,J,q){let C={...z,tools:[],hooks:null};if(z.status!=="active"||z.manifest===null)return C;let B=z.manifest,W=`plugin ${z.name}`;if(!B.entry)return C;let k=I(z.dir,B.entry);if(!E(k))return q.push(`${W}: entry ${B.entry} does not exist \u2014 no tools or hooks loaded`),C;let F=J.timeoutMs??_(),H;try{H=await y(import(O(k).href),F)}catch(Q){return q.push(`${W}: ${B.entry} failed to load \u2014 ${P(Q)}`),C}if(H===G)return q.push(`${W}: ${B.entry} load timed out after ${F}ms (top-level await?) \u2014 skipped`),C;let Y=$(H)?H.default:void 0;if(!$(Y))return q.push(`${W}: ${B.entry} must \`export default { api: ${b}, tools?, hooks? }\` \u2014 skipped`),C;if(Y.api!==b)return q.push(`${W}: ${B.entry} declares api ${String(Y.api)}; this rovecode speaks ${b} \u2014 skipped`),C;for(let Q of Object.keys(Y))if(!["api","tools","hooks"].includes(Q))q.push(`${W}: ${B.entry} exports unknown member "${Q}" \u2014 ignored`);if(Y.tools!==void 0){let Q;try{let X=Y.tools;Q=typeof X==="function"?await y(Promise.resolve(X({cwd:J.cwd,home:J.home,pluginDir:z.dir})),F):X}catch(X){q.push(`${W}: tools() threw \u2014 ${P(X)}`),Q=[]}if(Q===G)q.push(`${W}: tools() timed out after ${F}ms \u2014 no tools loaded`),Q=[];if(!Array.isArray(Q))q.push(`${W}: "tools" must be an array (or a function returning one) \u2014 ignored`),Q=[];let Z=new Set;for(let X of Q){let j=f(X,W,q);if(!j)continue;if(Z.has(j.schema.name)){q.push(`${W}: tool "${j.schema.name}" declared twice \u2014 first kept`);continue}Z.add(j.schema.name),C.tools.push(j)}}if(Y.hooks!==void 0)if(!$(Y.hooks))q.push(`${W}: "hooks" must be an object of hook functions \u2014 ignored`);else{let Q={};for(let[Z,X]of Object.entries(Y.hooks)){if(!V.includes(Z)){q.push(`${W}: unknown hook "${Z}" ignored (known: ${V.join(", ")})`);continue}if(typeof X!=="function"){q.push(`${W}: hook "${Z}" is not a function \u2014 ignored`);continue}Q[Z]=X}if(Object.keys(Q).length)C.hooks=Q}return C}function f(z,J,q){if(!$(z)||!$(z.schema))return q.push(`${J}: a tool without a schema was dropped`),null;let C=z.schema,B=C.name;if(typeof B!=="string"||!L.test(B))return q.push(`${J}: tool name ${JSON.stringify(B)} must match ${L} \u2014 dropped`),null;if(typeof C.description!=="string"||!C.description.trim())return q.push(`${J}: tool "${B}" needs a description \u2014 dropped`),null;if(!$(C.args))return q.push(`${J}: tool "${B}" needs a JSON-Schema "args" object \u2014 dropped`),null;if(!A.includes(z.kind))return q.push(`${J}: tool "${B}" kind ${JSON.stringify(z.kind)} is not one of ${A.join("|")} \u2014 dropped (the kind is its permission class)`),null;if(typeof z.execute!=="function")return q.push(`${J}: tool "${B}" has no execute() \u2014 dropped`),null;return z}v();M();v();h();c();async function Hq(z,J={}){let q=J.home??U(),C=x(z,{home:q,state:D(q)}),B=await K(C.plugins,{cwd:z,home:q,...J.timeoutMs!==void 0?{timeoutMs:J.timeoutMs}:{}});return{plugins:B.plugins,warnings:[...C.warnings,...B.warnings]}}function Vq(z){if(z.length===0)return null;let J=(C)=>z.filter((B)=>B.status===C).map((B)=>B.name),q=[];for(let C of["active","untrusted","disabled","broken"]){let B=J(C);if(B.length)q.push(`${B.length} ${C} (${B.join(", ")})`)}return`plugins: ${q.join(" \xB7 ")}`}
3
+ export{S as xg,K as yg,Hq as zg,Vq as Ag};
@@ -0,0 +1,18 @@
1
+ // @bun
2
+ import{lookup as o}from"dns/promises";var p=new Set(["script","style","noscript","template","title"]),d=new Set(["head","svg","iframe","object","canvas","audio","video","select"]),c=new Set(["head","meta","link","base","basefont","bgsound","noframes","title","style","script","noscript","template"]),l=new Set(["address","article","aside","blockquote","body","caption","center","dd","details","dialog","div","dl","dt","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hr","html","legend","main","menu","nav","ol","p","pre","section","summary","table","tbody","tfoot","thead","tr","ul"]),m=new Set(["p","h1","h2","h3","h4","h5","h6","blockquote","pre","ul","ol","table","figure"]),i={amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:" ",shy:"",copy:"\xA9",reg:"\xAE",trade:"\u2122",hellip:"\u2026",mdash:"\u2014",ndash:"\u2013",lsquo:"\u2018",rsquo:"\u2019",ldquo:"\u201C",rdquo:"\u201D",laquo:"\xAB",raquo:"\xBB",bull:"\u2022",middot:"\xB7",deg:"\xB0",times:"\xD7",divide:"\xF7",plusmn:"\xB1",euro:"\u20AC",pound:"\xA3",yen:"\xA5",cent:"\xA2",sect:"\xA7",para:"\xB6",larr:"\u2190",rarr:"\u2192",uarr:"\u2191",darr:"\u2193",harr:"\u2194",frac12:"\xBD",frac14:"\xBC",frac34:"\xBE",sup2:"\xB2",sup3:"\xB3",micro:"\xB5",iexcl:"\xA1",iquest:"\xBF"};function y(J){return J.replace(/&(#[xX][0-9a-fA-F]+|#\d+|[a-zA-Z][a-zA-Z0-9]*);/g,(Q,z)=>{if(z[0]==="#"){let $=z[1]==="x"||z[1]==="X"?parseInt(z.slice(2),16):parseInt(z.slice(1),10);return $>0&&$<=1114111&&($<55296||$>57343)?String.fromCodePoint($):Q}return i[z]??Q})}function n(J,Q){let z=new RegExp(`(?:^|\\s)${Q}\\s*=\\s*(?:"([^"]*)"|'([^']*)'|([^\\s"'>]+))`,"i").exec(J);return z?y(z[1]??z[2]??z[3]??"").trim():void 0}function r(J,Q){try{return new URL(J,Q).href}catch{return J}}function g(J,Q){let z=[],$=0,Z=0,G=!1,q=null,F=/<!--[\s\S]*?(?:-->|$)|<!\[CDATA\[[\s\S]*?(?:\]\]>|$)|<[!?][^<>]*>|<\/?([a-zA-Z][^\s/>]*)((?:[\s/](?:[^>"']|"[^"]*(?:"|$)|'[^']*(?:'|$))*)?)(?:>|$)/g,W=0,V=(K)=>{if($>0||K==="")return;let N=y(K);if(Z===0){N=N.replace(/\s+/g," ");let O=z.length>0?z[z.length-1]:`
3
+ `;if(O.endsWith(`
4
+ `)||O.endsWith("- "))N=N.trimStart()}if(N)z.push(N)},j;while((j=F.exec(J))!==null){V(J.slice(W,j.index)),W=F.lastIndex;let K=j[1]?.toLowerCase();if(!K)continue;let N=j[0].startsWith("</");if(p.has(K)){if(N)continue;let X=J.slice(W).search(new RegExp(`</${K}\\s*>`,"i"));W=X<0?J.length:W+X,F.lastIndex=W;continue}if(G&&!N&&!c.has(K))G=!1,$=0;if(K==="head")G=!N;if(d.has(K)){$=N?Math.max(0,$-1):$+1;continue}if($>0)continue;if(K==="a"){if(!N){let X=n(j[2]??"","href")??"";q={href:X===""||X.startsWith("#")?"":r(X,Q),start:z.length}}else if(q){let X=z.slice(q.start).join("").trim(),w=q.href;if(w&&X&&X!==w&&!/^(javascript|data|mailto|tel):/i.test(w))z.push(` (${w})`);q=null}continue}if(K==="br"){z.push(`
5
+ `);continue}if(K==="li"){if(!N)z.push(`
6
+ - `);continue}let O=z.length>0?z[z.length-1]:`
7
+ `;if(K==="td"||K==="th"){if(!N&&!O.endsWith(`
8
+ `))z.push(" ");continue}if(K==="pre")Z=Math.max(0,Z+(N?-1:1));if(l.has(K)){let X=m.has(K)?`
9
+
10
+ `:`
11
+ `;if(!O.endsWith(X))z.push(X)}}return V(J.slice(W)),z.join("").replace(/(?<=^|[^ \t])[ \t]+\n/g,`
12
+ `).replace(/\n{3,}/g,`
13
+
14
+ `).trim()}var H=524288,f=50000,k=250000,S=5,b=30000,a="Mozilla/5.0 (compatible; rovecode/0.2 web_fetch)",s="text/html, application/xhtml+xml, application/json;q=0.9, text/*;q=0.8, application/xml;q=0.7, */*;q=0.1";function t(J){return Number.isFinite(J)&&J>0?Math.min(Math.floor(J),k):f}function e(){let J=Number(process.env.ROVECODE_WEBFETCH_TIMEOUT_MS??"");return Number.isFinite(J)&&J>0?Math.floor(J):b}function I(J){let Q=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(J);if(!Q)return null;let z=0;for(let $=1;$<=4;$++){let Z=Number(Q[$]);if(Z>255)return null;z=z<<8|Z}return z>>>0}function zz(J){let Q=J.includes("%")?J.slice(0,J.indexOf("%")):J;if(!/^[0-9a-fA-F:.]+$/.test(Q)||!Q.includes(":"))return null;let z=Q.split("::");if(z.length>2)return null;let $=(F)=>{if(F==="")return[];let W=[];for(let V of F.split(":"))if(V.includes(".")){let j=I(V);if(j===null)return null;W.push(j>>>16,j&65535)}else if(/^[0-9a-fA-F]{1,4}$/.test(V))W.push(parseInt(V,16));else return null;return W},Z=$(z[0]),G=z.length===2?$(z[1]):[];if(!Z||!G)return null;let q=8-Z.length-G.length;if(z.length===2?q<1:q!==0)return null;return[...Z,...Array(q).fill(0),...G]}var Jz=[["0.0.0.0",8],["10.0.0.0",8],["100.64.0.0",10],["127.0.0.0",8],["169.254.0.0",16],["172.16.0.0",12],["192.0.0.0",24],["192.0.2.0",24],["192.168.0.0",16],["198.18.0.0",15],["198.51.100.0",24],["203.0.113.0",24],["224.0.0.0",4],["240.0.0.0",4]].map(([J,Q])=>[I(J),Q]);function _(J){return Jz.some(([Q,z])=>J>>>32-z===Q>>>32-z)}function v(J){let Q=I(J);if(Q!==null)return _(Q);let z=zz(J);if(!z)return!0;let[$,Z,G,q,F,W,V,j]=z;if($===0&&Z===0&&G===0&&q===0&&F===0&&W===65535)return _((V<<16|j)>>>0);if(($&57344)!==8192)return!0;if($===8194)return _((Z<<16|G)>>>0);return $===8193&&Z===3512}var Qz=async(J)=>(await o(J,{all:!0})).map((Q)=>Q.address);function C(J){let Q=J.toLowerCase();if(Q.startsWith("[")&&Q.endsWith("]"))Q=Q.slice(1,-1);return Q.endsWith(".")?Q.slice(0,-1):Q}async function Zz(J,Q){let z=C(J),$="a private, loopback, link-local or reserved address";if(z==="")return"empty host";if(z==="localhost"||z.endsWith(".localhost"))return`${z} is a loopback name`;if(I(z)!==null||z.includes(":"))return v(z)?`${z} is a private, loopback, link-local or reserved address`:null;let Z;try{Z=await Q(z)}catch(q){return`could not resolve ${z}: ${q instanceof Error?q.message:String(q)}`}if(Z.length===0)return`could not resolve ${z}`;let G=Z.find(v);return G===void 0?null:`${z} resolves to ${G}, a private, loopback, link-local or reserved address`}var $z=new Set([301,302,303,307,308]);function qz(J){return J===""||J.startsWith("text/")||J==="application/json"||J==="application/xml"||J==="application/xhtml+xml"||J==="application/javascript"||J==="application/ecmascript"||J.endsWith("+json")||J.endsWith("+xml")}function Gz(J,Q){if(J==="text/html"||J==="application/xhtml+xml")return!0;return J===""&&/^\s*<(!doctype\s+html|html|head|body)[\s>]/i.test(Q.slice(0,1024))}function Vz(J,Q){if(Q.aborted)return Promise.reject(Error("aborted"));return new Promise((z,$)=>{let Z=()=>$(Error("aborted"));Q.addEventListener("abort",Z,{once:!0}),J.then(z,$).finally(()=>Q.removeEventListener("abort",Z))})}async function Wz(J,Q){if(!J.body)return{bytes:new Uint8Array(0),truncated:!1};let z=J.body.getReader(),$=[],Z=0,G=!1;try{for(;;){let{done:W,value:V}=await z.read();if(W)break;if(V.length===0)continue;if(Z>=Q){G=!0;break}let j=Q-Z;if(V.length>j){$.push(V.subarray(0,j)),Z=Q,G=!0;break}$.push(V),Z+=V.length}}finally{await z.cancel().catch(()=>{})}let q=new Uint8Array(Z),F=0;for(let W of $)q.set(W,F),F+=W.length;return{bytes:q,truncated:G}}function Kz(J,Q,z){let $=/charset=["']?([\w.:-]+)/i.exec(Q)?.[1],Z;try{Z=new TextDecoder($??"utf-8")}catch{Z=new TextDecoder}let G=Z.decode(J);return z?G.replace(/\uFFFD$/,""):G}function Nz(J={}){let Q=J.fetch??((Z,G)=>fetch(Z,G)),z=J.resolve??Qz;async function $(Z,G){if(typeof Z.url!=="string"||Z.url.trim()==="")return{ok:!1,output:"web_fetch: url is required"};let q;try{q=new URL(Z.url.trim())}catch{return{ok:!1,output:`web_fetch: invalid URL: ${Z.url}`}}let F=t(Z.maxChars),W=process.env.ROVECODE_WEBFETCH_ALLOW_PRIVATE==="1";if(G.signal.aborted)return{ok:!1,output:"web_fetch: aborted"};let V=new AbortController,j=e(),K=!1,N=setTimeout(()=>{K=!0,V.abort()},j);N.ref?.();let O=()=>V.abort();G.signal.addEventListener("abort",O,{once:!0});let X=(w)=>{if(V.signal.aborted)return{ok:!1,output:K?`web_fetch: timed out after ${j}ms`:"web_fetch: aborted"};return{ok:!1,output:`web_fetch: request failed: ${w instanceof Error?w.message:String(w)}`}};try{let w=0,R=C(q.hostname);for(;;){if(q.protocol!=="http:"&&q.protocol!=="https:")return{ok:!1,output:`web_fetch: unsupported URL scheme ${q.protocol} (http/https only)`};if(!W){let Y;try{Y=await Vz(Zz(q.hostname,z),V.signal)}catch(h){return X(h)}if(Y!==null)return{ok:!1,output:`web_fetch: refused ${q.href}: ${Y} (set ROVECODE_WEBFETCH_ALLOW_PRIVATE=1 for local dev servers)`}}let x=C(q.hostname);if(x!==R)return{ok:!1,output:`web_fetch: redirected to ${q.href}; fetch it directly (a redirect from ${R} to ${x} needs its own net.fetch permission)`};let L;try{L=await Q(q.href,{method:"GET",redirect:"manual",signal:V.signal,headers:{"User-Agent":a,Accept:s}})}catch(Y){return X(Y)}if($z.has(L.status)){let Y=L.headers.get("location");if(await L.body?.cancel().catch(()=>{}),!Y)return{ok:!1,output:`web_fetch: HTTP ${L.status} redirect from ${q.href} without a Location header`};if(++w>S)return{ok:!1,output:`web_fetch: too many redirects (more than ${S}) starting from ${Z.url}`};try{q=new URL(Y,q)}catch{return{ok:!1,output:`web_fetch: invalid redirect target ${Y}`}}continue}let E=L.headers.get("content-type")??"",D=(E.split(";")[0]??"").trim().toLowerCase();if(!qz(D))return await L.body?.cancel().catch(()=>{}),{ok:!1,output:`web_fetch: unsupported content-type: ${D} (only text/*, JSON, XML and XHTML are fetched)`};let B;try{B=await Wz(L,H)}catch(Y){return X(Y)}let P=Kz(B.bytes,E,B.truncated),M=Gz(D,P)?g(P,q.href):P,U=[];if(B.truncated){let Y=Number(L.headers.get("content-length"));U.push(`(Body truncated at ${H} bytes${Number.isFinite(Y)&&Y>0?` of ${Y}`:""}.)`)}let T=M.length,A=T>F;if(A)M=M.slice(0,F).replace(/[\uD800-\uDBFF]$/,""),U.push(`(Text truncated: showing first ${F} of ${T} characters.)`);let u=[`${q.href} (HTTP ${L.status}, ${D||"no content-type"}, ${B.bytes.length} bytes${w>0?`, ${w} redirect${w===1?"":"s"}`:""})`,M,...U.length>0?[U.join(`
15
+ `)]:[]].filter((Y)=>Y!=="").join(`
16
+
17
+ `);return{ok:L.status<400,output:u,data:{url:q.href,status:L.status,contentType:D,bytes:B.bytes.length,redirects:w,truncated:B.truncated||A}}}}finally{clearTimeout(N),G.signal.removeEventListener("abort",O)}}return{schema:{name:"web_fetch",description:`Fetch a public http(s) URL with GET and return its content as readable text. HTML is reduced to text (scripts/styles dropped, headings/paragraphs/lists kept, links as "text (href)"); JSON, XML and plain text pass through unchanged. Follows at most ${S} redirects, and only within the same host: a redirect to another host stops with that URL \u2014 fetch it directly. Only text/*, JSON, XML and XHTML responses are accepted. The body is read up to ${H} bytes and the text is capped at maxChars (default ${f}, cap ${k}); both truncations leave a marker. Times out after ${b/1000}s. Private, loopback, link-local and unresolvable hosts are refused. Output starts with a header line: final URL, HTTP status, content-type, bytes read.`,args:{type:"object",properties:{url:{type:"string",description:"absolute http:// or https:// URL to fetch"},maxChars:{type:"integer",description:`max characters of text returned (default ${f}, cap ${k})`}},required:["url"]}},kind:"network",sequential:!1,execute:(Z,G)=>$(Z??{},G)}}var wz=Nz();
18
+ export{H as Ge,f as He,k as Ie,S as Je,b as Ke,t as Le,v as Me,Qz as Ne,C as Oe,Zz as Pe,Vz as Qe,Wz as Re,Nz as Se,wz as Te};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ function D(b){if(b===void 0)return;let q=Number(b.trim());return Number.isInteger(q)&&q>0?q:void 0}function M(b){if(b===void 0)return;let q=Number(b.trim().replace(/^\$/,""));return Number.isFinite(q)&&q>0?q:void 0}var E=new Set(["off","none","0","false"]),J=(b,q)=>{let B=b.indexOf(q);return B===-1?void 0:b[B+1]};function N(b,q,B={}){let y={},z=J(b,"--max-cost");if(z!==void 0||b.includes("--max-cost")){if(z===void 0||!E.has(z.trim().toLowerCase())){let j=M(z);if(j===void 0)return{error:`--max-cost wants a positive amount in dollars (or "off"), not "${z??""}"`};y.maxCostUsd=j}}else{let j=q.ROVECODE_MAX_COST;if(j!==void 0&&!E.has(j.trim().toLowerCase())){let L=M(j);if(L!==void 0)y.maxCostUsd=L}}let G=J(b,"--max-turns");if(G!==void 0||b.includes("--max-turns")){let j=D(G);if(j===void 0)return{error:`--max-turns wants a positive whole number, not "${G??""}"`};y.maxTurns=j}else{let j=D(q.ROVECODE_MAX_TURNS);if(j!==void 0)y.maxTurns=j}let A=J(b,"--max-seconds");if(A!==void 0||b.includes("--max-seconds")){if(A!==void 0&&E.has(A.trim().toLowerCase()))return y;let j=D(A);if(j===void 0)return{error:`--max-seconds wants a positive whole number of seconds (or "off"), not "${A??""}"`};return y.maxSeconds=j,y}let H=q.ROVECODE_MAX_SECONDS;if(H!==void 0&&E.has(H.trim().toLowerCase()))return y;let K=D(H)??B.defaultSeconds;if(K!==void 0)y.maxSeconds=K;return y}
3
+ export{D as Eh,M as Fh,N as Gh};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{wn as K}from"./main-qsevpgsv.js";function F(){return Error("login cancelled")}async function f(j,z){let J="";try{let V=await z.json(),W=V?.error,$=typeof W==="string"?W:typeof W==="object"&&W!==null&&typeof W.code==="string"?W.code:"",G=typeof V?.error_description==="string"?V.error_description:"";if($)J=`: ${$.slice(0,80)}${G?` \u2014 ${G.slice(0,160)}`:""}`}catch{}return Error(`${j} failed (HTTP ${z.status})${J}`)}async function b(j,z){let J;try{J=await j.json()}catch{throw Error(`${z}: response is not JSON`)}if(typeof J!=="object"||J===null||Array.isArray(J))throw Error(`${z}: response is not a JSON object`);return J}async function u(j,z,J,V){if(V?.aborted)throw F();try{return await j.fetch(z,{...J,signal:V})}catch(W){if(V?.aborted)throw F();throw W}}var g="login cancelled";var M=()=>{};function w(j){return`${j} OAuth: state mismatch on the callback \u2014 login aborted`}function X(j,z){return new Response(`<!doctype html><meta charset="utf-8"><title>rovecode</title><p>${z}</p>`,{status:j,headers:{"content-type":"text/html; charset=utf-8","cache-control":"no-store"}})}function v(j){return j>=60000?`${Math.round(j/60000)} minutes`:`${j} ms`}function d(j){let z=`/callback/${j.nonce}`,J=j.exchange??"key exchange",V=()=>{},W=new Promise((Q)=>{V=Q}),$=!1,G=!1,k=!1,Y=(Q)=>{if($)return;$=!0,V(Q)},D=(Q)=>{k=!0,setTimeout(()=>Y(Q),L)},x=()=>{return D({error:Error(w(j.what))}),X(400,`State mismatch \u2014 this login was aborted. ${j.retryHint}`)},H=Bun.serve({port:0,hostname:R,async fetch(Q){if(Q.method!=="GET")return X(404,"Not an OAuth callback.");let Z=new URL(Q.url);if(Z.hostname!==R)return X(404,"Not an OAuth callback.");if(!Z.pathname.startsWith("/callback/"))return X(404,"Not an OAuth callback.");if($||G||k)return X(409,"This OAuth callback has already been used.");if(Z.pathname!==z)return x();if(j.requireStateParam===!0&&Z.searchParams.get("state")!==j.nonce)return x();let E=Z.searchParams.get("error");if(E)return D({error:Error(`${j.what} authorization denied: ${(Z.searchParams.get("error_description")??E).slice(0,160)}`)}),X(400,`${j.what} authorization was denied.`);let S=Z.searchParams.get("code");if(!S)return X(400,`${j.what} returned no authorization code.`);G=!0;try{let N=await j.onCode(S);return D({value:N}),X(200,`Signed in to ${j.what} \u2014 you can close this tab and return to rovecode.`)}catch(N){return D({error:N instanceof Error?N:Error(String(N))}),X(502,`${j.what} ${J} failed \u2014 see the rovecode terminal.`)}}}),_=`http://${H.hostname}:${H.port}${z}`,q=j.timeoutMs??C,I=()=>Y({error:F()});j.signal.addEventListener("abort",I,{once:!0});let T=setTimeout(()=>Y({error:Error(`${j.what} OAuth login timed out (${v(q)})`)}),q),B=!1,O=()=>{if(B)return;B=!0,clearTimeout(T),j.signal.removeEventListener("abort",I),H.stop(!0),Y({error:Error(`${j.what} OAuth login aborted`)})};if(j.signal.aborted)I();let U=W.then((Q)=>{if(O(),"error"in Q)throw Q.error;return Q.value});return U.catch(()=>{}),{callbackUrl:_,result:U,stop:O}}var R="127.0.0.1",C=300000,L=20;var A=K(()=>{M()});function P(j){let z="";for(let J of j)z+=String.fromCharCode(J);return btoa(z).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function n(){let j=new Uint8Array(32);crypto.getRandomValues(j);let z=P(j),J=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(z));return{verifier:z,challenge:P(new Uint8Array(J))}}function p(){let j=new Uint8Array(32);return crypto.getRandomValues(j),P(j)}var y=()=>{};
3
+ export{g as ym,F as zm,f as Am,b as Bm,u as Cm,M as Dm,w as Em,d as Fm,A as Gm,n as Hm,p as Im,y as Jm};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{dm as b,em as U,hm as M,im as N,jm as C,km as w,lm as m,mm as R}from"./main-wk2csfnj.js";import{nm as S,pm as x,qm as V,um as P,vm as z}from"./main-y5c82rxr.js";import{vn as p,wn as _,xn as j}from"./main-qsevpgsv.js";function Y(){return L??=Promise.all([import("@modelcontextprotocol/sdk/client/index.js"),import("@modelcontextprotocol/sdk/client/stdio.js"),import("@modelcontextprotocol/sdk/client/streamableHttp.js"),import("@modelcontextprotocol/sdk/client/sse.js"),import("@modelcontextprotocol/sdk/client/auth.js"),import("@modelcontextprotocol/sdk/types.js")]).then(([q,D,F,H,I,J])=>{return K={Client:q.Client,StdioClientTransport:D.StdioClientTransport,getDefaultEnvironment:D.getDefaultEnvironment,StreamableHTTPClientTransport:F.StreamableHTTPClientTransport,StreamableHTTPError:F.StreamableHTTPError,SSEClientTransport:H.SSEClientTransport,SseError:H.SseError,UnauthorizedError:I.UnauthorizedError,ToolListChangedNotificationSchema:J.ToolListChangedNotificationSchema,PromptListChangedNotificationSchema:J.PromptListChangedNotificationSchema,ResourceListChangedNotificationSchema:J.ResourceListChangedNotificationSchema},K}),L}function E(q){let D=K;return D!==null&&q instanceof D.StreamableHTTPError&&(q.code===404||q.code===405)}function y(q){let D=K;if(D!==null&&(q instanceof D.StreamableHTTPError||q instanceof D.SseError))return q.code===401;return q instanceof Error&&/\(HTTP 401\)/.test(q.message)}function B(q,D){if(q instanceof N)return q.message;let F=K;if(F!==null&&q instanceof F.UnauthorizedError||y(q))return C(D)?"HTTP 401 \u2014 the configured Authorization header was rejected":M(D.name);let H=V(q);return F!==null&&q instanceof F.StreamableHTTPError&&typeof q.code==="number"&&q.code>0&&!H.includes(String(q.code))?`${H} (HTTP ${q.code})`:H}async function O(q,D,F){let H=await Y();if(D==="http"||D==="sse"){if(q.url===void 0)throw Error(`${D} server "${q.name}" has no url`);let I={...q.headers?{requestInit:{headers:q.headers}}:{},...F?{authProvider:F}:{}},J=new URL(q.url);return D==="http"?new H.StreamableHTTPClientTransport(J,I):new H.SSEClientTransport(J,I)}if(q.command===void 0)throw Error(`stdio server "${q.name}" has no command`);return new H.StdioClientTransport({command:q.command,args:q.args??[],env:{...H.getDefaultEnvironment(),...q.env??{}},stderr:"ignore"})}var L=null,K=null;var T=_(()=>{z();R()});var l={};p(l,{runnerTimeoutMessage:()=>k,mcpConfigPath:()=>S,loadMcpConfig:()=>P,isPackageRunner:()=>A,RUNNER_CONNECT_MS:()=>h,McpManager:()=>u});function A(q){if(q.transport!=="stdio"||q.command===void 0)return!1;let D=q.command.split(/[\\/]/).pop()??q.command;return f.has(D.toLowerCase())}function k(q,D){let F=`connect to MCP server "${q.name}" timed out after ${Math.round(D/1000)}s`;if(!A(q))return F;let H=(q.command??"the runner").split(/[\\/]/).pop();return`${F} \u2014 ${H} downloads the server's package on first use. Try again (the download is cached), or install it once so it starts without the network: rovecode mcp add ${q.name} --local --force`}class u{servers=new Map;toolCache=new Map;toolGen=new Map;listeners=new Set;ttl;connectTimeout;callTimeout;transportFactory;authProvider;constructor(q,D={}){this.ttl=D.toolTtlMs??60000,this.connectTimeout=D.connectTimeoutMs??1e4,this.callTimeout=D.callTimeoutMs??120000,this.transportFactory=D.transportFactory,this.authProvider=D.authProvider??d;for(let F of q)if(!this.servers.has(F.name))this.servers.set(F.name,{config:F,client:null,attempted:!1})}serverNames(){return[...this.servers.keys()]}connectedNames(){return[...this.servers.values()].filter((q)=>q.client!==null).map((q)=>q.config.name)}get ttlMs(){return this.ttl}get requestTimeoutMs(){return this.connectTimeout}clientOf(q){let D=this.servers.get(q);if(!D)throw Error(`unknown MCP server "${q}"`);if(!D.client)throw Error(`MCP server "${q}" is not connected${D.lastError?` (${D.lastError})`:""}`);return D.client}connection(q){let D=this.clientOf(q);return{client:D,caps:D.getServerCapabilities()??{}}}onListChanged(q){return this.listeners.add(q),()=>{this.listeners.delete(q)}}invalidate(q,D){if(D==="tools")this.toolCache.delete(q),this.toolGen.set(q,(this.toolGen.get(q)??0)+1);for(let F of this.listeners)try{F(q,D)}catch{}}async connect(){let q=[],D=[...this.servers.values()].filter((H)=>H.config.enabled!==!1&&H.client===null),F=[];for(let H of D){if(F.length>0&&H.connecting===void 0)await v();H.connecting??=this.open(H).finally(()=>{H.connecting=void 0}),F.push(H.connecting.catch((I)=>{q.push({name:H.config.name,error:B(I,H.config)})}))}return await Promise.all(F),{connected:this.connectedNames(),failed:q}}async open(q){let{config:D}=q;q.attempted=!0;try{let F=this.transportFactory?await this.transportFactory(D):void 0,H=F?"custom":D.transport,I=!1,J;try{J=await this.handshake(D,F??await O(D,D.transport,await this.authProvider(D)))}catch(X){if(F!==void 0||D.transport!=="http"||!E(X))throw X;J=await this.handshake(D,await O(D,"sse",await this.authProvider(D))),H="sse",I=!0}await this.armNotifications(D.name,J),q.client=J,q.wire=H,q.fellBack=I,delete q.lastError}catch(F){throw q.lastError=B(F,D),F}}async handshake(q,D){let F=new(await Y()).Client({name:"rovecode",version:"0.1.0"}),H=A(q)?Math.max(this.connectTimeout,h):this.connectTimeout;try{await w(F.connect(D,{timeout:H}),H+2000,k(q,H))}catch(I){throw await F.close().catch(()=>{}),I}return F}async armNotifications(q,D){let F=await Y();D.setNotificationHandler(F.ToolListChangedNotificationSchema,()=>this.invalidate(q,"tools")),D.setNotificationHandler(F.PromptListChangedNotificationSchema,()=>this.invalidate(q,"prompts")),D.setNotificationHandler(F.ResourceListChangedNotificationSchema,()=>this.invalidate(q,"resources"))}async fetchTools(q,D=!1,F){let H=this.clientOf(q),I=this.toolCache.get(q),J=Date.now();if(!D&&I&&J-I.at<this.ttl)return I.tools;let X=this.toolGen.get(q)??0,$=await m("tool",q,async(G)=>{let Q=U(F),Z;try{Z=await H.listTools(G===void 0?void 0:{cursor:G},{timeout:this.connectTimeout,signal:Q.signal})}finally{Q.dispose()}return{items:Z.tools.map((W)=>({name:W.name,description:typeof W.description==="string"?W.description:"",inputSchema:W.inputSchema})),nextCursor:Z.nextCursor}},F);if((this.toolGen.get(q)??0)===X)this.toolCache.set(q,{at:J,tools:$});return $}async listTools(q=!1,D){let F=[];for(let[H,I]of this.servers){if(I.client===null)continue;try{for(let J of await this.fetchTools(H,q,D))F.push({server:H,name:J.name,description:J.description})}catch{}}return F}async toolSchema(q,D,F){try{let H=(await this.fetchTools(q,!1,F)).find((I)=>I.name===D);if(!H)H=(await this.fetchTools(q,!0,F)).find((I)=>I.name===D);return H?.inputSchema}catch{return}}async callTool(q,D,F,H,I){let J=this.servers.get(q);if(!J){let Q=this.serverNames();return{ok:!1,output:`unknown MCP server "${q}". Known servers: ${Q.length>0?Q.join(", "):"(none configured)"}`}}let X=J.client;if(!X)return{ok:!1,output:`MCP server "${q}" is not connected${J.lastError?`: ${J.lastError}`:""}`};if(F!==void 0&&F!==null&&!x(F))return{ok:!1,output:`args for ${q}/${D} must be a JSON object (got ${Array.isArray(F)?"array":typeof F})`};let $;try{$=await this.fetchTools(q,!1,H)}catch(Q){return{ok:!1,output:`failed to list tools on "${q}": ${V(Q)}`}}if(!$.some((Q)=>Q.name===D)){try{$=await this.fetchTools(q,!0,H)}catch{}if(!$.some((Q)=>Q.name===D)){let Q=$.map((Z)=>Z.name).join(", ");return{ok:!1,output:`unknown tool "${D}" on server "${q}". Available: ${Q.length>0?Q:"(none)"}`}}}let G=U(H);try{let Q=await X.callTool({name:D,arguments:F??void 0},void 0,{signal:G.signal,timeout:this.callTimeout,resetTimeoutOnProgress:!0,onprogress:(W)=>I?.(typeof W.message==="string"&&W.message.length>0?W.message:`progress ${W.progress}${typeof W.total==="number"?`/${W.total}`:""}`)}),Z=b(Q.content,Q.structuredContent);if(Q.isError===!0)return{ok:!1,output:Z.length>0?Z:`tool "${D}" reported an error`};return{ok:!0,output:Z}}catch(Q){return{ok:!1,output:`mcp call ${q}/${D} failed: ${V(Q)}`}}finally{G.dispose()}}status(){return[...this.servers.values()].map((q)=>{let D={name:q.config.name,transport:q.config.transport,state:q.config.enabled===!1?"disabled":q.client?"connected":q.attempted&&!q.connecting?"failed":"pending"};if(q.wire!==void 0)D.wire=q.wire;if(q.fellBack)D.fellBack=!0;if(q.lastError!==void 0)D.error=q.lastError;let F=this.toolCache.get(q.config.name);if(F)D.tools=F.tools.length;return D})}async sync(q){let D=new Map(q.map((I)=>[I.name,I])),F=[],H=[];for(let[I,J]of[...this.servers]){if(D.has(I))continue;H.push(I),this.servers.delete(I);for(let X of["tools","prompts","resources"])this.invalidate(I,X);if(J.client)await J.client.close().catch(()=>{})}for(let[I,J]of D){if(this.servers.has(I))continue;this.servers.set(I,{config:J,client:null,attempted:!1}),F.push(I)}return{added:F,removed:H}}async close(){let q=[];for(let D of this.servers.values()){if(D.client)q.push(D.client.close().catch(()=>{})),D.client=null;D.attempted=!1,delete D.wire,delete D.fellBack;for(let F of["tools","prompts","resources"])this.invalidate(D.config.name,F)}await Promise.all(q)}}var v=()=>new Promise((q)=>setTimeout(q,0)),f,h=90000,d=async(q)=>(await import("./oauth-g5gme95c.js")).runtimeAuthProvider(q);var a=_(()=>{z();R();T();z();f=new Set(["npx","npx.cmd","uvx","uvx.exe","pipx","pipx.exe","bunx","bunx.exe"])});
3
+ export{h as gd,A as hd,k as id,u as jd,l as kd,a as ld};
@@ -0,0 +1,5 @@
1
+ // @bun
2
+ import{Vi as O,Wi as S,aj as b}from"./main-xx2z3zh5.js";import{Mj as X,Wj as _}from"./main-ywbxshqc.js";import{$m as m,Um as h,_m as A}from"./main-2yeveeve.js";m();_();var w=3,D="usage: rovecode connect [<id> [<baseUrl>]] [--model <id>] [--key | --key-stdin | --key-env NAME | --no-key] [--protocol openai|anthropic] [--project] [--no-test]";function y(j){let z=[],q,M,P,Z="auto",Q="user",R=!0,Y=[];for(let V=0;V<j.length;V++){let B=j[V],W=()=>{let H=j[V+1];if(H===void 0||H.startsWith("-"))return;return V++,H};switch(B){case"--model":{let H=W();if(H===void 0)return{error:`--model needs a value \u2014 ${D}`};q=H;break}case"--key-env":{let H=W();if(H===void 0)return{error:`--key-env needs a value \u2014 ${D}`};P=H,Y.push(B);break}case"--protocol":{let H=W();if(H!=="openai"&&H!=="anthropic")return{error:`--protocol takes openai or anthropic \u2014 ${D}`};M=H;break}case"--key":Z="prompt",Y.push(B);break;case"--key-stdin":Z="stdin",Y.push(B);break;case"--no-key":Z="none",Y.push(B);break;case"--project":Q="project";break;case"--no-test":R=!1;break;default:if(B.startsWith("-"))return{error:`unknown flag ${B} \u2014 ${D}`};z.push(B)}}if(Y.length>1)return{error:`${Y.join(" and ")} contradict each other \u2014 pick one`};if(z.length===0)return{error:`connect needs a provider id \u2014 ${D}`};if(z.length>2)return{error:`unexpected argument "${z[2]}" \u2014 ${D}`};let $=z[0].toLowerCase();if(!O.test($))return{error:`"${$}" won't work as an id (letters, digits, - _ .)`};let L=z[1];if(L!==void 0&&!/^https?:\/\//.test(L))return{error:`"${L}" is not an http(s) URL \u2014 ${D}`};if(L===void 0&&M!==void 0)return{error:"--protocol only applies when you give a base URL"};return{id:$,...L!==void 0?{baseUrl:L}:{},...q!==void 0?{model:q}:{},...M!==void 0?{protocol:M}:{},...P!==void 0?{keyEnv:P}:{},key:Z,scope:Q,test:R}}async function x(){let j=[];for await(let z of process.stdin)j.push(z);return Buffer.concat(j).toString("utf8")}async function C(j,z){let q=z.out??console.log,M=z.secret??((J)=>A(J)),P=z.stdin??x,Z=z.save??h,Q=z.registry,R=z.probe??((J,f)=>Q.probe(J,f)),Y=z.tty??process.stdin.isTTY===!0,$=z.where==="tui",L=Q.get(j.id),V=j.key==="none"||j.keyEnv!==void 0;if(j.baseUrl!==void 0||V){let J=j.baseUrl??L?.baseUrl;if(J===void 0)return q(`\u25C6 I don't know a provider called "${j.id}".`),q(` known: ${Q.ids().join(" ")}`),q(` ${X(`rovecode connect ${j.id} <baseUrl>`)} to register your own endpoint`),2;let f=j.protocol??L?.protocol??S(J),G=j.model??L?.defaultModel,T={id:j.id,baseUrl:J,protocol:f,...j.keyEnv!==void 0?{keyEnv:j.keyEnv}:L?.keyEnv!==void 0&&j.baseUrl===void 0?{keyEnv:L.keyEnv}:{},...G!==void 0?{defaultModel:G}:{},...j.key==="none"?{noKey:!0}:{}},K=Q.add(T,j.scope);if("error"in K)return q(`\u25C6 ${K.error}`),q(` ${X("rovecode connect")} for the step-by-step version`),2;q(`\u25C6 ${K.id} registered (${K.protocol} protocol, ${K.baseUrl}${j.key==="none"?", no key":""}).`)}else if(L===void 0)return q(`\u25C6 I don't know a provider called "${j.id}".`),q(` known: ${Q.ids().join(" ")}`),q(` ${X(`rovecode connect ${j.id} <baseUrl>`)} to register your own endpoint`),2;let B=Q.get(j.id);if(B===void 0)return q(`\u25C6 ${j.id} did not survive registration \u2014 that is a bug.`),2;let W=b(B);if(!W||j.key==="prompt"||j.key==="stdin")if(j.key==="stdin"){let J=(await P()).split(`
3
+ `)[0].trim();if(J.length===0)return q("\u25C6 nothing came in on stdin \u2014 no key stored."),q(` ${X(`echo $KEY | rovecode connect ${j.id} --key-stdin`)}`),2;Z(j.id,J,B.keyEnv),q(`\u25C6 key stored for ${j.id} (hidden; ~/.rovecode/credentials.json).`),W=!0}else if(j.key==="prompt"||j.key==="auto"&&Y){let J=(await M(`${B.keyEnv} (hidden): `)).trim();if(J.length===0)return q(`\u25C6 no key stored \u2014 I can't call ${j.id} without one.`),q(` ${X(`rovecode auth set ${j.id}`)} (or set ${B.keyEnv} in your environment)`),2;Z(j.id,J,B.keyEnv),q(`\u25C6 key stored for ${j.id} (hidden; ~/.rovecode/credentials.json).`),W=!0}else if(z.deferKey!==void 0)return z.deferKey(B),w;else return q(`\u25C6 ${j.id} has no key, and there is no terminal to ask on.`),q(` ${X(`set ${B.keyEnv}, or pipe it: echo $KEY | rovecode connect ${j.id} --key-stdin`)}`),2;else q(B.noKey===!0?`\u25C6 ${j.id} needs no key (local server).`:`\u25C6 ${j.id} already has a key (${B.keySource==="stored"?"stored":`env ${B.keyEnv}`}).`);Q.refresh();let H=j.model??Q.get(j.id)?.defaultModel;if(H===void 0)return q(`\u25C6 ${j.id} is connected but has no model yet.`),q(` ${X($?`/models ${j.id}, then /model ${j.id}/<model> --save`:`rovecode model list ${j.id}, then rovecode model use ${j.id}/<model>`)}`),0;let F=!0;if(j.test){q(`\u25C6 testing ${j.id}/${H} \u2026`);let J=await R(j.id,H);F=J.ok,q(` ${J.detail}`)}let I=Q.setDefault(`${j.id}/${H}`,j.scope);if("error"in I)return q(`\u25C6 ${I.error}`),q(` ${X(`rovecode model use ${j.id}/<model>`)}`),2;if(q(`\u25C6 default \u2192 ${I.provider}/${I.model} (${$?"this session switched too":"running TUIs switch live"}).`),!F)return q(` ${X(`check the key and the URL, then ${$?"/provider":"rovecode provider"} test ${j.id} ${H}`)}`),1;return q(""),q(z.done??`Done. Try: rovecode "explain this repo"
4
+ or open the cockpit: rovecode`),0}
5
+ export{w as H,D as I,y as J,C as K};
@@ -0,0 +1,4 @@
1
+ // @bun
2
+ import{wn as $}from"./main-qsevpgsv.js";import{createHash as E}from"crypto";import{mkdirSync as R,readFileSync as x,readdirSync as D,statSync as H,writeFileSync as _}from"fs";import{dirname as b,join as W,relative as j,resolve as k}from"path";function O(z){let q={disabled:[],trusted:{}},B;try{B=JSON.parse(x(Q(z),"utf8"))}catch{return q}if(typeof B!=="object"||B===null)return q;let C=B;if(Array.isArray(C.disabled))q.disabled=C.disabled.filter((G)=>typeof G==="string");if(typeof C.trusted==="object"&&C.trusted!==null&&!Array.isArray(C.trusted)){for(let[G,J]of Object.entries(C.trusted))if(typeof J==="string")q.trusted[G]=J}return q}function V(z,q){let B=Q(z);return R(b(B),{recursive:!0}),_(B,JSON.stringify({disabled:[...q.disabled].sort(),trusted:q.trusted},null,2)+`
3
+ `),B}function F(z){let q=[],B=(C)=>{let G;try{G=D(C,{withFileTypes:!0})}catch{return}for(let J of G){if(P.has(J.name))continue;let Z=W(C,J.name);if(J.isDirectory())B(Z);else if(J.isFile())q.push(j(z,Z).replace(/\\/g,"/"))}};return B(z),q.sort()}function m(z){let q=E("sha256");for(let B of F(z)){q.update(B),q.update("\x00");try{q.update(x(W(z,B)))}catch{}q.update("\x00")}return q.digest("hex")}function f(z,q,B){return z.trusted[M(q)]===B}function o(z){try{return H(z).isDirectory()}catch{return!1}}var I="plugins.json",Q=(z)=>W(z,I),P,M=(z)=>k(z).replace(/\\/g,"/");var A=$(()=>{P=new Set(["node_modules",".git"])});import{createHash as T}from"crypto";import{readFileSync as K,statSync as v}from"fs";function U(z){let q=N(z);if(q===void 0){X.delete(z);return}let B=X.get(z);if(B!==void 0&&L(B,q))return B.digest;let C;try{C=T("sha256").update(K(z)).digest("hex")}catch{return}return X.set(z,{...q,digest:C}),C}function w(z){let q=Q(z),B=N(q);if(B===void 0)return Y.delete(q),O(z);let C=Y.get(q);if(C!==void 0&&L(C,B))return C.state;let G=O(z);return Y.set(q,{...B,state:G}),G}function c(z){return(q,B)=>z.trusted[M(q)]===B}function y(z,q){let B=U(q);if(B===void 0)return"absent";return c(w(z))(q,B)?"trusted":"untrusted"}function s(z,q){return y(z,q)==="trusted"}function a(z,q){let B=O(z),C=U(q);if(C===void 0)return delete B.trusted[M(q)],V(z,B),{ok:!1,reason:`${q}: no such file`};return B.trusted[M(q)]=C,V(z,B),{ok:!0,digest:C}}function i(z,q){let B=O(z),C=M(q)in B.trusted;return delete B.trusted[M(q)],V(z,B),C}function t(z,q){return`${z}: not trusted on this machine \u2014 ${q}. ${g}`}var L=(z,q)=>z.mtimeMs===q.mtimeMs&&z.size===q.size,N=(z)=>{try{let q=v(z);return q.isFile()?{mtimeMs:q.mtimeMs,size:q.size}:void 0}catch{return}},X,Y,g="Review: rovecode trust show (in the TUI: /trust show) \xB7 approve: rovecode trust (or /trust)";var u=$(()=>{A();X=new Map;Y=new Map});
4
+ export{Q as cn,O as dn,V as en,F as fn,m as gn,M as hn,f as in,o as jn,A as kn,U as ln,c as mn,y as nn,s as on,a as pn,i as qn,g as rn,t as sn,u as tn};
@@ -0,0 +1,10 @@
1
+ // @bun
2
+ import{wn as P}from"./main-qsevpgsv.js";import{randomUUID as Q}from"crypto";import{readFileSync as V}from"fs";import{join as X}from"path";function G(q){return q==="plan"||q==="act"}function K(q){if(!q||typeof q!=="object"||Array.isArray(q))return;let x=q,z=typeof x.provider==="string"&&x.provider.trim()!==""?x.provider.trim():void 0,B=typeof x.model==="string"&&x.model.trim()!==""?x.model.trim():void 0;if(z===void 0&&B===void 0)return;return{provider:z,model:B}}function E(q){let x;try{x=JSON.parse(V(X(q,".rovecode","modes.json"),"utf8"))}catch{return{}}if(!x||typeof x!=="object"||Array.isArray(x))return{};let z=x,B={};if(G(z.defaultMode))B.defaultMode=z.defaultMode;if(typeof z.planActSeparateModels==="boolean")B.planActSeparateModels=z.planActSeparateModels;let H=K(z.plan),J=K(z.act);if(H)B.plan=H;if(J)B.act=J;return B}function Z(q=[]){let x=[{action:"file.read",resource:"*",effect:"allow"},{action:"file.write",resource:"*",effect:"deny"},{action:"shell.exec",resource:"*",effect:"deny"},{action:"spawn",resource:"*",effect:"deny"},{action:"memory.write",resource:"*",effect:"deny"},{action:"memory.write",resource:"todo_write",effect:"allow"},{action:"tool.*",resource:"*",effect:"deny"}];for(let z of q)x.push({action:`tool.${z}`,resource:"*",effect:"allow"});return x}function N(q,x,z=[]){if(q!=="plan")return[...x];return[...x,...Z(z)]}function D(){return`# Plan Mode
3
+
4
+ You are in Plan mode. Your role is to explore, analyze, and plan -- not to execute.
5
+ - Read files and search the codebase to understand the task
6
+ - Present your plan as a structured outline with clear steps
7
+ - Editing tools, shell commands, and sub-agents are unavailable in plan mode: attempts are denied by policy. If the task requires a mutation, put it in the plan; it happens only after the user switches to act mode.
8
+
9
+ Once you have presented your plan, end your turn and wait for the user's response. You do NOT have the ability to switch to act mode yourself -- the user must do it manually with the Plan/Act toggle once they are satisfied with the plan. If the task requires tools that are only available in act mode, ask the user to "toggle to Act mode" (use those words).`}function $(q,x){return`<mode_notice>The user switched from ${q} mode to ${x} mode before sending this message.</mode_notice>`}function j(){let q=null;return{record(x,z){if(x===z)return;if(q){q=q.from===z?null:{from:q.from,to:z};return}q={from:x,to:z}},consume(){let x=q;return q=null,x}}}function I(q,x){return{id:Q(),role:"system",parts:[{kind:"text",text:$(q.from,q.to)}],parentId:x,createdAt:Date.now(),modeSwitch:{from:q.from,to:q.to}}}function C(q){if(!q||typeof q!=="object")return null;let x=q;if(x.role!=="system")return null;let z=x.modeSwitch;if(!z||typeof z!=="object")return null;return G(z.from)&&G(z.to)?{from:z.from,to:z.to}:null}function U(q){for(let x=q.length-1;x>=0;x--){let z=C(q[x]);if(z)return z.to}return null}class L{currentMode;slots;fallback;separateModels;tracker=j();constructor(q={},x={}){this.currentMode=q.defaultMode??Y,this.separateModels=q.planActSeparateModels??!1,this.fallback={provider:x.provider,model:x.model},this.slots={plan:{provider:q.plan?.provider,model:q.plan?.model},act:{provider:q.act?.provider,model:q.act?.model}}}get mode(){return this.currentMode}get separate(){return this.separateModels}toggle(q){if(q===this.currentMode)return null;let x={from:this.currentMode,to:q};return this.currentMode=q,this.tracker.record(x.from,x.to),x}restore(q){this.currentMode=q,this.tracker.consume()}consumeSwitchNotice(){return this.tracker.consume()}modelFor(q=this.currentMode){let x=this.slots[q];return{provider:x.provider??this.fallback.provider??"",model:x.model??this.fallback.model??""}}setModel(q){let x=this.separateModels?[this.currentMode]:["plan","act"];for(let z of x){if(q.provider!==void 0)this.slots[z].provider=q.provider;if(q.model!==void 0)this.slots[z].model=q.model}}}var Y="act";var R=()=>{};
10
+ export{E as wh,N as xh,D as yh,I as zh,C as Ah,U as Bh,L as Ch,R as Dh};