@travisennis/acai 0.0.5 → 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 +190 -19
- package/bin/acai-wrapper.js +26 -0
- package/dist/agent/index.d.ts +132 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +434 -0
- package/dist/api/exa/index.js +1 -1
- package/dist/cli.d.ts +4 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +67 -40
- package/dist/commands/add-directory-command.d.ts +3 -0
- package/dist/commands/add-directory-command.d.ts.map +1 -0
- package/dist/commands/add-directory-command.js +54 -0
- 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 +18 -20
- 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 +7 -3
- package/dist/commands/compact-command.d.ts.map +1 -1
- package/dist/commands/compact-command.js +9 -5
- package/dist/commands/context-command.d.ts +3 -0
- package/dist/commands/context-command.d.ts.map +1 -0
- package/dist/commands/context-command.js +124 -0
- package/dist/commands/copy-command.d.ts.map +1 -1
- package/dist/commands/copy-command.js +14 -5
- 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 +21 -34
- 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 +18 -15
- 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 +9 -5
- 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 +20 -16
- 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 +307 -39
- package/dist/commands/handoff-command.d.ts +3 -0
- package/dist/commands/handoff-command.d.ts.map +1 -0
- package/dist/commands/handoff-command.js +191 -0
- 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 +49 -27
- 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 +25 -5
- package/dist/commands/history-command.d.ts +3 -0
- package/dist/commands/history-command.d.ts.map +1 -0
- package/dist/commands/history-command.js +458 -0
- package/dist/commands/init-command.d.ts +1 -1
- package/dist/commands/init-command.d.ts.map +1 -1
- package/dist/commands/init-command.js +40 -22
- 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 +15 -15
- package/dist/commands/list-directories-command.d.ts +3 -0
- package/dist/commands/list-directories-command.d.ts.map +1 -0
- package/dist/commands/list-directories-command.js +35 -0
- package/dist/commands/list-tools-command.d.ts.map +1 -1
- package/dist/commands/list-tools-command.js +61 -21
- package/dist/commands/manager.d.ts +9 -4
- package/dist/commands/manager.d.ts.map +1 -1
- package/dist/commands/manager.js +64 -39
- package/dist/commands/model-command.d.ts.map +1 -1
- package/dist/commands/model-command.js +201 -66
- 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 +23 -9
- package/dist/commands/pickup-command.d.ts +3 -0
- package/dist/commands/pickup-command.d.ts.map +1 -0
- package/dist/commands/pickup-command.js +109 -0
- 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 +191 -98
- package/dist/commands/remove-directory-command.d.ts +3 -0
- package/dist/commands/remove-directory-command.d.ts.map +1 -0
- package/dist/commands/remove-directory-command.js +55 -0
- package/dist/commands/reset-command.d.ts +1 -1
- package/dist/commands/reset-command.d.ts.map +1 -1
- package/dist/commands/reset-command.js +8 -5
- 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 +25 -22
- 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 +8 -3
- package/dist/commands/shell-command.d.ts.map +1 -1
- package/dist/commands/shell-command.js +45 -24
- package/dist/commands/types.d.ts +9 -7
- 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 +18 -7
- package/dist/config.d.ts +21 -11
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +90 -63
- 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 +127 -0
- package/dist/formatting.d.ts.map +1 -1
- package/dist/formatting.js +201 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +263 -102
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +47 -18
- package/dist/mentions.d.ts +2 -1
- package/dist/mentions.d.ts.map +1 -1
- package/dist/mentions.js +16 -1
- package/dist/messages.d.ts +11 -0
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +122 -21
- package/dist/middleware/cache.d.ts +3 -0
- package/dist/middleware/cache.d.ts.map +1 -0
- package/dist/middleware/cache.js +53 -0
- package/dist/middleware/index.d.ts +1 -0
- package/dist/middleware/index.d.ts.map +1 -1
- package/dist/middleware/index.js +1 -0
- package/dist/models/ai-config.d.ts +4 -2
- package/dist/models/ai-config.d.ts.map +1 -1
- package/dist/models/ai-config.js +12 -2
- package/dist/models/anthropic-provider.d.ts.map +1 -1
- package/dist/models/anthropic-provider.js +3 -67
- 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/manager.d.ts +2 -1
- package/dist/models/manager.d.ts.map +1 -1
- package/dist/models/manager.js +26 -2
- 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 +16 -22
- package/dist/models/openrouter-provider.d.ts.map +1 -1
- package/dist/models/openrouter-provider.js +175 -236
- 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 +10 -4
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +447 -70
- package/dist/repl/project-status-line.d.ts +3 -0
- package/dist/repl/project-status-line.d.ts.map +1 -0
- package/dist/repl/project-status-line.js +61 -0
- package/dist/repl/tool-call-repair.d.ts.map +1 -1
- package/dist/repl/tool-call-repair.js +8 -4
- package/dist/repl-new.d.ts +51 -0
- package/dist/repl-new.d.ts.map +1 -0
- package/dist/repl-new.js +354 -0
- 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 -94
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/index.js +2 -370
- package/dist/terminal/markdown.js +10 -5
- package/dist/terminal/select-prompt.d.ts +2 -2
- package/dist/terminal/select-prompt.d.ts.map +1 -1
- package/dist/terminal/select-prompt.js +47 -39
- package/dist/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 +20 -0
- package/dist/tokens/threshold.d.ts.map +1 -0
- package/dist/tokens/threshold.js +67 -0
- package/dist/tools/advanced-edit-file.d.ts +69 -0
- package/dist/tools/advanced-edit-file.d.ts.map +1 -0
- package/dist/tools/advanced-edit-file.js +285 -0
- package/dist/tools/agent.d.ts +16 -5
- package/dist/tools/agent.d.ts.map +1 -1
- package/dist/tools/agent.js +86 -59
- package/dist/tools/bash.d.ts +23 -12
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +243 -128
- 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 +21 -9
- package/dist/tools/code-interpreter.d.ts.map +1 -1
- package/dist/tools/code-interpreter.js +151 -134
- package/dist/tools/delete-file.d.ts +17 -10
- package/dist/tools/delete-file.d.ts.map +1 -1
- package/dist/tools/delete-file.js +60 -97
- package/dist/tools/directory-tree.d.ts +17 -12
- package/dist/tools/directory-tree.d.ts.map +1 -1
- package/dist/tools/directory-tree.js +57 -48
- package/dist/tools/dynamic-tool-loader.d.ts +16 -10
- package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
- package/dist/tools/dynamic-tool-loader.js +122 -130
- package/dist/tools/dynamic-tool-parser.d.ts +1 -0
- package/dist/tools/dynamic-tool-parser.d.ts.map +1 -1
- package/dist/tools/dynamic-tool-parser.js +1 -0
- package/dist/tools/edit-file.d.ts +35 -15
- package/dist/tools/edit-file.d.ts.map +1 -1
- package/dist/tools/edit-file.js +127 -114
- package/dist/tools/glob.d.ts +36 -0
- package/dist/tools/glob.d.ts.map +1 -0
- package/dist/tools/glob.js +154 -0
- package/dist/tools/grep.d.ts +73 -12
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +425 -165
- package/dist/tools/index.d.ts +220 -126
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +284 -135
- package/dist/tools/llm-edit-fixer.d.ts +24 -0
- package/dist/tools/llm-edit-fixer.d.ts.map +1 -0
- package/dist/tools/llm-edit-fixer.js +136 -0
- package/dist/tools/move-file.d.ts +19 -7
- package/dist/tools/move-file.d.ts.map +1 -1
- package/dist/tools/move-file.js +48 -34
- package/dist/tools/read-file.d.ts +47 -9
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +84 -70
- package/dist/tools/read-multiple-files.d.ts +17 -6
- package/dist/tools/read-multiple-files.d.ts.map +1 -1
- package/dist/tools/read-multiple-files.js +132 -72
- package/dist/tools/save-file.d.ts +45 -12
- package/dist/tools/save-file.d.ts.map +1 -1
- package/dist/tools/save-file.js +76 -101
- package/dist/tools/think.d.ts +15 -7
- package/dist/tools/think.d.ts.map +1 -1
- package/dist/tools/think.js +34 -20
- package/dist/tools/types.d.ts +8 -10
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +9 -0
- package/dist/tools/utils.d.ts +14 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +16 -0
- package/dist/tools/web-fetch.d.ts +11 -4
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +39 -38
- package/dist/tools/web-search.d.ts +15 -6
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +64 -31
- package/dist/tui/autocomplete.d.ts +44 -0
- package/dist/tui/autocomplete.d.ts.map +1 -0
- package/dist/tui/autocomplete.js +466 -0
- package/dist/tui/components/assistant-message.d.ts +18 -0
- package/dist/tui/components/assistant-message.d.ts.map +1 -0
- package/dist/tui/components/assistant-message.js +29 -0
- package/dist/tui/components/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 +106 -0
- package/dist/tui/components/editor.d.ts.map +1 -0
- package/dist/tui/components/editor.js +1220 -0
- package/dist/tui/components/footer.d.ts +12 -0
- package/dist/tui/components/footer.d.ts.map +1 -0
- package/dist/tui/components/footer.js +209 -0
- 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/input.d.ts +14 -0
- package/dist/tui/components/input.d.ts.map +1 -0
- package/dist/tui/components/input.js +122 -0
- package/dist/tui/components/loader.d.ts +23 -0
- package/dist/tui/components/loader.d.ts.map +1 -0
- package/dist/tui/components/loader.js +45 -0
- package/dist/tui/components/markdown.d.ts +106 -0
- package/dist/tui/components/markdown.d.ts.map +1 -0
- package/dist/tui/components/markdown.js +586 -0
- package/dist/tui/components/modal.d.ts +29 -0
- package/dist/tui/components/modal.d.ts.map +1 -0
- package/dist/tui/components/modal.js +263 -0
- 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 +17 -0
- package/dist/tui/components/prompt-status.d.ts.map +1 -0
- package/dist/tui/components/prompt-status.js +26 -0
- package/dist/tui/components/select-list.d.ts +48 -0
- package/dist/tui/components/select-list.d.ts.map +1 -0
- package/dist/tui/components/select-list.js +207 -0
- package/dist/tui/components/spacer.d.ts +16 -0
- package/dist/tui/components/spacer.d.ts.map +1 -0
- package/dist/tui/components/spacer.js +27 -0
- package/dist/tui/components/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/text.d.ts +26 -0
- package/dist/tui/components/text.d.ts.map +1 -0
- package/dist/tui/components/text.js +143 -0
- package/dist/tui/components/thinking-block.d.ts +14 -0
- package/dist/tui/components/thinking-block.d.ts.map +1 -0
- package/dist/tui/components/thinking-block.js +33 -0
- package/dist/tui/components/tool-execution.d.ts +21 -0
- package/dist/tui/components/tool-execution.d.ts.map +1 -0
- package/dist/tui/components/tool-execution.js +161 -0
- package/dist/tui/components/user-message.d.ts +9 -0
- package/dist/tui/components/user-message.d.ts.map +1 -0
- package/dist/tui/components/user-message.js +23 -0
- package/dist/tui/components/welcome.d.ts +6 -0
- package/dist/tui/components/welcome.d.ts.map +1 -0
- package/dist/tui/components/welcome.js +30 -0
- package/dist/tui/index.d.ts +18 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +22 -0
- package/dist/tui/terminal.d.ts +38 -0
- package/dist/tui/terminal.d.ts.map +1 -0
- package/dist/tui/terminal.js +94 -0
- package/dist/tui/tui.d.ts +69 -0
- package/dist/tui/tui.d.ts.map +1 -0
- package/dist/tui/tui.js +204 -0
- package/dist/tui/utils.d.ts +24 -0
- package/dist/tui/utils.d.ts.map +1 -0
- package/dist/tui/utils.js +111 -0
- package/dist/utils/bash.d.ts +7 -0
- package/dist/utils/bash.d.ts.map +1 -0
- package/dist/{tools/bash-utils.js → utils/bash.js} +31 -12
- package/dist/utils/{filesystem.d.ts → filesystem/operations.d.ts} +1 -1
- package/dist/utils/filesystem/operations.d.ts.map +1 -0
- package/dist/utils/filesystem/security.d.ts +9 -0
- package/dist/utils/filesystem/security.d.ts.map +1 -0
- package/dist/{tools/filesystem-utils.js → utils/filesystem/security.js} +93 -21
- 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/utils/generators.d.ts +3 -0
- package/dist/utils/generators.d.ts.map +1 -0
- package/dist/utils/generators.js +25 -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/iterables.d.ts +2 -0
- package/dist/utils/iterables.d.ts.map +1 -0
- package/dist/utils/iterables.js +6 -0
- package/dist/utils/{zod-utils.d.ts → zod.d.ts} +1 -1
- package/dist/utils/zod.d.ts.map +1 -0
- package/package.json +21 -21
- package/dist/conversation-analyzer.d.ts +0 -11
- package/dist/conversation-analyzer.d.ts.map +0 -1
- package/dist/conversation-analyzer.js +0 -88
- package/dist/repl/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 -55
- 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 -38
- package/dist/repl-prompt.d.ts +0 -15
- package/dist/repl-prompt.d.ts.map +0 -1
- package/dist/repl-prompt.js +0 -147
- package/dist/repl.d.ts +0 -31
- package/dist/repl.d.ts.map +0 -1
- package/dist/repl.js +0 -310
- 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 -362
- 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 -16
- 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 -279
- 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/tokens/manage-output.d.ts +0 -34
- package/dist/tokens/manage-output.d.ts.map +0 -1
- package/dist/tokens/manage-output.js +0 -44
- package/dist/tool-executor.d.ts +0 -28
- package/dist/tool-executor.d.ts.map +0 -1
- package/dist/tool-executor.js +0 -74
- package/dist/tools/bash-utils.d.ts +0 -7
- package/dist/tools/bash-utils.d.ts.map +0 -1
- package/dist/tools/file-editing-utils.d.ts +0 -2
- package/dist/tools/file-editing-utils.d.ts.map +0 -1
- package/dist/tools/file-editing-utils.js +0 -135
- package/dist/tools/filesystem-utils.d.ts +0 -7
- 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/messages.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
1
2
|
import EventEmitter from "node:events";
|
|
2
|
-
import { readdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
-
import { join } from "node:path";
|
|
3
|
+
import { mkdir, readdir, readFile, rename, stat, unlink, writeFile, } from "node:fs/promises";
|
|
4
|
+
import { basename, join } from "node:path";
|
|
4
5
|
import { isString } from "@travisennis/stdlib/typeguards";
|
|
5
6
|
import { generateText, } from "ai";
|
|
7
|
+
import { logger } from "./logger.js";
|
|
6
8
|
export function createUserMessage(contentItems, prompt) {
|
|
7
9
|
const messageParts = [];
|
|
8
10
|
// Process content items (images and pre-defined texts)
|
|
@@ -38,22 +40,36 @@ function createAssistantMessage(content) {
|
|
|
38
40
|
}
|
|
39
41
|
export class MessageHistory extends EventEmitter {
|
|
40
42
|
history;
|
|
43
|
+
sessionId;
|
|
44
|
+
modelId;
|
|
41
45
|
title;
|
|
42
46
|
createdAt;
|
|
43
47
|
updatedAt;
|
|
44
48
|
stateDir;
|
|
49
|
+
contextWindow;
|
|
45
50
|
modelManager;
|
|
46
51
|
tokenTracker;
|
|
47
52
|
constructor({ stateDir, modelManager, tokenTracker, }) {
|
|
48
53
|
super();
|
|
49
54
|
this.history = [];
|
|
55
|
+
this.sessionId = randomUUID();
|
|
56
|
+
this.modelId = "";
|
|
50
57
|
this.title = "";
|
|
51
58
|
this.createdAt = new Date();
|
|
52
59
|
this.updatedAt = new Date();
|
|
53
60
|
this.stateDir = stateDir;
|
|
61
|
+
this.contextWindow = 0;
|
|
54
62
|
this.modelManager = modelManager;
|
|
55
63
|
this.tokenTracker = tokenTracker;
|
|
56
64
|
}
|
|
65
|
+
create(modelId) {
|
|
66
|
+
this.clear();
|
|
67
|
+
this.modelId = modelId;
|
|
68
|
+
this.sessionId = randomUUID();
|
|
69
|
+
this.title = "";
|
|
70
|
+
this.createdAt = new Date();
|
|
71
|
+
this.updatedAt = new Date();
|
|
72
|
+
}
|
|
57
73
|
validMessage(msg) {
|
|
58
74
|
// Filter out messages with empty content arrays
|
|
59
75
|
if (Array.isArray(msg.content) && msg.content.length === 0) {
|
|
@@ -74,8 +90,18 @@ export class MessageHistory extends EventEmitter {
|
|
|
74
90
|
}
|
|
75
91
|
clear() {
|
|
76
92
|
this.history.length = 0;
|
|
93
|
+
this.contextWindow = 0;
|
|
77
94
|
this.emit("clear-history");
|
|
78
95
|
}
|
|
96
|
+
setContextWindow(contextWindow) {
|
|
97
|
+
if (contextWindow < 0) {
|
|
98
|
+
throw new Error("Context window cannot be negative");
|
|
99
|
+
}
|
|
100
|
+
this.contextWindow = contextWindow;
|
|
101
|
+
}
|
|
102
|
+
getContextWindow() {
|
|
103
|
+
return this.contextWindow;
|
|
104
|
+
}
|
|
79
105
|
appendUserMessage(msg) {
|
|
80
106
|
const now = new Date();
|
|
81
107
|
const msgObj = isString(msg) ? createUserMessage([], msg) : msg;
|
|
@@ -96,6 +122,10 @@ export class MessageHistory extends EventEmitter {
|
|
|
96
122
|
const msgObj = isString(msg) ? createAssistantMessage(msg) : msg;
|
|
97
123
|
this.history.push(msgObj);
|
|
98
124
|
}
|
|
125
|
+
appendToolMessages(toolResultMessages) {
|
|
126
|
+
this.updatedAt = new Date();
|
|
127
|
+
this.history.push(...toolResultMessages);
|
|
128
|
+
}
|
|
99
129
|
appendResponseMessages(responseMessages) {
|
|
100
130
|
this.updatedAt = new Date();
|
|
101
131
|
// Filter out messages with empty content arrays
|
|
@@ -107,16 +137,55 @@ export class MessageHistory extends EventEmitter {
|
|
|
107
137
|
}
|
|
108
138
|
async save() {
|
|
109
139
|
const msgHistoryDir = this.stateDir;
|
|
110
|
-
const
|
|
111
|
-
const fileName = `message-history-${timestamp}.json`;
|
|
140
|
+
const fileName = `message-history-${this.sessionId}.json`;
|
|
112
141
|
const filePath = join(msgHistoryDir, fileName);
|
|
142
|
+
const tempFilePath = `${filePath}.tmp`;
|
|
143
|
+
// Validate data before writing
|
|
144
|
+
if (!this.sessionId || this.sessionId.trim() === "") {
|
|
145
|
+
throw new Error("Cannot save: sessionId is empty");
|
|
146
|
+
}
|
|
147
|
+
if (!Array.isArray(this.history)) {
|
|
148
|
+
throw new Error("Cannot save: history is not an array");
|
|
149
|
+
}
|
|
150
|
+
const project = basename(process.cwd());
|
|
113
151
|
const output = {
|
|
152
|
+
project,
|
|
153
|
+
sessionId: this.sessionId,
|
|
154
|
+
modelId: this.modelId,
|
|
114
155
|
title: this.title,
|
|
115
156
|
createdAt: this.createdAt,
|
|
116
157
|
updatedAt: this.updatedAt,
|
|
117
158
|
messages: this.history,
|
|
118
159
|
};
|
|
119
|
-
|
|
160
|
+
try {
|
|
161
|
+
// Ensure directory exists
|
|
162
|
+
await mkdir(msgHistoryDir, { recursive: true });
|
|
163
|
+
// Write to temporary file first
|
|
164
|
+
await writeFile(tempFilePath, JSON.stringify(output, null, 2));
|
|
165
|
+
// Atomically rename to final file
|
|
166
|
+
await rename(tempFilePath, filePath);
|
|
167
|
+
logger.info(`Message history saved to ${filePath}`);
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
// Clean up temp file if it exists
|
|
171
|
+
try {
|
|
172
|
+
await unlink(tempFilePath);
|
|
173
|
+
}
|
|
174
|
+
catch (_cleanupError) {
|
|
175
|
+
// Ignore cleanup errors
|
|
176
|
+
}
|
|
177
|
+
// Check if it's an ENOENT error from rename (temp file doesn't exist)
|
|
178
|
+
if (error instanceof Error &&
|
|
179
|
+
"code" in error &&
|
|
180
|
+
error.code === "ENOENT") {
|
|
181
|
+
logger.warn(`Temp file missing during save for ${filePath}, write may have been interrupted`);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
logger.error(error, `Failed to save message history to ${filePath}:`);
|
|
185
|
+
// Don't throw - just log. This is called from interrupt handlers
|
|
186
|
+
// and we don't want to crash the program on save failure.
|
|
187
|
+
}
|
|
188
|
+
}
|
|
120
189
|
}
|
|
121
190
|
async generateTitle(message) {
|
|
122
191
|
// Skip title generation if message is empty
|
|
@@ -129,6 +198,7 @@ export class MessageHistory extends EventEmitter {
|
|
|
129
198
|
const { text, usage } = await generateText({
|
|
130
199
|
model: this.modelManager.getModel(app),
|
|
131
200
|
system: systemPrompt,
|
|
201
|
+
maxOutputTokens: 100,
|
|
132
202
|
prompt: `Request:\n${message}\nTitle:`,
|
|
133
203
|
});
|
|
134
204
|
this.tokenTracker.trackUsage(app, usage);
|
|
@@ -145,6 +215,10 @@ export class MessageHistory extends EventEmitter {
|
|
|
145
215
|
const firstUser = this.get().find((msg) => msg.role === "user");
|
|
146
216
|
return firstUser;
|
|
147
217
|
}
|
|
218
|
+
getLastUserMessage() {
|
|
219
|
+
const userMsg = this.history.findLast((value) => value.role === "user");
|
|
220
|
+
return userMsg;
|
|
221
|
+
}
|
|
148
222
|
/**
|
|
149
223
|
* Extracts the last message from the conversation history for display purposes.
|
|
150
224
|
* Prioritizes assistant messages, falls back to user messages if no assistant messages exist.
|
|
@@ -180,19 +254,44 @@ export class MessageHistory extends EventEmitter {
|
|
|
180
254
|
static async load(stateDir, count = 10) {
|
|
181
255
|
try {
|
|
182
256
|
const files = await readdir(stateDir);
|
|
183
|
-
const messageHistoryFiles = files
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
257
|
+
const messageHistoryFiles = files.filter((file) => file.startsWith("message-history-") && file.endsWith(".json"));
|
|
258
|
+
// Get file stats and sort by modification time (newest first)
|
|
259
|
+
const fileStatsPromises = messageHistoryFiles.map(async (fileName) => {
|
|
260
|
+
const filePath = join(stateDir, fileName);
|
|
261
|
+
try {
|
|
262
|
+
const fileStat = await stat(filePath);
|
|
263
|
+
return {
|
|
264
|
+
fileName,
|
|
265
|
+
filePath,
|
|
266
|
+
modifiedTime: fileStat.mtime,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
console.error(`Error getting stats for file ${filePath}:`, error);
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
const fileStats = await Promise.all(fileStatsPromises);
|
|
275
|
+
// Filter out null results and sort by modification time (newest first)
|
|
276
|
+
const sortedFiles = fileStats
|
|
277
|
+
.filter((stat) => stat !== null)
|
|
278
|
+
.sort((a, b) => b.modifiedTime.getTime() - a.modifiedTime.getTime())
|
|
279
|
+
.slice(0, count)
|
|
280
|
+
.map((stat) => stat.fileName);
|
|
281
|
+
const fileReadPromises = sortedFiles.map(async (fileName) => {
|
|
193
282
|
const filePath = join(stateDir, fileName);
|
|
194
283
|
try {
|
|
284
|
+
// Check file stats first to avoid reading empty files
|
|
285
|
+
const stats = await stat(filePath);
|
|
286
|
+
if (stats.size === 0) {
|
|
287
|
+
// Silently skip empty files - they're likely from interrupted saves
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
195
290
|
const content = await readFile(filePath, "utf-8");
|
|
291
|
+
// Skip files that only contain whitespace
|
|
292
|
+
if (content.trim().length === 0) {
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
196
295
|
const parsed = JSON.parse(content);
|
|
197
296
|
const result = parsed;
|
|
198
297
|
// Basic validation - ensure messages array exists
|
|
@@ -204,16 +303,18 @@ export class MessageHistory extends EventEmitter {
|
|
|
204
303
|
}
|
|
205
304
|
}
|
|
206
305
|
catch (error) {
|
|
207
|
-
|
|
306
|
+
// Only log unexpected errors, not empty/malformed JSON files
|
|
307
|
+
// which are common from interrupted saves
|
|
308
|
+
if (!(error instanceof SyntaxError) ||
|
|
309
|
+
!error.message.includes("Unexpected end of JSON input")) {
|
|
310
|
+
console.error(`Error reading or parsing file ${filePath}:`, error);
|
|
311
|
+
}
|
|
208
312
|
}
|
|
209
313
|
return null; // Return null for failed reads/parses
|
|
210
314
|
});
|
|
211
315
|
const results = await Promise.all(fileReadPromises);
|
|
212
|
-
// Filter out null results (
|
|
213
|
-
|
|
214
|
-
return results
|
|
215
|
-
.filter((result) => result !== null)
|
|
216
|
-
.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());
|
|
316
|
+
// Filter out null results and return them (already sorted by file modification time)
|
|
317
|
+
return results.filter((result) => result !== null);
|
|
217
318
|
}
|
|
218
319
|
catch (error) {
|
|
219
320
|
// Handle cases where the directory might not exist or other readdir errors
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../source/middleware/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EAE1B,MAAM,kBAAkB,CAAC;AAsB1B,eAAO,MAAM,eAAe,EAAE,yBAyC7B,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
function applyCaching(input) {
|
|
2
|
+
input.providerOptions = {
|
|
3
|
+
anthropic: { cacheControl: { type: "ephemeral" } },
|
|
4
|
+
openrouter: {
|
|
5
|
+
// biome-ignore lint/style/useNamingConvention: third-party
|
|
6
|
+
cache_control: { type: "ephemeral" },
|
|
7
|
+
cacheControl: { type: "ephemeral" },
|
|
8
|
+
},
|
|
9
|
+
bedrock: {
|
|
10
|
+
cachePoint: { type: "ephemeral" },
|
|
11
|
+
},
|
|
12
|
+
openaiCompatible: {
|
|
13
|
+
// biome-ignore lint/style/useNamingConvention: third-party
|
|
14
|
+
cache_control: { type: "ephemeral" },
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export const cacheMiddleware = {
|
|
19
|
+
transformParams: async ({ params, model }) => {
|
|
20
|
+
const providerId = model.provider;
|
|
21
|
+
const modelId = model.modelId;
|
|
22
|
+
if (providerId === "anthropic" ||
|
|
23
|
+
modelId.includes("anthropic") ||
|
|
24
|
+
modelId.includes("claude")) {
|
|
25
|
+
const msgs = params.prompt;
|
|
26
|
+
const system = msgs.filter((msg) => msg.role === "system").at(0);
|
|
27
|
+
if (system) {
|
|
28
|
+
applyCaching(system);
|
|
29
|
+
}
|
|
30
|
+
// Get the last two user messages for caching
|
|
31
|
+
const userMessages = msgs.filter((msg) => msg.role === "user");
|
|
32
|
+
const lastTwoUserMessages = userMessages.slice(-2);
|
|
33
|
+
// Mark both the latest and second-to-last user messages as ephemeral
|
|
34
|
+
for (const userMessage of lastTwoUserMessages) {
|
|
35
|
+
const content = userMessage.content;
|
|
36
|
+
if (Array.isArray(content)) {
|
|
37
|
+
const finalContent = content.at(-1);
|
|
38
|
+
if (finalContent) {
|
|
39
|
+
applyCaching(finalContent);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const tools = params.tools;
|
|
44
|
+
if (tools) {
|
|
45
|
+
const lastTool = tools.at(-1);
|
|
46
|
+
if (lastTool?.type === "function") {
|
|
47
|
+
applyCaching(lastTool);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return params;
|
|
52
|
+
},
|
|
53
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/middleware/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/middleware/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/middleware/index.js
CHANGED
|
@@ -7,7 +7,9 @@ export declare class AiConfig {
|
|
|
7
7
|
modelMetadata: ModelMetadata;
|
|
8
8
|
prompt: string;
|
|
9
9
|
});
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
maxOutputTokens(): number;
|
|
11
|
+
temperature(): number | undefined;
|
|
12
|
+
topP(): 1 | undefined;
|
|
13
|
+
providerOptions(): SharedV2ProviderMetadata;
|
|
12
14
|
}
|
|
13
15
|
//# sourceMappingURL=ai-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-config.d.ts","sourceRoot":"","sources":["../../source/models/ai-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AA2CpD,qBAAa,QAAQ;IACnB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAAS;gBACX,EACV,aAAa,EACb,MAAM,GACP,EAAE;QAAE,aAAa,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAKnD,
|
|
1
|
+
{"version":3,"file":"ai-config.d.ts","sourceRoot":"","sources":["../../source/models/ai-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AA2CpD,qBAAa,QAAQ;IACnB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAAS;gBACX,EACV,aAAa,EACb,MAAM,GACP,EAAE;QAAE,aAAa,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAKnD,eAAe;IAUf,WAAW;IAKX,IAAI;IAMJ,eAAe,IAAI,wBAAwB;CA2C5C"}
|
package/dist/models/ai-config.js
CHANGED
|
@@ -34,7 +34,7 @@ export class AiConfig {
|
|
|
34
34
|
this.modelMetadata = modelMetadata;
|
|
35
35
|
this.prompt = prompt;
|
|
36
36
|
}
|
|
37
|
-
|
|
37
|
+
maxOutputTokens() {
|
|
38
38
|
const modelConfig = this.modelMetadata;
|
|
39
39
|
const thinkingLevel = calculateThinkingLevel(this.prompt);
|
|
40
40
|
const maxTokens = modelConfig.provider === "anthropic" && modelConfig.supportsReasoning
|
|
@@ -42,7 +42,17 @@ export class AiConfig {
|
|
|
42
42
|
: modelConfig.maxOutputTokens;
|
|
43
43
|
return maxTokens;
|
|
44
44
|
}
|
|
45
|
-
|
|
45
|
+
temperature() {
|
|
46
|
+
const temp = this.modelMetadata.defaultTemperature;
|
|
47
|
+
return temp > -1 ? temp : undefined;
|
|
48
|
+
}
|
|
49
|
+
topP() {
|
|
50
|
+
const modelId = this.modelMetadata.id;
|
|
51
|
+
if (modelId.toLowerCase().includes("qwen"))
|
|
52
|
+
return 1;
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
providerOptions() {
|
|
46
56
|
const modelConfig = this.modelMetadata;
|
|
47
57
|
const thinkingLevel = calculateThinkingLevel(this.prompt);
|
|
48
58
|
if (modelConfig.supportsReasoning && thinkingLevel.effort !== "none") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-provider.d.ts","sourceRoot":"","sources":["../../source/models/anthropic-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"anthropic-provider.d.ts","sourceRoot":"","sources":["../../source/models/anthropic-provider.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,QAAA,MAAM,eAAe;;;;;;;;CAuBX,CAAC;AAEX,KAAK,SAAS,GAAG,aAAa,MAAM,OAAO,eAAe,EAAE,CAAC;AAE7D,eAAO,MAAM,mBAAmB,EAAE,SAAS,EAE1C,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;CAK7B,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE;KAClC,CAAC,IAAI,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;CAsF3C,CAAC"}
|
|
@@ -1,84 +1,27 @@
|
|
|
1
1
|
import { createAnthropic, anthropic as originalAnthropic, } from "@ai-sdk/anthropic";
|
|
2
2
|
import { objectKeys } from "@travisennis/stdlib/object";
|
|
3
|
-
import { isRecord } from "@travisennis/stdlib/typeguards";
|
|
4
3
|
import { customProvider } from "ai";
|
|
5
|
-
// Helper function copied from original providers.ts
|
|
6
|
-
function addCacheControlToTools(body) {
|
|
7
|
-
const parsedBody = JSON.parse(body);
|
|
8
|
-
if (isRecord(parsedBody)) {
|
|
9
|
-
const tools = parsedBody["tools"];
|
|
10
|
-
if (Array.isArray(tools)) {
|
|
11
|
-
tools.at(-1).cache_control = { type: "ephemeral" };
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
return JSON.stringify(parsedBody);
|
|
15
|
-
}
|
|
16
4
|
const anthropicModels = {
|
|
17
|
-
opus: createAnthropic(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
if (body && typeof body === "string") {
|
|
21
|
-
init.body = addCacheControlToTools(body);
|
|
22
|
-
}
|
|
23
|
-
return fetch(input, init);
|
|
24
|
-
},
|
|
25
|
-
})("claude-4-opus-20250514"),
|
|
26
|
-
sonnet: createAnthropic({
|
|
27
|
-
fetch(input, init) {
|
|
28
|
-
const body = init?.body;
|
|
29
|
-
if (body && typeof body === "string") {
|
|
30
|
-
init.body = addCacheControlToTools(body);
|
|
31
|
-
}
|
|
32
|
-
return fetch(input, init);
|
|
33
|
-
},
|
|
34
|
-
})("claude-4-sonnet-20250514"),
|
|
35
|
-
sonnet37: createAnthropic({
|
|
36
|
-
fetch(input, init) {
|
|
37
|
-
const body = init?.body;
|
|
38
|
-
if (body && typeof body === "string") {
|
|
39
|
-
init.body = addCacheControlToTools(body);
|
|
40
|
-
}
|
|
41
|
-
return fetch(input, init);
|
|
42
|
-
},
|
|
43
|
-
})("claude-3-7-sonnet-20250219"),
|
|
5
|
+
opus: createAnthropic()("claude-4-opus-20250514"),
|
|
6
|
+
sonnet: createAnthropic()("claude-4-sonnet-20250514"),
|
|
7
|
+
sonnet37: createAnthropic()("claude-3-7-sonnet-20250219"),
|
|
44
8
|
"sonnet37-token-efficient-tools": createAnthropic({
|
|
45
9
|
headers: {
|
|
46
10
|
"anthropic-version": "2023-06-01",
|
|
47
11
|
"anthropic-beta": "token-efficient-tools-2025-02-19",
|
|
48
12
|
},
|
|
49
|
-
fetch(input, init) {
|
|
50
|
-
const body = init?.body;
|
|
51
|
-
if (body && typeof body === "string") {
|
|
52
|
-
init.body = addCacheControlToTools(body);
|
|
53
|
-
}
|
|
54
|
-
return fetch(input, init);
|
|
55
|
-
},
|
|
56
13
|
})("claude-3-7-sonnet-20250219"),
|
|
57
14
|
"sonnet37-128k": createAnthropic({
|
|
58
15
|
headers: {
|
|
59
16
|
"anthropic-version": "2023-06-01",
|
|
60
17
|
"anthropic-beta": "output-128k-2025-02-19",
|
|
61
18
|
},
|
|
62
|
-
fetch(input, init) {
|
|
63
|
-
const body = init?.body;
|
|
64
|
-
if (body && typeof body === "string") {
|
|
65
|
-
init.body = addCacheControlToTools(body);
|
|
66
|
-
}
|
|
67
|
-
return fetch(input, init);
|
|
68
|
-
},
|
|
69
19
|
})("claude-3-7-sonnet-20250219"),
|
|
70
20
|
sonnet35: createAnthropic({
|
|
71
21
|
headers: {
|
|
72
22
|
"anthropic-version": "2023-06-01",
|
|
73
23
|
"anthropic-beta": "max-tokens-3-5-sonnet-2024-07-15",
|
|
74
24
|
},
|
|
75
|
-
fetch(input, init) {
|
|
76
|
-
const body = init?.body;
|
|
77
|
-
if (body && typeof body === "string") {
|
|
78
|
-
init.body = addCacheControlToTools(body);
|
|
79
|
-
}
|
|
80
|
-
return fetch(input, init);
|
|
81
|
-
},
|
|
82
25
|
})("claude-3-5-sonnet-20241022"),
|
|
83
26
|
haiku: originalAnthropic("claude-3-5-haiku-20241022"),
|
|
84
27
|
};
|
|
@@ -101,7 +44,6 @@ export const anthropicModelRegistry = {
|
|
|
101
44
|
supportsToolCalling: true,
|
|
102
45
|
costPerInputToken: 0.000015,
|
|
103
46
|
costPerOutputToken: 0.000075,
|
|
104
|
-
category: "powerful",
|
|
105
47
|
},
|
|
106
48
|
"anthropic:sonnet": {
|
|
107
49
|
id: "anthropic:sonnet",
|
|
@@ -114,7 +56,6 @@ export const anthropicModelRegistry = {
|
|
|
114
56
|
supportsToolCalling: true,
|
|
115
57
|
costPerInputToken: 0.000003,
|
|
116
58
|
costPerOutputToken: 0.000015,
|
|
117
|
-
category: "balanced",
|
|
118
59
|
},
|
|
119
60
|
"anthropic:sonnet37": {
|
|
120
61
|
id: "anthropic:sonnet37",
|
|
@@ -127,7 +68,6 @@ export const anthropicModelRegistry = {
|
|
|
127
68
|
supportsToolCalling: true,
|
|
128
69
|
costPerInputToken: 0.000003,
|
|
129
70
|
costPerOutputToken: 0.000015,
|
|
130
|
-
category: "balanced",
|
|
131
71
|
},
|
|
132
72
|
"anthropic:sonnet37-token-efficient-tools": {
|
|
133
73
|
id: "anthropic:sonnet37-token-efficient-tools",
|
|
@@ -140,7 +80,6 @@ export const anthropicModelRegistry = {
|
|
|
140
80
|
supportsToolCalling: true,
|
|
141
81
|
costPerInputToken: 0.000003,
|
|
142
82
|
costPerOutputToken: 0.000015,
|
|
143
|
-
category: "balanced",
|
|
144
83
|
},
|
|
145
84
|
"anthropic:sonnet37-128k": {
|
|
146
85
|
id: "anthropic:sonnet37-128k",
|
|
@@ -153,7 +92,6 @@ export const anthropicModelRegistry = {
|
|
|
153
92
|
supportsToolCalling: true,
|
|
154
93
|
costPerInputToken: 0.000003,
|
|
155
94
|
costPerOutputToken: 0.000015,
|
|
156
|
-
category: "powerful",
|
|
157
95
|
},
|
|
158
96
|
"anthropic:sonnet35": {
|
|
159
97
|
id: "anthropic:sonnet35",
|
|
@@ -166,7 +104,6 @@ export const anthropicModelRegistry = {
|
|
|
166
104
|
supportsToolCalling: true,
|
|
167
105
|
costPerInputToken: 0.000003,
|
|
168
106
|
costPerOutputToken: 0.000015,
|
|
169
|
-
category: "balanced",
|
|
170
107
|
},
|
|
171
108
|
"anthropic:haiku": {
|
|
172
109
|
id: "anthropic:haiku",
|
|
@@ -179,6 +116,5 @@ export const anthropicModelRegistry = {
|
|
|
179
116
|
supportsToolCalling: true,
|
|
180
117
|
costPerInputToken: 0.0000008,
|
|
181
118
|
costPerOutputToken: 0.000004,
|
|
182
|
-
category: "fast",
|
|
183
119
|
},
|
|
184
120
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepseek-provider.d.ts","sourceRoot":"","sources":["../../source/models/deepseek-provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,QAAA,MAAM,cAAc;;;CAGV,CAAC;AAEX,KAAK,SAAS,GAAG,YAAY,MAAM,OAAO,cAAc,EAAE,CAAC;AAE3D,eAAO,MAAM,kBAAkB,EAAE,SAAS,EAEzC,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;CAK5B,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE;KACjC,CAAC,IAAI,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"deepseek-provider.d.ts","sourceRoot":"","sources":["../../source/models/deepseek-provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,QAAA,MAAM,cAAc;;;CAGV,CAAC;AAEX,KAAK,SAAS,GAAG,YAAY,MAAM,OAAO,cAAc,EAAE,CAAC;AAE3D,eAAO,MAAM,kBAAkB,EAAE,SAAS,EAEzC,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;CAK5B,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE;KACjC,CAAC,IAAI,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;CA0B3C,CAAC"}
|
|
@@ -24,7 +24,6 @@ export const deepseekModelRegistry = {
|
|
|
24
24
|
supportsToolCalling: true,
|
|
25
25
|
costPerInputToken: 0.0000012, // Check official pricing
|
|
26
26
|
costPerOutputToken: 0.0000012, // Check official pricing
|
|
27
|
-
category: "balanced",
|
|
28
27
|
},
|
|
29
28
|
"deepseek:deepseek-reasoner": {
|
|
30
29
|
id: "deepseek:deepseek-reasoner",
|
|
@@ -37,6 +36,5 @@ export const deepseekModelRegistry = {
|
|
|
37
36
|
supportsToolCalling: true, // Check if this model supports tools
|
|
38
37
|
costPerInputToken: 0.00000055, // Check official pricing
|
|
39
38
|
costPerOutputToken: 0.00000219, // Check official pricing
|
|
40
|
-
category: "balanced",
|
|
41
39
|
},
|
|
42
40
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-provider.d.ts","sourceRoot":"","sources":["../../source/models/google-provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,QAAA,MAAM,YAAY;;;;CAIR,CAAC;AAEX,KAAK,SAAS,GAAG,UAAU,MAAM,OAAO,YAAY,EAAE,CAAC;AAEvD,eAAO,MAAM,gBAAgB,EAAE,SAAS,EAEvC,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;;CAK1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CACtC,SAAS,EACT,aAAa,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"google-provider.d.ts","sourceRoot":"","sources":["../../source/models/google-provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,QAAA,MAAM,YAAY;;;;CAIR,CAAC;AAEX,KAAK,SAAS,GAAG,UAAU,MAAM,OAAO,YAAY,EAAE,CAAC;AAEvD,eAAO,MAAM,gBAAgB,EAAE,SAAS,EAEvC,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;;CAK1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CACtC,SAAS,EACT,aAAa,CAAC,SAAS,CAAC,CAsCzB,CAAC"}
|
|
@@ -25,7 +25,6 @@ export const googleModelRegistry = {
|
|
|
25
25
|
supportsToolCalling: true,
|
|
26
26
|
costPerInputToken: 0,
|
|
27
27
|
costPerOutputToken: 0,
|
|
28
|
-
category: "fast",
|
|
29
28
|
},
|
|
30
29
|
"google:pro25": {
|
|
31
30
|
id: "google:pro25",
|
|
@@ -38,7 +37,6 @@ export const googleModelRegistry = {
|
|
|
38
37
|
supportsToolCalling: true,
|
|
39
38
|
costPerInputToken: 0,
|
|
40
39
|
costPerOutputToken: 0,
|
|
41
|
-
category: "powerful",
|
|
42
40
|
},
|
|
43
41
|
"google:flash25": {
|
|
44
42
|
id: "google:flash25",
|
|
@@ -51,6 +49,5 @@ export const googleModelRegistry = {
|
|
|
51
49
|
supportsToolCalling: true,
|
|
52
50
|
costPerInputToken: 0.00000015,
|
|
53
51
|
costPerOutputToken: 0.0000035,
|
|
54
|
-
category: "balanced",
|
|
55
52
|
},
|
|
56
53
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"groq-provider.d.ts","sourceRoot":"","sources":["../../source/models/groq-provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAMpD,QAAA,MAAM,UAAU;;CAEN,CAAC;AAEX,KAAK,SAAS,GAAG,QAAQ,MAAM,OAAO,UAAU,EAAE,CAAC;AAEnD,eAAO,MAAM,cAAc,EAAE,SAAS,EAErC,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;CAKxB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE;KAC7B,CAAC,IAAI,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"groq-provider.d.ts","sourceRoot":"","sources":["../../source/models/groq-provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAMpD,QAAA,MAAM,UAAU;;CAEN,CAAC;AAEX,KAAK,SAAS,GAAG,QAAQ,MAAM,OAAO,UAAU,EAAE,CAAC;AAEnD,eAAO,MAAM,cAAc,EAAE,SAAS,EAErC,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;CAKxB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE;KAC7B,CAAC,IAAI,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;CAc3C,CAAC"}
|
package/dist/models/manager.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { LanguageModelV2 } from "@ai-sdk/provider";
|
|
2
2
|
import { type ModelMetadata, type ModelName } from "./providers.ts";
|
|
3
|
-
type App = "repl" | "cli" | "title-conversation" | "conversation-summarizer" | "conversation-analyzer" | "tool-repair" | "init-project" | "task-agent";
|
|
3
|
+
type App = "repl" | "cli" | "title-conversation" | "conversation-summarizer" | "conversation-analyzer" | "tool-repair" | "init-project" | "task-agent" | "handoff-agent" | "edit-fix";
|
|
4
4
|
export declare class ModelManager {
|
|
5
5
|
private modelMap;
|
|
6
6
|
private modelMetadataMap;
|
|
@@ -11,6 +11,7 @@ export declare class ModelManager {
|
|
|
11
11
|
setModel(app: App, model: ModelName): void;
|
|
12
12
|
getModel(app: App): LanguageModelV2;
|
|
13
13
|
getModelMetadata(app: App): ModelMetadata<ModelName>;
|
|
14
|
+
getText(app: App, system: string, prompt: string, signal: AbortSignal): Promise<import("ai").GenerateTextResult<import("ai").ToolSet, never>>;
|
|
14
15
|
}
|
|
15
16
|
export {};
|
|
16
17
|
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../source/models/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../source/models/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAQxD,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,SAAS,EAEf,MAAM,gBAAgB,CAAC;AAuBxB,KAAK,GAAG,GACJ,MAAM,GACN,KAAK,GACL,oBAAoB,GACpB,yBAAyB,GACzB,uBAAuB,GACvB,aAAa,GACb,cAAc,GACd,YAAY,GACZ,eAAe,GACf,UAAU,CAAC;AAEf,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAS;gBACb,EAAE,QAAQ,EAAE,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE;IAM9C,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS;IAenC,QAAQ,CAAC,GAAG,EAAE,GAAG;IAQjB,gBAAgB,CAAC,GAAG,EAAE,GAAG;IAQnB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;CA0B5E"}
|
package/dist/models/manager.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { wrapLanguageModel } from "ai";
|
|
2
|
-
import { auditMessage, createRateLimitMiddleware, } from "../middleware/index.js";
|
|
1
|
+
import { generateText, wrapLanguageModel } from "ai";
|
|
2
|
+
import { auditMessage, cacheMiddleware, createRateLimitMiddleware, } from "../middleware/index.js";
|
|
3
|
+
import { AiConfig } from "./ai-config.js";
|
|
3
4
|
import { languageModel, modelRegistry, } from "./providers.js";
|
|
4
5
|
function getLanguageModel({ model, app, stateDir, }) {
|
|
5
6
|
const langModel = wrapLanguageModel({
|
|
6
7
|
model: languageModel(model),
|
|
7
8
|
middleware: [
|
|
9
|
+
cacheMiddleware,
|
|
8
10
|
createRateLimitMiddleware({ requestsPerMinute: 30 }),
|
|
9
11
|
auditMessage({ filePath: stateDir, app }),
|
|
10
12
|
],
|
|
@@ -45,4 +47,26 @@ export class ModelManager {
|
|
|
45
47
|
}
|
|
46
48
|
return metadata;
|
|
47
49
|
}
|
|
50
|
+
async getText(app, system, prompt, signal) {
|
|
51
|
+
const model = this.getModel(app);
|
|
52
|
+
const modelConfig = this.getModelMetadata(app);
|
|
53
|
+
if (!model || !modelConfig) {
|
|
54
|
+
throw new Error(`${app} model not available`);
|
|
55
|
+
}
|
|
56
|
+
const aiConfig = new AiConfig({
|
|
57
|
+
modelMetadata: modelConfig,
|
|
58
|
+
prompt: prompt,
|
|
59
|
+
});
|
|
60
|
+
const result = await generateText({
|
|
61
|
+
model,
|
|
62
|
+
maxOutputTokens: aiConfig.maxOutputTokens(),
|
|
63
|
+
system: system,
|
|
64
|
+
prompt: prompt,
|
|
65
|
+
temperature: aiConfig.temperature(),
|
|
66
|
+
topP: aiConfig.topP(),
|
|
67
|
+
providerOptions: aiConfig.providerOptions(),
|
|
68
|
+
abortSignal: signal,
|
|
69
|
+
});
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
48
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../../source/models/openai-provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,QAAA,MAAM,YAAY;;;;;CAKR,CAAC;AAEX,KAAK,SAAS,GAAG,UAAU,MAAM,OAAO,YAAY,EAAE,CAAC;AAEvD,eAAO,MAAM,gBAAgB,EAAE,SAAS,EAEvC,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;;CAK1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE;KAC/B,CAAC,IAAI,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../../source/models/openai-provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,QAAA,MAAM,YAAY;;;;;CAKR,CAAC;AAEX,KAAK,SAAS,GAAG,UAAU,MAAM,OAAO,YAAY,EAAE,CAAC;AAEvD,eAAO,MAAM,gBAAgB,EAAE,SAAS,EAEvC,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;;CAK1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE;KAC/B,CAAC,IAAI,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;CAkD3C,CAAC"}
|