@@ -350,6 +350,7 @@ describe("ClineProvider flicker-free cancel", () => {
350350 mockTask1 . rootTask = { taskId : "root-task" }
351351 mockTask1 . parentTask = { taskId : "parent-task" }
352352 ; ( provider as any ) . clineStack = [ mockTask1 ]
353+ ; ( provider as any ) . visibleTaskId = "task-1"
353354
354355 const createTaskWithHistoryItemSpy = vi
355356 . spyOn ( provider , "createTaskWithHistoryItem" )
@@ -371,7 +372,7 @@ describe("ClineProvider flicker-free cancel", () => {
371372 rootTask : mockTask1 . rootTask ,
372373 parentTask : mockTask1 . parentTask ,
373374 } ) ,
374- { replaceExistingTask : true } ,
375+ { replaceExistingTask : true , focus : true } ,
375376 )
376377 expect ( replacementTask . messageQueueService . restoreMessages ) . toHaveBeenCalledWith ( [
377378 {
@@ -384,4 +385,53 @@ describe("ClineProvider flicker-free cancel", () => {
384385 expect ( replacementTask . setDeferQueuedMessageDrainUntilResume ) . toHaveBeenCalledWith ( true )
385386 expect ( removeClineFromStackSpy ) . not . toHaveBeenCalled ( )
386387 } )
388+
389+ it ( "hard-stops the requested task without cancelling the visible task" , async ( ) => {
390+ const visibleTask = {
391+ taskId : "task-2" ,
392+ instanceId : "instance-2" ,
393+ emit : vi . fn ( ) ,
394+ abortTask : vi . fn ( ) . mockResolvedValue ( undefined ) ,
395+ cancelCurrentRequest : vi . fn ( ) ,
396+ cancelAutoApprovalTimeout : vi . fn ( ) ,
397+ supersedePendingAsk : vi . fn ( ) ,
398+ messageQueueService : { messages : [ ] } ,
399+ terminalProcess : { abort : vi . fn ( ) } ,
400+ rootTask : undefined ,
401+ parentTask : undefined ,
402+ abandoned : false ,
403+ abort : false ,
404+ on : vi . fn ( ) ,
405+ off : vi . fn ( ) ,
406+ }
407+ const replacementTask = {
408+ messageQueueService : {
409+ restoreMessages : vi . fn ( ) ,
410+ } ,
411+ setDeferQueuedMessageDrainUntilResume : vi . fn ( ) ,
412+ }
413+
414+ ; ( provider as any ) . clineStack = [ mockTask1 , visibleTask ]
415+ ; ( provider as any ) . visibleTaskId = "task-2"
416+
417+ const createTaskWithHistoryItemSpy = vi
418+ . spyOn ( provider , "createTaskWithHistoryItem" )
419+ . mockResolvedValue ( replacementTask as any )
420+
421+ await provider . cancelTask ( "task-1" )
422+
423+ expect ( mockTask1 . abortReason ) . toBe ( "user_cancelled" )
424+ expect ( mockTask1 . cancelCurrentRequest ) . toHaveBeenCalledTimes ( 1 )
425+ expect ( mockTask1 . cancelAutoApprovalTimeout ) . toHaveBeenCalledTimes ( 1 )
426+ expect ( mockTask1 . supersedePendingAsk ) . toHaveBeenCalledTimes ( 1 )
427+ expect ( mockTask1 . abortTask ) . toHaveBeenCalledWith ( true )
428+ expect ( visibleTask . cancelCurrentRequest ) . not . toHaveBeenCalled ( )
429+ expect ( visibleTask . cancelAutoApprovalTimeout ) . not . toHaveBeenCalled ( )
430+ expect ( visibleTask . supersedePendingAsk ) . not . toHaveBeenCalled ( )
431+ expect ( visibleTask . abortTask ) . not . toHaveBeenCalled ( )
432+ expect ( createTaskWithHistoryItemSpy ) . toHaveBeenCalledWith ( expect . objectContaining ( { id : "task-1" } ) , {
433+ replaceExistingTask : true ,
434+ focus : false ,
435+ } )
436+ } )
387437} )
0 commit comments