OpenClaw macOS IPC 아키텍처
현재 모델: 로컬 Unix 소켓은 실행 승인 + system.run을 위해 노드 호스트 서비스를 macOS 앱에 연결합니다. 검색/연결 확인을 위한 openclaw-mac 디버그 CLI가 존재합니다. 에이전트 작업은 여전히 Gateway WebSocket 및 node.invoke를 통해 진행됩니다. UI 자동화는 PeekabooBridge를 사용합니다.
목표
- 모든 TCC 관련 작업(알림, 화면 녹화, 마이크, 음성, AppleScript)을 소유하는 단일 GUI 앱 인스턴스입니다.
- 자동화를 위한 작은 표면: 게이트웨이 + 노드 명령과 UI 자동화를 위한 PeekabooBridge.
- 예측 가능한 권한: 항상 동일한 서명된 번들 ID, launchd에 의해 시작되므로 TCC가 계속 부여합니다.
작동 방식
게이트웨이 + 노드 전송
- 앱은 게이트웨이(로컬 모드)를 실행하고 노드로 연결합니다.
- 에이전트 작업은
node.invoke(예:system.run,system.notify,canvas.*)를 통해 수행됩니다.
노드 서비스 + 앱 IPC
- 헤드리스 노드 호스트 서비스가 게이트웨이 WebSocket에 연결됩니다.
system.run요청은 로컬 Unix 소켓을 통해 macOS 앱으로 전달됩니다.- 앱이 UI 컨텍스트에서 실행을 수행하고, 필요한 경우 메시지를 표시하고, 출력을 반환합니다.
다이어그램(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가 필요합니다. 디버그 전용 동일한 UID 탈출구는
PEEKABOO_ALLOW_UNSIGNED_SOCKET_CLIENTS=1(Peekaboo 규칙)에 의해 보호됩니다. - 자세한 내용은 PeekabooBridge 사용법을 참조하세요.
작업 흐름
- 재시작/재구축:
SIGN_IDENTITY="Apple Development: <Developer Name> (<TEAMID>)" scripts/restart-mac.sh- 기존 인스턴스를 종료합니다.
- 신속한 빌드 + 패키지
- LaunchAgent 쓰기/부트스트랩/킥스타트
- 단일 인스턴스: 동일한 번들 ID를 가진 다른 인스턴스가 실행 중인 경우 앱이 일찍 종료됩니다.
강화 노트
- 모든 권한 있는 표면에 대해 TeamID 일치를 요구하는 것을 선호합니다.
- PeekabooBridge:
PEEKABOO_ALLOW_UNSIGNED_SOCKET_CLIENTS=1(DEBUG 전용)는 로컬 개발을 위해 동일한 UID 호출자를 허용할 수 있습니다. - 모든 통신은 로컬로만 이루어집니다. 네트워크 소켓은 노출되지 않습니다.
- TCC 프롬프트는 GUI 앱 번들에서만 발생합니다. 재빌드 시 서명된 번들 ID를 안정적으로 유지합니다.
- IPC 강화: 소켓 모드
0600, 토큰, 피어-UID 확인, HMAC 챌린지/응답, 짧은 TTL.