Module Structure
Auto Memory 位于 Session transcript 之外,以项目路径派生独立存储目录。系统提示只自动加载有界索引,详细 topic 由工具按需读取;成功压缩后还会用无 LLM 的规则从被丢弃消息中追加少量候选知识。
Directory Layout
packages/cli/src/memory/AutoMemoryManager.ts:索引、topic、列举和清理packages/cli/src/memory/MemoryConsolidation.ts:压缩后启发式提取packages/cli/src/memory/types.ts:启用开关与索引行数预算packages/cli/src/tools/builtin/memory/MemoryReadTool.ts:按 topic 读取或列举packages/cli/src/tools/builtin/memory/MemoryWriteTool.ts:手工写入与敏感模式拒绝packages/cli/src/prompts/builder.ts:新模型上下文中的索引注入packages/cli/src/slash-commands/memory.ts:用户侧项目记忆管理
Key Entry Points
AutoMemoryManager.loadIndex():加载有界MEMORY.mdAutoMemoryManager.readTopic()/writeTopic():读取或更新详细主题extractLearnings():从用户、assistant 和 tool 消息提取有限规则命中consolidateAfterCompaction():按日期追加提取结果memoryReadTool/memoryWriteTool:模型侧手工访问入口
Gotchas
MEMORY.md自动注入只取前 200 行并附加剩余行提示;MemoryRead(topic="MEMORY")仍可读取完整索引,因此索引过长不会丢失,但会增加一次显式工具调用 (packages/cli/src/memory/AutoMemoryManager.ts,packages/cli/src/tools/builtin/memory/MemoryReadTool.ts)BLADE_AUTO_MEMORY=0只阻止 Prompt builder 自动注入索引,不会注销 MemoryRead/MemoryWrite,也不会阻止手工访问项目记忆 (packages/cli/src/prompts/builder.ts,packages/cli/src/tools/builtin/index.ts)- topic 中的路径分隔符和特殊字符统一替换为
-;不同原始 topic 可能映射到同一个.md文件,调用方不能把原始名称当成无碰撞身份 (packages/cli/src/memory/AutoMemoryManager.ts) - append 是“读取旧正文再整体 writeFile”,AutoMemoryManager 没有 keyed mutex 或原子替换;MemoryWrite 的非并发标记只约束单个 executor,跨 Session 同 topic 写入仍可能 last-writer-wins (
packages/cli/src/memory/AutoMemoryManager.ts,packages/cli/src/tools/builtin/memory/MemoryWriteTool.ts) - Memory 工具优先用
ExecutionContext.workspaceRoot派生项目,Prompt builder 使用传入的projectPath,自动巩固使用getCwd();worktree 和多 workspace 路径必须显式对齐,不能假设三条入口天然写到同一目录 (packages/cli/src/tools/builtin/memory/MemoryReadTool.ts,packages/cli/src/tools/builtin/memory/MemoryWriteTool.ts,packages/cli/src/prompts/builder.ts,packages/cli/src/memory/MemoryConsolidation.ts) - MemoryWrite 的敏感信息拒绝只覆盖少量
password/token/secret/api key/private key正则,既可能漏掉其他凭据,也允许不带赋值形态的普通 password 语句;通过校验不等于内容可安全持久化 (packages/cli/src/tools/builtin/memory/MemoryWriteTool.ts) - MemoryRead 对 topic 不存在和空列表都返回
success: true,调用方必须检查返回正文,不能把工具成功当作记忆已命中 (packages/cli/src/tools/builtin/memory/MemoryReadTool.ts) listTopics()只把ENOENT解释为空列表,其他文件系统错误会抛出并可由 retry-safe 的 MemoryRead 做瞬态重试;deleteTopic()仍把任意 unlink 异常折叠为 false,两个入口的失败语义不同 (packages/cli/src/memory/AutoMemoryManager.ts,packages/cli/src/tools/builtin/memory/MemoryReadTool.ts)- 自动巩固只识别用户显式 remember/convention/lesson 标记、assistant 的 fix 文本和有限 tool error 模式;tool error 每次最多保留 5 条,它不是对被丢弃上下文的完整语义总结 (
packages/cli/src/memory/MemoryConsolidation.ts) - 压缩成功后 consolidation 以 fire-and-forget 启动并吞掉全部异常;记忆写入失败既不回滚 checkpoint,也不会令 compaction 失败 (
packages/cli/src/context/CompactionService.ts,packages/cli/src/memory/MemoryConsolidation.ts)
Architecture
AutoMemoryManager通过项目存储路径把MEMORY.md与 topic 文件放在 Session transcript 之外,使同一项目的后续 Session 可以复用,但不会继承 rewind、fork 或 committed seq 语义 (packages/cli/src/memory/AutoMemoryManager.ts,packages/cli/src/context/storage/pathUtils.ts)- Prompt builder 只把索引放入
<auto-memory>,详细 topic 不自动进入系统提示;MemoryRead 是渐进披露入口 (packages/cli/src/prompts/builder.ts,packages/cli/src/tools/builtin/memory/MemoryReadTool.ts) - MemoryRead 是并发安全且可重试的 ReadOnly 工具,MemoryWrite 是不可并发、不可自动重放的 Write 工具;两者仍通过统一 ToolExecutor 权限与结果契约 (
packages/cli/src/tools/builtin/memory/MemoryReadTool.ts,packages/cli/src/tools/builtin/memory/MemoryWriteTool.ts) - consolidation 不调用额外模型,只把规则命中按日期追加到 preferences、conventions、lessons 或 debugging topic,避免压缩额外产生 Provider 请求 (
packages/cli/src/memory/MemoryConsolidation.ts)
Decisions
- Auto Memory 以索引加 topic 的两层结构实现渐进披露:启动成本固定在索引前 200 行,详细经验留给按需工具读取 (
packages/cli/src/memory/AutoMemoryManager.ts,packages/cli/src/prompts/default.ts,git:40128981) - 自动巩固采用保守启发式并在失败时不影响压缩主路径,优先保证 Session checkpoint 可提交,而不是保证每次压缩都产生记忆 (
packages/cli/src/context/CompactionService.ts,packages/cli/src/memory/MemoryConsolidation.ts)
Patterns
topic="MEMORY"是索引写入的保留入口,topic="_list"只在 MemoryRead 中表示列举;普通 topic 最终统一补.md后缀 (packages/cli/src/tools/builtin/memory/MemoryReadTool.ts,packages/cli/src/tools/builtin/memory/MemoryWriteTool.ts,packages/cli/src/memory/AutoMemoryManager.ts)- append 会在旧正文缺少尾换行时补一个分隔换行,consolidation 自身则把每条结果格式化为带 ISO 日期的 Markdown 列表项 (
packages/cli/src/memory/AutoMemoryManager.ts,packages/cli/src/memory/MemoryConsolidation.ts) - topic 列表按最后修改时间降序返回并包含
MEMORY本身;UI 或 Agent 若要把索引固定在首位,需要在消费端另行排序 (packages/cli/src/memory/AutoMemoryManager.ts)