diff --git a/src/agents/pi-extensions/compaction-safeguard.test.ts b/src/agents/pi-extensions/compaction-safeguard.test.ts index 750eb2b4f38..1394f265f91 100644 --- a/src/agents/pi-extensions/compaction-safeguard.test.ts +++ b/src/agents/pi-extensions/compaction-safeguard.test.ts @@ -530,6 +530,22 @@ describe("compaction-safeguard recent-turn preservation", () => { expect(section).toContain("- Assistant: [non-text content: toolCall]"); }); + it("keeps non-text placeholders for mixed-content preserved messages", () => { + const section = formatPreservedTurnsSection([ + { + role: "user", + content: [ + { type: "text", text: "caption text" }, + { type: "image", data: "abc", mimeType: "image/png" }, + ], + timestamp: 1, + } as unknown as AgentMessage, + ]); + + expect(section).toContain("- User: caption text"); + expect(section).toContain("[non-text content: image]"); + }); + it("clamps preserve count into a safe range", () => { expect(resolveRecentTurnsPreserve(undefined)).toBe(3); expect(resolveRecentTurnsPreserve(-1)).toBe(0); diff --git a/src/agents/pi-extensions/compaction-safeguard.ts b/src/agents/pi-extensions/compaction-safeguard.ts index df3889f5704..17714beed55 100644 --- a/src/agents/pi-extensions/compaction-safeguard.ts +++ b/src/agents/pi-extensions/compaction-safeguard.ts @@ -201,6 +201,9 @@ function formatNonTextPlaceholder(content: unknown): string | null { if (content === null || content === undefined) { return null; } + if (typeof content === "string") { + return null; + } if (!Array.isArray(content)) { return "[non-text content]"; } @@ -355,7 +358,8 @@ function formatPreservedTurnsSection(messages: AgentMessage[]): string { const nonTextPlaceholder = formatNonTextPlaceholder( (message as { content?: unknown }).content, ); - const rendered = text || nonTextPlaceholder; + const rendered = + text && nonTextPlaceholder ? `${text}\n${nonTextPlaceholder}` : text || nonTextPlaceholder; if (!rendered) { return null; }