From b1735d400406e84bc434899578bc0783214c61f3 Mon Sep 17 00:00:00 2001 From: ewjin Date: Fri, 27 Mar 2026 11:04:42 +0900 Subject: [PATCH] fix: detect empty text parts in messages with tool calls during session recovery --- .../empty-content-recovery.ts | 7 +++++-- .../message-builder.ts | 9 ++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/hooks/anthropic-context-window-limit-recovery/empty-content-recovery.ts b/src/hooks/anthropic-context-window-limit-recovery/empty-content-recovery.ts index f6f407e84..7232c28f5 100644 --- a/src/hooks/anthropic-context-window-limit-recovery/empty-content-recovery.ts +++ b/src/hooks/anthropic-context-window-limit-recovery/empty-content-recovery.ts @@ -1,6 +1,7 @@ import { findEmptyMessages, findEmptyMessageByIndex, + findMessagesWithEmptyTextParts, injectTextPart, replaceEmptyTextParts, } from "../session-recovery/storage" @@ -79,7 +80,9 @@ export async function fixEmptyMessages(params: { if (!fixed) { const emptyMessageIds = findEmptyMessages(params.sessionID) - if (emptyMessageIds.length === 0) { + const emptyTextPartIds = findMessagesWithEmptyTextParts(params.sessionID) + const allIds = [...new Set([...emptyMessageIds, ...emptyTextPartIds])] + if (allIds.length === 0) { await params.client.tui .showToast({ body: { @@ -93,7 +96,7 @@ export async function fixEmptyMessages(params: { return false } - for (const messageID of emptyMessageIds) { + for (const messageID of allIds) { const replaced = replaceEmptyTextParts(messageID, PLACEHOLDER_TEXT) if (replaced) { fixed = true diff --git a/src/hooks/anthropic-context-window-limit-recovery/message-builder.ts b/src/hooks/anthropic-context-window-limit-recovery/message-builder.ts index ea6a6a7f2..4eff6e513 100644 --- a/src/hooks/anthropic-context-window-limit-recovery/message-builder.ts +++ b/src/hooks/anthropic-context-window-limit-recovery/message-builder.ts @@ -4,6 +4,7 @@ import { normalizeSDKResponse } from "../../shared" import { isSqliteBackend } from "../../shared/opencode-storage-detection" import { findEmptyMessages, + findMessagesWithEmptyTextParts, injectTextPart, replaceEmptyTextParts, } from "../session-recovery/storage" @@ -114,12 +115,14 @@ export async function sanitizeEmptyMessagesBeforeSummarize( } const emptyMessageIds = findEmptyMessages(sessionID) - if (emptyMessageIds.length === 0) { + const emptyTextPartIds = findMessagesWithEmptyTextParts(sessionID) + const allIds = [...new Set([...emptyMessageIds, ...emptyTextPartIds])] + if (allIds.length === 0) { return 0 } let fixedCount = 0 - for (const messageID of emptyMessageIds) { + for (const messageID of allIds) { const replaced = replaceEmptyTextParts(messageID, PLACEHOLDER_TEXT) if (replaced) { fixedCount++ @@ -135,7 +138,7 @@ export async function sanitizeEmptyMessagesBeforeSummarize( log("[auto-compact] pre-summarize sanitization fixed empty messages", { sessionID, fixedCount, - totalEmpty: emptyMessageIds.length, + totalEmpty: allIds.length, }) }