机制专题 · 07

Memory 机制

2.1.233 有四套互不替代的记忆面:本地 auto memory、session memory、agent memory,以及连上的 project memory store(memory_list / read / write)。

0. 2.1.233 的 memory_* 工具#

这三件套操作的是已连接的 project memory store(带 store id,路径形如 /project/<id>/MEMORY.md),不是本地 ~/.claude/projects/.../memory/ 那条 Write/Edit。

本地 auto memory 仍用 Write/Edit 写 MEMORY.md 目录。/pause-memory 暂停 automemory;/memory 编辑 CLAUDE.md 和 memory 设置。

1. auto memory:跨会话持久记忆#

路径在 memdir/paths.ts:

memdir/memdir.ts 的 prompt 明确规定写入格式:

  1. 记忆内容写到单独 .md 文件,带 frontmatter:name/description/type 等。
  2. MEMORY.md 只是索引,每条一行,未来会默认加载。
  3. 避免保存可从代码直接推导出的事实,主要保存用户偏好、反馈、项目背景、外部引用等。

2. auto memory 何时写入#

有两个写入来源:

A. 主 agent 直接写

system prompt 中会告诉模型:用户明确要求 remember/forget 时立即写入 memory。此时模型会用 Write/Edit 写到 auto memory 目录。权限层对 auto memory 有特殊放行和安全校验:memdir/paths.tsutils/permissions/filesystem.tsutils/memoryFileDetection.ts 会识别 auto memory 路径。

B. 后台 extractMemories subagent 写

services/extractMemories/extractMemories.ts:

这说明 memory 写入不是每轮都同步阻塞主流程,而是"主 agent 可显式写;没写时后台 agent 尽力补写"。

3. auto memory 何时读取#

读取分三层:

  1. 启动/系统上下文加载:loadMemoryPrompt() 会创建 memory 目录并把 memory 行为说明放进 system prompt;MEMORY.md 的内容通过 CLAUDE.md/memory 文件加载链路进入 user context(索引有 200 行和 25KB 限制)。
  2. 查询相关记忆预取:utils/attachments.tsstartRelevantMemoryPrefetch() 在用户 turn 开始时后台启动,调用 findRelevantMemories()。它扫描 memory 文件 frontmatter,再用 sideQuery 让 Sonnet 从 manifest 里最多选 5 个相关文件,结果作为 relevant_memories attachment 注入后续迭代。这个预取不会阻塞第一轮;如果没赶上,会跳过并下轮再试。
  3. 模型主动读:prompt 的 "When to access memories" 要求在用户要求 recall/check/remember 时主动访问;模型可用 Read/Grep/Glob 搜 memory 目录。

4. session memory:当前会话压缩用笔记#

services/SessionMemory/sessionMemory.ts 维护的是当前会话 notes,不等同于跨会话 memory。

写入位置:utils/permissions/filesystem.tsgetSessionMemoryDir() / getSessionMemoryPath(),位于 ~/.claude/session-memory/... 体系下。

触发条件:

写入方式:forked agent 读取 notes 文件,再只允许对该文件执行 Edit。默认模板包含 Current State、Task specification、Files and Functions、Errors & Corrections、Worklog 等章节。

读取时机:

5. agent memory#

tools/AgentTool/loadAgentsDir.ts 支持 agent frontmatter memory: user|project|local。启用后会给 agent 注入 memory prompt,并在工具集合中确保 Read/Edit/Write 可用于 agent memory 文件。它是 subagent 专用的持久上下文,不等于主会话 auto memory。