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