隐藏的运行时机制:Claude Code 的后台「秘密花园」
在 Claude Code 的日常交互之下,潜伏着一套极其复杂的后台运行机制。它们有的在为你优化长期记忆,有的在偷偷记录你的终端操作,有的则在计算你离开了多久。
本质
Claude Code 不是一个简单的 REPL(读取-求值-打印循环)。它本质上是一个带有「后台进程管理器」的智能代理系统。这些机制确保了工具在对话时聪明,在对话间隙也能通过总结、学习和优化保持上下文的连贯性。
运行时的真相
AutoDream(自动织梦): Claude Code 的后台记忆整合机制,通过只读子代理在空闲时自动回顾历史会话并固化关键知识。详见 AutoDream 专题。
AwaySummary(离开总结): 当你重新打开一个长时间未操作的会话时,Claude 会自动生成一个 1-3 句的简短摘要。它读取最后 30 条消息和当前的 Session Memory,用一个小型快速模型(Small Fast Model)告诉你「你之前在干什么」以及「接下来的下一步建议是什么」。
Tips 系统(贴士调度): 那些出现在 Spinner(加载动画)旁边的提示语并非随机。它使用一种「距上次显示时间最长」的算法进行调度,并结合了严格的冷却时间(通常是 3-10 个会话)。更精妙的是它的相关性检查:例如,只有当你读过
.html文件时,它才会推荐安装前端设计插件;只有当你运行了多个会话时,它才会提示你使用/rename或/color。Asciicast(录屏): Claude Code 内部实现了一个 asciinema v2 格式的记录器。它通过劫持
process.stdout.write,在 Node.js 运行时层面捕获所有输出字符流并打上时间戳。这主要用于生成可分享的交互记录。Advisor(顾问模式): 这是一个名为
tengu_sage_compass的隐藏功能。它会在关键决策点(如写代码前或完成任务前)调用一个更强大的「评审模型」。这个「顾问」能看到完整的工具调用历史,并给出纠偏建议。Privacy Levels(隐私分级): 系统定义了三级隐私:
default(全开)、no-telemetry(关掉分析)、essential-traffic(仅保留核心流量,关掉更新检查和所有非必要联网)。
使用时的关键约束
- AutoDream 的约束:触发门槛、只读限制等详见 AutoDream 专题。
- 性能开销:由于 Tips 系统涉及大量环境变量和文件状态检测,它被设计为在后台静默失败,绝不会因为检测相关性而卡住主流程。
推荐阅读路径
如果你对记忆是如何存储的感兴趣,可以去研究 src/services/SessionMemory/。如果你想知道这些后台任务如何不干扰 UI 渲染,请看 src/Task.ts。
源码锚点
src/services/autoDream/autoDream.ts: 核心调度逻辑
📄 src/services/autoDream/autoDream.ts — 核心调度逻辑
const SESSION_SCAN_INTERVAL_MS = 10 * 60 * 1000
type AutoDreamConfig = {
minHours: number
minSessions: number
}src/services/awaySummary.ts: 总结生成逻辑
📄 src/services/awaySummary.ts — 总结生成逻辑
const RECENT_MESSAGE_WINDOW = 30
function buildAwaySummaryPrompt(memory: string | null): string {
const memoryBlock = memory
? `Session memory (broader context):\n${memory}\n\n`
: ''
return `${memoryBlock}The user stepped away and is coming back. Write exactly 1-3 short sentences. Start by stating the high-level task — what they are building or debugging, not implementation details. Next: the concrete next step. Skip status reports and commit recaps.`
}src/services/tips/tipRegistry.ts: 各种 Tip 的相关性定义
📄 src/services/tips/tipRegistry.ts — 各种 Tip 的相关性定义
context: TipContext | undefined,
signals: { filePath?: RegExp; cli?: string[] },src/utils/asciicast.ts: 终端劫持与录制实现
📄 src/utils/asciicast.ts — 终端劫持与录制实现
const recordingState: { filePath: string | null; timestamp: number } = {
filePath: null,
timestamp: 0,
}src/utils/advisor.ts: 顾问工具的指令定义
📄 src/utils/advisor.ts — 顾问工具的指令定义
export type AdvisorServerToolUseBlock = {
type: 'server_tool_use'
id: string
name: 'advisor'
input: { [key: string]: unknown }
}src/utils/privacyLevel.ts: 隐私级别判定逻辑
📄 src/utils/privacyLevel.ts — 隐私级别判定逻辑
type PrivacyLevel = 'default' | 'no-telemetry' | 'essential-traffic'
export function getPrivacyLevel(): PrivacyLevel {
if (process.env.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC) {
return 'essential-traffic'
}
if (process.env.DISABLE_TELEMETRY) {
return 'no-telemetry'
}
return 'default'
}