From e21c784cc5ca9777551aabe46e28fa2f5b24b21f Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 16 Feb 2026 15:23:43 +0900 Subject: [PATCH] fix: re-read fresh messages before empty scan & dedup isRecord import - Re-read messages from SDK after injectTextPartAsync to prevent stale snapshot from causing duplicate placeholder injection (P2) - Replace local isRecord with shared import from record-type-guard (P3) --- .../session-recovery/recover-empty-content-message-sdk.ts | 3 ++- src/hooks/session-recovery/storage/messages-reader.ts | 5 +---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/hooks/session-recovery/recover-empty-content-message-sdk.ts b/src/hooks/session-recovery/recover-empty-content-message-sdk.ts index e8be862a3..10b96bb7d 100644 --- a/src/hooks/session-recovery/recover-empty-content-message-sdk.ts +++ b/src/hooks/session-recovery/recover-empty-content-message-sdk.ts @@ -91,7 +91,8 @@ export async function recoverEmptyContentMessageFromSDK( } } - const emptyMessageIDs = findEmptyMessagesFromSDK(messages) + const freshMessages = await readMessagesFromSDK(client, sessionID) + const emptyMessageIDs = findEmptyMessagesFromSDK(freshMessages) for (const messageID of emptyMessageIDs) { if ( await dependencies.replaceEmptyTextPartsAsync( diff --git a/src/hooks/session-recovery/storage/messages-reader.ts b/src/hooks/session-recovery/storage/messages-reader.ts index 0334a19eb..9a3301dab 100644 --- a/src/hooks/session-recovery/storage/messages-reader.ts +++ b/src/hooks/session-recovery/storage/messages-reader.ts @@ -4,13 +4,10 @@ import type { PluginInput } from "@opencode-ai/plugin" import type { StoredMessageMeta } from "../types" import { getMessageDir } from "./message-dir" import { isSqliteBackend } from "../../../shared" +import { isRecord } from "../../../shared/record-type-guard" type OpencodeClient = PluginInput["client"] -function isRecord(value: unknown): value is Record { - return typeof value === "object" && value !== null -} - function normalizeSDKMessage( sessionID: string, value: unknown