Fundamentals
Архітектура Gateway
Огляд
- Єдиний довготривалий Gateway володіє всіма поверхнями обміну повідомленнями (WhatsApp через Baileys, Telegram через grammY, Slack, Discord, Signal, iMessage, WebChat).
- Клієнти площини керування (застосунок macOS, CLI, веб-інтерфейс, автоматизації) підключаються до
Gateway через WebSocket на налаштованому хості прив’язки (типово
127.0.0.1:18789). - Node-и (macOS/iOS/Android/headless) також підключаються через WebSocket, але
оголошують
role: nodeз явними можливостями/командами. - Один Gateway на хост; це єдине місце, яке відкриває сеанс WhatsApp.
- Canvas host обслуговується HTTP-сервером Gateway за адресами:
/__openclaw__/canvas/(HTML/CSS/JS, які може редагувати агент)/__openclaw__/a2ui/(хост A2UI) Він використовує той самий порт, що й Gateway (типово18789).
Компоненти та потоки
Gateway (демон)
- Підтримує з’єднання з провайдерами.
- Надає типізований WS API (запити, відповіді, події server-push).
- Перевіряє вхідні фрейми за JSON Schema.
- Випускає події на кшталт
agent,chat,presence,health,heartbeat,cron.
Клієнти (застосунок Mac / CLI / веб-адміністрування)
- Одне WS-з’єднання на клієнта.
- Надсилають запити (
health,status,send,agent,system-presence). - Підписуються на події (
tick,agent,presence,shutdown).
Node-и (macOS / iOS / Android / headless)
- Підключаються до того самого WS-сервера з
role: node. - Надають ідентичність пристрою в
connect; сполучення є пристроєвим (рольnode), а схвалення зберігається у сховищі сполучення пристроїв. - Надають команди на кшталт
canvas.*,camera.*,screen.record,location.get.
Деталі протоколу:
WebChat
- Статичний UI, що використовує Gateway WS API для історії чату та надсилання.
- У віддалених налаштуваннях підключається через той самий тунель SSH/Tailscale, що й інші клієнти.
Життєвий цикл з’єднання (один клієнт)
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}
Дротовий протокол (зведення)
- Транспорт: WebSocket, текстові фрейми з JSON-навантаженнями.
- Перший фрейм обов’язково має бути
connect. - Після рукостискання:
- Запити:
{type:"req", id, method, params}→{type:"res", id, ok, payload|error} - Події:
{type:"event", event, payload, seq?, stateVersion?}
- Запити:
hello-ok.features.methods/events— це метадані виявлення, а не згенерований дамп кожного доступного helper-маршруту.- Автентифікація за спільним секретом використовує
connect.params.auth.tokenабоconnect.params.auth.password, залежно від налаштованого режиму автентифікації Gateway. - Режими з ідентичністю, як-от Tailscale Serve
(
gateway.auth.allowTailscale: true) або нелокальнийgateway.auth.mode: "trusted-proxy", задовольняють автентифікацію через заголовки запиту замістьconnect.params.auth.*. - Private-ingress
gateway.auth.mode: "none"повністю вимикає автентифікацію за спільним секретом; не вмикайте цей режим для публічного/недовіреного ingress. - Ключі ідемпотентності потрібні для методів із побічними ефектами (
send,agent), щоб безпечно повторювати спроби; сервер тримає короткочасний кеш дедуплікації. - Node-и мають включати
role: "node"плюс можливості/команди/дозволи вconnect.
Сполучення + локальна довіра
- Усі WS-клієнти (оператори + Node-и) включають ідентичність пристрою в
connect. - Нові ID пристроїв потребують схвалення сполучення; Gateway видає токен пристрою для подальших підключень.
- Прямі підключення через local loopback можуть автоматично схвалюватися, щоб зберегти плавний UX на тому самому хості.
- OpenClaw також має вузький шлях backend/container-local самопідключення для довірених helper-потоків зі спільним секретом.
- Підключення через tailnet і LAN, включно з прив’язками tailnet на тому самому хості, усе одно потребують явного схвалення сполучення.
- Усі підключення мають підписувати nonce
connect.challenge. - Навантаження підпису
v3також прив’язуєplatform+deviceFamily; gateway закріплює сполучені метадані під час повторного підключення та вимагає repair pairing для змін метаданих. - Нелокальні підключення все одно потребують явного схвалення.
- Автентифікація Gateway (
gateway.auth.*) усе одно застосовується до всіх з’єднань, локальних або віддалених.
Деталі: Протокол Gateway, Сполучення, Безпека.
Типізація протоколу та codegen
- Схеми TypeBox визначають протокол.
- JSON Schema генерується з цих схем.
- Моделі Swift генеруються з JSON Schema.
Віддалений доступ
-
Бажано: Tailscale або VPN.
-
Альтернатива: тунель SSH
ssh -N -L 18789:127.0.0.1:18789 user@host -
Те саме рукостискання + токен автентифікації застосовуються через тунель.
-
TLS + необов’язковий pinning можна ввімкнути для WS у віддалених налаштуваннях.
Операційний зріз
- Запуск:
openclaw gateway(на передньому плані, логи в stdout). - Стан:
healthчерез WS (також включено вhello-ok). - Нагляд: launchd/systemd для автоматичного перезапуску.
Інваріанти
- Рівно один Gateway керує одним сеансом Baileys на хост.
- Рукостискання обов’язкове; будь-який перший фрейм, що не є JSON або не є connect, призводить до примусового закриття.
- Події не відтворюються повторно; клієнти мають оновлюватися за наявності розривів.
Пов’язане
- Цикл агента — докладний цикл виконання агента
- Протокол Gateway — контракт протоколу WebSocket
- Черга — черга команд і паралельність
- Безпека — модель довіри та посилення захисту