Architektura Gateway
Przegląd
- Pojedyncza długotrwale działająca Gateway zarządza wszystkimi powierzchniami komunikacyjnymi (WhatsApp przez Baileys, Telegram przez grammY, Slack, Discord, Signal, iMessage, WebChat).
- Klienci płaszczyzny sterowania (aplikacja macOS, CLI, interfejs webowy, automatyzacje) łączą się z
Gateway przez WebSocket na skonfigurowanym hoście bindowania (domyślnie
127.0.0.1:18789). - Nodes (macOS/iOS/Android/headless) również łączą się przez WebSocket, ale
deklarują
role: nodez jawnymi cap/commands. - Jedna Gateway na host; to jedyne miejsce, które otwiera sesję WhatsApp.
- canvas host jest udostępniany przez serwer HTTP Gateway pod adresami:
/__openclaw__/canvas/(HTML/CSS/JS edytowalne przez agenta)/__openclaw__/a2ui/(host A2UI) Używa tego samego portu co Gateway (domyślnie18789).
Komponenty i przepływy
Gateway (daemon)
- Utrzymuje połączenia z providerami.
- Udostępnia typowane API WS (żądania, odpowiedzi, zdarzenia push z serwera).
- Waliduje przychodzące ramki względem JSON Schema.
- Emituje zdarzenia takie jak
agent,chat,presence,health,heartbeat,cron.
Clients (aplikacja macOS / CLI / administrator webowy)
- Jedno połączenie WS na klienta.
- Wysyłają żądania (
health,status,send,agent,system-presence). - Subskrybują zdarzenia (
tick,agent,presence,shutdown).
Nodes (macOS / iOS / Android / headless)
- Łączą się z tym samym serwerem WS z
role: node. - Podają tożsamość urządzenia w
connect; parowanie jest oparte na urządzeniu (rolanode), a zatwierdzenie jest przechowywane w magazynie parowania urządzeń. - Udostępniają polecenia takie jak
canvas.*,camera.*,screen.record,location.get.
WebChat
- Statyczny interfejs, który używa API WS Gateway do historii czatu i wysyłania.
- W zdalnych konfiguracjach łączy się przez ten sam tunel SSH/Tailscale co inni klienci.
Cykl życia połączenia (pojedynczy klient)
Protokół przewodowy (podsumowanie)
- Transport: WebSocket, ramki tekstowe z ładunkiem JSON.
- Pierwsza ramka musi być
connect. - Po uzgodnieniu połączenia:
- Żądania:
{type:"req", id, method, params}→{type:"res", id, ok, payload|error} - Zdarzenia:
{type:"event", event, payload, seq?, stateVersion?}
- Żądania:
hello-ok.features.methods/eventsto metadane wykrywania, a nie wygenerowany zrzut każdej wywoływalnej trasy pomocniczej.- Uwierzytelnianie za pomocą współdzielonego sekretu używa
connect.params.auth.tokenlubconnect.params.auth.password, zależnie od skonfigurowanego trybu uwierzytelniania gateway. - Tryby przenoszące tożsamość, takie jak Tailscale Serve
(
gateway.auth.allowTailscale: true) lub nie-loopbackgateway.auth.mode: "trusted-proxy", spełniają wymagania uwierzytelniania na podstawie nagłówków żądania zamiastconnect.params.auth.*. - Prywatny ingress
gateway.auth.mode: "none"całkowicie wyłącza uwierzytelnianie współdzielonym sekretem; nie używaj tego trybu na publicznym/niezaufanym ingressie. - Klucze idempotencji są wymagane dla metod wywołujących skutki uboczne (
send,agent), aby można było bezpiecznie ponawiać próby; serwer utrzymuje krótkotrwałą pamięć podręczną deduplikacji. - Nodes muszą zawierać
role: "node"oraz caps/commands/permissions wconnect.
Parowanie + lokalne zaufanie
- Wszyscy klienci WS (operatorzy + nodes) uwzględniają tożsamość urządzenia w
connect. - Nowe identyfikatory urządzeń wymagają zatwierdzenia parowania; Gateway wydaje token urządzenia dla kolejnych połączeń.
- Bezpośrednie lokalne połączenia local loopback mogą być automatycznie zatwierdzane, aby zachować płynne działanie na tym samym hoście.
- OpenClaw ma też wąską ścieżkę samopołączenia backend/container-local dla zaufanych przepływów pomocniczych ze współdzielonym sekretem.
- Połączenia Tailnet i LAN, w tym bindowania tailnet na tym samym hoście, nadal wymagają jawnego zatwierdzenia parowania.
- Wszystkie połączenia muszą podpisywać nonce
connect.challenge. - Ładunek podpisu
v3wiąże teżplatform+deviceFamily; gateway przypina sparowane metadane przy ponownym połączeniu i wymaga naprawczego parowania przy zmianach metadanych. - Połączenia nielokalne nadal wymagają jawnego zatwierdzenia.
- Uwierzytelnianie Gateway (
gateway.auth.*) nadal ma zastosowanie do wszystkich połączeń, lokalnych i zdalnych.
Typowanie protokołu i generowanie kodu
- Schematy TypeBox definiują protokół.
- JSON Schema jest generowany na podstawie tych schematów.
- Modele Swift są generowane z JSON Schema.
Dostęp zdalny
- Preferowane: Tailscale lub VPN.
-
Alternatywa: tunel SSH
- Przez tunel obowiązuje to samo uzgadnianie połączenia i ten sam token uwierzytelniający.
- W konfiguracjach zdalnych można włączyć TLS + opcjonalne pinning dla WS.
Migawka operacyjna
- Uruchamianie:
openclaw gateway(na pierwszym planie, logi do stdout). - Stan:
healthprzez WS (również uwzględniane whello-ok). - Nadzór: launchd/systemd do automatycznego restartu.
Niezmienniki
- Dokładnie jedna Gateway kontroluje pojedynczą sesję Baileys na hosta.
- Uzgodnienie połączenia jest obowiązkowe; każda pierwsza ramka, która nie jest JSON lub
connect, powoduje bezwzględne zamknięcie. - Zdarzenia nie są odtwarzane; klienci muszą odświeżyć stan przy lukach.
Powiązane
- Agent Loop — szczegółowy cykl wykonywania agenta
- Gateway Protocol — kontrakt protokołu WebSocket
- Queue — kolejka poleceń i współbieżność
- Security — model zaufania i utwardzanie