Nodes and media
Node
node คืออุปกรณ์คู่หู (macOS/iOS/Android/headless) ที่เชื่อมต่อกับ WebSocket ของ Gateway (พอร์ตเดียวกับ operators) ด้วย role: "node" และเปิดเผยพื้นผิวคำสั่ง (เช่น canvas.*, camera.*, device.*, notifications.*, system.*) ผ่าน node.invoke รายละเอียดโปรโตคอล: โปรโตคอล Gateway.
ทรานสปอร์ตเดิม: โปรโตคอล Bridge (TCP JSONL; มีไว้เพื่อประวัติเท่านั้นสำหรับ nodes ปัจจุบัน).
macOS ยังสามารถทำงานใน โหมด node ได้ด้วย: แอปแถบเมนูเชื่อมต่อกับเซิร์ฟเวอร์ WS ของ Gateway และเปิดเผยคำสั่ง canvas/camera ภายในเครื่องของตัวเองเป็น node (ดังนั้น
openclaw nodes … จึงใช้งานกับ Mac เครื่องนี้ได้) ในโหมด remote gateway ระบบอัตโนมัติของเบราว์เซอร์จะถูกจัดการโดยโฮสต์ node ของ CLI (openclaw node run หรือบริการ node ที่ติดตั้งไว้) ไม่ใช่โดย node ของแอป native
หมายเหตุ:
- Nodes เป็น อุปกรณ์ต่อพ่วง ไม่ใช่ gateways และไม่ได้รันบริการ gateway
- ข้อความ Telegram/WhatsApp/อื่นๆ จะไปถึง gateway ไม่ใช่ nodes
- คู่มือแก้ปัญหา: /nodes/troubleshooting
การจับคู่ + สถานะ
WS nodes ใช้การจับคู่อุปกรณ์ Nodes จะแสดงข้อมูลประจำตัวของอุปกรณ์ระหว่าง connect; Gateway จะสร้างคำขอจับคู่อุปกรณ์สำหรับ role: node อนุมัติผ่าน CLI อุปกรณ์ (หรือ UI)
CLI แบบเร็ว:
openclaw devices list
openclaw devices approve <requestId>
openclaw devices reject <requestId>
openclaw nodes status
openclaw nodes describe --node <idOrNameOrIp>
หาก node ลองใหม่ด้วยรายละเอียด auth ที่เปลี่ยนไป (role/scopes/public key) คำขอที่ค้างอยู่ก่อนหน้าจะถูกแทนที่ และจะมีการสร้าง requestId ใหม่ เรียกใช้
openclaw devices list อีกครั้งก่อนอนุมัติ
หมายเหตุ:
nodes statusทำเครื่องหมาย node เป็น จับคู่แล้ว เมื่อ role การจับคู่อุปกรณ์มีnode- ระเบียนการจับคู่อุปกรณ์คือสัญญา role ที่อนุมัติแล้วแบบคงทน การหมุนเวียน token จะอยู่ภายในสัญญานั้น; มันไม่สามารถยกระดับ node ที่จับคู่แล้วเป็น role อื่นที่การอนุมัติการจับคู่ไม่เคยให้ไว้
node.pair.*(CLI:openclaw nodes pending/approve/reject/remove/rename) เป็นที่เก็บการจับคู่ node แยกต่างหากที่ gateway เป็นเจ้าของ; มัน ไม่ได้ กั้น handshakeconnectของ WSopenclaw nodes remove --node <id|name|ip>ลบรายการเก่าออกจากที่เก็บการจับคู่ node แยกต่างหากที่ gateway เป็นเจ้าของนั้น- ขอบเขตการอนุมัติจะตามคำสั่งที่คำขอค้างอยู่ประกาศไว้:
- คำขอที่ไม่มีคำสั่ง:
operator.pairing - คำสั่ง node ที่ไม่ใช่ exec:
operator.pairing+operator.write system.run/system.run.prepare/system.which:operator.pairing+operator.admin
- คำขอที่ไม่มีคำสั่ง:
โฮสต์ node ระยะไกล (system.run)
ใช้ โฮสต์ node เมื่อ Gateway ของคุณรันบนเครื่องหนึ่ง และคุณต้องการให้คำสั่งทำงานบนอีกเครื่องหนึ่ง โมเดลยังคุยกับ gateway; gateway จะส่งต่อการเรียก exec ไปยัง โฮสต์ node เมื่อเลือก host=node
อะไรทำงานที่ไหน
- โฮสต์ Gateway: รับข้อความ รันโมเดล จัดเส้นทางการเรียกเครื่องมือ
- โฮสต์ Node: ดำเนินการ
system.run/system.whichบนเครื่อง node - การอนุมัติ: บังคับใช้บนโฮสต์ node ผ่าน
~/.openclaw/exec-approvals.json
หมายเหตุเรื่องการอนุมัติ:
- การรัน node ที่อิงการอนุมัติจะผูกกับบริบทคำขอแบบตรงกันทุกประการ
- สำหรับการเรียกใช้ไฟล์ shell/runtime โดยตรง OpenClaw ยังพยายามผูก operand ไฟล์ภายในเครื่องที่เป็นรูปธรรมหนึ่งรายการ และปฏิเสธการรันหากไฟล์นั้นเปลี่ยนก่อนการดำเนินการ
- หาก OpenClaw ไม่สามารถระบุไฟล์ภายในเครื่องที่เป็นรูปธรรมได้พอดีหนึ่งไฟล์สำหรับคำสั่ง interpreter/runtime การดำเนินการที่อิงการอนุมัติจะถูกปฏิเสธ แทนที่จะเสแสร้งว่าครอบคลุม runtime ทั้งหมด ให้ใช้ sandboxing, โฮสต์แยกต่างหาก หรือ allowlist/เวิร์กโฟลว์เต็มรูปแบบที่เชื่อถืออย่างชัดเจนสำหรับความหมายของ interpreter ที่กว้างขึ้น
เริ่มโฮสต์ node (foreground)
บนเครื่อง node:
openclaw node run --host <gateway-host> --port 18789 --display-name "Build Node"
Remote gateway ผ่าน SSH tunnel (ผูกกับ loopback)
หาก Gateway ผูกกับ loopback (gateway.bind=loopback, ค่าเริ่มต้นในโหมด local) โฮสต์ node ระยะไกลจะเชื่อมต่อโดยตรงไม่ได้ สร้าง SSH tunnel และชี้โฮสต์ node ไปยังปลายทางภายในเครื่องของ tunnel
ตัวอย่าง (โฮสต์ node -> โฮสต์ gateway):
# Terminal A (keep running): forward local 18790 -> gateway 127.0.0.1:18789
ssh -N -L 18790:127.0.0.1:18789 user@gateway-host
# Terminal B: export the gateway token and connect through the tunnel
export OPENCLAW_GATEWAY_TOKEN="<gateway-token>"
openclaw node run --host 127.0.0.1 --port 18790 --display-name "Build Node"
หมายเหตุ:
openclaw node runรองรับ token หรือ password auth- แนะนำให้ใช้ env vars:
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD - fallback ของ config คือ
gateway.auth.token/gateway.auth.password - ในโหมด local โฮสต์ node จะตั้งใจไม่สนใจ
gateway.remote.token/gateway.remote.password - ในโหมด remote
gateway.remote.token/gateway.remote.passwordจะมีสิทธิ์ใช้ตามกฎลำดับความสำคัญของ remote - หาก SecretRefs ของ
gateway.auth.*ฝั่ง local ที่ใช้งานอยู่ถูกกำหนดค่าไว้แต่ resolve ไม่ได้ auth ของโฮสต์ node จะ fail closed - การ resolve auth ของโฮสต์ node จะยอมรับเฉพาะ env vars
OPENCLAW_GATEWAY_*
เริ่มโฮสต์ node (บริการ)
openclaw node install --host <gateway-host> --port 18789 --display-name "Build Node"
openclaw node start
openclaw node restart
จับคู่ + ตั้งชื่อ
บนโฮสต์ gateway:
openclaw devices list
openclaw devices approve <requestId>
openclaw nodes status
หาก node ลองใหม่ด้วยรายละเอียด auth ที่เปลี่ยนไป ให้เรียกใช้ openclaw devices list อีกครั้ง
และอนุมัติ requestId ปัจจุบัน
ตัวเลือกการตั้งชื่อ:
--display-nameบนopenclaw node run/openclaw node install(คงอยู่ใน~/.openclaw/node.jsonบน node)openclaw nodes rename --node <id|name|ip> --name "Build Node"(การ override ของ gateway)
ใส่คำสั่งใน allowlist
การอนุมัติ Exec เป็นแบบ ต่อโฮสต์ node เพิ่มรายการ allowlist จาก gateway:
openclaw approvals allowlist add --node <id|name|ip> "/usr/bin/uname"
openclaw approvals allowlist add --node <id|name|ip> "/usr/bin/sw_vers"
การอนุมัติอยู่บนโฮสต์ node ที่ ~/.openclaw/exec-approvals.json
ชี้ exec ไปที่ node
กำหนดค่าเริ่มต้น (config ของ gateway):
openclaw config set tools.exec.host node
openclaw config set tools.exec.security allowlist
openclaw config set tools.exec.node "<id-or-name>"
หรือแบบต่อ session:
/exec host=node security=allowlist node=<id-or-name>
เมื่อตั้งค่าแล้ว การเรียก exec ใดๆ ที่มี host=node จะรันบนโฮสต์ node (ภายใต้ allowlist/การอนุมัติของ node)
host=auto จะไม่เลือก node เองโดยนัย แต่คำขอ host=node แบบชัดเจนต่อการเรียกจะได้รับอนุญาตจาก auto หากคุณต้องการให้ node exec เป็นค่าเริ่มต้นสำหรับ session ให้ตั้งค่า tools.exec.host=node หรือ /exec host=node ... อย่างชัดเจน
ที่เกี่ยวข้อง:
การเรียกใช้คำสั่ง
ระดับต่ำ (RPC ดิบ):
openclaw nodes invoke --node <idOrNameOrIp> --command canvas.eval --params '{"javaScript":"location.href"}'
มี helper ระดับสูงกว่าสำหรับเวิร์กโฟลว์ทั่วไปแบบ "ให้ agent มีไฟล์แนบ MEDIA"
นโยบายคำสั่ง
คำสั่ง node ต้องผ่านสองด่านก่อนจึงจะเรียกใช้ได้:
- node ต้องประกาศคำสั่งในรายการ
connect.commandsของ WebSocket - นโยบายแพลตฟอร์มของ gateway ต้องอนุญาตคำสั่งที่ประกาศไว้
nodes คู่หูบน Windows และ macOS อนุญาตคำสั่งที่ประกาศไว้ซึ่งปลอดภัย เช่น
canvas.*, camera.list, location.get, และ screen.snapshot ตามค่าเริ่มต้น
nodes ที่เชื่อถือได้ซึ่งโฆษณา capability talk หรือประกาศคำสั่ง talk.*
ยังอนุญาตคำสั่ง push-to-talk ที่ประกาศไว้ (talk.ptt.start, talk.ptt.stop,
talk.ptt.cancel, talk.ptt.once) ตามค่าเริ่มต้น โดยไม่ขึ้นกับ label ของแพลตฟอร์ม
คำสั่งที่อันตรายหรือเกี่ยวข้องกับความเป็นส่วนตัวสูง เช่น camera.snap, camera.clip, และ
screen.record ยังคงต้อง opt-in อย่างชัดเจนด้วย
gateway.nodes.allowCommands gateway.nodes.denyCommands จะชนะเสมอเหนือ
ค่าเริ่มต้นและรายการ allowlist เพิ่มเติม
คำสั่ง node ที่ Plugin เป็นเจ้าของสามารถเพิ่มนโยบาย node-invoke ของ Gateway ได้ นโยบายดังกล่าวจะรันหลังการตรวจ allowlist และก่อนส่งต่อไปยัง node ดังนั้น
node.invoke, helper ของ CLI และเครื่องมือ agent เฉพาะจึงใช้ขอบเขตสิทธิ์ของ Plugin เดียวกัน คำสั่ง node ของ Plugin ที่อันตรายยังคงต้อง opt-in อย่างชัดเจนด้วย
gateway.nodes.allowCommands
หลังจาก node เปลี่ยนรายการคำสั่งที่ประกาศ ให้ปฏิเสธการจับคู่อุปกรณ์เก่า และอนุมัติคำขอใหม่เพื่อให้ gateway เก็บ snapshot คำสั่งที่อัปเดตแล้ว
ภาพหน้าจอ (snapshot ของ canvas)
หาก node กำลังแสดง Canvas (WebView), canvas.snapshot จะคืนค่า { format, base64 }
CLI helper (เขียนไปยังไฟล์ temp และพิมพ์ MEDIA:<path>):
openclaw nodes canvas snapshot --node <idOrNameOrIp> --format png
openclaw nodes canvas snapshot --node <idOrNameOrIp> --format jpg --max-width 1200 --quality 0.9
การควบคุม Canvas
openclaw nodes canvas present --node <idOrNameOrIp> --target https://example.com
openclaw nodes canvas hide --node <idOrNameOrIp>
openclaw nodes canvas navigate https://example.com --node <idOrNameOrIp>
openclaw nodes canvas eval --node <idOrNameOrIp> --js "document.title"
หมายเหตุ:
canvas presentรับ URLs หรือเส้นทางไฟล์ภายในเครื่อง (--target) พร้อม--x/--y/--width/--heightแบบไม่บังคับสำหรับการจัดตำแหน่งcanvas evalรับ JS แบบ inline (--js) หรือ positional arg
A2UI (Canvas)
openclaw nodes canvas a2ui push --node <idOrNameOrIp> --text "Hello"
openclaw nodes canvas a2ui push --node <idOrNameOrIp> --jsonl ./payload.jsonl
openclaw nodes canvas a2ui reset --node <idOrNameOrIp>
หมายเหตุ:
- รองรับเฉพาะ A2UI v0.8 JSONL (v0.9/createSurface จะถูกปฏิเสธ)
รูปภาพ + วิดีโอ (กล้อง node)
รูปภาพ (jpg):
openclaw nodes camera list --node <idOrNameOrIp>
openclaw nodes camera snap --node <idOrNameOrIp> # default: both facings (2 MEDIA lines)
openclaw nodes camera snap --node <idOrNameOrIp> --facing front
คลิปวิดีโอ (mp4):
openclaw nodes camera clip --node <idOrNameOrIp> --duration 10s
openclaw nodes camera clip --node <idOrNameOrIp> --duration 3000 --no-audio
หมายเหตุ:
- node ต้องอยู่ใน foreground สำหรับ
canvas.*และcamera.*(การเรียกจาก background จะคืนค่าNODE_BACKGROUND_UNAVAILABLE) - ระยะเวลาคลิปถูกจำกัด (ปัจจุบัน
<= 60s) เพื่อหลีกเลี่ยง payload base64 ที่ใหญ่เกินไป - Android จะขอสิทธิ์
CAMERA/RECORD_AUDIOเมื่อทำได้; สิทธิ์ที่ถูกปฏิเสธจะล้มเหลวด้วย*_PERMISSION_REQUIRED
การบันทึกหน้าจอ (nodes)
nodes ที่รองรับจะเปิดเผย screen.record (mp4) ตัวอย่าง:
openclaw nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10
openclaw nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10 --no-audio
หมายเหตุ:
- ความพร้อมใช้งานของ
screen.recordขึ้นอยู่กับแพลตฟอร์มของ node - การบันทึกหน้าจอถูกจำกัดไว้ที่
<= 60s --no-audioปิดการจับเสียงไมโครโฟนบนแพลตฟอร์มที่รองรับ- ใช้
--screen <index>เพื่อเลือกจอแสดงผลเมื่อมีหลายหน้าจอ
ตำแหน่งที่ตั้ง (nodes)
Nodes เปิดเผย location.get เมื่อเปิดใช้ Location ในการตั้งค่า
CLI helper:
openclaw nodes location get --node <idOrNameOrIp>
openclaw nodes location get --node <idOrNameOrIp> --accuracy precise --max-age 15000 --location-timeout 10000
หมายเหตุ:
- Location ปิดตามค่าเริ่มต้น
- "Always" ต้องใช้สิทธิ์ของระบบ; การดึงข้อมูลใน background เป็นแบบ best-effort
- คำตอบมี lat/lon, accuracy (เมตร), และ timestamp
SMS (nodes Android)
nodes Android สามารถเปิดเผย sms.send เมื่อผู้ใช้ให้สิทธิ์ SMS และอุปกรณ์รองรับโทรศัพท์
การ invoke ระดับต่ำ:
openclaw nodes invoke --node <idOrNameOrIp> --command sms.send --params '{"to":"+15555550123","message":"Hello from OpenClaw"}'
หมายเหตุ:
- ต้องยอมรับ prompt สิทธิ์บนอุปกรณ์ Android ก่อน capability จะถูกโฆษณา
- อุปกรณ์แบบ Wi-Fi เท่านั้นที่ไม่มีโทรศัพท์จะไม่โฆษณา
sms.send
คำสั่งอุปกรณ์ Android + ข้อมูลส่วนบุคคล
nodes Android สามารถโฆษณากลุ่มคำสั่งเพิ่มเติมเมื่อเปิดใช้ capabilities ที่สอดคล้องกัน
กลุ่มที่มีให้:
device.status,device.info,device.permissions,device.healthnotifications.list,notifications.actionsphotos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
ตัวอย่างการเรียกใช้:
openclaw nodes invoke --node <idOrNameOrIp> --command device.status --params '{}'
openclaw nodes invoke --node <idOrNameOrIp> --command notifications.list --params '{}'
openclaw nodes invoke --node <idOrNameOrIp> --command photos.latest --params '{"limit":1}'
หมายเหตุ:
- คำสั่ง Motion ถูกควบคุมด้วยความสามารถตามเซ็นเซอร์ที่มีอยู่
คำสั่งระบบ (โฮสต์ Node / Node ของ Mac)
Node ของ macOS เปิดเผย system.run, system.notify และ system.execApprovals.get/set
โฮสต์ Node แบบไม่มี UI เปิดเผย system.run, system.which และ system.execApprovals.get/set
ตัวอย่าง:
openclaw nodes notify --node <idOrNameOrIp> --title "Ping" --body "Gateway ready"
openclaw nodes invoke --node <idOrNameOrIp> --command system.which --params '{"name":"git"}'
หมายเหตุ:
system.runส่งคืน stdout/stderr/exit code ในเพย์โหลด- ตอนนี้การเรียกใช้ Shell จะผ่านเครื่องมือ
execพร้อมhost=node;nodesยังคงเป็นพื้นผิว direct-RPC สำหรับคำสั่ง Node แบบชัดเจน nodes invokeไม่เปิดเผยsystem.runหรือsystem.run.prepare; ทั้งสองยังคงอยู่บนเส้นทาง exec เท่านั้น- เส้นทาง exec จะเตรียม
systemRunPlanแบบมาตรฐานก่อนการอนุมัติ เมื่อ ได้รับการอนุมัติแล้ว gateway จะส่งต่อแผนที่จัดเก็บไว้นั้น ไม่ใช่ฟิลด์ command/cwd/session ที่ผู้เรียกแก้ไขในภายหลัง system.notifyเคารพสถานะสิทธิ์การแจ้งเตือนในแอป macOS- เมทาดาทา
platform/deviceFamilyของ Node ที่ไม่รู้จักจะใช้ allowlist ค่าเริ่มต้นแบบระมัดระวัง ซึ่งไม่รวมsystem.runและsystem.whichหากคุณตั้งใจต้องใช้คำสั่งเหล่านั้นสำหรับแพลตฟอร์มที่ไม่รู้จัก ให้เพิ่มอย่างชัดเจนผ่านgateway.nodes.allowCommands system.runรองรับ--cwd,--env KEY=VAL,--command-timeoutและ--needs-screen-recording- สำหรับตัวห่อ Shell (
bash|sh|zsh ... -c/-lc) ค่า--envที่จำกัดตามคำขอจะถูกลดเหลือ allowlist แบบชัดเจน (TERM,LANG,LC_*,COLORTERM,NO_COLOR,FORCE_COLOR) - สำหรับการตัดสินใจ allow-always ในโหมด allowlist ตัวห่อการ dispatch ที่รู้จัก (
env,nice,nohup,stdbuf,timeout) จะบันทึกพาธของ executable ภายในแทนพาธของตัวห่อ หากการแกะตัวห่อไม่ปลอดภัย จะไม่มีการบันทึกรายการ allowlist โดยอัตโนมัติ - บนโฮสต์ Node ของ Windows ในโหมด allowlist การรันตัวห่อ Shell ผ่าน
cmd.exe /cต้องได้รับการอนุมัติ (รายการ allowlist เพียงอย่างเดียวจะไม่อนุญาตรูปแบบตัวห่อโดยอัตโนมัติ) system.notifyรองรับ--priority <passive|active|timeSensitive>และ--delivery <system|overlay|auto>- โฮสต์ Node จะเพิกเฉยต่อการ override
PATHและตัดคีย์เริ่มต้น/Shell ที่เป็นอันตรายออก (DYLD_*,LD_*,NODE_OPTIONS,PYTHON*,PERL*,RUBYOPT,SHELLOPTS,PS4) หากคุณต้องการรายการ PATH เพิ่มเติม ให้กำหนดค่าสภาพแวดล้อมของบริการโฮสต์ Node (หรือติดตั้งเครื่องมือในตำแหน่งมาตรฐาน) แทนการส่งPATHผ่าน--env - ในโหมด Node ของ macOS
system.runถูกควบคุมด้วยการอนุมัติ exec ในแอป macOS (Settings → Exec approvals) Ask/allowlist/full ทำงานเหมือนกับโฮสต์ Node แบบไม่มี UI; พรอมป์ที่ถูกปฏิเสธจะส่งคืนSYSTEM_RUN_DENIED - บนโฮสต์ Node แบบไม่มี UI
system.runถูกควบคุมด้วยการอนุมัติ exec (~/.openclaw/exec-approvals.json)
การผูก Node สำหรับ Exec
เมื่อมี Node หลายตัว คุณสามารถผูก exec กับ Node ที่ระบุได้
การตั้งค่านี้กำหนด Node เริ่มต้นสำหรับ exec host=node (และสามารถ override แยกตาม agent ได้)
ค่าเริ่มต้นส่วนกลาง:
openclaw config set tools.exec.node "node-id-or-name"
การ override ต่อ agent:
openclaw config get agents.list
openclaw config set agents.list[0].tools.exec.node "node-id-or-name"
ยกเลิกการตั้งค่าเพื่ออนุญาต Node ใดก็ได้:
openclaw config unset tools.exec.node
openclaw config unset agents.list[0].tools.exec.node
แผนที่สิทธิ์
Node อาจมีแผนที่ permissions ใน node.list / node.describe โดยใช้ชื่อสิทธิ์เป็นคีย์ (เช่น screenRecording, accessibility) พร้อมค่าบูลีน (true = ได้รับอนุญาต)
โฮสต์ Node แบบไม่มี UI (ข้ามแพลตฟอร์ม)
OpenClaw สามารถรัน โฮสต์ Node แบบไม่มี UI (ไม่มี UI) ที่เชื่อมต่อกับ Gateway
WebSocket และเปิดเผย system.run / system.which สิ่งนี้มีประโยชน์บน Linux/Windows
หรือสำหรับการรัน Node ขนาดเล็กคู่กับเซิร์ฟเวอร์
เริ่มต้น:
openclaw node run --host <gateway-host> --port 18789
หมายเหตุ:
- ยังจำเป็นต้องจับคู่ (Gateway จะแสดงพรอมป์การจับคู่อุปกรณ์)
- โฮสต์ Node จะจัดเก็บ id ของ Node, token, ชื่อที่แสดง และข้อมูลการเชื่อมต่อ Gateway ใน
~/.openclaw/node.json - การอนุมัติ exec จะถูกบังคับใช้ภายในเครื่องผ่าน
~/.openclaw/exec-approvals.json(ดู การอนุมัติ Exec) - บน macOS โฮสต์ Node แบบไม่มี UI จะเรียกใช้
system.runภายในเครื่องเป็นค่าเริ่มต้น ตั้งค่าOPENCLAW_NODE_EXEC_HOST=appเพื่อกำหนดเส้นทางsystem.runผ่านโฮสต์ exec ของแอปคู่ companion; เพิ่มOPENCLAW_NODE_EXEC_FALLBACK=0เพื่อบังคับให้ใช้โฮสต์แอปและล้มเหลวแบบปิดหากไม่พร้อมใช้งาน - เพิ่ม
--tls/--tls-fingerprintเมื่อ Gateway WS ใช้ TLS
โหมด Node ของ Mac
- แอป menubar ของ macOS เชื่อมต่อกับเซิร์ฟเวอร์ Gateway WS ในฐานะ Node (ดังนั้น
openclaw nodes …จึงทำงานกับ Mac เครื่องนี้ได้) - ในโหมด remote แอปจะเปิดอุโมงค์ SSH สำหรับพอร์ต Gateway และเชื่อมต่อกับ
localhost