OpenClaw macOS IPC アーキテクチャ

現在のモデル: ローカル Unix ソケットが node host servicemacOS アプリ に接続し、exec 承認と system.run を処理します。openclaw-mac デバッグ CLI が検出/接続チェック用に存在します。エージェントアクションは引き続き Gateway WebSocket と node.invoke を通じて流れます。UI 自動化は PeekabooBridge を使用します。

目標

  • すべての TCC 関連作業(通知、画面録画、マイク、音声、AppleScript)を所有する単一 GUI アプリインスタンス。
  • 自動化のための小さなサーフェス: Gateway + node コマンド、および UI 自動化のための PeekabooBridge。
  • 予測可能な権限: 常に同じ署名済みバンドル ID で、launchd によって起動されるため、TCC 許可が維持されます。

動作方法

Gateway + node トランスポート

  • アプリは Gateway(ローカルモード)を実行し、ノードとして接続します。
  • エージェントアクションは node.invoke 経由で実行されます(例: system.runsystem.notifycanvas.*)。

Node service + app IPC

  • ヘッドレス node host service が Gateway WebSocket に接続します。
  • system.run リクエストはローカル Unix ソケットを介して macOS アプリに転送されます。
  • アプリは UI コンテキストで exec を実行し、必要に応じてプロンプトを表示し、出力を返します。

図(SCI):

Agent -> Gateway -> Node Service (WS)
                      |  IPC (UDS + token + HMAC + TTL)
                      v
                  Mac App (UI + TCC + system.run)

PeekabooBridge(UI 自動化)

  • UI 自動化は、bridge.sock という名前の別の UNIX ソケットと PeekabooBridge JSON プロトコルを使用します。
  • ホストの優先順位(クライアント側): Peekaboo.app → Claude.app → OpenClaw.app → ローカル実行。
  • セキュリティ: ブリッジホストは許可された TeamID を要求します。DEBUG のみの same-UID エスケープハッチは PEEKABOO_ALLOW_UNSIGNED_SOCKET_CLIENTS=1(Peekaboo 規約)によって保護されています。
  • 参照: PeekabooBridge の使用方法 の詳細。

運用フロー

  • 再起動/リビルド: SIGN_IDENTITY="Apple Development: <Developer Name> (<TEAMID>)" scripts/restart-mac.sh
    • 既存のインスタンスを終了
    • Swift ビルド + パッケージ
    • LaunchAgent の書き込み/ブートストラップ/キックスタート
  • 単一インスタンス: 同じバンドル ID の別のインスタンスが実行中の場合、アプリは早期に終了します。

ハードニングノート

  • すべての特権サーフェスに TeamID マッチを要求することを優先します。
  • PeekabooBridge: PEEKABOO_ALLOW_UNSIGNED_SOCKET_CLIENTS=1(DEBUG のみ)は、ローカル開発のために same-UID 呼び出し元を許可する場合があります。
  • すべての通信はローカルのみのまま。ネットワークソケットは公開されません。
  • TCC プロンプトは GUI アプリバンドルからのみ発生します。リビルド間で署名済みバンドル ID を安定させます。
  • IPC ハードニング: ソケットモード 0600、トークン、peer-UID チェック、HMAC チャレンジ/レスポンス、短い TTL。