OpenClaw macOS Companion (메뉴 막대 + 게이트웨이 브로커)
macOS 앱은 OpenClaw의 메뉴 막대 동반 앱입니다. 권한을 소유하고, 로컬에서 게이트웨이를 관리/연결(launchd 또는 수동)하며, 에이전트에게 노드로서 macOS 기능을 노출합니다.기능
- 메뉴 막대에 네이티브 알림과 상태를 표시합니다.
- TCC 프롬프트(알림, 접근성, 화면 녹화, 마이크, 음성 인식, 자동화/AppleScript)를 소유합니다.
- 게이트웨이를 로컬 또는 원격으로 실행하거나 연결합니다.
- macOS 전용 도구(Canvas, Camera, Screen Recording,
system.run을 노출합니다). - 원격 모드에서 로컬 노드 호스트 서비스를 시작하고, 로컬 모드에서 중지합니다.
- UI 자동화를 위해 PeekabooBridge를 선택적으로 호스팅합니다.
- 요청 시 npm/pnpm을 통해 전역 CLI(
openclaw)를 설치합니다(Gateway 런타임에는 bun 권장되지 않음).
로컬 vs 원격 모드
- 로컬(기본값): 실행 중인 로컬 게이트웨이에 앱이 연결되고, 그렇지 않은 경우
openclaw gateway install을 통해 launchd 서비스를 활성화합니다. - 원격: 앱이 SSH/Tailscale을 통해 게이트웨이에 연결되며, 로컬 프로세스를 시작하지 않습니다. 앱이 로컬 노드 호스트 서비스를 시작하여 원격 게이트웨이가 이 Mac에 도달할 수 있습니다. 앱은 게이트웨이를 자식 프로세스로 스폰하지 않습니다.
Launchd 제어
앱은bot.molt.gateway 라벨의 사용자 별 LaunchAgent를 관리합니다(--profile/OPENCLAW_PROFILE 사용 시 bot.molt.<profile>; 이전 com.openclaw.*는 여전히 언로드됨).
bot.molt.<profile>로 교체하십시오.
LaunchAgent가 설치되어 있지 않으면, 앱에서 활성화하거나
openclaw gateway install을 실행합니다.
노드 기능 (mac)
macOS 앱은 노드로 자신을 나타냅니다. 일반적인 명령어:- Canvas:
canvas.present,canvas.navigate,canvas.eval,canvas.snapshot,canvas.a2ui.* - Camera:
camera.snap,camera.clip - Screen:
screen.record - System:
system.run,system.notify
permissions 맵을 보고하여 에이전트가 허용할 수 있는 항목을 결정할 수 있습니다.
노드 서비스 + 앱 IPC:
- 헤드리스 노드 호스트 서비스가 실행 중일 때(원격 모드), 게이트웨이 WS에 노드로 연결됩니다.
- 로컬 Unix 소켓을 통해 macOS 앱(UI/TCC 컨텍스트)에서
system.run이 실행됩니다; 프롬프트 + 출력은 앱 내에 유지됩니다.
실행 승인 (system.run)
system.run은 macOS 앱에서 실행 승인으로 제어됩니다(설정 → 실행 승인).
보안 + 요청 + 허용 목록은 Mac의 로컬에 저장됩니다:
allowlist항목들은 해석된 바이너리 경로의 glob 패턴입니다.- 프롬프트의 “항상 허용”을 선택하면 해당 명령어가 허용 목록에 추가됩니다.
system.run환경 오버라이드는 필터링되고 (PATH,DYLD_*,LD_*,NODE_OPTIONS,PYTHON*,PERL*,RUBYOPT를 드롭) 앱의 환경과 병합됩니다.
심층 링크
앱은 로컬 작업을 위한openclaw:// URL 스키마를 등록합니다.
openclaw://agent
게이트웨이 agent 요청을 트리거합니다.
message(필수)sessionKey(선택 사항)thinking(선택 사항)deliver/to/channel(선택 사항)timeoutSeconds(선택 사항)key(선택적 비감독 모드 키)
key가 없으면 앱은 확인을 요청합니다.key가 없으면 앱은 확인 프롬프트를 위해 짧은 메시지 제한을 강제하고deliver/to/channel을 무시합니다.- 유효한
key가 있으면 실행은 비감독 모드입니다(개인 자동화를 위해 의도됨).
온보딩 흐름 (일반적인)
- OpenClaw.app을 설치하고 실행합니다.
- 권한 체크리스트(TCC 프롬프트)를 완료합니다.
- 로컬 모드가 활성화되고 게이트웨이가 실행 중인지 확인합니다.
- 터미널 접근을 원하시면 CLI를 설치합니다.
빌드 & 개발 워크플로우 (네이티브)
cd apps/macos && swift buildswift run OpenClaw(또는 Xcode)- 앱 패키지:
scripts/package-mac-app.sh
게이트웨이 연결 디버그 (macOS CLI)
디버그 CLI를 사용하여 앱을 실행하지 않고도 macOS 앱이 사용하는 동일한 게이트웨이 WebSocket 핸드셰이크 및 검색 로직을 실행합니다.--url <ws://host:port>: 구성 무시--mode <local|remote>: 구성을 통해 확인 (기본값: 구성 또는 로컬)--probe: 새 건강 상태 프로브 강제--timeout <ms>: 요청 시간 초과 (기본값:15000)--json: 차등 출력을 위한 구조적 출력
--include-local: “로컬”로 필터링될 게이트웨이를 포함--timeout <ms>: 전체 검색 창 (기본값:2000)--json: 차등 출력을 위한 구조적 출력
dns-sd 기반 검색과 macOS 앱의 검색 파이프라인(NWBrowser + tailnet DNS‑SD 폴백)이 다른지 확인하려면 openclaw gateway discover --json과 비교하십시오.
원격 연결 배관 (SSH 터널)
macOS 앱이 원격 모드로 실행될 때 로컬 UI 컴포넌트가 원격 게이트웨이와 로컬호스트와 같이 통신할 수 있도록 SSH 터널을 엽니다.제어 터널 (게이트웨이 WebSocket 포트)
- 목적: 상태 확인, 상태, 웹 채팅, 구성 및 기타 제어 평면 호출
- 로컬 포트: 게이트웨이 포트 (기본값
18789), 항상 안정적 - 원격 포트: 원격 호스트의 동일한 게이트웨이 포트
- 동작: 임의의 로컬 포트 없음; 앱은 기존의 건강한 터널을 재사용하거나 필요 시 재시작합니다.
- SSH 형식:
ssh -N -L <local>:127.0.0.1:<remote>BatchMode + ExitOnForwardFailure + keepalive 옵션 포함 - IP 보고: SSH 터널은 루프백을 사용하므로 게이트웨이는 노드 IP를
127.0.0.1로 봅니다. 실제 클라이언트 IP가 표시되기를 원한다면 Direct (ws/wss) 전송을 사용하십시오 (macOS 원격 접속 참조).