scai
Version:
> AI-powered CLI tool for commit messages **and** pull request reviews — using local models.
48 lines (47 loc) • 2.27 kB
JavaScript
import fs from 'fs/promises';
import chalk from 'chalk';
import { runModulePipeline } from './pipeline/runModulePipeline.js';
import { normalizePath } from './utils/normalizePath.js';
import { readConfig } from './config.js';
import { countTokens, splitCodeIntoChunks } from './utils/splitCodeIntoChunk.js';
export async function handleAgentRun(filepath, modules) {
try {
filepath = normalizePath(filepath);
const content = await fs.readFile(filepath, 'utf-8');
const totalTokens = countTokens(content);
console.log(chalk.blue(`🧮 Total tokens in file:`), chalk.yellow(totalTokens.toString()));
const config = readConfig();
const maxTokens = 1500;
const chunks = splitCodeIntoChunks(content, maxTokens);
console.log(chalk.magenta(`📦 Split into ${chunks.length} chunks`));
const processedChunks = [];
for (const [i, chunk] of chunks.entries()) {
const chunkTokens = countTokens(chunk);
if (i === 0) {
console.log(chalk.cyan(`🔍 Processing ${chunks.length} chunks of file:`), chalk.white(filepath));
}
console.log(chalk.gray(` - Chunk ${i + 1} tokens:`), chalk.yellow(chunkTokens.toString()));
const chunkInput = {
originalContent: chunk,
content: chunk,
filepath,
chunkIndex: i,
chunkCount: chunks.length,
};
const response = await runModulePipeline(modules, chunkInput);
if (!response.content.trim()) {
throw new Error(`⚠️ Model returned empty result on chunk ${i + 1}`);
}
processedChunks.push(response.content);
//console.log(chalk.green(`✅ Finished chunk ${i + 1}/${chunks.length}`));
}
// Join all chunk outputs into one string
const finalOutput = processedChunks.join('\n\n');
// Overwrite original file here:
await fs.writeFile(filepath, finalOutput, 'utf-8');
console.log(chalk.green(`✅ Original file overwritten: ${filepath}`));
}
catch (err) {
console.error(chalk.red('❌ Error in agent run:'), err instanceof Error ? err.message : err);
}
}