Skip to content
源码分析手册

AutoDream:后台记忆整合与自我完善

核心概念

AutoDream 是 Claude Code 的后台自动化记忆处理器。如果说 Auto Memory 是在对话中实时记录“碎片化知识”,那么 AutoDream 就是在系统空闲时对这些记忆进行的“离线清洗”与“归并”。它模拟了人类睡眠时的记忆固化过程,通过一个独立的子代理(Sub-agent)审阅历史对话,提炼出更高维度的模式,并优化 .claude/memory 下的文档结构。

源码级拆解

AutoDream 的实现核心是位于 src/services/autoDream/ 目录下的处理逻辑:

  1. 触发逻辑与“三关制” (Gate Logic): 在 autoDream.ts 中,系统每次在交互空闲时都会通过 executeAutoDream 调用 runAutoDream,但只有在以下三个条件全部满足时才会真正“开火”:

    • 时间闸门 (Time Gate):距离上次整合(lastConsolidatedAt)已超过 minHours(默认 24 小时)。
    • 会话闸门 (Session Gate):自上次整合以来,至少有 minSessions(默认 5 个)历史会话发生了变动。
    • 锁定机制 (Lock Gate):必须成功通过 tryAcquireConsolidationLock 获取锁定,防止多个进程同时进行“梦境整合”。
  2. 整合过程与子代理模式: 满足条件后,系统调用 runForkedAgent 启动一个“隐形”的子代理。这个代理会:

    • 接收由 consolidationPrompt.ts 构建的指令,目标是“提高记忆的检索效率和准确性”。
    • memoryRoot(通常是 .claude/memory/)下的文件进行读写。
    • 在执行过程中,子代理被施加了严格的工具限制(如 Bash 工具仅限 Read-Only 操作),确保“整合”过程不会意外修改生产代码。
  3. 锁定状态管理 (Consolidation Lock)consolidationLock.ts 维护了一个名为 .consolidate-lock 的文件。它的特殊之处在于:

    • 文件内容:存储当前持有锁的进程 PID,用于检测僵尸进程(Zombie Processes)。
    • 元数据 (mtime):该锁文件的 mtime(修改时间)被定义为全局的 lastConsolidatedAt。这意味着,即便没有正在运行的任务,锁文件也会作为一个持久的时间戳存在。

边界条件

  • 回滚逻辑 (Rollback):如果子代理在执行过程中崩溃或被用户杀死(Kill),rollbackConsolidationLock 会将 .consolidate-lockmtime 重置回执行前的状态,以便系统在下个周期重新尝试。
  • 隐私与安全:虽然是后台任务,但它依然遵循 isAutoMemoryEnabled 的全局开关。如果用户禁用了自动记忆,AutoDream 也将不再工作。
  • 资源敏感:AutoDream 的默认频率非常低(24 小时/5 会话),这是为了避免频繁的模型调用产生不必要的成本。

相关主题

  • 阅读 src/services/extractMemories/ 了解碎片化记忆是如何最初被捕获的。
  • 阅读 src/utils/forkedAgent.ts 了解 Claude Code 如何管理这些“后台子任务”。

源码锚点

  • claude-code-opensource/src/services/autoDream/autoDream.ts: 任务调度与触发核心。
📄 src/services/autoDream/autoDream.ts — 任务调度与触发核心。L56-61 of 325
typescript
const SESSION_SCAN_INTERVAL_MS = 10 * 60 * 1000

type AutoDreamConfig = {
  minHours: number
  minSessions: number
}
  • claude-code-opensource/src/services/autoDream/consolidationLock.ts: 锁定与时间管理实现。
📄 src/services/autoDream/consolidationLock.ts — 锁定与时间管理实现。L16-23 of 141
typescript
const LOCK_FILE = '.consolidate-lock'

// Stale past this even if the PID is live (PID reuse guard).
const HOLDER_STALE_MS = 60 * 60 * 1000

function lockPath(): string {
  return join(getAutoMemPath(), LOCK_FILE)
}
  • claude-code-opensource/src/tasks/DreamTask/DreamTask.ts: 对话状态与 UI 任务反馈逻辑。
📄 src/tasks/DreamTask/DreamTask.ts — 对话状态与 UI 任务反馈逻辑。L12-18 of 158
typescript
const MAX_TURNS = 30

// A single assistant turn from the dream agent, tool uses collapsed to a count.
export type DreamTurn = {
  text: string
  toolUseCount: number
}

基于 Claude Code v2.1.88 开源快照的深度分析