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,493 +0,0 @@
1
- /** Sextant surface (Wave 4, ports #40-#46) — the shared type contract every `src/sextant/*`
2
- * module builds against. Ported from the user's own sextant v0.4.0 prototype (term.js cell
3
- * buffer, app.js state `S`, layout(), themes); the mock scenario/fixture fields are gone and
4
- * every panel is fed by real rovecode seams (RunEvent stream, SessionStore, TaskManager, todos.json,
5
- * approval + ask_user seams, model catalog).
6
- *
7
- * Rules for the whole directory (ADR-001/002/003 + the Bun test hazards):
8
- * - structural interfaces (ScreenLike) so panels, input and the pet compile and test before the
9
- * core renderer lands; only screen.ts implements ScreenLike for real;
10
- * - pure modules (model, the draw modules, pet, layout, engine, frame) take `now` as a
11
- * parameter — no Date.now(), no timers, no process access; the ONE interval lives in
12
- * sextant-renderer.ts;
13
- * - one cell per code point unless screen.ts measures otherwise; -1 means "unset" for colors;
14
- * - this file is types + tiny constants only: no I/O, no imports beyond rovecode type modules. */
15
-
16
- import type { RunEvent } from "../core/types.ts";
17
- import type { TaskInfo } from "../core/tasks.ts";
18
- import type { TodoItem } from "../tools/todo.ts";
19
- import type { QuestionPrompt } from "../tools/ask-user.ts";
20
-
21
- // ------------------------------------------------------------------ styling
22
-
23
- /** attribute bits (term.js `A`) */
24
- export const ATTR = { BOLD: 1, DIM: 2, ITALIC: 4, UNDERLINE: 8, INVERSE: 16, STRIKE: 32 } as const;
25
-
26
- /** packed 0xRRGGBB colors; -1 = unset (inherit the cell's current value) */
27
- export interface Style { fg: number; bg: number; a: number }
28
- /** a text run: [string, style]; an undefined style means "unstyled" */
29
- export type Seg = readonly [string, Style | undefined];
30
-
31
- export interface Rect { x: number; y: number; w: number; h: number }
32
-
33
- /** The cell-buffer surface every draw function paints on (term.js Screen, minus I/O).
34
- * Coordinates are 0-based cells; writes outside the buffer are clipped, never thrown. */
35
- export interface ScreenLike {
36
- readonly w: number;
37
- readonly h: number;
38
- /** write a string at (x,y); returns the x after the last cell written */
39
- put(x: number, y: number, str: string, st?: Style, maxW?: number): number;
40
- /** write segments clipped to maxW; returns the x after the last cell */
41
- text(x: number, y: number, segs: readonly Seg[], maxW?: number): number;
42
- /** clipped text with a trailing ellipsis when it does not fit */
43
- clip(x: number, y: number, str: string, st: Style | undefined, maxW: number): number;
44
- fill(x: number, y: number, w: number, h: number, ch: string, st?: Style): void;
45
- /** recolor a rectangle's background only */
46
- tint(x: number, y: number, w: number, h: number, bg: number): void;
47
- hline(x: number, y: number, w: number, st?: Style, ch?: string): void;
48
- vline(x: number, y: number, h: number, st?: Style, ch?: string): void;
49
- /** rounded box (╭╮╰╯); bgFill paints the interior first when given */
50
- box(x: number, y: number, w: number, h: number, st?: Style, bgFill?: number): void;
51
- }
52
-
53
- // ------------------------------------------------------------------ themes
54
-
55
- export type ThemeName = "night" | "ember" | "contrast";
56
- export const THEME_ORDER: readonly ThemeName[] = ["night", "ember", "contrast"];
57
-
58
- /** buildTheme() output: the palette (app.js THEMES) plus derived mixes, all packed ints */
59
- export interface Theme {
60
- name: ThemeName;
61
- label: string;
62
- bg: number; bg2: number; fg: number; fg2: number; muted: number; dim: number;
63
- rule: number; rule2: number; accent: number; accent2: number;
64
- ok: number; err: number; warn: number; info: number; str: number; ty: number;
65
- /** derived: mix(bg, accent, .12) / mix(bg, ok, .15) / mix(bg, err, .15) / mix(bg, fg, .08) */
66
- hlBg: number; addBg: number; delBg: number; selBg: number;
67
- /** derived: mix(bg, accent, .45) / mix(bg, ok, .55) / mix(bg, fg2, .55) */
68
- accentDim: number; okDim: number; mixDim: number;
69
- /** derived frame colors: mix(bg, fg, .28) and .17 */
70
- frame: number; frameDim: number;
71
- }
72
-
73
- // ------------------------------------------------------------------ input
74
-
75
- export interface KeyEvent {
76
- type: "key";
77
- /** "up" "down" "left" "right" "home" "end" "pageup" "pagedown" "insert" "delete" "enter" "tab"
78
- * "shift-tab" "backspace" "escape" "space" "f1".."f12", a single character, or "unknown".
79
- * "space" is Ctrl+Space (the NUL byte) ONLY — the space bar arrives as the character " " with
80
- * `ch: " "` (input.ts CTRL_NAMES); consumers that insert text must accept both. */
81
- name: string;
82
- /** the printable character for plain keys (and the letter for alt+letter) */
83
- ch?: string;
84
- ctrl?: boolean;
85
- alt?: boolean;
86
- shift?: boolean;
87
- }
88
- /** SGR mouse report: b = button bits (0 left, 1 middle, 2 right, 32 = motion/drag, 64/65 = wheel
89
- * up/down), 0-based cell coordinates, press = "M" (press/motion) vs release "m" */
90
- export interface MouseEvent { type: "mouse"; b: number; x: number; y: number; press: boolean }
91
- /** bracketed paste (CSI 200~ … 201~) delivered as ONE event so multi-line pastes never submit */
92
- export interface PasteEvent { type: "paste"; text: string }
93
- export type InputEvent = KeyEvent | MouseEvent | PasteEvent;
94
-
95
- /** a click zone a drawer registered while painting the current frame (drawSuggest / drawPalette /
96
- * drawHelp / the pet panel); keys.ts walks the list in REVERSE so the last registered zone under
97
- * the pointer wins (overlays sit above panels) */
98
- export interface HitZone {
99
- rect: Rect;
100
- onClick: () => void;
101
- /** a key replayed through handleInput after onClick (e.g. Enter to run the row just selected) */
102
- key?: KeyEvent;
103
- /** a zone that can be GRABBED: a click inside it makes it the active drag target and every following
104
- * left-button drag event (until the release) calls this with the pointer's row and the rows moved
105
- * since the press — the scrollbar thumbs use `dy` to slide proportionally, so the thumb stays under
106
- * the finger wherever it was grabbed. The closure captures the frame's geometry at grab time. */
107
- onDrag?: (y: number, dy: number) => void;
108
- }
109
-
110
- /** The terminal the renderer drives (#44): the ONE place raw stdin/stdout live. tui/sextant-io.ts
111
- * implements it over the process streams (+ the Windows VT-input helper); tests and the smoke use
112
- * an in-memory double. `env` is the process environment the renderer reads ROVECODE_PET/ROVECODE_THEME from. */
113
- export interface TerminalIO {
114
- write(s: string): void;
115
- /** raw input chunks (utf8); returns the unsubscribe */
116
- onInput(cb: (chunk: string) => void): () => void;
117
- onResize(cb: (cols: number, rows: number) => void): () => void;
118
- size(): { cols: number; rows: number };
119
- enterRaw(): void;
120
- leaveRaw(): void;
121
- env: Readonly<Record<string, string | undefined>>;
122
- }
123
-
124
- // ------------------------------------------------------------------ layout
125
-
126
- /** layout(w, h, opts) → panel rectangles. Breakpoints (app.js layout()): files column at
127
- * w ≥ 140 (30 wide at ≥150, else 26); right column (plan + usage) at w ≥ 110 (34 / 28);
128
- * messages = max(8, round(contentH · 0.34)) rows; usage 5 rows; pet 14 rows when contentH ≥ 36
129
- * (under files when present, else under plan); null = hidden at this size. */
130
- export interface Layout {
131
- w: number;
132
- h: number;
133
- /** outer frame (title in the top border, key hints in the bottom border) */
134
- frame: Rect;
135
- files: Rect | null;
136
- code: Rect;
137
- messages: Rect;
138
- plan: Rect | null;
139
- usage: Rect | null;
140
- pet: Rect | null;
141
- }
142
- export interface LayoutOptions { pet: boolean }
143
-
144
- // ------------------------------------------------------------------ model (state)
145
-
146
- /** git porcelain classes shown next to a file: M modified · A added/untracked · D deleted */
147
- export type FileStatus = "M" | "A" | "D";
148
-
149
- /** one row of the flattened tree (drawFiles consumes rows, not the tree) */
150
- export interface TreeRow {
151
- /** cwd-relative posix path ("src/auth/callback.ts" or "src/auth" for a dir) */
152
- path: string;
153
- name: string;
154
- depth: number;
155
- dir: boolean;
156
- expanded?: boolean;
157
- status?: FileStatus;
158
- /** a collapsed dir containing changed files shows "·" */
159
- hasChanges?: boolean;
160
- /** the agent touched this file (read/edit/write) — diamond spinner until this clock */
161
- touchedUntil?: number;
162
- }
163
-
164
- export interface FilesState {
165
- /** all cwd-relative posix file paths (gitListFiles, or a bounded walk when git is absent) */
166
- paths: string[];
167
- statuses: Map<string, FileStatus>;
168
- expanded: Set<string>;
169
- touched: Map<string, number>;
170
- cursor: number;
171
- scroll: number;
172
- /** bumped at every mutation of paths/statuses/expanded/touched so treeRows can cache by (version, now) */
173
- version: number;
174
- }
175
-
176
- export interface RepoInfo { name: string; branch: string | null; modified: number }
177
-
178
- /** activity shown in the frame header (with the run timer) and driving the pet's mood */
179
- export type ActivityState =
180
- | "IDLE" | "THINKING" | "WRITING" | "READING" | "EDITING" | "RUNNING" | "TESTING"
181
- | "WAITING" | "DELEGATING" | "SUCCESS" | "ERROR";
182
-
183
- export interface ActivityInfo {
184
- state: ActivityState;
185
- /** e.g. "editing callback.ts", "running tests", "waiting for you" */
186
- label: string;
187
- runId: string | null;
188
- startedAt: number | null;
189
- endedAt: number | null;
190
- /** clock of the transition into ERROR (the pet's storm trigger); absent until the first error */
191
- errorAt?: number;
192
- /** the provider turn in flight: when the loop called the model (turn_start) — absent once a tool
193
- * runs, the turn ends or the run ends, so the live line only paints while the model itself is busy */
194
- turnAt?: number;
195
- /** estimated output tokens streamed so far in that turn — reasoning plus answer text */
196
- tokens?: number;
197
- }
198
-
199
- export type CodeMode = "code" | "diff" | "run" | "agents" | "search";
200
-
201
- export interface DiffHunk {
202
- /** rendered rows: prefix " " | "+" | "-" plus the line text */
203
- rows: { op: " " | "+" | "-"; text: string }[];
204
- oldStart: number;
205
- newStart: number;
206
- }
207
-
208
- export interface CodeState {
209
- mode: CodeMode;
210
- /** file shown in code/diff mode (cwd-relative) */
211
- file: string | null;
212
- /** current file contents (disk) or null when unreadable */
213
- content: string | null;
214
- /** [fromLine, toLine] 1-based highlight (the anchor range of the last edit / read) */
215
- hl: [number, number] | null;
216
- scroll: number;
217
- /** last glob/grep result lines */
218
- search: { query: string; lines: string[] } | null;
219
- /** last bash call: command, output lines (10k-char tool bound applies), verdict, and the exit
220
- * code from the tool's `exit=N` header once the call ended (absent while running / unparsable) */
221
- run: { cmd: string; lines: string[]; status: "running" | "ok" | "fail"; exitCode?: number } | null;
222
- /** pre-approval preview or post-edit hunks; `base: "head"` marks a HEAD-vs-disk view (no pre-edit
223
- * content — the /diff command, or an ungated edit whose base could not be rebuilt): cumulative
224
- * over every uncommitted change, so the title says `vs HEAD` and the row keeps its own counts */
225
- diff: { file: string; hunks: DiffHunk[]; add: number; del: number; base?: "head" } | null;
226
- /** agents board selection */
227
- lane: number;
228
- laneOpen: boolean;
229
- }
230
-
231
- /** compact tool row in the messages panel: `· read x` `~ edit x +a −b` `+ write x` `− remove x`
232
- * `$ run cmd … last line` — verb/glyph derived from the tool name */
233
- export interface ToolRow {
234
- kind: "tool";
235
- callId: string;
236
- tool: string;
237
- /** "read" | "edit" | "write" | "remove" | "run" | "search" | "fetch" | "task" | "other" */
238
- verb: string;
239
- /** what the row names: basename, command head, url host… */
240
- label: string;
241
- /** cwd-relative posix path for file tools (read/edit/write/remove) — the code panel target */
242
- path?: string;
243
- running: boolean;
244
- ok?: boolean;
245
- /** trailing summary: "18 passed", "+21 −4", "N lines", first output line… */
246
- detail?: string;
247
- add?: number;
248
- del?: number;
249
- ms?: number;
250
- }
251
-
252
- export type MessageRow =
253
- /** `at` = the clock the line was sent (renderer addUser); the `· sent` tag fades 1.4 s after it */
254
- | { kind: "user"; text: string; /** image chips `[image: name]` */ images?: string[];
255
- /** `@file` chips — "src/x.ts · 120 lines": the attached read blocks are in the session, never in the panel (mentions.ts) */
256
- files?: string[]; at?: number }
257
- /** `id` = the RunEvent messageId the streaming row belongs to (absent on replayed/summary rows) */
258
- | { kind: "assistant"; text: string; streaming: boolean; id?: string }
259
- | ToolRow
260
- | { kind: "system"; text: string; tone: "info" | "warn" | "error" }
261
- /** a steering note that reached the run (task completion, reflection nudge) */
262
- | { kind: "steer"; text: string }
263
- | { kind: "compaction"; text: string };
264
-
265
- /** the modal card rendered inside the messages panel (ONE at a time) */
266
- export type CardState =
267
- | {
268
- kind: "approval";
269
- tool: string;
270
- argsPreview: string;
271
- /** port #24 unified diff preview when the tool is edit/write */
272
- detail?: string;
273
- /** the buttons this card offers, in order — an edit/write card carries the extra `all-edits`
274
- * door, everything else keeps allow · always · deny */
275
- verdicts: readonly ("once" | "always" | "all-edits" | "deny")[];
276
- /** index into `verdicts` */
277
- selected: number;
278
- resolve: (answer: "once" | "always" | "all-edits" | "deny") => void;
279
- }
280
- | {
281
- kind: "question";
282
- prompt: QuestionPrompt;
283
- /** option index; options.length = the free-text row when allowed; +1 = "skip" */
284
- selected: number;
285
- freeText: string;
286
- resolve: (answer: { kind: "option"; index: number } | { kind: "text"; text: string } | null) => void;
287
- };
288
-
289
- export interface UsageState {
290
- provider: string;
291
- model: string;
292
- /** the thinking dial as the runtime holds it ("auto" | "off" | "low" | …); painted in the footer tag
293
- * next to the model so the person can see what the answer is costing them; unset = not reported */
294
- effort?: string;
295
- turns: number;
296
- tokensIn: number;
297
- tokensOut: number;
298
- /** 0..100 estimated context fill, null when the window is unknown */
299
- contextPct: number | null;
300
- /** the inputs behind contextPct when known: estimated tokens in the prompt + the model's window */
301
- contextTokens?: number;
302
- contextWindow?: number;
303
- /** null = unpriced */
304
- costUsd: number | null;
305
- }
306
-
307
- export interface PlanState {
308
- todos: TodoItem[];
309
- /** loader note (corrupt todos.json) */
310
- note?: string;
311
- }
312
-
313
- export interface InputState {
314
- text: string;
315
- cur: number;
316
- history: string[];
317
- histIdx: number;
318
- /** selected row in the suggestion box; -1 = the box was dismissed with Esc and stays hidden until
319
- * the text changes (keys.ts resets it to 0 on every edit) */
320
- sgSel: number;
321
- }
322
-
323
- export type Focus = "messages" | "code" | "files";
324
-
325
- /** Which panel occupies the MAIN slot when the terminal is too narrow to show them side by side
326
- * (layout.ts hides files under 140 columns and the plan column under 110). The tab strip on the main
327
- * panel's border pages between them; on a wide terminal every panel is on screen and `page` is inert. */
328
- export type Page = "code" | "files" | "plan";
329
- export const PAGES: readonly Page[] = ["code", "files", "plan"];
330
-
331
- export interface Toast { text: string; until: number; tone: "info" | "warn" | "error" }
332
-
333
- /** A notification worth keeping after its toast fades: a run finishing, a failed tool, a card
334
- * waiting for the human. Toasts are the transient surface (three seconds, top right); notices are
335
- * the record behind them, so what you missed while looking away can be read back (⌃b / /notices). */
336
- export interface Notice {
337
- id: number;
338
- /** clock when it happened */
339
- at: number;
340
- tone: Toast["tone"];
341
- kind: "done" | "error" | "approval" | "info";
342
- text: string;
343
- /** cleared when the history is opened */
344
- read: boolean;
345
- }
346
- /** the history keeps this many; older notices fall off the front */
347
- export const MAX_NOTICES = 50;
348
-
349
- export interface PaletteState {
350
- query: string;
351
- sel: number;
352
- /** flat items: label + what pressing enter does (a slash line, a renderer-local action, or
353
- * `pick:<value>` for a Renderer.pickOne picker); `hint` overrides the derived right-hand hint */
354
- items: { label: string; group: string; action: string; hint?: string }[];
355
- /** what this palette IS, shown on the box: the command palette says nothing and keeps its default,
356
- * a Renderer.pickOne picker names what is being picked. Painted clipped — a caller's sentence is
357
- * not a layout contract. */
358
- title?: string;
359
- }
360
-
361
- import type { MarketState } from "./draw-market.ts";
362
- import type { ContextState } from "./draw-context.ts";
363
- import type { LiveRuntime } from "./context-source.ts";
364
-
365
- /** the whole surface state — owned by model.ts (pure `applyEvent`) and mutated by keys.ts */
366
- export interface SextantState {
367
- cwd: string;
368
- repo: RepoInfo;
369
- files: FilesState;
370
- activity: ActivityInfo;
371
- code: CodeState;
372
- messages: MessageRow[];
373
- /** messages scroll offset; stick = follow the tail */
374
- msgScroll: number;
375
- stick: boolean;
376
- card: CardState | null;
377
- plan: PlanState;
378
- crew: TaskInfo[];
379
- usage: UsageState;
380
- input: InputState;
381
- focus: Focus;
382
- /** the panel in the main slot on a narrow terminal (see Page); "code" on a wide one */
383
- page: Page;
384
- palette: PaletteState | null;
385
- /** the market overlay (/market, ⌃m); null when it is closed — see draw-market.ts */
386
- market: MarketState | null;
387
- /** the context overlay (/context); null when it is closed — see draw-context.ts */
388
- context: ContextState | null;
389
- /** the connect wizard (/connect, /setup); null when it is closed — see draw-wizard.ts */
390
- wizard: import("./draw-wizard.ts").WizardState | null;
391
- help: boolean;
392
- toasts: Toast[];
393
- /** the notification history behind the toasts (Notice); newest last */
394
- notices: Notice[];
395
- /** images staged for the next user message (names), shown as chips above the prompt; synced from
396
- * SextantAttach.staged() each tick — the store owns the stage, this is the painted mirror */
397
- staged: string[];
398
- /** first Esc while busy arms "again to stop" until this clock */
399
- escUntil: number;
400
- /** two-press ⌃c guarantee (renderer-level): a ⌃c while busy interrupts and arms this clock; a
401
- * second ⌃c before it quits even if the interrupted run has not settled yet */
402
- ctrlCUntil?: number;
403
- running: boolean;
404
- mode: "plan" | "act";
405
- yolo: boolean;
406
- /** the middle permission tier — painted next to plan/auto in the frame footer */
407
- acceptEdits?: boolean;
408
- theme: ThemeName;
409
- /** boot clock for the staggered panel reveal (90 ms steps) */
410
- bootAt: number;
411
- /** slash commands known to the prompt/palette (built-ins + custom) */
412
- /** the app's slash commands for the palette and the suggestions; `choices` = a fixed argument set
413
- * offered once the command is typed (tui/renderer.ts SlashCommand.choices) */
414
- commands: { name: string; description: string; choices?: readonly string[] | (() => readonly string[]); choicesThen?: "submit" | "complete" }[];
415
- version: string;
416
- }
417
-
418
- // ------------------------------------------------------------------ seams
419
-
420
- /** what the renderer receives from the ONE controller (app.ts runTui) beyond the Renderer
421
- * interface: raw RunEvents (paths, diffs, outputs) and the runtime handles the panels read */
422
- export interface SextantAttach {
423
- cwd: string;
424
- sessionsDir: string;
425
- /** the ACTIVE session store (changes on /sessions /resume /new) */
426
- store(): { id: string };
427
- tasks: { list(): TaskInfo[]; subscribe(fn: (t: TaskInfo) => void): () => void };
428
- model(): { provider: string; model: string };
429
- /** context window for the usage bar; undefined when the catalog does not know the model */
430
- contextWindow(): number | undefined;
431
- /** session accounting for the usage panel (tui/cost.ts math over the ACTIVE store): cost priced
432
- * per message at its origin model (null = unpriced), context = estimated prompt tokens */
433
- usage?(): { costUsd: number | null; contextTokens: number };
434
- /** Everything /context needs and no other panel does: the transcript to count, the catalog to look a
435
- * model's window and pricing up in, and the LIVE runtime.
436
- *
437
- * The runtime is the point. `rovecode context` on a shell has to BUILD one to learn the system prompt
438
- * and the tool schemas, and in a fresh session those two are most of the window; here they already
439
- * exist. Optional all the same — a surface that cannot supply this (a headless dump, a test) still
440
- * opens the panel, and the panel says its total is a floor rather than under-reporting in silence. */
441
- contextInputs?(): {
442
- messages: readonly unknown[];
443
- lookup: (r: { provider: string; model: string }) => unknown;
444
- runtime: LiveRuntime | null;
445
- };
446
- /** Re-read the MCP files and connect anything new, in this session. The market overlay calls it after
447
- * installing an MCP server so the answer is "connected" rather than "restart rovecode" — the tools
448
- * that reach a server (`mcp_list`, `mcp_call`) dispatch by name, so nothing else has to change.
449
- * Absent when the surface has no runtime behind it (the smoke harness, the tests). */
450
- reloadMcp?(): Promise<{ added: string[]; removed: string[]; failed: { name: string; error: string }[]; skipped: string[] }>;
451
- /** `--pet <name>`; the renderer's own option is the fallback */
452
- petName?: string;
453
- /** names of the images staged for the NEXT user message (tui/attach.ts stage on the active store),
454
- * read live each tick so the prompt can show them as chips before they are sent */
455
- staged?(): string[];
456
- /** port #54: stage one @image mention for the next message — the SAME stage /attach writes, so the
457
- * caps and the chip row stay that seam's. Absent in surfaces without a store behind them. */
458
- attachImage?(abs: string): void;
459
- /** the connect wizard (draw-wizard.ts): the provider rows step 1 lists (SETUP_PICKS + what the
460
- * registry already knows; a row may be a "your own URL" door that registers itself when chosen).
461
- * Absent in surfaces without a runtime — the wizard cannot open there. */
462
- wizardProviders?(): { key: string; label: string; configured?: boolean; local?: boolean; url?: "openai" | "anthropic" }[];
463
- /** register a url door's endpoint (providers/registry add, the user file) — the row the walk then keys */
464
- wizardRegister?(id: string, url: string, protocol: "openai" | "anthropic"): { ok: boolean; error?: string };
465
- /** store a pasted key (credentials file via auth.ts, never the transcript) and refresh the registry */
466
- wizardStoreKey?(provider: string, secret: string): { ok: boolean; error?: string };
467
- /** the models the registry can name for a provider — /models' own source, reused here */
468
- wizardModels?(provider: string): Promise<{ id: string; note?: string }[]>;
469
- /** the model step's activate answer: pin the checked rows as the provider's active list
470
- * (registry setModels — spec.models), empty = un-pin; makeDefault also becomes the default */
471
- wizardActivateModels?(provider: string, models: readonly string[], makeDefault?: string): { ok: boolean; error?: string; models?: string[] };
472
- /** the one test call + make-default (registry probe + setDefault, /setup's finish) */
473
- wizardTest?(provider: string, model: string): Promise<{ ok: boolean; detail: string }>;
474
- }
475
-
476
- /** pure reducer contract (model.ts): (state, event, now) → same state object, mutated in place */
477
- export type ApplyEvent = (s: SextantState, ev: RunEvent, now: number) => void;
478
-
479
- /** what a headless dump may inject (frame.ts FrameDeps is the concrete shape): the layout function,
480
- * per-panel painters and the layout options */
481
- export type PanelPainter = (scr: ScreenLike, rect: Rect, s: SextantState, theme: Theme, now: number) => void;
482
- export interface DumpFrameDeps {
483
- layout?: (w: number, h: number, opts: LayoutOptions) => Layout;
484
- painters?: Partial<Record<"frame" | "files" | "code" | "messages" | "plan" | "usage" | "pet", PanelPainter>>;
485
- layoutOpts?: LayoutOptions;
486
- }
487
- /** headless frame dump (frame.ts): deterministic at a fixed clock — the golden-test seam */
488
- export type DumpFrame = (s: SextantState, cols: number, rows: number, now: number, theme: Theme, deps?: DumpFrameDeps) => string;
489
-
490
- export const SEXTANT_MIN_COLS = 100;
491
- export const SEXTANT_MIN_ROWS = 30;
492
- /** the four spinner glyphs (SPIN in app.js) */
493
- export const SPIN: readonly string[] = ["◇", "◈", "◆", "◈"];