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 { 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) => { const counts = messages.reduce<Record<string, number>>((acc, message) => {
acc[message.role] = (acc[message.role] ?? 0) + 1; acc[message.role] = (acc[message.role] ?? 0) + 1;
return acc; return acc;
@@ -44,5 +46,6 @@ export function summarizeChatGroup(messages: ChatLine[]): string {
} }
function isReadablePart(message: ChatLine, part: ChatPart): boolean { 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"); 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)]; if (getString(message, "role") === "bashExecution") return [normalizeBashExecution(message)];
const role = normalizeRole(getString(message, "role")); const role = normalizeRole(getString(message, "role"));
const parts = normalizeContent(getProperty(message, "content"), message); 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"); 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 { function normalizeBashExecution(message: unknown): ChatLine {
+1
View File
@@ -10,6 +10,7 @@ export type ChatPart =
export interface ChatLine { export interface ChatLine {
role: "user" | "assistant" | "tool" | "system" | "bash"; role: "user" | "assistant" | "tool" | "system" | "bash";
parts: ChatPart[]; parts: ChatPart[];
source?: "compaction" | "branch_summary";
} }
export interface CompletionItem { export interface CompletionItem {
+2 -2
View File
@@ -308,8 +308,8 @@ function historyMessages(session: AgentSession): unknown[] {
for (const entry of session.sessionManager.getBranch()) { for (const entry of session.sessionManager.getBranch()) {
if (entry.type === "message") messages.push(entry.message); if (entry.type === "message") messages.push(entry.message);
else if (entry.type === "custom_message" && entry.display) messages.push({ role: "custom", content: entry.content, customType: entry.customType, details: entry.details }); else if (entry.type === "custom_message" && entry.display) messages.push({ role: "custom", content: entry.content, customType: entry.customType, details: entry.details });
else if (entry.type === "compaction") messages.push({ role: "system", content: `Compacted history:\n\n${entry.summary}` }); else if (entry.type === "compaction") messages.push({ role: "system", source: "compaction", content: `Compacted history:\n\n${entry.summary}` });
else if (entry.type === "branch_summary") messages.push({ role: "system", content: `Branch summary:\n\n${entry.summary}` }); else if (entry.type === "branch_summary") messages.push({ role: "system", source: "branch_summary", content: `Branch summary:\n\n${entry.summary}` });
} }
return messages; return messages;
} }