Gateway
โปรโตคอลบริดจ์
เหตุผลที่เคยมีอยู่
- ขอบเขตความปลอดภัย: บริดจ์เปิดเผยรายการที่อนุญาตขนาดเล็กแทนพื้นผิว API ของ Gateway ทั้งหมด
- การจับคู่ + ตัวตนของ Node: การรับ Node เข้าระบบเป็นของ Gateway และผูกกับโทเค็น ราย Node
- UX การค้นหา: Node สามารถค้นหา Gateway ผ่าน Bonjour บน LAN หรือเชื่อมต่อ โดยตรงผ่าน tailnet
- Loopback WS: ระนาบควบคุม WS แบบเต็มยังคงอยู่ในเครื่อง เว้นแต่จะถูกทำอุโมงค์ผ่าน SSH
การขนส่ง
- TCP, หนึ่งออบเจ็กต์ JSON ต่อบรรทัด (JSONL)
- TLS แบบเลือกใช้ได้ (เมื่อ
bridge.tls.enabledเป็น true) - พอร์ตตัวรับฟังเริ่มต้นในอดีตคือ
18790(บิลด์ปัจจุบันไม่เริ่ม บริดจ์ TCP)
เมื่อเปิดใช้ TLS ระเบียน TXT สำหรับการค้นหาจะมี bridgeTls=1 พร้อม
bridgeTlsSha256 เป็นคำใบ้ที่ไม่ใช่ความลับ โปรดทราบว่าระเบียน TXT ของ Bonjour/mDNS
ไม่ได้ผ่านการยืนยันตัวตน ไคลเอนต์ต้องไม่ถือว่าลายนิ้วมือที่ประกาศเป็น
พินที่เชื่อถือได้โดยสมบูรณ์ หากไม่มีเจตนาผู้ใช้ที่ชัดเจนหรือการยืนยันนอกช่องทางอื่น
Handshake + การจับคู่
- ไคลเอนต์ส่ง
helloพร้อมเมทาดาทาของ 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 แบบกำหนดขอบเขต (แชต, เซสชัน, การกำหนดค่า, สุขภาพ, voicewake, skills.bins)event: สัญญาณของ Node (ข้อความถอดเสียง, คำขอเอเจนต์, สมัครรับแชต, วงจรชีวิต exec)
Gateway → ไคลเอนต์:
invoke/invoke-res: คำสั่งของ Node (canvas.*,camera.*,screen.record,location.get,sms.send)event: อัปเดตแชตสำหรับเซสชันที่สมัครรับping/pong: keepalive
การบังคับใช้รายการที่อนุญาตแบบเดิมเคยอยู่ใน src/gateway/server-bridge.ts (นำออกแล้ว)
เหตุการณ์วงจรชีวิต Exec
Node สามารถปล่อยเหตุการณ์ exec.finished เพื่อแสดงกิจกรรม system.run ที่เสร็จสิ้นแล้ว
สิ่งเหล่านี้ถูกแมปเป็นเหตุการณ์ระบบใน Gateway (Node แบบเดิมอาจยังปล่อย exec.started)
Node อาจปล่อย exec.denied สำหรับความพยายาม system.run ที่ถูกปฏิเสธ; Gateway ยอมรับ
เหตุการณ์นี้เป็นการปฏิเสธปลายทาง และไม่จัดคิวเหตุการณ์ระบบหรือปลุกงานเอเจนต์
ฟิลด์ payload (ทั้งหมดเป็นทางเลือก เว้นแต่ระบุไว้):
sessionKey(จำเป็น): เซสชันเอเจนต์สำหรับการเชื่อมโยงเหตุการณ์ และสำหรับexec.finishedการส่งเหตุการณ์ระบบ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 ไม่ ข้ามเครือข่าย; ใช้โฮสต์/พอร์ตแบบกำหนดเองหรือ wide-area DNS-SD เมื่อจำเป็น
การกำหนดเวอร์ชัน
บริดจ์เป็น v1 โดยนัย (ไม่มีการเจรจา min/max) ส่วนนี้เป็น ข้อมูลอ้างอิงทางประวัติเท่านั้น; ไคลเอนต์ Node/ผู้ปฏิบัติงานปัจจุบันใช้ WebSocket Gateway Protocol