Gateway protokolü (WebSocket)¶
Gateway (Ağ Geçidi) WS protokolü, OpenClaw için tek kontrol düzlemi + düğüm taşımasıdır. Tüm istemciler (CLI, web UI, macOS uygulaması, iOS/Android düğümleri, başsız düğümler) WebSocket üzerinden bağlanır ve el sıkışma sırasında rol + kapsam bildirir.
Taşıma¶
- WebSocket, JSON yükleri içeren metin çerçeveleri.
- İlk çerçeve mutlaka bir
connectisteği olmalıdır.
El sıkışma (bağlanma)¶
Gateway → İstemci (bağlantı öncesi meydan okuma):
{
"type": "event",
"event": "connect.challenge",
"payload": { "nonce": "…", "ts": 1737264000000 }
}
İstemci → Gateway:
{
"type": "req",
"id": "…",
"method": "connect",
"params": {
"minProtocol": 3,
"maxProtocol": 3,
"client": {
"id": "cli",
"version": "1.2.3",
"platform": "macos",
"mode": "operator"
},
"role": "operator",
"scopes": ["operator.read", "operator.write"],
"caps": [],
"commands": [],
"permissions": {},
"auth": { "token": "…" },
"locale": "en-US",
"userAgent": "openclaw-cli/1.2.3",
"device": {
"id": "device_fingerprint",
"publicKey": "…",
"signature": "…",
"signedAt": 1737264000000,
"nonce": "…"
}
}
}
Gateway → İstemci:
{
"type": "res",
"id": "…",
"ok": true,
"payload": { "type": "hello-ok", "protocol": 3, "policy": { "tickIntervalMs": 15000 } }
}
Bir cihaz belirteci verildiğinde, hello-ok ayrıca şunları içerir:
{
"auth": {
"deviceToken": "…",
"role": "operator",
"scopes": ["operator.read", "operator.write"]
}
}
Düğüm örneği¶
{
"type": "req",
"id": "…",
"method": "connect",
"params": {
"minProtocol": 3,
"maxProtocol": 3,
"client": {
"id": "ios-node",
"version": "1.2.3",
"platform": "ios",
"mode": "node"
},
"role": "node",
"scopes": [],
"caps": ["camera", "canvas", "screen", "location", "voice"],
"commands": ["camera.snap", "canvas.navigate", "screen.record", "location.get"],
"permissions": { "camera.capture": true, "screen.record": false },
"auth": { "token": "…" },
"locale": "en-US",
"userAgent": "openclaw-ios/1.2.3",
"device": {
"id": "device_fingerprint",
"publicKey": "…",
"signature": "…",
"signedAt": 1737264000000,
"nonce": "…"
}
}
}
Çerçeveleme¶
- İstek:
{type:"req", id, method, params} - Yanıt:
{type:"res", id, ok, payload|error} - Olay:
{type:"event", event, payload, seq?, stateVersion?}
Yan etkisi olan yöntemler idempotency anahtarları gerektirir (şemaya bakın).
Roller + kapsamlar¶
Roller¶
operator= kontrol düzlemi istemcisi (CLI/UI/otomasyon).node= yetenek ana makinesi (kamera/ekran/tuval/system.run).
Kapsamlar (operatör)¶
Yaygın kapsamlar:
operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairing
Yetenekler/komutlar/izinler (düğüm)¶
Düğümler, bağlantı sırasında yetenek taleplerini bildirir:
caps: üst düzey yetenek kategorileri.commands: çağırma için komut izin listesi.permissions: ayrıntılı anahtarlar (örn.screen.record,camera.capture).
Gateway (Ağ Geçidi) bunları talepler olarak ele alır ve sunucu tarafı izin listelerini uygular.
Varlık¶
system-presence, cihaz kimliğine göre anahtarlanmış girdiler döndürür.- Varlık girdileri
deviceId,rolesvescopesiçerir; böylece UI'lar, hem operatör hem de düğüm olarak bağlansa bile cihaz başına tek bir satır gösterebilir.
Düğüm yardımcı yöntemleri¶
- Düğümler, otomatik izin kontrolleri için mevcut skill yürütülebilirlerinin
listesini almak üzere
skills.binsçağrısını yapabilir.
Exec onayları¶
- Bir çalıştırma isteği onay gerektirdiğinde, gateway
exec.approval.requestedyayınlar. - Operatör istemciler,
operator.approvalskapsamını gerektirenexec.approval.resolveçağrısı ile çözer.
Sürümleme¶
PROTOCOL_VERSION,src/gateway/protocol/schema.tsiçinde bulunur.- İstemciler
minProtocol+maxProtocolgönderir; sunucu uyuşmazlıkları reddeder. - Şemalar + modeller TypeBox tanımlarından üretilir:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Kimlik doğrulama¶
OPENCLAW_GATEWAY_TOKEN(veya--token) ayarlanmışsa,connect.params.auth.tokeneşleşmelidir; aksi halde soket kapatılır.- Eşleştirmeden sonra Gateway (Ağ Geçidi), bağlantı rolü + kapsamlarına göre
kapsamlandırılmış bir cihaz belirteci verir. Bu,
hello-ok.auth.deviceTokeniçinde döndürülür ve gelecekteki bağlantılar için istemci tarafından kalıcı olarak saklanmalıdır. - Cihaz belirteçleri
device.token.rotatevedevice.token.revokeüzerinden döndürülebilir/iptal edilebilir (operator.pairingkapsamı gerektirir).
Cihaz kimliği + eşleştirme¶
- Düğümler, anahtar çifti parmak izinden türetilmiş kararlı bir cihaz kimliği
(
device.id) eklemelidir. - Gateway (Ağ Geçitleri), cihaz + rol başına belirteçler verir.
- Yerel otomatik onay etkin değilse, yeni cihaz kimlikleri için eşleştirme onayları gereklidir.
- Yerel bağlantılar loopback ve gateway ana makinesinin kendi tailnet adresini içerir (böylece aynı ana makinedeki tailnet bağları yine de otomatik onaylanabilir).
- Tüm WS istemcileri,
connectsırasındadevicekimliğini (operatör + düğüm) içermelidir. Kontrol UI'ı, yalnızcagateway.controlUi.allowInsecureAuthetkin olduğunda (veya acil durum kullanımı içingateway.controlUi.dangerouslyDisableDeviceAuth) bunu atlayabilir. - Yerel olmayan bağlantılar, sunucu tarafından sağlanan
connect.challengenonce'unu imzalamalıdır.
TLS + sabitleme¶
- WS bağlantıları için TLS desteklenir.
- İstemciler, isteğe bağlı olarak gateway sertifika parmak izini sabitleyebilir
(
gateway.tlsyapılandırması ile birliktegateway.remote.tlsFingerprintveya CLI--tls-fingerprint'ye bakın).
Kapsam¶
Bu protokol tam gateway API'sini (durum, kanallar, modeller, sohbet,
ajan, oturumlar, düğümler, onaylar vb.) açığa çıkarır. Kesin yüzey,
src/gateway/protocol/schema.ts içindeki TypeBox şemaları tarafından tanımlanır.