OpenClaw macOS 동반 앱 (메뉴 바 + 게이트웨이 브로커)
macOS 앱은 OpenClaw의 메뉴 바 동반 앱입니다. 권한을 소유하고, 게이트웨이를 로컬에서 관리/연결하며 (launchd 또는 수동), macOS 기능을 노드로 에이전트에 노출합니다.
기능
- 메뉴 바에 기본 알림 및 상태를 표시합니다.
- TCC 프롬프트를 소유합니다 (알림, 접근성, 화면 녹화, 마이크, 음성 인식, 자동화/AppleScript).
- 게이트웨이를 실행하거나 연결합니다 (로컬 또는 원격).
- macOS 전용 도구를 노출합니다 (Canvas, 카메라, 화면 녹화,
system.run). - 원격 모드에서 로컬 노드 호스트 서비스를 시작하고 (launchd), 로컬 모드에서 중지합니다.
- 선택적으로 UI 자동화를 위한 PeekabooBridge를 호스팅합니다.
- 요청 시 npm, pnpm, 또는 bun을 통해 전역 CLI (
openclaw)를 설치합니다 (앱은 npm을 먼저 선호하고, 그 다음 pnpm, 그 다음 bun; Node는 권장 게이트웨이 런타임으로 유지됨).
로컬 vs 원격 모드
- 로컬 (기본값): 앱이 실행 중인 로컬 게이트웨이에 연결합니다. 없으면
openclaw gateway install을 통해 launchd 서비스를 활성화합니다. - 원격: 앱이 SSH/Tailscale을 통해 게이트웨이에 연결하고 로컬 프로세스를 시작하지 않습니다. 앱은 로컬 노드 호스트 서비스를 시작하여 원격 게이트웨이가 이 Mac에 도달할 수 있도록 합니다. 앱은 게이트웨이를 자식 프로세스로 생성하지 않습니다. 게이트웨이 검색은 이제 원시 tailnet IP보다 Tailscale MagicDNS 이름을 선호하므로 tailnet IP가 변경될 때 Mac 앱이 더 안정적으로 복구됩니다.
Launchd 제어
앱은 ai.openclaw.gateway로 레이블된 사용자별 LaunchAgent를 관리합니다 (--profile/OPENCLAW_PROFILE 사용 시 ai.openclaw.<profile>; 레거시 com.openclaw.*는 여전히 언로드됨).
launchctl kickstart -k gui/$UID/ai.openclaw.gateway
launchctl bootout gui/$UID/ai.openclaw.gateway명명된 프로필 실행 시 레이블을 ai.openclaw.<profile>로 교체하십시오.
LaunchAgent가 설치되지 않은 경우 앱에서 활성화하거나 openclaw gateway install을 실행하십시오.
노드 기능 (mac)
macOS 앱은 자신을 노드로 표시합니다. 일반적인 명령:
- Canvas:
canvas.present,canvas.navigate,canvas.eval,canvas.snapshot,canvas.a2ui.* - 카메라:
camera.snap,camera.clip - 화면:
screen.record - 시스템:
system.run,system.notify
노드는 에이전트가 허용된 내용을 결정할 수 있도록 permissions 맵을 보고합니다.
노드 서비스 + 앱 IPC:
- 헤드리스 노드 호스트 서비스가 실행 중인 경우 (원격 모드), 게이트웨이 WS에 노드로 연결합니다.
system.run은 로컬 Unix 소켓을 통해 macOS 앱 (UI/TCC 컨텍스트)에서 실행됩니다. 프롬프트 + 출력은 앱 내에 유지됩니다.
다이어그램 (SCI):
Gateway -> Node Service (WS)
| IPC (UDS + token + HMAC + TTL)
v
Mac App (UI + TCC + system.run)실행 승인 (system.run)
system.run은 macOS 앱의 Exec approvals (설정 → Exec approvals)로 제어됩니다. 보안 + 요청 + 허용 목록은 Mac의 로컬에 저장됩니다:
~/.openclaw/exec-approvals.json예시:
{
"version": 1,
"defaults": {
"security": "deny",
"ask": "on-miss"
},
"agents": {
"main": {
"security": "allowlist",
"ask": "on-miss",
"allowlist": [{ "pattern": "/opt/homebrew/bin/rg" }]
}
}
}참고:
allowlist항목은 확인된 바이너리 경로에 대한 글로브 패턴입니다.- 쉘 제어 또는 확장 구문 (
&&,||,;,|,`,$,<,>,(,))이 포함된 원시 쉘 명령 텍스트는 허용 목록 미스로 처리되며 명시적인 승인 (또는 쉘 바이너리 허용 목록)이 필요합니다. - 프롬프트에서 "항상 허용"을 선택하면 해당 명령이 허용 목록에 추가됩니다.
system.run환경 재정의는 필터링되며 (PATH,DYLD_*,LD_*,NODE_OPTIONS,PYTHON*,PERL*,RUBYOPT,SHELLOPTS,PS4삭제) 앱 환경과 병합됩니다.- 쉘 래퍼 (
bash|sh|zsh ... -c/-lc)의 경우 요청 범위 환경 재정의는 작은 명시적 허용 목록 (TERM,LANG,LC_*,COLORTERM,NO_COLOR,FORCE_COLOR)으로 축소됩니다. - 허용 목록 모드에서 항상 허용 결정의 경우 알려진 디스패치 래퍼 (
env,nice,nohup,stdbuf,timeout)는 래퍼 경로 대신 내부 실행 파일 경로를 유지합니다. 래핑 해제가 안전하지 않은 경우 허용 목록 항목이 자동으로 유지되지 않습니다.
딥 링크
앱은 로컬 작업을 위해 openclaw:// URL 스킴을 등록합니다.
openclaw://agent
게이트웨이 agent 요청을 트리거합니다.
open 'openclaw://agent?message=Hello%20from%20deep%20link'쿼리 매개변수:
message(필수)sessionKey(선택 사항)thinking(선택 사항)deliver/to/channel(선택 사항)timeoutSeconds(선택 사항)key(선택 사항 무인 모드 키)
보안:
key없이는 앱이 확인을 위한 프롬프트를 표시합니다.key없이는 앱이 확인 프롬프트에 대한 짧은 메시지 제한을 적용하고deliver/to/channel을 무시합니다.- 유효한
key가 있으면 실행이 무인으로 이루어집니다 (개인 자동화용).
온보딩 흐름 (일반적)
- OpenClaw.app을 설치하고 시작합니다.
- 권한 체크리스트를 완료합니다 (TCC 프롬프트).
- 로컬 모드가 활성화되어 있고 게이트웨이가 실행 중인지 확인합니다.
- 터미널 접근을 원하면 CLI를 설치합니다.
상태 디렉터리 배치 (macOS)
OpenClaw 상태 디렉터리를 iCloud 또는 다른 클라우드 동기화 폴더에 두지 마십시오. 동기화 지원 경로는 세션 및 자격 증명에 대한 파일 잠금/동기화 경쟁을 가끔 발생시키고 지연을 추가할 수 있습니다.
다음과 같은 로컬 비동기화 상태 경로를 선호합니다:
OPENCLAW_STATE_DIR=~/.openclawopenclaw doctor가 다음 경로 아래 상태를 감지하면:
~/Library/Mobile Documents/com~apple~CloudDocs/...~/Library/CloudStorage/...
경고를 표시하고 로컬 경로로 다시 이동할 것을 권장합니다.
빌드 및 개발 워크플로 (네이티브)
cd apps/macos && swift buildswift run OpenClaw(또는 Xcode)- 앱 패키지:
scripts/package-mac-app.sh
게이트웨이 연결 디버깅 (macOS CLI)
앱을 시작하지 않고 macOS 앱이 사용하는 동일한 게이트웨이 WebSocket 핸드셰이크 및 검색 로직을 실행하려면 디버그 CLI를 사용하십시오.
cd apps/macos
swift run openclaw-mac connect --json
swift run openclaw-mac discover --timeout 3000 --json연결 옵션:
--url <ws://host:port>: 구성 재정의--mode <local|remote>: 구성에서 확인 (기본값: 구성 또는 로컬)--probe: 새로운 상태 프로브 강제--timeout <ms>: 요청 타임아웃 (기본값:15000)--json: 비교를 위한 구조화된 출력
검색 옵션:
--include-local: "로컬"로 필터링될 게이트웨이 포함--timeout <ms>: 전체 검색 창 (기본값:2000)--json: 비교를 위한 구조화된 출력
팁: openclaw gateway discover --json과 비교하여 macOS 앱의 검색 파이프라인 (local.과 구성된 광역 도메인, 광역 및 Tailscale Serve 대체)이 Node CLI의 dns-sd 기반 검색과 다른지 확인하십시오.
원격 연결 배관 (SSH 터널)
macOS 앱이 원격 모드로 실행되면 로컬 UI 구성 요소가 로컬호스트에 있는 것처럼 원격 게이트웨이와 통신할 수 있도록 SSH 터널을 엽니다.
제어 터널 (게이트웨이 WebSocket 포트)
- 목적: 상태 확인, 상태, Web Chat, 구성, 기타 제어 플레인 호출.
- 로컬 포트: 게이트웨이 포트 (기본값
18789), 항상 안정적. - 원격 포트: 원격 호스트의 동일 게이트웨이 포트.
- 동작: 임의의 로컬 포트 없음; 앱은 기존의 정상 터널을 재사용하거나 필요한 경우 재시작합니다.
- SSH 형태: BatchMode + ExitOnForwardFailure + keepalive 옵션이 있는
ssh -N -L <local>:127.0.0.1:<remote>. - IP 보고: SSH 터널은 루프백을 사용하므로 게이트웨이는 노드 IP를
127.0.0.1로 봅니다. 실제 클라이언트 IP가 표시되도록 하려면 직접 (ws/wss) 전송을 사용하십시오 (macOS 원격 접근 참조).
설정 단계는 macOS 원격 접근을 참조하십시오. 프로토콜 세부 사항은 게이트웨이 프로토콜을 참조하십시오.