Протокол моста (устаревший транспорт узлов)
Протокол моста — это устаревший транспорт узлов (TCP JSONL). Новым клиентам узлов следует использовать унифицированный протокол Gateway (шлюз) на базе WebSocket. Если вы разрабатываете оператор или клиент узла, используйте протокол Gateway. Примечание: Текущие сборки OpenClaw больше не поставляются с TCP‑слушателем моста; этот документ сохранён для исторической справки. Устаревшие ключи конфигаbridge.* больше не входят в схему конфигурации.
Зачем нужны оба
- Граница безопасности: мост предоставляет небольшой список разрешённых операций вместо полной поверхности API шлюза.
- Сопряжение + идентичность узла: допуск узла контролируется шлюзом и привязан к токену на каждый узел.
- UX обнаружения: узлы могут обнаруживать шлюзы через Bonjour в LAN или подключаться напрямую через tailnet.
- Loopback WS: полный плоскостной контроль WS остаётся локальным, если не туннелируется через SSH.
Транспорт
- TCP, по одному объекту JSON на строку (JSONL).
- Необязательный TLS (когда
bridge.tls.enabledравен true). - Устаревший порт слушателя по умолчанию —
18790(текущие сборки не запускают TCP‑мост).
bridgeTls=1 плюс
bridgeTlsSha256, чтобы узлы могли закрепить сертификат. Обратите внимание, что Bonjour/mDNS TXT-записи являются
unauthenticated; клиенты не должны считать рекламируемый отпечаток
авторитетным пином без явного намерения пользователя или иной внеполосной проверки.
Рукопожатие и сопряжение
- Клиент отправляет
helloс метаданными узла и токеном (если уже сопряжён). - Если не сопряжён, шлюз отвечает
error(NOT_PAIRED/UNAUTHORIZED). - Клиент отправляет
pair-request. - Шлюз ожидает подтверждения, затем отправляет
pair-okиhello-ok.
hello-ok возвращает serverName и может включать canvasHostUrl.
Frames
Клиент → Gateway (шлюз):req/res: ограниченный RPC шлюза (chat, sessions, config, health, voicewake, skills.bins)event: сигналы узла (транскрипт голоса, запрос агента, подписка на чат, жизненный цикл exec)
invoke/invoke-res: команды узлу (canvas.*,camera.*,screen.record,location.get,sms.send)event: обновления чата для подписанных сеансовping/pong: сигналы keepalive
src/gateway/server-bridge.ts (удалён).
События жизненного цикла Exec
Узлы могут отправлять событияexec.finished или exec.denied, чтобы отразить активность system.run.
Они сопоставляются с системными событиями в шлюзе. (Устаревшие узлы всё ещё могут отправлять exec.started.)
Поля полезной нагрузки (все необязательны, если не указано иное):
sessionKey(обязательно): сеанс агента для получения системного события.runId: уникальный идентификатор exec для группировки.command: исходная или отформатированная строка команды.exitCode,timedOut,success,output: детали завершения (только для завершённых).reason: причина отказа (только для отказанных).
Использование tailnet
- Привяжите мост к IP tailnet:
bridge.bind: "tailnet"в~/.openclaw/openclaw.json. - Клиенты подключаются через имя MagicDNS или IP tailnet.
- Bonjour не пересекает сети; при необходимости используйте ручной host/port или широкозонный DNS‑SD.