2026-06-15 17:29:38 -07:00
|
|
|
import type { Chunk } from "@/lib/agents/types";
|
2026-06-11 09:54:35 -07:00
|
|
|
|
|
|
|
|
import type { ChangedFileSummaryItem } from "./types";
|
2026-06-15 17:29:38 -07:00
|
|
|
import { countLineChanges } from "@/components/agents/utils/diffStats";
|
2026-06-11 09:54:35 -07:00
|
|
|
|
2026-06-15 17:29:38 -07:00
|
|
|
export function summarizeChangedFiles(chunks: Array<Chunk>): Array<ChangedFileSummaryItem> {
|
2026-06-11 09:54:35 -07:00
|
|
|
const byFile = new Map<string, { filePath: string; originalContent: string | null; modifiedContent: string }>();
|
|
|
|
|
|
|
|
|
|
for (const chunk of chunks) {
|
|
|
|
|
if (chunk.kind !== "tool-execution") continue;
|
|
|
|
|
if (chunk.status !== "completed") continue;
|
|
|
|
|
const diffEntries = chunk.diffs?.length ? chunk.diffs : (chunk.diffData ? [chunk.diffData] : []);
|
|
|
|
|
if (diffEntries.length === 0) continue;
|
|
|
|
|
|
2026-06-15 17:29:38 -07:00
|
|
|
for (const diffData of diffEntries) {
|
2026-06-11 09:54:35 -07:00
|
|
|
const existing = byFile.get(diffData.filePath);
|
|
|
|
|
|
|
|
|
|
if (!existing) {
|
|
|
|
|
byFile.set(diffData.filePath, {
|
|
|
|
|
filePath: diffData.filePath,
|
|
|
|
|
originalContent: diffData.originalContent,
|
|
|
|
|
modifiedContent: diffData.newContent,
|
|
|
|
|
});
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
byFile.set(diffData.filePath, {
|
|
|
|
|
filePath: existing.filePath,
|
|
|
|
|
originalContent: existing.originalContent,
|
|
|
|
|
modifiedContent: diffData.newContent,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return [...byFile.values()]
|
|
|
|
|
.map((file) => {
|
|
|
|
|
const { additions, deletions } = countLineChanges(
|
|
|
|
|
file.originalContent,
|
|
|
|
|
file.modifiedContent,
|
|
|
|
|
file.filePath,
|
|
|
|
|
);
|
|
|
|
|
return {
|
|
|
|
|
filePath: file.filePath,
|
|
|
|
|
additions,
|
|
|
|
|
deletions,
|
|
|
|
|
originalContent: file.originalContent ?? "",
|
|
|
|
|
modifiedContent: file.modifiedContent,
|
|
|
|
|
};
|
|
|
|
|
})
|
|
|
|
|
.sort((a, b) => a.filePath.localeCompare(b.filePath));
|
|
|
|
|
}
|