From f5cc69c9d1a2f7902b678a2a6f1cb0d273bb6312 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Sat, 21 Feb 2026 14:30:27 -0800 Subject: [PATCH] fix(sleeptime): trigger compaction reflection for legacy summary format (#1090) --- src/cli/helpers/accumulator.ts | 16 +++++++++++----- src/tests/cli/accumulator-usage.test.ts | 24 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/cli/helpers/accumulator.ts b/src/cli/helpers/accumulator.ts index 93f056b..a5ae960 100644 --- a/src/cli/helpers/accumulator.ts +++ b/src/cli/helpers/accumulator.ts @@ -451,6 +451,13 @@ function extractTextPart(v: unknown): string { return ""; } +function markCompactionCompleted(ctx?: ContextTracker): void { + if (!ctx) return; + ctx.pendingCompaction = true; + ctx.pendingSkillsReinject = true; + ctx.pendingReflectionTrigger = true; +} + function resolveLineIdForKind( b: Buffers, canonicalId: string, @@ -787,6 +794,9 @@ export function onChunk( phase: "finished", summary: compactionSummary, })); + // Legacy servers may emit compaction completion as a user_message + // system alert instead of summary_message. + markCompactionCompleted(ctx); } // If not a summary, ignore it (user messages aren't rendered during streaming) break; @@ -1131,11 +1141,7 @@ export function onChunk( // Set here (not in event_message) because summary_message arrives after // compaction completes, guaranteeing the next usage_statistics has the // reduced token count. - if (ctx) { - ctx.pendingCompaction = true; - ctx.pendingSkillsReinject = true; - ctx.pendingReflectionTrigger = true; - } + markCompactionCompleted(ctx); break; } diff --git a/src/tests/cli/accumulator-usage.test.ts b/src/tests/cli/accumulator-usage.test.ts index 9a514ca..10c1753 100644 --- a/src/tests/cli/accumulator-usage.test.ts +++ b/src/tests/cli/accumulator-usage.test.ts @@ -106,6 +106,30 @@ describe("accumulator usage statistics", () => { expect(tracker.pendingReflectionTrigger).toBe(true); }); + test("sets reflection trigger for legacy compaction summary user_message", () => { + const buffers = createBuffers("agent-1"); + const tracker = createContextTracker(); + const legacySummary = JSON.stringify({ + type: "system_alert", + message: + "The following prior messages have been hidden due to the conversation context window being reached.\nThe following is a summary of the previous messages: compact summary", + }); + + onChunk( + buffers, + { + message_type: "user_message", + id: "legacy-compaction-1", + content: legacySummary, + } as unknown as LettaStreamingResponse, + tracker, + ); + + expect(tracker.pendingCompaction).toBe(true); + expect(tracker.pendingSkillsReinject).toBe(true); + expect(tracker.pendingReflectionTrigger).toBe(true); + }); + test("accumulates assistant messages when otid is missing but id is present", () => { const buffers = createBuffers();