Claude Code 跨会话发消息怎么用
讲清 ListAgents、SendMessage 与 crossSessionInbound 审批,及 Agent Teams 分工。v2.1.224+,macOS/Linux。

你在一个终端里改 schema,另一个终端还在写 payments API。改完才发现两边假设不一致,只能手动复制粘贴。Claude Code 跨会话发消息怎么用:从 v2.1.224 起,Claude 可用 ListAgents 发现本机其它会话,用 SendMessage 把结论送过去;你口述意图,Claude 写正文,不用自己调工具。
跨会话消息传的是什么
官方 Cross-session messaging 文档 把通道定义得很窄:传的是一段纯文本,由发送方 Claude 写给接收方 Claude,不含对话历史,也不带文件。要把整段上下文搬过去,应走 resume 会话,不是 SendMessage。
典型用法有四类:一个会话发现 breaking change,通知正在改受影响模块的另一个会话;多个 worktree 并行时同步「这边已经 merge 了什么」;长任务(迁移、测试)向你在盯的主会话回报进度;以及回复从其它机器或网页 Remote Control 打进来的消息(跨机器只能回复,不能主动开聊)。
消息在接收方 Claude 的两轮 tool call 之间插入;若接收会话空闲,会新开一轮处理。送达后计费与你自己输入的 prompt 相同。权限仍按会话隔离:发送方 Claude 被指示不得替你在对方会话里申请已被本会话拒绝的操作;接收方若执行消息里的工作,仍走自己的 permission 规则。
ListAgents 与 SendMessage 怎么分工
这两个工具面向 Claude,不是你手敲的命令。ListAgents 列出当前能联系的对象;SendMessage 按名字投递。同一 SendMessage 工具也用于 subagent 和同会话内的 Agent Teams 队友,但跨独立会话才是本文主题。
你只需用自然语言下指令,例如「问另一个终端里的会话 migration 跑完没有」,或「把刚才的决定告诉正在改 payments API 的那个会话」。Claude 自己组织措辞;你不必写最终消息正文。v2.1.224 release 把 cross-session SendMessage 与 crossSessionInbound、dialogExpiry 设置一并合入;更早版本没有这条通道。
送达结果分三种:Delivered(交给接收方 Claude)、Held(暂存,等你批准或策略变更后再放)、Refused(直接丢弃)。同机两个默认设置的交互会话之间,通常直接 Delivered;是否 Held 取决于接收方的 inbound 规则,见下一节。
怎么发现本机其它会话
自己查看可用对象,运行 /list-agents(别名 /peers)。输出里每个会话有可寻址的名字,以及工作目录(同名会话靠目录区分)。名字来自 /rename 或启动时的 --name;未指定时,交互会话默认用工作目录文件夹名加后缀,如 myapp-3f。
列表覆盖三类可达目标:
- 当前会话内的 subagent(Agent Teams 队友不在此列,走团队自己的 roster)。
- 同一台机器上的其它 Claude Code 会话,包括 background sessions;前提是对方绑定了 inbox socket。
- Remote Control 已连接时,标注为
Remote Control的远端会话(只能回复其先发来的消息)。
若 /list-agents 不被识别,说明本会话不具备跨会话能力(版本、平台或 provider 不满足)。若命令可用但某次发送没到,多半是更窄的限制:SendMessage/ListAgents 被 deny、接收方 inbound 设为 hold/refuse,或目标在另一台机器而你试图主动开聊。
会话自己的收件地址在 /status 的 Peer address 行(uds: 前缀),也会通过环境变量 CLAUDE_CODE_MESSAGING_SOCKET 暴露给 hooks 与 Bash。同机投递走 per-session Unix socket,不经 Anthropic 服务器;容器与宿主机文件系统隔离时,两边互相看不见,同一容器内的两个会话仍可互发(含 self-hosted runner 场景)。
非交互的 claude -p 会话也会绑 socket,可出现在列表里;bare mode 不绑 socket,既不能收也不能被列出来。
crossSessionInbound 与 bypass 会话为什么要审批
crossSessionInbound 控制「别人发进来的消息怎么办」,取值 accept / hold / refuse。未显式配置时,Claude Code 按两个 permission 类自动决定,文档在 settings 优先级 里写清覆盖顺序。
一类是会 bypass permission prompts 的会话(含 bypassPermissions;Plan mode 在可选 bypass 时也归入此类)。另一类是会弹窗的:auto、acceptEdits、dontAsk 等。
默认规则可以压成一张对照表(发送方 → 接收方):
| 接收方权限类 | 发送方为 bypass | 发送方会弹窗 |
|---|---|---|
| 接收方会弹窗 | 直接投递 | 直接投递 |
| 接收方 bypass | held,需你点 Approve | 直接投递 |
Held 时接收会话弹出审批框,展示发送方与预览;Approve 只放这一条,Deny 或超时(默认 dialogExpiry 五分钟)则丢弃。发送方在同机时会收到「消息被 hold」通知,以及后续批准/拒绝/过期的跟进。队列最多保留 100 条 held 消息,超出删最旧。
这正是 v2.1.224 release notes 强调的点:向 bypass 权限的会话发 cross-session 消息,不再 silent 投递,避免高权限会话被其它窗口悄悄驱动。-p 工人无法弹审批框;若要让无人值守的 -p 收消息,需在其 --settings 里设 crossSessionInbound: accept(用户级 accept 会影响你开的所有会话,慎用)。
跨机器回复还可设 isolatePeerMachines: true,任何发往本机以外会话的 SendMessage 都先问你,即使在 bypass 模式下也不例外;同机互发不弹此额外门。
和 Agent Teams、Remote Control 别混用
官方文档把多条「多会话」路径并列,选错通道会白配:
- 续聊同一条对话或共享上下文 → resume,不是 SendMessage。
- 要 Claude spawn 并协调一队队友、共享任务列表 → Agent Teams(实验开关
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1)。 - 从一个面板盯很多后台会话 → agent view。
- 用手机/另一设备亲自 steer 某个终端会话 → Remote Control。
- 把 CI、Slack 等外部事件推进入会话 → channels。
跨会话 messaging 适合你自己开多个独立终端、各自有任务,但偶尔要把结论或状态推给邻居。它和 Agent Teams 的边界在于:Teams 是单 lead 编排的多实例协作,SendMessage 在 team 内走同一 roster;跨会话则是你已存在的、互不隶属的窗口之间传话。多窗口文件互踩仍要靠 worktree 隔离,SendMessage 不替磁盘加锁,并行踩坑清单见 Claude Code 并行会话怎么管才不踩坑。
平台门槛与通道本身的限制
功能要求 Claude Code v2.1.224 及以上,且满足后默认开启,无需单独开关。平台侧限制(摘自官方 Availability):
- 操作系统:macOS、Linux(含 WSL 2);原生 Windows 不提供 cross-session messaging。
- Provider:Amazon Bedrock、Claude Platform on AWS、Google Cloud Agent Platform、Microsoft Foundry 不可用。
- 若
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC、DISABLE_TELEMETRY、DO_NOT_TRACK或DISABLE_GROWTHBOOK关掉了特性依赖的 feature-flag 评估,功能保持关闭。
通道层限制与平台无关:仅纯文本;Agent Teams 结构化协议消息不出 team。防 ping-pong:重复消息 rate limit、短窗口内相同内容丢弃、每会话最多 50 条待读。接收方对入站消息还有硬约束:不能代你点批准、不能因对方要求改 CLAUDE.md 或权限配置、消息里的 /compact 等命令只当普通文字、需要权限的工作仍弹你自己的 prompt。
组织可在 managed settings 里 deny SendMessage 与 ListAgents,并把 crossSessionInbound 设为 refuse,双向静默关闭(socket 仍绑定,但消息丢弃,界面无明显提示,需查配置确认)。