@travisennis/acai 0.0.6 → 0.0.7
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 +186 -17
- package/bin/acai-wrapper.js +26 -0
- package/dist/agent/index.d.ts +15 -2
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +202 -174
- package/dist/api/exa/index.js +1 -1
- package/dist/cli.d.ts +2 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +40 -7
- package/dist/commands/add-directory-command.d.ts +1 -1
- package/dist/commands/add-directory-command.d.ts.map +1 -1
- package/dist/commands/add-directory-command.js +1 -32
- package/dist/commands/application-log-command.d.ts +1 -1
- package/dist/commands/application-log-command.d.ts.map +1 -1
- package/dist/commands/application-log-command.js +2 -38
- package/dist/commands/clear-command.d.ts +1 -1
- package/dist/commands/clear-command.d.ts.map +1 -1
- package/dist/commands/clear-command.js +1 -5
- package/dist/commands/compact-command.d.ts.map +1 -1
- package/dist/commands/compact-command.js +0 -9
- package/dist/commands/context-command.d.ts +1 -1
- package/dist/commands/context-command.d.ts.map +1 -1
- package/dist/commands/context-command.js +13 -72
- package/dist/commands/copy-command.d.ts.map +1 -1
- package/dist/commands/copy-command.js +0 -19
- package/dist/commands/edit-command.d.ts +1 -1
- package/dist/commands/edit-command.d.ts.map +1 -1
- package/dist/commands/edit-command.js +3 -49
- package/dist/commands/edit-prompt-command.d.ts +1 -1
- package/dist/commands/edit-prompt-command.d.ts.map +1 -1
- package/dist/commands/edit-prompt-command.js +1 -26
- package/dist/commands/exit-command.d.ts +1 -4
- package/dist/commands/exit-command.d.ts.map +1 -1
- package/dist/commands/exit-command.js +2 -18
- package/dist/commands/files-command.d.ts +1 -1
- package/dist/commands/files-command.d.ts.map +1 -1
- package/dist/commands/files-command.js +1 -54
- package/dist/commands/generate-rules-command.d.ts +1 -1
- package/dist/commands/generate-rules-command.d.ts.map +1 -1
- package/dist/commands/generate-rules-command.js +18 -60
- package/dist/commands/handoff-command.d.ts.map +1 -1
- package/dist/commands/handoff-command.js +0 -11
- package/dist/commands/health-command.d.ts +1 -1
- package/dist/commands/health-command.d.ts.map +1 -1
- package/dist/commands/health-command.js +8 -103
- package/dist/commands/help-command.d.ts +1 -1
- package/dist/commands/help-command.d.ts.map +1 -1
- package/dist/commands/help-command.js +6 -14
- package/dist/commands/history-command.d.ts +1 -1
- package/dist/commands/history-command.d.ts.map +1 -1
- package/dist/commands/history-command.js +30 -106
- 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 +4 -23
- package/dist/commands/last-log-command.d.ts +1 -1
- package/dist/commands/last-log-command.d.ts.map +1 -1
- package/dist/commands/last-log-command.js +1 -28
- package/dist/commands/list-directories-command.d.ts +1 -1
- package/dist/commands/list-directories-command.d.ts.map +1 -1
- package/dist/commands/list-directories-command.js +1 -14
- package/dist/commands/list-tools-command.d.ts.map +1 -1
- package/dist/commands/list-tools-command.js +55 -78
- package/dist/commands/manager.d.ts +1 -8
- package/dist/commands/manager.d.ts.map +1 -1
- package/dist/commands/manager.js +7 -42
- package/dist/commands/model-command.d.ts +0 -22
- package/dist/commands/model-command.d.ts.map +1 -1
- package/dist/commands/model-command.js +5 -126
- package/dist/commands/paste-command.d.ts +1 -1
- package/dist/commands/paste-command.d.ts.map +1 -1
- package/dist/commands/paste-command.js +1 -79
- package/dist/commands/pickup-command.d.ts.map +1 -1
- package/dist/commands/pickup-command.js +3 -55
- package/dist/commands/prompt-command.d.ts +19 -1
- package/dist/commands/prompt-command.d.ts.map +1 -1
- package/dist/commands/prompt-command.js +172 -194
- package/dist/commands/remove-directory-command.d.ts +1 -1
- package/dist/commands/remove-directory-command.d.ts.map +1 -1
- package/dist/commands/remove-directory-command.js +1 -33
- 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 +3 -11
- package/dist/commands/rules-command.d.ts +1 -1
- package/dist/commands/rules-command.d.ts.map +1 -1
- package/dist/commands/rules-command.js +1 -63
- package/dist/commands/save-command.d.ts +1 -1
- package/dist/commands/save-command.d.ts.map +1 -1
- package/dist/commands/save-command.js +1 -8
- package/dist/commands/shell-command.d.ts.map +1 -1
- package/dist/commands/shell-command.js +1 -48
- package/dist/commands/types.d.ts +0 -3
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/usage-command.d.ts +1 -1
- package/dist/commands/usage-command.d.ts.map +1 -1
- package/dist/commands/usage-command.js +5 -16
- package/dist/config.d.ts +17 -6
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +86 -53
- package/dist/execution/index.d.ts +17 -2
- package/dist/execution/index.d.ts.map +1 -1
- package/dist/execution/index.js +62 -20
- package/dist/formatting.d.ts +19 -0
- package/dist/formatting.d.ts.map +1 -1
- package/dist/formatting.js +54 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +212 -153
- package/dist/messages.d.ts +3 -0
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +67 -3
- package/dist/models/anthropic-provider.d.ts.map +1 -1
- package/dist/models/anthropic-provider.js +0 -7
- package/dist/models/deepseek-provider.d.ts.map +1 -1
- package/dist/models/deepseek-provider.js +0 -2
- package/dist/models/google-provider.d.ts.map +1 -1
- package/dist/models/google-provider.js +0 -3
- package/dist/models/groq-provider.d.ts.map +1 -1
- package/dist/models/groq-provider.js +0 -1
- package/dist/models/openai-provider.d.ts.map +1 -1
- package/dist/models/openai-provider.js +0 -4
- package/dist/models/openrouter-provider.d.ts +10 -9
- package/dist/models/openrouter-provider.d.ts.map +1 -1
- package/dist/models/openrouter-provider.js +82 -88
- package/dist/models/providers.d.ts +4 -14
- package/dist/models/providers.d.ts.map +1 -1
- package/dist/models/providers.js +1 -57
- package/dist/models/xai-provider.d.ts.map +1 -1
- package/dist/models/xai-provider.js +0 -2
- package/dist/prompts.d.ts +9 -4
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +427 -99
- package/dist/repl/project-status-line.d.ts +1 -0
- package/dist/repl/project-status-line.d.ts.map +1 -1
- package/dist/repl/project-status-line.js +57 -27
- package/dist/repl-new.d.ts +0 -2
- package/dist/repl-new.d.ts.map +1 -1
- package/dist/repl-new.js +34 -54
- package/dist/skills.d.ts +20 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +192 -0
- package/dist/terminal/control.d.ts +55 -0
- package/dist/terminal/control.d.ts.map +1 -0
- package/dist/terminal/control.js +109 -0
- package/dist/terminal/default-theme.d.ts +1 -1
- package/dist/terminal/default-theme.d.ts.map +1 -1
- package/dist/terminal/default-theme.js +24 -28
- package/dist/terminal/formatting.d.ts +23 -25
- package/dist/terminal/formatting.d.ts.map +1 -1
- package/dist/terminal/formatting.js +35 -52
- package/dist/terminal/highlight/index.d.ts.map +1 -1
- package/dist/terminal/highlight/index.js +3 -6
- package/dist/terminal/highlight/theme.d.ts.map +1 -1
- package/dist/terminal/highlight/theme.js +2 -6
- package/dist/terminal/index.d.ts +2 -101
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/index.js +2 -464
- package/dist/terminal/markdown.js +7 -5
- package/dist/terminal/strip-ansi.js +4 -4
- package/dist/terminal/table/cell.d.ts +114 -0
- package/dist/terminal/table/cell.d.ts.map +1 -0
- package/dist/terminal/table/cell.js +407 -0
- package/dist/terminal/table/debug.d.ts +15 -0
- package/dist/terminal/table/debug.d.ts.map +1 -0
- package/dist/terminal/table/debug.js +32 -0
- package/dist/terminal/table/index.d.ts +3 -0
- package/dist/terminal/table/index.d.ts.map +1 -0
- package/dist/terminal/table/index.js +2 -0
- package/dist/terminal/table/layout-manager.d.ts +27 -0
- package/dist/terminal/table/layout-manager.d.ts.map +1 -0
- package/dist/terminal/table/layout-manager.js +257 -0
- package/dist/terminal/table/table.d.ts +9 -0
- package/dist/terminal/table/table.d.ts.map +1 -0
- package/dist/terminal/table/table.js +97 -0
- package/dist/terminal/table/utils.d.ts +63 -0
- package/dist/terminal/table/utils.d.ts.map +1 -0
- package/dist/terminal/table/utils.js +326 -0
- package/dist/tokens/threshold.d.ts +6 -21
- package/dist/tokens/threshold.d.ts.map +1 -1
- package/dist/tokens/threshold.js +13 -31
- package/dist/tools/advanced-edit-file.d.ts.map +1 -1
- package/dist/tools/advanced-edit-file.js +5 -1
- package/dist/tools/agent.d.ts.map +1 -1
- package/dist/tools/agent.js +19 -5
- package/dist/tools/bash.d.ts +3 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +204 -42
- package/dist/tools/batch.d.ts +34 -0
- package/dist/tools/batch.d.ts.map +1 -0
- package/dist/tools/batch.js +174 -0
- package/dist/tools/code-interpreter.d.ts.map +1 -1
- package/dist/tools/code-interpreter.js +25 -9
- package/dist/tools/delete-file.d.ts.map +1 -1
- package/dist/tools/delete-file.js +9 -2
- package/dist/tools/directory-tree.d.ts +0 -6
- package/dist/tools/directory-tree.d.ts.map +1 -1
- package/dist/tools/directory-tree.js +29 -18
- package/dist/tools/dynamic-tool-loader.d.ts +0 -4
- package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
- package/dist/tools/dynamic-tool-loader.js +2 -2
- package/dist/tools/edit-file.d.ts.map +1 -1
- package/dist/tools/edit-file.js +16 -3
- package/dist/tools/glob.d.ts.map +1 -1
- package/dist/tools/glob.js +24 -13
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +40 -25
- package/dist/tools/index.d.ts +17 -3
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +43 -1
- package/dist/tools/llm-edit-fixer.d.ts +0 -1
- package/dist/tools/llm-edit-fixer.d.ts.map +1 -1
- package/dist/tools/llm-edit-fixer.js +14 -28
- package/dist/tools/move-file.d.ts.map +1 -1
- package/dist/tools/move-file.js +8 -1
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +32 -23
- package/dist/tools/read-multiple-files.d.ts.map +1 -1
- package/dist/tools/read-multiple-files.js +102 -45
- package/dist/tools/save-file.d.ts +4 -4
- package/dist/tools/save-file.d.ts.map +1 -1
- package/dist/tools/save-file.js +20 -2
- package/dist/tools/think.d.ts.map +1 -1
- package/dist/tools/think.js +7 -1
- package/dist/tools/types.d.ts +5 -1
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +1 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +24 -9
- package/dist/tui/components/assistant-message.js +1 -1
- package/dist/tui/components/box.d.ts +20 -0
- package/dist/tui/components/box.d.ts.map +1 -0
- package/dist/tui/components/box.js +81 -0
- package/dist/tui/components/editor.d.ts +60 -5
- package/dist/tui/components/editor.d.ts.map +1 -1
- package/dist/tui/components/editor.js +577 -115
- package/dist/tui/components/footer.d.ts +0 -12
- package/dist/tui/components/footer.d.ts.map +1 -1
- package/dist/tui/components/footer.js +19 -7
- package/dist/tui/components/header.d.ts +21 -0
- package/dist/tui/components/header.d.ts.map +1 -0
- package/dist/tui/components/header.js +63 -0
- package/dist/tui/components/loader.d.ts +5 -1
- package/dist/tui/components/loader.d.ts.map +1 -1
- package/dist/tui/components/loader.js +2 -2
- package/dist/tui/components/markdown.d.ts +26 -23
- package/dist/tui/components/markdown.d.ts.map +1 -1
- package/dist/tui/components/markdown.js +107 -54
- package/dist/tui/components/modal.d.ts +0 -11
- package/dist/tui/components/modal.d.ts.map +1 -1
- package/dist/tui/components/modal.js +0 -29
- package/dist/tui/components/progress-bar.d.ts +19 -0
- package/dist/tui/components/progress-bar.d.ts.map +1 -0
- package/dist/tui/components/progress-bar.js +78 -0
- package/dist/tui/components/prompt-status.d.ts +2 -1
- package/dist/tui/components/prompt-status.d.ts.map +1 -1
- package/dist/tui/components/prompt-status.js +7 -2
- package/dist/tui/components/select-list.d.ts +27 -1
- package/dist/tui/components/select-list.d.ts.map +1 -1
- package/dist/tui/components/select-list.js +93 -29
- package/dist/tui/components/spacer.d.ts +1 -1
- package/dist/tui/components/spacer.d.ts.map +1 -1
- package/dist/tui/components/spacer.js +2 -2
- package/dist/tui/components/table.d.ts +27 -0
- package/dist/tui/components/table.d.ts.map +1 -0
- package/dist/tui/components/table.js +125 -0
- package/dist/tui/components/thinking-block.d.ts.map +1 -1
- package/dist/tui/components/thinking-block.js +4 -1
- package/dist/tui/components/tool-execution.d.ts +8 -4
- package/dist/tui/components/tool-execution.d.ts.map +1 -1
- package/dist/tui/components/tool-execution.js +88 -80
- package/dist/tui/components/user-message.d.ts.map +1 -1
- package/dist/tui/components/user-message.js +6 -4
- package/dist/tui/index.d.ts +9 -5
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +5 -1
- package/dist/tui/terminal.d.ts +2 -1
- package/dist/tui/terminal.d.ts.map +1 -1
- package/dist/tui/terminal.js +28 -38
- package/dist/tui/tui.d.ts +2 -0
- package/dist/tui/tui.d.ts.map +1 -1
- package/dist/tui/tui.js +53 -33
- package/dist/tui/utils.d.ts +5 -0
- package/dist/tui/utils.d.ts.map +1 -1
- package/dist/tui/utils.js +81 -1
- package/dist/{tools/bash-utils.d.ts → utils/bash.d.ts} +3 -3
- package/dist/utils/bash.d.ts.map +1 -0
- package/dist/{tools/bash-utils.js → utils/bash.js} +22 -11
- package/dist/utils/{filesystem.d.ts → filesystem/operations.d.ts} +1 -1
- package/dist/utils/filesystem/operations.d.ts.map +1 -0
- package/dist/{tools/filesystem-utils.d.ts → utils/filesystem/security.d.ts} +3 -2
- package/dist/utils/filesystem/security.d.ts.map +1 -0
- package/dist/{tools/filesystem-utils.js → utils/filesystem/security.js} +62 -4
- package/dist/utils/funcs.d.ts +6 -0
- package/dist/utils/funcs.d.ts.map +1 -0
- package/dist/utils/funcs.js +6 -0
- package/dist/{tools/git-utils.d.ts → utils/git.d.ts} +1 -1
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/{tools/git-utils.js → utils/git.js} +0 -6
- package/dist/utils/glob.js +1 -1
- package/dist/utils/{zod-utils.d.ts → zod.d.ts} +1 -1
- package/dist/utils/zod.d.ts.map +1 -0
- package/package.json +17 -17
- package/dist/agent/manual-loop.d.ts +0 -41
- package/dist/agent/manual-loop.d.ts.map +0 -1
- package/dist/agent/manual-loop.js +0 -278
- package/dist/repl/display-tool-messages.d.ts +0 -4
- package/dist/repl/display-tool-messages.d.ts.map +0 -1
- package/dist/repl/display-tool-messages.js +0 -58
- package/dist/repl/display-tool-use.d.ts +0 -14
- package/dist/repl/display-tool-use.d.ts.map +0 -1
- package/dist/repl/display-tool-use.js +0 -63
- package/dist/repl/get-prompt-header.d.ts +0 -8
- package/dist/repl/get-prompt-header.d.ts.map +0 -1
- package/dist/repl/get-prompt-header.js +0 -9
- package/dist/repl/prompt.d.ts +0 -21
- package/dist/repl/prompt.d.ts.map +0 -1
- package/dist/repl/prompt.js +0 -244
- package/dist/repl.d.ts +0 -29
- package/dist/repl.d.ts.map +0 -1
- package/dist/repl.js +0 -218
- package/dist/terminal/checkbox-prompt.d.ts +0 -36
- package/dist/terminal/checkbox-prompt.d.ts.map +0 -1
- package/dist/terminal/checkbox-prompt.js +0 -368
- package/dist/terminal/editor-prompt.d.ts +0 -10
- package/dist/terminal/editor-prompt.d.ts.map +0 -1
- package/dist/terminal/editor-prompt.js +0 -61
- package/dist/terminal/errors.d.ts +0 -19
- package/dist/terminal/errors.d.ts.map +0 -1
- package/dist/terminal/errors.js +0 -37
- package/dist/terminal/input-prompt.d.ts +0 -17
- package/dist/terminal/input-prompt.d.ts.map +0 -1
- package/dist/terminal/input-prompt.js +0 -181
- package/dist/terminal/search-prompt.d.ts +0 -20
- package/dist/terminal/search-prompt.d.ts.map +0 -1
- package/dist/terminal/search-prompt.js +0 -280
- package/dist/terminal/types.d.ts +0 -35
- package/dist/terminal/types.d.ts.map +0 -1
- package/dist/terminal/types.js +0 -1
- package/dist/tools/bash-utils.d.ts.map +0 -1
- package/dist/tools/filesystem-utils.d.ts.map +0 -1
- package/dist/tools/git-utils.d.ts.map +0 -1
- package/dist/utils/filesystem.d.ts.map +0 -1
- package/dist/utils/zod-utils.d.ts.map +0 -1
- /package/dist/utils/{filesystem.js → filesystem/operations.js} +0 -0
- /package/dist/utils/{zod-utils.js → zod.js} +0 -0
package/dist/agent/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { NoOutputGeneratedError, streamText, } from "ai";
|
|
2
|
+
import { config } from "../config.js";
|
|
2
3
|
import { logger } from "../logger.js";
|
|
3
4
|
import { AiConfig } from "../models/ai-config.js";
|
|
4
5
|
import { isToolMessage } from "../tools/types.js";
|
|
@@ -19,10 +20,10 @@ export class Agent {
|
|
|
19
20
|
return this.abortController.signal;
|
|
20
21
|
}
|
|
21
22
|
async *run(args) {
|
|
22
|
-
const { modelManager, messageHistory, tokenTracker, maxIterations =
|
|
23
|
+
const { modelManager, messageHistory, tokenTracker, maxIterations = (await config.getConfig()).loop.maxIterations, maxRetries = 2, toolCallRepair, } = this.opts;
|
|
23
24
|
this.resetState();
|
|
24
25
|
this._state.timestamps.start = performance.now();
|
|
25
|
-
const { systemPrompt, input, toolDefs, executors, abortSignal } = args;
|
|
26
|
+
const { systemPrompt, input, toolDefs, activeTools = undefined, executors, abortSignal, } = args;
|
|
26
27
|
const langModel = modelManager.getModel("repl");
|
|
27
28
|
const modelConfig = modelManager.getModelMetadata("repl");
|
|
28
29
|
const aiConfig = new AiConfig({
|
|
@@ -39,19 +40,25 @@ export class Agent {
|
|
|
39
40
|
};
|
|
40
41
|
let iter = 0;
|
|
41
42
|
let consecutiveErrors = 0;
|
|
43
|
+
let hasEmittedTerminalEvent = false;
|
|
42
44
|
while (iter < maxIterations) {
|
|
43
45
|
if (abortSignal?.aborted) {
|
|
44
46
|
logger.warn("The agent loop was aborted by the user.");
|
|
45
|
-
// terminal.warn("Operation aborted by user.");
|
|
46
47
|
yield {
|
|
47
48
|
type: "agent-stop",
|
|
48
49
|
};
|
|
50
|
+
hasEmittedTerminalEvent = true;
|
|
49
51
|
break;
|
|
50
52
|
}
|
|
51
53
|
yield {
|
|
52
54
|
type: "step-start",
|
|
53
55
|
};
|
|
56
|
+
const toolsCalled = new Map();
|
|
54
57
|
try {
|
|
58
|
+
// Check abort signal again before starting streamText
|
|
59
|
+
if (abortSignal?.aborted) {
|
|
60
|
+
throw new Error("Agent aborted before streamText");
|
|
61
|
+
}
|
|
55
62
|
const result = streamText({
|
|
56
63
|
model: langModel,
|
|
57
64
|
maxOutputTokens: aiConfig.maxOutputTokens(),
|
|
@@ -62,12 +69,26 @@ export class Agent {
|
|
|
62
69
|
maxRetries: 2,
|
|
63
70
|
providerOptions: aiConfig.providerOptions(),
|
|
64
71
|
tools: toolDefs,
|
|
72
|
+
activeTools,
|
|
65
73
|
// biome-ignore lint/style/useNamingConvention: third-party code
|
|
66
74
|
experimental_repairToolCall: toolCallRepair,
|
|
67
75
|
abortSignal,
|
|
76
|
+
onAbort: ({ steps }) => {
|
|
77
|
+
logger.debug(`Aborting and processing ${steps.length} steps`);
|
|
78
|
+
steps.forEach((step) => {
|
|
79
|
+
messageHistory.appendResponseMessages(step.response.messages);
|
|
80
|
+
});
|
|
81
|
+
},
|
|
68
82
|
});
|
|
69
83
|
let accumulatedText = "";
|
|
70
84
|
let accumulatedReasoning = "";
|
|
85
|
+
const thisStepToolCalls = [];
|
|
86
|
+
const thisStepToolResults = [];
|
|
87
|
+
this._state.steps.push({
|
|
88
|
+
toolCalls: thisStepToolCalls,
|
|
89
|
+
toolResults: thisStepToolResults,
|
|
90
|
+
});
|
|
91
|
+
const toolMessages = [];
|
|
71
92
|
for await (const chunk of result.fullStream) {
|
|
72
93
|
if (chunk.type === "reasoning-start") {
|
|
73
94
|
yield {
|
|
@@ -110,196 +131,161 @@ export class Agent {
|
|
|
110
131
|
content: accumulatedText,
|
|
111
132
|
};
|
|
112
133
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
// Execute tools in parallel (order not guaranteed)
|
|
134
|
-
// Check response.messages for already-processed tool results
|
|
135
|
-
const alreadyProcessedToolCallIds = new Set();
|
|
136
|
-
// Look for tool results and tool errors in the response messages
|
|
137
|
-
for (const message of responseMessages) {
|
|
138
|
-
if (message.role === "tool" && Array.isArray(message.content)) {
|
|
139
|
-
for (const content of message.content) {
|
|
140
|
-
if ((content.type === "tool-result" ||
|
|
141
|
-
content.type === "tool-error") &&
|
|
142
|
-
content.toolCallId) {
|
|
143
|
-
logger.debug(content, "Invalid tool call:");
|
|
144
|
-
yield {
|
|
145
|
-
type: "tool-call-start",
|
|
146
|
-
name: content.toolName,
|
|
147
|
-
toolCallId: content.toolCallId,
|
|
148
|
-
args: toolCalls.find((call) => call.toolCallId === content.toolCallId)?.input,
|
|
149
|
-
msg: "",
|
|
150
|
-
};
|
|
151
|
-
yield {
|
|
152
|
-
type: "tool-call-error",
|
|
153
|
-
name: content.toolName,
|
|
154
|
-
toolCallId: content.toolCallId,
|
|
155
|
-
msg: "invalid tool call",
|
|
156
|
-
args: toolCalls.find((call) => call.toolCallId === content.toolCallId)?.input,
|
|
157
|
-
};
|
|
158
|
-
alreadyProcessedToolCallIds.add(content.toolCallId);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
// Filter out tool calls that have already been processed or are invalid
|
|
164
|
-
const validToolCalls = toolCalls.filter((call) => !alreadyProcessedToolCallIds.has(call.toolCallId) &&
|
|
165
|
-
// Also check if the tool call is marked as invalid by the AI SDK
|
|
166
|
-
!call.invalid);
|
|
167
|
-
if (validToolCalls.length === 0) {
|
|
168
|
-
// All tool calls were already processed by the AI SDK
|
|
169
|
-
logger.debug(`All ${toolCalls.length} tool calls were already processed by AI SDK, skipping manual execution`);
|
|
170
|
-
continue;
|
|
171
|
-
}
|
|
172
|
-
if (validToolCalls.length < toolCalls.length) {
|
|
173
|
-
logger.debug(`Filtered out ${toolCalls.length - validToolCalls.length} already-processed tool calls, executing ${validToolCalls.length} remaining`);
|
|
174
|
-
}
|
|
175
|
-
// Process all tools
|
|
176
|
-
const toolMessages = [];
|
|
177
|
-
for (const call of validToolCalls) {
|
|
178
|
-
const toolName = call.toolName;
|
|
179
|
-
yield {
|
|
180
|
-
type: "tool-call-start",
|
|
181
|
-
name: toolName,
|
|
182
|
-
toolCallId: call.toolCallId,
|
|
183
|
-
msg: "",
|
|
184
|
-
args: call.input,
|
|
185
|
-
};
|
|
186
|
-
let resultOutput = "Unknown result.";
|
|
187
|
-
try {
|
|
188
|
-
thisStepToolCalls.push({ toolName });
|
|
189
|
-
thisStepToolResults.push({ toolName });
|
|
190
|
-
const toolExec = executors.get(toolName);
|
|
191
|
-
if (!toolExec) {
|
|
192
|
-
resultOutput = `No executor for tool ${toolName}`;
|
|
134
|
+
else if (chunk.type === "tool-call") {
|
|
135
|
+
const call = chunk;
|
|
136
|
+
const toolName = call.toolName;
|
|
137
|
+
yield this.processToolEvent(toolsCalled, {
|
|
138
|
+
type: "tool-call-start",
|
|
139
|
+
name: toolName,
|
|
140
|
+
toolCallId: call.toolCallId,
|
|
141
|
+
msg: "",
|
|
142
|
+
args: call.input,
|
|
143
|
+
});
|
|
144
|
+
if (call.invalid) {
|
|
145
|
+
yield this.processToolEvent(toolsCalled, {
|
|
146
|
+
type: "tool-call-error",
|
|
147
|
+
name: call.toolName,
|
|
148
|
+
toolCallId: call.toolCallId,
|
|
149
|
+
msg: String(call.error),
|
|
150
|
+
args: call.input,
|
|
151
|
+
});
|
|
152
|
+
continue;
|
|
193
153
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
154
|
+
let resultOutput = "Unknown result.";
|
|
155
|
+
try {
|
|
156
|
+
thisStepToolCalls.push({ toolName });
|
|
157
|
+
thisStepToolResults.push({ toolName });
|
|
158
|
+
const toolExec = executors.get(toolName);
|
|
159
|
+
if (!toolExec) {
|
|
160
|
+
resultOutput = `No executor for tool ${toolName}`;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
try {
|
|
164
|
+
const output = await toolExec(call.input, {
|
|
165
|
+
toolCallId: call.toolCallId,
|
|
166
|
+
messages: messageHistory.get(),
|
|
167
|
+
abortSignal,
|
|
168
|
+
});
|
|
169
|
+
if (isAsyncIterable(output)) {
|
|
170
|
+
const toolResultValues = [];
|
|
171
|
+
for await (const value of output) {
|
|
172
|
+
if (isToolMessage(value)) {
|
|
173
|
+
if (call.toolCallId !== value.id) {
|
|
174
|
+
logger.debug(`Tool ${call.toolName} ids don't match: ${call.toolCallId} != ${value.id}`);
|
|
175
|
+
}
|
|
176
|
+
const event = value.event;
|
|
177
|
+
switch (event) {
|
|
178
|
+
case "tool-completion":
|
|
179
|
+
yield this.processToolEvent(toolsCalled, {
|
|
180
|
+
type: "tool-call-end",
|
|
181
|
+
name: value.name,
|
|
182
|
+
toolCallId: call.toolCallId,
|
|
183
|
+
msg: value.data,
|
|
184
|
+
args: call.input,
|
|
185
|
+
});
|
|
186
|
+
break;
|
|
187
|
+
case "tool-error":
|
|
188
|
+
yield this.processToolEvent(toolsCalled, {
|
|
189
|
+
type: "tool-call-error",
|
|
190
|
+
name: value.name,
|
|
191
|
+
toolCallId: call.toolCallId,
|
|
192
|
+
msg: value.data,
|
|
193
|
+
args: call.input,
|
|
194
|
+
});
|
|
195
|
+
break;
|
|
196
|
+
case "tool-update":
|
|
197
|
+
yield this.processToolEvent(toolsCalled, {
|
|
198
|
+
type: "tool-call-update",
|
|
199
|
+
name: value.name,
|
|
200
|
+
toolCallId: call.toolCallId,
|
|
201
|
+
msg: value.data,
|
|
202
|
+
args: call.input,
|
|
203
|
+
});
|
|
204
|
+
break;
|
|
205
|
+
case "tool-init":
|
|
206
|
+
yield this.processToolEvent(toolsCalled, {
|
|
207
|
+
type: "tool-call-init",
|
|
208
|
+
name: value.name,
|
|
209
|
+
toolCallId: call.toolCallId,
|
|
210
|
+
msg: value.data,
|
|
211
|
+
args: call.input,
|
|
212
|
+
});
|
|
213
|
+
break;
|
|
214
|
+
default:
|
|
215
|
+
event;
|
|
216
|
+
logger.debug(`Unhandled tool message event: ${event}`);
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
toolResultValues.push(value);
|
|
236
222
|
}
|
|
237
223
|
}
|
|
238
|
-
|
|
239
|
-
toolResultValues.
|
|
240
|
-
|
|
224
|
+
const finalValue = toolResultValues.length > 0
|
|
225
|
+
? toolResultValues.at(-1)
|
|
226
|
+
: undefined;
|
|
227
|
+
resultOutput = formatToolResult(finalValue);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
resultOutput = formatToolResult(output);
|
|
231
|
+
yield this.processToolEvent(toolsCalled, {
|
|
232
|
+
type: "tool-call-end",
|
|
233
|
+
name: call.toolName,
|
|
234
|
+
toolCallId: call.toolCallId,
|
|
235
|
+
msg: "success",
|
|
236
|
+
args: null,
|
|
237
|
+
});
|
|
241
238
|
}
|
|
242
|
-
const finalValue = toolResultValues.length > 0
|
|
243
|
-
? toolResultValues.at(-1)
|
|
244
|
-
: undefined;
|
|
245
|
-
resultOutput = formatToolResult(finalValue);
|
|
246
239
|
}
|
|
247
|
-
|
|
248
|
-
resultOutput =
|
|
249
|
-
yield {
|
|
250
|
-
type: "tool-call-
|
|
251
|
-
name:
|
|
240
|
+
catch (err) {
|
|
241
|
+
resultOutput = `Tool error: ${err instanceof Error ? err.message : String(err)}`;
|
|
242
|
+
yield this.processToolEvent(toolsCalled, {
|
|
243
|
+
type: "tool-call-error",
|
|
244
|
+
name: toolName,
|
|
252
245
|
toolCallId: call.toolCallId,
|
|
253
|
-
msg:
|
|
246
|
+
msg: resultOutput,
|
|
254
247
|
args: null,
|
|
255
|
-
};
|
|
248
|
+
});
|
|
256
249
|
}
|
|
257
250
|
}
|
|
258
|
-
catch (err) {
|
|
259
|
-
resultOutput = `Tool error: ${err instanceof Error ? err.message : String(err)}`;
|
|
260
|
-
yield {
|
|
261
|
-
type: "tool-call-error",
|
|
262
|
-
name: toolName,
|
|
263
|
-
toolCallId: call.toolCallId,
|
|
264
|
-
msg: resultOutput,
|
|
265
|
-
args: null,
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
251
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
name: toolName,
|
|
275
|
-
toolCallId: call.toolCallId,
|
|
276
|
-
msg: resultOutput,
|
|
277
|
-
args: null,
|
|
278
|
-
};
|
|
279
|
-
}
|
|
280
|
-
toolMessages.push({
|
|
281
|
-
role: "tool",
|
|
282
|
-
content: [
|
|
283
|
-
{
|
|
284
|
-
type: "tool-result",
|
|
285
|
-
toolName,
|
|
252
|
+
catch (error) {
|
|
253
|
+
resultOutput = `Tool error: ${error instanceof Error ? error.message : String(error)}`;
|
|
254
|
+
yield this.processToolEvent(toolsCalled, {
|
|
255
|
+
type: "tool-call-error",
|
|
256
|
+
name: toolName,
|
|
286
257
|
toolCallId: call.toolCallId,
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
258
|
+
msg: resultOutput,
|
|
259
|
+
args: null,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
toolMessages.push({
|
|
263
|
+
role: "tool",
|
|
264
|
+
content: [
|
|
265
|
+
{
|
|
266
|
+
type: "tool-result",
|
|
267
|
+
toolName,
|
|
268
|
+
toolCallId: call.toolCallId,
|
|
269
|
+
output: {
|
|
270
|
+
type: "text",
|
|
271
|
+
value: resultOutput,
|
|
272
|
+
},
|
|
290
273
|
},
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
}
|
|
274
|
+
],
|
|
275
|
+
});
|
|
276
|
+
}
|
|
294
277
|
}
|
|
295
|
-
|
|
296
|
-
|
|
278
|
+
// Get response and tool calls
|
|
279
|
+
const response = await result.response;
|
|
280
|
+
const responseMessages = response.messages;
|
|
281
|
+
messageHistory.appendResponseMessages(responseMessages);
|
|
297
282
|
const stepUsage = await result.usage;
|
|
298
283
|
this._state.usage.inputTokens = stepUsage.inputTokens ?? 0;
|
|
299
284
|
this._state.usage.outputTokens = stepUsage.outputTokens ?? 0;
|
|
300
285
|
this._state.usage.totalTokens = stepUsage.totalTokens ?? 0;
|
|
301
286
|
this._state.usage.cachedInputTokens = stepUsage.cachedInputTokens ?? 0;
|
|
302
287
|
this._state.usage.reasoningTokens = stepUsage.reasoningTokens ?? 0;
|
|
288
|
+
messageHistory.setContextWindow(stepUsage.totalTokens ?? 0);
|
|
303
289
|
this._state.totalUsage.inputTokens += stepUsage.inputTokens ?? 0;
|
|
304
290
|
this._state.totalUsage.outputTokens += stepUsage.outputTokens ?? 0;
|
|
305
291
|
this._state.totalUsage.totalTokens += stepUsage.totalTokens ?? 0;
|
|
@@ -307,6 +293,16 @@ export class Agent {
|
|
|
307
293
|
stepUsage.cachedInputTokens ?? 0;
|
|
308
294
|
this._state.totalUsage.reasoningTokens +=
|
|
309
295
|
stepUsage.reasoningTokens ?? 0;
|
|
296
|
+
// If finishReason is not tool-calls, break
|
|
297
|
+
const finishReason = await result.finishReason;
|
|
298
|
+
if (finishReason !== "tool-calls") {
|
|
299
|
+
yield {
|
|
300
|
+
type: "agent-stop",
|
|
301
|
+
};
|
|
302
|
+
hasEmittedTerminalEvent = true;
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
messageHistory.appendToolMessages(toolMessages);
|
|
310
306
|
// Consume the rest of the team if necessary
|
|
311
307
|
// await result.consumeStream();
|
|
312
308
|
yield {
|
|
@@ -327,6 +323,7 @@ export class Agent {
|
|
|
327
323
|
message: errorMsg,
|
|
328
324
|
};
|
|
329
325
|
if (NoOutputGeneratedError.isInstance(error)) {
|
|
326
|
+
hasEmittedTerminalEvent = true;
|
|
330
327
|
break;
|
|
331
328
|
}
|
|
332
329
|
// Break loop if we exceed max retries
|
|
@@ -335,6 +332,7 @@ export class Agent {
|
|
|
335
332
|
type: "agent-error",
|
|
336
333
|
message: `Exceeded maximum retry attempts (${maxRetries}). Stopping manual loop.`,
|
|
337
334
|
};
|
|
335
|
+
hasEmittedTerminalEvent = true;
|
|
338
336
|
break;
|
|
339
337
|
}
|
|
340
338
|
}
|
|
@@ -342,6 +340,12 @@ export class Agent {
|
|
|
342
340
|
this._state.timestamps.stop = performance.now();
|
|
343
341
|
}
|
|
344
342
|
}
|
|
343
|
+
// Emit agent-stop if loop ended without emitting a terminal event (maxIterations reached)
|
|
344
|
+
if (!hasEmittedTerminalEvent) {
|
|
345
|
+
yield {
|
|
346
|
+
type: "agent-stop",
|
|
347
|
+
};
|
|
348
|
+
}
|
|
345
349
|
// Track aggregate usage across all steps when available
|
|
346
350
|
tokenTracker.trackUsage("repl", this._state.totalUsage);
|
|
347
351
|
}
|
|
@@ -379,6 +383,30 @@ export class Agent {
|
|
|
379
383
|
};
|
|
380
384
|
return this._state;
|
|
381
385
|
}
|
|
386
|
+
processToolEvent(toolsCalled, event) {
|
|
387
|
+
const toolCallId = event.toolCallId;
|
|
388
|
+
let events;
|
|
389
|
+
if (toolsCalled.has(toolCallId)) {
|
|
390
|
+
const currentEvents = toolsCalled.get(toolCallId);
|
|
391
|
+
if (currentEvents) {
|
|
392
|
+
events = currentEvents;
|
|
393
|
+
events.push(event);
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
events = [event];
|
|
397
|
+
toolsCalled.set(toolCallId, events);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
events = [event];
|
|
402
|
+
toolsCalled.set(toolCallId, events);
|
|
403
|
+
}
|
|
404
|
+
return {
|
|
405
|
+
type: "tool-call-lifecycle",
|
|
406
|
+
toolCallId: toolCallId,
|
|
407
|
+
events,
|
|
408
|
+
};
|
|
409
|
+
}
|
|
382
410
|
}
|
|
383
411
|
function formatToolResult(value) {
|
|
384
412
|
if (typeof value === "string") {
|
package/dist/api/exa/index.js
CHANGED
package/dist/cli.d.ts
CHANGED
|
@@ -9,12 +9,13 @@ interface CliOptions {
|
|
|
9
9
|
promptManager: PromptManager;
|
|
10
10
|
modelManager: ModelManager;
|
|
11
11
|
tokenTracker: TokenTracker;
|
|
12
|
-
config: Record<PropertyKey, unknown>;
|
|
13
12
|
tokenCounter: TokenCounter;
|
|
14
13
|
workspace: WorkspaceContext;
|
|
14
|
+
skillsEnabled?: boolean;
|
|
15
15
|
}
|
|
16
16
|
export declare class Cli {
|
|
17
17
|
private options;
|
|
18
|
+
private skillsEnabled;
|
|
18
19
|
constructor(options: CliOptions);
|
|
19
20
|
run(): Promise<void>;
|
|
20
21
|
}
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../source/cli.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,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;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AASxD,UAAU,UAAU;IAClB,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../source/cli.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,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;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AASxD,UAAU,UAAU;IAClB,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAWD,qBAAa,GAAG;IACd,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,aAAa,CAAU;gBACnB,OAAO,EAAE,UAAU;IAKzB,GAAG;CAiHV"}
|
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { generateObject, generateText, NoSuchToolError, stepCountIs, } from "ai";
|
|
2
2
|
import { logger } from "./logger.js";
|
|
3
3
|
import { AiConfig } from "./models/ai-config.js";
|
|
4
|
-
import {
|
|
4
|
+
import { systemPrompt } from "./prompts.js";
|
|
5
5
|
import { BashTool } from "./tools/bash.js";
|
|
6
6
|
import { CodeInterpreterTool } from "./tools/code-interpreter.js";
|
|
7
7
|
import { EditFileTool } from "./tools/edit-file.js";
|
|
@@ -19,12 +19,13 @@ const activeTools = [
|
|
|
19
19
|
];
|
|
20
20
|
export class Cli {
|
|
21
21
|
options;
|
|
22
|
+
skillsEnabled;
|
|
22
23
|
constructor(options) {
|
|
23
24
|
this.options = options;
|
|
25
|
+
this.skillsEnabled = options.skillsEnabled ?? true;
|
|
24
26
|
}
|
|
25
27
|
async run() {
|
|
26
|
-
const {
|
|
27
|
-
logger.info(config, "Config:");
|
|
28
|
+
const { promptManager, modelManager, tokenTracker, messageHistory, tokenCounter, } = this.options;
|
|
28
29
|
const abortController = new AbortController();
|
|
29
30
|
const { signal } = abortController;
|
|
30
31
|
const cb = () => {
|
|
@@ -37,7 +38,12 @@ export class Cli {
|
|
|
37
38
|
const userPrompt = promptManager.get();
|
|
38
39
|
const userMsg = promptManager.getUserMessage();
|
|
39
40
|
messageHistory.appendUserMessage(userMsg);
|
|
40
|
-
const finalSystemPrompt = await
|
|
41
|
+
const finalSystemPrompt = await systemPrompt({
|
|
42
|
+
type: "cli",
|
|
43
|
+
activeTools,
|
|
44
|
+
allowedDirs: this.options.workspace.allowedDirs,
|
|
45
|
+
skillsEnabled: this.skillsEnabled,
|
|
46
|
+
});
|
|
41
47
|
const aiConfig = new AiConfig({
|
|
42
48
|
modelMetadata: modelConfig,
|
|
43
49
|
prompt: userPrompt,
|
|
@@ -46,6 +52,10 @@ export class Cli {
|
|
|
46
52
|
tokenCounter,
|
|
47
53
|
workspace: this.options.workspace,
|
|
48
54
|
});
|
|
55
|
+
// Cleanup function to remove signal handler
|
|
56
|
+
const cleanup = () => {
|
|
57
|
+
process.removeListener("SIGINT", cb);
|
|
58
|
+
};
|
|
49
59
|
try {
|
|
50
60
|
const result = await generateText({
|
|
51
61
|
model: langModel,
|
|
@@ -70,13 +80,36 @@ export class Cli {
|
|
|
70
80
|
tokenTracker.trackUsage("cli", result.usage);
|
|
71
81
|
messageHistory.save();
|
|
72
82
|
process.stdout.end(result.text.endsWith("\n") ? result.text : `${result.text}\n`);
|
|
83
|
+
cleanup();
|
|
73
84
|
}
|
|
74
85
|
catch (e) {
|
|
75
|
-
|
|
76
|
-
|
|
86
|
+
// Always cleanup signal handler
|
|
87
|
+
cleanup();
|
|
88
|
+
// Check if it's an abort error
|
|
89
|
+
const isAbortError = e instanceof Error &&
|
|
90
|
+
(e.name === "AbortError" ||
|
|
91
|
+
e.message.includes("aborted") ||
|
|
92
|
+
e.message.includes("No output generated"));
|
|
93
|
+
if (isAbortError) {
|
|
94
|
+
logger.info("CLI execution interrupted by user");
|
|
95
|
+
// Try to save message history before exiting
|
|
96
|
+
try {
|
|
97
|
+
await messageHistory.save();
|
|
98
|
+
}
|
|
99
|
+
catch (_saveError) {
|
|
100
|
+
// Ignore save errors on abort
|
|
101
|
+
logger.warn("Failed to save message history on interrupt");
|
|
102
|
+
}
|
|
103
|
+
process.exit(0); // Exit gracefully
|
|
77
104
|
}
|
|
78
105
|
else {
|
|
79
|
-
|
|
106
|
+
if (e instanceof Error) {
|
|
107
|
+
logger.error(e);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
logger.error(JSON.stringify(e, null, 2));
|
|
111
|
+
}
|
|
112
|
+
process.exit(1);
|
|
80
113
|
}
|
|
81
114
|
}
|
|
82
115
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { CommandOptions, ReplCommand } from "./types.ts";
|
|
2
|
-
export declare const addDirectoryCommand: ({
|
|
2
|
+
export declare const addDirectoryCommand: ({ workspace, }: CommandOptions) => ReplCommand;
|
|
3
3
|
//# sourceMappingURL=add-directory-command.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-directory-command.d.ts","sourceRoot":"","sources":["../../source/commands/add-directory-command.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D,eAAO,MAAM,mBAAmB,GAAI,
|
|
1
|
+
{"version":3,"file":"add-directory-command.d.ts","sourceRoot":"","sources":["../../source/commands/add-directory-command.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D,eAAO,MAAM,mBAAmB,GAAI,gBAEjC,cAAc,KAAG,WA2FnB,CAAC"}
|