"""curated memory 的冻结快照工具。 这个文件很小,但职责非常关键:它把“长期记忆的 live state”和“当前会话注入 prompt 时使用的 frozen snapshot”明确分开。 设计目的: 1. 让调用侧显式意识到:system prompt 使用的是一份冻结视图 2. 避免后续 engine/context builder 直接偷读 live store,破坏 frozen snapshot 语义 3. 给 prompt 组装层一个简单、稳定、可测试的数据结构 """ from __future__ import annotations from dataclasses import dataclass from .store import MemoryStore @dataclass(frozen=True, slots=True) class MemorySnapshot: """当前 session 使用的冻结记忆快照。 这里不是 memory store 本体,而是“给 prompt builder 的只读投影”。 一旦 capture 完成,这个对象就代表本 session 的注入视图,不应在会话中途被修改。 """ memory_block: str | None user_block: str | None def as_prompt_sections(self) -> list[str]: """按稳定顺序返回可直接拼接进 prompt 的 section 列表。 顺序固定为: 1. user profile 2. agent memory 这样后续 context builder 的输出更稳定,测试也更容易写。 """ return [section for section in (self.user_block, self.memory_block) if section] def capture_memory_snapshot(store: MemoryStore) -> MemorySnapshot: """从 `MemoryStore` 提取当前 session 的 frozen snapshot。 前提是 `store.load_from_disk()` 已经在 session 启动时调用过,否则拿到的只是空快照。 """ return MemorySnapshot( memory_block=store.format_for_system_prompt("memory"), user_block=store.format_for_system_prompt("user"), )