import type { CanonicalContentBlock, CanonicalMessage, CanonicalToolResultBlock } from "../../model/index.js";
* Strip image and PDF/document blocks from messages before sending to the
* compaction summarizer. This prevents the compaction API call itself from
* hitting prompt-too-long limits due to accumulated base64 data.
*
* Replaces:
* - Top-level `image` blocks → `[image]`
* - Top-level `pdf` blocks → `[document]`
* - `image`/`pdf` blocks nested inside `tool_result.content` → same markers
*
* Only user messages are processed (assistant messages don't contain media).
*/
export function stripMultimediaFromMessages(messages: CanonicalMessage[]): CanonicalMessage[] {
return messages.map((message) => {
if (message.role !== "user") return message;
let hasMedia = false;
const newContent: CanonicalContentBlock[] = message.content.map((block) => {
if (block.type === "image") {
hasMedia = true;
return { type: "text" as const, text: "[image]" };
}
if (block.type === "pdf") {
hasMedia = true;
return { type: "text" as const, text: "[document]" };
}
if (block.type === "tool_result") {
let toolHasMedia = false;
const newToolContent = (block as CanonicalToolResultBlock).content.map((item) => {
if (item.type === "image") {
toolHasMedia = true;
return { type: "text" as const, text: "[image]" };
}
if (item.type === "pdf") {
toolHasMedia = true;
return { type: "text" as const, text: "[document]" };
}
return item;
});
if (toolHasMedia) {
hasMedia = true;
return { ...block, content: newToolContent } as CanonicalContentBlock;
}
}
return block;
});
return hasMedia ? { ...message, content: newContent } : message;
});
}