Gateway
โปรโตคอลบริดจ์
เหตุผลที่เคยมีอยู่
- ขอบเขตความปลอดภัย: เปิดให้ใช้งานเฉพาะรายการที่อนุญาตขนาดเล็ก แทนที่จะเปิดพื้นผิว API ทั้งหมดของ Gateway
- การจับคู่และอัตลักษณ์ของ Node: Gateway เป็นผู้ควบคุมการอนุญาตให้ Node เข้าร่วม และผูกไว้กับโทเค็นเฉพาะแต่ละ Node
- ประสบการณ์การค้นหา: Node สามารถค้นหา Gateway ผ่าน Bonjour บน LAN หรือเชื่อมต่อโดยตรงผ่าน tailnet
- WebSocket แบบ local loopback: ระนาบควบคุม WebSocket ทั้งหมดยังคงอยู่ภายในเครื่อง เว้นแต่จะทำทันเนลผ่าน SSH
การรับส่งข้อมูล
- TCP โดยมีออบเจ็กต์ JSON หนึ่งรายการต่อบรรทัด (JSONL)
- รองรับ TLS เป็นตัวเลือก (
bridge.tls.enabled: true) - พอร์ตเริ่มต้นของตัวรับฟังคือ
18790
เมื่อเปิดใช้ TLS ระเบียน TXT สำหรับการค้นหาจะมี bridgeTls=1 พร้อม bridgeTlsSha256 เป็นข้อมูลบอกใบ้ที่ไม่เป็นความลับ ระเบียน TXT ของ Bonjour/mDNS ไม่มีการตรวจสอบสิทธิ์ ไคลเอนต์จึงไม่สามารถถือว่าลายนิ้วมือที่ประกาศเป็นพินที่เชื่อถือได้โดยเด็ดขาด หากไม่มีการตรวจสอบผ่านช่องทางอื่นเพิ่มเติม
การจับมือและการจับคู่
- ไคลเอนต์ส่ง
helloพร้อมข้อมูลเมตาของ Node และโทเค็น (หากจับคู่แล้ว) - หากยังไม่จับคู่ Gateway จะตอบกลับด้วย
error(NOT_PAIRED/UNAUTHORIZED) - ไคลเอนต์ส่ง
pair-request - Gateway รอการอนุมัติ จากนั้นส่ง
pair-okและhello-ok
เดิม hello-ok จะส่งคืน serverName ปัจจุบันพื้นผิว Plugin ที่โฮสต์ไว้จะประกาศผ่าน pluginSurfaceUrls บนโปรโตคอล Gateway ปัจจุบัน (Canvas/A2UI ใช้ pluginSurfaceUrls.canvas)
เฟรม
จากไคลเอนต์ไปยัง Gateway:
req/res: RPC ของ Gateway ที่จำกัดขอบเขต (แชต เซสชัน การกำหนดค่า สุขภาพ การปลุกด้วยเสียง และ skills.bins)event: สัญญาณจาก Node (บทถอดเสียงพูด คำขอของเอเจนต์ การสมัครรับข้อมูลแชต และวงจรชีวิตการดำเนินการ)
จาก Gateway ไปยังไคลเอนต์:
invoke/invoke-res: คำสั่งของ Node (canvas.*,camera.*,screen.record,location.get,sms.send)event: การอัปเดตแชตสำหรับเซสชันที่สมัครรับข้อมูลping/pong: การรักษาการเชื่อมต่อ
การบังคับใช้รายการที่อนุญาตเคยอยู่ใน src/gateway/server-bridge.ts (นำออกแล้ว)
เหตุการณ์วงจรชีวิตการดำเนินการ
Node ส่ง exec.finished เพื่อแสดงกิจกรรม system.run ที่เสร็จสมบูรณ์ โดย Gateway จะแมปเป็นเหตุการณ์ของระบบ (Node รุ่นเก่ายังสามารถส่ง exec.started ได้ด้วย) exec.denied ระบุว่าความพยายามเรียกใช้ system.run ถูกปฏิเสธขั้นสุดท้าย โดยไม่เพิ่มเหตุการณ์ของระบบลงในคิวหรือปลุกการทำงานของเอเจนต์
ฟิลด์เพย์โหลด (ทั้งหมดเป็นตัวเลือก เว้นแต่จะระบุไว้):
| ฟิลด์ | หมายเหตุ |
|---|---|
sessionKey |
จำเป็น เซสชันของเอเจนต์สำหรับเชื่อมโยงเหตุการณ์ และสำหรับ exec.finished ใช้ส่งเหตุการณ์ของระบบ |
runId |
รหัสการดำเนินการที่ไม่ซ้ำกันสำหรับการจัดกลุ่ม |
command |
สตริงคำสั่งแบบดิบหรือที่จัดรูปแบบแล้ว |
exitCode, timedOut, output |
รายละเอียดการเสร็จสิ้น (เฉพาะเมื่อเสร็จสิ้น) |
reason |
เหตุผลที่ปฏิเสธ (เฉพาะเมื่อถูกปฏิเสธ) |
การใช้งาน tailnet ในอดีต
- ผูกบริดจ์กับ IP ของ tailnet:
bridge.bind: "tailnet"ใน~/.openclaw/openclaw.json(สำหรับการอ้างอิงทางประวัติศาสตร์เท่านั้น ปัจจุบันbridge.*ไม่ใช่การกำหนดค่าที่ถูกต้องอีกต่อไป) - ไคลเอนต์เชื่อมต่อผ่านชื่อ MagicDNS หรือ IP ของ tailnet
- Bonjour ไม่สามารถข้ามเครือข่ายได้ มิฉะนั้นจึงต้องใช้ DNS-SD แบบบริเวณกว้าง หรือระบุโฮสต์/พอร์ตด้วยตนเอง
การกำหนดเวอร์ชัน
บริดจ์ใช้ v1 โดยปริยาย และไม่มีการเจรจาค่าต่ำสุด/สูงสุด ปัจจุบันไคลเอนต์ Node/ผู้ดำเนินการใช้โปรโตคอล Gateway ผ่าน WebSocket ซึ่งมีการเจรจาช่วงเวอร์ชันของโปรโตคอล