@pentoshi/clai 2.0.62 → 3.5.1

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 (475) hide show
  1. package/README.md +262 -368
  2. package/dist/agent/classic-renderer.js +9 -1
  3. package/dist/agent/classic-renderer.js.map +1 -1
  4. package/dist/agent/context-manager.d.ts +5 -0
  5. package/dist/agent/context-manager.js +14 -2
  6. package/dist/agent/context-manager.js.map +1 -1
  7. package/dist/agent/events.d.ts +9 -1
  8. package/dist/agent/plan-tool.js +80 -8
  9. package/dist/agent/plan-tool.js.map +1 -1
  10. package/dist/agent/runner.js +261 -122
  11. package/dist/agent/runner.js.map +1 -1
  12. package/dist/agent/tool-call-parser.d.ts +20 -0
  13. package/dist/agent/tool-call-parser.js +186 -2
  14. package/dist/agent/tool-call-parser.js.map +1 -1
  15. package/dist/app/adapters/agent-event-adapter.d.ts +29 -0
  16. package/dist/app/adapters/agent-event-adapter.js +148 -0
  17. package/dist/app/adapters/agent-event-adapter.js.map +1 -0
  18. package/dist/app/adapters/current-agent-adapter.d.ts +7 -0
  19. package/dist/app/adapters/current-agent-adapter.js +27 -0
  20. package/dist/app/adapters/current-agent-adapter.js.map +1 -0
  21. package/dist/app/adapters/current-jobs-adapter.d.ts +4 -0
  22. package/dist/app/adapters/current-jobs-adapter.js +13 -0
  23. package/dist/app/adapters/current-jobs-adapter.js.map +1 -0
  24. package/dist/app/adapters/current-store-adapter.d.ts +3 -0
  25. package/dist/app/adapters/current-store-adapter.js +22 -0
  26. package/dist/app/adapters/current-store-adapter.js.map +1 -0
  27. package/dist/app/adapters/current-terminal-adapter.d.ts +9 -0
  28. package/dist/app/adapters/current-terminal-adapter.js +31 -0
  29. package/dist/app/adapters/current-terminal-adapter.js.map +1 -0
  30. package/dist/app/adapters/current-updates-adapter.d.ts +7 -0
  31. package/dist/app/adapters/current-updates-adapter.js +31 -0
  32. package/dist/app/adapters/current-updates-adapter.js.map +1 -0
  33. package/dist/app/adapters/in-memory-clipboard-adapter.d.ts +10 -0
  34. package/dist/app/adapters/in-memory-clipboard-adapter.js +20 -0
  35. package/dist/app/adapters/in-memory-clipboard-adapter.js.map +1 -0
  36. package/dist/app/commands/command.d.ts +24 -0
  37. package/dist/app/commands/command.js +4 -0
  38. package/dist/app/commands/command.js.map +1 -0
  39. package/dist/app/commands/registry.d.ts +45 -0
  40. package/dist/app/commands/registry.js +164 -0
  41. package/dist/app/commands/registry.js.map +1 -0
  42. package/dist/app/controllers/disposable.d.ts +15 -0
  43. package/dist/app/controllers/disposable.js +38 -0
  44. package/dist/app/controllers/disposable.js.map +1 -0
  45. package/dist/app/controllers/job-controller.d.ts +22 -0
  46. package/dist/app/controllers/job-controller.js +35 -0
  47. package/dist/app/controllers/job-controller.js.map +1 -0
  48. package/dist/app/controllers/plan-controller.d.ts +31 -0
  49. package/dist/app/controllers/plan-controller.js +69 -0
  50. package/dist/app/controllers/plan-controller.js.map +1 -0
  51. package/dist/app/controllers/session-controller.d.ts +167 -0
  52. package/dist/app/controllers/session-controller.js +467 -0
  53. package/dist/app/controllers/session-controller.js.map +1 -0
  54. package/dist/app/controllers/turn-controller.d.ts +52 -0
  55. package/dist/app/controllers/turn-controller.js +118 -0
  56. package/dist/app/controllers/turn-controller.js.map +1 -0
  57. package/dist/app/events/app-event.d.ts +122 -0
  58. package/dist/app/events/app-event.js +25 -0
  59. package/dist/app/events/app-event.js.map +1 -0
  60. package/dist/app/events/event-buffer.d.ts +51 -0
  61. package/dist/app/events/event-buffer.js +109 -0
  62. package/dist/app/events/event-buffer.js.map +1 -0
  63. package/dist/app/events/sequencer.d.ts +32 -0
  64. package/dist/app/events/sequencer.js +55 -0
  65. package/dist/app/events/sequencer.js.map +1 -0
  66. package/dist/app/ports/agent-port.d.ts +29 -0
  67. package/dist/app/ports/agent-port.js +2 -0
  68. package/dist/app/ports/agent-port.js.map +1 -0
  69. package/dist/app/ports/clipboard-port.d.ts +9 -0
  70. package/dist/app/ports/clipboard-port.js +2 -0
  71. package/dist/app/ports/clipboard-port.js.map +1 -0
  72. package/dist/app/ports/confirm-port.d.ts +17 -0
  73. package/dist/app/ports/confirm-port.js +2 -0
  74. package/dist/app/ports/confirm-port.js.map +1 -0
  75. package/dist/app/ports/jobs-port.d.ts +18 -0
  76. package/dist/app/ports/jobs-port.js +2 -0
  77. package/dist/app/ports/jobs-port.js.map +1 -0
  78. package/dist/app/ports/persistence-port.d.ts +21 -0
  79. package/dist/app/ports/persistence-port.js +2 -0
  80. package/dist/app/ports/persistence-port.js.map +1 -0
  81. package/dist/app/ports/secret-port.d.ts +12 -0
  82. package/dist/app/ports/secret-port.js +2 -0
  83. package/dist/app/ports/secret-port.js.map +1 -0
  84. package/dist/app/ports/terminal-port.d.ts +18 -0
  85. package/dist/app/ports/terminal-port.js +2 -0
  86. package/dist/app/ports/terminal-port.js.map +1 -0
  87. package/dist/app/ports/updates-port.d.ts +12 -0
  88. package/dist/app/ports/updates-port.js +2 -0
  89. package/dist/app/ports/updates-port.js.map +1 -0
  90. package/dist/commands/doctor.js +19 -0
  91. package/dist/commands/doctor.js.map +1 -1
  92. package/dist/commands/update.js +1 -1
  93. package/dist/commands/update.js.map +1 -1
  94. package/dist/index.js +47 -12
  95. package/dist/index.js.map +1 -1
  96. package/dist/llm/router.js +4 -2
  97. package/dist/llm/router.js.map +1 -1
  98. package/dist/prompts/index.d.ts +1 -1
  99. package/dist/prompts/index.js +11 -8
  100. package/dist/prompts/index.js.map +1 -1
  101. package/dist/repl/slash-commands.js +1 -1
  102. package/dist/repl/slash-commands.js.map +1 -1
  103. package/dist/repl.js +35 -107
  104. package/dist/repl.js.map +1 -1
  105. package/dist/store/config.js +3 -1
  106. package/dist/store/config.js.map +1 -1
  107. package/dist/store/history.d.ts +26 -2
  108. package/dist/store/history.js +383 -72
  109. package/dist/store/history.js.map +1 -1
  110. package/dist/store/logs.js +3 -3
  111. package/dist/store/logs.js.map +1 -1
  112. package/dist/store/paths.d.ts +6 -0
  113. package/dist/store/paths.js +38 -0
  114. package/dist/store/paths.js.map +1 -0
  115. package/dist/store/plan.js +8 -5
  116. package/dist/store/plan.js.map +1 -1
  117. package/dist/tools/fs.d.ts +6 -0
  118. package/dist/tools/fs.js +56 -6
  119. package/dist/tools/fs.js.map +1 -1
  120. package/dist/tools/jobs.js +2 -2
  121. package/dist/tools/jobs.js.map +1 -1
  122. package/dist/tools/registry.js +189 -67
  123. package/dist/tools/registry.js.map +1 -1
  124. package/dist/tools/shell.js +2 -2
  125. package/dist/tools/shell.js.map +1 -1
  126. package/dist/tui/runtime.d.ts +19 -0
  127. package/dist/tui/runtime.js +92 -0
  128. package/dist/tui/runtime.js.map +1 -0
  129. package/dist/tui/state.js +22 -17
  130. package/dist/tui/state.js.map +1 -1
  131. package/dist/tui-v2/actions/action-id.d.ts +14 -0
  132. package/dist/tui-v2/actions/action-id.js +109 -0
  133. package/dist/tui-v2/actions/action-id.js.map +1 -0
  134. package/dist/tui-v2/actions/action-router.d.ts +18 -0
  135. package/dist/tui-v2/actions/action-router.js +62 -0
  136. package/dist/tui-v2/actions/action-router.js.map +1 -0
  137. package/dist/tui-v2/actions/chord-from-key.d.ts +26 -0
  138. package/dist/tui-v2/actions/chord-from-key.js +45 -0
  139. package/dist/tui-v2/actions/chord-from-key.js.map +1 -0
  140. package/dist/tui-v2/actions/keymap.d.ts +24 -0
  141. package/dist/tui-v2/actions/keymap.js +134 -0
  142. package/dist/tui-v2/actions/keymap.js.map +1 -0
  143. package/dist/tui-v2/app/App.d.ts +13 -0
  144. package/dist/tui-v2/app/App.js +332 -0
  145. package/dist/tui-v2/app/App.js.map +1 -0
  146. package/dist/tui-v2/app/command-handlers.d.ts +8 -0
  147. package/dist/tui-v2/app/command-handlers.js +66 -0
  148. package/dist/tui-v2/app/command-handlers.js.map +1 -0
  149. package/dist/tui-v2/app/commands/config-commands.d.ts +14 -0
  150. package/dist/tui-v2/app/commands/config-commands.js +161 -0
  151. package/dist/tui-v2/app/commands/config-commands.js.map +1 -0
  152. package/dist/tui-v2/app/commands/key-commands.d.ts +9 -0
  153. package/dist/tui-v2/app/commands/key-commands.js +263 -0
  154. package/dist/tui-v2/app/commands/key-commands.js.map +1 -0
  155. package/dist/tui-v2/app/commands/picker-commands.d.ts +24 -0
  156. package/dist/tui-v2/app/commands/picker-commands.js +423 -0
  157. package/dist/tui-v2/app/commands/picker-commands.js.map +1 -0
  158. package/dist/tui-v2/app/commands/session-commands.d.ts +19 -0
  159. package/dist/tui-v2/app/commands/session-commands.js +162 -0
  160. package/dist/tui-v2/app/commands/session-commands.js.map +1 -0
  161. package/dist/tui-v2/app/plan-lifecycle.d.ts +22 -0
  162. package/dist/tui-v2/app/plan-lifecycle.js +95 -0
  163. package/dist/tui-v2/app/plan-lifecycle.js.map +1 -0
  164. package/dist/tui-v2/app/providers.d.ts +17 -0
  165. package/dist/tui-v2/app/providers.js +32 -0
  166. package/dist/tui-v2/app/providers.js.map +1 -0
  167. package/dist/tui-v2/bootstrap/capabilities.d.ts +35 -0
  168. package/dist/tui-v2/bootstrap/capabilities.js +93 -0
  169. package/dist/tui-v2/bootstrap/capabilities.js.map +1 -0
  170. package/dist/tui-v2/bootstrap/composition-root.d.ts +85 -0
  171. package/dist/tui-v2/bootstrap/composition-root.js +131 -0
  172. package/dist/tui-v2/bootstrap/composition-root.js.map +1 -0
  173. package/dist/tui-v2/bootstrap/disable-native-selection.d.ts +11 -0
  174. package/dist/tui-v2/bootstrap/disable-native-selection.js +13 -0
  175. package/dist/tui-v2/bootstrap/disable-native-selection.js.map +1 -0
  176. package/dist/tui-v2/bootstrap/lifecycle.d.ts +62 -0
  177. package/dist/tui-v2/bootstrap/lifecycle.js +123 -0
  178. package/dist/tui-v2/bootstrap/lifecycle.js.map +1 -0
  179. package/dist/tui-v2/bootstrap/osc52-clipboard.d.ts +28 -0
  180. package/dist/tui-v2/bootstrap/osc52-clipboard.js +44 -0
  181. package/dist/tui-v2/bootstrap/osc52-clipboard.js.map +1 -0
  182. package/dist/tui-v2/bootstrap/overlay-ports.d.ts +12 -0
  183. package/dist/{tui/confirm.js → tui-v2/bootstrap/overlay-ports.js} +17 -25
  184. package/dist/tui-v2/bootstrap/overlay-ports.js.map +1 -0
  185. package/dist/tui-v2/bootstrap/pager-export.d.ts +24 -0
  186. package/dist/tui-v2/bootstrap/pager-export.js +87 -0
  187. package/dist/tui-v2/bootstrap/pager-export.js.map +1 -0
  188. package/dist/tui-v2/bootstrap/start-tui-v2.d.ts +15 -0
  189. package/dist/tui-v2/bootstrap/start-tui-v2.js +95 -0
  190. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -0
  191. package/dist/tui-v2/bootstrap/ui-selection.d.ts +30 -0
  192. package/dist/tui-v2/bootstrap/ui-selection.js +59 -0
  193. package/dist/tui-v2/bootstrap/ui-selection.js.map +1 -0
  194. package/dist/tui-v2/components/completion/completion-menu.d.ts +23 -0
  195. package/dist/tui-v2/components/completion/completion-menu.js +84 -0
  196. package/dist/tui-v2/components/completion/completion-menu.js.map +1 -0
  197. package/dist/tui-v2/components/jobs/jobs-panel.d.ts +16 -0
  198. package/dist/tui-v2/components/jobs/jobs-panel.js +92 -0
  199. package/dist/tui-v2/components/jobs/jobs-panel.js.map +1 -0
  200. package/dist/tui-v2/components/modal/confirm-modal.d.ts +20 -0
  201. package/dist/tui-v2/components/modal/confirm-modal.js +110 -0
  202. package/dist/tui-v2/components/modal/confirm-modal.js.map +1 -0
  203. package/dist/tui-v2/components/modal/prompt-actions-modal.d.ts +15 -0
  204. package/dist/tui-v2/components/modal/prompt-actions-modal.js +80 -0
  205. package/dist/tui-v2/components/modal/prompt-actions-modal.js.map +1 -0
  206. package/dist/tui-v2/components/modal/secret-modal.d.ts +18 -0
  207. package/dist/tui-v2/components/modal/secret-modal.js +50 -0
  208. package/dist/tui-v2/components/modal/secret-modal.js.map +1 -0
  209. package/dist/tui-v2/components/overlay/overlay-host.d.ts +26 -0
  210. package/dist/tui-v2/components/overlay/overlay-host.js +43 -0
  211. package/dist/tui-v2/components/overlay/overlay-host.js.map +1 -0
  212. package/dist/tui-v2/components/pager/pager.d.ts +20 -0
  213. package/dist/tui-v2/components/pager/pager.js +396 -0
  214. package/dist/tui-v2/components/pager/pager.js.map +1 -0
  215. package/dist/tui-v2/components/picker/picker.d.ts +17 -0
  216. package/dist/tui-v2/components/picker/picker.js +222 -0
  217. package/dist/tui-v2/components/picker/picker.js.map +1 -0
  218. package/dist/tui-v2/components/plan/plan-view.d.ts +20 -0
  219. package/dist/tui-v2/components/plan/plan-view.js +120 -0
  220. package/dist/tui-v2/components/plan/plan-view.js.map +1 -0
  221. package/dist/tui-v2/components/queue/queue-panel.d.ts +23 -0
  222. package/dist/tui-v2/components/queue/queue-panel.js +58 -0
  223. package/dist/tui-v2/components/queue/queue-panel.js.map +1 -0
  224. package/dist/tui-v2/components/status/status-line.d.ts +27 -0
  225. package/dist/tui-v2/components/status/status-line.js +167 -0
  226. package/dist/tui-v2/components/status/status-line.js.map +1 -0
  227. package/dist/tui-v2/components/toast/toast-host.d.ts +15 -0
  228. package/dist/tui-v2/components/toast/toast-host.js +48 -0
  229. package/dist/tui-v2/components/toast/toast-host.js.map +1 -0
  230. package/dist/tui-v2/components/transcript/assistant-message.d.ts +20 -0
  231. package/dist/tui-v2/components/transcript/assistant-message.js +41 -0
  232. package/dist/tui-v2/components/transcript/assistant-message.js.map +1 -0
  233. package/dist/tui-v2/components/transcript/compacted-row.d.ts +19 -0
  234. package/dist/tui-v2/components/transcript/compacted-row.js +69 -0
  235. package/dist/tui-v2/components/transcript/compacted-row.js.map +1 -0
  236. package/dist/tui-v2/components/transcript/intro-card.d.ts +19 -0
  237. package/dist/tui-v2/components/transcript/intro-card.js +50 -0
  238. package/dist/tui-v2/components/transcript/intro-card.js.map +1 -0
  239. package/dist/tui-v2/components/transcript/linkable-text.d.ts +21 -0
  240. package/dist/tui-v2/components/transcript/linkable-text.js +46 -0
  241. package/dist/tui-v2/components/transcript/linkable-text.js.map +1 -0
  242. package/dist/tui-v2/components/transcript/notice-row.d.ts +14 -0
  243. package/dist/tui-v2/components/transcript/notice-row.js +40 -0
  244. package/dist/tui-v2/components/transcript/notice-row.js.map +1 -0
  245. package/dist/tui-v2/components/transcript/search-bar.d.ts +19 -0
  246. package/dist/tui-v2/components/transcript/search-bar.js +7 -0
  247. package/dist/tui-v2/components/transcript/search-bar.js.map +1 -0
  248. package/dist/tui-v2/components/transcript/thinking-block.d.ts +22 -0
  249. package/dist/tui-v2/components/transcript/thinking-block.js +27 -0
  250. package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -0
  251. package/dist/tui-v2/components/transcript/tool-card.d.ts +26 -0
  252. package/dist/tui-v2/components/transcript/tool-card.js +205 -0
  253. package/dist/tui-v2/components/transcript/tool-card.js.map +1 -0
  254. package/dist/tui-v2/components/transcript/transcript-row.d.ts +25 -0
  255. package/dist/tui-v2/components/transcript/transcript-row.js +37 -0
  256. package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -0
  257. package/dist/tui-v2/components/transcript/transcript-scroll-port.d.ts +52 -0
  258. package/dist/tui-v2/components/transcript/transcript-scroll-port.js +86 -0
  259. package/dist/tui-v2/components/transcript/transcript-scroll-port.js.map +1 -0
  260. package/dist/tui-v2/components/transcript/transcript-view.d.ts +24 -0
  261. package/dist/tui-v2/components/transcript/transcript-view.js +403 -0
  262. package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -0
  263. package/dist/tui-v2/components/transcript/use-click-without-drag.d.ts +13 -0
  264. package/dist/tui-v2/components/transcript/use-click-without-drag.js +35 -0
  265. package/dist/tui-v2/components/transcript/use-click-without-drag.js.map +1 -0
  266. package/dist/tui-v2/components/transcript/use-native-selection-copy.d.ts +10 -0
  267. package/dist/tui-v2/components/transcript/use-native-selection-copy.js +37 -0
  268. package/dist/tui-v2/components/transcript/use-native-selection-copy.js.map +1 -0
  269. package/dist/tui-v2/components/transcript/use-transcript-selection.d.ts +23 -0
  270. package/dist/tui-v2/components/transcript/use-transcript-selection.js +136 -0
  271. package/dist/tui-v2/components/transcript/use-transcript-selection.js.map +1 -0
  272. package/dist/tui-v2/components/transcript/user-message.d.ts +10 -0
  273. package/dist/tui-v2/components/transcript/user-message.js +23 -0
  274. package/dist/tui-v2/components/transcript/user-message.js.map +1 -0
  275. package/dist/tui-v2/composer/arrow-intent.d.ts +23 -0
  276. package/dist/tui-v2/composer/arrow-intent.js +35 -0
  277. package/dist/tui-v2/composer/arrow-intent.js.map +1 -0
  278. package/dist/tui-v2/composer/completion.d.ts +37 -0
  279. package/dist/tui-v2/composer/completion.js +67 -0
  280. package/dist/tui-v2/composer/completion.js.map +1 -0
  281. package/dist/tui-v2/composer/composer-editor.d.ts +33 -0
  282. package/dist/tui-v2/composer/composer-editor.js +620 -0
  283. package/dist/tui-v2/composer/composer-editor.js.map +1 -0
  284. package/dist/tui-v2/composer/composer-height.d.ts +21 -0
  285. package/dist/tui-v2/composer/composer-height.js +29 -0
  286. package/dist/tui-v2/composer/composer-height.js.map +1 -0
  287. package/dist/tui-v2/composer/composer-meta.d.ts +9 -0
  288. package/dist/tui-v2/composer/composer-meta.js +38 -0
  289. package/dist/tui-v2/composer/composer-meta.js.map +1 -0
  290. package/dist/tui-v2/composer/history-nav.d.ts +15 -0
  291. package/dist/tui-v2/composer/history-nav.js +16 -0
  292. package/dist/tui-v2/composer/history-nav.js.map +1 -0
  293. package/dist/tui-v2/composer/newline-hint.d.ts +13 -0
  294. package/dist/tui-v2/composer/newline-hint.js +13 -0
  295. package/dist/tui-v2/composer/newline-hint.js.map +1 -0
  296. package/dist/tui-v2/composer/paste-placeholder.d.ts +35 -0
  297. package/dist/tui-v2/composer/paste-placeholder.js +55 -0
  298. package/dist/tui-v2/composer/paste-placeholder.js.map +1 -0
  299. package/dist/tui-v2/composer/prompt-history.d.ts +22 -0
  300. package/dist/tui-v2/composer/prompt-history.js +51 -0
  301. package/dist/tui-v2/composer/prompt-history.js.map +1 -0
  302. package/dist/tui-v2/composer/secret-buffer.d.ts +20 -0
  303. package/dist/tui-v2/composer/secret-buffer.js +42 -0
  304. package/dist/tui-v2/composer/secret-buffer.js.map +1 -0
  305. package/dist/tui-v2/composer/textarea-keybindings.d.ts +22 -0
  306. package/dist/tui-v2/composer/textarea-keybindings.js +27 -0
  307. package/dist/tui-v2/composer/textarea-keybindings.js.map +1 -0
  308. package/dist/tui-v2/controllers/focus-controller.d.ts +30 -0
  309. package/dist/tui-v2/controllers/focus-controller.js +80 -0
  310. package/dist/tui-v2/controllers/focus-controller.js.map +1 -0
  311. package/dist/tui-v2/controllers/overlay-controller.d.ts +99 -0
  312. package/dist/tui-v2/controllers/overlay-controller.js +195 -0
  313. package/dist/tui-v2/controllers/overlay-controller.js.map +1 -0
  314. package/dist/tui-v2/controllers/selection-controller.d.ts +76 -0
  315. package/dist/tui-v2/controllers/selection-controller.js +238 -0
  316. package/dist/tui-v2/controllers/selection-controller.js.map +1 -0
  317. package/dist/tui-v2/controllers/toast-controller.d.ts +35 -0
  318. package/dist/tui-v2/controllers/toast-controller.js +88 -0
  319. package/dist/tui-v2/controllers/toast-controller.js.map +1 -0
  320. package/dist/tui-v2/layout/compute-layout.d.ts +59 -0
  321. package/dist/tui-v2/layout/compute-layout.js +170 -0
  322. package/dist/tui-v2/layout/compute-layout.js.map +1 -0
  323. package/dist/tui-v2/rendering/ansi-to-styled.d.ts +17 -0
  324. package/dist/tui-v2/rendering/ansi-to-styled.js +217 -0
  325. package/dist/tui-v2/rendering/ansi-to-styled.js.map +1 -0
  326. package/dist/tui-v2/rendering/batch-sections.d.ts +57 -0
  327. package/dist/tui-v2/rendering/batch-sections.js +177 -0
  328. package/dist/tui-v2/rendering/batch-sections.js.map +1 -0
  329. package/dist/tui-v2/rendering/link-detector.d.ts +16 -0
  330. package/dist/tui-v2/rendering/link-detector.js +43 -0
  331. package/dist/tui-v2/rendering/link-detector.js.map +1 -0
  332. package/dist/tui-v2/rendering/open-tool-output.d.ts +28 -0
  333. package/dist/tui-v2/rendering/open-tool-output.js +138 -0
  334. package/dist/tui-v2/rendering/open-tool-output.js.map +1 -0
  335. package/dist/tui-v2/rendering/picker-filter.d.ts +22 -0
  336. package/dist/tui-v2/rendering/picker-filter.js +68 -0
  337. package/dist/tui-v2/rendering/picker-filter.js.map +1 -0
  338. package/dist/tui-v2/rendering/plan-view.d.ts +32 -0
  339. package/dist/tui-v2/rendering/plan-view.js +196 -0
  340. package/dist/tui-v2/rendering/plan-view.js.map +1 -0
  341. package/dist/tui-v2/rendering/render-markdown-lines.d.ts +29 -0
  342. package/dist/tui-v2/rendering/render-markdown-lines.js +46 -0
  343. package/dist/tui-v2/rendering/render-markdown-lines.js.map +1 -0
  344. package/dist/tui-v2/rendering/sanitize-display.d.ts +13 -0
  345. package/dist/tui-v2/rendering/sanitize-display.js +24 -0
  346. package/dist/tui-v2/rendering/sanitize-display.js.map +1 -0
  347. package/dist/tui-v2/rendering/strip-tool-surfaces.d.ts +10 -0
  348. package/dist/tui-v2/rendering/strip-tool-surfaces.js +32 -0
  349. package/dist/tui-v2/rendering/strip-tool-surfaces.js.map +1 -0
  350. package/dist/tui-v2/rendering/theme.d.ts +67 -0
  351. package/dist/tui-v2/rendering/theme.js +74 -0
  352. package/dist/tui-v2/rendering/theme.js.map +1 -0
  353. package/dist/tui-v2/rendering/tool-presenter.d.ts +39 -0
  354. package/dist/tui-v2/rendering/tool-presenter.js +209 -0
  355. package/dist/tui-v2/rendering/tool-presenter.js.map +1 -0
  356. package/dist/tui-v2/rendering/transcript-export.d.ts +11 -0
  357. package/dist/tui-v2/rendering/transcript-export.js +18 -0
  358. package/dist/tui-v2/rendering/transcript-export.js.map +1 -0
  359. package/dist/tui-v2/rendering/transcript-semantic.d.ts +17 -0
  360. package/dist/tui-v2/rendering/transcript-semantic.js +67 -0
  361. package/dist/tui-v2/rendering/transcript-semantic.js.map +1 -0
  362. package/dist/tui-v2/state/pager-search.d.ts +22 -0
  363. package/dist/tui-v2/state/pager-search.js +78 -0
  364. package/dist/tui-v2/state/pager-search.js.map +1 -0
  365. package/dist/tui-v2/state/semantic-document.d.ts +34 -0
  366. package/dist/tui-v2/state/semantic-document.js +201 -0
  367. package/dist/tui-v2/state/semantic-document.js.map +1 -0
  368. package/dist/tui-v2/state/transcript-compaction.d.ts +24 -0
  369. package/dist/tui-v2/state/transcript-compaction.js +79 -0
  370. package/dist/tui-v2/state/transcript-compaction.js.map +1 -0
  371. package/dist/tui-v2/state/transcript-hydrate.d.ts +27 -0
  372. package/dist/tui-v2/state/transcript-hydrate.js +276 -0
  373. package/dist/tui-v2/state/transcript-hydrate.js.map +1 -0
  374. package/dist/tui-v2/state/transcript-reducer.d.ts +10 -0
  375. package/dist/tui-v2/state/transcript-reducer.js +339 -0
  376. package/dist/tui-v2/state/transcript-reducer.js.map +1 -0
  377. package/dist/tui-v2/state/transcript-search.d.ts +17 -0
  378. package/dist/tui-v2/state/transcript-search.js +38 -0
  379. package/dist/tui-v2/state/transcript-search.js.map +1 -0
  380. package/dist/tui-v2/state/transcript-store.d.ts +32 -0
  381. package/dist/tui-v2/state/transcript-store.js +66 -0
  382. package/dist/tui-v2/state/transcript-store.js.map +1 -0
  383. package/dist/tui-v2/state/transcript-struct.d.ts +15 -0
  384. package/dist/tui-v2/state/transcript-struct.js +133 -0
  385. package/dist/tui-v2/state/transcript-struct.js.map +1 -0
  386. package/dist/tui-v2/state/transcript-types.d.ts +76 -0
  387. package/dist/tui-v2/state/transcript-types.js +65 -0
  388. package/dist/tui-v2/state/transcript-types.js.map +1 -0
  389. package/dist/tui-v2/state/use-overlay.d.ts +3 -0
  390. package/dist/tui-v2/state/use-overlay.js +6 -0
  391. package/dist/tui-v2/state/use-overlay.js.map +1 -0
  392. package/dist/tui-v2/state/use-plan.d.ts +4 -0
  393. package/dist/tui-v2/state/use-plan.js +6 -0
  394. package/dist/tui-v2/state/use-plan.js.map +1 -0
  395. package/dist/tui-v2/state/use-session-state.d.ts +2 -0
  396. package/dist/tui-v2/state/use-session-state.js +7 -0
  397. package/dist/tui-v2/state/use-session-state.js.map +1 -0
  398. package/dist/tui-v2/state/use-toast.d.ts +3 -0
  399. package/dist/tui-v2/state/use-toast.js +15 -0
  400. package/dist/tui-v2/state/use-toast.js.map +1 -0
  401. package/dist/tui-v2/state/use-transcript-store.d.ts +10 -0
  402. package/dist/tui-v2/state/use-transcript-store.js +12 -0
  403. package/dist/tui-v2/state/use-transcript-store.js.map +1 -0
  404. package/dist/ui/intro-card.js +3 -3
  405. package/dist/ui/intro-card.js.map +1 -1
  406. package/dist/ui/intro-header.d.ts +23 -0
  407. package/dist/ui/intro-header.js +232 -0
  408. package/dist/ui/intro-header.js.map +1 -0
  409. package/dist/ui/markdown.js +0 -1
  410. package/dist/ui/markdown.js.map +1 -1
  411. package/dist/ui/mentions.d.ts +9 -2
  412. package/dist/ui/mentions.js +102 -4
  413. package/dist/ui/mentions.js.map +1 -1
  414. package/dist/ui/output-pane.js +1 -1
  415. package/dist/ui/output-pane.js.map +1 -1
  416. package/dist/ui/plan-pane.d.ts +8 -0
  417. package/dist/ui/plan-pane.js +38 -0
  418. package/dist/ui/plan-pane.js.map +1 -1
  419. package/dist/ui/wordmark.d.ts +5 -0
  420. package/dist/ui/wordmark.js +6 -1
  421. package/dist/ui/wordmark.js.map +1 -1
  422. package/package.json +25 -12
  423. package/dist/tui/App.d.ts +0 -12
  424. package/dist/tui/App.js +0 -2174
  425. package/dist/tui/App.js.map +0 -1
  426. package/dist/tui/components/ConfirmModal.d.ts +0 -9
  427. package/dist/tui/components/ConfirmModal.js +0 -55
  428. package/dist/tui/components/ConfirmModal.js.map +0 -1
  429. package/dist/tui/components/JobsPanel.d.ts +0 -11
  430. package/dist/tui/components/JobsPanel.js +0 -55
  431. package/dist/tui/components/JobsPanel.js.map +0 -1
  432. package/dist/tui/components/Pager.d.ts +0 -14
  433. package/dist/tui/components/Pager.js +0 -56
  434. package/dist/tui/components/Pager.js.map +0 -1
  435. package/dist/tui/components/PickerPanel.d.ts +0 -15
  436. package/dist/tui/components/PickerPanel.js +0 -126
  437. package/dist/tui/components/PickerPanel.js.map +0 -1
  438. package/dist/tui/components/PlanSidebar.d.ts +0 -6
  439. package/dist/tui/components/PlanSidebar.js +0 -99
  440. package/dist/tui/components/PlanSidebar.js.map +0 -1
  441. package/dist/tui/components/SecretInputPanel.d.ts +0 -7
  442. package/dist/tui/components/SecretInputPanel.js +0 -38
  443. package/dist/tui/components/SecretInputPanel.js.map +0 -1
  444. package/dist/tui/confirm.d.ts +0 -16
  445. package/dist/tui/confirm.js.map +0 -1
  446. package/dist/tui/default.d.ts +0 -6
  447. package/dist/tui/default.js +0 -11
  448. package/dist/tui/default.js.map +0 -1
  449. package/dist/tui/hooks/useAgentRunner.d.ts +0 -73
  450. package/dist/tui/hooks/useAgentRunner.js +0 -277
  451. package/dist/tui/hooks/useAgentRunner.js.map +0 -1
  452. package/dist/tui/hooks/useJobs.d.ts +0 -7
  453. package/dist/tui/hooks/useJobs.js +0 -39
  454. package/dist/tui/hooks/useJobs.js.map +0 -1
  455. package/dist/tui/hooks/useSpinner.d.ts +0 -5
  456. package/dist/tui/hooks/useSpinner.js +0 -21
  457. package/dist/tui/hooks/useSpinner.js.map +0 -1
  458. package/dist/tui/hooks/useTerminalSize.d.ts +0 -9
  459. package/dist/tui/hooks/useTerminalSize.js +0 -26
  460. package/dist/tui/hooks/useTerminalSize.js.map +0 -1
  461. package/dist/tui/index.d.ts +0 -10
  462. package/dist/tui/index.js +0 -37
  463. package/dist/tui/index.js.map +0 -1
  464. package/dist/tui/key-intent.d.ts +0 -36
  465. package/dist/tui/key-intent.js +0 -54
  466. package/dist/tui/key-intent.js.map +0 -1
  467. package/dist/tui/mouse.d.ts +0 -8
  468. package/dist/tui/mouse.js +0 -34
  469. package/dist/tui/mouse.js.map +0 -1
  470. package/dist/tui/plan-sidebar-lines.d.ts +0 -2
  471. package/dist/tui/plan-sidebar-lines.js +0 -140
  472. package/dist/tui/plan-sidebar-lines.js.map +0 -1
  473. package/dist/tui/render-lines.d.ts +0 -22
  474. package/dist/tui/render-lines.js +0 -611
  475. package/dist/tui/render-lines.js.map +0 -1
@@ -0,0 +1,339 @@
1
+ /**
2
+ * Pure transcript reducer (V2-050). Folds one `AnyAppEvent` into normalized
3
+ * transcript state. Streaming deltas keep one open pending item per kind;
4
+ * `assistant-message` / `thinking-block` finalize it. A real `tool-call`
5
+ * discards any unfinalized assistant stream (raw tool-fence text) so display
6
+ * order is thinking → Response prose → tool cards.
7
+ */
8
+ import { isToolFenceOnlyText, stripToolCallSurfaces, } from "../rendering/strip-tool-surfaces.js";
9
+ import { appendItem, moveItemBefore, removeItem, updateItem } from "./transcript-struct.js";
10
+ function updateToolItem(state, toolCallId, update) {
11
+ for (let index = state.order.length - 1; index >= 0; index -= 1) {
12
+ const item = state.byId.get(state.order[index]);
13
+ if (item?.kind === "tool" && item.toolCallId === toolCallId) {
14
+ return updateItem(state, item.id, (existing) => update(existing));
15
+ }
16
+ }
17
+ return state;
18
+ }
19
+ /**
20
+ * Drop or clean streaming assistant text that is (or was) only tool-fence
21
+ * surfaces so raw ```tool JSON never sticks on screen once tool cards land.
22
+ */
23
+ function discardPendingToolFenceStream(state) {
24
+ if (!state.pendingAssistantId)
25
+ return state;
26
+ const pending = state.byId.get(state.pendingAssistantId);
27
+ if (!pending || pending.kind !== "assistant") {
28
+ return { ...state, pendingAssistantId: undefined };
29
+ }
30
+ const stripped = stripToolCallSurfaces(pending.text).trim();
31
+ if (!stripped) {
32
+ return {
33
+ ...removeItem(state, state.pendingAssistantId),
34
+ pendingAssistantId: undefined,
35
+ };
36
+ }
37
+ if (stripped === pending.text) {
38
+ return state;
39
+ }
40
+ return updateItem(state, state.pendingAssistantId, (item) => ({
41
+ ...item,
42
+ text: stripped,
43
+ }));
44
+ }
45
+ function withSequence(state, sequence) {
46
+ return { ...state, lastSequence: sequence };
47
+ }
48
+ function appendDelta(state, event, kind, text) {
49
+ const pendingKey = kind === "assistant" ? "pendingAssistantId" : "pendingThinkingId";
50
+ const pendingId = state[pendingKey];
51
+ if (pendingId) {
52
+ return updateItem(state, pendingId, (item) => {
53
+ if (kind === "assistant") {
54
+ // Strip tool fences from the cumulative stream so raw JSON never paints.
55
+ const nextText = stripToolCallSurfaces(item.text + text);
56
+ return { ...item, text: nextText };
57
+ }
58
+ return {
59
+ ...item,
60
+ content: item.content + text,
61
+ };
62
+ });
63
+ }
64
+ const id = `${kind}-${event.id}`;
65
+ const base = {
66
+ id,
67
+ sequence: event.sequence,
68
+ turnId: event.turnId,
69
+ timestamp: event.timestamp,
70
+ };
71
+ if (kind === "assistant") {
72
+ const nextText = stripToolCallSurfaces(text);
73
+ // Fence-only start of a stream: hold an empty pending row so later prose
74
+ // can still attach; tool-call events will discard empty fences.
75
+ const item = {
76
+ ...base,
77
+ kind: "assistant",
78
+ text: nextText,
79
+ streaming: true,
80
+ };
81
+ return { ...appendItem(state, item), [pendingKey]: id };
82
+ }
83
+ const item = {
84
+ ...base,
85
+ kind: "thinking",
86
+ content: text,
87
+ streaming: true,
88
+ };
89
+ // Streaming thinking stays in append order (after prior responses). Reordering
90
+ // is only for late one-shot thinking-block finalizes (see finalizeMessage).
91
+ return { ...appendItem(state, item), [pendingKey]: id };
92
+ }
93
+ function finalizeMessage(state, event, kind, text) {
94
+ const pendingKey = kind === "assistant" ? "pendingAssistantId" : "pendingThinkingId";
95
+ const pendingId = state[pendingKey];
96
+ let next = state;
97
+ /** True when this thinking row was already streaming in place (correct order). */
98
+ let hadStreamingThinking = false;
99
+ let thinkingId;
100
+ if (pendingId) {
101
+ next = updateItem(next, pendingId, (item) => kind === "assistant"
102
+ ? { ...item, text, streaming: false }
103
+ : { ...item, content: text, streaming: false });
104
+ if (kind === "thinking") {
105
+ thinkingId = pendingId;
106
+ hadStreamingThinking = true;
107
+ }
108
+ }
109
+ else {
110
+ const id = `${kind}-${event.id}`;
111
+ const base = {
112
+ id,
113
+ sequence: event.sequence,
114
+ turnId: event.turnId,
115
+ timestamp: event.timestamp,
116
+ };
117
+ const item = kind === "assistant"
118
+ ? { ...base, kind: "assistant", text, streaming: false }
119
+ : { ...base, kind: "thinking", content: text, streaming: false };
120
+ next = appendItem(next, item);
121
+ if (kind === "thinking")
122
+ thinkingId = id;
123
+ }
124
+ next = { ...next, [pendingKey]: undefined };
125
+ // Late one-shot thinking-block (e.g. stripThinking after assistant-message)
126
+ // is appended after ◆ Response — pull it above the latest response of this
127
+ // turn only. Do not move streaming thinking (multi-step: resp1 → think2 →
128
+ // resp2) or pile every think before the *first* response of the turn.
129
+ if (thinkingId && !hadStreamingThinking) {
130
+ next = ensureThinkingBeforeLatestAssistant(next, thinkingId, event.turnId);
131
+ }
132
+ return next;
133
+ }
134
+ function pushNotice(state, event, level, text) {
135
+ return appendItem(state, {
136
+ id: `notice-${event.id}`,
137
+ sequence: event.sequence,
138
+ turnId: event.turnId,
139
+ timestamp: event.timestamp,
140
+ kind: "notice",
141
+ level,
142
+ text,
143
+ });
144
+ }
145
+ function closePending(state) {
146
+ let next = state;
147
+ if (next.pendingAssistantId) {
148
+ next = updateItem(next, next.pendingAssistantId, (item) => ({
149
+ ...item,
150
+ streaming: false,
151
+ }));
152
+ next = { ...next, pendingAssistantId: undefined };
153
+ }
154
+ if (next.pendingThinkingId) {
155
+ next = updateItem(next, next.pendingThinkingId, (item) => ({
156
+ ...item,
157
+ streaming: false,
158
+ }));
159
+ next = { ...next, pendingThinkingId: undefined };
160
+ }
161
+ return next;
162
+ }
163
+ /**
164
+ * Keep classic display order for a *late* thinking-block: place it immediately
165
+ * before the **latest** ◆ Response of the same turn (not the first).
166
+ *
167
+ * Multi-step turns emit think → respond → think → respond. Moving every think
168
+ * before the *first* assistant stacked all ▸ thinking rows at the top of the
169
+ * turn. Only one-shot late blocks (no prior thinking-delta stream) call this.
170
+ */
171
+ function ensureThinkingBeforeLatestAssistant(state, thinkingId, turnId) {
172
+ let latestAssistantId;
173
+ for (const id of state.order) {
174
+ if (id === thinkingId)
175
+ continue;
176
+ const item = state.byId.get(id);
177
+ if (!item || item.kind !== "assistant")
178
+ continue;
179
+ if (turnId !== undefined && item.turnId !== turnId)
180
+ continue;
181
+ if (turnId === undefined && item.turnId !== undefined)
182
+ continue;
183
+ latestAssistantId = id;
184
+ }
185
+ if (!latestAssistantId)
186
+ return state;
187
+ const thinkingIdx = state.order.indexOf(thinkingId);
188
+ const assistantIdx = state.order.indexOf(latestAssistantId);
189
+ // Already above the latest response (or missing) — leave append order alone.
190
+ if (thinkingIdx < 0 || assistantIdx < 0 || thinkingIdx < assistantIdx)
191
+ return state;
192
+ return moveItemBefore(state, thinkingId, latestAssistantId);
193
+ }
194
+ /** Close open thinking so tool cards never sit under a still-streaming block. */
195
+ function closePendingThinking(state) {
196
+ if (!state.pendingThinkingId)
197
+ return state;
198
+ const next = updateItem(state, state.pendingThinkingId, (item) => ({
199
+ ...item,
200
+ streaming: false,
201
+ }));
202
+ return { ...next, pendingThinkingId: undefined };
203
+ }
204
+ export function applyAppEvent(state, event) {
205
+ if (event.sequence <= state.lastSequence)
206
+ return state;
207
+ const withSeq = withSequence(state, event.sequence);
208
+ switch (event.type) {
209
+ case "turn-started":
210
+ return appendItem(withSeq, {
211
+ id: `user-${event.id}`,
212
+ sequence: event.sequence,
213
+ turnId: event.turnId,
214
+ timestamp: event.timestamp,
215
+ kind: "user",
216
+ text: event.payload.prompt,
217
+ });
218
+ case "status":
219
+ return { ...withSeq, runningStatus: event.payload.text };
220
+ case "assistant-delta":
221
+ return {
222
+ ...appendDelta(withSeq, event, "assistant", event.payload.text),
223
+ runningStatus: "responding",
224
+ };
225
+ case "assistant-message": {
226
+ // Never finalize a Response card that is only tool-call fences.
227
+ const text = stripToolCallSurfaces(event.payload.text).trim();
228
+ if (!text || isToolFenceOnlyText(event.payload.text)) {
229
+ if (withSeq.pendingAssistantId) {
230
+ return {
231
+ ...removeItem(withSeq, withSeq.pendingAssistantId),
232
+ pendingAssistantId: undefined,
233
+ };
234
+ }
235
+ return withSeq;
236
+ }
237
+ return finalizeMessage(withSeq, event, "assistant", text);
238
+ }
239
+ case "thinking-delta":
240
+ return {
241
+ ...appendDelta(withSeq, event, "thinking", event.payload.text),
242
+ runningStatus: "thinking",
243
+ };
244
+ case "thinking-block":
245
+ return finalizeMessage(withSeq, event, "thinking", event.payload.content);
246
+ case "notice":
247
+ return pushNotice(withSeq, event, event.payload.level, event.payload.text);
248
+ case "tool-call": {
249
+ // Close open streams so cards never interleave under live thinking /
250
+ // raw fence text. Then append the tool row (thinking → response → tools).
251
+ // Status starts as "queued" until tool-started — so dns/http don't look
252
+ // "running" while stuck behind a long pentest.recon/nmap.
253
+ const cleaned = discardPendingToolFenceStream(closePendingThinking(withSeq));
254
+ const item = {
255
+ // Occurrence id stays unique even if the agent reuses tool-1 next turn.
256
+ id: `tool-${event.id}`,
257
+ sequence: event.sequence,
258
+ turnId: event.turnId,
259
+ timestamp: event.timestamp,
260
+ kind: "tool",
261
+ toolCallId: event.payload.toolCallId,
262
+ name: event.payload.name,
263
+ argsDisplay: event.payload.argsDisplay,
264
+ status: "queued",
265
+ exitCode: undefined,
266
+ summary: undefined,
267
+ artifactPath: undefined,
268
+ reason: undefined,
269
+ outputBytes: 0,
270
+ };
271
+ return {
272
+ ...appendItem(cleaned, item),
273
+ // Don't set activity to this name yet — card is only queued.
274
+ runningStatus: withSeq.runningStatus ?? "preparing tools",
275
+ };
276
+ }
277
+ case "tool-started": {
278
+ let startedName;
279
+ for (let i = withSeq.order.length - 1; i >= 0; i -= 1) {
280
+ const it = withSeq.byId.get(withSeq.order[i]);
281
+ if (it?.kind === "tool" && it.toolCallId === event.payload.toolCallId) {
282
+ startedName = it.name;
283
+ break;
284
+ }
285
+ }
286
+ return {
287
+ ...updateToolItem(withSeq, event.payload.toolCallId, (item) => ({
288
+ ...item,
289
+ status: item.status === "queued" ? "running" : item.status,
290
+ })),
291
+ runningStatus: startedName ?? withSeq.runningStatus,
292
+ };
293
+ }
294
+ case "tool-output":
295
+ return updateToolItem(withSeq, event.payload.ref.toolCallId, (item) => ({
296
+ ...item,
297
+ outputBytes: event.payload.ref.totalBytes,
298
+ }));
299
+ case "tool-result":
300
+ return updateToolItem(withSeq, event.payload.toolCallId, (item) => ({
301
+ ...item,
302
+ status: event.payload.ok ? "ok" : "failed",
303
+ exitCode: event.payload.exitCode,
304
+ summary: event.payload.summary,
305
+ artifactPath: event.payload.artifactPath,
306
+ }));
307
+ case "tool-blocked":
308
+ return updateToolItem(withSeq, event.payload.toolCallId, (item) => ({
309
+ ...item,
310
+ status: "blocked",
311
+ reason: event.payload.reason,
312
+ }));
313
+ case "compacted":
314
+ return appendItem(withSeq, {
315
+ id: `compacted-${event.id}`,
316
+ sequence: event.sequence,
317
+ turnId: event.turnId,
318
+ timestamp: event.timestamp,
319
+ kind: "compacted",
320
+ summary: event.payload.summary,
321
+ beforeTokens: event.payload.beforeTokens,
322
+ afterTokens: event.payload.afterTokens,
323
+ });
324
+ case "turn-ended":
325
+ return { ...closePending(withSeq), runningStatus: undefined };
326
+ case "turn-aborted":
327
+ return pushNotice({ ...closePending(withSeq), runningStatus: undefined }, event, "warn", "Turn aborted.");
328
+ case "turn-error":
329
+ return pushNotice({ ...closePending(withSeq), runningStatus: undefined }, event, "error", event.payload.message);
330
+ case "plan-updated":
331
+ case "confirm-requested":
332
+ return withSeq;
333
+ default: {
334
+ const unreachable = event;
335
+ throw new Error(`unhandled AppEvent: ${JSON.stringify(unreachable)}`);
336
+ }
337
+ }
338
+ }
339
+ //# sourceMappingURL=transcript-reducer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-reducer.js","sourceRoot":"","sources":["../../../src/tui-v2/state/transcript-reducer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Pure transcript search (V2-057). Scans normalized items for a case-
3
+ * insensitive substring match and exposes match navigation as plain index
4
+ * arithmetic, so the search bar component only needs to hold the query
5
+ * string and current match index.
6
+ */
7
+ import { type TranscriptState } from "./transcript-types.js";
8
+ export interface TranscriptMatch {
9
+ readonly itemId: string;
10
+ readonly start: number;
11
+ readonly end: number;
12
+ }
13
+ export declare function findMatches(state: TranscriptState, query: string): TranscriptMatch[];
14
+ /** Wraps forward; returns -1 when there are no matches to navigate. */
15
+ export declare function nextMatchIndex(matches: readonly TranscriptMatch[], current: number): number;
16
+ /** Wraps backward; returns -1 when there are no matches to navigate. */
17
+ export declare function prevMatchIndex(matches: readonly TranscriptMatch[], current: number): number;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Pure transcript search (V2-057). Scans normalized items for a case-
3
+ * insensitive substring match and exposes match navigation as plain index
4
+ * arithmetic, so the search bar component only needs to hold the query
5
+ * string and current match index.
6
+ */
7
+ import { itemSearchText, transcriptItems } from "./transcript-types.js";
8
+ export function findMatches(state, query) {
9
+ const needle = query.trim().toLowerCase();
10
+ if (!needle)
11
+ return [];
12
+ const matches = [];
13
+ for (const item of transcriptItems(state)) {
14
+ const haystack = itemSearchText(item).toLowerCase();
15
+ let from = 0;
16
+ for (;;) {
17
+ const at = haystack.indexOf(needle, from);
18
+ if (at === -1)
19
+ break;
20
+ matches.push({ itemId: item.id, start: at, end: at + needle.length });
21
+ from = at + needle.length;
22
+ }
23
+ }
24
+ return matches;
25
+ }
26
+ /** Wraps forward; returns -1 when there are no matches to navigate. */
27
+ export function nextMatchIndex(matches, current) {
28
+ if (matches.length === 0)
29
+ return -1;
30
+ return (current + 1 + matches.length) % matches.length;
31
+ }
32
+ /** Wraps backward; returns -1 when there are no matches to navigate. */
33
+ export function prevMatchIndex(matches, current) {
34
+ if (matches.length === 0)
35
+ return -1;
36
+ return (current - 1 + matches.length) % matches.length;
37
+ }
38
+ //# sourceMappingURL=transcript-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-search.js","sourceRoot":"","sources":["../../../src/tui-v2/state/transcript-search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAwB,MAAM,uBAAuB,CAAC;AAQ9F,MAAM,UAAU,WAAW,CAAC,KAAsB,EAAE,KAAa;IAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QACpD,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,SAAS,CAAC;YACR,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC1C,IAAI,EAAE,KAAK,CAAC,CAAC;gBAAE,MAAM;YACrB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACtE,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAAC,OAAmC,EAAE,OAAe;IACjF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;AACzD,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,cAAc,CAAC,OAAmC,EAAE,OAAe;IACjF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;AACzD,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Observable wrapper around the pure transcript reducer (V2-050).
3
+ *
4
+ * The only side effect this store performs is notifying subscribers; state
5
+ * transitions themselves stay in `applyAppEvent` so they remain replayable
6
+ * and unit-testable without a subscriber. Components read state through
7
+ * `getState`/`subscribe` (a `useSyncExternalStore` source), never by reaching
8
+ * into reducer internals.
9
+ */
10
+ import type { AnyAppEvent } from "../../app/events/app-event.js";
11
+ import { type TranscriptState } from "./transcript-types.js";
12
+ export type TranscriptListener = () => void;
13
+ export declare class TranscriptStore {
14
+ private state;
15
+ private readonly listeners;
16
+ getState(): TranscriptState;
17
+ dispatch(event: AnyAppEvent): void;
18
+ /** CHAT-006: Ctrl+T toggles every thinking block's default visibility. */
19
+ toggleThinkingGlobal(): void;
20
+ /** CHAT-005/007: Ctrl+O toggles tool OUTPUT + compacted memory cards. */
21
+ toggleOutputGlobal(): void;
22
+ /** Expand/collapse one item, overriding whichever global toggle applies. */
23
+ toggleItemOverride(id: string, fallback: boolean): void;
24
+ subscribe(listener: TranscriptListener): () => void;
25
+ reset(): void;
26
+ /**
27
+ * Replace the entire visual transcript (used by /history resume).
28
+ * Preserves global expand toggles so user prefs survive a session switch.
29
+ */
30
+ hydrate(next: TranscriptState): void;
31
+ private setState;
32
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Observable wrapper around the pure transcript reducer (V2-050).
3
+ *
4
+ * The only side effect this store performs is notifying subscribers; state
5
+ * transitions themselves stay in `applyAppEvent` so they remain replayable
6
+ * and unit-testable without a subscriber. Components read state through
7
+ * `getState`/`subscribe` (a `useSyncExternalStore` source), never by reaching
8
+ * into reducer internals.
9
+ */
10
+ import { applyAppEvent } from "./transcript-reducer.js";
11
+ import { EMPTY_TRANSCRIPT_STATE } from "./transcript-types.js";
12
+ export class TranscriptStore {
13
+ state = EMPTY_TRANSCRIPT_STATE;
14
+ listeners = new Set();
15
+ getState() {
16
+ return this.state;
17
+ }
18
+ dispatch(event) {
19
+ this.setState(applyAppEvent(this.state, event));
20
+ }
21
+ /** CHAT-006: Ctrl+T toggles every thinking block's default visibility. */
22
+ toggleThinkingGlobal() {
23
+ this.setState({ ...this.state, expandThinkingGlobal: !this.state.expandThinkingGlobal });
24
+ }
25
+ /** CHAT-005/007: Ctrl+O toggles tool OUTPUT + compacted memory cards. */
26
+ toggleOutputGlobal() {
27
+ this.setState({ ...this.state, expandOutputGlobal: !this.state.expandOutputGlobal });
28
+ }
29
+ /** Expand/collapse one item, overriding whichever global toggle applies. */
30
+ toggleItemOverride(id, fallback) {
31
+ const overrides = new Map(this.state.itemOverrides);
32
+ const current = overrides.get(id) ?? fallback;
33
+ overrides.set(id, !current);
34
+ this.setState({ ...this.state, itemOverrides: overrides });
35
+ }
36
+ subscribe(listener) {
37
+ this.listeners.add(listener);
38
+ return () => this.listeners.delete(listener);
39
+ }
40
+ reset() {
41
+ this.setState(EMPTY_TRANSCRIPT_STATE);
42
+ }
43
+ /**
44
+ * Replace the entire visual transcript (used by /history resume).
45
+ * Preserves global expand toggles so user prefs survive a session switch.
46
+ */
47
+ hydrate(next) {
48
+ this.setState({
49
+ ...next,
50
+ expandThinkingGlobal: this.state.expandThinkingGlobal,
51
+ expandOutputGlobal: this.state.expandOutputGlobal,
52
+ itemOverrides: new Map(),
53
+ pendingAssistantId: undefined,
54
+ pendingThinkingId: undefined,
55
+ runningStatus: undefined,
56
+ });
57
+ }
58
+ setState(next) {
59
+ if (next === this.state)
60
+ return;
61
+ this.state = next;
62
+ for (const listener of this.listeners)
63
+ listener();
64
+ }
65
+ }
66
+ //# sourceMappingURL=transcript-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-store.js","sourceRoot":"","sources":["../../../src/tui-v2/state/transcript-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAwB,MAAM,uBAAuB,CAAC;AAIrF,MAAM,OAAO,eAAe;IAClB,KAAK,GAAoB,sBAAsB,CAAC;IACvC,SAAS,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE3D,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,QAAQ,CAAC,KAAkB;QACzB,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,0EAA0E;IAC1E,oBAAoB;QAClB,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,oBAAoB,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,yEAAyE;IACzE,kBAAkB;QAChB,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,4EAA4E;IAC5E,kBAAkB,CAAC,EAAU,EAAE,QAAiB;QAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC;QAC9C,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,SAAS,CAAC,QAA4B;QACpC,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;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,IAAqB;QAC3B,IAAI,CAAC,QAAQ,CAAC;YACZ,GAAG,IAAI;YACP,oBAAoB,EAAE,IAAI,CAAC,KAAK,CAAC,oBAAoB;YACrD,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAkB;YACjD,aAAa,EAAE,IAAI,GAAG,EAAE;YACxB,kBAAkB,EAAE,SAAS;YAC7B,iBAAiB,EAAE,SAAS;YAC5B,aAAa,EAAE,SAAS;SACzB,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,IAAqB;QACpC,IAAI,IAAI,KAAK,IAAI,CAAC,KAAK;YAAE,OAAO;QAChC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;YAAE,QAAQ,EAAE,CAAC;IACpD,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Structural helpers for normalized transcript state: append-only order
3
+ * proxies and byId maps (shared by the pure transcript reducer).
4
+ */
5
+ import type { TranscriptItem, TranscriptState } from "./transcript-types.js";
6
+ export declare function appendItem(state: TranscriptState, item: TranscriptItem): TranscriptState;
7
+ export declare function updateItem(state: TranscriptState, id: string, update: (item: TranscriptItem) => TranscriptItem): TranscriptState;
8
+ export declare function removeItem(state: TranscriptState, id: string): TranscriptState;
9
+ /**
10
+ * Move `itemId` so it sits immediately before `beforeId` in display order.
11
+ * No-op when either id is missing or the item already precedes `beforeId`.
12
+ * Used to keep thinking → response → tools order when reasoning is finalized
13
+ * after assistant prose already opened a row.
14
+ */
15
+ export declare function moveItemBefore(state: TranscriptState, itemId: string, beforeId: string): TranscriptState;