@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,396 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "@opentui/react/jsx-runtime";
2
+ /** @jsxImportSource @opentui/react */
3
+ /**
4
+ * Scrollable pager for long content — full tool output, plan detail (PICK-003,
5
+ * V2-074).
6
+ *
7
+ * Clean chrome: one border title, one meta/help row, body, one footer.
8
+ * Ctrl+R search: substring matches paint reverse-video; Enter jumps to the
9
+ * next hit and keeps the query so n/N / highlight stay active after the
10
+ * filter bar closes.
11
+ */
12
+ import { useEffect, useMemo, useRef, useState } from "react";
13
+ import { useKeyboard, useTerminalDimensions } from "@opentui/react";
14
+ import { TextAttributes } from "@opentui/core";
15
+ import { chordFromKeyEvent } from "../../actions/chord-from-key.js";
16
+ import { findPagerMatches, nextPagerMatch, prevPagerMatch, segmentPagerLine, } from "../../state/pager-search.js";
17
+ const HIDDEN_SCROLLBARS = {
18
+ visible: false,
19
+ showArrows: false,
20
+ };
21
+ /** Progressive help lines — always one row; never wrap into the line-count. */
22
+ const PAGER_HELP_FULL = "↑↓:scroll · pg↑↓:page · g/G:jump · ^r:search · n/N:next · c:copy · s:scrollback · e:editor · q/esc:close";
23
+ const PAGER_HELP_MED = "↑↓:scroll · ^r:search · n/N:next · c:copy · e:editor · q/esc:close";
24
+ const PAGER_HELP_SHORT = "↑↓:scroll · ^r:search · c:copy · q/esc:close";
25
+ const PAGER_HELP_MIN = "↑↓ · ^r · q/esc:close";
26
+ const PAGER_FOOTER_FULL = "c:copy · drag:select · s/^s:scrollback · e/^e:editor";
27
+ const PAGER_FOOTER_SHORT = "c:copy · s:scrollback · e:editor";
28
+ function fitOneLine(candidates, maxCols) {
29
+ const budget = Math.max(8, maxCols);
30
+ for (const text of candidates) {
31
+ if (text.length <= budget)
32
+ return text;
33
+ }
34
+ const last = candidates[candidates.length - 1] ?? "";
35
+ if (last.length <= budget)
36
+ return last;
37
+ if (budget <= 1)
38
+ return "…";
39
+ return `${last.slice(0, budget - 1)}…`;
40
+ }
41
+ /** Base fg for a non-match body line (path/header cues, plan sections). */
42
+ function baseLineFg(line, theme) {
43
+ const t = line.trim();
44
+ if (/^──\s*full output saved at/i.test(t))
45
+ return theme.response;
46
+ if (/^\/Users\/|^\/home\/|^~\/|^\.clai\/|outputs\//i.test(t)) {
47
+ return theme.response;
48
+ }
49
+ if (t.startsWith("─"))
50
+ return theme.chip;
51
+ // Plan pager section titles
52
+ if (/^(Approach|Tasks|Goal|Status)\b/i.test(t) && !t.includes(" ·")) {
53
+ return theme.cyan;
54
+ }
55
+ if (/^Status\s+/i.test(t) || /^Updated\s+/i.test(t))
56
+ return theme.muted;
57
+ if (/^[✓✗○◉–]\s/.test(t) || /^\s+[✓✗○◉–]\s/.test(line)) {
58
+ if (t.startsWith("✓") || line.includes(" ✓"))
59
+ return theme.success;
60
+ if (t.startsWith("✗") || line.includes(" ✗"))
61
+ return theme.accent;
62
+ if (t.startsWith("◉") || line.includes(" ◉"))
63
+ return theme.activity;
64
+ return theme.muted;
65
+ }
66
+ if (/^(Next:|Plan is approved|All tasks completed)/i.test(t))
67
+ return theme.muted;
68
+ if (/q\/esc:close|Esc or q to close/i.test(t))
69
+ return theme.muted;
70
+ return theme.foreground;
71
+ }
72
+ function PagerLine(props) {
73
+ const { line, index, theme, matches, activeMatchIndex, hasQuery } = props;
74
+ const baseFg = baseLineFg(line, theme);
75
+ const isActiveLine = hasQuery &&
76
+ activeMatchIndex >= 0 &&
77
+ matches[activeMatchIndex]?.line === index;
78
+ if (!hasQuery || matches.length === 0) {
79
+ return (_jsx("text", { id: `pager-line-${index}`, selectable: true, style: {
80
+ fg: baseFg,
81
+ // Subtle bar on the active match line so the jump target is obvious.
82
+ ...(isActiveLine ? { bg: theme.rowA } : {}),
83
+ }, children: line || " " }));
84
+ }
85
+ const segments = segmentPagerLine(line, index, matches, activeMatchIndex);
86
+ return (_jsx("text", { id: `pager-line-${index}`, selectable: true, style: {
87
+ fg: baseFg,
88
+ ...(isActiveLine ? { bg: theme.rowA } : {}),
89
+ }, children: segments.map((seg, i) => {
90
+ if (seg.kind === "plain") {
91
+ return (_jsx("span", { style: { fg: baseFg }, children: seg.text }, i));
92
+ }
93
+ if (seg.kind === "active") {
94
+ // Current hit: bright reverse-video yellow.
95
+ return (_jsx("span", { style: {
96
+ fg: theme.background,
97
+ bg: theme.activity,
98
+ attributes: TextAttributes.BOLD,
99
+ }, children: seg.text }, i));
100
+ }
101
+ // Other hits: blue selection chip.
102
+ return (_jsx("span", { style: {
103
+ fg: theme.white,
104
+ bg: theme.selection,
105
+ attributes: TextAttributes.BOLD,
106
+ }, children: seg.text }, i));
107
+ }) }));
108
+ }
109
+ export function Pager(props) {
110
+ const { services, theme, title, body } = props;
111
+ const { width: termWidth } = useTerminalDimensions();
112
+ const scrollRef = useRef(null);
113
+ const lines = useMemo(() => body.replace(/\n+$/, "").split("\n"), [body]);
114
+ const [searchOpen, setSearchOpen] = useState(false);
115
+ const [query, setQuery] = useState("");
116
+ const [matchIndex, setMatchIndex] = useState(-1);
117
+ const [scrollHint, setScrollHint] = useState("top");
118
+ const matches = useMemo(() => findPagerMatches(lines, query), [lines, query]);
119
+ const [exportError, setExportError] = useState(undefined);
120
+ const [statusFlash, setStatusFlash] = useState(undefined);
121
+ const hasQuery = query.trim().length > 0;
122
+ // Pager is ~96% wide with padding; reserve room for " N lines · bottom ".
123
+ const contentCols = Math.max(24, Math.floor(termWidth * 0.96) - 8);
124
+ function flash(message, ms = 1800) {
125
+ setStatusFlash(message);
126
+ setExportError(undefined);
127
+ setTimeout(() => setStatusFlash((cur) => (cur === message ? undefined : cur)), ms);
128
+ }
129
+ // Force-hide both bars — the grey horizontal track was the ugly bottom band.
130
+ useEffect(() => {
131
+ const sb = scrollRef.current;
132
+ if (!sb)
133
+ return;
134
+ sb.verticalScrollBar.visible = false;
135
+ sb.horizontalScrollBar.visible = false;
136
+ }, [lines.length]);
137
+ // Drop an out-of-range active index when the query shrinks the hit list.
138
+ useEffect(() => {
139
+ if (!hasQuery || matches.length === 0) {
140
+ setMatchIndex(-1);
141
+ return;
142
+ }
143
+ setMatchIndex((cur) => (cur >= matches.length ? -1 : cur));
144
+ }, [hasQuery, matches]);
145
+ function refreshScrollHint() {
146
+ const sb = scrollRef.current;
147
+ if (!sb)
148
+ return;
149
+ const max = Math.max(0, sb.scrollHeight - sb.viewport.height);
150
+ if (max <= 0) {
151
+ setScrollHint("all");
152
+ return;
153
+ }
154
+ const ratio = sb.scrollTop / max;
155
+ if (ratio <= 0.02)
156
+ setScrollHint("top");
157
+ else if (ratio >= 0.98)
158
+ setScrollHint("bottom");
159
+ else
160
+ setScrollHint(`${Math.round(ratio * 100)}%`);
161
+ }
162
+ function scrollByRows(delta) {
163
+ const sb = scrollRef.current;
164
+ if (!sb)
165
+ return;
166
+ const max = Math.max(0, sb.scrollHeight - sb.viewport.height);
167
+ sb.scrollTo(Math.max(0, Math.min(max, sb.scrollTop + delta)));
168
+ refreshScrollHint();
169
+ }
170
+ function jumpToMatch(index, matchList = matches) {
171
+ if (index < 0 || matchList.length === 0) {
172
+ setMatchIndex(-1);
173
+ return;
174
+ }
175
+ setMatchIndex(index);
176
+ const match = matchList[index];
177
+ if (match) {
178
+ // Defer until after paint so the active line exists in the scroll tree.
179
+ queueMicrotask(() => {
180
+ scrollRef.current?.scrollChildIntoView(`pager-line-${match.line}`);
181
+ refreshScrollHint();
182
+ });
183
+ }
184
+ }
185
+ /** Enter / submit: next hit from the *current* query (avoids stale closure). */
186
+ function submitSearch() {
187
+ const found = findPagerMatches(lines, query);
188
+ if (found.length === 0)
189
+ return;
190
+ const next = nextPagerMatch(found, matchIndex);
191
+ jumpToMatch(next, found);
192
+ // Close the filter bar but keep the query so highlights + n/N remain.
193
+ setSearchOpen(false);
194
+ }
195
+ function clearSearch() {
196
+ setSearchOpen(false);
197
+ setQuery("");
198
+ setMatchIndex(-1);
199
+ }
200
+ async function runExport(promise, okMessage) {
201
+ try {
202
+ const result = await promise;
203
+ if (result.ok) {
204
+ flash(okMessage, 2400);
205
+ setExportError(undefined);
206
+ }
207
+ else {
208
+ setExportError(result.error ?? "export failed");
209
+ setStatusFlash(undefined);
210
+ }
211
+ }
212
+ catch (error) {
213
+ setExportError(error instanceof Error ? error.message : String(error));
214
+ setStatusFlash(undefined);
215
+ }
216
+ }
217
+ useKeyboard((key) => {
218
+ if (key.eventType === "release")
219
+ return;
220
+ const chord = chordFromKeyEvent(key);
221
+ if (searchOpen) {
222
+ if (chord === "escape") {
223
+ key.preventDefault();
224
+ // Abort filter: drop query + highlights.
225
+ clearSearch();
226
+ }
227
+ // Let the <input> consume other keys (including Enter → onSubmit).
228
+ return;
229
+ }
230
+ const action = services.router.resolve(chord, "pager");
231
+ if (!action) {
232
+ // Esc with an active query clears highlight without closing the pager.
233
+ if (chord === "escape" && hasQuery) {
234
+ key.preventDefault();
235
+ clearSearch();
236
+ }
237
+ return;
238
+ }
239
+ key.preventDefault();
240
+ const sb = scrollRef.current;
241
+ switch (action) {
242
+ case "pager.line-up":
243
+ scrollByRows(-1);
244
+ break;
245
+ case "pager.line-down":
246
+ scrollByRows(1);
247
+ break;
248
+ case "pager.page-up":
249
+ scrollByRows(-(sb?.viewport.height ?? 10));
250
+ break;
251
+ case "pager.page-down":
252
+ scrollByRows(sb?.viewport.height ?? 10);
253
+ break;
254
+ case "pager.half-page-up":
255
+ scrollByRows(-Math.max(1, Math.floor((sb?.viewport.height ?? 10) / 2)));
256
+ break;
257
+ case "pager.half-page-down":
258
+ scrollByRows(Math.max(1, Math.floor((sb?.viewport.height ?? 10) / 2)));
259
+ break;
260
+ case "pager.top":
261
+ sb?.scrollTo(0);
262
+ refreshScrollHint();
263
+ break;
264
+ case "pager.bottom":
265
+ sb?.scrollTo(sb.scrollHeight);
266
+ refreshScrollHint();
267
+ break;
268
+ case "pager.search":
269
+ setSearchOpen(true);
270
+ break;
271
+ case "pager.next-match":
272
+ if (matches.length > 0)
273
+ jumpToMatch(nextPagerMatch(matches, matchIndex));
274
+ break;
275
+ case "pager.prev-match":
276
+ if (matches.length > 0)
277
+ jumpToMatch(prevPagerMatch(matches, matchIndex));
278
+ break;
279
+ case "pager.export-scrollback":
280
+ void runExport(services.pagerExport.exportToScrollback(title, body), "exported to terminal scrollback (scroll up after exit)");
281
+ break;
282
+ case "pager.export-editor":
283
+ void runExport(services.pagerExport.exportToEditor(body), "opened in editor");
284
+ break;
285
+ case "pager.copy":
286
+ void services.ports.clipboard.writeText(body).then(() => flash("copied all"), () => flash("copy failed"));
287
+ break;
288
+ case "pager.close":
289
+ // First Esc clears an active search highlight; second closes the pager.
290
+ if (hasQuery) {
291
+ clearSearch();
292
+ }
293
+ else {
294
+ services.overlay.close();
295
+ }
296
+ break;
297
+ default:
298
+ break;
299
+ }
300
+ });
301
+ const scrollLabel = scrollHint === "all"
302
+ ? "all"
303
+ : scrollHint === "top"
304
+ ? "top"
305
+ : scrollHint === "bottom"
306
+ ? "bottom"
307
+ : scrollHint;
308
+ const matchStatus = hasQuery && matches.length > 0
309
+ ? `${Math.max(0, matchIndex) + 1}/${matches.length}`
310
+ : hasQuery
311
+ ? "no matches"
312
+ : "";
313
+ const lineCountText = `${lines.length} lines · ${scrollLabel}`;
314
+ // Leave room for the right-side status so help never wraps under it.
315
+ const helpBudget = Math.max(12, contentCols - lineCountText.length - 3);
316
+ const findSuffix = hasQuery && matchStatus ? ` · find:${query.trim()} ${matchStatus}` : "";
317
+ const flashSuffix = statusFlash ? ` · ${statusFlash}` : "";
318
+ const helpCore = fitOneLine([PAGER_HELP_FULL, PAGER_HELP_MED, PAGER_HELP_SHORT, PAGER_HELP_MIN], Math.max(12, helpBudget - findSuffix.length - flashSuffix.length));
319
+ const helpText = fitOneLine([`${helpCore}${flashSuffix}${findSuffix}`], helpBudget);
320
+ const footerLeft = exportError
321
+ ? fitOneLine([`export failed: ${exportError}`], helpBudget)
322
+ : statusFlash
323
+ ? fitOneLine([statusFlash], helpBudget)
324
+ : hasQuery
325
+ ? fitOneLine(["n/N:next · esc:clear-find · q:close"], helpBudget)
326
+ : fitOneLine([PAGER_FOOTER_FULL, PAGER_FOOTER_SHORT], helpBudget);
327
+ // Clip long titles so the border doesn't wrap/overflow.
328
+ const borderTitle = title.length > 72 ? ` ${title.slice(0, 69)}… ` : ` ${title} `;
329
+ return (_jsxs("box", { border: true, borderStyle: "rounded", title: borderTitle, titleAlignment: "left", titleColor: theme.cyan, style: {
330
+ flexDirection: "column",
331
+ // Larger than before — fills most of the terminal.
332
+ width: "96%",
333
+ height: "92%",
334
+ borderColor: theme.border,
335
+ backgroundColor: theme.statusBackground,
336
+ paddingLeft: 2,
337
+ paddingRight: 2,
338
+ paddingTop: 0,
339
+ paddingBottom: 0,
340
+ }, children: [_jsx("box", { style: {
341
+ flexDirection: "row",
342
+ justifyContent: "space-between",
343
+ alignItems: "center",
344
+ width: "100%",
345
+ height: 1,
346
+ flexShrink: 0,
347
+ backgroundColor: theme.rowB,
348
+ paddingLeft: 1,
349
+ paddingRight: 1,
350
+ }, children: searchOpen ? (_jsxs("box", { style: {
351
+ flexDirection: "row",
352
+ flexGrow: 1,
353
+ flexShrink: 1,
354
+ width: "100%",
355
+ height: 1,
356
+ minWidth: 0,
357
+ }, children: [_jsxs("text", { selectable: false, style: { fg: theme.cyan, height: 1 }, children: ["filter:", " "] }), _jsx("input", { focused: true, value: query, onInput: (value) => {
358
+ setQuery(value);
359
+ // Reset so Enter always lands on the first hit for a new query.
360
+ setMatchIndex(-1);
361
+ }, onSubmit: submitSearch, textColor: theme.foreground, backgroundColor: theme.rowB, style: { flexGrow: 1 } }), _jsxs("text", { selectable: false, style: { fg: theme.muted, flexShrink: 0 }, children: [" ", matches.length > 0
362
+ ? `${matchStatus} · enter:next · esc:cancel`
363
+ : query.trim()
364
+ ? "no matches"
365
+ : "type:filter"] })] })) : (_jsxs(_Fragment, { children: [_jsx("box", { style: {
366
+ flexGrow: 1,
367
+ flexShrink: 1,
368
+ minWidth: 0,
369
+ height: 1,
370
+ }, children: _jsx("text", { selectable: false, content: helpText, style: { fg: theme.muted, height: 1 } }) }), _jsx("text", { selectable: false, content: ` ${lineCountText}`, style: { fg: theme.cyan, height: 1, flexShrink: 0 } })] })) }), _jsxs("scrollbox", { ref: scrollRef, viewportCulling: true, scrollY: true, scrollX: false, stickyScroll: false, scrollbarOptions: HIDDEN_SCROLLBARS, verticalScrollbarOptions: HIDDEN_SCROLLBARS, horizontalScrollbarOptions: HIDDEN_SCROLLBARS, style: {
371
+ flexGrow: 1,
372
+ flexShrink: 1,
373
+ width: "100%",
374
+ minHeight: 8,
375
+ backgroundColor: theme.background,
376
+ marginTop: 0,
377
+ marginBottom: 0,
378
+ paddingLeft: 1,
379
+ paddingRight: 1,
380
+ paddingTop: 1,
381
+ }, onMouseScroll: () => refreshScrollHint(), children: [_jsx("text", { content: " ", style: { height: 1 } }), lines.map((line, index) => (_jsx(PagerLine, { line: line, index: index, theme: theme, matches: matches, activeMatchIndex: matchIndex, hasQuery: hasQuery }, index))), _jsx("text", { content: " ", style: { height: 1 } })] }), _jsxs("box", { style: {
382
+ flexDirection: "row",
383
+ justifyContent: "space-between",
384
+ alignItems: "center",
385
+ width: "100%",
386
+ height: 1,
387
+ flexShrink: 0,
388
+ backgroundColor: theme.rowB,
389
+ paddingLeft: 1,
390
+ paddingRight: 1,
391
+ }, children: [_jsx("box", { style: { flexGrow: 1, flexShrink: 1, minWidth: 0, height: 1 }, children: _jsx("text", { selectable: false, content: footerLeft, style: {
392
+ fg: exportError ? theme.mode : theme.muted,
393
+ height: 1,
394
+ } }) }), _jsx("text", { selectable: false, content: ` ${scrollLabel}`, style: { fg: theme.cyan, height: 1, flexShrink: 0 } })] })] }));
395
+ }
396
+ //# sourceMappingURL=pager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pager.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/pager/pager.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /** @jsxImportSource @opentui/react */
2
+ /**
3
+ * Searchable picker (models, providers, history, …).
4
+ *
5
+ * Quiet chrome: muted header boundary, soft zebra rows (no neon per-row rules).
6
+ * Provider rows show the configured model in green (classic parity).
7
+ */
8
+ import { type ReactNode } from "react";
9
+ import type { AppServices } from "../../bootstrap/composition-root.js";
10
+ import type { Theme } from "../../rendering/theme.js";
11
+ import type { PickerRequest } from "../../controllers/overlay-controller.js";
12
+ export interface PickerProps {
13
+ readonly services: AppServices;
14
+ readonly theme: Theme;
15
+ readonly request: PickerRequest;
16
+ }
17
+ export declare function Picker(props: PickerProps): ReactNode;
@@ -0,0 +1,222 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
2
+ /** @jsxImportSource @opentui/react */
3
+ /**
4
+ * Searchable picker (models, providers, history, …).
5
+ *
6
+ * Quiet chrome: muted header boundary, soft zebra rows (no neon per-row rules).
7
+ * Provider rows show the configured model in green (classic parity).
8
+ */
9
+ import { useEffect, useMemo, useState } from "react";
10
+ import { useKeyboard, useTerminalDimensions } from "@opentui/react";
11
+ import { chordFromKeyEvent } from "../../actions/chord-from-key.js";
12
+ import { activeIndex, filterPickerOptions, } from "../../rendering/picker-filter.js";
13
+ /** Hide native scrollbar so the list edge stays clean. */
14
+ const HIDDEN_SCROLLBARS = {
15
+ visible: false,
16
+ showArrows: false,
17
+ };
18
+ function isPrintableFilterChar(key) {
19
+ if (key.ctrl || key.meta || key.option || key.super)
20
+ return false;
21
+ const seq = key.sequence;
22
+ if (!seq || seq.length !== 1)
23
+ return false;
24
+ if (seq === "\x1b" || seq < " ")
25
+ return false;
26
+ if ([
27
+ "return",
28
+ "enter",
29
+ "escape",
30
+ "tab",
31
+ "backspace",
32
+ "delete",
33
+ "up",
34
+ "down",
35
+ "left",
36
+ "right",
37
+ "home",
38
+ "end",
39
+ "pageup",
40
+ "pagedown",
41
+ ].includes(key.name)) {
42
+ return false;
43
+ }
44
+ return true;
45
+ }
46
+ function pad(text, width) {
47
+ if (width <= 0)
48
+ return text;
49
+ if (text.length >= width)
50
+ return text.slice(0, Math.max(1, width - 1)) + "…";
51
+ return text + " ".repeat(width - text.length);
52
+ }
53
+ export function Picker(props) {
54
+ const { services, theme, request } = props;
55
+ const { width: termWidth, height: termHeight } = useTerminalDimensions();
56
+ const [query, setQuery] = useState("");
57
+ const [hovered, setHovered] = useState(undefined);
58
+ const [cursor, setCursor] = useState(() => activeIndex(request.options));
59
+ const [paintTick, setPaintTick] = useState(0);
60
+ useEffect(() => {
61
+ const id = setTimeout(() => setPaintTick(1), 0);
62
+ return () => clearTimeout(id);
63
+ }, []);
64
+ const isHistory = Boolean(request.historyStyle);
65
+ const filtered = useMemo(() => filterPickerOptions(request.options, query, {
66
+ searchDescription: request.searchDescription ?? isHistory,
67
+ }), [request.options, query, request.searchDescription, isHistory]);
68
+ useEffect(() => {
69
+ const next = activeIndex(filtered);
70
+ setCursor(next >= 0 ? next : 0);
71
+ setHovered(undefined);
72
+ }, [filtered]);
73
+ const selected = Math.min(hovered ?? cursor, Math.max(0, filtered.length - 1));
74
+ function accept() {
75
+ const option = filtered[selected];
76
+ if (option)
77
+ services.overlay.selectPicker(option.value);
78
+ }
79
+ useKeyboard((key) => {
80
+ if (key.eventType === "release")
81
+ return;
82
+ const chord = chordFromKeyEvent(key);
83
+ if (chord === "up") {
84
+ key.preventDefault();
85
+ setHovered(undefined);
86
+ setCursor((i) => filtered.length === 0 ? 0 : (i - 1 + filtered.length) % filtered.length);
87
+ return;
88
+ }
89
+ if (chord === "down") {
90
+ key.preventDefault();
91
+ setHovered(undefined);
92
+ setCursor((i) => (filtered.length === 0 ? 0 : (i + 1) % filtered.length));
93
+ return;
94
+ }
95
+ if (chord === "enter") {
96
+ key.preventDefault();
97
+ accept();
98
+ return;
99
+ }
100
+ if (chord === "escape") {
101
+ key.preventDefault();
102
+ services.overlay.close();
103
+ return;
104
+ }
105
+ if (chord === "backspace" || key.name === "delete") {
106
+ key.preventDefault();
107
+ setQuery((q) => q.slice(0, -1));
108
+ return;
109
+ }
110
+ if (chord === "ctrl+u") {
111
+ key.preventDefault();
112
+ setQuery("");
113
+ return;
114
+ }
115
+ if (isPrintableFilterChar(key)) {
116
+ key.preventDefault();
117
+ setQuery((q) => q + key.sequence);
118
+ }
119
+ });
120
+ const boxWidth = Math.min(Math.max(isHistory ? 56 : 48, Math.floor(termWidth * (isHistory ? 0.88 : 0.82))), termWidth - 2);
121
+ const boxHeight = Math.min(request.twoLine || isHistory
122
+ ? Math.floor(termHeight * 0.78)
123
+ : Math.floor(termHeight * 0.62), termHeight - 2);
124
+ const innerW = Math.max(24, boxWidth - 4);
125
+ const titleText = pad(isHistory
126
+ ? ` History · ${request.options.length} sessions`
127
+ : ` ${request.title}`, innerW);
128
+ const filterText = pad(query.length > 0
129
+ ? ` ⌕ ${query}█ · ${filtered.length}/${request.options.length}`
130
+ : ` ⌕ type:filter · ${filtered.length}/${request.options.length}`, innerW);
131
+ const hintText = pad(isHistory
132
+ ? " ↑↓:move · type:filter · ⌫:edit · ^u:clear · enter:open · esc:close · click:select"
133
+ : " ↑↓:select · type:filter · ⌫:edit · ^u:clear · enter:confirm · esc:close", innerW);
134
+ void paintTick;
135
+ return (_jsxs("box", { style: {
136
+ flexDirection: "column",
137
+ width: boxWidth,
138
+ height: boxHeight,
139
+ border: true,
140
+ borderStyle: "rounded",
141
+ borderColor: isHistory ? theme.accent : theme.modalBorder,
142
+ backgroundColor: theme.statusBackground,
143
+ }, children: [_jsxs("box", { style: {
144
+ flexDirection: "column",
145
+ width: "100%",
146
+ height: 4,
147
+ flexShrink: 0,
148
+ flexGrow: 0,
149
+ }, children: [_jsx("text", { selectable: false, content: titleText, style: {
150
+ fg: theme.white,
151
+ bg: isHistory ? theme.chipIndigo : theme.magenta,
152
+ height: 1,
153
+ } }), _jsx("text", { selectable: false, content: filterText, style: {
154
+ fg: query.length > 0 ? theme.white : theme.cyan,
155
+ bg: theme.rowA,
156
+ height: 1,
157
+ } }, `filter:${query.length}:${filtered.length}:${paintTick}`), _jsx("text", { selectable: false, content: hintText, style: { fg: theme.muted, bg: theme.rowB, height: 1 } }, `hint:${paintTick}`), _jsx("text", { selectable: false, content: pad("─".repeat(Math.max(8, innerW)), innerW), style: { fg: theme.chip, bg: theme.statusBackground, height: 1 } })] }), filtered.length === 0 ? (_jsx("text", { selectable: false, content: pad(" no matches · ^u:clear", innerW), style: { fg: theme.mode, bg: theme.background, height: 1, flexShrink: 0 } })) : null, _jsx("scrollbox", { viewportCulling: true, scrollY: true, scrollX: false, scrollbarOptions: HIDDEN_SCROLLBARS, verticalScrollbarOptions: HIDDEN_SCROLLBARS, horizontalScrollbarOptions: HIDDEN_SCROLLBARS, style: {
158
+ flexGrow: 1,
159
+ flexShrink: 1,
160
+ width: "100%",
161
+ backgroundColor: theme.background,
162
+ }, children: filtered.map((option, index) => (_jsx(PickerRow, { option: option, focused: index === selected, twoLine: Boolean(request.twoLine) || isHistory, historyStyle: isHistory, theme: theme, width: innerW, stripe: index % 2 === 1, onHover: () => setHovered(index), onSelect: () => services.overlay.selectPicker(option.value) }, option.value))) })] }));
163
+ }
164
+ function PickerRow(props) {
165
+ const { option, focused, twoLine, historyStyle, theme, width, stripe, onHover, onSelect, } = props;
166
+ // Soft zebra only — no cyan rules between rows.
167
+ const idleBg = stripe ? theme.rowB : theme.background;
168
+ const bg = focused
169
+ ? theme.selection
170
+ : option.active
171
+ ? theme.rowA
172
+ : idleBg;
173
+ const mark = focused ? "❯ " : " ";
174
+ if (historyStyle || twoLine) {
175
+ const badge = option.active ? "● " : focused ? "▸ " : " ";
176
+ const activeTag = option.active ? " · current" : "";
177
+ const line1 = pad(`${mark}${badge}${option.label}${activeTag}`, width);
178
+ const line2 = pad(option.description ? ` ${option.description}` : " ", width);
179
+ return (_jsxs("box", { style: {
180
+ flexDirection: "column",
181
+ width: "100%",
182
+ height: 2,
183
+ flexShrink: 0,
184
+ backgroundColor: bg,
185
+ }, onMouseOver: onHover, onMouseDown: (event) => {
186
+ event.preventDefault();
187
+ event.stopPropagation();
188
+ onSelect();
189
+ }, children: [_jsx("text", { selectable: false, content: line1, style: {
190
+ fg: focused || option.active ? theme.white : theme.foreground,
191
+ bg,
192
+ height: 1,
193
+ } }), _jsx("text", { selectable: false, content: line2, style: {
194
+ fg: focused ? theme.cyan : theme.muted,
195
+ bg,
196
+ height: 1,
197
+ } })] }));
198
+ }
199
+ // Single-line: label + optional "active" + description (model) in green.
200
+ // Classic: `groq openai/gpt-oss-20b` with model in response green.
201
+ const labelFg = focused || option.active ? theme.white : theme.foreground;
202
+ const activeFg = focused ? theme.white : theme.cyan;
203
+ const modelFg = focused ? theme.white : theme.response;
204
+ const trailing = Math.max(0, width -
205
+ mark.length -
206
+ option.label.length -
207
+ (option.active ? " active".length : 0) -
208
+ (option.description ? 1 + option.description.length : 0));
209
+ const padRight = " ".repeat(trailing);
210
+ return (_jsxs("box", { style: {
211
+ width: "100%",
212
+ height: 1,
213
+ flexShrink: 0,
214
+ backgroundColor: bg,
215
+ flexDirection: "row",
216
+ }, onMouseOver: onHover, onMouseDown: (event) => {
217
+ event.preventDefault();
218
+ event.stopPropagation();
219
+ onSelect();
220
+ }, children: [_jsxs("text", { selectable: false, style: { fg: labelFg, bg }, children: [mark, option.label] }), option.active ? (_jsx("text", { selectable: false, style: { fg: activeFg, bg }, children: " active" })) : null, option.description ? (_jsx("text", { selectable: false, style: { fg: modelFg, bg }, children: ` ${option.description}` })) : null, trailing > 0 ? (_jsx("text", { selectable: false, content: padRight, style: { fg: bg, bg } })) : null] }));
221
+ }
222
+ //# sourceMappingURL=picker.js.map