From 404390efda7ce2d5f6012d8537270ecb7f24e002 Mon Sep 17 00:00:00 2001 From: MoerAI Date: Fri, 27 Mar 2026 10:18:20 +0900 Subject: [PATCH] fix(recovery): detect empty text parts alongside tool calls in fixEmptyMessages (fixes #2830) --- .../empty-content-recovery-sdk.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/hooks/anthropic-context-window-limit-recovery/empty-content-recovery-sdk.ts b/src/hooks/anthropic-context-window-limit-recovery/empty-content-recovery-sdk.ts index 28154ad87..245133d8a 100644 --- a/src/hooks/anthropic-context-window-limit-recovery/empty-content-recovery-sdk.ts +++ b/src/hooks/anthropic-context-window-limit-recovery/empty-content-recovery-sdk.ts @@ -1,4 +1,4 @@ -import { replaceEmptyTextPartsAsync } from "../session-recovery/storage/empty-text" +import { replaceEmptyTextPartsAsync, findMessagesWithEmptyTextPartsFromSDK } from "../session-recovery/storage/empty-text" import { injectTextPartAsync } from "../session-recovery/storage/text-part-injector" import type { Client } from "./client" @@ -157,11 +157,19 @@ export async function fixEmptyMessagesWithSDK(params: { } const emptyMessageIds = await findEmptyMessagesFromSDK(params.client, params.sessionID) - if (emptyMessageIds.length === 0) { + + // Also find messages with empty text parts alongside non-empty content (e.g., tool calls). + // messageHasContentFromSDK returns true for these since they have tool parts, + // but the API still rejects the empty text block. + const emptyTextPartIds = await findMessagesWithEmptyTextPartsFromSDK(params.client, params.sessionID) + const additionalIds = emptyTextPartIds.filter((id) => !emptyMessageIds.includes(id)) + const allTargetIds = [...emptyMessageIds, ...additionalIds] + + if (allTargetIds.length === 0) { return { fixed: false, fixedMessageIds: [], scannedEmptyCount: 0 } } - for (const messageID of emptyMessageIds) { + for (const messageID of allTargetIds) { const replaced = await replaceEmptyTextPartsAsync( params.client, params.sessionID, @@ -187,5 +195,5 @@ export async function fixEmptyMessagesWithSDK(params: { } } - return { fixed, fixedMessageIds, scannedEmptyCount: emptyMessageIds.length } + return { fixed, fixedMessageIds, scannedEmptyCount: allTargetIds.length } }