rovecode 0.3.3 → 0.4.0-beta.3

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