@@ -442,6 +442,51 @@ async def test_branching_functionality(agent: Agent):
442442 session .close ()
443443
444444
445+ async def test_delete_branch_removes_branch_only_messages ():
446+ """Deleting a branch should not leave unreferenced branch-only messages behind."""
447+ session_id = "branch_delete_cleanup_test"
448+ session = AdvancedSQLiteSession (session_id = session_id , create_tables = True )
449+
450+ main_items : list [TResponseInputItem ] = [
451+ {"role" : "user" , "content" : "First question" },
452+ {"role" : "assistant" , "content" : "First answer" },
453+ {"role" : "user" , "content" : "Second question" },
454+ {"role" : "assistant" , "content" : "Second answer" },
455+ ]
456+ await session .add_items (main_items )
457+
458+ await session .create_branch_from_turn (2 , "cleanup_branch" )
459+ branch_items : list [TResponseInputItem ] = [
460+ {"role" : "user" , "content" : "Branch-only question" },
461+ {"role" : "assistant" , "content" : "Branch-only answer" },
462+ ]
463+ await session .add_items (branch_items )
464+
465+ await session .delete_branch ("cleanup_branch" , force = True )
466+
467+ with session ._locked_connection () as conn :
468+ rows = conn .execute (
469+ f"""
470+ SELECT message_data
471+ FROM { session .messages_table }
472+ WHERE session_id = ?
473+ ORDER BY id
474+ """ ,
475+ (session .session_id ,),
476+ ).fetchall ()
477+
478+ contents = [json .loads (message_data )["content" ] for (message_data ,) in rows ]
479+ assert contents == [
480+ "First question" ,
481+ "First answer" ,
482+ "Second question" ,
483+ "Second answer" ,
484+ ]
485+ assert await session .get_items (branch_id = "main" ) == main_items
486+
487+ session .close ()
488+
489+
445490async def test_get_conversation_turns ():
446491 """Test get_conversation_turns functionality."""
447492 session_id = "conversation_turns_test"
0 commit comments