diff --git a/src/client/src/chatGroups.ts b/src/client/src/chatGroups.ts index f9dd4bf..3dd268a 100644 --- a/src/client/src/chatGroups.ts +++ b/src/client/src/chatGroups.ts @@ -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>((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"); } diff --git a/src/client/src/chatMessages.ts b/src/client/src/chatMessages.ts index 06c0a0d..1158208 100644 --- a/src/client/src/chatMessages.ts +++ b/src/client/src/chatMessages.ts @@ -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 { diff --git a/src/client/src/components/shared.ts b/src/client/src/components/shared.ts index 37eb143..218324c 100644 --- a/src/client/src/components/shared.ts +++ b/src/client/src/components/shared.ts @@ -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 { diff --git a/src/server/sessions/piSessionService.ts b/src/server/sessions/piSessionService.ts index 5d988a6..4968013 100644 --- a/src/server/sessions/piSessionService.ts +++ b/src/server/sessions/piSessionService.ts @@ -308,8 +308,8 @@ function historyMessages(session: AgentSession): unknown[] { for (const entry of session.sessionManager.getBranch()) { 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 === "compaction") messages.push({ role: "system", 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 === "compaction") messages.push({ role: "system", source: "compaction", content: `Compacted history:\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; }