@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.
- package/README.md +5 -2
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +91 -5
- package/dist/commands/history/types.d.ts +3 -2
- package/dist/commands/history/types.d.ts.map +1 -1
- package/dist/commands/init-project/utils.d.ts +0 -1
- package/dist/commands/init-project/utils.d.ts.map +1 -1
- package/dist/commands/init-project/utils.js +1 -1
- package/dist/commands/manager.d.ts.map +1 -1
- package/dist/commands/manager.js +0 -18
- package/dist/commands/share/html-renderer.d.ts.map +1 -1
- package/dist/commands/share/html-renderer.js +54 -48
- package/dist/commands/tools/index.js +39 -38
- package/dist/config/index.d.ts +0 -2
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -7
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +94 -76
- package/dist/models/manager.d.ts +1 -10
- package/dist/models/manager.d.ts.map +1 -1
- package/dist/models/manager.js +2 -2
- package/dist/models/opencode-go-provider.d.ts +6 -4
- package/dist/models/opencode-go-provider.d.ts.map +1 -1
- package/dist/models/opencode-go-provider.js +55 -35
- package/dist/models/providers.d.ts +1 -1
- package/dist/models/providers.d.ts.map +1 -1
- package/dist/prompts/system-prompt.d.ts +0 -2
- package/dist/prompts/system-prompt.d.ts.map +1 -1
- package/dist/prompts/system-prompt.js +6 -10
- package/dist/repl/index.d.ts +27 -11
- package/dist/repl/index.d.ts.map +1 -1
- package/dist/repl/index.js +238 -254
- package/dist/sessions/manager.d.ts +41 -0
- package/dist/sessions/manager.d.ts.map +1 -1
- package/dist/sessions/manager.js +53 -0
- package/dist/sessions/summary.d.ts.map +1 -1
- package/dist/sessions/summary.js +18 -0
- package/dist/skills/index.d.ts +12 -2
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +123 -73
- package/dist/terminal/control.d.ts +1 -21
- package/dist/terminal/control.d.ts.map +1 -1
- package/dist/terminal/control.js +1 -32
- package/dist/terminal/formatting.d.ts +0 -33
- package/dist/terminal/formatting.d.ts.map +1 -1
- package/dist/terminal/formatting.js +0 -91
- package/dist/terminal/highlight/theme.d.ts +0 -37
- package/dist/terminal/highlight/theme.d.ts.map +1 -1
- package/dist/terminal/highlight/theme.js +1 -79
- package/dist/terminal/keys.d.ts +0 -97
- package/dist/terminal/keys.d.ts.map +1 -1
- package/dist/terminal/keys.js +0 -194
- package/dist/terminal/select-prompt.d.ts.map +1 -1
- package/dist/terminal/select-prompt.js +65 -51
- package/dist/terminal/style.d.ts +1 -1
- package/dist/terminal/style.d.ts.map +1 -1
- package/dist/terminal/supports-color.d.ts.map +1 -1
- package/dist/terminal/supports-color.js +38 -20
- package/dist/terminal/supports-hyperlinks.d.ts +3 -0
- package/dist/terminal/supports-hyperlinks.d.ts.map +1 -1
- package/dist/terminal/supports-hyperlinks.js +72 -31
- package/dist/terminal/table/layout-manager.d.ts +0 -20
- package/dist/terminal/table/layout-manager.d.ts.map +1 -1
- package/dist/terminal/table/layout-manager.js +68 -44
- package/dist/terminal/table/utils.d.ts +0 -1
- package/dist/terminal/table/utils.d.ts.map +1 -1
- package/dist/terminal/table/utils.js +2 -4
- package/dist/tools/apply-patch.d.ts +5 -3
- package/dist/tools/apply-patch.d.ts.map +1 -1
- package/dist/tools/apply-patch.js +154 -123
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +11 -8
- package/dist/tools/dynamic-tool-loader.d.ts +6 -1
- package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
- package/dist/tools/dynamic-tool-loader.js +154 -135
- package/dist/tools/index.d.ts +3 -133
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +0 -20
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +32 -13
- package/dist/tools/skill.d.ts.map +1 -1
- package/dist/tools/skill.js +20 -13
- package/dist/tools/web-fetch.d.ts +2 -6
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +59 -36
- package/dist/tools/web-search.d.ts +0 -4
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +40 -32
- package/dist/tui/autocomplete/utils.d.ts +0 -15
- package/dist/tui/autocomplete/utils.d.ts.map +1 -1
- package/dist/tui/autocomplete/utils.js +0 -85
- package/dist/tui/autocomplete.d.ts +1 -1
- package/dist/tui/autocomplete.d.ts.map +1 -1
- package/dist/tui/autocomplete.js +1 -1
- package/dist/tui/components/editor.d.ts +12 -0
- package/dist/tui/components/editor.d.ts.map +1 -1
- package/dist/tui/components/editor.js +181 -195
- package/dist/tui/components/input.d.ts +4 -0
- package/dist/tui/components/input.d.ts.map +1 -1
- package/dist/tui/components/input.js +33 -31
- package/dist/tui/components/markdown.d.ts +30 -0
- package/dist/tui/components/markdown.d.ts.map +1 -1
- package/dist/tui/components/markdown.js +274 -242
- package/dist/tui/components/modal.d.ts.map +1 -1
- package/dist/tui/components/modal.js +11 -11
- package/dist/tui/components/select-list.d.ts +5 -0
- package/dist/tui/components/select-list.d.ts.map +1 -1
- package/dist/tui/components/select-list.js +69 -98
- package/dist/tui/components/table.d.ts +6 -0
- package/dist/tui/components/table.d.ts.map +1 -1
- package/dist/tui/components/table.js +61 -52
- package/dist/tui/index.d.ts +1 -8
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +0 -8
- package/dist/tui/tui.d.ts +9 -0
- package/dist/tui/tui.d.ts.map +1 -1
- package/dist/tui/tui.js +78 -48
- package/dist/tui/utils.d.ts +7 -0
- package/dist/tui/utils.d.ts.map +1 -1
- package/dist/tui/utils.js +117 -53
- package/dist/utils/bash.d.ts.map +1 -1
- package/dist/utils/bash.js +156 -104
- package/dist/utils/command-protection.d.ts +3 -6
- package/dist/utils/command-protection.d.ts.map +1 -1
- package/dist/utils/command-protection.js +213 -100
- package/dist/utils/filesystem/operations.d.ts +0 -15
- package/dist/utils/filesystem/operations.d.ts.map +1 -1
- package/dist/utils/filesystem/operations.js +1 -38
- package/dist/utils/filesystem/security.d.ts.map +1 -1
- package/dist/utils/filesystem/security.js +22 -15
- package/dist/utils/filetype-detection.d.ts +0 -1
- package/dist/utils/filetype-detection.d.ts.map +1 -1
- package/dist/utils/filetype-detection.js +0 -12
- package/dist/utils/formatting.d.ts +0 -30
- package/dist/utils/formatting.d.ts.map +1 -1
- package/dist/utils/formatting.js +0 -44
- package/dist/utils/git.d.ts +4 -6
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +36 -46
- package/dist/utils/ignore.d.ts +1 -1
- package/dist/utils/ignore.d.ts.map +1 -1
- package/dist/utils/ignore.js +1 -1
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +77 -79
- package/dist/utils/yaml.d.ts +0 -1
- package/dist/utils/yaml.d.ts.map +1 -1
- package/dist/utils/yaml.js +80 -89
- package/dist/utils/zod.d.ts +0 -3
- package/dist/utils/zod.d.ts.map +1 -1
- package/dist/utils/zod.js +0 -7
- package/package.json +25 -24
- package/dist/agent/sub-agent.d.ts +0 -23
- package/dist/agent/sub-agent.d.ts.map +0 -1
- package/dist/agent/sub-agent.js +0 -109
- package/dist/commands/add-directory/index.d.ts +0 -3
- package/dist/commands/add-directory/index.d.ts.map +0 -1
- package/dist/commands/add-directory/index.js +0 -50
- package/dist/commands/add-directory/utils.d.ts +0 -3
- package/dist/commands/add-directory/utils.d.ts.map +0 -1
- package/dist/commands/add-directory/utils.js +0 -15
- package/dist/commands/clear/index.d.ts +0 -3
- package/dist/commands/clear/index.d.ts.map +0 -1
- package/dist/commands/clear/index.js +0 -13
- package/dist/commands/generate-rules/index.d.ts +0 -3
- package/dist/commands/generate-rules/index.d.ts.map +0 -1
- package/dist/commands/generate-rules/index.js +0 -206
- package/dist/commands/generate-rules/service.d.ts +0 -22
- package/dist/commands/generate-rules/service.d.ts.map +0 -1
- package/dist/commands/generate-rules/service.js +0 -103
- package/dist/commands/generate-rules/utils.d.ts +0 -5
- package/dist/commands/generate-rules/utils.d.ts.map +0 -1
- package/dist/commands/generate-rules/utils.js +0 -25
- package/dist/commands/handoff/index.d.ts +0 -3
- package/dist/commands/handoff/index.d.ts.map +0 -1
- package/dist/commands/handoff/index.js +0 -97
- package/dist/commands/handoff/utils.d.ts +0 -4
- package/dist/commands/handoff/utils.d.ts.map +0 -1
- package/dist/commands/handoff/utils.js +0 -123
- package/dist/commands/list-directories/index.d.ts +0 -3
- package/dist/commands/list-directories/index.d.ts.map +0 -1
- package/dist/commands/list-directories/index.js +0 -35
- package/dist/commands/pickup/index.d.ts +0 -3
- package/dist/commands/pickup/index.d.ts.map +0 -1
- package/dist/commands/pickup/index.js +0 -141
- package/dist/commands/pickup/types.d.ts +0 -6
- package/dist/commands/pickup/types.d.ts.map +0 -1
- package/dist/commands/pickup/types.js +0 -1
- package/dist/commands/pickup/utils.d.ts +0 -7
- package/dist/commands/pickup/utils.d.ts.map +0 -1
- package/dist/commands/pickup/utils.js +0 -56
- package/dist/commands/remove-directory/index.d.ts +0 -3
- package/dist/commands/remove-directory/index.d.ts.map +0 -1
- package/dist/commands/remove-directory/index.js +0 -55
- package/dist/commands/review/index.d.ts +0 -3
- package/dist/commands/review/index.d.ts.map +0 -1
- package/dist/commands/review/index.js +0 -12
- package/dist/commands/review/review-panel.d.ts +0 -3
- package/dist/commands/review/review-panel.d.ts.map +0 -1
- package/dist/commands/review/review-panel.js +0 -186
- package/dist/commands/review/utils.d.ts +0 -18
- package/dist/commands/review/utils.d.ts.map +0 -1
- package/dist/commands/review/utils.js +0 -146
- package/dist/commands/shell/index.d.ts +0 -3
- package/dist/commands/shell/index.d.ts.map +0 -1
- package/dist/commands/shell/index.js +0 -96
- package/dist/subagents/index.d.ts +0 -16
- package/dist/subagents/index.d.ts.map +0 -1
- package/dist/subagents/index.js +0 -231
- package/dist/terminal/index.d.ts +0 -9
- package/dist/terminal/index.d.ts.map +0 -1
- package/dist/terminal/index.js +0 -8
- package/dist/tools/agent.d.ts +0 -27
- package/dist/tools/agent.d.ts.map +0 -1
- package/dist/tools/agent.js +0 -81
- package/dist/tools/directory-tree.d.ts +0 -28
- package/dist/tools/directory-tree.d.ts.map +0 -1
- package/dist/tools/directory-tree.js +0 -154
- package/dist/tools/glob.d.ts +0 -35
- package/dist/tools/glob.d.ts.map +0 -1
- package/dist/tools/glob.js +0 -167
- package/dist/tools/grep.d.ts +0 -100
- package/dist/tools/grep.d.ts.map +0 -1
- package/dist/tools/grep.js +0 -608
- package/dist/tools/ls.d.ts +0 -26
- package/dist/tools/ls.d.ts.map +0 -1
- package/dist/tools/ls.js +0 -83
- package/dist/tui/components/header.d.ts +0 -21
- package/dist/tui/components/header.d.ts.map +0 -1
- package/dist/tui/components/header.js +0 -63
- package/dist/utils/bash/parse.d.ts +0 -19
- package/dist/utils/bash/parse.d.ts.map +0 -1
- package/dist/utils/bash/parse.js +0 -223
- package/dist/utils/bash/quote.d.ts +0 -6
- package/dist/utils/bash/quote.d.ts.map +0 -1
- package/dist/utils/bash/quote.js +0 -23
- package/dist/utils/generators.d.ts +0 -3
- package/dist/utils/generators.d.ts.map +0 -1
- package/dist/utils/generators.js +0 -25
- package/dist/utils/glob.d.ts +0 -52
- package/dist/utils/glob.d.ts.map +0 -1
- 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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":";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:
|
|
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 (
|
|
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
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
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
|
-
|
|
310
|
+
console.error(`Session not found: ${resumeSessionId}`);
|
|
311
|
+
process.exit(1);
|
|
293
312
|
}
|
|
294
313
|
}
|
|
295
|
-
else
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
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
|
-
|
|
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
|
|
468
|
-
for (const dir of
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
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 =
|
|
500
|
+
const logsPath = mergedConfig.logs?.path;
|
|
479
501
|
if (logsPath) {
|
|
480
|
-
|
|
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
|
}
|
package/dist/models/manager.d.ts
CHANGED
|
@@ -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
|
-
|
|
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;
|
|
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"}
|
package/dist/models/manager.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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 "
|
|
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.
|
|
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" | "
|
|
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":"
|
|
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
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"qwen3.
|
|
36
|
-
"qwen3.
|
|
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:
|
|
116
|
-
costPerOutputToken: 0.
|
|
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.
|
|
152
|
-
costPerOutputToken: 0.
|
|
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.
|
|
164
|
-
costPerOutputToken: 0.
|
|
183
|
+
costPerInputToken: 0.00000174,
|
|
184
|
+
costPerOutputToken: 0.00000348,
|
|
165
185
|
},
|
|
166
|
-
"opencode-go:
|
|
167
|
-
id: "opencode-go:
|
|
186
|
+
"opencode-go:minimax-m3": {
|
|
187
|
+
id: "opencode-go:minimax-m3",
|
|
168
188
|
provider: "opencode-go",
|
|
169
|
-
contextWindow:
|
|
189
|
+
contextWindow: 204800,
|
|
170
190
|
maxOutputTokens: 131072,
|
|
171
|
-
defaultTemperature:
|
|
191
|
+
defaultTemperature: 0.5,
|
|
172
192
|
promptFormat: "markdown",
|
|
173
193
|
supportsReasoning: true,
|
|
174
194
|
supportsToolCalling: true,
|
|
175
|
-
costPerInputToken: 0.
|
|
176
|
-
costPerOutputToken: 0.
|
|
195
|
+
costPerInputToken: 0.0000003,
|
|
196
|
+
costPerOutputToken: 0.0000012,
|
|
177
197
|
},
|
|
178
|
-
"opencode-go:
|
|
179
|
-
id: "opencode-go:
|
|
198
|
+
"opencode-go:qwen3.6-plus": {
|
|
199
|
+
id: "opencode-go:qwen3.6-plus",
|
|
180
200
|
provider: "opencode-go",
|
|
181
|
-
contextWindow:
|
|
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:
|
|
188
|
-
costPerOutputToken: 0.
|
|
207
|
+
costPerInputToken: 0.0000005,
|
|
208
|
+
costPerOutputToken: 0.000003,
|
|
189
209
|
},
|
|
190
|
-
"opencode-go:qwen3.
|
|
191
|
-
id: "opencode-go:qwen3.
|
|
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:
|
|
200
|
-
costPerOutputToken: 0.
|
|
219
|
+
costPerInputToken: 0.0000004,
|
|
220
|
+
costPerOutputToken: 0.0000016,
|
|
201
221
|
},
|
|
202
|
-
"opencode-go:qwen3.
|
|
203
|
-
id: "opencode-go:qwen3.
|
|
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:
|
|
212
|
-
costPerOutputToken: 0.
|
|
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:
|
|
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,
|
|
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":"
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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}
|
|
229
|
+
const assembledPrompt = `${corePrompt}\n${projectContextText}\n\n${environmentInfoText}${skillsText}`;
|
|
234
230
|
const result = { prompt: assembledPrompt, components };
|
|
235
231
|
return result;
|
|
236
232
|
}
|