العُقَد
العُقدة هي جهاز مُرافق (macOS/iOS/Android/بدون واجهة) يتصل بـ WebSocket الخاص بالبوابة (نفس المنفذ الخاص بالمشغِّلين) باستخدام role: "node" ويعرض سطحًا للأوامر (مثل canvas.*, camera.*, device.*, notifications.*, system.*) عبر node.invoke. تفاصيل البروتوكول: بروتوكول البوابة. النقل القديم: بروتوكول الجسر (TCP JSONL؛ مُهمَل/مُزال للعُقَد الحالية). يمكن لـ macOS أيضًا التشغيل في وضع العُقدة: يتصل تطبيق شريط القائمة بخادم WS الخاص بالبوابة ويعرض أوامر canvas/الكاميرا المحلية الخاصة به كعُقدة (وبالتالي تعمل openclaw nodes … ضد هذا الجهاز Mac). ملاحظات:
- العُقَد هي أجهزة طرفية، وليست بوابات. إنها لا تشغِّل خدمة البوابة.
- تصل رسائل Telegram/WhatsApp/إلخ إلى البوابة، وليس إلى العُقَد.
- دليل استكشاف الأخطاء وإصلاحها: /nodes/troubleshooting
الإقران + الحالة
تستخدم عُقَد WS إقران الأجهزة. تقدم العُقَد هوية جهاز أثناء connect؛ تنشئ البوابة طلب إقران جهاز لـ role: node. قم بالموافقة عبر واجهة سطر أوامر الأجهزة (أو واجهة المستخدم). واجهة سطر الأوامر السريعة:
openclaw devices list
openclaw devices approve <requestId>
openclaw devices reject <requestId>
openclaw nodes status
openclaw nodes describe --node <idOrNameOrIp>
ملاحظات:
nodes statusيضع علامة على العُقدة على أنها مُقرَنة عندما يتضمن دور إقران الجهاز الخاص بهاnode.node.pair.*(CLI:openclaw nodes pending/approve/reject) هو مخزن إقران عُقَد منفصل تملكه البوابة؛ إنه لا يتحكم في مصافحةconnectالخاصة بـ WS.
مضيف العُقدة البعيدة (system.run)
استخدم مضيف عُقدة عندما يعمل البوابة على جهاز واحد وتريد تنفيذ الأوامر على جهاز آخر. لا يزال النموذج يتحدث إلى البوابة؛ تقوم البوابة بتوجيه مكالمات exec إلى مضيف العُقدة عند تحديد host=node.
ما الذي يعمل أين
- مضيف البوابة: يستقبل الرسائل، يشغِّل النموذج، يُوجِّه مكالمات الأدوات.
- مضيف العُقدة: ينفذ
system.run/system.whichعلى جهاز العُقدة. - الموافقات: يتم فرضها على مضيف العُقدة عبر
~/.openclaw/exec-approvals.json.
بدء تشغيل مضيف عُقدة (في المقدمة)
على جهاز العُقدة:
openclaw node run --host <gateway-host> --port 18789 --display-name "Build Node"
بوابة بعيدة عبر نفق SSH (ربط loopback)
إذا كانت البوابة تربط loopback (gateway.bind=loopback، الافتراضي في الوضع المحلي)، لا يمكن لمضيفي العُقدة البعيدة الاتصال مباشرة. أنشئ نفق SSH وأشر مضيف العُقدة إلى الطرف المحلي للنفق. مثال (مضيف العُقدة -> مضيف البوابة):
# Terminal A (استمر في التشغيل): توجيه المنفذ المحلي 18790 -> بوابة 127.0.0.1:18789
ssh -N -L 18790:127.0.0.1:18789 user@gateway-host
# Terminal B: تصدير رمز البوابة والاتصال عبر النفق
export OPENCLAW_GATEWAY_TOKEN="<gateway-token>"
openclaw node run --host 127.0.0.1 --port 18790 --display-name "Build Node"
ملاحظات:
- الرمز هو
gateway.auth.tokenمن تكوين البوابة (~/.openclaw/openclaw.jsonعلى مضيف البوابة). - يقرأ
openclaw node runOPENCLAW_GATEWAY_TOKENللمصادقة.
بدء تشغيل مضيف عُقدة (خدمة)
openclaw node install --host <gateway-host> --port 18789 --display-name "Build Node"
openclaw node restart
الإقران + التسمية
على مضيف البوابة:
openclaw devices list
openclaw devices approve <requestId>
openclaw nodes status
خيارات التسمية:
--display-nameعلىopenclaw node run/openclaw node install(يستمر في~/.openclaw/node.jsonعلى العُقدة).openclaw nodes rename --node <id|name|ip> --name "Build Node"(تجاوز من البوابة).
قائمة السماح للأوامر
موافقات التنفيذ هي لكل مضيف عُقدة. أضف مدخلات قائمة السماح من البوابة:
openclaw approvals allowlist add --node <id|name|ip> "/usr/bin/uname"
openclaw approvals allowlist add --node <id|name|ip> "/usr/bin/sw_vers"
تعيش الموافقات على مضيف العُقدة في ~/.openclaw/exec-approvals.json.
توجيه exec إلى العُقدة
تكوين الإعدادات الافتراضية (تكوين البوابة):
openclaw config set tools.exec.host node
openclaw config set tools.exec.security allowlist
openclaw config set tools.exec.node "<id-or-name>"
أو لكل جلسة:
/exec host=node security=allowlist node=<id-or-name>
بمجرد التعيين، أي استدعاء exec مع host=node يعمل على مضيف العُقدة (خاضع لقائمة السماح/الموافقات الخاصة بالعُقدة). متعلق:
استدعاء الأوامر
مستوى منخفض (RPC خام):
openclaw nodes invoke --node <idOrNameOrIp> --command canvas.eval --params '{"javaScript":"location.href"}'
توجد مساعدات ذات مستوى أعلى لسير عمل "إرفاق ملف MEDIA للوكيل" الشائعة.
لقطات الشاشة (لقطات canvas)
إذا كانت العُقدة تعرض Canvas (WebView)، فإن canvas.snapshot تُرجع { format, base64 }. مساعد CLI (يكتب إلى ملف مؤقت ويطبع 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تقبل عناوين URL أو مسارات الملفات المحلية (--target)، بالإضافة إلى--x/--y/--width/--heightاختيارية لوضعها.canvas evalتقبل JS مضمن (--js) أو وسيطة موضعية.
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).
الصور + مقاطع الفيديو (كاميرا العُقدة)
الصور (jpg):
openclaw nodes camera list --node <idOrNameOrIp>
openclaw nodes camera snap --node <idOrNameOrIp> # الافتراضي: كلا الاتجاهين (سطرين MEDIA)
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
ملاحظات:
- يجب أن تكون العُقدة في المقدمة لـ
canvas.*وcamera.*(تُرجع المكالمات في الخلفيةNODE_BACKGROUND_UNAVAILABLE). - يتم تحديد مدة المقطع (حاليًا
<= 60s) لتجنب حمولات base64 كبيرة الحجم. - سيطالب Android بأذونات
CAMERA/RECORD_AUDIOعندما يكون ذلك ممكنًا؛ تفشل الأذونات المرفوضة بـ*_PERMISSION_REQUIRED.
تسجيلات الشاشة (العُقَد)
تعرض العُقَد 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أن يكون تطبيق العُقدة في المقدمة. - سيعرض Android مطالبة تسجيل الشاشة للنظام قبل التسجيل.
- يتم تحديد تسجيلات الشاشة إلى
<= 60s. --no-audioتعطيل التقاط الميكروفون (مدعوم على iOS/Android؛ يستخدم macOS تقاطعات صوت النظام).- استخدم
--screen <index>لتحديد شاشة عند توفر شاشات متعددة.
الموقع (العُقَد)
تعرض العُقدة location.get عندما يكون الموقع مفعلًا في الإعدادات. مساعد CLI:
openclaw nodes location get --node <idOrNameOrIp>
openclaw nodes location get --node <idOrNameOrIp> --accuracy precise --max-age 15000 --location-timeout 10000
ملاحظات:
- الموقع معطَّل افتراضيًا.
- يتطلب "دائمًا" إذنًا من النظام؛ جلب الخلفية هو أفضل جهد.
- تتضمن الاستجابة خط العرض/خط الطول والدقة (بالأمتار) والطابع الزمني.
الرسائل النصية (عُقَد Android)
يمكن لعُقَد Android عرض sms.send عندما يمنح المستخدم إذن SMS ويدعم الجهاز الاتصالات الهاتفية. استدعاء منخفض المستوى:
openclaw nodes invoke --node <idOrNameOrIp> --command sms.send --params '{"to":"+15555550123","message":"Hello from OpenClaw"}'
ملاحظات:
- يجب قبول مطالبة الإذن على جهاز Android قبل الإعلان عن القدرة.
- لن تعلن الأجهزة التي تعمل فقط عبر Wi-Fi بدون اتصالات هاتفية عن
sms.send.
أوامر جهاز Android والبيانات الشخصية
يمكن لعُقَد Android الإعلان عن عائلات أوامر إضافية عند تمكين القدرات المقابلة. العائلات المتاحة:
device.status,device.info,device.permissions,device.healthnotifications.list,notifications.actionsphotos.latestcontacts.search,contacts.addcalendar.events,calendar.addmotion.activity,motion.pedometerapp.update
أمثلة استدعاء:
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}'
ملاحظات:
- أوامر الحركة مقيدة بالقدرة بواسطة أجهزة الاستشعار المتاحة.
app.updateمقيدة بالإذن والسياسة بواسطة وقت تشغيل العُقدة.
أوامر النظام (مضيف العُقدة / عُقدة mac)
تعرض عُقدة macOS system.run, system.notify, و system.execApprovals.get/set. يعرض مضيف العُقدة بدون واجهة system.run, system.which, و system.execApprovals.get/set. أمثلة:
openclaw nodes run --node <idOrNameOrIp> -- echo "Hello from mac node"
openclaw nodes notify --node <idOrNameOrIp> --title "Ping" --body "Gateway ready"
ملاحظات:
- تُرجع
system.runstdout/stderr/رمز الخروج في الحمولة. - تحترم
system.notifyحالة إذن الإشعارات في تطبيق macOS. - يستخدم
platform/deviceFamilyللعُقدة غير المعروفة قائمة سماح افتراضية محافظة تستثني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ذات النطاق المطلوب إلى قائمة سماح صريحة (TERM,LANG,LC_*,COLORTERM,NO_COLOR,FORCE_COLOR). - لقرارات السماح دائمًا في وضع قائمة السماح، تستمر برامج غلاف الإرسال المعروفة (
env,nice,nohup,stdbuf,timeout) في مسارات الملفات القابلة للتنفيذ الداخلية بدلاً من مسارات الغلاف. إذا كان فك الغلاف غير آمن، فلن يستمر أي مدخل في قائمة السماح تلقائيًا. - على مضيفي العُقدة Windows في وضع قائمة السماح، تتطلب عمليات التشغيل عبر غلاف shell باستخدام
cmd.exe /cموافقة (المدخل في قائمة السماح وحده لا يسمح تلقائيًا بصيغة الغلاف). - تدعم
system.notify--priority <passive|active|timeSensitive>و--delivery <system|overlay|auto>. - يتجاهل مضيفو العُقدة تجاوزات
PATHويزيل مفاتيح بدء التشغيل/الغلاف الخطرة (DYLD_*,LD_*,NODE_OPTIONS,PYTHON*,PERL*,RUBYOPT,SHELLOPTS,PS4). إذا كنت بحاجة إلى مدخلات PATH إضافية، فقم بتكوين بيئة خدمة مضيف العُقدة (أو تثبيت الأدوات في مواقع قياسية) بدلاً من تمريرPATHعبر--env. - في وضع عُقدة macOS، تكون
system.runمقيدة بموافقات التنفيذ في تطبيق macOS (الإعدادات → موافقات التنفيذ). تتصرف ask/allowlist/full بنفس طريقة مضيف العُقدة بدون واجهة؛ تُرجع المطالبات المرفوضةSYSTEM_RUN_DENIED. - على مضيف العُقدة بدون واجهة، تكون
system.runمقيدة بموافقات التنفيذ (~/.openclaw/exec-approvals.json).
ربط exec بالعُقدة
عند توفر عُقَد متعددة، يمكنك ربط exec بعُقدة محددة. هذا يحدد العُقدة الافتراضية لـ exec host=node (ويمكن تجاوزها لكل وكيل). الافتراضي العام:
openclaw config set tools.exec.node "node-id-or-name"
تجاوز لكل وكيل:
openclaw config get agents.list
openclaw config set agents.list[0].tools.exec.node "node-id-or-name"
إلغاء التعيين للسماح بأي عُقدة:
openclaw config unset tools.exec.node
openclaw config unset agents.list[0].tools.exec.node
خريطة الأذونات
قد تتضمن العُقَد خريطة permissions في node.list / node.describe، مفتاحها اسم الإذن (مثل screenRecording, accessibility) بقيم منطقية (true = مُمنَح).
مضيف العُقدة بدون واجهة (عبر المنصات)
يمكن لـ OpenClaw تشغيل مضيف عُقدة بدون واجهة (بدون واجهة مستخدم) يتصل بـ WebSocket الخاص بالبوابة ويعرض system.run / system.which. هذا مفيد على Linux/Windows أو لتشغيل عُقدة صغيرة بجانب خادم. ابدأه:
openclaw node run --host <gateway-host> --port 18789
ملاحظات:
- لا يزال الإقران مطلوبًا (ستعرض البوابة مطالبة إقران جهاز).
- يخزن مضيف العُقدة معرف العُقدة والرمز واسم العرض ومعلومات اتصال البوابة في
~/.openclaw/node.json. - يتم فرض موافقات التنفيذ محليًا عبر
~/.openclaw/exec-approvals.json(انظر موافقات Exec). - على macOS، ينفذ مضيف العُقدة بدون واجهة
system.runمحليًا افتراضيًا. عيّنOPENCLAW_NODE_EXEC_HOST=appلتوجيهsystem.runعبر مضيف تنفيذ تطبيق المرافق؛ أضفOPENCLAW_NODE_EXEC_FALLBACK=0لتطلب مضيف التطبيق والفشل مغلقًا إذا كان غير متاح. - أضف
--tls/--tls-fingerprintعندما يستخدم Gateway WS TLS.
وضع عُقدة Mac
- يتصل تطبيق شريط القائمة macOS بخادم WS الخاص بالبوابة كعُقدة (وبالتالي تعمل
openclaw nodes …ضد هذا الجهاز Mac). - في الوضع البعيد، يفتح التطبيق نفق SSH لمنفذ البوابة ويتصل بـ
localhost.