@travisennis/acai 0.0.4 → 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.
- package/README.md +225 -6
- package/dist/api/exa/index.d.ts +177 -0
- package/dist/api/exa/index.d.ts.map +1 -0
- package/dist/api/exa/index.js +439 -0
- package/dist/cli.d.ts +3 -2
- package/dist/cli.d.ts.map +1 -0
- package/dist/commands/application-log-command.d.ts +1 -0
- package/dist/commands/application-log-command.d.ts.map +1 -0
- package/dist/commands/application-log-command.js +5 -3
- package/dist/commands/clear-command.d.ts +1 -0
- package/dist/commands/clear-command.d.ts.map +1 -0
- package/dist/commands/clear-command.js +2 -3
- package/dist/commands/compact-command.d.ts +1 -0
- package/dist/commands/compact-command.d.ts.map +1 -0
- package/dist/commands/compact-command.js +1 -1
- package/dist/commands/copy-command.d.ts +1 -0
- package/dist/commands/copy-command.d.ts.map +1 -0
- package/dist/commands/copy-command.js +3 -2
- package/dist/commands/edit-command.d.ts +1 -0
- package/dist/commands/edit-command.d.ts.map +1 -0
- package/dist/commands/edit-command.js +7 -5
- package/dist/commands/edit-prompt-command.d.ts +2 -1
- package/dist/commands/edit-prompt-command.d.ts.map +1 -0
- package/dist/commands/edit-prompt-command.js +15 -7
- package/dist/commands/exit-command.d.ts +13 -2
- package/dist/commands/exit-command.d.ts.map +1 -0
- package/dist/commands/exit-command.js +14 -2
- package/dist/commands/files-command.d.ts +1 -0
- package/dist/commands/files-command.d.ts.map +1 -0
- package/dist/commands/files-command.js +9 -8
- package/dist/commands/generate-rules-command.d.ts +1 -0
- package/dist/commands/generate-rules-command.d.ts.map +1 -0
- package/dist/commands/generate-rules-command.js +4 -3
- package/dist/commands/health-command.d.ts +3 -1
- package/dist/commands/health-command.d.ts.map +1 -0
- package/dist/commands/health-command.js +42 -5
- package/dist/commands/help-command.d.ts +1 -0
- package/dist/commands/help-command.d.ts.map +1 -0
- package/dist/commands/help-command.js +2 -3
- package/dist/commands/init-command.d.ts +1 -0
- package/dist/commands/init-command.d.ts.map +1 -0
- package/dist/commands/init-command.js +1 -2
- package/dist/commands/last-log-command.d.ts +1 -0
- package/dist/commands/last-log-command.d.ts.map +1 -0
- package/dist/commands/last-log-command.js +12 -17
- package/dist/commands/list-tools-command.d.ts +3 -0
- package/dist/commands/list-tools-command.d.ts.map +1 -0
- package/dist/commands/list-tools-command.js +61 -0
- package/dist/commands/manager.d.ts +7 -2
- package/dist/commands/manager.d.ts.map +1 -0
- package/dist/commands/manager.js +43 -6
- package/dist/commands/model-command.d.ts +1 -0
- package/dist/commands/model-command.d.ts.map +1 -0
- package/dist/commands/model-command.js +5 -5
- package/dist/commands/paste-command.d.ts +1 -0
- package/dist/commands/paste-command.d.ts.map +1 -0
- package/dist/commands/paste-command.js +6 -5
- package/dist/commands/prompt-command.d.ts +2 -1
- package/dist/commands/prompt-command.d.ts.map +1 -0
- package/dist/commands/prompt-command.js +62 -8
- package/dist/commands/reset-command.d.ts +1 -0
- package/dist/commands/reset-command.d.ts.map +1 -0
- package/dist/commands/reset-command.js +1 -1
- package/dist/commands/rules-command.d.ts +1 -0
- package/dist/commands/rules-command.d.ts.map +1 -0
- package/dist/commands/rules-command.js +5 -3
- package/dist/commands/save-command.d.ts +1 -0
- package/dist/commands/save-command.d.ts.map +1 -0
- package/dist/commands/save-command.js +1 -1
- package/dist/commands/shell-command.d.ts +3 -0
- package/dist/commands/shell-command.d.ts.map +1 -0
- package/dist/commands/shell-command.js +60 -0
- package/dist/commands/types.d.ts +9 -6
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/usage-command.d.ts +1 -0
- package/dist/commands/usage-command.d.ts.map +1 -0
- package/dist/commands/usage-command.js +2 -3
- package/dist/config.d.ts +22 -34
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +61 -15
- package/dist/conversation-analyzer.d.ts +2 -1
- package/dist/conversation-analyzer.d.ts.map +1 -0
- package/dist/dedent.d.ts +1 -0
- package/dist/dedent.d.ts.map +1 -0
- package/dist/execution/index.d.ts +112 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +432 -0
- package/dist/formatting.d.ts +2 -13
- package/dist/formatting.d.ts.map +1 -0
- package/dist/formatting.js +5 -64
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -4
- package/dist/logger.d.ts +1 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/mentions.d.ts +4 -0
- package/dist/mentions.d.ts.map +1 -0
- package/dist/mentions.js +42 -10
- package/dist/messages.d.ts +8 -20
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +33 -53
- package/dist/middleware/audit-message.d.ts +1 -0
- package/dist/middleware/audit-message.d.ts.map +1 -0
- package/dist/middleware/index.d.ts +1 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/rate-limit.d.ts +1 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/models/ai-config.d.ts +1 -0
- package/dist/models/ai-config.d.ts.map +1 -0
- package/dist/models/anthropic-provider.d.ts +1 -0
- package/dist/models/anthropic-provider.d.ts.map +1 -0
- package/dist/models/deepseek-provider.d.ts +1 -0
- package/dist/models/deepseek-provider.d.ts.map +1 -0
- package/dist/models/google-provider.d.ts +1 -0
- package/dist/models/google-provider.d.ts.map +1 -0
- package/dist/models/groq-provider.d.ts +20 -0
- package/dist/models/groq-provider.d.ts.map +1 -0
- package/dist/models/groq-provider.js +31 -0
- package/dist/models/manager.d.ts +1 -0
- package/dist/models/manager.d.ts.map +1 -0
- package/dist/models/openai-provider.d.ts +2 -1
- package/dist/models/openai-provider.d.ts.map +1 -0
- package/dist/models/openrouter-provider.d.ts +31 -22
- package/dist/models/openrouter-provider.d.ts.map +1 -0
- package/dist/models/openrouter-provider.js +115 -1
- package/dist/models/providers.d.ts +4 -5
- package/dist/models/providers.d.ts.map +1 -0
- package/dist/models/providers.js +7 -3
- package/dist/models/xai-provider.d.ts +1 -0
- package/dist/models/xai-provider.d.ts.map +1 -0
- package/dist/parsing.d.ts +2 -1
- package/dist/parsing.d.ts.map +1 -0
- package/dist/prompts/manager.d.ts +14 -2
- package/dist/prompts/manager.d.ts.map +1 -0
- package/dist/prompts.d.ts +1 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +15 -11
- package/dist/repl/display-tool-messages.d.ts +4 -0
- package/dist/repl/display-tool-messages.d.ts.map +1 -0
- package/dist/repl/display-tool-messages.js +55 -0
- package/dist/repl/display-tool-use.d.ts +14 -0
- package/dist/repl/display-tool-use.d.ts.map +1 -0
- package/dist/repl/display-tool-use.js +63 -0
- package/dist/repl/get-prompt-header.d.ts +8 -0
- package/dist/repl/get-prompt-header.d.ts.map +1 -0
- package/dist/repl/get-prompt-header.js +38 -0
- package/dist/repl/tool-call-repair.d.ts +4 -0
- package/dist/repl/tool-call-repair.d.ts.map +1 -0
- package/dist/repl/tool-call-repair.js +50 -0
- package/dist/repl-prompt.d.ts +1 -0
- package/dist/repl-prompt.d.ts.map +1 -0
- package/dist/repl.d.ts +8 -4
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +108 -252
- package/dist/terminal/ansi-styles.d.ts +77 -0
- package/dist/terminal/ansi-styles.d.ts.map +1 -0
- package/dist/terminal/ansi-styles.js +215 -0
- package/dist/terminal/checkbox-prompt.d.ts +36 -0
- package/dist/terminal/checkbox-prompt.d.ts.map +1 -0
- package/dist/terminal/checkbox-prompt.js +362 -0
- package/dist/terminal/default-theme.d.ts +6 -0
- package/dist/terminal/default-theme.d.ts.map +1 -0
- package/dist/terminal/default-theme.js +182 -0
- package/dist/terminal/east-asian-width.d.ts +8 -0
- package/dist/terminal/east-asian-width.d.ts.map +1 -0
- package/dist/terminal/east-asian-width.js +409 -0
- package/dist/terminal/editor-prompt.d.ts +10 -0
- package/dist/terminal/editor-prompt.d.ts.map +1 -0
- package/dist/terminal/editor-prompt.js +61 -0
- package/dist/terminal/errors.d.ts +19 -0
- package/dist/terminal/errors.d.ts.map +1 -0
- package/dist/terminal/errors.js +37 -0
- package/dist/terminal/formatting.d.ts +1 -11
- package/dist/terminal/formatting.d.ts.map +1 -0
- package/dist/terminal/formatting.js +4 -20
- package/dist/terminal/highlight/index.d.ts +53 -0
- package/dist/terminal/highlight/index.d.ts.map +1 -0
- package/dist/terminal/highlight/index.js +90 -0
- package/dist/terminal/highlight/theme.d.ts +233 -0
- package/dist/terminal/highlight/theme.d.ts.map +1 -0
- package/dist/terminal/highlight/theme.js +83 -0
- package/dist/terminal/index.d.ts +16 -9
- package/dist/terminal/index.d.ts.map +1 -0
- package/dist/terminal/index.js +42 -126
- package/dist/terminal/input-prompt.d.ts +16 -0
- package/dist/terminal/input-prompt.d.ts.map +1 -0
- package/dist/terminal/input-prompt.js +181 -0
- package/dist/terminal/markdown-utils.d.ts +1 -0
- package/dist/terminal/markdown-utils.d.ts.map +1 -0
- package/dist/terminal/markdown.d.ts +1 -0
- package/dist/terminal/markdown.d.ts.map +1 -0
- package/dist/terminal/markdown.js +17 -12
- package/dist/terminal/search-prompt.d.ts +20 -0
- package/dist/terminal/search-prompt.d.ts.map +1 -0
- package/dist/terminal/search-prompt.js +279 -0
- package/dist/terminal/select-prompt.d.ts +26 -0
- package/dist/terminal/select-prompt.d.ts.map +1 -0
- package/dist/terminal/select-prompt.js +298 -0
- package/dist/terminal/string-width.d.ts +7 -0
- package/dist/terminal/string-width.d.ts.map +1 -0
- package/dist/terminal/string-width.js +61 -0
- package/dist/terminal/strip-ansi.d.ts +2 -0
- package/dist/terminal/strip-ansi.d.ts.map +1 -0
- package/dist/terminal/strip-ansi.js +20 -0
- package/dist/terminal/style.d.ts +191 -0
- package/dist/terminal/style.d.ts.map +1 -0
- package/dist/terminal/style.js +259 -0
- package/dist/terminal/supports-color.d.ts +1 -0
- package/dist/terminal/supports-color.d.ts.map +1 -0
- package/dist/terminal/supports-hyperlinks.d.ts +1 -3
- package/dist/terminal/supports-hyperlinks.d.ts.map +1 -0
- package/dist/terminal/supports-hyperlinks.js +1 -1
- package/dist/terminal/types.d.ts +1 -37
- package/dist/terminal/types.d.ts.map +1 -0
- package/dist/terminal/wrap-ansi.d.ts +8 -0
- package/dist/terminal/wrap-ansi.d.ts.map +1 -0
- package/dist/terminal/wrap-ansi.js +190 -0
- package/dist/{token-utils.d.ts → tokens/counter.d.ts} +1 -0
- package/dist/tokens/counter.d.ts.map +1 -0
- package/dist/{token-utils.js → tokens/counter.js} +1 -1
- package/dist/tokens/manage-output.d.ts +34 -0
- package/dist/tokens/manage-output.d.ts.map +1 -0
- package/dist/tokens/manage-output.js +44 -0
- package/dist/{token-tracker.d.ts → tokens/tracker.d.ts} +1 -0
- package/dist/tokens/tracker.d.ts.map +1 -0
- package/dist/tool-executor.d.ts +28 -0
- package/dist/tool-executor.d.ts.map +1 -0
- package/dist/tool-executor.js +74 -0
- package/dist/tools/agent.d.ts +3 -2
- package/dist/tools/agent.d.ts.map +1 -0
- package/dist/tools/agent.js +7 -4
- package/dist/tools/bash-utils.d.ts +7 -0
- package/dist/tools/bash-utils.d.ts.map +1 -0
- package/dist/tools/bash-utils.js +212 -0
- package/dist/tools/bash.d.ts +9 -7
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +95 -212
- package/dist/tools/code-interpreter.d.ts +1 -1
- package/dist/tools/code-interpreter.d.ts.map +1 -0
- package/dist/tools/code-interpreter.js +31 -96
- package/dist/tools/delete-file.d.ts +5 -3
- package/dist/tools/delete-file.d.ts.map +1 -0
- package/dist/tools/delete-file.js +47 -33
- package/dist/tools/directory-tree.d.ts +10 -1
- package/dist/tools/directory-tree.d.ts.map +1 -0
- package/dist/tools/directory-tree.js +91 -8
- package/dist/tools/dynamic-tool-loader.d.ts +12 -0
- package/dist/tools/dynamic-tool-loader.d.ts.map +1 -0
- package/dist/tools/dynamic-tool-loader.js +280 -0
- package/dist/tools/dynamic-tool-parser.d.ts +20 -0
- package/dist/tools/dynamic-tool-parser.d.ts.map +1 -0
- package/dist/tools/dynamic-tool-parser.js +21 -0
- package/dist/tools/edit-file.d.ts +10 -2
- package/dist/tools/edit-file.d.ts.map +1 -0
- package/dist/tools/edit-file.js +117 -40
- package/dist/tools/file-editing-utils.d.ts +2 -0
- package/dist/tools/file-editing-utils.d.ts.map +1 -0
- package/dist/tools/file-editing-utils.js +135 -0
- package/dist/tools/filesystem-utils.d.ts +6 -21
- package/dist/tools/filesystem-utils.d.ts.map +1 -0
- package/dist/tools/filesystem-utils.js +96 -148
- package/dist/tools/git-utils.d.ts +1 -0
- package/dist/tools/git-utils.d.ts.map +1 -0
- package/dist/tools/grep.d.ts +5 -3
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +67 -27
- package/dist/tools/index.d.ts +10 -16
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +33 -22
- package/dist/tools/move-file.d.ts +1 -0
- package/dist/tools/move-file.d.ts.map +1 -0
- package/dist/tools/move-file.js +12 -5
- package/dist/tools/read-file.d.ts +2 -1
- package/dist/tools/read-file.d.ts.map +1 -0
- package/dist/tools/read-file.js +13 -6
- package/dist/tools/read-multiple-files.d.ts +2 -1
- package/dist/tools/read-multiple-files.d.ts.map +1 -0
- package/dist/tools/read-multiple-files.js +90 -9
- package/dist/tools/save-file.d.ts +5 -3
- package/dist/tools/save-file.d.ts.map +1 -0
- package/dist/tools/save-file.js +64 -36
- package/dist/tools/think.d.ts +1 -0
- package/dist/tools/think.d.ts.map +1 -0
- package/dist/tools/think.js +5 -1
- package/dist/tools/types.d.ts +14 -1
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/web-fetch.d.ts +4 -2
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +2 -2
- package/dist/tools/web-search.d.ts +2 -1
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +46 -11
- package/dist/utils/filesystem.d.ts +23 -0
- package/dist/utils/filesystem.d.ts.map +1 -0
- package/dist/utils/filesystem.js +140 -0
- package/dist/utils/filetype-detection.d.ts +3 -0
- package/dist/utils/filetype-detection.d.ts.map +1 -0
- package/dist/utils/filetype-detection.js +112 -0
- package/dist/utils/glob.d.ts +52 -0
- package/dist/utils/glob.d.ts.map +1 -0
- package/dist/utils/glob.js +376 -0
- package/dist/utils/ignore.d.ts +104 -0
- package/dist/utils/ignore.d.ts.map +1 -0
- package/dist/utils/ignore.js +649 -0
- package/dist/utils/process.d.ts +3 -2
- package/dist/utils/process.d.ts.map +1 -0
- package/dist/utils/process.js +17 -2
- package/dist/utils/zod-utils.d.ts +4 -0
- package/dist/utils/zod-utils.d.ts.map +1 -0
- package/dist/utils/zod-utils.js +7 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.d.ts.map +1 -0
- package/package.json +32 -30
- package/dist/tools/command-validation.d.ts +0 -11
- package/dist/tools/command-validation.js +0 -45
- /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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"}
|