rovecode 0.3.3 → 0.4.0-beta.3

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 (495) hide show
  1. package/CHANGELOG.md +527 -0
  2. package/README.md +46 -48
  3. package/bin/rovecode.js +24 -0
  4. package/dist/cli/app-j6gn14w3.js +2 -0
  5. package/dist/cli/ask-user-cwstt8fz.js +2 -0
  6. package/dist/cli/auth-login-9bbp9915.js +2 -0
  7. package/dist/cli/auth-m8p9grty.js +2 -0
  8. package/dist/cli/bench-16zqdms5.js +9 -0
  9. package/dist/cli/catalog-1xchffa4.js +2 -0
  10. package/dist/cli/cli-1n1zb64f.js +2 -0
  11. package/dist/cli/client-2t9gjkck.js +2 -0
  12. package/dist/cli/commands-exafvm2b.js +2 -0
  13. package/dist/cli/connect-6zde0kn3.js +2 -0
  14. package/dist/cli/context-cmd-5t43wgqt.js +2 -0
  15. package/dist/cli/context-report-kt01pw8y.js +2 -0
  16. package/dist/cli/count-remote-ap7x3vh6.js +2 -0
  17. package/dist/cli/design-ne5zszyh.js +2 -0
  18. package/dist/cli/dispatch-2r5myxye.js +2 -0
  19. package/dist/cli/doctor-ws4fh4tn.js +3 -0
  20. package/dist/cli/executor-bdrjn634.js +2 -0
  21. package/dist/cli/export-1mxb9g5p.js +2 -0
  22. package/dist/cli/files-g104xghh.js +2 -0
  23. package/dist/cli/gauntlet-07xrjpj7.js +2 -0
  24. package/dist/cli/gauntlet-runner-xvy64436.js +10 -0
  25. package/dist/cli/gauntlet-wave3-jm91yt5w.js +5 -0
  26. package/dist/cli/gauntlet-wave4-r13py7p1.js +14 -0
  27. package/dist/cli/hashline-znvrat11.js +2 -0
  28. package/dist/cli/http-xafw6fsh.js +143 -0
  29. package/dist/cli/index-1sgjm25y.js +2 -0
  30. package/dist/cli/init-g2m0tn4m.js +51 -0
  31. package/dist/cli/install-avaqjjqq.js +2 -0
  32. package/dist/cli/loop-mmpfft01.js +2 -0
  33. package/dist/cli/main-0904f6ps.js +5 -0
  34. package/dist/cli/main-0ab9fc26.js +9 -0
  35. package/dist/cli/main-0jys2ccn.js +3 -0
  36. package/dist/cli/main-0mtcdbs7.js +3 -0
  37. package/dist/cli/main-0z1w2zsg.js +3 -0
  38. package/dist/cli/main-1dchs7xv.js +18 -0
  39. package/dist/cli/main-1ereejm1.js +3 -0
  40. package/dist/cli/main-1k1kw6b5.js +3 -0
  41. package/dist/cli/main-27y4sm2k.js +38 -0
  42. package/dist/cli/main-2wwjex5j.js +58 -0
  43. package/dist/cli/main-2yeveeve.js +6 -0
  44. package/dist/cli/main-2yfck9b5.js +3 -0
  45. package/dist/cli/main-2zmzgkwh.js +3 -0
  46. package/dist/cli/main-351pz3z7.js +7 -0
  47. package/dist/cli/main-3gjqfh7a.js +6 -0
  48. package/dist/cli/main-3nf3kgve.js +3 -0
  49. package/dist/cli/main-3pjrb2hd.js +3 -0
  50. package/dist/cli/main-3rxcvgna.js +19 -0
  51. package/dist/cli/main-4b3jgy66.js +19 -0
  52. package/dist/cli/main-4wndhjdc.js +7 -0
  53. package/dist/cli/main-4xcmvxnk.js +3 -0
  54. package/dist/cli/main-5tbz0wbz.js +4 -0
  55. package/dist/cli/main-5ywnwthm.js +3 -0
  56. package/dist/cli/main-6b62vkz0.js +14 -0
  57. package/dist/cli/main-6dnk69vp.js +3 -0
  58. package/dist/cli/main-6genrmhs.js +136 -0
  59. package/dist/cli/main-73g7eff4.js +15 -0
  60. package/dist/cli/main-7c5thhjd.js +5 -0
  61. package/dist/cli/main-7rn6bqje.js +3 -0
  62. package/dist/cli/main-80haw7qk.js +4 -0
  63. package/dist/cli/main-875s60s2.js +4 -0
  64. package/dist/cli/main-8kjxbpw4.js +8 -0
  65. package/dist/cli/main-90ds1z4e.js +10 -0
  66. package/dist/cli/main-9etavkew.js +3 -0
  67. package/dist/cli/main-a9njrkk1.js +3 -0
  68. package/dist/cli/main-aecrjq2d.js +12 -0
  69. package/dist/cli/main-ck9asesq.js +9 -0
  70. package/dist/cli/main-cta9racd.js +4 -0
  71. package/dist/cli/main-ddv7j2ag.js +3 -0
  72. package/dist/cli/main-dfreez27.js +10 -0
  73. package/dist/cli/main-f7rw7des.js +3 -0
  74. package/dist/cli/main-ggcn7rd7.js +5 -0
  75. package/dist/cli/main-gzkmycnv.js +3 -0
  76. package/dist/cli/main-hq51jg8v.js +18 -0
  77. package/dist/cli/main-jft389w9.js +8 -0
  78. package/dist/cli/main-k1eqkg83.js +3 -0
  79. package/dist/cli/main-k2y8a2aw.js +9 -0
  80. package/dist/cli/main-kcpbykxz.js +4 -0
  81. package/dist/cli/main-kd488vje.js +22 -0
  82. package/dist/cli/main-kh32yvgk.js +5 -0
  83. package/dist/cli/main-kqxnqjnv.js +25 -0
  84. package/dist/cli/main-kyn0xnsg.js +3 -0
  85. package/dist/cli/main-m1kk6fp5.js +21 -0
  86. package/dist/cli/main-mv40pcr2.js +4 -0
  87. package/dist/cli/main-n0t3973w.js +3 -0
  88. package/dist/cli/main-nqveez48.js +4 -0
  89. package/dist/cli/main-pknhvrmj.js +3 -0
  90. package/dist/cli/main-pn1w7a7j.js +3 -0
  91. package/dist/cli/main-prxxs70n.js +4 -0
  92. package/dist/cli/main-q3vsesf9.js +3 -0
  93. package/dist/cli/main-qsevpgsv.js +3 -0
  94. package/dist/cli/main-rdgdw24b.js +25 -0
  95. package/dist/cli/main-rfth4tbm.js +16 -0
  96. package/dist/cli/main-rg0wn0xf.js +5 -0
  97. package/dist/cli/main-sdmxhtv8.js +4 -0
  98. package/dist/cli/main-skbp13js.js +18 -0
  99. package/dist/cli/main-t4xnd213.js +7 -0
  100. package/dist/cli/main-vqak588n.js +4 -0
  101. package/dist/cli/main-w2n1303f.js +9 -0
  102. package/dist/cli/main-wbrdspr2.js +5 -0
  103. package/dist/cli/main-wsrg79c1.js +7 -0
  104. package/dist/cli/main-x4r0fne4.js +5 -0
  105. package/dist/cli/main-xea2f3tn.js +6 -0
  106. package/dist/cli/main-xg704a3c.js +3 -0
  107. package/dist/cli/main-xvnrabfp.js +16 -0
  108. package/dist/cli/main-xy53xf0r.js +4 -0
  109. package/dist/cli/main-y1fqy60y.js +3 -0
  110. package/dist/cli/main-yn8cd281.js +34 -0
  111. package/dist/cli/main-yr0ksc0h.js +4 -0
  112. package/dist/cli/main-z2ex2vyf.js +4 -0
  113. package/dist/cli/main-z3aayzvq.js +3 -0
  114. package/dist/cli/main-zaqh35jg.js +3 -0
  115. package/dist/cli/main-zc2e8e46.js +4 -0
  116. package/dist/cli/main-zzrfw6cf.js +13 -0
  117. package/dist/cli/main.js +280 -0
  118. package/dist/cli/market-cmd-e14kmx9n.js +5 -0
  119. package/dist/cli/mcp-login-wq7ktdek.js +2 -0
  120. package/dist/cli/mcp-market-cmd-9mg3jecy.js +2 -0
  121. package/dist/cli/notify-b7qc0cjb.js +2 -0
  122. package/dist/cli/oauth-z8whcgfx.js +2 -0
  123. package/dist/cli/output-b3ewj3ps.js +16 -0
  124. package/dist/cli/profiles-6mr5he5e.js +2 -0
  125. package/dist/cli/provider-config-g7j42q8x.js +2 -0
  126. package/dist/cli/provider-jr1y8vvm.js +2 -0
  127. package/dist/cli/registry-s8yk86g0.js +2 -0
  128. package/dist/cli/registry-t6p8d4mn.js +2 -0
  129. package/dist/cli/repl-bajwe1mh.js +11 -0
  130. package/dist/cli/resume-rwn9nz7y.js +2 -0
  131. package/dist/cli/run-flags-nah7ndpt.js +2 -0
  132. package/dist/cli/runtime-n7gafzhb.js +2 -0
  133. package/dist/cli/sandbox-config-emdy18x4.js +2 -0
  134. package/dist/cli/server-b0nvs2bn.js +5 -0
  135. package/dist/cli/session-arg-y75wd4kj.js +2 -0
  136. package/dist/cli/session-j62evmjq.js +2 -0
  137. package/dist/cli/sessions-cmd-tsnwz0ns.js +7 -0
  138. package/dist/cli/settings-df10wfez.js +2 -0
  139. package/dist/cli/setup-jzvv72fg.js +2 -0
  140. package/dist/cli/sextant-smoke-37m81ke6.js +5 -0
  141. package/dist/cli/skills-cmd-gjxnxnhx.js +2 -0
  142. package/dist/cli/smoke-p7748apt.js +8 -0
  143. package/dist/cli/start-chat-s4st3mm0.js +12 -0
  144. package/dist/cli/stream-gmeyewds.js +2 -0
  145. package/dist/cli/task-gh0kkp3n.js +2 -0
  146. package/dist/cli/tasks-z1kfpe8e.js +2 -0
  147. package/dist/cli/thinking-0eqkrz6t.js +2 -0
  148. package/dist/cli/todo-5brcrt9m.js +2 -0
  149. package/dist/cli/tools-7pzm0vj9.js +2 -0
  150. package/dist/cli/tools-s635p6s8.js +2 -0
  151. package/dist/cli/trust-cmd-cjav8zgm.js +2 -0
  152. package/dist/cli/update-check-pt31bm2f.js +2 -0
  153. package/dist/cli/update-cmd-tk131s9t.js +2 -0
  154. package/dist/cli/voice-56nabd8d.js +2 -0
  155. package/dist/cli/webfetch-xd8q596m.js +2 -0
  156. package/dist/cli/websearch-5hkf98k1.js +2 -0
  157. package/dist/cli/workflow-cmd-cy3cvzjp.js +4 -0
  158. package/dist/cli/workspace-q10g5z3e.js +2 -0
  159. package/dist/lib/index.js +62 -0
  160. package/dist/lib/models-index.json +1 -0
  161. package/dist/lib/plugins.js +55 -0
  162. package/dist/lib/providers.js +17 -0
  163. package/dist/lib/public-api.js +20 -0
  164. package/dist/lib/sdk.js +360 -0
  165. package/package.json +84 -72
  166. package/bin/rovecode.ts +0 -21
  167. package/src/acp/server.ts +0 -374
  168. package/src/cli/auth-login.ts +0 -122
  169. package/src/cli/connect.ts +0 -244
  170. package/src/cli/context-cmd.ts +0 -199
  171. package/src/cli/dispatch.ts +0 -82
  172. package/src/cli/doctor.ts +0 -362
  173. package/src/cli/export.ts +0 -276
  174. package/src/cli/help.ts +0 -293
  175. package/src/cli/is-tui-invocation.ts +0 -8
  176. package/src/cli/main.ts +0 -583
  177. package/src/cli/market-cmd.ts +0 -658
  178. package/src/cli/mcp-login.ts +0 -141
  179. package/src/cli/mcp-market-cmd.ts +0 -302
  180. package/src/cli/output.ts +0 -382
  181. package/src/cli/repl.ts +0 -250
  182. package/src/cli/repomap-root.ts +0 -14
  183. package/src/cli/resume.ts +0 -57
  184. package/src/cli/run-flags.ts +0 -43
  185. package/src/cli/run-limits.ts +0 -78
  186. package/src/cli/runtime.ts +0 -931
  187. package/src/cli/session-arg.ts +0 -30
  188. package/src/cli/sessions-cmd.ts +0 -145
  189. package/src/cli/setup.ts +0 -153
  190. package/src/cli/skills-cmd.ts +0 -194
  191. package/src/cli/start-chat.ts +0 -65
  192. package/src/cli/trust-cmd.ts +0 -52
  193. package/src/coding/bash.ts +0 -148
  194. package/src/coding/checkpoints.ts +0 -327
  195. package/src/coding/diff.ts +0 -138
  196. package/src/coding/files.ts +0 -341
  197. package/src/coding/hashline.ts +0 -274
  198. package/src/coding/lsp-gate.ts +0 -254
  199. package/src/coding/lsp-servers.ts +0 -147
  200. package/src/coding/lsp.ts +0 -283
  201. package/src/coding/repomap-cache.ts +0 -99
  202. package/src/coding/repomap-files.ts +0 -192
  203. package/src/coding/repomap.ts +0 -481
  204. package/src/core/agents.ts +0 -255
  205. package/src/core/compaction.ts +0 -259
  206. package/src/core/config.ts +0 -289
  207. package/src/core/context-report.ts +0 -228
  208. package/src/core/context.ts +0 -60
  209. package/src/core/count-remote.ts +0 -107
  210. package/src/core/execpolicy-rules.ts +0 -196
  211. package/src/core/execpolicy.ts +0 -385
  212. package/src/core/executor.ts +0 -454
  213. package/src/core/guardrails.ts +0 -400
  214. package/src/core/hooks.ts +0 -411
  215. package/src/core/images.ts +0 -230
  216. package/src/core/intro.ts +0 -266
  217. package/src/core/loop.ts +0 -567
  218. package/src/core/modes.ts +0 -372
  219. package/src/core/orchestrator.ts +0 -245
  220. package/src/core/proc-group.ts +0 -48
  221. package/src/core/project-trust.ts +0 -98
  222. package/src/core/reflection.ts +0 -165
  223. package/src/core/sandbox-config.ts +0 -186
  224. package/src/core/session-id.ts +0 -24
  225. package/src/core/session-images.ts +0 -73
  226. package/src/core/session-ops.ts +0 -183
  227. package/src/core/session-text.ts +0 -29
  228. package/src/core/session.ts +0 -469
  229. package/src/core/settings.ts +0 -170
  230. package/src/core/tasks.ts +0 -646
  231. package/src/core/token-scale.ts +0 -108
  232. package/src/core/tools.ts +0 -309
  233. package/src/core/trust.ts +0 -104
  234. package/src/core/types.ts +0 -330
  235. package/src/core/update-check.ts +0 -171
  236. package/src/core/usage.ts +0 -204
  237. package/src/core/validate.ts +0 -121
  238. package/src/core/verify-gate.ts +0 -159
  239. package/src/core/verify.ts +0 -236
  240. package/src/core/voice.ts +0 -158
  241. package/src/core/win-job.ts +0 -183
  242. package/src/core/workspace.ts +0 -184
  243. package/src/design/audit.ts +0 -797
  244. package/src/design/direction.ts +0 -190
  245. package/src/design/rules.ts +0 -157
  246. package/src/eval/bench.ts +0 -150
  247. package/src/eval/gauntlet-runner.ts +0 -215
  248. package/src/eval/gauntlet-support.ts +0 -84
  249. package/src/eval/gauntlet-wave3.ts +0 -269
  250. package/src/eval/gauntlet-wave4.ts +0 -217
  251. package/src/eval/gauntlet.ts +0 -253
  252. package/src/index.ts +0 -17
  253. package/src/lanes/agy.ts +0 -95
  254. package/src/lanes/approval.ts +0 -24
  255. package/src/lanes/claude.ts +0 -129
  256. package/src/lanes/codex.ts +0 -127
  257. package/src/lanes/events.ts +0 -130
  258. package/src/lanes/job.ts +0 -142
  259. package/src/lanes/opencode.ts +0 -122
  260. package/src/lanes/process.ts +0 -184
  261. package/src/lanes/progress.ts +0 -183
  262. package/src/lanes/registry.ts +0 -178
  263. package/src/lanes/runner.ts +0 -124
  264. package/src/lanes/types.ts +0 -112
  265. package/src/market/catalogs/mcp-docs.json +0 -111
  266. package/src/market/catalogs/plugins.json +0 -111
  267. package/src/market/catalogs/skills.json +0 -478
  268. package/src/market/clone.ts +0 -72
  269. package/src/market/context-cost.ts +0 -121
  270. package/src/market/digest.ts +0 -106
  271. package/src/market/index.ts +0 -22
  272. package/src/market/install.ts +0 -578
  273. package/src/market/manifest.ts +0 -187
  274. package/src/market/prereq.ts +0 -145
  275. package/src/market/registry.ts +0 -363
  276. package/src/market/resolve.ts +0 -111
  277. package/src/market/types.ts +0 -236
  278. package/src/market/validate.ts +0 -227
  279. package/src/mcp/client.ts +0 -449
  280. package/src/mcp/config.ts +0 -252
  281. package/src/mcp/local-package.ts +0 -211
  282. package/src/mcp/market-catalog.ts +0 -84
  283. package/src/mcp/market-install.ts +0 -289
  284. package/src/mcp/market.ts +0 -362
  285. package/src/mcp/oauth.ts +0 -251
  286. package/src/mcp/prompts-resources.ts +0 -249
  287. package/src/mcp/shared.ts +0 -149
  288. package/src/mcp/status.ts +0 -67
  289. package/src/mcp/tools.ts +0 -275
  290. package/src/mcp/transport.ts +0 -122
  291. package/src/mcp/trust.ts +0 -25
  292. package/src/memory/blocks.ts +0 -278
  293. package/src/memory/recall.ts +0 -355
  294. package/src/memory/scope.ts +0 -182
  295. package/src/memory/store.ts +0 -105
  296. package/src/memory/tools.ts +0 -99
  297. package/src/plugins/cli.ts +0 -119
  298. package/src/plugins/discover.ts +0 -108
  299. package/src/plugins/index.ts +0 -50
  300. package/src/plugins/install.ts +0 -184
  301. package/src/plugins/load.ts +0 -124
  302. package/src/plugins/manifest.ts +0 -92
  303. package/src/plugins/state.ts +0 -83
  304. package/src/providers/auth.ts +0 -408
  305. package/src/providers/cache.ts +0 -223
  306. package/src/providers/catalog-local.ts +0 -160
  307. package/src/providers/catalog.ts +0 -421
  308. package/src/providers/middleware-context.ts +0 -86
  309. package/src/providers/middleware.ts +0 -373
  310. package/src/providers/model-list.ts +0 -23
  311. package/src/providers/oauth/common.ts +0 -105
  312. package/src/providers/oauth/device-code.ts +0 -107
  313. package/src/providers/oauth/github-copilot.ts +0 -146
  314. package/src/providers/oauth/loopback.ts +0 -158
  315. package/src/providers/oauth/openai.ts +0 -163
  316. package/src/providers/oauth/openrouter.ts +0 -89
  317. package/src/providers/oauth/pkce.ts +0 -45
  318. package/src/providers/oauth/registry.ts +0 -39
  319. package/src/providers/oauth/seam.ts +0 -89
  320. package/src/providers/profile-glm53.ts +0 -111
  321. package/src/providers/profile-sonnet5-persona.ts +0 -65
  322. package/src/providers/profile-sonnet5-voice.ts +0 -23
  323. package/src/providers/profiles.ts +0 -156
  324. package/src/providers/provider-config.ts +0 -311
  325. package/src/providers/registry.ts +0 -333
  326. package/src/providers/responses.ts +0 -209
  327. package/src/providers/retry.ts +0 -234
  328. package/src/providers/router.ts +0 -294
  329. package/src/providers/sse.ts +0 -26
  330. package/src/providers/stream-errors.ts +0 -117
  331. package/src/providers/stream.ts +0 -566
  332. package/src/providers/thinking.ts +0 -189
  333. package/src/providers/wire-messages.ts +0 -129
  334. package/src/providers/wire-responses.ts +0 -79
  335. package/src/providers/wire-select.ts +0 -53
  336. package/src/server/http.ts +0 -291
  337. package/src/server/openapi.ts +0 -246
  338. package/src/sextant/card-hits.ts +0 -102
  339. package/src/sextant/card-keys.ts +0 -55
  340. package/src/sextant/context-source.ts +0 -157
  341. package/src/sextant/crew-cards.ts +0 -350
  342. package/src/sextant/draw-agents.ts +0 -273
  343. package/src/sextant/draw-code.ts +0 -388
  344. package/src/sextant/draw-context.ts +0 -222
  345. package/src/sextant/draw-frame.ts +0 -164
  346. package/src/sextant/draw-market.ts +0 -573
  347. package/src/sextant/draw-messages.ts +0 -386
  348. package/src/sextant/draw-pet.ts +0 -230
  349. package/src/sextant/draw-plan.ts +0 -187
  350. package/src/sextant/draw-tabs.ts +0 -85
  351. package/src/sextant/draw-util.ts +0 -65
  352. package/src/sextant/draw-wizard.ts +0 -378
  353. package/src/sextant/engine.ts +0 -230
  354. package/src/sextant/frame-hits.ts +0 -25
  355. package/src/sextant/frame.ts +0 -101
  356. package/src/sextant/git-status.ts +0 -197
  357. package/src/sextant/grid.ts +0 -59
  358. package/src/sextant/input.ts +0 -119
  359. package/src/sextant/keys.ts +0 -521
  360. package/src/sextant/layout.ts +0 -86
  361. package/src/sextant/local-commands.ts +0 -169
  362. package/src/sextant/market-source.ts +0 -287
  363. package/src/sextant/mentions.ts +0 -200
  364. package/src/sextant/message-hits.ts +0 -26
  365. package/src/sextant/model.ts +0 -387
  366. package/src/sextant/overlays.ts +0 -456
  367. package/src/sextant/panel-hits.ts +0 -38
  368. package/src/sextant/pet.ts +0 -399
  369. package/src/sextant/screen.ts +0 -324
  370. package/src/sextant/scroll-hits.ts +0 -66
  371. package/src/sextant/scrollbar.ts +0 -82
  372. package/src/sextant/sextant-bridge.ts +0 -174
  373. package/src/sextant/sextant-cards.ts +0 -142
  374. package/src/sextant/sextant-diff-base.ts +0 -63
  375. package/src/sextant/sextant-files.ts +0 -154
  376. package/src/sextant/sextant-frame-loop.ts +0 -335
  377. package/src/sextant/sextant-renderer.ts +0 -574
  378. package/src/sextant/sextant-repo.ts +0 -140
  379. package/src/sextant/theme.ts +0 -66
  380. package/src/sextant/tool-rows.ts +0 -189
  381. package/src/sextant/types.ts +0 -493
  382. package/src/skills/index.ts +0 -387
  383. package/src/skills/pack.ts +0 -220
  384. package/src/skills/spec.ts +0 -162
  385. package/src/skills/tools.ts +0 -69
  386. package/src/skills/versioned.ts +0 -227
  387. package/src/telemetry/otel-export.ts +0 -122
  388. package/src/telemetry/otel-lanes.ts +0 -89
  389. package/src/telemetry/otel-logs.ts +0 -131
  390. package/src/telemetry/otel-metrics.ts +0 -136
  391. package/src/telemetry/otel.ts +0 -397
  392. package/src/telemetry/otlp.ts +0 -76
  393. package/src/tools/ask-user.ts +0 -156
  394. package/src/tools/bash-bg.ts +0 -94
  395. package/src/tools/bash-jobs.ts +0 -237
  396. package/src/tools/design.ts +0 -151
  397. package/src/tools/evalcell.ts +0 -338
  398. package/src/tools/html-text.ts +0 -139
  399. package/src/tools/provider.ts +0 -149
  400. package/src/tools/task.ts +0 -250
  401. package/src/tools/todo.ts +0 -320
  402. package/src/tools/webfetch.ts +0 -332
  403. package/src/tools/websearch.ts +0 -359
  404. package/src/tui/agents-cmd.ts +0 -41
  405. package/src/tui/app.ts +0 -749
  406. package/src/tui/attach.ts +0 -127
  407. package/src/tui/boot-notes.ts +0 -41
  408. package/src/tui/builtin-prompts.ts +0 -59
  409. package/src/tui/checkpoints-cmd.ts +0 -70
  410. package/src/tui/clipboard-image.ts +0 -81
  411. package/src/tui/clipboard.ts +0 -78
  412. package/src/tui/commands.ts +0 -283
  413. package/src/tui/config-view.ts +0 -53
  414. package/src/tui/context-cmds.ts +0 -282
  415. package/src/tui/cost.ts +0 -108
  416. package/src/tui/crash-guard.ts +0 -173
  417. package/src/tui/focus-terminal.ts +0 -34
  418. package/src/tui/git-cmds.ts +0 -273
  419. package/src/tui/git-plain.ts +0 -58
  420. package/src/tui/info-cmd.ts +0 -150
  421. package/src/tui/input-plain.ts +0 -76
  422. package/src/tui/mcp-cmd.ts +0 -128
  423. package/src/tui/memory-note.ts +0 -77
  424. package/src/tui/modes-cmd.ts +0 -45
  425. package/src/tui/notify-seq.ts +0 -100
  426. package/src/tui/notify.ts +0 -318
  427. package/src/tui/overlays.ts +0 -97
  428. package/src/tui/pi-renderer.ts +0 -428
  429. package/src/tui/providers-cmd.ts +0 -377
  430. package/src/tui/reasoning-view.ts +0 -56
  431. package/src/tui/renderer.ts +0 -128
  432. package/src/tui/replay-marker.ts +0 -29
  433. package/src/tui/session-cmd.ts +0 -148
  434. package/src/tui/session-manage.ts +0 -95
  435. package/src/tui/sextant-attach.ts +0 -102
  436. package/src/tui/sextant-io.ts +0 -202
  437. package/src/tui/sextant-smoke.ts +0 -110
  438. package/src/tui/shell-cmd.ts +0 -158
  439. package/src/tui/smoke.ts +0 -72
  440. package/src/tui/staged-terminal.ts +0 -50
  441. package/src/tui/startup.ts +0 -12
  442. package/src/tui/theme.ts +0 -59
  443. package/src/tui/todo-label.ts +0 -7
  444. package/src/tui/trust-card.ts +0 -107
  445. package/src/tui/tui-commands.ts +0 -87
  446. package/tsconfig.json +0 -30
  447. package/vendor/pi-tui/LICENSE +0 -21
  448. package/vendor/pi-tui/PATCHES.md +0 -12
  449. package/vendor/pi-tui/PROVENANCE.md +0 -12
  450. package/vendor/pi-tui/README.upstream.md +0 -854
  451. package/vendor/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  452. package/vendor/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  453. package/vendor/pi-tui/src/alt-screen-search.ts +0 -158
  454. package/vendor/pi-tui/src/autocomplete.ts +0 -827
  455. package/vendor/pi-tui/src/components/alt-screen-flash.ts +0 -52
  456. package/vendor/pi-tui/src/components/box.ts +0 -138
  457. package/vendor/pi-tui/src/components/cancellable-loader.ts +0 -41
  458. package/vendor/pi-tui/src/components/editor.ts +0 -2364
  459. package/vendor/pi-tui/src/components/h-stack.ts +0 -45
  460. package/vendor/pi-tui/src/components/image.ts +0 -128
  461. package/vendor/pi-tui/src/components/input.ts +0 -448
  462. package/vendor/pi-tui/src/components/loader.ts +0 -93
  463. package/vendor/pi-tui/src/components/markdown.ts +0 -1016
  464. package/vendor/pi-tui/src/components/scroll-view.ts +0 -217
  465. package/vendor/pi-tui/src/components/select-list.ts +0 -230
  466. package/vendor/pi-tui/src/components/settings-list.ts +0 -277
  467. package/vendor/pi-tui/src/components/spacer.ts +0 -29
  468. package/vendor/pi-tui/src/components/stack.ts +0 -155
  469. package/vendor/pi-tui/src/components/text.ts +0 -108
  470. package/vendor/pi-tui/src/components/truncated-text.ts +0 -66
  471. package/vendor/pi-tui/src/components/v-stack.ts +0 -34
  472. package/vendor/pi-tui/src/editor-component.ts +0 -75
  473. package/vendor/pi-tui/src/fuzzy.ts +0 -138
  474. package/vendor/pi-tui/src/index.ts +0 -149
  475. package/vendor/pi-tui/src/keybindings.ts +0 -321
  476. package/vendor/pi-tui/src/keys.ts +0 -1402
  477. package/vendor/pi-tui/src/kill-ring.ts +0 -47
  478. package/vendor/pi-tui/src/latex.ts +0 -1381
  479. package/vendor/pi-tui/src/layout-node.ts +0 -52
  480. package/vendor/pi-tui/src/layout.ts +0 -411
  481. package/vendor/pi-tui/src/native-modifiers.ts +0 -60
  482. package/vendor/pi-tui/src/native-module-path.ts +0 -32
  483. package/vendor/pi-tui/src/stdin-buffer.ts +0 -445
  484. package/vendor/pi-tui/src/terminal-colors.ts +0 -74
  485. package/vendor/pi-tui/src/terminal-image.ts +0 -701
  486. package/vendor/pi-tui/src/terminal.ts +0 -554
  487. package/vendor/pi-tui/src/tui-alt-screen.ts +0 -1379
  488. package/vendor/pi-tui/src/tui-main-screen.ts +0 -655
  489. package/vendor/pi-tui/src/tui.ts +0 -1264
  490. package/vendor/pi-tui/src/undo-stack.ts +0 -29
  491. package/vendor/pi-tui/src/utils.ts +0 -1327
  492. package/vendor/pi-tui/src/word-navigation.ts +0 -118
  493. package/vendor/pi-tui/test/test-themes.ts +0 -39
  494. package/vendor/pi-tui/test/virtual-terminal.ts +0 -219
  495. /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
- }