Merge pull request #2866 from LTS2/fix/2830-empty-message-recovery-with-tool-calls

Fix empty message recovery when tool calls coexist with empty text parts
This commit is contained in:
YeonGyu-Kim
2026-03-27 12:30:23 +09:00
committed by GitHub
2 changed files with 11 additions and 5 deletions
@@ -1,6 +1,7 @@
import { import {
findEmptyMessages, findEmptyMessages,
findEmptyMessageByIndex, findEmptyMessageByIndex,
findMessagesWithEmptyTextParts,
injectTextPart, injectTextPart,
replaceEmptyTextParts, replaceEmptyTextParts,
} from "../session-recovery/storage" } from "../session-recovery/storage"
@@ -79,7 +80,9 @@ export async function fixEmptyMessages(params: {
if (!fixed) { if (!fixed) {
const emptyMessageIds = findEmptyMessages(params.sessionID) 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 await params.client.tui
.showToast({ .showToast({
body: { body: {
@@ -93,7 +96,7 @@ export async function fixEmptyMessages(params: {
return false return false
} }
for (const messageID of emptyMessageIds) { for (const messageID of allIds) {
const replaced = replaceEmptyTextParts(messageID, PLACEHOLDER_TEXT) const replaced = replaceEmptyTextParts(messageID, PLACEHOLDER_TEXT)
if (replaced) { if (replaced) {
fixed = true fixed = true
@@ -4,6 +4,7 @@ import { normalizeSDKResponse } from "../../shared"
import { isSqliteBackend } from "../../shared/opencode-storage-detection" import { isSqliteBackend } from "../../shared/opencode-storage-detection"
import { import {
findEmptyMessages, findEmptyMessages,
findMessagesWithEmptyTextParts,
injectTextPart, injectTextPart,
replaceEmptyTextParts, replaceEmptyTextParts,
} from "../session-recovery/storage" } from "../session-recovery/storage"
@@ -114,12 +115,14 @@ export async function sanitizeEmptyMessagesBeforeSummarize(
} }
const emptyMessageIds = findEmptyMessages(sessionID) const emptyMessageIds = findEmptyMessages(sessionID)
if (emptyMessageIds.length === 0) { const emptyTextPartIds = findMessagesWithEmptyTextParts(sessionID)
const allIds = [...new Set([...emptyMessageIds, ...emptyTextPartIds])]
if (allIds.length === 0) {
return 0 return 0
} }
let fixedCount = 0 let fixedCount = 0
for (const messageID of emptyMessageIds) { for (const messageID of allIds) {
const replaced = replaceEmptyTextParts(messageID, PLACEHOLDER_TEXT) const replaced = replaceEmptyTextParts(messageID, PLACEHOLDER_TEXT)
if (replaced) { if (replaced) {
fixedCount++ fixedCount++
@@ -135,7 +138,7 @@ export async function sanitizeEmptyMessagesBeforeSummarize(
log("[auto-compact] pre-summarize sanitization fixed empty messages", { log("[auto-compact] pre-summarize sanitization fixed empty messages", {
sessionID, sessionID,
fixedCount, fixedCount,
totalEmpty: emptyMessageIds.length, totalEmpty: allIds.length,
}) })
} }