@pentoshi/clai 2.0.62 → 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 +150 -83
  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,99 @@
1
+ /**
2
+ * Single owner of the one blocking overlay (V2-071..076, PICK-002).
3
+ *
4
+ * Holds the overlay's data (picker options, confirm prompt, pager body) and
5
+ * coordinates with `FocusController`'s context stack so opening while one is
6
+ * already active is rejected (nested-action prevention) and closing restores
7
+ * whichever base region had focus (focus restoration) — both for free from
8
+ * `FocusController`'s existing single-slot design, not reimplemented here.
9
+ */
10
+ import type { FocusController } from "./focus-controller.js";
11
+ import type { PickerOption } from "../rendering/picker-filter.js";
12
+ export type ConfirmKind = "tool" | "pentest" | "reset" | "continue" | "plan" | "switch";
13
+ export interface ConfirmRequest {
14
+ readonly kind: ConfirmKind;
15
+ readonly prompt: string;
16
+ }
17
+ export interface PickerRequest {
18
+ readonly title: string;
19
+ readonly options: readonly PickerOption[];
20
+ readonly searchDescription?: boolean | undefined;
21
+ readonly twoLine?: boolean | undefined;
22
+ /**
23
+ * History-oriented chrome: larger panel, session badges, clearer filter
24
+ * line, and description-aware search.
25
+ */
26
+ readonly historyStyle?: boolean | undefined;
27
+ }
28
+ export interface SecretRequestView {
29
+ readonly title: string;
30
+ readonly prompt: string;
31
+ }
32
+ export interface PromptActionsRequest {
33
+ readonly prompt: string;
34
+ readonly onResend: () => void;
35
+ }
36
+ export type OverlayState = {
37
+ readonly kind: "none";
38
+ } | {
39
+ readonly kind: "picker";
40
+ readonly request: PickerRequest;
41
+ readonly onSelect: (value: string) => void;
42
+ } | {
43
+ readonly kind: "confirm";
44
+ readonly request: ConfirmRequest;
45
+ readonly resolve: (ok: boolean) => void;
46
+ readonly onViewPlan?: (() => void) | undefined;
47
+ } | {
48
+ readonly kind: "secret";
49
+ readonly request: SecretRequestView;
50
+ readonly resolve: (value: string | undefined) => void;
51
+ } | {
52
+ readonly kind: "prompt-actions";
53
+ readonly request: PromptActionsRequest;
54
+ } | {
55
+ readonly kind: "pager";
56
+ readonly title: string;
57
+ readonly body: string;
58
+ } | {
59
+ readonly kind: "jobs";
60
+ };
61
+ export type OverlayListener = () => void;
62
+ export declare class OverlayController {
63
+ private readonly focus;
64
+ private state;
65
+ /** Confirm suspended under a plan-detail pager (classic TUI: confirm chrome + pager overlay). */
66
+ private suspended;
67
+ private readonly listeners;
68
+ private closeFocus;
69
+ constructor(focus: FocusController);
70
+ getState(): OverlayState;
71
+ isOpen(): boolean;
72
+ subscribe(listener: OverlayListener): () => void;
73
+ openPicker(request: PickerRequest, onSelect: (value: string) => void): boolean;
74
+ /**
75
+ * Opens a pager. Allowed over an open plan confirm so "P" can show full
76
+ * plan detail without resolving the confirm (F-021); closing the pager
77
+ * restores the suspended confirm. Any other open overlay is still rejected.
78
+ */
79
+ openPager(title: string, body: string): boolean;
80
+ openJobs(): boolean;
81
+ openPromptActions(request: PromptActionsRequest): boolean;
82
+ /** Resolves `false` if a blocking overlay was already open rather than hanging. */
83
+ openConfirm(request: ConfirmRequest, onViewPlan?: () => void): Promise<boolean>;
84
+ /** Resolves `undefined` if a blocking overlay was already open rather than hanging. */
85
+ openSecret(request: SecretRequestView): Promise<string | undefined>;
86
+ answerConfirm(ok: boolean): void;
87
+ answerSecret(value: string | undefined): void;
88
+ /** The picker's own `onSelect` decides whether/when to close (e.g. a
89
+ * provider pick may chain into a secret prompt instead of closing). */
90
+ selectPicker(value: string): void;
91
+ close(): void;
92
+ dispose(): void;
93
+ private activeConfirm;
94
+ private open;
95
+ private suspendUnder;
96
+ private restoreSuspended;
97
+ private forceClose;
98
+ private notify;
99
+ }
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Single owner of the one blocking overlay (V2-071..076, PICK-002).
3
+ *
4
+ * Holds the overlay's data (picker options, confirm prompt, pager body) and
5
+ * coordinates with `FocusController`'s context stack so opening while one is
6
+ * already active is rejected (nested-action prevention) and closing restores
7
+ * whichever base region had focus (focus restoration) — both for free from
8
+ * `FocusController`'s existing single-slot design, not reimplemented here.
9
+ */
10
+ const NONE = { kind: "none" };
11
+ export class OverlayController {
12
+ focus;
13
+ state = NONE;
14
+ /** Confirm suspended under a plan-detail pager (classic TUI: confirm chrome + pager overlay). */
15
+ suspended;
16
+ listeners = new Set();
17
+ closeFocus;
18
+ constructor(focus) {
19
+ this.focus = focus;
20
+ }
21
+ getState() {
22
+ return this.state;
23
+ }
24
+ isOpen() {
25
+ return this.state.kind !== "none";
26
+ }
27
+ subscribe(listener) {
28
+ this.listeners.add(listener);
29
+ return () => this.listeners.delete(listener);
30
+ }
31
+ openPicker(request, onSelect) {
32
+ return this.open({ kind: "picker", request, onSelect }, "picker");
33
+ }
34
+ /**
35
+ * Opens a pager. Allowed over an open plan confirm so "P" can show full
36
+ * plan detail without resolving the confirm (F-021); closing the pager
37
+ * restores the suspended confirm. Any other open overlay is still rejected.
38
+ */
39
+ openPager(title, body) {
40
+ if (this.state.kind === "confirm" && this.state.request.kind === "plan" && !this.suspended) {
41
+ return this.suspendUnder({ kind: "pager", title, body }, "pager");
42
+ }
43
+ return this.open({ kind: "pager", title, body }, "pager");
44
+ }
45
+ openJobs() {
46
+ return this.open({ kind: "jobs" }, "jobs");
47
+ }
48
+ openPromptActions(request) {
49
+ return this.open({ kind: "prompt-actions", request }, "modal");
50
+ }
51
+ /** Resolves `false` if a blocking overlay was already open rather than hanging. */
52
+ openConfirm(request, onViewPlan) {
53
+ return new Promise((resolve) => {
54
+ const opened = this.open({ kind: "confirm", request, resolve, onViewPlan }, "modal");
55
+ if (!opened)
56
+ resolve(false);
57
+ });
58
+ }
59
+ /** Resolves `undefined` if a blocking overlay was already open rather than hanging. */
60
+ openSecret(request) {
61
+ return new Promise((resolve) => {
62
+ const opened = this.open({ kind: "secret", request, resolve }, "secret");
63
+ if (!opened)
64
+ resolve(undefined);
65
+ });
66
+ }
67
+ answerConfirm(ok) {
68
+ const confirm = this.activeConfirm();
69
+ if (!confirm)
70
+ return;
71
+ const { resolve } = confirm;
72
+ this.suspended = undefined;
73
+ this.forceClose();
74
+ resolve(ok);
75
+ }
76
+ answerSecret(value) {
77
+ if (this.state.kind !== "secret")
78
+ return;
79
+ const { resolve } = this.state;
80
+ this.forceClose();
81
+ resolve(value);
82
+ }
83
+ /** The picker's own `onSelect` decides whether/when to close (e.g. a
84
+ * provider pick may chain into a secret prompt instead of closing). */
85
+ selectPicker(value) {
86
+ if (this.state.kind !== "picker")
87
+ return;
88
+ this.state.onSelect(value);
89
+ }
90
+ close() {
91
+ if (this.state.kind === "none")
92
+ return;
93
+ if (this.suspended) {
94
+ this.restoreSuspended();
95
+ return;
96
+ }
97
+ this.forceClose();
98
+ }
99
+ dispose() {
100
+ if (this.suspended?.kind === "confirm")
101
+ this.suspended.resolve(false);
102
+ else if (this.state.kind === "confirm")
103
+ this.state.resolve(false);
104
+ else if (this.state.kind === "secret")
105
+ this.state.resolve(undefined);
106
+ this.suspended = undefined;
107
+ this.forceClose();
108
+ this.listeners.clear();
109
+ }
110
+ activeConfirm() {
111
+ if (this.state.kind === "confirm")
112
+ return this.state;
113
+ if (this.suspended?.kind === "confirm")
114
+ return this.suspended;
115
+ return undefined;
116
+ }
117
+ open(next, context) {
118
+ if (this.state.kind !== "none" || this.suspended)
119
+ return false;
120
+ try {
121
+ this.closeFocus = this.focus.pushOverlay(context);
122
+ }
123
+ catch {
124
+ return false;
125
+ }
126
+ this.state = next;
127
+ this.notify();
128
+ return true;
129
+ }
130
+ suspendUnder(next, context) {
131
+ this.suspended = this.state;
132
+ this.closeFocus?.();
133
+ try {
134
+ this.closeFocus = this.focus.pushOverlay(context);
135
+ }
136
+ catch {
137
+ this.suspended = undefined;
138
+ try {
139
+ this.closeFocus = this.focus.pushOverlay("modal");
140
+ }
141
+ catch {
142
+ this.closeFocus = undefined;
143
+ }
144
+ return false;
145
+ }
146
+ this.state = next;
147
+ this.notify();
148
+ return true;
149
+ }
150
+ restoreSuspended() {
151
+ const previous = this.suspended;
152
+ this.suspended = undefined;
153
+ this.closeFocus?.();
154
+ this.closeFocus = undefined;
155
+ if (!previous || previous.kind === "none") {
156
+ this.state = NONE;
157
+ this.notify();
158
+ return;
159
+ }
160
+ const context = previous.kind === "confirm"
161
+ ? "modal"
162
+ : previous.kind === "secret"
163
+ ? "secret"
164
+ : previous.kind === "picker"
165
+ ? "picker"
166
+ : previous.kind === "jobs"
167
+ ? "jobs"
168
+ : previous.kind === "prompt-actions"
169
+ ? "modal"
170
+ : "pager";
171
+ try {
172
+ this.closeFocus = this.focus.pushOverlay(context);
173
+ this.state = previous;
174
+ }
175
+ catch {
176
+ this.state = NONE;
177
+ if (previous.kind === "confirm")
178
+ previous.resolve(false);
179
+ else if (previous.kind === "secret")
180
+ previous.resolve(undefined);
181
+ }
182
+ this.notify();
183
+ }
184
+ forceClose() {
185
+ this.state = NONE;
186
+ this.closeFocus?.();
187
+ this.closeFocus = undefined;
188
+ this.notify();
189
+ }
190
+ notify() {
191
+ for (const listener of this.listeners)
192
+ listener();
193
+ }
194
+ }
195
+ //# sourceMappingURL=overlay-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay-controller.js","sourceRoot":"","sources":["../../../src/tui-v2/controllers/overlay-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Pane-scoped selection owner (V2-060..064).
3
+ *
4
+ * Owns semantic anchors, drag state, keyboard extension, and explicit copy
5
+ * (Ctrl+Shift+C). Auto-copy-on-release is off by default — OpenTUI native
6
+ * selection must not be fought by delayed clipboard side-effects.
7
+ */
8
+ import type { ClipboardPort } from "../../app/ports/clipboard-port.js";
9
+ import type { ActionId } from "../actions/action-id.js";
10
+ import { type SemanticAnchor, type SemanticDocument, type SemanticMovement, type SemanticRange } from "../state/semantic-document.js";
11
+ export type SelectionPane = "transcript" | "plan";
12
+ export type SelectionGranularity = "character" | "word" | "line";
13
+ export interface PointerPosition {
14
+ readonly x: number;
15
+ readonly y: number;
16
+ }
17
+ /** Native scroll primitives are injected to keep this controller renderer-independent. */
18
+ export interface DragEdgeScrollPort {
19
+ startAutoScroll(x: number, y: number): void;
20
+ updateAutoScroll(x: number, y: number): void;
21
+ stopAutoScroll(): void;
22
+ }
23
+ export interface PaneSelectionRange extends SemanticRange {
24
+ readonly pane: SelectionPane;
25
+ }
26
+ export interface SelectionState {
27
+ readonly activePane: SelectionPane | undefined;
28
+ readonly range: PaneSelectionRange | undefined;
29
+ readonly dragging: boolean;
30
+ readonly autoscrollPane: SelectionPane | undefined;
31
+ }
32
+ export type SelectionCopyResult = {
33
+ readonly status: "copied";
34
+ readonly text: string;
35
+ } | {
36
+ readonly status: "empty";
37
+ } | {
38
+ readonly status: "failed";
39
+ readonly error: unknown;
40
+ };
41
+ export type SelectionListener = () => void;
42
+ export interface SelectionControllerOptions {
43
+ /** Auto-copy on mouse release. Default false (disabled — was breaking touch/TUI). */
44
+ readonly copyOnRelease?: boolean | undefined;
45
+ }
46
+ export declare class SelectionController {
47
+ private readonly clipboard;
48
+ private readonly documents;
49
+ private readonly scrollPorts;
50
+ private readonly listeners;
51
+ private readonly copyOnRelease;
52
+ private state;
53
+ constructor(clipboard: ClipboardPort, options?: SelectionControllerOptions);
54
+ getState(): SelectionState;
55
+ subscribe(listener: SelectionListener): () => void;
56
+ setDocument(pane: SelectionPane, document: SemanticDocument): void;
57
+ registerScrollPort(pane: SelectionPane, port: DragEdgeScrollPort): () => void;
58
+ beginDrag(pane: SelectionPane, requested: SemanticAnchor, pointer?: PointerPosition): boolean;
59
+ dragTo(pane: SelectionPane, requested: SemanticAnchor, pointer?: PointerPosition): boolean;
60
+ finishDrag(): void;
61
+ click(pane: SelectionPane, requested: SemanticAnchor, granularity?: SelectionGranularity): boolean;
62
+ extend(pane: SelectionPane, movement: SemanticMovement): boolean;
63
+ selectAll(pane: SelectionPane): boolean;
64
+ clear(): void;
65
+ selectedText(): string;
66
+ hasSelection(): boolean;
67
+ copy(): Promise<SelectionCopyResult>;
68
+ handleAction(action: ActionId, pane: SelectionPane): boolean;
69
+ dispose(): void;
70
+ private maybeAutoCopy;
71
+ private clamp;
72
+ private startAutoscroll;
73
+ private updateAutoscroll;
74
+ private stopAutoscroll;
75
+ private setState;
76
+ }
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Pane-scoped selection owner (V2-060..064).
3
+ *
4
+ * Owns semantic anchors, drag state, keyboard extension, and explicit copy
5
+ * (Ctrl+Shift+C). Auto-copy-on-release is off by default — OpenTUI native
6
+ * selection must not be fought by delayed clipboard side-effects.
7
+ */
8
+ import { sanitizeDisplayText } from "../rendering/sanitize-display.js";
9
+ import { clampSemanticAnchor, compareSemanticAnchors, documentEnd, documentStart, moveSemanticAnchor, normalizeSemanticDocument, semanticLineRange, semanticRangeText, semanticWordRange, } from "../state/semantic-document.js";
10
+ const EMPTY_SELECTION_STATE = {
11
+ activePane: undefined,
12
+ range: undefined,
13
+ dragging: false,
14
+ autoscrollPane: undefined,
15
+ };
16
+ export class SelectionController {
17
+ clipboard;
18
+ documents = new Map();
19
+ scrollPorts = new Map();
20
+ listeners = new Set();
21
+ copyOnRelease;
22
+ state = EMPTY_SELECTION_STATE;
23
+ constructor(clipboard, options = {}) {
24
+ this.clipboard = clipboard;
25
+ this.copyOnRelease = options.copyOnRelease ?? false;
26
+ }
27
+ getState() {
28
+ return this.state;
29
+ }
30
+ subscribe(listener) {
31
+ this.listeners.add(listener);
32
+ return () => this.listeners.delete(listener);
33
+ }
34
+ setDocument(pane, document) {
35
+ const normalized = normalizeSemanticDocument(document);
36
+ this.documents.set(pane, normalized);
37
+ const range = this.state.range;
38
+ if (!range || range.pane !== pane)
39
+ return;
40
+ const anchor = clampSemanticAnchor(normalized, range.anchor, "start");
41
+ const focus = clampSemanticAnchor(normalized, range.focus, "end");
42
+ if (!anchor || !focus) {
43
+ this.clear();
44
+ return;
45
+ }
46
+ this.setState({ ...this.state, range: { pane, anchor, focus } });
47
+ }
48
+ registerScrollPort(pane, port) {
49
+ this.scrollPorts.set(pane, port);
50
+ return () => {
51
+ if (this.scrollPorts.get(pane) !== port)
52
+ return;
53
+ if (this.state.autoscrollPane === pane)
54
+ port.stopAutoScroll();
55
+ this.scrollPorts.delete(pane);
56
+ };
57
+ }
58
+ beginDrag(pane, requested, pointer) {
59
+ const anchor = this.clamp(pane, requested);
60
+ if (!anchor)
61
+ return false;
62
+ this.stopAutoscroll();
63
+ this.setState({
64
+ activePane: pane,
65
+ range: { pane, anchor, focus: anchor },
66
+ dragging: true,
67
+ autoscrollPane: undefined,
68
+ });
69
+ if (pointer)
70
+ this.startAutoscroll(pane, pointer);
71
+ return true;
72
+ }
73
+ dragTo(pane, requested, pointer) {
74
+ const range = this.state.range;
75
+ const activePane = this.state.activePane;
76
+ if (!range || !this.state.dragging || !activePane)
77
+ return false;
78
+ if (pointer)
79
+ this.updateAutoscroll(activePane, pointer);
80
+ if (pane !== activePane)
81
+ return false;
82
+ const focus = this.clamp(pane, requested);
83
+ if (!focus)
84
+ return false;
85
+ this.setState({ ...this.state, range: { ...range, focus } });
86
+ return true;
87
+ }
88
+ finishDrag() {
89
+ if (!this.state.dragging && !this.state.autoscrollPane)
90
+ return;
91
+ this.stopAutoscroll();
92
+ this.setState({ ...this.state, dragging: false, autoscrollPane: undefined });
93
+ this.maybeAutoCopy();
94
+ }
95
+ click(pane, requested, granularity = "character") {
96
+ this.finishDrag();
97
+ const anchor = this.clamp(pane, requested);
98
+ if (!anchor)
99
+ return false;
100
+ const document = this.documents.get(pane);
101
+ const range = granularity === "word"
102
+ ? semanticWordRange(document, anchor)
103
+ : granularity === "line"
104
+ ? semanticLineRange(document, anchor)
105
+ : { anchor, focus: anchor };
106
+ if (!range)
107
+ return false;
108
+ this.setState({ activePane: pane, range: { pane, ...range }, dragging: false, autoscrollPane: undefined });
109
+ this.maybeAutoCopy();
110
+ return true;
111
+ }
112
+ extend(pane, movement) {
113
+ const document = this.documents.get(pane);
114
+ if (!document)
115
+ return false;
116
+ const existing = this.state.range?.pane === pane ? this.state.range : undefined;
117
+ const anchor = existing?.anchor ?? documentStart(document);
118
+ const focus = existing?.focus ?? anchor;
119
+ if (!anchor || !focus)
120
+ return false;
121
+ const nextFocus = moveSemanticAnchor(document, focus, movement);
122
+ if (!nextFocus)
123
+ return false;
124
+ this.finishDrag();
125
+ this.setState({
126
+ activePane: pane,
127
+ range: { pane, anchor, focus: nextFocus },
128
+ dragging: false,
129
+ autoscrollPane: undefined,
130
+ });
131
+ return true;
132
+ }
133
+ selectAll(pane) {
134
+ const document = this.documents.get(pane);
135
+ if (!document)
136
+ return false;
137
+ const anchor = documentStart(document);
138
+ const focus = documentEnd(document);
139
+ if (!anchor || !focus)
140
+ return false;
141
+ this.finishDrag();
142
+ this.setState({ activePane: pane, range: { pane, anchor, focus }, dragging: false, autoscrollPane: undefined });
143
+ return true;
144
+ }
145
+ clear() {
146
+ this.stopAutoscroll();
147
+ this.setState(EMPTY_SELECTION_STATE);
148
+ }
149
+ selectedText() {
150
+ const range = this.state.range;
151
+ if (!range)
152
+ return "";
153
+ const document = this.documents.get(range.pane);
154
+ if (!document || compareSemanticAnchors(document, range.anchor, range.focus) === 0)
155
+ return "";
156
+ return sanitizeDisplayText(semanticRangeText(document, range));
157
+ }
158
+ hasSelection() {
159
+ return this.selectedText().length > 0;
160
+ }
161
+ async copy() {
162
+ const text = this.selectedText();
163
+ if (!text)
164
+ return { status: "empty" };
165
+ try {
166
+ await this.clipboard.writeText(text);
167
+ return { status: "copied", text };
168
+ }
169
+ catch (error) {
170
+ return { status: "failed", error };
171
+ }
172
+ }
173
+ handleAction(action, pane) {
174
+ switch (action) {
175
+ case "selection.copy":
176
+ void this.copy();
177
+ return true;
178
+ case "selection.clear":
179
+ this.clear();
180
+ return true;
181
+ case "selection.select-all":
182
+ return this.selectAll(pane);
183
+ case "selection.extend-left":
184
+ return this.extend(pane, "left");
185
+ case "selection.extend-right":
186
+ return this.extend(pane, "right");
187
+ case "selection.extend-up":
188
+ return this.extend(pane, "up");
189
+ case "selection.extend-down":
190
+ return this.extend(pane, "down");
191
+ case "selection.extend-word-left":
192
+ return this.extend(pane, "word-left");
193
+ case "selection.extend-word-right":
194
+ return this.extend(pane, "word-right");
195
+ case "selection.extend-line-start":
196
+ return this.extend(pane, "line-start");
197
+ case "selection.extend-line-end":
198
+ return this.extend(pane, "line-end");
199
+ default:
200
+ return false;
201
+ }
202
+ }
203
+ dispose() {
204
+ this.stopAutoscroll();
205
+ this.listeners.clear();
206
+ this.scrollPorts.clear();
207
+ this.documents.clear();
208
+ }
209
+ maybeAutoCopy() {
210
+ if (this.copyOnRelease && this.selectedText())
211
+ void this.copy();
212
+ }
213
+ clamp(pane, anchor) {
214
+ const document = this.documents.get(pane);
215
+ return document ? clampSemanticAnchor(document, anchor) : undefined;
216
+ }
217
+ startAutoscroll(pane, pointer) {
218
+ this.scrollPorts.get(pane)?.startAutoScroll(pointer.x, pointer.y);
219
+ this.setState({ ...this.state, autoscrollPane: pane });
220
+ }
221
+ updateAutoscroll(pane, pointer) {
222
+ if (this.state.autoscrollPane !== pane)
223
+ this.startAutoscroll(pane, pointer);
224
+ else
225
+ this.scrollPorts.get(pane)?.updateAutoScroll(pointer.x, pointer.y);
226
+ }
227
+ stopAutoscroll() {
228
+ const pane = this.state.autoscrollPane;
229
+ if (pane)
230
+ this.scrollPorts.get(pane)?.stopAutoScroll();
231
+ }
232
+ setState(next) {
233
+ this.state = next;
234
+ for (const listener of this.listeners)
235
+ listener();
236
+ }
237
+ }
238
+ //# sourceMappingURL=selection-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-controller.js","sourceRoot":"","sources":["../../../src/tui-v2/controllers/selection-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Ephemeral right-edge toast queue (UI chrome, not transcript history).
3
+ *
4
+ * Toasts auto-dismiss after a short TTL (default 2s). The host component
5
+ * handles slide-in / slide-out; this controller only owns data + timers.
6
+ */
7
+ export type ToastLevel = "info" | "success" | "warn" | "error";
8
+ export interface ToastItem {
9
+ readonly id: string;
10
+ readonly message: string;
11
+ readonly level: ToastLevel;
12
+ readonly createdAt: number;
13
+ readonly durationMs: number;
14
+ }
15
+ export interface ShowToastOptions {
16
+ readonly level?: ToastLevel | undefined;
17
+ /** Visible lifetime including leave animation; default 2000ms. */
18
+ readonly durationMs?: number | undefined;
19
+ }
20
+ export type ToastListener = () => void;
21
+ export declare const DEFAULT_TOAST_DURATION_MS = 2000;
22
+ export declare class ToastController {
23
+ private items;
24
+ private readonly timers;
25
+ private readonly listeners;
26
+ private seq;
27
+ private disposed;
28
+ getToasts(): readonly ToastItem[];
29
+ subscribe(listener: ToastListener): () => void;
30
+ show(message: string, options?: ShowToastOptions): string;
31
+ dismiss(id: string): void;
32
+ clear(): void;
33
+ dispose(): void;
34
+ private emit;
35
+ }