Gateway
Protokol jembatan
Mengapa ini pernah ada
- Batas keamanan: bridge mengekspos daftar izin kecil, bukan seluruh permukaan API Gateway.
- Pairing + identitas node: penerimaan node dimiliki oleh Gateway dan dikaitkan ke token per node.
- UX penemuan: node dapat menemukan Gateway melalui Bonjour di LAN, atau terhubung langsung melalui tailnet.
- WS loopback: bidang kontrol WS penuh tetap lokal kecuali ditunnel melalui SSH.
Transport
- TCP, satu objek JSON per baris (JSONL).
- TLS opsional (ketika
bridge.tls.enabledbernilai true). - Port listener default historis adalah
18790(build saat ini tidak memulai bridge TCP).
Ketika TLS diaktifkan, catatan TXT penemuan menyertakan bridgeTls=1 ditambah
bridgeTlsSha256 sebagai petunjuk non-rahasia. Perhatikan bahwa catatan TXT
Bonjour/mDNS tidak diautentikasi; klien tidak boleh memperlakukan fingerprint yang
diiklankan sebagai pin otoritatif tanpa niat pengguna yang eksplisit atau verifikasi
out-of-band lainnya.
Handshake + pairing
- Klien mengirim
hellodengan metadata node + token (jika sudah dipairing). - Jika belum dipairing, Gateway membalas
error(NOT_PAIRED/UNAUTHORIZED). - Klien mengirim
pair-request. - Gateway menunggu persetujuan, lalu mengirim
pair-okdanhello-ok.
Secara historis, hello-ok mengembalikan serverName; permukaan Plugin yang dihosting kini
diiklankan melalui pluginSurfaceUrls. Canvas/A2UI menggunakan
pluginSurfaceUrls.canvas; alias usang canvasHostUrl bukan bagian dari
protokol yang telah direfaktor.
Frame
Klien → Gateway:
req/res: RPC Gateway terbatas cakupan (chat, sesi, konfigurasi, health, voicewake, skills.bins)event: sinyal node (transkrip suara, permintaan agen, berlangganan chat, siklus hidup exec)
Gateway → Klien:
invoke/invoke-res: perintah node (canvas.*,camera.*,screen.record,location.get,sms.send)event: pembaruan chat untuk sesi yang dilangganping/pong: keepalive
Penegakan daftar izin lama pernah berada di src/gateway/server-bridge.ts (dihapus).
Event siklus hidup exec
Node dapat memancarkan event exec.finished atau exec.denied untuk menampilkan aktivitas system.run.
Ini dipetakan ke event sistem di Gateway. (Node lama mungkin masih memancarkan exec.started.)
Kolom payload (semua opsional kecuali dinyatakan lain):
sessionKey(wajib): sesi agen yang akan menerima event sistem.runId: id exec unik untuk pengelompokan.command: string perintah mentah atau terformat.exitCode,timedOut,success,output: detail penyelesaian (hanya finished).reason: alasan penolakan (hanya denied).
Penggunaan tailnet historis
- Bind bridge ke IP tailnet:
bridge.bind: "tailnet"di~/.openclaw/openclaw.json(hanya historis;bridge.*tidak lagi valid). - Klien terhubung melalui nama MagicDNS atau IP tailnet.
- Bonjour tidak melintasi jaringan; gunakan host/port manual atau DNS-SD area luas bila diperlukan.
Versioning
Bridge adalah v1 implisit (tanpa negosiasi min/maks). Bagian ini hanya referensi historis; klien node/operator saat ini menggunakan WebSocket Protokol Gateway.