Protokol bridge (transport node lama)
Mengapa ini pernah ada
- Batas keamanan: bridge mengekspos allowlist kecil, bukan seluruh permukaan API gateway.
- Pairing + identitas node: penerimaan node dimiliki oleh gateway dan terikat ke token per-node.
- UX discovery: node dapat menemukan gateway melalui Bonjour di LAN, atau terhubung langsung melalui tailnet.
- Loopback WS: control plane WS penuh tetap lokal kecuali ditunnelkan melalui SSH.
Transport
- TCP, satu objek JSON per baris (JSONL).
- TLS opsional (saat
bridge.tls.enabledbernilai true). - Port listener default historis adalah
18790(build saat ini tidak memulai bridge TCP).
bridgeTls=1 plus
bridgeTlsSha256 sebagai petunjuk non-secret. Perhatikan bahwa record TXT Bonjour/mDNS tidak
diautentikasi; klien tidak boleh memperlakukan fingerprint yang diiklankan sebagai
pin otoritatif tanpa niat eksplisit dari pengguna atau verifikasi out-of-band lainnya.
Handshake + pairing
- Klien mengirim
hellodengan metadata node + token (jika sudah paired). - Jika belum paired, gateway membalas
error(NOT_PAIRED/UNAUTHORIZED). - Klien mengirim
pair-request. - Gateway menunggu persetujuan, lalu mengirim
pair-okdanhello-ok.
hello-ok mengembalikan serverName dan dapat menyertakan
canvasHostUrl.
Frame
Klien → Gateway:req/res: RPC gateway bercakupan (chat, sessions, config, health, voicewake, skills.bins)event: sinyal node (transkrip suara, permintaan agen, subscribe chat, siklus hidup exec)
invoke/invoke-res: perintah node (canvas.*,camera.*,screen.record,location.get,sms.send)event: pembaruan chat untuk sesi yang disubscribeping/pong: keepalive
src/gateway/server-bridge.ts (sudah dihapus).
Event siklus hidup exec
Node dapat mengirim eventexec.finished atau exec.denied untuk menampilkan aktivitas system.run.
Event ini dipetakan ke event sistem di gateway. (Node lama mungkin masih mengirim exec.started.)
Field payload (semua opsional kecuali yang ditandai):
sessionKey(wajib): sesi agen yang akan menerima event sistem.runId: id exec unik untuk pengelompokan.command: string perintah mentah atau yang sudah diformat.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.