@travisennis/acai 0.0.8 → 0.0.10
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 +48 -729
- package/bin/acai +52 -0
- package/dist/agent/index.d.ts +12 -2
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +378 -168
- package/dist/agent/sub-agent.d.ts +23 -0
- package/dist/agent/sub-agent.d.ts.map +1 -0
- package/dist/agent/sub-agent.js +109 -0
- package/dist/cli/index.d.ts +26 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/{cli.js → cli/index.js} +84 -76
- package/dist/cli/stdin.d.ts +9 -0
- package/dist/cli/stdin.d.ts.map +1 -0
- package/dist/cli/stdin.js +37 -0
- package/dist/commands/copy/index.js +2 -2
- package/dist/commands/copy/utils.d.ts.map +1 -1
- package/dist/commands/copy/utils.js +15 -13
- package/dist/commands/generate-rules/index.d.ts +1 -1
- package/dist/commands/generate-rules/index.d.ts.map +1 -1
- package/dist/commands/generate-rules/index.js +16 -100
- package/dist/commands/generate-rules/service.d.ts +21 -0
- package/dist/commands/generate-rules/service.d.ts.map +1 -0
- package/dist/commands/generate-rules/service.js +103 -0
- package/dist/commands/handoff/index.js +2 -2
- package/dist/commands/health/index.js +1 -1
- package/dist/commands/health/utils.d.ts.map +1 -1
- package/dist/commands/health/utils.js +6 -0
- package/dist/commands/history/index.d.ts +1 -1
- package/dist/commands/history/index.d.ts.map +1 -1
- package/dist/commands/history/index.js +17 -18
- package/dist/commands/history/types.d.ts +38 -0
- package/dist/commands/history/types.d.ts.map +1 -1
- package/dist/commands/history/utils.d.ts.map +1 -1
- package/dist/commands/history/utils.js +63 -58
- package/dist/commands/init/index.d.ts.map +1 -1
- package/dist/commands/init/index.js +3 -8
- package/dist/commands/init-project/index.d.ts.map +1 -1
- package/dist/commands/init-project/index.js +3 -3
- package/dist/commands/init-project/utils.d.ts.map +1 -1
- package/dist/commands/init-project/utils.js +10 -2
- package/dist/commands/list-tools/index.d.ts.map +1 -1
- package/dist/commands/list-tools/index.js +7 -31
- package/dist/commands/manager.d.ts +2 -2
- package/dist/commands/manager.d.ts.map +1 -1
- package/dist/commands/manager.js +57 -33
- package/dist/commands/model/index.d.ts.map +1 -1
- package/dist/commands/model/index.js +20 -151
- package/dist/commands/model/model-panel.d.ts +4 -0
- package/dist/commands/model/model-panel.d.ts.map +1 -0
- package/dist/commands/model/model-panel.js +144 -0
- package/dist/commands/paste/index.d.ts.map +1 -1
- package/dist/commands/paste/index.js +59 -62
- package/dist/commands/paste/utils.d.ts.map +1 -1
- package/dist/commands/paste/utils.js +88 -58
- package/dist/commands/pickup/index.d.ts.map +1 -1
- package/dist/commands/pickup/index.js +6 -3
- package/dist/commands/pickup/utils.js +3 -3
- package/dist/commands/resources/index.d.ts.map +1 -1
- package/dist/commands/resources/index.js +33 -50
- package/dist/commands/review/index.d.ts.map +1 -1
- package/dist/commands/review/index.js +3 -117
- package/dist/commands/review/review-panel.d.ts +3 -0
- package/dist/commands/review/review-panel.d.ts.map +1 -0
- package/dist/commands/review/review-panel.js +186 -0
- package/dist/commands/review/utils.d.ts +9 -0
- package/dist/commands/review/utils.d.ts.map +1 -1
- package/dist/commands/review/utils.js +127 -68
- package/dist/commands/session/index.d.ts +1 -1
- package/dist/commands/session/index.d.ts.map +1 -1
- package/dist/commands/session/index.js +134 -112
- package/dist/commands/session/types.d.ts +7 -0
- package/dist/commands/session/types.d.ts.map +1 -1
- package/dist/commands/share/html-renderer.d.ts +25 -0
- package/dist/commands/share/html-renderer.d.ts.map +1 -0
- package/dist/commands/share/html-renderer.js +384 -0
- package/dist/commands/share/index.d.ts +3 -0
- package/dist/commands/share/index.d.ts.map +1 -0
- package/dist/commands/share/index.js +122 -0
- package/dist/commands/shell/index.d.ts.map +1 -1
- package/dist/commands/shell/index.js +16 -1
- package/dist/commands/types.d.ts +2 -2
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/{config.d.ts → config/index.d.ts} +20 -9
- package/dist/config/index.d.ts.map +1 -0
- package/dist/{config.js → config/index.js} +43 -42
- package/dist/execution/index.d.ts.map +1 -1
- package/dist/execution/index.js +75 -55
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +170 -127
- package/dist/middleware/cache.d.ts.map +1 -1
- package/dist/middleware/cache.js +18 -36
- package/dist/models/ai-config.d.ts +1 -0
- package/dist/models/ai-config.d.ts.map +1 -1
- package/dist/models/ai-config.js +4 -3
- package/dist/models/anthropic-provider.d.ts +2 -5
- package/dist/models/anthropic-provider.d.ts.map +1 -1
- package/dist/models/anthropic-provider.js +3 -70
- package/dist/models/deepseek-provider.d.ts +1 -0
- package/dist/models/deepseek-provider.d.ts.map +1 -1
- package/dist/models/google-provider.d.ts +2 -3
- package/dist/models/google-provider.d.ts.map +1 -1
- package/dist/models/google-provider.js +0 -26
- package/dist/models/groq-provider.d.ts +1 -0
- package/dist/models/groq-provider.d.ts.map +1 -1
- package/dist/models/manager.d.ts +13 -2
- package/dist/models/manager.d.ts.map +1 -1
- package/dist/models/manager.js +20 -8
- package/dist/models/openai-provider.d.ts +5 -5
- package/dist/models/openai-provider.d.ts.map +1 -1
- package/dist/models/openai-provider.js +27 -40
- package/dist/models/opencode-zen-provider.d.ts +8 -3
- package/dist/models/opencode-zen-provider.d.ts.map +1 -1
- package/dist/models/opencode-zen-provider.js +68 -11
- package/dist/models/openrouter-provider.d.ts +24 -30
- package/dist/models/openrouter-provider.d.ts.map +1 -1
- package/dist/models/openrouter-provider.js +92 -177
- package/dist/models/providers.d.ts +1 -1
- package/dist/models/providers.d.ts.map +1 -1
- package/dist/models/xai-provider.d.ts +4 -3
- package/dist/models/xai-provider.d.ts.map +1 -1
- package/dist/models/xai-provider.js +18 -18
- package/dist/modes/manager.d.ts +23 -0
- package/dist/modes/manager.d.ts.map +1 -0
- package/dist/modes/manager.js +77 -0
- package/dist/modes/prompts.d.ts +2 -0
- package/dist/modes/prompts.d.ts.map +1 -0
- package/dist/modes/prompts.js +143 -0
- package/dist/prompts/mentions.d.ts +11 -0
- package/dist/prompts/mentions.d.ts.map +1 -0
- package/dist/{mentions.js → prompts/mentions.js} +21 -80
- package/dist/prompts/system-prompt.d.ts +26 -0
- package/dist/prompts/system-prompt.d.ts.map +1 -0
- package/dist/{prompts.js → prompts/system-prompt.js} +50 -22
- package/dist/repl/index.d.ts +174 -0
- package/dist/repl/index.d.ts.map +1 -0
- package/dist/{repl-new.js → repl/index.js} +399 -76
- package/dist/repl/project-status.d.ts +1 -0
- package/dist/repl/project-status.d.ts.map +1 -1
- package/dist/repl/project-status.js +4 -1
- package/dist/sessions/manager.d.ts +93 -1
- package/dist/sessions/manager.d.ts.map +1 -1
- package/dist/sessions/manager.js +264 -9
- package/dist/sessions/summary.d.ts +4 -0
- package/dist/sessions/summary.d.ts.map +1 -0
- package/dist/sessions/summary.js +30 -0
- package/dist/{skills.d.ts → skills/index.d.ts} +14 -2
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +294 -0
- package/dist/subagents/index.d.ts +15 -0
- package/dist/subagents/index.d.ts.map +1 -0
- package/dist/subagents/index.js +231 -0
- package/dist/terminal/control.d.ts +1 -1
- package/dist/terminal/control.d.ts.map +1 -1
- package/dist/terminal/control.js +30 -9
- package/dist/terminal/east-asian-width.d.ts.map +1 -1
- package/dist/terminal/east-asian-width.js +404 -351
- package/dist/terminal/keys.d.ts +17 -0
- package/dist/terminal/keys.d.ts.map +1 -1
- package/dist/terminal/keys.js +37 -0
- package/dist/terminal/select-prompt.d.ts.map +1 -1
- package/dist/terminal/select-prompt.js +24 -12
- package/dist/terminal/string-width.d.ts.map +1 -1
- package/dist/terminal/string-width.js +25 -27
- package/dist/terminal/style.d.ts.map +1 -1
- package/dist/terminal/style.js +4 -7
- package/dist/terminal/supports-color.d.ts.map +1 -1
- package/dist/terminal/supports-color.js +41 -27
- package/dist/terminal/table/cell.d.ts +12 -0
- package/dist/terminal/table/cell.d.ts.map +1 -1
- package/dist/terminal/table/cell.js +40 -25
- package/dist/terminal/table/layout-manager.d.ts.map +1 -1
- package/dist/terminal/table/layout-manager.js +100 -68
- package/dist/terminal/table/utils.d.ts.map +1 -1
- package/dist/terminal/table/utils.js +17 -10
- package/dist/terminal/wrap-ansi.d.ts.map +1 -1
- package/dist/terminal/wrap-ansi.js +172 -103
- package/dist/tokens/tracker.d.ts +1 -0
- package/dist/tokens/tracker.d.ts.map +1 -1
- package/dist/tokens/tracker.js +3 -0
- package/dist/tools/agent.d.ts +27 -0
- package/dist/tools/agent.d.ts.map +1 -0
- package/dist/tools/agent.js +81 -0
- package/dist/tools/bash.d.ts +4 -3
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +343 -121
- package/dist/tools/code-search.d.ts +41 -0
- package/dist/tools/code-search.d.ts.map +1 -0
- package/dist/tools/code-search.js +195 -0
- package/dist/tools/directory-tree.d.ts +3 -3
- package/dist/tools/directory-tree.d.ts.map +1 -1
- package/dist/tools/directory-tree.js +8 -5
- package/dist/tools/dynamic-tool-loader.d.ts +2 -5
- package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
- package/dist/tools/dynamic-tool-loader.js +20 -4
- package/dist/tools/edit-file.d.ts +7 -7
- package/dist/tools/edit-file.d.ts.map +1 -1
- package/dist/tools/edit-file.js +164 -66
- package/dist/tools/glob.d.ts +6 -6
- package/dist/tools/glob.d.ts.map +1 -1
- package/dist/tools/glob.js +95 -55
- package/dist/tools/grep.d.ts +15 -12
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +300 -192
- package/dist/tools/index.d.ts +143 -5
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +39 -24
- package/dist/tools/ls.d.ts +2 -2
- package/dist/tools/ls.d.ts.map +1 -1
- package/dist/tools/ls.js +7 -5
- package/dist/tools/read-file.d.ts +3 -3
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +74 -34
- package/dist/tools/save-file.d.ts +3 -3
- package/dist/tools/save-file.d.ts.map +1 -1
- package/dist/tools/save-file.js +11 -11
- package/dist/tools/skill.d.ts +23 -0
- package/dist/tools/skill.d.ts.map +1 -0
- package/dist/tools/skill.js +65 -0
- package/dist/tools/think.d.ts.map +1 -1
- package/dist/tools/think.js +2 -9
- package/dist/tools/utils.d.ts +2 -0
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +12 -0
- package/dist/tools/web-fetch.d.ts +62 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +429 -0
- package/dist/tools/web-search.d.ts +62 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +226 -0
- package/dist/tui/autocomplete/attachment-provider.d.ts +3 -6
- package/dist/tui/autocomplete/attachment-provider.d.ts.map +1 -1
- package/dist/tui/autocomplete/attachment-provider.js +25 -78
- package/dist/tui/autocomplete/base-provider.d.ts +1 -0
- package/dist/tui/autocomplete/base-provider.d.ts.map +1 -1
- package/dist/tui/autocomplete/combined-provider.d.ts +1 -4
- package/dist/tui/autocomplete/combined-provider.d.ts.map +1 -1
- package/dist/tui/autocomplete/combined-provider.js +3 -17
- package/dist/tui/autocomplete/command-provider.d.ts +1 -0
- package/dist/tui/autocomplete/command-provider.d.ts.map +1 -1
- package/dist/tui/autocomplete/command-provider.js +3 -0
- package/dist/tui/autocomplete/file-search-provider.d.ts +2 -1
- package/dist/tui/autocomplete/file-search-provider.d.ts.map +1 -1
- package/dist/tui/autocomplete/file-search-provider.js +36 -16
- package/dist/tui/autocomplete/skill-provider.d.ts +17 -0
- package/dist/tui/autocomplete/skill-provider.d.ts.map +1 -0
- package/dist/tui/autocomplete/skill-provider.js +49 -0
- package/dist/tui/autocomplete.d.ts +2 -2
- package/dist/tui/autocomplete.d.ts.map +1 -1
- package/dist/tui/autocomplete.js +3 -5
- package/dist/tui/components/assistant-message.d.ts.map +1 -1
- package/dist/tui/components/assistant-message.js +0 -4
- package/dist/tui/components/editor.d.ts +21 -2
- package/dist/tui/components/editor.d.ts.map +1 -1
- package/dist/tui/components/editor.js +228 -236
- package/dist/tui/components/footer.d.ts +6 -4
- package/dist/tui/components/footer.d.ts.map +1 -1
- package/dist/tui/components/footer.js +49 -25
- package/dist/tui/components/markdown.d.ts +8 -5
- package/dist/tui/components/markdown.d.ts.map +1 -1
- package/dist/tui/components/markdown.js +57 -39
- package/dist/tui/components/modal.d.ts.map +1 -1
- package/dist/tui/components/modal.js +35 -33
- package/dist/tui/components/notification.d.ts +13 -2
- package/dist/tui/components/notification.d.ts.map +1 -1
- package/dist/tui/components/notification.js +37 -2
- package/dist/tui/components/progress-bar.js +1 -1
- package/dist/tui/components/select-list.d.ts +1 -0
- package/dist/tui/components/select-list.d.ts.map +1 -1
- package/dist/tui/components/select-list.js +14 -11
- package/dist/tui/components/text.d.ts +16 -0
- package/dist/tui/components/text.d.ts.map +1 -1
- package/dist/tui/components/text.js +72 -57
- package/dist/tui/components/thinking-block.d.ts +9 -0
- package/dist/tui/components/thinking-block.d.ts.map +1 -1
- package/dist/tui/components/thinking-block.js +43 -11
- package/dist/tui/components/tool-execution.d.ts +5 -1
- package/dist/tui/components/tool-execution.d.ts.map +1 -1
- package/dist/tui/components/tool-execution.js +19 -10
- package/dist/tui/components/user-message.d.ts.map +1 -1
- package/dist/tui/components/user-message.js +0 -3
- package/dist/tui/components/welcome.js +2 -2
- package/dist/tui/editor-launcher.d.ts +13 -0
- package/dist/tui/editor-launcher.d.ts.map +1 -0
- package/dist/tui/editor-launcher.js +39 -0
- package/dist/tui/index.d.ts +3 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +1 -0
- package/dist/tui/terminal.d.ts +27 -0
- package/dist/tui/terminal.d.ts.map +1 -1
- package/dist/tui/terminal.js +144 -15
- package/dist/tui/tui.d.ts +43 -0
- package/dist/tui/tui.d.ts.map +1 -1
- package/dist/tui/tui.js +172 -41
- package/dist/utils/bash/parse.d.ts +19 -0
- package/dist/utils/bash/parse.d.ts.map +1 -0
- package/dist/utils/bash/parse.js +223 -0
- package/dist/utils/bash/quote.d.ts +6 -0
- package/dist/utils/bash/quote.d.ts.map +1 -0
- package/dist/utils/bash/quote.js +23 -0
- package/dist/utils/bash.d.ts.map +1 -1
- package/dist/utils/bash.js +211 -126
- package/dist/utils/command-protection.d.ts +28 -0
- package/dist/utils/command-protection.d.ts.map +1 -0
- package/dist/utils/command-protection.js +324 -0
- package/dist/utils/dedent.d.ts.map +1 -0
- package/dist/utils/env-expand.d.ts +2 -0
- package/dist/utils/env-expand.d.ts.map +1 -0
- package/dist/utils/env-expand.js +8 -0
- package/dist/utils/filesystem/path-display.d.ts +11 -0
- package/dist/utils/filesystem/path-display.d.ts.map +1 -0
- package/dist/utils/filesystem/path-display.js +32 -0
- package/dist/utils/filesystem/security.d.ts +2 -2
- package/dist/utils/filesystem/security.d.ts.map +1 -1
- package/dist/utils/filesystem/security.js +32 -31
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/{formatting.js → utils/formatting.js} +1 -1
- package/dist/utils/git.d.ts +4 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +30 -0
- package/dist/utils/glob.d.ts +1 -1
- package/dist/utils/glob.d.ts.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/{logger.js → utils/logger.js} +1 -1
- package/dist/utils/parsing.d.ts.map +1 -0
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +90 -37
- package/dist/utils/templates.d.ts +2 -0
- package/dist/utils/templates.d.ts.map +1 -0
- package/dist/utils/templates.js +24 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/{version.js → utils/version.js} +1 -1
- package/package.json +34 -25
- package/dist/cli.d.ts +0 -23
- package/dist/cli.d.ts.map +0 -1
- package/dist/commands/exit/index.d.ts +0 -10
- package/dist/commands/exit/index.d.ts.map +0 -1
- package/dist/commands/exit/index.js +0 -21
- package/dist/commands/exit/types.d.ts +0 -8
- package/dist/commands/exit/types.d.ts.map +0 -1
- package/dist/commands/exit/types.js +0 -1
- package/dist/commands/exit/utils.d.ts +0 -2
- package/dist/commands/exit/utils.d.ts.map +0 -1
- package/dist/commands/exit/utils.js +0 -13
- package/dist/commands/prompt/index.d.ts +0 -5
- package/dist/commands/prompt/index.d.ts.map +0 -1
- package/dist/commands/prompt/index.js +0 -126
- package/dist/commands/prompt/types.d.ts +0 -15
- package/dist/commands/prompt/types.d.ts.map +0 -1
- package/dist/commands/prompt/types.js +0 -1
- package/dist/commands/prompt/utils.d.ts +0 -12
- package/dist/commands/prompt/utils.d.ts.map +0 -1
- package/dist/commands/prompt/utils.js +0 -107
- package/dist/commands/reset/index.d.ts +0 -3
- package/dist/commands/reset/index.d.ts.map +0 -1
- package/dist/commands/reset/index.js +0 -25
- package/dist/commands/reset/types.d.ts +0 -1
- package/dist/commands/reset/types.d.ts.map +0 -1
- package/dist/commands/reset/types.js +0 -3
- package/dist/commands/save/index.d.ts +0 -3
- package/dist/commands/save/index.d.ts.map +0 -1
- package/dist/commands/save/index.js +0 -19
- package/dist/config.d.ts.map +0 -1
- package/dist/dedent.d.ts.map +0 -1
- package/dist/formatting.d.ts.map +0 -1
- package/dist/logger.d.ts.map +0 -1
- package/dist/mentions.d.ts +0 -14
- package/dist/mentions.d.ts.map +0 -1
- package/dist/parsing.d.ts.map +0 -1
- package/dist/prompts.d.ts +0 -10
- package/dist/prompts.d.ts.map +0 -1
- package/dist/repl-new.d.ts +0 -62
- package/dist/repl-new.d.ts.map +0 -1
- package/dist/skills.d.ts.map +0 -1
- package/dist/skills.js +0 -233
- package/dist/tui/autocomplete/path-provider.d.ts +0 -21
- package/dist/tui/autocomplete/path-provider.d.ts.map +0 -1
- package/dist/tui/autocomplete/path-provider.js +0 -164
- package/dist/version.d.ts.map +0 -1
- /package/dist/{dedent.d.ts → utils/dedent.d.ts} +0 -0
- /package/dist/{dedent.js → utils/dedent.js} +0 -0
- /package/dist/{formatting.d.ts → utils/formatting.d.ts} +0 -0
- /package/dist/{logger.d.ts → utils/logger.d.ts} +0 -0
- /package/dist/{parsing.d.ts → utils/parsing.d.ts} +0 -0
- /package/dist/{parsing.js → utils/parsing.js} +0 -0
- /package/dist/{version.d.ts → utils/version.d.ts} +0 -0
package/dist/index.js
CHANGED
|
@@ -2,36 +2,40 @@
|
|
|
2
2
|
import { mkdirSync } from "node:fs";
|
|
3
3
|
import os from "node:os";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import { text } from "node:stream/consumers";
|
|
6
5
|
import { parseArgs } from "node:util";
|
|
7
6
|
import { asyncTry, isFailure, syncTry } from "@travisennis/stdlib/try";
|
|
8
7
|
import { isDefined } from "@travisennis/stdlib/typeguards";
|
|
9
8
|
import { Agent } from "./agent/index.js";
|
|
10
|
-
import { Cli } from "./cli.js";
|
|
9
|
+
import { Cli } from "./cli/index.js";
|
|
10
|
+
import { readStdinWithLimits } from "./cli/stdin.js";
|
|
11
11
|
import { CommandManager } from "./commands/manager.js";
|
|
12
|
-
import { config
|
|
13
|
-
import { logger } from "./logger.js";
|
|
14
|
-
import { PromptError, processPrompt } from "./mentions.js";
|
|
12
|
+
import { config } from "./config/index.js";
|
|
15
13
|
import { ModelManager } from "./models/manager.js";
|
|
16
14
|
import { isSupportedModel } from "./models/providers.js";
|
|
17
15
|
import { PromptManager } from "./prompts/manager.js";
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
16
|
+
import { processPrompt } from "./prompts/mentions.js";
|
|
17
|
+
import { systemPrompt } from "./prompts/system-prompt.js";
|
|
18
|
+
import { Repl } from "./repl/index.js";
|
|
20
19
|
import { SessionManager } from "./sessions/manager.js";
|
|
20
|
+
import { writeExitSummary } from "./sessions/summary.js";
|
|
21
21
|
import { setTerminalTitle } from "./terminal/control.js";
|
|
22
22
|
import { select } from "./terminal/select-prompt.js";
|
|
23
23
|
import { TokenCounter } from "./tokens/counter.js";
|
|
24
24
|
import { TokenTracker } from "./tokens/tracker.js";
|
|
25
25
|
import { initTools } from "./tools/index.js";
|
|
26
|
-
import {
|
|
26
|
+
import { logger } from "./utils/logger.js";
|
|
27
|
+
import { getPackageVersion } from "./utils/version.js";
|
|
27
28
|
// Create workspace context from CLI arguments
|
|
28
29
|
export function createWorkspaceContext(addDirArgs = []) {
|
|
29
30
|
const primaryDir = process.cwd();
|
|
30
31
|
mkdirSync("/tmp/acai", { recursive: true });
|
|
31
32
|
const allowedDirs = [
|
|
32
33
|
primaryDir,
|
|
34
|
+
"/tmp",
|
|
33
35
|
"/tmp/acai",
|
|
36
|
+
"/var/folders",
|
|
34
37
|
path.join(os.homedir(), ".acai"),
|
|
38
|
+
path.join(os.homedir(), ".agents"),
|
|
35
39
|
...addDirArgs,
|
|
36
40
|
];
|
|
37
41
|
// Remove duplicates while preserving order
|
|
@@ -52,7 +56,7 @@ Options
|
|
|
52
56
|
--resume Resume a specific session by ID, or most recent if no ID given
|
|
53
57
|
--add-dir Add additional working directory (can be used multiple times)
|
|
54
58
|
--no-skills Disable skills discovery and loading
|
|
55
|
-
|
|
59
|
+
--no-session Don't save session to disk
|
|
56
60
|
|
|
57
61
|
--help, -h Show help
|
|
58
62
|
--version, -v Show version
|
|
@@ -73,6 +77,7 @@ const parsed = syncTry(() => parseArgs({
|
|
|
73
77
|
resume: { type: "boolean", default: false },
|
|
74
78
|
"add-dir": { type: "string", multiple: true },
|
|
75
79
|
"no-skills": { type: "boolean", default: false },
|
|
80
|
+
"no-session": { type: "boolean", default: false },
|
|
76
81
|
help: { type: "boolean", short: "h" },
|
|
77
82
|
version: { type: "boolean", short: "v" },
|
|
78
83
|
},
|
|
@@ -96,49 +101,42 @@ export function handleError(error) {
|
|
|
96
101
|
logger.error({ error: error }, error.message);
|
|
97
102
|
}
|
|
98
103
|
// Configuration constants
|
|
99
|
-
const DEFAULT_HISTORY_LIMIT =
|
|
100
|
-
const CONTINUE_HISTORY_LIMIT = 1;
|
|
104
|
+
const DEFAULT_HISTORY_LIMIT = 20; // the amount of sessions to retrieve from session history
|
|
101
105
|
// Helper functions for main()
|
|
102
|
-
async function initializeAppState(appConfig, initialPromptInput,
|
|
106
|
+
async function initializeAppState(appConfig, initialPromptInput, stdinContent, hasContinueOrResume, resumeSessionId) {
|
|
103
107
|
const appDir = config.app;
|
|
104
108
|
// Parallelize independent async operations
|
|
105
|
-
const [
|
|
106
|
-
appDir.ensurePath("
|
|
109
|
+
const [sessionsDir, modelManager] = await Promise.all([
|
|
110
|
+
appDir.ensurePath("sessions"),
|
|
107
111
|
initializeModelManager(appDir),
|
|
108
112
|
]);
|
|
109
113
|
// Initialize synchronous components
|
|
110
114
|
const tokenTracker = new TokenTracker();
|
|
111
115
|
const tokenCounter = new TokenCounter();
|
|
112
116
|
// Initialize dependent components
|
|
113
|
-
const sessionManager = await initializeSessionManager(
|
|
117
|
+
const sessionManager = await initializeSessionManager(sessionsDir, modelManager, tokenTracker);
|
|
114
118
|
// Handle conversation history loading
|
|
115
|
-
await handleConversationHistory(sessionManager,
|
|
119
|
+
await handleConversationHistory(sessionManager, sessionsDir, hasContinueOrResume, resumeSessionId);
|
|
116
120
|
// Setup prompt manager
|
|
117
121
|
const promptManager = new PromptManager(tokenCounter);
|
|
118
122
|
if (!hasContinueOrResume && isDefined(initialPromptInput)) {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
promptManager.addContext(context);
|
|
127
|
-
}
|
|
128
|
-
promptManager.set(processedPrompt.message);
|
|
129
|
-
}
|
|
130
|
-
catch (error) {
|
|
131
|
-
if (error instanceof PromptError) {
|
|
132
|
-
logger.error(`Prompt mention error: ${error.message}`);
|
|
133
|
-
promptManager.set(initialPromptInput);
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
throw new Error("Failed to process prompt.", { cause: error });
|
|
137
|
-
}
|
|
123
|
+
const modelConfig = modelManager.getModelMetadata("repl");
|
|
124
|
+
const processedPrompt = await processPrompt(initialPromptInput, {
|
|
125
|
+
baseDir: process.cwd(),
|
|
126
|
+
model: modelConfig,
|
|
127
|
+
});
|
|
128
|
+
for (const context of processedPrompt.context) {
|
|
129
|
+
promptManager.addContext(context);
|
|
138
130
|
}
|
|
131
|
+
promptManager.set(processedPrompt.message);
|
|
139
132
|
}
|
|
140
|
-
if (
|
|
141
|
-
|
|
133
|
+
if (stdinContent && stdinContent.trim().length > 0) {
|
|
134
|
+
if (isDefined(initialPromptInput)) {
|
|
135
|
+
promptManager.addContext(stdinContent);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
promptManager.set(stdinContent);
|
|
139
|
+
}
|
|
142
140
|
}
|
|
143
141
|
const promptHistory = [];
|
|
144
142
|
const commands = new CommandManager({
|
|
@@ -195,17 +193,14 @@ function validateCliArguments() {
|
|
|
195
193
|
async function determineInitialPrompt() {
|
|
196
194
|
const hasContinueOrResume = flags.continue === true || flags.resume === true;
|
|
197
195
|
const positionalPrompt = input.at(0);
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
console.error(`Error reading stdin: ${error.message}`);
|
|
206
|
-
}
|
|
196
|
+
const { content: stdinContent, wasPiped } = await readStdinWithLimits();
|
|
197
|
+
if (wasPiped &&
|
|
198
|
+
(!stdinContent || stdinContent.trim().length === 0) &&
|
|
199
|
+
!flags.prompt &&
|
|
200
|
+
!positionalPrompt) {
|
|
201
|
+
console.error("No input provided via stdin.");
|
|
202
|
+
process.exit(0);
|
|
207
203
|
}
|
|
208
|
-
// Check for session ID with --resume
|
|
209
204
|
const resumeSessionId = flags.resume === true && input.length > 0 ? input[0] : undefined;
|
|
210
205
|
const initialPromptInput = typeof flags.prompt === "string" && flags.prompt.length > 0
|
|
211
206
|
? flags.prompt
|
|
@@ -218,7 +213,7 @@ async function determineInitialPrompt() {
|
|
|
218
213
|
}
|
|
219
214
|
return {
|
|
220
215
|
initialPromptInput,
|
|
221
|
-
|
|
216
|
+
stdinContent,
|
|
222
217
|
hasContinueOrResume,
|
|
223
218
|
resumeSessionId,
|
|
224
219
|
};
|
|
@@ -226,41 +221,42 @@ async function determineInitialPrompt() {
|
|
|
226
221
|
async function initializeModelManager(appDir) {
|
|
227
222
|
const chosenModel = isSupportedModel(flags.model)
|
|
228
223
|
? flags.model
|
|
229
|
-
: "opencode:minimax-m2-
|
|
224
|
+
: "opencode:minimax-m2.5-free";
|
|
225
|
+
const projectConfig = await config.getConfig();
|
|
226
|
+
const devtoolsEnabled = projectConfig.devtools?.enabled ?? false;
|
|
230
227
|
const modelManager = new ModelManager({
|
|
231
228
|
stateDir: await appDir.ensurePath("audit"),
|
|
229
|
+
devtoolsEnabled,
|
|
232
230
|
});
|
|
233
231
|
modelManager.setModel("repl", chosenModel);
|
|
234
232
|
modelManager.setModel("cli", chosenModel);
|
|
235
233
|
modelManager.setModel("title-conversation", chosenModel);
|
|
236
234
|
modelManager.setModel("conversation-summarizer", chosenModel);
|
|
237
|
-
modelManager.setModel("tool-repair",
|
|
235
|
+
modelManager.setModel("tool-repair", "openai:gpt-5.1-codex-mini");
|
|
238
236
|
modelManager.setModel("conversation-analyzer", chosenModel);
|
|
239
237
|
modelManager.setModel("init-project", chosenModel);
|
|
240
|
-
modelManager.setModel("task-agent", chosenModel);
|
|
241
238
|
modelManager.setModel("handoff-agent", chosenModel);
|
|
242
|
-
modelManager.setModel("edit-fix", chosenModel);
|
|
243
239
|
return modelManager;
|
|
244
240
|
}
|
|
245
|
-
async function initializeSessionManager(
|
|
246
|
-
const
|
|
247
|
-
stateDir:
|
|
241
|
+
async function initializeSessionManager(sessionsDir, modelManager, tokenTracker) {
|
|
242
|
+
const sessionManager = new SessionManager({
|
|
243
|
+
stateDir: sessionsDir,
|
|
248
244
|
modelManager,
|
|
249
245
|
tokenTracker,
|
|
250
246
|
});
|
|
251
|
-
|
|
247
|
+
sessionManager.on("update-title", (title) => setTerminalTitle(title));
|
|
252
248
|
// Listen for model changes and update session manager when repl model changes
|
|
253
249
|
modelManager.on("set-model", (app, _model) => {
|
|
254
250
|
if (app === "repl") {
|
|
255
251
|
const modelId = modelManager.getModel("repl").modelId;
|
|
256
|
-
|
|
252
|
+
sessionManager.setModelId(modelId);
|
|
257
253
|
}
|
|
258
254
|
});
|
|
259
|
-
return
|
|
255
|
+
return sessionManager;
|
|
260
256
|
}
|
|
261
|
-
async function handleConversationHistory(
|
|
257
|
+
async function handleConversationHistory(sessionManager, sessionsDir, _hasContinueOrResume, resumeSessionId) {
|
|
262
258
|
if (flags.continue === true) {
|
|
263
|
-
const histories = await SessionManager.load(
|
|
259
|
+
const histories = await SessionManager.load(sessionsDir, DEFAULT_HISTORY_LIMIT);
|
|
264
260
|
if (histories.length > 0) {
|
|
265
261
|
try {
|
|
266
262
|
const choice = await select({
|
|
@@ -273,7 +269,7 @@ async function handleConversationHistory(messageHistory, messageHistoryDir, _has
|
|
|
273
269
|
});
|
|
274
270
|
const selectedHistory = histories.at(choice);
|
|
275
271
|
if (selectedHistory) {
|
|
276
|
-
|
|
272
|
+
sessionManager.restore(selectedHistory);
|
|
277
273
|
logger.info(`Resuming conversation: ${selectedHistory.title}`);
|
|
278
274
|
setTerminalTitle(selectedHistory.title || `acai: ${process.cwd()}`);
|
|
279
275
|
}
|
|
@@ -298,10 +294,10 @@ async function handleConversationHistory(messageHistory, messageHistoryDir, _has
|
|
|
298
294
|
}
|
|
299
295
|
else if (flags.resume === true) {
|
|
300
296
|
if (resumeSessionId) {
|
|
301
|
-
const histories = await SessionManager.load(
|
|
297
|
+
const histories = await SessionManager.load(sessionsDir, DEFAULT_HISTORY_LIMIT);
|
|
302
298
|
const targetHistory = histories.find((h) => h.sessionId === resumeSessionId);
|
|
303
299
|
if (targetHistory) {
|
|
304
|
-
|
|
300
|
+
sessionManager.restore(targetHistory);
|
|
305
301
|
logger.info(`Resuming conversation: ${targetHistory.title}`);
|
|
306
302
|
setTerminalTitle(targetHistory.title || `acai: ${process.cwd()}`);
|
|
307
303
|
}
|
|
@@ -311,10 +307,10 @@ async function handleConversationHistory(messageHistory, messageHistoryDir, _has
|
|
|
311
307
|
}
|
|
312
308
|
}
|
|
313
309
|
else {
|
|
314
|
-
const histories = await SessionManager.load(
|
|
310
|
+
const histories = await SessionManager.load(sessionsDir, 1); // read the most recent session
|
|
315
311
|
const latestHistory = histories.at(0);
|
|
316
312
|
if (latestHistory) {
|
|
317
|
-
|
|
313
|
+
sessionManager.restore(latestHistory);
|
|
318
314
|
console.info(`Resuming conversation: ${latestHistory.title}`);
|
|
319
315
|
setTerminalTitle(latestHistory.title || `acai: ${process.cwd()}`);
|
|
320
316
|
}
|
|
@@ -324,99 +320,134 @@ async function handleConversationHistory(messageHistory, messageHistoryDir, _has
|
|
|
324
320
|
}
|
|
325
321
|
}
|
|
326
322
|
}
|
|
327
|
-
async function runCliMode(state) {
|
|
328
|
-
const skillsEnabled = !flags["no-skills"] && (await config.getSkillsEnabled());
|
|
323
|
+
async function runCliMode(state, noSession) {
|
|
329
324
|
const cliProcess = new Cli({
|
|
330
325
|
promptManager: state.promptManager,
|
|
331
|
-
|
|
326
|
+
sessionManager: state.sessionManager,
|
|
332
327
|
modelManager: state.modelManager,
|
|
333
328
|
tokenTracker: state.tokenTracker,
|
|
334
329
|
tokenCounter: state.tokenCounter,
|
|
335
330
|
workspace,
|
|
336
|
-
|
|
331
|
+
noSession,
|
|
337
332
|
});
|
|
338
333
|
(await asyncTry(cliProcess.run())).recover(handleError);
|
|
339
334
|
}
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
const tools = await initTools({
|
|
343
|
-
workspace,
|
|
344
|
-
});
|
|
345
|
-
const agent = new Agent({
|
|
346
|
-
sessionManager: state.sessionManager,
|
|
347
|
-
modelManager: state.modelManager,
|
|
348
|
-
tokenTracker: state.tokenTracker,
|
|
349
|
-
});
|
|
350
|
-
const repl = new NewRepl({
|
|
351
|
-
agent,
|
|
352
|
-
promptManager: state.promptManager,
|
|
353
|
-
config: state.appConfig,
|
|
354
|
-
messageHistory: state.sessionManager,
|
|
355
|
-
modelManager: state.modelManager,
|
|
356
|
-
tokenTracker: state.tokenTracker,
|
|
357
|
-
commands: state.commands,
|
|
358
|
-
tokenCounter: state.tokenCounter,
|
|
359
|
-
promptHistory: state.promptHistory,
|
|
360
|
-
workspace,
|
|
361
|
-
tools,
|
|
362
|
-
});
|
|
363
|
-
// Initialize TUI
|
|
364
|
-
await repl.init();
|
|
365
|
-
// Reconstruct session display if there are existing messages
|
|
366
|
-
if (!state.sessionManager.isEmpty()) {
|
|
367
|
-
await repl.rerender();
|
|
368
|
-
}
|
|
369
|
-
state.sessionManager.on("clear-history", () => {
|
|
335
|
+
function setupReplEventHandlers(repl, agent, sessionManager, noSession) {
|
|
336
|
+
sessionManager.on("clear-history", async () => {
|
|
370
337
|
logger.info("Resetting agent state.");
|
|
371
338
|
agent.resetState();
|
|
339
|
+
agent.setConfig(await config.getConfig());
|
|
372
340
|
void repl.rerender();
|
|
373
341
|
});
|
|
374
|
-
// Set interrupt callback
|
|
375
342
|
repl.setInterruptCallback(async () => {
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
343
|
+
if (!noSession) {
|
|
344
|
+
try {
|
|
345
|
+
await sessionManager.save();
|
|
346
|
+
}
|
|
347
|
+
catch (error) {
|
|
348
|
+
logger.warn({ error }, "Failed to save message history on interrupt");
|
|
349
|
+
}
|
|
382
350
|
}
|
|
383
351
|
agent.abort();
|
|
384
352
|
});
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
353
|
+
repl.setExitCallback(async (_sessionId) => {
|
|
354
|
+
if (!sessionManager.isEmpty()) {
|
|
355
|
+
await repl.triggerRuleGeneration();
|
|
356
|
+
writeExitSummary(sessionManager, noSession);
|
|
389
357
|
}
|
|
390
358
|
});
|
|
391
|
-
|
|
359
|
+
}
|
|
360
|
+
async function handleStdinPrompt(state, agent, repl, tools, activeTools, systemPromptResult, noSession) {
|
|
361
|
+
if (!state.promptManager.isPending()) {
|
|
362
|
+
return false;
|
|
363
|
+
}
|
|
364
|
+
try {
|
|
365
|
+
const promptText = state.promptManager.get();
|
|
366
|
+
const userMessage = state.promptManager.getUserMessage();
|
|
367
|
+
state.sessionManager.appendUserMessage(userMessage);
|
|
368
|
+
const results = agent.run({
|
|
369
|
+
systemPrompt: systemPromptResult.prompt,
|
|
370
|
+
input: promptText,
|
|
371
|
+
tools,
|
|
372
|
+
activeTools,
|
|
373
|
+
abortSignal: agent.abortSignal,
|
|
374
|
+
maxIterations: state.appConfig.loop.maxIterations,
|
|
375
|
+
});
|
|
376
|
+
for await (const result of results) {
|
|
377
|
+
await repl.handle(result, agent.state);
|
|
378
|
+
}
|
|
379
|
+
if (!noSession) {
|
|
380
|
+
await state.sessionManager.save();
|
|
381
|
+
}
|
|
382
|
+
return true;
|
|
383
|
+
}
|
|
384
|
+
catch {
|
|
385
|
+
return false;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
async function runInteractiveLoop(repl, agent, tools, activeTools, systemPromptResult, noSession, sessionManager, maxIterations) {
|
|
392
389
|
while (true) {
|
|
393
390
|
const userInput = await repl.getUserInput();
|
|
394
|
-
const projectConfig = await config.getConfig();
|
|
395
|
-
const activeTools = projectConfig.tools.activeTools;
|
|
396
|
-
const skillsEnabled = !flags["no-skills"] && (projectConfig.skills?.enabled ?? true);
|
|
397
391
|
try {
|
|
398
392
|
const results = agent.run({
|
|
399
|
-
systemPrompt:
|
|
400
|
-
activeTools,
|
|
401
|
-
allowedDirs: workspace.allowedDirs,
|
|
402
|
-
skillsEnabled,
|
|
403
|
-
}),
|
|
393
|
+
systemPrompt: systemPromptResult.prompt,
|
|
404
394
|
input: userInput,
|
|
405
395
|
tools,
|
|
406
396
|
activeTools,
|
|
407
397
|
abortSignal: agent.abortSignal,
|
|
398
|
+
maxIterations,
|
|
408
399
|
});
|
|
409
400
|
for await (const result of results) {
|
|
410
401
|
await repl.handle(result, agent.state);
|
|
411
402
|
}
|
|
412
|
-
|
|
403
|
+
if (!noSession) {
|
|
404
|
+
await sessionManager.save();
|
|
405
|
+
}
|
|
413
406
|
}
|
|
414
|
-
catch
|
|
415
|
-
//
|
|
416
|
-
// repl.showError((error as Error).message || "Unknown error occurred");
|
|
407
|
+
catch {
|
|
408
|
+
// Error displayed in the TUI
|
|
417
409
|
}
|
|
418
410
|
}
|
|
419
411
|
}
|
|
412
|
+
async function runReplMode(state, stdinWasPiped, noSession) {
|
|
413
|
+
const tools = await initTools({ workspace });
|
|
414
|
+
const agent = new Agent({
|
|
415
|
+
config: state.appConfig,
|
|
416
|
+
sessionManager: state.sessionManager,
|
|
417
|
+
modelManager: state.modelManager,
|
|
418
|
+
tokenTracker: state.tokenTracker,
|
|
419
|
+
});
|
|
420
|
+
const repl = new Repl({
|
|
421
|
+
agent,
|
|
422
|
+
promptManager: state.promptManager,
|
|
423
|
+
configManager: config,
|
|
424
|
+
sessionManager: state.sessionManager,
|
|
425
|
+
modelManager: state.modelManager,
|
|
426
|
+
tokenTracker: state.tokenTracker,
|
|
427
|
+
commands: state.commands,
|
|
428
|
+
tokenCounter: state.tokenCounter,
|
|
429
|
+
promptHistory: state.promptHistory,
|
|
430
|
+
workspace,
|
|
431
|
+
tools,
|
|
432
|
+
terminalOptions: { useTty: stdinWasPiped },
|
|
433
|
+
noSession,
|
|
434
|
+
});
|
|
435
|
+
await repl.init();
|
|
436
|
+
if (!state.sessionManager.isEmpty()) {
|
|
437
|
+
await repl.rerender();
|
|
438
|
+
}
|
|
439
|
+
setupReplEventHandlers(repl, agent, state.sessionManager, noSession);
|
|
440
|
+
const activeTools = state.appConfig.tools.activeTools;
|
|
441
|
+
const skillsEnabled = !flags["no-skills"] && (state.appConfig.skills?.enabled ?? true);
|
|
442
|
+
const systemPromptResult = await systemPrompt({
|
|
443
|
+
activeTools,
|
|
444
|
+
allowedDirs: workspace.allowedDirs,
|
|
445
|
+
logsPath: state.appConfig.logs?.path,
|
|
446
|
+
skillsEnabled,
|
|
447
|
+
});
|
|
448
|
+
await handleStdinPrompt(state, agent, repl, tools, activeTools, systemPromptResult, noSession);
|
|
449
|
+
await runInteractiveLoop(repl, agent, tools, activeTools, systemPromptResult, noSession, state.sessionManager, state.appConfig.loop.maxIterations);
|
|
450
|
+
}
|
|
420
451
|
async function main() {
|
|
421
452
|
try {
|
|
422
453
|
const appConfig = await config.ensureDefaultConfig("acai");
|
|
@@ -428,17 +459,29 @@ async function main() {
|
|
|
428
459
|
// Validate CLI arguments
|
|
429
460
|
validateCliArguments();
|
|
430
461
|
// Determine initial prompt
|
|
431
|
-
const { initialPromptInput,
|
|
462
|
+
const { initialPromptInput, stdinContent, hasContinueOrResume, resumeSessionId, } = await determineInitialPrompt();
|
|
432
463
|
// Initialize application state
|
|
433
|
-
const state = await initializeAppState(appConfig, initialPromptInput,
|
|
464
|
+
const state = await initializeAppState(appConfig, initialPromptInput, stdinContent, hasContinueOrResume, resumeSessionId);
|
|
465
|
+
// Add logs directory to allowed directories if configured
|
|
466
|
+
const logsPath = (await config.getConfig()).logs?.path;
|
|
467
|
+
if (logsPath) {
|
|
468
|
+
// Expand ~ to home directory before resolving
|
|
469
|
+
const expandedLogsPath = logsPath.startsWith("~/") || logsPath === "~"
|
|
470
|
+
? path.join(os.homedir(), logsPath.slice(1))
|
|
471
|
+
: logsPath;
|
|
472
|
+
const logsDir = path.dirname(path.resolve(expandedLogsPath));
|
|
473
|
+
if (!workspace.allowedDirs.includes(logsDir)) {
|
|
474
|
+
workspace.allowedDirs.push(logsDir);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
434
477
|
// Set terminal title after all validation is complete
|
|
435
478
|
setTerminalTitle(`acai: ${workspace.primaryDir}`);
|
|
436
479
|
// Handle CLI mode if initial prompt provided
|
|
437
480
|
if (isDefined(initialPromptInput)) {
|
|
438
|
-
return await runCliMode(state);
|
|
481
|
+
return await runCliMode(state, flags["no-session"] === true);
|
|
439
482
|
}
|
|
440
483
|
// Setup REPL mode
|
|
441
|
-
return await runReplMode(state);
|
|
484
|
+
return await runReplMode(state, stdinContent !== null, flags["no-session"] === true);
|
|
442
485
|
}
|
|
443
486
|
catch (error) {
|
|
444
487
|
handleError(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../source/middleware/cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,yBAAyB,EAE1B,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../source/middleware/cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,yBAAyB,EAE1B,MAAM,kBAAkB,CAAC;AAyE1B,eAAO,MAAM,eAAe,EAAE,yBA+E7B,CAAC"}
|
package/dist/middleware/cache.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { logger } from "../logger.js";
|
|
2
|
+
import { logger } from "../utils/logger.js";
|
|
3
3
|
function applyCaching(input, options = {}) {
|
|
4
4
|
const { ttl } = options;
|
|
5
5
|
input.providerOptions = {
|
|
@@ -27,53 +27,37 @@ function generateCacheKey(text, salt) {
|
|
|
27
27
|
function estimateTokens(text) {
|
|
28
28
|
return Math.ceil(text.length / 4);
|
|
29
29
|
}
|
|
30
|
-
function getMinTokenThreshold(
|
|
31
|
-
if (
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
return 1024;
|
|
37
|
-
|
|
38
|
-
return 1024; // Default threshold
|
|
30
|
+
function getMinTokenThreshold(modelId) {
|
|
31
|
+
if (modelId?.includes("haiku"))
|
|
32
|
+
return 4096;
|
|
33
|
+
if (modelId?.includes("opus"))
|
|
34
|
+
return 4096;
|
|
35
|
+
if (modelId?.includes("sonnet"))
|
|
36
|
+
return 1024;
|
|
37
|
+
return 1024;
|
|
39
38
|
}
|
|
40
|
-
function isEligibleForCaching(text,
|
|
39
|
+
function isEligibleForCaching(text, modelId) {
|
|
41
40
|
const tokenCount = estimateTokens(text);
|
|
42
|
-
const minThreshold = getMinTokenThreshold(
|
|
41
|
+
const minThreshold = getMinTokenThreshold(modelId ?? "");
|
|
43
42
|
if (tokenCount < minThreshold) {
|
|
44
|
-
logger.info(`[Cache] Ineligible: ${tokenCount} tokens < ${minThreshold} threshold`);
|
|
45
43
|
return false;
|
|
46
44
|
}
|
|
47
45
|
return true;
|
|
48
46
|
}
|
|
49
|
-
function detectProvider(
|
|
50
|
-
if (
|
|
51
|
-
modelId.includes("
|
|
52
|
-
modelId.includes("
|
|
47
|
+
function detectProvider(modelId) {
|
|
48
|
+
if (modelId.includes("sonnet") ||
|
|
49
|
+
modelId.includes("opus") ||
|
|
50
|
+
modelId.includes("haiku")) {
|
|
53
51
|
return "anthropic";
|
|
54
52
|
}
|
|
55
|
-
if (providerId === "openai" || modelId.includes("gpt-")) {
|
|
56
|
-
return "openai";
|
|
57
|
-
}
|
|
58
|
-
if (providerId === "bedrock" ||
|
|
59
|
-
modelId.includes("bedrock") ||
|
|
60
|
-
modelId.includes("amazon")) {
|
|
61
|
-
return "bedrock";
|
|
62
|
-
}
|
|
63
|
-
if (modelId.includes("openrouter")) {
|
|
64
|
-
return "openrouter";
|
|
65
|
-
}
|
|
66
53
|
return "unknown";
|
|
67
54
|
}
|
|
68
55
|
export const cacheMiddleware = {
|
|
69
56
|
specificationVersion: "v3",
|
|
70
57
|
transformParams: async ({ params, model }) => {
|
|
71
|
-
const providerId = model.provider;
|
|
72
58
|
const modelId = model.modelId;
|
|
73
|
-
const provider = detectProvider(
|
|
74
|
-
logger.info(`[Cache] Detected provider: ${provider}, model: ${modelId}`);
|
|
59
|
+
const provider = detectProvider(modelId);
|
|
75
60
|
if (provider === "unknown") {
|
|
76
|
-
logger.info("[Cache] Unknown provider, skipping caching");
|
|
77
61
|
return params;
|
|
78
62
|
}
|
|
79
63
|
const msgs = params.prompt;
|
|
@@ -89,14 +73,12 @@ export const cacheMiddleware = {
|
|
|
89
73
|
: "")
|
|
90
74
|
.join("\n");
|
|
91
75
|
// Check if system prompt is eligible for caching
|
|
92
|
-
const isEligible = isEligibleForCaching(systemText,
|
|
76
|
+
const isEligible = isEligibleForCaching(systemText, modelId);
|
|
93
77
|
if (!isEligible) {
|
|
94
|
-
logger.info("[Cache] System prompt not eligible for caching");
|
|
95
78
|
return params;
|
|
96
79
|
}
|
|
97
80
|
// Generate deterministic cache key
|
|
98
81
|
const cacheKey = generateCacheKey(systemText, provider);
|
|
99
|
-
logger.info(`[Cache] Generated cache key: ${cacheKey.substring(0, 8)}...`);
|
|
100
82
|
// Apply caching to system messages
|
|
101
83
|
for (const systemMsg of systemMessages) {
|
|
102
84
|
applyCaching(systemMsg, { ttl: "1h" });
|
|
@@ -128,7 +110,7 @@ export const cacheMiddleware = {
|
|
|
128
110
|
provider,
|
|
129
111
|
eligible: isEligible,
|
|
130
112
|
systemTokens: estimateTokens(systemText),
|
|
131
|
-
threshold: getMinTokenThreshold(
|
|
113
|
+
threshold: getMinTokenThreshold(modelId),
|
|
132
114
|
timestamp: Date.now(),
|
|
133
115
|
};
|
|
134
116
|
logger.info(`[Cache] Applied caching for ${provider} model`);
|
|
@@ -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;
|
|
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;IACvB,OAAO,CAAC,aAAa,CAA0C;gBAEnD,EACV,aAAa,EACb,MAAM,GACP,EAAE;QAAE,aAAa,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAMnD,eAAe;IASf,WAAW;IAKX,IAAI;IAMJ,eAAe,IAAI,wBAAwB;CA+D5C"}
|
package/dist/models/ai-config.js
CHANGED
|
@@ -30,15 +30,16 @@ function calculateThinkingLevel(userInput) {
|
|
|
30
30
|
export class AiConfig {
|
|
31
31
|
modelMetadata;
|
|
32
32
|
prompt;
|
|
33
|
+
thinkingLevel;
|
|
33
34
|
constructor({ modelMetadata, prompt, }) {
|
|
34
35
|
this.modelMetadata = modelMetadata;
|
|
35
36
|
this.prompt = prompt;
|
|
37
|
+
this.thinkingLevel = calculateThinkingLevel(this.prompt);
|
|
36
38
|
}
|
|
37
39
|
maxOutputTokens() {
|
|
38
40
|
const modelConfig = this.modelMetadata;
|
|
39
|
-
const thinkingLevel = calculateThinkingLevel(this.prompt);
|
|
40
41
|
const maxTokens = modelConfig.provider === "anthropic" && modelConfig.supportsReasoning
|
|
41
|
-
? modelConfig.maxOutputTokens - thinkingLevel.tokenBudget
|
|
42
|
+
? modelConfig.maxOutputTokens - this.thinkingLevel.tokenBudget
|
|
42
43
|
: modelConfig.maxOutputTokens;
|
|
43
44
|
return modelConfig.provider === "opencode" ? 8000 : maxTokens;
|
|
44
45
|
}
|
|
@@ -54,7 +55,7 @@ export class AiConfig {
|
|
|
54
55
|
}
|
|
55
56
|
providerOptions() {
|
|
56
57
|
const modelConfig = this.modelMetadata;
|
|
57
|
-
const thinkingLevel =
|
|
58
|
+
const thinkingLevel = this.thinkingLevel;
|
|
58
59
|
const meta = {
|
|
59
60
|
[modelConfig.provider]: {},
|
|
60
61
|
};
|
|
@@ -2,22 +2,19 @@ import type { ModelMetadata } from "./providers.ts";
|
|
|
2
2
|
declare const anthropicModels: {
|
|
3
3
|
readonly opus: import("@ai-sdk/provider").LanguageModelV3;
|
|
4
4
|
readonly sonnet: import("@ai-sdk/provider").LanguageModelV3;
|
|
5
|
-
readonly sonnet37: import("@ai-sdk/provider").LanguageModelV3;
|
|
6
|
-
readonly "sonnet37-token-efficient-tools": import("@ai-sdk/provider").LanguageModelV3;
|
|
7
|
-
readonly "sonnet37-128k": import("@ai-sdk/provider").LanguageModelV3;
|
|
8
|
-
readonly sonnet35: import("@ai-sdk/provider").LanguageModelV3;
|
|
9
5
|
readonly haiku: import("@ai-sdk/provider").LanguageModelV3;
|
|
10
6
|
};
|
|
11
7
|
type ModelName = `anthropic:${keyof typeof anthropicModels}`;
|
|
12
8
|
export declare const anthropicModelNames: ModelName[];
|
|
13
9
|
export declare const anthropicProvider: {
|
|
14
10
|
anthropic: import("@ai-sdk/provider").ProviderV3 & {
|
|
15
|
-
languageModel(modelId: "opus" | "sonnet" | "
|
|
11
|
+
languageModel(modelId: "opus" | "sonnet" | "haiku"): import("@ai-sdk/provider").LanguageModelV3;
|
|
16
12
|
embeddingModel(modelId: string): import("@ai-sdk/provider").EmbeddingModelV3;
|
|
17
13
|
imageModel(modelId: string): import("@ai-sdk/provider").ImageModelV3;
|
|
18
14
|
transcriptionModel(modelId: string): import("@ai-sdk/provider").TranscriptionModelV3;
|
|
19
15
|
rerankingModel(modelId: string): import("@ai-sdk/provider").RerankingModelV3;
|
|
20
16
|
speechModel(modelId: string): import("@ai-sdk/provider").SpeechModelV3;
|
|
17
|
+
videoModel(modelId: string): import("@ai-sdk/provider").Experimental_VideoModelV3;
|
|
21
18
|
};
|
|
22
19
|
};
|
|
23
20
|
export declare const anthropicModelRegistry: {
|