Nodes
العقدة هي جهاز مرافق (macOS/iOS/Android/بدون واجهة) يتصل بـ Gateway WebSocket (المنفذ نفسه الذي يستخدمه المشغلون) معrole: "node" ويعرض سطح أوامر (مثل canvas.* وcamera.* وdevice.* وnotifications.* وsystem.*) عبر node.invoke. تفاصيل البروتوكول: بروتوكول Gateway.
وسيلة النقل القديمة: بروتوكول Bridge (TCP JSONL؛
لأغراض تاريخية فقط بالنسبة إلى العقد الحالية).
يمكن لـ macOS أيضًا العمل في وضع node: حيث يتصل تطبيق شريط القوائم بخادم WS الخاص بـ Gateway ويعرض أوامر canvas/camera المحلية كعقدة (لذلك يعمل openclaw nodes … على هذا الـ Mac).
ملاحظات:
- Nodes هي أجهزة طرفية وليست بوابات. فهي لا تشغّل خدمة gateway.
- تصل رسائل Telegram/WhatsApp/إلخ إلى gateway، وليس إلى nodes.
- دليل استكشاف الأخطاء وإصلاحها: /nodes/troubleshooting
الاقتران + الحالة
تستخدم WS nodes اقتران الأجهزة. تعرض العقد هويتها أثناءconnect؛ ويقوم Gateway
بإنشاء طلب اقتران جهاز لـ role: node. وافق عليه عبر CLI الخاص بالأجهزة (أو عبر واجهة المستخدم).
CLI سريع:
requestId جديد. أعد تشغيل
openclaw devices list قبل الموافقة.
ملاحظات:
- يعلّم
nodes statusالعقدة على أنها مقترنة عندما تتضمن أدوار اقتران الجهاز لديها قيمةnode. - سجل اقتران الجهاز هو العقد الدائم للأدوار المعتمدة. ويبقى تدوير الرموز داخل ذلك العقد؛ ولا يمكنه ترقية عقدة مقترنة إلى دور مختلف لم تمنحه الموافقة أصلًا.
- يُعد
node.pair.*(CLI: openclaw nodes pending/approve/reject/rename) مخزن اقتران عقد منفصلًا مملوكًا للـ gateway؛ وهو لا يتحكم في مصافحة WS connect. - يتبع نطاق الموافقة الأوامر المعلنة في الطلب المعلق:
- طلب بلا أوامر:
operator.pairing - أوامر node غير التنفيذية:
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 عبر
~/.openclaw/exec-approvals.json.
- تربط عمليات تشغيل العقدة المدعومة بالموافقة سياق الطلب الدقيق.
- بالنسبة إلى عمليات التنفيذ المباشر لملفات shell/runtime، يربط OpenClaw أيضًا على أساس أفضل جهد مُعامل ملف محلي فعلي واحد، ويرفض التشغيل إذا تغيّر ذلك الملف قبل التنفيذ.
- إذا لم يتمكن OpenClaw من تحديد ملف محلي فعلي واحد بالضبط لأمر interpreter/runtime، فسيتم رفض التنفيذ المدعوم بالموافقة بدلًا من الادعاء بتغطية كاملة لوقت التشغيل. استخدم sandboxing، أو مضيفات منفصلة، أو قائمة سماح موثوقة صريحة/تدفقًا كاملاً من أجل دلالات interpreter الأوسع.
ابدأ مضيف node (مقدمة)
على جهاز node:Gateway بعيدة عبر نفق SSH (ربط loopback)
إذا كانت Gateway ترتبط بـ loopback (gateway.bind=loopback، وهو الافتراضي في الوضع المحلي)،
فلا يمكن لمضيفات node البعيدة الاتصال مباشرة. أنشئ نفق SSH ووجّه
مضيف node إلى الطرف المحلي من النفق.
مثال (مضيف node -> مضيف gateway):
- يدعم
openclaw node runمصادقة الرمز أو كلمة المرور. - يُفضَّل استخدام متغيرات البيئة:
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD. - بديل التكوين هو
gateway.auth.token/gateway.auth.password. - في الوضع المحلي، يتجاهل مضيف node عمدًا القيم
gateway.remote.token/gateway.remote.password. - في الوضع البعيد، تكون
gateway.remote.token/gateway.remote.passwordمؤهلة وفق قواعد الأولوية البعيدة. - إذا كانت
gateway.auth.*المحلية الفعالة مكوّنة كـ SecretRefs ولكنها غير محلولة، فإن مصادقة مضيف node تفشل بشكل مغلق. - لا يحترم حل مصادقة مضيف node إلا متغيرات البيئة
OPENCLAW_GATEWAY_*.
ابدأ مضيف node (كخدمة)
اقترن + سمِّ
على مضيف gateway:openclaw devices list
ووافق على requestId الحالية.
خيارات التسمية:
--display-nameعلىopenclaw node run/openclaw node install(تُحفَظ في~/.openclaw/node.jsonعلى العقدة).openclaw nodes rename --node <id|name|ip> --name "Build Node"(تجاوز من gateway).
أضف الأوامر إلى قائمة السماح
تكون موافقات exec لكل مضيف node. أضف إدخالات قائمة السماح من gateway:~/.openclaw/exec-approvals.json.
وجّه exec إلى node
كوّن القيم الافتراضية (تكوين gateway):exec مع host=node يعمل على مضيف node (مع مراعاة
قائمة السماح/الموافقات الخاصة بالعقدة).
لن يختار host=auto مضيف node ضمنيًا من تلقاء نفسه، لكن يُسمح بطلب صريح لكل استدعاء من host=node من وضع auto. وإذا كنت تريد أن يكون تنفيذ node هو الافتراضي للجلسة، فعيّن tools.exec.host=node أو /exec host=node ... صراحةً.
ذو صلة:
استدعاء الأوامر
منخفض المستوى (RPC خام):لقطات الشاشة (لقطات canvas)
إذا كانت العقدة تعرض Canvas (WebView)، فإنcanvas.snapshot تعيد { format, base64 }.
مساعد CLI (يكتب إلى ملف مؤقت ويطبع MEDIA:<path>):
عناصر تحكم Canvas
- يقبل
canvas presentعناوين URL أو مسارات ملفات محلية (--target)، بالإضافة إلى--x/--y/--width/--heightاختياريًا لتحديد الموضع. - يقبل
canvas evalJavaScript مضمنة (--js) أو وسيطة موضعية.
A2UI (Canvas)
- يتم دعم A2UI v0.8 JSONL فقط (يتم رفض v0.9/createSurface).
الصور + الفيديوهات (كاميرا العقدة)
الصور (jpg):
mp4):
- يجب أن تكون العقدة في المقدمة من أجل
canvas.*وcamera.*(تعيد الاستدعاءات في الخلفيةNODE_BACKGROUND_UNAVAILABLE). - يتم تقييد مدة المقطع (حاليًا
<= 60s) لتجنب الحمولات الكبيرة جدًا بتنسيق base64. - سيطلب Android أذونات
CAMERA/RECORD_AUDIOمتى أمكن؛ وتفشل الأذونات المرفوضة برسالة*_PERMISSION_REQUIRED.
تسجيلات الشاشة (nodes)
تعرض العقد المدعومة الأمرscreen.record (mp4). مثال:
- يعتمد توفر
screen.recordعلى منصة العقدة. - يتم تقييد تسجيلات الشاشة إلى
<= 60s. - يعطّل
--no-audioالتقاط الميكروفون على المنصات المدعومة. - استخدم
--screen <index>لاختيار شاشة عندما تتوفر شاشات متعددة.
الموقع (nodes)
تعرض Nodes الأمرlocation.get عند تمكين Location في الإعدادات.
مساعد CLI:
- يكون Location معطلًا افتراضيًا.
- تتطلب قيمة “Always” إذنًا من النظام؛ ويكون الجلب في الخلفية على أساس أفضل جهد.
- تتضمن الاستجابة lat/lon والدقة (بالمتر) والطابع الزمني.
SMS (عقد Android)
يمكن لعقد Android عرضsms.send عندما يمنح المستخدم إذن SMS ويدعم الجهاز الاتصال الخلوي.
استدعاء منخفض المستوى:
- يجب قبول مطالبة الإذن على جهاز Android قبل الإعلان عن هذه القدرة.
- لن تعلن الأجهزة التي تعمل عبر Wi‑Fi فقط ومن دون اتصال خلوي عن
sms.send.
أوامر جهاز Android + البيانات الشخصية
يمكن لعقد Android الإعلان عن عائلات أوامر إضافية عند تمكين القدرات المقابلة. العائلات المتاحة:device.statusوdevice.infoوdevice.permissionsوdevice.healthnotifications.listوnotifications.actionsphotos.latestcontacts.searchوcontacts.addcalendar.eventsوcalendar.addcallLog.searchsms.searchmotion.activityوmotion.pedometer
- يتم تقييد أوامر الحركة بالقدرات المتاحة من المستشعرات.
أوامر النظام (مضيف node / عقدة mac)
تعرض عقدة macOS الأوامرsystem.run وsystem.notify وsystem.execApprovals.get/set.
ويعرض مضيف node بدون واجهة الأوامر system.run وsystem.which وsystem.execApprovals.get/set.
أمثلة:
- يعيد
system.runقيمة stdout/stderr/exit code ضمن الحمولة. - يمر تنفيذ shell الآن عبر أداة
execمعhost=node؛ بينما تبقىnodesسطح RPC مباشرًا لأوامر العقدة الصريحة. - لا تعرض
nodes invokeالأمرينsystem.runأوsystem.run.prepare؛ فهذان يبقيان على مسار exec فقط. - يقوم مسار exec بتحضير
systemRunPlanمعتمد قبل الموافقة. وبمجرد منح الموافقة، تقوم gateway بتمرير تلك الخطة المخزنة، وليس أي حقول أمر/cwd/session معدّلة لاحقًا من قبل المستدعي. - يحترم
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). - بالنسبة إلى قرارات السماح الدائم في وضع allowlist، تقوم مغلفات الإرسال المعروفة (
envوniceوnohupوstdbufوtimeout) بحفظ مسارات الملفات التنفيذية الداخلية بدلًا من مسارات المغلف. وإذا لم يكن فك المغلف آمنًا، فلن يتم حفظ أي إدخال لقائمة السماح تلقائيًا. - على مضيفات node التي تعمل بنظام Windows في وضع allowlist، تتطلب عمليات تشغيل مغلفات shell عبر
cmd.exe /cموافقة (ولا يؤدي إدخال allowlist وحده إلى السماح التلقائي بصيغة المغلف). - يدعم
system.notifyالخيارين--priority <passive|active|timeSensitive>و--delivery <system|overlay|auto>. - تتجاهل مضيفات node تجاوزات
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 بدون واجهة؛ وتعيد المطالبات المرفوضةSYSTEM_RUN_DENIED. - على مضيف node بدون واجهة، يتم التحكم في
system.runبواسطة موافقات exec (~/.openclaw/exec-approvals.json).
ربط exec بالعقدة
عند توفر عدة nodes، يمكنك ربط exec بعقدة محددة. ويؤدي هذا إلى تعيين العقدة الافتراضية لـexec host=node (ويمكن تجاوزها لكل وكيل).
الافتراضي العام:
خريطة الأذونات
قد تتضمن Nodes خريطةpermissions في node.list / node.describe، مفهرسة باسم الإذن (مثل screenRecording وaccessibility) مع قيم منطقية (true = ممنوح).
مضيف node بدون واجهة (متعدد المنصات)
يمكن لـ OpenClaw تشغيل مضيف node بدون واجهة (من دون UI) يتصل بـ Gateway WebSocket ويعرضsystem.run / system.which. وهذا مفيد على Linux/Windows
أو لتشغيل عقدة مصغّرة إلى جانب خادم.
ابدأ تشغيله:
- ما يزال الاقتران مطلوبًا (سيعرض Gateway مطالبة اقتران جهاز).
- يخزن مضيف node معرّف العقدة الخاص به، ورمزه، واسم العرض، ومعلومات اتصال gateway في
~/.openclaw/node.json. - تُفرض موافقات exec محليًا عبر
~/.openclaw/exec-approvals.json(راجع موافقات Exec). - على macOS، ينفذ مضيف node بدون واجهة الأمر
system.runمحليًا افتراضيًا. اضبطOPENCLAW_NODE_EXEC_HOST=appلتوجيهsystem.runعبر مضيف exec في التطبيق المرافق؛ وأضفOPENCLAW_NODE_EXEC_FALLBACK=0لفرض استخدام مضيف التطبيق والفشل بشكل مغلق إذا لم يكن متاحًا. - أضف
--tls/--tls-fingerprintعندما تستخدم Gateway WS بروتوكول TLS.
وضع node على Mac
- يتصل تطبيق شريط القوائم في macOS بخادم Gateway WS كعقدة (لذلك تعمل
openclaw nodes …على هذا الـ Mac). - في الوضع البعيد، يفتح التطبيق نفق SSH لمنفذ Gateway ويتصل بـ
localhost.