Skip to content

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.runsystem.notifycanvas.*)。

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。