Durum
Paylaşılan agent, CLI, Plugin yeteneği ve giden teslim yüzeyleri için uygulandı:ReplyPayload.presentation, semantik mesaj kullanıcı arayüzünü taşır.ReplyPayload.delivery.pin, gönderilen mesaj sabitleme isteklerini taşır.- Paylaşılan mesaj eylemleri, sağlayıcıya özgü
components,blocks,buttonsveyacardyerinepresentation,deliveryvepinsunar. - Core, Plugin tarafından bildirilen giden yetenekler üzerinden sunumu işler veya otomatik olarak daha düşük bir temsile indirger.
- Discord, Slack, Telegram, Mattermost, MS Teams ve Feishu oluşturucuları genel sözleşmeyi tüketir.
- Discord kanal kontrol düzlemi kodu artık Carbon destekli kullanıcı arayüzü kapsayıcılarını içe aktarmaz.
Sorun
Kanal kullanıcı arayüzü şu anda birkaç uyumsuz yüzeye bölünmüş durumda:- Core,
buildCrossContextComponentsüzerinden Discord biçimli bir çapraz bağlam oluşturucu hook’una sahiptir. - Discord
channel.ts,DiscordUiContainerüzerinden yerel Carbon kullanıcı arayüzünü içe aktarabilir; bu da çalışma zamanı kullanıcı arayüzü bağımlılıklarını kanal Plugin kontrol düzlemine çeker. - Agent ve CLI, Discord
components, Slackblocks, Telegram veya Mattermostbuttonsve Teams veya Feishucardgibi yerel payload kaçış yolları sunar. ReplyPayload.channelData, hem taşıma ipuçlarını hem de yerel kullanıcı arayüzü zarflarını taşır.- Genel
interactivemodeli vardır, ancak Discord, Slack, Teams, Feishu, LINE, Telegram ve Mattermost tarafından zaten kullanılan daha zengin düzenlerden daha dardır.
Hedefler
- Core, bildirilen yeteneklerden bir mesaj için en iyi semantik sunuma karar verir.
- Plugin’ler yetenekleri bildirir ve semantik sunumu yerel taşıma payload’larına işler.
- Web Control UI, sohbetin yerel kullanıcı arayüzünden ayrı kalır.
- Yerel kanal payload’ları, paylaşılan agent veya CLI mesaj yüzeyi üzerinden sunulmaz.
- Desteklenmeyen sunum özellikleri otomatik olarak en iyi metin temsiline indirgenir.
- Gönderilen bir mesajı sabitleme gibi teslim davranışı, sunum değil genel teslim metadata’sıdır.
Hedef dışı
buildCrossContextComponentsiçin geriye dönük uyumluluk shim’i yok.components,blocks,buttonsveyacardiçin herkese açık yerel kaçış yolları yok.- Kanal yerel kullanıcı arayüzü kitaplıklarının core tarafından içe aktarılması yok.
- Paketli kanallar için sağlayıcıya özgü SDK seam’leri yok.
Hedef model
ReplyPayload içine core’a ait bir presentation alanı ekleyin.
interactive, geçiş sırasında presentation öğesinin bir alt kümesi olur:
interactivemetin bloğu,presentation.blocks[].type = "text"ile eşlenir.interactivedüğmeler bloğu,presentation.blocks[].type = "buttons"ile eşlenir.interactiveseçim bloğu,presentation.blocks[].type = "select"ile eşlenir.
presentation kullanır; interactive, mevcut yanıt üreticileri için dahili eski ayrıştırıcı/işleme yardımcısı olarak kalır.
Herkese açık üreticiye dönük API, interactive öğesini kullanımdan kaldırılmış olarak değerlendirir. Mevcut onay yardımcıları ve eski Plugin’ler çalışmaya devam ederken yeni kod presentation yayabilsin diye çalışma zamanı desteği korunur.
Teslim metadata’sı
Kullanıcı arayüzü olmayan gönderme davranışı için core’a ait birdelivery alanı ekleyin.
delivery.pin = true, başarıyla teslim edilen ilk mesajı sabitlemek anlamına gelir.notifyvarsayılan olarakfalseolur.requiredvarsayılan olarakfalseolur; desteklenmeyen kanallar veya başarısız sabitleme, teslimata devam ederek otomatik olarak daha düşük davranışa iner.- Manuel
pin,unpinvelist-pinsmesaj eylemleri mevcut mesajlar için kalır.
channelData.telegram.pin = true yerine delivery.pin = true öğesine taşınmalıdır.
Çalışma zamanı yetenek sözleşmesi
Sunum ve teslim işleme hook’larını kontrol düzlemi kanal Plugin’ine değil, çalışma zamanı giden adapter’ına ekleyin.- Hedef kanalı ve çalışma zamanı adapter’ını çöz.
- Sunum yeteneklerini iste.
- Desteklenmeyen blokları daha düşük temsile indir ve işleme öncesinde genel yetenek sınırlarını uygula.
renderPresentationçağır.- Oluşturucu yoksa sunumu metin fallback’ine dönüştür.
- Başarılı gönderimden sonra,
delivery.pinistendiğinde ve desteklendiğindepinDeliveredMessageçağır.
Kanal eşlemesi
Discord:presentationöğesini çalışma zamanına özel modüllerde components v2 ve Carbon kapsayıcılarına işle.- Vurgu rengi yardımcılarını hafif modüllerde tut.
- Kanal Plugin kontrol düzlemi kodundan
DiscordUiContaineriçe aktarmalarını kaldır.
presentationöğesini Block Kit’e işle.- Agent ve CLI
blocksgirdisini kaldır.
- Metin, bağlam ve ayırıcıları metin olarak işle.
- Eylemleri ve seçimi, hedef yüzey için yapılandırıldığında ve izin verildiğinde satır içi klavyeler olarak işle.
- Satır içi düğmeler devre dışıysa metin fallback’i kullan.
- ACP konu sabitlemesini
delivery.pinöğesine taşı.
- Eylemleri yapılandırıldığında etkileşimli düğmeler olarak işle.
- Diğer blokları metin fallback’i olarak işle.
presentationöğesini Adaptive Cards olarak işle.- Manuel pin/unpin/list-pins eylemlerini koru.
- Graph desteği hedef konuşma için güvenilirse isteğe bağlı olarak
pinDeliveredMessageuygula.
presentationöğesini etkileşimli kartlara işle.- Manuel pin/unpin/list-pins eylemlerini koru.
- API davranışı güvenilirse gönderilen mesaj sabitlemesi için isteğe bağlı olarak
pinDeliveredMessageuygula.
presentationöğesini mümkün olduğunda Flex veya şablon mesajlara işle.- Desteklenmeyen bloklar için metne geri dön.
- LINE kullanıcı arayüzü payload’larını
channelDataiçinden kaldır.
- Sunumu korumacı biçimlendirmeyle metne dönüştür.
Refactor adımları
ui-colors.tsöğesini Carbon destekli kullanıcı arayüzünden ayıran veextensions/discord/src/channel.tsiçindenDiscordUiContaineröğesini kaldıran Discord sürüm düzeltmesini yeniden uygula.ReplyPayload, giden payload normalleştirme, teslim özetleri ve hook payload’larınapresentationvedeliveryekle.- Dar bir SDK/çalışma zamanı alt yoluna
MessagePresentationşeması ve ayrıştırıcı yardımcıları ekle. - Mesaj yetenekleri
buttons,cards,componentsveblocksöğelerini semantik sunum yetenekleriyle değiştir. - Sunum işleme ve teslim sabitleme için çalışma zamanı giden adapter hook’ları ekle.
- Çapraz bağlam bileşen oluşturmayı
buildCrossContextPresentationile değiştir. src/infra/outbound/channel-adapters.tsöğesini sil ve kanal Plugin türlerindenbuildCrossContextComponentsöğesini kaldır.maybeApplyCrossContextMarkeröğesini yerel parametreler yerinepresentationekleyecek şekilde değiştir.- Plugin dispatch gönderme yollarını yalnızca semantik sunum ve teslim metadata’sı tüketecek şekilde güncelle.
- Agent ve CLI yerel payload parametrelerini kaldır:
components,blocks,buttonsvecard. - Yerel mesaj aracı şemaları oluşturan SDK yardımcılarını kaldırıp bunları sunum şeması yardımcılarıyla değiştir.
- Kullanıcı arayüzü/yerel zarfları
channelDataiçinden kaldır; kalan her alan incelenene kadar yalnızca taşıma metadata’sını tut. - Discord, Slack, Telegram, Mattermost, MS Teams, Feishu ve LINE oluşturucularını taşı.
- Mesaj CLI, kanal sayfaları, Plugin SDK ve yetenek cookbook’u için belgeleri güncelle.
- Discord ve etkilenen kanal giriş noktaları için içe aktarma fanout profillemesi çalıştır.
channelData taşıma zarfları için daha derin bir dahili temizlik geçişi olarak kalıyor. Adım 15, tür/test kapısının ötesinde nicel içe aktarma fanout sayıları istiyorsak takip doğrulaması olarak kalıyor.
Testler
Ekle veya güncelle:- Sunum normalleştirme testleri.
- Desteklenmeyen bloklar için sunumun otomatik daha düşük temsile inme testleri.
- Plugin dispatch ve core teslim yolları için çapraz bağlam işaretleyici testleri.
- Discord, Slack, Telegram, Mattermost, MS Teams, Feishu, LINE ve metin fallback’i için kanal oluşturma matris testleri.
- Yerel alanların kaldırıldığını kanıtlayan mesaj aracı şema testleri.
- Yerel bayrakların kaldırıldığını kanıtlayan CLI testleri.
- Carbon’u kapsayan Discord giriş noktası içe aktarma tembelliği regresyonu.
- Telegram ve genel fallback’i kapsayan teslim sabitleme testleri.
Açık sorular
delivery.pinilk geçişte Discord, Slack, MS Teams ve Feishu için uygulanmalı mı, yoksa önce yalnızca Telegram mı?deliverysonundareplyToId,replyToCurrent,silentveaudioAsVoicegibi mevcut alanları da kapsamalı mı, yoksa gönderim sonrası davranışlara odaklı mı kalmalı?- Sunum doğrudan görselleri veya dosya referanslarını desteklemeli mi, yoksa medya şimdilik kullanıcı arayüzü düzeninden ayrı mı kalmalı?