什么是跨会话消息
同时开着两个以上 Claude Code 终端窗口时,这一刻必然到来。你在左边窗口改了数据库表结构,右边窗口毫不知情,继续按旧结构写代码。于是你把左边的结论选中,粘贴到右边。人成了两个会话之间的快递员。
跨会话消息把这份快递工作交给会话自己。一个会话里的 Claude 把一段文字发给另一个会话里的 Claude。按官方文档的说法,消息是一个 Claude 写给另一个 Claude 的文本,而不是对话记录或文件。
常见的使用场景有三种。其一,一方发现破坏性变更或做出决定后,把这件事传给受影响的会话。其二,多个工作树并行处理同一仓库时,互相告知已合入的内容。其三,让迁移、测试这类长时间任务向你正在盯着的会话回报状态。
条件只有版本和操作系统两项。没有安装步骤,也没有配置文件里的开关。满足条件的会话已经启用。
| 环境 | 所需版本 | 备注 |
|---|---|---|
| macOS · Linux | 2.1.224 及以上 | 含 WSL 2 中的 Linux |
| 原生 Windows | 2.1.234 及以上 | 使用命名管道而非套接字 |
| 自己另一台机器上的会话 | 2.1.225 及以上 | 两端都需连接到 Remote Control |
| 空闲通知(notify_when_idle) | 2.1.236 及以上 | 两个会话都需达到该版本 |
claude --version
# 低于 2.1.224 则更新
claude update会话名称即地址 — /peers
人们最先想找的是「对方的地址怎么写」。答案是没有地址要写。会话名称就是地址,你不必手工处理 IP、端口或令牌。
在提示符里输入 /peers 即可查看,输入 /list-agents 效果相同。第一行是本会话自己的名称,也就是其他会话呼叫它时使用的名字。下面依次列出它能触达的对象:本会话内运行的子代理、本会话的团队成员、同一台机器上你的其他 Claude Code 会话,以及在连接 Remote Control 时你的云端会话和其他机器上的会话。
同机会话的名称旁会一并显示工作目录。当几个会话名字相近时,就靠这个目录分辨哪个属于哪个项目。
想自己定名称有两种方式:启动时加 claude -n research,或在已开启的对话中输入 /rename research。不设名称时,Claude Code 会依据工作目录自动生成一个。若同名的会话已经在运行,后来者会得到一个变体名称,并会告知你这件事。
有一点要留意:列表中不包含本会话自己。若 Claude 误把消息发往自己的名称,会被拒绝并被告知目标就是当前会话。
# 启动时
claude -n research
# 在已开启的对话中
/rename research
# 查看可触达的对象(等同 /list-agents)
/peers发送方式 — 用说的,不用自己调用工具
发送用的工具是 SendMessage,查找对象用的是 ListAgents。但你不必记住这两个名字,因为人从不直接调用它们。只要说出想让对方知道什么,Claude 就会找到目标并写好句子发出去。
措辞也不必由你决定。只说「把我们刚做的事解释给做支付 API 的那个会话」就够了,Claude 会自己写摘要。因此同一条指令说两次,发出去的句子每次都略有不同。
想指定对象时,在提示符里输入 @ 再加上名称开头的几个字母,正在运行的会话会以自动补全出现,选中后插入 @api-worker 这样的提及。这样 Claude 不必先列出会话就能直接发送。该自动补全需要 2.1.232 及以上版本。
Claude 也会自行判断后发送。即使你没有交代,只要它认为刚做的改动会破坏其他会话正在进行的工作,就会先去告知那一方。
问一下另一个终端里的会话,迁移跑完了没有
把我们刚做的事解释给做支付 API 的那个会话
告诉 @api-worker 表结构迁移已经完成接收方发生了什么,以及空闲通知
如果接收会话正忙会怎样?正在运行的工具不会被打断。接收方的 Claude 在两次工具调用之间读取消息。若该会话空闲,Claude Code 就以这条消息开启新一轮。无论哪种情况,消息都会带着发送方的会话名称留在对话里。
实际上用得最多的不是消息本身,而是空闲通知。说一句「迁移会话跑完了告诉我」,Claude 就会通过 SendMessage 的 notify_when_idle 参数挂上订阅。等那个会话下次进入空闲或退出时,通知恰好来一次。这里的空闲指的是队列中没有任何内容的情况下结束了一轮。
订阅的好处在于便宜。只挂订阅而不附带消息时,被观察的会话既不会开启新一轮,也不消耗令牌;若对方已经空闲,通知会立即送达。重要的是双方都不会反复试探对方 —— 这个功能就是为取代轮询而生的。
有三条限制。只送一次。只能对同一台机器上的会话使用。而且只有主对话中的 Claude 才能订阅,子代理或团队成员尝试时会被告知未建立订阅。若 12 小时内没有任何信号,订阅便会失效,并会如实告知 Claude。
什么会跨过去,什么不会

要安全地使用它,值得把边界看清楚一次。跨过去的只有纯文本。文件不会跟着走,累积的对话记录不会跟着走,权限也不会跟着走。接收会话只拿到那段文字,并不知道发送方读过什么、运行过什么。
所以想整体搬运上下文时,用的不是这个功能,而是恢复会话(claude --resume)。消息适用于「对方现在必须知道这个事实」的场合。
权限同样按会话各自独立。把在自己会话里被拒绝的操作交给旁边的会话去做,规则上是禁止的;而真正的强制落在接收方:来自其他会话的消息永远不能充当你的同意,接收方的 Claude 也被要求绝不因对方要求而修改 CLAUDE.md 或权限设置,正文里写上 /compact 之类的斜杠命令也只会作为纯文本抵达,不会执行。若消息要求的操作需要权限,仍会照常弹出与平时相同的确认框。
传输路径也因目的地而异。同一台机器内,通过每个会话各自绑定的 Unix 域套接字(原生 Windows 上是命名管道)直接送达,不经过服务器。发往你另一台机器或网页端的会话,则会经过 Anthropic 的服务器。若想完全阻止消息离开本机,可以开启 isolatePeerMachines,让每次外发都需要你批准。
| 项目 | 是否跨越 | 说明 |
|---|---|---|
| 消息正文 | 会 | 仅纯文本。结构化的团队协议消息只留在团队内部 |
| 文件、附件 | 不会 | 接收方须以自己的权限重新读取 |
| 对话记录 | 不会 | 要整体搬运请用 claude --resume |
| 权限、批准 | 不会 | 消息既不能充当批准,也不能修改设置 |
| 斜杠命令 | 不执行 | 正文里的 /compact 等以纯文本抵达 |
默认并非「等待批准」— 以及收不到时的排查

若「别的会话能对我的会话说话」让你不安,看清实际规则就能放心。crossSessionInbound 设置为接收方选定三种行为之一:accept 直接投递,hold 只显示提示而不投递,refuse 静默丢弃。除了改配置文件,也可以在 /config 的「来自你其他会话的消息」一行里选择。
常见的误解出在什么都不设置的情况。此时的默认并不是「一律等待批准」,而是比较两个会话的权限模式后逐条判断。若接收会话像平时那样会询问权限,消息就直接投递,只有当发送方声明自己跳过权限询问时才会转为等待批准。反之,若接收会话本身跳过权限询问,默认就是暂存,只有发送方同样跳过时才会投递。
批准框弹出后若你一直不回应,超过 dialogExpiry 期限时框会关闭并丢弃该消息,这个期限默认是五分钟。设为 never 则会一直等到会话结束。另外,因显式设置 hold 而暂存的消息不会过期,等到之后 accept 生效时会被投递。
最后是收不到时的排查顺序。若 /peers 本身无法识别,说明该会话没有这个功能,请先看 claude --version。若 /peers 可用但发出的消息没有抵达,原因就更具体了:SendMessage 或 ListAgents 上挂了拒绝规则;接收方的入站设置是暂存或拒绝;或者对方处在容器内这类不同的文件系统里。容器内的会话与宿主机上的会话彼此看不见,WSL 2 内的会话与同一台电脑上的原生 Windows 会话也是如此。
| crossSessionInbound | 接收方行为 |
|---|---|
| accept | 把抵达的消息原样投递给 Claude |
| hold | 只显示提示而不投递。之后 accept 生效时会释放 |
| refuse | 不投递,直接丢弃 |
| (未设置) | 比较两个会话的权限模式,逐条判断 |
# 1) 该会话是否具备此功能
claude --version # macOS/Linux 2.1.224+ / Windows 2.1.234+
/peers # 无法识别即表示没有该功能
# 2) 是否已绑定收件地址
/status # 查看 Peer address 一行
# 3) 接收方是否在阻拦(~/.claude/settings.json)
{ "crossSessionInbound": "accept" }