게이트웨이 프로토콜 (WebSocket)
게이트웨이 WebSocket 프로토콜은 OpenClaw의 단일 제어 플레인(control plane) + 노드 전송 수단입니다. 모든 클라이언트(CLI, 웹 UI, macOS 앱, iOS/Android 노드, 헤드리스 노드)는 WebSocket을 통해 연결하며, 핸드셰이크 시 역할(role) + 범위(scope) 를 선언합니다.전송 방식
- WebSocket, JSON 페이로드를 담은 텍스트 프레임.
- 첫 번째 프레임은 반드시
connect요청이어야 합니다.
핸드셰이크 (connect)
게이트웨이 → 클라이언트 (연결 전 챌린지):hello-ok에는 다음도 포함됩니다:
노드 예시
프레임 구조
- 요청(Request):
{type:"req", id, method, params} - 응답(Response):
{type:"res", id, ok, payload|error} - 이벤트(Event):
{type:"event", event, payload, seq?, stateVersion?}
역할 + 범위
역할
operator= 제어 플레인 클라이언트 (CLI/UI/자동화).node= 기능 호스트 (카메라/화면/캔버스/system.run).
범위 (operator)
주요 범위:operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairing
Caps/commands/permissions (node)
노드는 연결 시 기능 클레임(capability claims)을 선언합니다:caps: 상위 수준 기능 카테고리.commands: 호출 허용 명령 목록(allowlist).permissions: 세분화된 토글 (예:screen.record,camera.capture).
프레즌스(Presence)
system-presence는 디바이스 ID를 키로 하는 항목을 반환합니다.- 프레즌스 항목에는
deviceId,roles,scopes가 포함되어, 동일 디바이스가 operator와 node 양쪽으로 연결되더라도 UI에서 한 행으로 표시할 수 있습니다.
노드 헬퍼 메서드
- 노드는
skills.bins를 호출하여 자동 허용 검사를 위한 현재 스킬 실행 파일 목록을 가져올 수 있습니다.
Exec 승인
- exec 요청에 승인이 필요한 경우, 게이트웨이는
exec.approval.requested를 브로드캐스트합니다. - 운영자 클라이언트는
exec.approval.resolve를 호출하여 처리합니다 (operator.approvals범위 필요).
버전 관리
PROTOCOL_VERSION은src/gateway/protocol/schema.ts에 정의되어 있습니다.- 클라이언트는
minProtocol+maxProtocol을 전송하며, 서버는 불일치 시 거부합니다. - 스키마 + 모델은 TypeBox 정의로부터 생성됩니다:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
인증
OPENCLAW_GATEWAY_TOKEN(또는--token)이 설정된 경우,connect.params.auth.token이 일치해야 하며, 그렇지 않으면 소켓이 닫힙니다.- 페어링 후, 게이트웨이는 연결 역할 + 범위에 한정된 디바이스 토큰을 발급합니다.
이 토큰은
hello-ok.auth.deviceToken에 반환되며, 클라이언트는 이후 연결을 위해 저장해야 합니다. - 디바이스 토큰은
device.token.rotate및device.token.revoke를 통해 교체/폐기할 수 있습니다 (operator.pairing범위 필요).
디바이스 ID + 페어링
- 노드는 키페어 지문에서 파생된 안정적인 디바이스 ID(
device.id)를 포함해야 합니다. - 게이트웨이는 디바이스 + 역할 단위로 토큰을 발급합니다.
- 로컬 자동 승인이 활성화되지 않은 경우, 새 디바이스 ID에 대한 페어링 승인이 필요합니다.
- 로컬 연결에는 루프백과 게이트웨이 호스트 자체의 tailnet 주소가 포함됩니다 (동일 호스트 tailnet 바인드도 자동 승인 가능).
- 모든 WebSocket 클라이언트는
connect시deviceID를 포함해야 합니다 (operator + node). Control UI는 긴급 사용 시gateway.controlUi.dangerouslyDisableDeviceAuth가 활성화된 경우에만 생략할 수 있습니다. - 비로컬 연결은 서버가 제공한
connect.challengenonce에 서명해야 합니다.
TLS + 핀 고정
- WebSocket 연결에 TLS가 지원됩니다.
- 클라이언트는 선택적으로 게이트웨이 인증서 지문을 핀 고정할 수 있습니다
(
gateway.tls설정 및gateway.remote.tlsFingerprint또는 CLI--tls-fingerprint참조).
범위
이 프로토콜은 전체 게이트웨이 API (상태, 채널, 모델, 채팅, 에이전트, 세션, 노드, 승인 등)를 노출합니다. 정확한 표면은src/gateway/protocol/schema.ts의 TypeBox 스키마로 정의됩니다.