@travisennis/acai 0.0.8 → 0.0.10

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 (386) hide show
  1. package/README.md +48 -729
  2. package/bin/acai +52 -0
  3. package/dist/agent/index.d.ts +12 -2
  4. package/dist/agent/index.d.ts.map +1 -1
  5. package/dist/agent/index.js +378 -168
  6. package/dist/agent/sub-agent.d.ts +23 -0
  7. package/dist/agent/sub-agent.d.ts.map +1 -0
  8. package/dist/agent/sub-agent.js +109 -0
  9. package/dist/cli/index.d.ts +26 -0
  10. package/dist/cli/index.d.ts.map +1 -0
  11. package/dist/{cli.js → cli/index.js} +84 -76
  12. package/dist/cli/stdin.d.ts +9 -0
  13. package/dist/cli/stdin.d.ts.map +1 -0
  14. package/dist/cli/stdin.js +37 -0
  15. package/dist/commands/copy/index.js +2 -2
  16. package/dist/commands/copy/utils.d.ts.map +1 -1
  17. package/dist/commands/copy/utils.js +15 -13
  18. package/dist/commands/generate-rules/index.d.ts +1 -1
  19. package/dist/commands/generate-rules/index.d.ts.map +1 -1
  20. package/dist/commands/generate-rules/index.js +16 -100
  21. package/dist/commands/generate-rules/service.d.ts +21 -0
  22. package/dist/commands/generate-rules/service.d.ts.map +1 -0
  23. package/dist/commands/generate-rules/service.js +103 -0
  24. package/dist/commands/handoff/index.js +2 -2
  25. package/dist/commands/health/index.js +1 -1
  26. package/dist/commands/health/utils.d.ts.map +1 -1
  27. package/dist/commands/health/utils.js +6 -0
  28. package/dist/commands/history/index.d.ts +1 -1
  29. package/dist/commands/history/index.d.ts.map +1 -1
  30. package/dist/commands/history/index.js +17 -18
  31. package/dist/commands/history/types.d.ts +38 -0
  32. package/dist/commands/history/types.d.ts.map +1 -1
  33. package/dist/commands/history/utils.d.ts.map +1 -1
  34. package/dist/commands/history/utils.js +63 -58
  35. package/dist/commands/init/index.d.ts.map +1 -1
  36. package/dist/commands/init/index.js +3 -8
  37. package/dist/commands/init-project/index.d.ts.map +1 -1
  38. package/dist/commands/init-project/index.js +3 -3
  39. package/dist/commands/init-project/utils.d.ts.map +1 -1
  40. package/dist/commands/init-project/utils.js +10 -2
  41. package/dist/commands/list-tools/index.d.ts.map +1 -1
  42. package/dist/commands/list-tools/index.js +7 -31
  43. package/dist/commands/manager.d.ts +2 -2
  44. package/dist/commands/manager.d.ts.map +1 -1
  45. package/dist/commands/manager.js +57 -33
  46. package/dist/commands/model/index.d.ts.map +1 -1
  47. package/dist/commands/model/index.js +20 -151
  48. package/dist/commands/model/model-panel.d.ts +4 -0
  49. package/dist/commands/model/model-panel.d.ts.map +1 -0
  50. package/dist/commands/model/model-panel.js +144 -0
  51. package/dist/commands/paste/index.d.ts.map +1 -1
  52. package/dist/commands/paste/index.js +59 -62
  53. package/dist/commands/paste/utils.d.ts.map +1 -1
  54. package/dist/commands/paste/utils.js +88 -58
  55. package/dist/commands/pickup/index.d.ts.map +1 -1
  56. package/dist/commands/pickup/index.js +6 -3
  57. package/dist/commands/pickup/utils.js +3 -3
  58. package/dist/commands/resources/index.d.ts.map +1 -1
  59. package/dist/commands/resources/index.js +33 -50
  60. package/dist/commands/review/index.d.ts.map +1 -1
  61. package/dist/commands/review/index.js +3 -117
  62. package/dist/commands/review/review-panel.d.ts +3 -0
  63. package/dist/commands/review/review-panel.d.ts.map +1 -0
  64. package/dist/commands/review/review-panel.js +186 -0
  65. package/dist/commands/review/utils.d.ts +9 -0
  66. package/dist/commands/review/utils.d.ts.map +1 -1
  67. package/dist/commands/review/utils.js +127 -68
  68. package/dist/commands/session/index.d.ts +1 -1
  69. package/dist/commands/session/index.d.ts.map +1 -1
  70. package/dist/commands/session/index.js +134 -112
  71. package/dist/commands/session/types.d.ts +7 -0
  72. package/dist/commands/session/types.d.ts.map +1 -1
  73. package/dist/commands/share/html-renderer.d.ts +25 -0
  74. package/dist/commands/share/html-renderer.d.ts.map +1 -0
  75. package/dist/commands/share/html-renderer.js +384 -0
  76. package/dist/commands/share/index.d.ts +3 -0
  77. package/dist/commands/share/index.d.ts.map +1 -0
  78. package/dist/commands/share/index.js +122 -0
  79. package/dist/commands/shell/index.d.ts.map +1 -1
  80. package/dist/commands/shell/index.js +16 -1
  81. package/dist/commands/types.d.ts +2 -2
  82. package/dist/commands/types.d.ts.map +1 -1
  83. package/dist/{config.d.ts → config/index.d.ts} +20 -9
  84. package/dist/config/index.d.ts.map +1 -0
  85. package/dist/{config.js → config/index.js} +43 -42
  86. package/dist/execution/index.d.ts.map +1 -1
  87. package/dist/execution/index.js +75 -55
  88. package/dist/index.d.ts +1 -0
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +170 -127
  91. package/dist/middleware/cache.d.ts.map +1 -1
  92. package/dist/middleware/cache.js +18 -36
  93. package/dist/models/ai-config.d.ts +1 -0
  94. package/dist/models/ai-config.d.ts.map +1 -1
  95. package/dist/models/ai-config.js +4 -3
  96. package/dist/models/anthropic-provider.d.ts +2 -5
  97. package/dist/models/anthropic-provider.d.ts.map +1 -1
  98. package/dist/models/anthropic-provider.js +3 -70
  99. package/dist/models/deepseek-provider.d.ts +1 -0
  100. package/dist/models/deepseek-provider.d.ts.map +1 -1
  101. package/dist/models/google-provider.d.ts +2 -3
  102. package/dist/models/google-provider.d.ts.map +1 -1
  103. package/dist/models/google-provider.js +0 -26
  104. package/dist/models/groq-provider.d.ts +1 -0
  105. package/dist/models/groq-provider.d.ts.map +1 -1
  106. package/dist/models/manager.d.ts +13 -2
  107. package/dist/models/manager.d.ts.map +1 -1
  108. package/dist/models/manager.js +20 -8
  109. package/dist/models/openai-provider.d.ts +5 -5
  110. package/dist/models/openai-provider.d.ts.map +1 -1
  111. package/dist/models/openai-provider.js +27 -40
  112. package/dist/models/opencode-zen-provider.d.ts +8 -3
  113. package/dist/models/opencode-zen-provider.d.ts.map +1 -1
  114. package/dist/models/opencode-zen-provider.js +68 -11
  115. package/dist/models/openrouter-provider.d.ts +24 -30
  116. package/dist/models/openrouter-provider.d.ts.map +1 -1
  117. package/dist/models/openrouter-provider.js +92 -177
  118. package/dist/models/providers.d.ts +1 -1
  119. package/dist/models/providers.d.ts.map +1 -1
  120. package/dist/models/xai-provider.d.ts +4 -3
  121. package/dist/models/xai-provider.d.ts.map +1 -1
  122. package/dist/models/xai-provider.js +18 -18
  123. package/dist/modes/manager.d.ts +23 -0
  124. package/dist/modes/manager.d.ts.map +1 -0
  125. package/dist/modes/manager.js +77 -0
  126. package/dist/modes/prompts.d.ts +2 -0
  127. package/dist/modes/prompts.d.ts.map +1 -0
  128. package/dist/modes/prompts.js +143 -0
  129. package/dist/prompts/mentions.d.ts +11 -0
  130. package/dist/prompts/mentions.d.ts.map +1 -0
  131. package/dist/{mentions.js → prompts/mentions.js} +21 -80
  132. package/dist/prompts/system-prompt.d.ts +26 -0
  133. package/dist/prompts/system-prompt.d.ts.map +1 -0
  134. package/dist/{prompts.js → prompts/system-prompt.js} +50 -22
  135. package/dist/repl/index.d.ts +174 -0
  136. package/dist/repl/index.d.ts.map +1 -0
  137. package/dist/{repl-new.js → repl/index.js} +399 -76
  138. package/dist/repl/project-status.d.ts +1 -0
  139. package/dist/repl/project-status.d.ts.map +1 -1
  140. package/dist/repl/project-status.js +4 -1
  141. package/dist/sessions/manager.d.ts +93 -1
  142. package/dist/sessions/manager.d.ts.map +1 -1
  143. package/dist/sessions/manager.js +264 -9
  144. package/dist/sessions/summary.d.ts +4 -0
  145. package/dist/sessions/summary.d.ts.map +1 -0
  146. package/dist/sessions/summary.js +30 -0
  147. package/dist/{skills.d.ts → skills/index.d.ts} +14 -2
  148. package/dist/skills/index.d.ts.map +1 -0
  149. package/dist/skills/index.js +294 -0
  150. package/dist/subagents/index.d.ts +15 -0
  151. package/dist/subagents/index.d.ts.map +1 -0
  152. package/dist/subagents/index.js +231 -0
  153. package/dist/terminal/control.d.ts +1 -1
  154. package/dist/terminal/control.d.ts.map +1 -1
  155. package/dist/terminal/control.js +30 -9
  156. package/dist/terminal/east-asian-width.d.ts.map +1 -1
  157. package/dist/terminal/east-asian-width.js +404 -351
  158. package/dist/terminal/keys.d.ts +17 -0
  159. package/dist/terminal/keys.d.ts.map +1 -1
  160. package/dist/terminal/keys.js +37 -0
  161. package/dist/terminal/select-prompt.d.ts.map +1 -1
  162. package/dist/terminal/select-prompt.js +24 -12
  163. package/dist/terminal/string-width.d.ts.map +1 -1
  164. package/dist/terminal/string-width.js +25 -27
  165. package/dist/terminal/style.d.ts.map +1 -1
  166. package/dist/terminal/style.js +4 -7
  167. package/dist/terminal/supports-color.d.ts.map +1 -1
  168. package/dist/terminal/supports-color.js +41 -27
  169. package/dist/terminal/table/cell.d.ts +12 -0
  170. package/dist/terminal/table/cell.d.ts.map +1 -1
  171. package/dist/terminal/table/cell.js +40 -25
  172. package/dist/terminal/table/layout-manager.d.ts.map +1 -1
  173. package/dist/terminal/table/layout-manager.js +100 -68
  174. package/dist/terminal/table/utils.d.ts.map +1 -1
  175. package/dist/terminal/table/utils.js +17 -10
  176. package/dist/terminal/wrap-ansi.d.ts.map +1 -1
  177. package/dist/terminal/wrap-ansi.js +172 -103
  178. package/dist/tokens/tracker.d.ts +1 -0
  179. package/dist/tokens/tracker.d.ts.map +1 -1
  180. package/dist/tokens/tracker.js +3 -0
  181. package/dist/tools/agent.d.ts +27 -0
  182. package/dist/tools/agent.d.ts.map +1 -0
  183. package/dist/tools/agent.js +81 -0
  184. package/dist/tools/bash.d.ts +4 -3
  185. package/dist/tools/bash.d.ts.map +1 -1
  186. package/dist/tools/bash.js +343 -121
  187. package/dist/tools/code-search.d.ts +41 -0
  188. package/dist/tools/code-search.d.ts.map +1 -0
  189. package/dist/tools/code-search.js +195 -0
  190. package/dist/tools/directory-tree.d.ts +3 -3
  191. package/dist/tools/directory-tree.d.ts.map +1 -1
  192. package/dist/tools/directory-tree.js +8 -5
  193. package/dist/tools/dynamic-tool-loader.d.ts +2 -5
  194. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
  195. package/dist/tools/dynamic-tool-loader.js +20 -4
  196. package/dist/tools/edit-file.d.ts +7 -7
  197. package/dist/tools/edit-file.d.ts.map +1 -1
  198. package/dist/tools/edit-file.js +164 -66
  199. package/dist/tools/glob.d.ts +6 -6
  200. package/dist/tools/glob.d.ts.map +1 -1
  201. package/dist/tools/glob.js +95 -55
  202. package/dist/tools/grep.d.ts +15 -12
  203. package/dist/tools/grep.d.ts.map +1 -1
  204. package/dist/tools/grep.js +300 -192
  205. package/dist/tools/index.d.ts +143 -5
  206. package/dist/tools/index.d.ts.map +1 -1
  207. package/dist/tools/index.js +39 -24
  208. package/dist/tools/ls.d.ts +2 -2
  209. package/dist/tools/ls.d.ts.map +1 -1
  210. package/dist/tools/ls.js +7 -5
  211. package/dist/tools/read-file.d.ts +3 -3
  212. package/dist/tools/read-file.d.ts.map +1 -1
  213. package/dist/tools/read-file.js +74 -34
  214. package/dist/tools/save-file.d.ts +3 -3
  215. package/dist/tools/save-file.d.ts.map +1 -1
  216. package/dist/tools/save-file.js +11 -11
  217. package/dist/tools/skill.d.ts +23 -0
  218. package/dist/tools/skill.d.ts.map +1 -0
  219. package/dist/tools/skill.js +65 -0
  220. package/dist/tools/think.d.ts.map +1 -1
  221. package/dist/tools/think.js +2 -9
  222. package/dist/tools/utils.d.ts +2 -0
  223. package/dist/tools/utils.d.ts.map +1 -1
  224. package/dist/tools/utils.js +12 -0
  225. package/dist/tools/web-fetch.d.ts +62 -0
  226. package/dist/tools/web-fetch.d.ts.map +1 -0
  227. package/dist/tools/web-fetch.js +429 -0
  228. package/dist/tools/web-search.d.ts +62 -0
  229. package/dist/tools/web-search.d.ts.map +1 -0
  230. package/dist/tools/web-search.js +226 -0
  231. package/dist/tui/autocomplete/attachment-provider.d.ts +3 -6
  232. package/dist/tui/autocomplete/attachment-provider.d.ts.map +1 -1
  233. package/dist/tui/autocomplete/attachment-provider.js +25 -78
  234. package/dist/tui/autocomplete/base-provider.d.ts +1 -0
  235. package/dist/tui/autocomplete/base-provider.d.ts.map +1 -1
  236. package/dist/tui/autocomplete/combined-provider.d.ts +1 -4
  237. package/dist/tui/autocomplete/combined-provider.d.ts.map +1 -1
  238. package/dist/tui/autocomplete/combined-provider.js +3 -17
  239. package/dist/tui/autocomplete/command-provider.d.ts +1 -0
  240. package/dist/tui/autocomplete/command-provider.d.ts.map +1 -1
  241. package/dist/tui/autocomplete/command-provider.js +3 -0
  242. package/dist/tui/autocomplete/file-search-provider.d.ts +2 -1
  243. package/dist/tui/autocomplete/file-search-provider.d.ts.map +1 -1
  244. package/dist/tui/autocomplete/file-search-provider.js +36 -16
  245. package/dist/tui/autocomplete/skill-provider.d.ts +17 -0
  246. package/dist/tui/autocomplete/skill-provider.d.ts.map +1 -0
  247. package/dist/tui/autocomplete/skill-provider.js +49 -0
  248. package/dist/tui/autocomplete.d.ts +2 -2
  249. package/dist/tui/autocomplete.d.ts.map +1 -1
  250. package/dist/tui/autocomplete.js +3 -5
  251. package/dist/tui/components/assistant-message.d.ts.map +1 -1
  252. package/dist/tui/components/assistant-message.js +0 -4
  253. package/dist/tui/components/editor.d.ts +21 -2
  254. package/dist/tui/components/editor.d.ts.map +1 -1
  255. package/dist/tui/components/editor.js +228 -236
  256. package/dist/tui/components/footer.d.ts +6 -4
  257. package/dist/tui/components/footer.d.ts.map +1 -1
  258. package/dist/tui/components/footer.js +49 -25
  259. package/dist/tui/components/markdown.d.ts +8 -5
  260. package/dist/tui/components/markdown.d.ts.map +1 -1
  261. package/dist/tui/components/markdown.js +57 -39
  262. package/dist/tui/components/modal.d.ts.map +1 -1
  263. package/dist/tui/components/modal.js +35 -33
  264. package/dist/tui/components/notification.d.ts +13 -2
  265. package/dist/tui/components/notification.d.ts.map +1 -1
  266. package/dist/tui/components/notification.js +37 -2
  267. package/dist/tui/components/progress-bar.js +1 -1
  268. package/dist/tui/components/select-list.d.ts +1 -0
  269. package/dist/tui/components/select-list.d.ts.map +1 -1
  270. package/dist/tui/components/select-list.js +14 -11
  271. package/dist/tui/components/text.d.ts +16 -0
  272. package/dist/tui/components/text.d.ts.map +1 -1
  273. package/dist/tui/components/text.js +72 -57
  274. package/dist/tui/components/thinking-block.d.ts +9 -0
  275. package/dist/tui/components/thinking-block.d.ts.map +1 -1
  276. package/dist/tui/components/thinking-block.js +43 -11
  277. package/dist/tui/components/tool-execution.d.ts +5 -1
  278. package/dist/tui/components/tool-execution.d.ts.map +1 -1
  279. package/dist/tui/components/tool-execution.js +19 -10
  280. package/dist/tui/components/user-message.d.ts.map +1 -1
  281. package/dist/tui/components/user-message.js +0 -3
  282. package/dist/tui/components/welcome.js +2 -2
  283. package/dist/tui/editor-launcher.d.ts +13 -0
  284. package/dist/tui/editor-launcher.d.ts.map +1 -0
  285. package/dist/tui/editor-launcher.js +39 -0
  286. package/dist/tui/index.d.ts +3 -1
  287. package/dist/tui/index.d.ts.map +1 -1
  288. package/dist/tui/index.js +1 -0
  289. package/dist/tui/terminal.d.ts +27 -0
  290. package/dist/tui/terminal.d.ts.map +1 -1
  291. package/dist/tui/terminal.js +144 -15
  292. package/dist/tui/tui.d.ts +43 -0
  293. package/dist/tui/tui.d.ts.map +1 -1
  294. package/dist/tui/tui.js +172 -41
  295. package/dist/utils/bash/parse.d.ts +19 -0
  296. package/dist/utils/bash/parse.d.ts.map +1 -0
  297. package/dist/utils/bash/parse.js +223 -0
  298. package/dist/utils/bash/quote.d.ts +6 -0
  299. package/dist/utils/bash/quote.d.ts.map +1 -0
  300. package/dist/utils/bash/quote.js +23 -0
  301. package/dist/utils/bash.d.ts.map +1 -1
  302. package/dist/utils/bash.js +211 -126
  303. package/dist/utils/command-protection.d.ts +28 -0
  304. package/dist/utils/command-protection.d.ts.map +1 -0
  305. package/dist/utils/command-protection.js +324 -0
  306. package/dist/utils/dedent.d.ts.map +1 -0
  307. package/dist/utils/env-expand.d.ts +2 -0
  308. package/dist/utils/env-expand.d.ts.map +1 -0
  309. package/dist/utils/env-expand.js +8 -0
  310. package/dist/utils/filesystem/path-display.d.ts +11 -0
  311. package/dist/utils/filesystem/path-display.d.ts.map +1 -0
  312. package/dist/utils/filesystem/path-display.js +32 -0
  313. package/dist/utils/filesystem/security.d.ts +2 -2
  314. package/dist/utils/filesystem/security.d.ts.map +1 -1
  315. package/dist/utils/filesystem/security.js +32 -31
  316. package/dist/utils/formatting.d.ts.map +1 -0
  317. package/dist/{formatting.js → utils/formatting.js} +1 -1
  318. package/dist/utils/git.d.ts +4 -0
  319. package/dist/utils/git.d.ts.map +1 -1
  320. package/dist/utils/git.js +30 -0
  321. package/dist/utils/glob.d.ts +1 -1
  322. package/dist/utils/glob.d.ts.map +1 -1
  323. package/dist/utils/logger.d.ts.map +1 -0
  324. package/dist/{logger.js → utils/logger.js} +1 -1
  325. package/dist/utils/parsing.d.ts.map +1 -0
  326. package/dist/utils/process.d.ts.map +1 -1
  327. package/dist/utils/process.js +90 -37
  328. package/dist/utils/templates.d.ts +2 -0
  329. package/dist/utils/templates.d.ts.map +1 -0
  330. package/dist/utils/templates.js +24 -0
  331. package/dist/utils/version.d.ts.map +1 -0
  332. package/dist/{version.js → utils/version.js} +1 -1
  333. package/package.json +34 -25
  334. package/dist/cli.d.ts +0 -23
  335. package/dist/cli.d.ts.map +0 -1
  336. package/dist/commands/exit/index.d.ts +0 -10
  337. package/dist/commands/exit/index.d.ts.map +0 -1
  338. package/dist/commands/exit/index.js +0 -21
  339. package/dist/commands/exit/types.d.ts +0 -8
  340. package/dist/commands/exit/types.d.ts.map +0 -1
  341. package/dist/commands/exit/types.js +0 -1
  342. package/dist/commands/exit/utils.d.ts +0 -2
  343. package/dist/commands/exit/utils.d.ts.map +0 -1
  344. package/dist/commands/exit/utils.js +0 -13
  345. package/dist/commands/prompt/index.d.ts +0 -5
  346. package/dist/commands/prompt/index.d.ts.map +0 -1
  347. package/dist/commands/prompt/index.js +0 -126
  348. package/dist/commands/prompt/types.d.ts +0 -15
  349. package/dist/commands/prompt/types.d.ts.map +0 -1
  350. package/dist/commands/prompt/types.js +0 -1
  351. package/dist/commands/prompt/utils.d.ts +0 -12
  352. package/dist/commands/prompt/utils.d.ts.map +0 -1
  353. package/dist/commands/prompt/utils.js +0 -107
  354. package/dist/commands/reset/index.d.ts +0 -3
  355. package/dist/commands/reset/index.d.ts.map +0 -1
  356. package/dist/commands/reset/index.js +0 -25
  357. package/dist/commands/reset/types.d.ts +0 -1
  358. package/dist/commands/reset/types.d.ts.map +0 -1
  359. package/dist/commands/reset/types.js +0 -3
  360. package/dist/commands/save/index.d.ts +0 -3
  361. package/dist/commands/save/index.d.ts.map +0 -1
  362. package/dist/commands/save/index.js +0 -19
  363. package/dist/config.d.ts.map +0 -1
  364. package/dist/dedent.d.ts.map +0 -1
  365. package/dist/formatting.d.ts.map +0 -1
  366. package/dist/logger.d.ts.map +0 -1
  367. package/dist/mentions.d.ts +0 -14
  368. package/dist/mentions.d.ts.map +0 -1
  369. package/dist/parsing.d.ts.map +0 -1
  370. package/dist/prompts.d.ts +0 -10
  371. package/dist/prompts.d.ts.map +0 -1
  372. package/dist/repl-new.d.ts +0 -62
  373. package/dist/repl-new.d.ts.map +0 -1
  374. package/dist/skills.d.ts.map +0 -1
  375. package/dist/skills.js +0 -233
  376. package/dist/tui/autocomplete/path-provider.d.ts +0 -21
  377. package/dist/tui/autocomplete/path-provider.d.ts.map +0 -1
  378. package/dist/tui/autocomplete/path-provider.js +0 -164
  379. package/dist/version.d.ts.map +0 -1
  380. /package/dist/{dedent.d.ts → utils/dedent.d.ts} +0 -0
  381. /package/dist/{dedent.js → utils/dedent.js} +0 -0
  382. /package/dist/{formatting.d.ts → utils/formatting.d.ts} +0 -0
  383. /package/dist/{logger.d.ts → utils/logger.d.ts} +0 -0
  384. /package/dist/{parsing.d.ts → utils/parsing.d.ts} +0 -0
  385. /package/dist/{parsing.js → utils/parsing.js} +0 -0
  386. /package/dist/{version.d.ts → utils/version.d.ts} +0 -0
@@ -21,6 +21,22 @@ export declare class Text implements Component {
21
21
  g: number;
22
22
  b: number;
23
23
  }): void;
24
+ /**
25
+ * Apply background color to a line if customBgRgb is set
26
+ */
27
+ private applyBackground;
28
+ /**
29
+ * Create an empty padded line (for top/bottom padding)
30
+ */
31
+ private createEmptyPaddedLine;
32
+ /**
33
+ * Wrap a single line of text to fit within contentWidth
34
+ */
35
+ private wrapLine;
36
+ /**
37
+ * Truncate a word to fit within contentWidth
38
+ */
39
+ private truncateWord;
24
40
  render(width: number): string[];
25
41
  }
26
42
  //# sourceMappingURL=text.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../source/tui/components/text.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAG3C;;GAEG;AACH,qBAAa,IAAK,YAAW,SAAS;IACpC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAC,CAAsC;IAG1D,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAW;gBAG7B,IAAI,SAAK,EACT,QAAQ,SAAI,EACZ,QAAQ,SAAI,EACZ,WAAW,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAQnD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ3B,cAAc,CAAC,WAAW,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAQvE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CA4IhC"}
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../source/tui/components/text.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAG3C;;GAEG;AACH,qBAAa,IAAK,YAAW,SAAS;IACpC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAC,CAAsC;IAG1D,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAW;gBAG7B,IAAI,SAAK,EACT,QAAQ,SAAI,EACZ,QAAQ,SAAI,EACZ,WAAW,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAQnD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ3B,cAAc,CAAC,WAAW,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAQvE;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAK7B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAoChB;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAwEhC"}
@@ -32,6 +32,72 @@ export class Text {
32
32
  this.cachedWidth = undefined;
33
33
  this.cachedLines = undefined;
34
34
  }
35
+ /**
36
+ * Apply background color to a line if customBgRgb is set
37
+ */
38
+ applyBackground(line) {
39
+ if (!this.customBgRgb) {
40
+ return line;
41
+ }
42
+ return style.bgRgb(this.customBgRgb.r, this.customBgRgb.g, this.customBgRgb.b)(line);
43
+ }
44
+ /**
45
+ * Create an empty padded line (for top/bottom padding)
46
+ */
47
+ createEmptyPaddedLine(width) {
48
+ const emptyLine = " ".repeat(width);
49
+ return this.applyBackground(emptyLine);
50
+ }
51
+ /**
52
+ * Wrap a single line of text to fit within contentWidth
53
+ */
54
+ wrapLine(line, contentWidth) {
55
+ const lines = [];
56
+ const visibleLineLength = visibleWidth(line);
57
+ if (visibleLineLength <= contentWidth) {
58
+ lines.push(line);
59
+ return lines;
60
+ }
61
+ // Word wrap
62
+ const words = line.split(" ");
63
+ let currentLine = "";
64
+ for (const word of words) {
65
+ const currentVisible = visibleWidth(currentLine);
66
+ // If word is too long, truncate it
67
+ const finalWord = this.truncateWord(word, contentWidth);
68
+ if (currentVisible === 0) {
69
+ currentLine = finalWord;
70
+ }
71
+ else if (currentVisible + 1 + visibleWidth(finalWord) <= contentWidth) {
72
+ currentLine += ` ${finalWord}`;
73
+ }
74
+ else {
75
+ lines.push(currentLine);
76
+ currentLine = finalWord;
77
+ }
78
+ }
79
+ if (currentLine.length > 0) {
80
+ lines.push(currentLine);
81
+ }
82
+ return lines;
83
+ }
84
+ /**
85
+ * Truncate a word to fit within contentWidth
86
+ */
87
+ truncateWord(word, contentWidth) {
88
+ const wordVisible = visibleWidth(word);
89
+ if (wordVisible <= contentWidth) {
90
+ return word;
91
+ }
92
+ let truncated = "";
93
+ for (const char of word) {
94
+ if (visibleWidth(truncated + char) > contentWidth) {
95
+ break;
96
+ }
97
+ truncated += char;
98
+ }
99
+ return truncated;
100
+ }
35
101
  render(width) {
36
102
  // Check cache
37
103
  if (this.cachedLines &&
@@ -55,47 +121,8 @@ export class Text {
55
121
  const lines = [];
56
122
  const textLines = normalizedText.split("\n");
57
123
  for (const line of textLines) {
58
- // Measure visible length (strip ANSI codes)
59
- const visibleLineLength = visibleWidth(line);
60
- if (visibleLineLength <= contentWidth) {
61
- lines.push(line);
62
- }
63
- else {
64
- // Word wrap
65
- const words = line.split(" ");
66
- let currentLine = "";
67
- for (const word of words) {
68
- const currentVisible = visibleWidth(currentLine);
69
- const wordVisible = visibleWidth(word);
70
- // If word is too long, truncate it
71
- let finalWord = word;
72
- if (wordVisible > contentWidth) {
73
- // Truncate word to fit
74
- let truncated = "";
75
- for (const char of word) {
76
- if (visibleWidth(truncated + char) > contentWidth) {
77
- break;
78
- }
79
- truncated += char;
80
- }
81
- finalWord = truncated;
82
- }
83
- if (currentVisible === 0) {
84
- currentLine = finalWord;
85
- }
86
- else if (currentVisible + 1 + visibleWidth(finalWord) <=
87
- contentWidth) {
88
- currentLine += ` ${finalWord}`;
89
- }
90
- else {
91
- lines.push(currentLine);
92
- currentLine = finalWord;
93
- }
94
- }
95
- if (currentLine.length > 0) {
96
- lines.push(currentLine);
97
- }
98
- }
124
+ const wrappedLines = this.wrapLine(line, contentWidth);
125
+ lines.push(...wrappedLines);
99
126
  }
100
127
  // Add padding to each line
101
128
  const leftPad = " ".repeat(this.paddingX);
@@ -106,31 +133,19 @@ export class Text {
106
133
  // Right padding to fill to width (accounting for left padding and content)
107
134
  const rightPadLength = Math.max(0, width - this.paddingX - visibleLength);
108
135
  const rightPad = " ".repeat(rightPadLength);
109
- let paddedLine = leftPad + line + rightPad;
136
+ const paddedLine = leftPad + line + rightPad;
110
137
  // Apply background color if specified
111
- if (this.customBgRgb) {
112
- paddedLine = style.bgRgb(this.customBgRgb.r, this.customBgRgb.g, this.customBgRgb.b)(paddedLine);
113
- }
114
- paddedLines.push(paddedLine);
138
+ paddedLines.push(this.applyBackground(paddedLine));
115
139
  }
116
140
  // Add top padding (empty lines)
117
- const emptyLine = " ".repeat(width);
118
141
  const topPadding = [];
119
142
  for (let i = 0; i < this.paddingY; i++) {
120
- let emptyPaddedLine = emptyLine;
121
- if (this.customBgRgb) {
122
- emptyPaddedLine = style.bgRgb(this.customBgRgb.r, this.customBgRgb.g, this.customBgRgb.b)(emptyPaddedLine);
123
- }
124
- topPadding.push(emptyPaddedLine);
143
+ topPadding.push(this.createEmptyPaddedLine(width));
125
144
  }
126
145
  // Add bottom padding (empty lines)
127
146
  const bottomPadding = [];
128
147
  for (let i = 0; i < this.paddingY; i++) {
129
- let emptyPaddedLine = emptyLine;
130
- if (this.customBgRgb) {
131
- emptyPaddedLine = style.bgRgb(this.customBgRgb.r, this.customBgRgb.g, this.customBgRgb.b)(emptyPaddedLine);
132
- }
133
- bottomPadding.push(emptyPaddedLine);
148
+ bottomPadding.push(this.createEmptyPaddedLine(width));
134
149
  }
135
150
  // Combine top padding, content, and bottom padding
136
151
  const result = [...topPadding, ...paddedLines, ...bottomPadding];
@@ -4,11 +4,20 @@ import { Container } from "../tui.ts";
4
4
  */
5
5
  export declare class ThinkingBlockComponent extends Container {
6
6
  private contentContainer;
7
+ private verboseMode;
8
+ private lastContent;
9
+ private isThinking;
10
+ private thinkingComplete;
7
11
  constructor(message?: {
8
12
  content: string;
13
+ }, options?: {
14
+ verboseMode?: boolean;
9
15
  });
10
16
  updateContent(message: {
11
17
  content: string;
12
18
  }): void;
19
+ endThinking(): void;
20
+ setVerboseMode(verboseMode: boolean): void;
21
+ private renderContent;
13
22
  }
14
23
  //# sourceMappingURL=thinking-block.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"thinking-block.d.ts","sourceRoot":"","sources":["../../../source/tui/components/thinking-block.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;IACnD,OAAO,CAAC,gBAAgB,CAAY;gBAExB,OAAO,CAAC,EAAE;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB;IAYD,aAAa,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CAkBlD"}
1
+ {"version":3,"file":"thinking-block.d.ts","sourceRoot":"","sources":["../../../source/tui/components/thinking-block.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;IACnD,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,gBAAgB,CAAS;gBAG/B,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,EAC7B,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE;IAcrC,aAAa,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAMjD,WAAW,IAAI,IAAI;IAMnB,cAAc,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI;IAK1C,OAAO,CAAC,aAAa;CA6BtB"}
@@ -1,14 +1,19 @@
1
1
  import style from "../../terminal/style.js";
2
2
  import { Container } from "../tui.js";
3
3
  import { Markdown } from "./markdown.js";
4
- import { Spacer } from "./spacer.js";
4
+ import { Text } from "./text.js";
5
5
  /**
6
6
  * Component that renders a thinking block
7
7
  */
8
8
  export class ThinkingBlockComponent extends Container {
9
9
  contentContainer;
10
- constructor(message) {
10
+ verboseMode;
11
+ lastContent = "";
12
+ isThinking = false;
13
+ thinkingComplete = false;
14
+ constructor(message, options) {
11
15
  super();
16
+ this.verboseMode = options?.verboseMode ?? false;
12
17
  // Container for text/thinking content
13
18
  this.contentContainer = new Container();
14
19
  this.addChild(this.contentContainer);
@@ -17,17 +22,44 @@ export class ThinkingBlockComponent extends Container {
17
22
  }
18
23
  }
19
24
  updateContent(message) {
25
+ this.lastContent = message.content;
26
+ this.isThinking = true;
27
+ this.renderContent();
28
+ }
29
+ endThinking() {
30
+ this.isThinking = false;
31
+ this.thinkingComplete = true;
32
+ this.renderContent();
33
+ }
34
+ setVerboseMode(verboseMode) {
35
+ this.verboseMode = verboseMode;
36
+ this.renderContent();
37
+ }
38
+ renderContent() {
20
39
  // Clear content container
21
40
  this.contentContainer.clear();
22
- if (message.content.length > 0) {
23
- this.contentContainer.addChild(new Spacer(1));
41
+ const content = this.lastContent;
42
+ if (this.verboseMode) {
43
+ // Verbose mode: show full thinking content
44
+ this.contentContainer.addChild(new Markdown(style.dim(content.trim()), {
45
+ paddingX: 1,
46
+ paddingY: 0,
47
+ }));
24
48
  }
25
- const content = message.content;
26
- // Assistant text messages with no background - trim the text
27
- // Set paddingY=0 to avoid extra spacing before tool executions
28
- this.contentContainer.addChild(new Markdown(style.dim(content.trim()), {
29
- paddingX: 1,
30
- paddingY: 0,
31
- }));
49
+ else if (this.isThinking) {
50
+ // Non-verbose mode: show animated "Thinking"
51
+ this.contentContainer.addChild(new Text(style.dim(`Thinking ${generateRandomChars(10, lowercase)}`), 1, 0));
52
+ }
53
+ else if (this.thinkingComplete) {
54
+ // Non-verbose mode: show "Thinking ✓" when complete
55
+ this.contentContainer.addChild(new Text(style.dim("Thinking ✓"), 1, 0));
56
+ }
57
+ // If not verbose and not thinking, show nothing
32
58
  }
33
59
  }
60
+ // const uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
61
+ const lowercase = "abcdefghijklmnopqrstuvwxyz";
62
+ function generateRandomChars(length, charset) {
63
+ const chars = charset ?? "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
64
+ return Array.from({ length }, () => chars[Math.floor(Math.random() * chars.length)]).join("");
65
+ }
@@ -5,8 +5,12 @@ export declare class ToolExecutionComponent extends Container {
5
5
  private loaderComponent;
6
6
  private toolName;
7
7
  private events;
8
- constructor(events: ToolEvent[]);
8
+ private verboseMode;
9
+ constructor(events: ToolEvent[], options?: {
10
+ verboseMode?: boolean;
11
+ });
9
12
  update(events: ToolEvent[]): void;
13
+ setVerboseMode(verboseMode: boolean): void;
10
14
  private renderDisplay;
11
15
  private getToolCallStartComponent;
12
16
  private handleToolStartMessage;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-execution.d.ts","sourceRoot":"","sources":["../../../source/tui/components/tool-execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAAE,SAAS,EAA6B,MAAM,aAAa,CAAC;AAWnE,qBAAa,sBAAuB,SAAQ,SAAS;IACnD,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,EAAE,SAAS,EAAE;IAa/B,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE;IAS1B,OAAO,CAAC,aAAa;IA2CrB,OAAO,CAAC,yBAAyB;IA6CjC,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,mBAAmB;IA0B3B,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,oBAAoB;IAgC5B,OAAO,CAAC,aAAa;CActB"}
1
+ {"version":3,"file":"tool-execution.d.ts","sourceRoot":"","sources":["../../../source/tui/components/tool-execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAAE,SAAS,EAA6B,MAAM,aAAa,CAAC;AAWnE,qBAAa,sBAAuB,SAAQ,SAAS;IACnD,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,WAAW,CAAU;gBAEjB,MAAM,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE;IAcpE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE;IAK1B,cAAc,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI;IAK1C,OAAO,CAAC,aAAa;IAiDrB,OAAO,CAAC,yBAAyB;IA6CjC,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,mBAAmB;IA0B3B,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,oBAAoB;IAgC5B,OAAO,CAAC,aAAa;CActB"}
@@ -1,5 +1,5 @@
1
- import { capitalize } from "../../formatting.js";
2
1
  import style from "../../terminal/style.js";
2
+ import { capitalize } from "../../utils/formatting.js";
3
3
  import { Container, Spacer, Text } from "../index.js";
4
4
  const bgColor = {
5
5
  r: 52,
@@ -11,11 +11,13 @@ export class ToolExecutionComponent extends Container {
11
11
  loaderComponent;
12
12
  toolName;
13
13
  events;
14
- constructor(events) {
14
+ verboseMode;
15
+ constructor(events, options) {
15
16
  super();
16
17
  this.loaderComponent = null;
17
18
  this.toolName = events[0].name;
18
19
  this.events = events;
20
+ this.verboseMode = options?.verboseMode ?? false;
19
21
  // Container for text/thinking content
20
22
  this.contentContainer = new Container();
21
23
  this.addChild(this.contentContainer);
@@ -23,16 +25,20 @@ export class ToolExecutionComponent extends Container {
23
25
  }
24
26
  update(events) {
25
27
  this.events = events;
26
- // Clear content container
27
- this.contentContainer.clear();
28
+ this.renderDisplay();
29
+ }
30
+ setVerboseMode(verboseMode) {
31
+ this.verboseMode = verboseMode;
28
32
  this.renderDisplay();
29
33
  }
30
34
  renderDisplay() {
35
+ // Clear content container before rendering
36
+ this.contentContainer.clear();
37
+ // Add spacer with background color for visual separation
38
+ this.contentContainer.addChild(new Spacer(1, bgColor));
31
39
  // Build display from complete event history with proper ordering
32
40
  const processedEvents = this.processEventsInOrder();
33
41
  const currentStatus = processedEvents.at(-1)?.type ?? "tool-call-start";
34
- this.contentContainer.addChild(new Spacer(1));
35
- this.contentContainer.addChild(new Spacer(1, bgColor));
36
42
  for (let i = 0; i < processedEvents.length; i++) {
37
43
  const event = processedEvents[i];
38
44
  const eventType = event.type;
@@ -41,21 +47,24 @@ export class ToolExecutionComponent extends Container {
41
47
  this.getToolCallStartComponent(event, currentStatus);
42
48
  break;
43
49
  case "tool-call-end":
44
- // Render the actual tool output with truncation
45
- if (event.msg) {
50
+ // Only render output in verbose mode
51
+ if (this.verboseMode && event.msg) {
46
52
  this.contentContainer.addChild(this.renderOutputDisplay(event.msg));
47
53
  }
48
54
  break;
49
55
  case "tool-call-error":
50
- this.contentContainer.addChild(new Text(`└ ${this.handleToolErrorMessage(event.msg)}`, 1, 0, bgColor));
56
+ // Only render error in verbose mode
57
+ if (this.verboseMode) {
58
+ this.contentContainer.addChild(new Text(`└ ${this.handleToolErrorMessage(event.msg)}`, 1, 0, bgColor));
59
+ }
51
60
  break;
52
61
  default: {
53
62
  eventType;
54
63
  }
55
64
  }
56
65
  }
66
+ // Add trailing spacer with background color
57
67
  this.contentContainer.addChild(new Spacer(1, bgColor));
58
- this.contentContainer.addChild(new Spacer(1));
59
68
  }
60
69
  getToolCallStartComponent(event, currentStatus) {
61
70
  switch (currentStatus) {
@@ -1 +1 @@
1
- {"version":3,"file":"user-message.d.ts","sourceRoot":"","sources":["../../../source/tui/components/user-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;IACjD,OAAO,CAAC,QAAQ,CAAW;gBAEf,IAAI,EAAE,MAAM;CAiBzB"}
1
+ {"version":3,"file":"user-message.d.ts","sourceRoot":"","sources":["../../../source/tui/components/user-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;IACjD,OAAO,CAAC,QAAQ,CAAW;gBAEf,IAAI,EAAE,MAAM;CAazB"}
@@ -1,6 +1,5 @@
1
1
  import { Container } from "../tui.js";
2
2
  import { Markdown } from "./markdown.js";
3
- import { Spacer } from "./spacer.js";
4
3
  /**
5
4
  * Component that renders a user message
6
5
  */
@@ -8,7 +7,6 @@ export class UserMessageComponent extends Container {
8
7
  markdown;
9
8
  constructor(text) {
10
9
  super();
11
- this.addChild(new Spacer(1));
12
10
  // User messages with dark gray background
13
11
  this.markdown = new Markdown(text, {
14
12
  customBgRgb: {
@@ -18,6 +16,5 @@ export class UserMessageComponent extends Container {
18
16
  },
19
17
  });
20
18
  this.addChild(this.markdown);
21
- this.addChild(new Spacer(1));
22
19
  }
23
20
  }
@@ -1,6 +1,6 @@
1
- import { dedent } from "../../dedent.js";
2
1
  import style from "../../terminal/style.js";
3
- import { getPackageVersion } from "../../version.js";
2
+ import { dedent } from "../../utils/dedent.js";
3
+ import { getPackageVersion } from "../../utils/version.js";
4
4
  import { BoxComponent } from "./box.js";
5
5
  export class Welcome {
6
6
  options;
@@ -0,0 +1,13 @@
1
+ import type { Terminal } from "./terminal.ts";
2
+ export interface EditorLaunchOptions {
3
+ initialContent?: string;
4
+ postfix?: string;
5
+ terminal: Terminal;
6
+ signal?: AbortSignal;
7
+ }
8
+ export interface EditorLaunchResult {
9
+ content: string;
10
+ aborted: boolean;
11
+ }
12
+ export declare function launchEditor(options: EditorLaunchOptions): Promise<EditorLaunchResult>;
13
+ //# sourceMappingURL=editor-launcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-launcher.d.ts","sourceRoot":"","sources":["../../source/tui/editor-launcher.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CA0C7B"}
@@ -0,0 +1,39 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ export async function launchEditor(options) {
6
+ const { initialContent = "", postfix = ".txt", terminal, signal } = options;
7
+ if (signal?.aborted) {
8
+ return { content: "", aborted: true };
9
+ }
10
+ const tempDir = await mkdtemp(join(tmpdir(), "acai-editor-"));
11
+ const tempFile = join(tempDir, `edit${postfix}`);
12
+ let enteredExternalMode = false;
13
+ try {
14
+ await writeFile(tempFile, initialContent);
15
+ terminal.enterExternalMode();
16
+ enteredExternalMode = true;
17
+ const editor = process.env["EDITOR"] || process.env["VISUAL"] || "vi";
18
+ const result = spawnSync(editor, [tempFile], {
19
+ stdio: "inherit",
20
+ });
21
+ if (signal?.aborted) {
22
+ return { content: "", aborted: true };
23
+ }
24
+ if (result.error) {
25
+ throw result.error;
26
+ }
27
+ if (result.status !== 0) {
28
+ throw new Error(`Editor exited with code ${result.status}`);
29
+ }
30
+ const content = await readFile(tempFile, "utf-8");
31
+ return { content, aborted: false };
32
+ }
33
+ finally {
34
+ if (enteredExternalMode) {
35
+ terminal.exitExternalMode();
36
+ }
37
+ await rm(tempDir, { recursive: true, force: true }).catch(() => { });
38
+ }
39
+ }
@@ -14,7 +14,9 @@ export { Spacer } from "./components/spacer.ts";
14
14
  export { TableComponent } from "./components/table.ts";
15
15
  export { Text } from "./components/text.ts";
16
16
  export { UserMessageComponent } from "./components/user-message.ts";
17
- export { ProcessTerminal } from "./terminal.ts";
17
+ export type { EditorLaunchOptions, EditorLaunchResult, } from "./editor-launcher.ts";
18
+ export { launchEditor } from "./editor-launcher.ts";
19
+ export { ProcessTerminal, type ProcessTerminalOptions } from "./terminal.ts";
18
20
  export { Container, TUI } from "./tui.ts";
19
21
  export { visibleWidth } from "./utils.ts";
20
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/tui/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,IAAI,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;AAEvG,YAAY,EACV,gBAAgB,EAChB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/tui/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,IAAI,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;AAEvG,YAAY,EACV,gBAAgB,EAChB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,YAAY,EACV,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
package/dist/tui/index.js CHANGED
@@ -15,6 +15,7 @@ export { Spacer } from "./components/spacer.js";
15
15
  export { TableComponent } from "./components/table.js";
16
16
  export { Text } from "./components/text.js";
17
17
  export { UserMessageComponent } from "./components/user-message.js";
18
+ export { launchEditor } from "./editor-launcher.js";
18
19
  // Terminal interface and implementations
19
20
  export { ProcessTerminal } from "./terminal.js";
20
21
  export { Container, TUI } from "./tui.js";
@@ -13,9 +13,20 @@ export interface Terminal {
13
13
  clearLine(): void;
14
14
  clearFromCursor(): void;
15
15
  clearScreen(): void;
16
+ enterExternalMode(): void;
17
+ exitExternalMode(): void;
18
+ background(): void;
19
+ isInExternalMode(): boolean;
20
+ onResume(callback: () => void): void;
21
+ }
22
+ export interface ProcessTerminalOptions {
23
+ useTty?: boolean;
16
24
  }
17
25
  /**
18
26
  * Real terminal using process.stdin/stdout
27
+ *
28
+ * When useTty is true (for piped stdin scenarios), input is read from /dev/tty
29
+ * instead of process.stdin, allowing interactive input after piped content.
19
30
  */
20
31
  export declare class ProcessTerminal implements Terminal {
21
32
  private wasRaw;
@@ -23,7 +34,18 @@ export declare class ProcessTerminal implements Terminal {
23
34
  private boundInputListener?;
24
35
  private boundResizeListener?;
25
36
  private stopped;
37
+ private inExternalMode;
38
+ private resumeCallback?;
39
+ private inputStream;
40
+ private ttyFd?;
41
+ private useTty;
42
+ constructor(options?: ProcessTerminalOptions);
43
+ private handleSigCont;
26
44
  start(onInput: (data: string) => void, onResize: () => void): void;
45
+ private attachListeners;
46
+ private detachListeners;
47
+ private setupCrashCleanup;
48
+ private closeTtyFd;
27
49
  stop(): void;
28
50
  write(data: string): void;
29
51
  get columns(): number;
@@ -34,5 +56,10 @@ export declare class ProcessTerminal implements Terminal {
34
56
  clearLine(): void;
35
57
  clearFromCursor(): void;
36
58
  clearScreen(): void;
59
+ enterExternalMode(): void;
60
+ exitExternalMode(): void;
61
+ background(): void;
62
+ isInExternalMode(): boolean;
63
+ onResume(callback: () => void): void;
37
64
  }
38
65
  //# sourceMappingURL=terminal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../source/tui/terminal.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,QAAQ;IAEvB,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAGnE,IAAI,IAAI,IAAI,CAAC;IAGb,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAG1B,IAAI,OAAO,IAAI,MAAM,CAAC;IACtB,IAAI,IAAI,IAAI,MAAM,CAAC;IAGnB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAG5B,UAAU,IAAI,IAAI,CAAC;IACnB,UAAU,IAAI,IAAI,CAAC;IAGnB,SAAS,IAAI,IAAI,CAAC;IAClB,eAAe,IAAI,IAAI,CAAC;IACxB,WAAW,IAAI,IAAI,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAC,CAAa;IACnC,OAAO,CAAC,kBAAkB,CAAC,CAAkC;IAC7D,OAAO,CAAC,mBAAmB,CAAC,CAAa;IACzC,OAAO,CAAC,OAAO,CAAS;IAExB,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAkClE,IAAI,IAAI,IAAI;IA8BZ,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIzB,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAW3B,UAAU,IAAI,IAAI;IAIlB,UAAU,IAAI,IAAI;IAIlB,SAAS,IAAI,IAAI;IAIjB,eAAe,IAAI,IAAI;IAIvB,WAAW,IAAI,IAAI;CAGpB"}
1
+ {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../source/tui/terminal.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,QAAQ;IAEvB,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAGnE,IAAI,IAAI,IAAI,CAAC;IAGb,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAG1B,IAAI,OAAO,IAAI,MAAM,CAAC;IACtB,IAAI,IAAI,IAAI,MAAM,CAAC;IAGnB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAG5B,UAAU,IAAI,IAAI,CAAC;IACnB,UAAU,IAAI,IAAI,CAAC;IAGnB,SAAS,IAAI,IAAI,CAAC;IAClB,eAAe,IAAI,IAAI,CAAC;IACxB,WAAW,IAAI,IAAI,CAAC;IAGpB,iBAAiB,IAAI,IAAI,CAAC;IAC1B,gBAAgB,IAAI,IAAI,CAAC;IACzB,UAAU,IAAI,IAAI,CAAC;IACnB,gBAAgB,IAAI,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAC,CAAa;IACnC,OAAO,CAAC,kBAAkB,CAAC,CAAkC;IAC7D,OAAO,CAAC,mBAAmB,CAAC,CAAa;IACzC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,cAAc,CAAC,CAAa;IACpC,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,MAAM,CAAU;gBAEZ,OAAO,GAAE,sBAA2B;IAKhD,OAAO,CAAC,aAAa,CAInB;IAEF,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAqDlE,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,UAAU;IAWlB,IAAI,IAAI,IAAI;IAiCZ,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIzB,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAW3B,UAAU,IAAI,IAAI;IAIlB,UAAU,IAAI,IAAI;IAIlB,SAAS,IAAI,IAAI;IAIjB,eAAe,IAAI,IAAI;IAIvB,WAAW,IAAI,IAAI;IAInB,iBAAiB,IAAI,IAAI;IAkBzB,gBAAgB,IAAI,IAAI;IAsBxB,UAAU,IAAI,IAAI;IAKlB,gBAAgB,IAAI,OAAO;IAI3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;CAGrC"}