@travisennis/acai 0.0.3 → 0.0.5

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 (316) hide show
  1. package/README.md +225 -6
  2. package/dist/api/exa/index.d.ts +177 -0
  3. package/dist/api/exa/index.d.ts.map +1 -0
  4. package/dist/api/exa/index.js +439 -0
  5. package/dist/cli.d.ts +3 -2
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/commands/application-log-command.d.ts +1 -0
  8. package/dist/commands/application-log-command.d.ts.map +1 -0
  9. package/dist/commands/application-log-command.js +5 -3
  10. package/dist/commands/clear-command.d.ts +1 -0
  11. package/dist/commands/clear-command.d.ts.map +1 -0
  12. package/dist/commands/clear-command.js +2 -3
  13. package/dist/commands/compact-command.d.ts +1 -0
  14. package/dist/commands/compact-command.d.ts.map +1 -0
  15. package/dist/commands/compact-command.js +1 -1
  16. package/dist/commands/copy-command.d.ts +1 -0
  17. package/dist/commands/copy-command.d.ts.map +1 -0
  18. package/dist/commands/copy-command.js +3 -2
  19. package/dist/commands/edit-command.d.ts +1 -0
  20. package/dist/commands/edit-command.d.ts.map +1 -0
  21. package/dist/commands/edit-command.js +7 -5
  22. package/dist/commands/edit-prompt-command.d.ts +2 -1
  23. package/dist/commands/edit-prompt-command.d.ts.map +1 -0
  24. package/dist/commands/edit-prompt-command.js +15 -7
  25. package/dist/commands/exit-command.d.ts +13 -2
  26. package/dist/commands/exit-command.d.ts.map +1 -0
  27. package/dist/commands/exit-command.js +14 -2
  28. package/dist/commands/files-command.d.ts +1 -0
  29. package/dist/commands/files-command.d.ts.map +1 -0
  30. package/dist/commands/files-command.js +9 -8
  31. package/dist/commands/generate-rules-command.d.ts +1 -0
  32. package/dist/commands/generate-rules-command.d.ts.map +1 -0
  33. package/dist/commands/generate-rules-command.js +4 -3
  34. package/dist/commands/health-command.d.ts +3 -1
  35. package/dist/commands/health-command.d.ts.map +1 -0
  36. package/dist/commands/health-command.js +42 -5
  37. package/dist/commands/help-command.d.ts +1 -0
  38. package/dist/commands/help-command.d.ts.map +1 -0
  39. package/dist/commands/help-command.js +2 -3
  40. package/dist/commands/init-command.d.ts +1 -0
  41. package/dist/commands/init-command.d.ts.map +1 -0
  42. package/dist/commands/init-command.js +1 -2
  43. package/dist/commands/last-log-command.d.ts +1 -0
  44. package/dist/commands/last-log-command.d.ts.map +1 -0
  45. package/dist/commands/last-log-command.js +12 -17
  46. package/dist/commands/list-tools-command.d.ts +3 -0
  47. package/dist/commands/list-tools-command.d.ts.map +1 -0
  48. package/dist/commands/list-tools-command.js +61 -0
  49. package/dist/commands/manager.d.ts +7 -2
  50. package/dist/commands/manager.d.ts.map +1 -0
  51. package/dist/commands/manager.js +43 -6
  52. package/dist/commands/model-command.d.ts +1 -0
  53. package/dist/commands/model-command.d.ts.map +1 -0
  54. package/dist/commands/model-command.js +5 -5
  55. package/dist/commands/paste-command.d.ts +1 -0
  56. package/dist/commands/paste-command.d.ts.map +1 -0
  57. package/dist/commands/paste-command.js +6 -5
  58. package/dist/commands/prompt-command.d.ts +2 -1
  59. package/dist/commands/prompt-command.d.ts.map +1 -0
  60. package/dist/commands/prompt-command.js +62 -8
  61. package/dist/commands/reset-command.d.ts +1 -0
  62. package/dist/commands/reset-command.d.ts.map +1 -0
  63. package/dist/commands/reset-command.js +1 -1
  64. package/dist/commands/rules-command.d.ts +1 -0
  65. package/dist/commands/rules-command.d.ts.map +1 -0
  66. package/dist/commands/rules-command.js +5 -3
  67. package/dist/commands/save-command.d.ts +1 -0
  68. package/dist/commands/save-command.d.ts.map +1 -0
  69. package/dist/commands/save-command.js +1 -1
  70. package/dist/commands/shell-command.d.ts +3 -0
  71. package/dist/commands/shell-command.d.ts.map +1 -0
  72. package/dist/commands/shell-command.js +60 -0
  73. package/dist/commands/types.d.ts +9 -6
  74. package/dist/commands/types.d.ts.map +1 -0
  75. package/dist/commands/usage-command.d.ts +1 -0
  76. package/dist/commands/usage-command.d.ts.map +1 -0
  77. package/dist/commands/usage-command.js +2 -3
  78. package/dist/config.d.ts +22 -34
  79. package/dist/config.d.ts.map +1 -0
  80. package/dist/config.js +61 -15
  81. package/dist/conversation-analyzer.d.ts +2 -1
  82. package/dist/conversation-analyzer.d.ts.map +1 -0
  83. package/dist/dedent.d.ts +1 -0
  84. package/dist/dedent.d.ts.map +1 -0
  85. package/dist/execution/index.d.ts +112 -0
  86. package/dist/execution/index.d.ts.map +1 -0
  87. package/dist/execution/index.js +432 -0
  88. package/dist/formatting.d.ts +2 -13
  89. package/dist/formatting.d.ts.map +1 -0
  90. package/dist/formatting.js +5 -64
  91. package/dist/index.d.ts +1 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +14 -4
  94. package/dist/logger.d.ts +1 -0
  95. package/dist/logger.d.ts.map +1 -0
  96. package/dist/mentions.d.ts +4 -0
  97. package/dist/mentions.d.ts.map +1 -0
  98. package/dist/mentions.js +42 -10
  99. package/dist/messages.d.ts +8 -20
  100. package/dist/messages.d.ts.map +1 -0
  101. package/dist/messages.js +33 -53
  102. package/dist/middleware/audit-message.d.ts +1 -0
  103. package/dist/middleware/audit-message.d.ts.map +1 -0
  104. package/dist/middleware/index.d.ts +1 -0
  105. package/dist/middleware/index.d.ts.map +1 -0
  106. package/dist/middleware/rate-limit.d.ts +1 -0
  107. package/dist/middleware/rate-limit.d.ts.map +1 -0
  108. package/dist/models/ai-config.d.ts +1 -0
  109. package/dist/models/ai-config.d.ts.map +1 -0
  110. package/dist/models/anthropic-provider.d.ts +1 -0
  111. package/dist/models/anthropic-provider.d.ts.map +1 -0
  112. package/dist/models/deepseek-provider.d.ts +1 -0
  113. package/dist/models/deepseek-provider.d.ts.map +1 -0
  114. package/dist/models/google-provider.d.ts +1 -0
  115. package/dist/models/google-provider.d.ts.map +1 -0
  116. package/dist/models/groq-provider.d.ts +20 -0
  117. package/dist/models/groq-provider.d.ts.map +1 -0
  118. package/dist/models/groq-provider.js +31 -0
  119. package/dist/models/manager.d.ts +1 -0
  120. package/dist/models/manager.d.ts.map +1 -0
  121. package/dist/models/openai-provider.d.ts +2 -1
  122. package/dist/models/openai-provider.d.ts.map +1 -0
  123. package/dist/models/openrouter-provider.d.ts +31 -22
  124. package/dist/models/openrouter-provider.d.ts.map +1 -0
  125. package/dist/models/openrouter-provider.js +115 -1
  126. package/dist/models/providers.d.ts +4 -5
  127. package/dist/models/providers.d.ts.map +1 -0
  128. package/dist/models/providers.js +7 -3
  129. package/dist/models/xai-provider.d.ts +1 -0
  130. package/dist/models/xai-provider.d.ts.map +1 -0
  131. package/dist/parsing.d.ts +2 -1
  132. package/dist/parsing.d.ts.map +1 -0
  133. package/dist/prompts/manager.d.ts +14 -2
  134. package/dist/prompts/manager.d.ts.map +1 -0
  135. package/dist/prompts.d.ts +1 -0
  136. package/dist/prompts.d.ts.map +1 -0
  137. package/dist/prompts.js +17 -11
  138. package/dist/repl/display-tool-messages.d.ts +4 -0
  139. package/dist/repl/display-tool-messages.d.ts.map +1 -0
  140. package/dist/repl/display-tool-messages.js +55 -0
  141. package/dist/repl/display-tool-use.d.ts +14 -0
  142. package/dist/repl/display-tool-use.d.ts.map +1 -0
  143. package/dist/repl/display-tool-use.js +63 -0
  144. package/dist/repl/get-prompt-header.d.ts +8 -0
  145. package/dist/repl/get-prompt-header.d.ts.map +1 -0
  146. package/dist/repl/get-prompt-header.js +38 -0
  147. package/dist/repl/tool-call-repair.d.ts +4 -0
  148. package/dist/repl/tool-call-repair.d.ts.map +1 -0
  149. package/dist/repl/tool-call-repair.js +50 -0
  150. package/dist/repl-prompt.d.ts +1 -0
  151. package/dist/repl-prompt.d.ts.map +1 -0
  152. package/dist/repl.d.ts +8 -4
  153. package/dist/repl.d.ts.map +1 -0
  154. package/dist/repl.js +108 -252
  155. package/dist/terminal/ansi-styles.d.ts +77 -0
  156. package/dist/terminal/ansi-styles.d.ts.map +1 -0
  157. package/dist/terminal/ansi-styles.js +215 -0
  158. package/dist/terminal/checkbox-prompt.d.ts +36 -0
  159. package/dist/terminal/checkbox-prompt.d.ts.map +1 -0
  160. package/dist/terminal/checkbox-prompt.js +362 -0
  161. package/dist/terminal/default-theme.d.ts +6 -0
  162. package/dist/terminal/default-theme.d.ts.map +1 -0
  163. package/dist/terminal/default-theme.js +182 -0
  164. package/dist/terminal/east-asian-width.d.ts +8 -0
  165. package/dist/terminal/east-asian-width.d.ts.map +1 -0
  166. package/dist/terminal/east-asian-width.js +409 -0
  167. package/dist/terminal/editor-prompt.d.ts +10 -0
  168. package/dist/terminal/editor-prompt.d.ts.map +1 -0
  169. package/dist/terminal/editor-prompt.js +61 -0
  170. package/dist/terminal/errors.d.ts +19 -0
  171. package/dist/terminal/errors.d.ts.map +1 -0
  172. package/dist/terminal/errors.js +37 -0
  173. package/dist/terminal/formatting.d.ts +1 -11
  174. package/dist/terminal/formatting.d.ts.map +1 -0
  175. package/dist/terminal/formatting.js +4 -20
  176. package/dist/terminal/highlight/index.d.ts +53 -0
  177. package/dist/terminal/highlight/index.d.ts.map +1 -0
  178. package/dist/terminal/highlight/index.js +90 -0
  179. package/dist/terminal/highlight/theme.d.ts +233 -0
  180. package/dist/terminal/highlight/theme.d.ts.map +1 -0
  181. package/dist/terminal/highlight/theme.js +83 -0
  182. package/dist/terminal/index.d.ts +16 -9
  183. package/dist/terminal/index.d.ts.map +1 -0
  184. package/dist/terminal/index.js +42 -126
  185. package/dist/terminal/input-prompt.d.ts +16 -0
  186. package/dist/terminal/input-prompt.d.ts.map +1 -0
  187. package/dist/terminal/input-prompt.js +181 -0
  188. package/dist/terminal/markdown-utils.d.ts +1 -0
  189. package/dist/terminal/markdown-utils.d.ts.map +1 -0
  190. package/dist/terminal/markdown.d.ts +1 -0
  191. package/dist/terminal/markdown.d.ts.map +1 -0
  192. package/dist/terminal/markdown.js +17 -12
  193. package/dist/terminal/search-prompt.d.ts +20 -0
  194. package/dist/terminal/search-prompt.d.ts.map +1 -0
  195. package/dist/terminal/search-prompt.js +279 -0
  196. package/dist/terminal/select-prompt.d.ts +26 -0
  197. package/dist/terminal/select-prompt.d.ts.map +1 -0
  198. package/dist/terminal/select-prompt.js +298 -0
  199. package/dist/terminal/string-width.d.ts +7 -0
  200. package/dist/terminal/string-width.d.ts.map +1 -0
  201. package/dist/terminal/string-width.js +61 -0
  202. package/dist/terminal/strip-ansi.d.ts +2 -0
  203. package/dist/terminal/strip-ansi.d.ts.map +1 -0
  204. package/dist/terminal/strip-ansi.js +20 -0
  205. package/dist/terminal/style.d.ts +191 -0
  206. package/dist/terminal/style.d.ts.map +1 -0
  207. package/dist/terminal/style.js +259 -0
  208. package/dist/terminal/supports-color.d.ts +1 -0
  209. package/dist/terminal/supports-color.d.ts.map +1 -0
  210. package/dist/terminal/supports-hyperlinks.d.ts +1 -3
  211. package/dist/terminal/supports-hyperlinks.d.ts.map +1 -0
  212. package/dist/terminal/supports-hyperlinks.js +1 -1
  213. package/dist/terminal/types.d.ts +1 -37
  214. package/dist/terminal/types.d.ts.map +1 -0
  215. package/dist/terminal/wrap-ansi.d.ts +8 -0
  216. package/dist/terminal/wrap-ansi.d.ts.map +1 -0
  217. package/dist/terminal/wrap-ansi.js +190 -0
  218. package/dist/{token-utils.d.ts → tokens/counter.d.ts} +1 -0
  219. package/dist/tokens/counter.d.ts.map +1 -0
  220. package/dist/{token-utils.js → tokens/counter.js} +1 -1
  221. package/dist/tokens/manage-output.d.ts +34 -0
  222. package/dist/tokens/manage-output.d.ts.map +1 -0
  223. package/dist/tokens/manage-output.js +44 -0
  224. package/dist/{token-tracker.d.ts → tokens/tracker.d.ts} +1 -0
  225. package/dist/tokens/tracker.d.ts.map +1 -0
  226. package/dist/tool-executor.d.ts +28 -0
  227. package/dist/tool-executor.d.ts.map +1 -0
  228. package/dist/tool-executor.js +74 -0
  229. package/dist/tools/agent.d.ts +3 -2
  230. package/dist/tools/agent.d.ts.map +1 -0
  231. package/dist/tools/agent.js +7 -4
  232. package/dist/tools/bash-utils.d.ts +7 -0
  233. package/dist/tools/bash-utils.d.ts.map +1 -0
  234. package/dist/tools/bash-utils.js +212 -0
  235. package/dist/tools/bash.d.ts +9 -7
  236. package/dist/tools/bash.d.ts.map +1 -0
  237. package/dist/tools/bash.js +95 -212
  238. package/dist/tools/code-interpreter.d.ts +1 -0
  239. package/dist/tools/code-interpreter.d.ts.map +1 -0
  240. package/dist/tools/code-interpreter.js +33 -8
  241. package/dist/tools/delete-file.d.ts +5 -3
  242. package/dist/tools/delete-file.d.ts.map +1 -0
  243. package/dist/tools/delete-file.js +47 -33
  244. package/dist/tools/directory-tree.d.ts +10 -1
  245. package/dist/tools/directory-tree.d.ts.map +1 -0
  246. package/dist/tools/directory-tree.js +91 -8
  247. package/dist/tools/dynamic-tool-loader.d.ts +12 -0
  248. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -0
  249. package/dist/tools/dynamic-tool-loader.js +280 -0
  250. package/dist/tools/dynamic-tool-parser.d.ts +20 -0
  251. package/dist/tools/dynamic-tool-parser.d.ts.map +1 -0
  252. package/dist/tools/dynamic-tool-parser.js +21 -0
  253. package/dist/tools/edit-file.d.ts +10 -2
  254. package/dist/tools/edit-file.d.ts.map +1 -0
  255. package/dist/tools/edit-file.js +117 -40
  256. package/dist/tools/file-editing-utils.d.ts +2 -0
  257. package/dist/tools/file-editing-utils.d.ts.map +1 -0
  258. package/dist/tools/file-editing-utils.js +135 -0
  259. package/dist/tools/filesystem-utils.d.ts +6 -21
  260. package/dist/tools/filesystem-utils.d.ts.map +1 -0
  261. package/dist/tools/filesystem-utils.js +96 -148
  262. package/dist/tools/git-utils.d.ts +1 -0
  263. package/dist/tools/git-utils.d.ts.map +1 -0
  264. package/dist/tools/grep.d.ts +5 -3
  265. package/dist/tools/grep.d.ts.map +1 -0
  266. package/dist/tools/grep.js +67 -27
  267. package/dist/tools/index.d.ts +10 -14
  268. package/dist/tools/index.d.ts.map +1 -0
  269. package/dist/tools/index.js +33 -22
  270. package/dist/tools/move-file.d.ts +1 -0
  271. package/dist/tools/move-file.d.ts.map +1 -0
  272. package/dist/tools/move-file.js +12 -5
  273. package/dist/tools/read-file.d.ts +2 -1
  274. package/dist/tools/read-file.d.ts.map +1 -0
  275. package/dist/tools/read-file.js +13 -6
  276. package/dist/tools/read-multiple-files.d.ts +2 -1
  277. package/dist/tools/read-multiple-files.d.ts.map +1 -0
  278. package/dist/tools/read-multiple-files.js +90 -9
  279. package/dist/tools/save-file.d.ts +5 -3
  280. package/dist/tools/save-file.d.ts.map +1 -0
  281. package/dist/tools/save-file.js +64 -36
  282. package/dist/tools/think.d.ts +1 -0
  283. package/dist/tools/think.d.ts.map +1 -0
  284. package/dist/tools/think.js +5 -1
  285. package/dist/tools/types.d.ts +14 -1
  286. package/dist/tools/types.d.ts.map +1 -0
  287. package/dist/tools/web-fetch.d.ts +4 -2
  288. package/dist/tools/web-fetch.d.ts.map +1 -0
  289. package/dist/tools/web-fetch.js +2 -2
  290. package/dist/tools/web-search.d.ts +2 -1
  291. package/dist/tools/web-search.d.ts.map +1 -0
  292. package/dist/tools/web-search.js +46 -11
  293. package/dist/utils/filesystem.d.ts +23 -0
  294. package/dist/utils/filesystem.d.ts.map +1 -0
  295. package/dist/utils/filesystem.js +140 -0
  296. package/dist/utils/filetype-detection.d.ts +3 -0
  297. package/dist/utils/filetype-detection.d.ts.map +1 -0
  298. package/dist/utils/filetype-detection.js +112 -0
  299. package/dist/utils/glob.d.ts +52 -0
  300. package/dist/utils/glob.d.ts.map +1 -0
  301. package/dist/utils/glob.js +376 -0
  302. package/dist/utils/ignore.d.ts +104 -0
  303. package/dist/utils/ignore.d.ts.map +1 -0
  304. package/dist/utils/ignore.js +649 -0
  305. package/dist/utils/process.d.ts +10 -1
  306. package/dist/utils/process.d.ts.map +1 -0
  307. package/dist/utils/process.js +104 -5
  308. package/dist/utils/zod-utils.d.ts +4 -0
  309. package/dist/utils/zod-utils.d.ts.map +1 -0
  310. package/dist/utils/zod-utils.js +7 -0
  311. package/dist/version.d.ts +1 -0
  312. package/dist/version.d.ts.map +1 -0
  313. package/package.json +32 -30
  314. package/dist/tools/command-validation.d.ts +0 -12
  315. package/dist/tools/command-validation.js +0 -113
  316. /package/dist/{token-tracker.js → tokens/tracker.js} +0 -0
package/README.md CHANGED
@@ -14,7 +14,7 @@ Acai is a powerful **AI-driven command-line interface (CLI) tool** designed to a
14
14
  * **Codebase Interaction:** Read, edit, and navigate files; search code; and understand project structure.
15
15
  * **Git Integration:** Generate conventional commits, review pull requests, and manage local changes.
16
16
  * **Extensible Tooling:** Utilizes a suite of internal tools (e.g., `bash`, `codeInterpreter`, `webSearch`) to perform actions.
17
- * **Multi-Model Support:** Seamlessly switch between various AI providers (e.g., OpenAI, Google, Anthropic, DeepSeek, OpenRouter).
17
+ * **Multi-Model Support:** Seamlessly switch between various AI providers (e.g., OpenAI, Google, Anthropic, DeepSeek, Groq, OpenRouter).
18
18
  * **Context Management:** Automatically incorporates relevant file content, clipboard data, and conversation history into AI prompts.
19
19
  * **Configurable & Learnable:** Customize behavior through project-specific rules and learn from user corrections.
20
20
 
@@ -30,6 +30,7 @@ Acai is a powerful **AI-driven command-line interface (CLI) tool** designed to a
30
30
  * **Token Usage Tracking:** Monitor AI token consumption.
31
31
  * **Configurable AI Models:** Easily switch between different LLM providers and models.
32
32
  * **Shell Integration:** Execute shell commands inline using `!`command`` syntax.
33
+ * **Dynamic Tools:** Create and load custom tools from JavaScript files in your project or user directory.
33
34
 
34
35
  ## 🛠️ Technologies Used
35
36
 
@@ -37,12 +38,8 @@ Acai is built primarily with **TypeScript** and runs on **Node.js**. Key technol
37
38
 
38
39
  * **TypeScript:** For type-safe and scalable code.
39
40
  * **Node.js:** The JavaScript runtime environment.
40
- * **AI SDK (`@ai-sdk/*`):** For integrating with various Large Language Models (LLMs) like OpenAI, Google Gemini, Anthropic, DeepSeek, and OpenRouter.
41
- * **Tree-sitter:** For robust and efficient code parsing and syntax analysis across multiple programming languages (TypeScript, JavaScript, Java, Python).
42
- * **`chalk`, `ora`, `log-update`:** For rich and interactive terminal output.
43
- * **`@inquirer/prompts`:** For interactive prompts; CLI args parsed with Node's `util.parseArgs`.
41
+ * **AI SDK (`@ai-sdk/*`):** For integrating with various Large Language Models (LLMs) like OpenAI, Google Gemini, Anthropic, DeepSeek, Groq, and OpenRouter.
44
42
  * **`ripgrep` (via `grep.ts` tool):** For fast file content searching.
45
- * **`marked`:** For rendering Markdown in the terminal.
46
43
  * **`pino`:** For structured logging.
47
44
  * **`zod`:** For schema validation.
48
45
  * **`biomejs/biome`:** For code formatting and linting.
@@ -122,6 +119,9 @@ GOOGLE_GENERATIVE_AI_API_KEY=your_google_api_key_here
122
119
  # DeepSeek
123
120
  DEEPSEEK_API_KEY=your_deepseek_api_key_here
124
121
 
122
+ # Groq (Kimi models)
123
+ GROQ_API_KEY=your_groq_api_key_here
124
+
125
125
  # X.AI (Grok models)
126
126
  X_AI_API_KEY=your_xai_api_key_here
127
127
  # Alternative name also supported:
@@ -159,6 +159,7 @@ ANTHROPIC_API_KEY=sk-ant-...
159
159
 
160
160
  # Optional: Additional providers
161
161
  GOOGLE_GENERATIVE_AI_API_KEY=...
162
+ GROQ_API_KEY=...
162
163
  OPENROUTER_API_KEY=sk-or-...
163
164
 
164
165
  # Optional: Web services (fallbacks available if not provided)
@@ -238,12 +239,230 @@ For a list of available commands, type `/help` within the REPL.
238
239
  - `/generateRules` - Analyze the current conversation and suggest project rules
239
240
  - `/edit <path> "<change description>"` - Edit a file with AI assistance
240
241
  - `/copy` - Copy the last assistant response to the system clipboard
242
+ - `/list-tools` or `/lt` - List all available static and dynamic tools
241
243
 
242
244
  Clipboard notes:
243
245
  - macOS: uses `pbcopy`
244
246
  - Windows: uses `clip`
245
247
  - Linux: tries `xclip`, falls back to `xsel`
246
248
 
249
+ ## Custom Tools
250
+
251
+ Acai supports dynamic custom tools that users can define as executable Node.js scripts. These tools extend the core functionality without modifying the source code.
252
+
253
+ ### Directories
254
+
255
+ - **Project tools**: `./.acai/tools/*.(m)js` (project-specific, override global tools with the same name).
256
+ - **User tools**: `~/.acai/tools/*.(m)js` (global, available across all projects).
257
+
258
+ ### Format Specification
259
+
260
+ Custom tools are Node.js scripts that respond to environment variables:
261
+
262
+ - **Describe mode**: Set `TOOL_ACTION=describe` to output YAML metadata to stdout.
263
+
264
+ Example output:
265
+
266
+ ```
267
+ name: run-tests
268
+ description: Run tests in a project workspace with proper output formatting
269
+ parameters:
270
+ - name: dir
271
+ type: string
272
+ description: the workspace directory to run tests in
273
+ required: false
274
+ default: "."
275
+ ```
276
+
277
+ - **Execute mode**: Set `TOOL_ACTION=execute` and read JSON parameters from stdin (array of `{name: string, value: any}`), perform the action, and output results to stdout (JSON or text). Exit with 0 on success, non-zero on error.
278
+
279
+ Scripts should include `#!/usr/bin/env node` shebang for executability.
280
+
281
+ ### Security Notes
282
+
283
+ - Dynamic tools run in sandboxed child processes with limited permissions (no network access beyond what's allowed, timeout of 30s, isolated environment).
284
+ - Scripts have access to the project directory but cannot access Acai internals.
285
+ - Validate inputs and handle errors gracefully.
286
+ - Malicious scripts could perform unintended actions; review tools before use.
287
+ - Future enhancements may include script signing or allowlisting.
288
+
289
+ ### Example Script
290
+
291
+ Create `./.acai/tools/run-tests.js`:
292
+
293
+ ```javascript
294
+ #!/usr/bin/env node
295
+
296
+ const { spawn } = require('node:child_process');
297
+
298
+ if (process.env.TOOL_ACTION === 'describe') {
299
+ console.log(JSON.stringify({
300
+ name: 'run-tests',
301
+ description: 'Run tests in the specified directory',
302
+ parameters: [
303
+ {
304
+ name: 'dir',
305
+ type: 'string',
306
+ description: 'Directory to run tests in (default: current directory)',
307
+ required: false,
308
+ default: '.'
309
+ }
310
+ ]
311
+ }, null, 2));
312
+ process.exit(0);
313
+ }
314
+
315
+ if (process.env.TOOL_ACTION === 'execute') {
316
+ let params = [];
317
+ process.stdin.setEncoding('utf8');
318
+ process.stdin.on('readable', () => {
319
+ let chunk;
320
+ while (null !== (chunk = process.stdin.read())) {
321
+ params = JSON.parse(chunk);
322
+ }
323
+ });
324
+
325
+ process.stdin.on('end', () => {
326
+ const dir = params.find(p => p.name === 'dir')?.value || '.';
327
+ const child = spawn('npm', ['test'], { cwd: dir, stdio: 'pipe' });
328
+ let output = '';
329
+ child.stdout.on('data', (data) => output += data);
330
+ child.on('close', (code) => {
331
+ console.log(output);
332
+ process.exit(code);
333
+ });
334
+ });
335
+ }
336
+ ```
337
+
338
+ ### Loading Tools
339
+
340
+ Dynamic tools are loaded automatically on each user input.
341
+
342
+ For more details, see the implementation in `source/tools/dynamic-tool-loader.ts`.
343
+
344
+ ## Dynamic Tools
345
+
346
+ Acai supports dynamic tools - custom tools that you can create and load from JavaScript files. This allows you to extend Acai's functionality with your own specialized tools.
347
+
348
+ ### Creating Dynamic Tools
349
+
350
+ Dynamic tools are JavaScript files that follow a specific structure. Here's a simple example:
351
+
352
+ ```javascript
353
+ #!/usr/bin/env node
354
+
355
+ if (process.env.TOOL_ACTION === 'describe') {
356
+ console.log(JSON.stringify({
357
+ name: 'my-custom-tool',
358
+ description: 'A custom tool that does something useful',
359
+ parameters: [
360
+ {
361
+ name: 'input',
362
+ type: 'string',
363
+ description: 'Input to process',
364
+ required: true
365
+ }
366
+ ]
367
+ }, null, 2));
368
+ process.exit(0);
369
+ }
370
+
371
+ if (process.env.TOOL_ACTION === 'execute') {
372
+ let params = [];
373
+ process.stdin.setEncoding('utf8');
374
+ process.stdin.on('readable', () => {
375
+ let chunk;
376
+ while (null !== (chunk = process.stdin.read())) {
377
+ params = JSON.parse(chunk);
378
+ }
379
+ });
380
+
381
+ process.stdin.on('end', () => {
382
+ const input = params.find(p => p.name === 'input')?.value;
383
+ // Your tool logic here
384
+ const result = `Processed: ${input}`;
385
+ console.log(result);
386
+ process.exit(0);
387
+ });
388
+ }
389
+ ```
390
+
391
+ ### Tool Structure
392
+
393
+ - **Describe Phase**: When `TOOL_ACTION=describe`, the tool must output JSON metadata
394
+ - `name`: Tool name (will be prefixed with `dynamic:`)
395
+ - `description`: Human-readable description
396
+ - `parameters`: Array of parameter definitions
397
+ - **Execute Phase**: When `TOOL_ACTION=execute`, the tool reads parameters from stdin and outputs results
398
+
399
+ ### Parameter Definition
400
+
401
+ Each parameter can have:
402
+ - `name`: Parameter name
403
+ - `type`: "string", "number", or "boolean"
404
+ - `description`: Human-readable description
405
+ - `required`: Boolean (default: false)
406
+ - `default`: Default value for optional parameters
407
+
408
+ ### Tool Locations
409
+
410
+ Dynamic tools are loaded from two locations:
411
+ 1. **Project tools**: `.acai/tools/` in your project directory
412
+ 2. **User tools**: `~/.acai/tools/` in your home directory
413
+
414
+ Project tools override user tools with the same name.
415
+
416
+ ### Configuration
417
+
418
+ Dynamic tools are configured in your `.acai.json` file:
419
+
420
+ ```json
421
+ {
422
+ "tools": {
423
+ "dynamicTools": {
424
+ "enabled": true,
425
+ "maxTools": 50
426
+ }
427
+ }
428
+ }
429
+ ```
430
+
431
+ - `enabled`: Enable/disable dynamic tools (default: true)
432
+ - `maxTools`: Maximum number of tools to load (default: 50)
433
+
434
+ ### Security Considerations
435
+
436
+ Dynamic tools run with the same privileges as Acai itself. Keep these security points in mind:
437
+
438
+ - **Input Validation**: Always validate and sanitize input parameters
439
+ - **Path Safety**: Be careful with file paths to prevent directory traversal
440
+ - **Resource Limits**: Tools are automatically killed after 30 seconds
441
+ - **No Shell Access**: Tools run directly with Node.js, not through a shell
442
+
443
+ ### Example Tools
444
+
445
+ See the included `run-tests.js` tool in `.acai/tools/` for a complete example.
446
+
447
+ ### Listing Tools
448
+
449
+ Use the `/list-tools` command to see all available tools, including dynamic tools:
450
+
451
+ ```
452
+ > /list-tools
453
+ Available tools:
454
+ Static tools:
455
+ bash
456
+ readFile
457
+ editFile
458
+ ...
459
+ Dynamic tools:
460
+ dynamic:run-tests
461
+ dynamic:my-custom-tool
462
+
463
+ Total: 14 static, 2 dynamic
464
+ ```
465
+
247
466
  ## Configuration
248
467
 
249
468
  ### Project Configuration
@@ -0,0 +1,177 @@
1
+ import type { ZodType } from "zod";
2
+ type BaseSearchOptions = {
3
+ numResults?: number;
4
+ includeDomains?: string[];
5
+ excludeDomains?: string[];
6
+ startCrawlDate?: string;
7
+ endCrawlDate?: string;
8
+ startPublishedDate?: string;
9
+ endPublishedDate?: string;
10
+ category?: "company" | "research paper" | "news" | "pdf" | "github" | "tweet" | "personal site" | "linkedin profile" | "financial report";
11
+ includeText?: string[];
12
+ excludeText?: string[];
13
+ flags?: string[];
14
+ userLocation?: string;
15
+ };
16
+ type RegularSearchOptions = BaseSearchOptions & {
17
+ moderation?: boolean;
18
+ useAutoprompt?: boolean;
19
+ type?: "keyword" | "neural" | "auto" | "hybrid" | "fast";
20
+ };
21
+ type FindSimilarOptions = BaseSearchOptions & {
22
+ excludeSourceDomain?: boolean;
23
+ };
24
+ type ExtrasOptions = {
25
+ links?: number;
26
+ imageLinks?: number;
27
+ };
28
+ type ContentsOptions = {
29
+ text?: TextContentsOptions | true;
30
+ highlights?: HighlightsContentsOptions | true;
31
+ summary?: SummaryContentsOptions | true;
32
+ livecrawl?: LivecrawlOptions;
33
+ context?: ContextOptions | true;
34
+ livecrawlTimeout?: number;
35
+ filterEmptyResults?: boolean;
36
+ subpages?: number;
37
+ subpageTarget?: string | string[];
38
+ extras?: ExtrasOptions;
39
+ };
40
+ type LivecrawlOptions = "never" | "fallback" | "always" | "auto" | "preferred";
41
+ type TextContentsOptions = {
42
+ maxCharacters?: number;
43
+ includeHtmlTags?: boolean;
44
+ };
45
+ type HighlightsContentsOptions = {
46
+ query?: string;
47
+ numSentences?: number;
48
+ highlightsPerUrl?: number;
49
+ };
50
+ type SummaryContentsOptions = {
51
+ query?: string;
52
+ schema?: Record<string, unknown> | ZodType;
53
+ };
54
+ type ContextOptions = {
55
+ maxCharacters?: number;
56
+ };
57
+ type TextResponse = {
58
+ text: string;
59
+ };
60
+ type HighlightsResponse = {
61
+ highlights: string[];
62
+ highlightScores: number[];
63
+ };
64
+ type SummaryResponse = {
65
+ summary: string;
66
+ };
67
+ type ExtrasResponse = {
68
+ extras: {
69
+ links?: string[];
70
+ imageLinks?: string[];
71
+ };
72
+ };
73
+ type SubpagesResponse = {
74
+ subpages: Array<Record<string, never>>;
75
+ };
76
+ type Default<T extends object, U> = [keyof T] extends [never] ? U : T;
77
+ type ContentsResultComponent<T extends ContentsOptions> = Default<(T["text"] extends object | true ? TextResponse : Record<string, never>) & (T["highlights"] extends object | true ? HighlightsResponse : Record<string, never>) & (T["summary"] extends object | true ? SummaryResponse : Record<string, never>) & (T["subpages"] extends number ? SubpagesResponse : Record<string, never>) & (T["extras"] extends object ? ExtrasResponse : Record<string, never>), TextResponse>;
78
+ type CostDollarsContents = {
79
+ text?: number;
80
+ highlights?: number;
81
+ summary?: number;
82
+ };
83
+ type CostDollarsSeearch = {
84
+ neural?: number;
85
+ keyword?: number;
86
+ };
87
+ type CostDollars = {
88
+ total: number;
89
+ search?: CostDollarsSeearch;
90
+ contents?: CostDollarsContents;
91
+ };
92
+ type SearchResult<T extends ContentsOptions> = {
93
+ title: string | null;
94
+ url: string;
95
+ publishedDate?: string;
96
+ author?: string;
97
+ score?: number;
98
+ id: string;
99
+ image?: string;
100
+ favicon?: string;
101
+ } & ContentsResultComponent<T>;
102
+ type SearchResponse<T extends ContentsOptions> = {
103
+ results: SearchResult<T>[];
104
+ context?: string;
105
+ autopromptString?: string;
106
+ autoDate?: string;
107
+ requestId: string;
108
+ statuses?: Array<Status>;
109
+ costDollars?: CostDollars;
110
+ };
111
+ type Status = {
112
+ id: string;
113
+ status: string;
114
+ source: string;
115
+ };
116
+ type AnswerOptions = {
117
+ stream?: boolean;
118
+ text?: boolean;
119
+ model?: "exa";
120
+ systemPrompt?: string;
121
+ outputSchema?: Record<string, unknown>;
122
+ userLocation?: string;
123
+ };
124
+ type AnswerResponse = {
125
+ answer: string | Record<string, unknown>;
126
+ citations: SearchResult<Record<string, never>>[];
127
+ requestId?: string;
128
+ costDollars?: CostDollars;
129
+ };
130
+ type AnswerStreamChunk = {
131
+ content?: string;
132
+ citations?: Array<{
133
+ id: string;
134
+ url: string;
135
+ title?: string;
136
+ publishedDate?: string;
137
+ author?: string;
138
+ text?: string;
139
+ }>;
140
+ };
141
+ type AnswerOptionsTyped<T> = Omit<AnswerOptions, "outputSchema"> & {
142
+ outputSchema: T;
143
+ };
144
+ type AnswerResponseTyped<T> = Omit<AnswerResponse, "answer"> & {
145
+ answer: T;
146
+ };
147
+ export default class Exa {
148
+ private readonly baseUrl;
149
+ private readonly headers;
150
+ constructor(apiKey?: string, baseUrl?: string);
151
+ private extractContentsOptions;
152
+ request<T = unknown>(endpoint: string, method: string, body?: unknown, params?: Record<string, unknown>, headers?: Record<string, string>): Promise<T>;
153
+ rawRequest(endpoint: string, method?: string, body?: Record<string, unknown>, queryParams?: Record<string, string | number | boolean | string[] | undefined>): Promise<Response>;
154
+ search(query: string, options?: RegularSearchOptions): Promise<SearchResponse<Record<string, never>>>;
155
+ searchAndContents<T extends ContentsOptions>(query: string, options?: RegularSearchOptions & T): Promise<SearchResponse<T>>;
156
+ findSimilar(url: string, options?: FindSimilarOptions): Promise<SearchResponse<Record<string, never>>>;
157
+ findSimilarAndContents<T extends ContentsOptions>(url: string, options?: FindSimilarOptions & T): Promise<SearchResponse<T>>;
158
+ getContents<T extends ContentsOptions>(urls: string | string[] | SearchResult<T>[], options?: T): Promise<SearchResponse<T>>;
159
+ answer<T>(query: string, options: AnswerOptionsTyped<ZodType<T>>): Promise<AnswerResponseTyped<T>>;
160
+ answer(query: string, options?: AnswerOptions): Promise<AnswerResponse>;
161
+ streamAnswer<T>(query: string, options: {
162
+ text?: boolean;
163
+ model?: "exa" | "exa-pro";
164
+ systemPrompt?: string;
165
+ outputSchema: ZodType<T>;
166
+ }): AsyncGenerator<AnswerStreamChunk>;
167
+ streamAnswer(query: string, options?: {
168
+ text?: boolean;
169
+ model?: "exa" | "exa-pro";
170
+ systemPrompt?: string;
171
+ outputSchema?: Record<string, unknown>;
172
+ }): AsyncGenerator<AnswerStreamChunk>;
173
+ private processChunk;
174
+ private parseSseStream;
175
+ }
176
+ export {};
177
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/api/exa/index.ts"],"names":[],"mappings":"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"}