Gateway 프로토콜 (WebSocket)
Gateway WS 프로토콜은 OpenClaw 를 위한 단일 제어 플레인 + 노드 전송입니다. 모든 클라이언트 (CLI, 웹 UI, macOS 앱, iOS/Android 노드, 헤드리스 노드)는 WebSocket 으로 연결되며 핸드셰이크 시점에 자신의 역할전송
- WebSocket, JSON 페이로드를 담은 텍스트 프레임.
- 첫 번째 프레임은 반드시
connect요청이어야 합니다.
Handshake (연결)
Gateway → Client (사전 연결 챌린지):hello-ok 에는 다음도 포함됩니다:
Node 예시
프레이밍
- 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.readoperator.writeoperator.adminoperator.approvalsoperator.pairing
Caps/commands/permissions (node)
노드는 연결 시 기능 클레임을 선언합니다:caps: 상위 수준의 기능 카테고리.commands: 호출을 위한 명령 허용 목록.permissions: 세부 토글 (예:screen.record,camera.capture).
Presence
system-presence는 디바이스 식별자를 키로 하는 엔트리를 반환합니다.- Presence 엔트리는
deviceId,roles,scopes를 포함하므로, operator 와 node 로 동시에 연결되더라도 UI 가 디바이스당 단일 행을 표시할 수 있습니다.
Node 헬퍼 메서드
- 노드는 자동 허용 검사에 사용하기 위해 현재 스킬 실행 파일 목록을 가져오는
skills.bins를 호출할 수 있습니다.
Exec 승인
- exec 요청에 승인이 필요할 때, Gateway 는
exec.approval.requested를 브로드캐스트합니다. - Operator 클라이언트는
exec.approval.resolve를 호출하여 해결합니다 (operator.approvals범위 필요).
Versioning
PROTOCOL_VERSION는src/gateway/protocol/schema.ts에 존재합니다.- 클라이언트는
minProtocol+maxProtocol를 전송하며, 서버는 불일치를 거부합니다. - 스키마 + 모델은 TypeBox 정의로부터 생성됩니다:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Auth
OPENCLAW_GATEWAY_TOKEN(또는--token) 가 설정된 경우,connect.params.auth.token가 일치해야 하며 그렇지 않으면 소켓이 닫힙니다.- 페어링 후, Gateway(게이트웨이) 는 연결의 역할 + 범위에 스코프된 디바이스 토큰을 발급합니다. 이는
hello-ok.auth.deviceToken에 반환되며 이후 연결을 위해 클라이언트가 영구 저장해야 합니다. - 디바이스 토큰은
device.token.rotate및device.token.revoke를 통해 회전/폐기할 수 있습니다 (operator.pairing범위 필요).
디바이스 식별 + 페어링
- 노드는 키페어 지문에서 파생된 안정적인 디바이스 식별자 (
device.id) 를 포함해야 합니다. - Gateway 는 디바이스 + 역할별로 토큰을 발급합니다.
- 새로운 디바이스 ID 에 대해서는 로컬 자동 승인 기능이 활성화되지 않은 한 페어링 승인이 필요합니다.
- 로컬 연결에는 loopback 과 Gateway 호스트의 자체 tailnet 주소가 포함됩니다 (동일 호스트 tailnet 바인딩도 자동 승인될 수 있도록 하기 위함).
- 모든 WS 클라이언트는
connect동안 (operator + node)device식별자를 포함해야 합니다. 제어 UI 는gateway.controlUi.allowInsecureAuth이 활성화된 경우에 한해 이를 생략할 수 있습니다 (또는 비상용으로gateway.controlUi.dangerouslyDisableDeviceAuth). - 비로컬 연결은 서버가 제공한
connect.challengenonce 에 서명해야 합니다.
TLS + 핀닝
- WS 연결에 대해 TLS 가 지원됩니다.
- 클라이언트는 선택적으로 Gateway 인증서 지문을 핀닝할 수 있습니다
(
gateway.tls설정 및gateway.remote.tlsFingerprint또는 CLI--tls-fingerprint참조).
Scope
이 프로토콜은 전체 Gateway API (상태, 채널, 모델, 채팅, 에이전트, 세션, 노드, 승인 등) 를 노출합니다. 정확한 표면은src/gateway/protocol/schema.ts 에 있는 TypeBox 스키마로 정의됩니다.