From 26d96ca6556c61ab165e19aacd0eb5dfd6d2b2f8 Mon Sep 17 00:00:00 2001 From: Managed via Tart Date: Mon, 18 May 2026 21:50:20 +0000 Subject: [PATCH] fix: refresh file changes after session ends Co-authored-by: 3720 --- web/src/embedded/chat/hooks/use-swift-bridge.ts | 17 ++++++++++++++--- web/tests/embedded/use-swift-bridge.test.ts | 12 ++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/web/src/embedded/chat/hooks/use-swift-bridge.ts b/web/src/embedded/chat/hooks/use-swift-bridge.ts index 611fc25..ece4d9a 100644 --- a/web/src/embedded/chat/hooks/use-swift-bridge.ts +++ b/web/src/embedded/chat/hooks/use-swift-bridge.ts @@ -7,6 +7,13 @@ import type { import type { FollowUpState, QuoteFocusEvent } from '@/jsb'; import { replaceSchedules } from '../stores/schedule-store'; +const terminalAssistantPhases = new Set([ + 'cancelled', + 'completed', + 'failed', + 'idle', +]); + export function deriveIsStreamingFromBridgeState( bridgeIsStreaming: boolean, assistantStateSequence: AssistantState[] @@ -17,9 +24,13 @@ export function deriveIsStreamingFromBridgeState( const currentAssistantState = assistantStateSequence[assistantStateSequence.length - 1] ?? null; - return currentAssistantState?.phase !== undefined - ? currentAssistantState.phase !== 'idle' - : false; + if (currentAssistantState?.phase === undefined) { + return false; + } + + return !terminalAssistantPhases.has( + currentAssistantState.phase.trim().toLowerCase() + ); } export const useChatSwiftBridge = () => { diff --git a/web/tests/embedded/use-swift-bridge.test.ts b/web/tests/embedded/use-swift-bridge.test.ts index 3724058..c913734 100644 --- a/web/tests/embedded/use-swift-bridge.test.ts +++ b/web/tests/embedded/use-swift-bridge.test.ts @@ -55,6 +55,18 @@ describe('use-swift-bridge', () => { ).toBe(false); }); + it('returns false for terminal local assistant phases', () => { + for (const phase of ['completed', 'failed', 'cancelled']) { + expect( + deriveIsStreamingFromBridgeState(false, [ + makeState({ + phase, + }), + ]) + ).toBe(false); + } + }); + it('preserves an explicit bridge streaming signal', () => { expect(deriveIsStreamingFromBridgeState(true, [])).toBe(true); });