Arsitektur gateway
Gambaran umum
- Satu Gateway jangka panjang memiliki semua permukaan perpesanan (WhatsApp melalui Baileys, Telegram melalui grammY, Slack, Discord, Signal, iMessage, WebChat).
- Klien control-plane (app macOS, CLI, UI web, automasi) terhubung ke
Gateway melalui WebSocket pada host bind yang dikonfigurasi (default
127.0.0.1:18789). - Node (macOS/iOS/Android/headless) juga terhubung melalui WebSocket, tetapi
mendeklarasikan
role: nodedengan kapabilitas/perintah yang eksplisit. - Satu Gateway per host; ini adalah satu-satunya tempat yang membuka sesi WhatsApp.
- Canvas host disajikan oleh server HTTP Gateway di bawah:
/__openclaw__/canvas/(HTML/CSS/JS yang dapat diedit agen)/__openclaw__/a2ui/(host A2UI) Ini menggunakan port yang sama dengan Gateway (default18789).
Komponen dan alur
Gateway (daemon)
- Memelihara koneksi penyedia.
- Mengekspos API WS bertipe (permintaan, respons, event server-push).
- Memvalidasi frame masuk terhadap JSON Schema.
- Menghasilkan event seperti
agent,chat,presence,health,heartbeat,cron.
Klien (app mac / CLI / admin web)
- Satu koneksi WS per klien.
- Mengirim permintaan (
health,status,send,agent,system-presence). - Berlangganan ke event (
tick,agent,presence,shutdown).
Node (macOS / iOS / Android / headless)
- Terhubung ke server WS yang sama dengan
role: node. - Menyediakan identitas perangkat di
connect; pairing bersifat berbasis perangkat (rolenode) dan persetujuan disimpan di penyimpanan pairing perangkat. - Mengekspos perintah seperti
canvas.*,camera.*,screen.record,location.get.
WebChat
- UI statis yang menggunakan API WS Gateway untuk riwayat chat dan pengiriman.
- Dalam penyiapan jarak jauh, terhubung melalui tunnel SSH/Tailscale yang sama seperti klien lainnya.
Siklus hidup koneksi (satu klien)
Protokol wire (ringkasan)
- Transport: WebSocket, frame teks dengan payload JSON.
- Frame pertama harus
connect. - Setelah handshake:
- Permintaan:
{type:"req", id, method, params}→{type:"res", id, ok, payload|error} - Event:
{type:"event", event, payload, seq?, stateVersion?}
- Permintaan:
hello-ok.features.methods/eventsadalah metadata discovery, bukan dump terhasilkan dari setiap rute helper yang dapat dipanggil.- Auth shared-secret menggunakan
connect.params.auth.tokenatauconnect.params.auth.password, tergantung mode auth gateway yang dikonfigurasi. - Mode yang membawa identitas seperti Tailscale Serve
(
gateway.auth.allowTailscale: true) atau non-loopbackgateway.auth.mode: "trusted-proxy"memenuhi auth dari header permintaan alih-alihconnect.params.auth.*. - Private-ingress
gateway.auth.mode: "none"menonaktifkan auth shared-secret sepenuhnya; jangan gunakan mode itu pada ingress publik/tidak tepercaya. - Kunci idempotensi diperlukan untuk metode yang memiliki efek samping (
send,agent) agar aman untuk dicoba ulang; server menyimpan cache deduplikasi berumur pendek. - Node harus menyertakan
role: "node"beserta kapabilitas/perintah/izin diconnect.
Pairing + kepercayaan lokal
- Semua klien WS (operator + node) menyertakan identitas perangkat pada
connect. - ID perangkat baru memerlukan persetujuan pairing; Gateway mengeluarkan token perangkat untuk koneksi berikutnya.
- Koneksi local loopback langsung dapat disetujui otomatis agar UX host yang sama tetap lancar.
- OpenClaw juga memiliki jalur self-connect backend/container-local yang sempit untuk alur helper shared-secret tepercaya.
- Koneksi tailnet dan LAN, termasuk bind tailnet host yang sama, tetap memerlukan persetujuan pairing eksplisit.
- Semua koneksi harus menandatangani nonce
connect.challenge. - Payload tanda tangan
v3juga mengikatplatform+deviceFamily; gateway menyematkan metadata yang dipairkan saat reconnect dan memerlukan repair pairing untuk perubahan metadata. - Koneksi non-lokal tetap memerlukan persetujuan eksplisit.
- Auth gateway (
gateway.auth.*) tetap berlaku untuk semua koneksi, lokal maupun jarak jauh.
Pengetikan protokol dan codegen
- Skema TypeBox mendefinisikan protokol.
- JSON Schema dihasilkan dari skema tersebut.
- Model Swift dihasilkan dari JSON Schema.
Akses jarak jauh
- Disarankan: Tailscale atau VPN.
-
Alternatif: tunnel SSH
- Handshake + token auth yang sama berlaku melalui tunnel.
- TLS + pinning opsional dapat diaktifkan untuk WS dalam penyiapan jarak jauh.
Ringkasan operasional
- Mulai:
openclaw gateway(foreground, log ke stdout). - Kesehatan:
healthmelalui WS (juga disertakan dalamhello-ok). - Supervisi: launchd/systemd untuk restart otomatis.
Invarian
- Tepat satu Gateway mengontrol satu sesi Baileys per host.
- Handshake wajib; frame pertama yang bukan JSON atau bukan connect akan menyebabkan hard close.
- Event tidak diputar ulang; klien harus me-refresh saat ada gap.
Terkait
- Agent Loop — siklus eksekusi agen secara terperinci
- Gateway Protocol — kontrak protokol WebSocket
- Queue — antrean perintah dan konkurensi
- Security — model kepercayaan dan hardening