scai
Version:
> **AI-powered CLI for local code analysis, commit message suggestions, and natural-language queries.** 100% local, private, GDPR-friendly, made in Denmark/EU with ❤️.
54 lines (49 loc) • 2.02 kB
JavaScript
import { logInputOutput } from "../../utils/promptLogHelper.js";
import { generate } from "../../lib/generate.js";
export const finalAnswerModule = {
name: "finalAnswer",
description: "Generates a final answer using structured context and relevant working files.",
groups: ["finalize"],
run: async (input) => {
const query = input.query;
const context = input.context;
if (!context)
throw new Error("[finalAnswerModule] No context provided");
// Only consider authoritative target files
const targetFiles = context.plan?.targetFiles ?? [];
const workingFiles = (context.workingFiles ?? []).filter(f => targetFiles.includes(f.path));
const filesSummary = workingFiles.map(f => ({
path: f.path,
hasCode: !!f.code,
summary: f.summary ?? "",
codeSnippet: f.code ? f.code.slice(0, 500) : undefined, // optional snippet, avoid huge content
}));
const analysisSummary = {
intent: context.analysis?.intent,
fileAnalysis: context.analysis?.fileAnalysis,
combinedAnalysis: context.analysis?.combinedAnalysis,
};
const promptText = `
You are an AI assistant answering a developer query.
Query:
${query}
Analysis summary:
${JSON.stringify(analysisSummary, null, 2)}
Target files and content:
${JSON.stringify(filesSummary, null, 2)}
Instructions:
- Provide a clear, concise answer based only on the available files and analysis.
- Highlight risks or important notes from fileAnalysis or combinedAnalysis.
- Do not ask for additional files; assume the provided code is authoritative.
`;
const aiResponse = await generate({ query, content: promptText });
const output = {
query,
content: '',
data: aiResponse.data,
};
logInputOutput("finalAnswer", "output", output.data);
console.log('\n--> Answer: ', output.data);
return output;
},
};