@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
|
@@ -3,7 +3,7 @@ import fs from "node:fs/promises";
|
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { z } from "zod";
|
|
6
|
-
import { jsonParser } from "
|
|
6
|
+
import { jsonParser } from "../utils/parsing.js";
|
|
7
7
|
export const defaultConfig = {
|
|
8
8
|
loop: {
|
|
9
9
|
maxIterations: 200,
|
|
@@ -22,9 +22,14 @@ export const defaultConfig = {
|
|
|
22
22
|
skills: {
|
|
23
23
|
enabled: true,
|
|
24
24
|
},
|
|
25
|
+
devtools: {
|
|
26
|
+
enabled: false,
|
|
27
|
+
},
|
|
28
|
+
autoGenerateRules: false,
|
|
29
|
+
env: {},
|
|
25
30
|
};
|
|
26
31
|
// Type definitions
|
|
27
|
-
const
|
|
32
|
+
const ConfigSchema = z.object({
|
|
28
33
|
logs: z
|
|
29
34
|
.object({
|
|
30
35
|
path: z.string(),
|
|
@@ -66,6 +71,17 @@ const ProjectConfigSchema = z.object({
|
|
|
66
71
|
})
|
|
67
72
|
.optional()
|
|
68
73
|
.default(defaultConfig.skills),
|
|
74
|
+
autoGenerateRules: z
|
|
75
|
+
.boolean()
|
|
76
|
+
.optional()
|
|
77
|
+
.default(defaultConfig.autoGenerateRules),
|
|
78
|
+
devtools: z
|
|
79
|
+
.object({
|
|
80
|
+
enabled: z.boolean().optional().default(defaultConfig.devtools.enabled),
|
|
81
|
+
})
|
|
82
|
+
.optional()
|
|
83
|
+
.default(defaultConfig.devtools),
|
|
84
|
+
env: z.record(z.string(), z.string()).optional().default(defaultConfig.env),
|
|
69
85
|
});
|
|
70
86
|
export class DirectoryProvider {
|
|
71
87
|
baseDir;
|
|
@@ -107,6 +123,9 @@ export class DirectoryProvider {
|
|
|
107
123
|
export class ConfigManager {
|
|
108
124
|
project;
|
|
109
125
|
app;
|
|
126
|
+
cachedConfig = null;
|
|
127
|
+
configCacheTime = 0;
|
|
128
|
+
configCacheTtl = 60000; // 60 seconds
|
|
110
129
|
constructor() {
|
|
111
130
|
this.project = new DirectoryProvider(path.join(process.cwd(), ".acai"));
|
|
112
131
|
this.app = new DirectoryProvider(path.join(homedir(), ".acai"));
|
|
@@ -114,7 +133,7 @@ export class ConfigManager {
|
|
|
114
133
|
async _readConfig(configPath) {
|
|
115
134
|
try {
|
|
116
135
|
const data = await fs.readFile(configPath, "utf8");
|
|
117
|
-
return jsonParser(
|
|
136
|
+
return jsonParser(ConfigSchema).parse(data);
|
|
118
137
|
}
|
|
119
138
|
catch (error) {
|
|
120
139
|
if (error.code === "ENOENT") {
|
|
@@ -123,17 +142,29 @@ export class ConfigManager {
|
|
|
123
142
|
throw error;
|
|
124
143
|
}
|
|
125
144
|
}
|
|
126
|
-
// Get merged configuration (project overrides app)
|
|
145
|
+
// Get merged configuration (project overrides app), cached with TTL
|
|
127
146
|
async getConfig() {
|
|
147
|
+
const now = Date.now();
|
|
148
|
+
if (this.cachedConfig && now - this.configCacheTime < this.configCacheTtl) {
|
|
149
|
+
return this.cachedConfig;
|
|
150
|
+
}
|
|
128
151
|
const appConfigPath = path.join(this.app.getPath(), "acai.json");
|
|
129
152
|
const projectConfigPath = path.join(this.project.getPath(), "acai.json");
|
|
130
153
|
const appConfig = await this._readConfig(appConfigPath);
|
|
131
154
|
const projectConfig = await this._readConfig(projectConfigPath);
|
|
155
|
+
const mergedEnv = {
|
|
156
|
+
...appConfig.env,
|
|
157
|
+
...projectConfig.env,
|
|
158
|
+
};
|
|
132
159
|
const mergedConfig = {
|
|
133
160
|
...appConfig,
|
|
134
161
|
...projectConfig,
|
|
162
|
+
env: mergedEnv,
|
|
135
163
|
};
|
|
136
|
-
|
|
164
|
+
const result = ConfigSchema.parse(mergedConfig);
|
|
165
|
+
this.cachedConfig = result;
|
|
166
|
+
this.configCacheTime = now;
|
|
167
|
+
return result;
|
|
137
168
|
}
|
|
138
169
|
// Skills settings helpers
|
|
139
170
|
async getSkillsEnabled() {
|
|
@@ -145,7 +176,7 @@ export class ConfigManager {
|
|
|
145
176
|
let configData = {};
|
|
146
177
|
try {
|
|
147
178
|
const data = await fs.readFile(configPath, "utf8");
|
|
148
|
-
configData = jsonParser(
|
|
179
|
+
configData = jsonParser(ConfigSchema.partial()).parse(data);
|
|
149
180
|
}
|
|
150
181
|
catch (error) {
|
|
151
182
|
if (error.code !== "ENOENT") {
|
|
@@ -197,38 +228,8 @@ export class ConfigManager {
|
|
|
197
228
|
throw error;
|
|
198
229
|
}
|
|
199
230
|
}
|
|
200
|
-
//
|
|
201
|
-
async
|
|
202
|
-
const rulesPath = path.join(this.project.getPath("rules"), "learned-rules.md");
|
|
203
|
-
try {
|
|
204
|
-
return await fs.readFile(rulesPath, "utf8");
|
|
205
|
-
}
|
|
206
|
-
catch (error) {
|
|
207
|
-
if (error.code === "ENOENT") {
|
|
208
|
-
return "";
|
|
209
|
-
}
|
|
210
|
-
throw error;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
async writeProjectLearnedRulesFile(rules) {
|
|
214
|
-
// Only write project rules if the project directory exists
|
|
215
|
-
if (!(await this.project.exists())) {
|
|
216
|
-
return; // Silently return if project directory doesn't exist
|
|
217
|
-
}
|
|
218
|
-
const rulesDir = await this.project.ensurePath("rules");
|
|
219
|
-
const rulesPath = path.join(rulesDir, "learned-rules.md");
|
|
220
|
-
try {
|
|
221
|
-
return await fs.writeFile(rulesPath, rules, "utf8");
|
|
222
|
-
}
|
|
223
|
-
catch (error) {
|
|
224
|
-
if (error.code === "ENOENT") {
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
throw error;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
// App-cached learned rules (used during conversation analysis)
|
|
231
|
-
async readCachedLearnedRulesFile() {
|
|
231
|
+
// Learned rules (global, stored in ~/.acai/rules/learned-rules.md)
|
|
232
|
+
async readLearnedRulesFile() {
|
|
232
233
|
const rulesPath = path.join(this.app.getPath("rules"), "learned-rules.md");
|
|
233
234
|
try {
|
|
234
235
|
return await fs.readFile(rulesPath, "utf8");
|
|
@@ -240,7 +241,7 @@ export class ConfigManager {
|
|
|
240
241
|
throw error;
|
|
241
242
|
}
|
|
242
243
|
}
|
|
243
|
-
async
|
|
244
|
+
async writeLearnedRulesFile(rules) {
|
|
244
245
|
const rulesDir = await this.app.ensurePath("rules");
|
|
245
246
|
const rulesPath = path.join(rulesDir, "learned-rules.md");
|
|
246
247
|
try {
|
|
@@ -258,11 +259,11 @@ export class ConfigManager {
|
|
|
258
259
|
const configPath = path.join(this.app.getPath(), `${configName}.json`);
|
|
259
260
|
try {
|
|
260
261
|
const data = await fs.readFile(configPath, "utf8");
|
|
261
|
-
return
|
|
262
|
+
return ConfigSchema.parse(JSON.parse(data));
|
|
262
263
|
}
|
|
263
264
|
catch (error) {
|
|
264
265
|
if (error.code === "ENOENT") {
|
|
265
|
-
return
|
|
266
|
+
return ConfigSchema.parse(defaultConfig);
|
|
266
267
|
}
|
|
267
268
|
throw error;
|
|
268
269
|
}
|
|
@@ -278,7 +279,7 @@ export class ConfigManager {
|
|
|
278
279
|
// Create directory and default config if missing
|
|
279
280
|
await this.app.ensurePath();
|
|
280
281
|
await fs.writeFile(configPath, JSON.stringify(defaultConfig, null, 2));
|
|
281
|
-
return
|
|
282
|
+
return ConfigSchema.parse(defaultConfig);
|
|
282
283
|
}
|
|
283
284
|
}
|
|
284
285
|
async writeAppConfig(configName, data) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/execution/index.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,UAAU,gBAAgB;IACxB,2DAA2D;IAC3D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mGAAmG;IACnG,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,0CAA0C;IAC1C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,2EAA2E;IAC3E,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,UAAU,wBAAyB,SAAQ,gBAAgB;IACzD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACxC;AAED;;GAEG;AACH,UAAU,iBAAiB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,UAAU,wBAAyB,SAAQ,iBAAiB;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAwBD;;GAEG;AACH,UAAU,eAAe;IACvB,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE;QACV,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;KAC1C,CAAC;CACH;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/execution/index.ts"],"names":[],"mappings":"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"}
|
package/dist/execution/index.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* in a controlled environment with proper error handling.
|
|
6
6
|
*/
|
|
7
7
|
import { exec, spawn } from "node:child_process";
|
|
8
|
-
import { logger } from "../logger.js";
|
|
8
|
+
import { logger } from "../utils/logger.js";
|
|
9
9
|
/**
|
|
10
10
|
* List of dangerous commands that shouldn't be executed
|
|
11
11
|
*/
|
|
@@ -44,6 +44,37 @@ function ttySizeEnv() {
|
|
|
44
44
|
}
|
|
45
45
|
return env;
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Factory function for creating abort handlers.
|
|
49
|
+
* Defined at module level to avoid capturing closure scope,
|
|
50
|
+
* preventing memory leaks when AbortSignal is long-lived.
|
|
51
|
+
*/
|
|
52
|
+
function createAbortHandler(childProc, cmd, start, settleFn, shouldThrow) {
|
|
53
|
+
return function abortHandler() {
|
|
54
|
+
childProc.kill("SIGTERM");
|
|
55
|
+
const error = new Error("Command execution aborted");
|
|
56
|
+
const duration = Date.now() - start;
|
|
57
|
+
settleFn({
|
|
58
|
+
output: "",
|
|
59
|
+
exitCode: 1,
|
|
60
|
+
error,
|
|
61
|
+
command: cmd,
|
|
62
|
+
duration,
|
|
63
|
+
}, shouldThrow, error);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Factory function for creating background process abort handlers.
|
|
68
|
+
* Defined at module level to avoid capturing closure scope.
|
|
69
|
+
* Note: Process cleanup from backgroundProcesses map is handled by the exit handler.
|
|
70
|
+
*/
|
|
71
|
+
function createBackgroundAbortHandler(childProc, getRunningState) {
|
|
72
|
+
return function abortHandler() {
|
|
73
|
+
if (getRunningState()) {
|
|
74
|
+
childProc.kill("SIGTERM");
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
}
|
|
47
78
|
export class ExecutionEnvironment {
|
|
48
79
|
config;
|
|
49
80
|
backgroundProcesses = new Map();
|
|
@@ -148,62 +179,58 @@ export class ExecutionEnvironment {
|
|
|
148
179
|
resolve(result);
|
|
149
180
|
}
|
|
150
181
|
};
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
182
|
+
// Extract callback handlers to reduce cognitive complexity
|
|
183
|
+
const handleExecError = (error, output, duration) => {
|
|
184
|
+
const exitCode = error.code ?? 1;
|
|
185
|
+
logger.error({
|
|
186
|
+
error: error.message,
|
|
187
|
+
exitCode,
|
|
188
|
+
duration,
|
|
189
|
+
}, `Command execution failed: ${command}`);
|
|
190
|
+
settle({
|
|
191
|
+
output: preserveOutputOnError ? output : "",
|
|
192
|
+
exitCode,
|
|
193
|
+
error,
|
|
194
|
+
command,
|
|
195
|
+
duration,
|
|
196
|
+
}, throwOnError, error);
|
|
197
|
+
};
|
|
198
|
+
const handleExecSuccess = (output, duration) => {
|
|
199
|
+
logger.debug({
|
|
200
|
+
duration,
|
|
201
|
+
outputLength: output.length,
|
|
202
|
+
}, `Command executed successfully: ${command}`);
|
|
203
|
+
settle({
|
|
204
|
+
output,
|
|
205
|
+
exitCode: 0,
|
|
206
|
+
command,
|
|
207
|
+
duration,
|
|
208
|
+
}, false);
|
|
209
|
+
};
|
|
210
|
+
const handleExecCallback = (error, stdout, stderr) => {
|
|
160
211
|
const duration = Date.now() - startTime;
|
|
161
|
-
// Combine stdout and stderr if requested
|
|
162
212
|
const output = captureStderr
|
|
163
213
|
? `${stdout}${stderr ? stderr : ""}`
|
|
164
214
|
: stdout;
|
|
165
215
|
if (error) {
|
|
166
|
-
|
|
167
|
-
logger.error({
|
|
168
|
-
error: error.message,
|
|
169
|
-
exitCode,
|
|
170
|
-
duration,
|
|
171
|
-
}, `Command execution failed: ${command}`);
|
|
172
|
-
settle({
|
|
173
|
-
output: preserveOutputOnError ? output : "",
|
|
174
|
-
exitCode,
|
|
175
|
-
error,
|
|
176
|
-
command,
|
|
177
|
-
duration,
|
|
178
|
-
}, throwOnError, error);
|
|
216
|
+
handleExecError(error, output, duration);
|
|
179
217
|
}
|
|
180
218
|
else {
|
|
181
|
-
|
|
182
|
-
duration,
|
|
183
|
-
outputLength: output.length,
|
|
184
|
-
}, `Command executed successfully: ${command}`);
|
|
185
|
-
settle({
|
|
186
|
-
output,
|
|
187
|
-
exitCode: 0,
|
|
188
|
-
command,
|
|
189
|
-
duration,
|
|
190
|
-
}, false);
|
|
219
|
+
handleExecSuccess(output, duration);
|
|
191
220
|
}
|
|
192
|
-
}
|
|
221
|
+
};
|
|
222
|
+
const childProcess = exec(command, {
|
|
223
|
+
cwd,
|
|
224
|
+
env,
|
|
225
|
+
timeout,
|
|
226
|
+
maxBuffer,
|
|
227
|
+
shell,
|
|
228
|
+
windowsHide: true,
|
|
229
|
+
encoding: "utf8",
|
|
230
|
+
}, handleExecCallback);
|
|
193
231
|
// Handle abort signal
|
|
194
232
|
if (options.abortSignal) {
|
|
195
|
-
abortHandler = (
|
|
196
|
-
logger.warn({ command, pid: childProcess.pid }, "Command execution aborted");
|
|
197
|
-
childProcess.kill("SIGTERM");
|
|
198
|
-
const error = new Error("Command execution aborted");
|
|
199
|
-
settle({
|
|
200
|
-
output: "",
|
|
201
|
-
exitCode: 1,
|
|
202
|
-
error,
|
|
203
|
-
command,
|
|
204
|
-
duration: Date.now() - startTime,
|
|
205
|
-
}, throwOnError, error);
|
|
206
|
-
};
|
|
233
|
+
abortHandler = createAbortHandler(childProcess, command, startTime, settle, throwOnError);
|
|
207
234
|
options.abortSignal.addEventListener("abort", abortHandler, {
|
|
208
235
|
once: true,
|
|
209
236
|
});
|
|
@@ -314,14 +341,7 @@ export class ExecutionEnvironment {
|
|
|
314
341
|
// Handle abort signal for background process
|
|
315
342
|
let abortHandler;
|
|
316
343
|
if (options.abortSignal) {
|
|
317
|
-
abortHandler = () =>
|
|
318
|
-
logger.warn({ command, pid }, "Background command execution aborted");
|
|
319
|
-
if (isRunning) {
|
|
320
|
-
childProcess.kill("SIGTERM");
|
|
321
|
-
isRunning = false;
|
|
322
|
-
this.backgroundProcesses.delete(pid);
|
|
323
|
-
}
|
|
324
|
-
};
|
|
344
|
+
abortHandler = createBackgroundAbortHandler(childProcess, () => isRunning);
|
|
325
345
|
options.abortSignal.addEventListener("abort", abortHandler, {
|
|
326
346
|
once: true,
|
|
327
347
|
});
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":";AA6BA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAGD,wBAAgB,sBAAsB,CACpC,UAAU,GAAE,MAAM,EAAO,GACxB,gBAAgB,CAsBlB;AAoDD,QAAA,MAAM,KAAK;;;;;;;;;;CAAyB,CAAC;AAMrC;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAE9C;AAED,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC"}
|