@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,21 @@
1
+ /**
2
+ * Content-driven composer height (classic parity for Shift+Enter multi-line).
3
+ *
4
+ * The shell passes a max text-row budget; the editor grows from 1 up to that
5
+ * budget based on hard newlines and soft-wrap at the input width.
6
+ */
7
+ /** Visual rows for the current prompt (newlines + width wrap). Empty → 1. */
8
+ export declare function countComposerVisualLines(text: string, wrapWidth: number): number;
9
+ /** Clamp content rows into the [min, max] budget. */
10
+ export declare function resolveComposerTextRows(contentLines: number, maxRows: number, minRows?: number): number;
11
+ /**
12
+ * Max editable text rows the terminal can spare while keeping a chat floor.
13
+ * `borderRows` accounts for the rounded input chrome around the textarea.
14
+ */
15
+ export declare function maxComposerTextRows(opts: {
16
+ readonly terminalRows: number;
17
+ readonly statusHeight: number;
18
+ readonly minChatRows: number;
19
+ readonly maxCap: number;
20
+ readonly borderRows?: number;
21
+ }): number;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Content-driven composer height (classic parity for Shift+Enter multi-line).
3
+ *
4
+ * The shell passes a max text-row budget; the editor grows from 1 up to that
5
+ * budget based on hard newlines and soft-wrap at the input width.
6
+ */
7
+ import { wrapPlainString } from "../../tui/text-format.js";
8
+ /** Visual rows for the current prompt (newlines + width wrap). Empty → 1. */
9
+ export function countComposerVisualLines(text, wrapWidth) {
10
+ if (!text)
11
+ return 1;
12
+ return Math.max(1, wrapPlainString(text, Math.max(1, wrapWidth)).length);
13
+ }
14
+ /** Clamp content rows into the [min, max] budget. */
15
+ export function resolveComposerTextRows(contentLines, maxRows, minRows = 1) {
16
+ const min = Math.max(1, minRows);
17
+ const max = Math.max(min, maxRows);
18
+ return Math.min(max, Math.max(min, Math.max(1, contentLines)));
19
+ }
20
+ /**
21
+ * Max editable text rows the terminal can spare while keeping a chat floor.
22
+ * `borderRows` accounts for the rounded input chrome around the textarea.
23
+ */
24
+ export function maxComposerTextRows(opts) {
25
+ const borders = opts.borderRows ?? 2;
26
+ const budget = opts.terminalRows - opts.statusHeight - opts.minChatRows - borders;
27
+ return Math.max(1, Math.min(opts.maxCap, budget));
28
+ }
29
+ //# sourceMappingURL=composer-height.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer-height.js","sourceRoot":"","sources":["../../../src/tui-v2/composer/composer-height.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,6EAA6E;AAC7E,MAAM,UAAU,wBAAwB,CAAC,IAAY,EAAE,SAAiB;IACtE,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC3E,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,uBAAuB,CACrC,YAAoB,EACpB,OAAe,EACf,OAAO,GAAG,CAAC;IAEX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAMnC;IACC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;IACrC,MAAM,MAAM,GACV,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;IACrE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Compact session meta for the input-box top border
3
+ * (e.g. `bynara · glm-5.2 · always-approve`).
4
+ *
5
+ * Always prefers showing provider when known — never model alone.
6
+ */
7
+ export declare function formatComposerMeta(provider: string | undefined, model: string | undefined, permissions: string | undefined): string;
8
+ /** Clip the meta label so it never overflows the input width. */
9
+ export declare function clipComposerMeta(label: string, inputWidth: number): string;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Compact session meta for the input-box top border
3
+ * (e.g. `bynara · glm-5.2 · always-approve`).
4
+ *
5
+ * Always prefers showing provider when known — never model alone.
6
+ */
7
+ export function formatComposerMeta(provider, model, permissions) {
8
+ const perm = permissions === "allow-all"
9
+ ? "always-approve"
10
+ : permissions === "default"
11
+ ? "default"
12
+ : (permissions ?? "default");
13
+ const parts = [];
14
+ if (provider)
15
+ parts.push(provider);
16
+ if (model) {
17
+ // Avoid "bynara · bynara/glm…" if model already embeds provider.
18
+ const modelShown = provider && model.startsWith(`${provider}/`)
19
+ ? model.slice(provider.length + 1)
20
+ : model;
21
+ if (modelShown)
22
+ parts.push(modelShown);
23
+ }
24
+ if (perm)
25
+ parts.push(perm);
26
+ return parts.join(" · ");
27
+ }
28
+ /** Clip the meta label so it never overflows the input width. */
29
+ export function clipComposerMeta(label, inputWidth) {
30
+ if (!label)
31
+ return "";
32
+ // Leave room for border glyphs and spaces around bottomTitle.
33
+ const max = Math.max(12, inputWidth - 6);
34
+ if (label.length <= max)
35
+ return label;
36
+ return `${label.slice(0, Math.max(8, max - 1))}…`;
37
+ }
38
+ //# sourceMappingURL=composer-meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer-meta.js","sourceRoot":"","sources":["../../../src/tui-v2/composer/composer-meta.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,UAAU,kBAAkB,CAChC,QAA4B,EAC5B,KAAyB,EACzB,WAA+B;IAE/B,MAAM,IAAI,GACR,WAAW,KAAK,WAAW;QACzB,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,WAAW,KAAK,SAAS;YACzB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC;IAEnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,KAAK,EAAE,CAAC;QACV,iEAAiE;QACjE,MAAM,UAAU,GACd,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC;YAC1C,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YAClC,CAAC,CAAC,KAAK,CAAC;QACZ,IAAI,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3B,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,UAAkB;IAChE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,8DAA8D;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AACpD,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Up/Down disambiguation for a multiline composer (INPUT-006, V2-043).
3
+ *
4
+ * Inside a multiline value, Up/Down move the cursor between visual lines by
5
+ * default. History navigation only takes over once the cursor is already at
6
+ * the boundary it would otherwise move past — the top line for Up, the
7
+ * bottom line for Down — so history recall never steals a cursor move the
8
+ * user is mid-way through.
9
+ */
10
+ export interface CursorLineInfo {
11
+ readonly line: number;
12
+ readonly lineCount: number;
13
+ }
14
+ export declare function shouldNavigateHistoryUp(info: CursorLineInfo): boolean;
15
+ export declare function shouldNavigateHistoryDown(info: CursorLineInfo): boolean;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Up/Down disambiguation for a multiline composer (INPUT-006, V2-043).
3
+ *
4
+ * Inside a multiline value, Up/Down move the cursor between visual lines by
5
+ * default. History navigation only takes over once the cursor is already at
6
+ * the boundary it would otherwise move past — the top line for Up, the
7
+ * bottom line for Down — so history recall never steals a cursor move the
8
+ * user is mid-way through.
9
+ */
10
+ export function shouldNavigateHistoryUp(info) {
11
+ return info.line <= 0;
12
+ }
13
+ export function shouldNavigateHistoryDown(info) {
14
+ return info.line >= info.lineCount - 1;
15
+ }
16
+ //# sourceMappingURL=history-nav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-nav.js","sourceRoot":"","sources":["../../../src/tui-v2/composer/history-nav.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,MAAM,UAAU,uBAAuB,CAAC,IAAoB;IAC1D,OAAO,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAoB;IAC5D,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Advertises the newline chord for the composer (COMPAT-001, V2-047).
3
+ *
4
+ * Shift+Enter is always the advertised primary (works on macOS / Linux /
5
+ * Windows when the terminal reports the Shift modifier). Alt/Option+Enter
6
+ * remains a bound fallback for terminals that cannot distinguish Shift+Enter.
7
+ */
8
+ import type { TerminalCapabilityReport } from "../bootstrap/capabilities.js";
9
+ export interface NewlineHint {
10
+ readonly chord: string;
11
+ readonly label: string;
12
+ }
13
+ export declare function resolveNewlineHint(_capabilities: Pick<TerminalCapabilityReport, "canDistinguishShiftEnter">): NewlineHint;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Advertises the newline chord for the composer (COMPAT-001, V2-047).
3
+ *
4
+ * Shift+Enter is always the advertised primary (works on macOS / Linux /
5
+ * Windows when the terminal reports the Shift modifier). Alt/Option+Enter
6
+ * remains a bound fallback for terminals that cannot distinguish Shift+Enter.
7
+ */
8
+ export function resolveNewlineHint(_capabilities) {
9
+ // Always advertise Shift+Enter — both shift and meta bindings stay active
10
+ // in the textarea overrides so newline works across OS/terminals.
11
+ return { chord: "shift+enter", label: "Shift+Enter newline" };
12
+ }
13
+ //# sourceMappingURL=newline-hint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newline-hint.js","sourceRoot":"","sources":["../../../src/tui-v2/composer/newline-hint.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,UAAU,kBAAkB,CAChC,aAAyE;IAEzE,0EAA0E;IAC1E,kEAAkE;IAClE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;AAChE,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Large-paste placeholders (INPUT-003, V2-042).
3
+ *
4
+ * A large paste is replaced in the visible buffer by a single short token so
5
+ * it stays scannable and cheap to edit around; the real text is kept in a
6
+ * registry and swapped back in at submit time. Because the placeholder is
7
+ * inserted with one `insertText` call, it is one undo step — undoing it
8
+ * removes the whole paste, not one character at a time.
9
+ */
10
+ export interface PasteThresholds {
11
+ readonly lines?: number;
12
+ readonly chars?: number;
13
+ }
14
+ export declare function countLines(text: string): number;
15
+ export declare function isLargePaste(text: string, thresholds?: PasteThresholds): boolean;
16
+ export interface PastePlaceholderEntry {
17
+ readonly id: number;
18
+ readonly token: string;
19
+ readonly text: string;
20
+ readonly lines: number;
21
+ readonly chars: number;
22
+ }
23
+ /**
24
+ * Holds full pasted text keyed by an incrementing id and renders the token
25
+ * shown in the composer buffer in its place.
26
+ */
27
+ export declare class PasteRegistry {
28
+ private readonly entries;
29
+ private nextId;
30
+ register(text: string): PastePlaceholderEntry;
31
+ resolve(id: number): PastePlaceholderEntry | undefined;
32
+ clear(): void;
33
+ /** Replace every known placeholder token in `value` with its full text. */
34
+ expand(value: string): string;
35
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Large-paste placeholders (INPUT-003, V2-042).
3
+ *
4
+ * A large paste is replaced in the visible buffer by a single short token so
5
+ * it stays scannable and cheap to edit around; the real text is kept in a
6
+ * registry and swapped back in at submit time. Because the placeholder is
7
+ * inserted with one `insertText` call, it is one undo step — undoing it
8
+ * removes the whole paste, not one character at a time.
9
+ */
10
+ const DEFAULT_LINE_THRESHOLD = 8;
11
+ const DEFAULT_CHAR_THRESHOLD = 800;
12
+ export function countLines(text) {
13
+ return text.length === 0 ? 0 : text.split("\n").length;
14
+ }
15
+ export function isLargePaste(text, thresholds = {}) {
16
+ const lineLimit = thresholds.lines ?? DEFAULT_LINE_THRESHOLD;
17
+ const charLimit = thresholds.chars ?? DEFAULT_CHAR_THRESHOLD;
18
+ return countLines(text) > lineLimit || text.length > charLimit;
19
+ }
20
+ /**
21
+ * Holds full pasted text keyed by an incrementing id and renders the token
22
+ * shown in the composer buffer in its place.
23
+ */
24
+ export class PasteRegistry {
25
+ entries = new Map();
26
+ nextId = 1;
27
+ register(text) {
28
+ const id = this.nextId++;
29
+ const lines = countLines(text);
30
+ const entry = {
31
+ id,
32
+ token: `[Pasted text #${id} +${lines} lines]`,
33
+ text,
34
+ lines,
35
+ chars: text.length,
36
+ };
37
+ this.entries.set(id, entry);
38
+ return entry;
39
+ }
40
+ resolve(id) {
41
+ return this.entries.get(id);
42
+ }
43
+ clear() {
44
+ this.entries.clear();
45
+ }
46
+ /** Replace every known placeholder token in `value` with its full text. */
47
+ expand(value) {
48
+ let result = value;
49
+ for (const entry of this.entries.values()) {
50
+ result = result.split(entry.token).join(entry.text);
51
+ }
52
+ return result;
53
+ }
54
+ }
55
+ //# sourceMappingURL=paste-placeholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paste-placeholder.js","sourceRoot":"","sources":["../../../src/tui-v2/composer/paste-placeholder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAOnC,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,aAA8B,EAAE;IACzE,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,IAAI,sBAAsB,CAAC;IAC7D,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,IAAI,sBAAsB,CAAC;IAC7D,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;AACjE,CAAC;AAUD;;;GAGG;AACH,MAAM,OAAO,aAAa;IACP,OAAO,GAAG,IAAI,GAAG,EAAiC,CAAC;IAC5D,MAAM,GAAG,CAAC,CAAC;IAEnB,QAAQ,CAAC,IAAY;QACnB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,KAAK,GAA0B;YACnC,EAAE;YACF,KAAK,EAAE,iBAAiB,EAAE,KAAK,KAAK,SAAS;YAC7C,IAAI;YACJ,KAAK;YACL,KAAK,EAAE,IAAI,CAAC,MAAM;SACnB,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,2EAA2E;IAC3E,MAAM,CAAC,KAAa;QAClB,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Prompt recall history for the composer (INPUT-006, V2-043).
3
+ *
4
+ * Mirrors the classic REPL's history/draft semantics (`src/tui/App.tsx`) as a
5
+ * standalone, renderer-independent class: consecutive duplicates are not
6
+ * re-recorded, an in-progress draft is preserved while browsing history, and
7
+ * moving past the newest entry restores that draft rather than blanking it.
8
+ */
9
+ export declare class PromptHistory {
10
+ private readonly entries;
11
+ private cursor;
12
+ private draft;
13
+ push(text: string): void;
14
+ get size(): number;
15
+ /** Move to the previous (older) entry, saving `currentValue` as the draft. */
16
+ prev(currentValue: string): string | undefined;
17
+ /** Move to the next (newer) entry, or restore the saved draft past the end. */
18
+ next(): string | undefined;
19
+ /** Reset browsing state, e.g. after a submit or an explicit edit. */
20
+ reset(): void;
21
+ isBrowsing(): boolean;
22
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Prompt recall history for the composer (INPUT-006, V2-043).
3
+ *
4
+ * Mirrors the classic REPL's history/draft semantics (`src/tui/App.tsx`) as a
5
+ * standalone, renderer-independent class: consecutive duplicates are not
6
+ * re-recorded, an in-progress draft is preserved while browsing history, and
7
+ * moving past the newest entry restores that draft rather than blanking it.
8
+ */
9
+ export class PromptHistory {
10
+ entries = [];
11
+ cursor = -1;
12
+ draft = "";
13
+ push(text) {
14
+ if (this.entries[this.entries.length - 1] === text)
15
+ return;
16
+ this.entries.push(text);
17
+ }
18
+ get size() {
19
+ return this.entries.length;
20
+ }
21
+ /** Move to the previous (older) entry, saving `currentValue` as the draft. */
22
+ prev(currentValue) {
23
+ if (this.entries.length === 0)
24
+ return undefined;
25
+ if (this.cursor < 0)
26
+ this.draft = currentValue;
27
+ this.cursor = this.cursor < 0 ? this.entries.length - 1 : Math.max(0, this.cursor - 1);
28
+ return this.entries[this.cursor];
29
+ }
30
+ /** Move to the next (newer) entry, or restore the saved draft past the end. */
31
+ next() {
32
+ if (this.cursor < 0)
33
+ return undefined;
34
+ const nextIndex = this.cursor + 1;
35
+ if (nextIndex >= this.entries.length) {
36
+ this.cursor = -1;
37
+ return this.draft;
38
+ }
39
+ this.cursor = nextIndex;
40
+ return this.entries[this.cursor];
41
+ }
42
+ /** Reset browsing state, e.g. after a submit or an explicit edit. */
43
+ reset() {
44
+ this.cursor = -1;
45
+ this.draft = "";
46
+ }
47
+ isBrowsing() {
48
+ return this.cursor >= 0;
49
+ }
50
+ }
51
+ //# sourceMappingURL=prompt-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-history.js","sourceRoot":"","sources":["../../../src/tui-v2/composer/prompt-history.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,OAAO,aAAa;IACP,OAAO,GAAa,EAAE,CAAC;IAChC,MAAM,GAAG,CAAC,CAAC,CAAC;IACZ,KAAK,GAAG,EAAE,CAAC;IAEnB,IAAI,CAAC,IAAY;QACf,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI;YAAE,OAAO;QAC3D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,8EAA8E;IAC9E,IAAI,CAAC,YAAoB;QACvB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAChD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC;QAC/C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvF,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,+EAA+E;IAC/E,IAAI;QACF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAClC,IAAI,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACrC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjB,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,qEAAqE;IACrE,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Masked secret editor state (INPUT-009, V2-046).
3
+ *
4
+ * The raw value never surfaces through the normal getters, string coercion,
5
+ * or JSON serialization used everywhere else in the app (transcript,
6
+ * history, logs) — only `reveal()` returns it, so a secret can only leave
7
+ * this buffer through the one call site that explicitly asks for it.
8
+ */
9
+ export declare class SecretBuffer {
10
+ private value;
11
+ insert(text: string, cursorOffset: number): number;
12
+ deleteBackward(cursorOffset: number): number;
13
+ clear(): void;
14
+ get length(): number;
15
+ masked(): string;
16
+ /** The only sanctioned way to read the plaintext back out. */
17
+ reveal(): string;
18
+ toString(): string;
19
+ toJSON(): string;
20
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Masked secret editor state (INPUT-009, V2-046).
3
+ *
4
+ * The raw value never surfaces through the normal getters, string coercion,
5
+ * or JSON serialization used everywhere else in the app (transcript,
6
+ * history, logs) — only `reveal()` returns it, so a secret can only leave
7
+ * this buffer through the one call site that explicitly asks for it.
8
+ */
9
+ const MASK_CHAR = "•";
10
+ export class SecretBuffer {
11
+ value = "";
12
+ insert(text, cursorOffset) {
13
+ this.value = this.value.slice(0, cursorOffset) + text + this.value.slice(cursorOffset);
14
+ return cursorOffset + text.length;
15
+ }
16
+ deleteBackward(cursorOffset) {
17
+ if (cursorOffset <= 0)
18
+ return cursorOffset;
19
+ this.value = this.value.slice(0, cursorOffset - 1) + this.value.slice(cursorOffset);
20
+ return cursorOffset - 1;
21
+ }
22
+ clear() {
23
+ this.value = "";
24
+ }
25
+ get length() {
26
+ return this.value.length;
27
+ }
28
+ masked() {
29
+ return MASK_CHAR.repeat(this.value.length);
30
+ }
31
+ /** The only sanctioned way to read the plaintext back out. */
32
+ reveal() {
33
+ return this.value;
34
+ }
35
+ toString() {
36
+ return this.masked();
37
+ }
38
+ toJSON() {
39
+ return this.masked();
40
+ }
41
+ }
42
+ //# sourceMappingURL=secret-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-buffer.js","sourceRoot":"","sources":["../../../src/tui-v2/composer/secret-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,MAAM,OAAO,YAAY;IACf,KAAK,GAAG,EAAE,CAAC;IAEnB,MAAM,CAAC,IAAY,EAAE,YAAoB;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACvF,OAAO,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;IACpC,CAAC;IAED,cAAc,CAAC,YAAoB;QACjC,IAAI,YAAY,IAAI,CAAC;YAAE,OAAO,YAAY,CAAC;QAC3C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACpF,OAAO,YAAY,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,MAAM;QACJ,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,8DAA8D;IAC9D,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Composer overrides for the native Textarea key-binding table (INPUT-002,
3
+ * V2-040/041).
4
+ *
5
+ * OpenTUI's `TextareaRenderable` already implements move/select/word/delete/
6
+ * undo semantics (INPUT-004/005) — this module only overrides the small set
7
+ * of chords where the library default is backwards for a submit-on-Enter
8
+ * composer (its default binds bare Enter to "newline" and Alt+Enter to
9
+ * "submit"). Everything else passes through untouched. The shape here
10
+ * mirrors `@opentui/core`'s `KeyBinding<TextareaAction>` structurally without
11
+ * importing it, keeping this module renderer-independent; the renderer glue
12
+ * casts it at the one place it is consumed.
13
+ */
14
+ export interface TextareaKeyBindingLike {
15
+ readonly name: string;
16
+ readonly ctrl?: boolean;
17
+ readonly shift?: boolean;
18
+ readonly meta?: boolean;
19
+ readonly super?: boolean;
20
+ readonly action: "submit" | "newline";
21
+ }
22
+ export declare function buildComposerTextareaOverrides(): TextareaKeyBindingLike[];
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Composer overrides for the native Textarea key-binding table (INPUT-002,
3
+ * V2-040/041).
4
+ *
5
+ * OpenTUI's `TextareaRenderable` already implements move/select/word/delete/
6
+ * undo semantics (INPUT-004/005) — this module only overrides the small set
7
+ * of chords where the library default is backwards for a submit-on-Enter
8
+ * composer (its default binds bare Enter to "newline" and Alt+Enter to
9
+ * "submit"). Everything else passes through untouched. The shape here
10
+ * mirrors `@opentui/core`'s `KeyBinding<TextareaAction>` structurally without
11
+ * importing it, keeping this module renderer-independent; the renderer glue
12
+ * casts it at the one place it is consumed.
13
+ */
14
+ const ENTER_NAMES = ["return", "kpenter"];
15
+ export function buildComposerTextareaOverrides() {
16
+ const overrides = [];
17
+ for (const name of ENTER_NAMES) {
18
+ // Bare Enter → submit. Newline chords cover every OS/terminal that can
19
+ // report a modifier on Return (Shift, Alt/Option/meta, Ctrl).
20
+ overrides.push({ name, action: "submit" });
21
+ overrides.push({ name, shift: true, action: "newline" });
22
+ overrides.push({ name, meta: true, action: "newline" });
23
+ overrides.push({ name, ctrl: true, action: "newline" });
24
+ }
25
+ return overrides;
26
+ }
27
+ //# sourceMappingURL=textarea-keybindings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea-keybindings.js","sourceRoot":"","sources":["../../../src/tui-v2/composer/textarea-keybindings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAU,CAAC;AAEnD,MAAM,UAAU,8BAA8B;IAC5C,MAAM,SAAS,GAA6B,EAAE,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,uEAAuE;QACvE,8DAA8D;QAC9D,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3C,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACzD,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACxD,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Focus + overlay ownership (V2-033, groundwork for V2-076).
3
+ *
4
+ * Single owner for where keyboard input is routed. The base focus is one of
5
+ * the visible regions; a blocking overlay (picker/modal/secret/search) takes
6
+ * precedence while open. Only one blocking overlay may be active at a time so
7
+ * nested actions cannot stack; opening a second is rejected rather than
8
+ * silently shadowing the first.
9
+ */
10
+ import type { ActionContext } from "../actions/action-id.js";
11
+ export type FocusRegion = "composer" | "transcript" | "plan";
12
+ export type OverlayContext = "picker" | "modal" | "secret" | "transcript-search" | "pager" | "jobs";
13
+ export declare class FocusController {
14
+ private readonly regionOrder;
15
+ private currentRegion;
16
+ private overlay;
17
+ private readonly listeners;
18
+ constructor(initialRegion?: FocusRegion, regionOrder?: readonly FocusRegion[]);
19
+ activeContext(): ActionContext;
20
+ region(): FocusRegion;
21
+ hasOverlay(): boolean;
22
+ focusRegion(region: FocusRegion): void;
23
+ /** Move focus to the next visible region, skipping overlays. */
24
+ cycleRegion(visible?: readonly FocusRegion[]): FocusRegion;
25
+ /** Open a blocking overlay; returns a disposer that closes it. */
26
+ pushOverlay(context: OverlayContext): () => void;
27
+ popOverlay(): void;
28
+ onChange(listener: (context: ActionContext) => void): () => void;
29
+ private notify;
30
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Focus + overlay ownership (V2-033, groundwork for V2-076).
3
+ *
4
+ * Single owner for where keyboard input is routed. The base focus is one of
5
+ * the visible regions; a blocking overlay (picker/modal/secret/search) takes
6
+ * precedence while open. Only one blocking overlay may be active at a time so
7
+ * nested actions cannot stack; opening a second is rejected rather than
8
+ * silently shadowing the first.
9
+ */
10
+ const DEFAULT_REGION_ORDER = [
11
+ "composer",
12
+ "transcript",
13
+ "plan",
14
+ ];
15
+ export class FocusController {
16
+ regionOrder;
17
+ currentRegion;
18
+ overlay;
19
+ listeners = new Set();
20
+ constructor(initialRegion = "composer", regionOrder = DEFAULT_REGION_ORDER) {
21
+ this.regionOrder = regionOrder;
22
+ this.currentRegion = initialRegion;
23
+ }
24
+ activeContext() {
25
+ return this.overlay ?? this.currentRegion;
26
+ }
27
+ region() {
28
+ return this.currentRegion;
29
+ }
30
+ hasOverlay() {
31
+ return this.overlay !== undefined;
32
+ }
33
+ focusRegion(region) {
34
+ if (this.currentRegion === region)
35
+ return;
36
+ this.currentRegion = region;
37
+ if (!this.overlay)
38
+ this.notify();
39
+ }
40
+ /** Move focus to the next visible region, skipping overlays. */
41
+ cycleRegion(visible = this.regionOrder) {
42
+ const order = visible.length > 0 ? visible : this.regionOrder;
43
+ const idx = order.indexOf(this.currentRegion);
44
+ const next = order[(idx + 1) % order.length] ?? this.currentRegion;
45
+ this.focusRegion(next);
46
+ return next;
47
+ }
48
+ /** Open a blocking overlay; returns a disposer that closes it. */
49
+ pushOverlay(context) {
50
+ if (this.overlay) {
51
+ throw new Error(`a blocking overlay (${this.overlay}) is already open; close it before opening ${context}`);
52
+ }
53
+ this.overlay = context;
54
+ this.notify();
55
+ let closed = false;
56
+ return () => {
57
+ if (closed)
58
+ return;
59
+ closed = true;
60
+ if (this.overlay === context)
61
+ this.popOverlay();
62
+ };
63
+ }
64
+ popOverlay() {
65
+ if (!this.overlay)
66
+ return;
67
+ this.overlay = undefined;
68
+ this.notify();
69
+ }
70
+ onChange(listener) {
71
+ this.listeners.add(listener);
72
+ return () => this.listeners.delete(listener);
73
+ }
74
+ notify() {
75
+ const context = this.activeContext();
76
+ for (const listener of this.listeners)
77
+ listener(context);
78
+ }
79
+ }
80
+ //# sourceMappingURL=focus-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-controller.js","sourceRoot":"","sources":["../../../src/tui-v2/controllers/focus-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,MAAM,oBAAoB,GAA2B;IACnD,UAAU;IACV,YAAY;IACZ,MAAM;CACP,CAAC;AAEF,MAAM,OAAO,eAAe;IAOP;IANX,aAAa,CAAc;IAC3B,OAAO,CAA6B;IAC3B,SAAS,GAAG,IAAI,GAAG,EAAoC,CAAC;IAEzE,YACE,gBAA6B,UAAU,EACtB,cAAsC,oBAAoB;QAA1D,gBAAW,GAAX,WAAW,CAA+C;QAE3E,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,CAAC;IAC5C,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC;IACpC,CAAC;IAED,WAAW,CAAC,MAAmB;QAC7B,IAAI,IAAI,CAAC,aAAa,KAAK,MAAM;YAAE,OAAO;QAC1C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACnC,CAAC;IAED,gEAAgE;IAChE,WAAW,CAAC,UAAkC,IAAI,CAAC,WAAW;QAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;QAC9D,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC;QACnE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kEAAkE;IAClE,WAAW,CAAC,OAAuB;QACjC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,uBAAuB,IAAI,CAAC,OAAO,8CAA8C,OAAO,EAAE,CAC3F,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,OAAO,GAAG,EAAE;YACV,IAAI,MAAM;gBAAE,OAAO;YACnB,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO;gBAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QAClD,CAAC,CAAC;IACJ,CAAC;IAED,UAAU;QACR,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,QAAQ,CAAC,QAA0C;QACjD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAEO,MAAM;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;YAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC;CACF"}