@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.
Files changed (179) hide show
  1. package/README.md +7 -4
  2. package/dist/agent/index.d.ts.map +1 -1
  3. package/dist/agent/index.js +29 -27
  4. package/dist/cli/stdin.d.ts +2 -1
  5. package/dist/cli/stdin.d.ts.map +1 -1
  6. package/dist/commands/generate-rules/service.d.ts +3 -2
  7. package/dist/commands/generate-rules/service.d.ts.map +1 -1
  8. package/dist/commands/health/utils.d.ts +3 -2
  9. package/dist/commands/health/utils.d.ts.map +1 -1
  10. package/dist/commands/init-project/utils.d.ts +2 -1
  11. package/dist/commands/init-project/utils.d.ts.map +1 -1
  12. package/dist/commands/init-project/utils.js +0 -11
  13. package/dist/commands/manager.d.ts.map +1 -1
  14. package/dist/commands/manager.js +6 -1
  15. package/dist/commands/resources/index.d.ts.map +1 -1
  16. package/dist/commands/resources/index.js +4 -1
  17. package/dist/commands/review/utils.d.ts +6 -1
  18. package/dist/commands/review/utils.d.ts.map +1 -1
  19. package/dist/commands/session/index.d.ts.map +1 -1
  20. package/dist/commands/session/index.js +6 -0
  21. package/dist/commands/session/types.d.ts +1 -0
  22. package/dist/commands/session/types.d.ts.map +1 -1
  23. package/dist/commands/tools/index.d.ts +3 -0
  24. package/dist/commands/tools/index.d.ts.map +1 -0
  25. package/dist/commands/tools/index.js +190 -0
  26. package/dist/commands/tools/templates.d.ts +6 -0
  27. package/dist/commands/tools/templates.d.ts.map +1 -0
  28. package/dist/commands/tools/templates.js +97 -0
  29. package/dist/config/index.d.ts +5 -0
  30. package/dist/config/index.d.ts.map +1 -1
  31. package/dist/config/index.js +41 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +15 -3
  34. package/dist/models/anthropic-provider.d.ts +1 -1
  35. package/dist/models/deepseek-provider.d.ts +3 -3
  36. package/dist/models/deepseek-provider.js +17 -17
  37. package/dist/models/google-provider.d.ts +2 -4
  38. package/dist/models/google-provider.d.ts.map +1 -1
  39. package/dist/models/google-provider.js +2 -17
  40. package/dist/models/groq-provider.d.ts +2 -4
  41. package/dist/models/groq-provider.d.ts.map +1 -1
  42. package/dist/models/groq-provider.js +3 -21
  43. package/dist/models/opencode-go-provider.d.ts +35 -0
  44. package/dist/models/opencode-go-provider.d.ts.map +1 -0
  45. package/dist/models/opencode-go-provider.js +214 -0
  46. package/dist/models/opencode-zen-provider.d.ts +5 -5
  47. package/dist/models/opencode-zen-provider.d.ts.map +1 -1
  48. package/dist/models/opencode-zen-provider.js +41 -47
  49. package/dist/models/openrouter-provider.d.ts +5 -13
  50. package/dist/models/openrouter-provider.d.ts.map +1 -1
  51. package/dist/models/openrouter-provider.js +34 -138
  52. package/dist/models/providers.d.ts +3 -3
  53. package/dist/models/providers.d.ts.map +1 -1
  54. package/dist/models/providers.js +6 -0
  55. package/dist/models/xai-provider.d.ts +1 -2
  56. package/dist/models/xai-provider.d.ts.map +1 -1
  57. package/dist/models/xai-provider.js +0 -13
  58. package/dist/prompts/manager.d.ts.map +1 -1
  59. package/dist/prompts/manager.js +5 -1
  60. package/dist/prompts/mentions.d.ts.map +1 -1
  61. package/dist/prompts/mentions.js +35 -6
  62. package/dist/prompts/system-prompt.d.ts +1 -0
  63. package/dist/prompts/system-prompt.d.ts.map +1 -1
  64. package/dist/prompts/system-prompt.js +20 -5
  65. package/dist/repl/index.d.ts +1 -2
  66. package/dist/repl/index.d.ts.map +1 -1
  67. package/dist/repl/index.js +14 -53
  68. package/dist/sessions/manager.d.ts +3 -3
  69. package/dist/sessions/manager.d.ts.map +1 -1
  70. package/dist/sessions/manager.js +1 -1
  71. package/dist/skills/activated-tracker.d.ts +11 -0
  72. package/dist/skills/activated-tracker.d.ts.map +1 -0
  73. package/dist/skills/activated-tracker.js +16 -0
  74. package/dist/skills/index.d.ts +3 -2
  75. package/dist/skills/index.d.ts.map +1 -1
  76. package/dist/skills/index.js +7 -1
  77. package/dist/subagents/index.d.ts +2 -1
  78. package/dist/subagents/index.d.ts.map +1 -1
  79. package/dist/terminal/table/utils.d.ts +1 -1
  80. package/dist/terminal/table/utils.d.ts.map +1 -1
  81. package/dist/terminal/wrap-ansi.js +2 -2
  82. package/dist/tools/agent.js +1 -1
  83. package/dist/tools/apply-patch.d.ts +62 -0
  84. package/dist/tools/apply-patch.d.ts.map +1 -0
  85. package/dist/tools/apply-patch.js +377 -0
  86. package/dist/tools/bash.d.ts +4 -4
  87. package/dist/tools/bash.d.ts.map +1 -1
  88. package/dist/tools/bash.js +40 -8
  89. package/dist/tools/directory-tree.d.ts +4 -4
  90. package/dist/tools/directory-tree.d.ts.map +1 -1
  91. package/dist/tools/directory-tree.js +3 -1
  92. package/dist/tools/dynamic-tool-loader.d.ts +12 -3
  93. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
  94. package/dist/tools/dynamic-tool-loader.js +299 -39
  95. package/dist/tools/edit-file.d.ts +2 -2
  96. package/dist/tools/edit-file.d.ts.map +1 -1
  97. package/dist/tools/edit-file.js +188 -79
  98. package/dist/tools/glob.d.ts +16 -16
  99. package/dist/tools/glob.d.ts.map +1 -1
  100. package/dist/tools/glob.js +30 -15
  101. package/dist/tools/grep.d.ts +14 -14
  102. package/dist/tools/grep.d.ts.map +1 -1
  103. package/dist/tools/grep.js +50 -29
  104. package/dist/tools/index.d.ts +57 -84
  105. package/dist/tools/index.d.ts.map +1 -1
  106. package/dist/tools/index.js +20 -5
  107. package/dist/tools/ls.d.ts +2 -2
  108. package/dist/tools/ls.d.ts.map +1 -1
  109. package/dist/tools/ls.js +2 -1
  110. package/dist/tools/read-file.d.ts +9 -11
  111. package/dist/tools/read-file.d.ts.map +1 -1
  112. package/dist/tools/read-file.js +21 -16
  113. package/dist/tools/save-file.d.ts +4 -4
  114. package/dist/tools/save-file.d.ts.map +1 -1
  115. package/dist/tools/save-file.js +26 -21
  116. package/dist/tools/skill.d.ts +2 -1
  117. package/dist/tools/skill.d.ts.map +1 -1
  118. package/dist/tools/skill.js +55 -12
  119. package/dist/tools/types.d.ts +8 -2
  120. package/dist/tools/types.d.ts.map +1 -1
  121. package/dist/tools/web-fetch.d.ts +6 -18
  122. package/dist/tools/web-fetch.d.ts.map +1 -1
  123. package/dist/tools/web-fetch.js +45 -9
  124. package/dist/tools/web-search.d.ts +4 -22
  125. package/dist/tools/web-search.d.ts.map +1 -1
  126. package/dist/tools/web-search.js +1 -1
  127. package/dist/tui/autocomplete/file-search-provider.js +1 -1
  128. package/dist/tui/autocomplete/utils.d.ts +2 -1
  129. package/dist/tui/autocomplete/utils.d.ts.map +1 -1
  130. package/dist/tui/autocomplete/utils.js +25 -23
  131. package/dist/tui/components/editor.d.ts +2 -1
  132. package/dist/tui/components/editor.d.ts.map +1 -1
  133. package/dist/tui/components/editor.js +1 -1
  134. package/dist/tui/components/footer.d.ts +0 -2
  135. package/dist/tui/components/footer.d.ts.map +1 -1
  136. package/dist/tui/components/footer.js +1 -17
  137. package/dist/tui/components/markdown.d.ts +2 -2
  138. package/dist/tui/components/markdown.d.ts.map +1 -1
  139. package/dist/tui/components/welcome.d.ts +2 -1
  140. package/dist/tui/components/welcome.d.ts.map +1 -1
  141. package/dist/tui/editor-launcher.d.ts +3 -2
  142. package/dist/tui/editor-launcher.d.ts.map +1 -1
  143. package/dist/tui/index.d.ts +0 -1
  144. package/dist/tui/index.d.ts.map +1 -1
  145. package/dist/tui/tui.d.ts +1 -0
  146. package/dist/tui/tui.d.ts.map +1 -1
  147. package/dist/tui/tui.js +9 -0
  148. package/dist/tui/utils.d.ts +1 -5
  149. package/dist/tui/utils.d.ts.map +1 -1
  150. package/dist/tui/utils.js +271 -44
  151. package/dist/utils/binary-output.d.ts +32 -0
  152. package/dist/utils/binary-output.d.ts.map +1 -0
  153. package/dist/utils/binary-output.js +127 -0
  154. package/dist/utils/command-protection.d.ts.map +1 -1
  155. package/dist/utils/command-protection.js +92 -9
  156. package/dist/utils/parsing.d.ts +1 -1
  157. package/dist/utils/parsing.d.ts.map +1 -1
  158. package/package.json +28 -26
  159. package/dist/commands/add-directory/types.d.ts +0 -6
  160. package/dist/commands/add-directory/types.d.ts.map +0 -1
  161. package/dist/commands/add-directory/types.js +0 -1
  162. package/dist/commands/copy/types.d.ts +0 -3
  163. package/dist/commands/copy/types.d.ts.map +0 -1
  164. package/dist/commands/copy/types.js +0 -1
  165. package/dist/commands/review/types.d.ts +0 -12
  166. package/dist/commands/review/types.d.ts.map +0 -1
  167. package/dist/commands/review/types.js +0 -1
  168. package/dist/modes/manager.d.ts +0 -23
  169. package/dist/modes/manager.d.ts.map +0 -1
  170. package/dist/modes/manager.js +0 -77
  171. package/dist/modes/prompts.d.ts +0 -2
  172. package/dist/modes/prompts.d.ts.map +0 -1
  173. package/dist/modes/prompts.js +0 -143
  174. package/dist/tools/code-search.d.ts +0 -41
  175. package/dist/tools/code-search.d.ts.map +0 -1
  176. package/dist/tools/code-search.js +0 -195
  177. package/dist/utils/iterables.d.ts +0 -2
  178. package/dist/utils/iterables.d.ts.map +0 -1
  179. 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
+ }
@@ -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;AAGxB,eAAO,MAAM,aAAa;;;;;8BAKI,MAAM,EAAE,GAAG,SAAS;;;;;;;;;4BAS3B,MAAM,EAAE;;;;;;;;kBAQlB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAGX,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqDhB,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;IA8B5B,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;IA4B/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"}
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"}
@@ -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",
@@ -1 +1 @@
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"}
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:minimax-m2.5-free";
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.1-codex-mini");
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: "opus" | "sonnet" | "haiku"): import("@ai-sdk/provider").LanguageModelV3;
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-chat": import("@ai-sdk/provider").LanguageModelV3;
4
- readonly "deepseek-reasoner": import("@ai-sdk/provider").LanguageModelV3;
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-chat" | "deepseek-reasoner"): import("@ai-sdk/provider").LanguageModelV3;
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-chat": originalDeepseek("deepseek-chat"),
6
- "deepseek-reasoner": originalDeepseek("deepseek-reasoner"),
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-chat": {
17
- id: "deepseek:deepseek-chat",
16
+ "deepseek:deepseek-v4-flash": {
17
+ id: "deepseek:deepseek-v4-flash",
18
18
  provider: "deepseek",
19
- contextWindow: 128000,
20
- maxOutputTokens: 8000,
19
+ contextWindow: 1000000,
20
+ maxOutputTokens: 384000,
21
21
  defaultTemperature: 0.3,
22
22
  promptFormat: "bracket",
23
- supportsReasoning: false,
23
+ supportsReasoning: true,
24
24
  supportsToolCalling: true,
25
- costPerInputToken: 0.0000012, // Check official pricing
26
- costPerOutputToken: 0.0000012, // Check official pricing
25
+ costPerInputToken: 0.00000014,
26
+ costPerOutputToken: 0.00000028,
27
27
  },
28
- "deepseek:deepseek-reasoner": {
29
- id: "deepseek:deepseek-reasoner",
28
+ "deepseek:deepseek-v4-pro": {
29
+ id: "deepseek:deepseek-v4-pro",
30
30
  provider: "deepseek",
31
- contextWindow: 128000,
32
- maxOutputTokens: 32768,
33
- defaultTemperature: 0.6,
31
+ contextWindow: 1000000,
32
+ maxOutputTokens: 384000,
33
+ defaultTemperature: 0.3,
34
34
  promptFormat: "bracket",
35
35
  supportsReasoning: true,
36
- supportsToolCalling: true, // Check if this model supports tools
37
- costPerInputToken: 0.00000055, // Check official pricing
38
- costPerOutputToken: 0.00000219, // Check official pricing
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: "flash25lite"): import("@ai-sdk/provider").LanguageModelV3;
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;;CAER,CAAC;AAEX,KAAK,SAAS,GAAG,UAAU,MAAM,OAAO,YAAY,EAAE,CAAC;AAEvD,eAAO,MAAM,gBAAgB,EAAE,SAAS,EAEvC,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;;;;CAK1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CACtC,SAAS,EACT,aAAa,CAAC,SAAS,CAAC,CAczB,CAAC"}
1
+ {"version":3,"file":"google-provider.d.ts","sourceRoot":"","sources":["../../source/models/google-provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,QAAA,MAAM,YAAY,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: "kimi-k2-instruct-0905"): import("@ai-sdk/provider").LanguageModelV3;
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;AAMpD,QAAA,MAAM,UAAU;;CAEN,CAAC;AAEX,KAAK,SAAS,GAAG,QAAQ,MAAM,OAAO,UAAU,EAAE,CAAC;AAEnD,eAAO,MAAM,cAAc,EAAE,SAAS,EAErC,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;CAKxB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE;KAC7B,CAAC,IAAI,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;CAc3C,CAAC"}
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 { createGroq, groq as originalGroq } from "@ai-sdk/groq";
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 groq = createGroq({
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"}