@pentoshi/clai 2.0.62 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. package/README.md +262 -368
  2. package/dist/agent/context-manager.d.ts +5 -0
  3. package/dist/agent/context-manager.js +14 -2
  4. package/dist/agent/context-manager.js.map +1 -1
  5. package/dist/agent/events.d.ts +4 -1
  6. package/dist/agent/runner.js +150 -83
  7. package/dist/agent/runner.js.map +1 -1
  8. package/dist/agent/tool-call-parser.d.ts +15 -0
  9. package/dist/agent/tool-call-parser.js +171 -2
  10. package/dist/agent/tool-call-parser.js.map +1 -1
  11. package/dist/app/adapters/agent-event-adapter.d.ts +29 -0
  12. package/dist/app/adapters/agent-event-adapter.js +143 -0
  13. package/dist/app/adapters/agent-event-adapter.js.map +1 -0
  14. package/dist/app/adapters/current-agent-adapter.d.ts +7 -0
  15. package/dist/app/adapters/current-agent-adapter.js +27 -0
  16. package/dist/app/adapters/current-agent-adapter.js.map +1 -0
  17. package/dist/app/adapters/current-jobs-adapter.d.ts +4 -0
  18. package/dist/app/adapters/current-jobs-adapter.js +13 -0
  19. package/dist/app/adapters/current-jobs-adapter.js.map +1 -0
  20. package/dist/app/adapters/current-store-adapter.d.ts +3 -0
  21. package/dist/app/adapters/current-store-adapter.js +22 -0
  22. package/dist/app/adapters/current-store-adapter.js.map +1 -0
  23. package/dist/app/adapters/current-terminal-adapter.d.ts +9 -0
  24. package/dist/app/adapters/current-terminal-adapter.js +31 -0
  25. package/dist/app/adapters/current-terminal-adapter.js.map +1 -0
  26. package/dist/app/adapters/current-updates-adapter.d.ts +7 -0
  27. package/dist/app/adapters/current-updates-adapter.js +31 -0
  28. package/dist/app/adapters/current-updates-adapter.js.map +1 -0
  29. package/dist/app/adapters/in-memory-clipboard-adapter.d.ts +10 -0
  30. package/dist/app/adapters/in-memory-clipboard-adapter.js +20 -0
  31. package/dist/app/adapters/in-memory-clipboard-adapter.js.map +1 -0
  32. package/dist/app/commands/command.d.ts +24 -0
  33. package/dist/app/commands/command.js +4 -0
  34. package/dist/app/commands/command.js.map +1 -0
  35. package/dist/app/commands/registry.d.ts +45 -0
  36. package/dist/app/commands/registry.js +164 -0
  37. package/dist/app/commands/registry.js.map +1 -0
  38. package/dist/app/controllers/disposable.d.ts +15 -0
  39. package/dist/app/controllers/disposable.js +38 -0
  40. package/dist/app/controllers/disposable.js.map +1 -0
  41. package/dist/app/controllers/job-controller.d.ts +22 -0
  42. package/dist/app/controllers/job-controller.js +35 -0
  43. package/dist/app/controllers/job-controller.js.map +1 -0
  44. package/dist/app/controllers/plan-controller.d.ts +31 -0
  45. package/dist/app/controllers/plan-controller.js +69 -0
  46. package/dist/app/controllers/plan-controller.js.map +1 -0
  47. package/dist/app/controllers/session-controller.d.ts +167 -0
  48. package/dist/app/controllers/session-controller.js +467 -0
  49. package/dist/app/controllers/session-controller.js.map +1 -0
  50. package/dist/app/controllers/turn-controller.d.ts +52 -0
  51. package/dist/app/controllers/turn-controller.js +118 -0
  52. package/dist/app/controllers/turn-controller.js.map +1 -0
  53. package/dist/app/events/app-event.d.ts +118 -0
  54. package/dist/app/events/app-event.js +25 -0
  55. package/dist/app/events/app-event.js.map +1 -0
  56. package/dist/app/events/event-buffer.d.ts +51 -0
  57. package/dist/app/events/event-buffer.js +109 -0
  58. package/dist/app/events/event-buffer.js.map +1 -0
  59. package/dist/app/events/sequencer.d.ts +32 -0
  60. package/dist/app/events/sequencer.js +55 -0
  61. package/dist/app/events/sequencer.js.map +1 -0
  62. package/dist/app/ports/agent-port.d.ts +29 -0
  63. package/dist/app/ports/agent-port.js +2 -0
  64. package/dist/app/ports/agent-port.js.map +1 -0
  65. package/dist/app/ports/clipboard-port.d.ts +9 -0
  66. package/dist/app/ports/clipboard-port.js +2 -0
  67. package/dist/app/ports/clipboard-port.js.map +1 -0
  68. package/dist/app/ports/confirm-port.d.ts +17 -0
  69. package/dist/app/ports/confirm-port.js +2 -0
  70. package/dist/app/ports/confirm-port.js.map +1 -0
  71. package/dist/app/ports/jobs-port.d.ts +18 -0
  72. package/dist/app/ports/jobs-port.js +2 -0
  73. package/dist/app/ports/jobs-port.js.map +1 -0
  74. package/dist/app/ports/persistence-port.d.ts +21 -0
  75. package/dist/app/ports/persistence-port.js +2 -0
  76. package/dist/app/ports/persistence-port.js.map +1 -0
  77. package/dist/app/ports/secret-port.d.ts +12 -0
  78. package/dist/app/ports/secret-port.js +2 -0
  79. package/dist/app/ports/secret-port.js.map +1 -0
  80. package/dist/app/ports/terminal-port.d.ts +18 -0
  81. package/dist/app/ports/terminal-port.js +2 -0
  82. package/dist/app/ports/terminal-port.js.map +1 -0
  83. package/dist/app/ports/updates-port.d.ts +12 -0
  84. package/dist/app/ports/updates-port.js +2 -0
  85. package/dist/app/ports/updates-port.js.map +1 -0
  86. package/dist/commands/doctor.js +9 -0
  87. package/dist/commands/doctor.js.map +1 -1
  88. package/dist/commands/update.js +1 -1
  89. package/dist/commands/update.js.map +1 -1
  90. package/dist/index.js +9 -6
  91. package/dist/index.js.map +1 -1
  92. package/dist/llm/router.js +4 -2
  93. package/dist/llm/router.js.map +1 -1
  94. package/dist/prompts/index.d.ts +1 -1
  95. package/dist/prompts/index.js +5 -3
  96. package/dist/prompts/index.js.map +1 -1
  97. package/dist/repl/slash-commands.js +1 -1
  98. package/dist/repl/slash-commands.js.map +1 -1
  99. package/dist/repl.js +35 -107
  100. package/dist/repl.js.map +1 -1
  101. package/dist/store/config.js +3 -1
  102. package/dist/store/config.js.map +1 -1
  103. package/dist/store/history.d.ts +26 -2
  104. package/dist/store/history.js +383 -72
  105. package/dist/store/history.js.map +1 -1
  106. package/dist/store/logs.js +3 -3
  107. package/dist/store/logs.js.map +1 -1
  108. package/dist/store/paths.d.ts +6 -0
  109. package/dist/store/paths.js +38 -0
  110. package/dist/store/paths.js.map +1 -0
  111. package/dist/store/plan.js +8 -5
  112. package/dist/store/plan.js.map +1 -1
  113. package/dist/tools/jobs.js +2 -2
  114. package/dist/tools/jobs.js.map +1 -1
  115. package/dist/tools/registry.js +117 -46
  116. package/dist/tools/registry.js.map +1 -1
  117. package/dist/tools/shell.js +2 -2
  118. package/dist/tools/shell.js.map +1 -1
  119. package/dist/tui/state.js +20 -17
  120. package/dist/tui/state.js.map +1 -1
  121. package/dist/tui-v2/actions/action-id.d.ts +14 -0
  122. package/dist/tui-v2/actions/action-id.js +109 -0
  123. package/dist/tui-v2/actions/action-id.js.map +1 -0
  124. package/dist/tui-v2/actions/action-router.d.ts +18 -0
  125. package/dist/tui-v2/actions/action-router.js +62 -0
  126. package/dist/tui-v2/actions/action-router.js.map +1 -0
  127. package/dist/tui-v2/actions/chord-from-key.d.ts +26 -0
  128. package/dist/tui-v2/actions/chord-from-key.js +45 -0
  129. package/dist/tui-v2/actions/chord-from-key.js.map +1 -0
  130. package/dist/tui-v2/actions/keymap.d.ts +24 -0
  131. package/dist/tui-v2/actions/keymap.js +134 -0
  132. package/dist/tui-v2/actions/keymap.js.map +1 -0
  133. package/dist/tui-v2/app/App.d.ts +13 -0
  134. package/dist/tui-v2/app/App.js +320 -0
  135. package/dist/tui-v2/app/App.js.map +1 -0
  136. package/dist/tui-v2/app/command-handlers.d.ts +8 -0
  137. package/dist/tui-v2/app/command-handlers.js +66 -0
  138. package/dist/tui-v2/app/command-handlers.js.map +1 -0
  139. package/dist/tui-v2/app/commands/config-commands.d.ts +14 -0
  140. package/dist/tui-v2/app/commands/config-commands.js +161 -0
  141. package/dist/tui-v2/app/commands/config-commands.js.map +1 -0
  142. package/dist/tui-v2/app/commands/key-commands.d.ts +9 -0
  143. package/dist/tui-v2/app/commands/key-commands.js +263 -0
  144. package/dist/tui-v2/app/commands/key-commands.js.map +1 -0
  145. package/dist/tui-v2/app/commands/picker-commands.d.ts +24 -0
  146. package/dist/tui-v2/app/commands/picker-commands.js +423 -0
  147. package/dist/tui-v2/app/commands/picker-commands.js.map +1 -0
  148. package/dist/tui-v2/app/commands/session-commands.d.ts +19 -0
  149. package/dist/tui-v2/app/commands/session-commands.js +162 -0
  150. package/dist/tui-v2/app/commands/session-commands.js.map +1 -0
  151. package/dist/tui-v2/app/plan-lifecycle.d.ts +16 -0
  152. package/dist/tui-v2/app/plan-lifecycle.js +59 -0
  153. package/dist/tui-v2/app/plan-lifecycle.js.map +1 -0
  154. package/dist/tui-v2/app/providers.d.ts +17 -0
  155. package/dist/tui-v2/app/providers.js +32 -0
  156. package/dist/tui-v2/app/providers.js.map +1 -0
  157. package/dist/tui-v2/bootstrap/capabilities.d.ts +35 -0
  158. package/dist/tui-v2/bootstrap/capabilities.js +93 -0
  159. package/dist/tui-v2/bootstrap/capabilities.js.map +1 -0
  160. package/dist/tui-v2/bootstrap/composition-root.d.ts +85 -0
  161. package/dist/tui-v2/bootstrap/composition-root.js +131 -0
  162. package/dist/tui-v2/bootstrap/composition-root.js.map +1 -0
  163. package/dist/tui-v2/bootstrap/disable-native-selection.d.ts +11 -0
  164. package/dist/tui-v2/bootstrap/disable-native-selection.js +13 -0
  165. package/dist/tui-v2/bootstrap/disable-native-selection.js.map +1 -0
  166. package/dist/tui-v2/bootstrap/lifecycle.d.ts +62 -0
  167. package/dist/tui-v2/bootstrap/lifecycle.js +123 -0
  168. package/dist/tui-v2/bootstrap/lifecycle.js.map +1 -0
  169. package/dist/tui-v2/bootstrap/osc52-clipboard.d.ts +28 -0
  170. package/dist/tui-v2/bootstrap/osc52-clipboard.js +44 -0
  171. package/dist/tui-v2/bootstrap/osc52-clipboard.js.map +1 -0
  172. package/dist/tui-v2/bootstrap/overlay-ports.d.ts +12 -0
  173. package/dist/{tui/confirm.js → tui-v2/bootstrap/overlay-ports.js} +17 -25
  174. package/dist/tui-v2/bootstrap/overlay-ports.js.map +1 -0
  175. package/dist/tui-v2/bootstrap/pager-export.d.ts +24 -0
  176. package/dist/tui-v2/bootstrap/pager-export.js +87 -0
  177. package/dist/tui-v2/bootstrap/pager-export.js.map +1 -0
  178. package/dist/tui-v2/bootstrap/start-tui-v2.d.ts +15 -0
  179. package/dist/tui-v2/bootstrap/start-tui-v2.js +95 -0
  180. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -0
  181. package/dist/tui-v2/bootstrap/ui-selection.d.ts +30 -0
  182. package/dist/tui-v2/bootstrap/ui-selection.js +59 -0
  183. package/dist/tui-v2/bootstrap/ui-selection.js.map +1 -0
  184. package/dist/tui-v2/components/completion/completion-menu.d.ts +23 -0
  185. package/dist/tui-v2/components/completion/completion-menu.js +84 -0
  186. package/dist/tui-v2/components/completion/completion-menu.js.map +1 -0
  187. package/dist/tui-v2/components/jobs/jobs-panel.d.ts +16 -0
  188. package/dist/tui-v2/components/jobs/jobs-panel.js +92 -0
  189. package/dist/tui-v2/components/jobs/jobs-panel.js.map +1 -0
  190. package/dist/tui-v2/components/modal/confirm-modal.d.ts +21 -0
  191. package/dist/tui-v2/components/modal/confirm-modal.js +71 -0
  192. package/dist/tui-v2/components/modal/confirm-modal.js.map +1 -0
  193. package/dist/tui-v2/components/modal/prompt-actions-modal.d.ts +15 -0
  194. package/dist/tui-v2/components/modal/prompt-actions-modal.js +80 -0
  195. package/dist/tui-v2/components/modal/prompt-actions-modal.js.map +1 -0
  196. package/dist/tui-v2/components/modal/secret-modal.d.ts +24 -0
  197. package/dist/tui-v2/components/modal/secret-modal.js +50 -0
  198. package/dist/tui-v2/components/modal/secret-modal.js.map +1 -0
  199. package/dist/tui-v2/components/overlay/overlay-host.d.ts +17 -0
  200. package/dist/tui-v2/components/overlay/overlay-host.js +28 -0
  201. package/dist/tui-v2/components/overlay/overlay-host.js.map +1 -0
  202. package/dist/tui-v2/components/pager/pager.d.ts +20 -0
  203. package/dist/tui-v2/components/pager/pager.js +396 -0
  204. package/dist/tui-v2/components/pager/pager.js.map +1 -0
  205. package/dist/tui-v2/components/picker/picker.d.ts +17 -0
  206. package/dist/tui-v2/components/picker/picker.js +222 -0
  207. package/dist/tui-v2/components/picker/picker.js.map +1 -0
  208. package/dist/tui-v2/components/plan/plan-view.d.ts +20 -0
  209. package/dist/tui-v2/components/plan/plan-view.js +116 -0
  210. package/dist/tui-v2/components/plan/plan-view.js.map +1 -0
  211. package/dist/tui-v2/components/queue/queue-panel.d.ts +23 -0
  212. package/dist/tui-v2/components/queue/queue-panel.js +58 -0
  213. package/dist/tui-v2/components/queue/queue-panel.js.map +1 -0
  214. package/dist/tui-v2/components/status/status-line.d.ts +27 -0
  215. package/dist/tui-v2/components/status/status-line.js +158 -0
  216. package/dist/tui-v2/components/status/status-line.js.map +1 -0
  217. package/dist/tui-v2/components/toast/toast-host.d.ts +15 -0
  218. package/dist/tui-v2/components/toast/toast-host.js +48 -0
  219. package/dist/tui-v2/components/toast/toast-host.js.map +1 -0
  220. package/dist/tui-v2/components/transcript/assistant-message.d.ts +20 -0
  221. package/dist/tui-v2/components/transcript/assistant-message.js +35 -0
  222. package/dist/tui-v2/components/transcript/assistant-message.js.map +1 -0
  223. package/dist/tui-v2/components/transcript/compacted-row.d.ts +19 -0
  224. package/dist/tui-v2/components/transcript/compacted-row.js +94 -0
  225. package/dist/tui-v2/components/transcript/compacted-row.js.map +1 -0
  226. package/dist/tui-v2/components/transcript/intro-card.d.ts +19 -0
  227. package/dist/tui-v2/components/transcript/intro-card.js +50 -0
  228. package/dist/tui-v2/components/transcript/intro-card.js.map +1 -0
  229. package/dist/tui-v2/components/transcript/linkable-text.d.ts +21 -0
  230. package/dist/tui-v2/components/transcript/linkable-text.js +46 -0
  231. package/dist/tui-v2/components/transcript/linkable-text.js.map +1 -0
  232. package/dist/tui-v2/components/transcript/notice-row.d.ts +14 -0
  233. package/dist/tui-v2/components/transcript/notice-row.js +40 -0
  234. package/dist/tui-v2/components/transcript/notice-row.js.map +1 -0
  235. package/dist/tui-v2/components/transcript/search-bar.d.ts +19 -0
  236. package/dist/tui-v2/components/transcript/search-bar.js +7 -0
  237. package/dist/tui-v2/components/transcript/search-bar.js.map +1 -0
  238. package/dist/tui-v2/components/transcript/thinking-block.d.ts +22 -0
  239. package/dist/tui-v2/components/transcript/thinking-block.js +27 -0
  240. package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -0
  241. package/dist/tui-v2/components/transcript/tool-card.d.ts +26 -0
  242. package/dist/tui-v2/components/transcript/tool-card.js +175 -0
  243. package/dist/tui-v2/components/transcript/tool-card.js.map +1 -0
  244. package/dist/tui-v2/components/transcript/transcript-row.d.ts +25 -0
  245. package/dist/tui-v2/components/transcript/transcript-row.js +30 -0
  246. package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -0
  247. package/dist/tui-v2/components/transcript/transcript-scroll-port.d.ts +52 -0
  248. package/dist/tui-v2/components/transcript/transcript-scroll-port.js +86 -0
  249. package/dist/tui-v2/components/transcript/transcript-scroll-port.js.map +1 -0
  250. package/dist/tui-v2/components/transcript/transcript-view.d.ts +24 -0
  251. package/dist/tui-v2/components/transcript/transcript-view.js +403 -0
  252. package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -0
  253. package/dist/tui-v2/components/transcript/use-click-without-drag.d.ts +13 -0
  254. package/dist/tui-v2/components/transcript/use-click-without-drag.js +35 -0
  255. package/dist/tui-v2/components/transcript/use-click-without-drag.js.map +1 -0
  256. package/dist/tui-v2/components/transcript/use-native-selection-copy.d.ts +10 -0
  257. package/dist/tui-v2/components/transcript/use-native-selection-copy.js +37 -0
  258. package/dist/tui-v2/components/transcript/use-native-selection-copy.js.map +1 -0
  259. package/dist/tui-v2/components/transcript/use-transcript-selection.d.ts +23 -0
  260. package/dist/tui-v2/components/transcript/use-transcript-selection.js +136 -0
  261. package/dist/tui-v2/components/transcript/use-transcript-selection.js.map +1 -0
  262. package/dist/tui-v2/components/transcript/user-message.d.ts +10 -0
  263. package/dist/tui-v2/components/transcript/user-message.js +23 -0
  264. package/dist/tui-v2/components/transcript/user-message.js.map +1 -0
  265. package/dist/tui-v2/composer/arrow-intent.d.ts +23 -0
  266. package/dist/tui-v2/composer/arrow-intent.js +35 -0
  267. package/dist/tui-v2/composer/arrow-intent.js.map +1 -0
  268. package/dist/tui-v2/composer/completion.d.ts +37 -0
  269. package/dist/tui-v2/composer/completion.js +67 -0
  270. package/dist/tui-v2/composer/completion.js.map +1 -0
  271. package/dist/tui-v2/composer/composer-editor.d.ts +33 -0
  272. package/dist/tui-v2/composer/composer-editor.js +620 -0
  273. package/dist/tui-v2/composer/composer-editor.js.map +1 -0
  274. package/dist/tui-v2/composer/composer-height.d.ts +21 -0
  275. package/dist/tui-v2/composer/composer-height.js +29 -0
  276. package/dist/tui-v2/composer/composer-height.js.map +1 -0
  277. package/dist/tui-v2/composer/composer-meta.d.ts +9 -0
  278. package/dist/tui-v2/composer/composer-meta.js +38 -0
  279. package/dist/tui-v2/composer/composer-meta.js.map +1 -0
  280. package/dist/tui-v2/composer/history-nav.d.ts +15 -0
  281. package/dist/tui-v2/composer/history-nav.js +16 -0
  282. package/dist/tui-v2/composer/history-nav.js.map +1 -0
  283. package/dist/tui-v2/composer/newline-hint.d.ts +13 -0
  284. package/dist/tui-v2/composer/newline-hint.js +13 -0
  285. package/dist/tui-v2/composer/newline-hint.js.map +1 -0
  286. package/dist/tui-v2/composer/paste-placeholder.d.ts +35 -0
  287. package/dist/tui-v2/composer/paste-placeholder.js +55 -0
  288. package/dist/tui-v2/composer/paste-placeholder.js.map +1 -0
  289. package/dist/tui-v2/composer/prompt-history.d.ts +22 -0
  290. package/dist/tui-v2/composer/prompt-history.js +51 -0
  291. package/dist/tui-v2/composer/prompt-history.js.map +1 -0
  292. package/dist/tui-v2/composer/secret-buffer.d.ts +20 -0
  293. package/dist/tui-v2/composer/secret-buffer.js +42 -0
  294. package/dist/tui-v2/composer/secret-buffer.js.map +1 -0
  295. package/dist/tui-v2/composer/textarea-keybindings.d.ts +22 -0
  296. package/dist/tui-v2/composer/textarea-keybindings.js +27 -0
  297. package/dist/tui-v2/composer/textarea-keybindings.js.map +1 -0
  298. package/dist/tui-v2/controllers/focus-controller.d.ts +30 -0
  299. package/dist/tui-v2/controllers/focus-controller.js +80 -0
  300. package/dist/tui-v2/controllers/focus-controller.js.map +1 -0
  301. package/dist/tui-v2/controllers/overlay-controller.d.ts +99 -0
  302. package/dist/tui-v2/controllers/overlay-controller.js +195 -0
  303. package/dist/tui-v2/controllers/overlay-controller.js.map +1 -0
  304. package/dist/tui-v2/controllers/selection-controller.d.ts +76 -0
  305. package/dist/tui-v2/controllers/selection-controller.js +238 -0
  306. package/dist/tui-v2/controllers/selection-controller.js.map +1 -0
  307. package/dist/tui-v2/controllers/toast-controller.d.ts +35 -0
  308. package/dist/tui-v2/controllers/toast-controller.js +88 -0
  309. package/dist/tui-v2/controllers/toast-controller.js.map +1 -0
  310. package/dist/tui-v2/layout/compute-layout.d.ts +59 -0
  311. package/dist/tui-v2/layout/compute-layout.js +170 -0
  312. package/dist/tui-v2/layout/compute-layout.js.map +1 -0
  313. package/dist/tui-v2/rendering/ansi-to-styled.d.ts +17 -0
  314. package/dist/tui-v2/rendering/ansi-to-styled.js +217 -0
  315. package/dist/tui-v2/rendering/ansi-to-styled.js.map +1 -0
  316. package/dist/tui-v2/rendering/batch-sections.d.ts +45 -0
  317. package/dist/tui-v2/rendering/batch-sections.js +109 -0
  318. package/dist/tui-v2/rendering/batch-sections.js.map +1 -0
  319. package/dist/tui-v2/rendering/link-detector.d.ts +16 -0
  320. package/dist/tui-v2/rendering/link-detector.js +43 -0
  321. package/dist/tui-v2/rendering/link-detector.js.map +1 -0
  322. package/dist/tui-v2/rendering/open-tool-output.d.ts +28 -0
  323. package/dist/tui-v2/rendering/open-tool-output.js +138 -0
  324. package/dist/tui-v2/rendering/open-tool-output.js.map +1 -0
  325. package/dist/tui-v2/rendering/picker-filter.d.ts +22 -0
  326. package/dist/tui-v2/rendering/picker-filter.js +68 -0
  327. package/dist/tui-v2/rendering/picker-filter.js.map +1 -0
  328. package/dist/tui-v2/rendering/plan-view.d.ts +32 -0
  329. package/dist/tui-v2/rendering/plan-view.js +196 -0
  330. package/dist/tui-v2/rendering/plan-view.js.map +1 -0
  331. package/dist/tui-v2/rendering/render-markdown-lines.d.ts +29 -0
  332. package/dist/tui-v2/rendering/render-markdown-lines.js +46 -0
  333. package/dist/tui-v2/rendering/render-markdown-lines.js.map +1 -0
  334. package/dist/tui-v2/rendering/sanitize-display.d.ts +13 -0
  335. package/dist/tui-v2/rendering/sanitize-display.js +24 -0
  336. package/dist/tui-v2/rendering/sanitize-display.js.map +1 -0
  337. package/dist/tui-v2/rendering/theme.d.ts +67 -0
  338. package/dist/tui-v2/rendering/theme.js +74 -0
  339. package/dist/tui-v2/rendering/theme.js.map +1 -0
  340. package/dist/tui-v2/rendering/tool-presenter.d.ts +39 -0
  341. package/dist/tui-v2/rendering/tool-presenter.js +207 -0
  342. package/dist/tui-v2/rendering/tool-presenter.js.map +1 -0
  343. package/dist/tui-v2/rendering/transcript-export.d.ts +11 -0
  344. package/dist/tui-v2/rendering/transcript-export.js +18 -0
  345. package/dist/tui-v2/rendering/transcript-export.js.map +1 -0
  346. package/dist/tui-v2/rendering/transcript-semantic.d.ts +17 -0
  347. package/dist/tui-v2/rendering/transcript-semantic.js +67 -0
  348. package/dist/tui-v2/rendering/transcript-semantic.js.map +1 -0
  349. package/dist/tui-v2/state/pager-search.d.ts +22 -0
  350. package/dist/tui-v2/state/pager-search.js +78 -0
  351. package/dist/tui-v2/state/pager-search.js.map +1 -0
  352. package/dist/tui-v2/state/semantic-document.d.ts +34 -0
  353. package/dist/tui-v2/state/semantic-document.js +201 -0
  354. package/dist/tui-v2/state/semantic-document.js.map +1 -0
  355. package/dist/tui-v2/state/transcript-compaction.d.ts +24 -0
  356. package/dist/tui-v2/state/transcript-compaction.js +79 -0
  357. package/dist/tui-v2/state/transcript-compaction.js.map +1 -0
  358. package/dist/tui-v2/state/transcript-hydrate.d.ts +27 -0
  359. package/dist/tui-v2/state/transcript-hydrate.js +272 -0
  360. package/dist/tui-v2/state/transcript-hydrate.js.map +1 -0
  361. package/dist/tui-v2/state/transcript-reducer.d.ts +10 -0
  362. package/dist/tui-v2/state/transcript-reducer.js +281 -0
  363. package/dist/tui-v2/state/transcript-reducer.js.map +1 -0
  364. package/dist/tui-v2/state/transcript-search.d.ts +17 -0
  365. package/dist/tui-v2/state/transcript-search.js +38 -0
  366. package/dist/tui-v2/state/transcript-search.js.map +1 -0
  367. package/dist/tui-v2/state/transcript-store.d.ts +32 -0
  368. package/dist/tui-v2/state/transcript-store.js +66 -0
  369. package/dist/tui-v2/state/transcript-store.js.map +1 -0
  370. package/dist/tui-v2/state/transcript-struct.d.ts +15 -0
  371. package/dist/tui-v2/state/transcript-struct.js +133 -0
  372. package/dist/tui-v2/state/transcript-struct.js.map +1 -0
  373. package/dist/tui-v2/state/transcript-types.d.ts +76 -0
  374. package/dist/tui-v2/state/transcript-types.js +65 -0
  375. package/dist/tui-v2/state/transcript-types.js.map +1 -0
  376. package/dist/tui-v2/state/use-overlay.d.ts +3 -0
  377. package/dist/tui-v2/state/use-overlay.js +6 -0
  378. package/dist/tui-v2/state/use-overlay.js.map +1 -0
  379. package/dist/tui-v2/state/use-plan.d.ts +4 -0
  380. package/dist/tui-v2/state/use-plan.js +6 -0
  381. package/dist/tui-v2/state/use-plan.js.map +1 -0
  382. package/dist/tui-v2/state/use-session-state.d.ts +2 -0
  383. package/dist/tui-v2/state/use-session-state.js +7 -0
  384. package/dist/tui-v2/state/use-session-state.js.map +1 -0
  385. package/dist/tui-v2/state/use-toast.d.ts +3 -0
  386. package/dist/tui-v2/state/use-toast.js +15 -0
  387. package/dist/tui-v2/state/use-toast.js.map +1 -0
  388. package/dist/tui-v2/state/use-transcript-store.d.ts +10 -0
  389. package/dist/tui-v2/state/use-transcript-store.js +12 -0
  390. package/dist/tui-v2/state/use-transcript-store.js.map +1 -0
  391. package/dist/ui/intro-card.js +3 -3
  392. package/dist/ui/intro-card.js.map +1 -1
  393. package/dist/ui/intro-header.d.ts +23 -0
  394. package/dist/ui/intro-header.js +232 -0
  395. package/dist/ui/intro-header.js.map +1 -0
  396. package/dist/ui/markdown.js +0 -1
  397. package/dist/ui/markdown.js.map +1 -1
  398. package/dist/ui/mentions.d.ts +9 -2
  399. package/dist/ui/mentions.js +102 -4
  400. package/dist/ui/mentions.js.map +1 -1
  401. package/dist/ui/output-pane.js +1 -1
  402. package/dist/ui/output-pane.js.map +1 -1
  403. package/dist/ui/plan-pane.d.ts +8 -0
  404. package/dist/ui/plan-pane.js +38 -0
  405. package/dist/ui/plan-pane.js.map +1 -1
  406. package/dist/ui/wordmark.d.ts +5 -0
  407. package/dist/ui/wordmark.js +6 -1
  408. package/dist/ui/wordmark.js.map +1 -1
  409. package/package.json +14 -10
  410. package/dist/tui/App.d.ts +0 -12
  411. package/dist/tui/App.js +0 -2174
  412. package/dist/tui/App.js.map +0 -1
  413. package/dist/tui/components/ConfirmModal.d.ts +0 -9
  414. package/dist/tui/components/ConfirmModal.js +0 -55
  415. package/dist/tui/components/ConfirmModal.js.map +0 -1
  416. package/dist/tui/components/JobsPanel.d.ts +0 -11
  417. package/dist/tui/components/JobsPanel.js +0 -55
  418. package/dist/tui/components/JobsPanel.js.map +0 -1
  419. package/dist/tui/components/Pager.d.ts +0 -14
  420. package/dist/tui/components/Pager.js +0 -56
  421. package/dist/tui/components/Pager.js.map +0 -1
  422. package/dist/tui/components/PickerPanel.d.ts +0 -15
  423. package/dist/tui/components/PickerPanel.js +0 -126
  424. package/dist/tui/components/PickerPanel.js.map +0 -1
  425. package/dist/tui/components/PlanSidebar.d.ts +0 -6
  426. package/dist/tui/components/PlanSidebar.js +0 -99
  427. package/dist/tui/components/PlanSidebar.js.map +0 -1
  428. package/dist/tui/components/SecretInputPanel.d.ts +0 -7
  429. package/dist/tui/components/SecretInputPanel.js +0 -38
  430. package/dist/tui/components/SecretInputPanel.js.map +0 -1
  431. package/dist/tui/confirm.d.ts +0 -16
  432. package/dist/tui/confirm.js.map +0 -1
  433. package/dist/tui/default.d.ts +0 -6
  434. package/dist/tui/default.js +0 -11
  435. package/dist/tui/default.js.map +0 -1
  436. package/dist/tui/hooks/useAgentRunner.d.ts +0 -73
  437. package/dist/tui/hooks/useAgentRunner.js +0 -277
  438. package/dist/tui/hooks/useAgentRunner.js.map +0 -1
  439. package/dist/tui/hooks/useJobs.d.ts +0 -7
  440. package/dist/tui/hooks/useJobs.js +0 -39
  441. package/dist/tui/hooks/useJobs.js.map +0 -1
  442. package/dist/tui/hooks/useSpinner.d.ts +0 -5
  443. package/dist/tui/hooks/useSpinner.js +0 -21
  444. package/dist/tui/hooks/useSpinner.js.map +0 -1
  445. package/dist/tui/hooks/useTerminalSize.d.ts +0 -9
  446. package/dist/tui/hooks/useTerminalSize.js +0 -26
  447. package/dist/tui/hooks/useTerminalSize.js.map +0 -1
  448. package/dist/tui/index.d.ts +0 -10
  449. package/dist/tui/index.js +0 -37
  450. package/dist/tui/index.js.map +0 -1
  451. package/dist/tui/key-intent.d.ts +0 -36
  452. package/dist/tui/key-intent.js +0 -54
  453. package/dist/tui/key-intent.js.map +0 -1
  454. package/dist/tui/mouse.d.ts +0 -8
  455. package/dist/tui/mouse.js +0 -34
  456. package/dist/tui/mouse.js.map +0 -1
  457. package/dist/tui/plan-sidebar-lines.d.ts +0 -2
  458. package/dist/tui/plan-sidebar-lines.js +0 -140
  459. package/dist/tui/plan-sidebar-lines.js.map +0 -1
  460. package/dist/tui/render-lines.d.ts +0 -22
  461. package/dist/tui/render-lines.js +0 -611
  462. package/dist/tui/render-lines.js.map +0 -1
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Renderer-independent semantic text coordinates used by pane selection.
3
+ *
4
+ * Anchors point at stable domain block ids and UTF-16 source offsets rather
5
+ * than viewport cells, so wrapping, resizing, and virtualized rows cannot
6
+ * change what an existing selection means.
7
+ */
8
+ import { detectLinks } from "../rendering/link-detector.js";
9
+ export const SEMANTIC_BLOCK_SEPARATOR = "\n\n";
10
+ export function normalizeSemanticDocument(document) {
11
+ const ids = new Set();
12
+ const blocks = document.blocks.map((block) => {
13
+ if (!block.id)
14
+ throw new Error("semantic blocks require a stable id");
15
+ if (ids.has(block.id))
16
+ throw new Error(`duplicate semantic block id: ${block.id}`);
17
+ ids.add(block.id);
18
+ return { id: block.id, text: block.text };
19
+ });
20
+ return { blocks };
21
+ }
22
+ export function documentStart(document) {
23
+ const block = document.blocks[0];
24
+ return block ? { blockId: block.id, offset: 0 } : undefined;
25
+ }
26
+ export function documentEnd(document) {
27
+ const block = document.blocks.at(-1);
28
+ return block ? { blockId: block.id, offset: block.text.length } : undefined;
29
+ }
30
+ export function clampSemanticAnchor(document, anchor, missing = "start") {
31
+ const index = indexOfBlock(document, anchor.blockId);
32
+ if (index < 0)
33
+ return missing === "start" ? documentStart(document) : documentEnd(document);
34
+ const block = document.blocks[index];
35
+ return { blockId: block.id, offset: Math.max(0, Math.min(anchor.offset, block.text.length)) };
36
+ }
37
+ export function compareSemanticAnchors(document, left, right) {
38
+ const leftIndex = indexOfBlock(document, left.blockId);
39
+ const rightIndex = indexOfBlock(document, right.blockId);
40
+ if (leftIndex !== rightIndex)
41
+ return leftIndex - rightIndex;
42
+ return left.offset - right.offset;
43
+ }
44
+ export function semanticRangeText(document, range) {
45
+ const anchor = clampSemanticAnchor(document, range.anchor);
46
+ const focus = clampSemanticAnchor(document, range.focus, "end");
47
+ if (!anchor || !focus)
48
+ return "";
49
+ const [start, end] = compareSemanticAnchors(document, anchor, focus) <= 0 ? [anchor, focus] : [focus, anchor];
50
+ const startIndex = indexOfBlock(document, start.blockId);
51
+ const endIndex = indexOfBlock(document, end.blockId);
52
+ if (startIndex === endIndex) {
53
+ return document.blocks[startIndex].text.slice(start.offset, end.offset);
54
+ }
55
+ const parts = [document.blocks[startIndex].text.slice(start.offset)];
56
+ for (let index = startIndex + 1; index < endIndex; index += 1) {
57
+ parts.push(document.blocks[index].text);
58
+ }
59
+ parts.push(document.blocks[endIndex].text.slice(0, end.offset));
60
+ return parts.join(SEMANTIC_BLOCK_SEPARATOR);
61
+ }
62
+ export function moveSemanticAnchor(document, requested, movement) {
63
+ const anchor = clampSemanticAnchor(document, requested);
64
+ if (!anchor)
65
+ return undefined;
66
+ const index = indexOfBlock(document, anchor.blockId);
67
+ const block = document.blocks[index];
68
+ switch (movement) {
69
+ case "left":
70
+ return moveCharacter(document, index, anchor.offset, -1);
71
+ case "right":
72
+ return moveCharacter(document, index, anchor.offset, 1);
73
+ case "word-left":
74
+ return moveWord(document, index, anchor.offset, -1);
75
+ case "word-right":
76
+ return moveWord(document, index, anchor.offset, 1);
77
+ case "line-start":
78
+ return { blockId: block.id, offset: lineBounds(block.text, anchor.offset).start };
79
+ case "line-end":
80
+ return { blockId: block.id, offset: lineBounds(block.text, anchor.offset).end };
81
+ case "up":
82
+ return moveLine(document, index, anchor.offset, -1);
83
+ case "down":
84
+ return moveLine(document, index, anchor.offset, 1);
85
+ }
86
+ }
87
+ /** SEL-005: double-click selects a whole URL/path as one unit, else a word. */
88
+ export function semanticWordRange(document, requested) {
89
+ const anchor = clampSemanticAnchor(document, requested);
90
+ if (!anchor)
91
+ return undefined;
92
+ const block = document.blocks[indexOfBlock(document, anchor.blockId)];
93
+ if (block.text.length === 0)
94
+ return { anchor, focus: anchor };
95
+ const link = detectLinks(block.text).find((span) => anchor.offset >= span.start && anchor.offset < span.end);
96
+ if (link) {
97
+ return {
98
+ anchor: { blockId: block.id, offset: link.start },
99
+ focus: { blockId: block.id, offset: link.end },
100
+ };
101
+ }
102
+ const character = Math.min(anchor.offset, block.text.length - 1);
103
+ if (!isWordCharacter(block.text[character]))
104
+ return { anchor, focus: anchor };
105
+ let start = character;
106
+ let end = character + 1;
107
+ while (start > 0 && isWordCharacter(block.text[start - 1]))
108
+ start -= 1;
109
+ while (end < block.text.length && isWordCharacter(block.text[end]))
110
+ end += 1;
111
+ return {
112
+ anchor: { blockId: block.id, offset: start },
113
+ focus: { blockId: block.id, offset: end },
114
+ };
115
+ }
116
+ export function semanticLineRange(document, requested) {
117
+ const anchor = clampSemanticAnchor(document, requested);
118
+ if (!anchor)
119
+ return undefined;
120
+ const block = document.blocks[indexOfBlock(document, anchor.blockId)];
121
+ const bounds = lineBounds(block.text, anchor.offset);
122
+ const newline = block.text[bounds.end] === "\n" ? 1 : 0;
123
+ return {
124
+ anchor: { blockId: block.id, offset: bounds.start },
125
+ focus: { blockId: block.id, offset: bounds.end + newline },
126
+ };
127
+ }
128
+ function indexOfBlock(document, id) {
129
+ return document.blocks.findIndex((block) => block.id === id);
130
+ }
131
+ function moveCharacter(document, index, offset, direction) {
132
+ const block = document.blocks[index];
133
+ if (direction < 0) {
134
+ if (offset > 0)
135
+ return { blockId: block.id, offset: offset - 1 };
136
+ const previous = document.blocks[index - 1];
137
+ return previous ? { blockId: previous.id, offset: previous.text.length } : { blockId: block.id, offset };
138
+ }
139
+ if (offset < block.text.length)
140
+ return { blockId: block.id, offset: offset + 1 };
141
+ const next = document.blocks[index + 1];
142
+ return next ? { blockId: next.id, offset: 0 } : { blockId: block.id, offset };
143
+ }
144
+ function moveWord(document, index, offset, direction) {
145
+ const block = document.blocks[index];
146
+ let cursor = offset;
147
+ if (direction < 0) {
148
+ while (cursor > 0 && !isWordCharacter(block.text[cursor - 1]))
149
+ cursor -= 1;
150
+ while (cursor > 0 && isWordCharacter(block.text[cursor - 1]))
151
+ cursor -= 1;
152
+ if (cursor > 0 || index === 0)
153
+ return { blockId: block.id, offset: cursor };
154
+ return moveWord(document, index - 1, document.blocks[index - 1].text.length, direction);
155
+ }
156
+ while (cursor < block.text.length && !isWordCharacter(block.text[cursor]))
157
+ cursor += 1;
158
+ while (cursor < block.text.length && isWordCharacter(block.text[cursor]))
159
+ cursor += 1;
160
+ if (cursor < block.text.length || index === document.blocks.length - 1) {
161
+ return { blockId: block.id, offset: cursor };
162
+ }
163
+ return moveWord(document, index + 1, 0, direction);
164
+ }
165
+ function moveLine(document, index, offset, direction) {
166
+ const block = document.blocks[index];
167
+ const current = lineBounds(block.text, offset);
168
+ const column = offset - current.start;
169
+ if (direction < 0) {
170
+ if (current.start > 0) {
171
+ const previousEnd = current.start - 1;
172
+ const previous = lineBounds(block.text, previousEnd);
173
+ return { blockId: block.id, offset: Math.min(previous.start + column, previous.end) };
174
+ }
175
+ const previousBlock = document.blocks[index - 1];
176
+ if (!previousBlock)
177
+ return { blockId: block.id, offset };
178
+ const previous = lineBounds(previousBlock.text, previousBlock.text.length);
179
+ return { blockId: previousBlock.id, offset: Math.min(previous.start + column, previous.end) };
180
+ }
181
+ if (current.end < block.text.length) {
182
+ const next = lineBounds(block.text, current.end + 1);
183
+ return { blockId: block.id, offset: Math.min(next.start + column, next.end) };
184
+ }
185
+ const nextBlock = document.blocks[index + 1];
186
+ if (!nextBlock)
187
+ return { blockId: block.id, offset };
188
+ const next = lineBounds(nextBlock.text, 0);
189
+ return { blockId: nextBlock.id, offset: Math.min(next.start + column, next.end) };
190
+ }
191
+ function lineBounds(text, requestedOffset) {
192
+ const offset = Math.max(0, Math.min(requestedOffset, text.length));
193
+ const before = text.lastIndexOf("\n", Math.max(0, offset - 1));
194
+ const start = before < 0 ? 0 : before + 1;
195
+ const next = text.indexOf("\n", offset);
196
+ return { start, end: next < 0 ? text.length : next };
197
+ }
198
+ function isWordCharacter(value) {
199
+ return /[\p{L}\p{N}_]/u.test(value);
200
+ }
201
+ //# sourceMappingURL=semantic-document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-document.js","sourceRoot":"","sources":["../../../src/tui-v2/state/semantic-document.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Classic-parity source material for /compact (and auto-compact).
3
+ *
4
+ * Builds a structured plain-text record of the visual transcript so the
5
+ * summarizer sees user prompts, tools (with outputs), assistant answers, and
6
+ * prior compacted memory — not a sparse semantic export that drops tool bodies.
7
+ *
8
+ * When a prior `compacted` card exists, only that card and everything after it
9
+ * are included (the memory already covers earlier turns).
10
+ */
11
+ import type { ToolCallId } from "../../app/events/app-event.js";
12
+ import { type TranscriptState } from "./transcript-types.js";
13
+ export type ToolOutputLookup = (toolCallId: ToolCallId) => string;
14
+ /**
15
+ * Serialize the live v2 transcript for the compaction summarizer.
16
+ * Prefer this over raw semantic export so tool outputs and prior memory land
17
+ * in the summary prompt.
18
+ */
19
+ export declare function serializeTranscriptForCompaction(state: TranscriptState, toolOutput?: ToolOutputLookup): string;
20
+ /**
21
+ * Merge visual session material with older model-history turns so /compact
22
+ * after /history (+ optional new prompts) always sees the full picture.
23
+ */
24
+ export declare function mergeCompactionSourceMaterial(sessionTranscript: string | undefined, olderModelTurns: string): string;
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Classic-parity source material for /compact (and auto-compact).
3
+ *
4
+ * Builds a structured plain-text record of the visual transcript so the
5
+ * summarizer sees user prompts, tools (with outputs), assistant answers, and
6
+ * prior compacted memory — not a sparse semantic export that drops tool bodies.
7
+ *
8
+ * When a prior `compacted` card exists, only that card and everything after it
9
+ * are included (the memory already covers earlier turns).
10
+ */
11
+ import { transcriptItems, } from "./transcript-types.js";
12
+ const MAX_FIELD_CHARS = 8_000;
13
+ function compactField(value) {
14
+ if (value.length <= MAX_FIELD_CHARS)
15
+ return value;
16
+ return `${value.slice(0, MAX_FIELD_CHARS)}\n…[truncated; full output remains in the session transcript/artifact]`;
17
+ }
18
+ /**
19
+ * Serialize the live v2 transcript for the compaction summarizer.
20
+ * Prefer this over raw semantic export so tool outputs and prior memory land
21
+ * in the summary prompt.
22
+ */
23
+ export function serializeTranscriptForCompaction(state, toolOutput) {
24
+ const items = transcriptItems(state);
25
+ const lastCompactedIndex = items.map((i) => i.kind).lastIndexOf("compacted");
26
+ const slice = lastCompactedIndex !== -1 ? items.slice(lastCompactedIndex) : items;
27
+ return slice
28
+ .map((item) => serializeItem(item, toolOutput))
29
+ .filter((part) => Boolean(part))
30
+ .join("\n\n---\n\n");
31
+ }
32
+ function serializeItem(item, toolOutput) {
33
+ switch (item.kind) {
34
+ case "user":
35
+ return `USER INTENT/PROMPT:\n${compactField(item.text)}`;
36
+ case "assistant":
37
+ return item.text.trim()
38
+ ? `ASSISTANT RESPONSE:\n${compactField(item.text)}`
39
+ : undefined;
40
+ case "thinking":
41
+ // Skip reasoning — inflates the summary without continuation value.
42
+ return undefined;
43
+ case "tool": {
44
+ const output = toolOutput?.(item.toolCallId) ?? "";
45
+ return [
46
+ `TOOL/COMMAND: ${item.name}`,
47
+ `INPUT: ${compactField(item.argsDisplay)}`,
48
+ `STATUS: ${item.status}${typeof item.exitCode === "number" ? ` (exit ${item.exitCode})` : ""}`,
49
+ item.summary ? `RESULT SUMMARY: ${compactField(item.summary)}` : "",
50
+ output ? `OUTPUT/RESULT:\n${compactField(output)}` : "",
51
+ item.artifactPath ? `FULL ARTIFACT: ${item.artifactPath}` : "",
52
+ ]
53
+ .filter(Boolean)
54
+ .join("\n");
55
+ }
56
+ case "notice":
57
+ // Skip ephemeral UI notices (session resumed, etc.) — not model context.
58
+ return undefined;
59
+ case "compacted":
60
+ return `COMPACTED CONTEXT:\n${compactField(item.summary)}`;
61
+ default: {
62
+ const unreachable = item;
63
+ throw new Error(`unhandled transcript item: ${JSON.stringify(unreachable)}`);
64
+ }
65
+ }
66
+ }
67
+ /**
68
+ * Merge visual session material with older model-history turns so /compact
69
+ * after /history (+ optional new prompts) always sees the full picture.
70
+ */
71
+ export function mergeCompactionSourceMaterial(sessionTranscript, olderModelTurns) {
72
+ const visual = sessionTranscript?.trim() ?? "";
73
+ const fromMessages = olderModelTurns.trim();
74
+ if (visual && fromMessages) {
75
+ return `${visual}\n\n---\n\nOLDER MODEL TURNS:\n\n${fromMessages}`;
76
+ }
77
+ return visual || fromMessages;
78
+ }
79
+ //# sourceMappingURL=transcript-compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-compaction.js","sourceRoot":"","sources":["../../../src/tui-v2/state/transcript-compaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Resume helpers: classic/history TranscriptItem + ChatMessage → v2 store shape.
3
+ *
4
+ * History records may carry a full TUI transcript (classic clai) or only the
5
+ * model messages array (older / partial saves). We hydrate both so /history
6
+ * restores prompts, tools, and assistant text — not just a notice.
7
+ */
8
+ import type { ChatMessage } from "../../types.js";
9
+ import type { TranscriptItem as ClassicTranscriptItem } from "../../tui/state.js";
10
+ import { type ToolCallId } from "../../app/events/app-event.js";
11
+ import { type TranscriptState } from "./transcript-types.js";
12
+ export interface HydrateResult {
13
+ readonly state: TranscriptState;
14
+ /** Tool outputs to seed into OutputSpool (classic embeds output on the item). */
15
+ readonly toolOutputs: ReadonlyMap<ToolCallId, string>;
16
+ }
17
+ /** Convert a classic (or mixed) saved transcript into the v2 normalized state. */
18
+ export declare function hydrateFromClassicTranscript(items: readonly ClassicTranscriptItem[]): HydrateResult;
19
+ /** Fallback when a history row only has model messages (no visual transcript). */
20
+ export declare function hydrateFromMessages(messages: readonly ChatMessage[]): HydrateResult;
21
+ /**
22
+ * Snapshot the live v2 transcript into the classic shape for history.db so
23
+ * /history can restore tools + prompts next time (parity with classic clai).
24
+ */
25
+ export declare function serializeForHistory(state: TranscriptState, toolOutput: (toolCallId: ToolCallId) => string): ClassicTranscriptItem[];
26
+ /** Strip the model framing prefix for display in the compacted card. */
27
+ export declare function displayCompactSummary(summary: string): string;
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Resume helpers: classic/history TranscriptItem + ChatMessage → v2 store shape.
3
+ *
4
+ * History records may carry a full TUI transcript (classic clai) or only the
5
+ * model messages array (older / partial saves). We hydrate both so /history
6
+ * restores prompts, tools, and assistant text — not just a notice.
7
+ */
8
+ import { asToolCallId } from "../../app/events/app-event.js";
9
+ import { EMPTY_TRANSCRIPT_STATE, } from "./transcript-types.js";
10
+ function mapToolStatus(status) {
11
+ if (status === "ok" || status === "running" || status === "blocked")
12
+ return status;
13
+ if (status === "fail" || status === "failed")
14
+ return "failed";
15
+ return "ok";
16
+ }
17
+ /** Convert a classic (or mixed) saved transcript into the v2 normalized state. */
18
+ export function hydrateFromClassicTranscript(items) {
19
+ const order = [];
20
+ const byId = new Map();
21
+ const toolOutputs = new Map();
22
+ let sequence = 0;
23
+ for (const raw of items) {
24
+ sequence += 1;
25
+ const id = raw.id || `hist-${sequence}`;
26
+ const base = {
27
+ id,
28
+ sequence,
29
+ turnId: undefined,
30
+ timestamp: sequence,
31
+ };
32
+ switch (raw.kind) {
33
+ case "user": {
34
+ const item = { ...base, kind: "user", text: raw.text ?? "" };
35
+ byId.set(id, item);
36
+ order.push(id);
37
+ break;
38
+ }
39
+ case "assistant": {
40
+ const item = {
41
+ ...base,
42
+ kind: "assistant",
43
+ text: raw.text ?? "",
44
+ streaming: false,
45
+ };
46
+ byId.set(id, item);
47
+ order.push(id);
48
+ break;
49
+ }
50
+ case "thinking": {
51
+ const item = {
52
+ ...base,
53
+ kind: "thinking",
54
+ content: raw.content ?? "",
55
+ streaming: false,
56
+ };
57
+ byId.set(id, item);
58
+ order.push(id);
59
+ break;
60
+ }
61
+ case "tool": {
62
+ const toolCallId = asToolCallId(id);
63
+ const status = mapToolStatus(raw.status);
64
+ const output = typeof raw.output === "string" ? raw.output : "";
65
+ if (output)
66
+ toolOutputs.set(toolCallId, output);
67
+ const item = {
68
+ ...base,
69
+ kind: "tool",
70
+ toolCallId,
71
+ name: raw.name ?? "tool",
72
+ argsDisplay: raw.argsDisplay ?? "",
73
+ status: status === "running" ? "ok" : status,
74
+ exitCode: raw.exitCode,
75
+ summary: raw.summary,
76
+ artifactPath: raw.artifactPath,
77
+ reason: undefined,
78
+ outputBytes: Buffer.byteLength(output, "utf8"),
79
+ };
80
+ byId.set(id, item);
81
+ order.push(id);
82
+ break;
83
+ }
84
+ case "notice": {
85
+ const item = {
86
+ ...base,
87
+ kind: "notice",
88
+ level: raw.level === "warn" ? "warn" : "info",
89
+ text: raw.text ?? "",
90
+ };
91
+ byId.set(id, item);
92
+ order.push(id);
93
+ break;
94
+ }
95
+ case "compacted": {
96
+ const item = {
97
+ ...base,
98
+ kind: "compacted",
99
+ summary: raw.summary ?? "Compacted context",
100
+ beforeTokens: 0,
101
+ afterTokens: 0,
102
+ };
103
+ byId.set(id, item);
104
+ order.push(id);
105
+ break;
106
+ }
107
+ case "plan":
108
+ // Plans restore via plan store / Ctrl+H — skip visual plan rows.
109
+ break;
110
+ default:
111
+ break;
112
+ }
113
+ }
114
+ if (order.length === 0) {
115
+ return { state: EMPTY_TRANSCRIPT_STATE, toolOutputs };
116
+ }
117
+ return {
118
+ state: {
119
+ ...EMPTY_TRANSCRIPT_STATE,
120
+ order,
121
+ byId,
122
+ // Historical item.sequence is display metadata only. lastSequence must
123
+ // stay 0 so the live EventSequencer (rebound to 0 on loadHistory) can
124
+ // apply turn-started and the rest of the next turn — otherwise every
125
+ // event with seq <= N is dropped and the new user prompt never appears.
126
+ lastSequence: 0,
127
+ },
128
+ toolOutputs,
129
+ };
130
+ }
131
+ /** Fallback when a history row only has model messages (no visual transcript). */
132
+ export function hydrateFromMessages(messages) {
133
+ const order = [];
134
+ const byId = new Map();
135
+ let sequence = 0;
136
+ for (const message of messages) {
137
+ if (message.role !== "user" && message.role !== "assistant")
138
+ continue;
139
+ // Skip pure session-memory system-style content if it landed as assistant.
140
+ if (message.role === "assistant" && !message.content.trim())
141
+ continue;
142
+ sequence += 1;
143
+ const id = message.role === "user" ? `hist-user-${sequence}` : `hist-asst-${sequence}`;
144
+ if (message.role === "user") {
145
+ const item = {
146
+ id,
147
+ sequence,
148
+ turnId: undefined,
149
+ timestamp: sequence,
150
+ kind: "user",
151
+ text: message.content,
152
+ };
153
+ byId.set(id, item);
154
+ order.push(id);
155
+ }
156
+ else {
157
+ const item = {
158
+ id,
159
+ sequence,
160
+ turnId: undefined,
161
+ timestamp: sequence,
162
+ kind: "assistant",
163
+ text: message.content,
164
+ streaming: false,
165
+ };
166
+ byId.set(id, item);
167
+ order.push(id);
168
+ }
169
+ }
170
+ return {
171
+ state: {
172
+ ...EMPTY_TRANSCRIPT_STATE,
173
+ order,
174
+ byId,
175
+ // See hydrateFromClassicTranscript — do not block the live sequencer.
176
+ lastSequence: 0,
177
+ },
178
+ toolOutputs: new Map(),
179
+ };
180
+ }
181
+ /**
182
+ * Snapshot the live v2 transcript into the classic shape for history.db so
183
+ * /history can restore tools + prompts next time (parity with classic clai).
184
+ */
185
+ export function serializeForHistory(state, toolOutput) {
186
+ const out = [];
187
+ for (const id of state.order) {
188
+ const item = state.byId.get(id);
189
+ if (!item)
190
+ continue;
191
+ switch (item.kind) {
192
+ case "user":
193
+ out.push({ kind: "user", id: item.id, text: item.text, done: true });
194
+ break;
195
+ case "assistant":
196
+ out.push({
197
+ kind: "assistant",
198
+ id: item.id,
199
+ text: item.text,
200
+ streaming: false,
201
+ done: true,
202
+ });
203
+ break;
204
+ case "thinking":
205
+ out.push({
206
+ kind: "thinking",
207
+ id: item.id,
208
+ content: item.content,
209
+ done: true,
210
+ });
211
+ break;
212
+ case "tool": {
213
+ const output = toolOutput(item.toolCallId);
214
+ out.push({
215
+ kind: "tool",
216
+ id: item.id,
217
+ name: item.name,
218
+ argsDisplay: item.argsDisplay,
219
+ output,
220
+ status: item.status === "failed"
221
+ ? "fail"
222
+ : item.status === "running"
223
+ ? "ok"
224
+ : item.status,
225
+ exitCode: item.exitCode,
226
+ summary: item.summary,
227
+ artifactPath: item.artifactPath,
228
+ done: true,
229
+ });
230
+ break;
231
+ }
232
+ case "notice":
233
+ out.push({
234
+ kind: "notice",
235
+ id: item.id,
236
+ level: item.level === "error" ? "warn" : item.level,
237
+ text: item.text,
238
+ done: true,
239
+ });
240
+ break;
241
+ case "compacted":
242
+ out.push({
243
+ kind: "compacted",
244
+ id: item.id,
245
+ summary: item.summary,
246
+ originalItems: [],
247
+ done: true,
248
+ });
249
+ break;
250
+ default:
251
+ break;
252
+ }
253
+ }
254
+ return out;
255
+ }
256
+ /** Strip the model framing prefix for display in the compacted card. */
257
+ export function displayCompactSummary(summary) {
258
+ const prefixes = [
259
+ "Session memory from compacted earlier turns:\n\n",
260
+ "Session memory from compacted earlier turns:",
261
+ "Session memory\n\n",
262
+ ];
263
+ let text = summary;
264
+ for (const prefix of prefixes) {
265
+ if (text.startsWith(prefix)) {
266
+ text = text.slice(prefix.length);
267
+ break;
268
+ }
269
+ }
270
+ return text.trim();
271
+ }
272
+ //# sourceMappingURL=transcript-hydrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-hydrate.js","sourceRoot":"","sources":["../../../src/tui-v2/state/transcript-hydrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
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 type { AnyAppEvent } from "../../app/events/app-event.js";
9
+ import type { TranscriptState } from "./transcript-types.js";
10
+ export declare function applyAppEvent(state: TranscriptState, event: AnyAppEvent): TranscriptState;