Bridge protocol (legacy node transport)
Чому він існував
- Межа безпеки: bridge відкриває невеликий список дозволених можливостей замість повної поверхні API gateway.
- Парування й ідентичність вузла: допуск вузлів належить gateway і прив’язаний до токена для кожного вузла.
- UX виявлення: вузли можуть виявляти gateway через Bonjour у LAN або підключатися напряму через tailnet.
- Loopback WS: повна control plane WS залишається локальною, якщо її не тунелювати через SSH.
Транспорт
- TCP, по одному JSON-об’єкту на рядок (JSONL).
- Необов’язковий TLS (коли
bridge.tls.enabledмає значення true). - Історичним типовим портом listener був
18790(поточні збірки не запускають TCP bridge).
bridgeTls=1 і
bridgeTlsSha256 як несекретну підказку. Зверніть увагу, що записи Bonjour/mDNS TXT неавтентифіковані; клієнти не повинні трактувати оголошений fingerprint як
авторитетний pin без явного наміру користувача або іншої позасмугової перевірки.
Рукостискання й парування
- Клієнт надсилає
helloіз метаданими вузла + токеном (якщо вже спарено). - Якщо не спарено, gateway відповідає
error(NOT_PAIRED/UNAUTHORIZED). - Клієнт надсилає
pair-request. - Gateway чекає на схвалення, потім надсилає
pair-okіhello-ok.
hello-ok повертав serverName і міг також включати
canvasHostUrl.
Кадри
Клієнт → Gateway:req/res: scoped RPC gateway (chat,sessions,config,health,voicewake,skills.bins)event: сигнали вузла (voice transcript, запит агента, підписка на чат, життєвий цикл 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.
Вони зіставляються із системними подіями в gateway. (Legacy nodes все ще можуть надсилати exec.started.)
Поля payload (усі необов’язкові, якщо не зазначено інше):
sessionKey(обов’язкове): сесія агента, яка має отримати системну подію.runId: унікальний id exec для групування.command: сирий або відформатований рядок команди.exitCode,timedOut,success,output: деталі завершення (лише для finished).reason: причина відмови (лише для denied).
Історичне використання tailnet
- Прив’язати bridge до IP tailnet:
bridge.bind: "tailnet"у~/.openclaw/openclaw.json(лише історично;bridge.*більше не є коректним). - Клієнти підключаються через ім’я MagicDNS або IP tailnet.
- Bonjour не працює між мережами; за потреби використовуйте ручний host/port або wide-area DNS‑SD.