fix(recovery): detect empty text parts alongside tool calls in fixEmptyMessages (fixes #2830)
This commit is contained in:
@@ -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 }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user