@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
@@ -1,4 +1,5 @@
1
1
  import { NoOutputGeneratedError, streamText, } from "ai";
2
+ import { config } from "../config.js";
2
3
  import { logger } from "../logger.js";
3
4
  import { AiConfig } from "../models/ai-config.js";
4
5
  import { isToolMessage } from "../tools/types.js";
@@ -19,10 +20,10 @@ export class Agent {
19
20
  return this.abortController.signal;
20
21
  }
21
22
  async *run(args) {
22
- const { modelManager, messageHistory, tokenTracker, maxIterations = 90, maxRetries = 2, toolCallRepair, } = this.opts;
23
+ const { modelManager, messageHistory, tokenTracker, maxIterations = (await config.getConfig()).loop.maxIterations, maxRetries = 2, toolCallRepair, } = this.opts;
23
24
  this.resetState();
24
25
  this._state.timestamps.start = performance.now();
25
- const { systemPrompt, input, toolDefs, executors, abortSignal } = args;
26
+ const { systemPrompt, input, toolDefs, activeTools = undefined, executors, abortSignal, } = args;
26
27
  const langModel = modelManager.getModel("repl");
27
28
  const modelConfig = modelManager.getModelMetadata("repl");
28
29
  const aiConfig = new AiConfig({
@@ -39,19 +40,25 @@ export class Agent {
39
40
  };
40
41
  let iter = 0;
41
42
  let consecutiveErrors = 0;
43
+ let hasEmittedTerminalEvent = false;
42
44
  while (iter < maxIterations) {
43
45
  if (abortSignal?.aborted) {
44
46
  logger.warn("The agent loop was aborted by the user.");
45
- // terminal.warn("Operation aborted by user.");
46
47
  yield {
47
48
  type: "agent-stop",
48
49
  };
50
+ hasEmittedTerminalEvent = true;
49
51
  break;
50
52
  }
51
53
  yield {
52
54
  type: "step-start",
53
55
  };
56
+ const toolsCalled = new Map();
54
57
  try {
58
+ // Check abort signal again before starting streamText
59
+ if (abortSignal?.aborted) {
60
+ throw new Error("Agent aborted before streamText");
61
+ }
55
62
  const result = streamText({
56
63
  model: langModel,
57
64
  maxOutputTokens: aiConfig.maxOutputTokens(),
@@ -62,12 +69,26 @@ export class Agent {
62
69
  maxRetries: 2,
63
70
  providerOptions: aiConfig.providerOptions(),
64
71
  tools: toolDefs,
72
+ activeTools,
65
73
  // biome-ignore lint/style/useNamingConvention: third-party code
66
74
  experimental_repairToolCall: toolCallRepair,
67
75
  abortSignal,
76
+ onAbort: ({ steps }) => {
77
+ logger.debug(`Aborting and processing ${steps.length} steps`);
78
+ steps.forEach((step) => {
79
+ messageHistory.appendResponseMessages(step.response.messages);
80
+ });
81
+ },
68
82
  });
69
83
  let accumulatedText = "";
70
84
  let accumulatedReasoning = "";
85
+ const thisStepToolCalls = [];
86
+ const thisStepToolResults = [];
87
+ this._state.steps.push({
88
+ toolCalls: thisStepToolCalls,
89
+ toolResults: thisStepToolResults,
90
+ });
91
+ const toolMessages = [];
71
92
  for await (const chunk of result.fullStream) {
72
93
  if (chunk.type === "reasoning-start") {
73
94
  yield {
@@ -110,196 +131,161 @@ export class Agent {
110
131
  content: accumulatedText,
111
132
  };
112
133
  }
113
- }
114
- // Get response and tool calls
115
- const response = await result.response;
116
- const responseMessages = response.messages;
117
- messageHistory.appendResponseMessages(responseMessages);
118
- const toolCalls = await result.toolCalls;
119
- const thisStepToolCalls = [];
120
- const thisStepToolResults = [];
121
- this._state.steps.push({
122
- toolCalls: thisStepToolCalls,
123
- toolResults: thisStepToolResults,
124
- });
125
- // If finishReason is not tool-calls, break
126
- const finishReason = await result.finishReason;
127
- if (finishReason !== "tool-calls") {
128
- yield {
129
- type: "agent-stop",
130
- };
131
- break;
132
- }
133
- // Execute tools in parallel (order not guaranteed)
134
- // Check response.messages for already-processed tool results
135
- const alreadyProcessedToolCallIds = new Set();
136
- // Look for tool results and tool errors in the response messages
137
- for (const message of responseMessages) {
138
- if (message.role === "tool" && Array.isArray(message.content)) {
139
- for (const content of message.content) {
140
- if ((content.type === "tool-result" ||
141
- content.type === "tool-error") &&
142
- content.toolCallId) {
143
- logger.debug(content, "Invalid tool call:");
144
- yield {
145
- type: "tool-call-start",
146
- name: content.toolName,
147
- toolCallId: content.toolCallId,
148
- args: toolCalls.find((call) => call.toolCallId === content.toolCallId)?.input,
149
- msg: "",
150
- };
151
- yield {
152
- type: "tool-call-error",
153
- name: content.toolName,
154
- toolCallId: content.toolCallId,
155
- msg: "invalid tool call",
156
- args: toolCalls.find((call) => call.toolCallId === content.toolCallId)?.input,
157
- };
158
- alreadyProcessedToolCallIds.add(content.toolCallId);
159
- }
160
- }
161
- }
162
- }
163
- // Filter out tool calls that have already been processed or are invalid
164
- const validToolCalls = toolCalls.filter((call) => !alreadyProcessedToolCallIds.has(call.toolCallId) &&
165
- // Also check if the tool call is marked as invalid by the AI SDK
166
- !call.invalid);
167
- if (validToolCalls.length === 0) {
168
- // All tool calls were already processed by the AI SDK
169
- logger.debug(`All ${toolCalls.length} tool calls were already processed by AI SDK, skipping manual execution`);
170
- continue;
171
- }
172
- if (validToolCalls.length < toolCalls.length) {
173
- logger.debug(`Filtered out ${toolCalls.length - validToolCalls.length} already-processed tool calls, executing ${validToolCalls.length} remaining`);
174
- }
175
- // Process all tools
176
- const toolMessages = [];
177
- for (const call of validToolCalls) {
178
- const toolName = call.toolName;
179
- yield {
180
- type: "tool-call-start",
181
- name: toolName,
182
- toolCallId: call.toolCallId,
183
- msg: "",
184
- args: call.input,
185
- };
186
- let resultOutput = "Unknown result.";
187
- try {
188
- thisStepToolCalls.push({ toolName });
189
- thisStepToolResults.push({ toolName });
190
- const toolExec = executors.get(toolName);
191
- if (!toolExec) {
192
- resultOutput = `No executor for tool ${toolName}`;
134
+ else if (chunk.type === "tool-call") {
135
+ const call = chunk;
136
+ const toolName = call.toolName;
137
+ yield this.processToolEvent(toolsCalled, {
138
+ type: "tool-call-start",
139
+ name: toolName,
140
+ toolCallId: call.toolCallId,
141
+ msg: "",
142
+ args: call.input,
143
+ });
144
+ if (call.invalid) {
145
+ yield this.processToolEvent(toolsCalled, {
146
+ type: "tool-call-error",
147
+ name: call.toolName,
148
+ toolCallId: call.toolCallId,
149
+ msg: String(call.error),
150
+ args: call.input,
151
+ });
152
+ continue;
193
153
  }
194
- else {
195
- try {
196
- const output = await toolExec(call.input, {
197
- toolCallId: call.toolCallId,
198
- messages: messageHistory.get(),
199
- abortSignal,
200
- });
201
- if (isAsyncIterable(output)) {
202
- const toolResultValues = [];
203
- for await (const value of output) {
204
- if (isToolMessage(value)) {
205
- switch (value.event) {
206
- case "tool-completion":
207
- yield {
208
- type: "tool-call-end",
209
- name: value.name,
210
- toolCallId: value.id,
211
- msg: value.data,
212
- args: call.input,
213
- };
214
- break;
215
- case "tool-error":
216
- yield {
217
- type: "tool-call-error",
218
- name: value.name,
219
- toolCallId: value.id,
220
- msg: value.data,
221
- args: call.input,
222
- };
223
- break;
224
- case "tool-init":
225
- yield {
226
- type: "tool-call-update",
227
- name: value.name,
228
- toolCallId: value.id,
229
- msg: value.data,
230
- args: call.input,
231
- };
232
- break;
233
- default:
234
- logger.debug(`Unhandled tool message event: ${value.event}`);
235
- break;
154
+ let resultOutput = "Unknown result.";
155
+ try {
156
+ thisStepToolCalls.push({ toolName });
157
+ thisStepToolResults.push({ toolName });
158
+ const toolExec = executors.get(toolName);
159
+ if (!toolExec) {
160
+ resultOutput = `No executor for tool ${toolName}`;
161
+ }
162
+ else {
163
+ try {
164
+ const output = await toolExec(call.input, {
165
+ toolCallId: call.toolCallId,
166
+ messages: messageHistory.get(),
167
+ abortSignal,
168
+ });
169
+ if (isAsyncIterable(output)) {
170
+ const toolResultValues = [];
171
+ for await (const value of output) {
172
+ if (isToolMessage(value)) {
173
+ if (call.toolCallId !== value.id) {
174
+ logger.debug(`Tool ${call.toolName} ids don't match: ${call.toolCallId} != ${value.id}`);
175
+ }
176
+ const event = value.event;
177
+ switch (event) {
178
+ case "tool-completion":
179
+ yield this.processToolEvent(toolsCalled, {
180
+ type: "tool-call-end",
181
+ name: value.name,
182
+ toolCallId: call.toolCallId,
183
+ msg: value.data,
184
+ args: call.input,
185
+ });
186
+ break;
187
+ case "tool-error":
188
+ yield this.processToolEvent(toolsCalled, {
189
+ type: "tool-call-error",
190
+ name: value.name,
191
+ toolCallId: call.toolCallId,
192
+ msg: value.data,
193
+ args: call.input,
194
+ });
195
+ break;
196
+ case "tool-update":
197
+ yield this.processToolEvent(toolsCalled, {
198
+ type: "tool-call-update",
199
+ name: value.name,
200
+ toolCallId: call.toolCallId,
201
+ msg: value.data,
202
+ args: call.input,
203
+ });
204
+ break;
205
+ case "tool-init":
206
+ yield this.processToolEvent(toolsCalled, {
207
+ type: "tool-call-init",
208
+ name: value.name,
209
+ toolCallId: call.toolCallId,
210
+ msg: value.data,
211
+ args: call.input,
212
+ });
213
+ break;
214
+ default:
215
+ event;
216
+ logger.debug(`Unhandled tool message event: ${event}`);
217
+ break;
218
+ }
219
+ }
220
+ else {
221
+ toolResultValues.push(value);
236
222
  }
237
223
  }
238
- else {
239
- toolResultValues.push(value);
240
- }
224
+ const finalValue = toolResultValues.length > 0
225
+ ? toolResultValues.at(-1)
226
+ : undefined;
227
+ resultOutput = formatToolResult(finalValue);
228
+ }
229
+ else {
230
+ resultOutput = formatToolResult(output);
231
+ yield this.processToolEvent(toolsCalled, {
232
+ type: "tool-call-end",
233
+ name: call.toolName,
234
+ toolCallId: call.toolCallId,
235
+ msg: "success",
236
+ args: null,
237
+ });
241
238
  }
242
- const finalValue = toolResultValues.length > 0
243
- ? toolResultValues.at(-1)
244
- : undefined;
245
- resultOutput = formatToolResult(finalValue);
246
239
  }
247
- else {
248
- resultOutput = formatToolResult(output);
249
- yield {
250
- type: "tool-call-end",
251
- name: call.toolName,
240
+ catch (err) {
241
+ resultOutput = `Tool error: ${err instanceof Error ? err.message : String(err)}`;
242
+ yield this.processToolEvent(toolsCalled, {
243
+ type: "tool-call-error",
244
+ name: toolName,
252
245
  toolCallId: call.toolCallId,
253
- msg: "success",
246
+ msg: resultOutput,
254
247
  args: null,
255
- };
248
+ });
256
249
  }
257
250
  }
258
- catch (err) {
259
- resultOutput = `Tool error: ${err instanceof Error ? err.message : String(err)}`;
260
- yield {
261
- type: "tool-call-error",
262
- name: toolName,
263
- toolCallId: call.toolCallId,
264
- msg: resultOutput,
265
- args: null,
266
- };
267
- }
268
251
  }
269
- }
270
- catch (error) {
271
- resultOutput = `Tool error: ${error instanceof Error ? error.message : String(error)}`;
272
- yield {
273
- type: "tool-call-error",
274
- name: toolName,
275
- toolCallId: call.toolCallId,
276
- msg: resultOutput,
277
- args: null,
278
- };
279
- }
280
- toolMessages.push({
281
- role: "tool",
282
- content: [
283
- {
284
- type: "tool-result",
285
- toolName,
252
+ catch (error) {
253
+ resultOutput = `Tool error: ${error instanceof Error ? error.message : String(error)}`;
254
+ yield this.processToolEvent(toolsCalled, {
255
+ type: "tool-call-error",
256
+ name: toolName,
286
257
  toolCallId: call.toolCallId,
287
- output: {
288
- type: "text",
289
- value: resultOutput,
258
+ msg: resultOutput,
259
+ args: null,
260
+ });
261
+ }
262
+ toolMessages.push({
263
+ role: "tool",
264
+ content: [
265
+ {
266
+ type: "tool-result",
267
+ toolName,
268
+ toolCallId: call.toolCallId,
269
+ output: {
270
+ type: "text",
271
+ value: resultOutput,
272
+ },
290
273
  },
291
- },
292
- ],
293
- });
274
+ ],
275
+ });
276
+ }
294
277
  }
295
- messageHistory.appendToolMessages(toolMessages);
296
- // Calculate usage for the current step/iteration
278
+ // Get response and tool calls
279
+ const response = await result.response;
280
+ const responseMessages = response.messages;
281
+ messageHistory.appendResponseMessages(responseMessages);
297
282
  const stepUsage = await result.usage;
298
283
  this._state.usage.inputTokens = stepUsage.inputTokens ?? 0;
299
284
  this._state.usage.outputTokens = stepUsage.outputTokens ?? 0;
300
285
  this._state.usage.totalTokens = stepUsage.totalTokens ?? 0;
301
286
  this._state.usage.cachedInputTokens = stepUsage.cachedInputTokens ?? 0;
302
287
  this._state.usage.reasoningTokens = stepUsage.reasoningTokens ?? 0;
288
+ messageHistory.setContextWindow(stepUsage.totalTokens ?? 0);
303
289
  this._state.totalUsage.inputTokens += stepUsage.inputTokens ?? 0;
304
290
  this._state.totalUsage.outputTokens += stepUsage.outputTokens ?? 0;
305
291
  this._state.totalUsage.totalTokens += stepUsage.totalTokens ?? 0;
@@ -307,6 +293,16 @@ export class Agent {
307
293
  stepUsage.cachedInputTokens ?? 0;
308
294
  this._state.totalUsage.reasoningTokens +=
309
295
  stepUsage.reasoningTokens ?? 0;
296
+ // If finishReason is not tool-calls, break
297
+ const finishReason = await result.finishReason;
298
+ if (finishReason !== "tool-calls") {
299
+ yield {
300
+ type: "agent-stop",
301
+ };
302
+ hasEmittedTerminalEvent = true;
303
+ break;
304
+ }
305
+ messageHistory.appendToolMessages(toolMessages);
310
306
  // Consume the rest of the team if necessary
311
307
  // await result.consumeStream();
312
308
  yield {
@@ -327,6 +323,7 @@ export class Agent {
327
323
  message: errorMsg,
328
324
  };
329
325
  if (NoOutputGeneratedError.isInstance(error)) {
326
+ hasEmittedTerminalEvent = true;
330
327
  break;
331
328
  }
332
329
  // Break loop if we exceed max retries
@@ -335,6 +332,7 @@ export class Agent {
335
332
  type: "agent-error",
336
333
  message: `Exceeded maximum retry attempts (${maxRetries}). Stopping manual loop.`,
337
334
  };
335
+ hasEmittedTerminalEvent = true;
338
336
  break;
339
337
  }
340
338
  }
@@ -342,6 +340,12 @@ export class Agent {
342
340
  this._state.timestamps.stop = performance.now();
343
341
  }
344
342
  }
343
+ // Emit agent-stop if loop ended without emitting a terminal event (maxIterations reached)
344
+ if (!hasEmittedTerminalEvent) {
345
+ yield {
346
+ type: "agent-stop",
347
+ };
348
+ }
345
349
  // Track aggregate usage across all steps when available
346
350
  tokenTracker.trackUsage("repl", this._state.totalUsage);
347
351
  }
@@ -379,6 +383,30 @@ export class Agent {
379
383
  };
380
384
  return this._state;
381
385
  }
386
+ processToolEvent(toolsCalled, event) {
387
+ const toolCallId = event.toolCallId;
388
+ let events;
389
+ if (toolsCalled.has(toolCallId)) {
390
+ const currentEvents = toolsCalled.get(toolCallId);
391
+ if (currentEvents) {
392
+ events = currentEvents;
393
+ events.push(event);
394
+ }
395
+ else {
396
+ events = [event];
397
+ toolsCalled.set(toolCallId, events);
398
+ }
399
+ }
400
+ else {
401
+ events = [event];
402
+ toolsCalled.set(toolCallId, events);
403
+ }
404
+ return {
405
+ type: "tool-call-lifecycle",
406
+ toolCallId: toolCallId,
407
+ events,
408
+ };
409
+ }
382
410
  }
383
411
  function formatToolResult(value) {
384
412
  if (typeof value === "string") {
@@ -1,4 +1,4 @@
1
- import { isZodSchema, zodToJsonSchema } from "../../utils/zod-utils.js";
1
+ import { isZodSchema, zodToJsonSchema } from "../../utils/zod.js";
2
2
  // Prefer global fetch/Headers from Node >= 18
3
3
  const fetchImpl = globalThis.fetch;
4
4
  const HeadersImpl = globalThis.Headers;
package/dist/cli.d.ts CHANGED
@@ -9,12 +9,13 @@ interface CliOptions {
9
9
  promptManager: PromptManager;
10
10
  modelManager: ModelManager;
11
11
  tokenTracker: TokenTracker;
12
- config: Record<PropertyKey, unknown>;
13
12
  tokenCounter: TokenCounter;
14
13
  workspace: WorkspaceContext;
14
+ skillsEnabled?: boolean;
15
15
  }
16
16
  export declare class Cli {
17
17
  private options;
18
+ private skillsEnabled;
18
19
  constructor(options: CliOptions);
19
20
  run(): Promise<void>;
20
21
  }
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../source/cli.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AASxD,UAAU,UAAU;IAClB,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACrC,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,gBAAgB,CAAC;CAC7B;AAWD,qBAAa,GAAG;IACd,OAAO,CAAC,OAAO,CAAa;gBAChB,OAAO,EAAE,UAAU;IAIzB,GAAG;CAkFV"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../source/cli.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AASxD,UAAU,UAAU;IAClB,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAWD,qBAAa,GAAG;IACd,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,aAAa,CAAU;gBACnB,OAAO,EAAE,UAAU;IAKzB,GAAG;CAiHV"}
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { generateObject, generateText, NoSuchToolError, stepCountIs, } from "ai";
2
2
  import { logger } from "./logger.js";
3
3
  import { AiConfig } from "./models/ai-config.js";
4
- import { minSystemPrompt } from "./prompts.js";
4
+ import { systemPrompt } from "./prompts.js";
5
5
  import { BashTool } from "./tools/bash.js";
6
6
  import { CodeInterpreterTool } from "./tools/code-interpreter.js";
7
7
  import { EditFileTool } from "./tools/edit-file.js";
@@ -19,12 +19,13 @@ const activeTools = [
19
19
  ];
20
20
  export class Cli {
21
21
  options;
22
+ skillsEnabled;
22
23
  constructor(options) {
23
24
  this.options = options;
25
+ this.skillsEnabled = options.skillsEnabled ?? true;
24
26
  }
25
27
  async run() {
26
- const { config, promptManager, modelManager, tokenTracker, messageHistory, tokenCounter, } = this.options;
27
- logger.info(config, "Config:");
28
+ const { promptManager, modelManager, tokenTracker, messageHistory, tokenCounter, } = this.options;
28
29
  const abortController = new AbortController();
29
30
  const { signal } = abortController;
30
31
  const cb = () => {
@@ -37,7 +38,12 @@ export class Cli {
37
38
  const userPrompt = promptManager.get();
38
39
  const userMsg = promptManager.getUserMessage();
39
40
  messageHistory.appendUserMessage(userMsg);
40
- const finalSystemPrompt = await minSystemPrompt();
41
+ const finalSystemPrompt = await systemPrompt({
42
+ type: "cli",
43
+ activeTools,
44
+ allowedDirs: this.options.workspace.allowedDirs,
45
+ skillsEnabled: this.skillsEnabled,
46
+ });
41
47
  const aiConfig = new AiConfig({
42
48
  modelMetadata: modelConfig,
43
49
  prompt: userPrompt,
@@ -46,6 +52,10 @@ export class Cli {
46
52
  tokenCounter,
47
53
  workspace: this.options.workspace,
48
54
  });
55
+ // Cleanup function to remove signal handler
56
+ const cleanup = () => {
57
+ process.removeListener("SIGINT", cb);
58
+ };
49
59
  try {
50
60
  const result = await generateText({
51
61
  model: langModel,
@@ -70,13 +80,36 @@ export class Cli {
70
80
  tokenTracker.trackUsage("cli", result.usage);
71
81
  messageHistory.save();
72
82
  process.stdout.end(result.text.endsWith("\n") ? result.text : `${result.text}\n`);
83
+ cleanup();
73
84
  }
74
85
  catch (e) {
75
- if (e instanceof Error) {
76
- logger.error(e);
86
+ // Always cleanup signal handler
87
+ cleanup();
88
+ // Check if it's an abort error
89
+ const isAbortError = e instanceof Error &&
90
+ (e.name === "AbortError" ||
91
+ e.message.includes("aborted") ||
92
+ e.message.includes("No output generated"));
93
+ if (isAbortError) {
94
+ logger.info("CLI execution interrupted by user");
95
+ // Try to save message history before exiting
96
+ try {
97
+ await messageHistory.save();
98
+ }
99
+ catch (_saveError) {
100
+ // Ignore save errors on abort
101
+ logger.warn("Failed to save message history on interrupt");
102
+ }
103
+ process.exit(0); // Exit gracefully
77
104
  }
78
105
  else {
79
- logger.error(JSON.stringify(e, null, 2));
106
+ if (e instanceof Error) {
107
+ logger.error(e);
108
+ }
109
+ else {
110
+ logger.error(JSON.stringify(e, null, 2));
111
+ }
112
+ process.exit(1);
80
113
  }
81
114
  }
82
115
  }
@@ -1,3 +1,3 @@
1
1
  import type { CommandOptions, ReplCommand } from "./types.ts";
2
- export declare const addDirectoryCommand: ({ terminal, workspace, }: CommandOptions) => ReplCommand;
2
+ export declare const addDirectoryCommand: ({ workspace, }: CommandOptions) => ReplCommand;
3
3
  //# sourceMappingURL=add-directory-command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"add-directory-command.d.ts","sourceRoot":"","sources":["../../source/commands/add-directory-command.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D,eAAO,MAAM,mBAAmB,GAAI,0BAGjC,cAAc,KAAG,WAkInB,CAAC"}
1
+ {"version":3,"file":"add-directory-command.d.ts","sourceRoot":"","sources":["../../source/commands/add-directory-command.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D,eAAO,MAAM,mBAAmB,GAAI,gBAEjC,cAAc,KAAG,WA2FnB,CAAC"}