UDS_INBOX / pipes
概述
UDS_INBOX 现在不是一个“空壳 flag”,而是一套已经落地的本机 IPC 能力。但它同时承载了两层不同目标,必须拆开理解:
- UDS peer messaging
- 面向任意 Claude Code 进程。
- 使用
src/utils/udsMessaging.ts和src/utils/udsClient.ts。 - 对外入口是
/peers和SendMessageTool的uds:<socket-path>地址。
- pipes control plane
- 面向交互式 REPL 会话之间的主从协作。
- 使用
src/utils/pipeTransport.ts、src/utils/pipeRegistry.ts和src/screens/REPL.tsx中的内联 bootstrap。 - 对外入口是
/pipes、/attach、/detach、/send、/pipe-status、/history、/claim-main。
/peers 解决“找到其他会话并发消息”,/pipes 解决“把一个 REPL 变成另一个 REPL 的受控 worker”。
为什么要有单独的 pipes
单独的 pipes 层有三个实际理由:
- 命名与角色模型不同
- UDS peer 层按
messagingSocketPath寻址。 - pipes 层按
cli-xxxxxxxx会话名、main/sub/master/slave角色和machineId注册表工作。
- UDS peer 层按
- 交互语义不同
- peer 层是通用消息投递。
- pipes 层需要 attach、detach、历史收集、选择性广播、状态栏和 REPL 快捷键。
- UI 集成不同
- peer 层主要服务工具调用。
- pipes 层直接影响 REPL 提交路径和 PromptInput 页脚。
SendMessageTool 的通用寻址和 REPL 的主从控制会互相污染,命令语义也会变得混乱。
当前通信模型
1. UDS peer messaging
- 服务端:
src/utils/udsMessaging.ts - 客户端:
src/utils/udsClient.ts - 发现方式:读取
~/.claude/sessions/*.json - 地址方式:
uds:<socket-path> - 传输方式:本机 Unix socket / Windows named pipe
2. pipes control plane
- 服务端/客户端:
src/utils/pipeTransport.ts - 注册表:
src/utils/pipeRegistry.ts - 生效入口:
src/screens/REPL.tsx - 发现方式:扫描
~/.claude/pipes/+registry.json - 会话名:
cli-${sessionId.slice(0, 8)} - 传输方式:本机 Unix socket / Windows named pipe
关于“局域网通信”的事实
当前实现不是真正的局域网传输。 代码里虽然保存了这些字段:localIphostnamemachineIdmac
- 注册表展示
- main/sub 身份判定
claim-main的机器级归属切换- 状态输出与排障信息
getPipePath(name) 返回的本机 socket 路径。
所以目前更准确的描述应该是:
pipes支持 本机多实例协作registry带有 机器身份元数据- 但 尚未实现跨机器局域网 transport
- TCP/WebSocket transport
- 认证与会话授权
- 发现与地址交换
- 超时、重连和安全边界
当前 REPL 行为
当前线上行为由src/screens/REPL.tsx 的内联实现负责:
- 启动时创建当前 REPL 的 pipe server
- 通过
pipeRegistry判定main/sub - 处理
attach_request/detach/prompt - 主实例心跳探测并维护
slaves /pipes打开状态栏并维护选择器- 提交普通消息时,仅向已连接的 selected pipes 广播
- 过去遗留了一套未接线的 hook 方案
- 当前已明确以
REPL.tsx内联 bootstrap 为唯一生效实现 - 选中但未连接的 pipe 不再导致本地处理被错误跳过
文档与代码对齐约定
后续关于UDS_INBOX / pipes 的说明应遵守以下表述:
- 默认称为“本机 IPC / 本机多实例协作”
- 不把
localIp/hostname元数据表述成已完成的 LAN transport - 明确区分
/peers和/pipes的两层职责 - 以
src/screens/REPL.tsx、src/utils/pipeTransport.ts、src/utils/pipeRegistry.ts为事实来源