rovecode 0.4.0-beta.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (432) hide show
  1. package/README.md +57 -72
  2. package/THIRD_PARTY_NOTICES.md +0 -44
  3. package/bin/rovecode.ts +21 -0
  4. package/package.json +16 -38
  5. package/src/account/keys.ts +97 -0
  6. package/src/account/login.ts +158 -0
  7. package/src/account/provision.ts +47 -0
  8. package/src/account/store.ts +63 -0
  9. package/src/acp/server.ts +373 -0
  10. package/src/cli/account-cmd.ts +116 -0
  11. package/src/cli/connect.ts +244 -0
  12. package/src/cli/context-cmd.ts +199 -0
  13. package/src/cli/dispatch.ts +109 -0
  14. package/src/cli/doctor.ts +324 -0
  15. package/src/cli/export.ts +278 -0
  16. package/src/cli/help.ts +240 -0
  17. package/src/cli/is-tui-invocation.ts +8 -0
  18. package/src/cli/main.ts +599 -0
  19. package/src/cli/market-cmd.ts +658 -0
  20. package/src/cli/mcp-market-cmd.ts +299 -0
  21. package/src/cli/output.ts +382 -0
  22. package/src/cli/repl.ts +172 -0
  23. package/src/cli/resume.ts +32 -0
  24. package/src/cli/run-limits.ts +78 -0
  25. package/src/cli/runtime.ts +792 -0
  26. package/src/cli/setup.ts +187 -0
  27. package/src/cli/update-cmd.ts +78 -0
  28. package/src/cli/workflow-cmd.ts +100 -0
  29. package/src/coding/checkpoints.ts +270 -0
  30. package/src/coding/diff.ts +136 -0
  31. package/src/coding/files.ts +339 -0
  32. package/src/coding/hashline.ts +319 -0
  33. package/src/coding/lsp.ts +406 -0
  34. package/src/coding/repomap-cache.ts +99 -0
  35. package/src/coding/repomap-files.ts +110 -0
  36. package/src/coding/repomap.ts +392 -0
  37. package/src/core/compaction.ts +399 -0
  38. package/src/core/config.ts +289 -0
  39. package/src/core/context-report.ts +228 -0
  40. package/src/core/context.ts +60 -0
  41. package/src/core/count-remote.ts +107 -0
  42. package/src/core/execpolicy-rules.ts +196 -0
  43. package/src/core/execpolicy.ts +385 -0
  44. package/src/core/executor.ts +397 -0
  45. package/src/core/guardrails.ts +400 -0
  46. package/src/core/hooks.ts +398 -0
  47. package/src/core/images.ts +230 -0
  48. package/src/core/intro.ts +236 -0
  49. package/src/core/loop.ts +621 -0
  50. package/src/core/modes.ts +372 -0
  51. package/src/core/orchestrator.ts +207 -0
  52. package/src/core/reflection.ts +165 -0
  53. package/src/core/sandbox-config.ts +167 -0
  54. package/src/core/session-images.ts +73 -0
  55. package/src/core/session.ts +398 -0
  56. package/src/core/settings.ts +98 -0
  57. package/src/core/stuck-detector.ts +273 -0
  58. package/src/core/tasks.ts +374 -0
  59. package/src/core/token-scale.ts +108 -0
  60. package/src/core/tool-output-budget.ts +166 -0
  61. package/src/core/tools.ts +288 -0
  62. package/src/core/types.ts +330 -0
  63. package/src/core/update-check.ts +171 -0
  64. package/src/core/update.ts +158 -0
  65. package/src/core/usage.ts +204 -0
  66. package/src/core/validate.ts +121 -0
  67. package/src/core/verify-gate.ts +159 -0
  68. package/src/core/verify.ts +237 -0
  69. package/src/core/voice.ts +158 -0
  70. package/src/core/win-job.ts +183 -0
  71. package/src/design/audit.ts +797 -0
  72. package/src/design/direction.ts +190 -0
  73. package/src/design/rules.ts +157 -0
  74. package/src/eval/bench.ts +150 -0
  75. package/src/eval/gauntlet-runner.ts +218 -0
  76. package/src/eval/gauntlet.ts +226 -0
  77. package/src/eval/grader.ts +186 -0
  78. package/src/eval/record.ts +202 -0
  79. package/src/eval/redact.ts +141 -0
  80. package/src/eval/replay.ts +147 -0
  81. package/src/eval/trajectory.ts +373 -0
  82. package/src/index.ts +17 -0
  83. package/src/market/catalogs/mcp-docs.json +111 -0
  84. package/src/market/catalogs/plugins.json +111 -0
  85. package/src/market/catalogs/skills.json +478 -0
  86. package/src/market/clone.ts +72 -0
  87. package/src/market/context-cost.ts +121 -0
  88. package/src/market/digest.ts +106 -0
  89. package/src/market/index.ts +22 -0
  90. package/src/market/install.ts +578 -0
  91. package/src/market/manifest.ts +187 -0
  92. package/src/market/prereq.ts +145 -0
  93. package/src/market/registry.ts +363 -0
  94. package/src/market/resolve.ts +111 -0
  95. package/src/market/types.ts +236 -0
  96. package/src/market/validate.ts +227 -0
  97. package/src/mcp/client.ts +431 -0
  98. package/src/mcp/config.ts +239 -0
  99. package/src/mcp/local-package.ts +211 -0
  100. package/src/mcp/market-catalog.ts +84 -0
  101. package/src/mcp/market-install.ts +289 -0
  102. package/src/mcp/market.ts +0 -0
  103. package/src/mcp/tools.ts +131 -0
  104. package/src/mcp/trust.ts +49 -0
  105. package/src/memory/blocks.ts +175 -0
  106. package/src/memory/recall.ts +355 -0
  107. package/src/memory/store.ts +105 -0
  108. package/src/memory/tools.ts +99 -0
  109. package/src/plugins/cli.ts +123 -0
  110. package/src/plugins/discover.ts +108 -0
  111. package/src/plugins/index.ts +50 -0
  112. package/src/plugins/init.ts +140 -0
  113. package/src/plugins/install.ts +184 -0
  114. package/src/plugins/load.ts +149 -0
  115. package/src/plugins/manifest.ts +106 -0
  116. package/src/plugins/state.ts +83 -0
  117. package/src/providers/auth.ts +293 -0
  118. package/src/providers/cache.ts +223 -0
  119. package/src/providers/catalog-local.ts +160 -0
  120. package/src/providers/catalog.ts +408 -0
  121. package/src/providers/middleware-context.ts +86 -0
  122. package/src/providers/middleware.ts +373 -0
  123. package/src/providers/profile-glm53.ts +111 -0
  124. package/src/providers/profile-sonnet5-persona.ts +65 -0
  125. package/src/providers/profile-sonnet5-voice.ts +23 -0
  126. package/src/providers/profiles.ts +156 -0
  127. package/src/providers/provider-config.ts +311 -0
  128. package/src/providers/registry.ts +302 -0
  129. package/src/providers/response-validation.ts +80 -0
  130. package/src/providers/retry.ts +234 -0
  131. package/src/providers/router.ts +294 -0
  132. package/src/providers/sse.ts +26 -0
  133. package/src/providers/stream-errors.ts +117 -0
  134. package/src/providers/stream.ts +569 -0
  135. package/src/providers/thinking.ts +189 -0
  136. package/src/providers/wire-messages.ts +129 -0
  137. package/src/sdk/client.ts +225 -0
  138. package/src/sdk/index.ts +3 -0
  139. package/src/server/dashboard.ts +144 -0
  140. package/src/server/http.ts +343 -0
  141. package/src/server/openapi.ts +246 -0
  142. package/src/sextant/card-hits.ts +102 -0
  143. package/src/sextant/card-keys.ts +55 -0
  144. package/src/sextant/context-source.ts +157 -0
  145. package/src/sextant/draw-agents.ts +273 -0
  146. package/src/sextant/draw-code.ts +388 -0
  147. package/src/sextant/draw-context.ts +222 -0
  148. package/src/sextant/draw-frame.ts +164 -0
  149. package/src/sextant/draw-market.ts +573 -0
  150. package/src/sextant/draw-messages.ts +386 -0
  151. package/src/sextant/draw-pet.ts +230 -0
  152. package/src/sextant/draw-plan.ts +159 -0
  153. package/src/sextant/draw-tabs.ts +85 -0
  154. package/src/sextant/draw-util.ts +65 -0
  155. package/src/sextant/engine.ts +230 -0
  156. package/src/sextant/frame-hits.ts +25 -0
  157. package/src/sextant/frame.ts +101 -0
  158. package/src/sextant/git-status.ts +197 -0
  159. package/src/sextant/grid.ts +59 -0
  160. package/src/sextant/input.ts +119 -0
  161. package/src/sextant/keys.ts +488 -0
  162. package/src/sextant/layout.ts +86 -0
  163. package/src/sextant/local-commands.ts +156 -0
  164. package/src/sextant/market-source.ts +287 -0
  165. package/src/sextant/mentions.ts +141 -0
  166. package/src/sextant/message-hits.ts +26 -0
  167. package/src/sextant/model.ts +387 -0
  168. package/src/sextant/overlays.ts +451 -0
  169. package/src/sextant/panel-hits.ts +38 -0
  170. package/src/sextant/pet.ts +399 -0
  171. package/src/sextant/screen.ts +324 -0
  172. package/src/sextant/scroll-hits.ts +66 -0
  173. package/src/sextant/scrollbar.ts +82 -0
  174. package/src/sextant/selection.ts +123 -0
  175. package/src/sextant/sextant-bridge.ts +174 -0
  176. package/src/sextant/sextant-cards.ts +142 -0
  177. package/src/sextant/sextant-diff-base.ts +63 -0
  178. package/src/sextant/sextant-files.ts +154 -0
  179. package/src/sextant/sextant-frame-loop.ts +314 -0
  180. package/src/sextant/sextant-renderer.ts +478 -0
  181. package/src/sextant/sextant-repo.ts +131 -0
  182. package/src/sextant/theme.ts +66 -0
  183. package/src/sextant/tool-rows.ts +189 -0
  184. package/src/sextant/types.ts +473 -0
  185. package/src/skills/index.ts +306 -0
  186. package/src/skills/tools.ts +69 -0
  187. package/src/skills/versioned.ts +227 -0
  188. package/src/telemetry/otel.ts +353 -0
  189. package/src/telemetry/otlp.ts +68 -0
  190. package/src/tools/ask-user.ts +156 -0
  191. package/src/tools/design.ts +151 -0
  192. package/src/tools/evalcell.ts +338 -0
  193. package/src/tools/html-text.ts +139 -0
  194. package/src/tools/provider.ts +149 -0
  195. package/src/tools/task.ts +216 -0
  196. package/src/tools/todo.ts +320 -0
  197. package/src/tools/webfetch.ts +331 -0
  198. package/src/tui/app.ts +608 -0
  199. package/src/tui/attach.ts +127 -0
  200. package/src/tui/checkpoints-cmd.ts +70 -0
  201. package/src/tui/clipboard-image.ts +81 -0
  202. package/src/tui/commands.ts +277 -0
  203. package/src/tui/cost.ts +108 -0
  204. package/src/tui/info-cmd.ts +144 -0
  205. package/src/tui/mcp-cmd.ts +128 -0
  206. package/src/tui/modes-cmd.ts +45 -0
  207. package/src/tui/overlays.ts +97 -0
  208. package/src/tui/pi-renderer.ts +424 -0
  209. package/src/tui/providers-cmd.ts +366 -0
  210. package/src/tui/renderer.ts +101 -0
  211. package/src/tui/replay-marker.ts +29 -0
  212. package/src/tui/session-cmd.ts +146 -0
  213. package/src/tui/sextant-attach.ts +68 -0
  214. package/src/tui/sextant-io.ts +184 -0
  215. package/src/tui/sextant-smoke.ts +110 -0
  216. package/src/tui/smoke.ts +72 -0
  217. package/src/tui/theme.ts +59 -0
  218. package/src/tui/todo-label.ts +7 -0
  219. package/src/workflow/engine.ts +266 -0
  220. package/tsconfig.json +30 -0
  221. package/vendor/pi-tui/LICENSE +21 -0
  222. package/vendor/pi-tui/PATCHES.md +12 -0
  223. package/vendor/pi-tui/PROVENANCE.md +12 -0
  224. package/vendor/pi-tui/README.upstream.md +854 -0
  225. package/vendor/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  226. package/vendor/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  227. package/vendor/pi-tui/src/alt-screen-search.ts +158 -0
  228. package/vendor/pi-tui/src/autocomplete.ts +827 -0
  229. package/vendor/pi-tui/src/components/alt-screen-flash.ts +52 -0
  230. package/vendor/pi-tui/src/components/box.ts +138 -0
  231. package/vendor/pi-tui/src/components/cancellable-loader.ts +41 -0
  232. package/vendor/pi-tui/src/components/editor.ts +2364 -0
  233. package/vendor/pi-tui/src/components/h-stack.ts +45 -0
  234. package/vendor/pi-tui/src/components/image.ts +128 -0
  235. package/vendor/pi-tui/src/components/input.ts +448 -0
  236. package/vendor/pi-tui/src/components/loader.ts +93 -0
  237. package/vendor/pi-tui/src/components/markdown.ts +1016 -0
  238. package/vendor/pi-tui/src/components/scroll-view.ts +217 -0
  239. package/vendor/pi-tui/src/components/select-list.ts +230 -0
  240. package/vendor/pi-tui/src/components/settings-list.ts +277 -0
  241. package/vendor/pi-tui/src/components/spacer.ts +29 -0
  242. package/vendor/pi-tui/src/components/stack.ts +155 -0
  243. package/vendor/pi-tui/src/components/text.ts +108 -0
  244. package/vendor/pi-tui/src/components/truncated-text.ts +66 -0
  245. package/vendor/pi-tui/src/components/v-stack.ts +34 -0
  246. package/vendor/pi-tui/src/editor-component.ts +75 -0
  247. package/vendor/pi-tui/src/fuzzy.ts +138 -0
  248. package/vendor/pi-tui/src/index.ts +149 -0
  249. package/vendor/pi-tui/src/keybindings.ts +321 -0
  250. package/vendor/pi-tui/src/keys.ts +1402 -0
  251. package/vendor/pi-tui/src/kill-ring.ts +47 -0
  252. package/vendor/pi-tui/src/latex.ts +1381 -0
  253. package/vendor/pi-tui/src/layout-node.ts +52 -0
  254. package/vendor/pi-tui/src/layout.ts +411 -0
  255. package/vendor/pi-tui/src/native-modifiers.ts +60 -0
  256. package/vendor/pi-tui/src/native-module-path.ts +32 -0
  257. package/vendor/pi-tui/src/stdin-buffer.ts +445 -0
  258. package/vendor/pi-tui/src/terminal-colors.ts +74 -0
  259. package/vendor/pi-tui/src/terminal-image.ts +701 -0
  260. package/vendor/pi-tui/src/terminal.ts +554 -0
  261. package/vendor/pi-tui/src/tui-alt-screen.ts +1379 -0
  262. package/vendor/pi-tui/src/tui-main-screen.ts +655 -0
  263. package/vendor/pi-tui/src/tui.ts +1264 -0
  264. package/vendor/pi-tui/src/undo-stack.ts +29 -0
  265. package/vendor/pi-tui/src/utils.ts +1327 -0
  266. package/vendor/pi-tui/src/word-navigation.ts +118 -0
  267. package/vendor/pi-tui/test/test-themes.ts +39 -0
  268. package/vendor/pi-tui/test/virtual-terminal.ts +219 -0
  269. package/CHANGELOG.md +0 -527
  270. package/bin/rovecode.js +0 -24
  271. package/dist/cli/app-j6gn14w3.js +0 -2
  272. package/dist/cli/ask-user-cwstt8fz.js +0 -2
  273. package/dist/cli/auth-login-9bbp9915.js +0 -2
  274. package/dist/cli/auth-m8p9grty.js +0 -2
  275. package/dist/cli/bench-16zqdms5.js +0 -9
  276. package/dist/cli/catalog-1xchffa4.js +0 -2
  277. package/dist/cli/cli-1n1zb64f.js +0 -2
  278. package/dist/cli/client-2t9gjkck.js +0 -2
  279. package/dist/cli/commands-exafvm2b.js +0 -2
  280. package/dist/cli/connect-6zde0kn3.js +0 -2
  281. package/dist/cli/context-cmd-5t43wgqt.js +0 -2
  282. package/dist/cli/context-report-kt01pw8y.js +0 -2
  283. package/dist/cli/count-remote-ap7x3vh6.js +0 -2
  284. package/dist/cli/design-ne5zszyh.js +0 -2
  285. package/dist/cli/dispatch-2r5myxye.js +0 -2
  286. package/dist/cli/doctor-ws4fh4tn.js +0 -3
  287. package/dist/cli/executor-bdrjn634.js +0 -2
  288. package/dist/cli/export-1mxb9g5p.js +0 -2
  289. package/dist/cli/files-g104xghh.js +0 -2
  290. package/dist/cli/gauntlet-07xrjpj7.js +0 -2
  291. package/dist/cli/gauntlet-runner-xvy64436.js +0 -10
  292. package/dist/cli/gauntlet-wave3-jm91yt5w.js +0 -5
  293. package/dist/cli/gauntlet-wave4-r13py7p1.js +0 -14
  294. package/dist/cli/hashline-znvrat11.js +0 -2
  295. package/dist/cli/http-xafw6fsh.js +0 -143
  296. package/dist/cli/index-1sgjm25y.js +0 -2
  297. package/dist/cli/init-g2m0tn4m.js +0 -51
  298. package/dist/cli/install-avaqjjqq.js +0 -2
  299. package/dist/cli/loop-mmpfft01.js +0 -2
  300. package/dist/cli/main-0904f6ps.js +0 -5
  301. package/dist/cli/main-0ab9fc26.js +0 -9
  302. package/dist/cli/main-0jys2ccn.js +0 -3
  303. package/dist/cli/main-0mtcdbs7.js +0 -3
  304. package/dist/cli/main-0z1w2zsg.js +0 -3
  305. package/dist/cli/main-1dchs7xv.js +0 -18
  306. package/dist/cli/main-1ereejm1.js +0 -3
  307. package/dist/cli/main-1k1kw6b5.js +0 -3
  308. package/dist/cli/main-27y4sm2k.js +0 -38
  309. package/dist/cli/main-2wwjex5j.js +0 -58
  310. package/dist/cli/main-2yeveeve.js +0 -6
  311. package/dist/cli/main-2yfck9b5.js +0 -3
  312. package/dist/cli/main-2zmzgkwh.js +0 -3
  313. package/dist/cli/main-351pz3z7.js +0 -7
  314. package/dist/cli/main-3gjqfh7a.js +0 -6
  315. package/dist/cli/main-3nf3kgve.js +0 -3
  316. package/dist/cli/main-3pjrb2hd.js +0 -3
  317. package/dist/cli/main-3rxcvgna.js +0 -19
  318. package/dist/cli/main-4b3jgy66.js +0 -19
  319. package/dist/cli/main-4wndhjdc.js +0 -7
  320. package/dist/cli/main-4xcmvxnk.js +0 -3
  321. package/dist/cli/main-5tbz0wbz.js +0 -4
  322. package/dist/cli/main-5ywnwthm.js +0 -3
  323. package/dist/cli/main-6b62vkz0.js +0 -14
  324. package/dist/cli/main-6dnk69vp.js +0 -3
  325. package/dist/cli/main-6genrmhs.js +0 -136
  326. package/dist/cli/main-73g7eff4.js +0 -15
  327. package/dist/cli/main-7c5thhjd.js +0 -5
  328. package/dist/cli/main-7rn6bqje.js +0 -3
  329. package/dist/cli/main-80haw7qk.js +0 -4
  330. package/dist/cli/main-875s60s2.js +0 -4
  331. package/dist/cli/main-8kjxbpw4.js +0 -8
  332. package/dist/cli/main-90ds1z4e.js +0 -10
  333. package/dist/cli/main-9etavkew.js +0 -3
  334. package/dist/cli/main-a9njrkk1.js +0 -3
  335. package/dist/cli/main-aecrjq2d.js +0 -12
  336. package/dist/cli/main-ck9asesq.js +0 -9
  337. package/dist/cli/main-cta9racd.js +0 -4
  338. package/dist/cli/main-ddv7j2ag.js +0 -3
  339. package/dist/cli/main-dfreez27.js +0 -10
  340. package/dist/cli/main-f7rw7des.js +0 -3
  341. package/dist/cli/main-ggcn7rd7.js +0 -5
  342. package/dist/cli/main-gzkmycnv.js +0 -3
  343. package/dist/cli/main-hq51jg8v.js +0 -18
  344. package/dist/cli/main-jft389w9.js +0 -8
  345. package/dist/cli/main-k1eqkg83.js +0 -3
  346. package/dist/cli/main-k2y8a2aw.js +0 -9
  347. package/dist/cli/main-kcpbykxz.js +0 -4
  348. package/dist/cli/main-kd488vje.js +0 -22
  349. package/dist/cli/main-kh32yvgk.js +0 -5
  350. package/dist/cli/main-kqxnqjnv.js +0 -25
  351. package/dist/cli/main-kyn0xnsg.js +0 -3
  352. package/dist/cli/main-m1kk6fp5.js +0 -21
  353. package/dist/cli/main-mv40pcr2.js +0 -4
  354. package/dist/cli/main-n0t3973w.js +0 -3
  355. package/dist/cli/main-nqveez48.js +0 -4
  356. package/dist/cli/main-pknhvrmj.js +0 -3
  357. package/dist/cli/main-pn1w7a7j.js +0 -3
  358. package/dist/cli/main-prxxs70n.js +0 -4
  359. package/dist/cli/main-q3vsesf9.js +0 -3
  360. package/dist/cli/main-qsevpgsv.js +0 -3
  361. package/dist/cli/main-rdgdw24b.js +0 -25
  362. package/dist/cli/main-rfth4tbm.js +0 -16
  363. package/dist/cli/main-rg0wn0xf.js +0 -5
  364. package/dist/cli/main-sdmxhtv8.js +0 -4
  365. package/dist/cli/main-skbp13js.js +0 -18
  366. package/dist/cli/main-t4xnd213.js +0 -7
  367. package/dist/cli/main-vqak588n.js +0 -4
  368. package/dist/cli/main-w2n1303f.js +0 -9
  369. package/dist/cli/main-wbrdspr2.js +0 -5
  370. package/dist/cli/main-wsrg79c1.js +0 -7
  371. package/dist/cli/main-x4r0fne4.js +0 -5
  372. package/dist/cli/main-xea2f3tn.js +0 -6
  373. package/dist/cli/main-xg704a3c.js +0 -3
  374. package/dist/cli/main-xvnrabfp.js +0 -16
  375. package/dist/cli/main-xy53xf0r.js +0 -4
  376. package/dist/cli/main-y1fqy60y.js +0 -3
  377. package/dist/cli/main-yn8cd281.js +0 -34
  378. package/dist/cli/main-yr0ksc0h.js +0 -4
  379. package/dist/cli/main-z2ex2vyf.js +0 -4
  380. package/dist/cli/main-z3aayzvq.js +0 -3
  381. package/dist/cli/main-zaqh35jg.js +0 -3
  382. package/dist/cli/main-zc2e8e46.js +0 -4
  383. package/dist/cli/main-zzrfw6cf.js +0 -13
  384. package/dist/cli/main.js +0 -280
  385. package/dist/cli/market-cmd-e14kmx9n.js +0 -5
  386. package/dist/cli/mcp-login-wq7ktdek.js +0 -2
  387. package/dist/cli/mcp-market-cmd-9mg3jecy.js +0 -2
  388. package/dist/cli/notify-b7qc0cjb.js +0 -2
  389. package/dist/cli/oauth-z8whcgfx.js +0 -2
  390. package/dist/cli/output-b3ewj3ps.js +0 -16
  391. package/dist/cli/profiles-6mr5he5e.js +0 -2
  392. package/dist/cli/provider-config-g7j42q8x.js +0 -2
  393. package/dist/cli/provider-jr1y8vvm.js +0 -2
  394. package/dist/cli/registry-s8yk86g0.js +0 -2
  395. package/dist/cli/registry-t6p8d4mn.js +0 -2
  396. package/dist/cli/repl-bajwe1mh.js +0 -11
  397. package/dist/cli/resume-rwn9nz7y.js +0 -2
  398. package/dist/cli/run-flags-nah7ndpt.js +0 -2
  399. package/dist/cli/runtime-n7gafzhb.js +0 -2
  400. package/dist/cli/sandbox-config-emdy18x4.js +0 -2
  401. package/dist/cli/server-b0nvs2bn.js +0 -5
  402. package/dist/cli/session-arg-y75wd4kj.js +0 -2
  403. package/dist/cli/session-j62evmjq.js +0 -2
  404. package/dist/cli/sessions-cmd-tsnwz0ns.js +0 -7
  405. package/dist/cli/settings-df10wfez.js +0 -2
  406. package/dist/cli/setup-jzvv72fg.js +0 -2
  407. package/dist/cli/sextant-smoke-37m81ke6.js +0 -5
  408. package/dist/cli/skills-cmd-gjxnxnhx.js +0 -2
  409. package/dist/cli/smoke-p7748apt.js +0 -8
  410. package/dist/cli/start-chat-s4st3mm0.js +0 -12
  411. package/dist/cli/stream-gmeyewds.js +0 -2
  412. package/dist/cli/task-gh0kkp3n.js +0 -2
  413. package/dist/cli/tasks-z1kfpe8e.js +0 -2
  414. package/dist/cli/thinking-0eqkrz6t.js +0 -2
  415. package/dist/cli/todo-5brcrt9m.js +0 -2
  416. package/dist/cli/tools-7pzm0vj9.js +0 -2
  417. package/dist/cli/tools-s635p6s8.js +0 -2
  418. package/dist/cli/trust-cmd-cjav8zgm.js +0 -2
  419. package/dist/cli/update-check-pt31bm2f.js +0 -2
  420. package/dist/cli/update-cmd-tk131s9t.js +0 -2
  421. package/dist/cli/voice-56nabd8d.js +0 -2
  422. package/dist/cli/webfetch-xd8q596m.js +0 -2
  423. package/dist/cli/websearch-5hkf98k1.js +0 -2
  424. package/dist/cli/workflow-cmd-cy3cvzjp.js +0 -4
  425. package/dist/cli/workspace-q10g5z3e.js +0 -2
  426. package/dist/lib/index.js +0 -62
  427. package/dist/lib/models-index.json +0 -1
  428. package/dist/lib/plugins.js +0 -55
  429. package/dist/lib/providers.js +0 -17
  430. package/dist/lib/public-api.js +0 -20
  431. package/dist/lib/sdk.js +0 -360
  432. /package/{dist/cli → src/providers}/models-index.json +0 -0
@@ -0,0 +1,400 @@
1
+ /**
2
+ * Tool-loop guardrails — ported from hermes-agent `agent/tool_guardrails.py`
3
+ * (snapshot: research/source_snapshots/hermes-agent). Bare `:N`
4
+ * citations refer to that file; `run_agent.py:N` cites the runtime wiring.
5
+ *
6
+ * Pure and injectable: no I/O, no globals, no clock. State is one consecutive
7
+ * identical-call streak plus a per-turn call ordinal — O(1) by construction
8
+ * (upstream scalar fields :353-359, reset per user turn in `reset_for_turn`
9
+ * :340-369). Only sha256 hashes are retained, never result payloads.
10
+ *
11
+ * Ported behavior:
12
+ * - Call signature = tool name + canonical JSON args (sorted keys, compact,
13
+ * unicode raw, `default=str`) — canonical_tool_args :285-295, hashed via
14
+ * ToolCallSignature.from_call :243-246 and _sha256 :849-855. Non-mapping
15
+ * args coerce to {} (:770-771).
16
+ * - Consecutive identical-call escalation, warn before stub: warn once the
17
+ * streak exceeds `warnAfterRepeats` (default 2, :119/:123 — first warn is
18
+ * the 3rd consecutive call, upstream's loop-notice threshold :85, fired
19
+ * :596-599); stub once it exceeds `stubAfterRepeats` (default 5,
20
+ * :120/:124 — before_call blocks :391-427 and the runtime substitutes a
21
+ * synthetic result, run_agent.py:8517-8519, :727-735 = "stub" here).
22
+ * - Duplicate-result dedup: from the 2nd consecutive identical call whose
23
+ * fresh result hashes identical (:608-616, :611), the payload becomes a
24
+ * reference stub (:629-657): min 512 chars (:93, :613), never for failed /
25
+ * error-looking results (:91-92, :612; classifier tail :326-328), args
26
+ * preview capped at 120 chars (:98, :642-643). A changed result flows
27
+ * through whole and resets the streak (:570-571, :585-591).
28
+ * - Poller exemption: repeatable tools (`process`, `*_get_result`, `*_poll`)
29
+ * never receive warn/stub verdicts (:63-80, :101-105) but their duplicate
30
+ * results ARE still dedup-stubbed (:562-567).
31
+ *
32
+ * Deliberate deviations (also listed in the port report):
33
+ * - `hardStop` defaults to true (upstream hard_stop_enabled false, :118):
34
+ * the rovecode GuardVerdict contract requires warn→stub escalation by
35
+ * default. Pass `hardStop: false` for upstream's warn-only default.
36
+ * - Upstream escalates on failed / idempotent-no-progress completions
37
+ * (:443-520); the port escalates on consecutive same-signature repetition
38
+ * (:344-359), forgiven when `checkResult` sees a changed result
39
+ * (progress-resets, :502-503, :585-591).
40
+ * - Hermes failure classifiers (:312-324), per-turn caps (:659-724), and
41
+ * spillover-path stubs (:619-627, :651-657) are out of scope here.
42
+ * - The dedup stub notes the original result length (task requirement;
43
+ * upstream omits it, :646-650) and points at the per-turn call ordinal
44
+ * instead of a tool_call_id (this API has none; upstream likewise omits
45
+ * the pointer when no id exists, :644-645).
46
+ * - Poller exemption reaches THROUGH rovecode's mcp_call indirection: every
47
+ * MCP tool is funneled via the single mcp_call house tool
48
+ * (src/mcp/tools.ts), so upstream's suffix exemption — aimed at
49
+ * "generated / MCP tool surfaces" (:74-76) — checks the INNER args.tool
50
+ * name for mcp_call. Signatures are unaffected (they hash full args).
51
+ *
52
+ * Wiring contract (sequential, as upstream executes tool batches): per tool
53
+ * call run `checkCall` → execute when action !== "stub" → `checkResult` with
54
+ * the RAW output (run_agent.py:8475-8478 — observe the raw result, before any
55
+ * appended guidance). Interleaved/parallel wiring degrades gracefully to
56
+ * fewer detections, never false positives.
57
+ */
58
+
59
+ import { createHash } from "node:crypto";
60
+
61
+ export interface GuardVerdict {
62
+ action: "allow" | "warn" | "stub";
63
+ /** when warn/stub: text to surface to the model instead of/alongside execution */
64
+ note?: string;
65
+ }
66
+
67
+ /** Thresholds mirror upstream defaults; all overridable. */
68
+ export interface GuardrailsOptions {
69
+ /** gate for warn verdicts (upstream warnings_enabled :117; default true) */
70
+ warningsEnabled?: boolean;
71
+ /** gate for stub verdicts (upstream hard_stop_enabled :118 — false there,
72
+ * true here; see module doc "deviations") */
73
+ hardStop?: boolean;
74
+ /** identical consecutive calls tolerated before warns start; default 2
75
+ * (:119/:123) — first warn is the 3rd consecutive call (:85) */
76
+ warnAfterRepeats?: number;
77
+ /** identical consecutive calls tolerated before further ones are stubbed;
78
+ * default 5 (:120/:124) — the 6th consecutive call is the first blocked */
79
+ stubAfterRepeats?: number;
80
+ /** duplicate results shorter than this are never dedup-stubbed; default 512
81
+ * (IDENTICAL_RESULT_STUB_MIN_CHARS :93) */
82
+ dedupMinChars?: number;
83
+ /** canonical-args preview length inside the dedup stub; default 120
84
+ * (_RESULT_STUB_ARGS_PREVIEW_CHARS :98) */
85
+ argsPreviewChars?: number;
86
+ /** poller tools exempt from warn/stub verdicts
87
+ * (STALL_GUARD_REPEATABLE_TOOLS :68-72) */
88
+ repeatableTools?: readonly string[];
89
+ /** poller name suffixes exempt likewise (:77-80) */
90
+ repeatableSuffixes?: readonly string[];
91
+ }
92
+
93
+ /** Upstream defaults (citations above), exported for tests and callers. */
94
+ export const GUARDRAIL_DEFAULTS = {
95
+ warningsEnabled: true,
96
+ hardStop: true,
97
+ warnAfterRepeats: 2,
98
+ stubAfterRepeats: 5,
99
+ dedupMinChars: 512,
100
+ argsPreviewChars: 120,
101
+ repeatableTools: ["process"],
102
+ repeatableSuffixes: ["_get_result", "_poll"],
103
+ } as const satisfies Required<GuardrailsOptions>;
104
+
105
+ interface ResolvedOptions {
106
+ warningsEnabled: boolean;
107
+ hardStop: boolean;
108
+ warnAfterRepeats: number;
109
+ stubAfterRepeats: number;
110
+ dedupMinChars: number;
111
+ argsPreviewChars: number;
112
+ repeatableTools: ReadonlySet<string>;
113
+ repeatableSuffixes: readonly string[];
114
+ }
115
+
116
+ /** The single consecutive identical-call streak (upstream fields :353-359). */
117
+ interface Streak {
118
+ sig: string;
119
+ /** consecutive identical-signature calls, current call included */
120
+ count: number;
121
+ /** hash of the streak's last observed result; null until one is seen */
122
+ resultHash: string | null;
123
+ /** 1-based per-turn ordinal of the streak's first call — the dedup stub
124
+ * pointer (_identical_streak_first_call_id :357-359) */
125
+ firstCallIndex: number;
126
+ /** ordinal of the most recent call — becomes the new first when a changed
127
+ * result starts a fresh streak (:589-591) */
128
+ lastCallIndex: number;
129
+ }
130
+
131
+ /** Sorted-key compact JSON — ports canonical_tool_args (:285-295): sort_keys,
132
+ * separators (",",":"), unicode kept raw, default=str for non-JSON values.
133
+ * Key sort is UTF-16 code-unit order (deterministic; differs from Python's
134
+ * code-point sort only for astral-plane keys). Cycles degrade to a marker
135
+ * instead of throwing: a guardrail must never take down the loop. */
136
+ export function canonicalJson(value: unknown, seen: Set<object> = new Set()): string {
137
+ if (value === null) return "null";
138
+ switch (typeof value) {
139
+ case "boolean":
140
+ return value ? "true" : "false";
141
+ case "number":
142
+ // Python json emits NaN/Infinity literally (allow_nan default) — match it
143
+ return Number.isFinite(value) ? JSON.stringify(value) : String(value);
144
+ case "string":
145
+ return JSON.stringify(value);
146
+ case "object":
147
+ break;
148
+ default:
149
+ // default=str (:294): undefined / bigint / function / symbol → quoted str()
150
+ return JSON.stringify(String(value));
151
+ }
152
+ const obj = value as object;
153
+ if (seen.has(obj)) return '"[circular]"';
154
+ seen.add(obj);
155
+ try {
156
+ if (Array.isArray(obj)) {
157
+ return `[${obj.map((v) => canonicalJson(v, seen)).join(",")}]`;
158
+ }
159
+ const record = obj as Record<string, unknown>;
160
+ const parts = Object.keys(record)
161
+ .sort()
162
+ .map((k) => `${JSON.stringify(k)}:${canonicalJson(record[k], seen)}`);
163
+ return `{${parts.join(",")}}`;
164
+ } finally {
165
+ seen.delete(obj); // DAG-safe: only true cycles hit the marker
166
+ }
167
+ }
168
+
169
+ /** Non-mapping args (arrays included) coerce to {} — ports _coerce_args (:770-771). */
170
+ function coerceArgs(args: unknown): Record<string, unknown> {
171
+ if (typeof args === "object" && args !== null && !Array.isArray(args)) {
172
+ return args as Record<string, unknown>;
173
+ }
174
+ return {};
175
+ }
176
+
177
+ /** Deterministic content hash. Upstream hashes utf-8 with surrogatepass
178
+ * (:849-855); hashing UTF-16LE code units is likewise lossless for lone
179
+ * surrogates (utf-8 would collapse them to U+FFFD) and never throws. */
180
+ function sha256(text: string): string {
181
+ return createHash("sha256").update(Buffer.from(text, "utf16le")).digest("hex");
182
+ }
183
+
184
+ /** Signature = tool name + hash of canonical args (ToolCallSignature.from_call
185
+ * :243-246). Same tool + same canonical args ⇒ same signature; different
186
+ * args ⇒ different signature ⇒ never a loop. */
187
+ function signatureOf(tool: string, args: unknown): string {
188
+ return `${tool}\u0000${sha256(canonicalJson(coerceArgs(args)))}`;
189
+ }
190
+
191
+ /** Poller-exemption name: rovecode routes all MCP tools through the one `mcp_call`
192
+ * house tool, so upstream's MCP-surface poller suffixes (:74-80) can never
193
+ * match the outer name — unwrap to inner args.tool (module doc "deviations").
194
+ * Exemption only; signatures stay outer name + full args. */
195
+ function exemptionName(tool: string, args: unknown): string {
196
+ if (tool === "mcp_call") {
197
+ const inner = coerceArgs(args)["tool"];
198
+ if (typeof inner === "string" && inner.length > 0) return inner;
199
+ }
200
+ return tool;
201
+ }
202
+
203
+ /** Ports _result_hash (:774-789): JSON results are canonicalized before
204
+ * hashing; non-JSON hashes raw. Upstream's safe_json_loads yields None for
205
+ * invalid JSON and literal null alike, so parsed null also hashes raw. */
206
+ function resultHash(output: string): string {
207
+ let canonical = output;
208
+ try {
209
+ const parsed: unknown = JSON.parse(output);
210
+ if (parsed !== null) canonical = canonicalJson(parsed);
211
+ } catch {
212
+ // not JSON → hash the raw string (:787-788)
213
+ }
214
+ return sha256(canonical);
215
+ }
216
+
217
+ /** Generic error sniff, ported from classify_tool_failure's fallback tail
218
+ * (:326-328); errors are never dedup-stubbed (:91-92, :612). Hermes-specific
219
+ * branches (:312-324) are not ported. */
220
+ function looksFailed(output: string): boolean {
221
+ if (output.startsWith("Error")) return true;
222
+ const head = output.slice(0, 500).toLowerCase();
223
+ return head.includes('"error"') || head.includes('"failed"');
224
+ }
225
+
226
+ /** English ordinal ("3rd", "11th") — ports the notice's inline ordinal (:600). */
227
+ function ordinal(n: number): string {
228
+ const mod100 = n % 100;
229
+ if (mod100 >= 11 && mod100 <= 13) return `${n}th`;
230
+ switch (n % 10) {
231
+ case 1: return `${n}st`;
232
+ case 2: return `${n}nd`;
233
+ case 3: return `${n}rd`;
234
+ default: return `${n}th`;
235
+ }
236
+ }
237
+
238
+ /** Junk / non-positive threshold values fall back to the default — ports
239
+ * _positive_int (:808-815), including float truncation via int(). */
240
+ function positiveInt(value: number | undefined, fallback: number): number {
241
+ if (value === undefined || !Number.isFinite(value)) return fallback;
242
+ const parsed = Math.trunc(value);
243
+ return parsed >= 1 ? parsed : fallback;
244
+ }
245
+
246
+ export class ToolGuard {
247
+ private readonly opts: ResolvedOptions;
248
+ private streak: Streak | null = null;
249
+ private callIndex = 0;
250
+
251
+ constructor(opts?: GuardrailsOptions) {
252
+ const d = GUARDRAIL_DEFAULTS;
253
+ this.opts = {
254
+ warningsEnabled: typeof opts?.warningsEnabled === "boolean" ? opts.warningsEnabled : d.warningsEnabled,
255
+ hardStop: typeof opts?.hardStop === "boolean" ? opts.hardStop : d.hardStop,
256
+ warnAfterRepeats: positiveInt(opts?.warnAfterRepeats, d.warnAfterRepeats),
257
+ stubAfterRepeats: positiveInt(opts?.stubAfterRepeats, d.stubAfterRepeats),
258
+ dedupMinChars: positiveInt(opts?.dedupMinChars, d.dedupMinChars),
259
+ argsPreviewChars: positiveInt(opts?.argsPreviewChars, d.argsPreviewChars),
260
+ repeatableTools: new Set(opts?.repeatableTools ?? d.repeatableTools),
261
+ repeatableSuffixes: [...(opts?.repeatableSuffixes ?? d.repeatableSuffixes)],
262
+ };
263
+ }
264
+
265
+ /** Count of signature records retained. Typed `number` (not `0 | 1`) so
266
+ * tests of the O(1) bound are not type-system tautologies; the
267
+ * single-streak design (:353-359) keeps it ≤ 1. */
268
+ get trackedSignatures(): number {
269
+ return this.streak ? 1 : 0;
270
+ }
271
+
272
+ /** Before execution: same-signature repetition tracking (tool + canonical
273
+ * args). Any different call resets the streak (:344-351); pollers are
274
+ * never annotated (:63-72). Escalation: allow → warn (> warnAfterRepeats)
275
+ * → stub (> stubAfterRepeats), upstream's warn-before-block order. */
276
+ checkCall(tool: string, args: unknown): GuardVerdict {
277
+ this.callIndex += 1;
278
+ const sig = signatureOf(tool, args);
279
+ if (this.streak !== null && this.streak.sig === sig) {
280
+ this.streak.count += 1;
281
+ this.streak.lastCallIndex = this.callIndex;
282
+ } else {
283
+ this.streak = {
284
+ sig,
285
+ count: 1,
286
+ resultHash: null,
287
+ firstCallIndex: this.callIndex,
288
+ lastCallIndex: this.callIndex,
289
+ };
290
+ }
291
+ if (this.isRepeatable(exemptionName(tool, args))) return { action: "allow" };
292
+ const count = this.streak.count;
293
+ if (this.opts.hardStop && count > this.opts.stubAfterRepeats) {
294
+ // block message modeled on before_call's (:396-399, :416-419); surfaced
295
+ // as a synthetic result upstream (run_agent.py:8517-8519, :727-735)
296
+ return {
297
+ action: "stub",
298
+ note:
299
+ `[rovecode loop guard: blocked ${tool} — this is the ${ordinal(count)} consecutive call ` +
300
+ `with identical arguments. Stop repeating it unchanged; change arguments or strategy, ` +
301
+ `use a different tool, or proceed with what you already have.]`,
302
+ };
303
+ }
304
+ if (this.opts.warningsEnabled && count > this.opts.warnAfterRepeats) {
305
+ // warn text modeled on the identical-call loop notice (:600-606)
306
+ return {
307
+ action: "warn",
308
+ note:
309
+ `[rovecode loop guard: this is the ${ordinal(count)} consecutive call to ${tool} ` +
310
+ `with identical arguments. This looks like a loop — change arguments, use a ` +
311
+ `different tool, or proceed with what you have.]`,
312
+ };
313
+ }
314
+ return { action: "allow" };
315
+ }
316
+
317
+ /** After execution: byte-identical duplicate result detection (:608-616);
318
+ * from the 2nd consecutive identical call the payload becomes a reference
319
+ * stub; a changed result passes whole and resets the streak (:570-571,
320
+ * :585-591). Call with the RAW output (run_agent.py:8475-8478). `ok` is
321
+ * the caller's structured success flag: FAILED results (ok=false) are
322
+ * NEVER stubbed — upstream keeps every error verbatim (:91-92, :612) —
323
+ * the string sniff is only a fallback when `ok` is not given. */
324
+ checkResult(tool: string, args: unknown, output: string, ok?: boolean): { output: string; deduped: boolean } {
325
+ const sig = signatureOf(tool, args);
326
+ const hash = resultHash(output);
327
+ if (this.streak === null || this.streak.sig !== sig) {
328
+ // Result for a call this guard did not see via checkCall (out-of-order
329
+ // wiring) — adopt it as a fresh streak baseline; detection degrades
330
+ // gracefully, never false-positives.
331
+ const idx = Math.max(1, this.callIndex);
332
+ this.streak = { sig, count: 1, resultHash: hash, firstCallIndex: idx, lastCallIndex: idx };
333
+ return { output, deduped: false };
334
+ }
335
+ const s = this.streak;
336
+ if (s.resultHash === null) {
337
+ s.resultHash = hash; // first result of the streak = baseline
338
+ return { output, deduped: false };
339
+ }
340
+ if (s.resultHash !== hash) {
341
+ // Changed result = progress: the current call starts a new streak
342
+ // (:585-591) — this also forgives checkCall's warn/stub escalation,
343
+ // mirroring upstream's reset-on-changed-hash (:502-503).
344
+ s.count = 1;
345
+ s.resultHash = hash;
346
+ s.firstCallIndex = s.lastCallIndex;
347
+ return { output, deduped: false };
348
+ }
349
+ // Identical result (byte-identical; canonically identical for JSON, :774-789).
350
+ if (
351
+ s.count < 2 || // stub only from the 2nd identical call (:611)
352
+ output.length < this.opts.dedupMinChars || // (:93, :613)
353
+ ok === false || // structured failure: errors always pass verbatim (:91-92, :612)
354
+ looksFailed(output) // string-sniff fallback when the caller gave no ok flag
355
+ ) {
356
+ return { output, deduped: false };
357
+ }
358
+ return { output: this.buildDedupStub(tool, args, output.length, s.firstCallIndex), deduped: true };
359
+ }
360
+
361
+ /** USER-turn boundary — call once per agentLoop invocation (and per queued
362
+ * follow-up), NEVER per model iteration inside the loop: upstream
363
+ * reset_for_turn runs at the start of each run_conversation
364
+ * (turn_context.py:700), once per user message; the streak must survive
365
+ * model iterations or the guard is inert (:338, :340-369). */
366
+ onTurn(): void {
367
+ this.reset();
368
+ }
369
+
370
+ /** Full reset — same as onTurn (all upstream state is per-user-turn). */
371
+ reset(): void {
372
+ this.streak = null;
373
+ this.callIndex = 0;
374
+ }
375
+
376
+ /** Ports is_stall_guard_repeatable (:101-105): allowlisted background-job
377
+ * pollers (:68-72) plus vendor poller suffixes (:77-80). Exempt from
378
+ * warn/stub verdicts; NOT exempt from result dedup (:562-567). */
379
+ private isRepeatable(tool: string): boolean {
380
+ if (this.opts.repeatableTools.has(tool)) return true;
381
+ return this.opts.repeatableSuffixes.some((suffix) => tool.endsWith(suffix));
382
+ }
383
+
384
+ /** Ports _build_result_reference_stub (:629-657): tool name + pointer to the
385
+ * first occurrence + canonical-args preview so the model still knows WHAT
386
+ * the call was if compression later evicts the referenced result (:96-98).
387
+ * Deviations: per-turn call ordinal instead of tool_call_id (:644-645) and
388
+ * the original length is noted (task requirement; upstream omits it). */
389
+ private buildDedupStub(tool: string, args: unknown, originalLen: number, firstCallIndex: number): string {
390
+ let preview = canonicalJson(coerceArgs(args));
391
+ if (preview.length > this.opts.argsPreviewChars) {
392
+ preview = preview.slice(0, this.opts.argsPreviewChars) + "…"; // (:642-643)
393
+ }
394
+ return (
395
+ `[rovecode note: this result is byte-identical to the ${tool} result of call ` +
396
+ `#${firstCallIndex} earlier this turn (original ${originalLen} chars). ` +
397
+ `Refer to that result; it has not changed. Args: ${preview}]`
398
+ );
399
+ }
400
+ }