diff --git a/apps/desktop/src/app/session/hooks/use-session-actions/utils.test.ts b/apps/desktop/src/app/session/hooks/use-session-actions/utils.test.ts index ea40e7705ad5..0b48516783b2 100644 --- a/apps/desktop/src/app/session/hooks/use-session-actions/utils.test.ts +++ b/apps/desktop/src/app/session/hooks/use-session-actions/utils.test.ts @@ -432,6 +432,13 @@ describe('preserveLocalPendingTurnMessages', () => { expect(preserveLocalPendingTurnMessages(next, previous)).toBe(next) }) + it('does not resurrect a completed stream bubble after persisted history catches up', () => { + const next = [msg('1-user-stored', 'user', 'question'), msg('2-assistant-stored', 'assistant', 'answer')] + const completedLocalStream = msg('assistant-stream-runtime-1', 'assistant', 'answer', { pending: false }) + + expect(preserveLocalPendingTurnMessages(next, [...next, completedLocalStream])).toBe(next) + }) + it('drops stale optimistic history after compression and keeps only the live tail', () => { const compressedAuthority = [ msg('stored-user', 'user', 'first turn that survived compression'), diff --git a/apps/desktop/src/app/session/hooks/use-session-actions/utils.ts b/apps/desktop/src/app/session/hooks/use-session-actions/utils.ts index 1f86fd7c4067..2606e1f5d437 100644 --- a/apps/desktop/src/app/session/hooks/use-session-actions/utils.ts +++ b/apps/desktop/src/app/session/hooks/use-session-actions/utils.ts @@ -389,8 +389,7 @@ export function preserveLocalPendingTurnMessages( const isOptimisticUser = message.role === 'user' && message.id.startsWith('user-') - const isPendingAssistant = - message.role === 'assistant' && (message.pending === true || message.id.startsWith('assistant-stream-')) + const isPendingAssistant = message.role === 'assistant' && message.pending === true if ((!isOptimisticUser && !isPendingAssistant) || nextIds.has(message.id)) { continue