scai
Version:
> **A local-first AI CLI for understanding, querying, and iterating on large codebases.** > **100% local • No token costs • No cloud • No prompt injection • Private by design**
75 lines (74 loc) • 2.31 kB
JavaScript
import readline from 'readline';
import { getIndexDir } from '../constants.js';
import { MainAgent } from '../agents/MainAgent.js';
import { Spinner } from '../lib/spinner.js';
import { clearRunLog } from '../utils/promptLogHelper.js';
export async function runAskCommand(query) {
// STEP 0: Get user query
if (!query)
query = await promptOnce('💬 Ask your question:\n');
query = query.trim();
if (!query) {
console.error('❌ No question provided.\n👉 Usage: scai ask "your question"');
return;
}
clearRunLog();
console.log(`📁 Using index root: ${getIndexDir()}`);
const now = new Date().toISOString();
const context = {
task: {
id: 0,
projectId: 0,
status: "active",
initialQuery: query,
createdAt: now,
updatedAt: now,
taskSteps: [],
},
initContext: {
userQuery: query,
relatedFiles: [],
relatedFileScores: {},
folderCapsules: [],
queryExpansionTerms: [],
},
};
// STEP 1: Run agent
try {
console.log('\n🤖 Launching autonomous agent...');
const spinner = new Spinner();
spinner.start();
const ui = {
update: text => spinner.update(text),
pause: fn => {
spinner.stop(); // pause spinner
try {
fn();
}
finally {
spinner.start(); // resume spinner
}
},
succeed: msg => spinner.succeed(msg),
fail: msg => spinner.fail(msg),
stop: () => spinner.stop() // ✅ proper stop implementation
};
const agent = new MainAgent(context, ui);
await agent.run();
spinner.succeed('Done');
}
catch (err) {
console.error('❌ Autonomous agent run failed:', err);
}
}
// helper
function promptOnce(promptText) {
return new Promise(resolve => {
console.log(promptText);
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
rl.question('> ', answer => {
rl.close();
resolve(answer.trim());
});
});
}