rovecode 0.4.0-beta.3 → 0.4.0

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 (432) hide show
  1. package/README.md +57 -72
  2. package/THIRD_PARTY_NOTICES.md +0 -44
  3. package/bin/rovecode.ts +21 -0
  4. package/package.json +16 -38
  5. package/src/account/keys.ts +97 -0
  6. package/src/account/login.ts +158 -0
  7. package/src/account/provision.ts +47 -0
  8. package/src/account/store.ts +63 -0
  9. package/src/acp/server.ts +373 -0
  10. package/src/cli/account-cmd.ts +116 -0
  11. package/src/cli/connect.ts +244 -0
  12. package/src/cli/context-cmd.ts +199 -0
  13. package/src/cli/dispatch.ts +109 -0
  14. package/src/cli/doctor.ts +324 -0
  15. package/src/cli/export.ts +278 -0
  16. package/src/cli/help.ts +240 -0
  17. package/src/cli/is-tui-invocation.ts +8 -0
  18. package/src/cli/main.ts +599 -0
  19. package/src/cli/market-cmd.ts +658 -0
  20. package/src/cli/mcp-market-cmd.ts +299 -0
  21. package/src/cli/output.ts +382 -0
  22. package/src/cli/repl.ts +172 -0
  23. package/src/cli/resume.ts +32 -0
  24. package/src/cli/run-limits.ts +78 -0
  25. package/src/cli/runtime.ts +792 -0
  26. package/src/cli/setup.ts +187 -0
  27. package/src/cli/update-cmd.ts +78 -0
  28. package/src/cli/workflow-cmd.ts +100 -0
  29. package/src/coding/checkpoints.ts +270 -0
  30. package/src/coding/diff.ts +136 -0
  31. package/src/coding/files.ts +339 -0
  32. package/src/coding/hashline.ts +319 -0
  33. package/src/coding/lsp.ts +406 -0
  34. package/src/coding/repomap-cache.ts +99 -0
  35. package/src/coding/repomap-files.ts +110 -0
  36. package/src/coding/repomap.ts +392 -0
  37. package/src/core/compaction.ts +399 -0
  38. package/src/core/config.ts +289 -0
  39. package/src/core/context-report.ts +228 -0
  40. package/src/core/context.ts +60 -0
  41. package/src/core/count-remote.ts +107 -0
  42. package/src/core/execpolicy-rules.ts +196 -0
  43. package/src/core/execpolicy.ts +385 -0
  44. package/src/core/executor.ts +397 -0
  45. package/src/core/guardrails.ts +400 -0
  46. package/src/core/hooks.ts +398 -0
  47. package/src/core/images.ts +230 -0
  48. package/src/core/intro.ts +236 -0
  49. package/src/core/loop.ts +621 -0
  50. package/src/core/modes.ts +372 -0
  51. package/src/core/orchestrator.ts +207 -0
  52. package/src/core/reflection.ts +165 -0
  53. package/src/core/sandbox-config.ts +167 -0
  54. package/src/core/session-images.ts +73 -0
  55. package/src/core/session.ts +398 -0
  56. package/src/core/settings.ts +98 -0
  57. package/src/core/stuck-detector.ts +273 -0
  58. package/src/core/tasks.ts +374 -0
  59. package/src/core/token-scale.ts +108 -0
  60. package/src/core/tool-output-budget.ts +166 -0
  61. package/src/core/tools.ts +288 -0
  62. package/src/core/types.ts +330 -0
  63. package/src/core/update-check.ts +171 -0
  64. package/src/core/update.ts +158 -0
  65. package/src/core/usage.ts +204 -0
  66. package/src/core/validate.ts +121 -0
  67. package/src/core/verify-gate.ts +159 -0
  68. package/src/core/verify.ts +237 -0
  69. package/src/core/voice.ts +158 -0
  70. package/src/core/win-job.ts +183 -0
  71. package/src/design/audit.ts +797 -0
  72. package/src/design/direction.ts +190 -0
  73. package/src/design/rules.ts +157 -0
  74. package/src/eval/bench.ts +150 -0
  75. package/src/eval/gauntlet-runner.ts +218 -0
  76. package/src/eval/gauntlet.ts +226 -0
  77. package/src/eval/grader.ts +186 -0
  78. package/src/eval/record.ts +202 -0
  79. package/src/eval/redact.ts +141 -0
  80. package/src/eval/replay.ts +147 -0
  81. package/src/eval/trajectory.ts +373 -0
  82. package/src/index.ts +17 -0
  83. package/src/market/catalogs/mcp-docs.json +111 -0
  84. package/src/market/catalogs/plugins.json +111 -0
  85. package/src/market/catalogs/skills.json +478 -0
  86. package/src/market/clone.ts +72 -0
  87. package/src/market/context-cost.ts +121 -0
  88. package/src/market/digest.ts +106 -0
  89. package/src/market/index.ts +22 -0
  90. package/src/market/install.ts +578 -0
  91. package/src/market/manifest.ts +187 -0
  92. package/src/market/prereq.ts +145 -0
  93. package/src/market/registry.ts +363 -0
  94. package/src/market/resolve.ts +111 -0
  95. package/src/market/types.ts +236 -0
  96. package/src/market/validate.ts +227 -0
  97. package/src/mcp/client.ts +431 -0
  98. package/src/mcp/config.ts +239 -0
  99. package/src/mcp/local-package.ts +211 -0
  100. package/src/mcp/market-catalog.ts +84 -0
  101. package/src/mcp/market-install.ts +289 -0
  102. package/src/mcp/market.ts +0 -0
  103. package/src/mcp/tools.ts +131 -0
  104. package/src/mcp/trust.ts +49 -0
  105. package/src/memory/blocks.ts +175 -0
  106. package/src/memory/recall.ts +355 -0
  107. package/src/memory/store.ts +105 -0
  108. package/src/memory/tools.ts +99 -0
  109. package/src/plugins/cli.ts +123 -0
  110. package/src/plugins/discover.ts +108 -0
  111. package/src/plugins/index.ts +50 -0
  112. package/src/plugins/init.ts +140 -0
  113. package/src/plugins/install.ts +184 -0
  114. package/src/plugins/load.ts +149 -0
  115. package/src/plugins/manifest.ts +106 -0
  116. package/src/plugins/state.ts +83 -0
  117. package/src/providers/auth.ts +293 -0
  118. package/src/providers/cache.ts +223 -0
  119. package/src/providers/catalog-local.ts +160 -0
  120. package/src/providers/catalog.ts +408 -0
  121. package/src/providers/middleware-context.ts +86 -0
  122. package/src/providers/middleware.ts +373 -0
  123. package/src/providers/profile-glm53.ts +111 -0
  124. package/src/providers/profile-sonnet5-persona.ts +65 -0
  125. package/src/providers/profile-sonnet5-voice.ts +23 -0
  126. package/src/providers/profiles.ts +156 -0
  127. package/src/providers/provider-config.ts +311 -0
  128. package/src/providers/registry.ts +302 -0
  129. package/src/providers/response-validation.ts +80 -0
  130. package/src/providers/retry.ts +234 -0
  131. package/src/providers/router.ts +294 -0
  132. package/src/providers/sse.ts +26 -0
  133. package/src/providers/stream-errors.ts +117 -0
  134. package/src/providers/stream.ts +569 -0
  135. package/src/providers/thinking.ts +189 -0
  136. package/src/providers/wire-messages.ts +129 -0
  137. package/src/sdk/client.ts +225 -0
  138. package/src/sdk/index.ts +3 -0
  139. package/src/server/dashboard.ts +144 -0
  140. package/src/server/http.ts +343 -0
  141. package/src/server/openapi.ts +246 -0
  142. package/src/sextant/card-hits.ts +102 -0
  143. package/src/sextant/card-keys.ts +55 -0
  144. package/src/sextant/context-source.ts +157 -0
  145. package/src/sextant/draw-agents.ts +273 -0
  146. package/src/sextant/draw-code.ts +388 -0
  147. package/src/sextant/draw-context.ts +222 -0
  148. package/src/sextant/draw-frame.ts +164 -0
  149. package/src/sextant/draw-market.ts +573 -0
  150. package/src/sextant/draw-messages.ts +386 -0
  151. package/src/sextant/draw-pet.ts +230 -0
  152. package/src/sextant/draw-plan.ts +159 -0
  153. package/src/sextant/draw-tabs.ts +85 -0
  154. package/src/sextant/draw-util.ts +65 -0
  155. package/src/sextant/engine.ts +230 -0
  156. package/src/sextant/frame-hits.ts +25 -0
  157. package/src/sextant/frame.ts +101 -0
  158. package/src/sextant/git-status.ts +197 -0
  159. package/src/sextant/grid.ts +59 -0
  160. package/src/sextant/input.ts +119 -0
  161. package/src/sextant/keys.ts +488 -0
  162. package/src/sextant/layout.ts +86 -0
  163. package/src/sextant/local-commands.ts +156 -0
  164. package/src/sextant/market-source.ts +287 -0
  165. package/src/sextant/mentions.ts +141 -0
  166. package/src/sextant/message-hits.ts +26 -0
  167. package/src/sextant/model.ts +387 -0
  168. package/src/sextant/overlays.ts +451 -0
  169. package/src/sextant/panel-hits.ts +38 -0
  170. package/src/sextant/pet.ts +399 -0
  171. package/src/sextant/screen.ts +324 -0
  172. package/src/sextant/scroll-hits.ts +66 -0
  173. package/src/sextant/scrollbar.ts +82 -0
  174. package/src/sextant/selection.ts +123 -0
  175. package/src/sextant/sextant-bridge.ts +174 -0
  176. package/src/sextant/sextant-cards.ts +142 -0
  177. package/src/sextant/sextant-diff-base.ts +63 -0
  178. package/src/sextant/sextant-files.ts +154 -0
  179. package/src/sextant/sextant-frame-loop.ts +314 -0
  180. package/src/sextant/sextant-renderer.ts +478 -0
  181. package/src/sextant/sextant-repo.ts +131 -0
  182. package/src/sextant/theme.ts +66 -0
  183. package/src/sextant/tool-rows.ts +189 -0
  184. package/src/sextant/types.ts +473 -0
  185. package/src/skills/index.ts +306 -0
  186. package/src/skills/tools.ts +69 -0
  187. package/src/skills/versioned.ts +227 -0
  188. package/src/telemetry/otel.ts +353 -0
  189. package/src/telemetry/otlp.ts +68 -0
  190. package/src/tools/ask-user.ts +156 -0
  191. package/src/tools/design.ts +151 -0
  192. package/src/tools/evalcell.ts +338 -0
  193. package/src/tools/html-text.ts +139 -0
  194. package/src/tools/provider.ts +149 -0
  195. package/src/tools/task.ts +216 -0
  196. package/src/tools/todo.ts +320 -0
  197. package/src/tools/webfetch.ts +331 -0
  198. package/src/tui/app.ts +608 -0
  199. package/src/tui/attach.ts +127 -0
  200. package/src/tui/checkpoints-cmd.ts +70 -0
  201. package/src/tui/clipboard-image.ts +81 -0
  202. package/src/tui/commands.ts +277 -0
  203. package/src/tui/cost.ts +108 -0
  204. package/src/tui/info-cmd.ts +144 -0
  205. package/src/tui/mcp-cmd.ts +128 -0
  206. package/src/tui/modes-cmd.ts +45 -0
  207. package/src/tui/overlays.ts +97 -0
  208. package/src/tui/pi-renderer.ts +424 -0
  209. package/src/tui/providers-cmd.ts +366 -0
  210. package/src/tui/renderer.ts +101 -0
  211. package/src/tui/replay-marker.ts +29 -0
  212. package/src/tui/session-cmd.ts +146 -0
  213. package/src/tui/sextant-attach.ts +68 -0
  214. package/src/tui/sextant-io.ts +184 -0
  215. package/src/tui/sextant-smoke.ts +110 -0
  216. package/src/tui/smoke.ts +72 -0
  217. package/src/tui/theme.ts +59 -0
  218. package/src/tui/todo-label.ts +7 -0
  219. package/src/workflow/engine.ts +266 -0
  220. package/tsconfig.json +30 -0
  221. package/vendor/pi-tui/LICENSE +21 -0
  222. package/vendor/pi-tui/PATCHES.md +12 -0
  223. package/vendor/pi-tui/PROVENANCE.md +12 -0
  224. package/vendor/pi-tui/README.upstream.md +854 -0
  225. package/vendor/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  226. package/vendor/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  227. package/vendor/pi-tui/src/alt-screen-search.ts +158 -0
  228. package/vendor/pi-tui/src/autocomplete.ts +827 -0
  229. package/vendor/pi-tui/src/components/alt-screen-flash.ts +52 -0
  230. package/vendor/pi-tui/src/components/box.ts +138 -0
  231. package/vendor/pi-tui/src/components/cancellable-loader.ts +41 -0
  232. package/vendor/pi-tui/src/components/editor.ts +2364 -0
  233. package/vendor/pi-tui/src/components/h-stack.ts +45 -0
  234. package/vendor/pi-tui/src/components/image.ts +128 -0
  235. package/vendor/pi-tui/src/components/input.ts +448 -0
  236. package/vendor/pi-tui/src/components/loader.ts +93 -0
  237. package/vendor/pi-tui/src/components/markdown.ts +1016 -0
  238. package/vendor/pi-tui/src/components/scroll-view.ts +217 -0
  239. package/vendor/pi-tui/src/components/select-list.ts +230 -0
  240. package/vendor/pi-tui/src/components/settings-list.ts +277 -0
  241. package/vendor/pi-tui/src/components/spacer.ts +29 -0
  242. package/vendor/pi-tui/src/components/stack.ts +155 -0
  243. package/vendor/pi-tui/src/components/text.ts +108 -0
  244. package/vendor/pi-tui/src/components/truncated-text.ts +66 -0
  245. package/vendor/pi-tui/src/components/v-stack.ts +34 -0
  246. package/vendor/pi-tui/src/editor-component.ts +75 -0
  247. package/vendor/pi-tui/src/fuzzy.ts +138 -0
  248. package/vendor/pi-tui/src/index.ts +149 -0
  249. package/vendor/pi-tui/src/keybindings.ts +321 -0
  250. package/vendor/pi-tui/src/keys.ts +1402 -0
  251. package/vendor/pi-tui/src/kill-ring.ts +47 -0
  252. package/vendor/pi-tui/src/latex.ts +1381 -0
  253. package/vendor/pi-tui/src/layout-node.ts +52 -0
  254. package/vendor/pi-tui/src/layout.ts +411 -0
  255. package/vendor/pi-tui/src/native-modifiers.ts +60 -0
  256. package/vendor/pi-tui/src/native-module-path.ts +32 -0
  257. package/vendor/pi-tui/src/stdin-buffer.ts +445 -0
  258. package/vendor/pi-tui/src/terminal-colors.ts +74 -0
  259. package/vendor/pi-tui/src/terminal-image.ts +701 -0
  260. package/vendor/pi-tui/src/terminal.ts +554 -0
  261. package/vendor/pi-tui/src/tui-alt-screen.ts +1379 -0
  262. package/vendor/pi-tui/src/tui-main-screen.ts +655 -0
  263. package/vendor/pi-tui/src/tui.ts +1264 -0
  264. package/vendor/pi-tui/src/undo-stack.ts +29 -0
  265. package/vendor/pi-tui/src/utils.ts +1327 -0
  266. package/vendor/pi-tui/src/word-navigation.ts +118 -0
  267. package/vendor/pi-tui/test/test-themes.ts +39 -0
  268. package/vendor/pi-tui/test/virtual-terminal.ts +219 -0
  269. package/CHANGELOG.md +0 -527
  270. package/bin/rovecode.js +0 -24
  271. package/dist/cli/app-j6gn14w3.js +0 -2
  272. package/dist/cli/ask-user-cwstt8fz.js +0 -2
  273. package/dist/cli/auth-login-9bbp9915.js +0 -2
  274. package/dist/cli/auth-m8p9grty.js +0 -2
  275. package/dist/cli/bench-16zqdms5.js +0 -9
  276. package/dist/cli/catalog-1xchffa4.js +0 -2
  277. package/dist/cli/cli-1n1zb64f.js +0 -2
  278. package/dist/cli/client-2t9gjkck.js +0 -2
  279. package/dist/cli/commands-exafvm2b.js +0 -2
  280. package/dist/cli/connect-6zde0kn3.js +0 -2
  281. package/dist/cli/context-cmd-5t43wgqt.js +0 -2
  282. package/dist/cli/context-report-kt01pw8y.js +0 -2
  283. package/dist/cli/count-remote-ap7x3vh6.js +0 -2
  284. package/dist/cli/design-ne5zszyh.js +0 -2
  285. package/dist/cli/dispatch-2r5myxye.js +0 -2
  286. package/dist/cli/doctor-ws4fh4tn.js +0 -3
  287. package/dist/cli/executor-bdrjn634.js +0 -2
  288. package/dist/cli/export-1mxb9g5p.js +0 -2
  289. package/dist/cli/files-g104xghh.js +0 -2
  290. package/dist/cli/gauntlet-07xrjpj7.js +0 -2
  291. package/dist/cli/gauntlet-runner-xvy64436.js +0 -10
  292. package/dist/cli/gauntlet-wave3-jm91yt5w.js +0 -5
  293. package/dist/cli/gauntlet-wave4-r13py7p1.js +0 -14
  294. package/dist/cli/hashline-znvrat11.js +0 -2
  295. package/dist/cli/http-xafw6fsh.js +0 -143
  296. package/dist/cli/index-1sgjm25y.js +0 -2
  297. package/dist/cli/init-g2m0tn4m.js +0 -51
  298. package/dist/cli/install-avaqjjqq.js +0 -2
  299. package/dist/cli/loop-mmpfft01.js +0 -2
  300. package/dist/cli/main-0904f6ps.js +0 -5
  301. package/dist/cli/main-0ab9fc26.js +0 -9
  302. package/dist/cli/main-0jys2ccn.js +0 -3
  303. package/dist/cli/main-0mtcdbs7.js +0 -3
  304. package/dist/cli/main-0z1w2zsg.js +0 -3
  305. package/dist/cli/main-1dchs7xv.js +0 -18
  306. package/dist/cli/main-1ereejm1.js +0 -3
  307. package/dist/cli/main-1k1kw6b5.js +0 -3
  308. package/dist/cli/main-27y4sm2k.js +0 -38
  309. package/dist/cli/main-2wwjex5j.js +0 -58
  310. package/dist/cli/main-2yeveeve.js +0 -6
  311. package/dist/cli/main-2yfck9b5.js +0 -3
  312. package/dist/cli/main-2zmzgkwh.js +0 -3
  313. package/dist/cli/main-351pz3z7.js +0 -7
  314. package/dist/cli/main-3gjqfh7a.js +0 -6
  315. package/dist/cli/main-3nf3kgve.js +0 -3
  316. package/dist/cli/main-3pjrb2hd.js +0 -3
  317. package/dist/cli/main-3rxcvgna.js +0 -19
  318. package/dist/cli/main-4b3jgy66.js +0 -19
  319. package/dist/cli/main-4wndhjdc.js +0 -7
  320. package/dist/cli/main-4xcmvxnk.js +0 -3
  321. package/dist/cli/main-5tbz0wbz.js +0 -4
  322. package/dist/cli/main-5ywnwthm.js +0 -3
  323. package/dist/cli/main-6b62vkz0.js +0 -14
  324. package/dist/cli/main-6dnk69vp.js +0 -3
  325. package/dist/cli/main-6genrmhs.js +0 -136
  326. package/dist/cli/main-73g7eff4.js +0 -15
  327. package/dist/cli/main-7c5thhjd.js +0 -5
  328. package/dist/cli/main-7rn6bqje.js +0 -3
  329. package/dist/cli/main-80haw7qk.js +0 -4
  330. package/dist/cli/main-875s60s2.js +0 -4
  331. package/dist/cli/main-8kjxbpw4.js +0 -8
  332. package/dist/cli/main-90ds1z4e.js +0 -10
  333. package/dist/cli/main-9etavkew.js +0 -3
  334. package/dist/cli/main-a9njrkk1.js +0 -3
  335. package/dist/cli/main-aecrjq2d.js +0 -12
  336. package/dist/cli/main-ck9asesq.js +0 -9
  337. package/dist/cli/main-cta9racd.js +0 -4
  338. package/dist/cli/main-ddv7j2ag.js +0 -3
  339. package/dist/cli/main-dfreez27.js +0 -10
  340. package/dist/cli/main-f7rw7des.js +0 -3
  341. package/dist/cli/main-ggcn7rd7.js +0 -5
  342. package/dist/cli/main-gzkmycnv.js +0 -3
  343. package/dist/cli/main-hq51jg8v.js +0 -18
  344. package/dist/cli/main-jft389w9.js +0 -8
  345. package/dist/cli/main-k1eqkg83.js +0 -3
  346. package/dist/cli/main-k2y8a2aw.js +0 -9
  347. package/dist/cli/main-kcpbykxz.js +0 -4
  348. package/dist/cli/main-kd488vje.js +0 -22
  349. package/dist/cli/main-kh32yvgk.js +0 -5
  350. package/dist/cli/main-kqxnqjnv.js +0 -25
  351. package/dist/cli/main-kyn0xnsg.js +0 -3
  352. package/dist/cli/main-m1kk6fp5.js +0 -21
  353. package/dist/cli/main-mv40pcr2.js +0 -4
  354. package/dist/cli/main-n0t3973w.js +0 -3
  355. package/dist/cli/main-nqveez48.js +0 -4
  356. package/dist/cli/main-pknhvrmj.js +0 -3
  357. package/dist/cli/main-pn1w7a7j.js +0 -3
  358. package/dist/cli/main-prxxs70n.js +0 -4
  359. package/dist/cli/main-q3vsesf9.js +0 -3
  360. package/dist/cli/main-qsevpgsv.js +0 -3
  361. package/dist/cli/main-rdgdw24b.js +0 -25
  362. package/dist/cli/main-rfth4tbm.js +0 -16
  363. package/dist/cli/main-rg0wn0xf.js +0 -5
  364. package/dist/cli/main-sdmxhtv8.js +0 -4
  365. package/dist/cli/main-skbp13js.js +0 -18
  366. package/dist/cli/main-t4xnd213.js +0 -7
  367. package/dist/cli/main-vqak588n.js +0 -4
  368. package/dist/cli/main-w2n1303f.js +0 -9
  369. package/dist/cli/main-wbrdspr2.js +0 -5
  370. package/dist/cli/main-wsrg79c1.js +0 -7
  371. package/dist/cli/main-x4r0fne4.js +0 -5
  372. package/dist/cli/main-xea2f3tn.js +0 -6
  373. package/dist/cli/main-xg704a3c.js +0 -3
  374. package/dist/cli/main-xvnrabfp.js +0 -16
  375. package/dist/cli/main-xy53xf0r.js +0 -4
  376. package/dist/cli/main-y1fqy60y.js +0 -3
  377. package/dist/cli/main-yn8cd281.js +0 -34
  378. package/dist/cli/main-yr0ksc0h.js +0 -4
  379. package/dist/cli/main-z2ex2vyf.js +0 -4
  380. package/dist/cli/main-z3aayzvq.js +0 -3
  381. package/dist/cli/main-zaqh35jg.js +0 -3
  382. package/dist/cli/main-zc2e8e46.js +0 -4
  383. package/dist/cli/main-zzrfw6cf.js +0 -13
  384. package/dist/cli/main.js +0 -280
  385. package/dist/cli/market-cmd-e14kmx9n.js +0 -5
  386. package/dist/cli/mcp-login-wq7ktdek.js +0 -2
  387. package/dist/cli/mcp-market-cmd-9mg3jecy.js +0 -2
  388. package/dist/cli/notify-b7qc0cjb.js +0 -2
  389. package/dist/cli/oauth-z8whcgfx.js +0 -2
  390. package/dist/cli/output-b3ewj3ps.js +0 -16
  391. package/dist/cli/profiles-6mr5he5e.js +0 -2
  392. package/dist/cli/provider-config-g7j42q8x.js +0 -2
  393. package/dist/cli/provider-jr1y8vvm.js +0 -2
  394. package/dist/cli/registry-s8yk86g0.js +0 -2
  395. package/dist/cli/registry-t6p8d4mn.js +0 -2
  396. package/dist/cli/repl-bajwe1mh.js +0 -11
  397. package/dist/cli/resume-rwn9nz7y.js +0 -2
  398. package/dist/cli/run-flags-nah7ndpt.js +0 -2
  399. package/dist/cli/runtime-n7gafzhb.js +0 -2
  400. package/dist/cli/sandbox-config-emdy18x4.js +0 -2
  401. package/dist/cli/server-b0nvs2bn.js +0 -5
  402. package/dist/cli/session-arg-y75wd4kj.js +0 -2
  403. package/dist/cli/session-j62evmjq.js +0 -2
  404. package/dist/cli/sessions-cmd-tsnwz0ns.js +0 -7
  405. package/dist/cli/settings-df10wfez.js +0 -2
  406. package/dist/cli/setup-jzvv72fg.js +0 -2
  407. package/dist/cli/sextant-smoke-37m81ke6.js +0 -5
  408. package/dist/cli/skills-cmd-gjxnxnhx.js +0 -2
  409. package/dist/cli/smoke-p7748apt.js +0 -8
  410. package/dist/cli/start-chat-s4st3mm0.js +0 -12
  411. package/dist/cli/stream-gmeyewds.js +0 -2
  412. package/dist/cli/task-gh0kkp3n.js +0 -2
  413. package/dist/cli/tasks-z1kfpe8e.js +0 -2
  414. package/dist/cli/thinking-0eqkrz6t.js +0 -2
  415. package/dist/cli/todo-5brcrt9m.js +0 -2
  416. package/dist/cli/tools-7pzm0vj9.js +0 -2
  417. package/dist/cli/tools-s635p6s8.js +0 -2
  418. package/dist/cli/trust-cmd-cjav8zgm.js +0 -2
  419. package/dist/cli/update-check-pt31bm2f.js +0 -2
  420. package/dist/cli/update-cmd-tk131s9t.js +0 -2
  421. package/dist/cli/voice-56nabd8d.js +0 -2
  422. package/dist/cli/webfetch-xd8q596m.js +0 -2
  423. package/dist/cli/websearch-5hkf98k1.js +0 -2
  424. package/dist/cli/workflow-cmd-cy3cvzjp.js +0 -4
  425. package/dist/cli/workspace-q10g5z3e.js +0 -2
  426. package/dist/lib/index.js +0 -62
  427. package/dist/lib/models-index.json +0 -1
  428. package/dist/lib/plugins.js +0 -55
  429. package/dist/lib/providers.js +0 -17
  430. package/dist/lib/public-api.js +0 -20
  431. package/dist/lib/sdk.js +0 -360
  432. /package/{dist/cli → src/providers}/models-index.json +0 -0
@@ -0,0 +1,473 @@
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
+ help: boolean;
390
+ toasts: Toast[];
391
+ /** the notification history behind the toasts (Notice); newest last */
392
+ notices: Notice[];
393
+ /** images staged for the next user message (names), shown as chips above the prompt; synced from
394
+ * SextantAttach.staged() each tick — the store owns the stage, this is the painted mirror */
395
+ staged: string[];
396
+ /** first Esc while busy arms "again to stop" until this clock */
397
+ escUntil: number;
398
+ /** two-press ⌃c guarantee (renderer-level): a ⌃c while busy interrupts and arms this clock; a
399
+ * second ⌃c before it quits even if the interrupted run has not settled yet */
400
+ ctrlCUntil?: number;
401
+ running: boolean;
402
+ mode: "plan" | "act";
403
+ yolo: boolean;
404
+ /** the middle permission tier — painted next to plan/auto in the frame footer */
405
+ acceptEdits?: boolean;
406
+ theme: ThemeName;
407
+ /** boot clock for the staggered panel reveal (90 ms steps) */
408
+ bootAt: number;
409
+ /** slash commands known to the prompt/palette (built-ins + custom) */
410
+ /** the app's slash commands for the palette and the suggestions; `choices` = a fixed argument set
411
+ * offered once the command is typed (tui/renderer.ts SlashCommand.choices) */
412
+ commands: { name: string; description: string; choices?: readonly string[] | (() => readonly string[]); choicesThen?: "submit" | "complete" }[];
413
+ version: string;
414
+ }
415
+
416
+ // ------------------------------------------------------------------ seams
417
+
418
+ /** what the renderer receives from the ONE controller (app.ts runTui) beyond the Renderer
419
+ * interface: raw RunEvents (paths, diffs, outputs) and the runtime handles the panels read */
420
+ export interface SextantAttach {
421
+ cwd: string;
422
+ sessionsDir: string;
423
+ /** the ACTIVE session store (changes on /sessions /resume /new) */
424
+ store(): { id: string };
425
+ tasks: { list(): TaskInfo[]; subscribe(fn: (t: TaskInfo) => void): () => void };
426
+ model(): { provider: string; model: string };
427
+ /** context window for the usage bar; undefined when the catalog does not know the model */
428
+ contextWindow(): number | undefined;
429
+ /** session accounting for the usage panel (tui/cost.ts math over the ACTIVE store): cost priced
430
+ * per message at its origin model (null = unpriced), context = estimated prompt tokens */
431
+ usage?(): { costUsd: number | null; contextTokens: number };
432
+ /** Everything /context needs and no other panel does: the transcript to count, the catalog to look a
433
+ * model's window and pricing up in, and the LIVE runtime.
434
+ *
435
+ * The runtime is the point. `rovecode context` on a shell has to BUILD one to learn the system prompt
436
+ * and the tool schemas, and in a fresh session those two are most of the window; here they already
437
+ * exist. Optional all the same — a surface that cannot supply this (a headless dump, a test) still
438
+ * opens the panel, and the panel says its total is a floor rather than under-reporting in silence. */
439
+ contextInputs?(): {
440
+ messages: readonly unknown[];
441
+ lookup: (r: { provider: string; model: string }) => unknown;
442
+ runtime: LiveRuntime | null;
443
+ };
444
+ /** Re-read the MCP files and connect anything new, in this session. The market overlay calls it after
445
+ * installing an MCP server so the answer is "connected" rather than "restart rovecode" — the tools
446
+ * that reach a server (`mcp_list`, `mcp_call`) dispatch by name, so nothing else has to change.
447
+ * Absent when the surface has no runtime behind it (the smoke harness, the tests). */
448
+ reloadMcp?(): Promise<{ added: string[]; removed: string[]; failed: { name: string; error: string }[]; skipped: string[] }>;
449
+ /** `--pet <name>`; the renderer's own option is the fallback */
450
+ petName?: string;
451
+ /** names of the images staged for the NEXT user message (tui/attach.ts stage on the active store),
452
+ * read live each tick so the prompt can show them as chips before they are sent */
453
+ staged?(): string[];
454
+ }
455
+
456
+ /** pure reducer contract (model.ts): (state, event, now) → same state object, mutated in place */
457
+ export type ApplyEvent = (s: SextantState, ev: RunEvent, now: number) => void;
458
+
459
+ /** what a headless dump may inject (frame.ts FrameDeps is the concrete shape): the layout function,
460
+ * per-panel painters and the layout options */
461
+ export type PanelPainter = (scr: ScreenLike, rect: Rect, s: SextantState, theme: Theme, now: number) => void;
462
+ export interface DumpFrameDeps {
463
+ layout?: (w: number, h: number, opts: LayoutOptions) => Layout;
464
+ painters?: Partial<Record<"frame" | "files" | "code" | "messages" | "plan" | "usage" | "pet", PanelPainter>>;
465
+ layoutOpts?: LayoutOptions;
466
+ }
467
+ /** headless frame dump (frame.ts): deterministic at a fixed clock — the golden-test seam */
468
+ export type DumpFrame = (s: SextantState, cols: number, rows: number, now: number, theme: Theme, deps?: DumpFrameDeps) => string;
469
+
470
+ export const SEXTANT_MIN_COLS = 100;
471
+ export const SEXTANT_MIN_ROWS = 30;
472
+ /** the four spinner glyphs (SPIN in app.js) */
473
+ export const SPIN: readonly string[] = ["◇", "◈", "◆", "◈"];