@@ -4161,6 +4161,51 @@ test('compaction stream shows context maintenance state while keeping the sessio
41614161 expect ( adapter . activeTurns . has ( session . id ) ) . toBe ( true ) ;
41624162} ) ;
41634163
4164+ test ( 'compaction retry wait clears context maintenance when no follow-up arrives' , async ( ) => {
4165+ vi . useFakeTimers ( ) ;
4166+ try {
4167+ const { session, store } = createReconcileStore ( [
4168+ { id : 'msg-1' , type : 'user' , content : 'continue the task' , timestamp : 1 , metadata : { } } ,
4169+ ] ) ;
4170+ const adapter = new OpenClawRuntimeAdapter ( store , { } ) ;
4171+ const sessionKey = `agent:main:lobsterai:${ session . id } ` ;
4172+ const maintenanceSpy = vi . fn ( ) ;
4173+ const completeSpy = vi . fn ( ) ;
4174+
4175+ session . status = 'running' ;
4176+ adapter . on ( 'contextMaintenance' , maintenanceSpy ) ;
4177+ adapter . on ( 'complete' , completeSpy ) ;
4178+ adapter . activeTurns . set ( session . id , createActiveTurn ( session . id , sessionKey , 'run-compaction-timeout' ) ) ;
4179+
4180+ adapter . handleAgentEvent ( {
4181+ runId : 'run-compaction-timeout' ,
4182+ sessionKey,
4183+ stream : 'compaction' ,
4184+ data : { phase : 'start' } ,
4185+ } , 1 ) ;
4186+
4187+ adapter . handleAgentEvent ( {
4188+ runId : 'run-compaction-timeout' ,
4189+ sessionKey,
4190+ stream : 'compaction' ,
4191+ data : { phase : 'end' , completed : true , willRetry : true } ,
4192+ } , 2 ) ;
4193+
4194+ expect ( maintenanceSpy ) . toHaveBeenLastCalledWith ( session . id , true ) ;
4195+ expect ( adapter . activeTurns . has ( session . id ) ) . toBe ( true ) ;
4196+
4197+ await vi . advanceTimersByTimeAsync ( 120_000 ) ;
4198+ await Promise . resolve ( ) ;
4199+
4200+ expect ( maintenanceSpy ) . toHaveBeenLastCalledWith ( session . id , false ) ;
4201+ expect ( completeSpy ) . toHaveBeenCalledWith ( session . id , 'run-compaction-timeout' ) ;
4202+ expect ( session . status ) . toBe ( 'completed' ) ;
4203+ expect ( adapter . activeTurns . has ( session . id ) ) . toBe ( false ) ;
4204+ } finally {
4205+ vi . useRealTimers ( ) ;
4206+ }
4207+ } ) ;
4208+
41644209test ( 'chat error clears context maintenance after compaction starts' , ( ) => {
41654210 const { session, store } = createReconcileStore ( [
41664211 { id : 'msg-1' , type : 'user' , content : 'continue the task' , timestamp : 1 , metadata : { } } ,
0 commit comments