@pentoshi/clai 2.0.62 → 3.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (475) hide show
  1. package/README.md +262 -368
  2. package/dist/agent/classic-renderer.js +9 -1
  3. package/dist/agent/classic-renderer.js.map +1 -1
  4. package/dist/agent/context-manager.d.ts +5 -0
  5. package/dist/agent/context-manager.js +14 -2
  6. package/dist/agent/context-manager.js.map +1 -1
  7. package/dist/agent/events.d.ts +9 -1
  8. package/dist/agent/plan-tool.js +80 -8
  9. package/dist/agent/plan-tool.js.map +1 -1
  10. package/dist/agent/runner.js +261 -122
  11. package/dist/agent/runner.js.map +1 -1
  12. package/dist/agent/tool-call-parser.d.ts +20 -0
  13. package/dist/agent/tool-call-parser.js +186 -2
  14. package/dist/agent/tool-call-parser.js.map +1 -1
  15. package/dist/app/adapters/agent-event-adapter.d.ts +29 -0
  16. package/dist/app/adapters/agent-event-adapter.js +148 -0
  17. package/dist/app/adapters/agent-event-adapter.js.map +1 -0
  18. package/dist/app/adapters/current-agent-adapter.d.ts +7 -0
  19. package/dist/app/adapters/current-agent-adapter.js +27 -0
  20. package/dist/app/adapters/current-agent-adapter.js.map +1 -0
  21. package/dist/app/adapters/current-jobs-adapter.d.ts +4 -0
  22. package/dist/app/adapters/current-jobs-adapter.js +13 -0
  23. package/dist/app/adapters/current-jobs-adapter.js.map +1 -0
  24. package/dist/app/adapters/current-store-adapter.d.ts +3 -0
  25. package/dist/app/adapters/current-store-adapter.js +22 -0
  26. package/dist/app/adapters/current-store-adapter.js.map +1 -0
  27. package/dist/app/adapters/current-terminal-adapter.d.ts +9 -0
  28. package/dist/app/adapters/current-terminal-adapter.js +31 -0
  29. package/dist/app/adapters/current-terminal-adapter.js.map +1 -0
  30. package/dist/app/adapters/current-updates-adapter.d.ts +7 -0
  31. package/dist/app/adapters/current-updates-adapter.js +31 -0
  32. package/dist/app/adapters/current-updates-adapter.js.map +1 -0
  33. package/dist/app/adapters/in-memory-clipboard-adapter.d.ts +10 -0
  34. package/dist/app/adapters/in-memory-clipboard-adapter.js +20 -0
  35. package/dist/app/adapters/in-memory-clipboard-adapter.js.map +1 -0
  36. package/dist/app/commands/command.d.ts +24 -0
  37. package/dist/app/commands/command.js +4 -0
  38. package/dist/app/commands/command.js.map +1 -0
  39. package/dist/app/commands/registry.d.ts +45 -0
  40. package/dist/app/commands/registry.js +164 -0
  41. package/dist/app/commands/registry.js.map +1 -0
  42. package/dist/app/controllers/disposable.d.ts +15 -0
  43. package/dist/app/controllers/disposable.js +38 -0
  44. package/dist/app/controllers/disposable.js.map +1 -0
  45. package/dist/app/controllers/job-controller.d.ts +22 -0
  46. package/dist/app/controllers/job-controller.js +35 -0
  47. package/dist/app/controllers/job-controller.js.map +1 -0
  48. package/dist/app/controllers/plan-controller.d.ts +31 -0
  49. package/dist/app/controllers/plan-controller.js +69 -0
  50. package/dist/app/controllers/plan-controller.js.map +1 -0
  51. package/dist/app/controllers/session-controller.d.ts +167 -0
  52. package/dist/app/controllers/session-controller.js +467 -0
  53. package/dist/app/controllers/session-controller.js.map +1 -0
  54. package/dist/app/controllers/turn-controller.d.ts +52 -0
  55. package/dist/app/controllers/turn-controller.js +118 -0
  56. package/dist/app/controllers/turn-controller.js.map +1 -0
  57. package/dist/app/events/app-event.d.ts +122 -0
  58. package/dist/app/events/app-event.js +25 -0
  59. package/dist/app/events/app-event.js.map +1 -0
  60. package/dist/app/events/event-buffer.d.ts +51 -0
  61. package/dist/app/events/event-buffer.js +109 -0
  62. package/dist/app/events/event-buffer.js.map +1 -0
  63. package/dist/app/events/sequencer.d.ts +32 -0
  64. package/dist/app/events/sequencer.js +55 -0
  65. package/dist/app/events/sequencer.js.map +1 -0
  66. package/dist/app/ports/agent-port.d.ts +29 -0
  67. package/dist/app/ports/agent-port.js +2 -0
  68. package/dist/app/ports/agent-port.js.map +1 -0
  69. package/dist/app/ports/clipboard-port.d.ts +9 -0
  70. package/dist/app/ports/clipboard-port.js +2 -0
  71. package/dist/app/ports/clipboard-port.js.map +1 -0
  72. package/dist/app/ports/confirm-port.d.ts +17 -0
  73. package/dist/app/ports/confirm-port.js +2 -0
  74. package/dist/app/ports/confirm-port.js.map +1 -0
  75. package/dist/app/ports/jobs-port.d.ts +18 -0
  76. package/dist/app/ports/jobs-port.js +2 -0
  77. package/dist/app/ports/jobs-port.js.map +1 -0
  78. package/dist/app/ports/persistence-port.d.ts +21 -0
  79. package/dist/app/ports/persistence-port.js +2 -0
  80. package/dist/app/ports/persistence-port.js.map +1 -0
  81. package/dist/app/ports/secret-port.d.ts +12 -0
  82. package/dist/app/ports/secret-port.js +2 -0
  83. package/dist/app/ports/secret-port.js.map +1 -0
  84. package/dist/app/ports/terminal-port.d.ts +18 -0
  85. package/dist/app/ports/terminal-port.js +2 -0
  86. package/dist/app/ports/terminal-port.js.map +1 -0
  87. package/dist/app/ports/updates-port.d.ts +12 -0
  88. package/dist/app/ports/updates-port.js +2 -0
  89. package/dist/app/ports/updates-port.js.map +1 -0
  90. package/dist/commands/doctor.js +19 -0
  91. package/dist/commands/doctor.js.map +1 -1
  92. package/dist/commands/update.js +1 -1
  93. package/dist/commands/update.js.map +1 -1
  94. package/dist/index.js +47 -12
  95. package/dist/index.js.map +1 -1
  96. package/dist/llm/router.js +4 -2
  97. package/dist/llm/router.js.map +1 -1
  98. package/dist/prompts/index.d.ts +1 -1
  99. package/dist/prompts/index.js +11 -8
  100. package/dist/prompts/index.js.map +1 -1
  101. package/dist/repl/slash-commands.js +1 -1
  102. package/dist/repl/slash-commands.js.map +1 -1
  103. package/dist/repl.js +35 -107
  104. package/dist/repl.js.map +1 -1
  105. package/dist/store/config.js +3 -1
  106. package/dist/store/config.js.map +1 -1
  107. package/dist/store/history.d.ts +26 -2
  108. package/dist/store/history.js +383 -72
  109. package/dist/store/history.js.map +1 -1
  110. package/dist/store/logs.js +3 -3
  111. package/dist/store/logs.js.map +1 -1
  112. package/dist/store/paths.d.ts +6 -0
  113. package/dist/store/paths.js +38 -0
  114. package/dist/store/paths.js.map +1 -0
  115. package/dist/store/plan.js +8 -5
  116. package/dist/store/plan.js.map +1 -1
  117. package/dist/tools/fs.d.ts +6 -0
  118. package/dist/tools/fs.js +56 -6
  119. package/dist/tools/fs.js.map +1 -1
  120. package/dist/tools/jobs.js +2 -2
  121. package/dist/tools/jobs.js.map +1 -1
  122. package/dist/tools/registry.js +189 -67
  123. package/dist/tools/registry.js.map +1 -1
  124. package/dist/tools/shell.js +2 -2
  125. package/dist/tools/shell.js.map +1 -1
  126. package/dist/tui/runtime.d.ts +19 -0
  127. package/dist/tui/runtime.js +92 -0
  128. package/dist/tui/runtime.js.map +1 -0
  129. package/dist/tui/state.js +22 -17
  130. package/dist/tui/state.js.map +1 -1
  131. package/dist/tui-v2/actions/action-id.d.ts +14 -0
  132. package/dist/tui-v2/actions/action-id.js +109 -0
  133. package/dist/tui-v2/actions/action-id.js.map +1 -0
  134. package/dist/tui-v2/actions/action-router.d.ts +18 -0
  135. package/dist/tui-v2/actions/action-router.js +62 -0
  136. package/dist/tui-v2/actions/action-router.js.map +1 -0
  137. package/dist/tui-v2/actions/chord-from-key.d.ts +26 -0
  138. package/dist/tui-v2/actions/chord-from-key.js +45 -0
  139. package/dist/tui-v2/actions/chord-from-key.js.map +1 -0
  140. package/dist/tui-v2/actions/keymap.d.ts +24 -0
  141. package/dist/tui-v2/actions/keymap.js +134 -0
  142. package/dist/tui-v2/actions/keymap.js.map +1 -0
  143. package/dist/tui-v2/app/App.d.ts +13 -0
  144. package/dist/tui-v2/app/App.js +332 -0
  145. package/dist/tui-v2/app/App.js.map +1 -0
  146. package/dist/tui-v2/app/command-handlers.d.ts +8 -0
  147. package/dist/tui-v2/app/command-handlers.js +66 -0
  148. package/dist/tui-v2/app/command-handlers.js.map +1 -0
  149. package/dist/tui-v2/app/commands/config-commands.d.ts +14 -0
  150. package/dist/tui-v2/app/commands/config-commands.js +161 -0
  151. package/dist/tui-v2/app/commands/config-commands.js.map +1 -0
  152. package/dist/tui-v2/app/commands/key-commands.d.ts +9 -0
  153. package/dist/tui-v2/app/commands/key-commands.js +263 -0
  154. package/dist/tui-v2/app/commands/key-commands.js.map +1 -0
  155. package/dist/tui-v2/app/commands/picker-commands.d.ts +24 -0
  156. package/dist/tui-v2/app/commands/picker-commands.js +423 -0
  157. package/dist/tui-v2/app/commands/picker-commands.js.map +1 -0
  158. package/dist/tui-v2/app/commands/session-commands.d.ts +19 -0
  159. package/dist/tui-v2/app/commands/session-commands.js +162 -0
  160. package/dist/tui-v2/app/commands/session-commands.js.map +1 -0
  161. package/dist/tui-v2/app/plan-lifecycle.d.ts +22 -0
  162. package/dist/tui-v2/app/plan-lifecycle.js +95 -0
  163. package/dist/tui-v2/app/plan-lifecycle.js.map +1 -0
  164. package/dist/tui-v2/app/providers.d.ts +17 -0
  165. package/dist/tui-v2/app/providers.js +32 -0
  166. package/dist/tui-v2/app/providers.js.map +1 -0
  167. package/dist/tui-v2/bootstrap/capabilities.d.ts +35 -0
  168. package/dist/tui-v2/bootstrap/capabilities.js +93 -0
  169. package/dist/tui-v2/bootstrap/capabilities.js.map +1 -0
  170. package/dist/tui-v2/bootstrap/composition-root.d.ts +85 -0
  171. package/dist/tui-v2/bootstrap/composition-root.js +131 -0
  172. package/dist/tui-v2/bootstrap/composition-root.js.map +1 -0
  173. package/dist/tui-v2/bootstrap/disable-native-selection.d.ts +11 -0
  174. package/dist/tui-v2/bootstrap/disable-native-selection.js +13 -0
  175. package/dist/tui-v2/bootstrap/disable-native-selection.js.map +1 -0
  176. package/dist/tui-v2/bootstrap/lifecycle.d.ts +62 -0
  177. package/dist/tui-v2/bootstrap/lifecycle.js +123 -0
  178. package/dist/tui-v2/bootstrap/lifecycle.js.map +1 -0
  179. package/dist/tui-v2/bootstrap/osc52-clipboard.d.ts +28 -0
  180. package/dist/tui-v2/bootstrap/osc52-clipboard.js +44 -0
  181. package/dist/tui-v2/bootstrap/osc52-clipboard.js.map +1 -0
  182. package/dist/tui-v2/bootstrap/overlay-ports.d.ts +12 -0
  183. package/dist/{tui/confirm.js → tui-v2/bootstrap/overlay-ports.js} +17 -25
  184. package/dist/tui-v2/bootstrap/overlay-ports.js.map +1 -0
  185. package/dist/tui-v2/bootstrap/pager-export.d.ts +24 -0
  186. package/dist/tui-v2/bootstrap/pager-export.js +87 -0
  187. package/dist/tui-v2/bootstrap/pager-export.js.map +1 -0
  188. package/dist/tui-v2/bootstrap/start-tui-v2.d.ts +15 -0
  189. package/dist/tui-v2/bootstrap/start-tui-v2.js +95 -0
  190. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -0
  191. package/dist/tui-v2/bootstrap/ui-selection.d.ts +30 -0
  192. package/dist/tui-v2/bootstrap/ui-selection.js +59 -0
  193. package/dist/tui-v2/bootstrap/ui-selection.js.map +1 -0
  194. package/dist/tui-v2/components/completion/completion-menu.d.ts +23 -0
  195. package/dist/tui-v2/components/completion/completion-menu.js +84 -0
  196. package/dist/tui-v2/components/completion/completion-menu.js.map +1 -0
  197. package/dist/tui-v2/components/jobs/jobs-panel.d.ts +16 -0
  198. package/dist/tui-v2/components/jobs/jobs-panel.js +92 -0
  199. package/dist/tui-v2/components/jobs/jobs-panel.js.map +1 -0
  200. package/dist/tui-v2/components/modal/confirm-modal.d.ts +20 -0
  201. package/dist/tui-v2/components/modal/confirm-modal.js +110 -0
  202. package/dist/tui-v2/components/modal/confirm-modal.js.map +1 -0
  203. package/dist/tui-v2/components/modal/prompt-actions-modal.d.ts +15 -0
  204. package/dist/tui-v2/components/modal/prompt-actions-modal.js +80 -0
  205. package/dist/tui-v2/components/modal/prompt-actions-modal.js.map +1 -0
  206. package/dist/tui-v2/components/modal/secret-modal.d.ts +18 -0
  207. package/dist/tui-v2/components/modal/secret-modal.js +50 -0
  208. package/dist/tui-v2/components/modal/secret-modal.js.map +1 -0
  209. package/dist/tui-v2/components/overlay/overlay-host.d.ts +26 -0
  210. package/dist/tui-v2/components/overlay/overlay-host.js +43 -0
  211. package/dist/tui-v2/components/overlay/overlay-host.js.map +1 -0
  212. package/dist/tui-v2/components/pager/pager.d.ts +20 -0
  213. package/dist/tui-v2/components/pager/pager.js +396 -0
  214. package/dist/tui-v2/components/pager/pager.js.map +1 -0
  215. package/dist/tui-v2/components/picker/picker.d.ts +17 -0
  216. package/dist/tui-v2/components/picker/picker.js +222 -0
  217. package/dist/tui-v2/components/picker/picker.js.map +1 -0
  218. package/dist/tui-v2/components/plan/plan-view.d.ts +20 -0
  219. package/dist/tui-v2/components/plan/plan-view.js +120 -0
  220. package/dist/tui-v2/components/plan/plan-view.js.map +1 -0
  221. package/dist/tui-v2/components/queue/queue-panel.d.ts +23 -0
  222. package/dist/tui-v2/components/queue/queue-panel.js +58 -0
  223. package/dist/tui-v2/components/queue/queue-panel.js.map +1 -0
  224. package/dist/tui-v2/components/status/status-line.d.ts +27 -0
  225. package/dist/tui-v2/components/status/status-line.js +167 -0
  226. package/dist/tui-v2/components/status/status-line.js.map +1 -0
  227. package/dist/tui-v2/components/toast/toast-host.d.ts +15 -0
  228. package/dist/tui-v2/components/toast/toast-host.js +48 -0
  229. package/dist/tui-v2/components/toast/toast-host.js.map +1 -0
  230. package/dist/tui-v2/components/transcript/assistant-message.d.ts +20 -0
  231. package/dist/tui-v2/components/transcript/assistant-message.js +41 -0
  232. package/dist/tui-v2/components/transcript/assistant-message.js.map +1 -0
  233. package/dist/tui-v2/components/transcript/compacted-row.d.ts +19 -0
  234. package/dist/tui-v2/components/transcript/compacted-row.js +69 -0
  235. package/dist/tui-v2/components/transcript/compacted-row.js.map +1 -0
  236. package/dist/tui-v2/components/transcript/intro-card.d.ts +19 -0
  237. package/dist/tui-v2/components/transcript/intro-card.js +50 -0
  238. package/dist/tui-v2/components/transcript/intro-card.js.map +1 -0
  239. package/dist/tui-v2/components/transcript/linkable-text.d.ts +21 -0
  240. package/dist/tui-v2/components/transcript/linkable-text.js +46 -0
  241. package/dist/tui-v2/components/transcript/linkable-text.js.map +1 -0
  242. package/dist/tui-v2/components/transcript/notice-row.d.ts +14 -0
  243. package/dist/tui-v2/components/transcript/notice-row.js +40 -0
  244. package/dist/tui-v2/components/transcript/notice-row.js.map +1 -0
  245. package/dist/tui-v2/components/transcript/search-bar.d.ts +19 -0
  246. package/dist/tui-v2/components/transcript/search-bar.js +7 -0
  247. package/dist/tui-v2/components/transcript/search-bar.js.map +1 -0
  248. package/dist/tui-v2/components/transcript/thinking-block.d.ts +22 -0
  249. package/dist/tui-v2/components/transcript/thinking-block.js +27 -0
  250. package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -0
  251. package/dist/tui-v2/components/transcript/tool-card.d.ts +26 -0
  252. package/dist/tui-v2/components/transcript/tool-card.js +205 -0
  253. package/dist/tui-v2/components/transcript/tool-card.js.map +1 -0
  254. package/dist/tui-v2/components/transcript/transcript-row.d.ts +25 -0
  255. package/dist/tui-v2/components/transcript/transcript-row.js +37 -0
  256. package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -0
  257. package/dist/tui-v2/components/transcript/transcript-scroll-port.d.ts +52 -0
  258. package/dist/tui-v2/components/transcript/transcript-scroll-port.js +86 -0
  259. package/dist/tui-v2/components/transcript/transcript-scroll-port.js.map +1 -0
  260. package/dist/tui-v2/components/transcript/transcript-view.d.ts +24 -0
  261. package/dist/tui-v2/components/transcript/transcript-view.js +403 -0
  262. package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -0
  263. package/dist/tui-v2/components/transcript/use-click-without-drag.d.ts +13 -0
  264. package/dist/tui-v2/components/transcript/use-click-without-drag.js +35 -0
  265. package/dist/tui-v2/components/transcript/use-click-without-drag.js.map +1 -0
  266. package/dist/tui-v2/components/transcript/use-native-selection-copy.d.ts +10 -0
  267. package/dist/tui-v2/components/transcript/use-native-selection-copy.js +37 -0
  268. package/dist/tui-v2/components/transcript/use-native-selection-copy.js.map +1 -0
  269. package/dist/tui-v2/components/transcript/use-transcript-selection.d.ts +23 -0
  270. package/dist/tui-v2/components/transcript/use-transcript-selection.js +136 -0
  271. package/dist/tui-v2/components/transcript/use-transcript-selection.js.map +1 -0
  272. package/dist/tui-v2/components/transcript/user-message.d.ts +10 -0
  273. package/dist/tui-v2/components/transcript/user-message.js +23 -0
  274. package/dist/tui-v2/components/transcript/user-message.js.map +1 -0
  275. package/dist/tui-v2/composer/arrow-intent.d.ts +23 -0
  276. package/dist/tui-v2/composer/arrow-intent.js +35 -0
  277. package/dist/tui-v2/composer/arrow-intent.js.map +1 -0
  278. package/dist/tui-v2/composer/completion.d.ts +37 -0
  279. package/dist/tui-v2/composer/completion.js +67 -0
  280. package/dist/tui-v2/composer/completion.js.map +1 -0
  281. package/dist/tui-v2/composer/composer-editor.d.ts +33 -0
  282. package/dist/tui-v2/composer/composer-editor.js +620 -0
  283. package/dist/tui-v2/composer/composer-editor.js.map +1 -0
  284. package/dist/tui-v2/composer/composer-height.d.ts +21 -0
  285. package/dist/tui-v2/composer/composer-height.js +29 -0
  286. package/dist/tui-v2/composer/composer-height.js.map +1 -0
  287. package/dist/tui-v2/composer/composer-meta.d.ts +9 -0
  288. package/dist/tui-v2/composer/composer-meta.js +38 -0
  289. package/dist/tui-v2/composer/composer-meta.js.map +1 -0
  290. package/dist/tui-v2/composer/history-nav.d.ts +15 -0
  291. package/dist/tui-v2/composer/history-nav.js +16 -0
  292. package/dist/tui-v2/composer/history-nav.js.map +1 -0
  293. package/dist/tui-v2/composer/newline-hint.d.ts +13 -0
  294. package/dist/tui-v2/composer/newline-hint.js +13 -0
  295. package/dist/tui-v2/composer/newline-hint.js.map +1 -0
  296. package/dist/tui-v2/composer/paste-placeholder.d.ts +35 -0
  297. package/dist/tui-v2/composer/paste-placeholder.js +55 -0
  298. package/dist/tui-v2/composer/paste-placeholder.js.map +1 -0
  299. package/dist/tui-v2/composer/prompt-history.d.ts +22 -0
  300. package/dist/tui-v2/composer/prompt-history.js +51 -0
  301. package/dist/tui-v2/composer/prompt-history.js.map +1 -0
  302. package/dist/tui-v2/composer/secret-buffer.d.ts +20 -0
  303. package/dist/tui-v2/composer/secret-buffer.js +42 -0
  304. package/dist/tui-v2/composer/secret-buffer.js.map +1 -0
  305. package/dist/tui-v2/composer/textarea-keybindings.d.ts +22 -0
  306. package/dist/tui-v2/composer/textarea-keybindings.js +27 -0
  307. package/dist/tui-v2/composer/textarea-keybindings.js.map +1 -0
  308. package/dist/tui-v2/controllers/focus-controller.d.ts +30 -0
  309. package/dist/tui-v2/controllers/focus-controller.js +80 -0
  310. package/dist/tui-v2/controllers/focus-controller.js.map +1 -0
  311. package/dist/tui-v2/controllers/overlay-controller.d.ts +99 -0
  312. package/dist/tui-v2/controllers/overlay-controller.js +195 -0
  313. package/dist/tui-v2/controllers/overlay-controller.js.map +1 -0
  314. package/dist/tui-v2/controllers/selection-controller.d.ts +76 -0
  315. package/dist/tui-v2/controllers/selection-controller.js +238 -0
  316. package/dist/tui-v2/controllers/selection-controller.js.map +1 -0
  317. package/dist/tui-v2/controllers/toast-controller.d.ts +35 -0
  318. package/dist/tui-v2/controllers/toast-controller.js +88 -0
  319. package/dist/tui-v2/controllers/toast-controller.js.map +1 -0
  320. package/dist/tui-v2/layout/compute-layout.d.ts +59 -0
  321. package/dist/tui-v2/layout/compute-layout.js +170 -0
  322. package/dist/tui-v2/layout/compute-layout.js.map +1 -0
  323. package/dist/tui-v2/rendering/ansi-to-styled.d.ts +17 -0
  324. package/dist/tui-v2/rendering/ansi-to-styled.js +217 -0
  325. package/dist/tui-v2/rendering/ansi-to-styled.js.map +1 -0
  326. package/dist/tui-v2/rendering/batch-sections.d.ts +57 -0
  327. package/dist/tui-v2/rendering/batch-sections.js +177 -0
  328. package/dist/tui-v2/rendering/batch-sections.js.map +1 -0
  329. package/dist/tui-v2/rendering/link-detector.d.ts +16 -0
  330. package/dist/tui-v2/rendering/link-detector.js +43 -0
  331. package/dist/tui-v2/rendering/link-detector.js.map +1 -0
  332. package/dist/tui-v2/rendering/open-tool-output.d.ts +28 -0
  333. package/dist/tui-v2/rendering/open-tool-output.js +138 -0
  334. package/dist/tui-v2/rendering/open-tool-output.js.map +1 -0
  335. package/dist/tui-v2/rendering/picker-filter.d.ts +22 -0
  336. package/dist/tui-v2/rendering/picker-filter.js +68 -0
  337. package/dist/tui-v2/rendering/picker-filter.js.map +1 -0
  338. package/dist/tui-v2/rendering/plan-view.d.ts +32 -0
  339. package/dist/tui-v2/rendering/plan-view.js +196 -0
  340. package/dist/tui-v2/rendering/plan-view.js.map +1 -0
  341. package/dist/tui-v2/rendering/render-markdown-lines.d.ts +29 -0
  342. package/dist/tui-v2/rendering/render-markdown-lines.js +46 -0
  343. package/dist/tui-v2/rendering/render-markdown-lines.js.map +1 -0
  344. package/dist/tui-v2/rendering/sanitize-display.d.ts +13 -0
  345. package/dist/tui-v2/rendering/sanitize-display.js +24 -0
  346. package/dist/tui-v2/rendering/sanitize-display.js.map +1 -0
  347. package/dist/tui-v2/rendering/strip-tool-surfaces.d.ts +10 -0
  348. package/dist/tui-v2/rendering/strip-tool-surfaces.js +32 -0
  349. package/dist/tui-v2/rendering/strip-tool-surfaces.js.map +1 -0
  350. package/dist/tui-v2/rendering/theme.d.ts +67 -0
  351. package/dist/tui-v2/rendering/theme.js +74 -0
  352. package/dist/tui-v2/rendering/theme.js.map +1 -0
  353. package/dist/tui-v2/rendering/tool-presenter.d.ts +39 -0
  354. package/dist/tui-v2/rendering/tool-presenter.js +209 -0
  355. package/dist/tui-v2/rendering/tool-presenter.js.map +1 -0
  356. package/dist/tui-v2/rendering/transcript-export.d.ts +11 -0
  357. package/dist/tui-v2/rendering/transcript-export.js +18 -0
  358. package/dist/tui-v2/rendering/transcript-export.js.map +1 -0
  359. package/dist/tui-v2/rendering/transcript-semantic.d.ts +17 -0
  360. package/dist/tui-v2/rendering/transcript-semantic.js +67 -0
  361. package/dist/tui-v2/rendering/transcript-semantic.js.map +1 -0
  362. package/dist/tui-v2/state/pager-search.d.ts +22 -0
  363. package/dist/tui-v2/state/pager-search.js +78 -0
  364. package/dist/tui-v2/state/pager-search.js.map +1 -0
  365. package/dist/tui-v2/state/semantic-document.d.ts +34 -0
  366. package/dist/tui-v2/state/semantic-document.js +201 -0
  367. package/dist/tui-v2/state/semantic-document.js.map +1 -0
  368. package/dist/tui-v2/state/transcript-compaction.d.ts +24 -0
  369. package/dist/tui-v2/state/transcript-compaction.js +79 -0
  370. package/dist/tui-v2/state/transcript-compaction.js.map +1 -0
  371. package/dist/tui-v2/state/transcript-hydrate.d.ts +27 -0
  372. package/dist/tui-v2/state/transcript-hydrate.js +276 -0
  373. package/dist/tui-v2/state/transcript-hydrate.js.map +1 -0
  374. package/dist/tui-v2/state/transcript-reducer.d.ts +10 -0
  375. package/dist/tui-v2/state/transcript-reducer.js +339 -0
  376. package/dist/tui-v2/state/transcript-reducer.js.map +1 -0
  377. package/dist/tui-v2/state/transcript-search.d.ts +17 -0
  378. package/dist/tui-v2/state/transcript-search.js +38 -0
  379. package/dist/tui-v2/state/transcript-search.js.map +1 -0
  380. package/dist/tui-v2/state/transcript-store.d.ts +32 -0
  381. package/dist/tui-v2/state/transcript-store.js +66 -0
  382. package/dist/tui-v2/state/transcript-store.js.map +1 -0
  383. package/dist/tui-v2/state/transcript-struct.d.ts +15 -0
  384. package/dist/tui-v2/state/transcript-struct.js +133 -0
  385. package/dist/tui-v2/state/transcript-struct.js.map +1 -0
  386. package/dist/tui-v2/state/transcript-types.d.ts +76 -0
  387. package/dist/tui-v2/state/transcript-types.js +65 -0
  388. package/dist/tui-v2/state/transcript-types.js.map +1 -0
  389. package/dist/tui-v2/state/use-overlay.d.ts +3 -0
  390. package/dist/tui-v2/state/use-overlay.js +6 -0
  391. package/dist/tui-v2/state/use-overlay.js.map +1 -0
  392. package/dist/tui-v2/state/use-plan.d.ts +4 -0
  393. package/dist/tui-v2/state/use-plan.js +6 -0
  394. package/dist/tui-v2/state/use-plan.js.map +1 -0
  395. package/dist/tui-v2/state/use-session-state.d.ts +2 -0
  396. package/dist/tui-v2/state/use-session-state.js +7 -0
  397. package/dist/tui-v2/state/use-session-state.js.map +1 -0
  398. package/dist/tui-v2/state/use-toast.d.ts +3 -0
  399. package/dist/tui-v2/state/use-toast.js +15 -0
  400. package/dist/tui-v2/state/use-toast.js.map +1 -0
  401. package/dist/tui-v2/state/use-transcript-store.d.ts +10 -0
  402. package/dist/tui-v2/state/use-transcript-store.js +12 -0
  403. package/dist/tui-v2/state/use-transcript-store.js.map +1 -0
  404. package/dist/ui/intro-card.js +3 -3
  405. package/dist/ui/intro-card.js.map +1 -1
  406. package/dist/ui/intro-header.d.ts +23 -0
  407. package/dist/ui/intro-header.js +232 -0
  408. package/dist/ui/intro-header.js.map +1 -0
  409. package/dist/ui/markdown.js +0 -1
  410. package/dist/ui/markdown.js.map +1 -1
  411. package/dist/ui/mentions.d.ts +9 -2
  412. package/dist/ui/mentions.js +102 -4
  413. package/dist/ui/mentions.js.map +1 -1
  414. package/dist/ui/output-pane.js +1 -1
  415. package/dist/ui/output-pane.js.map +1 -1
  416. package/dist/ui/plan-pane.d.ts +8 -0
  417. package/dist/ui/plan-pane.js +38 -0
  418. package/dist/ui/plan-pane.js.map +1 -1
  419. package/dist/ui/wordmark.d.ts +5 -0
  420. package/dist/ui/wordmark.js +6 -1
  421. package/dist/ui/wordmark.js.map +1 -1
  422. package/package.json +25 -12
  423. package/dist/tui/App.d.ts +0 -12
  424. package/dist/tui/App.js +0 -2174
  425. package/dist/tui/App.js.map +0 -1
  426. package/dist/tui/components/ConfirmModal.d.ts +0 -9
  427. package/dist/tui/components/ConfirmModal.js +0 -55
  428. package/dist/tui/components/ConfirmModal.js.map +0 -1
  429. package/dist/tui/components/JobsPanel.d.ts +0 -11
  430. package/dist/tui/components/JobsPanel.js +0 -55
  431. package/dist/tui/components/JobsPanel.js.map +0 -1
  432. package/dist/tui/components/Pager.d.ts +0 -14
  433. package/dist/tui/components/Pager.js +0 -56
  434. package/dist/tui/components/Pager.js.map +0 -1
  435. package/dist/tui/components/PickerPanel.d.ts +0 -15
  436. package/dist/tui/components/PickerPanel.js +0 -126
  437. package/dist/tui/components/PickerPanel.js.map +0 -1
  438. package/dist/tui/components/PlanSidebar.d.ts +0 -6
  439. package/dist/tui/components/PlanSidebar.js +0 -99
  440. package/dist/tui/components/PlanSidebar.js.map +0 -1
  441. package/dist/tui/components/SecretInputPanel.d.ts +0 -7
  442. package/dist/tui/components/SecretInputPanel.js +0 -38
  443. package/dist/tui/components/SecretInputPanel.js.map +0 -1
  444. package/dist/tui/confirm.d.ts +0 -16
  445. package/dist/tui/confirm.js.map +0 -1
  446. package/dist/tui/default.d.ts +0 -6
  447. package/dist/tui/default.js +0 -11
  448. package/dist/tui/default.js.map +0 -1
  449. package/dist/tui/hooks/useAgentRunner.d.ts +0 -73
  450. package/dist/tui/hooks/useAgentRunner.js +0 -277
  451. package/dist/tui/hooks/useAgentRunner.js.map +0 -1
  452. package/dist/tui/hooks/useJobs.d.ts +0 -7
  453. package/dist/tui/hooks/useJobs.js +0 -39
  454. package/dist/tui/hooks/useJobs.js.map +0 -1
  455. package/dist/tui/hooks/useSpinner.d.ts +0 -5
  456. package/dist/tui/hooks/useSpinner.js +0 -21
  457. package/dist/tui/hooks/useSpinner.js.map +0 -1
  458. package/dist/tui/hooks/useTerminalSize.d.ts +0 -9
  459. package/dist/tui/hooks/useTerminalSize.js +0 -26
  460. package/dist/tui/hooks/useTerminalSize.js.map +0 -1
  461. package/dist/tui/index.d.ts +0 -10
  462. package/dist/tui/index.js +0 -37
  463. package/dist/tui/index.js.map +0 -1
  464. package/dist/tui/key-intent.d.ts +0 -36
  465. package/dist/tui/key-intent.js +0 -54
  466. package/dist/tui/key-intent.js.map +0 -1
  467. package/dist/tui/mouse.d.ts +0 -8
  468. package/dist/tui/mouse.js +0 -34
  469. package/dist/tui/mouse.js.map +0 -1
  470. package/dist/tui/plan-sidebar-lines.d.ts +0 -2
  471. package/dist/tui/plan-sidebar-lines.js +0 -140
  472. package/dist/tui/plan-sidebar-lines.js.map +0 -1
  473. package/dist/tui/render-lines.d.ts +0 -22
  474. package/dist/tui/render-lines.js +0 -611
  475. package/dist/tui/render-lines.js.map +0 -1
@@ -0,0 +1,148 @@
1
+ import { asPlanId, asToolCallId, } from "../events/app-event.js";
2
+ const STEP_STATUS = /^step (\d+)$/;
3
+ /**
4
+ * Translates the legacy `AgentEvent` stream (the agent's unchanged emitter
5
+ * contract) into versioned `AppEvent` envelopes (V2-021). Pure translation: it
6
+ * mints no side effects beyond appending tool output to the injected spool and
7
+ * emitting envelopes. Given the same input events, id factory, and clock it
8
+ * produces byte-identical output, which the replay contract test relies on.
9
+ */
10
+ export class AgentEventAdapter {
11
+ sequencer;
12
+ spool;
13
+ emit;
14
+ turnId;
15
+ constructor(sequencer, spool, emit) {
16
+ this.sequencer = sequencer;
17
+ this.spool = spool;
18
+ this.emit = emit;
19
+ }
20
+ /** Bind subsequent events to a turn; pass undefined for session-level events. */
21
+ setTurn(turnId) {
22
+ this.turnId = turnId;
23
+ }
24
+ ingest(event) {
25
+ switch (event.type) {
26
+ case "turn-start":
27
+ this.push("turn-started", { prompt: event.prompt });
28
+ return;
29
+ case "status": {
30
+ const match = STEP_STATUS.exec(event.text);
31
+ this.push("status", {
32
+ text: event.text,
33
+ step: match ? Number(match[1]) : undefined,
34
+ });
35
+ return;
36
+ }
37
+ case "thinking-delta":
38
+ this.push("thinking-delta", { text: event.text });
39
+ return;
40
+ case "thinking-block":
41
+ this.push("thinking-block", {
42
+ messageId: this.sequencer.ids.message(),
43
+ content: event.content,
44
+ });
45
+ return;
46
+ case "assistant-delta":
47
+ this.push("assistant-delta", { text: event.text });
48
+ return;
49
+ case "assistant-message":
50
+ this.push("assistant-message", {
51
+ messageId: this.sequencer.ids.message(),
52
+ text: event.text,
53
+ });
54
+ return;
55
+ case "notice":
56
+ this.push("notice", { level: event.level, text: event.text });
57
+ return;
58
+ case "tool-call":
59
+ this.push("tool-call", {
60
+ toolCallId: this.toolCallId(event.id),
61
+ name: event.name,
62
+ argsDisplay: event.argsDisplay,
63
+ });
64
+ return;
65
+ case "tool-start":
66
+ this.push("tool-started", {
67
+ toolCallId: this.toolCallId(event.id),
68
+ });
69
+ return;
70
+ case "tool-output": {
71
+ const id = this.toolCallId(event.id);
72
+ const ref = event.replace
73
+ ? this.spool.replace(id, event.chunk)
74
+ : this.spool.append(id, event.chunk);
75
+ this.push("tool-output", { ref });
76
+ return;
77
+ }
78
+ case "tool-result":
79
+ this.push("tool-result", {
80
+ toolCallId: this.toolCallId(event.id),
81
+ ok: event.ok,
82
+ exitCode: event.exitCode,
83
+ summary: event.summary,
84
+ artifactPath: event.artifactPath,
85
+ });
86
+ return;
87
+ case "tool-blocked":
88
+ this.push("tool-blocked", {
89
+ toolCallId: this.toolCallId(event.id),
90
+ name: event.name,
91
+ reason: event.reason,
92
+ });
93
+ return;
94
+ case "plan-update":
95
+ this.push("plan-updated", {
96
+ planId: asPlanId(event.plan.sessionId),
97
+ plan: event.plan,
98
+ });
99
+ return;
100
+ case "confirm-request":
101
+ this.push("confirm-requested", {
102
+ requestId: event.id,
103
+ kind: event.kind,
104
+ prompt: event.prompt,
105
+ });
106
+ return;
107
+ case "compacted":
108
+ this.push("compacted", {
109
+ summary: event.summary,
110
+ beforeTokens: event.beforeTokens,
111
+ afterTokens: event.afterTokens,
112
+ });
113
+ return;
114
+ case "turn-end":
115
+ this.push("turn-ended", {
116
+ finalAnswer: event.finalAnswer,
117
+ steps: event.steps,
118
+ });
119
+ return;
120
+ case "turn-aborted":
121
+ this.push("turn-aborted", {});
122
+ return;
123
+ case "turn-error":
124
+ this.push("turn-error", { message: event.message });
125
+ return;
126
+ default: {
127
+ const unreachable = event;
128
+ throw new Error(`unhandled AgentEvent: ${JSON.stringify(unreachable)}`);
129
+ }
130
+ }
131
+ }
132
+ push(type, payload) {
133
+ // `build` returns a correctly typed AppEvent<K, ...>, but TypeScript cannot
134
+ // prove a generic member is assignable to the distributive `AnyAppEvent`
135
+ // union; the narrowing is sound because K ranges over the same keys.
136
+ this.emit(this.sequencer.build(type, payload, this.turnId));
137
+ }
138
+ /**
139
+ * Legacy agents restart their display counter at `tool-1` for every turn.
140
+ * It is only locally unique, while the transcript and output spool retain a
141
+ * whole session. Namespace it at the application boundary so tool rows and
142
+ * output stay correlated without ever reusing a semantic document id.
143
+ */
144
+ toolCallId(sourceId) {
145
+ return asToolCallId(this.turnId ? `${this.turnId}:${sourceId}` : sourceId);
146
+ }
147
+ }
148
+ //# sourceMappingURL=agent-event-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-event-adapter.js","sourceRoot":"","sources":["../../../src/app/adapters/agent-event-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { AgentPort } from "../ports/agent-port.js";
2
+ /**
3
+ * Wraps the existing `runAgentLoop` behind `AgentPort` without altering agent
4
+ * semantics (CORE-001). Readonly request arrays are copied to the mutable
5
+ * shapes the runner expects.
6
+ */
7
+ export declare function createCurrentAgentPort(): AgentPort;
@@ -0,0 +1,27 @@
1
+ import { runAgentLoop } from "../../agent/runner.js";
2
+ /**
3
+ * Wraps the existing `runAgentLoop` behind `AgentPort` without altering agent
4
+ * semantics (CORE-001). Readonly request arrays are copied to the mutable
5
+ * shapes the runner expects.
6
+ */
7
+ export function createCurrentAgentPort() {
8
+ return {
9
+ runTurn(request, handlers) {
10
+ return runAgentLoop(request.prompt, {
11
+ provider: request.provider,
12
+ model: request.model,
13
+ history: request.history ? [...request.history] : undefined,
14
+ images: request.images ? [...request.images] : undefined,
15
+ autoConfirm: request.autoConfirm,
16
+ maxSteps: request.maxSteps,
17
+ onEvent: handlers.onEvent,
18
+ onMessages: handlers.onMessages,
19
+ signal: handlers.signal,
20
+ confirm: handlers.confirm,
21
+ requestSecret: handlers.requestSecret,
22
+ session: handlers.session,
23
+ });
24
+ },
25
+ };
26
+ }
27
+ //# sourceMappingURL=current-agent-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current-agent-adapter.js","sourceRoot":"","sources":["../../../src/app/adapters/current-agent-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD;;;;GAIG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,OAAO,CAAC,OAAO,EAAE,QAAQ;YACvB,OAAO,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE;gBAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC3D,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;gBACxD,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,aAAa,EAAE,QAAQ,CAAC,aAAa;gBACrC,OAAO,EAAE,QAAQ,CAAC,OAAO;aAC1B,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type JobManager } from "../../tools/jobs.js";
2
+ import type { JobsPort } from "../ports/jobs-port.js";
3
+ /** Backs `JobsPort` with the shared background-job manager. */
4
+ export declare function createCurrentJobsPort(manager?: JobManager): JobsPort;
@@ -0,0 +1,13 @@
1
+ import { jobManager } from "../../tools/jobs.js";
2
+ /** Backs `JobsPort` with the shared background-job manager. */
3
+ export function createCurrentJobsPort(manager = jobManager) {
4
+ return {
5
+ list: () => manager.listJobs(),
6
+ running: () => manager.getRunningJobs(),
7
+ get: (id) => manager.getJob(id),
8
+ tail: (id, bytes) => manager.tailJob(id, bytes),
9
+ stop: (id) => manager.stopJob(id),
10
+ start: (command, options) => manager.startJob(command, options),
11
+ };
12
+ }
13
+ //# sourceMappingURL=current-jobs-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current-jobs-adapter.js","sourceRoot":"","sources":["../../../src/app/adapters/current-jobs-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAmB,MAAM,qBAAqB,CAAC;AAGlE,+DAA+D;AAC/D,MAAM,UAAU,qBAAqB,CAAC,UAAsB,UAAU;IACpE,OAAO;QACL,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE;QAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE;QACvC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC;QAC/C,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;KAChE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PersistencePort } from "../ports/persistence-port.js";
2
+ /** Backs `PersistencePort` with the existing history + plan stores. */
3
+ export declare function createCurrentPersistencePort(): PersistencePort;
@@ -0,0 +1,22 @@
1
+ import { saveSession, upsertSession } from "../../store/history.js";
2
+ import { deletePlan, loadPlan, savePlan } from "../../store/plan.js";
3
+ /** Backs `PersistencePort` with the existing history + plan stores. */
4
+ export function createCurrentPersistencePort() {
5
+ return {
6
+ async saveSession(messages, options) {
7
+ const list = [...messages];
8
+ const transcript = options?.transcript
9
+ ? [...options.transcript]
10
+ : undefined;
11
+ if (options?.sessionId) {
12
+ await upsertSession(options.sessionId, list, options.name, transcript);
13
+ return;
14
+ }
15
+ await saveSession(list, options?.name, transcript);
16
+ },
17
+ loadPlan: (sessionId) => loadPlan(sessionId),
18
+ savePlan: (plan) => savePlan(plan),
19
+ deletePlan: (sessionId) => deletePlan(sessionId),
20
+ };
21
+ }
22
+ //# sourceMappingURL=current-store-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current-store-adapter.js","sourceRoot":"","sources":["../../../src/app/adapters/current-store-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAIrE,uEAAuE;AACvE,MAAM,UAAU,4BAA4B;IAC1C,OAAO;QACL,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO;YACjC,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;YAC3B,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU;gBACpC,CAAC,CAAE,CAAC,GAAG,OAAO,CAAC,UAAU,CAAsB;gBAC/C,CAAC,CAAC,SAAS,CAAC;YACd,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;gBACvB,MAAM,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;YACD,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC;QACD,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC5C,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;QAClC,UAAU,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;KACjD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { TerminalPort } from "../ports/terminal-port.js";
2
+ /**
3
+ * Reads terminal capabilities from the process streams. This adapter is the
4
+ * single sanctioned place to inspect the terminal; components receive
5
+ * dimensions/capabilities through it rather than reading `process.stdout`.
6
+ * `canDistinguishShiftEnter` is conservatively false until the renderer's
7
+ * keyboard-protocol detection (Phase 3/4) can prove otherwise.
8
+ */
9
+ export declare function createCurrentTerminalPort(): TerminalPort;
@@ -0,0 +1,31 @@
1
+ function detectColorMode() {
2
+ if (process.env.NO_COLOR !== undefined)
3
+ return "none";
4
+ if (/truecolor|24bit/i.test(process.env.COLORTERM ?? ""))
5
+ return "truecolor";
6
+ if (/256/.test(process.env.TERM ?? ""))
7
+ return "256";
8
+ return process.stdout.isTTY ? "16" : "none";
9
+ }
10
+ /**
11
+ * Reads terminal capabilities from the process streams. This adapter is the
12
+ * single sanctioned place to inspect the terminal; components receive
13
+ * dimensions/capabilities through it rather than reading `process.stdout`.
14
+ * `canDistinguishShiftEnter` is conservatively false until the renderer's
15
+ * keyboard-protocol detection (Phase 3/4) can prove otherwise.
16
+ */
17
+ export function createCurrentTerminalPort() {
18
+ return {
19
+ capabilities() {
20
+ return {
21
+ columns: process.stdout.columns ?? 80,
22
+ rows: process.stdout.rows ?? 24,
23
+ colorMode: detectColorMode(),
24
+ isTTY: Boolean(process.stdout.isTTY),
25
+ canDistinguishShiftEnter: false,
26
+ supportsOsc52: true,
27
+ };
28
+ },
29
+ };
30
+ }
31
+ //# sourceMappingURL=current-terminal-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current-terminal-adapter.js","sourceRoot":"","sources":["../../../src/app/adapters/current-terminal-adapter.ts"],"names":[],"mappings":"AAMA,SAAS,eAAe;IACtB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACtD,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;QAAE,OAAO,WAAW,CAAC;IAC7E,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AAC9C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB;IACvC,OAAO;QACL,YAAY;YACV,OAAO;gBACL,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;gBACrC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;gBAC/B,SAAS,EAAE,eAAe,EAAE;gBAC5B,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;gBACpC,wBAAwB,EAAE,KAAK;gBAC/B,aAAa,EAAE,IAAI;aACpB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { UpdatesPort } from "../ports/updates-port.js";
2
+ /**
3
+ * Backs `UpdatesPort` with the current package version. The latest-release
4
+ * lookup is injected so the port can be exercised without a network call and
5
+ * so the network policy stays owned by the caller.
6
+ */
7
+ export declare function createCurrentUpdatesPort(fetchLatest?: () => Promise<string | undefined>): UpdatesPort;
@@ -0,0 +1,31 @@
1
+ import { getCurrentVersion } from "../../commands/update.js";
2
+ function compareSemver(a, b) {
3
+ const pa = a.replace(/^v/, "").split(".").map((n) => Number(n) || 0);
4
+ const pb = b.replace(/^v/, "").split(".").map((n) => Number(n) || 0);
5
+ for (let i = 0; i < Math.max(pa.length, pb.length); i += 1) {
6
+ const diff = (pa[i] ?? 0) - (pb[i] ?? 0);
7
+ if (diff !== 0)
8
+ return diff < 0 ? -1 : 1;
9
+ }
10
+ return 0;
11
+ }
12
+ /**
13
+ * Backs `UpdatesPort` with the current package version. The latest-release
14
+ * lookup is injected so the port can be exercised without a network call and
15
+ * so the network policy stays owned by the caller.
16
+ */
17
+ export function createCurrentUpdatesPort(fetchLatest) {
18
+ return {
19
+ async check() {
20
+ const currentVersion = getCurrentVersion();
21
+ const latestVersion = fetchLatest ? await fetchLatest() : undefined;
22
+ return {
23
+ currentVersion,
24
+ latestVersion,
25
+ updateAvailable: latestVersion !== undefined &&
26
+ compareSemver(currentVersion, latestVersion) < 0,
27
+ };
28
+ },
29
+ };
30
+ }
31
+ //# sourceMappingURL=current-updates-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current-updates-adapter.js","sourceRoot":"","sources":["../../../src/app/adapters/current-updates-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,SAAS,aAAa,CAAC,CAAS,EAAE,CAAS;IACzC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACtC,WAA+C;IAE/C,OAAO;QACL,KAAK,CAAC,KAAK;YACT,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;YAC3C,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACpE,OAAO;gBACL,cAAc;gBACd,aAAa;gBACb,eAAe,EACb,aAAa,KAAK,SAAS;oBAC3B,aAAa,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG,CAAC;aACnD,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ClipboardPort } from "../ports/clipboard-port.js";
2
+ export interface InMemoryClipboard extends ClipboardPort {
3
+ readonly lastText: string | undefined;
4
+ }
5
+ /**
6
+ * App-layer default clipboard: stores the last copied text in memory without
7
+ * touching the terminal. The real OSC 52 / native-clipboard adapter, which
8
+ * writes terminal bytes, belongs to the renderer layer (Phase 6, SEL-006).
9
+ */
10
+ export declare function createInMemoryClipboardPort(): InMemoryClipboard;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * App-layer default clipboard: stores the last copied text in memory without
3
+ * touching the terminal. The real OSC 52 / native-clipboard adapter, which
4
+ * writes terminal bytes, belongs to the renderer layer (Phase 6, SEL-006).
5
+ */
6
+ export function createInMemoryClipboardPort() {
7
+ let last;
8
+ return {
9
+ get lastText() {
10
+ return last;
11
+ },
12
+ async writeText(text) {
13
+ last = text;
14
+ },
15
+ async readText() {
16
+ return last;
17
+ },
18
+ };
19
+ }
20
+ //# sourceMappingURL=in-memory-clipboard-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-clipboard-adapter.js","sourceRoot":"","sources":["../../../src/app/adapters/in-memory-clipboard-adapter.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,MAAM,UAAU,2BAA2B;IACzC,IAAI,IAAwB,CAAC;IAC7B,OAAO;QACL,IAAI,QAAQ;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,IAAY;YAC1B,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,QAAQ;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Command context = the focused surface a command is allowed to run in
3
+ * (PICK-002, CMD-002). `global` commands run anywhere the focused surface
4
+ * permits; others are scoped.
5
+ */
6
+ export type CommandContext = "global" | "composer" | "picker" | "modal" | "secret" | "plan" | "transcript" | "transcript-search";
7
+ export interface CommandDefinition {
8
+ /** Canonical name without the leading slash, e.g. "model". */
9
+ readonly name: string;
10
+ readonly aliases?: readonly string[];
11
+ readonly usage?: string | undefined;
12
+ readonly description: string;
13
+ /** Surfaces this command is available in; defaults to ["global"]. */
14
+ readonly contexts?: readonly CommandContext[];
15
+ }
16
+ export interface CommandInvocation {
17
+ /** Canonical resolved name (aliases are already resolved). */
18
+ readonly name: string;
19
+ /** Raw argument string, trimmed. */
20
+ readonly args: string;
21
+ readonly context: CommandContext;
22
+ }
23
+ export type CommandHandler = (invocation: CommandInvocation) => void | Promise<void>;
24
+ export declare function normalizeCommandName(nameOrAlias: string): string;
@@ -0,0 +1,4 @@
1
+ export function normalizeCommandName(nameOrAlias) {
2
+ return nameOrAlias.trim().replace(/^\/+/, "").toLowerCase();
3
+ }
4
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/app/commands/command.ts"],"names":[],"mappings":"AAqCA,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { type CommandContext, type CommandDefinition, type CommandHandler, type CommandInvocation } from "./command.js";
2
+ export interface CommandHelpEntry {
3
+ readonly command: string;
4
+ readonly usage?: string | undefined;
5
+ readonly description: string;
6
+ readonly aliases: readonly string[];
7
+ }
8
+ /**
9
+ * One typed source of truth for slash commands. Registration is closed once
10
+ * seeded; handlers are attached by whichever frontend consumes the registry so
11
+ * UI-coupled handler bodies are not duplicated across legacy and v2.
12
+ */
13
+ export declare class CommandRegistry {
14
+ private readonly byName;
15
+ private readonly aliasToName;
16
+ private readonly handlers;
17
+ register(definition: CommandDefinition): void;
18
+ resolve(nameOrAlias: string): string | undefined;
19
+ has(nameOrAlias: string): boolean;
20
+ get(nameOrAlias: string): CommandDefinition | undefined;
21
+ all(): CommandDefinition[];
22
+ setHandler(nameOrAlias: string, handler: CommandHandler): void;
23
+ /** Prefix match over canonical names and aliases (for completion menus). */
24
+ suggestions(prefix: string): CommandDefinition[];
25
+ help(): CommandHelpEntry[];
26
+ /** Parse a raw `/name args` line into a resolved invocation, or undefined. */
27
+ parse(line: string, context?: CommandContext): CommandInvocation | undefined;
28
+ /**
29
+ * True when a submitted line should be treated as a slash-command attempt
30
+ * (known name, unique prefix, or command-shaped word) rather than a prompt.
31
+ * Paths like `/Users/...` return false.
32
+ */
33
+ looksLikeCommand(line: string): boolean;
34
+ /** Resolve + run the registered handler. Returns false if unknown/unhandled. */
35
+ dispatch(invocation: {
36
+ name: string;
37
+ args?: string | undefined;
38
+ context?: CommandContext | undefined;
39
+ }): Promise<boolean>;
40
+ }
41
+ /**
42
+ * Seed a registry from the shared legacy command catalogue so v2 and the
43
+ * classic REPL agree on the command set without a second hand-maintained list.
44
+ */
45
+ export declare function buildDefaultCommandRegistry(): CommandRegistry;
@@ -0,0 +1,164 @@
1
+ import { slashCommands } from "../../repl/slash-commands.js";
2
+ import { normalizeCommandName, } from "./command.js";
3
+ /**
4
+ * Canonical command -> alias names. The legacy catalogue lists aliases as
5
+ * separate rows ("alias for /X"); here they collapse onto one canonical
6
+ * command so menus, help, keybindings, and dispatch all derive from a single
7
+ * definition (CMD-002, FEATURE_PARITY "aliases point to the same handler").
8
+ */
9
+ const ALIAS_GROUPS = {
10
+ provider: ["use"],
11
+ search: ["search-provider"],
12
+ variants: ["reasoning"],
13
+ think: ["thinking"],
14
+ exit: ["quit"],
15
+ };
16
+ /**
17
+ * One typed source of truth for slash commands. Registration is closed once
18
+ * seeded; handlers are attached by whichever frontend consumes the registry so
19
+ * UI-coupled handler bodies are not duplicated across legacy and v2.
20
+ */
21
+ export class CommandRegistry {
22
+ byName = new Map();
23
+ aliasToName = new Map();
24
+ handlers = new Map();
25
+ register(definition) {
26
+ const name = normalizeCommandName(definition.name);
27
+ if (this.byName.has(name) || this.aliasToName.has(name)) {
28
+ throw new Error(`duplicate command name: ${name}`);
29
+ }
30
+ this.byName.set(name, { ...definition, name });
31
+ for (const alias of definition.aliases ?? []) {
32
+ const normalized = normalizeCommandName(alias);
33
+ if (this.aliasToName.has(normalized) || this.byName.has(normalized)) {
34
+ throw new Error(`duplicate command alias: ${normalized}`);
35
+ }
36
+ this.aliasToName.set(normalized, name);
37
+ }
38
+ }
39
+ resolve(nameOrAlias) {
40
+ const name = normalizeCommandName(nameOrAlias);
41
+ if (this.byName.has(name))
42
+ return name;
43
+ return this.aliasToName.get(name);
44
+ }
45
+ has(nameOrAlias) {
46
+ return this.resolve(nameOrAlias) !== undefined;
47
+ }
48
+ get(nameOrAlias) {
49
+ const name = this.resolve(nameOrAlias);
50
+ return name ? this.byName.get(name) : undefined;
51
+ }
52
+ all() {
53
+ return [...this.byName.values()];
54
+ }
55
+ setHandler(nameOrAlias, handler) {
56
+ const name = this.resolve(nameOrAlias);
57
+ if (!name)
58
+ throw new Error(`unknown command: ${nameOrAlias}`);
59
+ this.handlers.set(name, handler);
60
+ }
61
+ /** Prefix match over canonical names and aliases (for completion menus). */
62
+ suggestions(prefix) {
63
+ const needle = normalizeCommandName(prefix);
64
+ const matches = [];
65
+ for (const def of this.byName.values()) {
66
+ const names = [def.name, ...(def.aliases ?? [])];
67
+ if (names.some((n) => n.startsWith(needle)))
68
+ matches.push(def);
69
+ }
70
+ return matches;
71
+ }
72
+ help() {
73
+ return this.all().map((def) => ({
74
+ command: `/${def.name}`,
75
+ usage: def.usage,
76
+ description: def.description,
77
+ aliases: (def.aliases ?? []).map((a) => `/${a}`),
78
+ }));
79
+ }
80
+ /** Parse a raw `/name args` line into a resolved invocation, or undefined. */
81
+ parse(line, context = "global") {
82
+ if (!line.startsWith("/"))
83
+ return undefined;
84
+ const rest = line.slice(1);
85
+ const boundary = rest.search(/\s/);
86
+ const rawName = boundary === -1 ? rest : rest.slice(0, boundary);
87
+ const args = boundary === -1 ? "" : rest.slice(boundary + 1).trim();
88
+ // Absolute paths (/Users/..., /tmp/foo) are prompts, not commands.
89
+ if (!rawName || rawName.includes("/") || rawName.includes("\\")) {
90
+ return undefined;
91
+ }
92
+ const exact = this.resolve(rawName);
93
+ if (exact)
94
+ return { name: exact, args, context };
95
+ // Unique prefix match so a broken completion menu still dispatches
96
+ // "/mod" → /model, "/imp" → /implement, etc.
97
+ if (rawName.length === 0)
98
+ return undefined;
99
+ const matches = this.suggestions(rawName);
100
+ if (matches.length === 1) {
101
+ return { name: matches[0].name, args, context };
102
+ }
103
+ return undefined;
104
+ }
105
+ /**
106
+ * True when a submitted line should be treated as a slash-command attempt
107
+ * (known name, unique prefix, or command-shaped word) rather than a prompt.
108
+ * Paths like `/Users/...` return false.
109
+ */
110
+ looksLikeCommand(line) {
111
+ if (!line.startsWith("/") || line.length < 2)
112
+ return false;
113
+ const firstToken = line.slice(1).split(/\s/)[0] ?? "";
114
+ if (!firstToken || firstToken.includes("/") || firstToken.includes("\\")) {
115
+ return false;
116
+ }
117
+ if (this.resolve(firstToken))
118
+ return true;
119
+ if (this.suggestions(firstToken).length > 0)
120
+ return true;
121
+ return /^[a-z][a-z0-9-]*$/i.test(firstToken);
122
+ }
123
+ /** Resolve + run the registered handler. Returns false if unknown/unhandled. */
124
+ async dispatch(invocation) {
125
+ const name = this.resolve(invocation.name);
126
+ if (!name)
127
+ return false;
128
+ const handler = this.handlers.get(name);
129
+ if (!handler)
130
+ return false;
131
+ await handler({
132
+ name,
133
+ args: invocation.args ?? "",
134
+ context: invocation.context ?? "global",
135
+ });
136
+ return true;
137
+ }
138
+ }
139
+ /**
140
+ * Seed a registry from the shared legacy command catalogue so v2 and the
141
+ * classic REPL agree on the command set without a second hand-maintained list.
142
+ */
143
+ export function buildDefaultCommandRegistry() {
144
+ const registry = new CommandRegistry();
145
+ const aliasNames = new Set();
146
+ for (const aliases of Object.values(ALIAS_GROUPS)) {
147
+ for (const alias of aliases)
148
+ aliasNames.add(alias);
149
+ }
150
+ for (const command of slashCommands) {
151
+ const name = normalizeCommandName(command.command);
152
+ if (aliasNames.has(name))
153
+ continue; // attached to its canonical below
154
+ const aliases = ALIAS_GROUPS[name];
155
+ registry.register({
156
+ name,
157
+ description: command.description,
158
+ usage: command.usage,
159
+ ...(aliases ? { aliases } : {}),
160
+ });
161
+ }
162
+ return registry;
163
+ }
164
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/app/commands/registry.ts"],"names":[],"mappings":"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"}