From 6768decddb7b1207eb75310103a37e0d766ebcc6 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sun, 17 May 2026 17:16:10 +0900 Subject: [PATCH] fix(session-recovery): fallback when stored unavailable-tool parts are absent Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- .../recover-unavailable-tool.test.ts | 9 ++++++++- .../session-recovery/recover-unavailable-tool.ts | 12 +++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/hooks/session-recovery/recover-unavailable-tool.test.ts b/src/hooks/session-recovery/recover-unavailable-tool.test.ts index 4076283f5..bed98498e 100644 --- a/src/hooks/session-recovery/recover-unavailable-tool.test.ts +++ b/src/hooks/session-recovery/recover-unavailable-tool.test.ts @@ -13,6 +13,10 @@ mock.module("./storage", () => ({ readParts: () => storedParts, })) +mock.module("./storage/parts-reader", () => ({ + readParts: () => storedParts, +})) + const { recoverUnavailableTool } = await import("./recover-unavailable-tool") const failedAssistantMsg: MessageData = { @@ -82,7 +86,10 @@ describe("recoverUnavailableTool", () => { tool: "bash", state: { input: {} }, }] - const { client, promptAsync } = createMockClient() + const { client, promptAsync } = createMockClient([{ + info: { id: "msg_failed", role: "assistant" }, + parts: [{ type: "tool", id: "prt_stored_valid_call", callID: "toolu_recovered", name: "bash", input: {} }], + }]) //#when const result = await recoverUnavailableTool(client, "ses_2", failedAssistantMsg) diff --git a/src/hooks/session-recovery/recover-unavailable-tool.ts b/src/hooks/session-recovery/recover-unavailable-tool.ts index 4d703eeeb..dd8631f48 100644 --- a/src/hooks/session-recovery/recover-unavailable-tool.ts +++ b/src/hooks/session-recovery/recover-unavailable-tool.ts @@ -83,11 +83,13 @@ export async function recoverUnavailableTool( parts = await readPartsFromSDKFallback(client, sessionID, failedAssistantMsg.info.id) } else { const storedParts = readParts(failedAssistantMsg.info.id) - parts = storedParts.map((part) => ({ - type: part.type === "tool" ? "tool_use" : part.type, - id: "callID" in part ? (part as { callID?: string }).callID : part.id, - name: "tool" in part && typeof part.tool === "string" ? part.tool : undefined, - })) + parts = storedParts.length > 0 + ? storedParts.map((part) => ({ + type: part.type === "tool" ? "tool_use" : part.type, + id: "callID" in part ? (part as { callID?: string }).callID : part.id, + name: "tool" in part && typeof part.tool === "string" ? part.tool : undefined, + })) + : await readPartsFromSDKFallback(client, sessionID, failedAssistantMsg.info.id) } }