← 返回文章列表← Back to posts

KAIROS — Claude Code 源码中隐藏的「始终在线 AI 助手」全解析KAIROS — The Hidden 'Always-On AI Assistant' Inside Claude Code Source

通过逆向 Claude Code 源码,发现了代号 KAIROS 的 Assistant Mode:一个 24 小时运行的 AI 守护进程,具备自主行动、定时任务、事件监听、主动推送、长期记忆和远程查看六大能力。Reverse-engineering Claude Code source reveals KAIROS Assistant Mode: a 24/7 AI daemon with proactive action, scheduled tasks, event listening, push notifications, long-term memory, and remote viewing.

·31 分钟阅读min read

KAIROS — Claude Code "Assistant Mode" 完整解析

基于 Claude Code 源码逆向分析(2026-04-03) 数据来源:restored-src (sourcemap 还原) + claude-code-source (反编译)


一、KAIROS 是什么

KAIROS 是 Claude Code 内部正在开发的 Assistant Mode(助手模式) 的工程代号。

一句话定义:把 Claude Code 从"你问我答的 CLI 工具"变成"始终在线、自主行动的 AI 助手守护进程"。

1.1 普通模式 vs KAIROS 模式

普通 Claude Code(被动工具):

  用户输入 → Agent 执行 → 返回结果 → 等待 → 用户输入 → ...

  ● 用户不说话,Agent 什么都不做
  ● 关掉终端,Agent 就消失了
  ● 每次对话是独立的,不记得上次做了什么


KAIROS(主动助手守护进程):

  Agent 24 小时运行 ──┬── 自己巡逻思考(tick 心跳)
                      ├── 按计划执行任务(cron 定时)
                      ├── 监听外部事件(GitHub / MCP / Webhook)
                      ├── 主动推送简报给用户
                      ├── 记住做过的事(日志 + Dream 巩固记忆)
                      └── 用户随时从任意终端连入查看

  ● 用户不在,Agent 照样工作
  ● 关掉终端,Agent 继续运行(daemon 模式)
  ● 跨 session 有记忆,越用越了解你的项目

1.2 能力全景图

KAIROS 的完整能力可以分为五层:

┌─────────────────────────────────────────────────────────┐
│                    KAIROS 能力架构                        │
├─────────────────────────────────────────────────────────┤
│                                                          │
│  ┌─ 感知层 ─────────────────────────────────────────┐   │
│  │  定时任务(cron)         — 预设好的计划           │   │
│  │  外部事件(GitHub/MCP)   — 被动触发              │   │
│  │  自主巡逻(tick 心跳)    — 没人叫也会自己醒来     │   │
│  └──────────────────────────────────────────────────┘   │
│          ↓                                               │
│  ┌─ 决策层 ─────────────────────────────────────────┐   │
│  │  自主判断下一步行动(做事 or Sleep)               │   │
│  │  可以 spawn 子 agent 并行协作                     │   │
│  │  调用所有 Claude Code 原有工具                    │   │
│  └──────────────────────────────────────────────────┘   │
│          ↓                                               │
│  ┌─ 输出层 ─────────────────────────────────────────┐   │
│  │  SendUserMessage — 推送文字简报                   │   │
│  │  SendUserFile    — 推送文件                       │   │
│  │  PushNotification — 推送到手机/设备               │   │
│  └──────────────────────────────────────────────────┘   │
│          ↓                                               │
│  ┌─ 记忆层 ─────────────────────────────────────────┐   │
│  │  Daily Log — 每天的工作日志                       │   │
│  │  Dream     — 空闲时巩固成长期记忆                 │   │
│  │  MEMORY.md — 跨 session 的知识库                  │   │
│  └──────────────────────────────────────────────────┘   │
│          ↓                                               │
│  ┌─ 查看层 ─────────────────────────────────────────┐   │
│  │  Remote Viewer — 任意终端实时连入查看和交互        │   │
│  │  Brief 模式   — chat 视图只看简报 / transcript    │   │
│  │                  视图看完整过程                    │   │
│  └──────────────────────────────────────────────────┘   │
│                                                          │
└─────────────────────────────────────────────────────────┘

1.3 一个具体场景

假设你是一个团队 lead,KAIROS 模式下的 Claude Code 可以这样工作:

早上 9:00 — cron 定时任务触发,Agent 自动检查过夜的 GitHub PR,生成 review 摘要,通过 SendUserMessage 推送给你: "昨晚有 3 个 PR 需要关注:#142 改了数据库 schema(风险高),#143 是文档更新(可直接合),#145 有 CI 失败。"

上午 10:30 — 你在写代码,Agent 在后台收到 GitHub webhook:#142 的作者 push 了新 commit。Agent 自动 re-review,发现之前标记的问题已修复,推送通知:"#142 已修复之前的 schema 问题,建议合入。"

下午 2:00 — 没有外部事件。Agent 在 tick 巡逻中发现项目的 TODO 列表里有一个标记为"low priority"的 lint 配置优化。它自主决定执行,完成后推送简报。

晚上 11:00 — 你已经下班。Agent 触发 dream,把今天的工作日志总结成几条关键记忆,写入 MEMORY.md。明天的 session 会自动加载这些记忆。

第二天早上 — 你从家里的笔记本用 claude assistant 连入,看到 Agent 昨晚和今早的所有工作记录。

1.4 工程规模

这不是一个 prototype。KAIROS 是一个渗透到 Claude Code 75 个文件、175 处代码引用的系统级特性,配备了:

  • 6 个编译时 feature flag + 7 个运行时远程开关
  • 运维级别的远程热配置(5 分钟全量生效的 kill-switch)
  • 三重安全门控(编译 + 远程 + 本地信任)
  • 完整的 Datadog analytics 标记体系

二、当前状态

2.1 代码存在形式

KAIROS 的代码通过 feature('KAIROS') 编译时开关控制。在公开发布的 Claude Code 构建中,这个开关是 false,导致:

  • 所有 feature('KAIROS') ? require('./assistant/index.js') : null 被求值为 null
  • 对应的模块文件从 bundle 中被 tree-shake 删除
  • sourcemap 无法还原这些模块

结果:我们能看到所有的"调用点"(知道 KAIROS 会做什么),但看不到"实现"(不知道它怎么做)。

2.2 可见 vs 不可见

类别 状态 说明
调用点(175 处) 可见 散布在 75 个文件中的 feature('KAIROS') 分支
类型签名 可见 kairosActive: boolean、kairosEnabled: boolean 等
GrowthBook 配置名 可见 tengu_kairos、tengu_kairos_cron 等
CLI flag 可见 --assistant、--brief、--channels
src/assistant/index.js 不可见 主入口,被 tree-shake
src/assistant/gate.js 不可见 门控逻辑,被 tree-shake
src/proactive/ 不可见 整个 proactive 模块,被 tree-shake
专属工具实现 不可见 SendUserFile、PushNotification、SubscribePR、Monitor

2.3 发布状态

KAIROS 处于 内部灰度阶段,证据:

  1. --assistant flag 被 .hideHelp() 隐藏,不出现在帮助文档中
  2. 激活需要三重门控:编译开关 + GrowthBook 远程 gate + 目录 trust dialog
  3. 代码注释中有 TODO(public-ship) 标记,说明有明确的公开发布待办清单
  4. 运维级别的远程 kill-switch(5 分钟内全量生效),说明已在小范围内部使用

三、Feature Flag 体系

KAIROS 不是单一开关,而是一个 flag 家族,可以独立控制各子功能的发布:

3.1 编译时 Flag(dead code elimination)

Flag 控制范围
KAIROS 主开关:assistant mode 全部功能
KAIROS_BRIEF Brief 通信(SendUserMessage 工具)
KAIROS_CHANNELS MCP Channel 消息推送
KAIROS_DREAM Disk-skill dream(记忆巩固)
KAIROS_GITHUB_WEBHOOKS GitHub PR 订阅 webhook
KAIROS_PUSH_NOTIFICATION 推送通知工具
PROACTIVE Proactive 自主行动模式(可独立于 KAIROS)
AGENT_TRIGGERS Cron 定时任务(可独立于 KAIROS)

3.2 运行时 Gate(GrowthBook 远程控制)

Gate 名称 用途 刷新间隔
tengu_kairos 主 entitlement 门控 启动时检查
tengu_kairos_cron Cron 调度器开关 5 分钟
tengu_kairos_cron_durable 持久化 cron 开关 5 分钟
tengu_kairos_cron_config Cron jitter 调参 (JSON) 1 分钟
tengu_kairos_brief Brief 工具开关 5 分钟
tengu_kairos_brief_config Brief UI 配置 (JSON) 缓存
tengu_harbor Channel 通知网关 运行时

3.3 设计意图

这种分层控制的好处:

  1. 独立发布:KAIROS_BRIEF 可以单独开放给非 KAIROS 用户(事实上已经在做)
  2. 灰度控制:通过 GrowthBook 按用户/组织/比例灰度
  3. Incident 响应:运维可以在 5 分钟内远程关闭任何子功能
  4. 成本控制:Cron config 可以远程调整 jitter 参数,应对推理请求高峰

四、六大核心子系统

4.1 Proactive Mode — 自主行动循环

本质: 一个 tick 驱动的自主决策循环。

┌──────────────────────────────────────────────┐
│              Proactive Loop                   │
│                                               │
│  系统发送 <tick> ──→ Agent 收到心跳            │
│       ↑                    ↓                  │
│       │              有事做?──→ 执行工具调用   │
│       │                    ↓                  │
│       │              没事做?──→ 调用 SleepTool │
│       │                    ↓                  │
│       └──── 等待下一个 tick ←──┘              │
│                                               │
│  用户按 ESC → pauseProactive()               │
│  用户发消息 → 恢复 proactive                  │
│  Context 耗尽 → setContextBlocked(true)       │
└──────────────────────────────────────────────┘

关键设计:

  • <tick> 标签携带用户本地时间,Agent 用它判断时间(外部工具时间戳可能是不同时区)
  • Context 耗尽时自动阻止 tick 循环,避免 "tick → 报错 → tick → 报错" 的死循环
  • Coordinator mode(多 agent 编排)下禁用 proactive,避免和 delegation 指令冲突

System Prompt 注入:

# Proactive Mode

You are in proactive mode. Take initiative — explore, act, and make
progress without waiting for instructions.

You will receive periodic <tick> prompts. These are check-ins. Do
whatever seems most useful, or call Sleep if there's nothing to do.

激活方式:

  • --proactive CLI flag
  • CLAUDE_CODE_PROACTIVE=true 环境变量
  • KAIROS assistant mode 自动包含

4.2 Brief / SendUserMessage — Agent 向用户通信

本质: Agent 主动给用户发简报消息,而不是让用户翻看完整的工具调用日志。

双视图模式:

┌─ transcript 视图(默认)──────────────────────┐
│  [tool_use] Read file /src/main.ts            │
│  [tool_result] ... 200 lines ...              │
│  [tool_use] Edit file /src/main.ts            │
│  [tool_result] OK                             │
│  [assistant] 我已经修复了这个 bug...           │
│  [tool_use] SendUserMessage "修复完成..."      │
└───────────────────────────────────────────────┘

┌─ chat 视图(Brief 模式)─────────────────────┐
│                                               │
│  🤖 修复完成,main.ts 第 42 行的空指针已处理。 │
│                                               │
│  (所有工具调用细节被隐藏)                     │
└───────────────────────────────────────────────┘

关键设计:

  • defaultView setting 持久化用户偏好('chat' 或 'transcript')
  • dropTextInBriefTurns() — 当 turn 中有 SendUserMessage 时,自动隐藏冗余的 assistant text
  • Ctrl+Shift+B 快捷键切换视图
  • 非交互模式(--print)下自动禁用 Brief,避免污染 stdout

工具家族:

工具 功能
SendUserMessage 发送文字简报
SendUserFile 发送文件附件(带验证 + 上传)
PushNotificationTool 推送到用户设备

4.3 Cron 定时任务 — 计划执行

本质: Agent 可以创建、管理、执行定时任务。

架构特点(独立于 KAIROS):

  • AGENT_TRIGGERS flag 独立发布,不依赖 KAIROS 主开关
  • 三个工具:CronCreate / CronDelete / CronList
  • 存储:.claude/scheduled_tasks.json

Jitter 防雷设计(精细到可远程调参):

人类设定时任务喜欢取整(每小时的 :00 或 :30),如果全球用户的 cron 都在 :00 触发,会造成推理请求洪峰。KAIROS 的解决方案:

原始触发时间: 14:00:00
   ↓
oneShotMinuteMod: 30 → 只对 :00 和 :30 做 jitter
oneShotMaxMs: 90000  → 最多提前 90 秒
oneShotFloorMs: 0    → 最少提前 0 秒
   ↓
实际触发时间: 13:58:47(随机提前 73 秒)

运维可以在 incident 时热推送配置,1 分钟内全量生效。

执行模式:

  • 定时触发的任务作为后台 subagent 运行
  • 有独立的 abortController,ESC 杀不掉
  • 结果以 isMeta 标记的消息注入主循环
  • 被杀掉的任务在下次调度时自动重新触发

4.4 Channel 消息推送 — 外部事件驱动

本质: MCP Server 可以向 Agent 推送消息(inbound push),Agent 收到后自主决定如何响应。

外部事件
  │
  ▼
MCP Server 发送 notifications/claude/channel
  │
  ▼
消息包裹在 <channel> 标签中入队
  │
  ▼
SleepTool 轮询 hasCommandsInQueue()
  → 1 秒内检测到并唤醒 Agent
  │
  ▼
Agent 自主决定:
  → 调用 Channel 的 MCP 工具处理?
  → SendUserMessage 通知用户?
  → 两者都做?

权限控制(企业级):

  • 组织策略:policy?.channelsEnabled(admin 控制开关)
  • 白名单:allowedChannelPlugins(admin 控制哪些插件能推消息)
  • 用户级:--channels <servers...> 指定当前 session 接收哪些 channel
  • 开发模式:--dangerously-load-development-channels(绕过白名单,显示确认对话框)
  • 认证要求:必须 claude.ai OAuth(API Key 用户暂不支持)

4.5 记忆与 Dream — 长期记忆巩固

本质: 把 Agent 的每日工作记忆持久化,并定期巩固成长期知识。

日常运行                    夜间/空闲
────────                    ────────
每次有意义的操作             /dream skill 触发
  ↓                           ↓
追加到 daily log             读取近期日志
logs/YYYY/MM/DD.md            ↓
                            LLM 总结提炼
                              ↓
                            写入 MEMORY.md
                            (长期记忆)

与 AutoDream 的关系:

  • AutoDream 是普通模式的记忆巩固(多 session 后自动触发)
  • KAIROS 模式下 AutoDream 被禁用(isGateOpen() 返回 false)
  • 改用 disk-skill dream — 更结构化的"日志 → 巩固"模式
  • 原因:assistant 是长期运行的,需要更可控的记忆策略

4.6 Remote Viewer — 远程查看

本质: 用户可以从另一个终端连接到正在运行的 assistant session,实时查看进度并发送消息。

┌────────────────┐         ┌────────────────┐
│  Agent Daemon   │◄──WS──►│  Viewer Client  │
│  (远端运行)      │         │  (本地连接)      │
│                 │         │                 │
│  agentic loop   │  推送   │  只读流式显示    │
│  工具调用        │ ──────► │  AgentEvent     │
│  决策            │         │                 │
│                 │  POST   │  用户可以        │
│                 │ ◄────── │  发送消息        │
└────────────────┘         └────────────────┘

CLI 入口:

claude assistant              # 发现可用 session
claude assistant <sessionId>  # 连接到指定 session

关键行为:

  • Viewer 模式下 Ctrl+C/ESC 不会中断远程 Agent
  • 历史消息通过 API 分页懒加载(每页 100 条,滚动上翻时触发)
  • WebSocket 断线 60 秒内自动重连
  • 后台任务计数从 WebSocket 事件中推算(本地不维护 tasks 状态)

认证:

  • OAuth headers + anthropic-beta: ccr-byoc-2025-07-29
  • API endpoint: {BASE_URL}/v1/sessions/{sessionId}/events

五、激活流程

用户在 .claude/settings.json 设置 { assistant: true }
  │
  ▼
启动 Claude Code
  │
  ├─ 编译时检查:feature('KAIROS') == true?
  │    └─ false → KAIROS 代码已被 tree-shake,流程结束
  │
  ├─ 运行时检查:isAssistantMode()?
  │    ├─ settings.json 中 assistant: true?
  │    └─ GrowthBook tengu_kairos gate 命中?
  │         └─ 未命中 → 不激活
  │
  ├─ 信任检查:checkHasTrustDialogAccepted()?
  │    └─ 未通过 → 打印警告,不激活
  │         "Assistant mode disabled: directory is not trusted."
  │
  └─ 全部通过 →
       setKairosActive(true)
       options.brief = true          // 强制开启 Brief
       initializeAssistantTeam()     // 预建 in-process team
       appendSystemPrompt(addendum)  // 注入 assistant prompt
       workerType = 'claude_code_assistant'  // 标记 session 类型

特殊路径 — Agent SDK Daemon 模式:

claude --assistant  # 由 Agent SDK daemon 调用
  • 跳过 GrowthBook gate(daemon 已在外部完成 entitlement 检查)
  • 通过 markAssistantForced() 直接启用

六、安全设计

6.1 三重门控

层级 机制 谁控制
编译时 feature('KAIROS') Anthropic 构建管线
运行时 GrowthBook tengu_kairos Anthropic 远程配置
本地 Trust dialog 用户手动确认

6.2 Trust Dialog 的必要性

代码注释明确说明:

.claude/settings.json is attacker-controllable in untrusted clones.

场景:用户 clone 了一个恶意仓库,里面的 .claude/settings.json 写了 assistant: true。 如果没有 trust dialog,Claude Code 会自动进入 assistant mode 并执行 .claude/agents/assistant.md 中的指令。

6.3 远程 Kill-Switch

每个子功能都有独立的远程开关:

  • 翻转 tengu_kairos → 5 分钟内全量禁用 assistant mode
  • 翻转 tengu_kairos_cron → 5 分钟内停止所有定时任务
  • 翻转 tengu_kairos_brief → 5 分钟内禁用 Brief 工具
  • 推送 tengu_kairos_cron_config → 1 分钟内调整 cron jitter 参数

七、Analytics 标记

KAIROS session 在 Datadog 和内部 analytics 中的标识:

标记 值 用途
kairosActive true 区分 assistant vs 普通 session
is_assistant_mode true Datadog 维度
worker_type 'claude_code_assistant' Bridge session 类型
assistantActivationPath 字符串 记录激活路径(settings/flag/forced)

事件追踪:

事件 含义
tengu_brief_mode_enabled Brief 模式被激活
tengu_brief_mode_toggled 用户切换了 Brief 开关
tengu_brief_send Agent 调用了 SendUserMessage

八、与现有功能的关系

                    ┌─────────────────────────────┐
                    │       KAIROS (Assistant)      │
                    │                               │
    独立可发布 ──►  │  PROACTIVE    AGENT_TRIGGERS  │  ◄── 独立可发布
                    │  (tick loop)   (cron system)   │
                    │                               │
                    │  KAIROS_BRIEF  KAIROS_CHANNELS │
                    │  (Brief UI)    (MCP push)      │
                    │                               │
                    │  KAIROS_DREAM  KAIROS_WEBHOOKS │
                    │  (memory)      (GitHub PR)     │
                    │                               │
                    │  Remote Viewer  Team Context   │
                    └─────────────────────────────┘
                              │
                    依赖 Claude Code 基础设施:
                    ├── compact (context 管理)
                    ├── Agent SDK (LLM 调用)
                    ├── MCP (工具协议)
                    ├── GrowthBook (feature flag)
                    ├── OAuth (认证)
                    └── Bridge (session 管理)

PROACTIVE 和 AGENT_TRIGGERS 可以脱离 KAIROS 独立使用,代码注释明确说明:

AGENT_TRIGGERS is independently shippable from KAIROS — the cron module graph has zero imports into src/assistant/ and no feature('KAIROS') calls.

这意味着 Anthropic 可能会先单独开放 cron 定时任务给所有用户,然后再逐步开放完整的 assistant mode。


九、总结

KAIROS 不是一个"实验性 demo",而是一个工程成熟度极高的系统级特性:

  • 175 处代码引用,横跨 75 个文件
  • 6 个编译时 flag + 7 个运行时 gate 的精细灰度控制
  • 运维级别的远程热配置能力
  • 三重安全门控 + 企业级权限体系
  • 完整的 analytics 标记体系

它代表了 Anthropic 对 Claude Code 未来形态的战略定位: 从开发者命令行工具 → AI Agent 平台。

当前它在内部小范围使用,核心实现代码在公开构建中被完全排除。 从代码成熟度和运维基础设施的完备程度来看,公开发布可能已经不远。