rovecode 0.3.3 → 0.4.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. package/CHANGELOG.md +512 -0
  2. package/README.md +33 -48
  3. package/bin/rovecode.js +24 -0
  4. package/dist/cli/app-dybnr56b.js +2 -0
  5. package/dist/cli/ask-user-p8hq4xgj.js +2 -0
  6. package/dist/cli/auth-login-ewpgw5sm.js +2 -0
  7. package/dist/cli/auth-m8p9grty.js +2 -0
  8. package/dist/cli/bench-xv3ypwev.js +9 -0
  9. package/dist/cli/catalog-737wb2s0.js +2 -0
  10. package/dist/cli/cli-arhg40m0.js +2 -0
  11. package/dist/cli/client-cf2pxx8q.js +2 -0
  12. package/dist/cli/commands-3p7e4xxs.js +2 -0
  13. package/dist/cli/connect-3q93d7cb.js +2 -0
  14. package/dist/cli/context-cmd-eqxmxhzq.js +2 -0
  15. package/dist/cli/context-report-hbw9zfes.js +2 -0
  16. package/dist/cli/count-remote-mby98cd0.js +2 -0
  17. package/dist/cli/design-122y0axd.js +2 -0
  18. package/dist/cli/dispatch-b4egzvvh.js +2 -0
  19. package/dist/cli/doctor-x4jkv72e.js +3 -0
  20. package/dist/cli/executor-ftvg6tsy.js +2 -0
  21. package/dist/cli/export-pdgdhkch.js +2 -0
  22. package/dist/cli/files-cez9a96p.js +2 -0
  23. package/dist/cli/gauntlet-r3xxaszc.js +2 -0
  24. package/dist/cli/gauntlet-runner-r515m7kk.js +10 -0
  25. package/dist/cli/gauntlet-wave3-bnkjk2v2.js +5 -0
  26. package/dist/cli/gauntlet-wave4-acs9s60q.js +14 -0
  27. package/dist/cli/hashline-ewg5hbe3.js +2 -0
  28. package/dist/cli/http-n0kehsk8.js +5 -0
  29. package/dist/cli/index-z5qt1s76.js +2 -0
  30. package/dist/cli/install-80mp63kx.js +2 -0
  31. package/dist/cli/loop-12twjcat.js +2 -0
  32. package/dist/cli/main-01pv9206.js +4 -0
  33. package/dist/cli/main-0jys2ccn.js +3 -0
  34. package/dist/cli/main-1ztz6fkj.js +10 -0
  35. package/dist/cli/main-23q7cmww.js +9 -0
  36. package/dist/cli/main-2rzbexn2.js +3 -0
  37. package/dist/cli/main-2wyax8k9.js +9 -0
  38. package/dist/cli/main-2yeveeve.js +6 -0
  39. package/dist/cli/main-2z3dek0b.js +3 -0
  40. package/dist/cli/main-2zgsknth.js +3 -0
  41. package/dist/cli/main-45ejth3a.js +4 -0
  42. package/dist/cli/main-45rn3trk.js +22 -0
  43. package/dist/cli/main-4p4e2w7x.js +4 -0
  44. package/dist/cli/main-4y0tnfpa.js +16 -0
  45. package/dist/cli/main-5py0rkmc.js +4 -0
  46. package/dist/cli/main-6dtqmbt6.js +7 -0
  47. package/dist/cli/main-6h9x282m.js +4 -0
  48. package/dist/cli/main-6vjeds42.js +3 -0
  49. package/dist/cli/main-78gq4bt9.js +6 -0
  50. package/dist/cli/main-7jd5vh3x.js +4 -0
  51. package/dist/cli/main-7kt6r53y.js +4 -0
  52. package/dist/cli/main-8c1tbazx.js +58 -0
  53. package/dist/cli/main-9a9rnh47.js +19 -0
  54. package/dist/cli/main-9ht36z12.js +3 -0
  55. package/dist/cli/main-a2yfvcy9.js +7 -0
  56. package/dist/cli/main-a3f51n0x.js +5 -0
  57. package/dist/cli/main-b8zq261k.js +3 -0
  58. package/dist/cli/main-bxtvnf6d.js +13 -0
  59. package/dist/cli/main-edxc3yzt.js +4 -0
  60. package/dist/cli/main-evgz4mp5.js +21 -0
  61. package/dist/cli/main-f33fc5je.js +9 -0
  62. package/dist/cli/main-fvnpq46y.js +12 -0
  63. package/dist/cli/main-gbbty4d4.js +3 -0
  64. package/dist/cli/main-gth53dnt.js +25 -0
  65. package/dist/cli/main-hqbz10aw.js +9 -0
  66. package/dist/cli/main-hrrvcfan.js +38 -0
  67. package/dist/cli/main-hzwtsb2m.js +5 -0
  68. package/dist/cli/main-j7ttv0sd.js +34 -0
  69. package/dist/cli/main-jak598k9.js +5 -0
  70. package/dist/cli/main-kba6zeyd.js +6 -0
  71. package/dist/cli/main-kwwsz6rq.js +3 -0
  72. package/dist/cli/main-m8vm17zq.js +3 -0
  73. package/dist/cli/main-mg4f96e1.js +3 -0
  74. package/dist/cli/main-mg9b20ac.js +18 -0
  75. package/dist/cli/main-mgb9ccnx.js +3 -0
  76. package/dist/cli/main-mjt2p7aj.js +3 -0
  77. package/dist/cli/main-n6qrdbmy.js +3 -0
  78. package/dist/cli/main-na7wse0x.js +5 -0
  79. package/dist/cli/main-nqveez48.js +4 -0
  80. package/dist/cli/main-ntqef02r.js +10 -0
  81. package/dist/cli/main-nvc3yjay.js +136 -0
  82. package/dist/cli/main-p0cfn6nr.js +16 -0
  83. package/dist/cli/main-qj2djy17.js +19 -0
  84. package/dist/cli/main-qsevpgsv.js +3 -0
  85. package/dist/cli/main-qvarybsp.js +3 -0
  86. package/dist/cli/main-rebtt91r.js +5 -0
  87. package/dist/cli/main-rpg7h8mb.js +3 -0
  88. package/dist/cli/main-rsy72qmw.js +15 -0
  89. package/dist/cli/main-rvetps99.js +18 -0
  90. package/dist/cli/main-s4bb0jav.js +3 -0
  91. package/dist/cli/main-s9v8k74e.js +3 -0
  92. package/dist/cli/main-tjvwmscs.js +3 -0
  93. package/dist/cli/main-tkgarpjj.js +4 -0
  94. package/dist/cli/main-v8y60bb2.js +3 -0
  95. package/dist/cli/main-vhrrq337.js +3 -0
  96. package/dist/cli/main-vp2dfb7s.js +4 -0
  97. package/dist/cli/main-vqbr22sz.js +8 -0
  98. package/dist/cli/main-vxnwe5xx.js +18 -0
  99. package/dist/cli/main-wgph00xf.js +5 -0
  100. package/dist/cli/main-wk2csfnj.js +5 -0
  101. package/dist/cli/main-wm997zjx.js +3 -0
  102. package/dist/cli/main-wpkyraxh.js +3 -0
  103. package/dist/cli/main-wqt32p5x.js +4 -0
  104. package/dist/cli/main-x9ct6y1a.js +3 -0
  105. package/dist/cli/main-xfekqh9m.js +7 -0
  106. package/dist/cli/main-xt9zc3n6.js +7 -0
  107. package/dist/cli/main-xx2z3zh5.js +4 -0
  108. package/dist/cli/main-y5c82rxr.js +3 -0
  109. package/dist/cli/main-yrjt2sqt.js +14 -0
  110. package/dist/cli/main-ys6zj3yr.js +3 -0
  111. package/dist/cli/main-ywbxshqc.js +8 -0
  112. package/dist/cli/main-z13755t8.js +25 -0
  113. package/dist/cli/main-zc7pyrbj.js +4 -0
  114. package/dist/cli/main.js +279 -0
  115. package/dist/cli/market-cmd-bm5xvn9f.js +5 -0
  116. package/dist/cli/mcp-login-bthtfpt7.js +2 -0
  117. package/dist/cli/mcp-market-cmd-mbeshfyd.js +2 -0
  118. package/dist/cli/notify-54v5z9dz.js +2 -0
  119. package/dist/cli/oauth-g5gme95c.js +2 -0
  120. package/dist/cli/output-satndjap.js +16 -0
  121. package/dist/cli/profiles-sfhpbq3m.js +2 -0
  122. package/dist/cli/provider-config-hv3xtdt4.js +2 -0
  123. package/dist/cli/provider-kwzq6g84.js +2 -0
  124. package/dist/cli/registry-fh0hdnyn.js +2 -0
  125. package/dist/cli/registry-y1y8e94r.js +2 -0
  126. package/dist/cli/repl-t4z03mqq.js +11 -0
  127. package/dist/cli/resume-fqt4chg8.js +2 -0
  128. package/dist/cli/run-flags-rysbag9t.js +2 -0
  129. package/dist/cli/runtime-j19fjbsa.js +2 -0
  130. package/dist/cli/sandbox-config-g4qxd7y5.js +2 -0
  131. package/dist/cli/server-r0b6bksk.js +5 -0
  132. package/dist/cli/session-arg-txmn5g4x.js +2 -0
  133. package/dist/cli/session-ed250d9j.js +2 -0
  134. package/dist/cli/sessions-cmd-adw7svfn.js +7 -0
  135. package/dist/cli/settings-y9rzcqx8.js +2 -0
  136. package/dist/cli/setup-jmbr11j0.js +2 -0
  137. package/dist/cli/sextant-smoke-tcth0vea.js +5 -0
  138. package/dist/cli/skills-cmd-zbdy99v6.js +2 -0
  139. package/dist/cli/smoke-1bg937kx.js +8 -0
  140. package/dist/cli/start-chat-p01cdks3.js +12 -0
  141. package/dist/cli/stream-4wmyaypz.js +2 -0
  142. package/dist/cli/task-eg4s093s.js +2 -0
  143. package/dist/cli/tasks-12v9rr9k.js +2 -0
  144. package/dist/cli/thinking-a5ngvqyh.js +2 -0
  145. package/dist/cli/todo-1wxpcecx.js +2 -0
  146. package/dist/cli/tools-2ftsya7w.js +2 -0
  147. package/dist/cli/tools-x1tj4fxm.js +2 -0
  148. package/dist/cli/trust-cmd-hccxehzb.js +2 -0
  149. package/dist/cli/update-check-ygt3vd7m.js +2 -0
  150. package/dist/cli/update-cmd-v23qhr8c.js +2 -0
  151. package/dist/cli/voice-g1gtck92.js +2 -0
  152. package/dist/cli/webfetch-0nnrjgb5.js +2 -0
  153. package/dist/cli/websearch-f0vr2p7d.js +2 -0
  154. package/dist/cli/workspace-9rq1w4ta.js +2 -0
  155. package/dist/lib/index.js +62 -0
  156. package/dist/lib/models-index.json +1 -0
  157. package/dist/lib/plugins.js +6 -0
  158. package/dist/lib/providers.js +17 -0
  159. package/dist/lib/public-api.js +20 -0
  160. package/dist/rovecode.exe +4 -0
  161. package/package.json +83 -72
  162. package/bin/rovecode.ts +0 -21
  163. package/src/acp/server.ts +0 -374
  164. package/src/cli/auth-login.ts +0 -122
  165. package/src/cli/connect.ts +0 -244
  166. package/src/cli/context-cmd.ts +0 -199
  167. package/src/cli/dispatch.ts +0 -82
  168. package/src/cli/doctor.ts +0 -362
  169. package/src/cli/export.ts +0 -276
  170. package/src/cli/help.ts +0 -293
  171. package/src/cli/is-tui-invocation.ts +0 -8
  172. package/src/cli/main.ts +0 -583
  173. package/src/cli/market-cmd.ts +0 -658
  174. package/src/cli/mcp-login.ts +0 -141
  175. package/src/cli/mcp-market-cmd.ts +0 -302
  176. package/src/cli/output.ts +0 -382
  177. package/src/cli/repl.ts +0 -250
  178. package/src/cli/repomap-root.ts +0 -14
  179. package/src/cli/resume.ts +0 -57
  180. package/src/cli/run-flags.ts +0 -43
  181. package/src/cli/run-limits.ts +0 -78
  182. package/src/cli/runtime.ts +0 -931
  183. package/src/cli/session-arg.ts +0 -30
  184. package/src/cli/sessions-cmd.ts +0 -145
  185. package/src/cli/setup.ts +0 -153
  186. package/src/cli/skills-cmd.ts +0 -194
  187. package/src/cli/start-chat.ts +0 -65
  188. package/src/cli/trust-cmd.ts +0 -52
  189. package/src/coding/bash.ts +0 -148
  190. package/src/coding/checkpoints.ts +0 -327
  191. package/src/coding/diff.ts +0 -138
  192. package/src/coding/files.ts +0 -341
  193. package/src/coding/hashline.ts +0 -274
  194. package/src/coding/lsp-gate.ts +0 -254
  195. package/src/coding/lsp-servers.ts +0 -147
  196. package/src/coding/lsp.ts +0 -283
  197. package/src/coding/repomap-cache.ts +0 -99
  198. package/src/coding/repomap-files.ts +0 -192
  199. package/src/coding/repomap.ts +0 -481
  200. package/src/core/agents.ts +0 -255
  201. package/src/core/compaction.ts +0 -259
  202. package/src/core/config.ts +0 -289
  203. package/src/core/context-report.ts +0 -228
  204. package/src/core/context.ts +0 -60
  205. package/src/core/count-remote.ts +0 -107
  206. package/src/core/execpolicy-rules.ts +0 -196
  207. package/src/core/execpolicy.ts +0 -385
  208. package/src/core/executor.ts +0 -454
  209. package/src/core/guardrails.ts +0 -400
  210. package/src/core/hooks.ts +0 -411
  211. package/src/core/images.ts +0 -230
  212. package/src/core/intro.ts +0 -266
  213. package/src/core/loop.ts +0 -567
  214. package/src/core/modes.ts +0 -372
  215. package/src/core/orchestrator.ts +0 -245
  216. package/src/core/proc-group.ts +0 -48
  217. package/src/core/project-trust.ts +0 -98
  218. package/src/core/reflection.ts +0 -165
  219. package/src/core/sandbox-config.ts +0 -186
  220. package/src/core/session-id.ts +0 -24
  221. package/src/core/session-images.ts +0 -73
  222. package/src/core/session-ops.ts +0 -183
  223. package/src/core/session-text.ts +0 -29
  224. package/src/core/session.ts +0 -469
  225. package/src/core/settings.ts +0 -170
  226. package/src/core/tasks.ts +0 -646
  227. package/src/core/token-scale.ts +0 -108
  228. package/src/core/tools.ts +0 -309
  229. package/src/core/trust.ts +0 -104
  230. package/src/core/types.ts +0 -330
  231. package/src/core/update-check.ts +0 -171
  232. package/src/core/usage.ts +0 -204
  233. package/src/core/validate.ts +0 -121
  234. package/src/core/verify-gate.ts +0 -159
  235. package/src/core/verify.ts +0 -236
  236. package/src/core/voice.ts +0 -158
  237. package/src/core/win-job.ts +0 -183
  238. package/src/core/workspace.ts +0 -184
  239. package/src/design/audit.ts +0 -797
  240. package/src/design/direction.ts +0 -190
  241. package/src/design/rules.ts +0 -157
  242. package/src/eval/bench.ts +0 -150
  243. package/src/eval/gauntlet-runner.ts +0 -215
  244. package/src/eval/gauntlet-support.ts +0 -84
  245. package/src/eval/gauntlet-wave3.ts +0 -269
  246. package/src/eval/gauntlet-wave4.ts +0 -217
  247. package/src/eval/gauntlet.ts +0 -253
  248. package/src/index.ts +0 -17
  249. package/src/lanes/agy.ts +0 -95
  250. package/src/lanes/approval.ts +0 -24
  251. package/src/lanes/claude.ts +0 -129
  252. package/src/lanes/codex.ts +0 -127
  253. package/src/lanes/events.ts +0 -130
  254. package/src/lanes/job.ts +0 -142
  255. package/src/lanes/opencode.ts +0 -122
  256. package/src/lanes/process.ts +0 -184
  257. package/src/lanes/progress.ts +0 -183
  258. package/src/lanes/registry.ts +0 -178
  259. package/src/lanes/runner.ts +0 -124
  260. package/src/lanes/types.ts +0 -112
  261. package/src/market/catalogs/mcp-docs.json +0 -111
  262. package/src/market/catalogs/plugins.json +0 -111
  263. package/src/market/catalogs/skills.json +0 -478
  264. package/src/market/clone.ts +0 -72
  265. package/src/market/context-cost.ts +0 -121
  266. package/src/market/digest.ts +0 -106
  267. package/src/market/index.ts +0 -22
  268. package/src/market/install.ts +0 -578
  269. package/src/market/manifest.ts +0 -187
  270. package/src/market/prereq.ts +0 -145
  271. package/src/market/registry.ts +0 -363
  272. package/src/market/resolve.ts +0 -111
  273. package/src/market/types.ts +0 -236
  274. package/src/market/validate.ts +0 -227
  275. package/src/mcp/client.ts +0 -449
  276. package/src/mcp/config.ts +0 -252
  277. package/src/mcp/local-package.ts +0 -211
  278. package/src/mcp/market-catalog.ts +0 -84
  279. package/src/mcp/market-install.ts +0 -289
  280. package/src/mcp/market.ts +0 -362
  281. package/src/mcp/oauth.ts +0 -251
  282. package/src/mcp/prompts-resources.ts +0 -249
  283. package/src/mcp/shared.ts +0 -149
  284. package/src/mcp/status.ts +0 -67
  285. package/src/mcp/tools.ts +0 -275
  286. package/src/mcp/transport.ts +0 -122
  287. package/src/mcp/trust.ts +0 -25
  288. package/src/memory/blocks.ts +0 -278
  289. package/src/memory/recall.ts +0 -355
  290. package/src/memory/scope.ts +0 -182
  291. package/src/memory/store.ts +0 -105
  292. package/src/memory/tools.ts +0 -99
  293. package/src/plugins/cli.ts +0 -119
  294. package/src/plugins/discover.ts +0 -108
  295. package/src/plugins/index.ts +0 -50
  296. package/src/plugins/install.ts +0 -184
  297. package/src/plugins/load.ts +0 -124
  298. package/src/plugins/manifest.ts +0 -92
  299. package/src/plugins/state.ts +0 -83
  300. package/src/providers/auth.ts +0 -408
  301. package/src/providers/cache.ts +0 -223
  302. package/src/providers/catalog-local.ts +0 -160
  303. package/src/providers/catalog.ts +0 -421
  304. package/src/providers/middleware-context.ts +0 -86
  305. package/src/providers/middleware.ts +0 -373
  306. package/src/providers/model-list.ts +0 -23
  307. package/src/providers/oauth/common.ts +0 -105
  308. package/src/providers/oauth/device-code.ts +0 -107
  309. package/src/providers/oauth/github-copilot.ts +0 -146
  310. package/src/providers/oauth/loopback.ts +0 -158
  311. package/src/providers/oauth/openai.ts +0 -163
  312. package/src/providers/oauth/openrouter.ts +0 -89
  313. package/src/providers/oauth/pkce.ts +0 -45
  314. package/src/providers/oauth/registry.ts +0 -39
  315. package/src/providers/oauth/seam.ts +0 -89
  316. package/src/providers/profile-glm53.ts +0 -111
  317. package/src/providers/profile-sonnet5-persona.ts +0 -65
  318. package/src/providers/profile-sonnet5-voice.ts +0 -23
  319. package/src/providers/profiles.ts +0 -156
  320. package/src/providers/provider-config.ts +0 -311
  321. package/src/providers/registry.ts +0 -333
  322. package/src/providers/responses.ts +0 -209
  323. package/src/providers/retry.ts +0 -234
  324. package/src/providers/router.ts +0 -294
  325. package/src/providers/sse.ts +0 -26
  326. package/src/providers/stream-errors.ts +0 -117
  327. package/src/providers/stream.ts +0 -566
  328. package/src/providers/thinking.ts +0 -189
  329. package/src/providers/wire-messages.ts +0 -129
  330. package/src/providers/wire-responses.ts +0 -79
  331. package/src/providers/wire-select.ts +0 -53
  332. package/src/server/http.ts +0 -291
  333. package/src/server/openapi.ts +0 -246
  334. package/src/sextant/card-hits.ts +0 -102
  335. package/src/sextant/card-keys.ts +0 -55
  336. package/src/sextant/context-source.ts +0 -157
  337. package/src/sextant/crew-cards.ts +0 -350
  338. package/src/sextant/draw-agents.ts +0 -273
  339. package/src/sextant/draw-code.ts +0 -388
  340. package/src/sextant/draw-context.ts +0 -222
  341. package/src/sextant/draw-frame.ts +0 -164
  342. package/src/sextant/draw-market.ts +0 -573
  343. package/src/sextant/draw-messages.ts +0 -386
  344. package/src/sextant/draw-pet.ts +0 -230
  345. package/src/sextant/draw-plan.ts +0 -187
  346. package/src/sextant/draw-tabs.ts +0 -85
  347. package/src/sextant/draw-util.ts +0 -65
  348. package/src/sextant/draw-wizard.ts +0 -378
  349. package/src/sextant/engine.ts +0 -230
  350. package/src/sextant/frame-hits.ts +0 -25
  351. package/src/sextant/frame.ts +0 -101
  352. package/src/sextant/git-status.ts +0 -197
  353. package/src/sextant/grid.ts +0 -59
  354. package/src/sextant/input.ts +0 -119
  355. package/src/sextant/keys.ts +0 -521
  356. package/src/sextant/layout.ts +0 -86
  357. package/src/sextant/local-commands.ts +0 -169
  358. package/src/sextant/market-source.ts +0 -287
  359. package/src/sextant/mentions.ts +0 -200
  360. package/src/sextant/message-hits.ts +0 -26
  361. package/src/sextant/model.ts +0 -387
  362. package/src/sextant/overlays.ts +0 -456
  363. package/src/sextant/panel-hits.ts +0 -38
  364. package/src/sextant/pet.ts +0 -399
  365. package/src/sextant/screen.ts +0 -324
  366. package/src/sextant/scroll-hits.ts +0 -66
  367. package/src/sextant/scrollbar.ts +0 -82
  368. package/src/sextant/sextant-bridge.ts +0 -174
  369. package/src/sextant/sextant-cards.ts +0 -142
  370. package/src/sextant/sextant-diff-base.ts +0 -63
  371. package/src/sextant/sextant-files.ts +0 -154
  372. package/src/sextant/sextant-frame-loop.ts +0 -335
  373. package/src/sextant/sextant-renderer.ts +0 -574
  374. package/src/sextant/sextant-repo.ts +0 -140
  375. package/src/sextant/theme.ts +0 -66
  376. package/src/sextant/tool-rows.ts +0 -189
  377. package/src/sextant/types.ts +0 -493
  378. package/src/skills/index.ts +0 -387
  379. package/src/skills/pack.ts +0 -220
  380. package/src/skills/spec.ts +0 -162
  381. package/src/skills/tools.ts +0 -69
  382. package/src/skills/versioned.ts +0 -227
  383. package/src/telemetry/otel-export.ts +0 -122
  384. package/src/telemetry/otel-lanes.ts +0 -89
  385. package/src/telemetry/otel-logs.ts +0 -131
  386. package/src/telemetry/otel-metrics.ts +0 -136
  387. package/src/telemetry/otel.ts +0 -397
  388. package/src/telemetry/otlp.ts +0 -76
  389. package/src/tools/ask-user.ts +0 -156
  390. package/src/tools/bash-bg.ts +0 -94
  391. package/src/tools/bash-jobs.ts +0 -237
  392. package/src/tools/design.ts +0 -151
  393. package/src/tools/evalcell.ts +0 -338
  394. package/src/tools/html-text.ts +0 -139
  395. package/src/tools/provider.ts +0 -149
  396. package/src/tools/task.ts +0 -250
  397. package/src/tools/todo.ts +0 -320
  398. package/src/tools/webfetch.ts +0 -332
  399. package/src/tools/websearch.ts +0 -359
  400. package/src/tui/agents-cmd.ts +0 -41
  401. package/src/tui/app.ts +0 -749
  402. package/src/tui/attach.ts +0 -127
  403. package/src/tui/boot-notes.ts +0 -41
  404. package/src/tui/builtin-prompts.ts +0 -59
  405. package/src/tui/checkpoints-cmd.ts +0 -70
  406. package/src/tui/clipboard-image.ts +0 -81
  407. package/src/tui/clipboard.ts +0 -78
  408. package/src/tui/commands.ts +0 -283
  409. package/src/tui/config-view.ts +0 -53
  410. package/src/tui/context-cmds.ts +0 -282
  411. package/src/tui/cost.ts +0 -108
  412. package/src/tui/crash-guard.ts +0 -173
  413. package/src/tui/focus-terminal.ts +0 -34
  414. package/src/tui/git-cmds.ts +0 -273
  415. package/src/tui/git-plain.ts +0 -58
  416. package/src/tui/info-cmd.ts +0 -150
  417. package/src/tui/input-plain.ts +0 -76
  418. package/src/tui/mcp-cmd.ts +0 -128
  419. package/src/tui/memory-note.ts +0 -77
  420. package/src/tui/modes-cmd.ts +0 -45
  421. package/src/tui/notify-seq.ts +0 -100
  422. package/src/tui/notify.ts +0 -318
  423. package/src/tui/overlays.ts +0 -97
  424. package/src/tui/pi-renderer.ts +0 -428
  425. package/src/tui/providers-cmd.ts +0 -377
  426. package/src/tui/reasoning-view.ts +0 -56
  427. package/src/tui/renderer.ts +0 -128
  428. package/src/tui/replay-marker.ts +0 -29
  429. package/src/tui/session-cmd.ts +0 -148
  430. package/src/tui/session-manage.ts +0 -95
  431. package/src/tui/sextant-attach.ts +0 -102
  432. package/src/tui/sextant-io.ts +0 -202
  433. package/src/tui/sextant-smoke.ts +0 -110
  434. package/src/tui/shell-cmd.ts +0 -158
  435. package/src/tui/smoke.ts +0 -72
  436. package/src/tui/staged-terminal.ts +0 -50
  437. package/src/tui/startup.ts +0 -12
  438. package/src/tui/theme.ts +0 -59
  439. package/src/tui/todo-label.ts +0 -7
  440. package/src/tui/trust-card.ts +0 -107
  441. package/src/tui/tui-commands.ts +0 -87
  442. package/tsconfig.json +0 -30
  443. package/vendor/pi-tui/LICENSE +0 -21
  444. package/vendor/pi-tui/PATCHES.md +0 -12
  445. package/vendor/pi-tui/PROVENANCE.md +0 -12
  446. package/vendor/pi-tui/README.upstream.md +0 -854
  447. package/vendor/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  448. package/vendor/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  449. package/vendor/pi-tui/src/alt-screen-search.ts +0 -158
  450. package/vendor/pi-tui/src/autocomplete.ts +0 -827
  451. package/vendor/pi-tui/src/components/alt-screen-flash.ts +0 -52
  452. package/vendor/pi-tui/src/components/box.ts +0 -138
  453. package/vendor/pi-tui/src/components/cancellable-loader.ts +0 -41
  454. package/vendor/pi-tui/src/components/editor.ts +0 -2364
  455. package/vendor/pi-tui/src/components/h-stack.ts +0 -45
  456. package/vendor/pi-tui/src/components/image.ts +0 -128
  457. package/vendor/pi-tui/src/components/input.ts +0 -448
  458. package/vendor/pi-tui/src/components/loader.ts +0 -93
  459. package/vendor/pi-tui/src/components/markdown.ts +0 -1016
  460. package/vendor/pi-tui/src/components/scroll-view.ts +0 -217
  461. package/vendor/pi-tui/src/components/select-list.ts +0 -230
  462. package/vendor/pi-tui/src/components/settings-list.ts +0 -277
  463. package/vendor/pi-tui/src/components/spacer.ts +0 -29
  464. package/vendor/pi-tui/src/components/stack.ts +0 -155
  465. package/vendor/pi-tui/src/components/text.ts +0 -108
  466. package/vendor/pi-tui/src/components/truncated-text.ts +0 -66
  467. package/vendor/pi-tui/src/components/v-stack.ts +0 -34
  468. package/vendor/pi-tui/src/editor-component.ts +0 -75
  469. package/vendor/pi-tui/src/fuzzy.ts +0 -138
  470. package/vendor/pi-tui/src/index.ts +0 -149
  471. package/vendor/pi-tui/src/keybindings.ts +0 -321
  472. package/vendor/pi-tui/src/keys.ts +0 -1402
  473. package/vendor/pi-tui/src/kill-ring.ts +0 -47
  474. package/vendor/pi-tui/src/latex.ts +0 -1381
  475. package/vendor/pi-tui/src/layout-node.ts +0 -52
  476. package/vendor/pi-tui/src/layout.ts +0 -411
  477. package/vendor/pi-tui/src/native-modifiers.ts +0 -60
  478. package/vendor/pi-tui/src/native-module-path.ts +0 -32
  479. package/vendor/pi-tui/src/stdin-buffer.ts +0 -445
  480. package/vendor/pi-tui/src/terminal-colors.ts +0 -74
  481. package/vendor/pi-tui/src/terminal-image.ts +0 -701
  482. package/vendor/pi-tui/src/terminal.ts +0 -554
  483. package/vendor/pi-tui/src/tui-alt-screen.ts +0 -1379
  484. package/vendor/pi-tui/src/tui-main-screen.ts +0 -655
  485. package/vendor/pi-tui/src/tui.ts +0 -1264
  486. package/vendor/pi-tui/src/undo-stack.ts +0 -29
  487. package/vendor/pi-tui/src/utils.ts +0 -1327
  488. package/vendor/pi-tui/src/word-navigation.ts +0 -118
  489. package/vendor/pi-tui/test/test-themes.ts +0 -39
  490. package/vendor/pi-tui/test/virtual-terminal.ts +0 -219
  491. /package/{src/providers → dist/cli}/models-index.json +0 -0
@@ -1,400 +0,0 @@
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
- }