diff --git a/src/renderer/src/components/native-chat/native-chat-live-status.ts b/src/renderer/src/components/native-chat/native-chat-live-status.ts index 06efe472d..77890d592 100644 --- a/src/renderer/src/components/native-chat/native-chat-live-status.ts +++ b/src/renderer/src/components/native-chat/native-chat-live-status.ts @@ -36,7 +36,7 @@ export type NativeChatLiveMergeInput = { * provider lifecycle records reconcile a dropped final hook. * * Precedence: - * - errors win outright; live work wins over transcript loading. + * - errors win outright; known sessions stay loading until transcript content resolves. * - hook 'working' stays authoritative until the hook exits that state OR an * explicit terminal marker for this turn lands. * - design is hook-first: lifecycle is a terminal suppressor for dropped @@ -65,7 +65,7 @@ export function mergeNativeChatLiveSession(input: NativeChatLiveMergeInput): Nat transcriptLifecycle, hookHasWorkingSubagents ?? false ) - if (loading && status !== 'working') { + if (loading && (sessionId !== null || status !== 'working')) { return assembleNativeChatSession({ sources, sessionId, agent, status: 'loading' }) } return assembleNativeChatSession({ diff --git a/src/renderer/src/components/native-chat/use-native-chat-live-session.test.ts b/src/renderer/src/components/native-chat/use-native-chat-live-session.test.ts index 821abbe81..24af7a9e4 100644 --- a/src/renderer/src/components/native-chat/use-native-chat-live-session.test.ts +++ b/src/renderer/src/components/native-chat/use-native-chat-live-session.test.ts @@ -256,6 +256,15 @@ describe('mergeNativeChatLiveSession', () => { loading: true }).status ).toBe('working') + expect( + mergeNativeChatLiveSession({ + sources: { transcript: [] }, + sessionId: 'sess', + agent: 'claude', + hookState: 'working', + loading: true + }).status + ).toBe('loading') const errored = mergeNativeChatLiveSession({ sources: { transcript: [] },