@travisennis/acai 0.0.11 → 0.0.13

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 (292) hide show
  1. package/README.md +5 -5
  2. package/dist/agent/index.d.ts.map +1 -1
  3. package/dist/agent/index.js +2 -5
  4. package/dist/commands/history/types.d.ts +3 -2
  5. package/dist/commands/history/types.d.ts.map +1 -1
  6. package/dist/commands/init-project/utils.d.ts +0 -1
  7. package/dist/commands/init-project/utils.d.ts.map +1 -1
  8. package/dist/commands/init-project/utils.js +1 -12
  9. package/dist/commands/manager.d.ts.map +1 -1
  10. package/dist/commands/manager.js +6 -19
  11. package/dist/commands/resources/index.d.ts.map +1 -1
  12. package/dist/commands/resources/index.js +4 -1
  13. package/dist/commands/session/index.d.ts.map +1 -1
  14. package/dist/commands/session/index.js +6 -0
  15. package/dist/commands/session/types.d.ts +1 -0
  16. package/dist/commands/session/types.d.ts.map +1 -1
  17. package/dist/commands/share/html-renderer.d.ts.map +1 -1
  18. package/dist/commands/share/html-renderer.js +54 -48
  19. package/dist/commands/tools/index.d.ts +3 -0
  20. package/dist/commands/tools/index.d.ts.map +1 -0
  21. package/dist/commands/tools/index.js +191 -0
  22. package/dist/commands/tools/templates.d.ts +6 -0
  23. package/dist/commands/tools/templates.d.ts.map +1 -0
  24. package/dist/commands/tools/templates.js +97 -0
  25. package/dist/config/index.d.ts +5 -2
  26. package/dist/config/index.d.ts.map +1 -1
  27. package/dist/config/index.js +42 -6
  28. package/dist/index.d.ts +14 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +98 -68
  31. package/dist/models/anthropic-provider.d.ts +1 -1
  32. package/dist/models/deepseek-provider.d.ts +3 -3
  33. package/dist/models/deepseek-provider.js +17 -17
  34. package/dist/models/google-provider.d.ts +2 -4
  35. package/dist/models/google-provider.d.ts.map +1 -1
  36. package/dist/models/google-provider.js +2 -17
  37. package/dist/models/groq-provider.d.ts +2 -4
  38. package/dist/models/groq-provider.d.ts.map +1 -1
  39. package/dist/models/groq-provider.js +3 -21
  40. package/dist/models/manager.d.ts +1 -10
  41. package/dist/models/manager.d.ts.map +1 -1
  42. package/dist/models/manager.js +2 -2
  43. package/dist/models/opencode-go-provider.d.ts +11 -1
  44. package/dist/models/opencode-go-provider.d.ts.map +1 -1
  45. package/dist/models/opencode-go-provider.js +130 -0
  46. package/dist/models/opencode-zen-provider.d.ts +3 -3
  47. package/dist/models/opencode-zen-provider.d.ts.map +1 -1
  48. package/dist/models/opencode-zen-provider.js +26 -32
  49. package/dist/models/openrouter-provider.d.ts +4 -15
  50. package/dist/models/openrouter-provider.d.ts.map +1 -1
  51. package/dist/models/openrouter-provider.js +26 -169
  52. package/dist/models/providers.d.ts +1 -1
  53. package/dist/models/providers.d.ts.map +1 -1
  54. package/dist/models/xai-provider.d.ts +1 -2
  55. package/dist/models/xai-provider.d.ts.map +1 -1
  56. package/dist/models/xai-provider.js +0 -13
  57. package/dist/prompts/manager.d.ts.map +1 -1
  58. package/dist/prompts/manager.js +5 -1
  59. package/dist/prompts/system-prompt.d.ts +1 -2
  60. package/dist/prompts/system-prompt.d.ts.map +1 -1
  61. package/dist/prompts/system-prompt.js +26 -15
  62. package/dist/repl/index.d.ts +28 -13
  63. package/dist/repl/index.d.ts.map +1 -1
  64. package/dist/repl/index.js +242 -305
  65. package/dist/skills/activated-tracker.d.ts +11 -0
  66. package/dist/skills/activated-tracker.d.ts.map +1 -0
  67. package/dist/skills/activated-tracker.js +16 -0
  68. package/dist/skills/index.d.ts +12 -2
  69. package/dist/skills/index.d.ts.map +1 -1
  70. package/dist/skills/index.js +127 -71
  71. package/dist/terminal/control.d.ts +1 -21
  72. package/dist/terminal/control.d.ts.map +1 -1
  73. package/dist/terminal/control.js +1 -32
  74. package/dist/terminal/formatting.d.ts +0 -33
  75. package/dist/terminal/formatting.d.ts.map +1 -1
  76. package/dist/terminal/formatting.js +0 -91
  77. package/dist/terminal/highlight/theme.d.ts +0 -37
  78. package/dist/terminal/highlight/theme.d.ts.map +1 -1
  79. package/dist/terminal/highlight/theme.js +1 -79
  80. package/dist/terminal/keys.d.ts +0 -97
  81. package/dist/terminal/keys.d.ts.map +1 -1
  82. package/dist/terminal/keys.js +0 -194
  83. package/dist/terminal/select-prompt.d.ts.map +1 -1
  84. package/dist/terminal/select-prompt.js +65 -51
  85. package/dist/terminal/style.d.ts +1 -1
  86. package/dist/terminal/style.d.ts.map +1 -1
  87. package/dist/terminal/supports-color.d.ts.map +1 -1
  88. package/dist/terminal/supports-color.js +38 -20
  89. package/dist/terminal/supports-hyperlinks.d.ts +3 -0
  90. package/dist/terminal/supports-hyperlinks.d.ts.map +1 -1
  91. package/dist/terminal/supports-hyperlinks.js +72 -31
  92. package/dist/terminal/table/layout-manager.d.ts +0 -20
  93. package/dist/terminal/table/layout-manager.d.ts.map +1 -1
  94. package/dist/terminal/table/layout-manager.js +68 -44
  95. package/dist/terminal/table/utils.d.ts +0 -1
  96. package/dist/terminal/table/utils.d.ts.map +1 -1
  97. package/dist/terminal/table/utils.js +2 -4
  98. package/dist/tools/apply-patch.d.ts +5 -3
  99. package/dist/tools/apply-patch.d.ts.map +1 -1
  100. package/dist/tools/apply-patch.js +154 -123
  101. package/dist/tools/bash.d.ts +4 -4
  102. package/dist/tools/bash.d.ts.map +1 -1
  103. package/dist/tools/bash.js +27 -13
  104. package/dist/tools/dynamic-tool-loader.d.ts +17 -3
  105. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
  106. package/dist/tools/dynamic-tool-loader.js +360 -81
  107. package/dist/tools/edit-file.d.ts +2 -2
  108. package/dist/tools/index.d.ts +27 -151
  109. package/dist/tools/index.d.ts.map +1 -1
  110. package/dist/tools/index.js +16 -21
  111. package/dist/tools/read-file.d.ts +8 -8
  112. package/dist/tools/read-file.d.ts.map +1 -1
  113. package/dist/tools/read-file.js +32 -13
  114. package/dist/tools/save-file.d.ts +4 -4
  115. package/dist/tools/skill.d.ts +2 -1
  116. package/dist/tools/skill.d.ts.map +1 -1
  117. package/dist/tools/skill.js +64 -14
  118. package/dist/tools/types.d.ts +8 -2
  119. package/dist/tools/types.d.ts.map +1 -1
  120. package/dist/tools/web-fetch.d.ts +8 -12
  121. package/dist/tools/web-fetch.d.ts.map +1 -1
  122. package/dist/tools/web-fetch.js +86 -44
  123. package/dist/tools/web-search.d.ts +4 -8
  124. package/dist/tools/web-search.d.ts.map +1 -1
  125. package/dist/tools/web-search.js +41 -33
  126. package/dist/tui/autocomplete/utils.d.ts +0 -15
  127. package/dist/tui/autocomplete/utils.d.ts.map +1 -1
  128. package/dist/tui/autocomplete/utils.js +0 -85
  129. package/dist/tui/autocomplete.d.ts +1 -1
  130. package/dist/tui/autocomplete.d.ts.map +1 -1
  131. package/dist/tui/autocomplete.js +1 -1
  132. package/dist/tui/components/editor.d.ts +12 -0
  133. package/dist/tui/components/editor.d.ts.map +1 -1
  134. package/dist/tui/components/editor.js +181 -195
  135. package/dist/tui/components/footer.d.ts +0 -2
  136. package/dist/tui/components/footer.d.ts.map +1 -1
  137. package/dist/tui/components/footer.js +1 -17
  138. package/dist/tui/components/input.d.ts +4 -0
  139. package/dist/tui/components/input.d.ts.map +1 -1
  140. package/dist/tui/components/input.js +33 -31
  141. package/dist/tui/components/markdown.d.ts +30 -0
  142. package/dist/tui/components/markdown.d.ts.map +1 -1
  143. package/dist/tui/components/markdown.js +274 -242
  144. package/dist/tui/components/modal.d.ts.map +1 -1
  145. package/dist/tui/components/modal.js +11 -11
  146. package/dist/tui/components/select-list.d.ts +5 -0
  147. package/dist/tui/components/select-list.d.ts.map +1 -1
  148. package/dist/tui/components/select-list.js +69 -98
  149. package/dist/tui/components/table.d.ts +6 -0
  150. package/dist/tui/components/table.d.ts.map +1 -1
  151. package/dist/tui/components/table.js +61 -52
  152. package/dist/tui/index.d.ts +1 -8
  153. package/dist/tui/index.d.ts.map +1 -1
  154. package/dist/tui/index.js +0 -8
  155. package/dist/tui/tui.d.ts +9 -0
  156. package/dist/tui/tui.d.ts.map +1 -1
  157. package/dist/tui/tui.js +78 -48
  158. package/dist/tui/utils.d.ts +7 -0
  159. package/dist/tui/utils.d.ts.map +1 -1
  160. package/dist/tui/utils.js +117 -53
  161. package/dist/utils/bash.d.ts.map +1 -1
  162. package/dist/utils/bash.js +121 -104
  163. package/dist/utils/binary-output.d.ts +32 -0
  164. package/dist/utils/binary-output.d.ts.map +1 -0
  165. package/dist/utils/binary-output.js +127 -0
  166. package/dist/utils/command-protection.d.ts +3 -2
  167. package/dist/utils/command-protection.d.ts.map +1 -1
  168. package/dist/utils/command-protection.js +121 -29
  169. package/dist/utils/filesystem/operations.d.ts +0 -15
  170. package/dist/utils/filesystem/operations.d.ts.map +1 -1
  171. package/dist/utils/filesystem/operations.js +1 -38
  172. package/dist/utils/filesystem/security.d.ts.map +1 -1
  173. package/dist/utils/filesystem/security.js +22 -15
  174. package/dist/utils/filetype-detection.d.ts +0 -1
  175. package/dist/utils/filetype-detection.d.ts.map +1 -1
  176. package/dist/utils/filetype-detection.js +0 -12
  177. package/dist/utils/formatting.d.ts +0 -30
  178. package/dist/utils/formatting.d.ts.map +1 -1
  179. package/dist/utils/formatting.js +0 -44
  180. package/dist/utils/git.d.ts +4 -6
  181. package/dist/utils/git.d.ts.map +1 -1
  182. package/dist/utils/git.js +36 -46
  183. package/dist/utils/ignore.d.ts +1 -1
  184. package/dist/utils/ignore.d.ts.map +1 -1
  185. package/dist/utils/ignore.js +1 -1
  186. package/dist/utils/parsing.d.ts +1 -1
  187. package/dist/utils/parsing.d.ts.map +1 -1
  188. package/dist/utils/process.d.ts.map +1 -1
  189. package/dist/utils/process.js +77 -79
  190. package/dist/utils/yaml.d.ts +0 -1
  191. package/dist/utils/yaml.d.ts.map +1 -1
  192. package/dist/utils/yaml.js +80 -89
  193. package/dist/utils/zod.d.ts +0 -3
  194. package/dist/utils/zod.d.ts.map +1 -1
  195. package/dist/utils/zod.js +0 -7
  196. package/package.json +32 -29
  197. package/dist/agent/sub-agent.d.ts +0 -23
  198. package/dist/agent/sub-agent.d.ts.map +0 -1
  199. package/dist/agent/sub-agent.js +0 -109
  200. package/dist/commands/add-directory/index.d.ts +0 -3
  201. package/dist/commands/add-directory/index.d.ts.map +0 -1
  202. package/dist/commands/add-directory/index.js +0 -50
  203. package/dist/commands/add-directory/utils.d.ts +0 -3
  204. package/dist/commands/add-directory/utils.d.ts.map +0 -1
  205. package/dist/commands/add-directory/utils.js +0 -15
  206. package/dist/commands/clear/index.d.ts +0 -3
  207. package/dist/commands/clear/index.d.ts.map +0 -1
  208. package/dist/commands/clear/index.js +0 -13
  209. package/dist/commands/generate-rules/index.d.ts +0 -3
  210. package/dist/commands/generate-rules/index.d.ts.map +0 -1
  211. package/dist/commands/generate-rules/index.js +0 -206
  212. package/dist/commands/generate-rules/service.d.ts +0 -22
  213. package/dist/commands/generate-rules/service.d.ts.map +0 -1
  214. package/dist/commands/generate-rules/service.js +0 -103
  215. package/dist/commands/generate-rules/utils.d.ts +0 -5
  216. package/dist/commands/generate-rules/utils.d.ts.map +0 -1
  217. package/dist/commands/generate-rules/utils.js +0 -25
  218. package/dist/commands/handoff/index.d.ts +0 -3
  219. package/dist/commands/handoff/index.d.ts.map +0 -1
  220. package/dist/commands/handoff/index.js +0 -97
  221. package/dist/commands/handoff/utils.d.ts +0 -4
  222. package/dist/commands/handoff/utils.d.ts.map +0 -1
  223. package/dist/commands/handoff/utils.js +0 -123
  224. package/dist/commands/list-directories/index.d.ts +0 -3
  225. package/dist/commands/list-directories/index.d.ts.map +0 -1
  226. package/dist/commands/list-directories/index.js +0 -35
  227. package/dist/commands/pickup/index.d.ts +0 -3
  228. package/dist/commands/pickup/index.d.ts.map +0 -1
  229. package/dist/commands/pickup/index.js +0 -141
  230. package/dist/commands/pickup/types.d.ts +0 -6
  231. package/dist/commands/pickup/types.d.ts.map +0 -1
  232. package/dist/commands/pickup/types.js +0 -1
  233. package/dist/commands/pickup/utils.d.ts +0 -7
  234. package/dist/commands/pickup/utils.d.ts.map +0 -1
  235. package/dist/commands/pickup/utils.js +0 -56
  236. package/dist/commands/remove-directory/index.d.ts +0 -3
  237. package/dist/commands/remove-directory/index.d.ts.map +0 -1
  238. package/dist/commands/remove-directory/index.js +0 -55
  239. package/dist/commands/review/index.d.ts +0 -3
  240. package/dist/commands/review/index.d.ts.map +0 -1
  241. package/dist/commands/review/index.js +0 -12
  242. package/dist/commands/review/review-panel.d.ts +0 -3
  243. package/dist/commands/review/review-panel.d.ts.map +0 -1
  244. package/dist/commands/review/review-panel.js +0 -186
  245. package/dist/commands/review/utils.d.ts +0 -18
  246. package/dist/commands/review/utils.d.ts.map +0 -1
  247. package/dist/commands/review/utils.js +0 -146
  248. package/dist/commands/shell/index.d.ts +0 -3
  249. package/dist/commands/shell/index.d.ts.map +0 -1
  250. package/dist/commands/shell/index.js +0 -96
  251. package/dist/modes/manager.d.ts +0 -24
  252. package/dist/modes/manager.d.ts.map +0 -1
  253. package/dist/modes/manager.js +0 -77
  254. package/dist/modes/prompts.d.ts +0 -2
  255. package/dist/modes/prompts.d.ts.map +0 -1
  256. package/dist/modes/prompts.js +0 -142
  257. package/dist/subagents/index.d.ts +0 -16
  258. package/dist/subagents/index.d.ts.map +0 -1
  259. package/dist/subagents/index.js +0 -231
  260. package/dist/terminal/index.d.ts +0 -9
  261. package/dist/terminal/index.d.ts.map +0 -1
  262. package/dist/terminal/index.js +0 -8
  263. package/dist/tools/agent.d.ts +0 -27
  264. package/dist/tools/agent.d.ts.map +0 -1
  265. package/dist/tools/agent.js +0 -81
  266. package/dist/tools/directory-tree.d.ts +0 -28
  267. package/dist/tools/directory-tree.d.ts.map +0 -1
  268. package/dist/tools/directory-tree.js +0 -152
  269. package/dist/tools/glob.d.ts +0 -35
  270. package/dist/tools/glob.d.ts.map +0 -1
  271. package/dist/tools/glob.js +0 -159
  272. package/dist/tools/grep.d.ts +0 -100
  273. package/dist/tools/grep.d.ts.map +0 -1
  274. package/dist/tools/grep.js +0 -601
  275. package/dist/tools/ls.d.ts +0 -26
  276. package/dist/tools/ls.d.ts.map +0 -1
  277. package/dist/tools/ls.js +0 -82
  278. package/dist/tui/components/header.d.ts +0 -21
  279. package/dist/tui/components/header.d.ts.map +0 -1
  280. package/dist/tui/components/header.js +0 -63
  281. package/dist/utils/bash/parse.d.ts +0 -19
  282. package/dist/utils/bash/parse.d.ts.map +0 -1
  283. package/dist/utils/bash/parse.js +0 -223
  284. package/dist/utils/bash/quote.d.ts +0 -6
  285. package/dist/utils/bash/quote.d.ts.map +0 -1
  286. package/dist/utils/bash/quote.js +0 -23
  287. package/dist/utils/generators.d.ts +0 -3
  288. package/dist/utils/generators.d.ts.map +0 -1
  289. package/dist/utils/generators.js +0 -25
  290. package/dist/utils/glob.d.ts +0 -52
  291. package/dist/utils/glob.d.ts.map +0 -1
  292. package/dist/utils/glob.js +0 -376
@@ -0,0 +1,6 @@
1
+ export declare function nodeTemplate(name: string, description: string): string;
2
+ export declare function bashTemplate(name: string, description: string): string;
3
+ export declare function zshTemplate(name: string, description: string): string;
4
+ export declare function textSchemaTemplate(name: string, description: string): string;
5
+ export declare function textCompanionTemplate(name: string): string;
6
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../source/commands/tools/templates.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CA2BtE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAuBtE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAuBrE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAI5E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAe1D"}
@@ -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,12 @@ 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
- readonly autoGenerateRules: false;
25
+ readonly allowedDirs: string[];
24
26
  readonly env: Record<string, string>;
25
27
  };
26
28
  declare const ConfigSchema: z.ZodObject<{
@@ -43,8 +45,9 @@ declare const ConfigSchema: z.ZodObject<{
43
45
  readOnlyFiles: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
44
46
  skills: z.ZodDefault<z.ZodOptional<z.ZodObject<{
45
47
  enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
48
+ path: z.ZodDefault<z.ZodOptional<z.ZodString>>;
46
49
  }, z.core.$strip>>>;
47
- autoGenerateRules: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
50
+ allowedDirs: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
48
51
  devtools: z.ZodDefault<z.ZodOptional<z.ZodObject<{
49
52
  enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
50
53
  }, 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;;;;;;;;0BAQV,MAAM,EAAE;kBAChB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAGX,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsDhB,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;IAcnB,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,12 @@ 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
- autoGenerateRules: false,
45
+ allowedDirs: [],
29
46
  env: {},
30
47
  };
31
48
  // Type definitions
@@ -68,13 +85,14 @@ const ConfigSchema = z.object({
68
85
  skills: z
69
86
  .object({
70
87
  enabled: z.boolean().optional().default(defaultConfig.skills.enabled),
88
+ path: z.string().optional().default(defaultConfig.skills.path),
71
89
  })
72
90
  .optional()
73
91
  .default(defaultConfig.skills),
74
- autoGenerateRules: z
75
- .boolean()
92
+ allowedDirs: z
93
+ .array(z.string())
76
94
  .optional()
77
- .default(defaultConfig.autoGenerateRules),
95
+ .default(defaultConfig.allowedDirs),
78
96
  devtools: z
79
97
  .object({
80
98
  enabled: z.boolean().optional().default(defaultConfig.devtools.enabled),
@@ -136,7 +154,8 @@ export class ConfigManager {
136
154
  return jsonParser(ConfigSchema).parse(data);
137
155
  }
138
156
  catch (error) {
139
- if (error.code === "ENOENT") {
157
+ const code = error.code;
158
+ if (code === "ENOENT" || code === "EPERM" || code === "EACCES") {
140
159
  return {};
141
160
  }
142
161
  throw error;
@@ -156,10 +175,23 @@ export class ConfigManager {
156
175
  ...appConfig.env,
157
176
  ...projectConfig.env,
158
177
  };
178
+ const mergedAllowedDirs = [
179
+ ...(appConfig.allowedDirs ?? []),
180
+ ...(projectConfig.allowedDirs ?? []),
181
+ ];
182
+ const mergedSkills = {
183
+ ...appConfig.skills,
184
+ ...projectConfig.skills,
185
+ path: [appConfig.skills?.path, projectConfig.skills?.path]
186
+ .filter((p) => !!p)
187
+ .join(PATH_SEPARATOR),
188
+ };
159
189
  const mergedConfig = {
160
190
  ...appConfig,
161
191
  ...projectConfig,
162
192
  env: mergedEnv,
193
+ allowedDirs: mergedAllowedDirs,
194
+ skills: mergedSkills,
163
195
  };
164
196
  const result = ConfigSchema.parse(mergedConfig);
165
197
  this.cachedConfig = result;
@@ -184,7 +216,7 @@ export class ConfigManager {
184
216
  }
185
217
  }
186
218
  if (!configData.skills) {
187
- configData.skills = { enabled: true };
219
+ configData.skills = { enabled: true, path: "" };
188
220
  }
189
221
  configData.skills.enabled = enabled;
190
222
  await this.app.ensurePath();
@@ -197,6 +229,10 @@ export class ConfigManager {
197
229
  absolute: path.join(this.app.getPath(), "AGENTS.md"),
198
230
  relative: "~/.acai/AGENTS.md",
199
231
  },
232
+ {
233
+ absolute: path.join(homedir(), ".config", "AGENTS.md"),
234
+ relative: "~/.config/AGENTS.md",
235
+ },
200
236
  {
201
237
  absolute: path.join(process.cwd(), "AGENTS.md"),
202
238
  relative: "./AGENTS.md",
package/dist/index.d.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env node
2
+ import { SessionManager } from "./sessions/manager.ts";
3
+ import { setTerminalTitle } from "./terminal/control.ts";
4
+ import { select } from "./terminal/select-prompt.ts";
2
5
  export interface WorkspaceContext {
3
6
  primaryDir: string;
4
7
  allowedDirs: string[];
@@ -22,5 +25,16 @@ declare const flags: {
22
25
  */
23
26
  export declare function handleError(error: Error): void;
24
27
  export type Flags = typeof flags;
28
+ export declare function handleConversationHistory(sessionManager: SessionManager, sessionsDir: string, _hasContinueOrResume: boolean, resumeSessionId: string | undefined, continueFlag?: boolean, resumeFlag?: boolean, selectFn?: typeof select, setTitleFn?: typeof setTerminalTitle): Promise<void>;
29
+ /**
30
+ * Expands a leading tilde in a path to the user's home directory.
31
+ * If the path does not start with ~, it is returned unchanged.
32
+ */
33
+ export declare function expandTildePath(dir: string): string;
34
+ /**
35
+ * Resolves a path (expanding tilde if present) and adds it to a list
36
+ * of directories if it is not already present.
37
+ */
38
+ export declare function addUniqueDir(dir: string, dirs: string[]): void;
25
39
  export {};
26
40
  //# sourceMappingURL=index.d.ts.map
@@ -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":";AAuBA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAYrD,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;AAyOjC,wBAAsB,yBAAyB,CAC7C,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,MAAM,EACnB,oBAAoB,EAAE,OAAO,EAC7B,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,YAAY,UAAiB,EAC7B,UAAU,UAAe,EACzB,QAAQ,gBAAS,EACjB,UAAU,0BAAmB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAWf;AAgRD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAK9D"}
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ import { Agent } from "./agent/index.js";
9
9
  import { Cli } from "./cli/index.js";
10
10
  import { readStdinWithLimits } from "./cli/stdin.js";
11
11
  import { CommandManager } from "./commands/manager.js";
12
- import { config } from "./config/index.js";
12
+ import { config, parseSkillsPath, } from "./config/index.js";
13
13
  import { ModelManager } from "./models/manager.js";
14
14
  import { isSupportedModel } from "./models/providers.js";
15
15
  import { PromptManager } from "./prompts/manager.js";
@@ -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-go:kimi-k2-5";
224
+ : "opencode-go:deepseek-v4-flash"; // DEFAULT MODEL
225
225
  const projectConfig = await config.getConfig();
226
226
  const devtoolsEnabled = projectConfig.devtools?.enabled ?? false;
227
227
  const modelManager = new ModelManager({
@@ -232,10 +232,9 @@ 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
- modelManager.setModel("handoff-agent", chosenModel);
239
238
  return modelManager;
240
239
  }
241
240
  async function initializeSessionManager(sessionsDir, modelManager, tokenTracker) {
@@ -254,69 +253,74 @@ async function initializeSessionManager(sessionsDir, modelManager, tokenTracker)
254
253
  });
255
254
  return sessionManager;
256
255
  }
257
- async function handleConversationHistory(sessionManager, sessionsDir, _hasContinueOrResume, resumeSessionId) {
258
- if (flags.continue === true) {
256
+ export async function handleConversationHistory(sessionManager, sessionsDir, _hasContinueOrResume, resumeSessionId, continueFlag = flags.continue, resumeFlag = flags.resume, selectFn = select, setTitleFn = setTerminalTitle) {
257
+ if (continueFlag === true) {
258
+ await handleContinue(sessionManager, sessionsDir, selectFn, setTitleFn);
259
+ }
260
+ else if (resumeFlag === true) {
261
+ await handleResume(sessionManager, sessionsDir, resumeSessionId, setTitleFn);
262
+ }
263
+ }
264
+ async function handleContinue(sessionManager, sessionsDir, selectFn, setTitleFn) {
265
+ const histories = await SessionManager.load(sessionsDir, DEFAULT_HISTORY_LIMIT);
266
+ if (histories.length === 0) {
267
+ logger.info("No previous conversations found to continue.");
268
+ return;
269
+ }
270
+ try {
271
+ const choice = await selectFn({
272
+ message: "Select a conversation to resume:",
273
+ choices: histories.map((h, index) => ({
274
+ name: `${index + 1}: ${h.title} [${h.sessionId}] (${h.updatedAt.toLocaleString()})`,
275
+ value: index,
276
+ description: `${h.messages.length} messages`,
277
+ })),
278
+ });
279
+ const selectedHistory = histories.at(choice);
280
+ if (selectedHistory) {
281
+ sessionManager.restore(selectedHistory);
282
+ logger.info(`Resuming conversation: ${selectedHistory.title}`);
283
+ setTitleFn(selectedHistory.title || `acai: ${process.cwd()}`);
284
+ }
285
+ else {
286
+ logger.error("Selected history index out of bounds.");
287
+ }
288
+ }
289
+ catch (error) {
290
+ if (error instanceof Error &&
291
+ "isCanceled" in error &&
292
+ error.isCanceled === true) {
293
+ logger.info("Resume selection cancelled.");
294
+ }
295
+ else {
296
+ throw error;
297
+ }
298
+ }
299
+ }
300
+ async function handleResume(sessionManager, sessionsDir, resumeSessionId, setTitleFn) {
301
+ if (resumeSessionId) {
259
302
  const histories = await SessionManager.load(sessionsDir, DEFAULT_HISTORY_LIMIT);
260
- if (histories.length > 0) {
261
- try {
262
- const choice = await select({
263
- message: "Select a conversation to resume:",
264
- choices: histories.map((h, index) => ({
265
- name: `${index + 1}: ${h.title} [${h.sessionId}] (${h.updatedAt.toLocaleString()})`,
266
- value: index,
267
- description: `${h.messages.length} messages`,
268
- })),
269
- });
270
- const selectedHistory = histories.at(choice);
271
- if (selectedHistory) {
272
- sessionManager.restore(selectedHistory);
273
- logger.info(`Resuming conversation: ${selectedHistory.title}`);
274
- setTerminalTitle(selectedHistory.title || `acai: ${process.cwd()}`);
275
- }
276
- else {
277
- logger.error("Selected history index out of bounds.");
278
- }
279
- }
280
- catch (error) {
281
- if (error instanceof Error &&
282
- "isCanceled" in error &&
283
- error.isCanceled === true) {
284
- logger.info("Resume selection cancelled.");
285
- }
286
- else {
287
- throw error;
288
- }
289
- }
303
+ const targetHistory = histories.find((h) => h.sessionId === resumeSessionId);
304
+ if (targetHistory) {
305
+ sessionManager.restore(targetHistory);
306
+ logger.info(`Resuming conversation: ${targetHistory.title}`);
307
+ setTitleFn(targetHistory.title || `acai: ${process.cwd()}`);
290
308
  }
291
309
  else {
292
- logger.info("No previous conversations found to continue.");
310
+ console.error(`Session not found: ${resumeSessionId}`);
311
+ process.exit(1);
293
312
  }
294
313
  }
295
- else if (flags.resume === true) {
296
- if (resumeSessionId) {
297
- const histories = await SessionManager.load(sessionsDir, DEFAULT_HISTORY_LIMIT);
298
- const targetHistory = histories.find((h) => h.sessionId === resumeSessionId);
299
- if (targetHistory) {
300
- sessionManager.restore(targetHistory);
301
- logger.info(`Resuming conversation: ${targetHistory.title}`);
302
- setTerminalTitle(targetHistory.title || `acai: ${process.cwd()}`);
303
- }
304
- else {
305
- console.error(`Session not found: ${resumeSessionId}`);
306
- process.exit(1);
307
- }
314
+ else {
315
+ const histories = await SessionManager.load(sessionsDir, 1); // read the most recent session
316
+ const latestHistory = histories.at(0);
317
+ if (latestHistory) {
318
+ sessionManager.restore(latestHistory);
319
+ console.info(`Resuming conversation: ${latestHistory.title}`);
320
+ setTitleFn(latestHistory.title || `acai: ${process.cwd()}`);
308
321
  }
309
322
  else {
310
- const histories = await SessionManager.load(sessionsDir, 1); // read the most recent session
311
- const latestHistory = histories.at(0);
312
- if (latestHistory) {
313
- sessionManager.restore(latestHistory);
314
- console.info(`Resuming conversation: ${latestHistory.title}`);
315
- setTerminalTitle(latestHistory.title || `acai: ${process.cwd()}`);
316
- }
317
- else {
318
- logger.info("No previous conversation found to resume.");
319
- }
323
+ logger.info("No previous conversation found to resume.");
320
324
  }
321
325
  }
322
326
  }
@@ -337,6 +341,7 @@ function setupReplEventHandlers(repl, agent, sessionManager, noSession) {
337
341
  logger.info("Resetting agent state.");
338
342
  agent.resetState();
339
343
  agent.setConfig(await config.getConfig());
344
+ getActivatedSkillsTracker().reset();
340
345
  void repl.rerender();
341
346
  });
342
347
  repl.setInterruptCallback(async () => {
@@ -352,7 +357,6 @@ function setupReplEventHandlers(repl, agent, sessionManager, noSession) {
352
357
  });
353
358
  repl.setExitCallback(async (_sessionId) => {
354
359
  if (!sessionManager.isEmpty()) {
355
- await repl.triggerRuleGeneration();
356
360
  writeExitSummary(sessionManager, noSession);
357
361
  }
358
362
  });
@@ -448,6 +452,26 @@ async function runReplMode(state, stdinWasPiped, noSession) {
448
452
  await handleStdinPrompt(state, agent, repl, tools, activeTools, systemPromptResult, noSession);
449
453
  await runInteractiveLoop(repl, agent, tools, activeTools, systemPromptResult, noSession, state.sessionManager, state.appConfig.loop.maxIterations);
450
454
  }
455
+ /**
456
+ * Expands a leading tilde in a path to the user's home directory.
457
+ * If the path does not start with ~, it is returned unchanged.
458
+ */
459
+ export function expandTildePath(dir) {
460
+ if (dir.startsWith("~/") || dir === "~") {
461
+ return path.join(os.homedir(), dir.slice(1));
462
+ }
463
+ return dir;
464
+ }
465
+ /**
466
+ * Resolves a path (expanding tilde if present) and adds it to a list
467
+ * of directories if it is not already present.
468
+ */
469
+ export function addUniqueDir(dir, dirs) {
470
+ const resolvedDir = path.resolve(expandTildePath(dir));
471
+ if (!dirs.includes(resolvedDir)) {
472
+ dirs.push(resolvedDir);
473
+ }
474
+ }
451
475
  async function main() {
452
476
  try {
453
477
  const appConfig = await config.ensureDefaultConfig("acai");
@@ -462,14 +486,20 @@ async function main() {
462
486
  const { initialPromptInput, stdinContent, hasContinueOrResume, resumeSessionId, } = await determineInitialPrompt();
463
487
  // Initialize application state
464
488
  const state = await initializeAppState(appConfig, initialPromptInput, stdinContent, hasContinueOrResume, resumeSessionId);
489
+ // Add config-sourced allowed directories (merged from app and project configs)
490
+ const mergedConfig = await config.getConfig();
491
+ for (const dir of mergedConfig.allowedDirs ?? []) {
492
+ addUniqueDir(dir, workspace.allowedDirs);
493
+ }
494
+ // Add configured skills paths to allowed directories so scripts within
495
+ // them can be executed by the Bash tool.
496
+ for (const resolvedDir of parseSkillsPath(mergedConfig.skills?.path ?? "")) {
497
+ addUniqueDir(resolvedDir, workspace.allowedDirs);
498
+ }
465
499
  // Add logs directory to allowed directories if configured
466
- const logsPath = (await config.getConfig()).logs?.path;
500
+ const logsPath = mergedConfig.logs?.path;
467
501
  if (logsPath) {
468
- // Expand ~ to home directory before resolving
469
- const expandedLogsPath = logsPath.startsWith("~/") || logsPath === "~"
470
- ? path.join(os.homedir(), logsPath.slice(1))
471
- : logsPath;
472
- const logsDir = path.dirname(path.resolve(expandedLogsPath));
502
+ const logsDir = path.dirname(path.resolve(expandTildePath(logsPath)));
473
503
  if (!workspace.allowedDirs.includes(logsDir)) {
474
504
  workspace.allowedDirs.push(logsDir);
475
505
  }
@@ -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 = {};