@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
@@ -1,69 +1,67 @@
1
1
  import fs from "node:fs/promises";
2
2
  import path from "node:path";
3
- import { tool } from "ai";
4
3
  import { z } from "zod";
5
- import { config } from "../config.js";
6
4
  import style from "../terminal/style.js";
7
- import { manageOutput } from "../tokens/manage-output.js";
5
+ import { manageTokenLimit } from "../tokens/threshold.js";
8
6
  import ignore from "../utils/ignore.js";
9
7
  import { joinWorkingDir, validatePath } from "./filesystem-utils.js";
10
8
  export const DirectoryTreeTool = {
11
9
  name: "directoryTree",
12
10
  };
13
- export const createDirectoryTreeTool = async ({ workingDir, sendData, tokenCounter, }) => {
14
- const allowedDirectory = workingDir;
11
+ const inputSchema = z.object({
12
+ path: z.string().describe("The path."),
13
+ });
14
+ export const createDirectoryTreeTool = async ({ workingDir, allowedDirs, tokenCounter, }) => {
15
+ const allowedDirectory = allowedDirs ?? [workingDir];
15
16
  return {
16
- [DirectoryTreeTool.name]: tool({
17
+ toolDef: {
17
18
  description: "Get a directory tree structure for a given path. This tool will ignore any directories or files listed in a .gitignore file. Use this tool when you need to see a complete directory tree for a project. This can be used to get an understanding of how a project is organized and what files are available before using other file system tools.",
18
- inputSchema: z.object({
19
- path: z.string().describe("The path."),
20
- }),
21
- execute: async ({ path }, { toolCallId, abortSignal }) => {
19
+ inputSchema,
20
+ },
21
+ async *execute({ path }, { toolCallId, abortSignal }) {
22
+ try {
22
23
  // Check if execution has been aborted
23
24
  if (abortSignal?.aborted) {
24
25
  throw new Error("Directory tree listing aborted");
25
26
  }
26
- let validPath;
27
- try {
28
- if (abortSignal?.aborted) {
29
- throw new Error("Directory tree listing aborted before path validation");
30
- }
31
- sendData?.({
32
- id: toolCallId,
33
- event: "tool-init",
34
- data: `Listing directory tree: ${style.cyan(path)}`,
35
- });
36
- validPath = await validatePath(joinWorkingDir(path, workingDir), allowedDirectory, { abortSignal });
37
- const maxTokens = (await config.readProjectConfig()).tools.maxTokens;
38
- const rawTree = await directoryTree(validPath);
39
- const managed = manageOutput(rawTree, {
40
- tokenCounter,
41
- threshold: maxTokens,
42
- });
43
- if (managed.truncated) {
44
- sendData?.({
45
- id: toolCallId,
46
- event: "tool-update",
47
- data: { primary: managed.warning },
48
- });
49
- }
50
- sendData?.({
51
- id: toolCallId,
52
- event: "tool-completion",
53
- data: `Done (${managed.tokenCount} tokens)`,
54
- });
55
- return managed.content;
27
+ yield {
28
+ name: DirectoryTreeTool.name,
29
+ id: toolCallId,
30
+ event: "tool-init",
31
+ data: `${style.cyan(path)}`,
32
+ };
33
+ const validPath = await validatePath(joinWorkingDir(path, workingDir), allowedDirectory, { abortSignal });
34
+ if (abortSignal?.aborted) {
35
+ throw new Error("Directory tree listing aborted before tree generation");
56
36
  }
57
- catch (error) {
58
- sendData?.({
59
- id: toolCallId,
60
- event: "tool-error",
61
- data: "Failed to show directory tree.",
62
- });
63
- return `Failed to show directory tree: ${error.message}`;
37
+ const rawTree = await directoryTree(validPath);
38
+ const result = await manageTokenLimit(rawTree, tokenCounter, "DirectoryTree", "Use excludeDirPatterns or recursive=false to reduce output");
39
+ // Count files in the tree output
40
+ const fileCount = (result.content.match(/\n/g) || []).length + 1;
41
+ let completionMessage = `Found ${fileCount} files`;
42
+ if (result.truncated) {
43
+ completionMessage += ` - ${result.content}`;
64
44
  }
65
- },
66
- }),
45
+ completionMessage += ` (${result.tokenCount} tokens)`;
46
+ yield {
47
+ name: DirectoryTreeTool.name,
48
+ id: toolCallId,
49
+ event: "tool-completion",
50
+ data: completionMessage,
51
+ };
52
+ yield result.content;
53
+ }
54
+ catch (error) {
55
+ const errorMsg = error.message;
56
+ yield {
57
+ name: DirectoryTreeTool.name,
58
+ id: toolCallId,
59
+ event: "tool-error",
60
+ data: errorMsg,
61
+ };
62
+ yield errorMsg;
63
+ }
64
+ },
67
65
  };
68
66
  };
69
67
  /**
@@ -1,12 +1,22 @@
1
+ import type { ToolCallOptions } from "ai";
1
2
  import { type ToolMetadata } from "./dynamic-tool-parser.ts";
2
- import type { SendData } from "./types.ts";
3
- export declare function createDynamicTool(scriptPath: string, metadata: ToolMetadata, sendData?: SendData): {
4
- [x: string]: import("ai").Tool<Record<string, unknown>, unknown>;
3
+ import type { ToolResult } from "./types.ts";
4
+ interface DynamicToolObject {
5
+ toolDef: {
6
+ description: string;
7
+ inputSchema: any;
8
+ };
9
+ execute: (input: Record<string, unknown>, options: ToolCallOptions) => AsyncGenerator<ToolResult>;
10
+ ask?: (input: Record<string, unknown>, options: ToolCallOptions) => Promise<{
11
+ approve: boolean;
12
+ reason?: string;
13
+ }>;
14
+ }
15
+ export declare function createDynamicTool(scriptPath: string, metadata: ToolMetadata): {
16
+ [x: string]: DynamicToolObject;
5
17
  };
6
- export declare function loadDynamicTools({ baseDir, sendData, }: {
18
+ export declare function loadDynamicTools({ baseDir }: {
7
19
  baseDir: string;
8
- sendData?: SendData;
9
- }): Promise<Record<string, {
10
- [x: string]: import("ai").Tool<Record<string, unknown>, unknown>;
11
- }>>;
20
+ }): Promise<Record<string, DynamicToolObject>>;
21
+ export {};
12
22
  //# sourceMappingURL=dynamic-tool-loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic-tool-loader.d.ts","sourceRoot":"","sources":["../../source/tools/dynamic-tool-loader.ts"],"names":[],"mappings":"AAQA,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAwF3C,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,YAAY,EACtB,QAAQ,CAAC,EAAE,QAAQ;;EAuJpB;AAED,wBAAsB,gBAAgB,CAAC,EACrC,OAAO,EACP,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;;IAgEA"}
1
+ {"version":3,"file":"dynamic-tool-loader.d.ts","sourceRoot":"","sources":["../../source/tools/dynamic-tool-loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAI1C,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA+K7C,UAAU,iBAAiB;IACzB,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QAEpB,WAAW,EAAE,GAAG,CAAC;KAClB,CAAC;IACF,OAAO,EAAE,CACP,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,eAAe,KACrB,cAAc,CAAC,UAAU,CAAC,CAAC;IAChC,GAAG,CAAC,EAAE,CACJ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,eAAe,KACrB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,YAAY,GACrB;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAAA;CAAE,CAmEpC;AAED,wBAAsB,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,8CAgEtE"}
@@ -2,7 +2,6 @@ import { spawn } from "node:child_process";
2
2
  import fs from "node:fs";
3
3
  import os from "node:os";
4
4
  import path from "node:path";
5
- import { tool } from "ai";
6
5
  import { z } from "zod";
7
6
  import { config } from "../config.js";
8
7
  import { logger } from "../logger.js";
@@ -85,143 +84,136 @@ async function getMetadata(scriptPath) {
85
84
  });
86
85
  });
87
86
  }
88
- export function createDynamicTool(scriptPath, metadata, sendData) {
87
+ async function spawnChildProcess(scriptPath, params, abortSignal) {
88
+ const paramsArray = Object.entries(params).map(([name, value]) => ({
89
+ name,
90
+ value,
91
+ }));
92
+ const paramsJson = JSON.stringify(paramsArray);
93
+ return new Promise((resolve, reject) => {
94
+ const child = spawn(process.execPath, [scriptPath], {
95
+ cwd: path.dirname(scriptPath),
96
+ env: {
97
+ ...process.env,
98
+ // biome-ignore lint/style/useNamingConvention: Environment variables are conventionally uppercase
99
+ TOOL_ACTION: "execute",
100
+ // biome-ignore lint/style/useNamingConvention: Environment variables are conventionally uppercase
101
+ NODE_ENV: "production",
102
+ },
103
+ stdio: ["pipe", "pipe", "pipe"],
104
+ });
105
+ let stdout = "";
106
+ let stderr = "";
107
+ let hasTimedOut = false;
108
+ const timer = setTimeout(() => {
109
+ hasTimedOut = true;
110
+ child.kill();
111
+ reject(new Error("Execution timed out after 30 seconds"));
112
+ }, 30000);
113
+ child.stdin.write(`${paramsJson}\n`);
114
+ child.stdin.end();
115
+ child.stdout.on("data", (data) => {
116
+ stdout += data.toString();
117
+ });
118
+ child.stderr.on("data", (data) => {
119
+ stderr += data.toString();
120
+ });
121
+ child.on("close", () => {
122
+ clearTimeout(timer);
123
+ if (hasTimedOut)
124
+ return;
125
+ let output = stdout.trim();
126
+ const maxOutputBytes = 2000000;
127
+ if (output.length > maxOutputBytes) {
128
+ output = `${output.substring(0, maxOutputBytes)}\n[Output truncated]`;
129
+ }
130
+ // If no stdout, prefer stderr so callers get useful info
131
+ const errText = stderr.trim();
132
+ if (!output && errText) {
133
+ output = errText;
134
+ }
135
+ // Fallback to a non-empty placeholder to satisfy callers
136
+ if (!output) {
137
+ output = "[No output from dynamic tool]";
138
+ }
139
+ // Attempt to parse as JSON if structured
140
+ if (output && (output.startsWith("{") || output.startsWith("["))) {
141
+ try {
142
+ resolve(JSON.stringify(JSON.parse(output)));
143
+ }
144
+ catch {
145
+ resolve(output);
146
+ }
147
+ }
148
+ else {
149
+ resolve(output);
150
+ }
151
+ });
152
+ if (abortSignal) {
153
+ abortSignal.addEventListener("abort", () => {
154
+ child.kill();
155
+ });
156
+ }
157
+ });
158
+ }
159
+ export function createDynamicTool(scriptPath, metadata) {
89
160
  const inputSchema = generateZodSchema(metadata.parameters);
90
161
  const toolName = `dynamic-${metadata.name}`;
91
162
  return {
92
- [toolName]: tool({
93
- description: metadata.description,
94
- inputSchema,
95
- execute: async (params, { toolCallId, abortSignal }) => {
96
- if (abortSignal?.aborted) {
97
- throw new Error("Execution aborted");
98
- }
99
- sendData?.({
100
- id: toolCallId,
101
- event: "tool-init",
102
- data: `Executing dynamic tool: ${metadata.name}`,
103
- });
104
- // Validate params again for safety
163
+ [toolName]: {
164
+ toolDef: {
165
+ description: metadata.description,
166
+ inputSchema,
167
+ },
168
+ async *execute(input, { toolCallId, abortSignal }) {
105
169
  try {
106
- inputSchema.parse(params);
107
- }
108
- catch (e) {
109
- const errMsg = `Invalid parameters for tool ${metadata.name}: ${e.message}`;
110
- sendData?.({
170
+ if (abortSignal?.aborted) {
171
+ throw new Error("Execution aborted");
172
+ }
173
+ yield {
174
+ name: metadata.name,
175
+ event: "tool-init",
111
176
  id: toolCallId,
112
- event: "tool-error",
113
- data: errMsg,
114
- });
115
- throw new Error(errMsg);
116
- }
117
- const paramsArray = Object.entries(params).map(([name, value]) => ({
118
- name,
119
- value,
120
- }));
121
- const paramsJson = JSON.stringify(paramsArray);
122
- return new Promise((resolve) => {
123
- const child = spawn(process.execPath, [scriptPath], {
124
- cwd: path.dirname(scriptPath),
125
- env: {
126
- ...process.env,
127
- // biome-ignore lint/style/useNamingConvention: Environment variables are conventionally uppercase
128
- TOOL_ACTION: "execute",
129
- // biome-ignore lint/style/useNamingConvention: Environment variables are conventionally uppercase
130
- NODE_ENV: "production",
131
- },
132
- stdio: ["pipe", "pipe", "pipe"],
133
- });
134
- let stdout = "";
135
- let stderr = "";
136
- let hasTimedOut = false;
137
- const timer = setTimeout(() => {
138
- hasTimedOut = true;
139
- child.kill();
140
- sendData?.({
177
+ data: "Running",
178
+ };
179
+ // Validate params again for safety
180
+ try {
181
+ inputSchema.parse(input);
182
+ }
183
+ catch (e) {
184
+ const errMsg = `Invalid parameters for tool ${metadata.name}: ${e.message}`;
185
+ yield {
186
+ name: metadata.name,
187
+ event: "tool-error",
141
188
  id: toolCallId,
142
- event: "tool-update",
143
- data: { primary: "Execution timed out after 30 seconds" },
144
- });
145
- resolve("Execution timed out after 30 seconds");
146
- }, 30000);
147
- child.stdin.write(`${paramsJson}\n`);
148
- child.stdin.end();
149
- child.stdout.on("data", (data) => {
150
- stdout += data.toString();
151
- });
152
- child.stderr.on("data", (data) => {
153
- stderr += data.toString();
154
- });
155
- child.on("close", (code) => {
156
- clearTimeout(timer);
157
- if (hasTimedOut)
158
- return;
159
- if (code !== 0) {
160
- const errorMsg = `Dynamic tool ${metadata.name} failed: ${stderr || `Exited with code ${code}`}`;
161
- sendData?.({
162
- id: toolCallId,
163
- event: "tool-error",
164
- data: errorMsg,
165
- });
166
- resolve(errorMsg);
167
- }
168
- else {
169
- let output = stdout.trim();
170
- const maxOutputBytes = 2000000;
171
- if (output.length > maxOutputBytes) {
172
- output = `${output.substring(0, maxOutputBytes)}\n[Output truncated]`;
173
- }
174
- // If no stdout, prefer stderr so callers get useful info
175
- const errText = stderr.trim();
176
- if (!output && errText) {
177
- output = errText;
178
- }
179
- // Fallback to a non-empty placeholder to satisfy callers
180
- if (!output) {
181
- output = `[No output from dynamic tool ${metadata.name}]`;
182
- }
183
- // Send tool-update event with last 20 lines of output
184
- const outputLines = output.split("\n");
185
- const lastLines = outputLines.slice(-20).join("\n");
186
- sendData?.({
187
- id: toolCallId,
188
- event: "tool-update",
189
- data: {
190
- primary: `Last 20 lines of output from ${metadata.name}:`,
191
- secondary: lastLines.split("\n"),
192
- },
193
- });
194
- // Attempt to parse as JSON if structured
195
- if (output &&
196
- (output.startsWith("{") || output.startsWith("["))) {
197
- try {
198
- resolve(JSON.parse(output));
199
- }
200
- catch {
201
- resolve(output);
202
- }
203
- }
204
- else {
205
- resolve(output);
206
- }
207
- sendData?.({
208
- id: toolCallId,
209
- event: "tool-completion",
210
- data: `Dynamic tool ${metadata.name} completed`,
211
- });
212
- }
213
- });
214
- if (abortSignal) {
215
- abortSignal.addEventListener("abort", () => {
216
- child.kill();
217
- });
189
+ data: errMsg,
190
+ };
191
+ yield errMsg;
192
+ return;
218
193
  }
219
- });
194
+ const result = await spawnChildProcess(scriptPath, input, abortSignal);
195
+ yield {
196
+ name: metadata.name,
197
+ event: "tool-completion",
198
+ id: toolCallId,
199
+ data: "Completed",
200
+ };
201
+ yield result;
202
+ }
203
+ catch (error) {
204
+ yield {
205
+ name: metadata.name,
206
+ event: "tool-error",
207
+ id: toolCallId,
208
+ data: `${metadata.name}: ${error.message}`,
209
+ };
210
+ yield error.message;
211
+ }
220
212
  },
221
- }),
213
+ },
222
214
  };
223
215
  }
224
- export async function loadDynamicTools({ baseDir, sendData, }) {
216
+ export async function loadDynamicTools({ baseDir }) {
225
217
  const projectConfig = await config.readProjectConfig();
226
218
  const dynamicConfig = projectConfig.tools.dynamicTools;
227
219
  if (!dynamicConfig.enabled) {
@@ -274,7 +266,7 @@ export async function loadDynamicTools({ baseDir, sendData, }) {
274
266
  }
275
267
  const tools = {};
276
268
  for (const [_, { path, metadata }] of toolMap) {
277
- Object.assign(tools, createDynamicTool(path, metadata, sendData));
269
+ Object.assign(tools, createDynamicTool(path, metadata));
278
270
  }
279
271
  return tools;
280
272
  }
@@ -13,6 +13,7 @@ declare const toolMetadataSchema: z.ZodObject<{
13
13
  required: z.ZodDefault<z.ZodBoolean>;
14
14
  default: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
15
15
  }, z.core.$strip>>;
16
+ needsApproval: z.ZodDefault<z.ZodBoolean>;
16
17
  }, z.core.$strip>;
17
18
  export type ToolMetadata = z.infer<typeof toolMetadataSchema>;
18
19
  export declare function parseToolMetadata(output: string): ToolMetadata;
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic-tool-parser.d.ts","sourceRoot":"","sources":["../../source/tools/dynamic-tool-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;iBAYtB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAS9D"}
1
+ {"version":3,"file":"dynamic-tool-parser.d.ts","sourceRoot":"","sources":["../../source/tools/dynamic-tool-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;iBAatB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAS9D"}
@@ -9,6 +9,7 @@ const toolMetadataSchema = z.object({
9
9
  required: z.boolean().default(true),
10
10
  default: z.union([z.string(), z.number(), z.boolean()]).optional(),
11
11
  })),
12
+ needsApproval: z.boolean().default(true),
12
13
  });
13
14
  export function parseToolMetadata(output) {
14
15
  try {
@@ -1,27 +1,47 @@
1
- import type { Terminal } from "../terminal/index.ts";
2
- import type { ToolExecutor } from "../tool-executor.ts";
3
- import type { SendData } from "./types.ts";
1
+ import type { ToolCallOptions } from "ai";
2
+ import { z } from "zod";
3
+ import type { ModelManager } from "../models/manager.ts";
4
+ import type { TokenTracker } from "../tokens/tracker.ts";
5
+ import type { ToolResult } from "./types.ts";
4
6
  export declare const EditFileTool: {
5
7
  name: "editFile";
6
8
  };
7
- export declare const createEditFileTool: ({ workingDir, terminal, sendData, toolExecutor, }: {
9
+ declare const inputSchema: z.ZodObject<{
10
+ path: z.ZodString;
11
+ edits: z.ZodArray<z.ZodObject<{
12
+ oldText: z.ZodString;
13
+ newText: z.ZodString;
14
+ }, z.core.$strip>>;
15
+ }, z.core.$strip>;
16
+ type EditFileInputSchema = z.infer<typeof inputSchema>;
17
+ export declare const createEditFileTool: ({ workingDir, allowedDirs, modelManager, tokenTracker, enableLlmFix, }: {
8
18
  workingDir: string;
9
- terminal?: Terminal;
10
- sendData?: SendData;
11
- toolExecutor?: ToolExecutor;
19
+ allowedDirs?: string[];
20
+ modelManager?: ModelManager;
21
+ tokenTracker?: TokenTracker;
22
+ enableLlmFix?: boolean;
12
23
  }) => Promise<{
13
- editFile: import("ai").Tool<{
14
- path: string;
15
- edits: {
16
- oldText: string;
17
- newText: string;
18
- }[];
19
- }, string>;
24
+ toolDef: {
25
+ description: string;
26
+ inputSchema: z.ZodObject<{
27
+ path: z.ZodString;
28
+ edits: z.ZodArray<z.ZodObject<{
29
+ oldText: z.ZodString;
30
+ newText: z.ZodString;
31
+ }, z.core.$strip>>;
32
+ }, z.core.$strip>;
33
+ };
34
+ execute({ path, edits }: EditFileInputSchema, { toolCallId, abortSignal }: ToolCallOptions): AsyncGenerator<ToolResult>;
20
35
  }>;
21
36
  interface FileEdit {
22
37
  oldText: string;
23
38
  newText: string;
24
39
  }
25
- export declare function applyFileEdits(filePath: string, edits: FileEdit[], dryRun?: boolean, abortSignal?: AbortSignal): Promise<string>;
40
+ export declare function applyFileEdits(filePath: string, edits: FileEdit[], dryRun?: boolean, abortSignal?: AbortSignal, options?: {
41
+ modelManager?: ModelManager;
42
+ tokenTracker?: TokenTracker;
43
+ enableLlmFix?: boolean;
44
+ instruction?: string;
45
+ }): Promise<string>;
26
46
  export {};
27
47
  //# sourceMappingURL=edit-file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"edit-file.d.ts","sourceRoot":"","sources":["../../source/tools/edit-file.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,YAAY;;CAExB,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAU,mDAKtC;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;;;;;;;;EA+JA,CAAC;AAyBF,UAAU,QAAQ;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,QAAQ,EAAE,EACjB,MAAM,UAAQ,EACd,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,MAAM,CAAC,CAmEjB"}
1
+ {"version":3,"file":"edit-file.d.ts","sourceRoot":"","sources":["../../source/tools/edit-file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAE1C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,YAAY;;CAExB,CAAC;AAEF,QAAA,MAAM,WAAW;;;;;;iBAcf,CAAC;AAEH,KAAK,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEvD,eAAO,MAAM,kBAAkB,GAAU,wEAMtC;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;;;;;;;;;;;6BAcsB,mBAAmB,+BACP,eAAe,GAC3C,cAAc,CAAC,UAAU,CAAC;EAkDhC,CAAC;AAyBF,UAAU,QAAQ;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,QAAQ,EAAE,EACjB,MAAM,UAAQ,EACd,WAAW,CAAC,EAAE,WAAW,EACzB,OAAO,CAAC,EAAE;IACR,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACA,OAAO,CAAC,MAAM,CAAC,CA2DjB"}