@travisennis/acai 0.0.6 → 0.0.7

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 (344) hide show
  1. package/README.md +186 -17
  2. package/bin/acai-wrapper.js +26 -0
  3. package/dist/agent/index.d.ts +15 -2
  4. package/dist/agent/index.d.ts.map +1 -1
  5. package/dist/agent/index.js +202 -174
  6. package/dist/api/exa/index.js +1 -1
  7. package/dist/cli.d.ts +2 -1
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +40 -7
  10. package/dist/commands/add-directory-command.d.ts +1 -1
  11. package/dist/commands/add-directory-command.d.ts.map +1 -1
  12. package/dist/commands/add-directory-command.js +1 -32
  13. package/dist/commands/application-log-command.d.ts +1 -1
  14. package/dist/commands/application-log-command.d.ts.map +1 -1
  15. package/dist/commands/application-log-command.js +2 -38
  16. package/dist/commands/clear-command.d.ts +1 -1
  17. package/dist/commands/clear-command.d.ts.map +1 -1
  18. package/dist/commands/clear-command.js +1 -5
  19. package/dist/commands/compact-command.d.ts.map +1 -1
  20. package/dist/commands/compact-command.js +0 -9
  21. package/dist/commands/context-command.d.ts +1 -1
  22. package/dist/commands/context-command.d.ts.map +1 -1
  23. package/dist/commands/context-command.js +13 -72
  24. package/dist/commands/copy-command.d.ts.map +1 -1
  25. package/dist/commands/copy-command.js +0 -19
  26. package/dist/commands/edit-command.d.ts +1 -1
  27. package/dist/commands/edit-command.d.ts.map +1 -1
  28. package/dist/commands/edit-command.js +3 -49
  29. package/dist/commands/edit-prompt-command.d.ts +1 -1
  30. package/dist/commands/edit-prompt-command.d.ts.map +1 -1
  31. package/dist/commands/edit-prompt-command.js +1 -26
  32. package/dist/commands/exit-command.d.ts +1 -4
  33. package/dist/commands/exit-command.d.ts.map +1 -1
  34. package/dist/commands/exit-command.js +2 -18
  35. package/dist/commands/files-command.d.ts +1 -1
  36. package/dist/commands/files-command.d.ts.map +1 -1
  37. package/dist/commands/files-command.js +1 -54
  38. package/dist/commands/generate-rules-command.d.ts +1 -1
  39. package/dist/commands/generate-rules-command.d.ts.map +1 -1
  40. package/dist/commands/generate-rules-command.js +18 -60
  41. package/dist/commands/handoff-command.d.ts.map +1 -1
  42. package/dist/commands/handoff-command.js +0 -11
  43. package/dist/commands/health-command.d.ts +1 -1
  44. package/dist/commands/health-command.d.ts.map +1 -1
  45. package/dist/commands/health-command.js +8 -103
  46. package/dist/commands/help-command.d.ts +1 -1
  47. package/dist/commands/help-command.d.ts.map +1 -1
  48. package/dist/commands/help-command.js +6 -14
  49. package/dist/commands/history-command.d.ts +1 -1
  50. package/dist/commands/history-command.d.ts.map +1 -1
  51. package/dist/commands/history-command.js +30 -106
  52. package/dist/commands/init-command.d.ts +1 -1
  53. package/dist/commands/init-command.d.ts.map +1 -1
  54. package/dist/commands/init-command.js +4 -23
  55. package/dist/commands/last-log-command.d.ts +1 -1
  56. package/dist/commands/last-log-command.d.ts.map +1 -1
  57. package/dist/commands/last-log-command.js +1 -28
  58. package/dist/commands/list-directories-command.d.ts +1 -1
  59. package/dist/commands/list-directories-command.d.ts.map +1 -1
  60. package/dist/commands/list-directories-command.js +1 -14
  61. package/dist/commands/list-tools-command.d.ts.map +1 -1
  62. package/dist/commands/list-tools-command.js +55 -78
  63. package/dist/commands/manager.d.ts +1 -8
  64. package/dist/commands/manager.d.ts.map +1 -1
  65. package/dist/commands/manager.js +7 -42
  66. package/dist/commands/model-command.d.ts +0 -22
  67. package/dist/commands/model-command.d.ts.map +1 -1
  68. package/dist/commands/model-command.js +5 -126
  69. package/dist/commands/paste-command.d.ts +1 -1
  70. package/dist/commands/paste-command.d.ts.map +1 -1
  71. package/dist/commands/paste-command.js +1 -79
  72. package/dist/commands/pickup-command.d.ts.map +1 -1
  73. package/dist/commands/pickup-command.js +3 -55
  74. package/dist/commands/prompt-command.d.ts +19 -1
  75. package/dist/commands/prompt-command.d.ts.map +1 -1
  76. package/dist/commands/prompt-command.js +172 -194
  77. package/dist/commands/remove-directory-command.d.ts +1 -1
  78. package/dist/commands/remove-directory-command.d.ts.map +1 -1
  79. package/dist/commands/remove-directory-command.js +1 -33
  80. package/dist/commands/reset-command.d.ts +1 -1
  81. package/dist/commands/reset-command.d.ts.map +1 -1
  82. package/dist/commands/reset-command.js +3 -11
  83. package/dist/commands/rules-command.d.ts +1 -1
  84. package/dist/commands/rules-command.d.ts.map +1 -1
  85. package/dist/commands/rules-command.js +1 -63
  86. package/dist/commands/save-command.d.ts +1 -1
  87. package/dist/commands/save-command.d.ts.map +1 -1
  88. package/dist/commands/save-command.js +1 -8
  89. package/dist/commands/shell-command.d.ts.map +1 -1
  90. package/dist/commands/shell-command.js +1 -48
  91. package/dist/commands/types.d.ts +0 -3
  92. package/dist/commands/types.d.ts.map +1 -1
  93. package/dist/commands/usage-command.d.ts +1 -1
  94. package/dist/commands/usage-command.d.ts.map +1 -1
  95. package/dist/commands/usage-command.js +5 -16
  96. package/dist/config.d.ts +17 -6
  97. package/dist/config.d.ts.map +1 -1
  98. package/dist/config.js +86 -53
  99. package/dist/execution/index.d.ts +17 -2
  100. package/dist/execution/index.d.ts.map +1 -1
  101. package/dist/execution/index.js +62 -20
  102. package/dist/formatting.d.ts +19 -0
  103. package/dist/formatting.d.ts.map +1 -1
  104. package/dist/formatting.js +54 -0
  105. package/dist/index.d.ts +1 -1
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +212 -153
  108. package/dist/messages.d.ts +3 -0
  109. package/dist/messages.d.ts.map +1 -1
  110. package/dist/messages.js +67 -3
  111. package/dist/models/anthropic-provider.d.ts.map +1 -1
  112. package/dist/models/anthropic-provider.js +0 -7
  113. package/dist/models/deepseek-provider.d.ts.map +1 -1
  114. package/dist/models/deepseek-provider.js +0 -2
  115. package/dist/models/google-provider.d.ts.map +1 -1
  116. package/dist/models/google-provider.js +0 -3
  117. package/dist/models/groq-provider.d.ts.map +1 -1
  118. package/dist/models/groq-provider.js +0 -1
  119. package/dist/models/openai-provider.d.ts.map +1 -1
  120. package/dist/models/openai-provider.js +0 -4
  121. package/dist/models/openrouter-provider.d.ts +10 -9
  122. package/dist/models/openrouter-provider.d.ts.map +1 -1
  123. package/dist/models/openrouter-provider.js +82 -88
  124. package/dist/models/providers.d.ts +4 -14
  125. package/dist/models/providers.d.ts.map +1 -1
  126. package/dist/models/providers.js +1 -57
  127. package/dist/models/xai-provider.d.ts.map +1 -1
  128. package/dist/models/xai-provider.js +0 -2
  129. package/dist/prompts.d.ts +9 -4
  130. package/dist/prompts.d.ts.map +1 -1
  131. package/dist/prompts.js +427 -99
  132. package/dist/repl/project-status-line.d.ts +1 -0
  133. package/dist/repl/project-status-line.d.ts.map +1 -1
  134. package/dist/repl/project-status-line.js +57 -27
  135. package/dist/repl-new.d.ts +0 -2
  136. package/dist/repl-new.d.ts.map +1 -1
  137. package/dist/repl-new.js +34 -54
  138. package/dist/skills.d.ts +20 -0
  139. package/dist/skills.d.ts.map +1 -0
  140. package/dist/skills.js +192 -0
  141. package/dist/terminal/control.d.ts +55 -0
  142. package/dist/terminal/control.d.ts.map +1 -0
  143. package/dist/terminal/control.js +109 -0
  144. package/dist/terminal/default-theme.d.ts +1 -1
  145. package/dist/terminal/default-theme.d.ts.map +1 -1
  146. package/dist/terminal/default-theme.js +24 -28
  147. package/dist/terminal/formatting.d.ts +23 -25
  148. package/dist/terminal/formatting.d.ts.map +1 -1
  149. package/dist/terminal/formatting.js +35 -52
  150. package/dist/terminal/highlight/index.d.ts.map +1 -1
  151. package/dist/terminal/highlight/index.js +3 -6
  152. package/dist/terminal/highlight/theme.d.ts.map +1 -1
  153. package/dist/terminal/highlight/theme.js +2 -6
  154. package/dist/terminal/index.d.ts +2 -101
  155. package/dist/terminal/index.d.ts.map +1 -1
  156. package/dist/terminal/index.js +2 -464
  157. package/dist/terminal/markdown.js +7 -5
  158. package/dist/terminal/strip-ansi.js +4 -4
  159. package/dist/terminal/table/cell.d.ts +114 -0
  160. package/dist/terminal/table/cell.d.ts.map +1 -0
  161. package/dist/terminal/table/cell.js +407 -0
  162. package/dist/terminal/table/debug.d.ts +15 -0
  163. package/dist/terminal/table/debug.d.ts.map +1 -0
  164. package/dist/terminal/table/debug.js +32 -0
  165. package/dist/terminal/table/index.d.ts +3 -0
  166. package/dist/terminal/table/index.d.ts.map +1 -0
  167. package/dist/terminal/table/index.js +2 -0
  168. package/dist/terminal/table/layout-manager.d.ts +27 -0
  169. package/dist/terminal/table/layout-manager.d.ts.map +1 -0
  170. package/dist/terminal/table/layout-manager.js +257 -0
  171. package/dist/terminal/table/table.d.ts +9 -0
  172. package/dist/terminal/table/table.d.ts.map +1 -0
  173. package/dist/terminal/table/table.js +97 -0
  174. package/dist/terminal/table/utils.d.ts +63 -0
  175. package/dist/terminal/table/utils.d.ts.map +1 -0
  176. package/dist/terminal/table/utils.js +326 -0
  177. package/dist/tokens/threshold.d.ts +6 -21
  178. package/dist/tokens/threshold.d.ts.map +1 -1
  179. package/dist/tokens/threshold.js +13 -31
  180. package/dist/tools/advanced-edit-file.d.ts.map +1 -1
  181. package/dist/tools/advanced-edit-file.js +5 -1
  182. package/dist/tools/agent.d.ts.map +1 -1
  183. package/dist/tools/agent.js +19 -5
  184. package/dist/tools/bash.d.ts +3 -1
  185. package/dist/tools/bash.d.ts.map +1 -1
  186. package/dist/tools/bash.js +204 -42
  187. package/dist/tools/batch.d.ts +34 -0
  188. package/dist/tools/batch.d.ts.map +1 -0
  189. package/dist/tools/batch.js +174 -0
  190. package/dist/tools/code-interpreter.d.ts.map +1 -1
  191. package/dist/tools/code-interpreter.js +25 -9
  192. package/dist/tools/delete-file.d.ts.map +1 -1
  193. package/dist/tools/delete-file.js +9 -2
  194. package/dist/tools/directory-tree.d.ts +0 -6
  195. package/dist/tools/directory-tree.d.ts.map +1 -1
  196. package/dist/tools/directory-tree.js +29 -18
  197. package/dist/tools/dynamic-tool-loader.d.ts +0 -4
  198. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
  199. package/dist/tools/dynamic-tool-loader.js +2 -2
  200. package/dist/tools/edit-file.d.ts.map +1 -1
  201. package/dist/tools/edit-file.js +16 -3
  202. package/dist/tools/glob.d.ts.map +1 -1
  203. package/dist/tools/glob.js +24 -13
  204. package/dist/tools/grep.d.ts.map +1 -1
  205. package/dist/tools/grep.js +40 -25
  206. package/dist/tools/index.d.ts +17 -3
  207. package/dist/tools/index.d.ts.map +1 -1
  208. package/dist/tools/index.js +43 -1
  209. package/dist/tools/llm-edit-fixer.d.ts +0 -1
  210. package/dist/tools/llm-edit-fixer.d.ts.map +1 -1
  211. package/dist/tools/llm-edit-fixer.js +14 -28
  212. package/dist/tools/move-file.d.ts.map +1 -1
  213. package/dist/tools/move-file.js +8 -1
  214. package/dist/tools/read-file.d.ts.map +1 -1
  215. package/dist/tools/read-file.js +32 -23
  216. package/dist/tools/read-multiple-files.d.ts.map +1 -1
  217. package/dist/tools/read-multiple-files.js +102 -45
  218. package/dist/tools/save-file.d.ts +4 -4
  219. package/dist/tools/save-file.d.ts.map +1 -1
  220. package/dist/tools/save-file.js +20 -2
  221. package/dist/tools/think.d.ts.map +1 -1
  222. package/dist/tools/think.js +7 -1
  223. package/dist/tools/types.d.ts +5 -1
  224. package/dist/tools/types.d.ts.map +1 -1
  225. package/dist/tools/web-fetch.js +1 -1
  226. package/dist/tools/web-search.d.ts.map +1 -1
  227. package/dist/tools/web-search.js +24 -9
  228. package/dist/tui/components/assistant-message.js +1 -1
  229. package/dist/tui/components/box.d.ts +20 -0
  230. package/dist/tui/components/box.d.ts.map +1 -0
  231. package/dist/tui/components/box.js +81 -0
  232. package/dist/tui/components/editor.d.ts +60 -5
  233. package/dist/tui/components/editor.d.ts.map +1 -1
  234. package/dist/tui/components/editor.js +577 -115
  235. package/dist/tui/components/footer.d.ts +0 -12
  236. package/dist/tui/components/footer.d.ts.map +1 -1
  237. package/dist/tui/components/footer.js +19 -7
  238. package/dist/tui/components/header.d.ts +21 -0
  239. package/dist/tui/components/header.d.ts.map +1 -0
  240. package/dist/tui/components/header.js +63 -0
  241. package/dist/tui/components/loader.d.ts +5 -1
  242. package/dist/tui/components/loader.d.ts.map +1 -1
  243. package/dist/tui/components/loader.js +2 -2
  244. package/dist/tui/components/markdown.d.ts +26 -23
  245. package/dist/tui/components/markdown.d.ts.map +1 -1
  246. package/dist/tui/components/markdown.js +107 -54
  247. package/dist/tui/components/modal.d.ts +0 -11
  248. package/dist/tui/components/modal.d.ts.map +1 -1
  249. package/dist/tui/components/modal.js +0 -29
  250. package/dist/tui/components/progress-bar.d.ts +19 -0
  251. package/dist/tui/components/progress-bar.d.ts.map +1 -0
  252. package/dist/tui/components/progress-bar.js +78 -0
  253. package/dist/tui/components/prompt-status.d.ts +2 -1
  254. package/dist/tui/components/prompt-status.d.ts.map +1 -1
  255. package/dist/tui/components/prompt-status.js +7 -2
  256. package/dist/tui/components/select-list.d.ts +27 -1
  257. package/dist/tui/components/select-list.d.ts.map +1 -1
  258. package/dist/tui/components/select-list.js +93 -29
  259. package/dist/tui/components/spacer.d.ts +1 -1
  260. package/dist/tui/components/spacer.d.ts.map +1 -1
  261. package/dist/tui/components/spacer.js +2 -2
  262. package/dist/tui/components/table.d.ts +27 -0
  263. package/dist/tui/components/table.d.ts.map +1 -0
  264. package/dist/tui/components/table.js +125 -0
  265. package/dist/tui/components/thinking-block.d.ts.map +1 -1
  266. package/dist/tui/components/thinking-block.js +4 -1
  267. package/dist/tui/components/tool-execution.d.ts +8 -4
  268. package/dist/tui/components/tool-execution.d.ts.map +1 -1
  269. package/dist/tui/components/tool-execution.js +88 -80
  270. package/dist/tui/components/user-message.d.ts.map +1 -1
  271. package/dist/tui/components/user-message.js +6 -4
  272. package/dist/tui/index.d.ts +9 -5
  273. package/dist/tui/index.d.ts.map +1 -1
  274. package/dist/tui/index.js +5 -1
  275. package/dist/tui/terminal.d.ts +2 -1
  276. package/dist/tui/terminal.d.ts.map +1 -1
  277. package/dist/tui/terminal.js +28 -38
  278. package/dist/tui/tui.d.ts +2 -0
  279. package/dist/tui/tui.d.ts.map +1 -1
  280. package/dist/tui/tui.js +53 -33
  281. package/dist/tui/utils.d.ts +5 -0
  282. package/dist/tui/utils.d.ts.map +1 -1
  283. package/dist/tui/utils.js +81 -1
  284. package/dist/{tools/bash-utils.d.ts → utils/bash.d.ts} +3 -3
  285. package/dist/utils/bash.d.ts.map +1 -0
  286. package/dist/{tools/bash-utils.js → utils/bash.js} +22 -11
  287. package/dist/utils/{filesystem.d.ts → filesystem/operations.d.ts} +1 -1
  288. package/dist/utils/filesystem/operations.d.ts.map +1 -0
  289. package/dist/{tools/filesystem-utils.d.ts → utils/filesystem/security.d.ts} +3 -2
  290. package/dist/utils/filesystem/security.d.ts.map +1 -0
  291. package/dist/{tools/filesystem-utils.js → utils/filesystem/security.js} +62 -4
  292. package/dist/utils/funcs.d.ts +6 -0
  293. package/dist/utils/funcs.d.ts.map +1 -0
  294. package/dist/utils/funcs.js +6 -0
  295. package/dist/{tools/git-utils.d.ts → utils/git.d.ts} +1 -1
  296. package/dist/utils/git.d.ts.map +1 -0
  297. package/dist/{tools/git-utils.js → utils/git.js} +0 -6
  298. package/dist/utils/glob.js +1 -1
  299. package/dist/utils/{zod-utils.d.ts → zod.d.ts} +1 -1
  300. package/dist/utils/zod.d.ts.map +1 -0
  301. package/package.json +17 -17
  302. package/dist/agent/manual-loop.d.ts +0 -41
  303. package/dist/agent/manual-loop.d.ts.map +0 -1
  304. package/dist/agent/manual-loop.js +0 -278
  305. package/dist/repl/display-tool-messages.d.ts +0 -4
  306. package/dist/repl/display-tool-messages.d.ts.map +0 -1
  307. package/dist/repl/display-tool-messages.js +0 -58
  308. package/dist/repl/display-tool-use.d.ts +0 -14
  309. package/dist/repl/display-tool-use.d.ts.map +0 -1
  310. package/dist/repl/display-tool-use.js +0 -63
  311. package/dist/repl/get-prompt-header.d.ts +0 -8
  312. package/dist/repl/get-prompt-header.d.ts.map +0 -1
  313. package/dist/repl/get-prompt-header.js +0 -9
  314. package/dist/repl/prompt.d.ts +0 -21
  315. package/dist/repl/prompt.d.ts.map +0 -1
  316. package/dist/repl/prompt.js +0 -244
  317. package/dist/repl.d.ts +0 -29
  318. package/dist/repl.d.ts.map +0 -1
  319. package/dist/repl.js +0 -218
  320. package/dist/terminal/checkbox-prompt.d.ts +0 -36
  321. package/dist/terminal/checkbox-prompt.d.ts.map +0 -1
  322. package/dist/terminal/checkbox-prompt.js +0 -368
  323. package/dist/terminal/editor-prompt.d.ts +0 -10
  324. package/dist/terminal/editor-prompt.d.ts.map +0 -1
  325. package/dist/terminal/editor-prompt.js +0 -61
  326. package/dist/terminal/errors.d.ts +0 -19
  327. package/dist/terminal/errors.d.ts.map +0 -1
  328. package/dist/terminal/errors.js +0 -37
  329. package/dist/terminal/input-prompt.d.ts +0 -17
  330. package/dist/terminal/input-prompt.d.ts.map +0 -1
  331. package/dist/terminal/input-prompt.js +0 -181
  332. package/dist/terminal/search-prompt.d.ts +0 -20
  333. package/dist/terminal/search-prompt.d.ts.map +0 -1
  334. package/dist/terminal/search-prompt.js +0 -280
  335. package/dist/terminal/types.d.ts +0 -35
  336. package/dist/terminal/types.d.ts.map +0 -1
  337. package/dist/terminal/types.js +0 -1
  338. package/dist/tools/bash-utils.d.ts.map +0 -1
  339. package/dist/tools/filesystem-utils.d.ts.map +0 -1
  340. package/dist/tools/git-utils.d.ts.map +0 -1
  341. package/dist/utils/filesystem.d.ts.map +0 -1
  342. package/dist/utils/zod-utils.d.ts.map +0 -1
  343. /package/dist/utils/{filesystem.js → filesystem/operations.js} +0 -0
  344. /package/dist/utils/{zod-utils.js → zod.js} +0 -0
@@ -25,6 +25,9 @@ export class ThinkingBlockComponent extends Container {
25
25
  const content = message.content;
26
26
  // Assistant text messages with no background - trim the text
27
27
  // Set paddingY=0 to avoid extra spacing before tool executions
28
- this.contentContainer.addChild(new Markdown(style.dim(content.trim()), undefined, undefined, undefined, 1, 0));
28
+ this.contentContainer.addChild(new Markdown(style.dim(content.trim()), {
29
+ paddingX: 1,
30
+ paddingY: 0,
31
+ }));
29
32
  }
30
33
  }
@@ -1,17 +1,21 @@
1
1
  import type { ToolEvent } from "../../agent/index.ts";
2
- import { Container } from "../index.ts";
2
+ import { Container, type TUI } from "../index.ts";
3
3
  export declare class ToolExecutionComponent extends Container {
4
+ private tui;
4
5
  private contentContainer;
6
+ private loaderComponent;
5
7
  private toolName;
6
8
  private events;
7
- constructor(event: ToolEvent);
8
- update(event: ToolEvent): void;
9
+ constructor(tui: TUI, events: ToolEvent[]);
10
+ update(events: ToolEvent[]): void;
9
11
  private renderDisplay;
10
- private getIndicator;
12
+ private getToolCallStartComponent;
13
+ private handleToolStartMessage;
11
14
  private handleToolInitMessage;
12
15
  private handleToolUpdateMessage;
13
16
  private handleToolCompletionMessage;
14
17
  private handleToolErrorMessage;
15
18
  private processEventsInOrder;
19
+ private getEventIndex;
16
20
  }
17
21
  //# sourceMappingURL=tool-execution.d.ts.map
@@ -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,EAAgB,MAAM,aAAa,CAAC;AAItD,qBAAa,sBAAuB,SAAQ,SAAS;IACnD,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAc;gBAEhB,KAAK,EAAE,SAAS;IAY5B,MAAM,CAAC,KAAK,EAAE,SAAS;IAKvB,OAAO,CAAC,aAAa;IAwDrB,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,uBAAuB;IAkB/B,OAAO,CAAC,2BAA2B;IAcnC,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,oBAAoB;CA+C7B"}
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,EACL,SAAS,EAKT,KAAK,GAAG,EACT,MAAM,aAAa,CAAC;AAUrB,qBAAa,sBAAuB,SAAQ,SAAS;IACnD,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAc;gBAEhB,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE;IAczC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE;IAS1B,OAAO,CAAC,aAAa;IAiErB,OAAO,CAAC,yBAAyB;IA0DjC,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,2BAA2B;IAInC,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,oBAAoB;IA+B5B,OAAO,CAAC,aAAa;CAkBtB"}
@@ -1,117 +1,118 @@
1
1
  import { capitalize } from "../../formatting.js";
2
2
  import style from "../../terminal/style.js";
3
- import { Container, Spacer, Text } from "../index.js";
3
+ import { Container, Loader, Markdown, Spacer, Text, } from "../index.js";
4
+ const bgColor = {
5
+ r: 52,
6
+ g: 53,
7
+ b: 65,
8
+ };
4
9
  export class ToolExecutionComponent extends Container {
10
+ tui;
5
11
  contentContainer;
12
+ loaderComponent;
6
13
  toolName;
7
14
  events;
8
- constructor(event) {
15
+ constructor(tui, events) {
9
16
  super();
10
- this.toolName = event.name;
11
- this.events = [event];
17
+ this.tui = tui;
18
+ this.loaderComponent = null;
19
+ this.toolName = events[0].name;
20
+ this.events = events;
12
21
  // Container for text/thinking content
13
22
  this.contentContainer = new Container();
14
23
  this.addChild(this.contentContainer);
15
24
  this.renderDisplay();
16
25
  }
17
- update(event) {
18
- this.events.push(event);
26
+ update(events) {
27
+ this.events = events;
28
+ // Clear content container
29
+ this.contentContainer.clear();
19
30
  this.renderDisplay();
20
31
  }
21
32
  renderDisplay() {
22
- // Clear content container
23
- this.contentContainer.clear();
24
- const lines = [];
25
33
  // Build display from complete event history with proper ordering
26
34
  const processedEvents = this.processEventsInOrder();
35
+ const currentStatus = processedEvents.at(-1)?.type ?? "tool-call-start";
36
+ this.contentContainer.addChild(new Spacer(1));
37
+ this.contentContainer.addChild(new Spacer(1, bgColor));
27
38
  for (let i = 0; i < processedEvents.length; i++) {
28
39
  const event = processedEvents[i];
29
40
  const eventType = event.type;
30
41
  switch (eventType) {
31
42
  case "tool-call-start":
32
- lines.push(`${this.handleToolInitMessage(event)}`);
43
+ this.getToolCallStartComponent(event, currentStatus);
44
+ break;
45
+ case "tool-call-init":
46
+ this.contentContainer.addChild(new Text(`→ ${this.handleToolInitMessage(event.msg)}`, 1, 0, bgColor));
33
47
  break;
34
48
  case "tool-call-update":
35
- lines.push(`├── ${this.handleToolUpdateMessage(event.msg)}`);
49
+ this.contentContainer.addChild(new Markdown(this.handleToolUpdateMessage(event.msg), {
50
+ paddingX: 3,
51
+ customBgRgb: bgColor,
52
+ }));
36
53
  break;
37
54
  case "tool-call-end":
38
- lines.push(`└── ${this.handleToolCompletionMessage(event.msg)}`);
55
+ this.contentContainer.addChild(new Text(`└ ${this.handleToolCompletionMessage(event.msg)}`, 1, 0, bgColor));
39
56
  break;
40
57
  case "tool-call-error":
41
- lines.push(`└── ${this.handleToolErrorMessage(event.msg)}`);
58
+ this.contentContainer.addChild(new Text(`└ ${this.handleToolErrorMessage(event.msg)}`, 1, 0, bgColor));
42
59
  break;
43
60
  default: {
44
61
  eventType;
45
62
  }
46
63
  }
47
64
  }
48
- // Render all lines with proper indicators
49
- const currentStatus = this.events[this.events.length - 1].type;
50
- const indicator = this.getIndicator(currentStatus);
51
- const displayLines = [];
52
- for (let i = 0; i < lines.length; i++) {
53
- let line = lines[i];
54
- if (i === 0) {
55
- line = `${indicator} ${line}`;
56
- }
57
- displayLines.push(line);
58
- }
65
+ this.contentContainer.addChild(new Spacer(1, bgColor));
59
66
  this.contentContainer.addChild(new Spacer(1));
60
- this.contentContainer.addChild(new Text(displayLines.join("\n"), 1, 1, {
61
- r: 52,
62
- g: 53,
63
- b: 65,
64
- }));
65
67
  }
66
- getIndicator(status) {
67
- switch (status) {
68
+ getToolCallStartComponent(event, currentStatus) {
69
+ switch (currentStatus) {
68
70
  case "tool-call-start":
69
- return style.blue.bold("●");
71
+ this.contentContainer.addChild(new Text(`${style.blue.bold("●")} ${this.handleToolStartMessage(event)}`, 1, 0, bgColor));
72
+ break;
73
+ case "tool-call-init":
70
74
  case "tool-call-update":
71
- return style.yellow.bold("●");
75
+ if (!this.loaderComponent) {
76
+ this.loaderComponent = new Loader(this.tui, this.handleToolStartMessage(event), bgColor);
77
+ this.contentContainer.addChild(this.loaderComponent);
78
+ }
79
+ else {
80
+ this.loaderComponent.setMessage(this.handleToolStartMessage(event));
81
+ }
82
+ break;
72
83
  case "tool-call-end":
73
- return style.green.bold("●");
84
+ if (this.loaderComponent) {
85
+ this.loaderComponent.stop();
86
+ this.loaderComponent = null;
87
+ }
88
+ this.contentContainer.addChild(new Text(`${style.green.bold("●")} ${this.handleToolStartMessage(event)}`, 1, 0, bgColor));
89
+ break;
74
90
  case "tool-call-error":
75
- return style.red.bold("●");
91
+ if (this.loaderComponent) {
92
+ this.loaderComponent.stop();
93
+ this.loaderComponent = null;
94
+ }
95
+ this.contentContainer.addChild(new Text(`${style.red.bold("●")} ${this.handleToolStartMessage(event)}`, 1, 0, bgColor));
96
+ break;
76
97
  default:
77
- status;
98
+ currentStatus;
78
99
  }
79
- return style.blue.bold("●");
80
100
  }
81
- handleToolInitMessage(event) {
101
+ handleToolStartMessage(event) {
82
102
  const message = event.msg;
83
103
  let result = `${style.bold(capitalize(this.toolName))} `;
84
104
  result += message.trim() ? `${style.bold(message)} ` : "";
85
105
  result += style.dim(JSON.stringify(event.args).slice(0, 50));
86
106
  return result;
87
107
  }
108
+ handleToolInitMessage(message) {
109
+ return style.bold(message);
110
+ }
88
111
  handleToolUpdateMessage(message) {
89
- const newlineIndex = message.indexOf("\n");
90
- let result = "";
91
- if (newlineIndex === -1) {
92
- result += style.bold(message);
93
- }
94
- else {
95
- const firstLine = message.slice(0, newlineIndex);
96
- // const remainingLines = message.slice(newlineIndex + 1);
97
- result += style.bold(firstLine);
98
- // if (remainingLines.trim()) {
99
- // terminal.display(remainingLines);
100
- // }
101
- }
102
- return result;
112
+ return message;
103
113
  }
104
114
  handleToolCompletionMessage(message) {
105
- const newlineIndex = message.indexOf("\n");
106
- let result = "";
107
- if (newlineIndex === -1) {
108
- result += style.bold(message);
109
- }
110
- else {
111
- const firstLine = message.slice(0, newlineIndex);
112
- result += style.bold(firstLine);
113
- }
114
- return result;
115
+ return style.bold(message);
115
116
  }
116
117
  handleToolErrorMessage(message) {
117
118
  return style.bold.red(message);
@@ -119,8 +120,11 @@ export class ToolExecutionComponent extends Container {
119
120
  processEventsInOrder() {
120
121
  const events = [...this.events];
121
122
  const processed = [];
122
- // Ensure we have a tool-call-start event
123
- const hasStartEvent = events.some((event) => event.type === "tool-call-start");
123
+ // Ensure we have a tool-call-start event for this specific tool call
124
+ // Events are grouped by toolCallId, so we need to check for start events
125
+ // that match the current tool call's ID
126
+ const toolCallId = events[0]?.toolCallId;
127
+ const hasStartEvent = events.some((event) => event.type === "tool-call-start" && event.toolCallId === toolCallId);
124
128
  if (!hasStartEvent && events.length > 0) {
125
129
  // Create synthetic start event using the first event's name
126
130
  const firstEvent = events[0];
@@ -132,22 +136,26 @@ export class ToolExecutionComponent extends Container {
132
136
  args: firstEvent.args,
133
137
  });
134
138
  }
135
- // Process events in the correct order: start → update → end/error
136
- const startEvents = events.filter((event) => event.type === "tool-call-start");
137
- const updateEvents = events.filter((event) => event.type === "tool-call-update");
138
- const endEvents = events.filter((event) => event.type === "tool-call-end");
139
- const errorEvents = events.filter((event) => event.type === "tool-call-error");
140
- // Add start events first
141
- processed.push(...startEvents);
142
- // Add update events
143
- processed.push(...updateEvents);
144
- // Add end or error events (only one should be present)
145
- if (endEvents.length > 0) {
146
- processed.push(...endEvents);
147
- }
148
- else if (errorEvents.length > 0) {
149
- processed.push(...errorEvents);
150
- }
139
+ processed.push(...events);
140
+ processed.sort((a, b) => this.getEventIndex(a) - this.getEventIndex(b));
151
141
  return processed;
152
142
  }
143
+ getEventIndex(event) {
144
+ const eventType = event.type;
145
+ switch (eventType) {
146
+ case "tool-call-start":
147
+ return 0;
148
+ case "tool-call-init":
149
+ return 1;
150
+ case "tool-call-update":
151
+ return 2;
152
+ case "tool-call-end":
153
+ case "tool-call-error":
154
+ return 3;
155
+ default: {
156
+ eventType;
157
+ return -1;
158
+ }
159
+ }
160
+ }
153
161
  }
@@ -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;CAezB"}
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"}
@@ -10,10 +10,12 @@ export class UserMessageComponent extends Container {
10
10
  super();
11
11
  this.addChild(new Spacer(1));
12
12
  // User messages with dark gray background
13
- this.markdown = new Markdown(text, undefined, undefined, {
14
- r: 52,
15
- g: 53,
16
- b: 65,
13
+ this.markdown = new Markdown(text, {
14
+ customBgRgb: {
15
+ r: 52,
16
+ g: 53,
17
+ b: 65,
18
+ },
17
19
  });
18
20
  this.addChild(this.markdown);
19
21
  this.addChild(new Spacer(1));
@@ -1,14 +1,18 @@
1
- export { type AutocompleteItem, type AutocompleteProvider, CombinedAutocompleteProvider, type SlashCommand, } from "./autocomplete.ts";
2
- export { Editor, type TextEditorConfig } from "./components/editor.ts";
1
+ export { type AutocompleteItem, CombinedAutocompleteProvider, type SlashCommand, } from "./autocomplete.ts";
2
+ export { BoxComponent } from "./components/box.ts";
3
+ export { Editor } from "./components/editor.ts";
4
+ export { HeaderComponent } from "./components/header.ts";
3
5
  export { Input } from "./components/input.ts";
4
6
  export { Loader } from "./components/loader.ts";
5
7
  export { Markdown } from "./components/markdown.ts";
6
- export { Modal, ModalTable, ModalText } from "./components/modal.ts";
7
- export { type SelectItem, SelectList } from "./components/select-list.ts";
8
+ export { Modal, ModalText } from "./components/modal.ts";
9
+ export { ProgressBarComponent } from "./components/progress-bar.ts";
10
+ export { SelectList } from "./components/select-list.ts";
8
11
  export { Spacer } from "./components/spacer.ts";
12
+ export { TableComponent } from "./components/table.ts";
9
13
  export { Text } from "./components/text.ts";
10
14
  export { UserMessageComponent } from "./components/user-message.ts";
11
- export { ProcessTerminal, type Terminal } from "./terminal.ts";
15
+ export { ProcessTerminal } from "./terminal.ts";
12
16
  export { type Component, Container, TUI } from "./tui.ts";
13
17
  export { visibleWidth } from "./utils.ts";
14
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/tui/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,4BAA4B,EAC5B,KAAK,YAAY,GAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,MAAM,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACvE,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,UAAU,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,KAAK,UAAU,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/tui/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,gBAAgB,EACrB,4BAA4B,EAC5B,KAAK,YAAY,GAClB,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,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,KAAK,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
package/dist/tui/index.js CHANGED
@@ -2,13 +2,17 @@
2
2
  // Autocomplete support
3
3
  export { CombinedAutocompleteProvider, } from "./autocomplete.js";
4
4
  // Components
5
+ export { BoxComponent } from "./components/box.js";
5
6
  export { Editor } from "./components/editor.js";
7
+ export { HeaderComponent } from "./components/header.js";
6
8
  export { Input } from "./components/input.js";
7
9
  export { Loader } from "./components/loader.js";
8
10
  export { Markdown } from "./components/markdown.js";
9
- export { Modal, ModalTable, ModalText } from "./components/modal.js";
11
+ export { Modal, ModalText } from "./components/modal.js";
12
+ export { ProgressBarComponent } from "./components/progress-bar.js";
10
13
  export { SelectList } from "./components/select-list.js";
11
14
  export { Spacer } from "./components/spacer.js";
15
+ export { TableComponent } from "./components/table.js";
12
16
  export { Text } from "./components/text.js";
13
17
  export { UserMessageComponent } from "./components/user-message.js";
14
18
  // Terminal interface and implementations
@@ -19,9 +19,10 @@ export interface Terminal {
19
19
  */
20
20
  export declare class ProcessTerminal implements Terminal {
21
21
  private wasRaw;
22
+ private sigintHandler?;
22
23
  private inputHandler?;
23
24
  private resizeHandler?;
24
- private rl?;
25
+ private stopped;
25
26
  start(onInput: (data: string) => void, onResize: () => void): void;
26
27
  stop(): void;
27
28
  write(data: string): void;
@@ -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;AAID;;GAEG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAC,CAAyB;IAC9C,OAAO,CAAC,aAAa,CAAC,CAAa;IACnC,OAAO,CAAC,EAAE,CAAC,CAAqB;IAEhC,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IA2ClE,IAAI,IAAI,IAAI;IA0BZ,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":"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,YAAY,CAAC,CAAyB;IAC9C,OAAO,CAAC,aAAa,CAAC,CAAa;IACnC,OAAO,CAAC,OAAO,CAAS;IAExB,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAiClE,IAAI,IAAI,IAAI;IA6BZ,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,50 +1,44 @@
1
- import readline from "node:readline";
2
1
  /**
3
2
  * Real terminal using process.stdin/stdout
4
3
  */
5
4
  export class ProcessTerminal {
6
5
  wasRaw = false;
6
+ sigintHandler;
7
7
  inputHandler;
8
8
  resizeHandler;
9
- rl;
9
+ stopped = false;
10
10
  start(onInput, onResize) {
11
11
  this.inputHandler = onInput;
12
12
  this.resizeHandler = onResize;
13
- // Save previous state
14
- this.wasRaw = process.stdin.isRaw || false;
15
- // Check if we're in a TTY environment
16
- const isTty = process.stdin.isTTY && process.stdout.isTTY;
17
- if (isTty) {
18
- // Create readline interface for reliable input handling
19
- this.rl = readline.createInterface({
20
- input: process.stdin,
21
- output: process.stdout,
22
- terminal: true,
23
- });
24
- // Enable raw mode for character-by-character input
25
- if (process.stdin.setRawMode) {
26
- process.stdin.setRawMode(true);
27
- }
28
- process.stdin.setEncoding("utf8");
29
- process.stdin.resume();
30
- // Enable bracketed paste mode - terminal will wrap pastes in \x1b[200~ ... \x1b[201~
31
- process.stdout.write("\x1b[?2004h");
32
- // Set up input handler
33
- process.stdin.on("data", this.inputHandler);
34
- process.stdout.on("resize", this.resizeHandler);
13
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
14
+ throw new Error("Terminal requires TTY environment");
35
15
  }
36
- else {
37
- console.warn("Not running in a TTY environment - input will not work");
38
- // In non-TTY environments, we can't use raw mode
39
- // But we can still set up basic input handling if needed
40
- process.stdin.setEncoding("utf8");
41
- if (process.stdin.isPaused()) {
42
- process.stdin.resume();
43
- }
44
- process.stdin.on("data", this.inputHandler);
16
+ // Save previous state and enable raw mode
17
+ this.wasRaw = process.stdin.isRaw ?? false;
18
+ if (process.stdin.setRawMode) {
19
+ process.stdin.setRawMode(true);
45
20
  }
21
+ process.stdin.setEncoding("utf8");
22
+ process.stdin.resume();
23
+ // Enable bracketed paste mode - terminal will wrap pastes in \x1b[200~ ... \x1b[201~
24
+ process.stdout.write("\x1b[?2004h");
25
+ // Set up event handlers with proper binding and type conversion
26
+ process.stdin.on("data", (data) => {
27
+ this.inputHandler?.(typeof data === "string" ? data : data.toString("utf8"));
28
+ });
29
+ process.stdout.on("resize", () => {
30
+ this.resizeHandler?.();
31
+ });
32
+ this.sigintHandler = () => this.stop();
33
+ process.on("SIGINT", this.sigintHandler);
46
34
  }
47
35
  stop() {
36
+ if (this.stopped)
37
+ return;
38
+ this.stopped = true;
39
+ if (this.sigintHandler) {
40
+ process.off("SIGINT", this.sigintHandler);
41
+ }
48
42
  // Disable bracketed paste mode
49
43
  process.stdout.write("\x1b[?2004l");
50
44
  // Remove event handlers
@@ -56,11 +50,7 @@ export class ProcessTerminal {
56
50
  process.stdout.removeListener("resize", this.resizeHandler);
57
51
  this.resizeHandler = undefined;
58
52
  }
59
- // Close readline interface
60
- if (this.rl) {
61
- this.rl.close();
62
- this.rl = undefined;
63
- }
53
+ process.stdin.pause();
64
54
  // Restore raw mode state
65
55
  if (process.stdin.setRawMode) {
66
56
  process.stdin.setRawMode(this.wasRaw);
package/dist/tui/tui.d.ts CHANGED
@@ -43,6 +43,8 @@ export declare class TUI extends Container {
43
43
  private terminal;
44
44
  private focusedComponent;
45
45
  private renderRequested;
46
+ private isRendering;
47
+ private renderAgain;
46
48
  private activeModal;
47
49
  constructor(terminal: Terminal);
48
50
  setFocus(component: Component | null): void;
@@ -1 +1 @@
1
- {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../source/tui/tui.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAEhC;;OAEG;IACH,WAAW,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAEjC;;;;OAIG;IACH,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CAC/C;AAED,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;GAEG;AACH,qBAAa,SAAU,YAAW,SAAS;IACzC,QAAQ,EAAE,SAAS,EAAE,CAAM;IAE3B,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAIpC,WAAW,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAOvC,KAAK,IAAI,IAAI;IAIb,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAOhC;AAED;;GAEG;AAGH,qBAAa,GAAI,SAAQ,SAAS;IAChC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,WAAW,CAAsB;gBAE7B,QAAQ,EAAE,QAAQ;IAK9B,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;IAI3C,KAAK,IAAI,IAAI;IASb,IAAI,IAAI,IAAI;IAKZ,aAAa,IAAI,IAAI;IASrB,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,QAAQ;IAmFhB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAK7B;;OAEG;IACH,SAAS,IAAI,IAAI;IAKjB;;OAEG;IACH,aAAa,IAAI,OAAO;CAGzB"}
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../source/tui/tui.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAEhC;;OAEG;IACH,WAAW,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAEjC;;;;OAIG;IACH,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CAC/C;AAED,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;GAEG;AACH,qBAAa,SAAU,YAAW,SAAS;IACzC,QAAQ,EAAE,SAAS,EAAE,CAAM;IAE3B,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAIpC,WAAW,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAOvC,KAAK,IAAI,IAAI;IAIb,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAOhC;AAED;;GAEG;AAGH,qBAAa,GAAI,SAAQ,SAAS;IAChC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAsB;gBAE7B,QAAQ,EAAE,QAAQ;IAK9B,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;IAI3C,KAAK,IAAI,IAAI;IASb,IAAI,IAAI,IAAI;IAKZ,aAAa,IAAI,IAAI;IAarB,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,QAAQ;IAgGhB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAK7B;;OAEG;IACH,SAAS,IAAI,IAAI;IAKjB;;OAEG;IACH,aAAa,IAAI,OAAO;CAGzB"}
package/dist/tui/tui.js CHANGED
@@ -38,6 +38,8 @@ export class TUI extends Container {
38
38
  terminal;
39
39
  focusedComponent = null;
40
40
  renderRequested = false;
41
+ isRendering = false;
42
+ renderAgain = false;
41
43
  activeModal = null;
42
44
  constructor(terminal) {
43
45
  super();
@@ -56,10 +58,14 @@ export class TUI extends Container {
56
58
  this.terminal.stop();
57
59
  }
58
60
  requestRender() {
61
+ if (this.isRendering) {
62
+ this.renderAgain = true;
63
+ return;
64
+ }
59
65
  if (this.renderRequested)
60
66
  return;
61
67
  this.renderRequested = true;
62
- process.nextTick(() => {
68
+ setImmediate(() => {
63
69
  this.renderRequested = false;
64
70
  this.doRender();
65
71
  });
@@ -67,7 +73,7 @@ export class TUI extends Container {
67
73
  handleInput(data) {
68
74
  // Handle Ctrl+C globally - exit the application
69
75
  if (data.charCodeAt(0) === 3) {
70
- console.log("\nCtrl+C pressed - exiting...");
76
+ console.info("\nCtrl+C pressed - exiting...");
71
77
  this.stop();
72
78
  process.exit(0);
73
79
  }
@@ -87,42 +93,56 @@ export class TUI extends Container {
87
93
  }
88
94
  }
89
95
  doRender() {
90
- const width = this.terminal.columns;
91
- // Render all components to get new lines
92
- const newLines = this.render(width);
93
- // Always do full re-render for simplicity and reliability
94
- // This ensures that previous content is properly cleared
95
- let buffer = "\x1b[?2026h"; // Begin synchronized output
96
- buffer += "\x1b[3J\x1b[2J\x1b[H"; // Clear scrollback, screen, and home
97
- for (let i = 0; i < newLines.length; i++) {
98
- if (i > 0)
99
- buffer += "\r\n";
100
- buffer += newLines[i];
96
+ if (this.isRendering) {
97
+ this.renderAgain = true;
98
+ return;
101
99
  }
102
- // Render modal on top if active
103
- if (this.activeModal) {
104
- const modalLines = this.activeModal.render(width);
105
- // Render backdrop first if modal has backdrop
106
- if (this.activeModal.backdrop) {
107
- const backdropLine = style.bgRgb(0, 0, 0)(" ".repeat(width));
108
- const { columns } = getTerminalSize(); // 24
109
- for (let i = 0; i < columns; i++) {
110
- // Cover entire terminal
111
- buffer += `\x1b[${i + 1};1H`;
112
- buffer += backdropLine;
113
- }
100
+ this.isRendering = true;
101
+ try {
102
+ const width = this.terminal.columns;
103
+ // Render all components to get new lines
104
+ const newLines = this.render(width);
105
+ // Always do full re-render for simplicity and reliability
106
+ // This ensures that previous content is properly cleared
107
+ let buffer = "\x1b[?2026h"; // Begin synchronized output
108
+ buffer += "\x1b[3J\x1b[2J\x1b[H"; // Clear scrollback, screen, and home
109
+ for (let i = 0; i < newLines.length; i++) {
110
+ if (i > 0)
111
+ buffer += "\r\n";
112
+ buffer += newLines[i];
114
113
  }
115
- // Render modal content
116
- for (let i = 0; i < modalLines.length; i++) {
117
- if (modalLines[i]) {
118
- // Position cursor and overwrite existing content
119
- buffer += `\x1b[${i + 1};1H`;
120
- buffer += modalLines[i];
114
+ // Render modal on top if active
115
+ if (this.activeModal) {
116
+ const modalLines = this.activeModal.render(width);
117
+ // Render backdrop first if modal has backdrop
118
+ if (this.activeModal.backdrop) {
119
+ const backdropLine = style.bgRgb(0, 0, 0)(" ".repeat(width));
120
+ const { columns } = getTerminalSize(); // 24
121
+ for (let i = 0; i < columns; i++) {
122
+ // Cover entire terminal
123
+ buffer += `\x1b[${i + 1};1H`;
124
+ buffer += backdropLine;
125
+ }
121
126
  }
127
+ // Render modal content
128
+ for (let i = 0; i < modalLines.length; i++) {
129
+ if (modalLines[i]) {
130
+ // Position cursor and overwrite existing content
131
+ buffer += `\x1b[${i + 1};1H`;
132
+ buffer += modalLines[i];
133
+ }
134
+ }
135
+ }
136
+ buffer += "\x1b[?2026l"; // End synchronized output
137
+ this.terminal.write(buffer);
138
+ }
139
+ finally {
140
+ this.isRendering = false;
141
+ if (this.renderAgain) {
142
+ this.renderAgain = false;
143
+ this.requestRender();
122
144
  }
123
145
  }
124
- buffer += "\x1b[?2026l"; // End synchronized output
125
- this.terminal.write(buffer);
126
146
  }
127
147
  // private positionCursor(
128
148
  // componentCursorPos: [number, number] | null,
@@ -7,6 +7,11 @@
7
7
  * - Tabs (replaced with 3 spaces for consistent width)
8
8
  */
9
9
  export declare function visibleWidth(str: string): number;
10
+ /**
11
+ * Truncate text to fit within a maximum visible width, preserving ANSI codes.
12
+ * Adds ellipsis if truncation occurs.
13
+ */
14
+ export declare function truncateToWidth(text: string, maxWidth: number, ellipsis?: string): string;
10
15
  /**
11
16
  * Apply background color to a line, padding to full width.
12
17
  *
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../source/tui/utils.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAC7B,MAAM,CASR"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../source/tui/utils.ts"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhD;AA4BD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,SAAQ,GACf,MAAM,CA+DR;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAC7B,MAAM,CASR"}