Mainstream messaging

iMessage

الحالة: تكامل CLI خارجي أصلي. يشغّل Gateway الأمر imsg rpc ويتواصل عبر JSON-RPC على stdio (من دون خادم daemon/منفذ منفصل).

الإعداد السريع

Mac محلي (المسار السريع)

  • ثبّت imsg وتحقق منه

    brew install steipete/tap/imsg
    imsg rpc --help
    
  • كوّن OpenClaw

    {
    channels: {
    imessage: {
    enabled: true,
    cliPath: "/usr/local/bin/imsg",
    dbPath: "/Users/user/Library/Messages/chat.db",
    },
    },
    }
    
  • شغّل gateway

    openclaw gateway
    
  • اعتمد أول إقران لرسالة خاصة (dmPolicy الافتراضي)

    openclaw pairing list imessage
    openclaw pairing approve imessage <CODE>
    

    تنتهي صلاحية طلبات الإقران بعد ساعة واحدة.

  • Mac بعيد عبر SSH

    لا يتطلب OpenClaw إلا cliPath متوافقًا مع stdio، لذلك يمكنك توجيه cliPath إلى سكربت تغليف يتصل عبر SSH بجهاز Mac بعيد ويشغّل imsg.

    #!/usr/bin/env bash
    exec ssh -T gateway-host imsg "$@"
    

    التكوين الموصى به عند تمكين المرفقات:

    {
    channels: {
    imessage: {
      enabled: true,
      cliPath: "~/.openclaw/scripts/imsg-ssh",
      remoteHost: "user@gateway-host", // used for SCP attachment fetches
      includeAttachments: true,
      // Optional: override allowed attachment roots.
      // Defaults include /Users/*/Library/Messages/Attachments
      attachmentRoots: ["/Users/*/Library/Messages/Attachments"],
      remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"],
    },
    },
    }
    

    إذا لم يتم تعيين remoteHost، يحاول OpenClaw اكتشافه تلقائيًا عبر تحليل سكربت تغليف SSH. يجب أن يكون remoteHost على هيئة host أو user@host (من دون مسافات أو خيارات SSH). يستخدم OpenClaw فحص مفاتيح المضيف الصارم لـ SCP، لذلك يجب أن يكون مفتاح مضيف الترحيل موجودًا مسبقًا في ~/.ssh/known_hosts. يتم التحقق من مسارات المرفقات مقابل الجذور المسموح بها (attachmentRoots / remoteAttachmentRoots).

    المتطلبات والأذونات (macOS)

    • يجب تسجيل الدخول إلى Messages على جهاز Mac الذي يشغّل imsg.
    • يلزم Full Disk Access لسياق العملية الذي يشغّل OpenClaw/imsg (للوصول إلى قاعدة بيانات Messages).
    • يلزم إذن Automation لإرسال الرسائل عبر Messages.app.

    التحكم في الوصول والتوجيه

    سياسة الرسائل الخاصة

    يتحكم channels.imessage.dmPolicy في الرسائل المباشرة:

    • pairing (افتراضي)
    • allowlist
    • open (يتطلب أن يتضمن allowFrom القيمة "*")
    • disabled

    حقل قائمة السماح: channels.imessage.allowFrom.

    يمكن أن تكون إدخالات قائمة السماح معرّفات handles أو أهداف دردشة (chat_id:*، chat_guid:*، chat_identifier:*).

    سياسة المجموعات + الإشارات

    يتحكم channels.imessage.groupPolicy في التعامل مع المجموعات:

    • allowlist (افتراضي عند تكوينه)
    • open
    • disabled

    قائمة سماح مرسلي المجموعات: channels.imessage.groupAllowFrom.

    بديل وقت التشغيل: إذا لم يتم تعيين groupAllowFrom، تتراجع فحوصات مرسلي مجموعات iMessage إلى allowFrom عند توفره. ملاحظة وقت التشغيل: إذا كان channels.imessage مفقودًا بالكامل، يتراجع وقت التشغيل إلى groupPolicy="allowlist" ويسجل تحذيرًا (حتى إذا تم تعيين channels.defaults.groupPolicy).

    ضبط الإشارات في المجموعات:

    • لا يحتوي iMessage على بيانات وصفية أصلية للإشارات
    • يستخدم اكتشاف الإشارات أنماط regex (agents.list[].groupChat.mentionPatterns، مع بديل messages.groupChat.mentionPatterns)
    • من دون أنماط مكوّنة، لا يمكن فرض ضبط الإشارات

    يمكن لأوامر التحكم من المرسلين المصرح لهم تجاوز ضبط الإشارات في المجموعات.

    الجلسات والردود الحتمية

    • تستخدم الرسائل الخاصة التوجيه المباشر؛ وتستخدم المجموعات توجيه المجموعات.
    • مع session.dmScope=main الافتراضي، تُدمج رسائل iMessage الخاصة في الجلسة الرئيسية للوكيل.
    • جلسات المجموعات معزولة (agent:<agentId>:imessage:group:<chat_id>).
    • تُوجّه الردود مرة أخرى إلى iMessage باستخدام بيانات القناة/الهدف الوصفية الأصلية.

    سلوك السلاسل الشبيهة بالمجموعات:

    يمكن أن تصل بعض سلاسل iMessage متعددة المشاركين مع is_group=false. إذا تم تكوين chat_id ذلك صراحة ضمن channels.imessage.groups، يعامله OpenClaw كحركة مرور مجموعة (ضبط المجموعات + عزل جلسات المجموعات).

    ربط محادثات ACP

    يمكن أيضًا ربط دردشات iMessage القديمة بجلسات ACP.

    تدفق المشغّل السريع:

    • شغّل /acp spawn codex --bind here داخل الرسالة الخاصة أو دردشة المجموعة المسموح بها.
    • ستُوجّه الرسائل المستقبلية في محادثة iMessage نفسها إلى جلسة ACP التي تم إنشاؤها.
    • يعيد /new و/reset تعيين جلسة ACP المرتبطة نفسها في مكانها.
    • يغلق /acp close جلسة ACP ويزيل الربط.

    تُدعم الروابط الدائمة المكوّنة عبر إدخالات bindings[] في المستوى الأعلى مع type: "acp" وmatch.channel: "imessage".

    يمكن أن يستخدم match.peer.id:

    • معرّف رسالة خاصة موحّدًا مثل +15555550123 أو [email protected]
    • chat_id:<id> (موصى به لروابط المجموعات المستقرة)
    • chat_guid:<guid>
    • chat_identifier:<identifier>

    مثال:

    {
      agents: {
        list: [
          {
            id: "codex",
            runtime: {
              type: "acp",
              acp: { agent: "codex", backend: "acpx", mode: "persistent" },
            },
          },
        ],
      },
      bindings: [
        {
          type: "acp",
          agentId: "codex",
          match: {
            channel: "imessage",
            accountId: "default",
            peer: { kind: "group", id: "chat_id:123" },
          },
          acp: { label: "codex-group" },
        },
      ],
    }
    

    راجع وكلاء ACP لمعرفة سلوك ربط ACP المشترك.

    أنماط النشر

    مستخدم macOS مخصص للبوت (هوية iMessage منفصلة)

    استخدم Apple ID ومستخدم macOS مخصصين بحيث تكون حركة مرور البوت معزولة عن ملف Messages الشخصي لديك.

    التدفق المعتاد:

    1. أنشئ/سجّل الدخول إلى مستخدم macOS مخصص.
    2. سجّل الدخول إلى Messages باستخدام Apple ID الخاص بالبوت في ذلك المستخدم.
    3. ثبّت imsg في ذلك المستخدم.
    4. أنشئ سكربت تغليف SSH حتى يتمكن OpenClaw من تشغيل imsg في سياق ذلك المستخدم.
    5. وجّه channels.imessage.accounts.<id>.cliPath و.dbPath إلى ملف ذلك المستخدم الشخصي.

    قد يتطلب التشغيل الأول موافقات GUI (Automation + Full Disk Access) في جلسة مستخدم البوت تلك.

    Mac بعيد عبر Tailscale (مثال)

    البنية الشائعة:

    • يعمل gateway على Linux/VM
    • يعمل iMessage + imsg على Mac داخل tailnet الخاصة بك
    • يستخدم مغلّف cliPath SSH لتشغيل imsg
    • يمكّن remoteHost جلب مرفقات SCP

    مثال:

    {
    channels: {
    imessage: {
      enabled: true,
      cliPath: "~/.openclaw/scripts/imsg-ssh",
      remoteHost: "[email protected]",
      includeAttachments: true,
      dbPath: "/Users/bot/Library/Messages/chat.db",
    },
    },
    }
    
    #!/usr/bin/env bash
    exec ssh -T [email protected] imsg "$@"
    

    استخدم مفاتيح SSH حتى يكون كل من SSH وSCP غير تفاعليين. تأكد أولًا من الوثوق بمفتاح المضيف (على سبيل المثال ssh [email protected]) حتى تتم تعبئة known_hosts.

    نمط الحسابات المتعددة

    يدعم iMessage التكوين لكل حساب ضمن channels.imessage.accounts.

    يمكن لكل حساب تجاوز حقول مثل cliPath وdbPath وallowFrom وgroupPolicy وmediaMaxMb وإعدادات السجل وقوائم السماح بجذور المرفقات.

    الوسائط، والتقسيم إلى أجزاء، وأهداف التسليم

    المرفقات والوسائط
    • استيعاب المرفقات الواردة اختياري: channels.imessage.includeAttachments
    • يمكن جلب مسارات المرفقات البعيدة عبر SCP عند تعيين remoteHost
    • يجب أن تطابق مسارات المرفقات الجذور المسموح بها:
      • channels.imessage.attachmentRoots (محلي)
      • channels.imessage.remoteAttachmentRoots (وضع SCP البعيد)
      • نمط الجذر الافتراضي: /Users/*/Library/Messages/Attachments
    • يستخدم SCP فحص مفاتيح المضيف الصارم (StrictHostKeyChecking=yes)
    • يستخدم حجم الوسائط الصادرة channels.imessage.mediaMaxMb (افتراضي 16 MB)
    تقسيم الصادر إلى أجزاء
    • حد أجزاء النص: channels.imessage.textChunkLimit (افتراضي 4000)
    • وضع التقسيم إلى أجزاء: channels.imessage.chunkMode
      • length (افتراضي)
      • newline (تقسيم يقدّم الفقرات أولًا)
    تنسيقات العنونة

    الأهداف الصريحة المفضلة:

    • chat_id:123 (موصى به للتوجيه المستقر)
    • chat_guid:...
    • chat_identifier:...

    أهداف handles مدعومة أيضًا:

    imsg chats --limit 20
    

    عمليات كتابة التكوين

    يسمح iMessage افتراضيًا بعمليات كتابة التكوين التي تبدأها القناة (لـ /config set|unset عندما تكون commands.config: true).

    للتعطيل:

    {
      channels: {
        imessage: {
          configWrites: false,
        },
      },
    }
    

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

    لم يتم العثور على imsg أو أن RPC غير مدعوم

    تحقق من الملف الثنائي ودعم RPC:

    imsg rpc --help
    openclaw channels status --probe
    

    إذا أبلغ الفحص أن RPC غير مدعوم، فحدّث imsg.

    يتم تجاهل الرسائل الخاصة

    تحقق من:

    • channels.imessage.dmPolicy
    • channels.imessage.allowFrom
    • موافقات الإقران (openclaw pairing list imessage)
    يتم تجاهل رسائل المجموعات

    تحقق من:

    • channels.imessage.groupPolicy
    • channels.imessage.groupAllowFrom
    • سلوك قائمة السماح في channels.imessage.groups
    • تكوين نمط الإشارات (agents.list[].groupChat.mentionPatterns)
    تفشل المرفقات البعيدة

    تحقق من:

    • channels.imessage.remoteHost
    • channels.imessage.remoteAttachmentRoots
    • مصادقة مفاتيح SSH/SCP من مضيف gateway
    • وجود مفتاح المضيف في ~/.ssh/known_hosts على مضيف gateway
    • قابلية قراءة المسار البعيد على جهاز Mac الذي يشغّل Messages
    تم تفويت مطالبات أذونات macOS

    أعد التشغيل في طرفية GUI تفاعلية ضمن سياق المستخدم/الجلسة نفسه ووافق على المطالبات:

    imsg chats --limit 1
    imsg send <handle> "test"
    

    أكّد منح Full Disk Access + Automation لسياق العملية الذي يشغّل OpenClaw/imsg.

    مؤشرات مرجع التكوين

    ذو صلة