@@ -182,6 +182,74 @@ describeIntegration("IpcMain queuedMessages integration tests", () => {
182182 20000
183183 ) ;
184184
185+ test . concurrent (
186+ "should send queued message immediately when sendQueuedImmediately is true" ,
187+ async ( ) => {
188+ const { env, workspaceId, cleanup } = await setupWorkspace ( "anthropic" ) ;
189+ try {
190+ // Start a stream
191+ void sendMessageWithModel (
192+ env . mockIpcRenderer ,
193+ workspaceId ,
194+ "Count to 10 slowly" ,
195+ modelString ( "anthropic" , "claude-haiku-4-5" )
196+ ) ;
197+
198+ const collector = createEventCollector ( env . sentEvents , workspaceId ) ;
199+ await collector . waitForEvent ( "stream-start" , 5000 ) ;
200+
201+ // Queue a message
202+ await sendMessageWithModel (
203+ env . mockIpcRenderer ,
204+ workspaceId ,
205+ "This message should be sent immediately" ,
206+ modelString ( "anthropic" , "claude-haiku-4-5" )
207+ ) ;
208+
209+ // Verify message was queued
210+ const queued = await getQueuedMessages ( collector ) ;
211+ expect ( queued ) . toEqual ( [ "This message should be sent immediately" ] ) ;
212+
213+ // Interrupt the stream with sendQueuedImmediately flag
214+ const interruptResult = await env . mockIpcRenderer . invoke (
215+ IPC_CHANNELS . WORKSPACE_INTERRUPT_STREAM ,
216+ workspaceId ,
217+ { sendQueuedImmediately : true }
218+ ) ;
219+ expect ( interruptResult . success ) . toBe ( true ) ;
220+
221+ // Wait for stream abort
222+ await collector . waitForEvent ( "stream-abort" , 5000 ) ;
223+
224+ // Should NOT get restore-to-input event (message is sent, not restored)
225+ // Instead, we should see the queued message being sent as a new user message
226+ const autoSendHappened = await waitFor ( ( ) => {
227+ collector . collect ( ) ;
228+ const userMessages = collector
229+ . getEvents ( )
230+ . filter ( ( e ) => "role" in e && e . role === "user" ) ;
231+ return userMessages . length === 2 ; // First + immediately sent
232+ } , 5000 ) ;
233+ expect ( autoSendHappened ) . toBe ( true ) ;
234+
235+ // Verify queue was cleared
236+ const queuedAfter = await getQueuedMessages ( collector ) ;
237+ expect ( queuedAfter ) . toEqual ( [ ] ) ;
238+
239+ // Clear events to track second stream separately
240+ env . sentEvents . length = 0 ;
241+
242+ // Wait for the immediately-sent message's stream
243+ const collector2 = createEventCollector ( env . sentEvents , workspaceId ) ;
244+ await collector2 . waitForEvent ( "stream-start" , 5000 ) ;
245+ await collector2 . waitForEvent ( "stream-end" , 15000 ) ;
246+ } finally {
247+ await cleanup ( ) ;
248+ }
249+ } ,
250+ 30000
251+ ) ;
252+
185253 test . concurrent (
186254 "should combine multiple queued messages with newline separator" ,
187255 async ( ) => {
0 commit comments