rovecode 0.4.0-beta.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/README.md +67 -69
  2. package/THIRD_PARTY_NOTICES.md +0 -44
  3. package/bin/rovecode.ts +21 -0
  4. package/package.json +16 -37
  5. package/src/account/keys.ts +97 -0
  6. package/src/account/login.ts +158 -0
  7. package/src/account/provision.ts +47 -0
  8. package/src/account/store.ts +63 -0
  9. package/src/acp/server.ts +373 -0
  10. package/src/cli/account-cmd.ts +116 -0
  11. package/src/cli/connect.ts +244 -0
  12. package/src/cli/context-cmd.ts +199 -0
  13. package/src/cli/dispatch.ts +109 -0
  14. package/src/cli/doctor.ts +324 -0
  15. package/src/cli/export.ts +278 -0
  16. package/src/cli/help.ts +240 -0
  17. package/src/cli/is-tui-invocation.ts +8 -0
  18. package/src/cli/main.ts +599 -0
  19. package/src/cli/market-cmd.ts +658 -0
  20. package/src/cli/mcp-market-cmd.ts +299 -0
  21. package/src/cli/output.ts +382 -0
  22. package/src/cli/repl.ts +172 -0
  23. package/src/cli/resume.ts +32 -0
  24. package/src/cli/run-limits.ts +78 -0
  25. package/src/cli/runtime.ts +792 -0
  26. package/src/cli/setup.ts +187 -0
  27. package/src/cli/update-cmd.ts +78 -0
  28. package/src/cli/workflow-cmd.ts +100 -0
  29. package/src/coding/checkpoints.ts +270 -0
  30. package/src/coding/diff.ts +136 -0
  31. package/src/coding/files.ts +339 -0
  32. package/src/coding/hashline.ts +319 -0
  33. package/src/coding/lsp.ts +406 -0
  34. package/src/coding/repomap-cache.ts +99 -0
  35. package/src/coding/repomap-files.ts +110 -0
  36. package/src/coding/repomap.ts +392 -0
  37. package/src/core/compaction.ts +399 -0
  38. package/src/core/config.ts +289 -0
  39. package/src/core/context-report.ts +228 -0
  40. package/src/core/context.ts +60 -0
  41. package/src/core/count-remote.ts +107 -0
  42. package/src/core/execpolicy-rules.ts +196 -0
  43. package/src/core/execpolicy.ts +385 -0
  44. package/src/core/executor.ts +397 -0
  45. package/src/core/guardrails.ts +400 -0
  46. package/src/core/hooks.ts +398 -0
  47. package/src/core/images.ts +230 -0
  48. package/src/core/intro.ts +236 -0
  49. package/src/core/loop.ts +621 -0
  50. package/src/core/modes.ts +372 -0
  51. package/src/core/orchestrator.ts +207 -0
  52. package/src/core/reflection.ts +165 -0
  53. package/src/core/sandbox-config.ts +167 -0
  54. package/src/core/session-images.ts +73 -0
  55. package/src/core/session.ts +398 -0
  56. package/src/core/settings.ts +98 -0
  57. package/src/core/stuck-detector.ts +273 -0
  58. package/src/core/tasks.ts +374 -0
  59. package/src/core/token-scale.ts +108 -0
  60. package/src/core/tool-output-budget.ts +166 -0
  61. package/src/core/tools.ts +288 -0
  62. package/src/core/types.ts +330 -0
  63. package/src/core/update-check.ts +171 -0
  64. package/src/core/update.ts +158 -0
  65. package/src/core/usage.ts +204 -0
  66. package/src/core/validate.ts +121 -0
  67. package/src/core/verify-gate.ts +159 -0
  68. package/src/core/verify.ts +237 -0
  69. package/src/core/voice.ts +158 -0
  70. package/src/core/win-job.ts +183 -0
  71. package/src/design/audit.ts +797 -0
  72. package/src/design/direction.ts +190 -0
  73. package/src/design/rules.ts +157 -0
  74. package/src/eval/bench.ts +150 -0
  75. package/src/eval/gauntlet-runner.ts +218 -0
  76. package/src/eval/gauntlet.ts +226 -0
  77. package/src/eval/grader.ts +186 -0
  78. package/src/eval/record.ts +202 -0
  79. package/src/eval/redact.ts +141 -0
  80. package/src/eval/replay.ts +147 -0
  81. package/src/eval/trajectory.ts +373 -0
  82. package/src/index.ts +17 -0
  83. package/src/market/catalogs/mcp-docs.json +111 -0
  84. package/src/market/catalogs/plugins.json +111 -0
  85. package/src/market/catalogs/skills.json +478 -0
  86. package/src/market/clone.ts +72 -0
  87. package/src/market/context-cost.ts +121 -0
  88. package/src/market/digest.ts +106 -0
  89. package/src/market/index.ts +22 -0
  90. package/src/market/install.ts +578 -0
  91. package/src/market/manifest.ts +187 -0
  92. package/src/market/prereq.ts +145 -0
  93. package/src/market/registry.ts +363 -0
  94. package/src/market/resolve.ts +111 -0
  95. package/src/market/types.ts +236 -0
  96. package/src/market/validate.ts +227 -0
  97. package/src/mcp/client.ts +431 -0
  98. package/src/mcp/config.ts +239 -0
  99. package/src/mcp/local-package.ts +211 -0
  100. package/src/mcp/market-catalog.ts +84 -0
  101. package/src/mcp/market-install.ts +289 -0
  102. package/src/mcp/market.ts +0 -0
  103. package/src/mcp/tools.ts +131 -0
  104. package/src/mcp/trust.ts +49 -0
  105. package/src/memory/blocks.ts +175 -0
  106. package/src/memory/recall.ts +355 -0
  107. package/src/memory/store.ts +105 -0
  108. package/src/memory/tools.ts +99 -0
  109. package/src/plugins/cli.ts +123 -0
  110. package/src/plugins/discover.ts +108 -0
  111. package/src/plugins/index.ts +50 -0
  112. package/src/plugins/init.ts +140 -0
  113. package/src/plugins/install.ts +184 -0
  114. package/src/plugins/load.ts +149 -0
  115. package/src/plugins/manifest.ts +106 -0
  116. package/src/plugins/state.ts +83 -0
  117. package/src/providers/auth.ts +293 -0
  118. package/src/providers/cache.ts +223 -0
  119. package/src/providers/catalog-local.ts +160 -0
  120. package/src/providers/catalog.ts +408 -0
  121. package/src/providers/middleware-context.ts +86 -0
  122. package/src/providers/middleware.ts +373 -0
  123. package/src/providers/profile-glm53.ts +111 -0
  124. package/src/providers/profile-sonnet5-persona.ts +65 -0
  125. package/src/providers/profile-sonnet5-voice.ts +23 -0
  126. package/src/providers/profiles.ts +156 -0
  127. package/src/providers/provider-config.ts +311 -0
  128. package/src/providers/registry.ts +302 -0
  129. package/src/providers/response-validation.ts +80 -0
  130. package/src/providers/retry.ts +234 -0
  131. package/src/providers/router.ts +294 -0
  132. package/src/providers/sse.ts +26 -0
  133. package/src/providers/stream-errors.ts +117 -0
  134. package/src/providers/stream.ts +569 -0
  135. package/src/providers/thinking.ts +189 -0
  136. package/src/providers/wire-messages.ts +129 -0
  137. package/src/sdk/client.ts +225 -0
  138. package/src/sdk/index.ts +3 -0
  139. package/src/server/dashboard.ts +144 -0
  140. package/src/server/http.ts +343 -0
  141. package/src/server/openapi.ts +246 -0
  142. package/src/sextant/card-hits.ts +102 -0
  143. package/src/sextant/card-keys.ts +55 -0
  144. package/src/sextant/context-source.ts +157 -0
  145. package/src/sextant/draw-agents.ts +273 -0
  146. package/src/sextant/draw-code.ts +388 -0
  147. package/src/sextant/draw-context.ts +222 -0
  148. package/src/sextant/draw-frame.ts +164 -0
  149. package/src/sextant/draw-market.ts +573 -0
  150. package/src/sextant/draw-messages.ts +386 -0
  151. package/src/sextant/draw-pet.ts +230 -0
  152. package/src/sextant/draw-plan.ts +159 -0
  153. package/src/sextant/draw-tabs.ts +85 -0
  154. package/src/sextant/draw-util.ts +65 -0
  155. package/src/sextant/engine.ts +230 -0
  156. package/src/sextant/frame-hits.ts +25 -0
  157. package/src/sextant/frame.ts +101 -0
  158. package/src/sextant/git-status.ts +197 -0
  159. package/src/sextant/grid.ts +59 -0
  160. package/src/sextant/input.ts +119 -0
  161. package/src/sextant/keys.ts +488 -0
  162. package/src/sextant/layout.ts +86 -0
  163. package/src/sextant/local-commands.ts +156 -0
  164. package/src/sextant/market-source.ts +287 -0
  165. package/src/sextant/mentions.ts +141 -0
  166. package/src/sextant/message-hits.ts +26 -0
  167. package/src/sextant/model.ts +387 -0
  168. package/src/sextant/overlays.ts +451 -0
  169. package/src/sextant/panel-hits.ts +38 -0
  170. package/src/sextant/pet.ts +399 -0
  171. package/src/sextant/screen.ts +324 -0
  172. package/src/sextant/scroll-hits.ts +66 -0
  173. package/src/sextant/scrollbar.ts +82 -0
  174. package/src/sextant/selection.ts +123 -0
  175. package/src/sextant/sextant-bridge.ts +174 -0
  176. package/src/sextant/sextant-cards.ts +142 -0
  177. package/src/sextant/sextant-diff-base.ts +63 -0
  178. package/src/sextant/sextant-files.ts +154 -0
  179. package/src/sextant/sextant-frame-loop.ts +314 -0
  180. package/src/sextant/sextant-renderer.ts +478 -0
  181. package/src/sextant/sextant-repo.ts +131 -0
  182. package/src/sextant/theme.ts +66 -0
  183. package/src/sextant/tool-rows.ts +189 -0
  184. package/src/sextant/types.ts +473 -0
  185. package/src/skills/index.ts +306 -0
  186. package/src/skills/tools.ts +69 -0
  187. package/src/skills/versioned.ts +227 -0
  188. package/src/telemetry/otel.ts +353 -0
  189. package/src/telemetry/otlp.ts +68 -0
  190. package/src/tools/ask-user.ts +156 -0
  191. package/src/tools/design.ts +151 -0
  192. package/src/tools/evalcell.ts +338 -0
  193. package/src/tools/html-text.ts +139 -0
  194. package/src/tools/provider.ts +149 -0
  195. package/src/tools/task.ts +216 -0
  196. package/src/tools/todo.ts +320 -0
  197. package/src/tools/webfetch.ts +331 -0
  198. package/src/tui/app.ts +608 -0
  199. package/src/tui/attach.ts +127 -0
  200. package/src/tui/checkpoints-cmd.ts +70 -0
  201. package/src/tui/clipboard-image.ts +81 -0
  202. package/src/tui/commands.ts +277 -0
  203. package/src/tui/cost.ts +108 -0
  204. package/src/tui/info-cmd.ts +144 -0
  205. package/src/tui/mcp-cmd.ts +128 -0
  206. package/src/tui/modes-cmd.ts +45 -0
  207. package/src/tui/overlays.ts +97 -0
  208. package/src/tui/pi-renderer.ts +424 -0
  209. package/src/tui/providers-cmd.ts +366 -0
  210. package/src/tui/renderer.ts +101 -0
  211. package/src/tui/replay-marker.ts +29 -0
  212. package/src/tui/session-cmd.ts +146 -0
  213. package/src/tui/sextant-attach.ts +68 -0
  214. package/src/tui/sextant-io.ts +184 -0
  215. package/src/tui/sextant-smoke.ts +110 -0
  216. package/src/tui/smoke.ts +72 -0
  217. package/src/tui/theme.ts +59 -0
  218. package/src/tui/todo-label.ts +7 -0
  219. package/src/workflow/engine.ts +266 -0
  220. package/tsconfig.json +30 -0
  221. package/vendor/pi-tui/LICENSE +21 -0
  222. package/vendor/pi-tui/PATCHES.md +12 -0
  223. package/vendor/pi-tui/PROVENANCE.md +12 -0
  224. package/vendor/pi-tui/README.upstream.md +854 -0
  225. package/vendor/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  226. package/vendor/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  227. package/vendor/pi-tui/src/alt-screen-search.ts +158 -0
  228. package/vendor/pi-tui/src/autocomplete.ts +827 -0
  229. package/vendor/pi-tui/src/components/alt-screen-flash.ts +52 -0
  230. package/vendor/pi-tui/src/components/box.ts +138 -0
  231. package/vendor/pi-tui/src/components/cancellable-loader.ts +41 -0
  232. package/vendor/pi-tui/src/components/editor.ts +2364 -0
  233. package/vendor/pi-tui/src/components/h-stack.ts +45 -0
  234. package/vendor/pi-tui/src/components/image.ts +128 -0
  235. package/vendor/pi-tui/src/components/input.ts +448 -0
  236. package/vendor/pi-tui/src/components/loader.ts +93 -0
  237. package/vendor/pi-tui/src/components/markdown.ts +1016 -0
  238. package/vendor/pi-tui/src/components/scroll-view.ts +217 -0
  239. package/vendor/pi-tui/src/components/select-list.ts +230 -0
  240. package/vendor/pi-tui/src/components/settings-list.ts +277 -0
  241. package/vendor/pi-tui/src/components/spacer.ts +29 -0
  242. package/vendor/pi-tui/src/components/stack.ts +155 -0
  243. package/vendor/pi-tui/src/components/text.ts +108 -0
  244. package/vendor/pi-tui/src/components/truncated-text.ts +66 -0
  245. package/vendor/pi-tui/src/components/v-stack.ts +34 -0
  246. package/vendor/pi-tui/src/editor-component.ts +75 -0
  247. package/vendor/pi-tui/src/fuzzy.ts +138 -0
  248. package/vendor/pi-tui/src/index.ts +149 -0
  249. package/vendor/pi-tui/src/keybindings.ts +321 -0
  250. package/vendor/pi-tui/src/keys.ts +1402 -0
  251. package/vendor/pi-tui/src/kill-ring.ts +47 -0
  252. package/vendor/pi-tui/src/latex.ts +1381 -0
  253. package/vendor/pi-tui/src/layout-node.ts +52 -0
  254. package/vendor/pi-tui/src/layout.ts +411 -0
  255. package/vendor/pi-tui/src/native-modifiers.ts +60 -0
  256. package/vendor/pi-tui/src/native-module-path.ts +32 -0
  257. package/vendor/pi-tui/src/stdin-buffer.ts +445 -0
  258. package/vendor/pi-tui/src/terminal-colors.ts +74 -0
  259. package/vendor/pi-tui/src/terminal-image.ts +701 -0
  260. package/vendor/pi-tui/src/terminal.ts +554 -0
  261. package/vendor/pi-tui/src/tui-alt-screen.ts +1379 -0
  262. package/vendor/pi-tui/src/tui-main-screen.ts +655 -0
  263. package/vendor/pi-tui/src/tui.ts +1264 -0
  264. package/vendor/pi-tui/src/undo-stack.ts +29 -0
  265. package/vendor/pi-tui/src/utils.ts +1327 -0
  266. package/vendor/pi-tui/src/word-navigation.ts +118 -0
  267. package/vendor/pi-tui/test/test-themes.ts +39 -0
  268. package/vendor/pi-tui/test/virtual-terminal.ts +219 -0
  269. package/CHANGELOG.md +0 -512
  270. package/bin/rovecode.js +0 -24
  271. package/dist/cli/app-dybnr56b.js +0 -2
  272. package/dist/cli/ask-user-p8hq4xgj.js +0 -2
  273. package/dist/cli/auth-login-ewpgw5sm.js +0 -2
  274. package/dist/cli/auth-m8p9grty.js +0 -2
  275. package/dist/cli/bench-xv3ypwev.js +0 -9
  276. package/dist/cli/catalog-737wb2s0.js +0 -2
  277. package/dist/cli/cli-arhg40m0.js +0 -2
  278. package/dist/cli/client-cf2pxx8q.js +0 -2
  279. package/dist/cli/commands-3p7e4xxs.js +0 -2
  280. package/dist/cli/connect-3q93d7cb.js +0 -2
  281. package/dist/cli/context-cmd-eqxmxhzq.js +0 -2
  282. package/dist/cli/context-report-hbw9zfes.js +0 -2
  283. package/dist/cli/count-remote-mby98cd0.js +0 -2
  284. package/dist/cli/design-122y0axd.js +0 -2
  285. package/dist/cli/dispatch-b4egzvvh.js +0 -2
  286. package/dist/cli/doctor-x4jkv72e.js +0 -3
  287. package/dist/cli/executor-ftvg6tsy.js +0 -2
  288. package/dist/cli/export-pdgdhkch.js +0 -2
  289. package/dist/cli/files-cez9a96p.js +0 -2
  290. package/dist/cli/gauntlet-r3xxaszc.js +0 -2
  291. package/dist/cli/gauntlet-runner-r515m7kk.js +0 -10
  292. package/dist/cli/gauntlet-wave3-bnkjk2v2.js +0 -5
  293. package/dist/cli/gauntlet-wave4-acs9s60q.js +0 -14
  294. package/dist/cli/hashline-ewg5hbe3.js +0 -2
  295. package/dist/cli/http-n0kehsk8.js +0 -5
  296. package/dist/cli/index-z5qt1s76.js +0 -2
  297. package/dist/cli/install-80mp63kx.js +0 -2
  298. package/dist/cli/loop-12twjcat.js +0 -2
  299. package/dist/cli/main-01pv9206.js +0 -4
  300. package/dist/cli/main-0jys2ccn.js +0 -3
  301. package/dist/cli/main-1ztz6fkj.js +0 -10
  302. package/dist/cli/main-23q7cmww.js +0 -9
  303. package/dist/cli/main-2rzbexn2.js +0 -3
  304. package/dist/cli/main-2wyax8k9.js +0 -9
  305. package/dist/cli/main-2yeveeve.js +0 -6
  306. package/dist/cli/main-2z3dek0b.js +0 -3
  307. package/dist/cli/main-2zgsknth.js +0 -3
  308. package/dist/cli/main-45ejth3a.js +0 -4
  309. package/dist/cli/main-45rn3trk.js +0 -22
  310. package/dist/cli/main-4p4e2w7x.js +0 -4
  311. package/dist/cli/main-4y0tnfpa.js +0 -16
  312. package/dist/cli/main-5py0rkmc.js +0 -4
  313. package/dist/cli/main-6dtqmbt6.js +0 -7
  314. package/dist/cli/main-6h9x282m.js +0 -4
  315. package/dist/cli/main-6vjeds42.js +0 -3
  316. package/dist/cli/main-78gq4bt9.js +0 -6
  317. package/dist/cli/main-7jd5vh3x.js +0 -4
  318. package/dist/cli/main-7kt6r53y.js +0 -4
  319. package/dist/cli/main-8c1tbazx.js +0 -58
  320. package/dist/cli/main-9a9rnh47.js +0 -19
  321. package/dist/cli/main-9ht36z12.js +0 -3
  322. package/dist/cli/main-a2yfvcy9.js +0 -7
  323. package/dist/cli/main-a3f51n0x.js +0 -5
  324. package/dist/cli/main-b8zq261k.js +0 -3
  325. package/dist/cli/main-bxtvnf6d.js +0 -13
  326. package/dist/cli/main-edxc3yzt.js +0 -4
  327. package/dist/cli/main-evgz4mp5.js +0 -21
  328. package/dist/cli/main-f33fc5je.js +0 -9
  329. package/dist/cli/main-fvnpq46y.js +0 -12
  330. package/dist/cli/main-gbbty4d4.js +0 -3
  331. package/dist/cli/main-gth53dnt.js +0 -25
  332. package/dist/cli/main-hqbz10aw.js +0 -9
  333. package/dist/cli/main-hrrvcfan.js +0 -38
  334. package/dist/cli/main-hzwtsb2m.js +0 -5
  335. package/dist/cli/main-j7ttv0sd.js +0 -34
  336. package/dist/cli/main-jak598k9.js +0 -5
  337. package/dist/cli/main-kba6zeyd.js +0 -6
  338. package/dist/cli/main-kwwsz6rq.js +0 -3
  339. package/dist/cli/main-m8vm17zq.js +0 -3
  340. package/dist/cli/main-mg4f96e1.js +0 -3
  341. package/dist/cli/main-mg9b20ac.js +0 -18
  342. package/dist/cli/main-mgb9ccnx.js +0 -3
  343. package/dist/cli/main-mjt2p7aj.js +0 -3
  344. package/dist/cli/main-n6qrdbmy.js +0 -3
  345. package/dist/cli/main-na7wse0x.js +0 -5
  346. package/dist/cli/main-nqveez48.js +0 -4
  347. package/dist/cli/main-ntqef02r.js +0 -10
  348. package/dist/cli/main-nvc3yjay.js +0 -136
  349. package/dist/cli/main-p0cfn6nr.js +0 -16
  350. package/dist/cli/main-qj2djy17.js +0 -19
  351. package/dist/cli/main-qsevpgsv.js +0 -3
  352. package/dist/cli/main-qvarybsp.js +0 -3
  353. package/dist/cli/main-rebtt91r.js +0 -5
  354. package/dist/cli/main-rpg7h8mb.js +0 -3
  355. package/dist/cli/main-rsy72qmw.js +0 -15
  356. package/dist/cli/main-rvetps99.js +0 -18
  357. package/dist/cli/main-s4bb0jav.js +0 -3
  358. package/dist/cli/main-s9v8k74e.js +0 -3
  359. package/dist/cli/main-tjvwmscs.js +0 -3
  360. package/dist/cli/main-tkgarpjj.js +0 -4
  361. package/dist/cli/main-v8y60bb2.js +0 -3
  362. package/dist/cli/main-vhrrq337.js +0 -3
  363. package/dist/cli/main-vp2dfb7s.js +0 -4
  364. package/dist/cli/main-vqbr22sz.js +0 -8
  365. package/dist/cli/main-vxnwe5xx.js +0 -18
  366. package/dist/cli/main-wgph00xf.js +0 -5
  367. package/dist/cli/main-wk2csfnj.js +0 -5
  368. package/dist/cli/main-wm997zjx.js +0 -3
  369. package/dist/cli/main-wpkyraxh.js +0 -3
  370. package/dist/cli/main-wqt32p5x.js +0 -4
  371. package/dist/cli/main-x9ct6y1a.js +0 -3
  372. package/dist/cli/main-xfekqh9m.js +0 -7
  373. package/dist/cli/main-xt9zc3n6.js +0 -7
  374. package/dist/cli/main-xx2z3zh5.js +0 -4
  375. package/dist/cli/main-y5c82rxr.js +0 -3
  376. package/dist/cli/main-yrjt2sqt.js +0 -14
  377. package/dist/cli/main-ys6zj3yr.js +0 -3
  378. package/dist/cli/main-ywbxshqc.js +0 -8
  379. package/dist/cli/main-z13755t8.js +0 -25
  380. package/dist/cli/main-zc7pyrbj.js +0 -4
  381. package/dist/cli/main.js +0 -279
  382. package/dist/cli/market-cmd-bm5xvn9f.js +0 -5
  383. package/dist/cli/mcp-login-bthtfpt7.js +0 -2
  384. package/dist/cli/mcp-market-cmd-mbeshfyd.js +0 -2
  385. package/dist/cli/notify-54v5z9dz.js +0 -2
  386. package/dist/cli/oauth-g5gme95c.js +0 -2
  387. package/dist/cli/output-satndjap.js +0 -16
  388. package/dist/cli/profiles-sfhpbq3m.js +0 -2
  389. package/dist/cli/provider-config-hv3xtdt4.js +0 -2
  390. package/dist/cli/provider-kwzq6g84.js +0 -2
  391. package/dist/cli/registry-fh0hdnyn.js +0 -2
  392. package/dist/cli/registry-y1y8e94r.js +0 -2
  393. package/dist/cli/repl-t4z03mqq.js +0 -11
  394. package/dist/cli/resume-fqt4chg8.js +0 -2
  395. package/dist/cli/run-flags-rysbag9t.js +0 -2
  396. package/dist/cli/runtime-j19fjbsa.js +0 -2
  397. package/dist/cli/sandbox-config-g4qxd7y5.js +0 -2
  398. package/dist/cli/server-r0b6bksk.js +0 -5
  399. package/dist/cli/session-arg-txmn5g4x.js +0 -2
  400. package/dist/cli/session-ed250d9j.js +0 -2
  401. package/dist/cli/sessions-cmd-adw7svfn.js +0 -7
  402. package/dist/cli/settings-y9rzcqx8.js +0 -2
  403. package/dist/cli/setup-jmbr11j0.js +0 -2
  404. package/dist/cli/sextant-smoke-tcth0vea.js +0 -5
  405. package/dist/cli/skills-cmd-zbdy99v6.js +0 -2
  406. package/dist/cli/smoke-1bg937kx.js +0 -8
  407. package/dist/cli/start-chat-p01cdks3.js +0 -12
  408. package/dist/cli/stream-4wmyaypz.js +0 -2
  409. package/dist/cli/task-eg4s093s.js +0 -2
  410. package/dist/cli/tasks-12v9rr9k.js +0 -2
  411. package/dist/cli/thinking-a5ngvqyh.js +0 -2
  412. package/dist/cli/todo-1wxpcecx.js +0 -2
  413. package/dist/cli/tools-2ftsya7w.js +0 -2
  414. package/dist/cli/tools-x1tj4fxm.js +0 -2
  415. package/dist/cli/trust-cmd-hccxehzb.js +0 -2
  416. package/dist/cli/update-check-ygt3vd7m.js +0 -2
  417. package/dist/cli/update-cmd-v23qhr8c.js +0 -2
  418. package/dist/cli/voice-g1gtck92.js +0 -2
  419. package/dist/cli/webfetch-0nnrjgb5.js +0 -2
  420. package/dist/cli/websearch-f0vr2p7d.js +0 -2
  421. package/dist/cli/workspace-9rq1w4ta.js +0 -2
  422. package/dist/lib/index.js +0 -62
  423. package/dist/lib/models-index.json +0 -1
  424. package/dist/lib/plugins.js +0 -6
  425. package/dist/lib/providers.js +0 -17
  426. package/dist/lib/public-api.js +0 -20
  427. package/dist/rovecode.exe +0 -4
  428. /package/{dist/cli → src/providers}/models-index.json +0 -0
@@ -0,0 +1,131 @@
1
+ /** The lazy-disclosure seam (port #3): exactly TWO house tools are ever
2
+ * advertised to the model, regardless of how many MCP servers/tools exist.
3
+ * mcp_list returns a compact one-line-per-tool index (schemas on demand via a
4
+ * {schema:true} flag); mcp_call executes. Full server schemas never enter the
5
+ * system prompt — that is the ~0 idle-token invariant. */
6
+
7
+ import type { Tool, ToolContext, ToolOutput } from "../core/types.ts";
8
+ import type { McpManager } from "./client.ts";
9
+
10
+ const DESC_MAX = 60;
11
+ const SCHEMA_MAX = 1_500;
12
+
13
+ /** First line of a description, hard-capped for the index. */
14
+ function compact(desc: string): string {
15
+ const line = (desc.split("\n", 1)[0] ?? "").trim();
16
+ return line.length <= DESC_MAX ? line : `${line.slice(0, DESC_MAX - 1)}…`;
17
+ }
18
+
19
+ function renderSchema(schema: object): string {
20
+ const rendered = JSON.stringify(schema);
21
+ return rendered.length > SCHEMA_MAX ? `${rendered.slice(0, SCHEMA_MAX)}…` : rendered;
22
+ }
23
+
24
+ interface McpListArgs {
25
+ server?: string;
26
+ tool?: string;
27
+ schema?: boolean;
28
+ }
29
+
30
+ interface McpCallArgs {
31
+ server?: string;
32
+ tool?: string;
33
+ args?: unknown;
34
+ }
35
+
36
+ /** Build the two house tools bound to a manager. Always exactly [mcp_list, mcp_call]. */
37
+ export function createMcpTools(manager: McpManager): Tool[] {
38
+ const list: Tool = {
39
+ schema: {
40
+ name: "mcp_list",
41
+ description:
42
+ "List tools on connected MCP servers as 'server/tool — description'. " +
43
+ "With {server, tool, schema:true} returns that one tool's full JSON input schema.",
44
+ args: {
45
+ type: "object",
46
+ properties: {
47
+ server: { type: "string", description: "only list this server" },
48
+ tool: { type: "string", description: "tool name (for schema lookup)" },
49
+ schema: { type: "boolean", description: "return the full input schema for server+tool" },
50
+ },
51
+ additionalProperties: false,
52
+ },
53
+ },
54
+ kind: "read",
55
+ sequential: false,
56
+ async execute(rawArgs: unknown, ctx: ToolContext): Promise<ToolOutput> {
57
+ const a = (rawArgs ?? {}) as McpListArgs;
58
+ const server = typeof a.server === "string" && a.server.length > 0 ? a.server : undefined;
59
+ const tool = typeof a.tool === "string" && a.tool.length > 0 ? a.tool : undefined;
60
+
61
+ // schema mode: full JSON schema for exactly one tool, on demand
62
+ if (a.schema === true || tool !== undefined) {
63
+ if (server === undefined || tool === undefined) {
64
+ return { ok: false, output: "schema lookup needs both server and tool, e.g. {server:\"x\", tool:\"y\", schema:true}" };
65
+ }
66
+ const schema = await manager.toolSchema(server, tool, ctx.signal);
67
+ if (schema === undefined) {
68
+ return { ok: false, output: `no schema for "${tool}" on "${server}" (unknown tool or server not connected); run mcp_list first` };
69
+ }
70
+ return { ok: true, output: `input schema for ${server}/${tool}: ${renderSchema(schema)}`, data: schema };
71
+ }
72
+
73
+ // index mode: compact one-liners only
74
+ const tools = await manager.listTools(false, ctx.signal);
75
+ const filtered = server === undefined ? tools : tools.filter((t) => t.server === server);
76
+ if (filtered.length === 0) {
77
+ const connected = manager.connectedNames();
78
+ if (server !== undefined && !connected.includes(server)) {
79
+ return { ok: false, output: `MCP server "${server}" is not connected. Connected: ${connected.length > 0 ? connected.join(", ") : "(none)"}` };
80
+ }
81
+ return { ok: true, output: connected.length === 0 ? "no MCP servers connected" : "no tools advertised by connected MCP servers" };
82
+ }
83
+ const lines = filtered.map((t) => `${t.server}/${t.name} — ${compact(t.description)}`);
84
+ lines.push("", "call with mcp_call {server, tool, args}; arg schema via mcp_list {server, tool, schema:true}");
85
+ return { ok: true, output: lines.join("\n"), data: filtered };
86
+ },
87
+ };
88
+
89
+ const call: Tool = {
90
+ schema: {
91
+ name: "mcp_call",
92
+ description:
93
+ "Call a tool on a connected MCP server. Discover names with mcp_list; " +
94
+ "on argument errors the tool's input schema is included so you can retry.",
95
+ args: {
96
+ type: "object",
97
+ properties: {
98
+ server: { type: "string", description: "MCP server name" },
99
+ tool: { type: "string", description: "tool name on that server" },
100
+ args: { type: "object", description: "arguments matching the tool's input schema" },
101
+ },
102
+ required: ["server", "tool"],
103
+ additionalProperties: false,
104
+ },
105
+ },
106
+ kind: "custom", // policy maps this to action "tool.mcp_call" (prompt-gated by default)
107
+ interruptible: true,
108
+ async execute(rawArgs: unknown, ctx: ToolContext): Promise<ToolOutput> {
109
+ const a = (rawArgs ?? {}) as McpCallArgs;
110
+ const server = typeof a.server === "string" && a.server.length > 0 ? a.server : undefined;
111
+ const tool = typeof a.tool === "string" && a.tool.length > 0 ? a.tool : undefined;
112
+ if (server === undefined || tool === undefined) {
113
+ return { ok: false, output: 'mcp_call requires string "server" and "tool" (discover them with mcp_list)' };
114
+ }
115
+
116
+ const res = await manager.callTool(server, tool, a.args, ctx.signal, ctx.onUpdate);
117
+ if (res.ok) return { ok: true, output: res.output };
118
+
119
+ // validation-error path: attach the input schema (cache-hot after the call
120
+ // above) so the model can self-correct without a discovery round-trip.
121
+ let output = res.output;
122
+ if (!ctx.signal.aborted) {
123
+ const schema = await manager.toolSchema(server, tool, ctx.signal);
124
+ if (schema !== undefined) output += `\n\ninput schema for ${server}/${tool}: ${renderSchema(schema)}`;
125
+ }
126
+ return { ok: false, output };
127
+ },
128
+ };
129
+
130
+ return [list, call];
131
+ }
@@ -0,0 +1,49 @@
1
+ /** Trust for PROJECT MCP files (.rovecode/mcp.json, .mcp.json) — the same store and the same bar as project
2
+ * plugins (plugins/state.ts): ~/.rovecode/plugins.json `trusted`, keyed by the file's absolute path, value =
3
+ * sha256 of its bytes. The store lives in the USER home, so a repo cannot trust itself; any edit to the file
4
+ * changes the digest and the gate asks again. An untrusted file contributes NOTHING (config.ts loadMcpConfig
5
+ * skips it with one warning) — absence, not "loaded but marked". Berkay's choice on top of the gate: files
6
+ * he writes himself through `mcp add --project` / `mcp remove --project` are trusted the moment he approves
7
+ * them (market-install.ts records the digest right after the write); hand-edited and cloned files ask. */
8
+
9
+ import { existsSync } from "node:fs";
10
+ import { loadState, saveState, trustKey, type PluginState } from "../plugins/state.ts";
11
+ import { fileDigest, mcpConfigFiles } from "./config.ts";
12
+
13
+ export { fileDigest };
14
+
15
+ /** the predicate loadMcpConfig takes: is THIS content of THIS file approved on this machine */
16
+ export function trustedPredicate(state: PluginState): (file: string, digest: string) => boolean {
17
+ return (file, digest) => state.trusted[trustKey(file)] === digest;
18
+ }
19
+
20
+ export type TrustStatus = "trusted" | "untrusted" | "absent";
21
+ export function mcpTrustStatus(home: string, file: string): TrustStatus {
22
+ const digest = fileDigest(file);
23
+ if (digest === undefined) return "absent";
24
+ return trustedPredicate(loadState(home))(file, digest) ? "trusted" : "untrusted";
25
+ }
26
+
27
+ /** record the file's CURRENT bytes as approved; an absent file only loses any stale entry */
28
+ export function trustMcpFile(home: string, file: string): { ok: true; digest: string } | { ok: false; reason: string } {
29
+ const state = loadState(home);
30
+ const digest = fileDigest(file);
31
+ if (digest === undefined) { delete state.trusted[trustKey(file)]; saveState(home, state); return { ok: false, reason: `${file}: no such file` }; }
32
+ state.trusted[trustKey(file)] = digest;
33
+ saveState(home, state);
34
+ return { ok: true, digest };
35
+ }
36
+
37
+ export function untrustMcpFile(home: string, file: string): boolean {
38
+ const state = loadState(home);
39
+ const had = trustKey(file) in state.trusted;
40
+ delete state.trusted[trustKey(file)];
41
+ saveState(home, state);
42
+ return had;
43
+ }
44
+
45
+ /** the project files that exist in this checkout — what `mcp trust` / `mcp show` act on */
46
+ export function projectMcpFiles(cwd: string): string[] {
47
+ const f = mcpConfigFiles(cwd);
48
+ return [f.harvest, f.project].filter((p) => existsSync(p));
49
+ }
@@ -0,0 +1,175 @@
1
+ /** Bounded markdown memory blocks (hermes pattern): MEMORY.md + USER.md with hard char caps.
2
+ * The snapshot is frozen at session start (constructor) so the system prompt stays
3
+ * cache-stable; tools mutate live state + disk only. A threat-scan neutralizes injection
4
+ * lines in the rendered view — raw text on disk is never rewritten by the scan. */
5
+
6
+ import { existsSync, readFileSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ import { VersionLedger } from "../skills/versioned.ts";
9
+
10
+ export type BlockName = "memory" | "user";
11
+
12
+ export interface BlockCaps { memory: number; user: number }
13
+
14
+ export const defaultCaps: BlockCaps = { memory: 2_200, user: 1_375 };
15
+
16
+ export interface BlockEditResult {
17
+ ok: boolean;
18
+ reason?: string;
19
+ /** present on cap failures: current chars / cap */
20
+ current?: number;
21
+ limit?: number;
22
+ /** present on version conflicts: ledger numbers for logs/data surfaces only —
23
+ * the model-facing `reason` stays generic (ouroboros: no ledger internals). */
24
+ conflict?: { baseVersion: number; currentVersion: number };
25
+ }
26
+
27
+ /** Model-facing conflict reason — deliberately free of ledger internals. */
28
+ export const CONFLICT_REASON = "memory changed since it was read — re-read and retry";
29
+
30
+ const THREAT = /(?:ignore previous|disregard above|system prompt)/i;
31
+
32
+ function scan(text: string): string {
33
+ return text.split("\n").map((l) => (THREAT.test(l) ? "[BLOCKED]" : l)).join("\n");
34
+ }
35
+
36
+ function occurrences(haystack: string, needle: string): number {
37
+ if (!needle) return 0;
38
+ let n = 0;
39
+ let i = 0;
40
+ while ((i = haystack.indexOf(needle, i)) !== -1) { n++; i += needle.length; }
41
+ return n;
42
+ }
43
+
44
+ export class BlockStore {
45
+ private live: Record<BlockName, string> = { memory: "", user: "" };
46
+ private readonly frozen: Record<BlockName, string>;
47
+ /** port #16: versioned edits — every commit lands through a sidecar ledger
48
+ * (<file>.versions.jsonl), enabling one-call rollback + drift detection. */
49
+ private readonly ledgers: Record<BlockName, VersionLedger>;
50
+ /** Optimistic-concurrency baseline (prime baselineState, refinement.ts:735-749):
51
+ * the version THIS store last saw. Passing ledger.version() to commit would
52
+ * compare the guard to itself and silently drop a concurrent store's edit. */
53
+ private readonly baseVersions: Record<BlockName, number>;
54
+
55
+ constructor(
56
+ private readonly dir: string,
57
+ private readonly caps: BlockCaps = defaultCaps,
58
+ ) {
59
+ // no mkdir here: reads tolerate a missing directory and the ledger creates it on the first commit
60
+ // (skills/versioned.ts). Creating `<session>/memory` at construction was what made every session
61
+ // directory non-empty before anyone had said anything (core/session.ts materialize()).
62
+ this.live.memory = this.read("MEMORY.md");
63
+ this.live.user = this.read("USER.md");
64
+ // snapshot is the threat-scanned view of what session start loaded
65
+ this.frozen = { memory: scan(this.live.memory), user: scan(this.live.user) };
66
+ this.ledgers = {
67
+ memory: new VersionLedger(this.file("memory")),
68
+ user: new VersionLedger(this.file("user")),
69
+ };
70
+ this.baseVersions = { memory: this.ledgers.memory.version(), user: this.ledgers.user.version() };
71
+ }
72
+
73
+ private read(name: string): string {
74
+ const p = join(this.dir, name);
75
+ return existsSync(p) ? readFileSync(p, "utf8") : "";
76
+ }
77
+
78
+ private file(block: BlockName): string {
79
+ return join(this.dir, block === "memory" ? "MEMORY.md" : "USER.md");
80
+ }
81
+
82
+ add(block: BlockName, text: string): BlockEditResult {
83
+ const t = text.trim();
84
+ if (!t) return { ok: false, reason: "empty text" };
85
+ const next = this.live[block] ? this.live[block] + "\n" + t : t;
86
+ return this.commit(block, next);
87
+ }
88
+
89
+ replace(block: BlockName, oldText: string, newText: string): BlockEditResult {
90
+ const found = this.locate(block, oldText);
91
+ if (!found.ok) return found;
92
+ const t = newText.trim();
93
+ const next = t ? this.live[block].replace(oldText, t) : this.live[block].replace(oldText, "");
94
+ return this.commit(block, next.trim());
95
+ }
96
+
97
+ remove(block: BlockName, oldText: string): BlockEditResult {
98
+ const found = this.locate(block, oldText);
99
+ if (!found.ok) return found;
100
+ const next = this.live[block].replace(oldText, "").replace(/\n{3,}/g, "\n\n").trim();
101
+ return this.commit(block, next);
102
+ }
103
+
104
+ /** oldText must match exactly once: 0 → not found, >1 → ambiguous. */
105
+ private locate(block: BlockName, oldText: string): BlockEditResult {
106
+ if (!oldText) return { ok: false, reason: "oldText required" };
107
+ const n = occurrences(this.live[block], oldText);
108
+ if (n === 0) return { ok: false, reason: "oldText not found" };
109
+ if (n > 1) return { ok: false, reason: `oldText matches ${n} times; must match exactly once` };
110
+ return { ok: true };
111
+ }
112
+
113
+ /** Char-cap guard shared by commit() and rollback(); runs BEFORE any ledger write. */
114
+ private capCheck(block: BlockName, next: string): BlockEditResult | null {
115
+ const limit = this.caps[block];
116
+ if (next.length <= limit) return null;
117
+ return {
118
+ ok: false, reason: `block would exceed cap (${next.length} > ${limit} chars)`,
119
+ current: this.live[block].length, limit,
120
+ };
121
+ }
122
+
123
+ private commit(block: BlockName, next: string): BlockEditResult {
124
+ const capped = this.capCheck(block, next);
125
+ if (capped) return capped;
126
+ // ledger-first write (port #16): version record appended, then the target
127
+ // is written atomically by the ledger — never writeFileSync directly. The
128
+ // baseline is what THIS store last saw, so a concurrent store's commit is
129
+ // caught here instead of being silently overwritten.
130
+ const r = this.ledgers[block].commit(next, "memory_edit", this.baseVersions[block]);
131
+ if (!r.ok) {
132
+ // conflict: another store/process advanced the block. Re-read reality so
133
+ // the next edit builds on the merged state; the reason stays generic —
134
+ // ledger numbers ride the structured field only.
135
+ this.live[block] = this.ledgers[block].read();
136
+ this.baseVersions[block] = r.currentVersion;
137
+ return {
138
+ ok: false, reason: CONFLICT_REASON,
139
+ conflict: { baseVersion: r.baseVersion, currentVersion: r.currentVersion },
140
+ };
141
+ }
142
+ this.baseVersions[block] = r.edit.version;
143
+ this.live[block] = next;
144
+ return { ok: true, current: next.length, limit: this.caps[block] };
145
+ }
146
+
147
+ /** port #16: one-call rollback of a block to any retained version.
148
+ * Restored content re-enters through the same cap guard as commits. */
149
+ rollback(block: BlockName, toVersion: number): BlockEditResult {
150
+ const restored = this.ledgers[block].contentAt(toVersion);
151
+ const capped = restored !== undefined ? this.capCheck(block, restored) : null;
152
+ if (capped) return capped;
153
+ const r = this.ledgers[block].rollback(toVersion, "memory_rollback");
154
+ if (!r.ok) return { ok: false, reason: r.message };
155
+ this.baseVersions[block] = r.edit.version;
156
+ this.live[block] = this.ledgers[block].read();
157
+ return { ok: true, current: this.live[block].length, limit: this.caps[block] };
158
+ }
159
+
160
+ /** port #16: version history access for status/debug surfaces. */
161
+ ledger(block: BlockName): VersionLedger { return this.ledgers[block]; }
162
+
163
+ /** Session-start snapshot (threat-scanned). Tool writes never change it. */
164
+ renderForPrompt(): string {
165
+ const parts: string[] = [];
166
+ if (this.frozen.memory) parts.push(`# Memory\n${this.frozen.memory}`);
167
+ if (this.frozen.user) parts.push(`# User\n${this.frozen.user}`);
168
+ return parts.join("\n\n");
169
+ }
170
+
171
+ /** Live (post-snapshot) raw text — for reads/debug, not for the prompt. */
172
+ liveText(block: BlockName): string { return this.live[block]; }
173
+
174
+ cap(block: BlockName): number { return this.caps[block]; }
175
+ }