zidane 7.2.5 → 8.0.4

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 (376) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +34 -6
  3. package/dist/{acp-D-tVyUjw.js → acp-DQDhi2dj.js} +230 -77
  4. package/dist/acp-DQDhi2dj.js.map +1 -0
  5. package/dist/acp-cli.d.ts +1 -1
  6. package/dist/acp-cli.js +9 -66
  7. package/dist/acp-cli.js.map +1 -1
  8. package/dist/acp.d.ts +10 -590
  9. package/dist/acp.d.ts.map +1 -1
  10. package/dist/acp.js +3 -3
  11. package/dist/{agent-D0zZnGbt.js → agent-DSLNmBp0.js} +14401 -13214
  12. package/dist/agent-DSLNmBp0.js.map +1 -0
  13. package/dist/agent.d.ts +1 -1
  14. package/dist/agent.js +3 -2
  15. package/dist/aliasing-lVFbm81n.js +217 -0
  16. package/dist/aliasing-lVFbm81n.js.map +1 -0
  17. package/dist/{anthropic-C2aole0G.js → anthropic-CD00LhUP.js} +1442 -1264
  18. package/dist/anthropic-CD00LhUP.js.map +1 -0
  19. package/dist/artifacts-CV2hUKnL.js.map +1 -1
  20. package/dist/{atomic-write-B7zr1ddF.js → atomic-write-Ijgf2Mhc.js} +13 -3
  21. package/dist/atomic-write-Ijgf2Mhc.js.map +1 -0
  22. package/dist/call-tool-dHlbGOIY.js +70 -0
  23. package/dist/call-tool-dHlbGOIY.js.map +1 -0
  24. package/dist/chat/pure.d.ts +372 -6
  25. package/dist/chat/pure.d.ts.map +1 -1
  26. package/dist/chat/pure.js +35 -244
  27. package/dist/chat/pure.js.map +1 -1
  28. package/dist/{approvals-DKaJZYlm.js → chat-JPJJ8uu5.js} +15879 -14631
  29. package/dist/chat-JPJJ8uu5.js.map +1 -0
  30. package/dist/chat.d.ts +4 -6
  31. package/dist/chat.js +23 -12
  32. package/dist/cli-shared-C-YCaglL.js +159 -0
  33. package/dist/cli-shared-C-YCaglL.js.map +1 -0
  34. package/dist/client-core-BQSyDALT.d.ts +2115 -0
  35. package/dist/client-core-BQSyDALT.d.ts.map +1 -0
  36. package/dist/codemode-worker.d.ts +1 -0
  37. package/dist/codemode-worker.js +155 -0
  38. package/dist/codemode-worker.js.map +1 -0
  39. package/dist/codemode.d.ts +352 -0
  40. package/dist/codemode.d.ts.map +1 -0
  41. package/dist/codemode.js +5 -0
  42. package/dist/connection-Dr-Js4yZ.d.ts +28 -0
  43. package/dist/connection-Dr-Js4yZ.d.ts.map +1 -0
  44. package/dist/connection-loop-gdh22LTI.js +112 -0
  45. package/dist/connection-loop-gdh22LTI.js.map +1 -0
  46. package/dist/context-segments-BHKlagL6.js +1016 -0
  47. package/dist/context-segments-BHKlagL6.js.map +1 -0
  48. package/dist/{context-transport-T_6AYIvy.js → context-transport-DSMTUsK1.js} +3 -3
  49. package/dist/{context-transport-T_6AYIvy.js.map → context-transport-DSMTUsK1.js.map} +1 -1
  50. package/dist/contexts/daytona.d.ts +19 -8
  51. package/dist/contexts/daytona.d.ts.map +1 -1
  52. package/dist/contexts/daytona.js +1 -440
  53. package/dist/contexts/docker.d.ts +36 -7
  54. package/dist/contexts/docker.d.ts.map +1 -1
  55. package/dist/contexts/docker.js +1 -456
  56. package/dist/contexts/e2b.d.ts +68 -13
  57. package/dist/contexts/e2b.d.ts.map +1 -1
  58. package/dist/contexts/e2b.js +1 -382
  59. package/dist/contexts/sandbox.d.ts +1 -1
  60. package/dist/contexts/sandbox.js +5 -0
  61. package/dist/contexts/sandbox.js.map +1 -1
  62. package/dist/{contexts-CRE9pw07.js → contexts-d7UolYot.js} +1059 -524
  63. package/dist/contexts-d7UolYot.js.map +1 -0
  64. package/dist/contexts.d.ts +3 -3
  65. package/dist/contexts.js +1 -1
  66. package/dist/cred-keys-GpBg71cP.js +105 -0
  67. package/dist/cred-keys-GpBg71cP.js.map +1 -0
  68. package/dist/{auth-BG2rVKSt.js → credentials-JttEuRON.js} +55 -206
  69. package/dist/credentials-JttEuRON.js.map +1 -0
  70. package/dist/{cursor-iojRXHF9.js → cursor-CdjaQTBW.js} +3 -3
  71. package/dist/{cursor-iojRXHF9.js.map → cursor-CdjaQTBW.js.map} +1 -1
  72. package/dist/daemon-cli.d.ts +1 -1
  73. package/dist/daemon-cli.js +3 -2
  74. package/dist/daemon-cli.js.map +1 -1
  75. package/dist/daytona-DG3omipZ.js +513 -0
  76. package/dist/daytona-DG3omipZ.js.map +1 -0
  77. package/dist/defaults-Cx3zvDOV.js +23 -0
  78. package/dist/defaults-Cx3zvDOV.js.map +1 -0
  79. package/dist/dispatcher-BMlu2BmZ.js +4941 -0
  80. package/dist/dispatcher-BMlu2BmZ.js.map +1 -0
  81. package/dist/docker-BZhMMJUp.js +727 -0
  82. package/dist/docker-BZhMMJUp.js.map +1 -0
  83. package/dist/e2b-CEVOdRib.js +480 -0
  84. package/dist/e2b-CEVOdRib.js.map +1 -0
  85. package/dist/edit-utils-EGosADZq.js +234 -0
  86. package/dist/edit-utils-EGosADZq.js.map +1 -0
  87. package/dist/environment-8wsKE2Ln.js +214 -0
  88. package/dist/environment-8wsKE2Ln.js.map +1 -0
  89. package/dist/eval-BNcvle_J.js +1595 -0
  90. package/dist/eval-BNcvle_J.js.map +1 -0
  91. package/dist/eval.d.ts +2 -2
  92. package/dist/eval.js +1 -1489
  93. package/dist/executor-Cx5-8yqi.js +621 -0
  94. package/dist/executor-Cx5-8yqi.js.map +1 -0
  95. package/dist/extension-authoring-DyGGmq9V.js +385 -0
  96. package/dist/extension-authoring-DyGGmq9V.js.map +1 -0
  97. package/dist/extensions.d.ts +2 -2
  98. package/dist/extensions.js +3 -3
  99. package/dist/{fetch-url-DX75gpL0.js → fetch-url-Ct2TjDWt.js} +4 -4
  100. package/dist/{fetch-url-DX75gpL0.js.map → fetch-url-Ct2TjDWt.js.map} +1 -1
  101. package/dist/{format-BF745pLL.js → format-C2NQEVUH.js} +39 -2
  102. package/dist/format-C2NQEVUH.js.map +1 -0
  103. package/dist/format-bytes-C7tfc3Zm.js +55 -0
  104. package/dist/format-bytes-C7tfc3Zm.js.map +1 -0
  105. package/dist/headless-C_rNUuYC.js +960 -0
  106. package/dist/headless-C_rNUuYC.js.map +1 -0
  107. package/dist/headless.d.ts +1 -1
  108. package/dist/headless.js +1 -413
  109. package/dist/{history-search-C4bk1Wz_.js → history-search-CcYzF8-0.js} +7 -3
  110. package/dist/history-search-CcYzF8-0.js.map +1 -0
  111. package/dist/history-search-worker.d.ts +1 -1
  112. package/dist/history-search-worker.js +1 -1
  113. package/dist/host-D7NrI03V.js +378 -0
  114. package/dist/host-D7NrI03V.js.map +1 -0
  115. package/dist/host-signals-BcP5QKUD.js +118 -0
  116. package/dist/host-signals-BcP5QKUD.js.map +1 -0
  117. package/dist/identity-CwfO8K-t.js +26 -0
  118. package/dist/identity-CwfO8K-t.js.map +1 -0
  119. package/dist/{index-BgN1T3lk.d.ts → index-BGe1fQT7.d.ts} +10987 -9320
  120. package/dist/index-BGe1fQT7.d.ts.map +1 -0
  121. package/dist/index-BVQsIKGn.d.ts +448 -0
  122. package/dist/index-BVQsIKGn.d.ts.map +1 -0
  123. package/dist/{index-C6NEd5y_.d.ts → index-CHABJd-L.d.ts} +3386 -502
  124. package/dist/index-CHABJd-L.d.ts.map +1 -0
  125. package/dist/{index-C37_ppWv.d.ts → index-D6a7qXpg.d.ts} +2 -3
  126. package/dist/index-D6a7qXpg.d.ts.map +1 -0
  127. package/dist/index.d.ts +6 -6
  128. package/dist/index.js +27 -23
  129. package/dist/{completion-core-BRo86R_L.js → inline-ghost-BVRQeGoL.js} +50 -2
  130. package/dist/inline-ghost-BVRQeGoL.js.map +1 -0
  131. package/dist/ipc/remote.d.ts +313 -0
  132. package/dist/ipc/remote.d.ts.map +1 -0
  133. package/dist/ipc/remote.js +4 -0
  134. package/dist/ipc.d.ts +6 -964
  135. package/dist/ipc.js +403 -4
  136. package/dist/ipc.js.map +1 -0
  137. package/dist/{isolation-Kfoof0MM.d.ts → isolation-D9L650W5.d.ts} +100 -15
  138. package/dist/isolation-D9L650W5.d.ts.map +1 -0
  139. package/dist/json-rpc--HXQti1E.js +350 -0
  140. package/dist/json-rpc--HXQti1E.js.map +1 -0
  141. package/dist/links-j8rED1sR.js +603 -0
  142. package/dist/links-j8rED1sR.js.map +1 -0
  143. package/dist/local-terminal-D8QThwo_.js +252 -0
  144. package/dist/local-terminal-D8QThwo_.js.map +1 -0
  145. package/dist/{logger--C1VQjwJ.js → logger-Gtqlayx8.js} +199 -173
  146. package/dist/logger-Gtqlayx8.js.map +1 -0
  147. package/dist/logs-view-CWG8aUAG.js.map +1 -1
  148. package/dist/{mcp-CgNd-f3F.js → mcp-_wecH9Qe.js} +608 -562
  149. package/dist/mcp-_wecH9Qe.js.map +1 -0
  150. package/dist/mcp.d.ts +2 -2
  151. package/dist/mcp.js +2 -2
  152. package/dist/media-sniff-UKijEaiQ.js.map +1 -1
  153. package/dist/{messages-2jcOA_5R.js → messages-BqiwcD2Q.js} +1017 -1014
  154. package/dist/messages-BqiwcD2Q.js.map +1 -0
  155. package/dist/{oauth-DxHO17JE.js → oauth-Px_pBB9W.js} +5 -5
  156. package/dist/{oauth-DxHO17JE.js.map → oauth-Px_pBB9W.js.map} +1 -1
  157. package/dist/{openai-compat-Dy56weK8.js → openai-compat-CFrpH7uq.js} +432 -589
  158. package/dist/openai-compat-CFrpH7uq.js.map +1 -0
  159. package/dist/orchestration-BCGmB8Ps.js +511 -0
  160. package/dist/orchestration-BCGmB8Ps.js.map +1 -0
  161. package/dist/output/stream-json.d.ts +1 -2
  162. package/dist/output/stream-json.d.ts.map +1 -1
  163. package/dist/output/stream-json.js +1 -1
  164. package/dist/output/terminal.d.ts +1 -2
  165. package/dist/output/terminal.d.ts.map +1 -1
  166. package/dist/output/terminal.js +13 -7
  167. package/dist/output/terminal.js.map +1 -1
  168. package/dist/{plugins-gbI7SBA6.js → plugins-DS7mahzZ.js} +20 -101
  169. package/dist/plugins-DS7mahzZ.js.map +1 -0
  170. package/dist/plugins.d.ts +1 -1
  171. package/dist/plugins.js +1 -2
  172. package/dist/prelude-Cxo4t74B.js +517 -0
  173. package/dist/prelude-Cxo4t74B.js.map +1 -0
  174. package/dist/presets.d.ts +1 -1
  175. package/dist/presets.js +1 -2
  176. package/dist/project-root-B8zADr4o.js +167 -0
  177. package/dist/project-root-B8zADr4o.js.map +1 -0
  178. package/dist/project-user-paths-BSgtrRxl.js +58 -0
  179. package/dist/project-user-paths-BSgtrRxl.js.map +1 -0
  180. package/dist/{prompts-Pqc3JdW_.d.ts → prompts-DYcvqShf.d.ts} +14 -11
  181. package/dist/prompts-DYcvqShf.d.ts.map +1 -0
  182. package/dist/protocol-DnhqqSmE.js +13 -0
  183. package/dist/protocol-DnhqqSmE.js.map +1 -0
  184. package/dist/providers/anthropic.d.ts +2 -2
  185. package/dist/providers/anthropic.js +1 -2
  186. package/dist/providers/arcee.d.ts +1 -1
  187. package/dist/providers/arcee.js +1 -1
  188. package/dist/providers/baseten.d.ts +1 -1
  189. package/dist/providers/baseten.js +1 -1
  190. package/dist/providers/cerebras.d.ts +1 -1
  191. package/dist/providers/cerebras.js +3 -2
  192. package/dist/providers/cerebras.js.map +1 -1
  193. package/dist/providers/local.d.ts +1 -1
  194. package/dist/providers/local.js +1 -1
  195. package/dist/providers/openai-compat.d.ts +1 -1
  196. package/dist/providers/openai-compat.js +1 -2
  197. package/dist/providers/openai.d.ts +1 -1
  198. package/dist/providers/openai.js +15 -12
  199. package/dist/providers/openai.js.map +1 -1
  200. package/dist/providers/openrouter.d.ts +1 -1
  201. package/dist/providers/openrouter.js +3 -2
  202. package/dist/providers/openrouter.js.map +1 -1
  203. package/dist/providers/xai.d.ts +1 -1
  204. package/dist/providers/xai.js +3 -3
  205. package/dist/{providers-BVhnFyiY.js → providers-XUR7F4Hi.js} +4 -4
  206. package/dist/{providers-BVhnFyiY.js.map → providers-XUR7F4Hi.js.map} +1 -1
  207. package/dist/providers.d.ts +1 -1
  208. package/dist/providers.js +4 -4
  209. package/dist/registry-D6ShBWJU.js +5234 -0
  210. package/dist/registry-D6ShBWJU.js.map +1 -0
  211. package/dist/remote-hosts-BtA_9ZGp.js +97 -0
  212. package/dist/remote-hosts-BtA_9ZGp.js.map +1 -0
  213. package/dist/restate.d.ts +2 -3
  214. package/dist/restate.d.ts.map +1 -1
  215. package/dist/restate.js +631 -572
  216. package/dist/restate.js.map +1 -1
  217. package/dist/run-summary-CklLiZ4y.js +288 -0
  218. package/dist/run-summary-CklLiZ4y.js.map +1 -0
  219. package/dist/{sandbox-BH0WQkXn.d.ts → sandbox-C5dR5DwQ.d.ts} +6 -3
  220. package/dist/sandbox-C5dR5DwQ.d.ts.map +1 -0
  221. package/dist/session/sqlite.d.ts +1 -2
  222. package/dist/session/sqlite.d.ts.map +1 -1
  223. package/dist/session/sqlite.js +1 -616
  224. package/dist/session-factory-BUGY5P40.js +1576 -0
  225. package/dist/session-factory-BUGY5P40.js.map +1 -0
  226. package/dist/{session-BqRP1hS7.js → session-xh9JXu6i.js} +94 -52
  227. package/dist/session-xh9JXu6i.js.map +1 -0
  228. package/dist/session.d.ts +1 -1
  229. package/dist/session.js +2 -2
  230. package/dist/settings-keys-Ckf29NeM.js +677 -0
  231. package/dist/settings-keys-Ckf29NeM.js.map +1 -0
  232. package/dist/shell-path-Dqaoow2J.js +412 -0
  233. package/dist/shell-path-Dqaoow2J.js.map +1 -0
  234. package/dist/{skills-BC3dodWp.js → skills-DKqZJm4X.js} +430 -470
  235. package/dist/skills-DKqZJm4X.js.map +1 -0
  236. package/dist/skills.d.ts +2 -2
  237. package/dist/skills.js +1 -2
  238. package/dist/source-mPExaUm8.js +381 -0
  239. package/dist/source-mPExaUm8.js.map +1 -0
  240. package/dist/sqlite-DV1DQzN2.js +698 -0
  241. package/dist/sqlite-DV1DQzN2.js.map +1 -0
  242. package/dist/{src-CkNQKFKr.js → src-BRMYRJib.js} +903 -1121
  243. package/dist/src-BRMYRJib.js.map +1 -0
  244. package/dist/{stdio-DPpBDPx5.js → stdio-C6YyoW3I.js} +4 -4
  245. package/dist/{stdio-DPpBDPx5.js.map → stdio-C6YyoW3I.js.map} +1 -1
  246. package/dist/{stdio-loader-Bbx19dMZ.js → stdio-loader-C830Vg-Z.js} +4 -4
  247. package/dist/{stdio-loader-Bbx19dMZ.js.map → stdio-loader-C830Vg-Z.js.map} +1 -1
  248. package/dist/system-prompt-MNVHatSD.d.ts.map +1 -1
  249. package/dist/timeout-DEaqslLO.d.ts.map +1 -1
  250. package/dist/todo-edits-Dn251YUP.js +1790 -0
  251. package/dist/todo-edits-Dn251YUP.js.map +1 -0
  252. package/dist/{turn-operations-DrbJlpq9.js → tool-formatters-IQFDrdrs.js} +1456 -2120
  253. package/dist/tool-formatters-IQFDrdrs.js.map +1 -0
  254. package/dist/tool-state-Dku6YqAB.js +989 -0
  255. package/dist/tool-state-Dku6YqAB.js.map +1 -0
  256. package/dist/tools/fetch-url.d.ts +1 -2
  257. package/dist/tools/fetch-url.d.ts.map +1 -1
  258. package/dist/tools/fetch-url.js +1 -2
  259. package/dist/tools/prompts.d.ts +1 -1
  260. package/dist/tools/prompts.js +7 -7
  261. package/dist/tools/prompts.js.map +1 -1
  262. package/dist/tools/web-search.d.ts +1 -2
  263. package/dist/tools/web-search.d.ts.map +1 -1
  264. package/dist/tools/web-search.js +2 -2
  265. package/dist/tools/web-search.js.map +1 -1
  266. package/dist/tools-_DnT3AGM.js +578 -0
  267. package/dist/tools-_DnT3AGM.js.map +1 -0
  268. package/dist/tools.d.ts +3 -3
  269. package/dist/tools.js +4 -2
  270. package/dist/tui.d.ts +534 -517
  271. package/dist/tui.d.ts.map +1 -1
  272. package/dist/tui.js +34933 -27243
  273. package/dist/tui.js.map +1 -1
  274. package/dist/turn-operations-B8sokwi5.js +333 -0
  275. package/dist/turn-operations-B8sokwi5.js.map +1 -0
  276. package/dist/turn-operations-DQX5ZZni.d.ts +3089 -0
  277. package/dist/turn-operations-DQX5ZZni.d.ts.map +1 -0
  278. package/dist/types-C7ZFOztE.d.ts +132 -0
  279. package/dist/types-C7ZFOztE.d.ts.map +1 -0
  280. package/dist/types-CH5XpIHw.js +114 -0
  281. package/dist/types-CH5XpIHw.js.map +1 -0
  282. package/dist/{types-CWgENVLY.js → types-Cu0ZGDu9.js} +10 -6
  283. package/dist/types-Cu0ZGDu9.js.map +1 -0
  284. package/dist/types-IqegbJEE.d.ts +624 -0
  285. package/dist/types-IqegbJEE.d.ts.map +1 -0
  286. package/dist/types.d.ts +4 -4
  287. package/dist/types.js +1 -1
  288. package/dist/url-D8HCl65b.js +1259 -0
  289. package/dist/url-D8HCl65b.js.map +1 -0
  290. package/dist/wasm-BVT-j5cl.js +33 -0
  291. package/dist/wasm-BVT-j5cl.js.map +1 -0
  292. package/dist/workspace-exec-stream-SV2R9d5S.js +355 -0
  293. package/dist/workspace-exec-stream-SV2R9d5S.js.map +1 -0
  294. package/dist/ws-CIHMvlSh.js +952 -0
  295. package/dist/ws-CIHMvlSh.js.map +1 -0
  296. package/dist/ws-client-N7NxzvQp.js +230 -0
  297. package/dist/ws-client-N7NxzvQp.js.map +1 -0
  298. package/dist/{xai-CazjStOK.js → xai-CvJTeLrI.js} +165 -5
  299. package/dist/xai-CvJTeLrI.js.map +1 -0
  300. package/dist/xdg-zweed0-t.js +117 -0
  301. package/dist/xdg-zweed0-t.js.map +1 -0
  302. package/docs/ACP.md +52 -0
  303. package/docs/ARCHITECTURE.md +103 -6
  304. package/docs/ARTIFACTS.md +8 -4
  305. package/docs/CHAT.md +165 -14
  306. package/docs/EXECUTION_CONTEXT.md +8 -0
  307. package/docs/EXTENSIONS.md +123 -2
  308. package/docs/HEADLESS.md +2 -0
  309. package/docs/IPC.md +775 -64
  310. package/docs/MACHINES.md +456 -0
  311. package/docs/PANELS.md +3 -0
  312. package/docs/README.md +4 -0
  313. package/docs/RESTATE.md +3 -2
  314. package/docs/RUN_IN_BACKGROUND.md +10 -2
  315. package/docs/SERVER.md +1085 -0
  316. package/docs/SKILL.md +6 -1
  317. package/docs/TERMINAL.md +75 -0
  318. package/docs/TUI.md +65 -14
  319. package/package.json +58 -26
  320. package/scripts/eval.ts +4 -0
  321. package/dist/acp-D-tVyUjw.js.map +0 -1
  322. package/dist/agent-D0zZnGbt.js.map +0 -1
  323. package/dist/anthropic-C2aole0G.js.map +0 -1
  324. package/dist/approvals-DKaJZYlm.js.map +0 -1
  325. package/dist/atomic-write-B7zr1ddF.js.map +0 -1
  326. package/dist/auth-BG2rVKSt.js.map +0 -1
  327. package/dist/completion-core-BRo86R_L.js.map +0 -1
  328. package/dist/contexts/daytona.js.map +0 -1
  329. package/dist/contexts/docker.js.map +0 -1
  330. package/dist/contexts/e2b.js.map +0 -1
  331. package/dist/contexts-CRE9pw07.js.map +0 -1
  332. package/dist/eval.js.map +0 -1
  333. package/dist/format-BF745pLL.js.map +0 -1
  334. package/dist/glob-DluQFSw1.js +0 -270
  335. package/dist/glob-DluQFSw1.js.map +0 -1
  336. package/dist/headless.js.map +0 -1
  337. package/dist/history-search-C4bk1Wz_.js.map +0 -1
  338. package/dist/index-BgN1T3lk.d.ts.map +0 -1
  339. package/dist/index-C37_ppWv.d.ts.map +0 -1
  340. package/dist/index-C6NEd5y_.d.ts.map +0 -1
  341. package/dist/ipc-BKVIIOqH.js +0 -331
  342. package/dist/ipc-BKVIIOqH.js.map +0 -1
  343. package/dist/ipc.d.ts.map +0 -1
  344. package/dist/isolation-Kfoof0MM.d.ts.map +0 -1
  345. package/dist/json-rpc-rSWMUh9b.js +0 -192
  346. package/dist/json-rpc-rSWMUh9b.js.map +0 -1
  347. package/dist/logger--C1VQjwJ.js.map +0 -1
  348. package/dist/mcp-CgNd-f3F.js.map +0 -1
  349. package/dist/messages-2jcOA_5R.js.map +0 -1
  350. package/dist/openai-compat-Dy56weK8.js.map +0 -1
  351. package/dist/output-cap-C9zukcCj.js +0 -100
  352. package/dist/output-cap-C9zukcCj.js.map +0 -1
  353. package/dist/panels-B6gRk4bf.js +0 -789
  354. package/dist/panels-B6gRk4bf.js.map +0 -1
  355. package/dist/plugins-gbI7SBA6.js.map +0 -1
  356. package/dist/prompts-Pqc3JdW_.d.ts.map +0 -1
  357. package/dist/run-summary-BU_NgwUT.js +0 -269
  358. package/dist/run-summary-BU_NgwUT.js.map +0 -1
  359. package/dist/sandbox-BH0WQkXn.d.ts.map +0 -1
  360. package/dist/session/sqlite.js.map +0 -1
  361. package/dist/session-BqRP1hS7.js.map +0 -1
  362. package/dist/shell-path-DfdXrGg9.js +0 -1549
  363. package/dist/shell-path-DfdXrGg9.js.map +0 -1
  364. package/dist/skills-BC3dodWp.js.map +0 -1
  365. package/dist/src-CkNQKFKr.js.map +0 -1
  366. package/dist/todo-edits-UOwgxGKu.js +0 -528
  367. package/dist/todo-edits-UOwgxGKu.js.map +0 -1
  368. package/dist/tool-formatters-DoRLnfuD.d.ts +0 -759
  369. package/dist/tool-formatters-DoRLnfuD.d.ts.map +0 -1
  370. package/dist/transcript-anchors-BeudMbXx.d.ts +0 -1762
  371. package/dist/transcript-anchors-BeudMbXx.d.ts.map +0 -1
  372. package/dist/turn-operations-C8bMBDl_.d.ts +0 -1258
  373. package/dist/turn-operations-C8bMBDl_.d.ts.map +0 -1
  374. package/dist/turn-operations-DrbJlpq9.js.map +0 -1
  375. package/dist/types-CWgENVLY.js.map +0 -1
  376. package/dist/xai-CazjStOK.js.map +0 -1
package/dist/tui.d.ts CHANGED
@@ -1,10 +1,19 @@
1
- import { $l as Theme, Bu as InlineAutocompleteProvider, Bv as SkillConfig, Em as accentColor, Ep as PlanRequest, Fd as SessionMeta, Hf as ModelInfo, Id as Settings, Jv as SessionData, Ku as CompletionState, Ld as StreamEvent, Lf as ProviderAuth, Qo as ExtensionRegistry, Qu as CompletionReference, Rf as ProviderKey, U_ as SessionTurn, Uf as ModelOption, Z_ as ThinkingLevel, Zu as CompletionProvider, ac as StoredExtensionConfigItem, bf as ModelChainEntry, eu as ThemeColors, jo as ExtensionDefinition, km as ContextSegment, ko as ExtensionCustomRenderer, om as RingBufferSink, qs as ExtensionConfigCategory, us as ExtensionToolRendererEntry, v_ as JsonValue, vp as InteractionRequest, vs as LoadedExtension, x_ as McpToolSchema, y_ as McpServerConfig, ym as AgentRegistry, yp as InteractionResponse, ys as LoadedPluginRecord } from "./index-BgN1T3lk.js";
2
- import { Bt as Hint, Ht as hintsLength, Tt as KeyBindings, Ut as truncateTrailing, Vt as clipHintsToWidth, Y as ResolvedConfig, _ as DiscoveredMcp, f as DiscoveredPlugin, i as SessionExportFormat, k as PreferredCredentialTarget, l as EnabledAllowlistKey, lt as marginTopFor, n as computeTurnAnchors, q as ChatOptions, t as TranscriptItem, v as DiscoveryError } from "./transcript-anchors-BeudMbXx.js";
3
- import { H as ApprovalRequest, T as SessionHistoryMatch, V as ApprovalDecision, X as DaemonHealth, a as formatToolCall, c as splitPromptSegments, ft as isEditErrorResult, h as MarkdownSegment, ht as isVisible, i as displayNameFor, l as CatalogEntry, n as ToolDisplayMeta, o as PromptSegment, pt as isTurnHighlighted, r as ToolFormatLine, s as PromptSegmentRef, t as TOOL_DISPLAY, v as splitMarkdownCodeBlocks, xt as turnSelectionOwnership, yt as selectableTurnIds } from "./tool-formatters-DoRLnfuD.js";
1
+ import { Bp as Settings, Bs as LoadedPluginRecord, Cy as McpToolSchema, Ed as InlineAutocompleteProvider, Fd as CompletionProvider, Gh as ProviderAuth, Gy as SessionTurn, Id as CompletionReference, Iu as Theme, Kh as ProviderKey, Lm as ModelChainEntry, Lu as ThemeColors, Oc as StoredExtensionConfigItem, Qb as SessionData, Uc as BadgeTarget, Uo as ExtensionDefinition, Vo as ExtensionCustomRenderer, Vp as StreamEvent, Vs as SessionBadgeEntry, Wb as SkillConfig, Xh as ModelInfo, Zh as ModelOption, _f as InteractionResponse, _s as ExtensionRegistry, bg as accentColor, by as JsonValue, eb as ThinkingLevel, gc as ExtensionConfigCategory, gf as InteractionRequest, gh as EnvironmentActionSummary, gp as AgentRegistry, hh as EnvironmentActionResult, ip as RingBufferSink, js as ExtensionToolRendererEntry, md as PanelFocus, wf as PlanRequest, xg as ContextSegment, xy as McpServerConfig, zp as SessionMeta, zs as LoadedExtension } from "./index-BGe1fQT7.js";
2
+ import { $r as EnabledAllowlistKey, Ai as PreferredCredentialTarget, Ma as KeyBindings, N as SettingsCategory, Qi as ResolvedConfig, So as truncateTrailing, U as SessionExportFormat, Xi as ChatOptions, bo as clipHintsToWidth, ma as marginTopFor, n as computeTurnAnchors, pi as DiscoveredPlugin, qs as CompletionState, t as TranscriptItem, vi as DiscoveredMcp, xo as hintsLength, yi as DiscoveryError, yo as Hint } from "./index-CHABJd-L.js";
3
+ import { Ai as DaemonHealth, G as PromptSegmentRef, J as splitPromptSegments, Ki as isEditErrorResult, Ot as splitMarkdownCodeBlocks, Si as ApprovalRequest, Tt as MarkdownSegment, W as PromptSegment, Yi as isVisible, c as ToolFormatLine, ea as selectableTurnIds, l as displayNameFor, mr as SessionHistoryMatch, na as turnSelectionOwnership, o as TOOL_DISPLAY, qi as isTurnHighlighted, s as ToolDisplayMeta, tt as CatalogEntry, u as formatToolCall, xi as ApprovalDecision } from "./turn-operations-DQX5ZZni.js";
4
+ import { t as HostConnectionStatus } from "./connection-Dr-Js4yZ.js";
5
+ import "./index-BVQsIKGn.js";
6
+ import { t as IpcClient } from "./client-core-BQSyDALT.js";
4
7
  import { Buffer } from "node:buffer";
5
- import { ReactNode } from "react";
8
+ import { Dispatch, ReactNode, SetStateAction } from "react";
6
9
  import { RGBA, SyntaxStyle } from "@opentui/core";
7
-
10
+ //#region src/tui/host-target.d.ts
11
+ interface RemoteHost {
12
+ /** `wss://` (or `ws://` on loopback). */
13
+ url: string;
14
+ token?: string;
15
+ }
16
+ //#endregion
8
17
  //#region src/tui/agent-picker.d.ts
9
18
  /**
10
19
  * Modal that lists the registered {@link AgentProfile}s and lets the user
@@ -17,11 +26,7 @@ import { RGBA, SyntaxStyle } from "@opentui/core";
17
26
  * Used by `App` (Ctrl+A binding) and exported for hosts that want to drive
18
27
  * agent switching from elsewhere in their own composition.
19
28
  */
20
- declare function AgentPickerModal({
21
- agents,
22
- currentAgentId,
23
- onPick
24
- }: {
29
+ declare function AgentPickerModal({ agents, currentAgentId, onPick }: {
25
30
  agents: AgentRegistry;
26
31
  currentAgentId: string;
27
32
  onPick: (id: string) => void;
@@ -36,9 +41,7 @@ declare function AgentPickerModal({
36
41
  * mount `<App config={resolveConfig(...)} />` themselves inside a renderer
37
42
  * they already own.
38
43
  */
39
- declare function App({
40
- config
41
- }: {
44
+ declare function App({ config }: {
42
45
  config: ResolvedConfig;
43
46
  }): import("react").ReactNode;
44
47
  //#endregion
@@ -69,14 +72,101 @@ declare function App({
69
72
  * the picker title still reads as "this is the X provider" without
70
73
  * carrying the chip pill's heavy visual weight.
71
74
  */
72
- declare function CompletionPopup({
73
- state,
74
- /** Cap on visible rows. 6 keeps the popover compact even with long catalogs. */visibleRows
75
- }: {
75
+ declare function CompletionPopup({ state, visibleRows }: {
76
76
  state: CompletionState<unknown>;
77
77
  visibleRows?: number;
78
78
  }): ReactNode;
79
79
  //#endregion
80
+ //#region src/tui/status-spinner.d.ts
81
+ declare function Spinner({ label }: {
82
+ label?: string;
83
+ }): import("react").ReactNode;
84
+ /**
85
+ * Bar spinner painted in a caller-chosen color: the session-title status
86
+ * icon and the folded-exchange marker. Five cells wide.
87
+ */
88
+ declare function StatusSpinner({ color }: {
89
+ color: string;
90
+ }): import("react").ReactNode;
91
+ //#endregion
92
+ //#region src/tui/transcript/transcript.d.ts
93
+ /**
94
+ * Transcript rows are keyed by array index on purpose.
95
+ *
96
+ * Identity keys look more correct and are worse here: the streaming tail event
97
+ * is a *new object* on every ~16ms drain tick (coalescing copies the accumulated
98
+ * text into fresh state), so keying by identity hands the hot row a new key
99
+ * every tick and remounts its whole `<markdown>` subtree — measured as the
100
+ * markdown renderable id incrementing once per tick, versus staying put with
101
+ * index keys.
102
+ *
103
+ * The cost of index keys is that `revealEarlierTranscriptEvents` prepends a
104
+ * page, shifting every index and remounting the list once. That is a rare,
105
+ * user-initiated action; the streaming tail is 60 times a second. Fixing both
106
+ * needs a stable id on `StreamEvent` itself, which is a data-model change
107
+ * rather than a rendering one.
108
+ */
109
+ declare function Transcript({ events, settings, selectedTurnId, busy, searchQuery, searchPending, interactionPending, onLoadEarlier, onReachBottom, onSelectTurn, onOpenTurn, onOpenSessionEvent, onResume, pinSeq }: {
110
+ events: StreamEvent[];
111
+ settings: Settings;
112
+ /** Continue / Retry on the run that stopped early: sends `text` as a prompt. */
113
+ onResume?: (text: string) => void;
114
+ /**
115
+ * Bumped each time you send: the view jumps back to the bottom and follows
116
+ * again, so what you just sent is on screen wherever you were reading.
117
+ */
118
+ pinSeq?: number;
119
+ /**
120
+ * True while an interaction (question wizard / plan picker) owns the screen.
121
+ * Releases the `pageup` / `pagedown` bindings to that surface, which binds the
122
+ * same keys for its own scrollbox — see `onTranscriptScroll`.
123
+ */
124
+ interactionPending?: boolean;
125
+ /**
126
+ * Turn id whose events should render with the selection accent bar. `null`
127
+ * leaves every event unhighlighted (normal mode). Events without a turnId
128
+ * (synthetic markers) are never highlighted.
129
+ */
130
+ selectedTurnId?: string | null;
131
+ /**
132
+ * True while a run is streaming. Drives the inline working throbber that
133
+ * appears at the tail of the transcript while the assistant is preparing
134
+ * a reply (thinking, or otherwise busy before content/tool calls land).
135
+ * Matches Crush's `AssistantMessageItem.isSpinning()` semantics: the
136
+ * throbber hides as soon as the active turn produces visible output.
137
+ */
138
+ busy?: boolean;
139
+ /** Optional filter query. Rich rows render normally; matching text ranges use the search background. */
140
+ searchQuery?: string;
141
+ /** Suppress the empty-result label while async filtering is still running. */
142
+ searchPending?: boolean;
143
+ /**
144
+ * Reveal one older persisted-history page. Called automatically once the
145
+ * viewport nears the top marker; returns false when no page was loaded.
146
+ */
147
+ onLoadEarlier?: () => boolean;
148
+ /**
149
+ * Fired once each time the viewport returns to the bottom after being
150
+ * scrolled away — the host ends a history-reveal hold here.
151
+ */
152
+ onReachBottom?: () => void;
153
+ /**
154
+ * Mouse companion to select-turn navigation: hovering an event row
155
+ * moves the selection cursor to its owning turn. Only consulted while
156
+ * a selection exists (`selectedTurnId != null`) — i.e. select-turn or
157
+ * transcript-search mode — so normal reading never hijacks the cursor.
158
+ * The host validates the id against its navigable candidates and
159
+ * returns `false` for a rejected move (void/`true` = accepted) — the
160
+ * Transcript uses that to avoid arming its mouse-selection flag for a
161
+ * change that will never land.
162
+ */
163
+ onSelectTurn?: (turnId: string) => boolean | void;
164
+ /** Click companion — open the turn (same action as `↵` on the selection). Same return contract. */
165
+ onOpenTurn?: (turnId: string) => boolean | void;
166
+ /** Click a `session-event` row — switch to the worker session it reports on. */
167
+ onOpenSessionEvent?: (sessionId: string) => void;
168
+ }): import("react").ReactNode;
169
+ //#endregion
80
170
  //#region src/tui/components.d.ts
81
171
  /**
82
172
  * `@opentui/react` extends `React.JSX.IntrinsicElements`, so `onSubmit` on `<input>`
@@ -106,22 +196,12 @@ interface FooterUsage {
106
196
  * enough, otherwise stacks the context indicator beneath the hint row.
107
197
  * Width tiering is driven by plain-text length estimates — close enough
108
198
  * since the segments are ASCII-heavy.
199
+ *
200
+ * Memoized: AppShell re-renders on every stream drain tick, and the footer's
201
+ * props settle between ticks (its clocks run on its own 1s tickers).
109
202
  */
110
- declare function Footer({
111
- hints,
112
- context,
113
- cost,
114
- status,
115
- compactionTokens,
116
- compactionStartedAt,
117
- retry,
118
- contextKey,
119
- usage,
120
- usageKey,
121
- daemonHealth,
122
- streaming,
123
- costEstimated
124
- }: {
203
+ declare const Footer: import("react").MemoExoticComponent<typeof FooterView>;
204
+ declare function FooterView({ hints, context, cost, status, compactionTokens, compactionStartedAt, retry, contextKey, usage, usageKey, daemonHealth, hostLabel, streaming, run, costEstimated }: {
125
205
  hints: Hint[];
126
206
  context: ContextUsage | null;
127
207
  /**
@@ -143,10 +223,20 @@ declare function Footer({
143
223
  * or zero tokens leaves the bare spinner.
144
224
  */
145
225
  streaming?: {
226
+ turnId?: string;
146
227
  outputTokens: number;
147
228
  estimated: boolean;
148
229
  elapsedMs: number;
149
230
  } | null;
231
+ /**
232
+ * The run in flight: when it started and the output its settled turns
233
+ * produced. With `streaming` it drives the busy readout, `1m 15s · ↓1.2k ·
234
+ * 41 tok/s`. `null` falls back to the streaming turn's count alone.
235
+ */
236
+ run?: {
237
+ startedAt: number;
238
+ settledOutputTokens: number;
239
+ } | null;
150
240
  /**
151
241
  * Active run status, surfaced as a small glyph at the right edge of
152
242
  * the hints (left) section. Replaces the spinner that used to live in
@@ -162,6 +252,7 @@ declare function Footer({
162
252
  retry?: {
163
253
  attempt: number;
164
254
  max: number;
255
+ source?: string;
165
256
  } | null;
166
257
  /**
167
258
  * Rough token estimate of the in-flight compaction summary. Rendered
@@ -169,7 +260,8 @@ declare function Footer({
169
260
  * the stream making progress instead of an opaque spinner. Ignored
170
261
  * unless `status === 'compacting'`.
171
262
  */
172
- compactionTokens?: number | null; /** Wall-clock start of the in-flight compaction — drives the elapsed suffix. */
263
+ compactionTokens?: number | null;
264
+ /** Wall-clock start of the in-flight compaction — drives the elapsed suffix. */
173
265
  compactionStartedAt?: number | null;
174
266
  /**
175
267
  * Keybinding spec (e.g. `ctrl+shift+g`) that opens the context-usage
@@ -200,6 +292,8 @@ declare function Footer({
200
292
  * no trace of a feature that is switched off.
201
293
  */
202
294
  daemonHealth?: DaemonHealth | null;
295
+ /** The remote host's name beside the dot (`host: <name>`); `null` (not on a remote host) hides it. */
296
+ hostLabel?: string | null;
203
297
  }): ReactNode;
204
298
  /**
205
299
  * Pure renderer for a list of {@link Hint}s as colored spans —
@@ -211,9 +305,9 @@ declare function Footer({
211
305
  * prompt-box overlay wraps it with leading + trailing spaces so the
212
306
  * outermost cells punch through the border like a native title would.
213
307
  *
214
- * Pattern matches `renderRefSpans` below — pure function over an opaque
215
- * `ThemeColors`, no internal hook calls so it composes inside any
216
- * `<text>` regardless of where the parent grabbed its palette.
308
+ * Pure function over an opaque `ThemeColors`, no internal hook calls so it
309
+ * composes inside any `<text>` regardless of where the parent grabbed its
310
+ * palette.
217
311
  */
218
312
  declare function renderHintSpans(hints: readonly Hint[], COLOR: ThemeColors): ReactNode;
219
313
  /**
@@ -278,19 +372,14 @@ interface MetaSegment {
278
372
  * />
279
373
  * </box>
280
374
  * ```
375
+ *
376
+ * Memoized for the same reason as {@link Footer}: the chat header's props
377
+ * hold still while a reply streams.
281
378
  */
282
- declare function TitleOverlay({
283
- title,
284
- meta,
285
- titleColor,
286
- bg,
287
- parentWidth,
288
- statusIcon,
289
- statusIconCells,
290
- clickKey,
291
- action
292
- }: {
293
- title: string; /** Optional right-aligned secondary segment. Dropped first when space runs out. */
379
+ declare const TitleOverlay: import("react").MemoExoticComponent<typeof TitleOverlayView>;
380
+ declare function TitleOverlayView({ title, meta, titleColor, bg, parentWidth, statusIcon, statusIconCells, clickKey, action }: {
381
+ title: string;
382
+ /** Optional right-aligned secondary segment. Dropped first when space runs out. */
294
383
  meta?: string | readonly MetaSegment[] | null;
295
384
  /**
296
385
  * Optional clickable glyph chip sitting just LEFT of `meta` on the border
@@ -299,7 +388,8 @@ declare function TitleOverlay({
299
388
  * `active` paints it in the brand color, hover in the accent. Counted in
300
389
  * the meta budget so it never collides with the title.
301
390
  */
302
- action?: TitleOverlayAction | null; /** Defaults to `COLOR.brand`. */
391
+ action?: TitleOverlayAction | null;
392
+ /** Defaults to `COLOR.brand`. */
303
393
  titleColor?: string;
304
394
  /**
305
395
  * Background painted behind every overlay cell. MUST match the surface
@@ -324,8 +414,9 @@ declare function TitleOverlay({
324
414
  *
325
415
  * Sized as `statusIconCells` cells + one leading space when present,
326
416
  * so the title budget reserves the right number of extra columns.
327
- * Pass a {@link StatusSpinner} or any other 1-cell `<span>`; `null`
328
- * (the default) takes no space.
417
+ * Pass a 1-cell `<span>`, or a {@link StatusSpinner} with
418
+ * `statusIconCells={5}` (its bar is five cells); `null` (the default)
419
+ * takes no space.
329
420
  *
330
421
  * Render order is `title <space> icon`. The leading title slot reads
331
422
  * naturally — eye lands on the name first, then catches the activity
@@ -360,101 +451,9 @@ interface TitleOverlayAction {
360
451
  /** Optional count rendered after the glyph when > 0. */
361
452
  count?: number;
362
453
  }
363
- declare function Spinner({
364
- label
365
- }: {
366
- label?: string;
367
- }): ReactNode;
368
- /**
369
- * Glyph-only spinner painted in a caller-chosen color. Used as the
370
- * status icon prefixed to the chat screen's session title — a single
371
- * cell wide so it slots in front of the title text without disturbing
372
- * the existing `TITLE_OVERLAY_WRAP` budget math.
373
- */
374
- declare function StatusSpinner({
375
- color
376
- }: {
377
- color: string;
378
- }): ReactNode;
379
- /**
380
- * Transcript rows are keyed by array index on purpose.
381
- *
382
- * Identity keys look more correct and are worse here: the streaming tail event
383
- * is a *new object* on every ~16ms drain tick (coalescing copies the accumulated
384
- * text into fresh state), so keying by identity hands the hot row a new key
385
- * every tick and remounts its whole `<markdown>` subtree — measured as the
386
- * markdown renderable id incrementing once per tick, versus staying put with
387
- * index keys.
388
- *
389
- * The cost of index keys is that `revealEarlierTranscriptEvents` prepends a
390
- * page, shifting every index and remounting the list once. That is a rare,
391
- * user-initiated action; the streaming tail is 60 times a second. Fixing both
392
- * needs a stable id on `StreamEvent` itself, which is a data-model change
393
- * rather than a rendering one.
394
- */
395
- declare function Transcript({
396
- events,
397
- settings,
398
- selectedTurnId,
399
- busy,
400
- searchQuery,
401
- searchPending,
402
- interactionPending,
403
- onLoadEarlier,
404
- onSelectTurn,
405
- onOpenTurn,
406
- onOpenSessionEvent
407
- }: {
408
- events: StreamEvent[];
409
- settings: Settings;
410
- /**
411
- * True while an interaction (question wizard / plan picker) owns the screen.
412
- * Releases the `pageup` / `pagedown` bindings to that surface, which binds the
413
- * same keys for its own scrollbox — see `onTranscriptScroll`.
414
- */
415
- interactionPending?: boolean;
416
- /**
417
- * Turn id whose events should render with the selection accent bar. `null`
418
- * leaves every event unhighlighted (normal mode). Events without a turnId
419
- * (synthetic markers) are never highlighted.
420
- */
421
- selectedTurnId?: string | null;
422
- /**
423
- * True while a run is streaming. Drives the inline working throbber that
424
- * appears at the tail of the transcript while the assistant is preparing
425
- * a reply (thinking, or otherwise busy before content/tool calls land).
426
- * Matches Crush's `AssistantMessageItem.isSpinning()` semantics: the
427
- * throbber hides as soon as the active turn produces visible output.
428
- */
429
- busy?: boolean; /** Optional filter query. Rich rows render normally; matching text ranges use the search background. */
430
- searchQuery?: string; /** Suppress the empty-result label while async filtering is still running. */
431
- searchPending?: boolean;
432
- /**
433
- * Reveal one older persisted-history page. Called automatically once the
434
- * viewport nears the top marker; returns false when no page was loaded.
435
- */
436
- onLoadEarlier?: () => boolean;
437
- /**
438
- * Mouse companion to select-turn navigation: hovering an event row
439
- * moves the selection cursor to its owning turn. Only consulted while
440
- * a selection exists (`selectedTurnId != null`) — i.e. select-turn or
441
- * transcript-search mode — so normal reading never hijacks the cursor.
442
- * The host validates the id against its navigable candidates and
443
- * returns `false` for a rejected move (void/`true` = accepted) — the
444
- * Transcript uses that to avoid arming its mouse-selection flag for a
445
- * change that will never land.
446
- */
447
- onSelectTurn?: (turnId: string) => boolean | void; /** Click companion — open the turn (same action as `↵` on the selection). Same return contract. */
448
- onOpenTurn?: (turnId: string) => boolean | void; /** Click a `session-event` row — switch to the worker session it reports on. */
449
- onOpenSessionEvent?: (sessionId: string) => void;
450
- }): ReactNode;
451
454
  //#endregion
452
455
  //#region src/tui/effort-picker.d.ts
453
- declare function EffortPickerModal({
454
- current,
455
- supportsAdaptive,
456
- onPick
457
- }: {
456
+ declare function EffortPickerModal({ current, supportsAdaptive, onPick }: {
458
457
  current: ThinkingLevel | undefined;
459
458
  supportsAdaptive: boolean;
460
459
  onPick: (effort: ThinkingLevel) => void;
@@ -482,10 +481,7 @@ declare function useExtensionRenderers(): ExtensionRenderers;
482
481
  * enabled set actually change, so transcript re-renders stay scoped to
483
482
  * real swaps.
484
483
  */
485
- declare function ExtensionRenderersProvider({
486
- registry,
487
- children
488
- }: {
484
+ declare function ExtensionRenderersProvider({ registry, children }: {
489
485
  registry: ExtensionRegistry;
490
486
  children: ReactNode;
491
487
  }): ReactNode;
@@ -535,25 +531,21 @@ declare function useRowVisible(margin?: number): boolean;
535
531
  * Enabled state lives in `settings.enabledExtensions` (mirrors
536
532
  * `enabledSkills` / `enabledMcps`). Toggling OFF filters the live
537
533
  * registry immediately; toggling ON an extension that boot skipped
538
- * hot-reloads the registry (see "Hot-load on enable" in app.tsx), so
534
+ * hot-reloads the registry (see "Hot-load on enable" in `extensions/use-extension-auto-reload.ts`), so
539
535
  * its `setup()` runs and its settings appear without a restart.
540
536
  * Agent-side contributions (tools / hooks) apply on the next run.
541
537
  */
542
- declare function ExtensionsSettingsModal({
543
- catalog,
544
- inactive
545
- }: {
546
- /** Successfully-loaded + currently-active extensions. */catalog: readonly LoadedExtension[]; /** Inactive entries — disabled-via-allowlist + load failures. */
538
+ declare function ExtensionsSettingsModal({ catalog, inactive }: {
539
+ /** Successfully-loaded + currently-active extensions. */
540
+ catalog: readonly LoadedExtension[];
541
+ /** Inactive entries — disabled-via-allowlist + load failures. */
547
542
  inactive?: readonly LoadedExtension[];
548
543
  }): import("react").ReactNode;
549
544
  //#endregion
550
545
  //#region src/tui/interaction-block.d.ts
551
- declare function InteractionBlock({
552
- request,
553
- onResolve,
554
- abortHint
555
- }: {
556
- request: InteractionRequest; /** Submit the user's response to the head of the queue. */
546
+ declare function InteractionBlock({ request, onResolve, abortHint }: {
547
+ request: InteractionRequest;
548
+ /** Submit the user's response to the head of the queue. */
557
549
  onResolve: (response: InteractionResponse) => void;
558
550
  /**
559
551
  * Display chord of the `abortRun` binding for the title hint (e.g.
@@ -571,9 +563,7 @@ declare function InteractionBlock({
571
563
  * scrollbox, no preview/collapse state. Hosts embedding these standalone
572
564
  * must mount BOTH — the picker alone shows a plan the user cannot read.
573
565
  */
574
- declare function PlanReviewPanel({
575
- request
576
- }: {
566
+ declare function PlanReviewPanel({ request }: {
577
567
  request: PlanRequest;
578
568
  }): ReactNode;
579
569
  //#endregion
@@ -582,11 +572,14 @@ declare function PlanReviewPanel({
582
572
  * MCP server picker. Hierarchical: each server is one row, and an
583
573
  * expanded server reveals one row per advertised tool. The full surface:
584
574
  *
585
- * ▼ [✓] linear stdio · npx -y mcp-remote … (5/7) ✓ authed
586
- * [✓] create_issue Create a new Linear issue
587
- * [✓] list_issues Query issues by status / assignee
588
- * [ ] update_issue Update fields on an existing issue
589
- * ▶ [✓] chrome-devtools stdio · npx -y chrome-devtools-mcp@latest
575
+ * ▶ linear stdio · npx -y mcp-remote … (5/7) Signed in ━━● ▼
576
+ * create_issue Create a new Linear issue ━━●
577
+ * list_issues Query issues by status / assignee ━━●
578
+ * update_issue Update fields on an existing issue ●──
579
+ * chrome-devtools stdio · npx -y chrome-devtools-mcp@latest ━━● ◀
580
+ *
581
+ * `▶` marks the cursor row; the chevron after the switch says whether a
582
+ * server is open (`▼`) or closed (`◀`).
590
583
  *
591
584
  * Keybindings:
592
585
  *
@@ -596,8 +589,8 @@ declare function PlanReviewPanel({
596
589
  * back to the parent server
597
590
  * enter / space toggle — server toggles `enabledMcps`; tool toggles
598
591
  * `disabledMcpTools[serverName]`
599
- * l login (server rows only — needs-auth / error)
600
- * o logout (server rows only — authed / error /
592
+ * l sign in (server rows only — needs-auth / error)
593
+ * o sign out (server rows only — authed / error /
601
594
  * authorizing)
602
595
  * r refresh discovery
603
596
  * esc close — also cancels an in-flight `authorizing`
@@ -605,10 +598,13 @@ declare function PlanReviewPanel({
605
598
  *
606
599
  * Status badge legend (server row only):
607
600
  *
608
- * ✓ authed tokens stored + bootstrap connected
609
- * ! needs login bootstrap needs OAuth, no tokens
610
- * … authorizing interactive login in flight
611
- * ✗ <error> login attempt failed
601
+ * (the shared `MCP_STATUS_LABEL` words, same as the desktop app)
602
+ * Signed in tokens stored + bootstrap connected
603
+ * Needs sign-in OAuth wanted, or the server refused the connection
604
+ * Signing in… interactive sign-in in flight
605
+ * Sign-in failed the last sign-in attempt failed
606
+ * Couldn't connect failed for another reason
607
+ * Key refused refused the key in its headers
612
608
  *
613
609
  * The (N/M) chip on a server header counts ENABLED / TOTAL advertised
614
610
  * tools, drawn only when the tool catalog has loaded. Without a catalog
@@ -619,15 +615,7 @@ declare function PlanReviewPanel({
619
615
  * Errors (`DiscoveryError[]`) surface in a warn-colored preamble so a
620
616
  * broken `mcps.json` is loud rather than invisible.
621
617
  */
622
- declare function McpsSettingsModal({
623
- catalog,
624
- errors,
625
- toolsByServer,
626
- onLogin,
627
- onLogout,
628
- onCancelLogin,
629
- onRefresh
630
- }: {
618
+ declare function McpsSettingsModal({ catalog, errors, toolsByServer, onLogin, onLogout, onCancelLogin, onRefresh }: {
631
619
  catalog: readonly DiscoveredMcp[];
632
620
  errors?: readonly DiscoveryError[];
633
621
  /**
@@ -668,9 +656,7 @@ interface ModalApi {
668
656
  unlockEscape: () => void;
669
657
  isOpen: boolean;
670
658
  }
671
- declare function ModalRoot({
672
- children
673
- }: {
659
+ declare function ModalRoot({ children }: {
674
660
  children: ReactNode;
675
661
  }): ReactNode;
676
662
  declare function useModal(): ModalApi;
@@ -758,35 +744,19 @@ interface ModalProps {
758
744
  *
759
745
  * Uses `useTerminalDimensions()` so it reflows on `SIGWINCH` without remount.
760
746
  */
761
- declare function Modal({
762
- title,
763
- bottomTitle,
764
- rightTitle,
765
- onClose,
766
- disableEscape,
767
- children,
768
- maxWidth,
769
- minWidth,
770
- maxHeight,
771
- horizontalMargin,
772
- verticalMargin,
773
- fullscreen
774
- }: ModalProps): ReactNode;
747
+ declare function Modal({ title, bottomTitle, rightTitle, onClose, disableEscape, children, maxWidth, minWidth, maxHeight, horizontalMargin, verticalMargin, fullscreen }: ModalProps): ReactNode;
775
748
  //#endregion
776
749
  //#region src/tui/model-options-picker.d.ts
777
- declare function ModelOptionsPickerModal({
778
- supportsReasoning,
779
- supportsAdaptive,
780
- currentEffort,
781
- options,
782
- enabled,
783
- onPickEffort,
784
- onToggleOption
785
- }: {
786
- /** Whether to render the reasoning-effort section. */supportsReasoning: boolean; /** Whether the active provider can express the `adaptive` level. */
787
- supportsAdaptive: boolean; /** Currently-selected effort (for the `●` marker). */
788
- currentEffort: ThinkingLevel | undefined; /** Feature options the model declares. */
789
- options: readonly ModelOption[]; /** Enabled option ids. */
750
+ declare function ModelOptionsPickerModal({ supportsReasoning, supportsAdaptive, currentEffort, options, enabled, onPickEffort, onToggleOption }: {
751
+ /** Whether to render the reasoning-effort section. */
752
+ supportsReasoning: boolean;
753
+ /** Whether the active provider can express the `adaptive` level. */
754
+ supportsAdaptive: boolean;
755
+ /** Currently-selected effort (for the trailing check). */
756
+ currentEffort: ThinkingLevel | undefined;
757
+ /** Feature options the model declares. */
758
+ options: readonly ModelOption[];
759
+ /** Enabled option ids. */
790
760
  enabled: Record<string, boolean> | undefined;
791
761
  onPickEffort: (effort: ThinkingLevel) => void;
792
762
  onToggleOption: (optionId: string) => void;
@@ -797,17 +767,14 @@ interface PickedModel {
797
767
  providerKey: ProviderKey;
798
768
  modelId: string;
799
769
  }
800
- declare function ModelPickerModal({
801
- providers,
802
- modelsFor,
803
- current,
804
- onPick,
805
- chain,
806
- onApplyChain
807
- }: {
808
- /** Authed providers — the catalog is unioned across these. */providers: readonly ProviderAuth[]; /** Resolver from `ResolvedConfig.modelsFor`. */
809
- modelsFor: (key: ProviderKey) => readonly ModelInfo[]; /** Currently active selection. Promoted to top of its provider section + pre-highlighted. */
810
- current: PickedModel; /** Single-pick commit — ↵ picks the highlighted row. Ignored when `onApplyChain` is set. */
770
+ declare function ModelPickerModal({ providers, modelsFor, current, onPick, chain, onApplyChain }: {
771
+ /** Authed providers — the catalog is unioned across these. */
772
+ providers: readonly ProviderAuth[];
773
+ /** Resolver from `ResolvedConfig.modelsFor`. */
774
+ modelsFor: (key: ProviderKey) => readonly ModelInfo[];
775
+ /** Currently active selection. Promoted to top of its provider section + pre-highlighted. */
776
+ current: PickedModel;
777
+ /** Single-pick commit — ↵ picks the highlighted row. Ignored when `onApplyChain` is set. */
811
778
  onPick?: (picked: PickedModel) => void;
812
779
  /**
813
780
  * Seed chain for the ordered multi-select (entry 0 = current primary,
@@ -824,7 +791,18 @@ declare function ModelPickerModal({
824
791
  onApplyChain?: (chain: ModelChainEntry[]) => void;
825
792
  }): import("react").ReactNode;
826
793
  //#endregion
827
- //#region src/tui/screens.d.ts
794
+ //#region src/tui/auth/auth-screen.d.ts
795
+ declare function AuthScreen({ onPick, initialConfigureKey }: {
796
+ onPick: (p: ProviderAuth) => void;
797
+ /**
798
+ * Open straight into a SPECIFIC provider's wizard (skip the auth list and
799
+ * the wizard's provider picker). Set when the user picked a provider row in
800
+ * Settings → Authentication to (re)configure it.
801
+ */
802
+ initialConfigureKey?: string;
803
+ }): import("react").ReactNode;
804
+ //#endregion
805
+ //#region src/tui/prompt/paste.d.ts
828
806
  /**
829
807
  * Prompt-level attachment captured by the textarea's paste pipeline.
830
808
  * Lives only in the TUI layer — converted to {@link PromptPart}s at
@@ -837,165 +815,54 @@ interface Attachment {
837
815
  content: Buffer;
838
816
  mediaType: string;
839
817
  }
840
- declare function AuthScreen({
841
- onPick,
842
- initialConfigureKey
843
- }: {
844
- onPick: (p: ProviderAuth) => void;
845
- /**
846
- * Open straight into a SPECIFIC provider's wizard (skip the auth list and
847
- * the wizard's provider picker). Set when the user picked a provider row in
848
- * Settings → Authentication to (re)configure it.
849
- */
850
- initialConfigureKey?: string;
851
- }): ReactNode;
818
+ //#endregion
819
+ //#region src/tui/queue/queued-messages-block.d.ts
852
820
  /**
853
- * Live per-session presence, structurally mirrored from `zidane/ipc`'s
854
- * `SessionPresence` — declared locally so this presentation module never
855
- * imports the IPC layer.
821
+ * One entry in the queued-messages preview list shown above the prompt
822
+ * input. Only the displayable text + the user-provided ref spans are
823
+ * surfaced — the `references` carry-through happens entirely in the
824
+ * App layer (see `messageQueueRef`); this view doesn't need to know
825
+ * about them.
856
826
  */
857
- interface SessionPresenceInfo {
858
- windows: number;
859
- running: boolean;
860
- attention: boolean;
861
- }
862
- declare function SessionsScreen({
863
- sessions,
864
- currentId,
865
- focusedSessionId,
866
- onPick,
867
- onCreate,
868
- onFocusChange,
869
- contentMatches,
870
- contentSearching,
871
- contentSearchProgress,
872
- onSearchQueryChange,
873
- showAllProjects,
874
- scopeLabel,
875
- presence,
876
- showArtifacts,
877
- onToggleScope,
878
- currentProjectRoot,
879
- mainSessionId,
880
- notice
881
- }: {
882
- sessions: SessionMeta[];
883
- /**
884
- * Identity of the row the parent considers focused. Drives the row
885
- * cursor so the highlight follows the SESSION (not its slot) when the
886
- * list reorders. `null` lands the cursor on the first session row, or
887
- * on "+ new" if there are no sessions yet.
888
- */
889
- focusedSessionId: string | null;
890
- currentId: string | null;
891
- onPick: (id: string) => void;
892
- onCreate: () => void;
893
- /**
894
- * Notified as the user navigates between rows. Receives the session id
895
- * of the focused row, or `null` when "+ new" is focused (no session to
896
- * act on). Parents use this to wire `openSessionDetails` against the live focus.
897
- */
898
- onFocusChange?: (id: string | null) => void; /** Async full-history matches keyed by session id. */
899
- contentMatches?: ReadonlyMap<string, SessionHistoryMatch>;
900
- contentSearching?: boolean;
901
- contentSearchProgress?: {
902
- done: number;
903
- total: number;
904
- }; /** Called whenever the local conversation-filter query changes. */
905
- onSearchQueryChange?: (query: string) => void;
906
- /**
907
- * When `true`, render each session's project label under the title.
908
- * Off by default — when the list is already filtered to one project
909
- * the label would just repeat that project on every row.
910
- */
911
- showAllProjects?: boolean; /** `Settings.artifacts` — off hides the `N artifacts` badge on rows. */
912
- showArtifacts?: boolean;
913
- /**
914
- * Fired on `tab` — cycles the list scope (current project / all
915
- * projects / active windows). The parent owns the scope state (it
916
- * drives the store query), so this is a plain notification.
917
- */
918
- onToggleScope?: () => void;
919
- /**
920
- * Scope label for the title overlay when a non-project scope is on
921
- * ("all projects", "active windows"). Falls back to "all projects"
922
- * when `showAllProjects` is set without a label.
923
- */
924
- scopeLabel?: string;
925
- /**
926
- * Live presence per session id (daemon mode) — drives the per-row
927
- * status glyph: running, awaiting input, or attached-idle.
928
- */
929
- presence?: ReadonlyMap<string, SessionPresenceInfo>;
930
- /**
931
- * Current project root, used to label "current project" on rows that
932
- * belong to it when `showAllProjects` is on. Untagged (legacy)
933
- * sessions render as "untagged".
934
- */
935
- currentProjectRoot?: string;
827
+ interface QueuedPreview {
828
+ /** Raw prompt text the user typed (no `❯` prefix). */
829
+ text: string;
936
830
  /**
937
- * Id of the resolved "Main" orchestration session, or `null` when
938
- * orchestration is off/ungated or none has been resolved yet (the
939
- * `openMainSession` chord creates it lazily — this screen never fabricates
940
- * a row for one that doesn't exist). When set and present in `sessions`,
941
- * its row is pinned first with a `◆ Main` badge.
831
+ * Optional chip spans from the original prompt (`@files`, `/skills`)
832
+ * — passed through so the queued entry highlights skill / file names
833
+ * the same way the echoed user-prompt event does once it lands in
834
+ * the transcript.
942
835
  */
943
- mainSessionId?: string | null;
836
+ refs?: readonly {
837
+ start: number;
838
+ end: number;
839
+ providerId: string;
840
+ }[];
944
841
  /**
945
- * One-line warning under the list (e.g. "a run is in progress — abort
946
- * first"). Replaces the search spinner slot while set.
842
+ * How many attachments were captured with the prompt. A COUNT rather than the
843
+ * attachments themselves: the row only needs to say they exist, and holding
844
+ * the payloads in a render prop would keep every queued file's bytes alive
845
+ * for as long as the queue is on screen.
846
+ *
847
+ * Absent or `0` renders no badge, so unattached rows look exactly as before.
947
848
  */
948
- notice?: string | null;
949
- }): ReactNode;
950
- declare function ChatScreen({
951
- cwd,
952
- events,
953
- busy,
954
- compacting,
955
- queuedMessages,
956
- queueSelectionIndex,
957
- queueShortcuts,
958
- onEnterQueueFromEmptyPrompt,
959
- settings,
960
- onSubmit,
961
- session,
962
- pending,
963
- onApproval,
964
- pendingInteraction,
965
- onInteraction,
966
- completionProviders,
967
- inlineAutocompleteProviders,
968
- onCompletionTab,
969
- enterSelectsCompletion,
970
- onPopupOpenChange,
971
- selectedTurnId,
972
- onSelectTurn,
973
- onOpenTurn,
974
- onOpenSessionEvent,
975
- transcriptSearchMode,
976
- transcriptSearchQuery,
977
- transcriptSearchEvents,
978
- transcriptSearchSearching,
979
- onTranscriptSearchModeChange,
980
- onTranscriptSearchQueryChange,
981
- onTranscriptSearchNavigate,
982
- onTranscriptSearchOpen,
983
- onLoadEarlierTranscript,
984
- promptTriggerHints,
985
- attachImageBinding,
986
- editorBinding,
987
- abortBinding,
988
- sessionDetailsBinding,
989
- frameWidth,
990
- artifactsAction,
991
- onDraftChange,
992
- remoteDraft,
993
- onDraftAttachmentsChange,
994
- remoteDraftAttachments,
995
- remoteSearchQuery,
996
- remoteSuggest,
997
- resolveGhostRemote
998
- }: {
849
+ attachments?: number;
850
+ }
851
+ /**
852
+ * Resolved keybinding specs the queue UI surfaces to the user. Each
853
+ * field is the literal string from `keybindings.json` ("ctrl+return",
854
+ * "backspace" — or whatever the user has configured) formatted for
855
+ * display via {@link formatBindingForDisplay} at render time so any
856
+ * customization (e.g. `"cmd+up"`, `"delete"`) shows the actual key.
857
+ */
858
+ interface QueueShortcuts {
859
+ enter: string;
860
+ push: string;
861
+ drop: string;
862
+ }
863
+ //#endregion
864
+ //#region src/tui/chat/chat-screen.d.ts
865
+ interface ChatScreenProps {
999
866
  cwd: string;
1000
867
  events: StreamEvent[];
1001
868
  busy: boolean;
@@ -1042,9 +909,13 @@ declare function ChatScreen({
1042
909
  * referenced skill before `agent.run()`), and any attachments captured
1043
910
  * by the textarea's paste pipeline.
1044
911
  */
1045
- onSubmit: (prompt: string, references: readonly CompletionReference<unknown>[], attachments: readonly Attachment[]) => void;
1046
- session: SessionMeta | null; /** Head of the safe-mode approval queue, or `null` when nothing is pending. */
1047
- pending: ApprovalRequest | null; /** Resolve the active prompt with the user's pick. */
912
+ onSubmit: (prompt: string, references: readonly CompletionReference<unknown>[], attachments: readonly Attachment[], opts?: {
913
+ fromComposer?: boolean;
914
+ }) => void;
915
+ session: SessionMeta | null;
916
+ /** Head of the safe-mode approval queue, or `null` when nothing is pending. */
917
+ pending: ApprovalRequest | null;
918
+ /** Resolve the active prompt with the user's pick. */
1048
919
  onApproval: (decision: ApprovalDecision) => void;
1049
920
  /**
1050
921
  * Head of the interactions queue (plan approval / Q&A). When set,
@@ -1052,7 +923,8 @@ declare function ChatScreen({
1052
923
  * mounted but hidden, preserving its draft and attachments. Works the same
1053
924
  * for live and resumed interactions; the App only swaps the resolver.
1054
925
  */
1055
- pendingInteraction: InteractionRequest | null; /** Submit the user's response to the head of the interactions queue. */
926
+ pendingInteraction: InteractionRequest | null;
927
+ /** Submit the user's response to the head of the interactions queue. */
1056
928
  onInteraction: (response: InteractionResponse) => void;
1057
929
  /**
1058
930
  * Optional autocomplete providers. When passed, `PromptBlock` shows a
@@ -1066,21 +938,9 @@ declare function ChatScreen({
1066
938
  * extension-registered). Gated by the `inlineAutocomplete` setting
1067
939
  * inside `PromptBlock`; Tab accepts the visible ghost.
1068
940
  */
1069
- inlineAutocompleteProviders?: readonly InlineAutocompleteProvider[]; /** Optional provider-specific Tab override while the completion popup is open. */
941
+ inlineAutocompleteProviders?: readonly InlineAutocompleteProvider[];
942
+ /** Optional provider-specific Tab override while the completion popup is open. */
1070
943
  onCompletionTab?: (providerId: string) => boolean;
1071
- /**
1072
- * Providers whose popup keeps `↵` as the SELECT key (e.g. `chats`,
1073
- * whose tab is the scope toggle). Everywhere else `↵` submits the
1074
- * prompt and `tab` is the only select key.
1075
- *
1076
- * COUPLED with `onCompletionTab`: any provider whose tab is consumed by
1077
- * `onCompletionTab` (returns `true`) MUST also be claimed here, or its
1078
- * popup becomes unselectable — tab does something else and ↵ submits.
1079
- * The two are separate props (a host may want ↵-select without a tab
1080
- * override, e.g. a plain list), so the coupling is the caller's to
1081
- * honor; see `<App>` where both name `chats`.
1082
- */
1083
- enterSelectsCompletion?: (providerId: string) => boolean;
1084
944
  /**
1085
945
  * Notified whenever the popup opens / closes. The App uses this to gate
1086
946
  * the esc-abort handler so esc dismisses the popup instead of aborting
@@ -1092,9 +952,12 @@ declare function ChatScreen({
1092
952
  * filtered-result highlight while the textarea remains focused for query
1093
953
  * input.
1094
954
  */
1095
- selectedTurnId?: string | null; /** Hover-to-move-cursor while select-turn / search selection is active. `false` = move rejected. See `Transcript`. */
1096
- onSelectTurn?: (turnId: string) => boolean | void; /** Click-to-open a hovered turn — same action as `↵` on the selection. Same return contract. */
1097
- onOpenTurn?: (turnId: string) => boolean | void; /** Click a `session-event` row — switch to the worker session it reports on. */
955
+ selectedTurnId?: string | null;
956
+ /** Hover-to-move-cursor while select-turn / search selection is active. `false` = move rejected. See `Transcript`. */
957
+ onSelectTurn?: (turnId: string) => boolean | void;
958
+ /** Click-to-open a hovered turn — same action as `↵` on the selection. Same return contract. */
959
+ onOpenTurn?: (turnId: string) => boolean | void;
960
+ /** Click a `session-event` row — switch to the worker session it reports on. */
1098
961
  onOpenSessionEvent?: (sessionId: string) => void;
1099
962
  transcriptSearchMode?: boolean;
1100
963
  transcriptSearchQuery?: string;
@@ -1103,8 +966,13 @@ declare function ChatScreen({
1103
966
  onTranscriptSearchModeChange?: (enabled: boolean) => void;
1104
967
  onTranscriptSearchQueryChange?: (query: string) => void;
1105
968
  onTranscriptSearchNavigate?: (delta: -1 | 1) => void;
1106
- onTranscriptSearchOpen?: () => void; /** Reveal another persisted transcript page when the scrollbox nears top. */
969
+ onTranscriptSearchOpen?: () => void;
970
+ /** Reveal another persisted transcript page when the scrollbox nears top. */
1107
971
  onLoadEarlierTranscript?: () => boolean;
972
+ /** The transcript viewport returned to the bottom (see Transcript `onReachBottom`). */
973
+ onTranscriptReachBottom?: () => void;
974
+ /** Whole-session prompt count for the title meta (the displayed events are capped). */
975
+ userMessageCount?: number;
1108
976
  /**
1109
977
  * Optional trigger affordances (e.g. `@ files`, `/ skills`) appended
1110
978
  * to the prompt-box overlay's hint row when there's room. Caller
@@ -1112,13 +980,15 @@ declare function ChatScreen({
1112
980
  * skills catalog is empty, etc.) — the prompt overlay drops the
1113
981
  * triggers entirely on narrow terminals.
1114
982
  */
1115
- promptTriggerHints?: readonly Hint[]; /** App-native text/image clipboard binding threaded into {@link PromptBlock}. */
983
+ promptTriggerHints?: readonly Hint[];
984
+ /** App-native text/image clipboard binding threaded into {@link PromptBlock}. */
1116
985
  attachImageBinding?: string;
1117
986
  /**
1118
987
  * Resolved keybinding spec for "edit prompt in $EDITOR", threaded into
1119
988
  * {@link PromptBlock}. Absent when the `externalEditor` setting is off.
1120
989
  */
1121
- editorBinding?: string; /** Resolved `abortRun` spec, shown in the prompt's busy hint row. */
990
+ editorBinding?: string;
991
+ /** Resolved `abortRun` spec, shown in the prompt's busy hint row. */
1122
992
  abortBinding?: string;
1123
993
  /**
1124
994
  * Resolved keybinding spec for `openSessionDetails`, rendered in the
@@ -1138,7 +1008,8 @@ declare function ChatScreen({
1138
1008
  * dispatches `clickKey` (the `openArtifacts` binding) to toggle the rail;
1139
1009
  * absent when `Settings.artifacts` is off.
1140
1010
  */
1141
- artifactsAction?: TitleOverlayAction | null; /** Draft-sync taps — see the `PromptBlock` props of the same names. */
1011
+ artifactsAction?: TitleOverlayAction | null;
1012
+ /** Draft-sync taps — see the `PromptBlock` props of the same names. */
1142
1013
  onDraftChange?: (text: string, shell?: boolean) => void;
1143
1014
  remoteDraft?: {
1144
1015
  seq: number;
@@ -1150,70 +1021,193 @@ declare function ChatScreen({
1150
1021
  * action (paste, drop, remove, submit-clear). Not called for
1151
1022
  * `remoteDraftAttachments` applies.
1152
1023
  */
1153
- onDraftAttachmentsChange?: (attachments: readonly Attachment[]) => void; /** Remote composing attachments to mirror, keyed on `seq` like `remoteDraft`. */
1024
+ onDraftAttachmentsChange?: (attachments: readonly Attachment[]) => void;
1025
+ /** Remote composing attachments to mirror, keyed on `seq` like `remoteDraft`. */
1154
1026
  remoteDraftAttachments?: {
1155
1027
  seq: number;
1156
1028
  attachments: Attachment[];
1157
- } | null; /** Remote search-query mirror — see the PromptBlock prop of the same name. */
1029
+ } | null;
1030
+ /** A badge's "Add to prompt", held until the prompt applies it. */
1031
+ promptInsert?: {
1032
+ seq: number;
1033
+ text: string;
1034
+ } | null;
1035
+ onPromptInsertApplied?: (seq: number) => void;
1036
+ /** Remote search-query mirror — see the PromptBlock prop of the same name. */
1158
1037
  remoteSearchQuery?: {
1159
1038
  seq: number;
1160
1039
  query: string;
1161
- } | null; /** Remote inline-suggest mirror — see the PromptBlock prop of the same name. */
1040
+ } | null;
1041
+ /** Remote inline-suggest mirror — see the PromptBlock prop of the same name. */
1162
1042
  remoteSuggest?: {
1163
1043
  seq: number;
1164
1044
  basis: string;
1165
1045
  caret: number;
1166
1046
  suggestion: string | null;
1167
1047
  candidates?: string[];
1168
- } | null; /** Daemon-side ghost resolver — see the PromptBlock prop of the same name. */
1048
+ } | null;
1049
+ /** Daemon-side ghost resolver — see the PromptBlock prop of the same name. */
1169
1050
  resolveGhostRemote?: (text: string, cursor: number) => Promise<{
1170
1051
  suggestion: string | null;
1171
1052
  candidates?: string[];
1172
1053
  } | null>;
1173
- }): ReactNode;
1054
+ }
1055
+ declare function ChatScreen({ cwd, events, busy, compacting, queuedMessages, queueSelectionIndex, queueShortcuts, onEnterQueueFromEmptyPrompt, settings, onSubmit, session, pending, onApproval, pendingInteraction, onInteraction, completionProviders, inlineAutocompleteProviders, onCompletionTab, onPopupOpenChange, selectedTurnId, onSelectTurn, onOpenTurn, onOpenSessionEvent, transcriptSearchMode, transcriptSearchQuery, transcriptSearchEvents, transcriptSearchSearching, onTranscriptSearchModeChange, onTranscriptSearchQueryChange, onTranscriptSearchNavigate, onTranscriptSearchOpen, onLoadEarlierTranscript, onTranscriptReachBottom, userMessageCount: userMessageCountProp, promptTriggerHints, attachImageBinding, editorBinding, abortBinding, sessionDetailsBinding, frameWidth, artifactsAction: artifactsActionProp, onDraftChange, remoteDraft, onDraftAttachmentsChange, remoteDraftAttachments, promptInsert, onPromptInsertApplied, remoteSearchQuery, remoteSuggest, resolveGhostRemote }: ChatScreenProps): import("react").ReactNode;
1056
+ //#endregion
1057
+ //#region src/tui/sessions/session-row.d.ts
1174
1058
  /**
1175
- * One entry in the queued-messages preview list shown above the prompt
1176
- * input. Only the displayable text + the user-provided ref spans are
1177
- * surfaced — the `references` carry-through happens entirely in the
1178
- * App layer (see `messageQueueRef`); this view doesn't need to know
1179
- * about them.
1059
+ * Live per-session presence, structurally mirrored from `zidane/ipc`'s
1060
+ * `SessionPresence` — declared locally so this presentation module never
1061
+ * imports the IPC layer.
1180
1062
  */
1181
- interface QueuedPreview {
1182
- /** Raw prompt text the user typed (no `❯` prefix). */
1183
- text: string;
1063
+ interface SessionPresenceInfo {
1064
+ windows: number;
1065
+ running: boolean;
1066
+ attention: boolean;
1067
+ }
1068
+ //#endregion
1069
+ //#region src/tui/runtime/transport.d.ts
1070
+ interface HostConnectOptions {
1071
+ appVersion?: string;
1072
+ /** The connection dropped (daemon exit, socket error, host shutdown). Not called for `close()`. */
1073
+ onClose?: () => void;
1184
1074
  /**
1185
- * Optional chip spans from the original prompt (`@files`, `/skills`)
1186
- * — passed through so the queued entry highlights skill / file names
1187
- * the same way the echoed user-prompt event does once it lands in
1188
- * the transcript.
1075
+ * A watcher that must never retire a mismatched daemon (the presence
1076
+ * client): it connects to whatever is running and degrades instead.
1077
+ * Session controllers are active: a stale daemon is drained and respawned.
1078
+ * Meaningless in-process, where client and host are one build.
1189
1079
  */
1190
- refs?: readonly {
1191
- start: number;
1192
- end: number;
1193
- providerId: string;
1194
- }[];
1080
+ passive?: boolean;
1081
+ /** Give up before connecting once aborted (the attempt was superseded). */
1082
+ signal?: AbortSignal;
1083
+ }
1084
+ interface HostTransport {
1085
+ connect: (options?: HostConnectOptions) => Promise<IpcClient>;
1086
+ }
1087
+ //#endregion
1088
+ //#region src/tui/host/host-directory.d.ts
1089
+ type DirectoryHostKind = 'in-process' | 'daemon' | 'server';
1090
+ interface DirectoryHost {
1091
+ readonly key: string;
1092
+ kind: DirectoryHostKind;
1093
+ /** What the user calls it: "This computer", the saved name, or the server's. */
1094
+ name: string;
1095
+ /** Servers. */
1096
+ url?: string;
1097
+ /** `--host`: not saved, not removable. */
1098
+ adHoc?: boolean;
1099
+ transport: HostTransport;
1100
+ /** The app-lifetime client; `null` while (re)connecting or offline. */
1101
+ client: IpcClient | null;
1102
+ status: HostConnectionStatus;
1103
+ /** Why the last connect failed. */
1104
+ error?: string;
1105
+ serverName?: string;
1106
+ serverVersion?: string;
1107
+ }
1108
+ //#endregion
1109
+ //#region src/tui/sessions/hosted-sessions.d.ts
1110
+ /** A host's header in the grouped list. */
1111
+ interface SessionHostGroup {
1112
+ key: string;
1113
+ name: string;
1114
+ kind: DirectoryHost['kind'];
1115
+ status: HostConnectionStatus;
1116
+ /** Rows shown from the last good list (the host is not connected). */
1117
+ stale: boolean;
1118
+ }
1119
+ //#endregion
1120
+ //#region src/tui/sessions/sessions-screen.d.ts
1121
+ interface SessionsScreenProps {
1122
+ sessions: SessionMeta[];
1195
1123
  /**
1196
- * How many attachments were captured with the prompt. A COUNT rather than the
1197
- * attachments themselves: the row only needs to say they exist, and holding
1198
- * the payloads in a render prop would keep every queued file's bytes alive
1199
- * for as long as the queue is on screen.
1200
- *
1201
- * Absent or `0` renders no badge, so unattached rows look exactly as before.
1124
+ * Identity of the row the parent considers focused. Drives the row
1125
+ * cursor so the highlight follows the SESSION (not its slot) when the
1126
+ * list reorders. `null` lands the cursor on the first session row, or
1127
+ * on "+ new" if there are no sessions yet.
1202
1128
  */
1203
- attachments?: number;
1204
- }
1205
- /**
1206
- * Resolved keybinding specs the queue UI surfaces to the user. Each
1207
- * field is the literal string from `keybindings.json` ("ctrl+return",
1208
- * "backspace" — or whatever the user has configured) formatted for
1209
- * display via {@link formatBindingForDisplay} at render time so any
1210
- * customization (e.g. `"cmd+up"`, `"delete"`) shows the actual key.
1211
- */
1212
- interface QueueShortcuts {
1213
- enter: string;
1214
- push: string;
1215
- drop: string;
1129
+ focusedSessionId: string | null;
1130
+ currentId: string | null;
1131
+ onPick: (id: string) => void;
1132
+ onCreate: () => void;
1133
+ /**
1134
+ * Notified as the user navigates between rows. Receives the session id
1135
+ * of the focused row, or `null` when "+ new" is focused (no session to
1136
+ * act on). Parents use this to wire `openSessionDetails` against the live focus.
1137
+ */
1138
+ onFocusChange?: (id: string | null) => void;
1139
+ /** Async full-history matches keyed by session id. */
1140
+ contentMatches?: ReadonlyMap<string, SessionHistoryMatch>;
1141
+ contentSearching?: boolean;
1142
+ contentSearchProgress?: {
1143
+ done: number;
1144
+ total: number;
1145
+ };
1146
+ /** Called whenever the local conversation-filter query changes. */
1147
+ onSearchQueryChange?: (query: string) => void;
1148
+ /**
1149
+ * When `true`, render each session's project label under the title.
1150
+ * Off by default — when the list is already filtered to one project
1151
+ * the label would just repeat that project on every row.
1152
+ */
1153
+ showAllProjects?: boolean;
1154
+ /** `Settings.artifacts` — off hides the `N artifacts` badge and the badge line on rows. */
1155
+ showArtifacts?: boolean;
1156
+ /** A session's badges (commits, pull requests, extension kinds): the line under its stats. */
1157
+ loadBadges?: (sessionId: string) => Promise<readonly SessionBadgeEntry[]>;
1158
+ /** Ctrl-click on a badge that stands for one thing (a URL or a path). */
1159
+ onOpenHref?: (href: string) => void;
1160
+ /** Click on a badge: open that chat (by row id) with the rail on `panelId` (default Artifacts), focused on the badge. */
1161
+ onOpenBadge?: (rowId: string, panelId: string | undefined, focus: PanelFocus) => void;
1162
+ /** Right-click on a badge: its actions modal. */
1163
+ onBadgeMenu?: (target: BadgeTarget) => void;
1164
+ /**
1165
+ * Fired on `tab` — cycles the list scope (current project / all
1166
+ * projects / active windows). The parent owns the scope state (it
1167
+ * drives the store query), so this is a plain notification.
1168
+ */
1169
+ onToggleScope?: () => void;
1170
+ /**
1171
+ * Scope label for the title overlay when a non-project scope is on
1172
+ * ("all projects", "active windows"). Falls back to "all projects"
1173
+ * when `showAllProjects` is set without a label.
1174
+ */
1175
+ scopeLabel?: string;
1176
+ /**
1177
+ * Live presence per session ROW id (`sessionRowId`: host + id; daemon mode) — drives the per-row
1178
+ * status glyph: running, awaiting input, or attached-idle.
1179
+ */
1180
+ presence?: ReadonlyMap<string, SessionPresenceInfo>;
1181
+ /**
1182
+ * Current project root, used to label "current project" on rows that
1183
+ * belong to it when `showAllProjects` is on. Untagged (legacy)
1184
+ * sessions render as "untagged".
1185
+ */
1186
+ currentProjectRoot?: string;
1187
+ /**
1188
+ * Id of the resolved "Main" orchestration session, or `null` when
1189
+ * orchestration is off/ungated or none has been resolved yet (the
1190
+ * `openMainSession` chord creates it lazily — this screen never fabricates
1191
+ * a row for one that doesn't exist). When set and present in `sessions`,
1192
+ * its row is pinned first with a `◆ Main` badge.
1193
+ */
1194
+ mainSessionId?: string | null;
1195
+ /**
1196
+ * One-line warning under the list (e.g. "a run is in progress — abort
1197
+ * first"). Replaces the search spinner slot while set.
1198
+ */
1199
+ notice?: string | null;
1200
+ /** `ctrl+r` on a row whose environment failed — provision it again. */
1201
+ onRetryEnvironment?: (id: string) => void;
1202
+ /**
1203
+ * Several hosts (remote hosts on): one header per host, This computer
1204
+ * first. `null` / absent: one host, no headers (the list as it always was).
1205
+ */
1206
+ hostGroups?: readonly SessionHostGroup[] | null;
1207
+ /** The host that listed a session (a `hostGroups` key). */
1208
+ hostOfSession?: (id: string) => string | undefined;
1216
1209
  }
1210
+ declare function SessionsScreen({ sessions, currentId, focusedSessionId, onPick, onCreate, onFocusChange, contentMatches, contentSearching, contentSearchProgress, onSearchQueryChange, showAllProjects, scopeLabel, presence, showArtifacts, loadBadges, onOpenHref, onOpenBadge, onBadgeMenu, onToggleScope, currentProjectRoot, mainSessionId, notice, onRetryEnvironment, hostGroups, hostOfSession }: SessionsScreenProps): import("react").ReactNode;
1217
1211
  //#endregion
1218
1212
  //#region src/tui/session-details-modal.d.ts
1219
1213
  /** Result handed back by the host's export handler — drives the success footer. */
@@ -1223,7 +1217,14 @@ interface SessionExportResult {
1223
1217
  /** Format that was written — used to label the success banner. */
1224
1218
  format: SessionExportFormat;
1225
1219
  }
1220
+ /** The session environment's own commands (push, open PR) — see `EnvironmentAction`. */
1221
+ interface SessionEnvironmentActions {
1222
+ list: (sessionId: string) => Promise<EnvironmentActionSummary[]>;
1223
+ run: (sessionId: string, actionId: string) => Promise<EnvironmentActionResult>;
1224
+ }
1226
1225
  interface SessionDetailsModalActions {
1226
+ /** Environment commands, run with `1`–`9`. Omit when the host can't run them. */
1227
+ environment?: SessionEnvironmentActions;
1227
1228
  /** Delete the entire session from the store. Parent handles teardown / navigation. */
1228
1229
  onDelete: (sessionId: string) => void | Promise<void>;
1229
1230
  /**
@@ -1317,13 +1318,7 @@ interface SessionCompactResult {
1317
1318
  */
1318
1319
  effectiveTokens: number;
1319
1320
  }
1320
- declare function SessionDetailsModal({
1321
- session,
1322
- title,
1323
- isCurrent,
1324
- actions,
1325
- keybindings
1326
- }: {
1321
+ declare function SessionDetailsModal({ session, title, isCurrent, actions, keybindings }: {
1327
1322
  session: SessionData;
1328
1323
  /**
1329
1324
  * Display title for the session. Falls back to the first user turn's
@@ -1331,13 +1326,15 @@ declare function SessionDetailsModal({
1331
1326
  * title and threads it through so the modal header matches what the
1332
1327
  * sessions list / chat title bar are showing.
1333
1328
  */
1334
- title?: string; /** True when this is the actively-mounted session — gates the "active" tag in the header. */
1329
+ title?: string;
1330
+ /** True when this is the actively-mounted session — gates the "active" tag in the header. */
1335
1331
  isCurrent: boolean;
1336
- actions: SessionDetailsModalActions; /** Effective keybindings — the modal-internal letter actions resolve through this. */
1332
+ actions: SessionDetailsModalActions;
1333
+ /** Effective keybindings — the modal-internal letter actions resolve through this. */
1337
1334
  keybindings: KeyBindings;
1338
1335
  }): import("react").ReactNode;
1339
1336
  //#endregion
1340
- //#region src/tui/settings-modal.d.ts
1337
+ //#region src/tui/settings/settings-actions.d.ts
1341
1338
  interface SettingsActions {
1342
1339
  /**
1343
1340
  * Generic "open the auth flow" — only used as a FALLBACK action row on the
@@ -1379,6 +1376,12 @@ interface SettingsActions {
1379
1376
  * Closes the modal as a side effect — the picker owns the modal slot.
1380
1377
  */
1381
1378
  onPickCompactionModel?: () => void;
1379
+ /**
1380
+ * Open Settings → Environments (`environments-settings.tsx`): the default
1381
+ * environment for new sessions and each kind's options. Replaces the
1382
+ * settings modal in the single modal slot.
1383
+ */
1384
+ onOpenEnvironments?: () => void;
1382
1385
  /**
1383
1386
  * Open the "Import from Claude Code" flow (sessions / MCP servers /
1384
1387
  * skills — see `claude-import.ts`). Hosts wire it only when a
@@ -1488,9 +1491,10 @@ interface SettingsActions {
1488
1491
  * panel always shows the freshest tool list. Hosts that don't
1489
1492
  * want the auto-refresh (no live agent yet, no MCP credentials
1490
1493
  * wired) can omit the action — the panel then degrades to
1491
- * whatever the on-disk cache last captured.
1494
+ * whatever the on-disk cache last captured. With `name`, tests that
1495
+ * one server only (`ctrl+t` on a server row).
1492
1496
  */
1493
- onRefreshMcpTools?: () => Promise<void> | void;
1497
+ onRefreshMcpTools?: (name?: string) => Promise<void> | void;
1494
1498
  /**
1495
1499
  * Open an "edit extension" session rooted at `dir` (`ctrl+e` on a
1496
1500
  * focused extension row). The host chdir's into the dir, opens a fresh
@@ -1533,7 +1537,8 @@ interface SettingsActions {
1533
1537
  catalog: readonly LoadedExtension[];
1534
1538
  inactive: readonly LoadedExtension[];
1535
1539
  configCategories: Readonly<Record<string, ExtensionConfigCategory>>;
1536
- configItems: Readonly<Record<string, Readonly<Record<string, StoredExtensionConfigItem>>>>; /** Plugins the rebuilt registry's extensions loaded. */
1540
+ configItems: Readonly<Record<string, Readonly<Record<string, StoredExtensionConfigItem>>>>;
1541
+ /** Plugins the rebuilt registry's extensions loaded. */
1537
1542
  plugins: readonly LoadedPluginRecord[];
1538
1543
  /**
1539
1544
  * Skills the registry contributes, ALREADY filtered by
@@ -1619,27 +1624,20 @@ interface AuthenticationView {
1619
1624
  /** Detected providers from `detectAuth` — used to render the list with credential badges. */
1620
1625
  providers?: readonly ProviderAuth[];
1621
1626
  }
1622
- declare function SettingsModal({
1623
- skillsCatalog: skillsCatalogProp,
1624
- mcpsCatalog: mcpsCatalogProp,
1625
- mcpsErrors: mcpsErrorsProp,
1626
- keybindings,
1627
- keybindingsPath,
1628
- extensionKeybindings,
1629
- extensionThemes: extensionThemesProp,
1630
- extensionsCatalog: extensionsCatalogProp,
1631
- extensionsInactive: extensionsInactiveProp,
1632
- pluginsCatalog,
1633
- pluginsFromExtensions,
1634
- extensionContributedSkills,
1635
- extensionConfigCategories: extensionConfigCategoriesProp,
1636
- extensionConfigItems: extensionConfigItemsProp,
1637
- modelCatalog,
1638
- logs,
1639
- authentication,
1640
- actions,
1641
- version
1642
- }?: {
1627
+ //#endregion
1628
+ //#region src/tui/settings/shared.d.ts
1629
+ type TabId = 'authentication' | 'extensions' | 'instructions' | 'keybindings' | 'logs' | 'mcps' | 'skills' | PanelTabId | SettingsCategory;
1630
+ /**
1631
+ * Tabs whose body is a self-contained panel (it owns its keys and layout)
1632
+ * instead of a row list: the Hosts page, and a server's stand-ins for the
1633
+ * Authentication / Skills / MCP / Extensions tabs while the Settings modal
1634
+ * edits that server (`host-settings-scope`).
1635
+ */
1636
+ type PanelTabId = 'hosts' | 'host-auth' | 'host-skills' | 'host-mcps' | 'host-extensions';
1637
+ //#endregion
1638
+ //#region src/tui/settings/settings-modal-props.d.ts
1639
+ /** Props of `<SettingsModal>` (see `settings-modal.tsx`). */
1640
+ interface SettingsModalProps {
1643
1641
  /**
1644
1642
  * Embedder fallback — discovered skills when no `<DiscoveryProvider>`
1645
1643
  * is mounted. In the in-app flow this is ignored; the modal reads
@@ -1652,8 +1650,10 @@ declare function SettingsModal({
1652
1650
  * modal's bottom border as `zidane v…`. Omitted → no version chip.
1653
1651
  */
1654
1652
  version?: string;
1655
- skillsCatalog?: readonly SkillConfig[]; /** Embedder fallback — discovered MCP servers; superseded by context when present. */
1656
- mcpsCatalog?: readonly DiscoveredMcp[]; /** Embedder fallback — `mcps.json` parse errors; superseded by context when present. */
1653
+ skillsCatalog?: readonly SkillConfig[];
1654
+ /** Embedder fallback — discovered MCP servers; superseded by context when present. */
1655
+ mcpsCatalog?: readonly DiscoveredMcp[];
1656
+ /** Embedder fallback — `mcps.json` parse errors; superseded by context when present. */
1657
1657
  mcpsErrors?: readonly DiscoveryError[];
1658
1658
  /**
1659
1659
  * Merged keybinding map. When provided, a "Keybindings" tab appears
@@ -1661,7 +1661,8 @@ declare function SettingsModal({
1661
1661
  * `actions.onOpenKeybindings`. The UI-tab action row for the same
1662
1662
  * affordance is dropped when this is set (no duplicate entry points).
1663
1663
  */
1664
- keybindings?: KeyBindings; /** Absolute path to `keybindings.json`. Surfaced on the pinned edit-file button. */
1664
+ keybindings?: KeyBindings;
1665
+ /** Absolute path to `keybindings.json`. Surfaced on the pinned edit-file button. */
1665
1666
  keybindingsPath?: string;
1666
1667
  /**
1667
1668
  * Extension-contributed keybindings, already resolved against the
@@ -1692,7 +1693,7 @@ declare function SettingsModal({
1692
1693
  * directly from there. Toggling OFF filters contributions live;
1693
1694
  * toggling ON hot-loads the extension (the host rebuilds the registry,
1694
1695
  * so its settings appear immediately — see "Hot-load on enable" in
1695
- * app.tsx). Agent-side contributions apply on the next run.
1696
+ * `extensions/use-extension-auto-reload.ts`). Agent-side contributions apply on the next run.
1696
1697
  */
1697
1698
  extensionsCatalog?: readonly LoadedExtension[];
1698
1699
  /**
@@ -1760,7 +1761,30 @@ declare function SettingsModal({
1760
1761
  */
1761
1762
  authentication?: AuthenticationView;
1762
1763
  actions?: SettingsActions;
1763
- }): ReactNode;
1764
+ /** Panel tabs (`PanelTabId`): the Hosts page, a server's stand-in tabs. Absent ids are not shown. */
1765
+ panels?: Partial<Record<PanelTabId, SettingsPanel>>;
1766
+ /** Built-in tabs to leave out (a server's settings have no local catalogs to show). */
1767
+ hiddenTabs?: readonly TabId[];
1768
+ /** Replaces "settings" in the title (e.g. `settings · box`). */
1769
+ title?: string;
1770
+ }
1771
+ /** A panel tab's body. Mounted while its tab is active; it owns its keys except ←/→ (unless it captures input). */
1772
+ interface SettingsPanel {
1773
+ render: (props: SettingsPanelRenderProps) => ReactNode;
1774
+ }
1775
+ interface SettingsPanelRenderProps {
1776
+ /** The modal's search text. */
1777
+ query: string;
1778
+ /**
1779
+ * The panel is editing (a text field, a confirmation): every key and esc
1780
+ * go to it, the search input lets go. `false` hands them back.
1781
+ */
1782
+ setCaptured: (captured: boolean) => void;
1783
+ contentCols: number;
1784
+ }
1785
+ //#endregion
1786
+ //#region src/tui/settings-modal.d.ts
1787
+ declare function SettingsModal(props?: SettingsModalProps): import("react").ReactNode;
1764
1788
  //#endregion
1765
1789
  //#region src/tui/skills-settings.d.ts
1766
1790
  /**
@@ -1773,10 +1797,7 @@ declare function SettingsModal({
1773
1797
  * `<SettingsModal>` which exposes the same affordance via its own
1774
1798
  * `SettingsActions.onRefreshSkills` plumbing.
1775
1799
  */
1776
- declare function SkillsSettingsModal({
1777
- catalog,
1778
- onRefresh
1779
- }: {
1800
+ declare function SkillsSettingsModal({ catalog, onRefresh }: {
1780
1801
  catalog: readonly SkillConfig[];
1781
1802
  onRefresh?: () => Promise<void> | void;
1782
1803
  }): import("react").ReactNode;
@@ -1813,7 +1834,6 @@ declare function buildMdStyle(theme: Theme, overrides?: Record<string, Partial<S
1813
1834
  * colors (headings, bold, code) paint at full brightness and the block
1814
1835
  * doesn't look dim at all. Italic is preserved (it carries no color).
1815
1836
  */
1816
-
1817
1837
  flattenFg?: RGBA): SyntaxStyle;
1818
1838
  /**
1819
1839
  * Active markdown / syntax-highlighting style. Returns a single shared
@@ -1850,23 +1870,17 @@ declare function useMdStyle(opts?: {
1850
1870
  * (chat layer) — a GUI shell can build its own toggle list against the
1851
1871
  * same hook without pulling OpenTUI.
1852
1872
  */
1853
- declare function ToggleListModal<T>({
1854
- catalog,
1855
- keyOf,
1856
- settingKey,
1857
- gcKeys,
1858
- title,
1859
- renderDetail,
1860
- emptyState,
1861
- preamble,
1862
- onRefresh
1863
- }: {
1873
+ declare function ToggleListModal<T>({ catalog, keyOf, settingKey, gcKeys, title, renderDetail, emptyState, preamble, onRefresh }: {
1864
1874
  catalog: readonly T[];
1865
1875
  keyOf: (entry: T) => string;
1866
- settingKey: EnabledAllowlistKey; /** Forwarded to `useEnabledToggleSet` — names that survive allowlist GC beyond the catalog. */
1867
- gcKeys?: readonly string[]; /** Modal title stem — rendered as `${title} · N / M enabled` in non-empty mode. */
1868
- title: string; /** Mute-colored trailing copy for each row (description, transport, …). */
1869
- renderDetail?: (entry: T) => ReactNode; /** What to render when `catalog` is empty (hint about where to drop config). */
1876
+ settingKey: EnabledAllowlistKey;
1877
+ /** Forwarded to `useEnabledToggleSet` — names that survive allowlist GC beyond the catalog. */
1878
+ gcKeys?: readonly string[];
1879
+ /** Modal title stem — rendered as `${title} · N / M enabled` in non-empty mode. */
1880
+ title: string;
1881
+ /** Mute-colored trailing copy for each row (description, transport, …). */
1882
+ renderDetail?: (entry: T) => ReactNode;
1883
+ /** What to render when `catalog` is empty (hint about where to drop config). */
1870
1884
  emptyState: ReactNode;
1871
1885
  /**
1872
1886
  * Optional content rendered ABOVE the list (or the empty state). Used to
@@ -1893,21 +1907,18 @@ interface TurnDetailsModalActions {
1893
1907
  /** Edit the text content of this turn. */
1894
1908
  onEdit: (turnId: string, newText: string) => void;
1895
1909
  }
1896
- declare function TurnDetailsModal({
1897
- turn,
1898
- toolResultTurns,
1899
- searchQuery,
1900
- index,
1901
- total,
1902
- actions,
1903
- keybindings
1904
- }: {
1905
- turn: SessionTurn; /** Tool-result turns owned by tool calls in `turn`. */
1906
- toolResultTurns?: SessionTurn[]; /** Active conversation-search query used to highlight preview matches. */
1907
- searchQuery?: string; /** 1-based position of this turn in the session, for the header. */
1908
- index: number; /** Total turn count, for the `n / N` header. */
1910
+ declare function TurnDetailsModal({ turn, toolResultTurns, searchQuery, index, total, actions, keybindings }: {
1911
+ turn: SessionTurn;
1912
+ /** Tool-result turns owned by tool calls in `turn`. */
1913
+ toolResultTurns?: SessionTurn[];
1914
+ /** Active conversation-search query used to highlight preview matches. */
1915
+ searchQuery?: string;
1916
+ /** 1-based position of this turn in the session, for the header. */
1917
+ index: number;
1918
+ /** Total turn count, for the `n / N` header. */
1909
1919
  total: number;
1910
- actions: TurnDetailsModalActions; /** Effective keybindings — the modal-internal letter actions resolve through this. */
1920
+ actions: TurnDetailsModalActions;
1921
+ /** Effective keybindings — the modal-internal letter actions resolve through this. */
1911
1922
  keybindings: KeyBindings;
1912
1923
  }): import("react").ReactNode;
1913
1924
  //#endregion
@@ -1938,6 +1949,12 @@ interface RunTuiOptions extends Partial<ChatOptions> {
1938
1949
  * while disabled disk extensions are never imported at all.
1939
1950
  */
1940
1951
  extensions?: readonly ExtensionDefinition[];
1952
+ /**
1953
+ * Run every session on this remote zidane-server instead of a local host
1954
+ * (`zidane --host <wss-url> --token <t>`): the whole window, multi-process
1955
+ * semantics. Ignored under `ZIDANE_NO_REMOTE=1` (see `./host-target`).
1956
+ */
1957
+ remoteHost?: RemoteHost;
1941
1958
  }
1942
1959
  /**
1943
1960
  * Boot a full chat TUI with sensible defaults. **Does not return** under