Fundamentals
Arsitektur Gateway
Gambaran umum
- Satu Gateway berumur panjang memiliki semua permukaan perpesanan (WhatsApp melalui Baileys, Telegram melalui grammY, Slack, Discord, Signal, iMessage, WebChat).
- Klien control-plane (aplikasi 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 eksplisit. - Satu Gateway per host; ini adalah satu-satunya tempat yang membuka sesi WhatsApp.
- Host kanvas 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, peristiwa server-push).
- Memvalidasi frame masuk terhadap JSON Schema.
- Memancarkan peristiwa seperti
agent,chat,presence,health,heartbeat,cron.
Klien (aplikasi Mac / CLI / admin web)
- Satu koneksi WS per klien.
- Mengirim permintaan (
health,status,send,agent,system-presence). - Berlangganan peristiwa (
tick,agent,presence,shutdown).
Node (macOS / iOS / Android / headless)
- Terhubung ke server WS yang sama dengan
role: node. - Menyediakan identitas perangkat dalam
connect; pairing bersifat berbasis perangkat (rolenode) dan persetujuan berada di penyimpanan pairing perangkat. - Mengekspos perintah seperti
canvas.*,camera.*,screen.record,location.get.
Detail protokol:
WebChat
- UI statis yang menggunakan API WS Gateway untuk riwayat chat dan pengiriman.
- Dalam setup jarak jauh, terhubung melalui tunnel SSH/Tailscale yang sama seperti klien lain.
Siklus hidup koneksi (satu klien)
sequenceDiagram
participant Client
participant Gateway
Client->>Gateway: req:connect
Gateway-->>Client: res (ok)
Note right of Gateway: or res error + close
Note left of Client: payload=hello-ok
snapshot: presence + health
Gateway-->>Client: event:presence
Gateway-->>Client: event:tick
Client->>Gateway: req:agent
Gateway-->>Client: res:agent
ack {runId, status:"accepted"}
Gateway-->>Client: event:agent
(streaming)
Gateway-->>Client: res:agent
final {runId, status, summary}
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} - Peristiwa:
{type:"event", event, payload, seq?, stateVersion?}
- Permintaan:
hello-ok.features.methods/eventsadalah metadata discovery, bukan dump tergenerasi dari setiap route helper yang dapat dipanggil.- Auth rahasia bersama menggunakan
connect.params.auth.tokenatauconnect.params.auth.password, bergantung pada 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.*. - Ingress privat
gateway.auth.mode: "none"menonaktifkan auth rahasia bersama sepenuhnya; jangan gunakan mode itu pada ingress publik/tidak tepercaya. - Kunci idempotensi diperlukan untuk metode yang memiliki efek samping (
send,agent) agar percobaan ulang aman; server menyimpan cache deduplikasi berumur pendek. - Node harus menyertakan
role: "node"beserta kapabilitas/perintah/izin dalamconnect.
Pairing + kepercayaan lokal
- Semua klien WS (operator + node) menyertakan identitas perangkat pada
connect. - ID perangkat baru memerlukan persetujuan pairing; Gateway menerbitkan token perangkat untuk koneksi berikutnya.
- Koneksi direct local loopback dapat disetujui otomatis agar UX pada host yang sama tetap lancar.
- OpenClaw juga memiliki jalur self-connect backend/container-lokal yang sempit untuk alur helper rahasia bersama tepercaya.
- Koneksi tailnet dan LAN, termasuk bind tailnet pada host yang sama, tetap memerlukan persetujuan pairing eksplisit.
- Semua koneksi harus menandatangani nonce
connect.challenge. - Payload tanda tangan
v3juga mengikatplatform+deviceFamily; gateway mem-pin metadata yang dipairing saat reconnect dan memerlukan pairing perbaikan untuk perubahan metadata. - Koneksi non-lokal tetap memerlukan persetujuan eksplisit.
- Auth Gateway (
gateway.auth.*) tetap berlaku untuk semua koneksi, lokal maupun jarak jauh.
Detail: Protokol Gateway, Pairing, Keamanan.
Pengetikan protokol dan codegen
- Skema TypeBox mendefinisikan protokol.
- JSON Schema dibuat dari skema tersebut.
- Model Swift dibuat dari JSON Schema.
Akses jarak jauh
-
Disarankan: Tailscale atau VPN.
-
Alternatif: tunnel SSH
ssh -N -L 18789:127.0.0.1:18789 user@host -
Handshake + token auth yang sama berlaku melalui tunnel.
-
TLS + pinning opsional dapat diaktifkan untuk WS dalam setup jarak jauh.
Snapshot operasi
- Mulai:
openclaw gateway(foreground, log ke stdout). - Health:
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 non-JSON atau non-connect akan ditutup paksa.
- Peristiwa tidak diputar ulang; klien harus menyegarkan saat ada gap.
Terkait
- Loop Agen — siklus eksekusi agen terperinci
- Protokol Gateway — kontrak protokol WebSocket
- Antrean — antrean perintah dan konkurensi
- Keamanan — model kepercayaan dan hardening