fix(session-recovery): fallback to filesystem when API parts empty

When OpenCode API doesn't return parts in message response,
read directly from filesystem using readParts(messageID).

This fixes session recovery failures where tool_use IDs couldn't
be extracted because API response had empty parts array.

🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
This commit is contained in:
YeonGyu-Kim
2025-12-15 19:02:31 +09:00
parent 2920d5fe65
commit 9aab980dc7

View File

@@ -9,6 +9,7 @@ import {
findMessagesWithThinkingOnly,
injectTextPart,
prependThinkingPart,
readParts,
stripThinkingParts,
} from "./storage"
import type { MessageData } from "./types"
@@ -100,7 +101,17 @@ async function recoverToolResultMissing(
sessionID: string,
failedAssistantMsg: MessageData
): Promise<boolean> {
const parts = failedAssistantMsg.parts || []
// Try API parts first, fallback to filesystem if empty
let parts = failedAssistantMsg.parts || []
if (parts.length === 0 && failedAssistantMsg.info?.id) {
const storedParts = readParts(failedAssistantMsg.info.id)
parts = storedParts.map((p) => ({
type: p.type === "tool" ? "tool_use" : p.type,
id: "callID" in p ? (p as { callID?: string }).callID : p.id,
name: "tool" in p ? (p as { tool?: string }).tool : undefined,
input: "state" in p ? (p as { state?: { input?: Record<string, unknown> } }).state?.input : undefined,
}))
}
const toolUseIds = extractToolUseIds(parts)
if (toolUseIds.length === 0) {