macOS companion app

التحكم عن بُعد

يتيح هذا التدفق لتطبيق macOS العمل كوحدة تحكم عن بُعد كاملة في Gateway تابع لـ OpenClaw يعمل على مضيف آخر (حاسوب مكتبي/خادم). يتصل التطبيق مباشرةً بعناوين URL الموثوقة للـ Gateway على الشبكة المحلية LAN أو شبكة Tailnet، أو يدير نفق SSH عندما يكون الـ Gateway البعيد مقيّدًا بـ local loopback فقط. تستخدم فحوصات السلامة وتمرير التنشيط الصوتي ودردشة الويب الإعداد البعيد نفسه من Settings -> General.

الأوضاع

  • محلي (جهاز Mac هذا): يعمل كل شيء على الحاسوب المحمول؛ ولا يُستخدم SSH.
  • بعيد عبر SSH (افتراضي): تعمل أوامر OpenClaw على المضيف البعيد. يفتح التطبيق اتصال SSH باستخدام -o BatchMode، والهوية/المفتاح الذي اخترته، وإعادة توجيه منفذ محلي.
  • بعيد مباشر (ws/wss): من دون نفق SSH؛ يتصل التطبيق بعنوان URL للـ Gateway مباشرةً (عبر LAN أو Tailscale أو Tailscale Serve أو وكيل HTTPS عكسي عام).

وسائل النقل البعيدة

  • نفق SSH (افتراضي): يستخدم ssh -N -L ... لإعادة توجيه منفذ الـ Gateway إلى المضيف المحلي. يرى الـ Gateway عنوان IP الخاص بالعقدة على أنه 127.0.0.1 لأن النفق يستخدم local loopback.
  • مباشر (ws/wss): يتصل بعنوان URL للـ Gateway مباشرةً. يرى الـ Gateway عنوان IP الحقيقي للعميل.

يعطّل التطبيق تعدد إرسال اتصالات SSH والتشغيل في الخلفية بعد المصادقة لعمليات SSH الخاصة به، حتى يتمكن من مراقبة العملية المحددة وإعادة تشغيلها، ولو كان الاسم المستعار المحدد يفعّل ControlMaster أو ForkAfterAuthentication.

يكون التحقق من مفتاح مضيف SSH صارمًا افتراضيًا لأن بيانات اعتماد الـ Gateway تنتقل عبر هذا النفق. لاستخدام سلوك الثقة الخاص باسم مستعار مُدار لـ SSH، عيّن --ssh-host-key-policy openssh عبر openclaw-mac configure-remote، أو عيّن gateway.remote.sshHostKeyPolicy إلى "openssh" مباشرةً. راجع الاسم المستعار وأي إعداد مطابق لـ Host * أو إعداد للنظام قبل اختيار ذلك. تؤدي تغييرات وجهة SSH (في التطبيق أو عبر configure-remote) إلى إعادة السياسة إلى strict ما لم تختر صراحةً استخدامها مجددًا مع الوجهة الجديدة.

في وضع نفق SSH، تُحفظ أسماء المضيفين المكتشفة على LAN أو Tailnet في gateway.remote.sshTarget. يُبقي التطبيق gateway.remote.url على نقطة نهاية النفق المحلي (مثل ws://127.0.0.1:18789) بحيث تستخدم CLI ودردشة الويب وخدمة مضيف العقدة المحلية وسيلة نقل local loopback نفسها. عندما يعيد الاكتشاف كلاً من عناوين IP الأولية لشبكة Tailnet وأسماء المضيفين المستقرة، يفضّل التطبيق أسماء Tailscale MagicDNS أو أسماء LAN حتى تكون الاتصالات أكثر قدرة على تحمّل تغييرات العناوين. إذا كان منفذ النفق المحلي مختلفًا عن منفذ الـ Gateway البعيد، فعيّن gateway.remote.remotePort إلى المنفذ الموجود على المضيف البعيد.

يتولى مضيف عقدة CLI أتمتة المتصفح في الوضع البعيد، وليس عقدة تطبيق macOS الأصلية. يشغّل التطبيق خدمة مضيف العقدة المثبتة عندما يكون ذلك ممكنًا؛ لتمكين التحكم في المتصفح من جهاز Mac ذاك، ثبّتها وشغّلها باستخدام openclaw node install ... وopenclaw node start (أو شغّل openclaw node run ... في الواجهة الأمامية)، ثم استهدف تلك العقدة القادرة على تشغيل المتصفح.

المتطلبات المسبقة على المضيف البعيد

  1. ثبّت Node وpnpm وابنِ/ثبّت OpenClaw CLI (pnpm install && pnpm build && pnpm link --global).
  2. تأكد من وجود openclaw ضمن PATH لأغلفة الأوامر غير التفاعلية (أنشئ رابطًا رمزيًا داخل /usr/local/bin أو /opt/homebrew/bin عند الحاجة).
  3. لنقل SSH: أعدّ مصادقة SSH القائمة على المفاتيح. يُوصى باستخدام عناوين IP الخاصة بـ Tailscale لضمان إمكانية وصول مستقرة من خارج LAN.

إعداد تطبيق macOS

لإعداد التطبيق مسبقًا من دون تدفق الترحيب، عبر SSH:

bash
openclaw-mac configure-remote \  --ssh-target user@gateway-host \  --local-port 18789 \  --remote-port 18789 \  --token "$OPENCLAW_GATEWAY_TOKEN"

أو بالنسبة إلى Gateway يمكن الوصول إليه بالفعل عبر LAN موثوقة أو Tailnet، فتجاوز SSH كليًا:

bash
openclaw-mac configure-remote \  --direct-url ws://192.168.0.202:18789 \  --token "$OPENCLAW_GATEWAY_TOKEN"

يكتب كلا النموذجين في ~/.openclaw/openclaw.json، ويضعان علامة اكتمال الإعداد الأولي، ويتيحان للتطبيق إدارة وسيلة النقل المحددة عند التشغيل التالي. القيمة الافتراضية لـ --local-port و--remote-port هي 18789. العلامات الأخرى: --password، و--identity <path>، و--ssh-host-key-policy <strict|openssh>، و--project-root <path>، و--cli-path <path>، و--json. شغّل openclaw-mac configure-remote --help للاطلاع على المرجع الكامل.

للإعداد من واجهة المستخدم بدلًا من ذلك:

  1. افتح Settings -> General.
  2. ضمن تشغيل OpenClaw، اختر بعيد واضبط:
    • وسيلة النقل: نفق SSH أو مباشر (ws/wss).
    • وجهة SSH: user@host (مع :port اختياري). إذا كان الـ Gateway على LAN نفسها ويعلن عن نفسه عبر Bonjour، فاختره من القائمة المكتشفة لملء هذا الحقل تلقائيًا.
    • عنوان URL للـ Gateway (للوضع المباشر فقط): wss://gateway.example.ts.net (أو ws://... للاستخدام المحلي/عبر LAN).
    • ملف الهوية (متقدم): مسار مفتاحك.
    • جذر المشروع (متقدم): مسار النسخة المستخرجة البعيدة المستخدمة للأوامر.
    • مسار CLI (متقدم): مسار اختياري إلى نقطة دخول/ملف تنفيذي قابل للتشغيل لـ openclaw (يُملأ تلقائيًا عند الإعلان عنه).
  3. اضغط اختبار الاتصال البعيد. يعني النجاح أن الأمر البعيد openclaw status --json قد عمل بصورة صحيحة. تعني حالات الفشل عادةً وجود مشكلات في PATH أو CLI؛ ويعني رمز الخروج 127 أن CLI لم يُعثر عليه على المضيف البعيد.
  4. تعمل فحوصات السلامة ودردشة الويب الآن تلقائيًا عبر وسيلة النقل المحددة.

دردشة الويب

  • نفق SSH: يتصل بالـ Gateway عبر منفذ تحكم WebSocket المُعاد توجيهه (الافتراضي 18789).
  • مباشر (ws/wss): يتصل مباشرةً بعنوان URL المُعدّ للـ Gateway.
  • لا يوجد خادم HTTP منفصل لدردشة الويب.

الأذونات

  • يحتاج المضيف البعيد إلى موافقات TCC نفسها المطلوبة محليًا (الأتمتة، وإمكانية الوصول، وتسجيل الشاشة، والميكروفون، والتعرّف على الكلام، والإشعارات). شغّل الإعداد الأولي على ذلك الجهاز مرة واحدة لمنحها.
  • تعلن العُقد عن حالة أذوناتها عبر node.list / node.describe حتى يعرف الوكلاء ما هو متاح.

ملاحظات أمنية

  • يُفضّل الربط بـ local loopback على المضيف البعيد والاتصال عبر SSH أو Tailscale Serve أو عنوان URL مباشر موثوق على Tailnet/LAN.
  • يتطلب نفق SSH افتراضيًا مفتاح مضيف موثوقًا مسبقًا. وثّق مفتاح المضيف أولًا (بإضافته إلى ملف المضيفين المعروفين المُعدّ)، أو عيّن صراحةً gateway.remote.sshHostKeyPolicy: "openssh" لاسم مستعار مُدار تقبل سياسة الثقة الخاصة به في OpenSSH.
  • إذا ربطت Gateway بواجهة غير local loopback، فاشترط مصادقة Gateway صالحة: رمز مميز، أو كلمة مرور، أو وكيل عكسي مدرك للهوية مع gateway.auth.mode: "trusted-proxy".
  • راجع الأمان وTailscale.

تدفق تسجيل الدخول إلى WhatsApp (عن بُعد)

  • شغّل openclaw channels login --channel whatsapp --verbose على المضيف البعيد. امسح رمز QR باستخدام WhatsApp على هاتفك.
  • أعد تشغيل تسجيل الدخول على ذلك المضيف إذا انتهت صلاحية المصادقة. يكشف فحص السلامة مشكلات الربط.

استكشاف الأخطاء وإصلاحها

العَرَض السبب / الإصلاح
exit 127 / غير موجود الأمر openclaw غير موجود في PATH للأصداف غير المخصصة لتسجيل الدخول. أضفه إلى /etc/paths أو ملف rc الخاص بالصدفة، أو أنشئ رابطًا رمزيًا له في /usr/local/bin أو /opt/homebrew/bin.
فشل فحص السلامة تحقّق من إمكانية الوصول عبر SSH ومن PATH، وتأكد من تسجيل دخول Baileys إلى WhatsApp (openclaw status --json).
توقّف دردشة الويب عن الاستجابة تأكد من تشغيل Gateway على المضيف البعيد ومن تطابق المنفذ المُعاد توجيهه مع منفذ WS الخاص بـ Gateway؛ إذ تتطلب واجهة المستخدم اتصال WS سليمًا.
يعرض عنوان IP الخاص بـ Node القيمة 127.0.0.1 هذا متوقع مع نفق SSH. غيّر النقل إلى مباشر (ws/wss) إذا أردت أن يرى Gateway عنوان IP الحقيقي للعميل.
تعمل لوحة المعلومات، لكن إمكانات Mac غير متصلة اتصال المشغّل/التحكم سليم، لكن اتصال Node المرافق غير متصل أو يفتقد سطح الأوامر الخاص به. افتح قسم الجهاز في شريط القوائم وتحقق مما إذا كانت حالة Mac هي paired · disconnected. بالنسبة إلى نقاط نهاية Tailscale Serve من النوع wss://*.ts.net، يكتشف التطبيق بصمات شهادات TLS الطرفية القديمة بعد تدوير الشهادة، ويمسح البصمة القديمة بمجرد أن يثق macOS بالشهادة الجديدة، ثم يعيد المحاولة تلقائيًا. إذا لم تكن الشهادة موثوقة على مستوى النظام أو لم يكن المضيف اسمًا لخدمة Tailscale Serve، فاضبط gateway.remote.tlsFingerprint على بصمة الشهادة المتوقعة، وراجع الشهادة، أو انتقل إلى الاتصال البعيد عبر SSH.
التنبيه الصوتي تُمرر عبارات التشغيل تلقائيًا في الوضع البعيد؛ ولا حاجة إلى أداة إعادة توجيه منفصلة.

أصوات الإشعارات

اختر صوتًا لكل إشعار من البرامج النصية باستخدام openclaw nodes notify، على سبيل المثال:

bash
openclaw nodes notify --node <id> --title "Ping" --body "Remote gateway ready" --sound Glass

لا يوجد مفتاح تبديل عام للصوت الافتراضي في التطبيق؛ إذ يختار المستدعون صوتًا (أو عدم تشغيل أي صوت) لكل طلب.

ذو صلة

Was this useful?
On this page

On this page