macOS companion app

کنترل از راه دور

این جریان به برنامه macOS اجازه می‌دهد مثل یک کنترل از راه دور کامل برای یک OpenClaw Gateway که روی میزبان دیگری (دسکتاپ/سرور) اجرا می‌شود عمل کند. این همان قابلیت راه دور از طریق SSH (اجرای راه دور) برنامه است. همه قابلیت‌ها - بررسی‌های سلامت، هدایت Voice Wake، و گفت‌وگوی وب - همان پیکربندی SSH راه دور را از تنظیمات → عمومی بازاستفاده می‌کنند.

حالت‌ها

  • محلی (این Mac): همه‌چیز روی لپ‌تاپ اجرا می‌شود. SSH دخیل نیست.
  • راه دور از طریق SSH (پیش‌فرض): فرمان‌های OpenClaw روی میزبان راه دور اجرا می‌شوند. برنامه Mac با -o BatchMode به‌همراه هویت/کلید انتخابی شما و یک بازارسال پورت محلی، اتصال SSH باز می‌کند.
  • اتصال مستقیم راه دور (ws/wss): تونل SSH وجود ندارد. برنامه Mac مستقیماً به URL مربوط به Gateway وصل می‌شود (برای مثال، از طریق Tailscale Serve یا یک پراکسی معکوس HTTPS عمومی).

انتقال‌های راه دور

حالت راه دور از دو انتقال پشتیبانی می‌کند:

  • تونل SSH (پیش‌فرض): از ssh -N -L ... برای بازارسال پورت Gateway به localhost استفاده می‌کند. Gateway نشانی IP مربوط به Node را 127.0.0.1 خواهد دید، چون تونل loopback است.
  • مستقیم (ws/wss): مستقیماً به URL مربوط به Gateway وصل می‌شود. Gateway نشانی IP واقعی کلاینت را می‌بیند.

در حالت تونل SSH، نام‌های میزبان کشف‌شده LAN/tailnet به‌صورت gateway.remote.sshTarget ذخیره می‌شوند. برنامه gateway.remote.url را روی نقطه پایانی تونل محلی نگه می‌دارد، برای مثال ws://127.0.0.1:18789، تا CLI، گفت‌وگوی وب، و سرویس میزبان محلی Node همگی از همان انتقال loopback امن استفاده کنند.

خودکارسازی مرورگر در حالت راه دور متعلق به میزبان Node مربوط به CLI است، نه Node بومی برنامه macOS. برنامه، سرویس نصب‌شده میزبان Node را هرجا ممکن باشد راه‌اندازی می‌کند؛ اگر از همان Mac به کنترل مرورگر نیاز دارید، آن را با openclaw node install ... و openclaw node start نصب/راه‌اندازی کنید (یا openclaw node run ... را در پیش‌زمینه اجرا کنید)، سپس همان Node دارای قابلیت مرورگر را هدف بگیرید.

پیش‌نیازها روی میزبان راه دور

  1. Node + pnpm را نصب کنید و OpenClaw CLI را بسازید/نصب کنید (pnpm install && pnpm build && pnpm link --global).
  2. مطمئن شوید openclaw برای شِل‌های غیرتعاملی روی PATH قرار دارد (در صورت نیاز به /usr/local/bin یا /opt/homebrew/bin symlink کنید).
  3. SSH را با احراز هویت کلیدی باز کنید. برای دسترسی پایدار بیرون از LAN، IPهای Tailscale را توصیه می‌کنیم.

راه‌اندازی برنامه macOS

  1. تنظیمات → عمومی را باز کنید.
  2. زیر OpenClaw اجرا می‌شود، راه دور از طریق SSH را انتخاب کنید و این موارد را تنظیم کنید:
    • انتقال: تونل SSH یا مستقیم (ws/wss).
    • هدف SSH: user@host (اختیاری :port).
      • اگر Gateway روی همان LAN است و Bonjour را اعلام می‌کند، آن را از فهرست کشف‌شده انتخاب کنید تا این فیلد خودکار پر شود.
    • URL مربوط به Gateway (فقط مستقیم): wss://gateway.example.ts.net (یا ws://... برای محلی/LAN).
    • فایل هویت (پیشرفته): مسیر کلید شما.
    • ریشه پروژه (پیشرفته): مسیر checkout راه دور که برای فرمان‌ها استفاده می‌شود.
    • مسیر CLI (پیشرفته): مسیر اختیاری به یک entrypoint/باینری قابل‌اجرای openclaw (هنگام اعلام‌شدن به‌صورت خودکار پر می‌شود).
  3. آزمون راه دور را بزنید. موفقیت نشان می‌دهد openclaw status --json راه دور درست اجرا می‌شود. شکست‌ها معمولاً به مشکلات PATH/CLI مربوط‌اند؛ کد خروج 127 یعنی CLI در میزبان راه دور پیدا نشده است.
  4. بررسی‌های سلامت و گفت‌وگوی وب اکنون به‌صورت خودکار از طریق این تونل SSH اجرا می‌شوند.

گفت‌وگوی وب

  • تونل SSH: گفت‌وگوی وب از طریق پورت کنترل WebSocket بازارسال‌شده به Gateway وصل می‌شود (پیش‌فرض 18789).
  • مستقیم (ws/wss): گفت‌وگوی وب مستقیماً به URL پیکربندی‌شده Gateway وصل می‌شود.
  • دیگر هیچ سرور HTTP جداگانه‌ای برای WebChat وجود ندارد.

مجوزها

  • میزبان راه دور به همان تأییدیه‌های TCC محلی نیاز دارد (Automation، Accessibility، Screen Recording، Microphone، Speech Recognition، Notifications). فرایند onboarding را روی همان ماشین اجرا کنید تا یک‌بار آن‌ها را اعطا کنید.
  • Nodeها وضعیت مجوز خود را از طریق node.list / node.describe اعلام می‌کنند تا agentها بدانند چه چیزهایی در دسترس است.

نکات امنیتی

  • روی میزبان راه دور، اتصال‌های loopback را ترجیح دهید و از طریق SSH یا Tailscale وصل شوید.
  • تونل‌زنی SSH از بررسی سخت‌گیرانه کلید میزبان استفاده می‌کند؛ ابتدا به کلید میزبان اعتماد کنید تا در ~/.ssh/known_hosts وجود داشته باشد.
  • اگر Gateway را به یک رابط غیر loopback bind می‌کنید، احراز هویت معتبر Gateway را الزامی کنید: توکن، گذرواژه، یا یک پراکسی معکوس آگاه از هویت با gateway.auth.mode: "trusted-proxy".
  • امنیت و Tailscale را ببینید.

جریان ورود WhatsApp (راه دور)

  • openclaw channels login --verbose را روی میزبان راه دور اجرا کنید. QR را با WhatsApp روی گوشی خود اسکن کنید.
  • اگر احراز هویت منقضی شد، ورود را روی همان میزبان دوباره اجرا کنید. بررسی سلامت مشکلات پیوند را نمایش می‌دهد.

عیب‌یابی

  • کد خروج 127 / پیدا نشد: openclaw برای شِل‌های غیر login روی PATH نیست. آن را به /etc/paths، فایل rc شِل خود اضافه کنید، یا به /usr/local/bin//opt/homebrew/bin symlink کنید.
  • کاوش سلامت شکست خورد: دسترسی SSH، PATH، و وارد بودن Baileys را بررسی کنید (openclaw status --json).
  • گفت‌وگوی وب گیر کرده است: تأیید کنید Gateway روی میزبان راه دور در حال اجراست و پورت بازارسال‌شده با پورت WS مربوط به Gateway مطابقت دارد؛ UI به یک اتصال WS سالم نیاز دارد.
  • IP مربوط به Node برابر 127.0.0.1 نشان داده می‌شود: با تونل SSH مورد انتظار است. اگر می‌خواهید Gateway نشانی IP واقعی کلاینت را ببیند، انتقال را به مستقیم (ws/wss) تغییر دهید.
  • داشبورد کار می‌کند اما قابلیت‌های Mac آفلاین هستند: یعنی اتصال operator/control برنامه سالم است، اما اتصال Node همراه وصل نیست یا سطح فرمان آن وجود ندارد. بخش دستگاه در نوار منو را باز کنید و بررسی کنید آیا Mac به‌صورت paired · disconnected است. برای نقطه‌های پایانی Tailscale Serve با wss://*.ts.net، برنامه پس از چرخش گواهی، pinهای قدیمی TLS leaf را تشخیص می‌دهد، وقتی macOS به گواهی جدید اعتماد کند pin قدیمی را پاک می‌کند، و به‌صورت خودکار دوباره تلاش می‌کند. اگر گواهی مورد اعتماد سیستم نیست یا میزبان یک نام Tailscale Serve نیست، گواهی را بررسی کنید یا به راه دور از طریق SSH تغییر دهید.
  • Voice Wake: عبارت‌های فعال‌سازی در حالت راه دور به‌صورت خودکار هدایت می‌شوند؛ forwarder جداگانه‌ای لازم نیست.

صداهای اعلان

صداها را برای هر اعلان از اسکریپت‌ها با openclaw و node.invoke انتخاب کنید، برای مثال:

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

دیگر هیچ کلید سراسری «صدای پیش‌فرض» در برنامه وجود ندارد؛ فراخوان‌ها برای هر درخواست یک صدا (یا هیچ صدا) انتخاب می‌کنند.

مرتبط