@@ -691,4 +691,60 @@ describe("gateway server sessions", () => {
691691
692692 ws . close ( ) ;
693693 } ) ;
694+
695+ test ( "sessions.delete returns unavailable when active run does not stop" , async ( ) => {
696+ const dir = await fs . mkdtemp ( path . join ( os . tmpdir ( ) , "openclaw-sessions-" ) ) ;
697+ const storePath = path . join ( dir , "sessions.json" ) ;
698+ testState . sessionStorePath = storePath ;
699+
700+ await fs . writeFile (
701+ path . join ( dir , "sess-active.jsonl" ) ,
702+ `${ JSON . stringify ( { role : "user" , content : "active" } ) } \n` ,
703+ "utf-8" ,
704+ ) ;
705+
706+ await writeSessionStore ( {
707+ entries : {
708+ "discord:group:dev" : {
709+ sessionId : "sess-active" ,
710+ updatedAt : Date . now ( ) ,
711+ } ,
712+ } ,
713+ } ) ;
714+
715+ embeddedRunMock . activeIds . add ( "sess-active" ) ;
716+ embeddedRunMock . waitResults . set ( "sess-active" , false ) ;
717+
718+ const { ws } = await openClient ( ) ;
719+
720+ const deleted = await rpcReq ( ws , "sessions.delete" , {
721+ key : "discord:group:dev" ,
722+ } ) ;
723+ expect ( deleted . ok ) . toBe ( false ) ;
724+ expect ( deleted . error ?. code ) . toBe ( "UNAVAILABLE" ) ;
725+ expect ( deleted . error ?. message ?? "" ) . toMatch ( / s t i l l a c t i v e / i) ;
726+ expect ( sessionCleanupMocks . stopSubagentsForRequester ) . toHaveBeenCalledWith ( {
727+ cfg : expect . any ( Object ) ,
728+ requesterSessionKey : "agent:main:discord:group:dev" ,
729+ } ) ;
730+ expect ( sessionCleanupMocks . clearSessionQueues ) . toHaveBeenCalledTimes ( 1 ) ;
731+ const clearedKeys = sessionCleanupMocks . clearSessionQueues . mock . calls [ 0 ] ?. [ 0 ] as string [ ] ;
732+ expect ( clearedKeys ) . toEqual (
733+ expect . arrayContaining ( [ "discord:group:dev" , "agent:main:discord:group:dev" , "sess-active" ] ) ,
734+ ) ;
735+ expect ( embeddedRunMock . abortCalls ) . toEqual ( [ "sess-active" ] ) ;
736+ expect ( embeddedRunMock . waitCalls ) . toEqual ( [ "sess-active" ] ) ;
737+
738+ const store = JSON . parse ( await fs . readFile ( storePath , "utf-8" ) ) as Record <
739+ string ,
740+ { sessionId ?: string }
741+ > ;
742+ expect ( store [ "agent:main:discord:group:dev" ] ?. sessionId ) . toBe ( "sess-active" ) ;
743+ const filesAfterDeleteAttempt = await fs . readdir ( dir ) ;
744+ expect ( filesAfterDeleteAttempt . some ( ( f ) => f . startsWith ( "sess-active.jsonl.deleted." ) ) ) . toBe (
745+ false ,
746+ ) ;
747+
748+ ws . close ( ) ;
749+ } ) ;
694750} ) ;
0 commit comments