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);