源码位置:
src/assistant/、src/proactive/、src/services/autoDream/编译开关:feature('KAIROS')、feature('KAIROS_BRIEF')、feature('KAIROS_CHANNELS')远程开关:GrowthBooktengu_kairos
关掉终端 Claude 还在运行的持久助手模式。KAIROS 是 Claude Code 中最复杂的隐藏功能之一。
KAIROS 让 Claude 从"一次性对话工具"变成"持久运行的 AI 助手":
- 关闭终端后 Claude 仍在后台运行
- 每天自动写日志
- 晚上自动"做梦"整理记忆
- 没人说话时自己找活干
- 命令超 15 秒自动丢后台
定义在 src/main.tsx(约第 1054-1092 行),需要通过五层检查:
1. feature('KAIROS') ← 编译时 flag
2. settings.assistant: true ← .claude/settings.json
3. 目录信任状态检查 ← 防恶意仓库劫持
4. tengu_kairos ← GrowthBook 远程开关
5. setKairosActive(true) ← 全局状态激活
--assistant CLI 参数可跳过远程开关检查(用于 Agent SDK daemon 模式)。
全局状态存储在 src/bootstrap/state.ts:
kairosActive: boolean(默认false)getKairosActive()/setKairosActive(true)
src/utils/conversationRecovery.ts 中使用 feature('KAIROS') 条件导入 BriefTool 和 SendUserFileTool。在反序列化会话时识别这些工具的结果为"终端工具结果",判断 turn 是正常完成还是被中断。
关键在 .claude/scheduled_tasks.json。标记为 permanent: true 的任务不受 7 天自动过期限制:
catch-up:恢复中断的工作morning-checkin:每日早间签到dream:记忆整合
src/assistant/sessionHistory.ts 通过 OAuth API 加载远程会话历史,使用 v1/sessions/{sessionId}/events 端点,支持分页拉取。
KAIROS 最精巧的子系统——后台运行的子代理,将分散的会话记忆整合为持久的结构化知识。
定义在 src/services/autoDream/autoDream.ts:
1. 时间门控:距上次整合超过 24 小时(minHours)
2. 会话门控:至少 5 个新会话(minSessions)
3. 锁门控:没有其他进程正在整合
阈值通过 GrowthBook tengu_onyx_plover 远程配置动态控制。
定义在 src/services/autoDream/consolidationPrompt.ts:
| 阶段 | 动作 |
|---|---|
| Orient | 列出记忆目录、读取 MEMORY.md 索引、浏览已有主题文件 |
| Gather | 从每日日志、已有记忆、JSONL transcript 中搜集新信号 |
| Consolidate | 合并新信号到主题文件,转换相对日期为绝对日期,删除过时事实 |
| Prune | 更新 MEMORY.md 索引,保持在行数和大小限制内 |
src/services/autoDream/consolidationLock.ts:
- 使用
.consolidate-lock文件 - 文件 mtime =
lastConsolidatedAt - 文件内容 = 持有者 PID
- 支持 PID 存活检查(1 小时超时)
- double-write 后 re-read 验证防竞争
路径由 src/memdir/paths.ts 的 getAutoMemDailyLogPath() 计算:
<autoMemPath>/logs/YYYY/MM/YYYY-MM-DD.md
- Footer pill 标签显示 "dreaming"
src/components/tasks/DreamDetailDialog.tsx提供专门的详情对话框- 支持查看实时进度和手动中止
Shift+Down打开后台任务对话框
没人说话时 Claude 自己找活干。
src/proactive/index.ts 维护三个状态:
| 状态 | 说明 |
|---|---|
active |
是否激活 |
paused |
是否暂停(用户按 Esc 取消时暂停,下次输入恢复) |
contextBlocked |
API 错误时阻塞 tick,防止 tick-error-tick 死循环 |
--proactiveCLI 参数CLAUDE_CODE_PROACTIVE环境变量- 受
feature('PROACTIVE') || feature('KAIROS')保护
激活后追加:
# Proactive Mode
You are in proactive mode. Take initiative -- explore, act, and make progress
without waiting for instructions.
Start by briefly greeting the user.
You will receive periodic <tick> prompts. These are check-ins. Do whatever
seems most useful, or call Sleep if there's nothing to do.
设置中的 minSleepDurationMs 和 maxSleepDurationMs 控制 Sleep 持续时间范围,节流 proactive tick 频率。没活干就 Sleep 等着。
src/utils/cronScheduler.ts:
- 每 1 秒 tick 一次(
CHECK_INTERVAL_MS = 1000) - 使用 chokidar 监视
.claude/scheduled_tasks.json - 支持调度器锁(
src/utils/cronTasksLock.ts),防止多实例重复触发 - 锁探测间隔 5 秒,持有者崩溃时自动接管
| 类型 | 说明 |
|---|---|
一次性(recurring: false) |
触发后自动删除,支持错过任务检测 |
循环(recurring: true) |
触发后重新调度,默认 7 天过期 |
永久(permanent: true) |
不受过期限制(KAIROS 专用) |
会话级(durable: false) |
仅内存中,进程退出即消失 |
src/utils/cronJitterConfig.ts:
- 循环任务:基于 taskId 的确定性延迟(interval 的 10%,上限 15 分钟)
- 一次性任务:在 :00 和 :30 施加最多 90 秒提前量
- 运维可在事故期间推送配置变更,60 秒内全客户端生效
| 文件 | 职责 |
|---|---|
src/bootstrap/state.ts |
KAIROS 全局状态 |
src/assistant/index.ts |
助手模式入口 |
src/assistant/sessionHistory.ts |
远程会话历史 API |
src/proactive/index.ts |
主动模式状态管理 |
src/services/autoDream/autoDream.ts |
Auto-Dream 引擎 |
src/services/autoDream/consolidationPrompt.ts |
整合提示(四阶段) |
src/services/autoDream/consolidationLock.ts |
整合锁 |
src/services/autoDream/config.ts |
Dream 配置 |
src/tasks/DreamTask/DreamTask.ts |
Dream 任务定义 |
src/utils/cronScheduler.ts |
Cron 调度器 |
src/utils/cronTasks.ts |
Cron 任务持久化 |
src/skills/bundled/dream.ts |
/dream Skill(存根) |