Durum
Paylaşılan ajan, CLI, Plugin yeteneği ve giden teslim yüzeyleri için uygulandı:ReplyPayload.presentation, anlamsal mesaj UI’sini taşır.ReplyPayload.delivery.pin, gönderilen mesajı sabitleme isteklerini taşır.- Paylaşılan mesaj eylemleri, sağlayıcıya özgü
components,blocks,buttonsveyacardyerinepresentation,deliveryvepinaçığa çıkarır. - Çekirdek, sunumu Plugin tarafından ilan edilen giden yetenekler üzerinden işler veya otomatik olarak yedek biçime düşürür.
- Discord, Slack, Telegram, Mattermost, Microsoft Teams ve Feishu oluşturucuları genel sözleşmeyi tüketir.
- Discord kanal denetim düzlemi kodu artık Carbon destekli UI container’larını içe aktarmıyor.
Sorun
Kanal UI şu anda birbiriyle uyumsuz birkaç yüzeye bölünmüş durumda:- Çekirdek,
buildCrossContextComponentsüzerinden Discord biçimli bağlamlar arası bir oluşturucu hook’una sahip. - Discord
channel.ts,DiscordUiContainerüzerinden yerel Carbon UI içe aktarabiliyor; bu da çalışma zamanı UI bağımlılıklarını kanal Plugin denetim düzlemine çekiyor. - Ajan ve CLI, Discord
components, Slackblocks, Telegram veya Mattermostbuttons, Teams veya Feishucardgibi yerel yük kaçış kapıları açığa çıkarıyor. ReplyPayload.channelData, hem taşıma ipuçlarını hem de yerel UI zarflarını taşıyor.- Genel
interactivemodeli mevcut, ancak Discord, Slack, Teams, Feishu, LINE, Telegram ve Mattermost’un zaten kullandığı daha zengin düzenlerden daha dar.
Hedefler
- Çekirdek, ilan edilmiş yeteneklerden bir mesaj için en iyi anlamsal sunuma karar verir.
- Extension’lar yetenekleri ilan eder ve anlamsal sunumu yerel taşıma yüklerine dönüştürür.
- Web Control UI, sohbetin yerel UI’sinden ayrı kalır.
- Yerel kanal yükleri, paylaşılan ajan veya CLI mesaj yüzeyi üzerinden açığa çıkarılmaz.
- Desteklenmeyen sunum özellikleri otomatik olarak en iyi metin gösterimine düşer.
- Gönderilmiş mesajı sabitleme gibi teslim davranışları, sunum değil genel teslim meta verisidir.
Hedef Dışı Olanlar
buildCrossContextComponentsiçin geriye dönük uyumluluk shim’i yok.components,blocks,buttonsveyacardiçin herkese açık yerel kaçış kapıları yok.- Çekirdekte kanala özgü yerel UI kütüphaneleri içe aktarımı yok.
- Paketlenmiş kanallar için sağlayıcıya özgü SDK sınırları yok.
Hedef Model
ReplyPayload içine çekirdeğe ait bir presentation alanı ekleyin.
interactive, presentation alt kümesi hâline gelir:
interactivetext bloğu,presentation.blocks[].type = "text"değerine eşlenir.interactivebuttons bloğu,presentation.blocks[].type = "buttons"değerine eşlenir.interactiveselect bloğu,presentation.blocks[].type = "select"değerine eşlenir.
presentation kullanır; interactive, mevcut yanıt üreticileri için iç eski ayrıştırma/oluşturma yardımcısı olarak kalır.
Teslim Meta Verisi
UI olmayan gönderim davranışı için çekirdeğe ait birdelivery alanı ekleyin.
delivery.pin = true, başarıyla teslim edilen ilk mesajı sabitle anlamına gelir.notifyvarsayılan olarakfalseolur.requiredvarsayılan olarakfalseolur; desteklenmeyen kanallar veya başarısız sabitleme durumunda teslimat sürdürülerek otomatik olarak geri düşülür.- Mevcut mesajlar için elle
pin,unpinvelist-pinsmesaj eylemleri korunur.
channelData.telegram.pin = true yerine delivery.pin = true konumuna taşınmalıdır.
Çalışma Zamanı Yetenek Sözleşmesi
Sunum ve teslim oluşturma hook’larını denetim düzlemi kanal Plugin’ine değil, çalışma zamanı giden bağdaştırıcısına ekleyin.- Hedef kanalı ve çalışma zamanı bağdaştırıcısını çözümle.
- Sunum yeteneklerini sor.
- Desteklenmeyen blokları oluşturmadan önce geri düşür.
renderPresentationçağır.- Oluşturucu yoksa sunumu metin yedeğine dönüştür.
- Başarılı gönderimden sonra,
delivery.pinistenmiş ve destekleniyorsapinDeliveredMessageçağır.
Kanal Eşleme
Discord:presentationdeğerini yalnızca çalışma zamanına ait modüllerde components v2 ve Carbon container’larına dönüştür.- Vurgu rengi yardımcılarını hafif modüllerde tut.
- Kanal Plugin denetim düzlemi kodundan
DiscordUiContaineriçe aktarımlarını kaldır.
presentationdeğerini Block Kit’e dönüştür.- Ajan ve CLI
blocksgirdisini kaldır.
- text, context ve divider bloklarını metin olarak dönüştür.
- Yapılandırılmışsa ve hedef yüzey için izinliyse actions ve select bloklarını satır içi klavyeler olarak dönüştür.
- Satır içi düğmeler devre dışıysa metin yedeği kullan.
- ACP konu sabitlemesini
delivery.piniçine taşı.
- actions bloklarını, yapılandırılmışsa etkileşimli düğmelere dönüştür.
- Diğer blokları metin yedeği olarak dönüştür.
presentationdeğerini Adaptive Cards’a dönüştür.- Elle pin/unpin/list-pins eylemlerini koru.
- Hedef konuşma için Graph desteği güvenilir ise isteğe bağlı olarak
pinDeliveredMessageuygula.
presentationdeğerini etkileşimli kartlara dönüştür.- Elle pin/unpin/list-pins eylemlerini koru.
- API davranışı güvenilirse gönderilen mesaj sabitleme için isteğe bağlı olarak
pinDeliveredMessageuygula.
presentationdeğerini mümkün olduğunda Flex veya şablon mesajlara dönüştür.- Desteklenmeyen bloklar için metne geri düş.
- LINE UI yüklerini
channelDataiçinden kaldır.
- Sunumu muhafazakâr biçimlendirme ile metne dönüştür.
Yeniden Düzenleme Adımları
ui-colors.tsdosyasını Carbon destekli UI’den ayıran veDiscordUiContaineriçe aktarımınıextensions/discord/src/channel.tsdosyasından kaldıran Discord sürüm düzeltmesini yeniden uygulayın.presentationvedeliveryalanlarınıReplyPayload, giden yük normalizasyonu, teslim özetleri ve hook yüklerine ekleyin.- Dar bir SDK/çalışma zamanı alt yolunda
MessagePresentationşeması ve ayrıştırıcı yardımcıları ekleyin. - Mesaj yetenekleri
buttons,cards,componentsveblocksyerine anlamsal sunum yeteneklerini kullanın. - Sunum oluşturma ve teslim sabitleme için çalışma zamanı giden bağdaştırıcı hook’ları ekleyin.
- Bağlamlar arası bileşen oluşturmayı
buildCrossContextPresentationile değiştirin. src/infra/outbound/channel-adapters.tsdosyasını silin vebuildCrossContextComponentsdeğerini kanal Plugin türlerinden kaldırın.maybeApplyCrossContextMarkerfonksiyonunu yerel parametreler yerinepresentationekleyecek şekilde değiştirin.- Plugin-dispatch gönderim yollarını yalnızca anlamsal sunum ve teslim meta verisini tüketecek şekilde güncelleyin.
- Ajan ve CLI yerel yük parametrelerini kaldırın:
components,blocks,buttonsvecard. - Yerel mesaj aracı şemaları oluşturan SDK yardımcılarını kaldırın ve bunları sunum şeması yardımcılarıyla değiştirin.
channelDataiçinden UI/yerel zarfları kaldırın; kalan her alan gözden geçirilene kadar yalnızca taşıma meta verisini koruyun.- Discord, Slack, Telegram, Mattermost, Microsoft Teams, Feishu ve LINE oluşturucularını taşıyın.
- Mesaj CLI, kanal sayfaları, Plugin SDK ve yetenek cookbook belgelerini güncelleyin.
- Discord ve etkilenen kanal giriş noktaları için içe aktarma fan-out profilini çalıştırın.
channelData taşıma zarfları için daha derin bir iç temizlik geçişi olarak kalmaktadır. 15. adım ise tür/test geçidi ötesinde nicel içe aktarma fan-out sayıları istiyorsak takip doğrulaması olarak kalmaktadır.
Testler
Şunları ekleyin veya güncelleyin:- Sunum normalizasyon testleri.
- Desteklenmeyen bloklar için sunum otomatik geri düşme testleri.
- Plugin dispatch ve çekirdek teslim yolları için bağlamlar arası işaretleyici testleri.
- Discord, Slack, Telegram, Mattermost, Microsoft Teams, Feishu, LINE ve metin yedeği için kanal oluşturma matris testleri.
- Yerel alanların kaldırıldığını kanıtlayan mesaj aracı şeması 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 geri düşmeyi kapsayan teslim sabitleme testleri.
Açık Sorular
delivery.pin, ilk aşamada Discord, Slack, Microsoft Teams ve Feishu için mi uygulanmalı, yoksa önce yalnızca Telegram mı?delivery, ileridereplyToId,replyToCurrent,silentveaudioAsVoicegibi mevcut alanları da içine almalı mı, yoksa gönderim sonrası davranışlara odaklı mı kalmalı?- Sunum, görselleri veya dosya başvurularını doğrudan desteklemeli mi, yoksa medya şimdilik UI düzeninden ayrı mı kalmalı?