@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,22 @@
1
+ /**
2
+ * Plan approval/implement/discard orchestration (PLAN-004, F-021/023, V2-070/073).
3
+ *
4
+ * Mirrors the classic TUI's `/implement` path: approve the persisted plan, flip
5
+ * the session policy flag the agent gate reads, then run the implement prompt.
6
+ * Kept out of `PlanController` (persistence only) and out of components.
7
+ */
8
+ import type { SessionPlan } from "../../store/plan.js";
9
+ import type { AppServices } from "../bootstrap/composition-root.js";
10
+ /** Coding / build plans — scaffold + verify. */
11
+ export declare const IMPLEMENT_PROMPT_CODING: string;
12
+ /** Pentest / security plans — no local dev-server assumption. */
13
+ export declare const IMPLEMENT_PROMPT_PENTEST: string;
14
+ export declare const IMPLEMENT_PROMPT: string;
15
+ export declare function buildImplementPrompt(plan: SessionPlan): string;
16
+ export declare function implementPlan(services: AppServices): Promise<void>;
17
+ export declare function discardPlan(services: AppServices): Promise<void>;
18
+ /**
19
+ * After a turn ends, if a draft plan is waiting, open the plan-ready confirm.
20
+ * "P" views full plan detail via the suspended-over-confirm pager path.
21
+ */
22
+ export declare function promptPlanApprovalIfNeeded(services: AppServices): Promise<void>;
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Plan approval/implement/discard orchestration (PLAN-004, F-021/023, V2-070/073).
3
+ *
4
+ * Mirrors the classic TUI's `/implement` path: approve the persisted plan, flip
5
+ * the session policy flag the agent gate reads, then run the implement prompt.
6
+ * Kept out of `PlanController` (persistence only) and out of components.
7
+ */
8
+ /** Coding / build plans — scaffold + verify. */
9
+ export const IMPLEMENT_PROMPT_CODING = "I approve the plan. Execute it now in STRICT ORDER. " +
10
+ "Start with the FIRST pending task that still needs work (skip only tasks already marked done). " +
11
+ "For each task: call task.update {taskId, state:'in_progress'} → do the real work → VERIFY it succeeded → " +
12
+ "call task.update {taskId, state:'done'}, then move to the NEXT task. " +
13
+ "If a tool call FAILS, mark the task 'failed', fix the problem, and retry. Do NOT mark a task done when it failed. " +
14
+ "Do NOT skip ahead to later tasks while earlier ones are still pending. " +
15
+ "Build for real with fs.write / fs.writeMany when the plan requires files. " +
16
+ "Run real commands when needed — do not claim anything ran without a successful tool call.";
17
+ /** Pentest / security plans — no local dev-server assumption. */
18
+ export const IMPLEMENT_PROMPT_PENTEST = "I approve the plan. Execute the engagement tasks in STRICT ORDER. " +
19
+ "Start with the FIRST pending task; do NOT skip to later tasks while earlier ones are still pending. " +
20
+ "For each task: task.update in_progress → do the recon/testing work with tools → task.update done (or failed with a note). " +
21
+ "Prefer tool.batch / dns / http.fetch / net.scan for recon; continue when one lookup fails. " +
22
+ "Do NOT start a local dev server, npm run dev, bun run, vite, next, or shell.start. " +
23
+ "Do NOT list or read the clai workspace/package.json as a follow-up. Stay on the remote engagement target/scope. " +
24
+ "When all tasks are done, write the report if needed and STOP with findings — no localhost step.";
25
+ export const IMPLEMENT_PROMPT = IMPLEMENT_PROMPT_CODING;
26
+ /**
27
+ * When the user implements/discards from the plan pane, the chat plan-ready
28
+ * confirm must not also run implement/discard (double-queue / double-discard).
29
+ */
30
+ let planDecisionHandled = false;
31
+ function dismissPlanConfirmIfOpen(services, asYes) {
32
+ const state = services.overlay.getState();
33
+ if (state.kind === "confirm" && state.request.kind === "plan") {
34
+ services.overlay.answerConfirm(asYes);
35
+ }
36
+ }
37
+ export function buildImplementPrompt(plan) {
38
+ if (plan.kind === "pentest")
39
+ return IMPLEMENT_PROMPT_PENTEST;
40
+ return IMPLEMENT_PROMPT_CODING;
41
+ }
42
+ export async function implementPlan(services) {
43
+ const plan = services.plan.current();
44
+ if (!plan)
45
+ return;
46
+ if (plan.tasks.length > 0 && plan.tasks.every((t) => t.state === "done"))
47
+ return;
48
+ // Pane click wins: mark handled, close chat confirm so Y/N can't re-queue.
49
+ planDecisionHandled = true;
50
+ dismissPlanConfirmIfOpen(services, true);
51
+ await services.plan.approve();
52
+ services.session.setPlanApproved(true);
53
+ const prompt = buildImplementPrompt(plan);
54
+ if (services.session.getState().running) {
55
+ services.session.enqueue(prompt);
56
+ }
57
+ else {
58
+ await services.session.submit(prompt);
59
+ }
60
+ }
61
+ export async function discardPlan(services) {
62
+ planDecisionHandled = true;
63
+ dismissPlanConfirmIfOpen(services, false);
64
+ await services.plan.discard();
65
+ services.session.setPlanApproved(false);
66
+ }
67
+ /**
68
+ * After a turn ends, if a draft plan is waiting, open the plan-ready confirm.
69
+ * "P" views full plan detail via the suspended-over-confirm pager path.
70
+ */
71
+ export async function promptPlanApprovalIfNeeded(services) {
72
+ if (services.session.isPlanApproved())
73
+ return;
74
+ if (services.overlay.isOpen())
75
+ return;
76
+ const plan = services.plan.current();
77
+ if (!plan || plan.status !== "draft" || plan.tasks.length === 0)
78
+ return;
79
+ planDecisionHandled = false;
80
+ const ok = await services.overlay.openConfirm({
81
+ kind: "plan",
82
+ prompt: `Implement this plan now? "${plan.goal}" — ${plan.tasks.length} task(s). (Y to implement · N to discard)`,
83
+ }, async () => {
84
+ const { formatPlanPagerDocument } = await import("../rendering/plan-view.js");
85
+ services.overlay.openPager(`Plan · ${plan.goal}`, formatPlanPagerDocument(plan));
86
+ });
87
+ // Plan pane already implemented/discarded while this confirm was open.
88
+ if (planDecisionHandled)
89
+ return;
90
+ if (ok)
91
+ await implementPlan(services);
92
+ else
93
+ await discardPlan(services);
94
+ }
95
+ //# sourceMappingURL=plan-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-lifecycle.js","sourceRoot":"","sources":["../../../src/tui-v2/app/plan-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /** @jsxImportSource @opentui/react */
2
+ /**
3
+ * Dependency-injection providers for the v2 shell (V2-031).
4
+ *
5
+ * The composition root is created once at bootstrap and handed to the tree
6
+ * here; components read services through `useServices` instead of importing
7
+ * singletons, so the same App can be mounted with fakes in a headless renderer.
8
+ */
9
+ import { type ReactNode } from "react";
10
+ import type { AppServices } from "../bootstrap/composition-root.js";
11
+ import { type Theme } from "../rendering/theme.js";
12
+ export declare function ServicesProvider(props: {
13
+ services: AppServices;
14
+ children: ReactNode;
15
+ }): ReactNode;
16
+ export declare function useServices(): AppServices;
17
+ export declare function useTheme(): Theme;
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx } from "@opentui/react/jsx-runtime";
2
+ /** @jsxImportSource @opentui/react */
3
+ /**
4
+ * Dependency-injection providers for the v2 shell (V2-031).
5
+ *
6
+ * The composition root is created once at bootstrap and handed to the tree
7
+ * here; components read services through `useServices` instead of importing
8
+ * singletons, so the same App can be mounted with fakes in a headless renderer.
9
+ */
10
+ import { createContext, useContext } from "react";
11
+ import { themeFor } from "../rendering/theme.js";
12
+ const ServicesContext = createContext(null);
13
+ export function ServicesProvider(props) {
14
+ const value = {
15
+ services: props.services,
16
+ theme: themeFor(props.services.capabilities.themeHint),
17
+ };
18
+ return (_jsx(ServicesContext.Provider, { value: value, children: props.children }));
19
+ }
20
+ export function useServices() {
21
+ const ctx = useContext(ServicesContext);
22
+ if (!ctx)
23
+ throw new Error("useServices must be used within a ServicesProvider");
24
+ return ctx.services;
25
+ }
26
+ export function useTheme() {
27
+ const ctx = useContext(ServicesContext);
28
+ if (!ctx)
29
+ throw new Error("useTheme must be used within a ServicesProvider");
30
+ return ctx.theme;
31
+ }
32
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/tui-v2/app/providers.tsx"],"names":[],"mappings":";AAAA,sCAAsC;AACtC;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAkB,MAAM,OAAO,CAAC;AAElE,OAAO,EAAE,QAAQ,EAAc,MAAM,uBAAuB,CAAC;AAO7D,MAAM,eAAe,GAAG,aAAa,CAA8B,IAAI,CAAC,CAAC;AAEzE,MAAM,UAAU,gBAAgB,CAAC,KAGhC;IACC,MAAM,KAAK,GAAyB;QAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC;KACvD,CAAC;IACF,OAAO,CACL,KAAC,eAAe,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YACnC,KAAK,CAAC,QAAQ,GACU,CAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,GAAG,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAChF,OAAO,GAAG,CAAC,QAAQ,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,MAAM,GAAG,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAC7E,OAAO,GAAG,CAAC,KAAK,CAAC;AACnB,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Renderer-independent terminal capability detection (V2-030).
3
+ *
4
+ * Pure function of an injected environment snapshot so capability decisions are
5
+ * unit-testable without a live TTY. The renderer adapter feeds this the real
6
+ * `process.env`/stdio at bootstrap; nothing here writes terminal bytes.
7
+ */
8
+ import type { ColorMode } from "../../app/ports/terminal-port.js";
9
+ export type ThemeHint = "dark" | "light" | "unknown";
10
+ export interface CapabilityEnv {
11
+ readonly env: Readonly<Record<string, string | undefined>>;
12
+ readonly stdoutIsTTY: boolean;
13
+ readonly stdinIsTTY: boolean;
14
+ readonly columns: number | undefined;
15
+ readonly rows: number | undefined;
16
+ }
17
+ export interface TerminalCapabilityReport {
18
+ readonly isTTY: boolean;
19
+ readonly columns: number;
20
+ readonly rows: number;
21
+ readonly colorMode: ColorMode;
22
+ readonly noColor: boolean;
23
+ /** Kitty/CSI-u keyboard protocol; lets Shift+Enter differ from Enter. */
24
+ readonly kittyKeyboard: boolean;
25
+ readonly canDistinguishShiftEnter: boolean;
26
+ readonly mouse: boolean;
27
+ readonly unicode: boolean;
28
+ readonly osc52: boolean;
29
+ readonly reducedMotion: boolean;
30
+ readonly themeHint: ThemeHint;
31
+ }
32
+ export declare const DEFAULT_COLUMNS = 80;
33
+ export declare const DEFAULT_ROWS = 24;
34
+ export declare function detectCapabilities(input: CapabilityEnv): TerminalCapabilityReport;
35
+ export declare function readCapabilitiesFromProcess(): TerminalCapabilityReport;
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Renderer-independent terminal capability detection (V2-030).
3
+ *
4
+ * Pure function of an injected environment snapshot so capability decisions are
5
+ * unit-testable without a live TTY. The renderer adapter feeds this the real
6
+ * `process.env`/stdio at bootstrap; nothing here writes terminal bytes.
7
+ */
8
+ export const DEFAULT_COLUMNS = 80;
9
+ export const DEFAULT_ROWS = 24;
10
+ const TRUECOLOR_TERMS = ["iterm", "kitty", "wezterm", "ghostty", "vte", "alacritty"];
11
+ const KITTY_KEYBOARD_TERMS = ["kitty", "ghostty", "wezterm", "foot"];
12
+ function truthy(value) {
13
+ if (value === undefined)
14
+ return false;
15
+ const v = value.trim().toLowerCase();
16
+ return v !== "" && v !== "0" && v !== "false" && v !== "no";
17
+ }
18
+ function detectColorMode(env, isTTY) {
19
+ // NO_COLOR is a hard opt-out regardless of terminal support.
20
+ if (env.NO_COLOR !== undefined && env.NO_COLOR !== "") {
21
+ return { colorMode: "none", noColor: true };
22
+ }
23
+ if (!isTTY)
24
+ return { colorMode: "none", noColor: false };
25
+ const colorterm = (env.COLORTERM ?? "").toLowerCase();
26
+ const term = (env.TERM ?? "").toLowerCase();
27
+ const termProgram = (env.TERM_PROGRAM ?? "").toLowerCase();
28
+ if (colorterm === "truecolor" || colorterm === "24bit") {
29
+ return { colorMode: "truecolor", noColor: false };
30
+ }
31
+ if (TRUECOLOR_TERMS.some((t) => termProgram.includes(t) || term.includes(t))) {
32
+ return { colorMode: "truecolor", noColor: false };
33
+ }
34
+ if (term.includes("256"))
35
+ return { colorMode: "256", noColor: false };
36
+ if (term === "" || term === "dumb")
37
+ return { colorMode: "none", noColor: false };
38
+ return { colorMode: "16", noColor: false };
39
+ }
40
+ function detectKittyKeyboard(env) {
41
+ const term = (env.TERM ?? "").toLowerCase();
42
+ const termProgram = (env.TERM_PROGRAM ?? "").toLowerCase();
43
+ return KITTY_KEYBOARD_TERMS.some((t) => term.includes(t) || termProgram.includes(t));
44
+ }
45
+ function detectUnicode(env) {
46
+ const locale = `${env.LC_ALL ?? ""}${env.LC_CTYPE ?? ""}${env.LANG ?? ""}`;
47
+ if (locale === "")
48
+ return true; // assume modern terminal when unset
49
+ return /utf-?8/i.test(locale);
50
+ }
51
+ function detectThemeHint(env) {
52
+ const explicit = (env.CLAI_THEME ?? "").toLowerCase();
53
+ if (explicit === "dark" || explicit === "light")
54
+ return explicit;
55
+ const colorfgbg = env.COLORFGBG;
56
+ if (colorfgbg) {
57
+ const parts = colorfgbg.split(";");
58
+ const bg = Number(parts[parts.length - 1]);
59
+ if (Number.isFinite(bg))
60
+ return bg <= 6 ? "dark" : "light";
61
+ }
62
+ return "unknown";
63
+ }
64
+ export function detectCapabilities(input) {
65
+ const { env } = input;
66
+ const isTTY = input.stdoutIsTTY && input.stdinIsTTY;
67
+ const { colorMode, noColor } = detectColorMode(env, isTTY);
68
+ const kittyKeyboard = isTTY && detectKittyKeyboard(env);
69
+ return {
70
+ isTTY,
71
+ columns: input.columns ?? DEFAULT_COLUMNS,
72
+ rows: input.rows ?? DEFAULT_ROWS,
73
+ colorMode,
74
+ noColor,
75
+ kittyKeyboard,
76
+ canDistinguishShiftEnter: kittyKeyboard,
77
+ mouse: isTTY,
78
+ unicode: detectUnicode(env),
79
+ osc52: isTTY,
80
+ reducedMotion: truthy(env.CLAI_REDUCED_MOTION) || truthy(env.NO_MOTION),
81
+ themeHint: detectThemeHint(env),
82
+ };
83
+ }
84
+ export function readCapabilitiesFromProcess() {
85
+ return detectCapabilities({
86
+ env: process.env,
87
+ stdoutIsTTY: Boolean(process.stdout.isTTY),
88
+ stdinIsTTY: Boolean(process.stdin.isTTY),
89
+ columns: process.stdout.columns,
90
+ rows: process.stdout.rows,
91
+ });
92
+ }
93
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Dependency-injection root (V2-031).
3
+ *
4
+ * Constructs the ports, controllers, and command registry once at bootstrap
5
+ * and returns them as an explicit service bundle — no service locator, no
6
+ * hidden singletons. Every dependency is overridable so the shell can be
7
+ * assembled with fakes in tests. This module is renderer-independent: it wires
8
+ * the application layer and input controllers but imports no `@opentui`/React.
9
+ */
10
+ import type { Mode, ProviderId } from "../../types.js";
11
+ import type { AnyAppEvent } from "../../app/events/app-event.js";
12
+ import type { Clock, IdFactory } from "../../app/events/sequencer.js";
13
+ import type { AgentPort } from "../../app/ports/agent-port.js";
14
+ import type { PersistencePort } from "../../app/ports/persistence-port.js";
15
+ import type { JobsPort } from "../../app/ports/jobs-port.js";
16
+ import type { UpdatesPort } from "../../app/ports/updates-port.js";
17
+ import type { ClipboardPort } from "../../app/ports/clipboard-port.js";
18
+ import type { ConfirmationPort } from "../../app/ports/confirm-port.js";
19
+ import type { SecretPort } from "../../app/ports/secret-port.js";
20
+ import { SessionController } from "../../app/controllers/session-controller.js";
21
+ import { type CommandRegistry } from "../../app/commands/registry.js";
22
+ import { ActionRouter } from "../actions/action-router.js";
23
+ import { FocusController } from "../controllers/focus-controller.js";
24
+ import { SelectionController } from "../controllers/selection-controller.js";
25
+ import { ToastController } from "../controllers/toast-controller.js";
26
+ import { OverlayController } from "../controllers/overlay-controller.js";
27
+ import { TranscriptStore } from "../state/transcript-store.js";
28
+ import { PlanController } from "../../app/controllers/plan-controller.js";
29
+ import type { PagerExportPort } from "./pager-export.js";
30
+ import { type TerminalCapabilityReport } from "./capabilities.js";
31
+ export interface AppPorts {
32
+ readonly agent: AgentPort;
33
+ readonly persistence: PersistencePort;
34
+ readonly jobs: JobsPort;
35
+ readonly updates: UpdatesPort;
36
+ readonly clipboard: ClipboardPort;
37
+ readonly confirm: ConfirmationPort | undefined;
38
+ readonly requestSecret: SecretPort["request"] | undefined;
39
+ }
40
+ export interface CompositionOptions {
41
+ readonly agent?: AgentPort | undefined;
42
+ readonly persistence?: PersistencePort | undefined;
43
+ readonly jobs?: JobsPort | undefined;
44
+ readonly updates?: UpdatesPort | undefined;
45
+ readonly clipboard?: ClipboardPort | undefined;
46
+ readonly confirm?: ConfirmationPort | undefined;
47
+ readonly requestSecret?: SecretPort["request"] | undefined;
48
+ readonly emit?: ((event: AnyAppEvent) => void) | undefined;
49
+ readonly capabilities?: TerminalCapabilityReport | undefined;
50
+ /** SEL-006: auto-copy a non-empty mouse selection on release. Default true. */
51
+ readonly copyOnRelease?: boolean | undefined;
52
+ readonly pagerExport?: PagerExportPort | undefined;
53
+ /** Signals the renderer to tear down and exit (Ctrl+D / second Ctrl+C). */
54
+ readonly requestExit?: (() => void) | undefined;
55
+ readonly provider?: ProviderId | undefined;
56
+ readonly model?: string | undefined;
57
+ readonly mode?: Mode | undefined;
58
+ /** Skip session persistence + AI titles (CLI --no-history). */
59
+ readonly noHistory?: boolean | undefined;
60
+ readonly sessionId?: string | undefined;
61
+ readonly idFactory?: IdFactory | undefined;
62
+ readonly clock?: Clock | undefined;
63
+ }
64
+ export interface AppServices {
65
+ readonly ports: AppPorts;
66
+ readonly commands: CommandRegistry;
67
+ readonly session: SessionController;
68
+ readonly focus: FocusController;
69
+ readonly router: ActionRouter;
70
+ /** Single owner for pane-scoped semantic selection and copy requests. */
71
+ readonly selection: SelectionController;
72
+ /** Ephemeral right-edge toasts (copy confirmation, short status). */
73
+ readonly toast: ToastController;
74
+ readonly transcript: TranscriptStore;
75
+ readonly plan: PlanController;
76
+ /** Single owner for the one blocking overlay (picker/confirm/secret/pager/jobs). */
77
+ readonly overlay: OverlayController;
78
+ readonly pagerExport: PagerExportPort;
79
+ readonly requestExit: () => void;
80
+ readonly capabilities: TerminalCapabilityReport;
81
+ /** Events captured when no external `emit` sink is supplied (test aid). */
82
+ readonly recordedEvents: readonly AnyAppEvent[];
83
+ dispose(): void;
84
+ }
85
+ export declare function createCompositionRoot(options?: CompositionOptions): AppServices;
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Dependency-injection root (V2-031).
3
+ *
4
+ * Constructs the ports, controllers, and command registry once at bootstrap
5
+ * and returns them as an explicit service bundle — no service locator, no
6
+ * hidden singletons. Every dependency is overridable so the shell can be
7
+ * assembled with fakes in tests. This module is renderer-independent: it wires
8
+ * the application layer and input controllers but imports no `@opentui`/React.
9
+ */
10
+ import { createCurrentAgentPort } from "../../app/adapters/current-agent-adapter.js";
11
+ import { createCurrentPersistencePort } from "../../app/adapters/current-store-adapter.js";
12
+ import { createCurrentJobsPort } from "../../app/adapters/current-jobs-adapter.js";
13
+ import { createCurrentUpdatesPort } from "../../app/adapters/current-updates-adapter.js";
14
+ import { createInMemoryClipboardPort } from "../../app/adapters/in-memory-clipboard-adapter.js";
15
+ import { SessionController } from "../../app/controllers/session-controller.js";
16
+ import { buildDefaultCommandRegistry, } from "../../app/commands/registry.js";
17
+ import { ActionRouter } from "../actions/action-router.js";
18
+ import { FocusController } from "../controllers/focus-controller.js";
19
+ import { SelectionController } from "../controllers/selection-controller.js";
20
+ import { ToastController } from "../controllers/toast-controller.js";
21
+ import { OverlayController } from "../controllers/overlay-controller.js";
22
+ import { TranscriptStore } from "../state/transcript-store.js";
23
+ import { serializeForHistory } from "../state/transcript-hydrate.js";
24
+ import { PlanController } from "../../app/controllers/plan-controller.js";
25
+ import { createOverlayConfirmPort, createOverlaySecretPort } from "./overlay-ports.js";
26
+ import { detectCapabilities, readCapabilitiesFromProcess, } from "./capabilities.js";
27
+ function noopPagerExportPort() {
28
+ return {
29
+ exportToScrollback: () => ({ ok: false, error: "no renderer attached" }),
30
+ exportToEditor: async () => ({ ok: false, error: "no renderer attached" }),
31
+ };
32
+ }
33
+ export function createCompositionRoot(options = {}) {
34
+ const recorded = [];
35
+ const transcript = new TranscriptStore();
36
+ const persistence = options.persistence ?? createCurrentPersistencePort();
37
+ const plan = new PlanController(persistence);
38
+ const externalEmit = options.emit;
39
+ // The transcript store and plan controller observe every event
40
+ // unconditionally; the recorder/external sink split below is unrelated to
41
+ // that (it is only about where raw AppEvents surface for tests/consumers).
42
+ const emit = (event) => {
43
+ transcript.dispatch(event);
44
+ plan.observe(event);
45
+ if (externalEmit)
46
+ externalEmit(event);
47
+ else
48
+ recorded.push(event);
49
+ };
50
+ const focus = new FocusController();
51
+ const overlay = new OverlayController(focus);
52
+ const ports = {
53
+ agent: options.agent ?? createCurrentAgentPort(),
54
+ persistence,
55
+ jobs: options.jobs ?? createCurrentJobsPort(),
56
+ updates: options.updates ?? createCurrentUpdatesPort(),
57
+ clipboard: options.clipboard ?? createInMemoryClipboardPort(),
58
+ confirm: options.confirm ?? createOverlayConfirmPort(overlay),
59
+ requestSecret: options.requestSecret ?? createOverlaySecretPort(overlay),
60
+ };
61
+ const toast = new ToastController();
62
+ // Auto-copy-on-release disabled — it fought touch/focus/history.
63
+ // Explicit copy remains via Ctrl+Shift+C (selection.copy).
64
+ const selection = new SelectionController(ports.clipboard, {
65
+ copyOnRelease: options.copyOnRelease ?? false,
66
+ });
67
+ // Late-bound: session is constructed below; snapshot closes over it.
68
+ let sessionRef;
69
+ const session = new SessionController({
70
+ agent: ports.agent,
71
+ persistence: ports.persistence,
72
+ emit,
73
+ confirm: ports.confirm,
74
+ requestSecret: ports.requestSecret,
75
+ provider: options.provider,
76
+ model: options.model,
77
+ mode: options.mode,
78
+ sessionId: options.sessionId,
79
+ idFactory: options.idFactory,
80
+ clock: options.clock,
81
+ noHistory: options.noHistory,
82
+ getTranscriptSnapshot: () => {
83
+ const live = sessionRef;
84
+ if (!live)
85
+ return undefined;
86
+ return serializeForHistory(transcript.getState(), (id) => live.spool.tail(id));
87
+ },
88
+ });
89
+ sessionRef = session;
90
+ const commands = buildDefaultCommandRegistry();
91
+ const router = new ActionRouter();
92
+ const pagerExport = options.pagerExport ?? noopPagerExportPort();
93
+ const capabilities = options.capabilities ??
94
+ (typeof process !== "undefined"
95
+ ? readCapabilitiesFromProcess()
96
+ : detectCapabilities({
97
+ env: {},
98
+ stdoutIsTTY: false,
99
+ stdinIsTTY: false,
100
+ columns: undefined,
101
+ rows: undefined,
102
+ }));
103
+ let disposed = false;
104
+ return {
105
+ ports,
106
+ commands,
107
+ session,
108
+ focus,
109
+ router,
110
+ selection,
111
+ toast,
112
+ transcript,
113
+ plan,
114
+ overlay,
115
+ pagerExport,
116
+ requestExit: options.requestExit ?? (() => { }),
117
+ capabilities,
118
+ recordedEvents: recorded,
119
+ dispose() {
120
+ if (disposed)
121
+ return;
122
+ disposed = true;
123
+ overlay.dispose();
124
+ selection.dispose();
125
+ toast.dispose();
126
+ plan.dispose();
127
+ session.dispose();
128
+ },
129
+ };
130
+ }
131
+ //# sourceMappingURL=composition-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition-root.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/composition-root.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @deprecated Select-to-copy is re-enabled. This module is intentionally a
3
+ * no-op kept so any stale imports fail soft. Prefer not calling it.
4
+ *
5
+ * Historical note: a hard prototype patch here killed all mouse selection
6
+ * (and broke Option/drag-select). Clicks are preserved by marking interactive
7
+ * chrome `selectable={false}` instead of disabling OpenTUI selection globally.
8
+ */
9
+ import type { CliRenderer } from "@opentui/core";
10
+ /** No-op — OpenTUI mouse text selection is enabled. */
11
+ export declare function disableOpenTuiMouseTextSelection(_renderer?: CliRenderer): void;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @deprecated Select-to-copy is re-enabled. This module is intentionally a
3
+ * no-op kept so any stale imports fail soft. Prefer not calling it.
4
+ *
5
+ * Historical note: a hard prototype patch here killed all mouse selection
6
+ * (and broke Option/drag-select). Clicks are preserved by marking interactive
7
+ * chrome `selectable={false}` instead of disabling OpenTUI selection globally.
8
+ */
9
+ /** No-op — OpenTUI mouse text selection is enabled. */
10
+ export function disableOpenTuiMouseTextSelection(_renderer) {
11
+ // intentionally empty
12
+ }
13
+ //# sourceMappingURL=disable-native-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disable-native-selection.js","sourceRoot":"","sources":["../../../src/tui-v2/bootstrap/disable-native-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,uDAAuD;AACvD,MAAM,UAAU,gCAAgC,CAAC,SAAuB;IACtE,sBAAsB;AACxB,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Renderer lifecycle owner (V2-030).
3
+ *
4
+ * Bootstrap creates the renderer, controllers, and stores inside one `try` and
5
+ * tears them down in `finally`. This object centralizes that contract: it
6
+ * installs bounded signal/error handlers, tears resources down in reverse order
7
+ * exactly once, and guarantees the renderer is destroyed (so alternate-screen
8
+ * reset bytes flush) BEFORE the process exits. The terminal must never be left
9
+ * corrupted, so destruction is idempotent and covered by signal/error tests.
10
+ */
11
+ export interface RendererHandle {
12
+ /** Enter alternate screen / take over the terminal. */
13
+ start(): void | Promise<void>;
14
+ /** Leave alternate screen and flush pending reset bytes. */
15
+ destroy(): void | Promise<void>;
16
+ }
17
+ export interface ProcessLike {
18
+ on(event: string, listener: (...args: unknown[]) => void): unknown;
19
+ off(event: string, listener: (...args: unknown[]) => void): unknown;
20
+ exit(code?: number): void;
21
+ }
22
+ export type Disposer = () => void | Promise<void>;
23
+ export interface LifecycleOptions {
24
+ readonly handle: RendererHandle;
25
+ readonly process?: ProcessLike | undefined;
26
+ /** Extra teardown (controllers/stores) disposed in reverse creation order. */
27
+ readonly disposers?: readonly Disposer[] | undefined;
28
+ /** Surfaced errors from signals/uncaught exceptions before shutdown. */
29
+ readonly onError?: ((error: unknown) => void) | undefined;
30
+ /**
31
+ * Optional cooperative first-SIGINT hook (e.g. abort the agent). A second
32
+ * SIGINT within {@link SIGINT_QUIT_WINDOW_MS} still shuts down and exits so
33
+ * `kill -INT` remains a reliable way to leave the TUI.
34
+ */
35
+ readonly onSigint?: (() => void) | undefined;
36
+ }
37
+ /** Double-SIGINT quit window — matches the App Ctrl+C exit window. */
38
+ export declare const SIGINT_QUIT_WINDOW_MS = 1500;
39
+ export declare class RendererLifecycle {
40
+ private readonly options;
41
+ private readonly proc;
42
+ private readonly disposers;
43
+ private started;
44
+ private shuttingDown;
45
+ private destroyed;
46
+ private lastSigintAt;
47
+ private readonly listeners;
48
+ constructor(options: LifecycleOptions);
49
+ get isDestroyed(): boolean;
50
+ /** Install handlers and hand the terminal to the renderer. */
51
+ start(): Promise<void>;
52
+ /**
53
+ * Idempotent teardown: dispose extra resources in reverse order, then destroy
54
+ * the renderer. Safe to call from multiple signals/error paths concurrently.
55
+ */
56
+ shutdown(): Promise<void>;
57
+ /** Tear down fully, then exit — destroy always precedes exit. */
58
+ shutdownAndExit(code: number): Promise<void>;
59
+ private installHandlers;
60
+ private addListener;
61
+ private removeHandlers;
62
+ }