Gateway
โปรโตคอลบริดจ์
เหตุผลที่เคยมีอยู่
- ขอบเขตความปลอดภัย: บริดจ์เปิดเผย allowlist ขนาดเล็กแทนพื้นผิว API ทั้งหมดของ Gateway
- การจับคู่ + ตัวตนของ Node: การรับ Node เข้าใช้งานเป็นหน้าที่ของ Gateway และผูกกับโทเค็นราย Node
- UX การค้นหา: Node สามารถค้นหา Gateway ผ่าน Bonjour บน LAN หรือเชื่อมต่อโดยตรงผ่าน tailnet
- Loopback WS: control plane แบบ WS ทั้งหมดยังคงอยู่ในเครื่อง เว้นแต่จะถูก tunnel ผ่าน SSH
การขนส่ง
- TCP หนึ่งอ็อบเจ็กต์ JSON ต่อบรรทัด (JSONL)
- TLS แบบเลือกได้ (เมื่อ
bridge.tls.enabledเป็น true) - พอร์ต listener เริ่มต้นในอดีตคือ
18790(บิลด์ปัจจุบันไม่เริ่มบริดจ์ TCP)
เมื่อเปิดใช้ TLS ระเบียน TXT ของการค้นหาจะรวม bridgeTls=1 พร้อมกับ bridgeTlsSha256 เป็นคำใบ้ที่ไม่ใช่ความลับ โปรดทราบว่าระเบียน TXT ของ Bonjour/mDNS ไม่ได้รับการยืนยันตัวตน ไคลเอนต์ต้องไม่ถือว่า fingerprint ที่ประกาศเป็น pin ที่เชื่อถือได้โดยไม่มีเจตนาชัดเจนจากผู้ใช้หรือการยืนยันแบบ out-of-band อื่น
Handshake + การจับคู่
- ไคลเอนต์ส่ง
helloพร้อม metadata ของ Node + โทเค็น (หากจับคู่แล้ว) - หากยังไม่ได้จับคู่ Gateway จะตอบกลับ
error(NOT_PAIRED/UNAUTHORIZED) - ไคลเอนต์ส่ง
pair-request - Gateway รอการอนุมัติ จากนั้นส่ง
pair-okและhello-ok
ในอดีต hello-ok ส่งคืน serverName; ตอนนี้พื้นผิว Plugin ที่โฮสต์อยู่จะประกาศผ่าน pluginSurfaceUrls Canvas/A2UI ใช้ pluginSurfaceUrls.canvas; alias canvasHostUrl ที่เลิกใช้แล้วไม่เป็นส่วนหนึ่งของโปรโตคอลที่ปรับโครงสร้างใหม่
เฟรม
ไคลเอนต์ → Gateway:
req/res: RPC ของ Gateway แบบมีขอบเขต (chat, sessions, config, health, voicewake, skills.bins)event: สัญญาณจาก Node (voice transcript, agent request, chat subscribe, exec lifecycle)
Gateway → ไคลเอนต์:
invoke/invoke-res: คำสั่งของ Node (canvas.*,camera.*,screen.record,location.get,sms.send)event: การอัปเดตแชตสำหรับ session ที่สมัครรับข้อมูลping/pong: keepalive
การบังคับใช้ allowlist แบบเดิมเคยอยู่ใน src/gateway/server-bridge.ts (นำออกแล้ว)
เหตุการณ์วงจรชีวิต Exec
Node สามารถปล่อยเหตุการณ์ exec.finished หรือ exec.denied เพื่อแสดงกิจกรรม system.run ได้
สิ่งเหล่านี้จะถูกแมปเป็นเหตุการณ์ระบบใน Gateway (Node รุ่นเดิมอาจยังปล่อย exec.started)
ฟิลด์ payload (ทั้งหมดเป็นตัวเลือก เว้นแต่ระบุไว้):
sessionKey(จำเป็น): session ของ agent ที่จะรับเหตุการณ์ระบบrunId: id ของ exec ที่ไม่ซ้ำสำหรับการจัดกลุ่มcommand: สตริงคำสั่งดิบหรือที่จัดรูปแบบแล้วexitCode,timedOut,success,output: รายละเอียดการเสร็จสิ้น (เฉพาะ finished)reason: เหตุผลการปฏิเสธ (เฉพาะ denied)
การใช้งาน tailnet ในอดีต
- ผูกบริดจ์กับ IP ของ tailnet:
bridge.bind: "tailnet"ใน~/.openclaw/openclaw.json(เฉพาะในอดีต;bridge.*ไม่ถูกต้องอีกต่อไป) - ไคลเอนต์เชื่อมต่อผ่านชื่อ MagicDNS หรือ IP ของ tailnet
- Bonjour ไม่ ข้ามเครือข่าย; ใช้ host/port แบบกำหนดเองหรือ DNS-SD แบบ wide-area เมื่อจำเป็น
การกำหนดเวอร์ชัน
บริดจ์เป็น implicit v1 (ไม่มีการต่อรอง min/max) ส่วนนี้เป็นข้อมูลอ้างอิงทางประวัติเท่านั้น ไคลเอนต์ Node/operator ปัจจุบันใช้ WebSocket โปรโตคอล Gateway