@@ -320,7 +320,10 @@ def handle_delete_memories(delete_mem_req: DeleteMemoryRequest, naive_mem_cube:
320320 Now unified to delete from text_mem only (includes preferences).
321321 """
322322 logger .info (
323- f"[Delete memory request] writable_cube_ids: { delete_mem_req .writable_cube_ids } , memory_ids: { delete_mem_req .memory_ids } "
323+ "[Delete memory request] writable_cube_ids: %s, memory_ids: %s, auto_cleanup_working: %s" ,
324+ delete_mem_req .writable_cube_ids ,
325+ delete_mem_req .memory_ids ,
326+ getattr (delete_mem_req , "auto_cleanup_working" , False ),
324327 )
325328 # Validate that only one of memory_ids, file_ids, or filter is provided
326329 provided_params = [
@@ -335,6 +338,31 @@ def handle_delete_memories(delete_mem_req: DeleteMemoryRequest, naive_mem_cube:
335338 )
336339
337340 try :
341+ working_ids_to_delete : set [str ] = set ()
342+ # When deleting by explicit memory_ids and auto_cleanup_working is enabled,
343+ # collect related WorkingMemory ids from working_binding
344+ if delete_mem_req .memory_ids is not None and getattr (
345+ delete_mem_req , "auto_cleanup_working" , False
346+ ):
347+ try :
348+ memories = naive_mem_cube .text_mem .get_by_ids (memory_ids = delete_mem_req .memory_ids )
349+ except Exception as e :
350+ logger .warning ("Failed to fetch memories before delete for working cleanup: %s" , e )
351+ memories = []
352+
353+ if memories :
354+ import re
355+
356+ pattern = re .compile (r"\[working_binding:([0-9a-fA-F-]{36})\]" )
357+ for mem in memories :
358+ metadata = mem .get ("metadata" ) or {}
359+ bg = metadata .get ("background" ) or ""
360+ if not isinstance (bg , str ):
361+ continue
362+ match = pattern .search (bg )
363+ if match :
364+ working_ids_to_delete .add (match .group (1 ))
365+
338366 if delete_mem_req .memory_ids is not None :
339367 # Unified deletion from text_mem (includes preferences)
340368 naive_mem_cube .text_mem .delete_by_memory_ids (delete_mem_req .memory_ids )
@@ -344,6 +372,17 @@ def handle_delete_memories(delete_mem_req: DeleteMemoryRequest, naive_mem_cube:
344372 )
345373 elif delete_mem_req .filter is not None :
346374 naive_mem_cube .text_mem .delete_by_filter (filter = delete_mem_req .filter )
375+
376+ # After main deletion, optionally clean up related WorkingMemory nodes.
377+ if working_ids_to_delete :
378+ try :
379+ logger .info (
380+ "Auto-cleanup WorkingMemory nodes after delete, count=%d" ,
381+ len (working_ids_to_delete ),
382+ )
383+ naive_mem_cube .text_mem .delete_by_memory_ids (list (working_ids_to_delete ))
384+ except Exception as e :
385+ logger .warning ("Failed to auto-cleanup WorkingMemory nodes: %s, Pass" , e )
347386 except Exception as e :
348387 logger .error (f"Failed to delete memories: { e } " , exc_info = True )
349388 return DeleteMemoryResponse (
0 commit comments