Claude Code 中的跨会话消息传递
从 v2.1.224 起,Mac 或 Linux 上的每一个交互式 Claude Code 会话在启动的那一刻就会绑定一个 Unix 套接字(我这台机器上位于 /tmp/cc-socks/38590.sock,权限仅限属主),您运行的任何其他会话都可以往里投递一条文本消息。1 支撑这项功能的是两个工具:ListAgents 负责发现哪些会话可达,SendMessage 负责按名称把消息送到其中一个。2 无需启用,无需配置。只要两个会话都运行在同一台机器上、版本不低于 v2.1.224,它们此刻就已经能对话了。
内容摘要
Claude Code 会话现在可以互发消息:在同一台机器上走本地套接字,全程不经过 Anthropic 的服务器;跨机器则通过 Remote Control 传递——首发版本只能回复,v2.1.225 起可以按名称主动发起对话。15 消息只承载纯文本,绝不会带上对话历史、文件或权限;接收方会话把它当作输入,而不是权柄:消息无法批准提示、无法修改配置、也无法执行命令。1 这项功能把一群各自为战的终端变得更像一支团队,而最见效的用法,恰恰是那些您过去只能手动搬运的协同信息:”迁移跑完了”“那个列我改名了”“main 现在可以放心 rebase”。最难察觉的陷阱是”悄无声息地失效”:四个彼此无关的隐私环境变量,任何一个都会静默关掉这项功能。3
发布了什么
v2.1.224 在 macOS 和 Linux 上加入了跨会话 SendMessage,并配套 ListAgents 发现能力;v2.1.225 进一步扩展,让会话也能主动向其他机器上的 Remote Control 会话发起对话——此前只能被动回复。45
有三个界面可以让您看清底层机制:
/list-agents(别名/peers)列出 Claude 能够触及的每一个会话:当前会话内部的子代理、您的其他本地会话(含后台会话),以及在 Remote Control 处于连接状态时,您在其他机器上和网页版 Claude Code 上的会话。1/status会显示一行Peer address,即本会话自己的收件套接字,前缀为uds:。1CLAUDE_CODE_MESSAGING_SOCKET会导出给每一个钩子和 Bash 命令,其值就是本会话自己的套接字路径。6 这一点的意义下文详述。
在我自己的机器上验证:一个运行 v2.1.226 的会话列出了两个对端会话,附带状态(”busy”)与存活时长;套接字文件的权限是 srw-------,即仅本用户可读可写——在多人共用的机器上,这就是那道边界。1
会话靠名字应答。可以用 /rename 或 --name 参数指定;否则 Claude Code 会依据工作目录自动生成一个,例如 myapp-3f。1 当两个会话重名时,列表会用工作目录和一段短标识把它们区分开。1
真正有意思的是信任模型
多数多代理系统都答不好的一个问题,Anthropic 的设计给出了答案:来自另一个代理的消息,究竟算什么?答案很明确:消息是信息,绝不是权柄。1
当会话 A 给会话 B 发消息时,有四条规则约束着送达的内容:1
- 它批准不了任何事。 B 里挂起的权限提示会无视 A 说的一切。只有您本人能回答提示。
- 它改不了配置。 接收方 Claude 被明确要求:绝不因为另一个会话开口,就去改动权限设置、
CLAUDE.md或任何配置。 - 命令以文本形式抵达。 消息正文里的
/compact只是四个字符的散文,绝不会被当成命令执行。 - 权限提示照常弹出。 如果依照消息行事需要 B 尚不具备的权限,您会看到与处理其他任务时一模一样的提示。
入站投递另有一道关口。每条抵达的消息最终落入三种结果之一——投递、待您批准、拒收——由 crossSessionInbound 设置控制(accept、hold、refuse)。1 如果您什么都不设,Claude Code 会依据两个会话的权限模式逐条判断,其默认逻辑相当漂亮:绕过权限提示的会话归为一类,其余归为另一类。会提示的会话可以自由接收消息,但会扣下来自绕过型会话的一切;绕过型会话则扣下一切,除非发件方同为绕过型。1 这种不对称是刻意为之:消息不得搭乘宽松会话的权柄——v2.1.222 已在 auto 模式下把这条原则用于出站,由权限分类器在派发前逐条审查,v2.1.224 则把它用到了入站。7
被扣下的消息会弹出一个批准对话框,显示发件方与内容预览;无人应答的对话框五分钟后过期(可用 dialogExpiry 调整),消息随之丢弃。1 同时最多只能扣下 100 条消息。1 还有两项控制可以进一步收紧:isolatePeerMachines: true 要求任何消息离开本机前都必须经您明确批准,即便处于 bypassPermissions 模式;而且只要任一设置层级取值为 true 便告生效,因此一个签入仓库的项目配置文件只能收紧、绝不能放宽。1 组织若要彻底关停这项功能,可在托管设置中对 SendMessage 和 ListAgents 加拒绝规则,并配上 crossSessionInbound: "refuse"。1
消息如何传输
对方会话跑在哪里,既决定了传输通道,也决定了您能发什么:1
| 目标 | 传输通道 | 可发送内容 |
|---|---|---|
| 同一台机器 | 每会话一个 Unix 套接字,绝不经过 Anthropic 服务器 | 新消息与回复 |
| 您的另一台机器 | 经 Anthropic 服务器,通过该机器的 Remote Control 连接送达 | 回复;自 v2.1.225 起也可发起新对话,前提是 Remote Control 处于连接状态5 |
| 网页版 Claude Code | 经 Anthropic 服务器直达云端会话 | 仅回复 |
有一处文档冲突值得指出:截至撰稿时,Anthropic 的跨会话消息文档页仍把所有跨机器消息描述为”仅能回复”,而 v2.1.225 的发布说明写的是 SendMessage“现在可以按名称向其他机器上的 Remote Control 会话发起对话”。发布说明更新,文档页滞后于版本。15
所谓”同一台机器”,判定依据其实是文件系统可见性:会话把自身注册进磁盘上的文件,因此只有能看到同一批文件的两个会话才能互相触及。容器内的会话与宿主机上的会话无法对话;同一容器内的两个会话则可以。1
投递会顺应接收方会话的节奏:处于活动回合时,消息在两次工具调用之间被读取,绝不会打断正在运行的工具;会话空闲时,消息会开启一个新回合。1 已投递的消息与您亲手输入的提示一样计入用量。1
值得搭建的五种模式
1. worktree 协同。 最显而易见的一种,官方文档的示例消息用的正是这个场景:在同一仓库的不同 worktree 中作业的会话,互相通报各自落地了什么。1 “Schema migration finished: the new column is tenant_id, and rebasing on main is safe now.” 就是文档给出的示例消息——这类更新若没有它,您就得先自己察觉,再切换终端,再重新敲一遍。如果几个会话共用一份检出而非各自的 worktree,这种协同消息的价值还会更高:”我马上要提交 content/guides/,别去暂存它”——这句话就能避开共用工作树的经典冲突:一个会话把另一个会话做了一半的活儿给提交了。
2. 观察者与执行者。 让一个监视会话盯着部署、测试套件或日志,一旦出事,立刻把消息发给负责修复的会话。接收方拿到的是作为上下文的发现,而不是命令;要不要动手、怎么动手,仍由它在自己的权限范围内决定。再把它与后台会话和通知钩子搭配起来,您就得到了一条升级链——只有在真该找人的时候,它才会终止于人。
3. 会汇报的长任务。 在一个会话里启动迁移或长测试,让它向您真正盯着的那个会话回报进展。1 状态不再困在某个您早已忘记的终端里。反过来也成立,从盯着的这一侧发问:”问问我另一个终端里的会话,迁移跑完没有”——这就是一句提示,发现、寻址、措辞都由 Claude 自己搞定。1
4. 无人值守的工作机群。 无头模式的 claude -p 会话同样会绑定收件套接字,因此长期运行的 -p 工作会话既能接收消息,也会出现在列表里。8 但有个坑:-p 会话没法弹出批准对话框,于是被扣下的消息就一直扣着,除非改设置或改模式,否则无路可投(v2.1.225 也修复了此类消息无声无息滞留、既无通知也无过期的问题)。要让一个工作会话在无人值守下接收消息,请在启动时把 crossSessionInbound: "accept" 写进它的 --settings 取值:这是一次针对单个工作会话的授权,而不是在用户设置里写个 accept、殃及您运行的每一个会话。8 bare 模式的会话则完全跳过套接字,始终不可达。8
5. 脚本化收件箱。 这是最被低估的一手:由于 CLAUDE_CODE_MESSAGING_SOCKET 会导出给钩子和 Bash 命令,脚本可以往会话自己的收件箱里投递。6 Claude Code 会校验”自家子进程”消息:当没有显式的 crossSessionInbound 生效时,钩子或命令回投给自身会话的消息会径直送达,无需任何周折。1 每晚的定时任务、一个 git 钩子、一层 CI 包装脚本——任何能往 Unix 套接字写数据的东西,现在都能往生成它的那个会话里注入一行上下文。在 Linux 上,即便投递进程已经退出,这套校验依然有效;在 macOS 上,只在进程仍存活时有效;如果在容器里 Claude Code 就是 PID 1,校验会失败,消息随即退回按常规入站规则处理。1 沙箱内的命令需要通过 sandbox.network.allowUnixSockets 放行套接字。1
它拒绝成为什么
这些限制都是设计决定,尊重它们,能让您少造一件错的东西。
不是批准通道。 信任模型里的每一条,都是为了防止一个会话去授权另一个会话的行动。凡是形如”会话 A 批准、会话 B 执行”的工作流,都是设计上被明令排除的。权柄永远经由人来传递。1
不是上下文搬运。 消息是一个 Claude 写给另一个 Claude 的文本,绝不是对话历史或文件。Anthropic 的文档说得很直白:要搬运一段对话,请改用恢复会话。1 做摘要,别倾倒。
不是代理团队。 相互独立的会话彼此发消息,属于点对点的场景。而由 Claude 生成并监管的协同团队(结构化协议消息、成员名册、共享任务状态)属于 agent teams 功能,结构化的团队消息刻意被限制在团队内部流转。1 如果您发现自己正打算在跨会话文本之上再设计一套消息协议,那您真正需要的是 agent teams。
不是聊天回路。 Claude Code 会对同一发件方的重复消息限速,丢弃短时间内到达的完全相同的重复消息,并把每个会话的未读已接收消息上限设为 50 条,因此两个会话之间的消息回路会因设计而自行饿死。1 请搭建”请求—响应”式的往返,而不是闲聊。
那些陷阱
隐私变量会悄悄关掉它。 跨会话消息依赖功能开关(feature flag)的评估,而 CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC、DISABLE_TELEMETRY、DO_NOT_TRACK、DISABLE_GROWTHBOOK 中的任何一个都可能关闭该评估,连带把消息功能一起拖下水——而且毫无提示。3 诊断办法是 /list-agents:如果这条命令根本不被识别,说明该会话压根没有这项功能;如果命令可用但发出去的消息始终不到,那问题范围就窄多了——一条拒绝规则、接收方的入站控制,或者一个只接受回复的跨机器目标。1
平台与供应商的缺口。 不原生支持 Windows(WSL 2 里的 Linux 可用)。在 Amazon Bedrock、AWS 上的 Claude Platform、Google Cloud 的 Agent Platform 以及 Microsoft Foundry 上均不可用。1
单向回复这个边角情形。 向另一台机器上的会话发出回复时,如果发件会话本身未连接 Remote Control,消息仍会送达,但不带回复地址,因此接收方无法回话。Claude 在发送时会被告知这一点;v2.1.225 的修复还收紧了寻址逻辑,确保已确认的跨机器收件方绝不会被悄悄替换成同名的本地会话。5
无头模式的扣留。 那个莫名其妙不理会消息的 -p 工作会话,八成就是消息被扣下了:没有对话框,也就没有投递。对那些应当接收消息的工作会话,请设置 crossSessionInbound: "accept"。8
要点回顾
日常 Claude Code 用户:
- 先跑一次 /list-agents,看看您的会话此刻已经能触及什么;用 /rename 给重要会话命名,寻址才干净利落。
- 用大白话下达发消息的指令(”告诉那个在做支付的会话我们改了什么”),消息本身交给 Claude 去写。1
自动化搭建者:
- 借助 CLAUDE_CODE_MESSAGING_SOCKET,从钩子和脚本往会话里投递消息;在 Linux 上,自家子进程的消息不必经历批准环节。16
- 给无人值守的 -p 工作会话在它自己的 --settings 里配上 crossSessionInbound: "accept",而不是全局配置。8
团队与安全审阅者:
- 这项功能自带的默认值是对的:消息不携带任何权柄,绕过型会话默认被隔离,isolatePeerMachines 加上托管设置的拒绝规则,给了您按机器和按组织两级的总开关。1
- 在断定消息功能坏了之前,请先审查那四个隐私环境变量;同时要知道,一个处于拒收状态的会话,在对端看来与常态没有任何可见差别。1
参考资料
-
Anthropic,“Message your other Claude Code sessions”,Claude Code 文档。访问于 2026年8月8日。 ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Anthropic,“Tools reference”,Claude Code 文档:
ListAgents与SendMessage条目。 ↩ -
Anthropic,“Environment variables”,Claude Code 文档:关于
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC、DISABLE_TELEMETRY、DO_NOT_TRACK与DISABLE_GROWTHBOOK的功能开关评估说明。 ↩↩ -
Anthropic,Claude Code v2.1.224 发布说明,2026年8月7日:”Added cross-session
SendMessage: Claude Code sessions can now message each other, on any of your machines, withListAgentsto discover them (macOS and Linux).” ↩ -
Anthropic,Claude Code v2.1.225 发布说明,发布于 2026年8月8日(UTC):”SendMessage can now start a conversation with your Remote Control sessions on other machines by name (
ListAgentsshows them asname [ref]), instead of only replying after they message you first.” 已确认的收件方绝不会被替换成同名的本地会话。 ↩↩↩↩↩ -
Anthropic,“Environment variables”,Claude Code 文档:
CLAUDE_CODE_MESSAGING_SOCKET,在任何钩子(包括SessionStart)运行之前导出。 ↩↩↩ -
Anthropic,Claude Code v2.1.222 发布说明,2026年8月4日:”Improved auto mode safety: messages sent to other agent sessions via
SendMessageare now evaluated by the permission classifier before dispatch.” 该分类器审查适用于 auto 模式(以及 plan 模式下由 auto 分类器审查命令的情形),并非全局生效。 ↩ -
Anthropic,“Headless mode”,Claude Code 文档,以及跨会话消息文档页中关于非交互式会话的章节:
-p会话会绑定收件套接字,bare 模式不会,被扣下的消息需要crossSessionInbound: "accept"才能在无人值守的情况下投递。 ↩↩↩↩↩