33 lines
1.4 KiB
Python
33 lines
1.4 KiB
Python
"""Remap structured memory references without rewriting user-authored text."""
|
|
from copy import deepcopy
|
|
|
|
|
|
MEMORY_REFERENCE_KEYS = frozenset({
|
|
"episode_id", "parent_episode_id", "parent_episode_ids", "series_episode_ids",
|
|
"source_episode_ids", "member_memory_ids", "member_ids",
|
|
"source_raw_memory_id", "source_raw_memory_ids", "evidence_chain",
|
|
"supersedes", "superseded_by", "source_fact_ids", "evidence_ids",
|
|
})
|
|
|
|
|
|
def remap_memory_references(value, id_map):
|
|
"""Copy metadata, mapping only known references that belong to this clone.
|
|
|
|
Legacy episode labels and references outside an agent-scoped clone retain
|
|
their existing meaning. Free text, session IDs and request IDs are untouched.
|
|
"""
|
|
if isinstance(value, dict):
|
|
result = {}
|
|
for key, child in value.items():
|
|
if key in MEMORY_REFERENCE_KEYS and isinstance(child, str):
|
|
result[key] = id_map.get(child, child)
|
|
elif key in MEMORY_REFERENCE_KEYS and isinstance(child, list):
|
|
result[key] = [id_map.get(item, item) if isinstance(item, str)
|
|
else remap_memory_references(item, id_map) for item in child]
|
|
else:
|
|
result[key] = remap_memory_references(child, id_map)
|
|
return result
|
|
if isinstance(value, list):
|
|
return [remap_memory_references(item, id_map) for item in value]
|
|
return deepcopy(value)
|