From 002c7a70ad1ca200cfbe7621fd47834282c3efe8 Mon Sep 17 00:00:00 2001 From: Leonid <127580858+bashrusakh@users.noreply.github.com> Date: Sun, 12 Jul 2026 00:14:44 +1100 Subject: [PATCH] fix(ui): dispatch queued messages when session is already idle (#1978) Co-authored-by: bashrusakh --- .../ui/src/hooks/useQueuedMessageAutoSend.test.ts | 12 ++++++++---- packages/ui/src/hooks/useQueuedMessageAutoSend.ts | 4 +++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/ui/src/hooks/useQueuedMessageAutoSend.test.ts b/packages/ui/src/hooks/useQueuedMessageAutoSend.test.ts index 1a08bc01..07344834 100644 --- a/packages/ui/src/hooks/useQueuedMessageAutoSend.test.ts +++ b/packages/ui/src/hooks/useQueuedMessageAutoSend.test.ts @@ -35,13 +35,17 @@ import { describe('shouldDispatchQueuedAutoSend', () => { test('dispatches only after an active session becomes idle', () => { - expect(shouldDispatchQueuedAutoSend('busy', 'idle')).toBe(true); - expect(shouldDispatchQueuedAutoSend('retry', 'idle')).toBe(true); + expect(shouldDispatchQueuedAutoSend('busy', 'idle', false)).toBe(true); + expect(shouldDispatchQueuedAutoSend('retry', 'idle', false)).toBe(true); }); test('does not dispatch when idle is only first seen or status is missing', () => { - expect(shouldDispatchQueuedAutoSend(undefined, 'idle')).toBe(false); - expect(shouldDispatchQueuedAutoSend('idle', 'idle')).toBe(false); + expect(shouldDispatchQueuedAutoSend(undefined, 'idle', false)).toBe(false); + expect(shouldDispatchQueuedAutoSend('idle', 'idle', false)).toBe(false); + }); + + test('dispatches when idle→idle and queue has items', () => { + expect(shouldDispatchQueuedAutoSend('idle', 'idle', true)).toBe(true); }); }); diff --git a/packages/ui/src/hooks/useQueuedMessageAutoSend.ts b/packages/ui/src/hooks/useQueuedMessageAutoSend.ts index f5012dc6..ee0c3646 100644 --- a/packages/ui/src/hooks/useQueuedMessageAutoSend.ts +++ b/packages/ui/src/hooks/useQueuedMessageAutoSend.ts @@ -110,7 +110,9 @@ const resolveSessionSendConfig = (sessionId: string) => { export const shouldDispatchQueuedAutoSend = ( previousStatusType: SessionStatusType | undefined, currentStatusType: SessionStatusType, + hasQueuedItems: boolean = false, ): boolean => { + if (hasQueuedItems && currentStatusType === 'idle') return true; return (previousStatusType === 'busy' || previousStatusType === 'retry') && currentStatusType === 'idle'; }; @@ -202,7 +204,7 @@ export function useQueuedMessageAutoSend(enabledOrOptions?: boolean | { enabled? } if (queue.length > 0 && ( - shouldDispatchQueuedAutoSend(previousStatusType, currentStatusType) + shouldDispatchQueuedAutoSend(previousStatusType, currentStatusType, queue.length > 0) || (wasAutoReviewBlocked && !isAutoReviewRunning && currentStatusType === 'idle') )) { void dispatchSessionQueue(sessionId, queue);