fix(recovery): detect empty text parts alongside tool calls in fixEmptyMessages (fixes #2830)

This commit is contained in:
MoerAI
2026-03-27 10:18:20 +09:00
parent 1c9f4148d0
commit 404390efda

View File

@@ -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 }
}