Collapse compaction summaries by metadata

This commit is contained in:
Federico Jaramillo Martinez
2026-05-07 16:13:15 +02:00
parent 7573d3c27f
commit 685ad9882b
4 changed files with 15 additions and 4 deletions
+3
View File
@@ -35,6 +35,8 @@ export function groupChatMessages(messages: ChatLine[], indexOffset = 0): ChatGr
}
export function summarizeChatGroup(messages: ChatLine[]): string {
if (messages.every((message) => message.source === "compaction")) return `${String(messages.length)} history compaction ${messages.length === 1 ? "summary" : "summaries"}`;
if (messages.every((message) => message.source === "branch_summary")) return `${String(messages.length)} branch ${messages.length === 1 ? "summary" : "summaries"}`;
const counts = messages.reduce<Record<string, number>>((acc, message) => {
acc[message.role] = (acc[message.role] ?? 0) + 1;
return acc;
@@ -44,5 +46,6 @@ export function summarizeChatGroup(messages: ChatLine[]): string {
}
function isReadablePart(message: ChatLine, part: ChatPart): boolean {
if (message.source === "compaction" || message.source === "branch_summary") return false;
return part.type === "text" && (message.role === "user" || message.role === "assistant" || message.role === "system" || message.role === "bash");
}
+9 -2
View File
@@ -24,10 +24,17 @@ function normalizeMessage(message: unknown): ChatLine[] {
if (getString(message, "role") === "bashExecution") return [normalizeBashExecution(message)];
const role = normalizeRole(getString(message, "role"));
const parts = normalizeContent(getProperty(message, "content"), message);
if (role === "tool") return [{ role, parts }];
const source = normalizeSource(message, parts);
if (role === "tool") return [{ role, parts, ...(source === undefined ? {} : { source }) }];
const visible = parts.filter((part) => part.type !== "empty");
return visible.length > 0 ? [{ role, parts: visible }] : [];
return visible.length > 0 ? [{ role, parts: visible, ...(source === undefined ? {} : { source }) }] : [];
}
function normalizeSource(message: unknown, _parts: ChatPart[]): ChatLine["source"] | undefined {
const source = getString(message, "source");
if (source === "compaction" || source === "branch_summary") return source;
return undefined;
}
function normalizeBashExecution(message: unknown): ChatLine {
+1
View File
@@ -10,6 +10,7 @@ export type ChatPart =
export interface ChatLine {
role: "user" | "assistant" | "tool" | "system" | "bash";
parts: ChatPart[];
source?: "compaction" | "branch_summary";
}
export interface CompletionItem {