@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,281 @@
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 { appendItem, moveItemBefore, removeItem, updateItem } from "./transcript-struct.js";
9
+ function updateToolItem(state, toolCallId, update) {
10
+ for (let index = state.order.length - 1; index >= 0; index -= 1) {
11
+ const item = state.byId.get(state.order[index]);
12
+ if (item?.kind === "tool" && item.toolCallId === toolCallId) {
13
+ return updateItem(state, item.id, (existing) => update(existing));
14
+ }
15
+ }
16
+ return state;
17
+ }
18
+ /** Drop streaming assistant that was only tool-fence text (Ink TUI parity). */
19
+ function discardPendingToolFenceStream(state) {
20
+ if (!state.pendingAssistantId)
21
+ return state;
22
+ const pending = state.byId.get(state.pendingAssistantId);
23
+ if (!pending || pending.kind !== "assistant" || !pending.streaming) {
24
+ return { ...state, pendingAssistantId: undefined };
25
+ }
26
+ return {
27
+ ...removeItem(state, state.pendingAssistantId),
28
+ pendingAssistantId: undefined,
29
+ };
30
+ }
31
+ function withSequence(state, sequence) {
32
+ return { ...state, lastSequence: sequence };
33
+ }
34
+ function appendDelta(state, event, kind, text) {
35
+ const pendingKey = kind === "assistant" ? "pendingAssistantId" : "pendingThinkingId";
36
+ const pendingId = state[pendingKey];
37
+ if (pendingId) {
38
+ return updateItem(state, pendingId, (item) => kind === "assistant"
39
+ ? { ...item, text: item.text + text }
40
+ : { ...item, content: item.content + text });
41
+ }
42
+ const id = `${kind}-${event.id}`;
43
+ const base = {
44
+ id,
45
+ sequence: event.sequence,
46
+ turnId: event.turnId,
47
+ timestamp: event.timestamp,
48
+ };
49
+ const item = kind === "assistant"
50
+ ? { ...base, kind: "assistant", text, streaming: true }
51
+ : { ...base, kind: "thinking", content: text, streaming: true };
52
+ // Streaming thinking stays in append order (after prior responses). Reordering
53
+ // is only for late one-shot thinking-block finalizes (see finalizeMessage).
54
+ return { ...appendItem(state, item), [pendingKey]: id };
55
+ }
56
+ function finalizeMessage(state, event, kind, text) {
57
+ const pendingKey = kind === "assistant" ? "pendingAssistantId" : "pendingThinkingId";
58
+ const pendingId = state[pendingKey];
59
+ let next = state;
60
+ /** True when this thinking row was already streaming in place (correct order). */
61
+ let hadStreamingThinking = false;
62
+ let thinkingId;
63
+ if (pendingId) {
64
+ next = updateItem(next, pendingId, (item) => kind === "assistant"
65
+ ? { ...item, text, streaming: false }
66
+ : { ...item, content: text, streaming: false });
67
+ if (kind === "thinking") {
68
+ thinkingId = pendingId;
69
+ hadStreamingThinking = true;
70
+ }
71
+ }
72
+ else {
73
+ const id = `${kind}-${event.id}`;
74
+ const base = {
75
+ id,
76
+ sequence: event.sequence,
77
+ turnId: event.turnId,
78
+ timestamp: event.timestamp,
79
+ };
80
+ const item = kind === "assistant"
81
+ ? { ...base, kind: "assistant", text, streaming: false }
82
+ : { ...base, kind: "thinking", content: text, streaming: false };
83
+ next = appendItem(next, item);
84
+ if (kind === "thinking")
85
+ thinkingId = id;
86
+ }
87
+ next = { ...next, [pendingKey]: undefined };
88
+ // Late one-shot thinking-block (e.g. stripThinking after assistant-message)
89
+ // is appended after ◆ Response — pull it above the latest response of this
90
+ // turn only. Do not move streaming thinking (multi-step: resp1 → think2 →
91
+ // resp2) or pile every think before the *first* response of the turn.
92
+ if (thinkingId && !hadStreamingThinking) {
93
+ next = ensureThinkingBeforeLatestAssistant(next, thinkingId, event.turnId);
94
+ }
95
+ return next;
96
+ }
97
+ function pushNotice(state, event, level, text) {
98
+ return appendItem(state, {
99
+ id: `notice-${event.id}`,
100
+ sequence: event.sequence,
101
+ turnId: event.turnId,
102
+ timestamp: event.timestamp,
103
+ kind: "notice",
104
+ level,
105
+ text,
106
+ });
107
+ }
108
+ function closePending(state) {
109
+ let next = state;
110
+ if (next.pendingAssistantId) {
111
+ next = updateItem(next, next.pendingAssistantId, (item) => ({
112
+ ...item,
113
+ streaming: false,
114
+ }));
115
+ next = { ...next, pendingAssistantId: undefined };
116
+ }
117
+ if (next.pendingThinkingId) {
118
+ next = updateItem(next, next.pendingThinkingId, (item) => ({
119
+ ...item,
120
+ streaming: false,
121
+ }));
122
+ next = { ...next, pendingThinkingId: undefined };
123
+ }
124
+ return next;
125
+ }
126
+ /**
127
+ * Keep classic display order for a *late* thinking-block: place it immediately
128
+ * before the **latest** ◆ Response of the same turn (not the first).
129
+ *
130
+ * Multi-step turns emit think → respond → think → respond. Moving every think
131
+ * before the *first* assistant stacked all ▸ thinking rows at the top of the
132
+ * turn. Only one-shot late blocks (no prior thinking-delta stream) call this.
133
+ */
134
+ function ensureThinkingBeforeLatestAssistant(state, thinkingId, turnId) {
135
+ let latestAssistantId;
136
+ for (const id of state.order) {
137
+ if (id === thinkingId)
138
+ continue;
139
+ const item = state.byId.get(id);
140
+ if (!item || item.kind !== "assistant")
141
+ continue;
142
+ if (turnId !== undefined && item.turnId !== turnId)
143
+ continue;
144
+ if (turnId === undefined && item.turnId !== undefined)
145
+ continue;
146
+ latestAssistantId = id;
147
+ }
148
+ if (!latestAssistantId)
149
+ return state;
150
+ const thinkingIdx = state.order.indexOf(thinkingId);
151
+ const assistantIdx = state.order.indexOf(latestAssistantId);
152
+ // Already above the latest response (or missing) — leave append order alone.
153
+ if (thinkingIdx < 0 || assistantIdx < 0 || thinkingIdx < assistantIdx)
154
+ return state;
155
+ return moveItemBefore(state, thinkingId, latestAssistantId);
156
+ }
157
+ /** Close open thinking so tool cards never sit under a still-streaming block. */
158
+ function closePendingThinking(state) {
159
+ if (!state.pendingThinkingId)
160
+ return state;
161
+ const next = updateItem(state, state.pendingThinkingId, (item) => ({
162
+ ...item,
163
+ streaming: false,
164
+ }));
165
+ return { ...next, pendingThinkingId: undefined };
166
+ }
167
+ export function applyAppEvent(state, event) {
168
+ if (event.sequence <= state.lastSequence)
169
+ return state;
170
+ const withSeq = withSequence(state, event.sequence);
171
+ switch (event.type) {
172
+ case "turn-started":
173
+ return appendItem(withSeq, {
174
+ id: `user-${event.id}`,
175
+ sequence: event.sequence,
176
+ turnId: event.turnId,
177
+ timestamp: event.timestamp,
178
+ kind: "user",
179
+ text: event.payload.prompt,
180
+ });
181
+ case "status":
182
+ return { ...withSeq, runningStatus: event.payload.text };
183
+ case "assistant-delta":
184
+ return {
185
+ ...appendDelta(withSeq, event, "assistant", event.payload.text),
186
+ runningStatus: "responding",
187
+ };
188
+ case "assistant-message": {
189
+ const text = event.payload.text.trim();
190
+ if (!text) {
191
+ if (withSeq.pendingAssistantId) {
192
+ return {
193
+ ...removeItem(withSeq, withSeq.pendingAssistantId),
194
+ pendingAssistantId: undefined,
195
+ };
196
+ }
197
+ return withSeq;
198
+ }
199
+ return finalizeMessage(withSeq, event, "assistant", text);
200
+ }
201
+ case "thinking-delta":
202
+ return {
203
+ ...appendDelta(withSeq, event, "thinking", event.payload.text),
204
+ runningStatus: "thinking",
205
+ };
206
+ case "thinking-block":
207
+ return finalizeMessage(withSeq, event, "thinking", event.payload.content);
208
+ case "notice":
209
+ return pushNotice(withSeq, event, event.payload.level, event.payload.text);
210
+ case "tool-call": {
211
+ // Close open streams so cards never interleave under live thinking /
212
+ // raw fence text. Then append the tool row (thinking → response → tools).
213
+ const cleaned = discardPendingToolFenceStream(closePendingThinking(withSeq));
214
+ const item = {
215
+ // Occurrence id stays unique even if the agent reuses tool-1 next turn.
216
+ id: `tool-${event.id}`,
217
+ sequence: event.sequence,
218
+ turnId: event.turnId,
219
+ timestamp: event.timestamp,
220
+ kind: "tool",
221
+ toolCallId: event.payload.toolCallId,
222
+ name: event.payload.name,
223
+ argsDisplay: event.payload.argsDisplay,
224
+ status: "running",
225
+ exitCode: undefined,
226
+ summary: undefined,
227
+ artifactPath: undefined,
228
+ reason: undefined,
229
+ outputBytes: 0,
230
+ };
231
+ return {
232
+ ...appendItem(cleaned, item),
233
+ runningStatus: event.payload.name,
234
+ };
235
+ }
236
+ case "tool-output":
237
+ return updateToolItem(withSeq, event.payload.ref.toolCallId, (item) => ({
238
+ ...item,
239
+ outputBytes: event.payload.ref.totalBytes,
240
+ }));
241
+ case "tool-result":
242
+ return updateToolItem(withSeq, event.payload.toolCallId, (item) => ({
243
+ ...item,
244
+ status: event.payload.ok ? "ok" : "failed",
245
+ exitCode: event.payload.exitCode,
246
+ summary: event.payload.summary,
247
+ artifactPath: event.payload.artifactPath,
248
+ }));
249
+ case "tool-blocked":
250
+ return updateToolItem(withSeq, event.payload.toolCallId, (item) => ({
251
+ ...item,
252
+ status: "blocked",
253
+ reason: event.payload.reason,
254
+ }));
255
+ case "compacted":
256
+ return appendItem(withSeq, {
257
+ id: `compacted-${event.id}`,
258
+ sequence: event.sequence,
259
+ turnId: event.turnId,
260
+ timestamp: event.timestamp,
261
+ kind: "compacted",
262
+ summary: event.payload.summary,
263
+ beforeTokens: event.payload.beforeTokens,
264
+ afterTokens: event.payload.afterTokens,
265
+ });
266
+ case "turn-ended":
267
+ return { ...closePending(withSeq), runningStatus: undefined };
268
+ case "turn-aborted":
269
+ return pushNotice({ ...closePending(withSeq), runningStatus: undefined }, event, "warn", "Turn aborted.");
270
+ case "turn-error":
271
+ return pushNotice({ ...closePending(withSeq), runningStatus: undefined }, event, "error", event.payload.message);
272
+ case "plan-updated":
273
+ case "confirm-requested":
274
+ return withSeq;
275
+ default: {
276
+ const unreachable = event;
277
+ throw new Error(`unhandled AppEvent: ${JSON.stringify(unreachable)}`);
278
+ }
279
+ }
280
+ }
281
+ //# 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;
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Structural helpers for normalized transcript state: append-only order
3
+ * proxies and byId maps (shared by the pure transcript reducer).
4
+ */
5
+ const orderNodes = new WeakMap();
6
+ function resolveOrder(node) {
7
+ if (node.cache)
8
+ return node.cache;
9
+ const nodes = [];
10
+ let current = node;
11
+ while (current && !current.cache) {
12
+ nodes.push(current);
13
+ current = current.parent;
14
+ }
15
+ const values = current?.cache ? [...current.cache] : [...(nodes.at(-1)?.base ?? [])];
16
+ for (let index = nodes.length - 1; index >= 0; index -= 1)
17
+ values.push(nodes[index].item);
18
+ node.cache = values;
19
+ return values;
20
+ }
21
+ function appendOrder(order, item) {
22
+ const parent = orderNodes.get(order);
23
+ const node = { parent, base: parent ? undefined : order, item, cache: undefined };
24
+ const proxy = new Proxy([], {
25
+ get(_target, property) {
26
+ const values = resolveOrder(node);
27
+ const value = Reflect.get(values, property, values);
28
+ return typeof value === "function" ? value.bind(values) : value;
29
+ },
30
+ });
31
+ orderNodes.set(proxy, node);
32
+ return proxy;
33
+ }
34
+ class AppendedMap {
35
+ node;
36
+ [Symbol.toStringTag] = "Map";
37
+ constructor(node) {
38
+ this.node = node;
39
+ }
40
+ get size() {
41
+ return this.resolve().size;
42
+ }
43
+ get(key) {
44
+ return this.resolve().get(key);
45
+ }
46
+ has(key) {
47
+ return this.resolve().has(key);
48
+ }
49
+ entries() {
50
+ return this.resolve().entries();
51
+ }
52
+ keys() {
53
+ return this.resolve().keys();
54
+ }
55
+ values() {
56
+ return this.resolve().values();
57
+ }
58
+ forEach(callbackfn, thisArg) {
59
+ this.resolve().forEach((value, key) => callbackfn.call(thisArg, value, key, this));
60
+ }
61
+ [Symbol.iterator]() {
62
+ return this.entries();
63
+ }
64
+ resolve() {
65
+ if (this.node.cache)
66
+ return this.node.cache;
67
+ const nodes = [];
68
+ let current = this.node;
69
+ while (current && !current.cache) {
70
+ nodes.push(current);
71
+ current = current.parent;
72
+ }
73
+ const values = new Map(current?.cache ?? nodes.at(-1)?.base);
74
+ for (let index = nodes.length - 1; index >= 0; index -= 1) {
75
+ const node = nodes[index];
76
+ values.set(node.key, node.value);
77
+ }
78
+ this.node.cache = values;
79
+ return values;
80
+ }
81
+ }
82
+ function appendById(byId, key, value) {
83
+ const parent = byId instanceof AppendedMap ? byId.node : undefined;
84
+ return new AppendedMap({ parent, base: parent ? undefined : byId, key, value, cache: undefined });
85
+ }
86
+ export function appendItem(state, item) {
87
+ return {
88
+ ...state,
89
+ order: appendOrder(state.order, item.id),
90
+ byId: appendById(state.byId, item.id, item),
91
+ };
92
+ }
93
+ export function updateItem(state, id, update) {
94
+ const existing = state.byId.get(id);
95
+ if (!existing)
96
+ return state;
97
+ const byId = new Map(state.byId);
98
+ byId.set(id, update(existing));
99
+ return { ...state, byId };
100
+ }
101
+ export function removeItem(state, id) {
102
+ if (!state.byId.has(id))
103
+ return state;
104
+ const byId = new Map(state.byId);
105
+ byId.delete(id);
106
+ return {
107
+ ...state,
108
+ byId,
109
+ order: state.order.filter((entry) => entry !== id),
110
+ };
111
+ }
112
+ /**
113
+ * Move `itemId` so it sits immediately before `beforeId` in display order.
114
+ * No-op when either id is missing or the item already precedes `beforeId`.
115
+ * Used to keep thinking → response → tools order when reasoning is finalized
116
+ * after assistant prose already opened a row.
117
+ */
118
+ export function moveItemBefore(state, itemId, beforeId) {
119
+ if (itemId === beforeId)
120
+ return state;
121
+ const from = state.order.indexOf(itemId);
122
+ const to = state.order.indexOf(beforeId);
123
+ if (from < 0 || to < 0 || from < to)
124
+ return state;
125
+ const order = state.order.slice();
126
+ order.splice(from, 1);
127
+ const insertAt = order.indexOf(beforeId);
128
+ if (insertAt < 0)
129
+ return state;
130
+ order.splice(insertAt, 0, itemId);
131
+ return { ...state, order };
132
+ }
133
+ //# sourceMappingURL=transcript-struct.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-struct.js","sourceRoot":"","sources":["../../../src/tui-v2/state/transcript-struct.ts"],"names":[],"mappings":"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"}