@travisennis/acai 0.0.12 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +2 -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 +2 -6
- 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 +4 -4
- package/dist/models/opencode-go-provider.d.ts.map +1 -1
- package/dist/models/opencode-go-provider.js +29 -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/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 +121 -104
- package/dist/utils/command-protection.d.ts +3 -2
- package/dist/utils/command-protection.d.ts.map +1 -1
- package/dist/utils/command-protection.js +42 -33
- 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.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
|
}
|
|
@@ -10,16 +10,16 @@ declare const opencodeGoModels: {
|
|
|
10
10
|
readonly "minimax-m2-7": import("@ai-sdk/provider").LanguageModelV3;
|
|
11
11
|
readonly "mimo-v2-5": import("@ai-sdk/provider").LanguageModelV3;
|
|
12
12
|
readonly "mimo-v2-5-pro": import("@ai-sdk/provider").LanguageModelV3;
|
|
13
|
-
readonly "
|
|
14
|
-
readonly "mimo-v2-omni": import("@ai-sdk/provider").LanguageModelV3;
|
|
13
|
+
readonly "minimax-m3": import("@ai-sdk/provider").LanguageModelV3;
|
|
15
14
|
readonly "qwen3.6-plus": import("@ai-sdk/provider").LanguageModelV3;
|
|
16
|
-
readonly "qwen3.
|
|
15
|
+
readonly "qwen3.7-plus": import("@ai-sdk/provider").LanguageModelV3;
|
|
16
|
+
readonly "qwen3.7-max": import("@ai-sdk/provider").LanguageModelV3;
|
|
17
17
|
};
|
|
18
18
|
type ModelName = `opencode-go:${keyof typeof opencodeGoModels}`;
|
|
19
19
|
export declare const opencodeGoModelNames: ModelName[];
|
|
20
20
|
export declare const opencodeGoProvider: {
|
|
21
21
|
"opencode-go": import("@ai-sdk/provider").ProviderV3 & {
|
|
22
|
-
languageModel(modelId: "deepseek-v4-flash" | "deepseek-v4-pro" | "glm-5" | "
|
|
22
|
+
languageModel(modelId: "deepseek-v4-flash" | "deepseek-v4-pro" | "glm-5" | "minimax-m3" | "qwen3.6-plus" | "qwen3.7-plus" | "qwen3.7-max" | "glm-5-1" | "kimi-k2-5" | "kimi-k2-6" | "minimax-m2-5" | "minimax-m2-7" | "mimo-v2-5" | "mimo-v2-5-pro"): import("@ai-sdk/provider").LanguageModelV3;
|
|
23
23
|
embeddingModel(modelId: string): import("@ai-sdk/provider").EmbeddingModelV3;
|
|
24
24
|
imageModel(modelId: string): import("@ai-sdk/provider").ImageModelV3;
|
|
25
25
|
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;;;;;;;;;;;;;;;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,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,11 +13,6 @@ 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"),
|
|
@@ -30,10 +24,10 @@ const opencodeGoModels = {
|
|
|
30
24
|
"minimax-m2-7": messagesClient("minimax-m2.7"),
|
|
31
25
|
"mimo-v2-5": completionsClient("mimo-v2.5"),
|
|
32
26
|
"mimo-v2-5-pro": completionsClient("mimo-v2.5-pro"),
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"qwen3.
|
|
36
|
-
"qwen3.
|
|
27
|
+
"minimax-m3": messagesClient("minimax-m3"),
|
|
28
|
+
"qwen3.6-plus": messagesClient("qwen3.6-plus"),
|
|
29
|
+
"qwen3.7-plus": messagesClient("qwen3.7-plus"),
|
|
30
|
+
"qwen3.7-max": messagesClient("qwen3.7-max"),
|
|
37
31
|
};
|
|
38
32
|
export const opencodeGoModelNames = objectKeys(opencodeGoModels).map((key) => `opencode-go:${key}`);
|
|
39
33
|
export const opencodeGoProvider = {
|
|
@@ -112,8 +106,8 @@ export const opencodeGoModelRegistry = {
|
|
|
112
106
|
promptFormat: "markdown",
|
|
113
107
|
supportsReasoning: true,
|
|
114
108
|
supportsToolCalling: true,
|
|
115
|
-
costPerInputToken:
|
|
116
|
-
costPerOutputToken: 0.
|
|
109
|
+
costPerInputToken: 0.00000095,
|
|
110
|
+
costPerOutputToken: 0.000004,
|
|
117
111
|
},
|
|
118
112
|
"opencode-go:minimax-m2-5": {
|
|
119
113
|
id: "opencode-go:minimax-m2-5",
|
|
@@ -148,8 +142,8 @@ export const opencodeGoModelRegistry = {
|
|
|
148
142
|
promptFormat: "markdown",
|
|
149
143
|
supportsReasoning: true,
|
|
150
144
|
supportsToolCalling: true,
|
|
151
|
-
costPerInputToken: 0.
|
|
152
|
-
costPerOutputToken: 0.
|
|
145
|
+
costPerInputToken: 0.00000014,
|
|
146
|
+
costPerOutputToken: 0.00000028,
|
|
153
147
|
},
|
|
154
148
|
"opencode-go:mimo-v2-5-pro": {
|
|
155
149
|
id: "opencode-go:mimo-v2-5-pro",
|
|
@@ -160,35 +154,35 @@ export const opencodeGoModelRegistry = {
|
|
|
160
154
|
promptFormat: "markdown",
|
|
161
155
|
supportsReasoning: true,
|
|
162
156
|
supportsToolCalling: true,
|
|
163
|
-
costPerInputToken: 0.
|
|
164
|
-
costPerOutputToken: 0.
|
|
157
|
+
costPerInputToken: 0.00000174,
|
|
158
|
+
costPerOutputToken: 0.00000348,
|
|
165
159
|
},
|
|
166
|
-
"opencode-go:
|
|
167
|
-
id: "opencode-go:
|
|
160
|
+
"opencode-go:minimax-m3": {
|
|
161
|
+
id: "opencode-go:minimax-m3",
|
|
168
162
|
provider: "opencode-go",
|
|
169
|
-
contextWindow:
|
|
163
|
+
contextWindow: 204800,
|
|
170
164
|
maxOutputTokens: 131072,
|
|
171
|
-
defaultTemperature:
|
|
165
|
+
defaultTemperature: 0.5,
|
|
172
166
|
promptFormat: "markdown",
|
|
173
167
|
supportsReasoning: true,
|
|
174
168
|
supportsToolCalling: true,
|
|
175
|
-
costPerInputToken:
|
|
176
|
-
costPerOutputToken: 0.
|
|
169
|
+
costPerInputToken: 6e-7,
|
|
170
|
+
costPerOutputToken: 0.0000024,
|
|
177
171
|
},
|
|
178
|
-
"opencode-go:
|
|
179
|
-
id: "opencode-go:
|
|
172
|
+
"opencode-go:qwen3.6-plus": {
|
|
173
|
+
id: "opencode-go:qwen3.6-plus",
|
|
180
174
|
provider: "opencode-go",
|
|
181
|
-
contextWindow:
|
|
175
|
+
contextWindow: 1000000,
|
|
182
176
|
maxOutputTokens: 65536,
|
|
183
177
|
defaultTemperature: 1.0,
|
|
184
178
|
promptFormat: "markdown",
|
|
185
179
|
supportsReasoning: true,
|
|
186
180
|
supportsToolCalling: true,
|
|
187
|
-
costPerInputToken:
|
|
188
|
-
costPerOutputToken: 0.
|
|
181
|
+
costPerInputToken: 0.0000005,
|
|
182
|
+
costPerOutputToken: 0.000003,
|
|
189
183
|
},
|
|
190
|
-
"opencode-go:qwen3.
|
|
191
|
-
id: "opencode-go:qwen3.
|
|
184
|
+
"opencode-go:qwen3.7-plus": {
|
|
185
|
+
id: "opencode-go:qwen3.7-plus",
|
|
192
186
|
provider: "opencode-go",
|
|
193
187
|
contextWindow: 1000000,
|
|
194
188
|
maxOutputTokens: 65536,
|
|
@@ -196,11 +190,11 @@ export const opencodeGoModelRegistry = {
|
|
|
196
190
|
promptFormat: "markdown",
|
|
197
191
|
supportsReasoning: true,
|
|
198
192
|
supportsToolCalling: true,
|
|
199
|
-
costPerInputToken:
|
|
200
|
-
costPerOutputToken: 0.
|
|
193
|
+
costPerInputToken: 0.0000004,
|
|
194
|
+
costPerOutputToken: 0.0000016,
|
|
201
195
|
},
|
|
202
|
-
"opencode-go:qwen3.
|
|
203
|
-
id: "opencode-go:qwen3.
|
|
196
|
+
"opencode-go:qwen3.7-max": {
|
|
197
|
+
id: "opencode-go:qwen3.7-max",
|
|
204
198
|
provider: "opencode-go",
|
|
205
199
|
contextWindow: 1000000,
|
|
206
200
|
maxOutputTokens: 65536,
|
|
@@ -208,7 +202,7 @@ export const opencodeGoModelRegistry = {
|
|
|
208
202
|
promptFormat: "markdown",
|
|
209
203
|
supportsReasoning: true,
|
|
210
204
|
supportsToolCalling: true,
|
|
211
|
-
costPerInputToken:
|
|
212
|
-
costPerOutputToken: 0.
|
|
205
|
+
costPerInputToken: 0.0000025,
|
|
206
|
+
costPerOutputToken: 0.0000075,
|
|
213
207
|
},
|
|
214
208
|
};
|
|
@@ -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: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")[];
|
|
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,8jCAUT,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
|
}
|
package/dist/repl/index.d.ts
CHANGED
|
@@ -68,7 +68,6 @@ export declare class Repl {
|
|
|
68
68
|
private allThinkingBlocks;
|
|
69
69
|
private allToolExecutions;
|
|
70
70
|
private verboseMode;
|
|
71
|
-
private config;
|
|
72
71
|
/** Creates a new Repl instance, initializing the TUI layout and components. */
|
|
73
72
|
constructor(options: ReplOptions);
|
|
74
73
|
/**
|
|
@@ -82,6 +81,16 @@ export declare class Repl {
|
|
|
82
81
|
* and agent lifecycle transitions (start, stop, error).
|
|
83
82
|
*/
|
|
84
83
|
handle(event: AgentEvent, state: AgentState): Promise<void>;
|
|
84
|
+
private handleAgentStart;
|
|
85
|
+
private handleMessageStart;
|
|
86
|
+
private handleMessage;
|
|
87
|
+
private handleMessageEnd;
|
|
88
|
+
private handleToolCallLifecycle;
|
|
89
|
+
private handleAgentStop;
|
|
90
|
+
private handleAgentError;
|
|
91
|
+
private handleThinkingStart;
|
|
92
|
+
private handleThinking;
|
|
93
|
+
private handleThinkingEnd;
|
|
85
94
|
/** Adds a user message component to the chat container. */
|
|
86
95
|
private addMessageToChat;
|
|
87
96
|
/**
|
|
@@ -112,6 +121,23 @@ export declare class Repl {
|
|
|
112
121
|
* responses, and tool executions.
|
|
113
122
|
*/
|
|
114
123
|
private reconstructSession;
|
|
124
|
+
/**
|
|
125
|
+
* Collects all tool results from tool-role messages into a map
|
|
126
|
+
* keyed by tool call ID.
|
|
127
|
+
*/
|
|
128
|
+
private collectToolResults;
|
|
129
|
+
/**
|
|
130
|
+
* Extracts the output value string from a tool result's output field.
|
|
131
|
+
*/
|
|
132
|
+
private extractToolOutputValue;
|
|
133
|
+
/**
|
|
134
|
+
* Renders a user message into the chat container.
|
|
135
|
+
*/
|
|
136
|
+
private renderUserMessageFromSession;
|
|
137
|
+
/**
|
|
138
|
+
* Renders tool call execution components for an assistant message.
|
|
139
|
+
*/
|
|
140
|
+
private renderToolCallsForAssistantMessage;
|
|
115
141
|
/**
|
|
116
142
|
* Extracts the text content from a user message,
|
|
117
143
|
* handling both string and array content formats.
|
|
@@ -158,16 +184,6 @@ export declare class Repl {
|
|
|
158
184
|
* and the TUI. Optionally triggers the exit callback.
|
|
159
185
|
*/
|
|
160
186
|
stop(showExitMessage?: boolean): void;
|
|
161
|
-
/**
|
|
162
|
-
* Generates rules automatically if autoGenerateRules is enabled
|
|
163
|
-
* and the session has messages.
|
|
164
|
-
*/
|
|
165
|
-
private maybeGenerateRules;
|
|
166
|
-
/**
|
|
167
|
-
* Triggers rule generation for use before exit.
|
|
168
|
-
* Returns a promise that resolves when rules are generated.
|
|
169
|
-
*/
|
|
170
|
-
triggerRuleGeneration(): Promise<void>;
|
|
171
187
|
}
|
|
172
188
|
export {};
|
|
173
189
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/repl/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/repl/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/repl/index.ts"],"names":[],"mappings":"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"}
|