@travisennis/acai 0.0.10 → 0.0.12
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 +7 -4
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +29 -27
- package/dist/cli/stdin.d.ts +2 -1
- package/dist/cli/stdin.d.ts.map +1 -1
- package/dist/commands/generate-rules/service.d.ts +3 -2
- package/dist/commands/generate-rules/service.d.ts.map +1 -1
- package/dist/commands/health/utils.d.ts +3 -2
- package/dist/commands/health/utils.d.ts.map +1 -1
- package/dist/commands/init-project/utils.d.ts +2 -1
- package/dist/commands/init-project/utils.d.ts.map +1 -1
- package/dist/commands/init-project/utils.js +0 -11
- package/dist/commands/manager.d.ts.map +1 -1
- package/dist/commands/manager.js +6 -1
- package/dist/commands/resources/index.d.ts.map +1 -1
- package/dist/commands/resources/index.js +4 -1
- package/dist/commands/review/utils.d.ts +6 -1
- package/dist/commands/review/utils.d.ts.map +1 -1
- package/dist/commands/session/index.d.ts.map +1 -1
- package/dist/commands/session/index.js +6 -0
- package/dist/commands/session/types.d.ts +1 -0
- package/dist/commands/session/types.d.ts.map +1 -1
- package/dist/commands/tools/index.d.ts +3 -0
- package/dist/commands/tools/index.d.ts.map +1 -0
- package/dist/commands/tools/index.js +190 -0
- package/dist/commands/tools/templates.d.ts +6 -0
- package/dist/commands/tools/templates.d.ts.map +1 -0
- package/dist/commands/tools/templates.js +97 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +41 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -3
- package/dist/models/anthropic-provider.d.ts +1 -1
- package/dist/models/deepseek-provider.d.ts +3 -3
- package/dist/models/deepseek-provider.js +17 -17
- package/dist/models/google-provider.d.ts +2 -4
- package/dist/models/google-provider.d.ts.map +1 -1
- package/dist/models/google-provider.js +2 -17
- package/dist/models/groq-provider.d.ts +2 -4
- package/dist/models/groq-provider.d.ts.map +1 -1
- package/dist/models/groq-provider.js +3 -21
- package/dist/models/opencode-go-provider.d.ts +35 -0
- package/dist/models/opencode-go-provider.d.ts.map +1 -0
- package/dist/models/opencode-go-provider.js +214 -0
- package/dist/models/opencode-zen-provider.d.ts +5 -5
- package/dist/models/opencode-zen-provider.d.ts.map +1 -1
- package/dist/models/opencode-zen-provider.js +41 -47
- package/dist/models/openrouter-provider.d.ts +5 -13
- package/dist/models/openrouter-provider.d.ts.map +1 -1
- package/dist/models/openrouter-provider.js +34 -138
- package/dist/models/providers.d.ts +3 -3
- package/dist/models/providers.d.ts.map +1 -1
- package/dist/models/providers.js +6 -0
- package/dist/models/xai-provider.d.ts +1 -2
- package/dist/models/xai-provider.d.ts.map +1 -1
- package/dist/models/xai-provider.js +0 -13
- package/dist/prompts/manager.d.ts.map +1 -1
- package/dist/prompts/manager.js +5 -1
- package/dist/prompts/mentions.d.ts.map +1 -1
- package/dist/prompts/mentions.js +35 -6
- package/dist/prompts/system-prompt.d.ts +1 -0
- package/dist/prompts/system-prompt.d.ts.map +1 -1
- package/dist/prompts/system-prompt.js +20 -5
- package/dist/repl/index.d.ts +1 -2
- package/dist/repl/index.d.ts.map +1 -1
- package/dist/repl/index.js +14 -53
- package/dist/sessions/manager.d.ts +3 -3
- package/dist/sessions/manager.d.ts.map +1 -1
- package/dist/sessions/manager.js +1 -1
- package/dist/skills/activated-tracker.d.ts +11 -0
- package/dist/skills/activated-tracker.d.ts.map +1 -0
- package/dist/skills/activated-tracker.js +16 -0
- package/dist/skills/index.d.ts +3 -2
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +7 -1
- package/dist/subagents/index.d.ts +2 -1
- package/dist/subagents/index.d.ts.map +1 -1
- package/dist/terminal/table/utils.d.ts +1 -1
- package/dist/terminal/table/utils.d.ts.map +1 -1
- package/dist/terminal/wrap-ansi.js +2 -2
- package/dist/tools/agent.js +1 -1
- package/dist/tools/apply-patch.d.ts +62 -0
- package/dist/tools/apply-patch.d.ts.map +1 -0
- package/dist/tools/apply-patch.js +377 -0
- package/dist/tools/bash.d.ts +4 -4
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +40 -8
- package/dist/tools/directory-tree.d.ts +4 -4
- package/dist/tools/directory-tree.d.ts.map +1 -1
- package/dist/tools/directory-tree.js +3 -1
- package/dist/tools/dynamic-tool-loader.d.ts +12 -3
- package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
- package/dist/tools/dynamic-tool-loader.js +299 -39
- package/dist/tools/edit-file.d.ts +2 -2
- package/dist/tools/edit-file.d.ts.map +1 -1
- package/dist/tools/edit-file.js +188 -79
- package/dist/tools/glob.d.ts +16 -16
- package/dist/tools/glob.d.ts.map +1 -1
- package/dist/tools/glob.js +30 -15
- package/dist/tools/grep.d.ts +14 -14
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +50 -29
- package/dist/tools/index.d.ts +57 -84
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +20 -5
- package/dist/tools/ls.d.ts +2 -2
- package/dist/tools/ls.d.ts.map +1 -1
- package/dist/tools/ls.js +2 -1
- package/dist/tools/read-file.d.ts +9 -11
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +21 -16
- package/dist/tools/save-file.d.ts +4 -4
- package/dist/tools/save-file.d.ts.map +1 -1
- package/dist/tools/save-file.js +26 -21
- package/dist/tools/skill.d.ts +2 -1
- package/dist/tools/skill.d.ts.map +1 -1
- package/dist/tools/skill.js +55 -12
- package/dist/tools/types.d.ts +8 -2
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/web-fetch.d.ts +6 -18
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +45 -9
- package/dist/tools/web-search.d.ts +4 -22
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +1 -1
- package/dist/tui/autocomplete/file-search-provider.js +1 -1
- package/dist/tui/autocomplete/utils.d.ts +2 -1
- package/dist/tui/autocomplete/utils.d.ts.map +1 -1
- package/dist/tui/autocomplete/utils.js +25 -23
- package/dist/tui/components/editor.d.ts +2 -1
- package/dist/tui/components/editor.d.ts.map +1 -1
- package/dist/tui/components/editor.js +1 -1
- package/dist/tui/components/footer.d.ts +0 -2
- package/dist/tui/components/footer.d.ts.map +1 -1
- package/dist/tui/components/footer.js +1 -17
- package/dist/tui/components/markdown.d.ts +2 -2
- package/dist/tui/components/markdown.d.ts.map +1 -1
- package/dist/tui/components/welcome.d.ts +2 -1
- package/dist/tui/components/welcome.d.ts.map +1 -1
- package/dist/tui/editor-launcher.d.ts +3 -2
- package/dist/tui/editor-launcher.d.ts.map +1 -1
- package/dist/tui/index.d.ts +0 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/tui.d.ts +1 -0
- package/dist/tui/tui.d.ts.map +1 -1
- package/dist/tui/tui.js +9 -0
- package/dist/tui/utils.d.ts +1 -5
- package/dist/tui/utils.d.ts.map +1 -1
- package/dist/tui/utils.js +271 -44
- package/dist/utils/binary-output.d.ts +32 -0
- package/dist/utils/binary-output.d.ts.map +1 -0
- package/dist/utils/binary-output.js +127 -0
- package/dist/utils/command-protection.d.ts.map +1 -1
- package/dist/utils/command-protection.js +92 -9
- package/dist/utils/parsing.d.ts +1 -1
- package/dist/utils/parsing.d.ts.map +1 -1
- package/package.json +28 -26
- package/dist/commands/add-directory/types.d.ts +0 -6
- package/dist/commands/add-directory/types.d.ts.map +0 -1
- package/dist/commands/add-directory/types.js +0 -1
- package/dist/commands/copy/types.d.ts +0 -3
- package/dist/commands/copy/types.d.ts.map +0 -1
- package/dist/commands/copy/types.js +0 -1
- package/dist/commands/review/types.d.ts +0 -12
- package/dist/commands/review/types.d.ts.map +0 -1
- package/dist/commands/review/types.js +0 -1
- package/dist/modes/manager.d.ts +0 -23
- package/dist/modes/manager.d.ts.map +0 -1
- package/dist/modes/manager.js +0 -77
- package/dist/modes/prompts.d.ts +0 -2
- package/dist/modes/prompts.d.ts.map +0 -1
- package/dist/modes/prompts.js +0 -143
- package/dist/tools/code-search.d.ts +0 -41
- package/dist/tools/code-search.d.ts.map +0 -1
- package/dist/tools/code-search.js +0 -195
- package/dist/utils/iterables.d.ts +0 -2
- package/dist/utils/iterables.d.ts.map +0 -1
- package/dist/utils/iterables.js +0 -6
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
export function nodeTemplate(name, description) {
|
|
2
|
+
return `#!/usr/bin/env node
|
|
3
|
+
|
|
4
|
+
const TOOL_ACTION = process.env.TOOL_ACTION;
|
|
5
|
+
|
|
6
|
+
if (TOOL_ACTION === 'describe') {
|
|
7
|
+
console.log(JSON.stringify({
|
|
8
|
+
name: '${name}',
|
|
9
|
+
description: '${description}',
|
|
10
|
+
parameters: [],
|
|
11
|
+
needsApproval: false,
|
|
12
|
+
}, null, 2));
|
|
13
|
+
process.exit(0);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (TOOL_ACTION === 'execute') {
|
|
17
|
+
let data = '';
|
|
18
|
+
process.stdin.setEncoding('utf8');
|
|
19
|
+
process.stdin.on('data', (chunk) => { data += chunk; });
|
|
20
|
+
process.stdin.on('end', () => {
|
|
21
|
+
const params = JSON.parse(data);
|
|
22
|
+
// Your tool logic here
|
|
23
|
+
console.log('Hello from ${name}');
|
|
24
|
+
process.exit(0);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
`;
|
|
28
|
+
}
|
|
29
|
+
export function bashTemplate(name, description) {
|
|
30
|
+
return `#!/bin/bash
|
|
31
|
+
|
|
32
|
+
action="\${TOOL_ACTION}"
|
|
33
|
+
|
|
34
|
+
if [ "$action" = "describe" ]; then
|
|
35
|
+
cat << 'EOF'
|
|
36
|
+
name: ${name}
|
|
37
|
+
description: ${description}
|
|
38
|
+
EOF
|
|
39
|
+
exit 0
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
if [ "$action" = "execute" ]; then
|
|
43
|
+
# Read key-value params from stdin
|
|
44
|
+
while IFS='=' read -r key value; do
|
|
45
|
+
declare "$key"="$value"
|
|
46
|
+
done
|
|
47
|
+
# Your tool logic here
|
|
48
|
+
echo "Hello from ${name}"
|
|
49
|
+
exit 0
|
|
50
|
+
fi
|
|
51
|
+
`;
|
|
52
|
+
}
|
|
53
|
+
export function zshTemplate(name, description) {
|
|
54
|
+
return `#!/bin/zsh
|
|
55
|
+
|
|
56
|
+
action="\${TOOL_ACTION}"
|
|
57
|
+
|
|
58
|
+
if [ "$action" = "describe" ]; then
|
|
59
|
+
cat << 'EOF'
|
|
60
|
+
name: ${name}
|
|
61
|
+
description: ${description}
|
|
62
|
+
EOF
|
|
63
|
+
exit 0
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
if [ "$action" = "execute" ]; then
|
|
67
|
+
# Read key-value params from stdin
|
|
68
|
+
while IFS='=' read -r key value; do
|
|
69
|
+
declare "$key"="$value"
|
|
70
|
+
done
|
|
71
|
+
# Your tool logic here
|
|
72
|
+
echo "Hello from ${name}"
|
|
73
|
+
exit 0
|
|
74
|
+
fi
|
|
75
|
+
`;
|
|
76
|
+
}
|
|
77
|
+
export function textSchemaTemplate(name, description) {
|
|
78
|
+
return `name: ${name}
|
|
79
|
+
description: ${description}
|
|
80
|
+
`;
|
|
81
|
+
}
|
|
82
|
+
export function textCompanionTemplate(name) {
|
|
83
|
+
return `#!/bin/bash
|
|
84
|
+
# Companion script for ${name}.tool
|
|
85
|
+
# Modify this script to implement your tool logic
|
|
86
|
+
|
|
87
|
+
action="\${TOOL_ACTION}"
|
|
88
|
+
|
|
89
|
+
if [ "$action" = "execute" ]; then
|
|
90
|
+
while IFS='=' read -r key value; do
|
|
91
|
+
declare "$key"="$value"
|
|
92
|
+
done
|
|
93
|
+
echo "Hello from ${name}"
|
|
94
|
+
exit 0
|
|
95
|
+
fi
|
|
96
|
+
`;
|
|
97
|
+
}
|
package/dist/config/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
export declare function parseSkillsPath(skillsPath: string): string[];
|
|
2
3
|
export declare const defaultConfig: {
|
|
3
4
|
readonly loop: {
|
|
4
5
|
readonly maxIterations: 200;
|
|
@@ -16,11 +17,13 @@ export declare const defaultConfig: {
|
|
|
16
17
|
readonly readOnlyFiles: string[];
|
|
17
18
|
readonly skills: {
|
|
18
19
|
readonly enabled: true;
|
|
20
|
+
readonly path: "";
|
|
19
21
|
};
|
|
20
22
|
readonly devtools: {
|
|
21
23
|
readonly enabled: false;
|
|
22
24
|
};
|
|
23
25
|
readonly autoGenerateRules: false;
|
|
26
|
+
readonly allowedDirs: string[];
|
|
24
27
|
readonly env: Record<string, string>;
|
|
25
28
|
};
|
|
26
29
|
declare const ConfigSchema: z.ZodObject<{
|
|
@@ -43,8 +46,10 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
43
46
|
readOnlyFiles: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
|
|
44
47
|
skills: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
45
48
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
49
|
+
path: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
46
50
|
}, z.core.$strip>>>;
|
|
47
51
|
autoGenerateRules: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
52
|
+
allowedDirs: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
|
|
48
53
|
devtools: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
49
54
|
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
50
55
|
}, z.core.$strip>>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/config/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/config/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAa5D;AAED,eAAO,MAAM,aAAa;;;;;8BAKI,MAAM,EAAE,GAAG,SAAS;;;;;;;;;4BAS3B,MAAM,EAAE;;;;;;;;;0BASV,MAAM,EAAE;kBAChB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAGX,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0DhB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,MAAM;IAI3B,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAK1B,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOlD,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAOjC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW/C,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;CAIrC;AAED,qBAAa,aAAa;IACxB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC;IAChC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,cAAc,CAAS;;YAOjB,WAAW;IAanB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IA6C5B,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAKpC,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBjD,eAAe,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAgC/D,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7C,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAYvC,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAc3C,cAAc;IActB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAexD,cAAc,CAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;CAKjB;AAGD,eAAO,MAAM,MAAM,eAAsB,CAAC"}
|
package/dist/config/index.js
CHANGED
|
@@ -4,6 +4,22 @@ import { homedir } from "node:os";
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import { jsonParser } from "../utils/parsing.js";
|
|
7
|
+
const PATH_SEPARATOR = process.platform === "win32" ? ";" : ":";
|
|
8
|
+
export function parseSkillsPath(skillsPath) {
|
|
9
|
+
if (!skillsPath)
|
|
10
|
+
return [];
|
|
11
|
+
const paths = skillsPath
|
|
12
|
+
.split(PATH_SEPARATOR)
|
|
13
|
+
.map((p) => p.trim())
|
|
14
|
+
.filter((p) => p.length > 0)
|
|
15
|
+
.map((p) => {
|
|
16
|
+
if (p.startsWith("~")) {
|
|
17
|
+
return path.join(homedir(), p.slice(1));
|
|
18
|
+
}
|
|
19
|
+
return path.resolve(p);
|
|
20
|
+
});
|
|
21
|
+
return [...new Set(paths)];
|
|
22
|
+
}
|
|
7
23
|
export const defaultConfig = {
|
|
8
24
|
loop: {
|
|
9
25
|
maxIterations: 200,
|
|
@@ -21,11 +37,13 @@ export const defaultConfig = {
|
|
|
21
37
|
readOnlyFiles: [],
|
|
22
38
|
skills: {
|
|
23
39
|
enabled: true,
|
|
40
|
+
path: "",
|
|
24
41
|
},
|
|
25
42
|
devtools: {
|
|
26
43
|
enabled: false,
|
|
27
44
|
},
|
|
28
45
|
autoGenerateRules: false,
|
|
46
|
+
allowedDirs: [],
|
|
29
47
|
env: {},
|
|
30
48
|
};
|
|
31
49
|
// Type definitions
|
|
@@ -68,6 +86,7 @@ const ConfigSchema = z.object({
|
|
|
68
86
|
skills: z
|
|
69
87
|
.object({
|
|
70
88
|
enabled: z.boolean().optional().default(defaultConfig.skills.enabled),
|
|
89
|
+
path: z.string().optional().default(defaultConfig.skills.path),
|
|
71
90
|
})
|
|
72
91
|
.optional()
|
|
73
92
|
.default(defaultConfig.skills),
|
|
@@ -75,6 +94,10 @@ const ConfigSchema = z.object({
|
|
|
75
94
|
.boolean()
|
|
76
95
|
.optional()
|
|
77
96
|
.default(defaultConfig.autoGenerateRules),
|
|
97
|
+
allowedDirs: z
|
|
98
|
+
.array(z.string())
|
|
99
|
+
.optional()
|
|
100
|
+
.default(defaultConfig.allowedDirs),
|
|
78
101
|
devtools: z
|
|
79
102
|
.object({
|
|
80
103
|
enabled: z.boolean().optional().default(defaultConfig.devtools.enabled),
|
|
@@ -156,10 +179,23 @@ export class ConfigManager {
|
|
|
156
179
|
...appConfig.env,
|
|
157
180
|
...projectConfig.env,
|
|
158
181
|
};
|
|
182
|
+
const mergedAllowedDirs = [
|
|
183
|
+
...(appConfig.allowedDirs ?? []),
|
|
184
|
+
...(projectConfig.allowedDirs ?? []),
|
|
185
|
+
];
|
|
186
|
+
const mergedSkills = {
|
|
187
|
+
...appConfig.skills,
|
|
188
|
+
...projectConfig.skills,
|
|
189
|
+
path: [appConfig.skills?.path, projectConfig.skills?.path]
|
|
190
|
+
.filter((p) => !!p)
|
|
191
|
+
.join(PATH_SEPARATOR),
|
|
192
|
+
};
|
|
159
193
|
const mergedConfig = {
|
|
160
194
|
...appConfig,
|
|
161
195
|
...projectConfig,
|
|
162
196
|
env: mergedEnv,
|
|
197
|
+
allowedDirs: mergedAllowedDirs,
|
|
198
|
+
skills: mergedSkills,
|
|
163
199
|
};
|
|
164
200
|
const result = ConfigSchema.parse(mergedConfig);
|
|
165
201
|
this.cachedConfig = result;
|
|
@@ -184,7 +220,7 @@ export class ConfigManager {
|
|
|
184
220
|
}
|
|
185
221
|
}
|
|
186
222
|
if (!configData.skills) {
|
|
187
|
-
configData.skills = { enabled: true };
|
|
223
|
+
configData.skills = { enabled: true, path: "" };
|
|
188
224
|
}
|
|
189
225
|
configData.skills.enabled = enabled;
|
|
190
226
|
await this.app.ensurePath();
|
|
@@ -197,6 +233,10 @@ export class ConfigManager {
|
|
|
197
233
|
absolute: path.join(this.app.getPath(), "AGENTS.md"),
|
|
198
234
|
relative: "~/.acai/AGENTS.md",
|
|
199
235
|
},
|
|
236
|
+
{
|
|
237
|
+
absolute: path.join(homedir(), ".config", "AGENTS.md"),
|
|
238
|
+
relative: "~/.config/AGENTS.md",
|
|
239
|
+
},
|
|
200
240
|
{
|
|
201
241
|
absolute: path.join(process.cwd(), "AGENTS.md"),
|
|
202
242
|
relative: "./AGENTS.md",
|
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":";AAiCA,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"}
|
package/dist/index.js
CHANGED
|
@@ -22,7 +22,7 @@ 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
|
-
import { initTools } from "./tools/index.js";
|
|
25
|
+
import { getActivatedSkillsTracker, initTools, } from "./tools/index.js";
|
|
26
26
|
import { logger } from "./utils/logger.js";
|
|
27
27
|
import { getPackageVersion } from "./utils/version.js";
|
|
28
28
|
// Create workspace context from CLI arguments
|
|
@@ -221,7 +221,7 @@ async function determineInitialPrompt() {
|
|
|
221
221
|
async function initializeModelManager(appDir) {
|
|
222
222
|
const chosenModel = isSupportedModel(flags.model)
|
|
223
223
|
? flags.model
|
|
224
|
-
: "opencode:
|
|
224
|
+
: "opencode-go:glm-5-1"; // DEFAULT MODEL
|
|
225
225
|
const projectConfig = await config.getConfig();
|
|
226
226
|
const devtoolsEnabled = projectConfig.devtools?.enabled ?? false;
|
|
227
227
|
const modelManager = new ModelManager({
|
|
@@ -232,7 +232,7 @@ async function initializeModelManager(appDir) {
|
|
|
232
232
|
modelManager.setModel("cli", chosenModel);
|
|
233
233
|
modelManager.setModel("title-conversation", chosenModel);
|
|
234
234
|
modelManager.setModel("conversation-summarizer", chosenModel);
|
|
235
|
-
modelManager.setModel("tool-repair", "openai:gpt-5.
|
|
235
|
+
modelManager.setModel("tool-repair", "openai:gpt-5.4-mini");
|
|
236
236
|
modelManager.setModel("conversation-analyzer", chosenModel);
|
|
237
237
|
modelManager.setModel("init-project", chosenModel);
|
|
238
238
|
modelManager.setModel("handoff-agent", chosenModel);
|
|
@@ -337,6 +337,7 @@ function setupReplEventHandlers(repl, agent, sessionManager, noSession) {
|
|
|
337
337
|
logger.info("Resetting agent state.");
|
|
338
338
|
agent.resetState();
|
|
339
339
|
agent.setConfig(await config.getConfig());
|
|
340
|
+
getActivatedSkillsTracker().reset();
|
|
340
341
|
void repl.rerender();
|
|
341
342
|
});
|
|
342
343
|
repl.setInterruptCallback(async () => {
|
|
@@ -462,6 +463,17 @@ async function main() {
|
|
|
462
463
|
const { initialPromptInput, stdinContent, hasContinueOrResume, resumeSessionId, } = await determineInitialPrompt();
|
|
463
464
|
// Initialize application state
|
|
464
465
|
const state = await initializeAppState(appConfig, initialPromptInput, stdinContent, hasContinueOrResume, resumeSessionId);
|
|
466
|
+
// Add config-sourced allowed directories
|
|
467
|
+
const configAllowedDirs = appConfig.allowedDirs ?? [];
|
|
468
|
+
for (const dir of configAllowedDirs) {
|
|
469
|
+
const expandedDir = dir.startsWith("~/") || dir === "~"
|
|
470
|
+
? path.join(os.homedir(), dir.slice(1))
|
|
471
|
+
: dir;
|
|
472
|
+
const resolvedDir = path.resolve(expandedDir);
|
|
473
|
+
if (!workspace.allowedDirs.includes(resolvedDir)) {
|
|
474
|
+
workspace.allowedDirs.push(resolvedDir);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
465
477
|
// Add logs directory to allowed directories if configured
|
|
466
478
|
const logsPath = (await config.getConfig()).logs?.path;
|
|
467
479
|
if (logsPath) {
|
|
@@ -8,7 +8,7 @@ type ModelName = `anthropic:${keyof typeof anthropicModels}`;
|
|
|
8
8
|
export declare const anthropicModelNames: ModelName[];
|
|
9
9
|
export declare const anthropicProvider: {
|
|
10
10
|
anthropic: import("@ai-sdk/provider").ProviderV3 & {
|
|
11
|
-
languageModel(modelId: "
|
|
11
|
+
languageModel(modelId: "haiku" | "opus" | "sonnet"): import("@ai-sdk/provider").LanguageModelV3;
|
|
12
12
|
embeddingModel(modelId: string): import("@ai-sdk/provider").EmbeddingModelV3;
|
|
13
13
|
imageModel(modelId: string): import("@ai-sdk/provider").ImageModelV3;
|
|
14
14
|
transcriptionModel(modelId: string): import("@ai-sdk/provider").TranscriptionModelV3;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { ModelMetadata } from "./providers.ts";
|
|
2
2
|
declare const deepseekModels: {
|
|
3
|
-
readonly "deepseek-
|
|
4
|
-
readonly "deepseek-
|
|
3
|
+
readonly "deepseek-v4-flash": import("@ai-sdk/provider").LanguageModelV3;
|
|
4
|
+
readonly "deepseek-v4-pro": import("@ai-sdk/provider").LanguageModelV3;
|
|
5
5
|
};
|
|
6
6
|
type ModelName = `deepseek:${keyof typeof deepseekModels}`;
|
|
7
7
|
export declare const deepseekModelNames: ModelName[];
|
|
8
8
|
export declare const deepseekProvider: {
|
|
9
9
|
deepseek: import("@ai-sdk/provider").ProviderV3 & {
|
|
10
|
-
languageModel(modelId: "deepseek-
|
|
10
|
+
languageModel(modelId: "deepseek-v4-flash" | "deepseek-v4-pro"): import("@ai-sdk/provider").LanguageModelV3;
|
|
11
11
|
embeddingModel(modelId: string): import("@ai-sdk/provider").EmbeddingModelV3;
|
|
12
12
|
imageModel(modelId: string): import("@ai-sdk/provider").ImageModelV3;
|
|
13
13
|
transcriptionModel(modelId: string): import("@ai-sdk/provider").TranscriptionModelV3;
|
|
@@ -2,8 +2,8 @@ import { deepseek as originalDeepseek } from "@ai-sdk/deepseek";
|
|
|
2
2
|
import { objectKeys } from "@travisennis/stdlib/object";
|
|
3
3
|
import { customProvider } from "ai";
|
|
4
4
|
const deepseekModels = {
|
|
5
|
-
"deepseek-
|
|
6
|
-
"deepseek-
|
|
5
|
+
"deepseek-v4-flash": originalDeepseek("deepseek-v4-flash"),
|
|
6
|
+
"deepseek-v4-pro": originalDeepseek("deepseek-v4-pro"),
|
|
7
7
|
};
|
|
8
8
|
export const deepseekModelNames = objectKeys(deepseekModels).map((key) => `deepseek:${key}`);
|
|
9
9
|
export const deepseekProvider = {
|
|
@@ -13,28 +13,28 @@ export const deepseekProvider = {
|
|
|
13
13
|
}),
|
|
14
14
|
};
|
|
15
15
|
export const deepseekModelRegistry = {
|
|
16
|
-
"deepseek:deepseek-
|
|
17
|
-
id: "deepseek:deepseek-
|
|
16
|
+
"deepseek:deepseek-v4-flash": {
|
|
17
|
+
id: "deepseek:deepseek-v4-flash",
|
|
18
18
|
provider: "deepseek",
|
|
19
|
-
contextWindow:
|
|
20
|
-
maxOutputTokens:
|
|
19
|
+
contextWindow: 1000000,
|
|
20
|
+
maxOutputTokens: 384000,
|
|
21
21
|
defaultTemperature: 0.3,
|
|
22
22
|
promptFormat: "bracket",
|
|
23
|
-
supportsReasoning:
|
|
23
|
+
supportsReasoning: true,
|
|
24
24
|
supportsToolCalling: true,
|
|
25
|
-
costPerInputToken: 0.
|
|
26
|
-
costPerOutputToken: 0.
|
|
25
|
+
costPerInputToken: 0.00000014,
|
|
26
|
+
costPerOutputToken: 0.00000028,
|
|
27
27
|
},
|
|
28
|
-
"deepseek:deepseek-
|
|
29
|
-
id: "deepseek:deepseek-
|
|
28
|
+
"deepseek:deepseek-v4-pro": {
|
|
29
|
+
id: "deepseek:deepseek-v4-pro",
|
|
30
30
|
provider: "deepseek",
|
|
31
|
-
contextWindow:
|
|
32
|
-
maxOutputTokens:
|
|
33
|
-
defaultTemperature: 0.
|
|
31
|
+
contextWindow: 1000000,
|
|
32
|
+
maxOutputTokens: 384000,
|
|
33
|
+
defaultTemperature: 0.3,
|
|
34
34
|
promptFormat: "bracket",
|
|
35
35
|
supportsReasoning: true,
|
|
36
|
-
supportsToolCalling: true,
|
|
37
|
-
costPerInputToken: 0.
|
|
38
|
-
costPerOutputToken: 0.
|
|
36
|
+
supportsToolCalling: true,
|
|
37
|
+
costPerInputToken: 0.000000435,
|
|
38
|
+
costPerOutputToken: 0.00000087,
|
|
39
39
|
},
|
|
40
40
|
};
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import type { ModelMetadata } from "./providers.ts";
|
|
2
|
-
declare const googleModels: {
|
|
3
|
-
readonly flash25lite: import("@ai-sdk/provider").LanguageModelV3;
|
|
4
|
-
};
|
|
2
|
+
declare const googleModels: {};
|
|
5
3
|
type ModelName = `google:${keyof typeof googleModels}`;
|
|
6
4
|
export declare const googleModelNames: ModelName[];
|
|
7
5
|
export declare const googleProvider: {
|
|
8
6
|
google: import("@ai-sdk/provider").ProviderV3 & {
|
|
9
|
-
languageModel(modelId:
|
|
7
|
+
languageModel(modelId: never): import("@ai-sdk/provider").LanguageModelV3;
|
|
10
8
|
embeddingModel(modelId: string): import("@ai-sdk/provider").EmbeddingModelV3;
|
|
11
9
|
imageModel(modelId: string): import("@ai-sdk/provider").ImageModelV3;
|
|
12
10
|
transcriptionModel(modelId: string): import("@ai-sdk/provider").TranscriptionModelV3;
|
|
@@ -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
|
|
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,IAAc,CAAC;AAEjC,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,CAC2B,CAAC"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { google as originalGoogle } from "@ai-sdk/google";
|
|
2
2
|
import { objectKeys } from "@travisennis/stdlib/object";
|
|
3
3
|
import { customProvider } from "ai";
|
|
4
|
-
const googleModels = {
|
|
5
|
-
flash25lite: originalGoogle("gemini-2.5-flash-lite-preview-06-17"),
|
|
6
|
-
};
|
|
4
|
+
const googleModels = {};
|
|
7
5
|
export const googleModelNames = objectKeys(googleModels).map((key) => `google:${key}`);
|
|
8
6
|
export const googleProvider = {
|
|
9
7
|
google: customProvider({
|
|
@@ -11,17 +9,4 @@ export const googleProvider = {
|
|
|
11
9
|
fallbackProvider: originalGoogle,
|
|
12
10
|
}),
|
|
13
11
|
};
|
|
14
|
-
export const googleModelRegistry = {
|
|
15
|
-
"google:flash25lite": {
|
|
16
|
-
id: "google:flash25lite",
|
|
17
|
-
provider: "google",
|
|
18
|
-
contextWindow: 1000000,
|
|
19
|
-
maxOutputTokens: 8192,
|
|
20
|
-
defaultTemperature: 0.3,
|
|
21
|
-
promptFormat: "markdown",
|
|
22
|
-
supportsReasoning: false,
|
|
23
|
-
supportsToolCalling: true,
|
|
24
|
-
costPerInputToken: 0,
|
|
25
|
-
costPerOutputToken: 0,
|
|
26
|
-
},
|
|
27
|
-
};
|
|
12
|
+
export const googleModelRegistry = {};
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import type { ModelMetadata } from "./providers.ts";
|
|
2
|
-
declare const groqModels: {
|
|
3
|
-
readonly "kimi-k2-instruct-0905": import("@ai-sdk/provider").LanguageModelV3;
|
|
4
|
-
};
|
|
2
|
+
declare const groqModels: {};
|
|
5
3
|
type ModelName = `groq:${keyof typeof groqModels}`;
|
|
6
4
|
export declare const groqModelNames: ModelName[];
|
|
7
5
|
export declare const groqProvider: {
|
|
8
6
|
groq: import("@ai-sdk/provider").ProviderV3 & {
|
|
9
|
-
languageModel(modelId:
|
|
7
|
+
languageModel(modelId: never): import("@ai-sdk/provider").LanguageModelV3;
|
|
10
8
|
embeddingModel(modelId: string): import("@ai-sdk/provider").EmbeddingModelV3;
|
|
11
9
|
imageModel(modelId: string): import("@ai-sdk/provider").ImageModelV3;
|
|
12
10
|
transcriptionModel(modelId: string): import("@ai-sdk/provider").TranscriptionModelV3;
|
|
@@ -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;
|
|
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;AAEpD,QAAA,MAAM,UAAU,IAAc,CAAC;AAE/B,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;CACY,CAAC"}
|
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { groq as originalGroq } from "@ai-sdk/groq";
|
|
2
2
|
import { objectKeys } from "@travisennis/stdlib/object";
|
|
3
3
|
import { customProvider } from "ai";
|
|
4
|
-
const
|
|
5
|
-
apiKey: process.env["GROQ_API_KEY"] ?? "",
|
|
6
|
-
});
|
|
7
|
-
const groqModels = {
|
|
8
|
-
"kimi-k2-instruct-0905": groq("moonshotai/kimi-k2-instruct-0905"),
|
|
9
|
-
};
|
|
4
|
+
const groqModels = {};
|
|
10
5
|
export const groqModelNames = objectKeys(groqModels).map((key) => `groq:${key}`);
|
|
11
6
|
export const groqProvider = {
|
|
12
7
|
groq: customProvider({
|
|
@@ -14,17 +9,4 @@ export const groqProvider = {
|
|
|
14
9
|
fallbackProvider: originalGroq,
|
|
15
10
|
}),
|
|
16
11
|
};
|
|
17
|
-
export const groqModelRegistry = {
|
|
18
|
-
"groq:kimi-k2-instruct-0905": {
|
|
19
|
-
id: "groq:kimi-k2-instruct-0905",
|
|
20
|
-
provider: "groq",
|
|
21
|
-
contextWindow: 262144,
|
|
22
|
-
maxOutputTokens: 16384,
|
|
23
|
-
defaultTemperature: 0.1,
|
|
24
|
-
promptFormat: "markdown",
|
|
25
|
-
supportsReasoning: false,
|
|
26
|
-
supportsToolCalling: true,
|
|
27
|
-
costPerInputToken: 1 / 1000000,
|
|
28
|
-
costPerOutputToken: 3 / 1000000,
|
|
29
|
-
},
|
|
30
|
-
};
|
|
12
|
+
export const groqModelRegistry = {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ModelMetadata } from "./providers.ts";
|
|
2
|
+
declare const opencodeGoModels: {
|
|
3
|
+
readonly "deepseek-v4-flash": import("@ai-sdk/provider").LanguageModelV3;
|
|
4
|
+
readonly "deepseek-v4-pro": import("@ai-sdk/provider").LanguageModelV3;
|
|
5
|
+
readonly "glm-5": import("@ai-sdk/provider").LanguageModelV3;
|
|
6
|
+
readonly "glm-5-1": import("@ai-sdk/provider").LanguageModelV3;
|
|
7
|
+
readonly "kimi-k2-5": import("@ai-sdk/provider").LanguageModelV3;
|
|
8
|
+
readonly "kimi-k2-6": import("@ai-sdk/provider").LanguageModelV3;
|
|
9
|
+
readonly "minimax-m2-5": import("@ai-sdk/provider").LanguageModelV3;
|
|
10
|
+
readonly "minimax-m2-7": import("@ai-sdk/provider").LanguageModelV3;
|
|
11
|
+
readonly "mimo-v2-5": import("@ai-sdk/provider").LanguageModelV3;
|
|
12
|
+
readonly "mimo-v2-5-pro": import("@ai-sdk/provider").LanguageModelV3;
|
|
13
|
+
readonly "mimo-v2-pro": import("@ai-sdk/provider").LanguageModelV3;
|
|
14
|
+
readonly "mimo-v2-omni": import("@ai-sdk/provider").LanguageModelV3;
|
|
15
|
+
readonly "qwen3.6-plus": import("@ai-sdk/provider").LanguageModelV3;
|
|
16
|
+
readonly "qwen3.5-plus": import("@ai-sdk/provider").LanguageModelV3;
|
|
17
|
+
};
|
|
18
|
+
type ModelName = `opencode-go:${keyof typeof opencodeGoModels}`;
|
|
19
|
+
export declare const opencodeGoModelNames: ModelName[];
|
|
20
|
+
export declare const opencodeGoProvider: {
|
|
21
|
+
"opencode-go": import("@ai-sdk/provider").ProviderV3 & {
|
|
22
|
+
languageModel(modelId: "deepseek-v4-flash" | "deepseek-v4-pro" | "glm-5" | "mimo-v2-pro" | "mimo-v2-omni" | "qwen3.6-plus" | "qwen3.5-plus" | "glm-5-1" | "kimi-k2-5" | "kimi-k2-6" | "minimax-m2-5" | "minimax-m2-7" | "mimo-v2-5" | "mimo-v2-5-pro"): import("@ai-sdk/provider").LanguageModelV3;
|
|
23
|
+
embeddingModel(modelId: string): import("@ai-sdk/provider").EmbeddingModelV3;
|
|
24
|
+
imageModel(modelId: string): import("@ai-sdk/provider").ImageModelV3;
|
|
25
|
+
transcriptionModel(modelId: string): import("@ai-sdk/provider").TranscriptionModelV3;
|
|
26
|
+
rerankingModel(modelId: string): import("@ai-sdk/provider").RerankingModelV3;
|
|
27
|
+
speechModel(modelId: string): import("@ai-sdk/provider").SpeechModelV3;
|
|
28
|
+
videoModel(modelId: string): import("@ai-sdk/provider").Experimental_VideoModelV3;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
export declare const opencodeGoModelRegistry: {
|
|
32
|
+
[K in ModelName]: ModelMetadata<ModelName>;
|
|
33
|
+
};
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=opencode-go-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-go-provider.d.ts","sourceRoot":"","sources":["../../source/models/opencode-go-provider.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAqBpD,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;CAeZ,CAAC;AAEX,KAAK,SAAS,GAAG,eAAe,MAAM,OAAO,gBAAgB,EAAE,CAAC;AAEhE,eAAO,MAAM,oBAAoB,EAAE,SAAS,EAEC,CAAC;AAE9C,eAAO,MAAM,kBAAkB;;;;;;;;;;CAK9B,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE;KACnC,CAAC,IAAI,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;CA0K3C,CAAC"}
|