Appearance
OpenClaw macOS IPC 架构
当前模型: 本地 Unix socket 连接 Node 宿主服务与 macOS App,用于 exec 授权审批和 system.run。有一个 openclaw-mac 调试 CLI 用于发现和连接检查;Agent 操作仍通过 Gateway WebSocket 和 node.invoke 传递。UI 自动化使用 PeekabooBridge。
设计目标
- 单个 GUI App 实例统一处理所有需要 TCC 权限的工作(通知、录屏、麦克风、语音、AppleScript)。
- 自动化接口尽量精简:Gateway + node 指令,加上 PeekabooBridge 用于 UI 自动化。
- 权限可预测:始终使用同一个签名的 bundle ID,由 launchd 启动,TCC 授权可持续生效。
工作原理
Gateway + Node 传输
- App 运行 Gateway(本地模式)并作为 Node 连接到它。
- Agent 操作通过
node.invoke执行(如system.run、system.notify、canvas.*)。
Node 服务 + App IPC
- 无头 Node 宿主服务连接到 Gateway WebSocket。
system.run请求通过本地 Unix socket 转发到 macOS App。- App 在 UI 上下文中执行命令,必要时弹出授权提示,并返回输出结果。
架构图(SCI):
Agent -> Gateway -> Node Service (WS)
| IPC (UDS + token + HMAC + TTL)
v
Mac App (UI + TCC + system.run)PeekabooBridge(UI 自动化)
- UI 自动化使用独立的 UNIX socket(名为
bridge.sock)和 PeekabooBridge JSON 协议。 - 宿主优先级(客户端侧):Peekaboo.app → Claude.app → OpenClaw.app → 本地执行。
- 安全性:bridge 宿主要求已允许的 TeamID;仅调试模式下支持同 UID 的免验证通道,需设置
PEEKABOO_ALLOW_UNSIGNED_SOCKET_CLIENTS=1(遵循 Peekaboo 约定)。 - 详见:PeekabooBridge 使用说明。
操作流程
- 重启/重建:
SIGN_IDENTITY="Apple Development: <Developer Name> (<TEAMID>)" scripts/restart-mac.sh- 终止现有实例
- Swift 构建 + 打包
- 写入/引导/启动 LaunchAgent
- 单实例保证:如果相同 bundle ID 的另一个实例正在运行,App 会提前退出。
安全加固说明
- 对所有特权接口优先要求 TeamID 匹配。
- PeekabooBridge:
PEEKABOO_ALLOW_UNSIGNED_SOCKET_CLIENTS=1(仅调试模式)可允许同 UID 的调用者用于本地开发。 - 所有通信仅限本地;不暴露任何网络 socket。
- TCC 弹框仅来自 GUI App bundle;请保持签名 bundle ID 在重建时稳定。
- IPC 加固措施:socket 模式
0600、token、peer-UID 检查、HMAC 挑战/响应、短 TTL。