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,373 @@
1
+ /**
2
+ * Eval trajectory/result persistence (eval P0-1): a VERSIONED JSONL schema, one file per run.
3
+ *
4
+ * line 1 {"kind":"header", "schemaVersion":1, …run identity, task, model, seed, commit, fixture}
5
+ * … {"kind":"step", …user / assistant (tool calls) / tool (results) records}
6
+ * last {"kind":"result", …outcome, duration, usage, cost, failure taxonomy, grader specs+results, evidence}
7
+ *
8
+ * Design rules the file is judged by:
9
+ * - Every string payload is REDACTED (eval/redact.ts) and workspace-relative-ized
10
+ * (portablize: absolute workspace paths become a "<workspace>" token) BEFORE it is
11
+ * written — a trajectory is safe to commit/share and replayable on another machine.
12
+ * - `outputSha` is the sha256 of the path-normalized RAW tool output, so replay compares
13
+ * substance while the stored text stays redacted evidence.
14
+ * - The reader CLASSIFIES problems (unsupported-version / missing-header / malformed-line
15
+ * with its line number / unknown line kinds tolerated) — never a raw JSON crash mid-file.
16
+ * - Fixture snapshots (fixtureSpec) record the pre-run workspace so replay can rebuild it
17
+ * deterministically; binaries are recorded by sha only, never embedded.
18
+ *
19
+ * Schema version 1. Adding optional fields is compatible; bump TRAJECTORY_SCHEMA_VERSION
20
+ * and add the old version to SUPPORTED_TRAJECTORY_VERSIONS when reading old files.
21
+ */
22
+
23
+ import { createHash, randomUUID } from "node:crypto";
24
+ import { readdirSync, readFileSync, writeFileSync, appendFileSync, mkdirSync, statSync } from "node:fs";
25
+ import { join, relative } from "node:path";
26
+ import { redactDeep } from "./redact.ts";
27
+ import type { PermissionRule } from "../core/types.ts";
28
+
29
+ export const TRAJECTORY_SCHEMA_VERSION = 1;
30
+ export const SUPPORTED_TRAJECTORY_VERSIONS: readonly number[] = [1];
31
+
32
+ export type FailureTaxonomy =
33
+ | "verify-failed" // a strict grader rejected the end state
34
+ | "timeout" // the run's deadline fired
35
+ | "provider-error" // the provider/stream failed (run_end "error" or thrown)
36
+ | "budget" // turn/second/cost budget exhausted (run_end "budget")
37
+ | "loop-guard" // the tool guard stubbed the run into submission
38
+ | "invalid-args" // tool calls the schema rejected
39
+ | "permission-denied" // policy/hook/user denied the needed tool call
40
+ | "workspace-leak" // the runner left temp dirs behind
41
+ | "tool-error" // tool failures without a more specific home
42
+ | "unknown";
43
+
44
+ export interface FixtureSpec {
45
+ /** workspace-relative path → full text content (redacted) */
46
+ files: Record<string, string>;
47
+ /** workspace-relative path → sha256 of content; the content itself is NOT persisted */
48
+ binary: Record<string, string>;
49
+ }
50
+
51
+ export interface TrajectoryHeaderLine {
52
+ kind: "header";
53
+ schemaVersion: number;
54
+ runId: string;
55
+ startedAt: number;
56
+ task: { id: string; category: string; prompt: string };
57
+ model: { provider: string; model: string } | null;
58
+ seed: number;
59
+ commit: string | null;
60
+ fixture: FixtureSpec;
61
+ permissionRules?: PermissionRule[];
62
+ env: { platform: string; runtime: string };
63
+ }
64
+
65
+ export interface RecordedToolCall { id: string; tool: string; args: unknown }
66
+
67
+ export interface RecordedToolResult {
68
+ callId: string;
69
+ ok: boolean;
70
+ /** path-normalized + redacted text (evidence, bounded) */
71
+ output: string;
72
+ /** sha256 of the path-normalized RAW output — what replay compares */
73
+ outputSha: string;
74
+ }
75
+
76
+ export interface TrajectoryStepLine {
77
+ kind: "step";
78
+ seq: number;
79
+ type: "user" | "assistant" | "tool";
80
+ turn?: number;
81
+ text?: string;
82
+ toolCalls?: RecordedToolCall[];
83
+ results?: RecordedToolResult[];
84
+ stopReason?: string;
85
+ usage?: { input: number; output: number; cacheRead?: number; cacheWrite?: number };
86
+ }
87
+
88
+ export interface GraderOutcomeRecord { name: string; pass: boolean; detail: string }
89
+
90
+ export interface TrajectoryResultLine {
91
+ kind: "result";
92
+ schemaVersion: number;
93
+ runId: string;
94
+ outcome: "pass" | "fail" | "error" | "timeout";
95
+ durationMs: number;
96
+ toolCallCount: number;
97
+ usage?: { input: number; output: number; cacheRead?: number; cacheWrite?: number };
98
+ costUsd?: number;
99
+ failure?: { taxonomy: FailureTaxonomy; detail: string };
100
+ graderSpecs?: unknown[];
101
+ graderResults?: GraderOutcomeRecord[];
102
+ evidence: { finalText?: string; toolCalls?: { tool: string; args: unknown }[]; notes?: string[] };
103
+ }
104
+
105
+ export type TrajectoryLine = TrajectoryHeaderLine | TrajectoryStepLine | TrajectoryResultLine;
106
+
107
+ // ---------- path portability + stable hashing ----------
108
+
109
+ export const WORKSPACE_TOKEN = "<workspace>";
110
+
111
+ /** Deep-walk a JSON value and replace the workspace's absolute path (both slash styles) inside
112
+ * string values with the "<workspace>" token — the recorded file becomes machine-independent. */
113
+ export function portablize<T>(value: T, workspace: string): T {
114
+ const win = workspace;
115
+ const fwd = workspace.replace(/\\/g, "/");
116
+ const swap = (s: string): string => {
117
+ let out = s.split(win).join(WORKSPACE_TOKEN);
118
+ if (fwd !== win) out = out.split(fwd).join(WORKSPACE_TOKEN);
119
+ return out;
120
+ };
121
+ const walk = (v: unknown, seen: Set<object>): unknown => {
122
+ if (typeof v === "string") return swap(v);
123
+ if (v === null || typeof v !== "object") return v;
124
+ const o = v as object;
125
+ if (seen.has(o)) return "[circular]";
126
+ seen.add(o);
127
+ try {
128
+ if (Array.isArray(o)) return o.map((x) => walk(x, seen));
129
+ const rec = o as Record<string, unknown>;
130
+ const out: Record<string, unknown> = {};
131
+ for (const [k, x] of Object.entries(rec)) out[k] = walk(x, seen);
132
+ return out;
133
+ } finally {
134
+ seen.delete(o);
135
+ }
136
+ };
137
+ return walk(value, new Set()) as T;
138
+ }
139
+
140
+ /** Inverse of portablize: "<workspace>" tokens in a recorded value become real paths again. */
141
+ export function deportablize<T>(value: T, workspace: string): T {
142
+ const walk = (v: unknown, seen: Set<object>): unknown => {
143
+ if (typeof v === "string") return v.split(WORKSPACE_TOKEN).join(workspace);
144
+ if (v === null || typeof v !== "object") return v;
145
+ const o = v as object;
146
+ if (seen.has(o)) return "[circular]";
147
+ seen.add(o);
148
+ try {
149
+ if (Array.isArray(o)) return o.map((x) => walk(x, seen));
150
+ const rec = o as Record<string, unknown>;
151
+ const out: Record<string, unknown> = {};
152
+ for (const [k, x] of Object.entries(rec)) out[k] = walk(x, seen);
153
+ return out;
154
+ } finally {
155
+ seen.delete(o);
156
+ }
157
+ };
158
+ return walk(value, new Set()) as T;
159
+ }
160
+
161
+ export function sha256Text(text: string): string {
162
+ return createHash("sha256").update(Buffer.from(text, "utf16le")).digest("hex");
163
+ }
164
+
165
+ // ---------- fixture snapshots (the deterministic replay input) ----------
166
+
167
+ const FIXTURE_SKIP = new Set([".git", "node_modules", "dist", "out", ".rovecode", ".cumulus", "__pycache__"]);
168
+
169
+ export function snapshotFixture(workspace: string, opts?: { maxFileBytes?: number }): FixtureSpec {
170
+ const maxFileBytes = opts?.maxFileBytes ?? 256 * 1024;
171
+ const files: Record<string, string> = {};
172
+ const binary: Record<string, string> = {};
173
+ const walk = (dir: string): void => {
174
+ let names: string[];
175
+ try {
176
+ names = readdirSync(dir);
177
+ } catch {
178
+ return;
179
+ }
180
+ for (const name of names) {
181
+ if (FIXTURE_SKIP.has(name)) continue;
182
+ const abs = join(dir, name);
183
+ let st;
184
+ try {
185
+ st = statSync(abs);
186
+ } catch {
187
+ continue;
188
+ }
189
+ if (st.isDirectory()) {
190
+ walk(abs);
191
+ continue;
192
+ }
193
+ if (!st.isFile()) continue;
194
+ const rel = relative(workspace, abs).replace(/\\/g, "/");
195
+ try {
196
+ if (st.size > maxFileBytes) {
197
+ binary[rel] = createHash("sha256").update(readFileSync(abs)).digest("hex");
198
+ continue;
199
+ }
200
+ const buf = readFileSync(abs);
201
+ if (buf.subarray(0, 1024).includes(0)) {
202
+ binary[rel] = createHash("sha256").update(buf).digest("hex");
203
+ continue;
204
+ }
205
+ files[rel] = buf.toString("utf8");
206
+ } catch {
207
+ // unreadable file: skip, the fixture is a best-effort snapshot of a test workspace
208
+ }
209
+ }
210
+ };
211
+ walk(workspace);
212
+ return { files, binary };
213
+ }
214
+
215
+ export function materializeFixture(fixture: FixtureSpec, dir: string): void {
216
+ for (const [rel, content] of Object.entries(fixture.files)) {
217
+ const abs = join(dir, ...rel.split("/"));
218
+ mkdirSync(join(abs, ".."), { recursive: true });
219
+ writeFileSync(abs, content, "utf8");
220
+ }
221
+ }
222
+
223
+ // ---------- writer ----------
224
+
225
+ /** Evidence outputs are bounded: the full redacted text would bloat JSONL for huge tool
226
+ * results; the sha (unbounded input) is what replay actually compares. */
227
+ const EVIDENCE_OUTPUT_CHARS = 2000;
228
+
229
+ export class TrajectoryWriter {
230
+ readonly path: string;
231
+ private readonly workspace: string;
232
+
233
+ constructor(dir: string, runId: string, workspace: string) {
234
+ mkdirSync(dir, { recursive: true });
235
+ this.path = join(dir, `${runId}.trajectory.jsonl`);
236
+ this.workspace = workspace;
237
+ }
238
+
239
+ private write(line: TrajectoryLine): void {
240
+ appendFileSync(this.path, JSON.stringify(line) + "\n", "utf8");
241
+ }
242
+
243
+ writeHeader(header: TrajectoryHeaderLine): void {
244
+ const fixture = {
245
+ files: redactDeep(portablize(header.fixture.files, this.workspace)) as Record<string, string>,
246
+ binary: header.fixture.binary,
247
+ };
248
+ this.write({ ...header, task: redactDeep(header.task), fixture, permissionRules: header.permissionRules });
249
+ }
250
+
251
+ writeStep(step: TrajectoryStepLine): void {
252
+ const s: TrajectoryStepLine = { ...step };
253
+ if (s.text !== undefined) s.text = redactSafe(portablize(s.text, this.workspace));
254
+ if (s.toolCalls !== undefined) s.toolCalls = redactDeep(portablize(s.toolCalls, this.workspace)) as RecordedToolCall[];
255
+ if (s.results !== undefined) {
256
+ s.results = (portablize(s.results, this.workspace) as RecordedToolResult[]).map((r) => ({
257
+ ...r,
258
+ output: redactSafe(r.output).slice(0, EVIDENCE_OUTPUT_CHARS),
259
+ }));
260
+ }
261
+ this.write(s);
262
+ }
263
+
264
+ writeResult(result: TrajectoryResultLine): void {
265
+ const evidence = redactDeep(portablize(result.evidence, this.workspace)) as TrajectoryResultLine["evidence"];
266
+ if (evidence.finalText !== undefined) evidence.finalText = evidence.finalText.slice(0, EVIDENCE_OUTPUT_CHARS);
267
+ const graderSpecs = result.graderSpecs !== undefined
268
+ ? (redactDeep(portablize(result.graderSpecs, this.workspace)) as unknown[])
269
+ : undefined;
270
+ this.write({ ...result, graderSpecs, evidence });
271
+ }
272
+ }
273
+
274
+ /** String convenience for redactDeep — redacts every pattern hit in one string. */
275
+ export function redactSafe(s: string): string {
276
+ return redactDeep(s) as unknown as string;
277
+ }
278
+
279
+ // ---------- reader ----------
280
+
281
+ export type EvalTrajectoryErrorKind = "missing-file" | "unsupported-version" | "missing-header" | "malformed-line";
282
+
283
+ export class EvalTrajectoryError extends Error {
284
+ readonly kind: EvalTrajectoryErrorKind;
285
+ readonly line?: number;
286
+
287
+ constructor(kind: EvalTrajectoryErrorKind, message: string, line?: number) {
288
+ super(line === undefined ? message : `${message} (line ${line})`);
289
+ this.name = "EvalTrajectoryError";
290
+ this.kind = kind;
291
+ this.line = line;
292
+ }
293
+ }
294
+
295
+ export interface Trajectory {
296
+ header: TrajectoryHeaderLine;
297
+ steps: TrajectoryStepLine[];
298
+ result: TrajectoryResultLine | null;
299
+ /** foreign line kinds (a newer writer) — tolerated and counted, never fatal */
300
+ unknown: number;
301
+ }
302
+
303
+ export function readTrajectory(path: string): Trajectory {
304
+ let raw: string;
305
+ try {
306
+ raw = readFileSync(path, "utf8");
307
+ } catch {
308
+ throw new EvalTrajectoryError("missing-file", `trajectory file not readable: ${path}`);
309
+ }
310
+ const lines = raw.split("\n");
311
+ let header: TrajectoryHeaderLine | null = null;
312
+ const steps: TrajectoryStepLine[] = [];
313
+ let result: TrajectoryResultLine | null = null;
314
+ let unknown = 0;
315
+ for (let i = 0; i < lines.length; i++) {
316
+ const text = lines[i]!.trim();
317
+ if (text === "") continue;
318
+ let parsed: unknown;
319
+ try {
320
+ parsed = JSON.parse(text);
321
+ } catch {
322
+ throw new EvalTrajectoryError("malformed-line", "trajectory line is not valid JSON", i + 1);
323
+ }
324
+ if (!parsed || typeof parsed !== "object" || !("kind" in parsed)) {
325
+ unknown++;
326
+ continue;
327
+ }
328
+ const kind = (parsed as { kind: unknown }).kind;
329
+ if (kind === "header") {
330
+ header = parsed as TrajectoryHeaderLine;
331
+ continue;
332
+ }
333
+ if (kind === "step") {
334
+ steps.push(parsed as TrajectoryStepLine);
335
+ continue;
336
+ }
337
+ if (kind === "result") {
338
+ result = parsed as TrajectoryResultLine;
339
+ continue;
340
+ }
341
+ unknown++;
342
+ }
343
+ if (header === null) throw new EvalTrajectoryError("missing-header", "trajectory has no header line");
344
+ if (!SUPPORTED_TRAJECTORY_VERSIONS.includes(header.schemaVersion)) {
345
+ throw new EvalTrajectoryError(
346
+ "unsupported-version",
347
+ `trajectory schemaVersion ${header.schemaVersion} not supported (supported: ${SUPPORTED_TRAJECTORY_VERSIONS.join(", ")})`,
348
+ );
349
+ }
350
+ steps.sort((a, b) => a.seq - b.seq);
351
+ return { header, steps, result, unknown };
352
+ }
353
+
354
+ // ---------- run identity helpers ----------
355
+
356
+ /** Best-effort HEAD commit for the header; null when git is absent (never throws). */
357
+ export function gitCommit(): string | null {
358
+ try {
359
+ const proc = Bun.spawnSync(["git", "rev-parse", "HEAD"], { stdout: "pipe", stderr: "pipe" });
360
+ if (proc.exitCode !== 0) return null;
361
+ const out = proc.stdout.toString().trim();
362
+ return /^[0-9a-f]{7,40}$/.test(out) ? out : null;
363
+ } catch {
364
+ return null;
365
+ }
366
+ }
367
+
368
+ /** Filesystem-safe run id with the task prefix and a time+random suffix. */
369
+ export function makeRunId(taskId: string): string {
370
+ const safe = taskId.toLowerCase().replace(/[^a-z0-9_-]+/g, "-");
371
+ const t = Date.now().toString(36);
372
+ return `${safe}-${t}-${randomUUID().slice(0, 4)}`;
373
+ }
package/src/index.ts ADDED
@@ -0,0 +1,17 @@
1
+ /** Rovecode public API surface. */
2
+
3
+ export * from "./core/types.ts";
4
+ export { agentLoop, SteeringQueue, extractToolCalls, partsText } from "./core/loop.ts";
5
+ export { ToolRegistry, evaluatePermissions } from "./core/tools.ts";
6
+ export type { ExtensionHooks } from "./core/tools.ts";
7
+ export { SessionStore, chainHash } from "./core/session.ts";
8
+ export type { Entry, Corruption, CorruptionKind, SessionMeta } from "./core/session.ts";
9
+ export { assembleContext, planCompaction, estimateTokens } from "./core/context.ts";
10
+ export { preflightSpawn, runChild, createIsolation, DEFAULT_MAX_DEPTH } from "./core/orchestrator.ts";
11
+ export type { SpawnContext, ChildRunnerDeps, IsolationWorkspace } from "./core/orchestrator.ts";
12
+ export { mockStream, openaiCompatStream, textTurn, toolTurn } from "./providers/stream.ts";
13
+ export type { MockScript } from "./providers/stream.ts";
14
+ export { lineHash, fileTag, readAnchored, renderAnchored, applyEdits, readTool, editTool, writeTool, bashTool } from "./coding/hashline.ts";
15
+ export type { AnchoredFile, EditOp, EditFailure, EditResult } from "./coding/hashline.ts";
16
+ export { MemoryStore, defaultLimits } from "./memory/store.ts";
17
+ export type { MemoryRecord, MemoryKind, MemoryLimits } from "./memory/store.ts";