الحالة
مُنفّذ لأسطح الوكيل المشترك وCLI وقدرة Plugin والتسليم الصادر:- يحمل
ReplyPayload.presentationواجهة مستخدم دلالية للرسائل. - يحمل
ReplyPayload.delivery.pinطلبات تثبيت الرسائل المُرسلة. - تعرض إجراءات الرسائل المشتركة
presentationوdeliveryوpinبدلًا منcomponentsأوblocksأوbuttonsأوcardالأصلية للمزوّد. - يعرض النواة العرض التقديمي أو يخفّضه تلقائيًا عبر قدرات الصادر التي يعلنها Plugin.
- تستهلك عارضات Discord وSlack وTelegram وMattermost وMS Teams وFeishu العقد العام.
- لم تعد شيفرة مستوى التحكم لقناة Discord تستورد حاويات واجهة المستخدم المدعومة بـ Carbon.
المشكلة
واجهة مستخدم القنوات مقسّمة حاليًا عبر عدة أسطح غير متوافقة:- يملك النواة خطاف عارض عابرًا للسياقات على هيئة Discord عبر
buildCrossContextComponents. - يمكن لـ Discord
channel.tsاستيراد واجهة مستخدم Carbon الأصلية عبرDiscordUiContainer، ما يسحب اعتماديات واجهة مستخدم وقت التشغيل إلى مستوى التحكم في Plugin القناة. - يكشف الوكيل وCLI منافذ هروب للحمولات الأصلية مثل
componentsفي Discord وblocksفي Slack وbuttonsفي Telegram أو Mattermost وcardفي Teams أو Feishu. - يحمل
ReplyPayload.channelDataتلميحات النقل ومغلفات واجهة المستخدم الأصلية معًا. - يوجد نموذج
interactiveالعام، لكنه أضيق من التخطيطات الأغنى المستخدمة بالفعل في Discord وSlack وTeams وFeishu وLINE وTelegram وMattermost.
الأهداف
- يقرر النواة أفضل عرض دلالي للرسالة من القدرات المُعلنة.
- تعلن الإضافات القدرات وتعرض العرض الدلالي إلى حمولات النقل الأصلية.
- تبقى واجهة تحكم الويب منفصلة عن واجهة المستخدم الأصلية للمحادثة.
- لا تُكشف حمولات القنوات الأصلية عبر سطح رسائل الوكيل المشترك أو CLI.
- تنخفض ميزات العرض غير المدعومة تلقائيًا إلى أفضل تمثيل نصي.
- يكون سلوك التسليم مثل تثبيت رسالة مُرسلة بيانات تعريف عامة للتسليم، لا عرضًا تقديميًا.
ليست أهدافًا
- لا توجد طبقة توافق رجعي لـ
buildCrossContextComponents. - لا توجد منافذ هروب أصلية عامة لـ
componentsأوblocksأوbuttonsأوcard. - لا توجد استيرادات في النواة لمكتبات واجهة المستخدم الأصلية للقنوات.
- لا توجد طبقات SDK خاصة بالمزوّد للقنوات المضمّنة.
النموذج المستهدف
أضف حقلpresentation مملوكًا للنواة إلى ReplyPayload.
interactive مجموعة فرعية من presentation أثناء الترحيل:
- تُطابق كتلة النص في
interactiveإلىpresentation.blocks[].type = "text". - تُطابق كتلة الأزرار في
interactiveإلىpresentation.blocks[].type = "buttons". - تُطابق كتلة الاختيار في
interactiveإلىpresentation.blocks[].type = "select".
presentation؛ ويبقى interactive مساعد تحليل/عرض داخليًا قديمًا لمنتجي الردود الحاليين.
تعامل واجهة API العامة الموجّهة للمنتجين interactive على أنه مهمل. يبقى دعم وقت التشغيل حتى تستمر مساعدات الموافقة الحالية وPlugins الأقدم في العمل بينما تصدر الشيفرة الجديدة presentation.
بيانات تعريف التسليم
أضف حقلdelivery مملوكًا للنواة لسلوك الإرسال الذي ليس واجهة مستخدم.
- يعني
delivery.pin = trueتثبيت أول رسالة تُسلَّم بنجاح. - تكون القيمة الافتراضية لـ
notifyهيfalse. - تكون القيمة الافتراضية لـ
requiredهيfalse؛ تنخفض القنوات غير المدعومة أو فشل التثبيت تلقائيًا عبر متابعة التسليم. - تبقى إجراءات الرسائل اليدوية
pinوunpinوlist-pinsللرسائل الحالية.
channelData.telegram.pin = true إلى delivery.pin = true.
عقد قدرة وقت التشغيل
أضف خطافات عرض وتسليم للعرض التقديمي إلى مهايئ الصادر في وقت التشغيل، وليس إلى Plugin القناة في مستوى التحكم.- حلّ القناة المستهدفة ومهايئ وقت التشغيل.
- طلب قدرات العرض التقديمي.
- تخفيض الكتل غير المدعومة وتطبيق حدود القدرات العامة قبل العرض.
- استدعاء
renderPresentation. - إذا لم يوجد عارض، حوّل العرض التقديمي إلى رجوع احتياطي نصي.
- بعد الإرسال الناجح، استدعِ
pinDeliveredMessageعندما يُطلبdelivery.pinويكون مدعومًا.
تخطيط القنوات
Discord:- اعرض
presentationإلى components v2 وحاويات Carbon في وحدات وقت التشغيل فقط. - أبقِ مساعدات لون التمييز في وحدات خفيفة.
- أزِل استيرادات
DiscordUiContainerمن شيفرة مستوى التحكم في Plugin القناة.
- اعرض
presentationإلى Block Kit. - أزِل إدخال
blocksللوكيل وCLI.
- اعرض النص والسياق والفواصل كنص.
- اعرض الإجراءات والاختيار كلوحات مفاتيح مضمنة عند تكوينها والسماح بها للسطح المستهدف.
- استخدم الرجوع الاحتياطي النصي عندما تكون الأزرار المضمنة معطلة.
- انقل تثبيت موضوع ACP إلى
delivery.pin.
- اعرض الإجراءات كأزرار تفاعلية حيثما تم تكوين ذلك.
- اعرض الكتل الأخرى كرجوع احتياطي نصي.
- اعرض
presentationإلى Adaptive Cards. - أبقِ إجراءات التثبيت/إلغاء التثبيت/سرد التثبيتات اليدوية.
- نفّذ اختياريًا
pinDeliveredMessageإذا كان دعم Graph موثوقًا للمحادثة المستهدفة.
- اعرض
presentationإلى بطاقات تفاعلية. - أبقِ إجراءات التثبيت/إلغاء التثبيت/سرد التثبيتات اليدوية.
- نفّذ اختياريًا
pinDeliveredMessageلتثبيت الرسالة المُرسلة إذا كان سلوك API موثوقًا.
- اعرض
presentationإلى رسائل Flex أو القوالب حيثما أمكن. - ارجع إلى النص للكتل غير المدعومة.
- أزِل حمولات واجهة مستخدم LINE من
channelData.
- حوّل العرض التقديمي إلى نص بتنسيق محافظ.
خطوات إعادة الهيكلة
- أعد تطبيق إصلاح إصدار Discord الذي يفصل
ui-colors.tsعن واجهة المستخدم المدعومة بـ Carbon ويزيلDiscordUiContainerمنextensions/discord/src/channel.ts. - أضف
presentationوdeliveryإلىReplyPayload، وتسوية حمولة الصادر، وملخصات التسليم، وحمولات الخطافات. - أضف مخطط
MessagePresentationومساعدات التحليل في مسار فرعي ضيق لـ SDK/وقت التشغيل. - استبدل قدرات الرسائل
buttonsوcardsوcomponentsوblocksبقدرات العرض التقديمي الدلالية. - أضف خطافات مهايئ الصادر في وقت التشغيل لعرض العرض التقديمي وتثبيت التسليم.
- استبدل إنشاء المكونات العابرة للسياقات بـ
buildCrossContextPresentation. - احذف
src/infra/outbound/channel-adapters.tsوأزلbuildCrossContextComponentsمن أنواع Plugin القناة. - غيّر
maybeApplyCrossContextMarkerلإرفاقpresentationبدلًا من المعلمات الأصلية. - حدّث مسارات إرسال توزيع Plugins لاستهلاك العرض التقديمي الدلالي وبيانات تعريف التسليم فقط.
- أزِل معلمات الحمولات الأصلية من الوكيل وCLI:
componentsوblocksوbuttonsوcard. - أزِل مساعدات SDK التي تنشئ مخططات أدوات الرسائل الأصلية، واستبدلها بمساعدات مخطط العرض التقديمي.
- أزِل مغلفات واجهة المستخدم/الأصلية من
channelData؛ أبقِ بيانات تعريف النقل فقط حتى تتم مراجعة كل حقل متبقٍ. - رحّل عارضات Discord وSlack وTelegram وMattermost وMS Teams وFeishu وLINE.
- حدّث الوثائق لـCLI الرسائل وصفحات القنوات وPlugin SDK وكتاب وصفات القدرات.
- شغّل تحليل تفرّع الاستيراد لنقاط دخول Discord والقنوات المتأثرة.
channelData الخاصة بالمزوّد. تبقى الخطوة 15 تحققًا لاحقًا إذا أردنا أرقام تفرّع استيراد كمّية تتجاوز بوابة الأنواع/الاختبارات.
الاختبارات
أضف أو حدّث:- اختبارات تسوية العرض التقديمي.
- اختبارات التخفيض التلقائي للعرض التقديمي للكتل غير المدعومة.
- اختبارات علامة العبور بين السياقات لمسارات توزيع Plugins والتسليم في النواة.
- اختبارات مصفوفة عرض القنوات لـ Discord وSlack وTelegram وMattermost وMS Teams وFeishu وLINE والرجوع الاحتياطي النصي.
- اختبارات مخطط أداة الرسائل التي تثبت زوال الحقول الأصلية.
- اختبارات CLI التي تثبت زوال الأعلام الأصلية.
- انحدار كسولية استيراد نقطة دخول Discord الذي يغطي Carbon.
- اختبارات تثبيت التسليم التي تغطي Telegram والرجوع الاحتياطي العام.
الأسئلة المفتوحة
- هل يجب تنفيذ
delivery.pinلـ Discord وSlack وMS Teams وFeishu في المرور الأول، أم Telegram فقط أولًا؟ - هل يجب أن يستوعب
deliveryفي النهاية الحقول الحالية مثلreplyToIdوreplyToCurrentوsilentوaudioAsVoice، أم يبقى مركّزًا على سلوكيات ما بعد الإرسال؟ - هل يجب أن يدعم العرض التقديمي الصور أو مراجع الملفات مباشرة، أم يجب أن تبقى الوسائط منفصلة عن تخطيط واجهة المستخدم في الوقت الحالي؟