@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.
- package/README.md +4 -2
- package/dist/agent/index.d.ts +119 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +406 -0
- package/dist/agent/manual-loop.d.ts +41 -0
- package/dist/agent/manual-loop.d.ts.map +1 -0
- package/dist/agent/manual-loop.js +278 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +27 -33
- package/dist/commands/add-directory-command.d.ts +3 -0
- package/dist/commands/add-directory-command.d.ts.map +1 -0
- package/dist/commands/add-directory-command.js +85 -0
- package/dist/commands/application-log-command.d.ts.map +1 -1
- package/dist/commands/application-log-command.js +34 -0
- package/dist/commands/clear-command.d.ts.map +1 -1
- package/dist/commands/clear-command.js +8 -0
- package/dist/commands/compact-command.d.ts.map +1 -1
- package/dist/commands/compact-command.js +15 -2
- package/dist/commands/context-command.d.ts +3 -0
- package/dist/commands/context-command.d.ts.map +1 -0
- package/dist/commands/context-command.js +183 -0
- package/dist/commands/copy-command.d.ts.map +1 -1
- package/dist/commands/copy-command.js +28 -0
- package/dist/commands/edit-command.d.ts.map +1 -1
- package/dist/commands/edit-command.js +33 -0
- package/dist/commands/edit-prompt-command.d.ts.map +1 -1
- package/dist/commands/edit-prompt-command.js +28 -0
- package/dist/commands/exit-command.d.ts.map +1 -1
- package/dist/commands/exit-command.js +20 -0
- package/dist/commands/files-command.d.ts.map +1 -1
- package/dist/commands/files-command.js +57 -0
- package/dist/commands/generate-rules-command.d.ts.map +1 -1
- package/dist/commands/generate-rules-command.js +311 -1
- package/dist/commands/handoff-command.d.ts +3 -0
- package/dist/commands/handoff-command.d.ts.map +1 -0
- package/dist/commands/handoff-command.js +202 -0
- package/dist/commands/health-command.d.ts.map +1 -1
- package/dist/commands/health-command.js +119 -2
- package/dist/commands/help-command.d.ts.map +1 -1
- package/dist/commands/help-command.js +28 -0
- package/dist/commands/history-command.d.ts +3 -0
- package/dist/commands/history-command.d.ts.map +1 -0
- package/dist/commands/history-command.js +534 -0
- package/dist/commands/init-command.d.ts +1 -1
- package/dist/commands/init-command.d.ts.map +1 -1
- package/dist/commands/init-command.js +55 -18
- package/dist/commands/last-log-command.d.ts.map +1 -1
- package/dist/commands/last-log-command.js +27 -0
- package/dist/commands/list-directories-command.d.ts +3 -0
- package/dist/commands/list-directories-command.d.ts.map +1 -0
- package/dist/commands/list-directories-command.js +48 -0
- package/dist/commands/list-tools-command.d.ts.map +1 -1
- package/dist/commands/list-tools-command.js +66 -3
- package/dist/commands/manager.d.ts +15 -3
- package/dist/commands/manager.d.ts.map +1 -1
- package/dist/commands/manager.js +86 -26
- package/dist/commands/model-command.d.ts +22 -0
- package/dist/commands/model-command.d.ts.map +1 -1
- package/dist/commands/model-command.js +256 -0
- package/dist/commands/paste-command.d.ts.map +1 -1
- package/dist/commands/paste-command.js +92 -0
- package/dist/commands/pickup-command.d.ts +3 -0
- package/dist/commands/pickup-command.d.ts.map +1 -0
- package/dist/commands/pickup-command.js +161 -0
- package/dist/commands/prompt-command.d.ts +1 -1
- package/dist/commands/prompt-command.d.ts.map +1 -1
- package/dist/commands/prompt-command.js +117 -2
- package/dist/commands/remove-directory-command.d.ts +3 -0
- package/dist/commands/remove-directory-command.d.ts.map +1 -0
- package/dist/commands/remove-directory-command.js +87 -0
- package/dist/commands/reset-command.d.ts +1 -1
- package/dist/commands/reset-command.d.ts.map +1 -1
- package/dist/commands/reset-command.js +13 -2
- package/dist/commands/rules-command.d.ts.map +1 -1
- package/dist/commands/rules-command.js +65 -0
- package/dist/commands/save-command.d.ts.map +1 -1
- package/dist/commands/save-command.js +12 -0
- package/dist/commands/shell-command.d.ts.map +1 -1
- package/dist/commands/shell-command.js +68 -0
- package/dist/commands/types.d.ts +9 -4
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/usage-command.d.ts.map +1 -1
- package/dist/commands/usage-command.js +22 -0
- package/dist/config.d.ts +6 -7
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +23 -29
- package/dist/formatting.d.ts +108 -0
- package/dist/formatting.d.ts.map +1 -1
- package/dist/formatting.js +147 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +140 -38
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +47 -18
- package/dist/mentions.d.ts +2 -1
- package/dist/mentions.d.ts.map +1 -1
- package/dist/mentions.js +16 -1
- package/dist/messages.d.ts +8 -0
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +56 -19
- package/dist/middleware/cache.d.ts +3 -0
- package/dist/middleware/cache.d.ts.map +1 -0
- package/dist/middleware/cache.js +53 -0
- package/dist/middleware/index.d.ts +1 -0
- package/dist/middleware/index.d.ts.map +1 -1
- package/dist/middleware/index.js +1 -0
- package/dist/models/ai-config.d.ts +4 -2
- package/dist/models/ai-config.d.ts.map +1 -1
- package/dist/models/ai-config.js +12 -2
- package/dist/models/anthropic-provider.d.ts.map +1 -1
- package/dist/models/anthropic-provider.js +3 -60
- package/dist/models/manager.d.ts +2 -1
- package/dist/models/manager.d.ts.map +1 -1
- package/dist/models/manager.js +26 -2
- package/dist/models/openrouter-provider.d.ts +7 -14
- package/dist/models/openrouter-provider.d.ts.map +1 -1
- package/dist/models/openrouter-provider.js +114 -169
- package/dist/models/providers.d.ts +1 -1
- package/dist/models/providers.d.ts.map +1 -1
- package/dist/prompts.d.ts +1 -0
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +53 -4
- package/dist/repl/display-tool-messages.d.ts +1 -1
- package/dist/repl/display-tool-messages.d.ts.map +1 -1
- package/dist/repl/display-tool-messages.js +47 -44
- package/dist/repl/get-prompt-header.d.ts.map +1 -1
- package/dist/repl/get-prompt-header.js +1 -30
- package/dist/repl/project-status-line.d.ts +2 -0
- package/dist/repl/project-status-line.d.ts.map +1 -0
- package/dist/repl/project-status-line.js +31 -0
- package/dist/repl/prompt.d.ts +21 -0
- package/dist/repl/prompt.d.ts.map +1 -0
- package/dist/{repl-prompt.js → repl/prompt.js} +119 -22
- package/dist/repl/tool-call-repair.d.ts.map +1 -1
- package/dist/repl/tool-call-repair.js +8 -4
- package/dist/repl-new.d.ts +53 -0
- package/dist/repl-new.d.ts.map +1 -0
- package/dist/repl-new.js +374 -0
- package/dist/repl.d.ts +3 -5
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +74 -166
- package/dist/terminal/checkbox-prompt.d.ts.map +1 -1
- package/dist/terminal/checkbox-prompt.js +10 -4
- package/dist/terminal/index.d.ts +7 -0
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/index.js +94 -0
- package/dist/terminal/input-prompt.d.ts +2 -1
- package/dist/terminal/input-prompt.d.ts.map +1 -1
- package/dist/terminal/markdown.js +3 -0
- package/dist/terminal/search-prompt.d.ts.map +1 -1
- package/dist/terminal/search-prompt.js +11 -10
- package/dist/terminal/select-prompt.d.ts +2 -2
- package/dist/terminal/select-prompt.d.ts.map +1 -1
- package/dist/terminal/select-prompt.js +47 -39
- package/dist/tokens/threshold.d.ts +35 -0
- package/dist/tokens/threshold.d.ts.map +1 -0
- package/dist/tokens/threshold.js +85 -0
- package/dist/tools/advanced-edit-file.d.ts +69 -0
- package/dist/tools/advanced-edit-file.d.ts.map +1 -0
- package/dist/tools/advanced-edit-file.js +281 -0
- package/dist/tools/agent.d.ts +16 -5
- package/dist/tools/agent.d.ts.map +1 -1
- package/dist/tools/agent.js +71 -58
- package/dist/tools/bash-utils.d.ts +1 -1
- package/dist/tools/bash-utils.d.ts.map +1 -1
- package/dist/tools/bash-utils.js +14 -6
- package/dist/tools/bash.d.ts +21 -12
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +88 -135
- package/dist/tools/code-interpreter.d.ts +21 -9
- package/dist/tools/code-interpreter.d.ts.map +1 -1
- package/dist/tools/code-interpreter.js +138 -137
- package/dist/tools/delete-file.d.ts +17 -10
- package/dist/tools/delete-file.d.ts.map +1 -1
- package/dist/tools/delete-file.js +51 -95
- package/dist/tools/directory-tree.d.ts +17 -6
- package/dist/tools/directory-tree.d.ts.map +1 -1
- package/dist/tools/directory-tree.js +47 -49
- package/dist/tools/dynamic-tool-loader.d.ts +18 -8
- package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
- package/dist/tools/dynamic-tool-loader.js +121 -129
- package/dist/tools/dynamic-tool-parser.d.ts +1 -0
- package/dist/tools/dynamic-tool-parser.d.ts.map +1 -1
- package/dist/tools/dynamic-tool-parser.js +1 -0
- package/dist/tools/edit-file.d.ts +35 -15
- package/dist/tools/edit-file.d.ts.map +1 -1
- package/dist/tools/edit-file.js +112 -112
- package/dist/tools/filesystem-utils.d.ts +2 -1
- package/dist/tools/filesystem-utils.d.ts.map +1 -1
- package/dist/tools/filesystem-utils.js +31 -17
- package/dist/tools/glob.d.ts +36 -0
- package/dist/tools/glob.d.ts.map +1 -0
- package/dist/tools/glob.js +143 -0
- package/dist/tools/grep.d.ts +73 -12
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +413 -168
- package/dist/tools/index.d.ts +204 -124
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +242 -135
- package/dist/tools/llm-edit-fixer.d.ts +25 -0
- package/dist/tools/llm-edit-fixer.d.ts.map +1 -0
- package/dist/tools/llm-edit-fixer.js +150 -0
- package/dist/tools/move-file.d.ts +19 -7
- package/dist/tools/move-file.d.ts.map +1 -1
- package/dist/tools/move-file.js +40 -33
- package/dist/tools/read-file.d.ts +47 -9
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +74 -69
- package/dist/tools/read-multiple-files.d.ts +17 -6
- package/dist/tools/read-multiple-files.d.ts.map +1 -1
- package/dist/tools/read-multiple-files.js +76 -73
- package/dist/tools/save-file.d.ts +45 -12
- package/dist/tools/save-file.d.ts.map +1 -1
- package/dist/tools/save-file.js +58 -101
- package/dist/tools/think.d.ts +15 -7
- package/dist/tools/think.d.ts.map +1 -1
- package/dist/tools/think.js +30 -22
- package/dist/tools/types.d.ts +4 -10
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +9 -0
- package/dist/tools/utils.d.ts +14 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +16 -0
- package/dist/tools/web-fetch.d.ts +11 -4
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +39 -38
- package/dist/tools/web-search.d.ts +15 -6
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +50 -32
- package/dist/tui/autocomplete.d.ts +44 -0
- package/dist/tui/autocomplete.d.ts.map +1 -0
- package/dist/tui/autocomplete.js +466 -0
- package/dist/tui/components/assistant-message.d.ts +18 -0
- package/dist/tui/components/assistant-message.d.ts.map +1 -0
- package/dist/tui/components/assistant-message.js +29 -0
- package/dist/tui/components/editor.d.ts +51 -0
- package/dist/tui/components/editor.d.ts.map +1 -0
- package/dist/tui/components/editor.js +758 -0
- package/dist/tui/components/footer.d.ts +24 -0
- package/dist/tui/components/footer.d.ts.map +1 -0
- package/dist/tui/components/footer.js +197 -0
- package/dist/tui/components/input.d.ts +14 -0
- package/dist/tui/components/input.d.ts.map +1 -0
- package/dist/tui/components/input.js +122 -0
- package/dist/tui/components/loader.d.ts +19 -0
- package/dist/tui/components/loader.d.ts.map +1 -0
- package/dist/tui/components/loader.js +45 -0
- package/dist/tui/components/markdown.d.ts +103 -0
- package/dist/tui/components/markdown.d.ts.map +1 -0
- package/dist/tui/components/markdown.js +533 -0
- package/dist/tui/components/modal.d.ts +40 -0
- package/dist/tui/components/modal.d.ts.map +1 -0
- package/dist/tui/components/modal.js +292 -0
- package/dist/tui/components/prompt-status.d.ts +16 -0
- package/dist/tui/components/prompt-status.d.ts.map +1 -0
- package/dist/tui/components/prompt-status.js +21 -0
- package/dist/tui/components/select-list.d.ts +22 -0
- package/dist/tui/components/select-list.d.ts.map +1 -0
- package/dist/tui/components/select-list.js +143 -0
- package/dist/tui/components/spacer.d.ts +16 -0
- package/dist/tui/components/spacer.d.ts.map +1 -0
- package/dist/tui/components/spacer.js +27 -0
- package/dist/tui/components/text.d.ts +26 -0
- package/dist/tui/components/text.d.ts.map +1 -0
- package/dist/tui/components/text.js +143 -0
- package/dist/tui/components/thinking-block.d.ts +14 -0
- package/dist/tui/components/thinking-block.d.ts.map +1 -0
- package/dist/tui/components/thinking-block.js +30 -0
- package/dist/tui/components/tool-execution.d.ts +17 -0
- package/dist/tui/components/tool-execution.d.ts.map +1 -0
- package/dist/tui/components/tool-execution.js +153 -0
- package/dist/tui/components/user-message.d.ts +9 -0
- package/dist/tui/components/user-message.d.ts.map +1 -0
- package/dist/tui/components/user-message.js +21 -0
- package/dist/tui/components/welcome.d.ts +6 -0
- package/dist/tui/components/welcome.d.ts.map +1 -0
- package/dist/tui/components/welcome.js +30 -0
- package/dist/tui/index.d.ts +14 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +18 -0
- package/dist/tui/terminal.d.ts +37 -0
- package/dist/tui/terminal.d.ts.map +1 -0
- package/dist/tui/terminal.js +104 -0
- package/dist/tui/tui.d.ts +67 -0
- package/dist/tui/tui.d.ts.map +1 -0
- package/dist/tui/tui.js +184 -0
- package/dist/tui/utils.d.ts +19 -0
- package/dist/tui/utils.d.ts.map +1 -0
- package/dist/tui/utils.js +31 -0
- package/dist/utils/generators.d.ts +3 -0
- package/dist/utils/generators.d.ts.map +1 -0
- package/dist/utils/generators.js +25 -0
- package/dist/utils/iterables.d.ts +2 -0
- package/dist/utils/iterables.d.ts.map +1 -0
- package/dist/utils/iterables.js +6 -0
- package/package.json +16 -16
- package/dist/conversation-analyzer.d.ts +0 -11
- package/dist/conversation-analyzer.d.ts.map +0 -1
- package/dist/conversation-analyzer.js +0 -88
- package/dist/repl-prompt.d.ts +0 -15
- package/dist/repl-prompt.d.ts.map +0 -1
- package/dist/tokens/manage-output.d.ts +0 -34
- package/dist/tokens/manage-output.d.ts.map +0 -1
- package/dist/tokens/manage-output.js +0 -44
- package/dist/tool-executor.d.ts +0 -28
- package/dist/tool-executor.d.ts.map +0 -1
- package/dist/tool-executor.js +0 -74
- package/dist/tools/file-editing-utils.d.ts +0 -2
- package/dist/tools/file-editing-utils.d.ts.map +0 -1
- 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 {
|
|
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
|
-
|
|
14
|
-
|
|
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
|
-
|
|
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
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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 {
|
|
3
|
-
|
|
4
|
-
|
|
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
|
|
18
|
+
export declare function loadDynamicTools({ baseDir }: {
|
|
7
19
|
baseDir: string;
|
|
8
|
-
|
|
9
|
-
|
|
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":"
|
|
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
|
-
|
|
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]:
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
|
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
|
|
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
|
|
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"}
|
|
@@ -1,27 +1,47 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import
|
|
3
|
-
import type {
|
|
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
|
-
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
19
|
+
allowedDirs?: string[];
|
|
20
|
+
modelManager?: ModelManager;
|
|
21
|
+
tokenTracker?: TokenTracker;
|
|
22
|
+
enableLlmFix?: boolean;
|
|
12
23
|
}) => Promise<{
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
|
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":"
|
|
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"}
|