@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.
- 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 +17 -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 -0
- package/dist/tools/code-interpreter.d.ts.map +1 -0
- package/dist/tools/code-interpreter.js +33 -8
- 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 -14
- 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 +10 -1
- package/dist/utils/process.d.ts.map +1 -0
- package/dist/utils/process.js +104 -5
- 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 -12
- package/dist/tools/command-validation.js +0 -113
- /package/dist/{token-tracker.js → tokens/tracker.js} +0 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { generateObject, NoSuchToolError, } from "ai";
|
|
2
|
+
import { jsonrepair } from "jsonrepair";
|
|
3
|
+
import { logger } from "../logger.js";
|
|
4
|
+
async function remoteToolCallRepair(modelManager, toolCall, tool, inputSchema) {
|
|
5
|
+
const { object: repairedArgs } = await generateObject({
|
|
6
|
+
model: modelManager.getModel("tool-repair"),
|
|
7
|
+
schema: tool.inputSchema,
|
|
8
|
+
prompt: [
|
|
9
|
+
`The model tried to call the tool "${toolCall.toolName}" with the following arguments:`,
|
|
10
|
+
JSON.stringify(toolCall.input),
|
|
11
|
+
"The tool accepts the following schema:",
|
|
12
|
+
JSON.stringify(inputSchema(toolCall)),
|
|
13
|
+
"Please fix the arguments.",
|
|
14
|
+
].join("\n"),
|
|
15
|
+
});
|
|
16
|
+
return { ...toolCall, input: JSON.stringify(repairedArgs) };
|
|
17
|
+
}
|
|
18
|
+
const localToolCallRepair = async (toolCall, tool) => {
|
|
19
|
+
const schema = tool.inputSchema;
|
|
20
|
+
const repairedArgs = jsonrepair(toolCall.input);
|
|
21
|
+
schema.parse(repairedArgs);
|
|
22
|
+
return { ...toolCall, input: JSON.stringify(repairedArgs) };
|
|
23
|
+
};
|
|
24
|
+
export const toolCallRepair = (modelManager) => {
|
|
25
|
+
const fn = async ({ toolCall, tools, inputSchema, error, }) => {
|
|
26
|
+
if (NoSuchToolError.isInstance(error)) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
logger.warn(`Attempting to repair tool call: ${toolCall.toolName}.`);
|
|
30
|
+
const tool = tools[toolCall.toolName];
|
|
31
|
+
if (typeof tool === "undefined") {
|
|
32
|
+
logger.error(new Error("Tool not found"), `Failed to repair tool call: ${toolCall.toolName}.`);
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
return localToolCallRepair(toolCall, tool);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
logger.error(err, `Failed to repair tool call locally: ${toolCall.toolName}.`);
|
|
40
|
+
try {
|
|
41
|
+
return remoteToolCallRepair(modelManager, toolCall, tool, inputSchema);
|
|
42
|
+
}
|
|
43
|
+
catch (err2) {
|
|
44
|
+
logger.error(err2, `Failed to repair tool call remotely: ${toolCall.toolName}.`);
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
return fn;
|
|
50
|
+
};
|
package/dist/repl-prompt.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl-prompt.d.ts","sourceRoot":"","sources":["../source/repl-prompt.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAyD5D,qBAAa,UAAU;IAErB,OAAO,CAAC,gBAAgB,CAAC,CAAkC;IAC3D,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,UAAU,CAAM;gBAEZ,EACV,QAAQ,EACR,OAAO,GACR,EAAE;QAAE,QAAQ,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE;IA4F5C,KAAK;IAoBX,KAAK;IAQL,CAAC,MAAM,CAAC,OAAO,CAAC;CAGjB"}
|
package/dist/repl.d.ts
CHANGED
|
@@ -3,8 +3,9 @@ import type { MessageHistory } from "./messages.ts";
|
|
|
3
3
|
import type { ModelManager } from "./models/manager.js";
|
|
4
4
|
import type { PromptManager } from "./prompts/manager.ts";
|
|
5
5
|
import type { Terminal } from "./terminal/index.ts";
|
|
6
|
-
import type {
|
|
7
|
-
import type {
|
|
6
|
+
import type { TokenCounter } from "./tokens/counter.ts";
|
|
7
|
+
import type { TokenTracker } from "./tokens/tracker.ts";
|
|
8
|
+
import type { ToolExecutor } from "./tool-executor.ts";
|
|
8
9
|
import type { Message } from "./tools/types.ts";
|
|
9
10
|
interface ReplOptions {
|
|
10
11
|
messageHistory: MessageHistory;
|
|
@@ -16,12 +17,15 @@ interface ReplOptions {
|
|
|
16
17
|
config: Record<PropertyKey, unknown>;
|
|
17
18
|
tokenCounter: TokenCounter;
|
|
18
19
|
toolEvents: Map<string, Message[]>;
|
|
19
|
-
|
|
20
|
+
showLastMessage: boolean;
|
|
21
|
+
toolExecutor?: ToolExecutor;
|
|
22
|
+
promptHistory: string[];
|
|
20
23
|
}
|
|
21
24
|
export declare class Repl {
|
|
22
25
|
private options;
|
|
26
|
+
private showLastMessage;
|
|
23
27
|
constructor(options: ReplOptions);
|
|
24
28
|
run(): Promise<void>;
|
|
25
|
-
private displayToolUse;
|
|
26
29
|
}
|
|
27
30
|
export {};
|
|
31
|
+
//# sourceMappingURL=repl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../source/repl.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAI5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAO1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,UAAU,WAAW;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACrC,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACnC,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,qBAAa,IAAI;IACf,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,eAAe,CAAU;gBAErB,OAAO,EAAE,WAAW;IAK1B,GAAG;CAwVV"}
|
package/dist/repl.js
CHANGED
|
@@ -1,78 +1,133 @@
|
|
|
1
1
|
import { isNumber, isRecord } from "@travisennis/stdlib/typeguards";
|
|
2
|
-
import {
|
|
3
|
-
import chalk from "chalk";
|
|
2
|
+
import { stepCountIs, streamText } from "ai";
|
|
4
3
|
import { config as configManager } from "./config.js";
|
|
5
4
|
import { logger } from "./logger.js";
|
|
6
|
-
import { processPrompt } from "./mentions.js";
|
|
5
|
+
import { PromptError, processPrompt } from "./mentions.js";
|
|
7
6
|
import { AiConfig } from "./models/ai-config.js";
|
|
8
7
|
import { systemPrompt } from "./prompts.js";
|
|
8
|
+
import { displayToolMessages } from "./repl/display-tool-messages.js";
|
|
9
|
+
import { displayToolUse } from "./repl/display-tool-use.js";
|
|
10
|
+
import { getPromptHeader } from "./repl/get-prompt-header.js";
|
|
11
|
+
import { toolCallRepair } from "./repl/tool-call-repair.js";
|
|
9
12
|
import { ReplPrompt } from "./repl-prompt.js";
|
|
10
|
-
import
|
|
11
|
-
import { getCurrentBranch, getDiffStat, getGitStatus, hasUncommittedChanges, inGitDirectory, } from "./tools/git-utils.js"; // Modified import
|
|
13
|
+
import style from "./terminal/style.js";
|
|
12
14
|
import { initAgents, initTools } from "./tools/index.js";
|
|
13
15
|
export class Repl {
|
|
14
16
|
options;
|
|
17
|
+
showLastMessage;
|
|
15
18
|
constructor(options) {
|
|
16
19
|
this.options = options;
|
|
20
|
+
this.showLastMessage = options.showLastMessage;
|
|
17
21
|
}
|
|
18
22
|
async run() {
|
|
19
|
-
const { config, promptManager, terminal, modelManager, tokenTracker, messageHistory, commands, tokenCounter, toolEvents,
|
|
23
|
+
const { config, promptManager, terminal, modelManager, tokenTracker, messageHistory, commands, tokenCounter, toolEvents, toolExecutor, promptHistory, } = this.options;
|
|
20
24
|
logger.info(config, "Config:");
|
|
21
25
|
terminal.displayWelcome();
|
|
22
|
-
const promptHistory = [];
|
|
23
26
|
let currentContextWindow = 0;
|
|
24
27
|
messageHistory.on("clear-history", () => {
|
|
25
28
|
currentContextWindow = 0;
|
|
26
29
|
});
|
|
27
|
-
|
|
30
|
+
const finalSystemPrompt = await systemPrompt();
|
|
31
|
+
// Initialize tools once outside the loop - all models support tool calling
|
|
32
|
+
const tools = {
|
|
33
|
+
...(await initTools({
|
|
34
|
+
terminal,
|
|
35
|
+
tokenCounter,
|
|
36
|
+
events: toolEvents,
|
|
37
|
+
toolExecutor,
|
|
38
|
+
})),
|
|
39
|
+
...(await initAgents({
|
|
40
|
+
terminal,
|
|
41
|
+
modelManager,
|
|
42
|
+
tokenTracker,
|
|
43
|
+
tokenCounter,
|
|
44
|
+
events: toolEvents,
|
|
45
|
+
})),
|
|
46
|
+
};
|
|
47
|
+
let currentAbortController = null;
|
|
48
|
+
// Handle Ctrl+C (SIGINT) as a fallback when not in raw mode
|
|
49
|
+
process.on("SIGINT", () => {
|
|
50
|
+
currentAbortController?.abort();
|
|
51
|
+
});
|
|
28
52
|
while (true) {
|
|
29
|
-
|
|
30
|
-
const { signal } =
|
|
31
|
-
const cb = () => {
|
|
32
|
-
abortController.abort();
|
|
33
|
-
};
|
|
34
|
-
if (prevCb) {
|
|
35
|
-
process.removeListener("SIGINT", prevCb);
|
|
36
|
-
}
|
|
37
|
-
// Handle Ctrl+C (SIGINT)
|
|
38
|
-
process.on("SIGINT", cb);
|
|
39
|
-
prevCb = cb;
|
|
53
|
+
currentAbortController = new AbortController();
|
|
54
|
+
const { signal } = currentAbortController;
|
|
40
55
|
const langModel = modelManager.getModel("repl");
|
|
41
56
|
const modelConfig = modelManager.getModelMetadata("repl");
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
57
|
+
// agent header/status line
|
|
58
|
+
await getPromptHeader({
|
|
59
|
+
terminal,
|
|
60
|
+
modelId: langModel.modelId,
|
|
61
|
+
contextWindow: modelConfig.contextWindow,
|
|
62
|
+
currentContextWindow,
|
|
63
|
+
});
|
|
64
|
+
// Display last message when continuing/resuming a conversation
|
|
65
|
+
if (this.showLastMessage) {
|
|
66
|
+
const lastMessage = messageHistory.getLastMessage();
|
|
67
|
+
if (lastMessage) {
|
|
68
|
+
terminal.lineBreak();
|
|
69
|
+
terminal.writeln(style.dim("Continuing conversation:"));
|
|
70
|
+
terminal.display(lastMessage);
|
|
71
|
+
terminal.lineBreak();
|
|
72
|
+
terminal.hr();
|
|
73
|
+
}
|
|
74
|
+
// don't show the last message after showing it once
|
|
75
|
+
this.showLastMessage = false;
|
|
76
|
+
}
|
|
46
77
|
if (!promptManager.isPending()) {
|
|
47
78
|
// For interactive input
|
|
48
79
|
const prompt = new ReplPrompt({ commands, history: promptHistory });
|
|
49
80
|
const userInput = await prompt.input();
|
|
50
81
|
prompt.close();
|
|
82
|
+
terminal.startProgress();
|
|
51
83
|
// see if the userInput contains a command
|
|
52
84
|
const commandResult = await commands.handle({ userInput });
|
|
53
85
|
if (commandResult.break) {
|
|
86
|
+
terminal.stopProgress();
|
|
54
87
|
break;
|
|
55
88
|
}
|
|
56
89
|
if (commandResult.continue) {
|
|
90
|
+
terminal.stopProgress();
|
|
57
91
|
terminal.lineBreak();
|
|
58
92
|
continue;
|
|
59
93
|
}
|
|
60
94
|
if (!userInput.trim()) {
|
|
95
|
+
terminal.stopProgress();
|
|
61
96
|
continue;
|
|
62
97
|
}
|
|
63
98
|
// if there is no pending prompt then use the user's input. otherwise, the prompt was loaded from a command
|
|
64
99
|
if (!promptManager.isPending()) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
100
|
+
try {
|
|
101
|
+
const processedPrompt = await processPrompt(userInput, {
|
|
102
|
+
baseDir: process.cwd(),
|
|
103
|
+
model: modelConfig,
|
|
104
|
+
});
|
|
105
|
+
for (const context of processedPrompt.context) {
|
|
106
|
+
promptManager.addContext(context);
|
|
107
|
+
}
|
|
108
|
+
promptManager.set(processedPrompt.message);
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (error instanceof PromptError) {
|
|
112
|
+
terminal.error(`Prompt processing failed: ${error.message}`);
|
|
113
|
+
if (error.cause &&
|
|
114
|
+
typeof error.cause === "object" &&
|
|
115
|
+
"command" in error.cause &&
|
|
116
|
+
typeof error.cause.command === "string") {
|
|
117
|
+
terminal.error(`Command: ${error.cause.command}`);
|
|
118
|
+
}
|
|
119
|
+
terminal.lineBreak();
|
|
120
|
+
terminal.stopProgress();
|
|
121
|
+
continue; // Continue the REPL loop
|
|
122
|
+
}
|
|
123
|
+
throw error; // Re-throw other errors
|
|
71
124
|
}
|
|
72
|
-
promptManager.set(processedPrompt.message);
|
|
73
125
|
}
|
|
74
126
|
terminal.lineBreak();
|
|
75
127
|
}
|
|
128
|
+
else {
|
|
129
|
+
terminal.startProgress();
|
|
130
|
+
}
|
|
76
131
|
// flag to see if the user prompt has added context
|
|
77
132
|
const hasAddedContext = promptManager.hasContext();
|
|
78
133
|
if (hasAddedContext) {
|
|
@@ -83,31 +138,11 @@ export class Repl {
|
|
|
83
138
|
const userPrompt = promptManager.get();
|
|
84
139
|
const userMsg = promptManager.getUserMessage();
|
|
85
140
|
messageHistory.appendUserMessage(userMsg);
|
|
86
|
-
const finalSystemPrompt = await systemPrompt({
|
|
87
|
-
supportsToolCalling: modelConfig.supportsToolCalling,
|
|
88
|
-
});
|
|
89
141
|
const aiConfig = new AiConfig({
|
|
90
142
|
modelMetadata: modelConfig,
|
|
91
143
|
prompt: userPrompt,
|
|
92
144
|
});
|
|
93
145
|
const maxTokens = aiConfig.getMaxTokens();
|
|
94
|
-
const tools = modelConfig.supportsToolCalling
|
|
95
|
-
? {
|
|
96
|
-
...(await initTools({
|
|
97
|
-
terminal,
|
|
98
|
-
tokenCounter,
|
|
99
|
-
autoAcceptAll,
|
|
100
|
-
events: toolEvents,
|
|
101
|
-
})),
|
|
102
|
-
...(await initAgents({
|
|
103
|
-
terminal,
|
|
104
|
-
modelManager,
|
|
105
|
-
tokenTracker,
|
|
106
|
-
tokenCounter,
|
|
107
|
-
events: toolEvents,
|
|
108
|
-
})),
|
|
109
|
-
}
|
|
110
|
-
: undefined;
|
|
111
146
|
try {
|
|
112
147
|
const result = streamText({
|
|
113
148
|
model: langModel,
|
|
@@ -122,16 +157,20 @@ export class Repl {
|
|
|
122
157
|
},
|
|
123
158
|
...messageHistory.get(),
|
|
124
159
|
],
|
|
125
|
-
temperature: modelConfig.defaultTemperature
|
|
126
|
-
|
|
160
|
+
temperature: modelConfig.defaultTemperature > -1
|
|
161
|
+
? modelConfig.defaultTemperature
|
|
162
|
+
: undefined,
|
|
163
|
+
stopWhen: stepCountIs(90),
|
|
127
164
|
maxRetries: 2,
|
|
128
165
|
providerOptions: aiConfig.getProviderOptions(),
|
|
129
166
|
tools,
|
|
130
167
|
// biome-ignore lint/style/useNamingConvention: third-party controlled
|
|
131
|
-
experimental_repairToolCall:
|
|
132
|
-
? toolCallRepair(modelManager, terminal)
|
|
133
|
-
: undefined,
|
|
168
|
+
experimental_repairToolCall: toolCallRepair(modelManager),
|
|
134
169
|
abortSignal: signal,
|
|
170
|
+
onAbort(_event) {
|
|
171
|
+
logger.warn("The agent loop was aborted by the user.");
|
|
172
|
+
terminal.warn("Operation aborted by user.");
|
|
173
|
+
},
|
|
135
174
|
onFinish: async (result) => {
|
|
136
175
|
logger.debug("onFinish called");
|
|
137
176
|
if (result.response.messages.length > 0) {
|
|
@@ -144,7 +183,7 @@ export class Repl {
|
|
|
144
183
|
terminal.alert();
|
|
145
184
|
}
|
|
146
185
|
// Create a more visual representation of steps/tool usage
|
|
147
|
-
|
|
186
|
+
displayToolUse(result, terminal);
|
|
148
187
|
const total = result.totalUsage ??
|
|
149
188
|
result.usage;
|
|
150
189
|
const inputTokens = isNumber(total.inputTokens)
|
|
@@ -154,10 +193,10 @@ export class Repl {
|
|
|
154
193
|
? total.outputTokens
|
|
155
194
|
: 0;
|
|
156
195
|
const tokenSummary = `Tokens: ↑ ${inputTokens} ↓ ${outputTokens}`;
|
|
157
|
-
terminal.writeln(
|
|
196
|
+
terminal.writeln(style.dim(tokenSummary));
|
|
158
197
|
const inputCost = modelConfig.costPerInputToken * inputTokens;
|
|
159
198
|
const outputCost = modelConfig.costPerOutputToken * outputTokens;
|
|
160
|
-
terminal.writeln(
|
|
199
|
+
terminal.writeln(style.dim(`Cost: $${(inputCost + outputCost).toFixed(2)}`));
|
|
161
200
|
// Track aggregate usage across all steps when available
|
|
162
201
|
tokenTracker.trackUsage("repl", total);
|
|
163
202
|
// Derive current context window from final step usage
|
|
@@ -176,13 +215,6 @@ export class Repl {
|
|
|
176
215
|
}
|
|
177
216
|
}
|
|
178
217
|
}
|
|
179
|
-
// comment out auto-summarization for now. it's been causing issues.
|
|
180
|
-
// if (currentContextWindow > 70000) {
|
|
181
|
-
// logger.info(
|
|
182
|
-
// `Condensing history from ${currentContextWindow} to 0`,
|
|
183
|
-
// );
|
|
184
|
-
// await messageHistory.summarizeAndReset();
|
|
185
|
-
// }
|
|
186
218
|
terminal.hr();
|
|
187
219
|
},
|
|
188
220
|
onError: ({ error }) => {
|
|
@@ -200,20 +232,23 @@ export class Repl {
|
|
|
200
232
|
if (chunk.type === "reasoning-delta" || chunk.type === "text-delta") {
|
|
201
233
|
if (chunk.type === "reasoning-delta") {
|
|
202
234
|
if (lastType !== "reasoning") {
|
|
203
|
-
terminal.writeln(
|
|
235
|
+
terminal.writeln(style.dim("<think>"));
|
|
204
236
|
}
|
|
205
|
-
terminal.write(
|
|
237
|
+
terminal.write(style.dim(chunk.text)); // Stream reasoning directly
|
|
206
238
|
lastType = "reasoning";
|
|
207
239
|
}
|
|
208
240
|
else if (chunk.type === "text-delta") {
|
|
209
241
|
if (lastType === "reasoning") {
|
|
210
242
|
// Finishing reasoning: Print </think>
|
|
211
|
-
terminal.writeln(
|
|
243
|
+
terminal.writeln(style.dim("\n</think>\n"));
|
|
212
244
|
}
|
|
213
245
|
accumulatedText += chunk.text;
|
|
214
246
|
lastType = "text";
|
|
215
247
|
}
|
|
216
248
|
}
|
|
249
|
+
else if (chunk.type === "tool-call") {
|
|
250
|
+
terminal.stopProgress();
|
|
251
|
+
}
|
|
217
252
|
else if (chunk.type === "tool-result") {
|
|
218
253
|
const messages = toolEvents.get(chunk.toolCallId);
|
|
219
254
|
if (messages) {
|
|
@@ -227,11 +262,12 @@ export class Repl {
|
|
|
227
262
|
else {
|
|
228
263
|
// Close thinking tags when moving from reasoning to any other chunk type
|
|
229
264
|
if (lastType === "reasoning") {
|
|
230
|
-
terminal.write(
|
|
265
|
+
terminal.write(style.dim("\n</think>\n\n"));
|
|
231
266
|
}
|
|
267
|
+
terminal.stopProgress();
|
|
232
268
|
// if there is accumulatedText, display it
|
|
233
269
|
if (accumulatedText.trim()) {
|
|
234
|
-
terminal.writeln(`${
|
|
270
|
+
terminal.writeln(`${style.blue.bold("● Response:")}`);
|
|
235
271
|
terminal.display(accumulatedText, true);
|
|
236
272
|
terminal.lineBreak();
|
|
237
273
|
}
|
|
@@ -241,11 +277,11 @@ export class Repl {
|
|
|
241
277
|
}
|
|
242
278
|
// Ensure the final closing tag for reasoning is written if it was the last type
|
|
243
279
|
if (lastType === "reasoning") {
|
|
244
|
-
terminal.write(
|
|
280
|
+
terminal.write(style.gray("\n</think>\n\n"));
|
|
245
281
|
}
|
|
246
282
|
// if there is accumulatedText, display it
|
|
247
283
|
if (accumulatedText.trim()) {
|
|
248
|
-
terminal.writeln(`${
|
|
284
|
+
terminal.writeln(`${style.green.bold("● Response:")}`);
|
|
249
285
|
terminal.display(accumulatedText, true);
|
|
250
286
|
terminal.lineBreak();
|
|
251
287
|
}
|
|
@@ -271,184 +307,4 @@ export class Repl {
|
|
|
271
307
|
}
|
|
272
308
|
}
|
|
273
309
|
}
|
|
274
|
-
displayToolUse(result, terminal) {
|
|
275
|
-
const toolsCalled = [];
|
|
276
|
-
const toolColors = new Map();
|
|
277
|
-
const chalkColors = [
|
|
278
|
-
"red",
|
|
279
|
-
"green",
|
|
280
|
-
"yellow",
|
|
281
|
-
"blue",
|
|
282
|
-
"magenta",
|
|
283
|
-
"cyan",
|
|
284
|
-
"white",
|
|
285
|
-
"gray",
|
|
286
|
-
"redBright",
|
|
287
|
-
"greenBright",
|
|
288
|
-
"yellowBright",
|
|
289
|
-
"blueBright",
|
|
290
|
-
"magentaBright",
|
|
291
|
-
"cyanBright",
|
|
292
|
-
"whiteBright",
|
|
293
|
-
"blackBright",
|
|
294
|
-
];
|
|
295
|
-
terminal.writeln(chalk.dim(`Steps: ${result.steps.length}`));
|
|
296
|
-
for (const step of result.steps) {
|
|
297
|
-
let currentToolCalls = [];
|
|
298
|
-
if (step.toolResults.length > 0) {
|
|
299
|
-
currentToolCalls = step.toolResults;
|
|
300
|
-
}
|
|
301
|
-
else if (step.toolCalls.length > 0) {
|
|
302
|
-
currentToolCalls = step.toolCalls;
|
|
303
|
-
}
|
|
304
|
-
for (const toolCallOrResult of currentToolCalls) {
|
|
305
|
-
const toolName = toolCallOrResult.toolName;
|
|
306
|
-
if (!toolColors.has(toolName)) {
|
|
307
|
-
const availableColors = chalkColors.filter((color) => !Array.from(toolColors.values()).some((c) => c === chalk[color]));
|
|
308
|
-
const color = availableColors.length > 0
|
|
309
|
-
? (availableColors[Math.floor(Math.random() * availableColors.length)] ?? "white")
|
|
310
|
-
: "white";
|
|
311
|
-
toolColors.set(toolName, chalk[color]);
|
|
312
|
-
}
|
|
313
|
-
toolsCalled.push(toolName);
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
if (toolsCalled.length > 0) {
|
|
317
|
-
terminal.lineBreak();
|
|
318
|
-
terminal.writeln(chalk.dim("Tools:"));
|
|
319
|
-
for (const toolCalled of toolsCalled) {
|
|
320
|
-
const colorFn = toolColors.get(toolCalled) ?? chalk.white;
|
|
321
|
-
terminal.write(`${colorFn("██")} `);
|
|
322
|
-
}
|
|
323
|
-
terminal.lineBreak();
|
|
324
|
-
const uniqueTools = new Set(toolsCalled);
|
|
325
|
-
for (const [index, toolCalled] of Array.from(uniqueTools).entries()) {
|
|
326
|
-
const colorFn = toolColors.get(toolCalled) ?? chalk.white;
|
|
327
|
-
terminal.write(colorFn(toolCalled));
|
|
328
|
-
if (index < new Set(toolsCalled).size - 1) {
|
|
329
|
-
terminal.write(" - ");
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
terminal.lineBreak();
|
|
333
|
-
terminal.lineBreak();
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
function displayToolMessages(messages, terminal) {
|
|
338
|
-
const isError = messages[messages.length - 1]?.event === "tool-error";
|
|
339
|
-
const indicator = isError ? chalk.red.bold("●") : chalk.blue.bold("●");
|
|
340
|
-
const initMessage = messages.find((m) => m.event === "tool-init")?.data ?? "Tool Execution";
|
|
341
|
-
terminal.write(`${indicator} `); // Write indicator without newline (sync)
|
|
342
|
-
terminal.display(initMessage); // Display initial message (async)
|
|
343
|
-
for (const msg of messages) {
|
|
344
|
-
switch (msg.event) {
|
|
345
|
-
case "tool-update":
|
|
346
|
-
_handleToolUpdateMessage(msg.data, terminal);
|
|
347
|
-
break;
|
|
348
|
-
case "tool-completion":
|
|
349
|
-
_handleToolCompletionMessage(msg.data, terminal);
|
|
350
|
-
break;
|
|
351
|
-
case "tool-error":
|
|
352
|
-
_handleToolErrorMessage(msg.data, terminal);
|
|
353
|
-
break;
|
|
354
|
-
case "tool-init":
|
|
355
|
-
// 'tool-init' is handled before the loop, so nothing to do here.
|
|
356
|
-
break;
|
|
357
|
-
default:
|
|
358
|
-
// Optional: Log an unexpected event type for debugging, or do nothing.
|
|
359
|
-
logger.debug(`Unhandled tool message event: ${msg.event}`);
|
|
360
|
-
break;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
terminal.lineBreak();
|
|
364
|
-
}
|
|
365
|
-
// Helper function to handle tool update messages
|
|
366
|
-
function _handleToolUpdateMessage(data, terminal) {
|
|
367
|
-
if (data.secondary && data.secondary.length > 0) {
|
|
368
|
-
const content = data.secondary.join("\n");
|
|
369
|
-
if (content.trim().length !== 0) {
|
|
370
|
-
terminal.display(`└── ${data.primary}`);
|
|
371
|
-
terminal.hr();
|
|
372
|
-
if (isMarkdown(content)) {
|
|
373
|
-
terminal.display(content, true);
|
|
374
|
-
}
|
|
375
|
-
else {
|
|
376
|
-
terminal.write(chalk.green(content));
|
|
377
|
-
terminal.lineBreak();
|
|
378
|
-
}
|
|
379
|
-
terminal.hr();
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
else {
|
|
383
|
-
terminal.display(`└── ${data.primary}`);
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
// Helper function to handle tool completion messages
|
|
387
|
-
function _handleToolCompletionMessage(data, terminal) {
|
|
388
|
-
terminal.display(`└── ${data}`);
|
|
389
|
-
}
|
|
390
|
-
// Helper function to handle tool error messages
|
|
391
|
-
function _handleToolErrorMessage(data, terminal) {
|
|
392
|
-
terminal.write("└── ");
|
|
393
|
-
terminal.error(data);
|
|
394
|
-
}
|
|
395
|
-
const toolCallRepair = (modelManager, terminal) => {
|
|
396
|
-
const fn = async ({ toolCall, tools, inputSchema, error, }) => {
|
|
397
|
-
if (NoSuchToolError.isInstance(error)) {
|
|
398
|
-
return null; // do not attempt to fix invalid tool names
|
|
399
|
-
}
|
|
400
|
-
terminal.warn(`Attempting to repair tool call: ${toolCall.toolName}.`);
|
|
401
|
-
terminal.lineBreak();
|
|
402
|
-
const tool = tools[toolCall.toolName];
|
|
403
|
-
try {
|
|
404
|
-
const { object: repairedArgs } = await generateObject({
|
|
405
|
-
model: modelManager.getModel("tool-repair"),
|
|
406
|
-
schema: tool.inputSchema,
|
|
407
|
-
prompt: [
|
|
408
|
-
`The model tried to call the tool "${toolCall.toolName}" with the following arguments:`,
|
|
409
|
-
JSON.stringify(toolCall.input),
|
|
410
|
-
"The tool accepts the following schema:",
|
|
411
|
-
JSON.stringify(inputSchema(toolCall)),
|
|
412
|
-
"Please fix the arguments.",
|
|
413
|
-
].join("\n"),
|
|
414
|
-
});
|
|
415
|
-
return { ...toolCall, args: JSON.stringify(repairedArgs) };
|
|
416
|
-
}
|
|
417
|
-
catch (err) {
|
|
418
|
-
logger.error(err, `Failed to repair tool call: ${toolCall.toolName}.`);
|
|
419
|
-
return null;
|
|
420
|
-
}
|
|
421
|
-
};
|
|
422
|
-
return fn;
|
|
423
|
-
};
|
|
424
|
-
async function getProjectStatusLine() {
|
|
425
|
-
//
|
|
426
|
-
const currentDir = process.cwd().split("/").pop() || process.cwd();
|
|
427
|
-
const branch = await getCurrentBranch();
|
|
428
|
-
let gitStatus = "";
|
|
429
|
-
if (branch) {
|
|
430
|
-
const hasChanges = await hasUncommittedChanges();
|
|
431
|
-
const asterisk = hasChanges ? "*" : "";
|
|
432
|
-
gitStatus = ` ${chalk.gray(branch + asterisk)}`;
|
|
433
|
-
}
|
|
434
|
-
if (await inGitDirectory()) {
|
|
435
|
-
// Added check
|
|
436
|
-
const stats = await getDiffStat();
|
|
437
|
-
const fileChanges = await getGitStatus();
|
|
438
|
-
let fileStatus = "";
|
|
439
|
-
if (fileChanges.added)
|
|
440
|
-
fileStatus += ` +${fileChanges.added}`;
|
|
441
|
-
if (fileChanges.modified)
|
|
442
|
-
fileStatus += ` ~${fileChanges.modified}`;
|
|
443
|
-
if (fileChanges.deleted)
|
|
444
|
-
fileStatus += ` -${fileChanges.deleted}`;
|
|
445
|
-
if (fileChanges.untracked)
|
|
446
|
-
fileStatus += ` ?${fileChanges.untracked}`;
|
|
447
|
-
gitStatus +=
|
|
448
|
-
" " +
|
|
449
|
-
`${chalk.dim("[")}${chalk.yellow(fileStatus.trim())} ` +
|
|
450
|
-
`${chalk.green(`+${stats.insertions}`)} ` + // Insertions first (green)
|
|
451
|
-
`${chalk.red(`-${stats.deletions}`)}${chalk.dim("]")}`; // Deletions last (red)
|
|
452
|
-
}
|
|
453
|
-
return `${chalk.blue(currentDir)}${gitStatus}`;
|
|
454
310
|
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export interface AnsiStyle {
|
|
2
|
+
open: string;
|
|
3
|
+
close: string;
|
|
4
|
+
}
|
|
5
|
+
interface ColorStyle extends AnsiStyle {
|
|
6
|
+
ansi: (code: number) => string;
|
|
7
|
+
ansi256: (code: number) => string;
|
|
8
|
+
ansi16m: (red: number, green: number, blue: number) => string;
|
|
9
|
+
}
|
|
10
|
+
interface Styles {
|
|
11
|
+
modifier: typeof styles.modifier;
|
|
12
|
+
color: typeof styles.color & ColorStyle;
|
|
13
|
+
bgColor: typeof styles.bgColor & ColorStyle;
|
|
14
|
+
[key: string]: any;
|
|
15
|
+
rgbToAnsi256: (red: number, green: number, blue: number) => number;
|
|
16
|
+
hexToRgb: (hex: string) => [number, number, number];
|
|
17
|
+
hexToAnsi256: (hex: string) => number;
|
|
18
|
+
ansi256ToAnsi: (code: number) => number;
|
|
19
|
+
rgbToAnsi: (red: number, green: number, blue: number) => number;
|
|
20
|
+
hexToAnsi: (hex: string) => number;
|
|
21
|
+
}
|
|
22
|
+
declare const styles: {
|
|
23
|
+
readonly modifier: {
|
|
24
|
+
readonly reset: readonly [0, 0];
|
|
25
|
+
readonly bold: readonly [1, 22];
|
|
26
|
+
readonly dim: readonly [2, 22];
|
|
27
|
+
readonly italic: readonly [3, 23];
|
|
28
|
+
readonly underline: readonly [4, 24];
|
|
29
|
+
readonly overline: readonly [53, 55];
|
|
30
|
+
readonly inverse: readonly [7, 27];
|
|
31
|
+
readonly hidden: readonly [8, 28];
|
|
32
|
+
readonly strikethrough: readonly [9, 29];
|
|
33
|
+
};
|
|
34
|
+
readonly color: {
|
|
35
|
+
readonly black: readonly [30, 39];
|
|
36
|
+
readonly red: readonly [31, 39];
|
|
37
|
+
readonly green: readonly [32, 39];
|
|
38
|
+
readonly yellow: readonly [33, 39];
|
|
39
|
+
readonly blue: readonly [34, 39];
|
|
40
|
+
readonly magenta: readonly [35, 39];
|
|
41
|
+
readonly cyan: readonly [36, 39];
|
|
42
|
+
readonly white: readonly [37, 39];
|
|
43
|
+
readonly blackBright: readonly [90, 39];
|
|
44
|
+
readonly gray: readonly [90, 39];
|
|
45
|
+
readonly grey: readonly [90, 39];
|
|
46
|
+
readonly redBright: readonly [91, 39];
|
|
47
|
+
readonly greenBright: readonly [92, 39];
|
|
48
|
+
readonly yellowBright: readonly [93, 39];
|
|
49
|
+
readonly blueBright: readonly [94, 39];
|
|
50
|
+
readonly magentaBright: readonly [95, 39];
|
|
51
|
+
readonly cyanBright: readonly [96, 39];
|
|
52
|
+
readonly whiteBright: readonly [97, 39];
|
|
53
|
+
};
|
|
54
|
+
readonly bgColor: {
|
|
55
|
+
readonly bgBlack: readonly [40, 49];
|
|
56
|
+
readonly bgRed: readonly [41, 49];
|
|
57
|
+
readonly bgGreen: readonly [42, 49];
|
|
58
|
+
readonly bgYellow: readonly [43, 49];
|
|
59
|
+
readonly bgBlue: readonly [44, 49];
|
|
60
|
+
readonly bgMagenta: readonly [45, 49];
|
|
61
|
+
readonly bgCyan: readonly [46, 49];
|
|
62
|
+
readonly bgWhite: readonly [47, 49];
|
|
63
|
+
readonly bgBlackBright: readonly [100, 49];
|
|
64
|
+
readonly bgGray: readonly [100, 49];
|
|
65
|
+
readonly bgGrey: readonly [100, 49];
|
|
66
|
+
readonly bgRedBright: readonly [101, 49];
|
|
67
|
+
readonly bgGreenBright: readonly [102, 49];
|
|
68
|
+
readonly bgYellowBright: readonly [103, 49];
|
|
69
|
+
readonly bgBlueBright: readonly [104, 49];
|
|
70
|
+
readonly bgMagentaBright: readonly [105, 49];
|
|
71
|
+
readonly bgCyanBright: readonly [106, 49];
|
|
72
|
+
readonly bgWhiteBright: readonly [107, 49];
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
export declare const ansiStyles: Styles;
|
|
76
|
+
export {};
|
|
77
|
+
//# sourceMappingURL=ansi-styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ansi-styles.d.ts","sourceRoot":"","sources":["../../source/terminal/ansi-styles.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,UAAW,SAAQ,SAAS;IACpC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAClC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC/D;AAED,UAAU,MAAM;IACd,QAAQ,EAAE,OAAO,MAAM,CAAC,QAAQ,CAAC;IACjC,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC;IACxC,OAAO,EAAE,OAAO,MAAM,CAAC,OAAO,GAAG,UAAU,CAAC;IAE5C,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACnE,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAChE,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC;AAED,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuDF,CAAC;AAuLX,eAAO,MAAM,UAAU,QAAmB,CAAC"}
|