@@ -206,6 +206,7 @@ def _build_window_from_items(
206206 memory_texts = []
207207 all_sources = []
208208 roles = set ()
209+ aggregated_file_ids : list [str ] = []
209210
210211 for item in items :
211212 if item .memory :
@@ -226,6 +227,15 @@ def _build_window_from_items(
226227 elif isinstance (source , dict ) and source .get ("role" ):
227228 roles .add (source .get ("role" ))
228229
230+ # Aggregate file_ids from metadata
231+ metadata = getattr (item , "metadata" , None )
232+ if metadata is not None :
233+ item_file_ids = getattr (metadata , "file_ids" , None )
234+ if isinstance (item_file_ids , list ):
235+ for fid in item_file_ids :
236+ if fid and fid not in aggregated_file_ids :
237+ aggregated_file_ids .append (fid )
238+
229239 # Determine memory_type based on roles (same logic as simple_struct)
230240 # UserMemory if only user role, else LongTermMemory
231241 memory_type = "UserMemory" if roles == {"user" } else "LongTermMemory"
@@ -238,12 +248,16 @@ def _build_window_from_items(
238248 return None
239249
240250 # Create aggregated memory item (similar to _build_fast_node in simple_struct)
251+ extra_kwargs : dict [str , Any ] = {}
252+ if aggregated_file_ids :
253+ extra_kwargs ["file_ids" ] = aggregated_file_ids
241254 aggregated_item = self ._make_memory_item (
242255 value = merged_text ,
243256 info = info ,
244257 memory_type = memory_type ,
245258 tags = ["mode:fast" ],
246259 sources = all_sources ,
260+ ** extra_kwargs ,
247261 )
248262
249263 return aggregated_item
@@ -371,6 +385,19 @@ def _process_one_item(fast_item: TextualMemoryItem) -> list[TextualMemoryItem]:
371385 if not isinstance (sources , list ):
372386 sources = [sources ]
373387
388+ # Extract file_ids from fast item metadata for propagation
389+ metadata = getattr (fast_item , "metadata" , None )
390+ file_ids = getattr (metadata , "file_ids" , None ) if metadata is not None else None
391+ file_ids = [fid for fid in file_ids if fid ] if isinstance (file_ids , list ) else []
392+
393+ # Build per-item info copy and kwargs for _make_memory_item
394+ info_per_item = info .copy ()
395+ if file_ids and "file_id" not in info_per_item :
396+ info_per_item ["file_id" ] = file_ids [0 ]
397+ extra_kwargs : dict [str , Any ] = {}
398+ if file_ids :
399+ extra_kwargs ["file_ids" ] = file_ids
400+
374401 # Determine prompt type based on sources
375402 prompt_type = self ._determine_prompt_type (sources )
376403
@@ -392,12 +419,13 @@ def _process_one_item(fast_item: TextualMemoryItem) -> list[TextualMemoryItem]:
392419 # Create fine mode memory item (same as simple_struct)
393420 node = self ._make_memory_item (
394421 value = m .get ("value" , "" ),
395- info = info ,
422+ info = info_per_item ,
396423 memory_type = memory_type ,
397424 tags = m .get ("tags" , []),
398425 key = m .get ("key" , "" ),
399426 sources = sources , # Preserve sources from fast item
400427 background = resp .get ("summary" , "" ),
428+ ** extra_kwargs ,
401429 )
402430 fine_items .append (node )
403431 except Exception as e :
@@ -407,12 +435,13 @@ def _process_one_item(fast_item: TextualMemoryItem) -> list[TextualMemoryItem]:
407435 # Create fine mode memory item (same as simple_struct)
408436 node = self ._make_memory_item (
409437 value = resp .get ("value" , "" ).strip (),
410- info = info ,
438+ info = info_per_item ,
411439 memory_type = "LongTermMemory" ,
412440 tags = resp .get ("tags" , []),
413441 key = resp .get ("key" , None ),
414442 sources = sources , # Preserve sources from fast item
415443 background = resp .get ("summary" , "" ),
444+ ** extra_kwargs ,
416445 )
417446 fine_items .append (node )
418447 except Exception as e :
0 commit comments