Skip to main content
يغطي دعم Slack الرسائل المباشرة والقنوات عبر تكاملات تطبيق Slack. وسيلة النقل الافتراضية هي Socket Mode؛ كما تُدعَم عناوين URL لطلبات HTTP. أما وضع الترحيل فهو مخصص لعمليات النشر المُدارة التي يتولى فيها موجّه موثوق استقبال حركة Slack الواردة.

الاقتران

تستخدم رسائل Slack المباشرة وضع الاقتران افتراضيًا.

أوامر الشرطة المائلة

سلوك الأوامر الأصلية ودليل الأوامر.

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

إجراءات تشخيص المشكلات وإصلاحها عبر القنوات.

اختيار وسيلة النقل

يوفر Socket Mode وعناوين URL لطلبات HTTP تكافؤًا في الميزات للمراسلة وأوامر الشرطة المائلة وApp Home والتفاعلات. اختر وفقًا لبنية النشر، لا وفقًا للميزات.
اختر Socket Mode للمضيفين ذوي Gateway واحد، وحواسيب التطوير المحمولة، والشبكات المحلية التي يمكنها الوصول إلى *.slack.com باتجاه صادر، لكنها لا تستطيع قبول HTTPS الوارد.اختر عناوين URL لطلبات HTTP عند تشغيل نسخ متعددة من Gateway خلف موازن تحميل، أو عندما يكون WSS الصادر محظورًا بينما يُسمح بـ HTTPS الوارد، أو عندما تنهي بالفعل Webhooks الخاصة بـ Slack عند وكيل عكسي.
يمكن لـ Slack الحفاظ على اتصالات Socket Mode متعددة لتطبيق واحد، وقد يسلّم كل حمولة إلى أي اتصال منها. لذلك تحتاج وحدات Gateway المنفصلة لـ OpenClaw التي تشترك في تطبيق Slack واحد إلى إعدادات توجيه وتخويل متكافئة. وإلا فاستخدم تطبيق Slack منفصلًا لكل Gateway، أو نقطة استقبال ترحيل واحدة، أو عناوين URL لطلبات HTTP خلف موازن تحميل. راجع استخدام Socket Mode.

وضع الترحيل

يفصل وضع الترحيل استقبال حركة Slack الواردة عن Gateway الخاص بـ OpenClaw. يتولى موجّه موثوق اتصال Slack Socket Mode الوحيد، ويختار Gateway وجهة، ويمرر حدثًا محدد النوع عبر websocket موثَّق. ويظل Gateway يستخدم رمز البوت الخاص به لاستدعاءات Slack Web API الصادرة.
يجب أن يستخدم عنوان URL للترحيل wss:// ما لم يكن يستهدف localhost. تعامل مع رمز الحامل وجدول مسارات الموجّه بوصفهما جزءًا من حدود تخويل Slack: تدخل الأحداث الموجّهة إلى معالج رسائل Slack المعتاد كتفعيلات مخوّلة. يمكن أن يضبط slack_identity المقدم من الموجّه في إطار websocket من نوع hello اسم المستخدم والأيقونة الافتراضيين للإرسال؛ وتظل الأولوية لهوية صريحة يقدمها المستدعي. يعيد اتصال الترحيل الاتصال باستخدام توقيت التراجع المتزايد المحدود نفسه المستخدم في Socket Mode، ويمسح الهوية المقدمة من الموجّه كلما انقطع الاتصال.

عمليات التثبيت على مستوى مؤسسة Enterprise Grid

يمكن لحساب Slack واحد استقبال الرسائل من كل مساحة عمل يشملها تثبيت على مستوى مؤسسة Enterprise Grid. اختر Socket Mode المباشر أو عناوين URL لطلبات HTTP؛ فالوضع المرحّل غير مدعوم لحسابات المؤسسات. لا يفعّل كلا بياني الحد الأدنى من الامتيازات أدناه سوى مسار أحداث V1 من نوع message وapp_mention، والردود الفورية، وتفاعلات الحالة التي يملكها المستمع.

Socket Mode

اطلب من Enterprise Grid Org Admin أو Org Owner الموافقة على التطبيق وتثبيته على مستوى المؤسسة واختيار مساحات العمل التي يشملها التثبيت. تأكد من توفر التطبيق في كل مساحة عمل مقصودة قبل بدء OpenClaw. أنشئ رمزًا على مستوى التطبيق مع connections:write لـ Socket Mode، ثم انسخ رمز البوت من تثبيت المؤسسة. اضبط الحساب الذي يستخدم رمز البوت المثبّت على مستوى المؤسسة:

عناوين URL لطلبات HTTP

استخدم وضع HTTP عندما تكون لدى Gateway نقطة نهاية HTTPS عامة ولا تفتح اتصال Socket Mode. استبدل عنوان URL في المثال بعنوان URL العام webhookPath للـ Gateway (الافتراضي /slack/events):
اطلب من Enterprise Grid Org Admin أو Org Owner الموافقة على التطبيق وتثبيته على مستوى المؤسسة واختيار مساحات العمل التي يشملها التثبيت. بعد أن يتحقق Slack من Request URL، انسخ رمز البوت الخاص بتثبيت المؤسسة وBasic Information -> App Credentials -> Signing Secret الخاص بالتطبيق. اضبط حساب المؤسسة باستخدام مسار Request URL نفسه:
عند بدء التشغيل، يتحقق OpenClaw من enterpriseOrgInstall باستخدام auth.test الخاص بـ Slack. يفشل بدء التشغيل عند استخدام رمز مثبّت على مستوى المؤسسة من دون العلامة، أو رمز مساحة عمل مع العلامة. يظل Slack مصدر الحقيقة بشأن مساحات العمل التي منحت التثبيت؛ ثم يطبق OpenClaw سياسات القنوات والمستخدمين والرسائل المباشرة والإشارات المضبوطة على كل حدث يتم تسليمه. يرفض Enterprise V1 جميع أحداث message وapp_mention التي أنشأها البوت قبل التوجيه، بصرف النظر عن allowBots، لأن عمليات التثبيت على مستوى المؤسسة لا توفر هوية بوت مستقرة مؤهلة بمساحة العمل لمنع الحلقات. يقتصر دعم المؤسسات عمدًا على أحداث message وapp_mention عبر Socket Mode المباشر أو HTTP وردودها الفورية. لا يتوفر للحساب المؤسسي وضع الترحيل، أو أوامر الشرطة المائلة، أو التفاعلات، أو App Home، أو مستمعو أحداث التفاعلات، أو التثبيتات، أو أدوات إجراءات Slack، أو الموافقات الأصلية في Slack، أو الارتباطات، أو التسليم في قائمة انتظار أو المجدول، أو عمليات الإرسال الاستباقية. تُدعَم تفاعلات الإقرار والكتابة والحالة الصادرة عبر عميل Slack الذي يملكه المستمع، وتتطلب reactions:write؛ بينما تظل إشعارات التفاعلات الواردة وأدوات إجراءات التفاعلات غير متاحة. تعيد الردود الفورية استخدام سلوك التسليم القياسي في Slack للمقاطع، والوسائط، والبيانات الوصفية، والرجوع الاحتياطي للهوية، ومعاينات الروابط، وإيصالات الاستلام، ولكن فقط ما دام العميل الذي يملكه المستمع بعد التحقق منه ضمن دورة الحدث النشطة. يُقسَّم صف الإرسال في الذاكرة وسجلات المشاركة في سلاسل المحادثات بحسب مساحة عمل ذلك الحدث؛ ولا يُسلسَل العميل نفسه أو يُحفَظ مطلقًا. يجب أن تستخدم مفاتيح سياسة القنوات وإدخالات dm.groupChannels معرّفات قنوات Slack الثابتة الخام أو صيغة channel:<id>. يطبّع OpenClaw كلتا الصيغتين إلى معرّف القناة الخام من أجل المطابقة في وقت التشغيل؛ وتتسبب البادئات slack: وgroup: وmpim: في فشل بدء التشغيل. يجب أن تستخدم إدخالات سياسة المستخدمين معرّفات مستخدمي Slack الثابتة؛ وتتسبب الأسماء والأسماء المختصرة وأسماء العرض وعناوين البريد الإلكتروني في فشل بدء التشغيل. يجب أن تستخدم المعرّفات بادئة Slack الأساسية بالأحرف الكبيرة ومتنها (على سبيل المثال، C0123456789 أو U0123456789)؛ وتتسبب الأحرف الصغيرة والمعرّفات القصيرة المشابهة في فشل بدء التشغيل. لا يمكن لحسابات المؤسسة تمكين dangerouslyAllowNameMatching. يمكن لحسابات المؤسسة تعيين mentionPatterns.mode العام، لكن mentionPatterns.allowIn و mentionPatterns.denyIn يتسببان في فشل بدء التشغيل لأن معرّفات قنوات Slack المجرّدة غير مؤهلة بمساحة العمل ويمكن إعادة استخدامها عبر مساحات العمل. تحتفظ عمليات التثبيت في مساحات العمل بسلوك نمط الإشارة المحدد النطاق الحالي. تحصل كل مساحة عمل مقبولة على هوية منفصلة للتوجيه والجلسة والنص المنسوخ وإزالة التكرار والسجل وذاكرة التخزين المؤقت، حتى عندما تتداخل معرّفات Slack. ضمن تدفق message، تُدعَم رسائل المستخدمين العادية وأحداث file_share التي أنشأها المستخدمون؛ وتُرفض الأنواع الفرعية الأخرى للرسائل قبل التفويض أو معالجة أحداث النظام. يجب إما تعطيل الرسائل المباشرة للمؤسسة (dm.enabled=false أو dmPolicy="disabled") أو فتحها صراحةً باستخدام dmPolicy="open" و قيمة allowFrom فعالة للحساب تحتوي على القيمة الحرفية "*". تؤدي قائمة سماح فارغة أو معرّفات خاصة بمستخدمين من دون "*" إلى فشل بدء التشغيل. يُرفض الاقتران وقوائم السماح للرسائل المباشرة لكل مستخدم لأن معرّفات مستخدمي Slack غير مؤهلة بمساحة العمل في مخازن التفويض تلك. يستمر تطبيق سياسة القناة والمرسل على رسائل القنوات.

التثبيت

يسجّل plugins install الـ Plugin ويمكّنه. ولا يفعل شيئًا حتى تهيئ تطبيق Slack وإعدادات القناة أدناه. راجع Plugins للاطلاع على القواعد العامة لتثبيت الـ Plugin.

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

تنشئ ملفات البيان في هذا القسم عملية تثبيت محددة النطاق بمساحة العمل. بالنسبة إلى عملية تثبيت على مستوى مؤسسة Enterprise Grid، استخدم بدلًا من ذلك ملف البيان وسير العمل على مستوى المؤسسة المخصصين.
1

إنشاء تطبيق Slack جديد

افتح api.slack.com/appsCreate New AppFrom a manifest ← حدّد مساحة عملك ← الصق أحد ملفّي البيان أدناه ← NextCreate.
يطابق الخيار Recommended مجموعة الميزات الكاملة لـ Plugin Slack: App Home، والأوامر المائلة، والملفات، والتفاعلات، والعناصر المثبتة، والرسائل المباشرة الجماعية، وقراءة الرموز التعبيرية/مجموعات المستخدمين. اختر Minimal عندما تقيّد سياسة مساحة العمل النطاقات — فهو يغطي الرسائل المباشرة، وسجل القنوات/المجموعات، والإشارات، والأوامر المائلة، لكنه يستبعد الملفات والتفاعلات والعناصر المثبتة والرسائل المباشرة الجماعية (mpim:*) وemoji:read وusergroups:read. راجع قائمة التحقق من ملف البيان والنطاقات لمعرفة مبررات كل نطاق والخيارات الإضافية مثل الأوامر المائلة الإضافية.
بعد أن ينشئ Slack التطبيق:
  • Basic Information -> App-Level Tokens -> Generate Token and Scopes: أضف connections:write، ثم احفظ وانسخ App-Level Token.
  • Install App -> Install to Workspace: انسخ Bot User OAuth Token.
2

تهيئة OpenClaw

إعداد SecretRef الموصى به:
الرجوع الاحتياطي إلى متغيرات البيئة (الحساب الافتراضي فقط):
3

بدء Gateway

ضبط نقل وضع Socket

يضبط OpenClaw مهلة انتظار pong لعميل Slack SDK على 15 ثانية افتراضيًا في وضع Socket. لا تتجاوز إعدادات النقل إلا عند الحاجة إلى ضبط خاص بمساحة العمل أو المضيف:
استخدم هذا فقط لمساحات العمل في وضع Socket التي تسجّل انتهاء مهلات pong أو server-ping لاتصال Slack عبر websocket، أو التي تعمل على مضيفين يعانون من تجويع معروف لحلقة الأحداث. يمثّل clientPingTimeout مدة انتظار pong بعد أن يرسل SDK اختبار اتصال من العميل؛ ويمثّل serverPingTimeout مدة انتظار اختبارات الاتصال من خادم Slack. تظل رسائل التطبيق وأحداثه حالةً للتطبيق، وليست إشارات لحيوية النقل. ملاحظات:
  • يتم تجاهل socketMode في وضع HTTP Request URL.
  • تنطبق إعدادات channels.slack.socketMode الأساسية على جميع حسابات Slack ما لم يتم تجاوزها. تستخدم التجاوزات الخاصة بكل حساب channels.slack.accounts.<accountId>.socketMode؛ ونظرًا إلى أن هذا تجاوز كائن، فأدرج كل حقل من حقول ضبط Socket الذي تريده لذلك الحساب.
  • لا يملك قيمة OpenClaw افتراضية (15000) سوى clientPingTimeout. لا يتم تمرير serverPingTimeout وpingPongLoggingEnabled إلى Slack SDK إلا عند تهيئتهما.
  • يبدأ التراجع بين محاولات إعادة تشغيل وضع Socket من نحو 2 ثانية ويبلغ حده الأقصى عند نحو 30 ثانية. تُعاد محاولة إخفاقات البدء وانتظار البدء وانقطاع الاتصال القابلة للاسترداد حتى تتوقف القناة. أما أخطاء الحساب وبيانات الاعتماد الدائمة، مثل المصادقة غير الصالحة أو الرموز المميزة الملغاة أو النطاقات المفقودة، فتفشل سريعًا بدلًا من إعادة المحاولة إلى الأبد.

قائمة التحقق من البيان والنطاقات

بيان تطبيق Slack الأساسي هو نفسه لوضع Socket وعناوين URL لطلبات HTTP. لا يختلف سوى مقطع settingsurl لأمر الشرطة المائلة). البيان الأساسي (وضع Socket افتراضيًا):
بالنسبة إلى وضع عناوين URL لطلبات HTTP، استبدل settings بنسخة HTTP وأضف url إلى كل أمر شرطة مائلة. يلزم عنوان URL عام:

إعدادات إضافية للبيان

اعرض ميزات مختلفة توسّع الإعدادات الافتراضية المذكورة أعلاه. يفعّل البيان الافتراضي علامة تبويب Home في Slack App Home ويشترك في app_home_opened. عندما يفتح عضو في مساحة العمل علامة التبويب Home، ينشر OpenClaw عرض Home افتراضيًا آمنًا باستخدام views.publish؛ ولا يتم تضمين أي حمولة محادثة أو تهيئة خاصة. عند تفعيل وضع أمر الشرطة المائلة الواحد، يستخدم تلميح الأمر channels.slack.slashCommand.name؛ أما عمليات التثبيت التي تستخدم أوامر أصلية أو لا تستخدم أوامر شرطة مائلة فتحذف ذلك التلميح. تظل علامة التبويب Messages مفعّلة لرسائل Slack المباشرة. يفعّل البيان أيضًا سلاسل مساعد Slack باستخدام features.assistant_view وassistant:write وassistant_thread_started وassistant_thread_context_changed؛ وتُوجَّه سلاسل المساعد إلى جلسات سلاسل OpenClaw الخاصة بها، مع إبقاء سياق السلسلة الذي يوفّره Slack متاحًا للوكيل.
يمكن استخدام عدة أوامر شرطة مائلة أصلية بدلًا من أمر واحد مهيأ، مع بعض التفاصيل:
  • استخدم /agentstatus بدلًا من /status لأن الأمر /status محجوز.
  • لا يمكن تسجيل أكثر من 25 أمر شرطة مائلة في تطبيق Slack واحد في الوقت نفسه (حد منصة Slack).
استبدل مقطع features.slash_commands الحالي لديك بمجموعة فرعية من الأوامر المتاحة:
أضف نطاق البوت chat:write.customize إذا أردت أن تستخدم الرسائل الصادرة هوية الوكيل النشط (اسم مستخدم وأيقونة مخصصان) بدلًا من هوية تطبيق Slack الافتراضية.إذا استخدمت أيقونة رمز تعبيري، فإن Slack يتوقع صيغة :emoji_name:.
إذا ضبطت channels.slack.userToken، فإن نطاقات القراءة المعتادة هي:
  • channels:history، groups:history، im:history، mpim:history
  • channels:read، groups:read، im:read، mpim:read
  • users:read
  • reactions:read
  • pins:read
  • emoji:read
  • search:read (إذا كنت تعتمد على عمليات قراءة البحث في Slack)

نموذج الرموز

  • botToken + appToken مطلوبان لـ Socket Mode.
  • يتطلب وضع HTTP ‏botToken + signingSecret.
  • يتطلب وضع الترحيل botToken بالإضافة إلى relay.url وrelay.authToken وrelay.gatewayId؛ ولا يستخدم رمز تطبيق أو سر توقيع.
  • تقبل botToken وappToken وsigningSecret وrelay.authToken وuserToken سلاسل نصية عادية أو كائنات SecretRef.
  • تتجاوز رموز الإعدادات القيم الاحتياطية لمتغيرات البيئة.
  • تنطبق القيم الاحتياطية لمتغيرات البيئة SLACK_BOT_TOKEN وSLACK_APP_TOKEN وSLACK_USER_TOKEN كلٌّ منها على الحساب الافتراضي فقط.
  • تكون القيمة الافتراضية لـ userToken سلوك القراءة فقط (userTokenReadOnly: true).
سلوك لقطة الحالة:
  • يتتبع فحص حساب Slack حقلي *Source و*Status لكل بيانات اعتماد (botToken، appToken، signingSecret، userToken).
  • تكون الحالة available أو configured_unavailable أو missing.
  • تعني configured_unavailable أن الحساب مضبوط عبر SecretRef أو مصدر أسرار آخر غير مضمّن، لكن مسار الأمر/وقت التشغيل الحالي تعذّر عليه تحليل القيمة الفعلية.
  • في وضع HTTP، تُضمَّن signingSecretStatus؛ أما في Socket Mode، فالزوج المطلوب هو botTokenStatus + appTokenStatus.
بالنسبة إلى الإجراءات/قراءات الدليل، يمكن تفضيل رمز المستخدم عند ضبطه. أما للكتابة، فيظل رمز البوت هو المفضّل؛ ولا يُسمح بالكتابة باستخدام رمز المستخدم إلا عندما تكون userTokenReadOnly: false ويكون رمز البوت غير متاح.

الإجراءات والبوابات

تتحكم channels.slack.actions.* في إجراءات Slack. مجموعات الإجراءات المتاحة في أدوات Slack الحالية: تتضمن إجراءات رسائل Slack الحالية send وupload-file وdownload-file وread وedit وdelete وpin وunpin وlist-pins وmember-info وemoji-list. تقبل download-file معرّفات ملفات Slack المعروضة في العناصر النائبة للملفات الواردة، وتعيد معاينات للصور أو بيانات وصفية للملف المحلي للأنواع الأخرى من الملفات.

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

تتحكم channels.slack.dmPolicy في الوصول إلى الرسائل المباشرة. وتمثل channels.slack.allowFrom قائمة السماح الأساسية للرسائل المباشرة.
  • pairing (الإعداد الافتراضي)
  • allowlist
  • open (تتطلب أن تتضمن channels.slack.allowFrom القيمة "*")
  • disabled
علامات الرسائل المباشرة:
  • dm.enabled (القيمة الافتراضية true)
  • channels.slack.allowFrom
  • dm.allowFrom (قديمة)
  • dm.groupEnabled (القيمة الافتراضية للرسائل المباشرة الجماعية false)
  • dm.groupChannels (قائمة سماح اختيارية لـ MPIM)
أولوية الحسابات المتعددة:
  • تنطبق channels.slack.accounts.default.allowFrom على حساب default فقط.
  • ترث الحسابات المسماة channels.slack.allowFrom عندما لا تكون allowFrom الخاصة بها معيّنة.
  • لا ترث الحسابات المسماة channels.slack.accounts.default.allowFrom.
لا تزال channels.slack.dm.policy وchannels.slack.dm.allowFrom القديمتان تُقرآن لأغراض التوافق. تنقلهما openclaw doctor --fix إلى dmPolicy وallowFrom عندما يمكنها فعل ذلك دون تغيير الوصول.يستخدم الاقتران في الرسائل المباشرة openclaw pairing approve slack <code>.

سلاسل المحادثات والجلسات ووسوم الرد

  • تُوجَّه الرسائل المباشرة بصيغة direct؛ والقنوات بصيغة channel؛ والرسائل المباشرة الجماعية بصيغة group.
  • تقبل ارتباطات مسارات Slack معرّفات النظراء الأولية، بالإضافة إلى صيغ أهداف Slack مثل channel:C12345678 وuser:U12345678 و<@U12345678>.
  • مع القيمة الافتراضية session.dmScope=main، تُدمج رسائل Slack المباشرة في جلسة الوكيل الرئيسية.
  • جلسات القنوات: agent:<agentId>:slack:channel:<channelId>.
  • تظل رسائل القناة العادية ذات المستوى الأعلى في جلسة كل قناة، حتى عندما تكون replyToMode بقيمة غير off.
  • تستخدم ردود سلاسل محادثات Slack قيمة thread_ts الأصلية في Slack للواحق الجلسات (:thread:<threadTs>)، حتى عند تعطيل تسلسل الردود الصادرة باستخدام replyToMode="off".
  • يُدخل OpenClaw جذر قناة مؤهلًا ذا مستوى أعلى في agent:<agentId>:slack:channel:<channelId>:thread:<rootTs> عندما يُتوقع أن يبدأ ذلك الجذر سلسلة محادثات مرئية في Slack، لكي يتشارك الجذر وردود السلسلة اللاحقة جلسة OpenClaw واحدة. ينطبق هذا على أحداث app_mention، والمطابقات الصريحة لإشارة البوت أو نمط الإشارة المضبوط، وقنوات requireMention: false ذات replyToMode بقيمة غير off.
  • القيمة الافتراضية لـ channels.slack.thread.historyScope هي thread؛ والقيمة الافتراضية لـ thread.inheritParent هي false.
  • يتحكم channels.slack.thread.initialHistoryLimit في عدد رسائل سلسلة المحادثات الحالية التي تُجلب عند بدء جلسة سلسلة جديدة (الافتراضي 20؛ اضبطه على 0 للتعطيل).
  • channels.slack.thread.requireExplicitMention (الافتراضي false): عندما تكون القيمة true، تُمنع إشارات سلسلة المحادثات الضمنية لكي يستجيب البوت فقط لإشارات @bot الصريحة داخل السلاسل، حتى عندما يكون البوت قد شارك بالفعل في السلسلة. من دون ذلك، تتجاوز الردود في سلسلة شارك فيها البوت بوابة requireMention.
عناصر التحكم في تسلسل الردود:
  • channels.slack.channels.<id>.replyToMode: تجاوز لكل قناة لرسائل قنوات Slack والقنوات الخاصة
  • channels.slack.replyToMode: off|first|all|batched (الافتراضي off)
  • channels.slack.replyToModeByChatType: لكل direct|group|channel
  • البديل الاحتياطي القديم للمحادثات المباشرة: channels.slack.dm.replyToMode
وسوم الرد اليدوية مدعومة:
  • [[reply_to_current]]
  • [[reply_to:<id>]]
للردود الصريحة على سلاسل Slack من أداة message، اضبط replyBroadcast: true مع action: "send" وthreadId أو replyTo لطلب أن يبث Slack أيضًا رد السلسلة إلى القناة الأصلية. يُطابق هذا علامة reply_broadcast في chat.postMessage لدى Slack، ولا يُدعم إلا لعمليات إرسال النص أو Block Kit، وليس لرفع الوسائط. عندما تُنفَّذ استدعاءة أداة message داخل سلسلة Slack وتستهدف القناة نفسها، يرث OpenClaw عادةً سلسلة Slack الحالية وفقًا لـ replyToMode الفعالة للحساب أو نوع المحادثة أو لكل قناة. تستخدم الردود التلقائية واستدعاءات send أو upload-file في القناة نفسها التجاوز ذاته لكل قناة. اضبط topLevel: true على action: "send" أو action: "upload-file" لفرض رسالة جديدة في القناة الأصلية بدلًا من ذلك. تُقبل threadId: null باعتبارها إلغاء الاشتراك نفسه على المستوى الأعلى.
يعطّل replyToMode="off" تسلسل ردود Slack الصادرة، بما في ذلك وسوم [[reply_to_*]] الصريحة. ولا يسطّح جلسات سلاسل Slack الواردة: تظل الرسائل المنشورة بالفعل داخل سلسلة Slack موجّهة إلى جلسة :thread:<threadTs>. يختلف هذا عن Telegram، حيث تظل الوسوم الصريحة معتمدة في وضع "off". تخفي سلاسل Slack الرسائل من القناة، بينما تظل ردود Telegram مرئية ضمن السياق.

تفاعلات الإقرار

يرسل ackReaction رمزًا تعبيريًا للإقرار بينما يعالج OpenClaw رسالة واردة. ويحدد ackReactionScope متى يُرسل ذلك الرمز فعليًا. افتراضيًا، يظل الإقرار ثابتًا بينما تعرض حالة سلسلة المساعد الأصلية في Slack التقدم باستخدام رسائل تحميل متناوبة. اضبط messages.statusReactions.enabled: true للاشتراك بدلًا من ذلك في دورة حياة تفاعلات الانتظار/التفكير/الأداة/الاكتمال/الخطأ.

الرمز التعبيري (ackReaction)

ترتيب الحل:
  • channels.slack.accounts.<accountId>.ackReaction
  • channels.slack.ackReaction
  • messages.ackReaction
  • البديل الاحتياطي للرمز التعبيري لهوية الوكيل (agents.list[].identity.emoji، وإلا "eyes" / 👀)
ملاحظات:
  • يتوقع Slack رموزًا مختصرة (مثل "eyes").
  • استخدم "" لتعطيل التفاعل لحساب Slack أو على المستوى العام.

النطاق (messages.ackReactionScope)

يقرأ موفر Slack النطاق من messages.ackReactionScope (الافتراضي "group-mentions"). لا يوجد حاليًا تجاوز على مستوى حساب Slack أو قناة Slack؛ فالقيمة عامة على مستوى Gateway. القيم:
  • "all": التفاعل في الرسائل المباشرة والمجموعات، بما في ذلك أحداث الغرف المحيطة.
  • "direct": التفاعل في الرسائل المباشرة فقط.
  • "group-all": التفاعل مع كل رسالة جماعية باستثناء أحداث الغرف المحيطة (من دون رسائل مباشرة).
  • "group-mentions" (الافتراضي): التفاعل في المجموعات، ولكن فقط عند الإشارة إلى البوت (أو في العناصر القابلة للإشارة الجماعية التي اشتركت). تُستبعد الرسائل المباشرة.
  • "off" / "none": عدم التفاعل مطلقًا.
لا يُطلق النطاق الافتراضي ("group-mentions") تفاعلات الإقرار في الرسائل المباشرة أو أحداث الغرف المحيطة. لرؤية ackReaction المضبوط (مثل "eyes") في رسائل Slack المباشرة الواردة وأحداث الغرف الهادئة، اضبط messages.ackReactionScope على "all". تُقرأ messages.ackReactionScope عند بدء تشغيل موفر Slack، لذا يلزم إعادة تشغيل Gateway لكي يسري التغيير.

بث النص

يتحكم channels.slack.streaming في سلوك المعاينة المباشرة:
  • off: تعطيل بث المعاينة المباشرة.
  • partial (الافتراضي): استبدال نص المعاينة بأحدث مخرجات جزئية.
  • block: إلحاق تحديثات المعاينة المجزأة.
  • progress: عرض نص حالة التقدم أثناء الإنشاء، ثم إرسال النص النهائي.
  • streaming.preview.toolProgress: عندما تكون معاينة المسودة نشطة، توجيه تحديثات الأداة/التقدم إلى رسالة المعاينة المعدّلة نفسها (الافتراضي: true). اضبط false للاحتفاظ برسائل منفصلة للأداة/التقدم.
  • streaming.preview.commandText / streaming.progress.commandText: اضبطها على status للاحتفاظ بأسطر تقدم الأداة الموجزة مع إخفاء نص الأمر/التنفيذ الأولي (الافتراضي: raw).
إخفاء نص الأمر/التنفيذ الأولي مع الاحتفاظ بأسطر التقدم الموجزة:
يتحكم channels.slack.streaming.nativeTransport في بث النص الأصلي في Slack عندما تكون channels.slack.streaming.mode بقيمة partial (الافتراضي: true). بطاقات مهام التقدم الأصلية في Slack اختيارية لوضع التقدم. اضبط channels.slack.streaming.progress.nativeTaskCards على true مع channels.slack.streaming.mode="progress" لإرسال بطاقة خطة/مهمة أصلية في Slack أثناء تنفيذ العمل، ثم تحديث بطاقة المهمة نفسها عند الاكتمال. من دون هذه العلامة، يحتفظ وضع التقدم بسلوك معاينة المسودة القابل للنقل.
  • يجب أن تكون سلسلة رد متاحة لكي يظهر بث النص الأصلي وحالة سلسلة مساعد Slack. ويظل اختيار السلسلة متبعًا لـ replyToMode.
  • لا يزال بإمكان القنوات والمحادثات الجماعية وجذور الرسائل المباشرة ذات المستوى الأعلى استخدام معاينة المسودة العادية عندما لا يتوفر البث الأصلي أو لا توجد سلسلة رد.
  • تظل رسائل Slack المباشرة ذات المستوى الأعلى خارج السلسلة افتراضيًا، لذا لا تعرض معاينة البث/الحالة الأصلية بنمط سلاسل Slack؛ وينشر OpenClaw معاينة مسودة في الرسالة المباشرة ويعدّلها بدلًا من ذلك.
  • تعود الوسائط والحمولات غير النصية إلى التسليم العادي.
  • تلغي النتائج النهائية للوسائط/الأخطاء تعديلات المعاينة المعلقة؛ ولا تُفرغ النتائج النهائية المؤهلة للنص/الكتل إلا عندما يمكنها تعديل المعاينة في موضعها.
  • إذا فشل البث في منتصف الرد، يعود OpenClaw إلى التسليم العادي للحمولات المتبقية.
استخدام معاينة المسودة بدلًا من بث النص الأصلي في Slack:
الاشتراك في بطاقات مهام التقدم الأصلية في Slack:
المفاتيح القديمة:
  • channels.slack.streamMode (replace | status_final | append) اسم مستعار قديم لـ channels.slack.streaming.mode.
  • القيمة المنطقية channels.slack.streaming اسم مستعار قديم لـ channels.slack.streaming.mode وchannels.slack.streaming.nativeTransport.
  • القيمتان channels.slack.chunkMode وchannels.slack.nativeStreaming على المستوى الأعلى اسمان مستعاران قديمان لـ channels.slack.streaming.chunkMode وchannels.slack.streaming.nativeTransport.
  • لا تُقرأ الأسماء المستعارة القديمة في وقت التشغيل؛ شغّل openclaw doctor --fix لإعادة كتابة إعدادات بث Slack المحفوظة باستخدام المفاتيح القياسية.

البديل الاحتياطي لتفاعل الكتابة

يضيف typingReaction تفاعلًا مؤقتًا إلى رسالة Slack الواردة بينما يعالج OpenClaw ردًا، ثم يزيله عند انتهاء التشغيل. يكون هذا أكثر فائدة خارج ردود السلاسل، التي تستخدم مؤشر حالة افتراضيًا يفيد بأن المستخدم “يكتب…”. ترتيب الحل:
  • channels.slack.accounts.<accountId>.typingReaction
  • channels.slack.typingReaction
ملاحظات:
  • يتوقع Slack رموزًا مختصرة (مثل "hourglass_flowing_sand").
  • يُنفّذ التفاعل على أساس بذل أفضل جهد، وتُحاول إزالته تلقائيًا بعد اكتمال مسار الرد أو الفشل.

الإدخال الصوتي

للتحدث إلى OpenClaw في Slack حاليًا، أرسل مقطعًا صوتيًا من Slack إلى تطبيق OpenClaw. ميكروفون الإملاء في Slackbot ميزة منفصلة مملوكة لـ Slack، وليس واجهة API للتطبيق.
  • يعمل الإملاء الصوتي في Slackbot داخل محادثة Slackbot الخاصة بالمستخدم. يحوّل Slack التسجيل إلى مطالبة في Slackbot، لكنه لا يرسل ملفًا صوتيًا أو حدث إملاء أو مطالبة أو علامة لمصدر الإدخال إلى تطبيقات Slack التابعة لجهات خارجية عبر Events API. لا يمكن لـ Plugin Slack في OpenClaw تمكينه أو استقباله.
  • مقاطع Slack الصوتية هي ملفات مخزنة في Slack يمكن نشرها في رسالة خاصة أو قناة أو سلسلة محادثات في OpenClaw. ينزّل OpenClaw المقطع القابل للوصول باستخدام رمز البوت، ويوحّد بيانات MIME الوصفية للمقطع في Slack، ثم يرسله عبر مسار تحويل الصوت إلى نص المشترك. يتضمن بيان التطبيق الموصى به نطاق files:read المطلوب.
تختلف دلالات الخصوصية بين المقاطع الصوتية والإملاء في Slackbot: تخضع المقاطع لسياسة الاحتفاظ بالملفات في Slack وينزّلها OpenClaw لتحويلها إلى نص، بينما يفيد Slack بأن صوت الإملاء لا يُخزَّن. في قناة تستخدم requireMention: true، يمكن لمقطع صوتي بلا تسمية توضيحية اجتياز البوابة عبر نطق نمط إشارة مُعدّ (agents.list[].groupChat.mentionPatterns، مع الرجوع إلى messages.groupChat.mentionPatterns). يتحقق OpenClaw من صلاحية المرسل قبل تنزيل المقطع أو تحويله إلى نص، ثم لا يقبله إلا إذا طابق النص الناتج النمط. يُتخلّص من النص الاستباقي الفاشل أو غير المطابق مع المقطع المنزّل، ولا يُحتفظ به في سجل القناة. لا يمكن استنتاج هوية @bot الأصلية في Slack من الكلام، لذا يجب إعداد نمط للاسم المنطوق أو تضمين إشارة مكتوبة. إذا فُعّل تكرار النص الناتج، فلا يُرسل التكرار إلا بعد القبول.

الوسائط والتقسيم والتسليم

تُنزّل مرفقات ملفات Slack من عناوين URL خاصة مستضافة على Slack (عبر تدفق طلبات موثّق بالرمز)، وتُكتب في مخزن الوسائط عند نجاح الجلب وسماح حدود الحجم بذلك. تتضمن العناصر النائبة للملفات fileId الخاص بـ Slack كي تتمكن الوكلاء من جلب الملف الأصلي باستخدام download-file.تستخدم التنزيلات مدد انتهاء مهلة محدودة للخمول والوقت الإجمالي. إذا تعطل استرداد ملف Slack أو فشل، يواصل OpenClaw معالجة الرسالة ويرجع إلى العنصر النائب للملف.يكون الحد الأقصى الافتراضي لحجم البيانات الواردة وقت التشغيل هو 20MB ما لم يتجاوزه channels.slack.mediaMaxMb.
  • تستخدم أجزاء النص channels.slack.textChunkLimit (القيمة الافتراضية 8000، بحد أقصى يساوي حد طول الرسائل في Slack)
  • يفعّل channels.slack.streaming.chunkMode="newline" التقسيم حسب الفقرات أولًا
  • تستخدم عمليات إرسال الملفات واجهات رفع Slack، ويمكن أن تتضمن ردودًا ضمن سلاسل المحادثات (thread_ts)
  • تستخدم تسميات الملفات الطويلة أول جزء نصي آمن في Slack تعليقًا للرفع، وترسل الأجزاء المتبقية رسائل متابعة
  • يتبع الحد الأقصى للوسائط الصادرة channels.slack.mediaMaxMb عند إعداده؛ وإلا فتستخدم عمليات الإرسال إلى القنوات القيم الافتراضية لنوع MIME من مسار الوسائط
الوجهات الصريحة المفضلة:
  • user:<id> للرسائل الخاصة
  • channel:<id> للقنوات
يمكن لرسائل Slack الخاصة التي تحتوي على نص أو كتل فقط النشر مباشرة إلى معرّفات المستخدمين؛ أما عمليات رفع الملفات والإرسال ضمن سلاسل المحادثات فتفتح الرسالة الخاصة أولًا عبر واجهات محادثات Slack، لأن هذه المسارات تتطلب معرّف محادثة محددًا.

الأوامر وسلوك أوامر الشرطة المائلة

تظهر أوامر الشرطة المائلة في Slack إما كأمر واحد مُعدّ أو كعدة أوامر أصلية. اضبط channels.slack.slashCommand لتغيير القيم الافتراضية للأوامر:
  • enabled: false
  • name: "openclaw"
  • sessionPrefix: "slack:slash"
  • ephemeral: true
تتطلب الأوامر الأصلية إعدادات إضافية للبيان في تطبيق Slack، وتُفعّل باستخدام channels.slack.commands.native: true أو commands.native: true في الإعدادات العامة بدلًا من ذلك.
  • الوضع التلقائي للأوامر الأصلية معطّل في Slack، لذلك لا يفعّل commands.native: "auto" أوامر Slack الأصلية.
تُعرض قوائم وسيطات الأوامر الأصلية بإحدى الصور التالية، حسب ترتيب الأولوية:
  • من 3 إلى 5 خيارات قصيرة بما يكفي: قائمة تجاوز (”…”)
  • أكثر من 100 خيار، مع توفر تصفية غير متزامنة للخيارات: تحديد خارجي
  • خيار واحد أو خياران، أو أي خيار تكون قيمته المشفرة أطول مما يسمح به عنصر التحديد: كتل أزرار
  • خلاف ذلك (من 6 إلى 100 خيار، أو أكثر من 100 دون تصفية غير متزامنة): قائمة تحديد ثابتة، مقسمة إلى 100 خيار لكل قائمة
تستخدم جلسات أوامر الشرطة المائلة مفاتيح معزولة مثل agent:<agentId>:slack:slash:<userId>، وتظل توجّه تنفيذ الأوامر إلى جلسة المحادثة المستهدفة باستخدام CommandTargetSessionKey.

المخططات الأصلية

تعرض كتلة Block Kit العامة data_visualization في Slack مخططات خطية وشريطية ومساحية ودائرية في الرسائل. يربط OpenClaw كتلة presentation chart المحمولة بتلك البنية الأصلية؛ ولا يلزم أي نطاق OAuth إضافي أو رفع ملفات أو عارض صور أو إعداد في Slack بخلاف صلاحية الوصول العادية إلى رسائل chat:write.
تُفرض حدود Slack قبل العرض الأصلي:
  • العنوان وتسميات المحاور الاختيارية: 50 حرفًا
  • المخطط الدائري: من 1 إلى 12 قطاعًا موجبًا
  • المخطط الخطي أو الشريطي أو المساحي: من 1 إلى 12 سلسلة ذات أسماء فريدة ومن 1 إلى 20 فئة مشتركة
  • تسميات القطاعات والفئات والسلاسل: 20 حرفًا
  • يجب أن تحتوي كل سلسلة على قيمة محدودة واحدة لكل فئة؛ ويمكن أن تكون قيم المخططات غير الدائرية سالبة
يحمل كل مخطط أصلي أيضًا تمثيلًا نصيًا على المستوى الأعلى لقارئات الشاشة والإشعارات ونسخ الجلسات والعملاء الذين لا يمكنهم عرض الكتلة. تتلقى عمليات إرسال العروض القياسية إلى قنوات OpenClaw الأخرى بيانات المخطط الحتمية نفسها كنص، ما لم تعلن تلك القنوات دعمها الأصلي للمخططات. إذا رفض Slack المخطط باستخدام invalid_blocks أثناء طرح مرحلي، يزيل OpenClaw كتل البيانات الأصلية المرفوضة، ويُبقي عناصر التحكم الشقيقة، ويرسل تمثيل المخطط الكامل كنص مرئي. يقبل Slack حاليًا ما يصل إلى كتلتين من data_visualization لكل رسالة. عندما يحتوي العرض على أكثر من مخططين صالحين، يحافظ OpenClaw على ترتيبها ويتابع العرض الأصلي في رسائل متابعة، بما لا يزيد على مخططين في كل رسالة. يوثّق إطلاق المطورين في Slack الكتلة باعتبارها ميزة Block Kit موجهة للتطبيقات، ولا ينشر أي قيد على الخطط المدفوعة. تنطبق صياغة أهلية Business+/Enterprise على إنشاء المخططات التلقائي بالذكاء الاصطناعي في Slackbot، وهو أمر منفصل عن إرسال تطبيق لمخطط Block Kit منظم مسبقًا. المخططات كتل مخصصة للرسائل فقط، وليست محتوى في App Home أو النوافذ المشروطة أو Canvas.

الجداول الأصلية

تعرض كتلة Block Kit الحالية data_table في Slack صفوفًا وأعمدة منظمة داخل الرسائل. يربط OpenClaw كتلة presentation table المحمولة والصريحة بـ data_table؛ ولا يستخدم كتلة Slack القديمة table. لا يلزم أي نطاق OAuth إضافي أو إعداد في Slack بخلاف صلاحية الوصول العادية إلى رسائل chat:write.
يربط OpenClaw خلايا العناوين والسلاسل النصية بخلايا raw_text في Slack. وتُربط الخلايا الرقمية بـ raw_number، مع الحفاظ على القيمة الرقمية المحدودة للفرز والتصفية الأصليين. يحدد rowHeaderColumnIndex، عند وجوده، ذلك العمود ذي الفهرسة الصفرية بوصفه عناوين صفوف Slack. تُفرض حدود data_table المنشورة من Slack قبل العرض الأصلي:
  • من 1 إلى 20 عمودًا
  • من 1 إلى 100 صف بيانات، بالإضافة إلى صف العنوان
  • العدد نفسه من الخلايا في كل صف
  • بحد أقصى 10,000 حرف إجمالًا عبر جميع خلايا الجدول في رسالة واحدة
يمكن عرض عدة كتل جداول صالحة عرضًا أصليًا ما دامت الرسالة ضمن الحد الإجمالي للأحرف. يتحول الجدول الذي لا يمكن عرضه ضمن الحدود الأصلية إلى نص حتمي كامل بدلًا من فقدان صفوف أو خلايا. إذا تجاوز ذلك النص سعة رسالة واحدة في Slack، تستخدم عمليات الإرسال وردود أوامر الشرطة المائلة أجزاء نصية مرتبة. تفشل تعديلات الجداول بخطأ صريح في الحجم بدلًا من اقتطاع صفوف من رسالة موجودة دون تنبيه. يحمل كل جدول أصلي ناتج من عرض محمول أيضًا تمثيلًا نصيًا على المستوى الأعلى لقارئات الشاشة والإشعارات ونسخ الجلسات والعملاء الذين لا يمكنهم عرض الكتلة. تبقى قيم المخططات والجداول الخام حرفية في البديل، فلا تتحول بيانات الخلايا مثل <@U123> إلى إشارة في Slack. إذا رفض Slack كتل المخططات أو الجداول الأصلية باستخدام invalid_blocks، فإن OpenClaw يزيل كل كتل البيانات الأصلية في خطوة استرداد واحدة محدودة، ويحتفظ بالكتل الشقيقة الصالحة مثل الأزرار وعناصر التحديد، ويرسل النص الكامل المرئي للمخططات والجداول مع تعطيل تنسيق Slack. يتتبع تسليم أوامر الشرطة المائلة ميزانية response_url ذات الاستدعاءات الخمسة في Slack طوال الأمر. وقبل كل دفعة ردود، يختار خطة كاملة تناسب الاستدعاءات المتبقية أو يفشل قبل نشر تلك الدفعة. لا تُرقّى إلى جداول أصلية إلا كتل الجداول الصريحة presentation. تبقى جداول Markdown ذات الأنابيب نصًا كما أُلّفت؛ ولا يخمّن OpenClaw بنية الجدول أو أنواع الخلايا. يمكن للمنتجين الحاليين الموثوقين الذين يستخدمون بنية Slack الأصلية الاستمرار في تمرير الكتل الخام عبر channelData.slack.blocks؛ ويستخرج OpenClaw نصًا بديلًا من خلايا data_table الخام الصالحة، بينما قد تتراجع الكتل المخصصة غير الصحيحة إلى تسميتها التوضيحية أو إلى بديل Block Kit العام. ينبغي أن تستخدم مخرجات الوكلاء وCLI والإضافات المحمولة presentation.

الردود التفاعلية

يمكن لـ Slack عرض عناصر تحكم تفاعلية في الردود ينشئها الوكلاء، لكن هذه الميزة معطلة افتراضيًا. بالنسبة إلى المخرجات الجديدة من الوكلاء وCLI والإضافات، يُفضّل استخدام أزرار presentation المشتركة أو كتل التحديد. فهي تستخدم مسار تفاعل Slack نفسه، مع إمكانية التراجع أيضًا على القنوات الأخرى. فعّلها عموميًا:
أو فعّلها لحساب Slack واحد فقط:
عند تفعيلها، يظل بإمكان الوكلاء إصدار توجيهات رد مهملة خاصة بـ Slack:
  • [[slack_buttons: Approve:approve, Reject:reject]]
  • [[slack_select: Choose a target | Canary:canary, Production:production]]
تُترجم هذه التوجيهات إلى Slack Block Kit، وتوجّه النقرات أو عمليات التحديد عبر مسار أحداث التفاعل الحالي في Slack. احتفظ بها للمطالبات القديمة ولمخارج الطوارئ الخاصة بـ Slack؛ واستخدم العرض المشترك لعناصر التحكم المحمولة الجديدة. واجهات API الخاصة بمترجم التوجيهات مهملة أيضًا في شيفرة المنتجين الجديدة:
  • compileSlackInteractiveReplies(...)
  • parseSlackOptionsLine(...)
  • isSlackInteractiveRepliesEnabled(...)
  • buildSlackInteractiveBlocks(...)
استخدم حمولات presentation وbuildSlackPresentationBlocks(...) لعناصر التحكم الجديدة المعروضة في Slack. ملاحظات:
  • هذه واجهة مستخدم قديمة خاصة بـ Slack. لا تحوّل القنوات الأخرى توجيهات Slack Block Kit إلى أنظمة الأزرار الخاصة بها.
  • قيم الاستدعاء التفاعلي هي رموز مبهمة ينشئها OpenClaw، وليست قيمًا خامًا أنشأها الوكيل.
  • إذا كانت الكتل التفاعلية المُنشأة ستتجاوز حدود Slack Block Kit، يعود OpenClaw إلى الرد النصي الأصلي بدلًا من إرسال حمولة كتل غير صالحة.

عمليات إرسال النماذج المشروطة المملوكة للـ Plugin

يمكن أيضًا لـ Plugins الخاصة بـ Slack التي تسجّل معالجًا تفاعليًا تلقي أحداث دورة حياة view_submission وview_closed قبل أن ينفّذ OpenClaw عملية Compaction للحمولة ضمن حدث النظام المرئي للوكيل. استخدم أحد أنماط التوجيه التالية عند فتح نموذج مشروط في Slack:
  • اضبط callback_id على openclaw:<namespace>:<payload>.
  • أو احتفظ بـ callback_id موجود وضع pluginInteractiveData: "<namespace>:<payload>" في private_metadata الخاص بالنموذج المشروط.
يتلقى المعالج ctx.interaction.kind بوصفه view_submission أو view_closed، وinputs بعد تسويته، وكائن stateValues الخام الكامل من Slack. يكفي التوجيه باستخدام معرّف الاستدعاء فقط لاستدعاء معالج الـ Plugin؛ أدرج حقول توجيه المستخدم/الجلسة private_metadata الموجودة في النموذج المشروط عندما ينبغي للنموذج المشروط أيضًا إنشاء حدث نظام مرئي للوكيل. يتلقى الوكيل حدث نظام Slack interaction: ... موجزًا ومنقّحًا. إذا أعاد المعالج systemEvent.summary أو systemEvent.reference أو systemEvent.data، فستُدرج هذه الحقول في ذلك الحدث الموجز كي يتمكن الوكيل من الإشارة إلى التخزين المملوك للـ Plugin من دون رؤية حمولة النموذج الكاملة.

الموافقات الأصلية في Slack

يمكن أن يعمل Slack كعميل موافقات أصلي باستخدام الأزرار والتفاعلات، بدلًا من الرجوع إلى واجهة الويب أو الطرفية.
  • يمكن عرض موافقات التنفيذ والـ Plugin كمطالبات Slack Block Kit أصلية.
  • يظل channels.slack.execApprovals.* إعداد تمكين عميل موافقات التنفيذ الأصلي وتوجيه الرسائل المباشرة/القنوات.
  • تستخدم الرسائل المباشرة لموافقة التنفيذ channels.slack.execApprovals.approvers أو commands.ownerAllowFrom.
  • تستخدم موافقات الـ Plugin أزرار Slack الأصلية عندما يكون Slack مفعّلًا كعميل موافقات أصلي للجلسة المنشئة، أو عندما يوجّه approvals.plugin إلى جلسة Slack المنشئة أو إلى هدف Slack.
  • تستخدم الرسائل المباشرة لموافقة الـ Plugin معتمدي Slack Plugin من channels.slack.allowFrom، أو allowFrom للحساب المسمّى، أو مسار الحساب الافتراضي.
  • يظل تفويض المعتمد مفروضًا: لا يمكن للمعتمدين المخوّلين للتنفيذ فقط الموافقة على طلبات الـ Plugin ما لم يكونوا أيضًا من معتمدي الـ Plugin.
يستخدم هذا سطح أزرار الموافقات المشترك نفسه الذي تستخدمه القنوات الأخرى. عندما يكون interactivity مفعّلًا في إعدادات تطبيق Slack، تظهر مطالبات الموافقة كأزرار Block Kit مباشرةً في المحادثة. عند وجود هذه الأزرار، تكون هي تجربة الموافقة الأساسية؛ ولا ينبغي لـ OpenClaw تضمين أمر /approve يدوي إلا عندما تشير نتيجة الأداة إلى أن موافقات الدردشة غير متاحة أو أن الموافقة اليدوية هي المسار الوحيد. مسار الإعداد:
  • channels.slack.execApprovals.enabled
  • channels.slack.execApprovals.approvers (اختياري؛ يعود إلى commands.ownerAllowFrom عندما يكون ذلك ممكنًا)
  • channels.slack.execApprovals.target (dm | channel | both، الافتراضي: dm)
  • agentFilter، sessionFilter
يفعّل Slack موافقات التنفيذ الأصلية تلقائيًا عندما لا يكون enabled مضبوطًا أو يكون "auto"، وعندما يتحدد معتمد تنفيذ واحد على الأقل. يمكن لـ Slack أيضًا معالجة موافقات الـ Plugin الأصلية عبر مسار العميل الأصلي هذا عندما يتحدد معتمدو Slack Plugin ويطابق الطلب مرشحات العميل الأصلي. اضبط enabled: false لتعطيل Slack صراحةً بوصفه عميل موافقات أصليًا. اضبط enabled: true لفرض تشغيل الموافقات الأصلية عند تحديد المعتمدين. لا يؤدي تعطيل موافقات تنفيذ Slack إلى تعطيل تسليم موافقات Slack Plugin الأصلية المفعّل عبر approvals.plugin؛ إذ يستخدم تسليم موافقة الـ Plugin معتمدي Slack Plugin بدلًا من ذلك. السلوك الافتراضي عند عدم وجود إعداد صريح لموافقة تنفيذ Slack:
لا يلزم إعداد Slack الأصلي الصريح إلا عندما تريد تجاوز المعتمدين، أو إضافة مرشحات، أو الاشتراك في التسليم إلى دردشة المنشأ:
إعادة توجيه approvals.exec المشتركة منفصلة. استخدمها فقط عندما يجب أيضًا توجيه مطالبات موافقة التنفيذ إلى دردشات أخرى أو أهداف صريحة خارج النطاق. كما أن إعادة توجيه approvals.plugin المشتركة منفصلة؛ ولا يمنع التسليم الأصلي في Slack هذا المسار الاحتياطي إلا عندما يستطيع Slack معالجة طلب موافقة الـ Plugin أصليًا. يعمل أيضًا /approve ضمن الدردشة نفسها في قنوات Slack والرسائل المباشرة التي تدعم الأوامر بالفعل. راجع موافقات التنفيذ للاطلاع على نموذج إعادة توجيه الموافقات الكامل.

الأحداث والسلوك التشغيلي

  • تُحوّل تعديلات الرسائل وعمليات حذفها إلى أحداث نظام.
  • تُعالَج عمليات بث سلاسل المحادثات (ردود السلسلة عبر “Also send to channel”) كرسائل مستخدم عادية.
  • تُحوّل أحداث إضافة التفاعلات وإزالتها إلى أحداث نظام.
  • تُحوّل أحداث انضمام الأعضاء ومغادرتهم، وإنشاء القنوات وإعادة تسميتها، وإضافة التثبيت وإزالته إلى أحداث نظام.
  • يمكن لاستقصاء الحضور الاختياري تحويل انتقال away إلى active لأحد المشاركين البشر الذين جرت ملاحظتهم إلى أحدث جلسة Slack مؤهلة ونشطة لذلك المشارك. يكون هذا معطلًا افتراضيًا.
  • يمكن لـ channel_id_changed ترحيل مفاتيح إعداد القناة عندما يكون configWrites مفعّلًا.
  • تُعامل البيانات الوصفية لموضوع القناة وغرضها كسياق غير موثوق ويمكن حقنها في سياق التوجيه.
  • تُرشّح بادرة سلسلة المحادثات وبذر سياق السجل الأولي للسلسلة وفق قوائم السماح للمرسلين المضبوطة عند انطباقها.
  • تصدر إجراءات الكتل والاختصارات وتفاعلات النماذج المشروطة أحداث نظام Slack interaction: ... منظّمة تتضمن حقول حمولة غنية:
    • إجراءات الكتل: القيم المحددة، والتسميات، وقيم أدوات الاختيار، والبيانات الوصفية لـ workflow_*
    • الاختصارات العامة: البيانات الوصفية للاستدعاء والفاعل، وتُوجّه إلى جلسة الفاعل المباشرة
    • اختصارات الرسائل: سياق الاستدعاء والفاعل والقناة والسلسلة والرسالة المحددة
    • أحداث النموذج المشروط view_submission وview_closed مع البيانات الوصفية للقناة الموجّهة ومدخلات النموذج
عرّف اختصارات عامة أو اختصارات رسائل في إعداد تطبيق Slack واستخدم أي معرّف استدعاء غير فارغ. يقرّ OpenClaw باستلام حمولات الاختصارات المطابقة، ويطبّق سياسة مرسل الرسائل المباشرة/القنوات نفسها المطبّقة على تفاعلات Slack الأخرى، ويضع الحدث المنقّى في قائمة انتظار جلسة الوكيل الموجّهة. تُنقّح معرّفات المشغّلات وعناوين URL للاستجابة من سياق الوكيل.

أحداث الحضور

لا يرسل Slack تغييرات الحضور عبر Events API أو Socket Mode. وبدلًا من ذلك، يمكن لـ OpenClaw استقصاء users.getPresence للمشاركين البشر الذين اجتازت رسائلهم عمليات التحقق العادية للوصول والتوجيه في Slack.
  • off (الافتراضي): لا يوجد مؤقت حضور أو استدعاءات Slack API.
  • auto: راقب الرسائل المباشرة وMPIMs وسلاسل Slack النشطة خلال آخر 24 ساعة، بحد أقصى 8 مشاركين بشر تمت ملاحظتهم. تُستبعد جلسات القنوات ذات المستوى الأعلى.
  • on: راقب المحادثات نفسها من دون حد للمشاركين، وأدرج جلسات القنوات ذات المستوى الأعلى. استخدم تجاوزًا خاصًا بكل قناة لفرض مراقبة قناة واحدة أو منعها.
يستقصي OpenClaw بحد أقصى 45 مستخدمًا فريدًا في الدقيقة لكل حساب Slack، ويستخدم النتيجة الأولى كبذرة من دون إيقاظ الوكيل، ولا يوقظه إلا عند ملاحظة انتقال من away إلى active. تُطبّق فترة تهدئة دائمة مدتها 8 ساعات لكل حساب Slack ومستخدم، حتى إذا شارك ذلك الشخص في عدة سلاسل. لا يُوجّه الحدث إلا إلى أحدث محادثة مؤهلة ونشطة لذلك الشخص، ويطلب من الوكيل الرجوع إلى الذاكرة/الويكي وسياق المنطقة الزمنية المعروف قبل أن يقرر ما إذا كان سيرسل تحية قصيرة واحدة. ويمكن للوكيل التزام الصمت. يحتاج رمز البوت إلى users:read، وهو مُدرج بالفعل في البيان الموصى به. لا تتوفر أحداث الحضور لعمليات التثبيت على مستوى مؤسسة Enterprise Grid بأكملها.

مرجع الإعداد

المرجع الأساسي: مرجع الإعداد - Slack.
  • الوضع/المصادقة: mode، enterpriseOrgInstall، botToken، appToken، signingSecret، webhookPath، accounts.*
  • الوصول إلى الرسائل المباشرة: dm.enabled، dmPolicy، allowFrom (قديم: dm.policy، dm.allowFromdm.groupEnabled، dm.groupChannels
  • مفتاح تبديل التوافق: dangerouslyAllowNameMatching (للطوارئ؛ أبقه معطلًا ما لم تكن هناك حاجة إليه)
  • الوصول إلى القناة: groupPolicy، channels.*، channels.*.users، channels.*.requireMention
  • سلاسل المحادثات/السجل: replyToMode، replyToModeByChatType، thread.*، historyLimit، dmHistoryLimit، dms.*.historyLimit
  • الإيقاظ عبر الحضور: presenceEvents.mode، channels.*.presenceEvents.mode (off|auto|on؛ الافتراضي off)
  • التسليم: textChunkLimit، streaming.chunkMode، mediaMaxMb، streaming، streaming.nativeTransport، streaming.preview.toolProgress
  • المعاينات الموسّعة: unfurlLinks (الافتراضي: false)، وunfurlMedia للتحكم في معاينة الروابط/الوسائط لـ chat.postMessage؛ اضبط unfurlLinks: true لإعادة الاشتراك في معاينات الروابط
  • التشغيل/الميزات: configWrites، commands.native، slashCommand.*، actions.*، userToken، userTokenReadOnly

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

تحقّق بالترتيب:
  • groupPolicy
  • قائمة السماح للقنوات (channels.slack.channels) — يجب أن تكون المفاتيح معرّفات قنوات (C12345678)، وليست أسماء (#channel-name). تفشل المفاتيح المستندة إلى الأسماء بصمت عند استخدام groupPolicy: "allowlist" لأن توجيه القنوات يعتمد على المعرّفات أولًا افتراضيًا. للعثور على المعرّف: انقر بزر الماوس الأيمن على القناة في Slack ← Copy link — قيمة C... في نهاية عنوان URL هي معرّف القناة.
  • requireMention
  • قائمة السماح users الخاصة بكل قناة
  • messages.groupChat.visibleReplies: تستخدم طلبات المجموعات/القنوات العادية "automatic" افتراضيًا. إذا اشتركت في "message_tool" وأظهرت السجلات نص المساعد من دون استدعاء message(action=send)، فقد أخفق النموذج في استخدام مسار أداة الرسائل المرئي. يظل النص النهائي خاصًا في هذا الوضع؛ افحص سجل Gateway المفصّل بحثًا عن البيانات الوصفية للحمولة المحجوبة، أو اضبطه على "automatic" إذا كنت تريد نشر كل رد نهائي عادي للمساعد عبر المسار القديم.
  • messages.groupChat.unmentionedInbound: إذا كان "room_event"، فإن حديث القناة المسموح به الذي لا يتضمن إشارة يُعد سياقًا محيطًا ويظل صامتًا ما لم يستدعِ الوكيل أداة message. راجع أحداث الغرف المحيطة.
أوامر مفيدة:
تحقّق:
  • channels.slack.dm.enabled
  • channels.slack.dmPolicy (أو channels.slack.dm.policy القديم)
  • موافقات الاقتران / إدخالات قائمة السماح (لا يزال dmPolicy: "open" يتطلب channels.slack.allowFrom: ["*"])
  • تستخدم الرسائل المباشرة الجماعية معالجة MPIM؛ فعّل channels.slack.dm.groupEnabled، وإذا كانت مُعدّة، فأدرج MPIM في channels.slack.dm.groupChannels
  • أحداث الرسائل المباشرة لمساعد Slack: السجلات التفصيلية التي تذكر drop message_changed تعني عادةً أن Slack أرسل حدثًا معدّلًا لسلسلة محادثات المساعد من دون مرسل بشري يمكن استعادته في بيانات الرسالة الوصفية
تحقّق من رمزي البوت والتطبيق ومن تفعيل Socket Mode في إعدادات تطبيق Slack. يحتاج App-Level Token إلى connections:write، ويجب أن ينتمي رمز Bot User OAuth Token الخاص بالبوت إلى تطبيق Slack ومساحة العمل نفسيهما اللذين ينتمي إليهما رمز التطبيق.إذا عرض openclaw channels status --probe --json القيمة botTokenStatus أو appTokenStatus: "configured_unavailable"، فهذا يعني أن حساب Slack مُعدّ، لكن بيئة التشغيل الحالية لم تتمكن من حل القيمة المدعومة بـ SecretRef.تُعد السجلات مثل slack socket mode failed to start; retry ... إخفاقات بدء قابلة للاسترداد. أما النطاقات المفقودة والرموز الملغاة والمصادقة غير الصالحة فتؤدي إلى فشل فوري. ويعني سجل slack token mismatch ... أن رمز البوت ورمز التطبيق يبدوان تابعين لتطبيقي Slack مختلفين؛ أصلح بيانات اعتماد تطبيق Slack.
تحقّق مما يلي:
  • سر التوقيع
  • مسار Webhook
  • عناوين URL لطلبات Slack (الأحداث + التفاعلية + أوامر الشرطة المائلة)
  • قيمة webhookPath فريدة لكل حساب HTTP
  • أن عنوان URL العام ينهي TLS ويمرّر الطلبات إلى مسار Gateway
  • أن مسار request_url في تطبيق Slack يطابق channels.slack.webhookPath تمامًا (القيمة الافتراضية /slack/events)
إذا ظهر signingSecretStatus: "configured_unavailable" في لقطات الحساب، فهذا يعني أن حساب HTTP مُعدّ، لكن بيئة التشغيل الحالية لم تتمكن من حل سر التوقيع المدعوم بـ SecretRef.يعني تكرار سجل slack: webhook path ... already registered أن حسابي HTTP يستخدمان قيمة webhookPath نفسها؛ امنح كل حساب مسارًا مميزًا.
تحقّق مما إذا كنت تقصد:
  • وضع الأوامر الأصلية (channels.slack.commands.native: true) مع تسجيل أوامر الشرطة المائلة المطابقة في Slack
  • أو وضع أمر الشرطة المائلة الواحد (channels.slack.slashCommand.enabled: true)
لا ينشئ Slack أوامر الشرطة المائلة أو يزيلها تلقائيًا. لا يفعّل commands.native: "auto" أوامر Slack الأصلية؛ استخدم true وأنشئ الأوامر المطابقة في تطبيق Slack. في وضع HTTP، يجب أن يتضمن كل أمر شرطة مائلة في Slack عنوان URL الخاص بـ Gateway. في Socket Mode، تصل حمولات الأوامر عبر websocket ويتجاهل Slack القيمة slash_commands[].url.تحقّق أيضًا من commands.useAccessGroups، وتخويل الرسائل المباشرة، وقوائم السماح للقنوات، وقوائم السماح users لكل قناة. يعيد Slack أخطاء مؤقتة لمرسلي أوامر الشرطة المائلة المحظورين، ومنها:
  • This channel is not allowed.
  • You are not authorized to use this command here.

مرجع وسائط المرفقات

يمكن لـ Slack إرفاق الوسائط المنزّلة بدورة الوكيل عند نجاح تنزيل ملفات Slack وسماح حدود الحجم بذلك. يمكن نسخ المقاطع الصوتية نصيًا، ويمكن تمرير ملفات الصور عبر مسار فهم الوسائط أو مباشرةً إلى نموذج رد يدعم الرؤية، بينما تظل الملفات الأخرى متاحة كسياق ملفات قابل للتنزيل.

أنواع الوسائط المدعومة

مسار المعالجة الواردة

عند وصول رسالة Slack تحتوي على مرفقات ملفات:
  1. ينزّل OpenClaw الملف من عنوان URL الخاص في Slack باستخدام رمز البوت.
  2. يُكتب الملف في مخزن الوسائط عند النجاح.
  3. تُضاف مسارات الوسائط المنزّلة وأنواع محتواها إلى السياق الوارد.
  4. تُوجّه المقاطع الصوتية إلى مسار النسخ المشترك؛ ويمكن لمسارات النماذج/الأدوات الداعمة للصور استخدام مرفقات الصور من السياق نفسه.
  5. تظل الملفات الأخرى متاحة كبيانات وصفية للملفات أو مراجع وسائط للأدوات القادرة على التعامل معها.

توارث مرفقات جذر سلسلة المحادثة

عند وصول رسالة ضمن سلسلة محادثات (لها أصل thread_ts):
  • إذا لم يحتوِ الرد نفسه على وسائط مباشرة وكانت الرسالة الجذرية المضمّنة تحتوي على ملفات، فيمكن لـ Slack تحميل ملفات الجذر كسياق لبادئ سلسلة المحادثات.
  • تُحمّل ملفات الجذر فقط عند تهيئة جلسة سلسلة محادثات جديدة أو معاد ضبطها. تعيد الردود النصية اللاحقة استخدام سياق الجلسة الحالي ولا تعيد إرفاق ملفات الجذر كوسائط جديدة.
  • تأخذ مرفقات الرد المباشرة الأولوية على مرفقات الرسالة الجذرية.
  • تُمثّل الرسالة الجذرية التي تحتوي ملفات فقط ولا تحتوي نصًا بعنصر نائب للمرفق، بحيث يمكن للخيار الاحتياطي تضمين ملفاتها مع ذلك.

معالجة المرفقات المتعددة

عندما تحتوي رسالة Slack واحدة على عدة مرفقات ملفات:
  • يُعالج كل مرفق بصورة مستقلة عبر مسار الوسائط.
  • تُجمّع مراجع الوسائط المنزّلة في سياق الرسالة.
  • يتبع ترتيب المعالجة ترتيب ملفات Slack في حمولة الحدث.
  • لا يمنع فشل تنزيل أحد المرفقات معالجة المرفقات الأخرى.

حدود الحجم والتنزيل والنموذج

  • حد الحجم: الافتراضي 20 MB لكل ملف. قابل للتهيئة عبر channels.slack.mediaMaxMb.
  • حد النسخ الصوتي: ينطبق tools.media.audio.maxBytes أيضًا عند إرسال الملف المنزّل إلى موفّر نسخ أو CLI.
  • إخفاقات التنزيل: تُتخطى الملفات التي يتعذر على Slack توفيرها، وعناوين URL المنتهية الصلاحية، والملفات التي يتعذر الوصول إليها، والملفات التي تتجاوز الحجم، واستجابات HTML الخاصة بمصادقة/تسجيل دخول Slack، بدلًا من الإبلاغ عنها كتنسيقات غير مدعومة.
  • نموذج الرؤية: يستخدم تحليل الصور نموذج الرد النشط عندما يدعم الرؤية، أو نموذج الصور المُعدّ في agents.defaults.imageModel.

القيود المعروفة

الوثائق ذات الصلة

ذات صلة

الاقتران

اقرن مستخدم Slack بـ Gateway.

المجموعات

سلوك القنوات والرسائل المباشرة الجماعية.

توجيه القنوات

وجّه الرسائل الواردة إلى الوكلاء.

الأمان

نموذج التهديد والتقوية الأمنية.

التهيئة

بنية الإعدادات وأسبقيتها.

أوامر الشرطة المائلة

فهرس الأوامر وسلوكها.