@travisennis/acai 0.0.5 → 0.0.6

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 (311) hide show
  1. package/README.md +4 -2
  2. package/dist/agent/index.d.ts +119 -0
  3. package/dist/agent/index.d.ts.map +1 -0
  4. package/dist/agent/index.js +406 -0
  5. package/dist/agent/manual-loop.d.ts +41 -0
  6. package/dist/agent/manual-loop.d.ts.map +1 -0
  7. package/dist/agent/manual-loop.js +278 -0
  8. package/dist/cli.d.ts +2 -0
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +27 -33
  11. package/dist/commands/add-directory-command.d.ts +3 -0
  12. package/dist/commands/add-directory-command.d.ts.map +1 -0
  13. package/dist/commands/add-directory-command.js +85 -0
  14. package/dist/commands/application-log-command.d.ts.map +1 -1
  15. package/dist/commands/application-log-command.js +34 -0
  16. package/dist/commands/clear-command.d.ts.map +1 -1
  17. package/dist/commands/clear-command.js +8 -0
  18. package/dist/commands/compact-command.d.ts.map +1 -1
  19. package/dist/commands/compact-command.js +15 -2
  20. package/dist/commands/context-command.d.ts +3 -0
  21. package/dist/commands/context-command.d.ts.map +1 -0
  22. package/dist/commands/context-command.js +183 -0
  23. package/dist/commands/copy-command.d.ts.map +1 -1
  24. package/dist/commands/copy-command.js +28 -0
  25. package/dist/commands/edit-command.d.ts.map +1 -1
  26. package/dist/commands/edit-command.js +33 -0
  27. package/dist/commands/edit-prompt-command.d.ts.map +1 -1
  28. package/dist/commands/edit-prompt-command.js +28 -0
  29. package/dist/commands/exit-command.d.ts.map +1 -1
  30. package/dist/commands/exit-command.js +20 -0
  31. package/dist/commands/files-command.d.ts.map +1 -1
  32. package/dist/commands/files-command.js +57 -0
  33. package/dist/commands/generate-rules-command.d.ts.map +1 -1
  34. package/dist/commands/generate-rules-command.js +311 -1
  35. package/dist/commands/handoff-command.d.ts +3 -0
  36. package/dist/commands/handoff-command.d.ts.map +1 -0
  37. package/dist/commands/handoff-command.js +202 -0
  38. package/dist/commands/health-command.d.ts.map +1 -1
  39. package/dist/commands/health-command.js +119 -2
  40. package/dist/commands/help-command.d.ts.map +1 -1
  41. package/dist/commands/help-command.js +28 -0
  42. package/dist/commands/history-command.d.ts +3 -0
  43. package/dist/commands/history-command.d.ts.map +1 -0
  44. package/dist/commands/history-command.js +534 -0
  45. package/dist/commands/init-command.d.ts +1 -1
  46. package/dist/commands/init-command.d.ts.map +1 -1
  47. package/dist/commands/init-command.js +55 -18
  48. package/dist/commands/last-log-command.d.ts.map +1 -1
  49. package/dist/commands/last-log-command.js +27 -0
  50. package/dist/commands/list-directories-command.d.ts +3 -0
  51. package/dist/commands/list-directories-command.d.ts.map +1 -0
  52. package/dist/commands/list-directories-command.js +48 -0
  53. package/dist/commands/list-tools-command.d.ts.map +1 -1
  54. package/dist/commands/list-tools-command.js +66 -3
  55. package/dist/commands/manager.d.ts +15 -3
  56. package/dist/commands/manager.d.ts.map +1 -1
  57. package/dist/commands/manager.js +86 -26
  58. package/dist/commands/model-command.d.ts +22 -0
  59. package/dist/commands/model-command.d.ts.map +1 -1
  60. package/dist/commands/model-command.js +256 -0
  61. package/dist/commands/paste-command.d.ts.map +1 -1
  62. package/dist/commands/paste-command.js +92 -0
  63. package/dist/commands/pickup-command.d.ts +3 -0
  64. package/dist/commands/pickup-command.d.ts.map +1 -0
  65. package/dist/commands/pickup-command.js +161 -0
  66. package/dist/commands/prompt-command.d.ts +1 -1
  67. package/dist/commands/prompt-command.d.ts.map +1 -1
  68. package/dist/commands/prompt-command.js +117 -2
  69. package/dist/commands/remove-directory-command.d.ts +3 -0
  70. package/dist/commands/remove-directory-command.d.ts.map +1 -0
  71. package/dist/commands/remove-directory-command.js +87 -0
  72. package/dist/commands/reset-command.d.ts +1 -1
  73. package/dist/commands/reset-command.d.ts.map +1 -1
  74. package/dist/commands/reset-command.js +13 -2
  75. package/dist/commands/rules-command.d.ts.map +1 -1
  76. package/dist/commands/rules-command.js +65 -0
  77. package/dist/commands/save-command.d.ts.map +1 -1
  78. package/dist/commands/save-command.js +12 -0
  79. package/dist/commands/shell-command.d.ts.map +1 -1
  80. package/dist/commands/shell-command.js +68 -0
  81. package/dist/commands/types.d.ts +9 -4
  82. package/dist/commands/types.d.ts.map +1 -1
  83. package/dist/commands/usage-command.d.ts.map +1 -1
  84. package/dist/commands/usage-command.js +22 -0
  85. package/dist/config.d.ts +6 -7
  86. package/dist/config.d.ts.map +1 -1
  87. package/dist/config.js +23 -29
  88. package/dist/formatting.d.ts +108 -0
  89. package/dist/formatting.d.ts.map +1 -1
  90. package/dist/formatting.js +147 -0
  91. package/dist/index.d.ts +7 -2
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +140 -38
  94. package/dist/logger.d.ts.map +1 -1
  95. package/dist/logger.js +47 -18
  96. package/dist/mentions.d.ts +2 -1
  97. package/dist/mentions.d.ts.map +1 -1
  98. package/dist/mentions.js +16 -1
  99. package/dist/messages.d.ts +8 -0
  100. package/dist/messages.d.ts.map +1 -1
  101. package/dist/messages.js +56 -19
  102. package/dist/middleware/cache.d.ts +3 -0
  103. package/dist/middleware/cache.d.ts.map +1 -0
  104. package/dist/middleware/cache.js +53 -0
  105. package/dist/middleware/index.d.ts +1 -0
  106. package/dist/middleware/index.d.ts.map +1 -1
  107. package/dist/middleware/index.js +1 -0
  108. package/dist/models/ai-config.d.ts +4 -2
  109. package/dist/models/ai-config.d.ts.map +1 -1
  110. package/dist/models/ai-config.js +12 -2
  111. package/dist/models/anthropic-provider.d.ts.map +1 -1
  112. package/dist/models/anthropic-provider.js +3 -60
  113. package/dist/models/manager.d.ts +2 -1
  114. package/dist/models/manager.d.ts.map +1 -1
  115. package/dist/models/manager.js +26 -2
  116. package/dist/models/openrouter-provider.d.ts +7 -14
  117. package/dist/models/openrouter-provider.d.ts.map +1 -1
  118. package/dist/models/openrouter-provider.js +114 -169
  119. package/dist/models/providers.d.ts +1 -1
  120. package/dist/models/providers.d.ts.map +1 -1
  121. package/dist/prompts.d.ts +1 -0
  122. package/dist/prompts.d.ts.map +1 -1
  123. package/dist/prompts.js +53 -4
  124. package/dist/repl/display-tool-messages.d.ts +1 -1
  125. package/dist/repl/display-tool-messages.d.ts.map +1 -1
  126. package/dist/repl/display-tool-messages.js +47 -44
  127. package/dist/repl/get-prompt-header.d.ts.map +1 -1
  128. package/dist/repl/get-prompt-header.js +1 -30
  129. package/dist/repl/project-status-line.d.ts +2 -0
  130. package/dist/repl/project-status-line.d.ts.map +1 -0
  131. package/dist/repl/project-status-line.js +31 -0
  132. package/dist/repl/prompt.d.ts +21 -0
  133. package/dist/repl/prompt.d.ts.map +1 -0
  134. package/dist/{repl-prompt.js → repl/prompt.js} +119 -22
  135. package/dist/repl/tool-call-repair.d.ts.map +1 -1
  136. package/dist/repl/tool-call-repair.js +8 -4
  137. package/dist/repl-new.d.ts +53 -0
  138. package/dist/repl-new.d.ts.map +1 -0
  139. package/dist/repl-new.js +374 -0
  140. package/dist/repl.d.ts +3 -5
  141. package/dist/repl.d.ts.map +1 -1
  142. package/dist/repl.js +74 -166
  143. package/dist/terminal/checkbox-prompt.d.ts.map +1 -1
  144. package/dist/terminal/checkbox-prompt.js +10 -4
  145. package/dist/terminal/index.d.ts +7 -0
  146. package/dist/terminal/index.d.ts.map +1 -1
  147. package/dist/terminal/index.js +94 -0
  148. package/dist/terminal/input-prompt.d.ts +2 -1
  149. package/dist/terminal/input-prompt.d.ts.map +1 -1
  150. package/dist/terminal/markdown.js +3 -0
  151. package/dist/terminal/search-prompt.d.ts.map +1 -1
  152. package/dist/terminal/search-prompt.js +11 -10
  153. package/dist/terminal/select-prompt.d.ts +2 -2
  154. package/dist/terminal/select-prompt.d.ts.map +1 -1
  155. package/dist/terminal/select-prompt.js +47 -39
  156. package/dist/tokens/threshold.d.ts +35 -0
  157. package/dist/tokens/threshold.d.ts.map +1 -0
  158. package/dist/tokens/threshold.js +85 -0
  159. package/dist/tools/advanced-edit-file.d.ts +69 -0
  160. package/dist/tools/advanced-edit-file.d.ts.map +1 -0
  161. package/dist/tools/advanced-edit-file.js +281 -0
  162. package/dist/tools/agent.d.ts +16 -5
  163. package/dist/tools/agent.d.ts.map +1 -1
  164. package/dist/tools/agent.js +71 -58
  165. package/dist/tools/bash-utils.d.ts +1 -1
  166. package/dist/tools/bash-utils.d.ts.map +1 -1
  167. package/dist/tools/bash-utils.js +14 -6
  168. package/dist/tools/bash.d.ts +21 -12
  169. package/dist/tools/bash.d.ts.map +1 -1
  170. package/dist/tools/bash.js +88 -135
  171. package/dist/tools/code-interpreter.d.ts +21 -9
  172. package/dist/tools/code-interpreter.d.ts.map +1 -1
  173. package/dist/tools/code-interpreter.js +138 -137
  174. package/dist/tools/delete-file.d.ts +17 -10
  175. package/dist/tools/delete-file.d.ts.map +1 -1
  176. package/dist/tools/delete-file.js +51 -95
  177. package/dist/tools/directory-tree.d.ts +17 -6
  178. package/dist/tools/directory-tree.d.ts.map +1 -1
  179. package/dist/tools/directory-tree.js +47 -49
  180. package/dist/tools/dynamic-tool-loader.d.ts +18 -8
  181. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
  182. package/dist/tools/dynamic-tool-loader.js +121 -129
  183. package/dist/tools/dynamic-tool-parser.d.ts +1 -0
  184. package/dist/tools/dynamic-tool-parser.d.ts.map +1 -1
  185. package/dist/tools/dynamic-tool-parser.js +1 -0
  186. package/dist/tools/edit-file.d.ts +35 -15
  187. package/dist/tools/edit-file.d.ts.map +1 -1
  188. package/dist/tools/edit-file.js +112 -112
  189. package/dist/tools/filesystem-utils.d.ts +2 -1
  190. package/dist/tools/filesystem-utils.d.ts.map +1 -1
  191. package/dist/tools/filesystem-utils.js +31 -17
  192. package/dist/tools/glob.d.ts +36 -0
  193. package/dist/tools/glob.d.ts.map +1 -0
  194. package/dist/tools/glob.js +143 -0
  195. package/dist/tools/grep.d.ts +73 -12
  196. package/dist/tools/grep.d.ts.map +1 -1
  197. package/dist/tools/grep.js +413 -168
  198. package/dist/tools/index.d.ts +204 -124
  199. package/dist/tools/index.d.ts.map +1 -1
  200. package/dist/tools/index.js +242 -135
  201. package/dist/tools/llm-edit-fixer.d.ts +25 -0
  202. package/dist/tools/llm-edit-fixer.d.ts.map +1 -0
  203. package/dist/tools/llm-edit-fixer.js +150 -0
  204. package/dist/tools/move-file.d.ts +19 -7
  205. package/dist/tools/move-file.d.ts.map +1 -1
  206. package/dist/tools/move-file.js +40 -33
  207. package/dist/tools/read-file.d.ts +47 -9
  208. package/dist/tools/read-file.d.ts.map +1 -1
  209. package/dist/tools/read-file.js +74 -69
  210. package/dist/tools/read-multiple-files.d.ts +17 -6
  211. package/dist/tools/read-multiple-files.d.ts.map +1 -1
  212. package/dist/tools/read-multiple-files.js +76 -73
  213. package/dist/tools/save-file.d.ts +45 -12
  214. package/dist/tools/save-file.d.ts.map +1 -1
  215. package/dist/tools/save-file.js +58 -101
  216. package/dist/tools/think.d.ts +15 -7
  217. package/dist/tools/think.d.ts.map +1 -1
  218. package/dist/tools/think.js +30 -22
  219. package/dist/tools/types.d.ts +4 -10
  220. package/dist/tools/types.d.ts.map +1 -1
  221. package/dist/tools/types.js +9 -0
  222. package/dist/tools/utils.d.ts +14 -0
  223. package/dist/tools/utils.d.ts.map +1 -0
  224. package/dist/tools/utils.js +16 -0
  225. package/dist/tools/web-fetch.d.ts +11 -4
  226. package/dist/tools/web-fetch.d.ts.map +1 -1
  227. package/dist/tools/web-fetch.js +39 -38
  228. package/dist/tools/web-search.d.ts +15 -6
  229. package/dist/tools/web-search.d.ts.map +1 -1
  230. package/dist/tools/web-search.js +50 -32
  231. package/dist/tui/autocomplete.d.ts +44 -0
  232. package/dist/tui/autocomplete.d.ts.map +1 -0
  233. package/dist/tui/autocomplete.js +466 -0
  234. package/dist/tui/components/assistant-message.d.ts +18 -0
  235. package/dist/tui/components/assistant-message.d.ts.map +1 -0
  236. package/dist/tui/components/assistant-message.js +29 -0
  237. package/dist/tui/components/editor.d.ts +51 -0
  238. package/dist/tui/components/editor.d.ts.map +1 -0
  239. package/dist/tui/components/editor.js +758 -0
  240. package/dist/tui/components/footer.d.ts +24 -0
  241. package/dist/tui/components/footer.d.ts.map +1 -0
  242. package/dist/tui/components/footer.js +197 -0
  243. package/dist/tui/components/input.d.ts +14 -0
  244. package/dist/tui/components/input.d.ts.map +1 -0
  245. package/dist/tui/components/input.js +122 -0
  246. package/dist/tui/components/loader.d.ts +19 -0
  247. package/dist/tui/components/loader.d.ts.map +1 -0
  248. package/dist/tui/components/loader.js +45 -0
  249. package/dist/tui/components/markdown.d.ts +103 -0
  250. package/dist/tui/components/markdown.d.ts.map +1 -0
  251. package/dist/tui/components/markdown.js +533 -0
  252. package/dist/tui/components/modal.d.ts +40 -0
  253. package/dist/tui/components/modal.d.ts.map +1 -0
  254. package/dist/tui/components/modal.js +292 -0
  255. package/dist/tui/components/prompt-status.d.ts +16 -0
  256. package/dist/tui/components/prompt-status.d.ts.map +1 -0
  257. package/dist/tui/components/prompt-status.js +21 -0
  258. package/dist/tui/components/select-list.d.ts +22 -0
  259. package/dist/tui/components/select-list.d.ts.map +1 -0
  260. package/dist/tui/components/select-list.js +143 -0
  261. package/dist/tui/components/spacer.d.ts +16 -0
  262. package/dist/tui/components/spacer.d.ts.map +1 -0
  263. package/dist/tui/components/spacer.js +27 -0
  264. package/dist/tui/components/text.d.ts +26 -0
  265. package/dist/tui/components/text.d.ts.map +1 -0
  266. package/dist/tui/components/text.js +143 -0
  267. package/dist/tui/components/thinking-block.d.ts +14 -0
  268. package/dist/tui/components/thinking-block.d.ts.map +1 -0
  269. package/dist/tui/components/thinking-block.js +30 -0
  270. package/dist/tui/components/tool-execution.d.ts +17 -0
  271. package/dist/tui/components/tool-execution.d.ts.map +1 -0
  272. package/dist/tui/components/tool-execution.js +153 -0
  273. package/dist/tui/components/user-message.d.ts +9 -0
  274. package/dist/tui/components/user-message.d.ts.map +1 -0
  275. package/dist/tui/components/user-message.js +21 -0
  276. package/dist/tui/components/welcome.d.ts +6 -0
  277. package/dist/tui/components/welcome.d.ts.map +1 -0
  278. package/dist/tui/components/welcome.js +30 -0
  279. package/dist/tui/index.d.ts +14 -0
  280. package/dist/tui/index.d.ts.map +1 -0
  281. package/dist/tui/index.js +18 -0
  282. package/dist/tui/terminal.d.ts +37 -0
  283. package/dist/tui/terminal.d.ts.map +1 -0
  284. package/dist/tui/terminal.js +104 -0
  285. package/dist/tui/tui.d.ts +67 -0
  286. package/dist/tui/tui.d.ts.map +1 -0
  287. package/dist/tui/tui.js +184 -0
  288. package/dist/tui/utils.d.ts +19 -0
  289. package/dist/tui/utils.d.ts.map +1 -0
  290. package/dist/tui/utils.js +31 -0
  291. package/dist/utils/generators.d.ts +3 -0
  292. package/dist/utils/generators.d.ts.map +1 -0
  293. package/dist/utils/generators.js +25 -0
  294. package/dist/utils/iterables.d.ts +2 -0
  295. package/dist/utils/iterables.d.ts.map +1 -0
  296. package/dist/utils/iterables.js +6 -0
  297. package/package.json +16 -16
  298. package/dist/conversation-analyzer.d.ts +0 -11
  299. package/dist/conversation-analyzer.d.ts.map +0 -1
  300. package/dist/conversation-analyzer.js +0 -88
  301. package/dist/repl-prompt.d.ts +0 -15
  302. package/dist/repl-prompt.d.ts.map +0 -1
  303. package/dist/tokens/manage-output.d.ts +0 -34
  304. package/dist/tokens/manage-output.d.ts.map +0 -1
  305. package/dist/tokens/manage-output.js +0 -44
  306. package/dist/tool-executor.d.ts +0 -28
  307. package/dist/tool-executor.d.ts.map +0 -1
  308. package/dist/tool-executor.js +0 -74
  309. package/dist/tools/file-editing-utils.d.ts +0 -2
  310. package/dist/tools/file-editing-utils.d.ts.map +0 -1
  311. package/dist/tools/file-editing-utils.js +0 -135
package/README.md CHANGED
@@ -182,8 +182,8 @@ acai
182
182
  # Specify a model
183
183
  acai --model anthropic:sonnet
184
184
 
185
- # One-shot mode
186
- acai -p "What files contain the term 'toolCallRepair'?" -o
185
+ # CLI mode (one-shot execution)
186
+ acai -p "What files contain the term 'toolCallRepair'?"
187
187
 
188
188
  # Pipe input
189
189
  echo "How many TypeScript files are in this project?" | acai
@@ -216,6 +216,8 @@ You can reference files and directories directly in your prompts:
216
216
  - `@http://example.com` - Fetch and include web content
217
217
  - ``!`command` `` - Execute shell command and include output
218
218
 
219
+ **Note:** Using `-p/--prompt` runs in CLI mode (one-shot execution), while running without a prompt starts interactive REPL mode.
220
+
219
221
  For a list of available commands, type `/help` within the REPL.
220
222
 
221
223
  ## Interactive CLI Commands
@@ -0,0 +1,119 @@
1
+ import type { LanguageModelUsage, ToolExecuteFunction } from "ai";
2
+ import { type ToolCallRepairFunction } from "ai";
3
+ import type { MessageHistory } from "../messages.ts";
4
+ import type { ModelManager } from "../models/manager.ts";
5
+ import type { ModelMetadata } from "../models/providers.ts";
6
+ import type { TokenTracker } from "../tokens/tracker.ts";
7
+ import type { CompleteToolSet } from "../tools/index.ts";
8
+ type AgentOptions = {
9
+ modelManager: ModelManager;
10
+ tokenTracker: TokenTracker;
11
+ messageHistory: MessageHistory;
12
+ maxIterations?: number;
13
+ maxRetries?: number;
14
+ toolCallRepair?: ToolCallRepairFunction<CompleteToolSet>;
15
+ };
16
+ type RunOptions = {
17
+ systemPrompt: string;
18
+ input: string;
19
+ toolDefs: CompleteToolSet;
20
+ executors: Map<keyof CompleteToolSet, ToolExecuteFunction<unknown, string>>;
21
+ abortSignal?: AbortSignal;
22
+ };
23
+ export type ToolEvent = {
24
+ type: "tool-call-start";
25
+ name: string;
26
+ toolCallId: string;
27
+ msg: string;
28
+ args: unknown;
29
+ } | {
30
+ type: "tool-call-update";
31
+ name: string;
32
+ toolCallId: string;
33
+ msg: string;
34
+ args: unknown;
35
+ } | {
36
+ type: "tool-call-end";
37
+ name: string;
38
+ toolCallId: string;
39
+ msg: string;
40
+ args: unknown;
41
+ } | {
42
+ type: "tool-call-error";
43
+ name: string;
44
+ toolCallId: string;
45
+ msg: string;
46
+ args: unknown;
47
+ };
48
+ export type AgentEvent = {
49
+ type: "agent-start";
50
+ } | {
51
+ type: "agent-stop";
52
+ } | {
53
+ type: "agent-error";
54
+ message: string;
55
+ } | {
56
+ type: "step-start";
57
+ } | {
58
+ type: "step-stop";
59
+ } | {
60
+ type: "thinking-start";
61
+ content: string;
62
+ } | {
63
+ type: "thinking";
64
+ content: string;
65
+ } | {
66
+ type: "thinking-end";
67
+ content: string;
68
+ } | {
69
+ type: "message";
70
+ role: "user";
71
+ content: string;
72
+ } | {
73
+ type: "message-start";
74
+ role: "assistant";
75
+ content: string;
76
+ } | {
77
+ type: "message";
78
+ role: "assistant";
79
+ content: string;
80
+ } | {
81
+ type: "message-end";
82
+ role: "assistant";
83
+ content: string;
84
+ } | ToolEvent;
85
+ export type AgentState = {
86
+ modelId: string;
87
+ modelConfig: ModelMetadata;
88
+ steps: {
89
+ toolResults: Array<{
90
+ toolName: string;
91
+ }>;
92
+ toolCalls: Array<{
93
+ toolName: string;
94
+ }>;
95
+ }[];
96
+ usage: {
97
+ [K in keyof LanguageModelUsage]-?: number;
98
+ };
99
+ totalUsage: {
100
+ [K in keyof LanguageModelUsage]-?: number;
101
+ };
102
+ timestamps: {
103
+ start: number;
104
+ stop: number;
105
+ };
106
+ };
107
+ export declare class Agent {
108
+ private opts;
109
+ private _state;
110
+ private abortController;
111
+ constructor(opts: AgentOptions);
112
+ get state(): AgentState;
113
+ get abortSignal(): AbortSignal;
114
+ run(args: RunOptions): AsyncGenerator<AgentEvent>;
115
+ abort(): void;
116
+ resetState(): AgentState;
117
+ }
118
+ export {};
119
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/agent/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,406 @@
1
+ import { NoOutputGeneratedError, streamText, } from "ai";
2
+ import { logger } from "../logger.js";
3
+ import { AiConfig } from "../models/ai-config.js";
4
+ import { isToolMessage } from "../tools/types.js";
5
+ import { isAsyncIterable } from "../utils/iterables.js";
6
+ export class Agent {
7
+ opts;
8
+ _state;
9
+ abortController;
10
+ constructor(opts) {
11
+ this.opts = opts;
12
+ this.abortController = new AbortController();
13
+ this._state = this.resetState();
14
+ }
15
+ get state() {
16
+ return this._state;
17
+ }
18
+ get abortSignal() {
19
+ return this.abortController.signal;
20
+ }
21
+ async *run(args) {
22
+ const { modelManager, messageHistory, tokenTracker, maxIterations = 90, maxRetries = 2, toolCallRepair, } = this.opts;
23
+ this.resetState();
24
+ this._state.timestamps.start = performance.now();
25
+ const { systemPrompt, input, toolDefs, executors, abortSignal } = args;
26
+ const langModel = modelManager.getModel("repl");
27
+ const modelConfig = modelManager.getModelMetadata("repl");
28
+ const aiConfig = new AiConfig({
29
+ modelMetadata: modelConfig,
30
+ prompt: input,
31
+ });
32
+ yield {
33
+ type: "agent-start",
34
+ };
35
+ yield {
36
+ type: "message",
37
+ role: "user",
38
+ content: input,
39
+ };
40
+ let iter = 0;
41
+ let consecutiveErrors = 0;
42
+ while (iter < maxIterations) {
43
+ if (abortSignal?.aborted) {
44
+ logger.warn("The agent loop was aborted by the user.");
45
+ // terminal.warn("Operation aborted by user.");
46
+ yield {
47
+ type: "agent-stop",
48
+ };
49
+ break;
50
+ }
51
+ yield {
52
+ type: "step-start",
53
+ };
54
+ try {
55
+ const result = streamText({
56
+ model: langModel,
57
+ maxOutputTokens: aiConfig.maxOutputTokens(),
58
+ system: systemPrompt,
59
+ messages: messageHistory.get(),
60
+ temperature: aiConfig.temperature(),
61
+ topP: aiConfig.topP(),
62
+ maxRetries: 2,
63
+ providerOptions: aiConfig.providerOptions(),
64
+ tools: toolDefs,
65
+ // biome-ignore lint/style/useNamingConvention: third-party code
66
+ experimental_repairToolCall: toolCallRepair,
67
+ abortSignal,
68
+ });
69
+ let accumulatedText = "";
70
+ let accumulatedReasoning = "";
71
+ for await (const chunk of result.fullStream) {
72
+ if (chunk.type === "reasoning-start") {
73
+ yield {
74
+ type: "thinking-start",
75
+ content: "",
76
+ };
77
+ }
78
+ else if (chunk.type === "reasoning-delta") {
79
+ accumulatedReasoning += chunk.text;
80
+ yield {
81
+ type: "thinking",
82
+ content: accumulatedReasoning,
83
+ };
84
+ }
85
+ else if (chunk.type === "reasoning-end") {
86
+ yield {
87
+ type: "thinking-end",
88
+ content: accumulatedReasoning,
89
+ };
90
+ }
91
+ else if (chunk.type === "text-start") {
92
+ yield {
93
+ type: "message-start",
94
+ role: "assistant",
95
+ content: "",
96
+ };
97
+ }
98
+ else if (chunk.type === "text-delta") {
99
+ accumulatedText += chunk.text;
100
+ yield {
101
+ type: "message",
102
+ role: "assistant",
103
+ content: accumulatedText,
104
+ };
105
+ }
106
+ else if (chunk.type === "text-end") {
107
+ yield {
108
+ type: "message-end",
109
+ role: "assistant",
110
+ content: accumulatedText,
111
+ };
112
+ }
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}`;
193
+ }
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;
236
+ }
237
+ }
238
+ else {
239
+ toolResultValues.push(value);
240
+ }
241
+ }
242
+ const finalValue = toolResultValues.length > 0
243
+ ? toolResultValues.at(-1)
244
+ : undefined;
245
+ resultOutput = formatToolResult(finalValue);
246
+ }
247
+ else {
248
+ resultOutput = formatToolResult(output);
249
+ yield {
250
+ type: "tool-call-end",
251
+ name: call.toolName,
252
+ toolCallId: call.toolCallId,
253
+ msg: "success",
254
+ args: null,
255
+ };
256
+ }
257
+ }
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
+ }
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,
286
+ toolCallId: call.toolCallId,
287
+ output: {
288
+ type: "text",
289
+ value: resultOutput,
290
+ },
291
+ },
292
+ ],
293
+ });
294
+ }
295
+ messageHistory.appendToolMessages(toolMessages);
296
+ // Calculate usage for the current step/iteration
297
+ const stepUsage = await result.usage;
298
+ this._state.usage.inputTokens = stepUsage.inputTokens ?? 0;
299
+ this._state.usage.outputTokens = stepUsage.outputTokens ?? 0;
300
+ this._state.usage.totalTokens = stepUsage.totalTokens ?? 0;
301
+ this._state.usage.cachedInputTokens = stepUsage.cachedInputTokens ?? 0;
302
+ this._state.usage.reasoningTokens = stepUsage.reasoningTokens ?? 0;
303
+ this._state.totalUsage.inputTokens += stepUsage.inputTokens ?? 0;
304
+ this._state.totalUsage.outputTokens += stepUsage.outputTokens ?? 0;
305
+ this._state.totalUsage.totalTokens += stepUsage.totalTokens ?? 0;
306
+ this._state.totalUsage.cachedInputTokens +=
307
+ stepUsage.cachedInputTokens ?? 0;
308
+ this._state.totalUsage.reasoningTokens +=
309
+ stepUsage.reasoningTokens ?? 0;
310
+ // Consume the rest of the team if necessary
311
+ // await result.consumeStream();
312
+ yield {
313
+ type: "step-stop",
314
+ };
315
+ // continue iterations
316
+ iter += 1;
317
+ }
318
+ catch (error) {
319
+ consecutiveErrors += 1;
320
+ logger.error(error, // Log the full error object
321
+ `Error on manual agent loop streamText (attempt ${consecutiveErrors}/${maxRetries + 1})`);
322
+ const errorMsg = error.message.length > 100
323
+ ? `${error.message.slice(0, 100)}...`
324
+ : error.message;
325
+ yield {
326
+ type: "agent-error",
327
+ message: errorMsg,
328
+ };
329
+ if (NoOutputGeneratedError.isInstance(error)) {
330
+ break;
331
+ }
332
+ // Break loop if we exceed max retries
333
+ if (consecutiveErrors > maxRetries) {
334
+ yield {
335
+ type: "agent-error",
336
+ message: `Exceeded maximum retry attempts (${maxRetries}). Stopping manual loop.`,
337
+ };
338
+ break;
339
+ }
340
+ }
341
+ finally {
342
+ this._state.timestamps.stop = performance.now();
343
+ }
344
+ }
345
+ // Track aggregate usage across all steps when available
346
+ tokenTracker.trackUsage("repl", this._state.totalUsage);
347
+ }
348
+ abort() {
349
+ this.abortController.abort();
350
+ // Reset the abort controller for the next run
351
+ this.abortController = new AbortController();
352
+ }
353
+ resetState() {
354
+ const { modelManager,
355
+ // messageHistory,
356
+ } = this.opts;
357
+ this._state = {
358
+ modelId: modelManager.getModel("repl").modelId,
359
+ modelConfig: modelManager.getModelMetadata("repl"),
360
+ usage: {
361
+ inputTokens: 0,
362
+ outputTokens: 0,
363
+ totalTokens: 0,
364
+ reasoningTokens: 0,
365
+ cachedInputTokens: 0,
366
+ },
367
+ totalUsage: {
368
+ inputTokens: 0,
369
+ outputTokens: 0,
370
+ totalTokens: 0,
371
+ reasoningTokens: 0,
372
+ cachedInputTokens: 0,
373
+ },
374
+ steps: [],
375
+ timestamps: {
376
+ start: 0,
377
+ stop: 0,
378
+ },
379
+ };
380
+ return this._state;
381
+ }
382
+ }
383
+ function formatToolResult(value) {
384
+ if (typeof value === "string") {
385
+ return value;
386
+ }
387
+ if (value === undefined) {
388
+ return "";
389
+ }
390
+ if (value === null) {
391
+ return "null";
392
+ }
393
+ if (typeof value === "number" || typeof value === "boolean") {
394
+ return String(value);
395
+ }
396
+ try {
397
+ const serialized = JSON.stringify(value);
398
+ if (typeof serialized === "string") {
399
+ return serialized;
400
+ }
401
+ }
402
+ catch {
403
+ // noop - fallback below
404
+ }
405
+ return String(value);
406
+ }
@@ -0,0 +1,41 @@
1
+ import type { LanguageModelUsage, ToolExecuteFunction } from "ai";
2
+ import { type ToolCallRepairFunction } from "ai";
3
+ import type { MessageHistory } from "../messages.ts";
4
+ import type { ModelManager } from "../models/manager.ts";
5
+ import type { Terminal } from "../terminal/index.ts";
6
+ import type { CompleteToolSet } from "../tools/index.ts";
7
+ type ManualLoopOptions = {
8
+ modelManager: ModelManager;
9
+ terminal: Terminal;
10
+ messageHistory: MessageHistory;
11
+ systemPrompt: string;
12
+ input: string;
13
+ toolDefs: CompleteToolSet;
14
+ executors: Map<keyof CompleteToolSet, ToolExecuteFunction<unknown, string>>;
15
+ maxIterations?: number;
16
+ maxRetries?: number;
17
+ abortSignal?: AbortSignal;
18
+ toolCallRepair?: ToolCallRepairFunction<CompleteToolSet>;
19
+ };
20
+ type ManualLoopResult = {
21
+ steps: {
22
+ toolResults: Array<{
23
+ toolName: string;
24
+ }>;
25
+ toolCalls: Array<{
26
+ toolName: string;
27
+ }>;
28
+ }[];
29
+ usage: {
30
+ [K in keyof LanguageModelUsage]-?: number;
31
+ };
32
+ totalUsage: {
33
+ [K in keyof LanguageModelUsage]-?: number;
34
+ };
35
+ };
36
+ export declare function runManualLoop(opts: ManualLoopOptions): Promise<ManualLoopResult>;
37
+ export declare function consumeToolAsyncIterable(iterable: AsyncIterable<unknown>, terminal?: Terminal): Promise<{
38
+ finalValue: unknown;
39
+ }>;
40
+ export {};
41
+ //# sourceMappingURL=manual-loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manual-loop.d.ts","sourceRoot":"","sources":["../../source/agent/manual-loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EAEpB,MAAM,IAAI,CAAC;AACZ,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,IAAI,CAAC;AAEZ,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIzD,KAAK,iBAAiB,GAAG;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,CAAC;IAC1B,SAAS,EAAE,GAAG,CAAC,MAAM,eAAe,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,cAAc,CAAC,EAAE,sBAAsB,CAAC,eAAe,CAAC,CAAC;CAC1D,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,KAAK,EAAE;QACL,WAAW,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACzC,SAAS,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACxC,EAAE,CAAC;IACJ,KAAK,EAAE;SAAG,CAAC,IAAI,MAAM,kBAAkB,CAAC,CAAC,GAAG,MAAM;KAAE,CAAC;IACrD,UAAU,EAAE;SAAG,CAAC,IAAI,MAAM,kBAAkB,CAAC,CAAC,GAAG,MAAM;KAAE,CAAC;CAC3D,CAAC;AAEF,wBAAsB,aAAa,CACjC,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAoS3B;AAED,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAChC,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC;IAAE,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,CAuBlC"}