macOS IPC
OpenClaw アプリ、ゲートウェイノード転送、および PeekabooBridge の macOS IPC アーキテクチャ
''現在のモデル:''ローカル Unix ソケットが''ノードホストサービス''を''macOS アプリ''に接続し、実行承認 + ''system.run'' を行います。''openclaw-mac'' デバッグ CLI が発見/接続チェックのために存在します。エージェント操作は引き続きゲートウェイ WebSocket と ''node.invoke'' を通じて流れます。UI 自動化は PeekabooBridge を使用します。
Goals
- すべての TCC 対向作業(通知、画面録画、マイク、音声、AppleScript)を所有する単一の GUI アプリインスタンス。
- 自動化の小さな表面:ゲートウェイ + ノードコマンド、および UI 自動化のための PeekabooBridge。
- 予測可能な権限:常に同じ署名付きバンドル ID、launchd によって起動されるため、TCC の付与は維持されます。
仕組み
#
ゲートウェイ + ノード転送
- アプリはゲートウェイ(ローカルモード)を実行し、ノードとして接続します。
- エージェント操作は ''node.invoke'' を介して実行されます(例:''system.run''、''system.notify''、''canvas.*'')。
#
ノードサービス + アプリ IPC
- ヘッドレスノードホストサービスがゲートウェイ WebSocket に接続します。
- ''system.run'' リクエストはローカル Unix ソケット経由で macOS アプリに転送されます。
- アプリは UI コンテキストで実行を行い、必要に応じてプロンプトを表示し、出力を返します。
Diagram (SCI):
Agent -> Gateway -> Node Service (WS)
| IPC (UDS + token + HMAC + TTL)
v
Mac App (UI + TCC + system.run)#
PeekabooBridge (UI automation)
- UI 自動化は ''bridge.sock'' という名前の別の UNIX ソケットと PeekabooBridge JSON プロトコルを使用します。
- ホストの優先順序(クライアント側):Peekaboo.app → Claude.app → OpenClaw.app → ローカル実行。
- セキュリティ:ブリッジホストは許可された TeamID が必要です。DEBUG 専用の同じ UID のエスケープハッチは ''PEEKABOO_ALLOW_UNSIGNED_SOCKET_CLIENTS=1'' によって保護されています(Peekaboo 規約)。
- 詳細については、''PeekabooBridge の使用'' を参照してください。
運用フロー
- Restart/rebuild: ''SIGN_IDENTITY="Apple Development: <Developer Name> (<TEAMID>)" scripts/restart-mac.sh''
- 既存のインスタンスを終了
- Swift ビルド + パッケージ化
- LaunchAgent の書き込み/ブートストラップ/キックスタート
- 単一インスタンス:同じバンドル ID の別のインスタンスが実行されている場合、アプリは早期に終了します。
ハードニングの注意点
- すべての特権サーフェスで TeamID の一致を優先してください。
- PeekabooBridge:''PEEKABOO_ALLOW_UNSIGNED_SOCKET_CLIENTS=1''(DEBUG 専用)は、ローカル開発のために同じ UID の呼び出し元を許可する場合があります。
- すべての通信はローカルのみのままです。ネットワークソケットは公開されません。
- TCC プロンプトは GUI アプリバンドルからのみ発生します。再構築間で署名付きバンドル ID を安定させてください。
- IPC ハードニング:ソケットモード ''0600''、トークン、ピア UID チェック、HMAC チャレンジ/レスポンス、短い TTL。