@@ -2334,6 +2334,135 @@ test("SessionManager adjusts the active Bash timeout control and session metadat
23342334 assert . equal ( processInfo ?. deadlineAt , new Date ( timeoutInfo . deadlineAtMs ) . toISOString ( ) ) ;
23352335} ) ;
23362336
2337+ test ( "SessionManager.deleteSession removes session entry from the index" , ( ) => {
2338+ const workspace = createTempDir ( "deepcode-delete-workspace-" ) ;
2339+ const home = createTempDir ( "deepcode-delete-home-" ) ;
2340+ setHomeDir ( home ) ;
2341+
2342+ const manager = createSessionManager ( workspace , "machine-id-delete" ) ;
2343+ ( manager as any ) . activateSession = async ( ) => { } ;
2344+
2345+ // Create two sessions
2346+ const session1 = createSessionAndMessages ( manager , "session-delete-1" , "First session" ) ;
2347+ const session2 = createSessionAndMessages ( manager , "session-delete-2" , "Second session" ) ;
2348+
2349+ assert . equal ( manager . listSessions ( ) . length , 2 ) ;
2350+
2351+ // Delete the first session
2352+ const result = manager . deleteSession ( session1 ) ;
2353+ assert . equal ( result , true ) ;
2354+
2355+ const remaining = manager . listSessions ( ) ;
2356+ assert . equal ( remaining . length , 1 ) ;
2357+ assert . equal ( remaining [ 0 ] ?. id , session2 ) ;
2358+ } ) ;
2359+
2360+ test ( "SessionManager.deleteSession removes the messages file" , ( ) => {
2361+ const workspace = createTempDir ( "deepcode-delete-msg-workspace-" ) ;
2362+ const home = createTempDir ( "deepcode-delete-msg-home-" ) ;
2363+ setHomeDir ( home ) ;
2364+
2365+ const manager = createSessionManager ( workspace , "machine-id-delete-msg" ) ;
2366+ ( manager as any ) . activateSession = async ( ) => { } ;
2367+
2368+ const sessionId = createSessionAndMessages ( manager , "session-delete-msg" , "Test session" ) ;
2369+ const messagePath = path . join (
2370+ home ,
2371+ ".deepcode" ,
2372+ "projects" ,
2373+ workspace . replace ( / [ \\ \\ / ] / g, "-" ) . replace ( / : / g, "" ) ,
2374+ `${ sessionId } .jsonl`
2375+ ) ;
2376+
2377+ // Verify messages file exists
2378+ assert . ok ( fs . existsSync ( messagePath ) ) ;
2379+
2380+ manager . deleteSession ( sessionId ) ;
2381+
2382+ // Verify messages file is removed
2383+ assert . equal ( fs . existsSync ( messagePath ) , false ) ;
2384+ } ) ;
2385+
2386+ test ( "SessionManager.deleteSession returns false when session does not exist" , ( ) => {
2387+ const workspace = createTempDir ( "deepcode-delete-nonexist-workspace-" ) ;
2388+ const home = createTempDir ( "deepcode-delete-nonexist-home-" ) ;
2389+ setHomeDir ( home ) ;
2390+
2391+ const manager = createSessionManager ( workspace , "machine-id-delete-nonexist" ) ;
2392+
2393+ const result = manager . deleteSession ( "nonexistent-session-id" ) ;
2394+ assert . equal ( result , false ) ;
2395+ assert . equal ( manager . listSessions ( ) . length , 0 ) ;
2396+ } ) ;
2397+
2398+ test ( "SessionManager.deleteSession does not affect other sessions" , ( ) => {
2399+ const workspace = createTempDir ( "deepcode-delete-others-workspace-" ) ;
2400+ const home = createTempDir ( "deepcode-delete-others-home-" ) ;
2401+ setHomeDir ( home ) ;
2402+
2403+ const manager = createSessionManager ( workspace , "machine-id-delete-others" ) ;
2404+ ( manager as any ) . activateSession = async ( ) => { } ;
2405+
2406+ const session1 = createSessionAndMessages ( manager , "session-keep-1" , "Keep session 1" ) ;
2407+ const session2 = createSessionAndMessages ( manager , "session-keep-2" , "Keep session 2" ) ;
2408+
2409+ // Delete non-existent session
2410+ const result = manager . deleteSession ( "non-existent" ) ;
2411+ assert . equal ( result , false ) ;
2412+ assert . equal ( manager . listSessions ( ) . length , 2 ) ;
2413+
2414+ // Delete one session
2415+ assert . equal ( manager . deleteSession ( session1 ) , true ) ;
2416+ assert . equal ( manager . listSessions ( ) . length , 1 ) ;
2417+ assert . equal ( manager . listSessions ( ) [ 0 ] ?. id , session2 ) ;
2418+
2419+ // The remaining session should still have its messages accessible
2420+ const messages = manager . listSessionMessages ( session2 ) ;
2421+ assert . ok ( messages . length > 0 ) ;
2422+ } ) ;
2423+
2424+ /**
2425+ * Helper: creates a session and writes a few messages to it so we can test
2426+ * that deleteSession removes both the index entry and the messages file.
2427+ */
2428+ function createSessionAndMessages ( manager : SessionManager , sessionId : string , summary : string ) : string {
2429+ const now = new Date ( ) . toISOString ( ) ;
2430+ const index = ( manager as any ) . loadSessionsIndex ( ) ;
2431+ index . entries . push ( {
2432+ id : sessionId ,
2433+ summary,
2434+ assistantReply : null ,
2435+ assistantThinking : null ,
2436+ assistantRefusal : null ,
2437+ toolCalls : null ,
2438+ status : "completed" ,
2439+ failReason : null ,
2440+ usage : null ,
2441+ usagePerModel : null ,
2442+ activeTokens : 0 ,
2443+ createTime : now ,
2444+ updateTime : now ,
2445+ processes : null ,
2446+ } ) ;
2447+ ( manager as any ) . saveSessionsIndex ( index ) ;
2448+
2449+ // Write a couple of message lines to the messages file
2450+ const projectDir = ( manager as any ) . getProjectStorage ( ) . projectDir ;
2451+ const messagePath = path . join ( projectDir , `${ sessionId } .jsonl` ) ;
2452+ const msg = JSON . stringify ( {
2453+ id : "msg-1" ,
2454+ sessionId,
2455+ role : "user" ,
2456+ content : summary ,
2457+ visible : true ,
2458+ createTime : now ,
2459+ updateTime : now ,
2460+ } ) ;
2461+ fs . writeFileSync ( messagePath , `${ msg } \n` , "utf8" ) ;
2462+
2463+ return sessionId ;
2464+ }
2465+
23372466function hasGit ( ) : boolean {
23382467 try {
23392468 execFileSync ( "git" , [ "--version" ] , { stdio : "ignore" } ) ;
0 commit comments