@travisennis/acai 0.0.7 → 0.0.8
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 +42 -25
- package/dist/agent/index.d.ts +21 -25
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +115 -104
- package/dist/cli.d.ts +2 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +21 -16
- package/dist/commands/add-directory/index.d.ts +3 -0
- package/dist/commands/add-directory/index.d.ts.map +1 -0
- package/dist/commands/{add-directory-command.js → add-directory/index.js} +6 -10
- package/dist/commands/add-directory/types.d.ts +6 -0
- package/dist/commands/add-directory/types.d.ts.map +1 -0
- package/dist/commands/add-directory/types.js +1 -0
- package/dist/commands/add-directory/utils.d.ts +3 -0
- package/dist/commands/add-directory/utils.d.ts.map +1 -0
- package/dist/commands/add-directory/utils.js +15 -0
- package/dist/commands/clear/index.d.ts +3 -0
- package/dist/commands/clear/index.d.ts.map +1 -0
- package/dist/commands/{clear-command.js → clear/index.js} +0 -2
- package/dist/commands/copy/index.d.ts +3 -0
- package/dist/commands/copy/index.d.ts.map +1 -0
- package/dist/commands/{copy-command.js → copy/index.js} +4 -26
- package/dist/commands/copy/types.d.ts +3 -0
- package/dist/commands/copy/types.d.ts.map +1 -0
- package/dist/commands/copy/types.js +1 -0
- package/dist/commands/copy/utils.d.ts +3 -0
- package/dist/commands/copy/utils.d.ts.map +1 -0
- package/dist/commands/copy/utils.js +22 -0
- package/dist/commands/{exit-command.d.ts → exit/index.d.ts} +4 -4
- package/dist/commands/exit/index.d.ts.map +1 -0
- package/dist/commands/exit/index.js +21 -0
- package/dist/commands/exit/types.d.ts +8 -0
- package/dist/commands/exit/types.d.ts.map +1 -0
- package/dist/commands/exit/types.js +1 -0
- package/dist/commands/exit/utils.d.ts +2 -0
- package/dist/commands/exit/utils.d.ts.map +1 -0
- package/dist/commands/exit/utils.js +13 -0
- package/dist/commands/generate-rules/index.d.ts +3 -0
- package/dist/commands/generate-rules/index.d.ts.map +1 -0
- package/dist/commands/{generate-rules-command.js → generate-rules/index.js} +55 -95
- package/dist/commands/generate-rules/utils.d.ts +5 -0
- package/dist/commands/generate-rules/utils.d.ts.map +1 -0
- package/dist/commands/generate-rules/utils.js +25 -0
- package/dist/commands/handoff/index.d.ts +3 -0
- package/dist/commands/handoff/index.d.ts.map +1 -0
- package/dist/commands/handoff/index.js +97 -0
- package/dist/commands/handoff/utils.d.ts +4 -0
- package/dist/commands/handoff/utils.d.ts.map +1 -0
- package/dist/commands/{handoff-command.js → handoff/utils.js} +24 -92
- package/dist/commands/health/index.d.ts +3 -0
- package/dist/commands/health/index.d.ts.map +1 -0
- package/dist/commands/health/index.js +56 -0
- package/dist/commands/health/utils.d.ts +15 -0
- package/dist/commands/health/utils.d.ts.map +1 -0
- package/dist/commands/health/utils.js +52 -0
- package/dist/commands/{help-command.d.ts → help/index.d.ts} +2 -2
- package/dist/commands/help/index.d.ts.map +1 -0
- package/dist/commands/{help-command.js → help/index.js} +1 -1
- package/dist/commands/history/index.d.ts +3 -0
- package/dist/commands/history/index.d.ts.map +1 -0
- package/dist/commands/{history-command.js → history/index.js} +16 -100
- package/dist/commands/history/types.d.ts +11 -0
- package/dist/commands/history/types.d.ts.map +1 -0
- package/dist/commands/history/types.js +1 -0
- package/dist/commands/history/utils.d.ts +4 -0
- package/dist/commands/history/utils.d.ts.map +1 -0
- package/dist/commands/history/utils.js +86 -0
- package/dist/commands/init/index.d.ts +3 -0
- package/dist/commands/init/index.d.ts.map +1 -0
- package/dist/commands/{init-command.js → init/index.js} +16 -7
- package/dist/commands/init-project/index.d.ts +3 -0
- package/dist/commands/init-project/index.d.ts.map +1 -0
- package/dist/commands/init-project/index.js +51 -0
- package/dist/commands/init-project/utils.d.ts +9 -0
- package/dist/commands/init-project/utils.d.ts.map +1 -0
- package/dist/commands/init-project/utils.js +43 -0
- package/dist/commands/list-directories/index.d.ts +3 -0
- package/dist/commands/list-directories/index.d.ts.map +1 -0
- package/dist/commands/{list-directories-command.js → list-directories/index.js} +1 -1
- package/dist/commands/list-tools/index.d.ts +3 -0
- package/dist/commands/list-tools/index.d.ts.map +1 -0
- package/dist/commands/{list-tools-command.js → list-tools/index.js} +4 -16
- package/dist/commands/manager.d.ts +2 -2
- package/dist/commands/manager.d.ts.map +1 -1
- package/dist/commands/manager.js +33 -43
- package/dist/commands/model/index.d.ts +3 -0
- package/dist/commands/model/index.d.ts.map +1 -0
- package/dist/commands/{model-command.js → model/index.js} +15 -52
- package/dist/commands/model/utils.d.ts +3 -0
- package/dist/commands/model/utils.d.ts.map +1 -0
- package/dist/commands/model/utils.js +5 -0
- package/dist/commands/{paste-command.d.ts → paste/index.d.ts} +2 -2
- package/dist/commands/paste/index.d.ts.map +1 -0
- package/dist/commands/{paste-command.js → paste/index.js} +6 -111
- package/dist/commands/paste/utils.d.ts +5 -0
- package/dist/commands/paste/utils.d.ts.map +1 -0
- package/dist/commands/paste/utils.js +86 -0
- package/dist/commands/pickup/index.d.ts +3 -0
- package/dist/commands/pickup/index.d.ts.map +1 -0
- package/dist/commands/pickup/index.js +138 -0
- package/dist/commands/pickup/types.d.ts +6 -0
- package/dist/commands/pickup/types.d.ts.map +1 -0
- package/dist/commands/pickup/types.js +1 -0
- package/dist/commands/pickup/utils.d.ts +7 -0
- package/dist/commands/pickup/utils.d.ts.map +1 -0
- package/dist/commands/pickup/utils.js +56 -0
- package/dist/commands/prompt/index.d.ts +5 -0
- package/dist/commands/prompt/index.d.ts.map +1 -0
- package/dist/commands/prompt/index.js +126 -0
- package/dist/commands/prompt/types.d.ts +15 -0
- package/dist/commands/prompt/types.d.ts.map +1 -0
- package/dist/commands/prompt/types.js +1 -0
- package/dist/commands/prompt/utils.d.ts +12 -0
- package/dist/commands/prompt/utils.d.ts.map +1 -0
- package/dist/commands/prompt/utils.js +107 -0
- package/dist/commands/remove-directory/index.d.ts +3 -0
- package/dist/commands/remove-directory/index.d.ts.map +1 -0
- package/dist/commands/{remove-directory-command.js → remove-directory/index.js} +2 -2
- package/dist/commands/reset/index.d.ts +3 -0
- package/dist/commands/reset/index.d.ts.map +1 -0
- package/dist/commands/{reset-command.js → reset/index.js} +7 -2
- package/dist/commands/reset/types.d.ts +1 -0
- package/dist/commands/reset/types.d.ts.map +1 -0
- package/dist/commands/reset/types.js +3 -0
- package/dist/commands/resources/index.d.ts +3 -0
- package/dist/commands/resources/index.d.ts.map +1 -0
- package/dist/commands/resources/index.js +84 -0
- package/dist/commands/review/index.d.ts +3 -0
- package/dist/commands/review/index.d.ts.map +1 -0
- package/dist/commands/review/index.js +126 -0
- package/dist/commands/review/types.d.ts +12 -0
- package/dist/commands/review/types.d.ts.map +1 -0
- package/dist/commands/review/types.js +1 -0
- package/dist/commands/review/utils.d.ts +4 -0
- package/dist/commands/review/utils.d.ts.map +1 -0
- package/dist/commands/review/utils.js +87 -0
- package/dist/commands/save/index.d.ts +3 -0
- package/dist/commands/save/index.d.ts.map +1 -0
- package/dist/commands/{save-command.js → save/index.js} +3 -3
- package/dist/commands/session/index.d.ts +3 -0
- package/dist/commands/session/index.d.ts.map +1 -0
- package/dist/commands/session/index.js +197 -0
- package/dist/commands/session/types.d.ts +13 -0
- package/dist/commands/session/types.d.ts.map +1 -0
- package/dist/commands/session/types.js +7 -0
- package/dist/commands/shell/index.d.ts +3 -0
- package/dist/commands/shell/index.d.ts.map +1 -0
- package/dist/commands/{shell-command.js → shell/index.js} +3 -3
- package/dist/commands/types.d.ts +2 -2
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/config.d.ts +25 -7
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +45 -20
- package/dist/dedent.d.ts.map +1 -1
- package/dist/dedent.js +7 -7
- package/dist/execution/index.d.ts +1 -0
- package/dist/execution/index.d.ts.map +1 -1
- package/dist/execution/index.js +60 -64
- package/dist/formatting.d.ts +27 -0
- package/dist/formatting.d.ts.map +1 -1
- package/dist/formatting.js +40 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +138 -75
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +4 -11
- package/dist/mentions.d.ts.map +1 -1
- package/dist/mentions.js +3 -53
- package/dist/middleware/audit-message.d.ts +2 -2
- package/dist/middleware/audit-message.d.ts.map +1 -1
- package/dist/middleware/audit-message.js +40 -2
- package/dist/middleware/cache.d.ts +2 -2
- package/dist/middleware/cache.d.ts.map +1 -1
- package/dist/middleware/cache.js +111 -27
- package/dist/middleware/rate-limit.d.ts +2 -2
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +1 -0
- package/dist/models/ai-config.d.ts.map +1 -1
- package/dist/models/ai-config.js +46 -29
- package/dist/models/anthropic-provider.d.ts +14 -13
- package/dist/models/anthropic-provider.d.ts.map +1 -1
- package/dist/models/deepseek-provider.d.ts +9 -8
- package/dist/models/deepseek-provider.d.ts.map +1 -1
- package/dist/models/google-provider.d.ts +10 -9
- package/dist/models/google-provider.d.ts.map +1 -1
- package/dist/models/groq-provider.d.ts +8 -7
- package/dist/models/groq-provider.d.ts.map +1 -1
- package/dist/models/manager.d.ts +7 -4
- package/dist/models/manager.d.ts.map +1 -1
- package/dist/models/manager.js +5 -25
- package/dist/models/openai-provider.d.ts +11 -10
- package/dist/models/openai-provider.d.ts.map +1 -1
- package/dist/models/opencode-zen-provider.d.ts +23 -0
- package/dist/models/opencode-zen-provider.d.ts.map +1 -0
- package/dist/models/opencode-zen-provider.js +76 -0
- package/dist/models/openrouter-provider.d.ts +34 -29
- package/dist/models/openrouter-provider.d.ts.map +1 -1
- package/dist/models/openrouter-provider.js +95 -80
- package/dist/models/providers.d.ts +4 -4
- package/dist/models/providers.d.ts.map +1 -1
- package/dist/models/providers.js +7 -1
- package/dist/models/xai-provider.d.ts +9 -8
- package/dist/models/xai-provider.d.ts.map +1 -1
- package/dist/prompts/manager.d.ts +1 -1
- package/dist/prompts/manager.d.ts.map +1 -1
- package/dist/prompts/manager.js +1 -1
- package/dist/prompts.d.ts +0 -1
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +56 -406
- package/dist/repl/project-status.d.ts +19 -0
- package/dist/repl/project-status.d.ts.map +1 -0
- package/dist/repl/project-status.js +78 -0
- package/dist/repl-new.d.ts +15 -4
- package/dist/repl-new.d.ts.map +1 -1
- package/dist/repl-new.js +245 -42
- package/dist/{messages.d.ts → sessions/manager.d.ts} +10 -4
- package/dist/sessions/manager.d.ts.map +1 -0
- package/dist/{messages.js → sessions/manager.js} +60 -14
- package/dist/skills.d.ts +0 -4
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +100 -59
- package/dist/terminal/control.d.ts +1 -0
- package/dist/terminal/control.d.ts.map +1 -1
- package/dist/terminal/control.js +2 -0
- package/dist/terminal/formatting.d.ts +1 -2
- package/dist/terminal/formatting.d.ts.map +1 -1
- package/dist/terminal/formatting.js +1 -2
- package/dist/terminal/keys.d.ts +211 -0
- package/dist/terminal/keys.d.ts.map +1 -0
- package/dist/terminal/keys.js +546 -0
- package/dist/terminal/segmenter.d.ts +6 -0
- package/dist/terminal/segmenter.d.ts.map +1 -0
- package/dist/terminal/segmenter.js +11 -0
- package/dist/terminal/select-prompt.d.ts.map +1 -1
- package/dist/terminal/select-prompt.js +9 -21
- package/dist/terminal/string-width.d.ts.map +1 -1
- package/dist/terminal/string-width.js +40 -21
- package/dist/terminal/strip-ansi.d.ts.map +1 -1
- package/dist/terminal/strip-ansi.js +9 -15
- package/dist/tokens/tracker.d.ts.map +1 -1
- package/dist/tokens/tracker.js +58 -16
- package/dist/tools/bash.d.ts +9 -11
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +69 -123
- package/dist/tools/directory-tree.d.ts +9 -7
- package/dist/tools/directory-tree.d.ts.map +1 -1
- package/dist/tools/directory-tree.js +89 -70
- package/dist/tools/dynamic-tool-loader.d.ts +22 -4
- package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
- package/dist/tools/dynamic-tool-loader.js +39 -44
- package/dist/tools/edit-file.d.ts +6 -16
- package/dist/tools/edit-file.d.ts.map +1 -1
- package/dist/tools/edit-file.js +19 -76
- package/dist/tools/glob.d.ts +15 -16
- package/dist/tools/glob.d.ts.map +1 -1
- package/dist/tools/glob.js +77 -119
- package/dist/tools/grep.d.ts +19 -22
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +61 -108
- package/dist/tools/index.d.ts +200 -179
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +17 -315
- package/dist/tools/ls.d.ts +26 -0
- package/dist/tools/ls.d.ts.map +1 -0
- package/dist/tools/ls.js +80 -0
- package/dist/tools/read-file.d.ts +15 -15
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +49 -82
- 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 +37 -66
- package/dist/tools/think.d.ts +4 -4
- package/dist/tools/think.d.ts.map +1 -1
- package/dist/tools/think.js +9 -38
- package/dist/tools/types.d.ts +5 -25
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +0 -9
- package/dist/tui/autocomplete/attachment-provider.d.ts +18 -0
- package/dist/tui/autocomplete/attachment-provider.d.ts.map +1 -0
- package/dist/tui/autocomplete/attachment-provider.js +159 -0
- package/dist/tui/autocomplete/base-provider.d.ts +17 -0
- package/dist/tui/autocomplete/base-provider.d.ts.map +1 -0
- package/dist/tui/autocomplete/base-provider.js +1 -0
- package/dist/tui/autocomplete/combined-provider.d.ts +20 -0
- package/dist/tui/autocomplete/combined-provider.d.ts.map +1 -0
- package/dist/tui/autocomplete/combined-provider.js +61 -0
- package/dist/tui/autocomplete/command-provider.d.ts +20 -0
- package/dist/tui/autocomplete/command-provider.d.ts.map +1 -0
- package/dist/tui/autocomplete/command-provider.js +90 -0
- package/dist/tui/autocomplete/file-search-provider.d.ts +16 -0
- package/dist/tui/autocomplete/file-search-provider.d.ts.map +1 -0
- package/dist/tui/autocomplete/file-search-provider.js +123 -0
- package/dist/tui/autocomplete/path-provider.d.ts +21 -0
- package/dist/tui/autocomplete/path-provider.d.ts.map +1 -0
- package/dist/tui/autocomplete/path-provider.js +164 -0
- package/dist/tui/autocomplete/utils.d.ts +16 -0
- package/dist/tui/autocomplete/utils.d.ts.map +1 -0
- package/dist/tui/autocomplete/utils.js +137 -0
- package/dist/tui/autocomplete.d.ts +12 -43
- package/dist/tui/autocomplete.d.ts.map +1 -1
- package/dist/tui/autocomplete.js +20 -465
- package/dist/tui/components/box.d.ts.map +1 -1
- package/dist/tui/components/box.js +16 -10
- package/dist/tui/components/editor.d.ts +1 -2
- package/dist/tui/components/editor.d.ts.map +1 -1
- package/dist/tui/components/editor.js +148 -107
- package/dist/tui/components/footer.d.ts +20 -7
- package/dist/tui/components/footer.d.ts.map +1 -1
- package/dist/tui/components/footer.js +89 -196
- package/dist/tui/components/input.d.ts.map +1 -1
- package/dist/tui/components/input.js +8 -7
- package/dist/tui/components/loader.d.ts +2 -1
- package/dist/tui/components/loader.d.ts.map +1 -1
- package/dist/tui/components/loader.js +7 -2
- package/dist/tui/components/markdown.d.ts +5 -4
- package/dist/tui/components/markdown.d.ts.map +1 -1
- package/dist/tui/components/markdown.js +51 -40
- package/dist/tui/components/modal.d.ts.map +1 -1
- package/dist/tui/components/modal.js +9 -8
- package/dist/tui/components/notification.d.ts +28 -0
- package/dist/tui/components/notification.d.ts.map +1 -0
- package/dist/tui/components/notification.js +63 -0
- package/dist/tui/components/progress-bar.d.ts.map +1 -1
- package/dist/tui/components/progress-bar.js +3 -15
- package/dist/tui/components/select-list.d.ts +0 -15
- package/dist/tui/components/select-list.d.ts.map +1 -1
- package/dist/tui/components/select-list.js +5 -28
- package/dist/tui/components/tool-execution.d.ts +3 -6
- package/dist/tui/components/tool-execution.d.ts.map +1 -1
- package/dist/tui/components/tool-execution.js +26 -38
- package/dist/tui/components/welcome.d.ts +8 -1
- package/dist/tui/components/welcome.d.ts.map +1 -1
- package/dist/tui/components/welcome.js +45 -6
- package/dist/tui/index.d.ts +4 -2
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +2 -2
- package/dist/tui/terminal.d.ts +2 -2
- package/dist/tui/terminal.d.ts.map +1 -1
- package/dist/tui/terminal.js +23 -19
- package/dist/tui/tui.d.ts +1 -0
- package/dist/tui/tui.d.ts.map +1 -1
- package/dist/tui/tui.js +24 -29
- package/dist/tui/utils.d.ts.map +1 -1
- package/dist/tui/utils.js +2 -3
- package/dist/utils/yaml.d.ts +11 -0
- package/dist/utils/yaml.d.ts.map +1 -0
- package/dist/utils/yaml.js +207 -0
- package/dist/utils/zod.d.ts +1 -0
- package/dist/utils/zod.d.ts.map +1 -1
- package/dist/utils/zod.js +17 -0
- package/package.json +31 -29
- package/bin/acai-wrapper.js +0 -26
- package/dist/api/exa/index.d.ts +0 -177
- package/dist/api/exa/index.d.ts.map +0 -1
- package/dist/api/exa/index.js +0 -439
- package/dist/commands/add-directory-command.d.ts +0 -3
- package/dist/commands/add-directory-command.d.ts.map +0 -1
- package/dist/commands/application-log-command.d.ts +0 -3
- package/dist/commands/application-log-command.d.ts.map +0 -1
- package/dist/commands/application-log-command.js +0 -43
- package/dist/commands/clear-command.d.ts +0 -3
- package/dist/commands/clear-command.d.ts.map +0 -1
- package/dist/commands/compact-command.d.ts +0 -3
- package/dist/commands/compact-command.d.ts.map +0 -1
- package/dist/commands/compact-command.js +0 -55
- package/dist/commands/context-command.d.ts +0 -3
- package/dist/commands/context-command.d.ts.map +0 -1
- package/dist/commands/context-command.js +0 -124
- package/dist/commands/copy-command.d.ts +0 -3
- package/dist/commands/copy-command.d.ts.map +0 -1
- package/dist/commands/edit-command.d.ts +0 -3
- package/dist/commands/edit-command.d.ts.map +0 -1
- package/dist/commands/edit-command.js +0 -42
- package/dist/commands/edit-prompt-command.d.ts +0 -3
- package/dist/commands/edit-prompt-command.d.ts.map +0 -1
- package/dist/commands/edit-prompt-command.js +0 -36
- package/dist/commands/exit-command.d.ts.map +0 -1
- package/dist/commands/exit-command.js +0 -30
- package/dist/commands/files-command.d.ts +0 -3
- package/dist/commands/files-command.d.ts.map +0 -1
- package/dist/commands/files-command.js +0 -68
- package/dist/commands/generate-rules-command.d.ts +0 -3
- package/dist/commands/generate-rules-command.d.ts.map +0 -1
- package/dist/commands/handoff-command.d.ts +0 -3
- package/dist/commands/handoff-command.d.ts.map +0 -1
- package/dist/commands/health-command.d.ts +0 -4
- package/dist/commands/health-command.d.ts.map +0 -1
- package/dist/commands/health-command.js +0 -118
- package/dist/commands/help-command.d.ts.map +0 -1
- package/dist/commands/history-command.d.ts +0 -3
- package/dist/commands/history-command.d.ts.map +0 -1
- package/dist/commands/init-command.d.ts +0 -3
- package/dist/commands/init-command.d.ts.map +0 -1
- package/dist/commands/last-log-command.d.ts +0 -3
- package/dist/commands/last-log-command.d.ts.map +0 -1
- package/dist/commands/last-log-command.js +0 -71
- package/dist/commands/list-directories-command.d.ts +0 -3
- package/dist/commands/list-directories-command.d.ts.map +0 -1
- package/dist/commands/list-tools-command.d.ts +0 -3
- package/dist/commands/list-tools-command.d.ts.map +0 -1
- package/dist/commands/model-command.d.ts +0 -3
- package/dist/commands/model-command.d.ts.map +0 -1
- package/dist/commands/paste-command.d.ts.map +0 -1
- package/dist/commands/pickup-command.d.ts +0 -3
- package/dist/commands/pickup-command.d.ts.map +0 -1
- package/dist/commands/pickup-command.js +0 -109
- package/dist/commands/prompt-command.d.ts +0 -21
- package/dist/commands/prompt-command.d.ts.map +0 -1
- package/dist/commands/prompt-command.js +0 -258
- package/dist/commands/remove-directory-command.d.ts +0 -3
- package/dist/commands/remove-directory-command.d.ts.map +0 -1
- package/dist/commands/reset-command.d.ts +0 -3
- package/dist/commands/reset-command.d.ts.map +0 -1
- package/dist/commands/rules-command.d.ts +0 -3
- package/dist/commands/rules-command.d.ts.map +0 -1
- package/dist/commands/rules-command.js +0 -73
- package/dist/commands/save-command.d.ts +0 -3
- package/dist/commands/save-command.d.ts.map +0 -1
- package/dist/commands/shell-command.d.ts +0 -3
- package/dist/commands/shell-command.d.ts.map +0 -1
- package/dist/commands/usage-command.d.ts +0 -3
- package/dist/commands/usage-command.d.ts.map +0 -1
- package/dist/commands/usage-command.js +0 -31
- package/dist/messages.d.ts.map +0 -1
- package/dist/repl/project-status-line.d.ts +0 -3
- package/dist/repl/project-status-line.d.ts.map +0 -1
- package/dist/repl/project-status-line.js +0 -61
- package/dist/repl/tool-call-repair.d.ts +0 -4
- package/dist/repl/tool-call-repair.d.ts.map +0 -1
- package/dist/repl/tool-call-repair.js +0 -54
- package/dist/terminal/markdown.d.ts +0 -2
- package/dist/terminal/markdown.d.ts.map +0 -1
- package/dist/terminal/markdown.js +0 -120
- package/dist/tokens/threshold.d.ts +0 -20
- package/dist/tokens/threshold.d.ts.map +0 -1
- package/dist/tokens/threshold.js +0 -67
- package/dist/tools/advanced-edit-file.d.ts +0 -69
- package/dist/tools/advanced-edit-file.d.ts.map +0 -1
- package/dist/tools/advanced-edit-file.js +0 -285
- package/dist/tools/agent.d.ts +0 -29
- package/dist/tools/agent.d.ts.map +0 -1
- package/dist/tools/agent.js +0 -117
- package/dist/tools/batch.d.ts +0 -34
- package/dist/tools/batch.d.ts.map +0 -1
- package/dist/tools/batch.js +0 -174
- package/dist/tools/code-interpreter.d.ts +0 -25
- package/dist/tools/code-interpreter.d.ts.map +0 -1
- package/dist/tools/code-interpreter.js +0 -183
- package/dist/tools/delete-file.d.ts +0 -24
- package/dist/tools/delete-file.d.ts.map +0 -1
- package/dist/tools/delete-file.js +0 -77
- package/dist/tools/dynamic-tool-parser.d.ts +0 -21
- package/dist/tools/dynamic-tool-parser.d.ts.map +0 -1
- package/dist/tools/dynamic-tool-parser.js +0 -22
- package/dist/tools/llm-edit-fixer.d.ts +0 -24
- package/dist/tools/llm-edit-fixer.d.ts.map +0 -1
- package/dist/tools/llm-edit-fixer.js +0 -136
- package/dist/tools/move-file.d.ts +0 -26
- package/dist/tools/move-file.d.ts.map +0 -1
- package/dist/tools/move-file.js +0 -65
- package/dist/tools/read-multiple-files.d.ts +0 -26
- package/dist/tools/read-multiple-files.d.ts.map +0 -1
- package/dist/tools/read-multiple-files.js +0 -196
- package/dist/tools/web-fetch.d.ts +0 -56
- package/dist/tools/web-fetch.d.ts.map +0 -1
- package/dist/tools/web-fetch.js +0 -247
- package/dist/tools/web-search.d.ts +0 -23
- package/dist/tools/web-search.d.ts.map +0 -1
- package/dist/tools/web-search.js +0 -148
- package/dist/tui/components/prompt-status.d.ts +0 -17
- package/dist/tui/components/prompt-status.d.ts.map +0 -1
- package/dist/tui/components/prompt-status.js +0 -26
package/README.md
CHANGED
|
@@ -26,15 +26,15 @@ Acai is a powerful **AI-driven command-line interface (CLI) tool** designed to a
|
|
|
26
26
|
* **File & Directory Mentions:** Include file contents and entire directories in prompts using `@filename` and `@dirname` syntax.
|
|
27
27
|
* **Code Navigation & Analysis:** Advanced file searching and code analysis capabilities.
|
|
28
28
|
* **Git Workflow Automation:** Streamline commit messages and code reviews.
|
|
29
|
-
* **
|
|
30
|
-
* **
|
|
31
|
-
* **Token Usage Tracking:** Monitor AI token consumption.
|
|
29
|
+
* **Extensible Commands:** A rich set of built-in commands (`/help`, `/model`, `/session`, `/list-tools`, etc.).
|
|
30
|
+
* **Token Usage Tracking:** Monitor AI token consumption with comprehensive session overview.
|
|
32
31
|
* **Configurable AI Models:** Easily switch between different LLM providers and models.
|
|
33
32
|
* **Shell Integration:** Execute shell commands inline using `!`command`` syntax or via `/shell` command.
|
|
34
33
|
* **Dynamic Tools:** Create and load custom tools from JavaScript files in your project or user directory.
|
|
35
34
|
* **Multi-workspace Support:** Work across multiple project directories simultaneously.
|
|
36
35
|
* **Skills System:** Discover and load specialized instruction files for specific tasks (PDF extraction, database migrations, etc.).
|
|
37
36
|
|
|
37
|
+
|
|
38
38
|
## 🛠️ Technologies Used
|
|
39
39
|
|
|
40
40
|
Acai is built primarily with **TypeScript** and runs on **Node.js**. Key technologies and dependencies include:
|
|
@@ -132,17 +132,9 @@ X_AI_API_KEY=your_xai_api_key_here
|
|
|
132
132
|
|
|
133
133
|
# OpenRouter (Access to multiple models)
|
|
134
134
|
OPENROUTER_API_KEY=your_openrouter_api_key_here
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
### Web Service API Keys (Optional)
|
|
138
135
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
# Optional: Falls back to DuckDuckGo search if not provided
|
|
142
|
-
EXA_API_KEY=your_exa_api_key_here
|
|
143
|
-
|
|
144
|
-
# Jina Reader (for enhanced web content extraction)
|
|
145
|
-
JINA_READER_API_KEY=your_jina_api_key_here
|
|
136
|
+
# OpenCode Zen
|
|
137
|
+
OPENCODE_ZEN_API_TOKEN=your_opencode_zen_api_token_here
|
|
146
138
|
```
|
|
147
139
|
|
|
148
140
|
### Application Configuration
|
|
@@ -165,16 +157,12 @@ GOOGLE_GENERATIVE_AI_API_KEY=...
|
|
|
165
157
|
GROQ_API_KEY=...
|
|
166
158
|
OPENROUTER_API_KEY=sk-or-...
|
|
167
159
|
|
|
168
|
-
# Optional: Web services (fallbacks available if not provided)
|
|
169
|
-
EXA_API_KEY=... # Falls back to DuckDuckGo search
|
|
170
|
-
|
|
171
160
|
# Optional: Application settings
|
|
172
161
|
LOG_LEVEL=info
|
|
173
162
|
```
|
|
174
163
|
|
|
175
164
|
**Note:** You need at least one AI provider API key to use Acai. The tool will work with any combination of the supported providers.
|
|
176
165
|
|
|
177
|
-
**Web Search:** The web search functionality works without any API keys by using DuckDuckGo as a fallback. Providing an EXA_API_KEY enables enhanced search capabilities with more detailed content extraction.
|
|
178
166
|
|
|
179
167
|
### Usage
|
|
180
168
|
|
|
@@ -196,14 +184,27 @@ acai --no-skills
|
|
|
196
184
|
|
|
197
185
|
# Add additional working directories
|
|
198
186
|
acai --add-dir /path/to/project1 --add-dir /path/to/project2
|
|
187
|
+
|
|
188
|
+
# Resume a previous session by selecting from a list
|
|
189
|
+
acai --continue
|
|
190
|
+
|
|
191
|
+
# Resume the most recent session
|
|
192
|
+
acai --resume
|
|
193
|
+
|
|
194
|
+
# Resume a specific session by ID
|
|
195
|
+
acai --resume a1b2c3d4-e5f6-7890-1234-567890abcdef
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**Note:** When exiting a session with messages, Acai will display a resume command with the session ID:
|
|
199
|
+
```
|
|
200
|
+
To resume this session call acai --resume <session-id>
|
|
199
201
|
```
|
|
200
202
|
|
|
201
203
|
Once in the REPL, you can type your prompts or use commands:
|
|
202
204
|
|
|
203
205
|
```
|
|
204
206
|
> How do I read a file in Node.js?
|
|
205
|
-
>
|
|
206
|
-
> /edit source/cli.ts "Change this function name"
|
|
207
|
+
> @source/index.ts
|
|
207
208
|
> /help
|
|
208
209
|
```
|
|
209
210
|
|
|
@@ -287,7 +288,7 @@ For a list of available commands, type `/help` within the REPL.
|
|
|
287
288
|
- `/paste` - Add clipboard contents to the next prompt
|
|
288
289
|
- `/prompt <name> [arguments...]` - Load saved prompts with optional arguments. Project prompts override user prompts. Supports argument placeholders (`$ARGUMENTS`, `$1`, `$2`, etc.) in prompt files.
|
|
289
290
|
- `/model [provider:model|category|provider]` - List or switch models
|
|
290
|
-
- `/
|
|
291
|
+
- `/session` - Show comprehensive session information including usage and costs
|
|
291
292
|
- `/clear` - Clears the terminal screen for the current session
|
|
292
293
|
- `/generateRules` - Analyze the current conversation and suggest project rules
|
|
293
294
|
- `/copy` - Copy the last assistant response to the system clipboard
|
|
@@ -295,14 +296,13 @@ For a list of available commands, type `/help` within the REPL.
|
|
|
295
296
|
- `/add-dir <path>` - Add additional working directory
|
|
296
297
|
- `/list-dirs` - List all working directories
|
|
297
298
|
- `/remove-dir <path>` - Remove a working directory
|
|
298
|
-
- `/context` - Manage context selections
|
|
299
299
|
- `/health` - Check system health and dependencies
|
|
300
300
|
- `/history` - View and manage conversation history
|
|
301
301
|
- `/pickup` - Resume a previous conversation
|
|
302
302
|
- `/handoff` - Hand off conversation to another agent
|
|
303
303
|
- `/shell` - Execute shell commands
|
|
304
304
|
|
|
305
|
-
**Note**: Some commands mentioned in older documentation
|
|
305
|
+
**Note**: Some commands mentioned in older documentation may no longer be available. Use `/help` to see current commands.
|
|
306
306
|
|
|
307
307
|
Clipboard notes:
|
|
308
308
|
- macOS: uses `pbcopy`
|
|
@@ -642,7 +642,10 @@ Acai supports project-specific configuration through a `.acai/acai.json` file in
|
|
|
642
642
|
},
|
|
643
643
|
"skills": {
|
|
644
644
|
"enabled": true // Optional: Enable/disable skills discovery (default: true)
|
|
645
|
-
}
|
|
645
|
+
},
|
|
646
|
+
|
|
647
|
+
|
|
648
|
+
|
|
646
649
|
}
|
|
647
650
|
```
|
|
648
651
|
|
|
@@ -650,7 +653,8 @@ Acai supports project-specific configuration through a `.acai/acai.json` file in
|
|
|
650
653
|
|
|
651
654
|
- **Rules/Guidelines**: Add project-specific AI behavior rules in `AGENTS.md`
|
|
652
655
|
- **Custom Prompts**: Store reusable prompts in `.acai/prompts/`. Supports argument placeholders (`$ARGUMENTS`, `$1`, `$2`, etc.) for dynamic content.
|
|
653
|
-
|
|
656
|
+
|
|
657
|
+
- **File Selections**: Save file/directory selections in `.acai/selections/`
|
|
654
658
|
- **Memory/Rules**: Persistent project rules stored in `.acai/rules/`
|
|
655
659
|
|
|
656
660
|
### Global Configuration
|
|
@@ -675,6 +679,19 @@ acai
|
|
|
675
679
|
LOG_LEVEL=warn acai
|
|
676
680
|
```
|
|
677
681
|
|
|
682
|
+
## Web Skills
|
|
683
|
+
|
|
684
|
+
Acai's web functionality has been moved to standalone skills that operate independently of the core codebase. These skills provide web-related capabilities while keeping the main acai-ts project lightweight and focused.
|
|
685
|
+
|
|
686
|
+
### Skill Locations
|
|
687
|
+
|
|
688
|
+
Web skills are located in:
|
|
689
|
+
- `~/.acai/skills/web-fetch/` - User-level web fetch skill
|
|
690
|
+
- `~/.acai/skills/web-search/` - User-level web search skill
|
|
691
|
+
- `<project>/.acai/skills/web-fetch/` - Project-level web fetch skill
|
|
692
|
+
- `<project>/.acai/skills/web-search/` - Project-level web search skill
|
|
693
|
+
|
|
694
|
+
|
|
678
695
|
## ⚙️ Development
|
|
679
696
|
|
|
680
697
|
### Development Environment Setup
|
|
@@ -733,7 +750,7 @@ The project is organized as follows:
|
|
|
733
750
|
|
|
734
751
|
```
|
|
735
752
|
.
|
|
736
|
-
├── .acai/ # Internal configuration
|
|
753
|
+
├── .acai/ # Internal configuration and temporary files
|
|
737
754
|
├── source/ # Main application source code
|
|
738
755
|
│ ├── agent/ # Agent loop and manual execution
|
|
739
756
|
│ ├── api/ # External API integrations (e.g., Exa)
|
package/dist/agent/index.d.ts
CHANGED
|
@@ -1,24 +1,20 @@
|
|
|
1
|
-
import type { LanguageModelUsage, ToolExecuteFunction } from "ai";
|
|
2
|
-
import { type ToolCallRepairFunction } from "ai";
|
|
3
|
-
import type { MessageHistory } from "../messages.ts";
|
|
4
1
|
import type { ModelManager } from "../models/manager.ts";
|
|
5
2
|
import type { ModelMetadata } from "../models/providers.ts";
|
|
3
|
+
import type { SessionManager } from "../sessions/manager.ts";
|
|
6
4
|
import type { TokenTracker } from "../tokens/tracker.ts";
|
|
7
5
|
import type { CompleteToolNames, CompleteToolSet } from "../tools/index.ts";
|
|
8
6
|
type AgentOptions = {
|
|
9
7
|
modelManager: ModelManager;
|
|
10
8
|
tokenTracker: TokenTracker;
|
|
11
|
-
|
|
9
|
+
sessionManager: SessionManager;
|
|
12
10
|
maxIterations?: number;
|
|
13
11
|
maxRetries?: number;
|
|
14
|
-
toolCallRepair?: ToolCallRepairFunction<CompleteToolSet>;
|
|
15
12
|
};
|
|
16
13
|
type RunOptions = {
|
|
17
14
|
systemPrompt: string;
|
|
18
15
|
input: string;
|
|
19
|
-
|
|
16
|
+
tools: CompleteToolSet;
|
|
20
17
|
activeTools?: CompleteToolNames[];
|
|
21
|
-
executors: Map<keyof CompleteToolSet, ToolExecuteFunction<unknown, string>>;
|
|
22
18
|
abortSignal?: AbortSignal;
|
|
23
19
|
};
|
|
24
20
|
export type ToolEvent = {
|
|
@@ -27,18 +23,6 @@ export type ToolEvent = {
|
|
|
27
23
|
toolCallId: string;
|
|
28
24
|
msg: string;
|
|
29
25
|
args: unknown;
|
|
30
|
-
} | {
|
|
31
|
-
type: "tool-call-init";
|
|
32
|
-
name: string;
|
|
33
|
-
toolCallId: string;
|
|
34
|
-
msg: string;
|
|
35
|
-
args: unknown;
|
|
36
|
-
} | {
|
|
37
|
-
type: "tool-call-update";
|
|
38
|
-
name: string;
|
|
39
|
-
toolCallId: string;
|
|
40
|
-
msg: string;
|
|
41
|
-
args: unknown;
|
|
42
26
|
} | {
|
|
43
27
|
type: "tool-call-end";
|
|
44
28
|
name: string;
|
|
@@ -94,6 +78,22 @@ export type AgentEvent = {
|
|
|
94
78
|
role: "assistant";
|
|
95
79
|
content: string;
|
|
96
80
|
} | ToolCallLifeCycle;
|
|
81
|
+
type ModelUsage = {
|
|
82
|
+
inputTokens: number;
|
|
83
|
+
outputTokens: number;
|
|
84
|
+
totalTokens: number;
|
|
85
|
+
cachedInputTokens: number;
|
|
86
|
+
reasoningTokens: number;
|
|
87
|
+
inputTokenDetails: {
|
|
88
|
+
noCacheTokens: number;
|
|
89
|
+
cacheReadTokens: number;
|
|
90
|
+
cacheWriteTokens: number;
|
|
91
|
+
};
|
|
92
|
+
outputTokenDetails: {
|
|
93
|
+
textTokens: number;
|
|
94
|
+
reasoningTokens: number;
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
97
|
export type AgentState = {
|
|
98
98
|
modelId: string;
|
|
99
99
|
modelConfig: ModelMetadata;
|
|
@@ -105,12 +105,8 @@ export type AgentState = {
|
|
|
105
105
|
toolName: string;
|
|
106
106
|
}>;
|
|
107
107
|
}[];
|
|
108
|
-
usage:
|
|
109
|
-
|
|
110
|
-
};
|
|
111
|
-
totalUsage: {
|
|
112
|
-
[K in keyof LanguageModelUsage]-?: number;
|
|
113
|
-
};
|
|
108
|
+
usage: ModelUsage;
|
|
109
|
+
totalUsage: ModelUsage;
|
|
114
110
|
timestamps: {
|
|
115
111
|
start: number;
|
|
116
112
|
stop: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/agent/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/agent/index.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/index.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import { NoOutputGeneratedError, streamText, } from "ai";
|
|
1
|
+
import { generateText, InvalidToolInputError, NoOutputGeneratedError, NoSuchToolError, Output, streamText, tool, } from "ai";
|
|
2
2
|
import { config } from "../config.js";
|
|
3
3
|
import { logger } from "../logger.js";
|
|
4
4
|
import { AiConfig } from "../models/ai-config.js";
|
|
5
|
-
import { isToolMessage } from "../tools/types.js";
|
|
6
|
-
import { isAsyncIterable } from "../utils/iterables.js";
|
|
7
5
|
export class Agent {
|
|
8
6
|
opts;
|
|
9
7
|
_state;
|
|
@@ -20,10 +18,10 @@ export class Agent {
|
|
|
20
18
|
return this.abortController.signal;
|
|
21
19
|
}
|
|
22
20
|
async *run(args) {
|
|
23
|
-
const { modelManager,
|
|
21
|
+
const { modelManager, sessionManager, tokenTracker, maxIterations = (await config.getConfig()).loop.maxIterations, maxRetries = 2, } = this.opts;
|
|
24
22
|
this.resetState();
|
|
25
23
|
this._state.timestamps.start = performance.now();
|
|
26
|
-
const { systemPrompt, input,
|
|
24
|
+
const { systemPrompt, input, tools, activeTools, abortSignal } = args;
|
|
27
25
|
const langModel = modelManager.getModel("repl");
|
|
28
26
|
const modelConfig = modelManager.getModelMetadata("repl");
|
|
29
27
|
const aiConfig = new AiConfig({
|
|
@@ -63,22 +61,34 @@ export class Agent {
|
|
|
63
61
|
model: langModel,
|
|
64
62
|
maxOutputTokens: aiConfig.maxOutputTokens(),
|
|
65
63
|
system: systemPrompt,
|
|
66
|
-
messages:
|
|
64
|
+
messages: sessionManager.get(),
|
|
67
65
|
temperature: aiConfig.temperature(),
|
|
68
66
|
topP: aiConfig.topP(),
|
|
69
67
|
maxRetries: 2,
|
|
70
68
|
providerOptions: aiConfig.providerOptions(),
|
|
71
|
-
tools:
|
|
69
|
+
tools: Object.fromEntries(
|
|
70
|
+
// biome-ignore lint/suspicious/noExplicitAny: temporary
|
|
71
|
+
Object.entries(tools).map((t) => [t[0], tool(t[1].toolDef)])),
|
|
72
72
|
activeTools,
|
|
73
|
-
// biome-ignore lint/style/useNamingConvention: third-party
|
|
74
|
-
experimental_repairToolCall: toolCallRepair,
|
|
73
|
+
// biome-ignore lint/style/useNamingConvention: third-party controlled
|
|
74
|
+
experimental_repairToolCall: toolCallRepair(modelManager),
|
|
75
75
|
abortSignal,
|
|
76
76
|
onAbort: ({ steps }) => {
|
|
77
77
|
logger.debug(`Aborting and processing ${steps.length} steps`);
|
|
78
78
|
steps.forEach((step) => {
|
|
79
|
-
|
|
79
|
+
sessionManager.appendResponseMessages(step.response.messages);
|
|
80
80
|
});
|
|
81
81
|
},
|
|
82
|
+
onError({ error }) {
|
|
83
|
+
if (typeof error === "object" &&
|
|
84
|
+
error != null &&
|
|
85
|
+
"message" in error) {
|
|
86
|
+
logger.error(error.message);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
logger.error(error);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
82
92
|
});
|
|
83
93
|
let accumulatedText = "";
|
|
84
94
|
let accumulatedReasoning = "";
|
|
@@ -134,11 +144,13 @@ export class Agent {
|
|
|
134
144
|
else if (chunk.type === "tool-call") {
|
|
135
145
|
const call = chunk;
|
|
136
146
|
const toolName = call.toolName;
|
|
147
|
+
const iTool = tools[toolName];
|
|
137
148
|
yield this.processToolEvent(toolsCalled, {
|
|
138
149
|
type: "tool-call-start",
|
|
139
150
|
name: toolName,
|
|
140
151
|
toolCallId: call.toolCallId,
|
|
141
|
-
|
|
152
|
+
// biome-ignore lint/suspicious/noExplicitAny: unknown
|
|
153
|
+
msg: iTool ? iTool.display(call.input) : "",
|
|
142
154
|
args: call.input,
|
|
143
155
|
});
|
|
144
156
|
if (call.invalid) {
|
|
@@ -155,87 +167,26 @@ export class Agent {
|
|
|
155
167
|
try {
|
|
156
168
|
thisStepToolCalls.push({ toolName });
|
|
157
169
|
thisStepToolResults.push({ toolName });
|
|
158
|
-
const
|
|
159
|
-
if (!
|
|
170
|
+
const iTool = tools[toolName];
|
|
171
|
+
if (!iTool) {
|
|
160
172
|
resultOutput = `No executor for tool ${toolName}`;
|
|
161
173
|
}
|
|
162
174
|
else {
|
|
175
|
+
const toolExec = iTool.execute;
|
|
163
176
|
try {
|
|
164
177
|
const output = await toolExec(call.input, {
|
|
165
178
|
toolCallId: call.toolCallId,
|
|
166
|
-
messages:
|
|
179
|
+
messages: sessionManager.get(),
|
|
167
180
|
abortSignal,
|
|
168
181
|
});
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
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
|
-
});
|
|
238
|
-
}
|
|
182
|
+
resultOutput = formatToolResult(output);
|
|
183
|
+
yield this.processToolEvent(toolsCalled, {
|
|
184
|
+
type: "tool-call-end",
|
|
185
|
+
name: call.toolName,
|
|
186
|
+
toolCallId: call.toolCallId,
|
|
187
|
+
msg: resultOutput,
|
|
188
|
+
args: call.input,
|
|
189
|
+
});
|
|
239
190
|
}
|
|
240
191
|
catch (err) {
|
|
241
192
|
resultOutput = `Tool error: ${err instanceof Error ? err.message : String(err)}`;
|
|
@@ -278,21 +229,23 @@ export class Agent {
|
|
|
278
229
|
// Get response and tool calls
|
|
279
230
|
const response = await result.response;
|
|
280
231
|
const responseMessages = response.messages;
|
|
281
|
-
|
|
232
|
+
sessionManager.appendResponseMessages(responseMessages);
|
|
282
233
|
const stepUsage = await result.usage;
|
|
283
234
|
this._state.usage.inputTokens = stepUsage.inputTokens ?? 0;
|
|
284
235
|
this._state.usage.outputTokens = stepUsage.outputTokens ?? 0;
|
|
285
236
|
this._state.usage.totalTokens = stepUsage.totalTokens ?? 0;
|
|
286
|
-
this._state.usage.cachedInputTokens =
|
|
287
|
-
|
|
288
|
-
|
|
237
|
+
this._state.usage.cachedInputTokens =
|
|
238
|
+
stepUsage.inputTokenDetails.cacheReadTokens ?? 0;
|
|
239
|
+
this._state.usage.reasoningTokens =
|
|
240
|
+
stepUsage.outputTokenDetails.reasoningTokens ?? 0;
|
|
241
|
+
sessionManager.setContextWindow(stepUsage.totalTokens ?? 0);
|
|
289
242
|
this._state.totalUsage.inputTokens += stepUsage.inputTokens ?? 0;
|
|
290
243
|
this._state.totalUsage.outputTokens += stepUsage.outputTokens ?? 0;
|
|
291
244
|
this._state.totalUsage.totalTokens += stepUsage.totalTokens ?? 0;
|
|
292
245
|
this._state.totalUsage.cachedInputTokens +=
|
|
293
|
-
stepUsage.
|
|
246
|
+
stepUsage.inputTokenDetails.cacheReadTokens ?? 0;
|
|
294
247
|
this._state.totalUsage.reasoningTokens +=
|
|
295
|
-
stepUsage.reasoningTokens ?? 0;
|
|
248
|
+
stepUsage.outputTokenDetails.reasoningTokens ?? 0;
|
|
296
249
|
// If finishReason is not tool-calls, break
|
|
297
250
|
const finishReason = await result.finishReason;
|
|
298
251
|
if (finishReason !== "tool-calls") {
|
|
@@ -302,7 +255,7 @@ export class Agent {
|
|
|
302
255
|
hasEmittedTerminalEvent = true;
|
|
303
256
|
break;
|
|
304
257
|
}
|
|
305
|
-
|
|
258
|
+
sessionManager.appendToolMessages(toolMessages);
|
|
306
259
|
// Consume the rest of the team if necessary
|
|
307
260
|
// await result.consumeStream();
|
|
308
261
|
yield {
|
|
@@ -313,18 +266,29 @@ export class Agent {
|
|
|
313
266
|
}
|
|
314
267
|
catch (error) {
|
|
315
268
|
consecutiveErrors += 1;
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
269
|
+
// Handle AI SDK invalid tool input errors gracefully
|
|
270
|
+
if (InvalidToolInputError.isInstance(error)) {
|
|
271
|
+
logger.warn(error, `Invalid tool input detected - returning error to allow recovery (attempt ${consecutiveErrors}/${maxRetries + 1})`);
|
|
272
|
+
yield {
|
|
273
|
+
type: "agent-error",
|
|
274
|
+
message: `Tool input validation failed: ${error.message}. Try again with valid arguments.`,
|
|
275
|
+
};
|
|
276
|
+
// Continue loop to allow user to provide corrected input
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
logger.error(error, // Log the full error object
|
|
280
|
+
`Error on manual agent loop streamText (attempt ${consecutiveErrors}/${maxRetries + 1})`);
|
|
281
|
+
const errorMsg = error.message.length > 100
|
|
282
|
+
? `${error.message.slice(0, 100)}...`
|
|
283
|
+
: error.message;
|
|
284
|
+
yield {
|
|
285
|
+
type: "agent-error",
|
|
286
|
+
message: errorMsg,
|
|
287
|
+
};
|
|
288
|
+
if (NoOutputGeneratedError.isInstance(error)) {
|
|
289
|
+
hasEmittedTerminalEvent = true;
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
328
292
|
}
|
|
329
293
|
// Break loop if we exceed max retries
|
|
330
294
|
if (consecutiveErrors > maxRetries) {
|
|
@@ -356,7 +320,7 @@ export class Agent {
|
|
|
356
320
|
}
|
|
357
321
|
resetState() {
|
|
358
322
|
const { modelManager,
|
|
359
|
-
//
|
|
323
|
+
// sessionManager,
|
|
360
324
|
} = this.opts;
|
|
361
325
|
this._state = {
|
|
362
326
|
modelId: modelManager.getModel("repl").modelId,
|
|
@@ -367,6 +331,15 @@ export class Agent {
|
|
|
367
331
|
totalTokens: 0,
|
|
368
332
|
reasoningTokens: 0,
|
|
369
333
|
cachedInputTokens: 0,
|
|
334
|
+
inputTokenDetails: {
|
|
335
|
+
noCacheTokens: 0,
|
|
336
|
+
cacheReadTokens: 0,
|
|
337
|
+
cacheWriteTokens: 0,
|
|
338
|
+
},
|
|
339
|
+
outputTokenDetails: {
|
|
340
|
+
textTokens: 0,
|
|
341
|
+
reasoningTokens: 0,
|
|
342
|
+
},
|
|
370
343
|
},
|
|
371
344
|
totalUsage: {
|
|
372
345
|
inputTokens: 0,
|
|
@@ -374,6 +347,15 @@ export class Agent {
|
|
|
374
347
|
totalTokens: 0,
|
|
375
348
|
reasoningTokens: 0,
|
|
376
349
|
cachedInputTokens: 0,
|
|
350
|
+
inputTokenDetails: {
|
|
351
|
+
noCacheTokens: 0,
|
|
352
|
+
cacheReadTokens: 0,
|
|
353
|
+
cacheWriteTokens: 0,
|
|
354
|
+
},
|
|
355
|
+
outputTokenDetails: {
|
|
356
|
+
textTokens: 0,
|
|
357
|
+
reasoningTokens: 0,
|
|
358
|
+
},
|
|
377
359
|
},
|
|
378
360
|
steps: [],
|
|
379
361
|
timestamps: {
|
|
@@ -432,3 +414,32 @@ function formatToolResult(value) {
|
|
|
432
414
|
}
|
|
433
415
|
return String(value);
|
|
434
416
|
}
|
|
417
|
+
const toolCallRepair = (modelManager) => {
|
|
418
|
+
const fn = async ({ toolCall, tools, inputSchema, error, }) => {
|
|
419
|
+
if (NoSuchToolError.isInstance(error)) {
|
|
420
|
+
return null; // do not attempt to fix invalid tool names
|
|
421
|
+
}
|
|
422
|
+
const tool = tools[toolCall.toolName];
|
|
423
|
+
try {
|
|
424
|
+
const { output: repairedArgs } = await generateText({
|
|
425
|
+
model: modelManager.getModel("tool-repair"),
|
|
426
|
+
output: Output.object({
|
|
427
|
+
schema: tool.inputSchema,
|
|
428
|
+
}),
|
|
429
|
+
prompt: [
|
|
430
|
+
`The model tried to call the tool "${toolCall.toolName}" with the following arguments:`,
|
|
431
|
+
JSON.stringify(toolCall.input),
|
|
432
|
+
"The tool accepts the following schema:",
|
|
433
|
+
JSON.stringify(inputSchema(toolCall)),
|
|
434
|
+
"Please fix the arguments.",
|
|
435
|
+
].join("\n"),
|
|
436
|
+
});
|
|
437
|
+
return { ...toolCall, args: JSON.stringify(repairedArgs) };
|
|
438
|
+
}
|
|
439
|
+
catch (err) {
|
|
440
|
+
logger.error(err, `Failed to repair tool call: ${toolCall.toolName}.`);
|
|
441
|
+
return null;
|
|
442
|
+
}
|
|
443
|
+
};
|
|
444
|
+
return fn;
|
|
445
|
+
};
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { WorkspaceContext } from "./index.ts";
|
|
2
|
-
import type { MessageHistory } from "./messages.ts";
|
|
3
2
|
import type { ModelManager } from "./models/manager.js";
|
|
4
3
|
import type { PromptManager } from "./prompts/manager.ts";
|
|
4
|
+
import type { SessionManager } from "./sessions/manager.ts";
|
|
5
5
|
import type { TokenCounter } from "./tokens/counter.ts";
|
|
6
6
|
import type { TokenTracker } from "./tokens/tracker.ts";
|
|
7
7
|
interface CliOptions {
|
|
8
|
-
messageHistory:
|
|
8
|
+
messageHistory: SessionManager;
|
|
9
9
|
promptManager: PromptManager;
|
|
10
10
|
modelManager: ModelManager;
|
|
11
11
|
tokenTracker: TokenTracker;
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../source/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../source/cli.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAQxD,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;AAUD,qBAAa,GAAG;IACd,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,aAAa,CAAU;gBACnB,OAAO,EAAE,UAAU;IAKzB,GAAG;CAsHV"}
|