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,178 +0,0 @@
1
- /** Lane registry (#47): the four adapters by id, the `ROVECODE_LANES_ALLOW` gate, the LaneOpts defaults
2
- * (+ the user-side knobs that shape a lane's permissions), and the ONE function that turns a lane's
3
- * options into the approval-card text — the TaskManager stores the same string on the TaskInfo, so the
4
- * card and the running lane agree.
5
- *
6
- * THE GATE IS ON BY DEFAULT (changed 2026-09-07, at the user's request). It used to be an opt-in
7
- * allow-list: unset meant no lane could start, so a CLI the user had installed was unreachable until
8
- * they found an env knob nobody reads. Now an UNSET knob allows every adapter and a DEFINED knob is an
9
- * exact list — `ROVECODE_LANES_ALLOW=` (empty) is the kill switch, and `=codex` still means codex only.
10
- * Defined-wins is what makes that safe: turning the default on cannot silently widen a machine whose
11
- * owner had already written a narrower list.
12
- *
13
- * What replaces the gate as the thing that stops a lane is INSTALLEDNESS. With lanes off, a missing CLI
14
- * was academic; with lanes on it is the common case, and the honest place to say so is here, before a
15
- * worktree exists. Left to the spawn it surfaces as `spawn failed: codex: ENOENT` after the lane has
16
- * built a worktree and burned a turn — a refusal at the gate costs neither. The probe reads PATH only
17
- * (plus PATHEXT on win32); it is injectable so no test ever depends on what this machine has installed,
18
- * and it is memoised per (bin, PATH) because `task start` may be called in a loop.
19
- *
20
- * Turning the gate on removes the approval that came WITH it for anyone running permission=auto, where
21
- * no card is ever shown. `laneStartNote` is the replacement: the text a surface states when a lane
22
- * starts, at every permission level, so "an external CLI just began working in your repo" is never
23
- * something the user has to infer from a spinner. It is the card's own sentence — one function builds
24
- * both, so the note cannot drift from the flags the lane actually got. */
25
-
26
- import { existsSync } from "node:fs";
27
- import { delimiter, join } from "node:path";
28
- import { isObj } from "./events.ts";
29
- import { ADAPTER_IDS, isAdapterId, type AdapterId, type AgentAdapter, type LaneOpts } from "./types.ts";
30
- import { claudeAdapter } from "./claude.ts";
31
- import { codexAdapter } from "./codex.ts";
32
- import { opencodeAdapter } from "./opencode.ts";
33
- import { agyAdapter } from "./agy.ts";
34
-
35
- export const ADAPTERS: Readonly<Record<AdapterId, AgentAdapter>> = {
36
- claude: claudeAdapter, codex: codexAdapter, opencode: opencodeAdapter, agy: agyAdapter,
37
- };
38
-
39
- export type Env = Readonly<Record<string, string | undefined>>;
40
-
41
- // The knobs, by their documented names. The harness this came from routed every read through a central
42
- // core/env.ts that also consulted a settings file; rovecode has no such reader — it reads ROVECODE_* off
43
- // the environment in 45 places — so the two helpers below are the whole of it, and a lane knob behaves
44
- // like every other rovecode knob. `envName` exists so the name is written once and displayed the same
45
- // way it is read: a refusal that names the wrong variable is worse than no refusal.
46
- /** the full variable name for a knob: `LANES_ALLOW` → `ROVECODE_LANES_ALLOW` */
47
- export const envName = (knob: string): string => `ROVECODE_${knob}`;
48
- /** read a knob; DEFINED wins, even when empty (the call sites treat "" exactly as they treat unset) */
49
- const readEnv = (knob: string, env: Env = process.env): string | undefined => env[envName(knob)];
50
- /** comma list of adapter ids that may be STARTED at all; UNSET = all four, empty = none (the kill switch) */
51
- export const LANES_ALLOW_ENV = envName("LANES_ALLOW");
52
- /** comma list of adapter ids that get an explicit allow-all (agy: `--dangerously-skip-permissions`) */
53
- export const LANES_ALLOW_ALL_ENV = envName("LANES_ALLOW_ALL");
54
- /** claude `--allowedTools` rules, comma-separated (default Read,Edit,Write) */
55
- export const LANE_CLAUDE_ALLOW_ENV = envName("LANE_CLAUDE_ALLOW");
56
- /** claude `--bare`: "1" forces it, "0" drops it; unset = on only when ANTHROPIC_API_KEY is set in the lane
57
- * env (live-verified 2026-09-03: `--bare` authenticates with the key ALONE — the CLI's login is never read) */
58
- export const LANE_CLAUDE_BARE_ENV = envName("LANE_CLAUDE_BARE");
59
- /** claude's documented headless login (`claude setup-token`) — the CLI reads it itself when the lane is not
60
- * `--bare` (process.ts KEPT_ENV_EXACT lets it through); the registry reads it only for the card's auth word */
61
- export const CLAUDE_OAUTH_TOKEN_ENV = "CLAUDE_CODE_OAUTH_TOKEN";
62
- /** the knob suffix of a lane's model flag (`--model` / `-m provider/model`): LANE_<ID>_MODEL — read through
63
- * ROVECODE_LANE_<ID>_MODEL — unset means the lane's CLI picks its own default, which is not ours to guess */
64
- export const laneModelKnob = (id: AdapterId): string => `LANE_${id.toUpperCase()}_MODEL`;
65
- /** the documented name of that knob: ROVECODE_LANE_<ID>_MODEL */
66
- export const laneModelEnv = (id: AdapterId): string => envName(laneModelKnob(id));
67
- /** codex `--sandbox`: read-only | workspace-write (default) */
68
- export const LANE_CODEX_SANDBOX_ENV = envName("LANE_CODEX_SANDBOX");
69
- /** wall-clock budget per lane in ms (default 15 min) */
70
- export const LANE_TIMEOUT_ENV = envName("LANE_TIMEOUT_MS");
71
- export const DEFAULT_LANE_TIMEOUT_MS = 15 * 60_000;
72
-
73
- function idList(raw: string | undefined): Set<AdapterId> {
74
- const out = new Set<AdapterId>();
75
- for (const tok of (raw ?? "").split(",")) {
76
- const id = tok.trim().toLowerCase();
77
- if (isAdapterId(id)) out.add(id);
78
- }
79
- return out;
80
- }
81
-
82
- /** Adapter ids that may start. UNSET `ROVECODE_LANES_ALLOW` = all four; a DEFINED value is an exact
83
- * list, so an empty string allows nothing (the kill switch) and unknown tokens are ignored. */
84
- export const lanesAllowed = (env: Env = process.env): Set<AdapterId> => {
85
- const raw = readEnv("LANES_ALLOW", env);
86
- return raw === undefined ? new Set(ADAPTER_IDS) : idList(raw);
87
- };
88
- /** The binary an adapter would run, without building a lane: `command()` is pure and takes no process. */
89
- export const laneBinary = (id: AdapterId, env: Env = process.env): string =>
90
- ADAPTERS[id].command({ goal: "probe" }, laneOptsFor(id, ".", env)).bin;
91
-
92
- /** Is `bin` runnable? PATH only (plus PATHEXT on win32) — the same lookup the OS would do at spawn.
93
- * Injectable and memoised; a bare name with no PATH at all is assumed present rather than refused,
94
- * because guessing "missing" would block a lane the OS could in fact have started. */
95
- export type PathProbe = (bin: string, env: Env) => boolean;
96
- const probeCache = new Map<string, boolean>();
97
- export const onPath: PathProbe = (bin, env) => {
98
- const path = env["PATH"] ?? env["Path"] ?? "";
99
- const key = `${process.platform}|${bin}|${path}`;
100
- const hit = probeCache.get(key);
101
- if (hit !== undefined) return hit;
102
- const ok = lookup(bin, path, env);
103
- probeCache.set(key, ok);
104
- return ok;
105
- };
106
- function lookup(bin: string, path: string, env: Env): boolean {
107
- if (bin.includes("/") || bin.includes("\\")) return existsSync(bin); // an explicit path is not a PATH lookup
108
- if (path === "") return true; // nothing to search: do not claim it is missing
109
- const exts = process.platform === "win32"
110
- ? (env["PATHEXT"] ?? ".COM;.EXE;.BAT;.CMD").split(";").map((e) => e.trim()).filter(Boolean)
111
- : [""];
112
- for (const dir of path.split(delimiter)) {
113
- if (dir === "") continue;
114
- for (const ext of exts) if (existsSync(join(dir, bin + ext))) return true;
115
- }
116
- return false;
117
- }
118
- /** test seam: forget what was probed (the cache is keyed by PATH, so only a test needs this) */
119
- export const resetPathProbe = (): void => { probeCache.clear(); };
120
-
121
- /** null when `id` may start; otherwise the refusal text `task start` returns (no process is spawned,
122
- * and no worktree is built — both refusals below land before the lane exists). */
123
- export function laneRefusal(id: AdapterId, env: Env = process.env, probe: PathProbe = onPath): string | null {
124
- const allowed = lanesAllowed(env);
125
- if (!allowed.has(id)) {
126
- // Only reachable when the user wrote a list themselves, so the refusal talks about THEIR list
127
- // rather than telling them to opt in to something that is already on by default.
128
- const now = allowed.size ? [...allowed].join(",") : "none";
129
- return `external lane '${id}' is not in ${LANES_ALLOW_ENV} (currently allowed: ${now}) — add it, or unset ${LANES_ALLOW_ENV} to allow all of ${ADAPTER_IDS.join(",")}`;
130
- }
131
- const bin = laneBinary(id, env);
132
- if (!probe(bin, env)) return `external lane '${id}' needs the '${bin}' CLI, which is not on PATH — install it, or start a different lane (${ADAPTER_IDS.filter((o) => o !== id).join(", ")})`;
133
- return null;
134
- }
135
-
136
- /** The sentence a surface states when a lane starts — shown at EVERY permission level, because
137
- * permission=auto shows no approval card and an external CLI beginning work in the user's repo is
138
- * not something to leave implicit. Built from `lanePermissions`, so it names the flags the lane
139
- * actually got rather than a description of them. */
140
- export function laneStartNote(id: AdapterId, env: Env = process.env, over: Partial<LaneOpts> = {}): string {
141
- return `${lanePermissions(id, env, over)} — started; it works in its own worktree and its diff comes back as a patch`;
142
- }
143
-
144
- export function laneTimeoutFromEnv(env: Env = process.env): number {
145
- const n = Number(readEnv("LANE_TIMEOUT_MS", env) ?? "");
146
- return Number.isInteger(n) && n >= 1_000 ? n : DEFAULT_LANE_TIMEOUT_MS;
147
- }
148
-
149
- /** The options a lane of `id` runs with in `cwd` (its worktree): env knobs, then `over`; cwd always wins. */
150
- export function laneOptsFor(id: AdapterId, cwd: string, env: Env = process.env, over: Partial<LaneOpts> = {}): LaneOpts {
151
- const opts: LaneOpts = { cwd, timeoutMs: laneTimeoutFromEnv(env) };
152
- const model = (readEnv(laneModelKnob(id), env) ?? "").trim();
153
- if (model) opts.model = model;
154
- if (id === "claude") {
155
- const raw = readEnv("LANE_CLAUDE_ALLOW", env);
156
- if (raw !== undefined) opts.allowlist = raw.split(",").map((s) => s.trim()).filter(Boolean);
157
- const bare = readEnv("LANE_CLAUDE_BARE", env);
158
- opts.bare = bare === "1" ? true : bare === "0" ? false : (env["ANTHROPIC_API_KEY"] ?? "") !== "";
159
- if ((env[CLAUDE_OAUTH_TOKEN_ENV] ?? "") !== "") opts.oauthToken = true;
160
- }
161
- if (id === "codex") {
162
- const sb = readEnv("LANE_CODEX_SANDBOX", env);
163
- opts.sandbox = sb === "read-only" ? "read-only" : "workspace-write";
164
- }
165
- if (id === "agy" && idList(readEnv("LANES_ALLOW_ALL", env)).has("agy")) opts.allowAll = true;
166
- return { ...opts, ...over, cwd };
167
- }
168
-
169
- /** The approval-card text for a lane — `spawn codex lane · sandbox workspace-write · approval never · worktree`. */
170
- export function lanePermissions(id: AdapterId, env: Env = process.env, over: Partial<LaneOpts> = {}): string {
171
- return `spawn ${id} lane · ${ADAPTERS[id].permissionSummary(laneOptsFor(id, "<worktree>", env, over))}`;
172
- }
173
-
174
- /** A `task start` args object naming an external lane → its card text; null for every other call. */
175
- export function laneApprovalText(args: unknown, env: Env = process.env): string | null {
176
- if (!isObj(args) || args["action"] !== "start" || !isAdapterId(args["agent"])) return null;
177
- return lanePermissions(args["agent"], env);
178
- }
@@ -1,124 +0,0 @@
1
- /** Lane runner (#47): ONE external CLI process → LaneResult. Spawns through the injected LaneSpawn
2
- * (default lanes/process.ts bunLaneSpawn = the executor's tree-kill path), reads stdout line by line,
3
- * feeds the adapter's parse(), keeps a bounded log ring (the running preview), reports every event to
4
- * the caller, enforces the wall-clock budget, and cancels in the order the CLIs want: SIGINT first for
5
- * the ones that finish their turn on it (claude/opencode), the tree kill after a grace — or at once for
6
- * the others — then the reader is abandoned after ABORT_GRACE_MS so an orphan holding the pipe cannot
7
- * park the job. Every event also folds into the run's counters (lanes/progress.ts) — tool calls, confirmed
8
- * file writes, usage — which ride along with each onEvent so a surface can show what the lane has DONE
9
- * while it is still doing it, not just its last log line. Every timer is cleared on the way out (a pending timer would hold the process; a parked
10
- * promise with no timer hangs the Bun runner). A signal that is ALREADY aborted when the runner is called
11
- * spawns nothing at all (the job awaited its worktree meanwhile; executor.ts bunRunner's pre-aborted pin).
12
- * The verdict: cancelled > timed out > the CLI's own fail/done event > exit-code fallback (≠0 → fail;
13
- * 0 without a result event → fail, honestly). */
14
-
15
- import { ABORT_GRACE_MS } from "../core/executor.ts";
16
- import type { TokenUsage } from "../core/types.ts";
17
- import { addUsage, renderEvent } from "./events.ts";
18
- import { LaneTally, type LaneProgress } from "./progress.ts";
19
- import { bunLaneSpawn, type LaneProcess, type LaneSpawn } from "./process.ts";
20
- import { newParseState, type AgentAdapter, type LaneEvent, type LaneOpts, type LaneResult, type LaneTask } from "./types.ts";
21
-
22
- /** rendered event lines kept while a lane runs (the preview + the failure context) */
23
- export const LOG_RING = 200;
24
- /** SIGINT → tree kill grace for interruptFirst adapters (docs/test.md §3.6: dead within 5 s) */
25
- export const INTERRUPT_GRACE_MS = 3_000;
26
-
27
- export type KillStep = "interrupt" | "kill" | "abandon";
28
-
29
- export interface LaneRunnerDeps {
30
- spawn?: LaneSpawn;
31
- /** cancel: the TaskManager's per-task controller */
32
- signal?: AbortSignal;
33
- /** every parsed event, with the current log tail (≤3 lines) and the running counters — what the
34
- * lane has DONE so far (progress.ts), so a surface can show more than one log line */
35
- onEvent?: (ev: LaneEvent, tail: readonly string[], progress: LaneProgress) => void;
36
- graceMs?: number;
37
- /** the kill choreography, appended as it happens (tests pin the order) */
38
- steps?: KillStep[];
39
- }
40
-
41
- export class LogRing {
42
- private lines: string[] = [];
43
- constructor(readonly cap: number) {}
44
- push(line: string): void {
45
- this.lines.push(line);
46
- if (this.lines.length > this.cap) this.lines.splice(0, this.lines.length - this.cap);
47
- }
48
- tail(n = this.cap): string[] { return this.lines.slice(-n); }
49
- get length(): number { return this.lines.length; }
50
- }
51
-
52
- const msg = (e: unknown): string => (e instanceof Error ? e.message : String(e));
53
-
54
- export async function runExternalLane(adapter: AgentAdapter, task: LaneTask, opts: LaneOpts, deps: LaneRunnerDeps = {}): Promise<LaneResult> {
55
- // cancelled before the spawn (the job was still creating its worktree): nothing starts — executor.ts:110 idiom
56
- if (deps.signal?.aborted) return { status: "cancelled", summary: "", error: "cancelled", exitCode: null, log: [], garbage: 0, progress: new LaneTally().snapshot() };
57
- const cmd = opts.resume && adapter.resume ? adapter.resume(opts.resume, task.goal, opts) : adapter.command(task, opts);
58
- const ring = new LogRing(LOG_RING);
59
- const tally = new LaneTally();
60
- const st = newParseState();
61
- let proc: LaneProcess;
62
- try {
63
- proc = (deps.spawn ?? bunLaneSpawn)(cmd);
64
- } catch (e) {
65
- return { status: "failed", summary: "", error: `spawn failed: ${cmd.bin}: ${msg(e)}`, exitCode: null, log: [], garbage: 0, progress: tally.snapshot() };
66
- }
67
- let done: Extract<LaneEvent, { kind: "done" }> | undefined, fail: Extract<LaneEvent, { kind: "fail" }> | undefined;
68
- let usage: TokenUsage | undefined;
69
- let timedOut = false, cancelled = false, stopping = false;
70
- // every timer lands here and is cleared in finally — so a SIGINT that ends the turn inside the grace
71
- // (the runner returns) never fires the pending kill, and no timer outlives the lane
72
- const timers = new Set<ReturnType<typeof setTimeout>>();
73
- const later = (fn: () => void, ms: number): void => {
74
- const t = setTimeout(() => { timers.delete(t); fn(); }, ms);
75
- timers.add(t);
76
- };
77
- const step = (s: KillStep): void => { deps.steps?.push(s); };
78
- const killNow = (): void => {
79
- step("kill"); proc.kill();
80
- later(() => { step("abandon"); proc.abandon(); }, ABORT_GRACE_MS);
81
- };
82
- const stop = (): void => {
83
- if (stopping) return;
84
- stopping = true;
85
- if (adapter.interruptFirst && proc.interrupt()) { step("interrupt"); later(killNow, deps.graceMs ?? INTERRUPT_GRACE_MS); }
86
- else killNow();
87
- };
88
- const onAbort = (): void => { cancelled = true; stop(); };
89
- try {
90
- deps.signal?.addEventListener("abort", onAbort, { once: true }); // not aborted: checked above, and the spawn is synchronous
91
- later(() => { timedOut = true; stop(); }, Math.max(0, opts.timeoutMs));
92
- for await (const raw of proc.lines()) {
93
- const line = raw.trimEnd();
94
- if (!line) continue;
95
- let events: LaneEvent[];
96
- try { events = adapter.parse(line, st); } catch { st.garbage++; continue; }
97
- for (const ev of events) {
98
- ring.push(renderEvent(ev));
99
- tally.add(ev); // the counters and the log line come off the SAME event — nothing is parsed twice
100
- if (ev.kind === "done") done = ev;
101
- else if (ev.kind === "fail") fail = ev;
102
- else if (ev.kind === "usage") usage = addUsage(usage, ev.usage);
103
- deps.onEvent?.(ev, ring.tail(3), tally.snapshot());
104
- }
105
- }
106
- // EOF: the process is gone or about to be — never wait on it unbounded (an abandoned pipe may
107
- // belong to a launcher that is still alive)
108
- let waitTimer: ReturnType<typeof setTimeout> | undefined;
109
- const code = await Promise.race([proc.exited, new Promise<null>((r) => { waitTimer = setTimeout(() => r(null), ABORT_GRACE_MS); })]);
110
- clearTimeout(waitTimer);
111
- const sessionId = done?.sessionId ?? fail?.sessionId ?? st.sessionId;
112
- const base = { exitCode: code, log: ring.tail(), garbage: st.garbage, progress: tally.snapshot(), ...(usage ? { usage } : {}), ...(sessionId ? { sessionId } : {}) };
113
- if (cancelled) return { ...base, status: "cancelled", summary: "", error: "cancelled" };
114
- if (timedOut) return { ...base, status: "failed", summary: "", error: `timed out after ${opts.timeoutMs}ms` };
115
- if (fail) return { ...base, status: "failed", summary: "", error: fail.error };
116
- if (done) return { ...base, status: "done", summary: done.summary || st.lastText || "" };
117
- const err = proc.stderrTail();
118
- if (code !== 0) return { ...base, status: "failed", summary: "", error: `${cmd.bin} exited with code ${code ?? "?"} without a result${err ? `: ${err.slice(-300)}` : ""}` };
119
- return { ...base, status: "failed", summary: "", error: `${cmd.bin} exited 0 without a result event${err ? `: ${err.slice(-300)}` : ""}` };
120
- } finally {
121
- deps.signal?.removeEventListener("abort", onAbort);
122
- for (const t of timers) clearTimeout(t);
123
- }
124
- }
@@ -1,112 +0,0 @@
1
- /** External agentic-CLI lanes (port #47): the adapter contract between rovecode's TaskManager and a
2
- * headless coding CLI — claude code, codex, opencode, antigravity (`agy`). Source: the user's own
3
- * notes, sextant docs/agentic-clis.md §1 (adapter = command() + parse() + resume()) and §3 (the
4
- * event → lane mapping table); flags verified against the official docs on 2026-09-02.
5
- * A lane is a JOB of core/tasks.ts (TaskInfo.kind "external"), never a second loop (ADR-003/013):
6
- * the CLI's JSONL stdout becomes LaneEvents, the events become TaskInfo updates, the process rides
7
- * the executor's tree-kill path (lanes/process.ts over core/win-job.ts), and the lane works in its
8
- * OWN git worktree whose diff merges back as a patch — exactly like an isolated child. */
9
-
10
- import type { TokenUsage } from "../core/types.ts";
11
- import type { LaneProgress } from "./progress.ts";
12
-
13
- export type AdapterId = "claude" | "codex" | "opencode" | "agy";
14
- export const ADAPTER_IDS: readonly AdapterId[] = ["claude", "codex", "opencode", "agy"];
15
- export const isAdapterId = (s: unknown): s is AdapterId =>
16
- typeof s === "string" && (ADAPTER_IDS as readonly string[]).includes(s);
17
-
18
- export interface LaneTask { goal: string; label?: string }
19
-
20
- export interface LaneOpts {
21
- /** the lane's working directory — its OWN isolated worktree, never the parent tree */
22
- cwd: string;
23
- /** claude: `--allowedTools` rules ("Read", "Bash(npm test)"); the other CLIs have no allowlist flag */
24
- allowlist?: string[];
25
- /** claude: pass `--bare` (the table's CI shape — auth is STRICTLY `ANTHROPIC_API_KEY`; the CLI's own
26
- * login is never read). Default true; the registry sets false when the lane env has no key so the
27
- * lane runs on the CLI's login instead (verified 2026-09-03: `--bare` without a key exits 1 at once,
28
- * `apiKeySource: "none"`; without `--bare` the same CLI reads its OAuth login). */
29
- bare?: boolean;
30
- /** claude: the lane env carries `CLAUDE_CODE_OAUTH_TOKEN` (`claude setup-token`, the documented headless
31
- * login; the process seam keeps it). Label only — the card's auth word becomes `oauth token` instead of
32
- * `cli login`; under `--bare` the word stays `bare` (`--help`: strictly ANTHROPIC_API_KEY, the token is never read). */
33
- oauthToken?: boolean;
34
- /** codex: `--sandbox`; default workspace-write (danger-full-access is deliberately not offered) */
35
- sandbox?: "read-only" | "workspace-write";
36
- /** wall-clock cutter enforced by the runner; agy also receives it as `--print-timeout` */
37
- timeoutMs: number;
38
- model?: string;
39
- /** agy ONLY: an explicit allow-all adds `--dangerously-skip-permissions`; default = the soft-deny path */
40
- allowAll?: boolean;
41
- /** codex: `-o/--output-last-message` target; default = a file under the OS temp dir */
42
- lastMessageFile?: string;
43
- /** opencode: `--attach <url>` of a running `opencode serve` */
44
- attach?: string;
45
- /** continue a previous lane session (`--resume` / `exec resume` / `-s` / `--conversation`) */
46
- resume?: string;
47
- }
48
-
49
- export interface LaneCommand { bin: string; args: string[]; env?: Record<string, string>; stdin?: string; cwd: string }
50
-
51
- /** The lane DSL (agentic-clis.md §1/§3): what the crew board and the TaskInfo updates consume. */
52
- export type LaneEvent =
53
- | { kind: "log"; text: string }
54
- /** `wrote` means the CLI CONFIRMED this write (a tool result, a completed change) — never merely that
55
- * the path appeared in a tool's arguments. lanes/progress.ts counts files on that flag alone. */
56
- | { kind: "edit"; path: string; op: "edit" | "write" | "delete"; callId?: string; wrote?: true }
57
- | { kind: "bash"; command: string; output?: string; exitCode?: number; callId?: string }
58
- /** a tool that is neither a file edit nor a shell command (read, grep, todo, a CLI's own) — kept as a
59
- * COUNTABLE event rather than folded into `log`, so "12 tool calls" includes the twenty greps a lane
60
- * really made instead of silently reading zero */
61
- | { kind: "tool"; name: string; detail?: string; callId?: string }
62
- | { kind: "ask"; text: string }
63
- | { kind: "progress"; text: string }
64
- | { kind: "done"; summary: string; sessionId?: string }
65
- | { kind: "fail"; error: string; sessionId?: string }
66
- | { kind: "usage"; usage: TokenUsage };
67
-
68
- export interface LaneParseState {
69
- /** lines that were not JSON objects with a `type` — skipped and counted, never thrown */
70
- garbage: number;
71
- /** the CLI's own session/thread/conversation id, for resume() */
72
- sessionId?: string;
73
- /** the last agent text seen: the summary fallback when the terminal event carries none */
74
- lastText?: string;
75
- /** adapter scratch (pending tool ids and their paths, partial text, dedupe keys) */
76
- scratch: Record<string, unknown>;
77
- }
78
- export const newParseState = (): LaneParseState => ({ garbage: 0, scratch: {} });
79
-
80
- export interface AgentAdapter {
81
- id: AdapterId;
82
- /** SIGINT finishes the current turn for this CLI: the runner interrupts first, kills after a grace */
83
- interruptFirst: boolean;
84
- /** dry-run-able argv — EXACTLY the flags of agentic-clis.md §2, no process started */
85
- command(task: LaneTask, opts: LaneOpts): LaneCommand;
86
- /** one stdout line → zero or more lane events; garbage is skipped and counted, never thrown */
87
- parse(line: string, st: LaneParseState): LaneEvent[];
88
- /** continue the CLI's own session with a follow-up prompt */
89
- resume?(sessionId: string, followUp: string, opts: LaneOpts): LaneCommand;
90
- /** the lane's OWN permission flags, stated on the approval card BEFORE the lane starts */
91
- permissionSummary(opts: LaneOpts): string;
92
- /** attached to a `done` whose worktree diff is EMPTY (agy: soft-deny exits 0 having done nothing) */
93
- emptyDiffNote?: string;
94
- }
95
-
96
- export interface LaneResult {
97
- status: "done" | "failed" | "cancelled";
98
- /** what the lane did, folded from its own events (lanes/progress.ts) — present on every outcome,
99
- * including a cancel, because "it made 9 calls and wrote 2 files before you stopped it" is exactly
100
- * what a cancelled lane should still be able to tell you */
101
- progress: LaneProgress;
102
- /** the CLI's final message (done); empty otherwise */
103
- summary: string;
104
- error?: string;
105
- usage?: TokenUsage;
106
- sessionId?: string;
107
- /** null = the process had not exited when the runner gave up waiting (abandoned pipe) */
108
- exitCode: number | null;
109
- /** bounded tail of the rendered event log (runner LOG_RING lines) */
110
- log: string[];
111
- garbage: number;
112
- }