@travisennis/acai 0.0.12 → 0.0.14

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 (242) hide show
  1. package/README.md +5 -2
  2. package/dist/agent/index.d.ts.map +1 -1
  3. package/dist/agent/index.js +91 -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 -1
  9. package/dist/commands/manager.d.ts.map +1 -1
  10. package/dist/commands/manager.js +0 -18
  11. package/dist/commands/share/html-renderer.d.ts.map +1 -1
  12. package/dist/commands/share/html-renderer.js +54 -48
  13. package/dist/commands/tools/index.js +39 -38
  14. package/dist/config/index.d.ts +0 -2
  15. package/dist/config/index.d.ts.map +1 -1
  16. package/dist/config/index.js +3 -7
  17. package/dist/index.d.ts +14 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +94 -76
  20. package/dist/models/manager.d.ts +1 -10
  21. package/dist/models/manager.d.ts.map +1 -1
  22. package/dist/models/manager.js +2 -2
  23. package/dist/models/opencode-go-provider.d.ts +6 -4
  24. package/dist/models/opencode-go-provider.d.ts.map +1 -1
  25. package/dist/models/opencode-go-provider.js +55 -35
  26. package/dist/models/providers.d.ts +1 -1
  27. package/dist/models/providers.d.ts.map +1 -1
  28. package/dist/prompts/system-prompt.d.ts +0 -2
  29. package/dist/prompts/system-prompt.d.ts.map +1 -1
  30. package/dist/prompts/system-prompt.js +6 -10
  31. package/dist/repl/index.d.ts +27 -11
  32. package/dist/repl/index.d.ts.map +1 -1
  33. package/dist/repl/index.js +238 -254
  34. package/dist/sessions/manager.d.ts +41 -0
  35. package/dist/sessions/manager.d.ts.map +1 -1
  36. package/dist/sessions/manager.js +53 -0
  37. package/dist/sessions/summary.d.ts.map +1 -1
  38. package/dist/sessions/summary.js +18 -0
  39. package/dist/skills/index.d.ts +12 -2
  40. package/dist/skills/index.d.ts.map +1 -1
  41. package/dist/skills/index.js +123 -73
  42. package/dist/terminal/control.d.ts +1 -21
  43. package/dist/terminal/control.d.ts.map +1 -1
  44. package/dist/terminal/control.js +1 -32
  45. package/dist/terminal/formatting.d.ts +0 -33
  46. package/dist/terminal/formatting.d.ts.map +1 -1
  47. package/dist/terminal/formatting.js +0 -91
  48. package/dist/terminal/highlight/theme.d.ts +0 -37
  49. package/dist/terminal/highlight/theme.d.ts.map +1 -1
  50. package/dist/terminal/highlight/theme.js +1 -79
  51. package/dist/terminal/keys.d.ts +0 -97
  52. package/dist/terminal/keys.d.ts.map +1 -1
  53. package/dist/terminal/keys.js +0 -194
  54. package/dist/terminal/select-prompt.d.ts.map +1 -1
  55. package/dist/terminal/select-prompt.js +65 -51
  56. package/dist/terminal/style.d.ts +1 -1
  57. package/dist/terminal/style.d.ts.map +1 -1
  58. package/dist/terminal/supports-color.d.ts.map +1 -1
  59. package/dist/terminal/supports-color.js +38 -20
  60. package/dist/terminal/supports-hyperlinks.d.ts +3 -0
  61. package/dist/terminal/supports-hyperlinks.d.ts.map +1 -1
  62. package/dist/terminal/supports-hyperlinks.js +72 -31
  63. package/dist/terminal/table/layout-manager.d.ts +0 -20
  64. package/dist/terminal/table/layout-manager.d.ts.map +1 -1
  65. package/dist/terminal/table/layout-manager.js +68 -44
  66. package/dist/terminal/table/utils.d.ts +0 -1
  67. package/dist/terminal/table/utils.d.ts.map +1 -1
  68. package/dist/terminal/table/utils.js +2 -4
  69. package/dist/tools/apply-patch.d.ts +5 -3
  70. package/dist/tools/apply-patch.d.ts.map +1 -1
  71. package/dist/tools/apply-patch.js +154 -123
  72. package/dist/tools/bash.d.ts.map +1 -1
  73. package/dist/tools/bash.js +11 -8
  74. package/dist/tools/dynamic-tool-loader.d.ts +6 -1
  75. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
  76. package/dist/tools/dynamic-tool-loader.js +154 -135
  77. package/dist/tools/index.d.ts +3 -133
  78. package/dist/tools/index.d.ts.map +1 -1
  79. package/dist/tools/index.js +0 -20
  80. package/dist/tools/read-file.d.ts.map +1 -1
  81. package/dist/tools/read-file.js +32 -13
  82. package/dist/tools/skill.d.ts.map +1 -1
  83. package/dist/tools/skill.js +20 -13
  84. package/dist/tools/web-fetch.d.ts +2 -6
  85. package/dist/tools/web-fetch.d.ts.map +1 -1
  86. package/dist/tools/web-fetch.js +59 -36
  87. package/dist/tools/web-search.d.ts +0 -4
  88. package/dist/tools/web-search.d.ts.map +1 -1
  89. package/dist/tools/web-search.js +40 -32
  90. package/dist/tui/autocomplete/utils.d.ts +0 -15
  91. package/dist/tui/autocomplete/utils.d.ts.map +1 -1
  92. package/dist/tui/autocomplete/utils.js +0 -85
  93. package/dist/tui/autocomplete.d.ts +1 -1
  94. package/dist/tui/autocomplete.d.ts.map +1 -1
  95. package/dist/tui/autocomplete.js +1 -1
  96. package/dist/tui/components/editor.d.ts +12 -0
  97. package/dist/tui/components/editor.d.ts.map +1 -1
  98. package/dist/tui/components/editor.js +181 -195
  99. package/dist/tui/components/input.d.ts +4 -0
  100. package/dist/tui/components/input.d.ts.map +1 -1
  101. package/dist/tui/components/input.js +33 -31
  102. package/dist/tui/components/markdown.d.ts +30 -0
  103. package/dist/tui/components/markdown.d.ts.map +1 -1
  104. package/dist/tui/components/markdown.js +274 -242
  105. package/dist/tui/components/modal.d.ts.map +1 -1
  106. package/dist/tui/components/modal.js +11 -11
  107. package/dist/tui/components/select-list.d.ts +5 -0
  108. package/dist/tui/components/select-list.d.ts.map +1 -1
  109. package/dist/tui/components/select-list.js +69 -98
  110. package/dist/tui/components/table.d.ts +6 -0
  111. package/dist/tui/components/table.d.ts.map +1 -1
  112. package/dist/tui/components/table.js +61 -52
  113. package/dist/tui/index.d.ts +1 -8
  114. package/dist/tui/index.d.ts.map +1 -1
  115. package/dist/tui/index.js +0 -8
  116. package/dist/tui/tui.d.ts +9 -0
  117. package/dist/tui/tui.d.ts.map +1 -1
  118. package/dist/tui/tui.js +78 -48
  119. package/dist/tui/utils.d.ts +7 -0
  120. package/dist/tui/utils.d.ts.map +1 -1
  121. package/dist/tui/utils.js +117 -53
  122. package/dist/utils/bash.d.ts.map +1 -1
  123. package/dist/utils/bash.js +156 -104
  124. package/dist/utils/command-protection.d.ts +3 -6
  125. package/dist/utils/command-protection.d.ts.map +1 -1
  126. package/dist/utils/command-protection.js +213 -100
  127. package/dist/utils/filesystem/operations.d.ts +0 -15
  128. package/dist/utils/filesystem/operations.d.ts.map +1 -1
  129. package/dist/utils/filesystem/operations.js +1 -38
  130. package/dist/utils/filesystem/security.d.ts.map +1 -1
  131. package/dist/utils/filesystem/security.js +22 -15
  132. package/dist/utils/filetype-detection.d.ts +0 -1
  133. package/dist/utils/filetype-detection.d.ts.map +1 -1
  134. package/dist/utils/filetype-detection.js +0 -12
  135. package/dist/utils/formatting.d.ts +0 -30
  136. package/dist/utils/formatting.d.ts.map +1 -1
  137. package/dist/utils/formatting.js +0 -44
  138. package/dist/utils/git.d.ts +4 -6
  139. package/dist/utils/git.d.ts.map +1 -1
  140. package/dist/utils/git.js +36 -46
  141. package/dist/utils/ignore.d.ts +1 -1
  142. package/dist/utils/ignore.d.ts.map +1 -1
  143. package/dist/utils/ignore.js +1 -1
  144. package/dist/utils/process.d.ts.map +1 -1
  145. package/dist/utils/process.js +77 -79
  146. package/dist/utils/yaml.d.ts +0 -1
  147. package/dist/utils/yaml.d.ts.map +1 -1
  148. package/dist/utils/yaml.js +80 -89
  149. package/dist/utils/zod.d.ts +0 -3
  150. package/dist/utils/zod.d.ts.map +1 -1
  151. package/dist/utils/zod.js +0 -7
  152. package/package.json +25 -24
  153. package/dist/agent/sub-agent.d.ts +0 -23
  154. package/dist/agent/sub-agent.d.ts.map +0 -1
  155. package/dist/agent/sub-agent.js +0 -109
  156. package/dist/commands/add-directory/index.d.ts +0 -3
  157. package/dist/commands/add-directory/index.d.ts.map +0 -1
  158. package/dist/commands/add-directory/index.js +0 -50
  159. package/dist/commands/add-directory/utils.d.ts +0 -3
  160. package/dist/commands/add-directory/utils.d.ts.map +0 -1
  161. package/dist/commands/add-directory/utils.js +0 -15
  162. package/dist/commands/clear/index.d.ts +0 -3
  163. package/dist/commands/clear/index.d.ts.map +0 -1
  164. package/dist/commands/clear/index.js +0 -13
  165. package/dist/commands/generate-rules/index.d.ts +0 -3
  166. package/dist/commands/generate-rules/index.d.ts.map +0 -1
  167. package/dist/commands/generate-rules/index.js +0 -206
  168. package/dist/commands/generate-rules/service.d.ts +0 -22
  169. package/dist/commands/generate-rules/service.d.ts.map +0 -1
  170. package/dist/commands/generate-rules/service.js +0 -103
  171. package/dist/commands/generate-rules/utils.d.ts +0 -5
  172. package/dist/commands/generate-rules/utils.d.ts.map +0 -1
  173. package/dist/commands/generate-rules/utils.js +0 -25
  174. package/dist/commands/handoff/index.d.ts +0 -3
  175. package/dist/commands/handoff/index.d.ts.map +0 -1
  176. package/dist/commands/handoff/index.js +0 -97
  177. package/dist/commands/handoff/utils.d.ts +0 -4
  178. package/dist/commands/handoff/utils.d.ts.map +0 -1
  179. package/dist/commands/handoff/utils.js +0 -123
  180. package/dist/commands/list-directories/index.d.ts +0 -3
  181. package/dist/commands/list-directories/index.d.ts.map +0 -1
  182. package/dist/commands/list-directories/index.js +0 -35
  183. package/dist/commands/pickup/index.d.ts +0 -3
  184. package/dist/commands/pickup/index.d.ts.map +0 -1
  185. package/dist/commands/pickup/index.js +0 -141
  186. package/dist/commands/pickup/types.d.ts +0 -6
  187. package/dist/commands/pickup/types.d.ts.map +0 -1
  188. package/dist/commands/pickup/types.js +0 -1
  189. package/dist/commands/pickup/utils.d.ts +0 -7
  190. package/dist/commands/pickup/utils.d.ts.map +0 -1
  191. package/dist/commands/pickup/utils.js +0 -56
  192. package/dist/commands/remove-directory/index.d.ts +0 -3
  193. package/dist/commands/remove-directory/index.d.ts.map +0 -1
  194. package/dist/commands/remove-directory/index.js +0 -55
  195. package/dist/commands/review/index.d.ts +0 -3
  196. package/dist/commands/review/index.d.ts.map +0 -1
  197. package/dist/commands/review/index.js +0 -12
  198. package/dist/commands/review/review-panel.d.ts +0 -3
  199. package/dist/commands/review/review-panel.d.ts.map +0 -1
  200. package/dist/commands/review/review-panel.js +0 -186
  201. package/dist/commands/review/utils.d.ts +0 -18
  202. package/dist/commands/review/utils.d.ts.map +0 -1
  203. package/dist/commands/review/utils.js +0 -146
  204. package/dist/commands/shell/index.d.ts +0 -3
  205. package/dist/commands/shell/index.d.ts.map +0 -1
  206. package/dist/commands/shell/index.js +0 -96
  207. package/dist/subagents/index.d.ts +0 -16
  208. package/dist/subagents/index.d.ts.map +0 -1
  209. package/dist/subagents/index.js +0 -231
  210. package/dist/terminal/index.d.ts +0 -9
  211. package/dist/terminal/index.d.ts.map +0 -1
  212. package/dist/terminal/index.js +0 -8
  213. package/dist/tools/agent.d.ts +0 -27
  214. package/dist/tools/agent.d.ts.map +0 -1
  215. package/dist/tools/agent.js +0 -81
  216. package/dist/tools/directory-tree.d.ts +0 -28
  217. package/dist/tools/directory-tree.d.ts.map +0 -1
  218. package/dist/tools/directory-tree.js +0 -154
  219. package/dist/tools/glob.d.ts +0 -35
  220. package/dist/tools/glob.d.ts.map +0 -1
  221. package/dist/tools/glob.js +0 -167
  222. package/dist/tools/grep.d.ts +0 -100
  223. package/dist/tools/grep.d.ts.map +0 -1
  224. package/dist/tools/grep.js +0 -608
  225. package/dist/tools/ls.d.ts +0 -26
  226. package/dist/tools/ls.d.ts.map +0 -1
  227. package/dist/tools/ls.js +0 -83
  228. package/dist/tui/components/header.d.ts +0 -21
  229. package/dist/tui/components/header.d.ts.map +0 -1
  230. package/dist/tui/components/header.js +0 -63
  231. package/dist/utils/bash/parse.d.ts +0 -19
  232. package/dist/utils/bash/parse.d.ts.map +0 -1
  233. package/dist/utils/bash/parse.js +0 -223
  234. package/dist/utils/bash/quote.d.ts +0 -6
  235. package/dist/utils/bash/quote.d.ts.map +0 -1
  236. package/dist/utils/bash/quote.js +0 -23
  237. package/dist/utils/generators.d.ts +0 -3
  238. package/dist/utils/generators.d.ts.map +0 -1
  239. package/dist/utils/generators.js +0 -25
  240. package/dist/utils/glob.d.ts +0 -52
  241. package/dist/utils/glob.d.ts.map +0 -1
  242. package/dist/utils/glob.js +0 -376
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":";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"}
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";
@@ -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:glm-5-1"; // DEFAULT MODEL
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({
@@ -235,7 +235,6 @@ async function initializeModelManager(appDir) {
235
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
  }
@@ -353,7 +357,6 @@ function setupReplEventHandlers(repl, agent, sessionManager, noSession) {
353
357
  });
354
358
  repl.setExitCallback(async (_sessionId) => {
355
359
  if (!sessionManager.isEmpty()) {
356
- await repl.triggerRuleGeneration();
357
360
  writeExitSummary(sessionManager, noSession);
358
361
  }
359
362
  });
@@ -449,6 +452,26 @@ async function runReplMode(state, stdinWasPiped, noSession) {
449
452
  await handleStdinPrompt(state, agent, repl, tools, activeTools, systemPromptResult, noSession);
450
453
  await runInteractiveLoop(repl, agent, tools, activeTools, systemPromptResult, noSession, state.sessionManager, state.appConfig.loop.maxIterations);
451
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
+ }
452
475
  async function main() {
453
476
  try {
454
477
  const appConfig = await config.ensureDefaultConfig("acai");
@@ -463,25 +486,20 @@ async function main() {
463
486
  const { initialPromptInput, stdinContent, hasContinueOrResume, resumeSessionId, } = await determineInitialPrompt();
464
487
  // Initialize application state
465
488
  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
- }
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);
476
498
  }
477
499
  // Add logs directory to allowed directories if configured
478
- const logsPath = (await config.getConfig()).logs?.path;
500
+ const logsPath = mergedConfig.logs?.path;
479
501
  if (logsPath) {
480
- // Expand ~ to home directory before resolving
481
- const expandedLogsPath = logsPath.startsWith("~/") || logsPath === "~"
482
- ? path.join(os.homedir(), logsPath.slice(1))
483
- : logsPath;
484
- const logsDir = path.dirname(path.resolve(expandedLogsPath));
502
+ const logsDir = path.dirname(path.resolve(expandTildePath(logsPath)));
485
503
  if (!workspace.allowedDirs.includes(logsDir)) {
486
504
  workspace.allowedDirs.push(logsDir);
487
505
  }
@@ -1,16 +1,7 @@
1
1
  import EventEmitter from "node:events";
2
2
  import type { LanguageModelV3 } from "@ai-sdk/provider";
3
3
  import { type ModelMetadata, type ModelName } from "./providers.ts";
4
- export declare function getLanguageModel({ model, app, stateDir, devtoolsEnabled, }: {
5
- model: ModelName;
6
- app: string;
7
- stateDir: string;
8
- devtoolsEnabled?: boolean;
9
- }): LanguageModelV3;
10
- export declare function getModelMetadata({ model }: {
11
- model: ModelName;
12
- }): ModelMetadata<ModelName>;
13
- type App = "repl" | "cli" | "title-conversation" | "conversation-summarizer" | "conversation-analyzer" | "tool-repair" | "init-project" | "handoff-agent";
4
+ type App = "repl" | "cli" | "title-conversation" | "conversation-summarizer" | "conversation-analyzer" | "tool-repair" | "init-project";
14
5
  interface ModelManagerEvents {
15
6
  "set-model": [app: App, model: ModelName];
16
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../source/models/manager.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAC;AAEvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAOxD,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,SAAS,EAEf,MAAM,gBAAgB,CAAC;AAExB,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,GAAG,EACH,QAAQ,EACR,eAAuB,GACxB,EAAE;IACD,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,mBAiBA;AAED,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,4BAG/D;AAED,KAAK,GAAG,GACJ,MAAM,GACN,KAAK,GACL,oBAAoB,GACpB,yBAAyB,GACzB,uBAAuB,GACvB,aAAa,GACb,cAAc,GACd,eAAe,CAAC;AAEpB,UAAU,kBAAkB;IAC1B,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;CAC3C;AAED,qBAAa,YAAa,SAAQ,YAAY,CAAC,kBAAkB,CAAC;IAChE,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAU;gBACrB,EACV,QAAQ,EACR,eAAuB,GACxB,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE;IAQlD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS;IAiBnC,QAAQ,CAAC,GAAG,EAAE,GAAG;IAQjB,gBAAgB,CAAC,GAAG,EAAE,GAAG;CAO1B"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../source/models/manager.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAC;AAEvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAOxD,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,SAAS,EAEf,MAAM,gBAAgB,CAAC;AAoCxB,KAAK,GAAG,GACJ,MAAM,GACN,KAAK,GACL,oBAAoB,GACpB,yBAAyB,GACzB,uBAAuB,GACvB,aAAa,GACb,cAAc,CAAC;AAEnB,UAAU,kBAAkB;IAC1B,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;CAC3C;AAED,qBAAa,YAAa,SAAQ,YAAY,CAAC,kBAAkB,CAAC;IAChE,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAU;gBACrB,EACV,QAAQ,EACR,eAAuB,GACxB,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE;IAQlD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS;IAiBnC,QAAQ,CAAC,GAAG,EAAE,GAAG;IAQjB,gBAAgB,CAAC,GAAG,EAAE,GAAG;CAO1B"}
@@ -3,7 +3,7 @@ import { devToolsMiddleware } from "@ai-sdk/devtools";
3
3
  import { wrapLanguageModel } from "ai";
4
4
  import { auditMessage, cacheMiddleware, createRateLimitMiddleware, } from "../middleware/index.js";
5
5
  import { languageModel, modelRegistry, } from "./providers.js";
6
- export function getLanguageModel({ model, app, stateDir, devtoolsEnabled = false, }) {
6
+ function getLanguageModel({ model, app, stateDir, devtoolsEnabled = false, }) {
7
7
  const middleware = [
8
8
  cacheMiddleware,
9
9
  createRateLimitMiddleware({ requestsPerMinute: 30 }),
@@ -18,7 +18,7 @@ export function getLanguageModel({ model, app, stateDir, devtoolsEnabled = false
18
18
  });
19
19
  return langModel;
20
20
  }
21
- export function getModelMetadata({ model }) {
21
+ function getModelMetadata({ model }) {
22
22
  const modelMetadata = modelRegistry[model];
23
23
  return modelMetadata;
24
24
  }
@@ -4,22 +4,24 @@ declare const opencodeGoModels: {
4
4
  readonly "deepseek-v4-pro": import("@ai-sdk/provider").LanguageModelV3;
5
5
  readonly "glm-5": import("@ai-sdk/provider").LanguageModelV3;
6
6
  readonly "glm-5-1": import("@ai-sdk/provider").LanguageModelV3;
7
+ readonly "glm-5-2": import("@ai-sdk/provider").LanguageModelV3;
7
8
  readonly "kimi-k2-5": import("@ai-sdk/provider").LanguageModelV3;
8
9
  readonly "kimi-k2-6": import("@ai-sdk/provider").LanguageModelV3;
10
+ readonly "kimi-k2-7-code": import("@ai-sdk/provider").LanguageModelV3;
9
11
  readonly "minimax-m2-5": import("@ai-sdk/provider").LanguageModelV3;
10
12
  readonly "minimax-m2-7": import("@ai-sdk/provider").LanguageModelV3;
11
13
  readonly "mimo-v2-5": import("@ai-sdk/provider").LanguageModelV3;
12
14
  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 "minimax-m3": import("@ai-sdk/provider").LanguageModelV3;
15
16
  readonly "qwen3.6-plus": import("@ai-sdk/provider").LanguageModelV3;
16
- readonly "qwen3.5-plus": import("@ai-sdk/provider").LanguageModelV3;
17
+ readonly "qwen3.7-plus": import("@ai-sdk/provider").LanguageModelV3;
18
+ readonly "qwen3.7-max": import("@ai-sdk/provider").LanguageModelV3;
17
19
  };
18
20
  type ModelName = `opencode-go:${keyof typeof opencodeGoModels}`;
19
21
  export declare const opencodeGoModelNames: ModelName[];
20
22
  export declare const opencodeGoProvider: {
21
23
  "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;
24
+ languageModel(modelId: "deepseek-v4-flash" | "deepseek-v4-pro" | "glm-5" | "minimax-m3" | "qwen3.6-plus" | "qwen3.7-plus" | "qwen3.7-max" | "glm-5-1" | "glm-5-2" | "kimi-k2-5" | "kimi-k2-6" | "kimi-k2-7-code" | "minimax-m2-5" | "minimax-m2-7" | "mimo-v2-5" | "mimo-v2-5-pro"): import("@ai-sdk/provider").LanguageModelV3;
23
25
  embeddingModel(modelId: string): import("@ai-sdk/provider").EmbeddingModelV3;
24
26
  imageModel(modelId: string): import("@ai-sdk/provider").ImageModelV3;
25
27
  transcriptionModel(modelId: string): import("@ai-sdk/provider").TranscriptionModelV3;
@@ -1 +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"}
1
+ {"version":3,"file":"opencode-go-provider.d.ts","sourceRoot":"","sources":["../../source/models/opencode-go-provider.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAepD,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;CAiBZ,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;CAkM3C,CAAC"}
@@ -1,4 +1,3 @@
1
- import { createAlibaba } from "@ai-sdk/alibaba";
2
1
  import { createAnthropic } from "@ai-sdk/anthropic";
3
2
  import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
4
3
  import { objectKeys } from "@travisennis/stdlib/object";
@@ -14,26 +13,23 @@ const messagesClient = createAnthropic({
14
13
  baseURL: "https://opencode.ai/zen/go/v1",
15
14
  apiKey: process.env["OPENCODE_ZEN_API_TOKEN"] ?? "",
16
15
  });
17
- const alibabaClient = createAlibaba({
18
- apiKey: process.env["OPENCODE_ZEN_API_TOKEN"] ?? "",
19
- // biome-ignore lint/style/useNamingConvention: third-party controlled
20
- baseURL: "https://opencode.ai/zen/go/v1",
21
- });
22
16
  const opencodeGoModels = {
23
17
  "deepseek-v4-flash": completionsClient("deepseek-v4-flash"),
24
18
  "deepseek-v4-pro": completionsClient("deepseek-v4-pro"),
25
19
  "glm-5": completionsClient("glm-5"),
26
20
  "glm-5-1": completionsClient("glm-5.1"),
21
+ "glm-5-2": completionsClient("glm-5.2"),
27
22
  "kimi-k2-5": completionsClient("kimi-k2.5"),
28
23
  "kimi-k2-6": completionsClient("kimi-k2.6"),
24
+ "kimi-k2-7-code": completionsClient("kimi-k2.7-code"),
29
25
  "minimax-m2-5": messagesClient("minimax-m2.5"),
30
26
  "minimax-m2-7": messagesClient("minimax-m2.7"),
31
27
  "mimo-v2-5": completionsClient("mimo-v2.5"),
32
28
  "mimo-v2-5-pro": completionsClient("mimo-v2.5-pro"),
33
- "mimo-v2-pro": completionsClient("mimo-v2-pro"),
34
- "mimo-v2-omni": completionsClient("mimo-v2-omni"),
35
- "qwen3.6-plus": alibabaClient("qwen3.6-plus"),
36
- "qwen3.5-plus": alibabaClient("qwen3.5-plus"),
29
+ "minimax-m3": messagesClient("minimax-m3"),
30
+ "qwen3.6-plus": messagesClient("qwen3.6-plus"),
31
+ "qwen3.7-plus": messagesClient("qwen3.7-plus"),
32
+ "qwen3.7-max": messagesClient("qwen3.7-max"),
37
33
  };
38
34
  export const opencodeGoModelNames = objectKeys(opencodeGoModels).map((key) => `opencode-go:${key}`);
39
35
  export const opencodeGoProvider = {
@@ -91,6 +87,18 @@ export const opencodeGoModelRegistry = {
91
87
  costPerInputToken: 0.0000014,
92
88
  costPerOutputToken: 0.0000044,
93
89
  },
90
+ "opencode-go:glm-5-2": {
91
+ id: "opencode-go:glm-5-2",
92
+ provider: "opencode-go",
93
+ contextWindow: 202752,
94
+ maxOutputTokens: 202752,
95
+ defaultTemperature: 0.5,
96
+ promptFormat: "markdown",
97
+ supportsReasoning: true,
98
+ supportsToolCalling: true,
99
+ costPerInputToken: 0.0000014,
100
+ costPerOutputToken: 0.0000044,
101
+ },
94
102
  "opencode-go:kimi-k2-5": {
95
103
  id: "opencode-go:kimi-k2-5",
96
104
  provider: "opencode-go",
@@ -112,8 +120,20 @@ export const opencodeGoModelRegistry = {
112
120
  promptFormat: "markdown",
113
121
  supportsReasoning: true,
114
122
  supportsToolCalling: true,
115
- costPerInputToken: 7.448e-7,
116
- costPerOutputToken: 0.000004655,
123
+ costPerInputToken: 0.00000095,
124
+ costPerOutputToken: 0.000004,
125
+ },
126
+ "opencode-go:kimi-k2-7-code": {
127
+ id: "opencode-go:kimi-k2-7-code",
128
+ provider: "opencode-go",
129
+ contextWindow: 256000,
130
+ maxOutputTokens: 65536,
131
+ defaultTemperature: 1.0,
132
+ promptFormat: "markdown",
133
+ supportsReasoning: true,
134
+ supportsToolCalling: true,
135
+ costPerInputToken: 0.00000095,
136
+ costPerOutputToken: 0.000004,
117
137
  },
118
138
  "opencode-go:minimax-m2-5": {
119
139
  id: "opencode-go:minimax-m2-5",
@@ -148,8 +168,8 @@ export const opencodeGoModelRegistry = {
148
168
  promptFormat: "markdown",
149
169
  supportsReasoning: true,
150
170
  supportsToolCalling: true,
151
- costPerInputToken: 0.0000004,
152
- costPerOutputToken: 0.000002,
171
+ costPerInputToken: 0.00000014,
172
+ costPerOutputToken: 0.00000028,
153
173
  },
154
174
  "opencode-go:mimo-v2-5-pro": {
155
175
  id: "opencode-go:mimo-v2-5-pro",
@@ -160,35 +180,35 @@ export const opencodeGoModelRegistry = {
160
180
  promptFormat: "markdown",
161
181
  supportsReasoning: true,
162
182
  supportsToolCalling: true,
163
- costPerInputToken: 0.000001,
164
- costPerOutputToken: 0.000003,
183
+ costPerInputToken: 0.00000174,
184
+ costPerOutputToken: 0.00000348,
165
185
  },
166
- "opencode-go:mimo-v2-pro": {
167
- id: "opencode-go:mimo-v2-pro",
186
+ "opencode-go:minimax-m3": {
187
+ id: "opencode-go:minimax-m3",
168
188
  provider: "opencode-go",
169
- contextWindow: 1048576,
189
+ contextWindow: 204800,
170
190
  maxOutputTokens: 131072,
171
- defaultTemperature: 1.0,
191
+ defaultTemperature: 0.5,
172
192
  promptFormat: "markdown",
173
193
  supportsReasoning: true,
174
194
  supportsToolCalling: true,
175
- costPerInputToken: 0.000001,
176
- costPerOutputToken: 0.000003,
195
+ costPerInputToken: 0.0000003,
196
+ costPerOutputToken: 0.0000012,
177
197
  },
178
- "opencode-go:mimo-v2-omni": {
179
- id: "opencode-go:mimo-v2-omni",
198
+ "opencode-go:qwen3.6-plus": {
199
+ id: "opencode-go:qwen3.6-plus",
180
200
  provider: "opencode-go",
181
- contextWindow: 262144,
201
+ contextWindow: 1000000,
182
202
  maxOutputTokens: 65536,
183
203
  defaultTemperature: 1.0,
184
204
  promptFormat: "markdown",
185
205
  supportsReasoning: true,
186
206
  supportsToolCalling: true,
187
- costPerInputToken: 4e-7,
188
- costPerOutputToken: 0.000002,
207
+ costPerInputToken: 0.0000005,
208
+ costPerOutputToken: 0.000003,
189
209
  },
190
- "opencode-go:qwen3.6-plus": {
191
- id: "opencode-go:qwen3.6-plus",
210
+ "opencode-go:qwen3.7-plus": {
211
+ id: "opencode-go:qwen3.7-plus",
192
212
  provider: "opencode-go",
193
213
  contextWindow: 1000000,
194
214
  maxOutputTokens: 65536,
@@ -196,11 +216,11 @@ export const opencodeGoModelRegistry = {
196
216
  promptFormat: "markdown",
197
217
  supportsReasoning: true,
198
218
  supportsToolCalling: true,
199
- costPerInputToken: 3.25e-7,
200
- costPerOutputToken: 0.00000195,
219
+ costPerInputToken: 0.0000004,
220
+ costPerOutputToken: 0.0000016,
201
221
  },
202
- "opencode-go:qwen3.5-plus": {
203
- id: "opencode-go:qwen3.5-plus",
222
+ "opencode-go:qwen3.7-max": {
223
+ id: "opencode-go:qwen3.7-max",
204
224
  provider: "opencode-go",
205
225
  contextWindow: 1000000,
206
226
  maxOutputTokens: 65536,
@@ -208,7 +228,7 @@ export const opencodeGoModelRegistry = {
208
228
  promptFormat: "markdown",
209
229
  supportsReasoning: true,
210
230
  supportsToolCalling: true,
211
- costPerInputToken: 2.6e-7,
212
- costPerOutputToken: 0.00000156,
231
+ costPerInputToken: 0.0000025,
232
+ costPerOutputToken: 0.0000075,
213
233
  },
214
234
  };
@@ -1,6 +1,6 @@
1
1
  declare const providers: readonly ["anthropic", "openai", "google", "groq", "deepseek", "openrouter", "xai", "opencode", "opencode-go"];
2
2
  type ModelProvider = (typeof providers)[number];
3
- export declare const models: readonly ("anthropic:haiku" | "anthropic:opus" | "anthropic:sonnet" | "deepseek:deepseek-v4-flash" | "deepseek:deepseek-v4-pro" | "openai:gpt-5.1-codex-mini" | "openai:gpt-5.2" | "openai:gpt-5.2-codex" | "opencode-go:deepseek-v4-flash" | "opencode-go:deepseek-v4-pro" | "opencode-go:glm-5" | "opencode-go:mimo-v2-pro" | "opencode-go:mimo-v2-omni" | "opencode-go:qwen3.6-plus" | "opencode-go:qwen3.5-plus" | "opencode-go:glm-5-1" | "opencode-go:kimi-k2-5" | "opencode-go:kimi-k2-6" | "opencode-go:minimax-m2-5" | "opencode-go:minimax-m2-7" | "opencode-go:mimo-v2-5" | "opencode-go:mimo-v2-5-pro" | "opencode:glm-5" | "opencode:minimax-m2.5" | "opencode:minimax-m2.7" | "opencode:glm-5-1" | "opencode:kimi-k2-5" | "opencode:kimi-k2-6" | "opencode:opus-4-6" | "openrouter:glm-5" | "openrouter:glm-5-1" | "openrouter:kimi-k2-5" | "openrouter:kimi-k2-6" | "openrouter:minimax-m2-5" | "openrouter:minimax-m2-7" | "openrouter:gpt-oss-120b" | "openrouter:gpt-5-3-codex" | "openrouter:sonnet-4.5" | "openrouter:opus-4.6" | "openrouter:owl-alpha" | "openrouter:haiku-4.5" | "xai:grok-4-1-fast")[];
3
+ export declare const models: readonly ("anthropic:haiku" | "anthropic:opus" | "anthropic:sonnet" | "deepseek:deepseek-v4-flash" | "deepseek:deepseek-v4-pro" | "openai:gpt-5.1-codex-mini" | "openai:gpt-5.2" | "openai:gpt-5.2-codex" | "opencode-go:deepseek-v4-flash" | "opencode-go:deepseek-v4-pro" | "opencode-go:glm-5" | "opencode-go:minimax-m3" | "opencode-go:qwen3.6-plus" | "opencode-go:qwen3.7-plus" | "opencode-go:qwen3.7-max" | "opencode-go:glm-5-1" | "opencode-go:glm-5-2" | "opencode-go:kimi-k2-5" | "opencode-go:kimi-k2-6" | "opencode-go:kimi-k2-7-code" | "opencode-go:minimax-m2-5" | "opencode-go:minimax-m2-7" | "opencode-go:mimo-v2-5" | "opencode-go:mimo-v2-5-pro" | "opencode:glm-5" | "opencode:minimax-m2.5" | "opencode:minimax-m2.7" | "opencode:glm-5-1" | "opencode:kimi-k2-5" | "opencode:kimi-k2-6" | "opencode:opus-4-6" | "openrouter:glm-5" | "openrouter:glm-5-1" | "openrouter:kimi-k2-5" | "openrouter:kimi-k2-6" | "openrouter:minimax-m2-5" | "openrouter:minimax-m2-7" | "openrouter:gpt-oss-120b" | "openrouter:gpt-5-3-codex" | "openrouter:sonnet-4.5" | "openrouter:opus-4.6" | "openrouter:owl-alpha" | "openrouter:haiku-4.5" | "xai:grok-4-1-fast")[];
4
4
  export type ModelName = (typeof models)[number] | (`xai:${string}` & {}) | (`openai:${string}` & {}) | (`anthropic:${string}` & {}) | (`google:${string}` & {}) | (`groq:${string}` & {}) | (`deepseek:${string}` & {}) | (`openrouter:${string}` & {}) | (`opencode-go:${string}` & {}) | (`opencode:${string}` & {});
5
5
  export declare function isSupportedModel(model: unknown): model is ModelName;
6
6
  export declare function languageModel(model: ModelName): import("@ai-sdk/provider").LanguageModelV3;
@@ -1 +1 @@
1
- {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../source/models/providers.ts"],"names":[],"mappings":"AAgDA,QAAA,MAAM,SAAS,gHAUL,CAAC;AAEX,KAAK,aAAa,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAchD,eAAO,MAAM,MAAM,gkCAUT,CAAC;AAEX,MAAM,MAAM,SAAS,GACjB,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,GACvB,CAAC,OAAO,MAAM,EAAE,GAAG,EAAE,CAAC,GACtB,CAAC,UAAU,MAAM,EAAE,GAAG,EAAE,CAAC,GACzB,CAAC,aAAa,MAAM,EAAE,GAAG,EAAE,CAAC,GAC5B,CAAC,UAAU,MAAM,EAAE,GAAG,EAAE,CAAC,GACzB,CAAC,QAAQ,MAAM,EAAE,GAAG,EAAE,CAAC,GACvB,CAAC,YAAY,MAAM,EAAE,GAAG,EAAE,CAAC,GAC3B,CAAC,cAAc,MAAM,EAAE,GAAG,EAAE,CAAC,GAC7B,CAAC,eAAe,MAAM,EAAE,GAAG,EAAE,CAAC,GAC9B,CAAC,YAAY,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AAEhC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAcnE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,8CAE7C;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,SAAS;IAC1C,EAAE,EAAE,CAAC,CAAC;IACN,QAAQ,EAAE,aAAa,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,KAAK,GAAG,UAAU,GAAG,SAAS,CAAC;CAC9C;AAGD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,SAAS,EAAE,aAAa,CAU1D,CAAC;AAGF,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,IAAI,SAAS,CAEtE"}
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../source/models/providers.ts"],"names":[],"mappings":"AAgDA,QAAA,MAAM,SAAS,gHAUL,CAAC;AAEX,KAAK,aAAa,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAchD,eAAO,MAAM,MAAM,qnCAUT,CAAC;AAEX,MAAM,MAAM,SAAS,GACjB,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,GACvB,CAAC,OAAO,MAAM,EAAE,GAAG,EAAE,CAAC,GACtB,CAAC,UAAU,MAAM,EAAE,GAAG,EAAE,CAAC,GACzB,CAAC,aAAa,MAAM,EAAE,GAAG,EAAE,CAAC,GAC5B,CAAC,UAAU,MAAM,EAAE,GAAG,EAAE,CAAC,GACzB,CAAC,QAAQ,MAAM,EAAE,GAAG,EAAE,CAAC,GACvB,CAAC,YAAY,MAAM,EAAE,GAAG,EAAE,CAAC,GAC3B,CAAC,cAAc,MAAM,EAAE,GAAG,EAAE,CAAC,GAC7B,CAAC,eAAe,MAAM,EAAE,GAAG,EAAE,CAAC,GAC9B,CAAC,YAAY,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AAEhC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAcnE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,8CAE7C;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,SAAS;IAC1C,EAAE,EAAE,CAAC,CAAC;IACN,QAAQ,EAAE,aAAa,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,KAAK,GAAG,UAAU,GAAG,SAAS,CAAC;CAC9C;AAGD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,SAAS,EAAE,aAAa,CAU1D,CAAC;AAGF,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,IAAI,SAAS,CAEtE"}
@@ -6,9 +6,7 @@ type SystemPromptComponents = {
6
6
  cwdAgentsMd: string;
7
7
  learnedRules: string;
8
8
  skills: string;
9
- subagents: string;
10
9
  };
11
- export declare function environmentInfo(currentWorkingDir: string, allowedDirs: string[], logsPath?: string): Promise<string>;
12
10
  type SystemPromptOptions = {
13
11
  currentWorkingDir?: string;
14
12
  allowedDirs?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../source/prompts/system-prompt.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAI3D,KAAK,sBAAsB,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AA8CF,wBAAsB,eAAe,CACnC,iBAAiB,EAAE,MAAM,EACzB,WAAW,EAAE,MAAM,EAAE,EACrB,QAAQ,CAAC,EAAE,MAAM,mBA+BlB;AAED,KAAK,mBAAmB,GAAG;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,sBAAsB,CAAC;CACpC,CAAC;AAKF,wBAAsB,YAAY,CAChC,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAkL7B"}
1
+ {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../source/prompts/system-prompt.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAI3D,KAAK,sBAAsB,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAkFF,KAAK,mBAAmB,GAAG;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,sBAAsB,CAAC;CACpC,CAAC;AAKF,wBAAsB,YAAY,CAChC,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CA8K7B"}
@@ -1,8 +1,7 @@
1
1
  import { platform } from "node:os";
2
2
  import { config, parseSkillsPath } from "../config/index.js";
3
3
  import { formatSkillsForPrompt, loadSkills } from "../skills/index.js";
4
- import { formatSubagentsForPrompt, loadSubagents } from "../subagents/index.js";
5
- import { getShell } from "../terminal/index.js";
4
+ import { getShell } from "../terminal/control.js";
6
5
  import { dedent } from "../utils/dedent.js";
7
6
  import { getCurrentBranch, inGitDirectory } from "../utils/git.js";
8
7
  async function getProjectContext() {
@@ -41,7 +40,7 @@ async function getProjectContext() {
41
40
  learnedRules: learnedRules,
42
41
  };
43
42
  }
44
- export async function environmentInfo(currentWorkingDir, allowedDirs, logsPath) {
43
+ async function environmentInfo(currentWorkingDir, allowedDirs, logsPath) {
45
44
  const gitDirectory = await inGitDirectory();
46
45
  let gitSection = `- **Is directory a git repo**: ${gitDirectory ? "Yes" : "No"}`;
47
46
  if (gitDirectory) {
@@ -92,8 +91,6 @@ export async function systemPrompt(options) {
92
91
  const skills = await loadSkills(skillPaths);
93
92
  skillsText = formatSkillsForPrompt(skills.getModelInvocable());
94
93
  }
95
- const subagents = await loadSubagents();
96
- const subagentsText = formatSubagentsForPrompt(subagents);
97
94
  const corePrompt = minimalPrompt
98
95
  ? "You are acai. You are running as a coding agent in a CLI on the user's computer."
99
96
  : dedent `
@@ -179,9 +176,9 @@ You are producing plain text that will later be styled by the CLI. Follow these
179
176
  </tool_calling>
180
177
 
181
178
  <context_understanding>
182
- Grep search (grep and ripgrep) is your MAIN exploration tool.
179
+ Use Bash to run \`rg\` (ripgrep) and \`find\` for code exploration.
183
180
  - CRITICAL: Start with a broad set of queries that capture keywords based on the USER's request and provided context.
184
- - MANDATORY: Run multiple Grep searches in parallel with different patterns and variations; exact matches often miss related code.
181
+ - MANDATORY: Run multiple searches in parallel with different patterns and variations; exact matches often miss related code.
185
182
  - Keep searching new areas until you're CONFIDENT nothing important remains.
186
183
  - When you have found some relevant code, narrow your search and read the most likely important files.
187
184
  If you've performed an edit that may partially fulfill the USER's query, but you're not confident, gather more information or use more tools before ending your turn.
@@ -196,7 +193,7 @@ When gathering information about a topic, plan your searches upfront in your thi
196
193
  - Searching for different patterns (imports, usage, definitions) should happen in parallel
197
194
  - Multiple grep searches with different regex patterns should run simultaneously
198
195
  - Reading multiple files or searching different directories can be done all at once
199
- - Combining Glob with Grep for comprehensive results
196
+ - Combining \`find\` with \`rg\` for comprehensive results
200
197
  - Any information gathering where you know upfront what you're looking for
201
198
 
202
199
  And you should use parallel tool calls in many more cases beyond those listed above.
@@ -228,9 +225,8 @@ DEFAULT TO PARALLEL: Unless you have a specific reason why operations MUST be se
228
225
  cwdAgentsMd: projectContextResult.cwdAgentsMd,
229
226
  learnedRules: projectContextResult.learnedRules,
230
227
  skills: skillsText,
231
- subagents: subagentsText,
232
228
  };
233
- const assembledPrompt = `${corePrompt}\n${projectContextText}\n\n${environmentInfoText}${skillsText}\n\n${subagentsText}`;
229
+ const assembledPrompt = `${corePrompt}\n${projectContextText}\n\n${environmentInfoText}${skillsText}`;
234
230
  const result = { prompt: assembledPrompt, components };
235
231
  return result;
236
232
  }