@pentoshi/clai 2.0.61 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. package/README.md +262 -368
  2. package/dist/agent/context-manager.d.ts +5 -0
  3. package/dist/agent/context-manager.js +14 -2
  4. package/dist/agent/context-manager.js.map +1 -1
  5. package/dist/agent/events.d.ts +4 -1
  6. package/dist/agent/runner.js +210 -91
  7. package/dist/agent/runner.js.map +1 -1
  8. package/dist/agent/tool-call-parser.d.ts +15 -0
  9. package/dist/agent/tool-call-parser.js +171 -2
  10. package/dist/agent/tool-call-parser.js.map +1 -1
  11. package/dist/app/adapters/agent-event-adapter.d.ts +29 -0
  12. package/dist/app/adapters/agent-event-adapter.js +143 -0
  13. package/dist/app/adapters/agent-event-adapter.js.map +1 -0
  14. package/dist/app/adapters/current-agent-adapter.d.ts +7 -0
  15. package/dist/app/adapters/current-agent-adapter.js +27 -0
  16. package/dist/app/adapters/current-agent-adapter.js.map +1 -0
  17. package/dist/app/adapters/current-jobs-adapter.d.ts +4 -0
  18. package/dist/app/adapters/current-jobs-adapter.js +13 -0
  19. package/dist/app/adapters/current-jobs-adapter.js.map +1 -0
  20. package/dist/app/adapters/current-store-adapter.d.ts +3 -0
  21. package/dist/app/adapters/current-store-adapter.js +22 -0
  22. package/dist/app/adapters/current-store-adapter.js.map +1 -0
  23. package/dist/app/adapters/current-terminal-adapter.d.ts +9 -0
  24. package/dist/app/adapters/current-terminal-adapter.js +31 -0
  25. package/dist/app/adapters/current-terminal-adapter.js.map +1 -0
  26. package/dist/app/adapters/current-updates-adapter.d.ts +7 -0
  27. package/dist/app/adapters/current-updates-adapter.js +31 -0
  28. package/dist/app/adapters/current-updates-adapter.js.map +1 -0
  29. package/dist/app/adapters/in-memory-clipboard-adapter.d.ts +10 -0
  30. package/dist/app/adapters/in-memory-clipboard-adapter.js +20 -0
  31. package/dist/app/adapters/in-memory-clipboard-adapter.js.map +1 -0
  32. package/dist/app/commands/command.d.ts +24 -0
  33. package/dist/app/commands/command.js +4 -0
  34. package/dist/app/commands/command.js.map +1 -0
  35. package/dist/app/commands/registry.d.ts +45 -0
  36. package/dist/app/commands/registry.js +164 -0
  37. package/dist/app/commands/registry.js.map +1 -0
  38. package/dist/app/controllers/disposable.d.ts +15 -0
  39. package/dist/app/controllers/disposable.js +38 -0
  40. package/dist/app/controllers/disposable.js.map +1 -0
  41. package/dist/app/controllers/job-controller.d.ts +22 -0
  42. package/dist/app/controllers/job-controller.js +35 -0
  43. package/dist/app/controllers/job-controller.js.map +1 -0
  44. package/dist/app/controllers/plan-controller.d.ts +31 -0
  45. package/dist/app/controllers/plan-controller.js +69 -0
  46. package/dist/app/controllers/plan-controller.js.map +1 -0
  47. package/dist/app/controllers/session-controller.d.ts +167 -0
  48. package/dist/app/controllers/session-controller.js +467 -0
  49. package/dist/app/controllers/session-controller.js.map +1 -0
  50. package/dist/app/controllers/turn-controller.d.ts +52 -0
  51. package/dist/app/controllers/turn-controller.js +118 -0
  52. package/dist/app/controllers/turn-controller.js.map +1 -0
  53. package/dist/app/events/app-event.d.ts +118 -0
  54. package/dist/app/events/app-event.js +25 -0
  55. package/dist/app/events/app-event.js.map +1 -0
  56. package/dist/app/events/event-buffer.d.ts +51 -0
  57. package/dist/app/events/event-buffer.js +109 -0
  58. package/dist/app/events/event-buffer.js.map +1 -0
  59. package/dist/app/events/sequencer.d.ts +32 -0
  60. package/dist/app/events/sequencer.js +55 -0
  61. package/dist/app/events/sequencer.js.map +1 -0
  62. package/dist/app/ports/agent-port.d.ts +29 -0
  63. package/dist/app/ports/agent-port.js +2 -0
  64. package/dist/app/ports/agent-port.js.map +1 -0
  65. package/dist/app/ports/clipboard-port.d.ts +9 -0
  66. package/dist/app/ports/clipboard-port.js +2 -0
  67. package/dist/app/ports/clipboard-port.js.map +1 -0
  68. package/dist/app/ports/confirm-port.d.ts +17 -0
  69. package/dist/app/ports/confirm-port.js +2 -0
  70. package/dist/app/ports/confirm-port.js.map +1 -0
  71. package/dist/app/ports/jobs-port.d.ts +18 -0
  72. package/dist/app/ports/jobs-port.js +2 -0
  73. package/dist/app/ports/jobs-port.js.map +1 -0
  74. package/dist/app/ports/persistence-port.d.ts +21 -0
  75. package/dist/app/ports/persistence-port.js +2 -0
  76. package/dist/app/ports/persistence-port.js.map +1 -0
  77. package/dist/app/ports/secret-port.d.ts +12 -0
  78. package/dist/app/ports/secret-port.js +2 -0
  79. package/dist/app/ports/secret-port.js.map +1 -0
  80. package/dist/app/ports/terminal-port.d.ts +18 -0
  81. package/dist/app/ports/terminal-port.js +2 -0
  82. package/dist/app/ports/terminal-port.js.map +1 -0
  83. package/dist/app/ports/updates-port.d.ts +12 -0
  84. package/dist/app/ports/updates-port.js +2 -0
  85. package/dist/app/ports/updates-port.js.map +1 -0
  86. package/dist/commands/doctor.js +9 -0
  87. package/dist/commands/doctor.js.map +1 -1
  88. package/dist/commands/update.js +1 -1
  89. package/dist/commands/update.js.map +1 -1
  90. package/dist/index.js +9 -6
  91. package/dist/index.js.map +1 -1
  92. package/dist/llm/router.js +4 -2
  93. package/dist/llm/router.js.map +1 -1
  94. package/dist/prompts/index.d.ts +1 -1
  95. package/dist/prompts/index.js +5 -3
  96. package/dist/prompts/index.js.map +1 -1
  97. package/dist/repl/slash-commands.js +1 -1
  98. package/dist/repl/slash-commands.js.map +1 -1
  99. package/dist/repl.js +35 -107
  100. package/dist/repl.js.map +1 -1
  101. package/dist/store/config.js +3 -1
  102. package/dist/store/config.js.map +1 -1
  103. package/dist/store/history.d.ts +26 -2
  104. package/dist/store/history.js +383 -72
  105. package/dist/store/history.js.map +1 -1
  106. package/dist/store/logs.js +3 -3
  107. package/dist/store/logs.js.map +1 -1
  108. package/dist/store/paths.d.ts +6 -0
  109. package/dist/store/paths.js +38 -0
  110. package/dist/store/paths.js.map +1 -0
  111. package/dist/store/plan.js +8 -5
  112. package/dist/store/plan.js.map +1 -1
  113. package/dist/tools/jobs.js +2 -2
  114. package/dist/tools/jobs.js.map +1 -1
  115. package/dist/tools/registry.js +117 -46
  116. package/dist/tools/registry.js.map +1 -1
  117. package/dist/tools/shell.js +2 -2
  118. package/dist/tools/shell.js.map +1 -1
  119. package/dist/tui/state.js +20 -17
  120. package/dist/tui/state.js.map +1 -1
  121. package/dist/tui-v2/actions/action-id.d.ts +14 -0
  122. package/dist/tui-v2/actions/action-id.js +109 -0
  123. package/dist/tui-v2/actions/action-id.js.map +1 -0
  124. package/dist/tui-v2/actions/action-router.d.ts +18 -0
  125. package/dist/tui-v2/actions/action-router.js +62 -0
  126. package/dist/tui-v2/actions/action-router.js.map +1 -0
  127. package/dist/tui-v2/actions/chord-from-key.d.ts +26 -0
  128. package/dist/tui-v2/actions/chord-from-key.js +45 -0
  129. package/dist/tui-v2/actions/chord-from-key.js.map +1 -0
  130. package/dist/tui-v2/actions/keymap.d.ts +24 -0
  131. package/dist/tui-v2/actions/keymap.js +134 -0
  132. package/dist/tui-v2/actions/keymap.js.map +1 -0
  133. package/dist/tui-v2/app/App.d.ts +13 -0
  134. package/dist/tui-v2/app/App.js +320 -0
  135. package/dist/tui-v2/app/App.js.map +1 -0
  136. package/dist/tui-v2/app/command-handlers.d.ts +8 -0
  137. package/dist/tui-v2/app/command-handlers.js +66 -0
  138. package/dist/tui-v2/app/command-handlers.js.map +1 -0
  139. package/dist/tui-v2/app/commands/config-commands.d.ts +14 -0
  140. package/dist/tui-v2/app/commands/config-commands.js +161 -0
  141. package/dist/tui-v2/app/commands/config-commands.js.map +1 -0
  142. package/dist/tui-v2/app/commands/key-commands.d.ts +9 -0
  143. package/dist/tui-v2/app/commands/key-commands.js +263 -0
  144. package/dist/tui-v2/app/commands/key-commands.js.map +1 -0
  145. package/dist/tui-v2/app/commands/picker-commands.d.ts +24 -0
  146. package/dist/tui-v2/app/commands/picker-commands.js +423 -0
  147. package/dist/tui-v2/app/commands/picker-commands.js.map +1 -0
  148. package/dist/tui-v2/app/commands/session-commands.d.ts +19 -0
  149. package/dist/tui-v2/app/commands/session-commands.js +162 -0
  150. package/dist/tui-v2/app/commands/session-commands.js.map +1 -0
  151. package/dist/tui-v2/app/plan-lifecycle.d.ts +16 -0
  152. package/dist/tui-v2/app/plan-lifecycle.js +59 -0
  153. package/dist/tui-v2/app/plan-lifecycle.js.map +1 -0
  154. package/dist/tui-v2/app/providers.d.ts +17 -0
  155. package/dist/tui-v2/app/providers.js +32 -0
  156. package/dist/tui-v2/app/providers.js.map +1 -0
  157. package/dist/tui-v2/bootstrap/capabilities.d.ts +35 -0
  158. package/dist/tui-v2/bootstrap/capabilities.js +93 -0
  159. package/dist/tui-v2/bootstrap/capabilities.js.map +1 -0
  160. package/dist/tui-v2/bootstrap/composition-root.d.ts +85 -0
  161. package/dist/tui-v2/bootstrap/composition-root.js +131 -0
  162. package/dist/tui-v2/bootstrap/composition-root.js.map +1 -0
  163. package/dist/tui-v2/bootstrap/disable-native-selection.d.ts +11 -0
  164. package/dist/tui-v2/bootstrap/disable-native-selection.js +13 -0
  165. package/dist/tui-v2/bootstrap/disable-native-selection.js.map +1 -0
  166. package/dist/tui-v2/bootstrap/lifecycle.d.ts +62 -0
  167. package/dist/tui-v2/bootstrap/lifecycle.js +123 -0
  168. package/dist/tui-v2/bootstrap/lifecycle.js.map +1 -0
  169. package/dist/tui-v2/bootstrap/osc52-clipboard.d.ts +28 -0
  170. package/dist/tui-v2/bootstrap/osc52-clipboard.js +44 -0
  171. package/dist/tui-v2/bootstrap/osc52-clipboard.js.map +1 -0
  172. package/dist/tui-v2/bootstrap/overlay-ports.d.ts +12 -0
  173. package/dist/{tui/confirm.js → tui-v2/bootstrap/overlay-ports.js} +17 -25
  174. package/dist/tui-v2/bootstrap/overlay-ports.js.map +1 -0
  175. package/dist/tui-v2/bootstrap/pager-export.d.ts +24 -0
  176. package/dist/tui-v2/bootstrap/pager-export.js +87 -0
  177. package/dist/tui-v2/bootstrap/pager-export.js.map +1 -0
  178. package/dist/tui-v2/bootstrap/start-tui-v2.d.ts +15 -0
  179. package/dist/tui-v2/bootstrap/start-tui-v2.js +95 -0
  180. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -0
  181. package/dist/tui-v2/bootstrap/ui-selection.d.ts +30 -0
  182. package/dist/tui-v2/bootstrap/ui-selection.js +59 -0
  183. package/dist/tui-v2/bootstrap/ui-selection.js.map +1 -0
  184. package/dist/tui-v2/components/completion/completion-menu.d.ts +23 -0
  185. package/dist/tui-v2/components/completion/completion-menu.js +84 -0
  186. package/dist/tui-v2/components/completion/completion-menu.js.map +1 -0
  187. package/dist/tui-v2/components/jobs/jobs-panel.d.ts +16 -0
  188. package/dist/tui-v2/components/jobs/jobs-panel.js +92 -0
  189. package/dist/tui-v2/components/jobs/jobs-panel.js.map +1 -0
  190. package/dist/tui-v2/components/modal/confirm-modal.d.ts +21 -0
  191. package/dist/tui-v2/components/modal/confirm-modal.js +71 -0
  192. package/dist/tui-v2/components/modal/confirm-modal.js.map +1 -0
  193. package/dist/tui-v2/components/modal/prompt-actions-modal.d.ts +15 -0
  194. package/dist/tui-v2/components/modal/prompt-actions-modal.js +80 -0
  195. package/dist/tui-v2/components/modal/prompt-actions-modal.js.map +1 -0
  196. package/dist/tui-v2/components/modal/secret-modal.d.ts +24 -0
  197. package/dist/tui-v2/components/modal/secret-modal.js +50 -0
  198. package/dist/tui-v2/components/modal/secret-modal.js.map +1 -0
  199. package/dist/tui-v2/components/overlay/overlay-host.d.ts +17 -0
  200. package/dist/tui-v2/components/overlay/overlay-host.js +28 -0
  201. package/dist/tui-v2/components/overlay/overlay-host.js.map +1 -0
  202. package/dist/tui-v2/components/pager/pager.d.ts +20 -0
  203. package/dist/tui-v2/components/pager/pager.js +396 -0
  204. package/dist/tui-v2/components/pager/pager.js.map +1 -0
  205. package/dist/tui-v2/components/picker/picker.d.ts +17 -0
  206. package/dist/tui-v2/components/picker/picker.js +222 -0
  207. package/dist/tui-v2/components/picker/picker.js.map +1 -0
  208. package/dist/tui-v2/components/plan/plan-view.d.ts +20 -0
  209. package/dist/tui-v2/components/plan/plan-view.js +116 -0
  210. package/dist/tui-v2/components/plan/plan-view.js.map +1 -0
  211. package/dist/tui-v2/components/queue/queue-panel.d.ts +23 -0
  212. package/dist/tui-v2/components/queue/queue-panel.js +58 -0
  213. package/dist/tui-v2/components/queue/queue-panel.js.map +1 -0
  214. package/dist/tui-v2/components/status/status-line.d.ts +27 -0
  215. package/dist/tui-v2/components/status/status-line.js +158 -0
  216. package/dist/tui-v2/components/status/status-line.js.map +1 -0
  217. package/dist/tui-v2/components/toast/toast-host.d.ts +15 -0
  218. package/dist/tui-v2/components/toast/toast-host.js +48 -0
  219. package/dist/tui-v2/components/toast/toast-host.js.map +1 -0
  220. package/dist/tui-v2/components/transcript/assistant-message.d.ts +20 -0
  221. package/dist/tui-v2/components/transcript/assistant-message.js +35 -0
  222. package/dist/tui-v2/components/transcript/assistant-message.js.map +1 -0
  223. package/dist/tui-v2/components/transcript/compacted-row.d.ts +19 -0
  224. package/dist/tui-v2/components/transcript/compacted-row.js +94 -0
  225. package/dist/tui-v2/components/transcript/compacted-row.js.map +1 -0
  226. package/dist/tui-v2/components/transcript/intro-card.d.ts +19 -0
  227. package/dist/tui-v2/components/transcript/intro-card.js +50 -0
  228. package/dist/tui-v2/components/transcript/intro-card.js.map +1 -0
  229. package/dist/tui-v2/components/transcript/linkable-text.d.ts +21 -0
  230. package/dist/tui-v2/components/transcript/linkable-text.js +46 -0
  231. package/dist/tui-v2/components/transcript/linkable-text.js.map +1 -0
  232. package/dist/tui-v2/components/transcript/notice-row.d.ts +14 -0
  233. package/dist/tui-v2/components/transcript/notice-row.js +40 -0
  234. package/dist/tui-v2/components/transcript/notice-row.js.map +1 -0
  235. package/dist/tui-v2/components/transcript/search-bar.d.ts +19 -0
  236. package/dist/tui-v2/components/transcript/search-bar.js +7 -0
  237. package/dist/tui-v2/components/transcript/search-bar.js.map +1 -0
  238. package/dist/tui-v2/components/transcript/thinking-block.d.ts +22 -0
  239. package/dist/tui-v2/components/transcript/thinking-block.js +27 -0
  240. package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -0
  241. package/dist/tui-v2/components/transcript/tool-card.d.ts +26 -0
  242. package/dist/tui-v2/components/transcript/tool-card.js +175 -0
  243. package/dist/tui-v2/components/transcript/tool-card.js.map +1 -0
  244. package/dist/tui-v2/components/transcript/transcript-row.d.ts +25 -0
  245. package/dist/tui-v2/components/transcript/transcript-row.js +30 -0
  246. package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -0
  247. package/dist/tui-v2/components/transcript/transcript-scroll-port.d.ts +52 -0
  248. package/dist/tui-v2/components/transcript/transcript-scroll-port.js +86 -0
  249. package/dist/tui-v2/components/transcript/transcript-scroll-port.js.map +1 -0
  250. package/dist/tui-v2/components/transcript/transcript-view.d.ts +24 -0
  251. package/dist/tui-v2/components/transcript/transcript-view.js +403 -0
  252. package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -0
  253. package/dist/tui-v2/components/transcript/use-click-without-drag.d.ts +13 -0
  254. package/dist/tui-v2/components/transcript/use-click-without-drag.js +35 -0
  255. package/dist/tui-v2/components/transcript/use-click-without-drag.js.map +1 -0
  256. package/dist/tui-v2/components/transcript/use-native-selection-copy.d.ts +10 -0
  257. package/dist/tui-v2/components/transcript/use-native-selection-copy.js +37 -0
  258. package/dist/tui-v2/components/transcript/use-native-selection-copy.js.map +1 -0
  259. package/dist/tui-v2/components/transcript/use-transcript-selection.d.ts +23 -0
  260. package/dist/tui-v2/components/transcript/use-transcript-selection.js +136 -0
  261. package/dist/tui-v2/components/transcript/use-transcript-selection.js.map +1 -0
  262. package/dist/tui-v2/components/transcript/user-message.d.ts +10 -0
  263. package/dist/tui-v2/components/transcript/user-message.js +23 -0
  264. package/dist/tui-v2/components/transcript/user-message.js.map +1 -0
  265. package/dist/tui-v2/composer/arrow-intent.d.ts +23 -0
  266. package/dist/tui-v2/composer/arrow-intent.js +35 -0
  267. package/dist/tui-v2/composer/arrow-intent.js.map +1 -0
  268. package/dist/tui-v2/composer/completion.d.ts +37 -0
  269. package/dist/tui-v2/composer/completion.js +67 -0
  270. package/dist/tui-v2/composer/completion.js.map +1 -0
  271. package/dist/tui-v2/composer/composer-editor.d.ts +33 -0
  272. package/dist/tui-v2/composer/composer-editor.js +620 -0
  273. package/dist/tui-v2/composer/composer-editor.js.map +1 -0
  274. package/dist/tui-v2/composer/composer-height.d.ts +21 -0
  275. package/dist/tui-v2/composer/composer-height.js +29 -0
  276. package/dist/tui-v2/composer/composer-height.js.map +1 -0
  277. package/dist/tui-v2/composer/composer-meta.d.ts +9 -0
  278. package/dist/tui-v2/composer/composer-meta.js +38 -0
  279. package/dist/tui-v2/composer/composer-meta.js.map +1 -0
  280. package/dist/tui-v2/composer/history-nav.d.ts +15 -0
  281. package/dist/tui-v2/composer/history-nav.js +16 -0
  282. package/dist/tui-v2/composer/history-nav.js.map +1 -0
  283. package/dist/tui-v2/composer/newline-hint.d.ts +13 -0
  284. package/dist/tui-v2/composer/newline-hint.js +13 -0
  285. package/dist/tui-v2/composer/newline-hint.js.map +1 -0
  286. package/dist/tui-v2/composer/paste-placeholder.d.ts +35 -0
  287. package/dist/tui-v2/composer/paste-placeholder.js +55 -0
  288. package/dist/tui-v2/composer/paste-placeholder.js.map +1 -0
  289. package/dist/tui-v2/composer/prompt-history.d.ts +22 -0
  290. package/dist/tui-v2/composer/prompt-history.js +51 -0
  291. package/dist/tui-v2/composer/prompt-history.js.map +1 -0
  292. package/dist/tui-v2/composer/secret-buffer.d.ts +20 -0
  293. package/dist/tui-v2/composer/secret-buffer.js +42 -0
  294. package/dist/tui-v2/composer/secret-buffer.js.map +1 -0
  295. package/dist/tui-v2/composer/textarea-keybindings.d.ts +22 -0
  296. package/dist/tui-v2/composer/textarea-keybindings.js +27 -0
  297. package/dist/tui-v2/composer/textarea-keybindings.js.map +1 -0
  298. package/dist/tui-v2/controllers/focus-controller.d.ts +30 -0
  299. package/dist/tui-v2/controllers/focus-controller.js +80 -0
  300. package/dist/tui-v2/controllers/focus-controller.js.map +1 -0
  301. package/dist/tui-v2/controllers/overlay-controller.d.ts +99 -0
  302. package/dist/tui-v2/controllers/overlay-controller.js +195 -0
  303. package/dist/tui-v2/controllers/overlay-controller.js.map +1 -0
  304. package/dist/tui-v2/controllers/selection-controller.d.ts +76 -0
  305. package/dist/tui-v2/controllers/selection-controller.js +238 -0
  306. package/dist/tui-v2/controllers/selection-controller.js.map +1 -0
  307. package/dist/tui-v2/controllers/toast-controller.d.ts +35 -0
  308. package/dist/tui-v2/controllers/toast-controller.js +88 -0
  309. package/dist/tui-v2/controllers/toast-controller.js.map +1 -0
  310. package/dist/tui-v2/layout/compute-layout.d.ts +59 -0
  311. package/dist/tui-v2/layout/compute-layout.js +170 -0
  312. package/dist/tui-v2/layout/compute-layout.js.map +1 -0
  313. package/dist/tui-v2/rendering/ansi-to-styled.d.ts +17 -0
  314. package/dist/tui-v2/rendering/ansi-to-styled.js +217 -0
  315. package/dist/tui-v2/rendering/ansi-to-styled.js.map +1 -0
  316. package/dist/tui-v2/rendering/batch-sections.d.ts +45 -0
  317. package/dist/tui-v2/rendering/batch-sections.js +109 -0
  318. package/dist/tui-v2/rendering/batch-sections.js.map +1 -0
  319. package/dist/tui-v2/rendering/link-detector.d.ts +16 -0
  320. package/dist/tui-v2/rendering/link-detector.js +43 -0
  321. package/dist/tui-v2/rendering/link-detector.js.map +1 -0
  322. package/dist/tui-v2/rendering/open-tool-output.d.ts +28 -0
  323. package/dist/tui-v2/rendering/open-tool-output.js +138 -0
  324. package/dist/tui-v2/rendering/open-tool-output.js.map +1 -0
  325. package/dist/tui-v2/rendering/picker-filter.d.ts +22 -0
  326. package/dist/tui-v2/rendering/picker-filter.js +68 -0
  327. package/dist/tui-v2/rendering/picker-filter.js.map +1 -0
  328. package/dist/tui-v2/rendering/plan-view.d.ts +32 -0
  329. package/dist/tui-v2/rendering/plan-view.js +196 -0
  330. package/dist/tui-v2/rendering/plan-view.js.map +1 -0
  331. package/dist/tui-v2/rendering/render-markdown-lines.d.ts +29 -0
  332. package/dist/tui-v2/rendering/render-markdown-lines.js +46 -0
  333. package/dist/tui-v2/rendering/render-markdown-lines.js.map +1 -0
  334. package/dist/tui-v2/rendering/sanitize-display.d.ts +13 -0
  335. package/dist/tui-v2/rendering/sanitize-display.js +24 -0
  336. package/dist/tui-v2/rendering/sanitize-display.js.map +1 -0
  337. package/dist/tui-v2/rendering/theme.d.ts +67 -0
  338. package/dist/tui-v2/rendering/theme.js +74 -0
  339. package/dist/tui-v2/rendering/theme.js.map +1 -0
  340. package/dist/tui-v2/rendering/tool-presenter.d.ts +39 -0
  341. package/dist/tui-v2/rendering/tool-presenter.js +207 -0
  342. package/dist/tui-v2/rendering/tool-presenter.js.map +1 -0
  343. package/dist/tui-v2/rendering/transcript-export.d.ts +11 -0
  344. package/dist/tui-v2/rendering/transcript-export.js +18 -0
  345. package/dist/tui-v2/rendering/transcript-export.js.map +1 -0
  346. package/dist/tui-v2/rendering/transcript-semantic.d.ts +17 -0
  347. package/dist/tui-v2/rendering/transcript-semantic.js +67 -0
  348. package/dist/tui-v2/rendering/transcript-semantic.js.map +1 -0
  349. package/dist/tui-v2/state/pager-search.d.ts +22 -0
  350. package/dist/tui-v2/state/pager-search.js +78 -0
  351. package/dist/tui-v2/state/pager-search.js.map +1 -0
  352. package/dist/tui-v2/state/semantic-document.d.ts +34 -0
  353. package/dist/tui-v2/state/semantic-document.js +201 -0
  354. package/dist/tui-v2/state/semantic-document.js.map +1 -0
  355. package/dist/tui-v2/state/transcript-compaction.d.ts +24 -0
  356. package/dist/tui-v2/state/transcript-compaction.js +79 -0
  357. package/dist/tui-v2/state/transcript-compaction.js.map +1 -0
  358. package/dist/tui-v2/state/transcript-hydrate.d.ts +27 -0
  359. package/dist/tui-v2/state/transcript-hydrate.js +272 -0
  360. package/dist/tui-v2/state/transcript-hydrate.js.map +1 -0
  361. package/dist/tui-v2/state/transcript-reducer.d.ts +10 -0
  362. package/dist/tui-v2/state/transcript-reducer.js +281 -0
  363. package/dist/tui-v2/state/transcript-reducer.js.map +1 -0
  364. package/dist/tui-v2/state/transcript-search.d.ts +17 -0
  365. package/dist/tui-v2/state/transcript-search.js +38 -0
  366. package/dist/tui-v2/state/transcript-search.js.map +1 -0
  367. package/dist/tui-v2/state/transcript-store.d.ts +32 -0
  368. package/dist/tui-v2/state/transcript-store.js +66 -0
  369. package/dist/tui-v2/state/transcript-store.js.map +1 -0
  370. package/dist/tui-v2/state/transcript-struct.d.ts +15 -0
  371. package/dist/tui-v2/state/transcript-struct.js +133 -0
  372. package/dist/tui-v2/state/transcript-struct.js.map +1 -0
  373. package/dist/tui-v2/state/transcript-types.d.ts +76 -0
  374. package/dist/tui-v2/state/transcript-types.js +65 -0
  375. package/dist/tui-v2/state/transcript-types.js.map +1 -0
  376. package/dist/tui-v2/state/use-overlay.d.ts +3 -0
  377. package/dist/tui-v2/state/use-overlay.js +6 -0
  378. package/dist/tui-v2/state/use-overlay.js.map +1 -0
  379. package/dist/tui-v2/state/use-plan.d.ts +4 -0
  380. package/dist/tui-v2/state/use-plan.js +6 -0
  381. package/dist/tui-v2/state/use-plan.js.map +1 -0
  382. package/dist/tui-v2/state/use-session-state.d.ts +2 -0
  383. package/dist/tui-v2/state/use-session-state.js +7 -0
  384. package/dist/tui-v2/state/use-session-state.js.map +1 -0
  385. package/dist/tui-v2/state/use-toast.d.ts +3 -0
  386. package/dist/tui-v2/state/use-toast.js +15 -0
  387. package/dist/tui-v2/state/use-toast.js.map +1 -0
  388. package/dist/tui-v2/state/use-transcript-store.d.ts +10 -0
  389. package/dist/tui-v2/state/use-transcript-store.js +12 -0
  390. package/dist/tui-v2/state/use-transcript-store.js.map +1 -0
  391. package/dist/ui/intro-card.js +3 -3
  392. package/dist/ui/intro-card.js.map +1 -1
  393. package/dist/ui/intro-header.d.ts +23 -0
  394. package/dist/ui/intro-header.js +232 -0
  395. package/dist/ui/intro-header.js.map +1 -0
  396. package/dist/ui/markdown.js +0 -1
  397. package/dist/ui/markdown.js.map +1 -1
  398. package/dist/ui/mentions.d.ts +9 -2
  399. package/dist/ui/mentions.js +102 -4
  400. package/dist/ui/mentions.js.map +1 -1
  401. package/dist/ui/output-pane.js +1 -1
  402. package/dist/ui/output-pane.js.map +1 -1
  403. package/dist/ui/plan-pane.d.ts +8 -0
  404. package/dist/ui/plan-pane.js +38 -0
  405. package/dist/ui/plan-pane.js.map +1 -1
  406. package/dist/ui/wordmark.d.ts +5 -0
  407. package/dist/ui/wordmark.js +6 -1
  408. package/dist/ui/wordmark.js.map +1 -1
  409. package/package.json +14 -10
  410. package/dist/tui/App.d.ts +0 -12
  411. package/dist/tui/App.js +0 -2174
  412. package/dist/tui/App.js.map +0 -1
  413. package/dist/tui/components/ConfirmModal.d.ts +0 -9
  414. package/dist/tui/components/ConfirmModal.js +0 -55
  415. package/dist/tui/components/ConfirmModal.js.map +0 -1
  416. package/dist/tui/components/JobsPanel.d.ts +0 -11
  417. package/dist/tui/components/JobsPanel.js +0 -55
  418. package/dist/tui/components/JobsPanel.js.map +0 -1
  419. package/dist/tui/components/Pager.d.ts +0 -14
  420. package/dist/tui/components/Pager.js +0 -56
  421. package/dist/tui/components/Pager.js.map +0 -1
  422. package/dist/tui/components/PickerPanel.d.ts +0 -15
  423. package/dist/tui/components/PickerPanel.js +0 -126
  424. package/dist/tui/components/PickerPanel.js.map +0 -1
  425. package/dist/tui/components/PlanSidebar.d.ts +0 -6
  426. package/dist/tui/components/PlanSidebar.js +0 -99
  427. package/dist/tui/components/PlanSidebar.js.map +0 -1
  428. package/dist/tui/components/SecretInputPanel.d.ts +0 -7
  429. package/dist/tui/components/SecretInputPanel.js +0 -38
  430. package/dist/tui/components/SecretInputPanel.js.map +0 -1
  431. package/dist/tui/confirm.d.ts +0 -16
  432. package/dist/tui/confirm.js.map +0 -1
  433. package/dist/tui/default.d.ts +0 -6
  434. package/dist/tui/default.js +0 -11
  435. package/dist/tui/default.js.map +0 -1
  436. package/dist/tui/hooks/useAgentRunner.d.ts +0 -73
  437. package/dist/tui/hooks/useAgentRunner.js +0 -277
  438. package/dist/tui/hooks/useAgentRunner.js.map +0 -1
  439. package/dist/tui/hooks/useJobs.d.ts +0 -7
  440. package/dist/tui/hooks/useJobs.js +0 -39
  441. package/dist/tui/hooks/useJobs.js.map +0 -1
  442. package/dist/tui/hooks/useSpinner.d.ts +0 -5
  443. package/dist/tui/hooks/useSpinner.js +0 -21
  444. package/dist/tui/hooks/useSpinner.js.map +0 -1
  445. package/dist/tui/hooks/useTerminalSize.d.ts +0 -9
  446. package/dist/tui/hooks/useTerminalSize.js +0 -26
  447. package/dist/tui/hooks/useTerminalSize.js.map +0 -1
  448. package/dist/tui/index.d.ts +0 -10
  449. package/dist/tui/index.js +0 -37
  450. package/dist/tui/index.js.map +0 -1
  451. package/dist/tui/key-intent.d.ts +0 -36
  452. package/dist/tui/key-intent.js +0 -54
  453. package/dist/tui/key-intent.js.map +0 -1
  454. package/dist/tui/mouse.d.ts +0 -8
  455. package/dist/tui/mouse.js +0 -34
  456. package/dist/tui/mouse.js.map +0 -1
  457. package/dist/tui/plan-sidebar-lines.d.ts +0 -2
  458. package/dist/tui/plan-sidebar-lines.js +0 -140
  459. package/dist/tui/plan-sidebar-lines.js.map +0 -1
  460. package/dist/tui/render-lines.d.ts +0 -22
  461. package/dist/tui/render-lines.js +0 -611
  462. package/dist/tui/render-lines.js.map +0 -1
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Renderer lifecycle owner (V2-030).
3
+ *
4
+ * Bootstrap creates the renderer, controllers, and stores inside one `try` and
5
+ * tears them down in `finally`. This object centralizes that contract: it
6
+ * installs bounded signal/error handlers, tears resources down in reverse order
7
+ * exactly once, and guarantees the renderer is destroyed (so alternate-screen
8
+ * reset bytes flush) BEFORE the process exits. The terminal must never be left
9
+ * corrupted, so destruction is idempotent and covered by signal/error tests.
10
+ */
11
+ /** Double-SIGINT quit window — matches the App Ctrl+C exit window. */
12
+ export const SIGINT_QUIT_WINDOW_MS = 1500;
13
+ const FATAL_SIGNALS = {
14
+ SIGTERM: 143,
15
+ SIGHUP: 129,
16
+ };
17
+ export class RendererLifecycle {
18
+ options;
19
+ proc;
20
+ disposers;
21
+ started = false;
22
+ shuttingDown = false;
23
+ destroyed = false;
24
+ lastSigintAt = 0;
25
+ listeners = [];
26
+ constructor(options) {
27
+ this.options = options;
28
+ this.proc = options.process ?? process;
29
+ this.disposers = [...(options.disposers ?? [])];
30
+ }
31
+ get isDestroyed() {
32
+ return this.destroyed;
33
+ }
34
+ /** Install handlers and hand the terminal to the renderer. */
35
+ async start() {
36
+ if (this.started)
37
+ return;
38
+ this.started = true;
39
+ this.installHandlers();
40
+ try {
41
+ await this.options.handle.start();
42
+ }
43
+ catch (error) {
44
+ // Never leave the terminal in the alternate screen if start failed.
45
+ await this.shutdown();
46
+ throw error;
47
+ }
48
+ }
49
+ /**
50
+ * Idempotent teardown: dispose extra resources in reverse order, then destroy
51
+ * the renderer. Safe to call from multiple signals/error paths concurrently.
52
+ */
53
+ async shutdown() {
54
+ if (this.shuttingDown)
55
+ return;
56
+ this.shuttingDown = true;
57
+ this.removeHandlers();
58
+ for (let i = this.disposers.length - 1; i >= 0; i--) {
59
+ const disposer = this.disposers[i];
60
+ if (!disposer)
61
+ continue;
62
+ try {
63
+ await disposer();
64
+ }
65
+ catch (error) {
66
+ this.options.onError?.(error);
67
+ }
68
+ }
69
+ if (!this.destroyed) {
70
+ this.destroyed = true;
71
+ await this.options.handle.destroy();
72
+ }
73
+ }
74
+ /** Tear down fully, then exit — destroy always precedes exit. */
75
+ async shutdownAndExit(code) {
76
+ await this.shutdown();
77
+ this.proc.exit(code);
78
+ }
79
+ installHandlers() {
80
+ // SIGINT is cooperative: first press aborts / arms quit, second exits.
81
+ // Immediate-exit on SIGINT made the first Ctrl+C kill clai even when the
82
+ // App only wanted to abort the agent.
83
+ this.addListener("SIGINT", () => {
84
+ const now = Date.now();
85
+ if (this.lastSigintAt > 0 &&
86
+ now - this.lastSigintAt < SIGINT_QUIT_WINDOW_MS) {
87
+ void this.shutdownAndExit(130);
88
+ return;
89
+ }
90
+ this.lastSigintAt = now;
91
+ try {
92
+ this.options.onSigint?.();
93
+ }
94
+ catch (error) {
95
+ this.options.onError?.(error);
96
+ }
97
+ });
98
+ for (const [signal, code] of Object.entries(FATAL_SIGNALS)) {
99
+ this.addListener(signal, () => {
100
+ void this.shutdownAndExit(code);
101
+ });
102
+ }
103
+ this.addListener("uncaughtException", (error) => {
104
+ this.options.onError?.(error);
105
+ void this.shutdownAndExit(1);
106
+ });
107
+ this.addListener("unhandledRejection", (reason) => {
108
+ this.options.onError?.(reason);
109
+ void this.shutdownAndExit(1);
110
+ });
111
+ }
112
+ addListener(event, fn) {
113
+ this.proc.on(event, fn);
114
+ this.listeners.push({ event, fn });
115
+ }
116
+ removeHandlers() {
117
+ for (const { event, fn } of this.listeners) {
118
+ this.proc.off(event, fn);
119
+ }
120
+ this.listeners.length = 0;
121
+ }
122
+ }
123
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Renderer-facing OSC 52 clipboard adapter (V2-064).
3
+ *
4
+ * The native renderer performs OSC encoding and terminal writes. This adapter
5
+ * only chooses a bounded, capability-checked path and otherwise delegates to
6
+ * the supplied non-terminal clipboard port.
7
+ */
8
+ import type { ClipboardPort } from "../../app/ports/clipboard-port.js";
9
+ export interface Osc52RendererPort {
10
+ isOsc52Supported(): boolean;
11
+ copyToClipboardOSC52(text: string): boolean;
12
+ }
13
+ export type Osc52FallbackReason = "disabled" | "unsupported" | "too-large" | "rejected" | "failed";
14
+ export interface Osc52CopyResult {
15
+ readonly method: "osc52" | "fallback";
16
+ readonly reason?: Osc52FallbackReason;
17
+ }
18
+ export interface Osc52ClipboardPort extends ClipboardPort {
19
+ readonly lastWrite: Osc52CopyResult | undefined;
20
+ }
21
+ export interface Osc52ClipboardOptions {
22
+ readonly renderer: Osc52RendererPort;
23
+ readonly fallback: ClipboardPort;
24
+ readonly enabled: boolean;
25
+ /** Bound terminal payload size; oversized text remains available via fallback. */
26
+ readonly maxBytes?: number;
27
+ }
28
+ export declare function createOsc52ClipboardPort(options: Osc52ClipboardOptions): Osc52ClipboardPort;
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Renderer-facing OSC 52 clipboard adapter (V2-064).
3
+ *
4
+ * The native renderer performs OSC encoding and terminal writes. This adapter
5
+ * only chooses a bounded, capability-checked path and otherwise delegates to
6
+ * the supplied non-terminal clipboard port.
7
+ */
8
+ const DEFAULT_MAX_BYTES = 100_000;
9
+ export function createOsc52ClipboardPort(options) {
10
+ const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;
11
+ if (!Number.isSafeInteger(maxBytes) || maxBytes < 0) {
12
+ throw new Error("OSC 52 maxBytes must be a non-negative safe integer");
13
+ }
14
+ let lastWrite;
15
+ return {
16
+ get lastWrite() {
17
+ return lastWrite;
18
+ },
19
+ async writeText(text) {
20
+ const fallbackReason = copyWithOsc52(options, text, maxBytes);
21
+ if (!fallbackReason) {
22
+ lastWrite = { method: "osc52" };
23
+ return;
24
+ }
25
+ await options.fallback.writeText(text);
26
+ lastWrite = { method: "fallback", reason: fallbackReason };
27
+ },
28
+ };
29
+ }
30
+ function copyWithOsc52(options, text, maxBytes) {
31
+ if (!options.enabled)
32
+ return "disabled";
33
+ if (Buffer.byteLength(text, "utf8") > maxBytes)
34
+ return "too-large";
35
+ try {
36
+ if (!options.renderer.isOsc52Supported())
37
+ return "unsupported";
38
+ return options.renderer.copyToClipboardOSC52(text) ? undefined : "rejected";
39
+ }
40
+ catch {
41
+ return "failed";
42
+ }
43
+ }
44
+ //# sourceMappingURL=osc52-clipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"osc52-clipboard.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/osc52-clipboard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiCH,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAElC,MAAM,UAAU,wBAAwB,CAAC,OAA8B;IACrE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,iBAAiB,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,SAAsC,CAAC;IAE3C,OAAO;QACL,IAAI,SAAS;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,IAAY;YAC1B,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC9D,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,SAAS,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;gBAChC,OAAO;YACT,CAAC;YACD,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACvC,SAAS,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QAC7D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,OAA8B,EAC9B,IAAY,EACZ,QAAgB;IAEhB,IAAI,CAAC,OAAO,CAAC,OAAO;QAAE,OAAO,UAAU,CAAC;IACxC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,QAAQ;QAAE,OAAO,WAAW,CAAC;IACnE,IAAI,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,EAAE;YAAE,OAAO,aAAa,CAAC;QAC/D,OAAO,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Adapts `OverlayController` into the typed app-layer confirm/secret ports
3
+ * (CORE-002, V2-073). The agent never reads the terminal directly: it awaits
4
+ * these promises, which resolve once the user answers the rendered modal.
5
+ * Prompt text is ported from the classic TUI's `confirm.ts` so both
6
+ * frontends read the same way.
7
+ */
8
+ import type { ConfirmationPort } from "../../app/ports/confirm-port.js";
9
+ import type { SecretPort } from "../../app/ports/secret-port.js";
10
+ import type { OverlayController } from "../controllers/overlay-controller.js";
11
+ export declare function createOverlayConfirmPort(overlay: OverlayController): ConfirmationPort;
12
+ export declare function createOverlaySecretPort(overlay: OverlayController): SecretPort["request"];
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Adapts `OverlayController` into the typed app-layer confirm/secret ports
3
+ * (CORE-002, V2-073). The agent never reads the terminal directly: it awaits
4
+ * these promises, which resolve once the user answers the rendered modal.
5
+ * Prompt text is ported from the classic TUI's `confirm.ts` so both
6
+ * frontends read the same way.
7
+ */
1
8
  function describeCall(call) {
2
9
  if (call.name === "shell.exec")
3
10
  return String(call.args.command ?? "");
@@ -9,47 +16,32 @@ function describeCall(call) {
9
16
  return "";
10
17
  }
11
18
  }
12
- export function createTuiConfirmPort() {
13
- let handler;
14
- const ask = async (req) => {
15
- if (!handler)
16
- return false;
17
- return handler(req);
18
- };
19
- const port = {
19
+ export function createOverlayConfirmPort(overlay) {
20
+ return {
20
21
  async confirmTool(call) {
21
22
  const args = describeCall(call);
22
- return ask({
23
- kind: "tool",
24
- prompt: `Run ${call.name}${args ? ` ${args}` : ""}?`,
25
- });
23
+ return overlay.openConfirm({ kind: "tool", prompt: `Run ${call.name}${args ? ` ${args}` : ""}?` });
26
24
  },
27
25
  async confirmPentest() {
28
- return ask({
26
+ return overlay.openConfirm({
29
27
  kind: "pentest",
30
28
  prompt: "This is a security/pentest action. Confirm you are authorized to run it against this target.",
31
29
  });
32
30
  },
33
31
  async confirmContinue(steps) {
34
- return ask({
35
- kind: "continue",
36
- prompt: `${steps} steps reached — continue running?`,
37
- });
32
+ return overlay.openConfirm({ kind: "continue", prompt: `${steps} steps reached — continue running?` });
38
33
  },
39
34
  async confirmAgentSwitch(info) {
40
35
  const tools = info.tools.length > 0 ? ` (${info.tools.join(", ")})` : "";
41
36
  const why = info.reason ? `${info.reason}\n\n` : "";
42
- return ask({
37
+ return overlay.openConfirm({
43
38
  kind: "switch",
44
39
  prompt: `${why}This needs agent mode${tools}, which ask mode can't do. Switch to agent mode and run it?`,
45
40
  });
46
41
  },
47
42
  };
48
- return {
49
- port,
50
- setHandler(h) {
51
- handler = h;
52
- },
53
- };
54
43
  }
55
- //# sourceMappingURL=confirm.js.map
44
+ export function createOverlaySecretPort(overlay) {
45
+ return (request) => overlay.openSecret(request);
46
+ }
47
+ //# sourceMappingURL=overlay-ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay-ports.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/overlay-ports.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,SAAS,YAAY,CAAC,IAAc;IAClC,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACvE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAA0B;IACjE,OAAO;QACL,KAAK,CAAC,WAAW,CAAC,IAAc;YAC9B,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAChC,OAAO,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACrG,CAAC;QACD,KAAK,CAAC,cAAc;YAClB,OAAO,OAAO,CAAC,WAAW,CAAC;gBACzB,IAAI,EAAE,SAAS;gBACf,MAAM,EACJ,8FAA8F;aACjG,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,eAAe,CAAC,KAAa;YACjC,OAAO,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,oCAAoC,EAAE,CAAC,CAAC;QACzG,CAAC;QACD,KAAK,CAAC,kBAAkB,CAAC,IAAyC;YAChE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,OAAO,OAAO,CAAC,WAAW,CAAC;gBACzB,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,GAAG,GAAG,wBAAwB,KAAK,6DAA6D;aACzG,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAA0B;IAChE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Pager export to real terminal scrollback and `$EDITOR` (PICK-003, V2-074).
3
+ *
4
+ * Both paths need the real terminal back, not the alternate-screen buffer:
5
+ * `renderer.suspend()`/`resume()` (used elsewhere for foreground child
6
+ * processes) hands it over temporarily. Scrollback export just prints to the
7
+ * now-restored main screen so the content lands in the terminal emulator's
8
+ * own scrollback; editor export additionally spawns `$EDITOR`/`$PAGER` with
9
+ * inherited stdio over a temp file. Neither result is read back — this is a
10
+ * read-only export of pager content, not a round-trip edit.
11
+ */
12
+ export interface RendererSuspendPort {
13
+ suspend(): void;
14
+ resume(): void;
15
+ }
16
+ export interface PagerExportResult {
17
+ readonly ok: boolean;
18
+ readonly error?: string;
19
+ }
20
+ export interface PagerExportPort {
21
+ exportToScrollback(title: string, body: string): PagerExportResult;
22
+ exportToEditor(body: string): Promise<PagerExportResult>;
23
+ }
24
+ export declare function createPagerExportPort(renderer: RendererSuspendPort): PagerExportPort;
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Pager export to real terminal scrollback and `$EDITOR` (PICK-003, V2-074).
3
+ *
4
+ * Both paths need the real terminal back, not the alternate-screen buffer:
5
+ * `renderer.suspend()`/`resume()` (used elsewhere for foreground child
6
+ * processes) hands it over temporarily. Scrollback export just prints to the
7
+ * now-restored main screen so the content lands in the terminal emulator's
8
+ * own scrollback; editor export additionally spawns `$EDITOR`/`$PAGER` with
9
+ * inherited stdio over a temp file. Neither result is read back — this is a
10
+ * read-only export of pager content, not a round-trip edit.
11
+ */
12
+ import { mkdtemp, rm, writeFile } from "node:fs/promises";
13
+ import { tmpdir } from "node:os";
14
+ import { join } from "node:path";
15
+ import { execa } from "execa";
16
+ function defaultEditor() {
17
+ return process.env.EDITOR || process.env.VISUAL || (process.platform === "win32" ? "notepad" : "vi");
18
+ }
19
+ /**
20
+ * Ensure text lands on the main-screen scrollback, not the alt buffer.
21
+ * OpenTUI's suspend leaves alt-screen; we still force main-screen CSI so
22
+ * dumps survive after resume (and after the process exits).
23
+ */
24
+ function writeToMainScrollback(title, body) {
25
+ // Leave alt screen if still active, then print a clear dump block.
26
+ process.stdout.write("\x1b[?1049l");
27
+ const header = `\n\n── clai export: ${title} ──\n`;
28
+ const footer = `\n── end export ──\n\n`;
29
+ process.stdout.write(header);
30
+ process.stdout.write(body.endsWith("\n") ? body : `${body}\n`);
31
+ process.stdout.write(footer);
32
+ // Flush so the terminal emulator commits to its scrollback before we
33
+ // re-enter the alternate screen on resume.
34
+ try {
35
+ // @types/node: WriteStream has cork/uncork; force sync flush best-effort.
36
+ const out = process.stdout;
37
+ out._handle?.setBlocking?.(true);
38
+ }
39
+ catch {
40
+ // ignore
41
+ }
42
+ }
43
+ export function createPagerExportPort(renderer) {
44
+ return {
45
+ exportToScrollback(title, body) {
46
+ try {
47
+ renderer.suspend();
48
+ writeToMainScrollback(title, body);
49
+ return { ok: true };
50
+ }
51
+ catch (error) {
52
+ return { ok: false, error: error instanceof Error ? error.message : String(error) };
53
+ }
54
+ finally {
55
+ try {
56
+ renderer.resume();
57
+ }
58
+ catch {
59
+ // Always try to restore the TUI even if resume throws.
60
+ }
61
+ }
62
+ },
63
+ async exportToEditor(body) {
64
+ const dir = await mkdtemp(join(tmpdir(), "clai-pager-"));
65
+ const file = join(dir, "output.txt");
66
+ try {
67
+ await writeFile(file, body, "utf8");
68
+ renderer.suspend();
69
+ await execa(defaultEditor(), [file], { stdio: "inherit" });
70
+ return { ok: true };
71
+ }
72
+ catch (error) {
73
+ return { ok: false, error: error instanceof Error ? error.message : String(error) };
74
+ }
75
+ finally {
76
+ try {
77
+ renderer.resume();
78
+ }
79
+ catch {
80
+ // ignore
81
+ }
82
+ await rm(dir, { recursive: true, force: true }).catch(() => { });
83
+ }
84
+ },
85
+ };
86
+ }
87
+ //# sourceMappingURL=pager-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pager-export.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/pager-export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * v2 renderer entry point (V2-030/031/034).
3
+ *
4
+ * Assembles the composition root, creates the OpenTUI renderer in the alternate
5
+ * screen, mounts the shell, and hands ownership to `RendererLifecycle` so
6
+ * signals/errors tear the renderer down before the process exits.
7
+ */
8
+ import type { Mode, ProviderId } from "../../types.js";
9
+ export interface StartTuiV2Options {
10
+ readonly mode?: Mode | undefined;
11
+ readonly provider?: ProviderId | undefined;
12
+ readonly model?: string | undefined;
13
+ readonly noHistory?: boolean | undefined;
14
+ }
15
+ export declare function startTuiV2(options?: StartTuiV2Options): Promise<void>;
@@ -0,0 +1,95 @@
1
+ /**
2
+ * v2 renderer entry point (V2-030/031/034).
3
+ *
4
+ * Assembles the composition root, creates the OpenTUI renderer in the alternate
5
+ * screen, mounts the shell, and hands ownership to `RendererLifecycle` so
6
+ * signals/errors tear the renderer down before the process exits.
7
+ */
8
+ import { createElement } from "react";
9
+ import { createCliRenderer } from "@opentui/core";
10
+ import { createRoot } from "@opentui/react";
11
+ import { createInMemoryClipboardPort } from "../../app/adapters/in-memory-clipboard-adapter.js";
12
+ import { App } from "../app/App.js";
13
+ import { ServicesProvider } from "../app/providers.js";
14
+ import { attachCommandHandlers } from "../app/command-handlers.js";
15
+ import { readCapabilitiesFromProcess } from "./capabilities.js";
16
+ import { createCompositionRoot } from "./composition-root.js";
17
+ import { RendererLifecycle } from "./lifecycle.js";
18
+ import { createOsc52ClipboardPort } from "./osc52-clipboard.js";
19
+ import { createPagerExportPort } from "./pager-export.js";
20
+ export async function startTuiV2(options = {}) {
21
+ // OpenTUI native drag-select is enabled. Interactive chrome (prompts/tools/
22
+ // composer) sets selectable={false}; response/thinking body stays selectable.
23
+ // Copy-on-release is wired in TranscriptView via useNativeSelectionCopy.
24
+ const capabilities = readCapabilitiesFromProcess();
25
+ const fallbackClipboard = createInMemoryClipboardPort();
26
+ // We own Ctrl+C (abort then double-press exit). OpenTUI must not kill the
27
+ // process on the first press, and SIGINT is handled cooperatively below.
28
+ const renderer = await createCliRenderer({
29
+ screenMode: "alternate-screen",
30
+ exitOnCtrlC: false,
31
+ useMouse: true,
32
+ clearOnShutdown: true,
33
+ });
34
+ // lifecycle is assigned before requestExit runs; use a holder so the
35
+ // composition root can close over a stable callback.
36
+ const lifecycleRef = {
37
+ current: undefined,
38
+ };
39
+ const services = createCompositionRoot({
40
+ provider: options.provider,
41
+ model: options.model,
42
+ mode: options.mode,
43
+ noHistory: options.noHistory,
44
+ capabilities,
45
+ clipboard: createOsc52ClipboardPort({
46
+ renderer,
47
+ fallback: fallbackClipboard,
48
+ enabled: capabilities.osc52,
49
+ }),
50
+ pagerExport: createPagerExportPort(renderer),
51
+ requestExit: () => void lifecycleRef.current?.shutdownAndExit(0),
52
+ });
53
+ attachCommandHandlers(services);
54
+ const root = createRoot(renderer);
55
+ let resolveDone = () => { };
56
+ const done = new Promise((resolve) => {
57
+ resolveDone = resolve;
58
+ });
59
+ const handle = {
60
+ start() {
61
+ root.render(createElement(ServicesProvider, { services, children: createElement(App) }));
62
+ },
63
+ destroy() {
64
+ root.unmount();
65
+ renderer.destroy();
66
+ services.dispose();
67
+ resolveDone();
68
+ },
69
+ };
70
+ const lifecycle = new RendererLifecycle({
71
+ handle,
72
+ // Ctrl+C / SIGINT: first signal aborts a live turn (or arms quit via the
73
+ // App handler path when the key event arrives). A second SIGINT within
74
+ // the window still exits so kill -INT remains usable without the TUI.
75
+ onSigint: () => {
76
+ // Backup path when the key event is not delivered (raw SIGINT). The App
77
+ // keyboard handler owns the normal Ctrl+C double-press UX.
78
+ if (services.session.getState().running) {
79
+ services.session.abort();
80
+ services.session.notice("info", "turn aborted · Ctrl+C again to exit");
81
+ }
82
+ else {
83
+ services.session.notice("info", "Ctrl+C again to exit");
84
+ }
85
+ },
86
+ onError: (error) => {
87
+ // The renderer owns the terminal; surface the error after teardown.
88
+ process.stderr.write(`clai v2 error: ${error instanceof Error ? error.message : String(error)}\n`);
89
+ },
90
+ });
91
+ lifecycleRef.current = lifecycle;
92
+ await lifecycle.start();
93
+ await done;
94
+ }
95
+ //# sourceMappingURL=start-tui-v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-tui-v2.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/start-tui-v2.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAEhG,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAuB,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAS1D,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,UAA6B,EAAE;IAE/B,4EAA4E;IAC5E,8EAA8E;IAC9E,yEAAyE;IACzE,MAAM,YAAY,GAAG,2BAA2B,EAAE,CAAC;IACnD,MAAM,iBAAiB,GAAG,2BAA2B,EAAE,CAAC;IACxD,0EAA0E;IAC1E,yEAAyE;IACzE,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC;QACvC,UAAU,EAAE,kBAAkB;QAC9B,WAAW,EAAE,KAAK;QAClB,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,IAAI;KACtB,CAAC,CAAC;IACH,qEAAqE;IACrE,qDAAqD;IACrD,MAAM,YAAY,GAA+C;QAC/D,OAAO,EAAE,SAAS;KACnB,CAAC;IACF,MAAM,QAAQ,GAAG,qBAAqB,CAAC;QACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,YAAY;QACZ,SAAS,EAAE,wBAAwB,CAAC;YAClC,QAAQ;YACR,QAAQ,EAAE,iBAAiB;YAC3B,OAAO,EAAE,YAAY,CAAC,KAAK;SAC5B,CAAC;QACF,WAAW,EAAE,qBAAqB,CAAC,QAAQ,CAAC;QAC5C,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,YAAY,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;KACjE,CAAC,CAAC;IACH,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAElC,IAAI,WAAW,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACzC,WAAW,GAAG,OAAO,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAmB;QAC7B,KAAK;YACH,IAAI,CAAC,MAAM,CACT,aAAa,CACX,gBAAgB,EAChB,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAC3C,CACF,CAAC;QACJ,CAAC;QACD,OAAO;YACL,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,QAAQ,CAAC,OAAO,EAAE,CAAC;YACnB,QAAQ,CAAC,OAAO,EAAE,CAAC;YACnB,WAAW,EAAE,CAAC;QAChB,CAAC;KACF,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,iBAAiB,CAAC;QACtC,MAAM;QACN,yEAAyE;QACzE,uEAAuE;QACvE,sEAAsE;QACtE,QAAQ,EAAE,GAAG,EAAE;YACb,wEAAwE;YACxE,2DAA2D;YAC3D,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC;gBACxC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACzB,QAAQ,CAAC,OAAO,CAAC,MAAM,CACrB,MAAM,EACN,qCAAqC,CACtC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,oEAAoE;YACpE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAC7E,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;IACH,YAAY,CAAC,OAAO,GAAG,SAAS,CAAC;IAEjC,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IACxB,MAAM,IAAI,CAAC;AACb,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Interactive frontend selection for clai 3.x.
3
+ *
4
+ * Default: OpenTUI full-screen TUI.
5
+ * Opt-out: classic line REPL via `--classic`, `--ui=legacy`, or CLAI_CLASSIC=1.
6
+ *
7
+ * `--ui=tui` / `--ui=v2` / CLAI_UI=tui|v2 all resolve to the OpenTUI TUI
8
+ * (aliases kept so old scripts keep working after the Ink removal).
9
+ */
10
+ export type UiChoice = "legacy" | "tui";
11
+ export interface UiSelectionOptions {
12
+ /** Value of the `--ui <choice>` flag, if provided. */
13
+ readonly ui?: string | undefined;
14
+ /** `--tui` / `--classic` flags (back-compat). */
15
+ readonly tui?: boolean | undefined;
16
+ readonly classic?: boolean | undefined;
17
+ }
18
+ /** True when the resolved frontend is the full-screen OpenTUI. */
19
+ export declare function isTuiRequested(options: UiSelectionOptions, env?: NodeJS.ProcessEnv): boolean;
20
+ /** @deprecated Use {@link isTuiRequested}. Kept for older call sites. */
21
+ export declare function isV2Requested(options: UiSelectionOptions, env?: NodeJS.ProcessEnv): boolean;
22
+ /**
23
+ * Resolve the interactive frontend.
24
+ *
25
+ * Precedence: explicit `--ui` → `CLAI_UI` → `--classic`/`CLAI_CLASSIC` →
26
+ * `--tui` → default TUI.
27
+ */
28
+ export declare function resolveUiChoice(options: UiSelectionOptions, env?: NodeJS.ProcessEnv): UiChoice;
29
+ /** Human-readable default for doctor/help. */
30
+ export declare function describeUiDefault(): string;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Interactive frontend selection for clai 3.x.
3
+ *
4
+ * Default: OpenTUI full-screen TUI.
5
+ * Opt-out: classic line REPL via `--classic`, `--ui=legacy`, or CLAI_CLASSIC=1.
6
+ *
7
+ * `--ui=tui` / `--ui=v2` / CLAI_UI=tui|v2 all resolve to the OpenTUI TUI
8
+ * (aliases kept so old scripts keep working after the Ink removal).
9
+ */
10
+ function normalizeUiToken(value) {
11
+ const token = value?.trim().toLowerCase();
12
+ return token || undefined;
13
+ }
14
+ function envUiChoice(env) {
15
+ const token = normalizeUiToken(env.CLAI_UI);
16
+ if (token === "legacy" || token === "classic")
17
+ return "legacy";
18
+ // tui | v2 | opentui → full-screen TUI
19
+ if (token === "tui" || token === "v2" || token === "opentui")
20
+ return "tui";
21
+ return undefined;
22
+ }
23
+ /** True when the resolved frontend is the full-screen OpenTUI. */
24
+ export function isTuiRequested(options, env = process.env) {
25
+ return resolveUiChoice(options, env) === "tui";
26
+ }
27
+ /** @deprecated Use {@link isTuiRequested}. Kept for older call sites. */
28
+ export function isV2Requested(options, env = process.env) {
29
+ return isTuiRequested(options, env);
30
+ }
31
+ /**
32
+ * Resolve the interactive frontend.
33
+ *
34
+ * Precedence: explicit `--ui` → `CLAI_UI` → `--classic`/`CLAI_CLASSIC` →
35
+ * `--tui` → default TUI.
36
+ */
37
+ export function resolveUiChoice(options, env = process.env) {
38
+ const flag = normalizeUiToken(options.ui);
39
+ if (flag === "legacy" || flag === "classic")
40
+ return "legacy";
41
+ if (flag === "tui" || flag === "v2" || flag === "opentui")
42
+ return "tui";
43
+ const fromEnv = envUiChoice(env);
44
+ if (fromEnv)
45
+ return fromEnv;
46
+ if (options.classic)
47
+ return "legacy";
48
+ if (env.CLAI_CLASSIC === "1" || env.CLAI_TUI === "0")
49
+ return "legacy";
50
+ // --tui is a no-op affirmation of the default
51
+ if (options.tui)
52
+ return "tui";
53
+ return "tui";
54
+ }
55
+ /** Human-readable default for doctor/help. */
56
+ export function describeUiDefault() {
57
+ return "tui (OpenTUI); use --classic or --ui=legacy for line REPL";
58
+ }
59
+ //# sourceMappingURL=ui-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-selection.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/ui-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH,SAAS,gBAAgB,CAAC,KAAyB;IACjD,MAAM,KAAK,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,OAAO,KAAK,IAAI,SAAS,CAAC;AAC5B,CAAC;AAED,SAAS,WAAW,CAAC,GAAsB;IACzC,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC/D,uCAAuC;IACvC,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC3E,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,cAAc,CAC5B,OAA2B,EAC3B,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,KAAK,CAAC;AACjD,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,aAAa,CAC3B,OAA2B,EAC3B,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,OAA2B,EAC3B,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1C,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC7D,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAExE,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,IAAI,OAAO,CAAC,OAAO;QAAE,OAAO,QAAQ,CAAC;IACrC,IAAI,GAAG,CAAC,YAAY,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG;QAAE,OAAO,QAAQ,CAAC;IACtE,8CAA8C;IAC9C,IAAI,OAAO,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IAE9B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,iBAAiB;IAC/B,OAAO,2DAA2D,CAAC;AACrE,CAAC"}
@@ -0,0 +1,23 @@
1
+ /** @jsxImportSource @opentui/react */
2
+ /**
3
+ * Slash / @-mention completion list rendered ABOVE the composer (legacy parity).
4
+ * Rows are mouse-hoverable and clickable (pickers parity).
5
+ */
6
+ import type { ReactNode } from "react";
7
+ import type { Theme } from "../../rendering/theme.js";
8
+ import type { CompletionMenu } from "../../composer/completion.js";
9
+ export interface CompletionMenuViewProps {
10
+ readonly menu: CompletionMenu;
11
+ readonly selected: number;
12
+ readonly theme: Theme;
13
+ readonly width: number;
14
+ readonly maxRows?: number | undefined;
15
+ /** Highlight the row under the mouse (keyboard selection stays independent). */
16
+ readonly onHoverIndex?: ((index: number) => void) | undefined;
17
+ /**
18
+ * Activate a row on click.
19
+ * Slash / file → accept; directory → typically drill (caller decides).
20
+ */
21
+ readonly onActivateIndex?: ((index: number) => void) | undefined;
22
+ }
23
+ export declare function CompletionMenuView(props: CompletionMenuViewProps): ReactNode;