From 7510cb10f14941d8c0f6b8e35f490c15d589a24e Mon Sep 17 00:00:00 2001 From: Henry Su Date: Sun, 23 Aug 2026 11:09:19 -0500 Subject: [PATCH] fix(assistant): handle nullish state and optional callbacks in assistantSessionState (#1791) --- src/helpers/assistantSessionState.js | 15 ++++---- test/helpers/assistantSessionState.test.js | 44 ++++++++++++++++++++++ 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/src/helpers/assistantSessionState.js b/src/helpers/assistantSessionState.js index 465eee5d9..062cceff8 100644 --- a/src/helpers/assistantSessionState.js +++ b/src/helpers/assistantSessionState.js @@ -5,7 +5,7 @@ */ export function closeAssistantSessionState(state) { return { - conversationId: state.conversationId ?? null, + conversationId: state?.conversationId ?? null, pendingCommand: null, thinking: false, busy: false, @@ -13,7 +13,8 @@ export function closeAssistantSessionState(state) { }; } -export function resolveAssistantPanelBusy({ agentState, activeToolName, submissionInFlight }) { +export function resolveAssistantPanelBusy(params) { + const { agentState, activeToolName, submissionInFlight } = params || {}; return Boolean( submissionInFlight || activeToolName || @@ -36,15 +37,15 @@ export async function restoreAssistantConversation({ isActive = () => true, }) { try { - await loadConversation(conversationId); + await loadConversation?.(conversationId); if (!isActive()) return "inactive"; - onReady(); + onReady?.(); return "restored"; } catch (error) { if (!isActive()) return "inactive"; - onError(error); - onReset(); - onReady(); + onError?.(error); + onReset?.(); + onReady?.(); return "reset"; } } diff --git a/test/helpers/assistantSessionState.test.js b/test/helpers/assistantSessionState.test.js index d7f5ec94b..c49708929 100644 --- a/test/helpers/assistantSessionState.test.js +++ b/test/helpers/assistantSessionState.test.js @@ -111,3 +111,47 @@ test("failed Assistant history resets before enabling a fresh conversation", asy ); assert.deepEqual(events, ["error", "reset", "ready"]); }); + +test("assistantSessionState helpers handle nullish inputs safely", async () => { + const { + closeAssistantSessionState, + resolveAssistantPanelBusy, + restoreAssistantConversation, + } = await import("../../src/helpers/assistantSessionState.js"); + + assert.deepEqual(closeAssistantSessionState(null), { + conversationId: null, + pendingCommand: null, + thinking: false, + busy: false, + responseReady: false, + }); + assert.deepEqual(closeAssistantSessionState(undefined), { + conversationId: null, + pendingCommand: null, + thinking: false, + busy: false, + responseReady: false, + }); + + assert.equal(resolveAssistantPanelBusy(null), false); + assert.equal(resolveAssistantPanelBusy(undefined), false); + + assert.equal( + await restoreAssistantConversation({ + conversationId: 42, + loadConversation: async () => {}, + }), + "restored" + ); + + assert.equal( + await restoreAssistantConversation({ + conversationId: 42, + loadConversation: async () => { + throw new Error("fail"); + }, + }), + "reset" + ); +});