@@ -55,6 +55,19 @@ impl StateMachine {
5555 let id = entry. id ;
5656 let timestamp = entry. created_at ;
5757
58+ // If this ID already exists, remove its previous temporal index entry first.
59+ if let Some ( previous) = self . memories . get ( & id) {
60+ let old_ts = previous. created_at ;
61+ let mut remove_old_bucket = false ;
62+ if let Some ( ids) = self . temporal_index . get_mut ( & old_ts) {
63+ ids. retain ( |& mid| mid != id) ;
64+ remove_old_bucket = ids. is_empty ( ) ;
65+ }
66+ if remove_old_bucket {
67+ self . temporal_index . remove ( & old_ts) ;
68+ }
69+ }
70+
5871 self . memories . insert ( id, entry) ;
5972
6073 // Add to temporal index
@@ -170,6 +183,13 @@ impl StateMachine {
170183 self . memories . len ( )
171184 }
172185
186+ /// Get all memories in deterministic ID order.
187+ pub fn all_memories ( & self ) -> Vec < & MemoryEntry > {
188+ let mut entries: Vec < & MemoryEntry > = self . memories . values ( ) . collect ( ) ;
189+ entries. sort_by_key ( |e| e. id ) ;
190+ entries
191+ }
192+
173193 pub fn is_empty ( & self ) -> bool {
174194 self . memories . is_empty ( )
175195 }
@@ -262,6 +282,38 @@ mod tests {
262282 assert_eq ! ( range[ 1 ] . id, MemoryId ( 3 ) ) ;
263283 }
264284
285+ #[ test]
286+ fn test_insert_update_replaces_old_temporal_timestamp ( ) {
287+ let mut sm = StateMachine :: new ( ) ;
288+ sm. insert_memory ( create_test_entry ( 1 , "default" , 1000 ) )
289+ . unwrap ( ) ;
290+ sm. insert_memory ( create_test_entry ( 1 , "default" , 3000 ) )
291+ . unwrap ( ) ;
292+
293+ assert_eq ! ( sm. len( ) , 1 ) ;
294+ assert ! ( sm. get_memories_in_time_range( 1000 , 1000 ) . is_empty( ) ) ;
295+ let new_range = sm. get_memories_in_time_range ( 3000 , 3000 ) ;
296+ assert_eq ! ( new_range. len( ) , 1 ) ;
297+ assert_eq ! ( new_range[ 0 ] . id, MemoryId ( 1 ) ) ;
298+ }
299+
300+ #[ test]
301+ fn test_all_memories_deterministic_order ( ) {
302+ let mut sm = StateMachine :: new ( ) ;
303+ sm. insert_memory ( create_test_entry ( 3 , "default" , 1000 ) )
304+ . unwrap ( ) ;
305+ sm. insert_memory ( create_test_entry ( 1 , "default" , 1000 ) )
306+ . unwrap ( ) ;
307+ sm. insert_memory ( create_test_entry ( 2 , "default" , 1000 ) )
308+ . unwrap ( ) ;
309+
310+ let all = sm. all_memories ( ) ;
311+ assert_eq ! ( all. len( ) , 3 ) ;
312+ assert_eq ! ( all[ 0 ] . id, MemoryId ( 1 ) ) ;
313+ assert_eq ! ( all[ 1 ] . id, MemoryId ( 2 ) ) ;
314+ assert_eq ! ( all[ 2 ] . id, MemoryId ( 3 ) ) ;
315+ }
316+
265317 #[ test]
266318 fn test_namespace_filtering ( ) {
267319 let mut sm = StateMachine :: new ( ) ;
0 commit comments