Get started
Kanal sunumu yeniden düzenleme planı
Durum
Paylaşılan ajan, CLI, Plugin yeteneği ve giden teslim yüzeyleri için uygulandı:
ReplyPayload.presentationanlamsal ileti kullanıcı arayüzünü taşır.ReplyPayload.delivery.pingönderilen ileti sabitleme isteklerini taşır.- Paylaşılan ileti eylemleri, sağlayıcıya özgü
components,blocks,buttonsveyacardyerinepresentation,deliveryvepinalanlarını sunar. - Core, Plugin tarafından bildirilen giden yetenekler üzerinden sunumu işler veya otomatik olarak daha basit bir biçime düşürür.
- Discord, Slack, Telegram, Mattermost, MS Teams ve Feishu işleyicileri genel sözleşmeyi kullanır.
- Discord kanal denetim düzlemi kodu artık Carbon destekli kullanıcı arayüzü kapsayıcılarını içe aktarmaz.
Kanonik belgeler artık İleti Sunumu içinde yer alır. Bu planı tarihsel uygulama bağlamı olarak saklayın; sözleşme, işleyici veya yedek davranış değişiklikleri için kanonik kılavuzu güncelleyin.
Sorun
Kanal kullanıcı arayüzü şu anda birbiriyle uyumsuz birkaç yüzeye bölünmüş durumda:
- Core,
buildCrossContextComponentsüzerinden Discord biçimli bir bağlamlar arası işleyici kancasına 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 denetim düzlemine çeker. - Ajan ve CLI, Discord
components, Slackblocks, Telegram veya Mattermostbuttonsve Teams veya Feishucardgibi yerel yük kaçış yolları sunar. ReplyPayload.channelDatahem aktarım 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.
Bu durum Core'un yerel kullanıcı arayüzü biçimlerinden haberdar olmasına neden olur, Plugin çalışma zamanı tembelliğini zayıflatır ve ajanlara aynı ileti amacını ifade etmek için gereğinden fazla sağlayıcıya özgü yol verir.
Hedefler
- Core, bildirilen yeteneklere göre bir ileti için en iyi anlamsal sunuma karar verir.
- Eklentiler yetenekleri bildirir ve anlamsal sunumu yerel aktarım yüklerine işler.
- Web Denetim Kullanıcı Arayüzü, sohbetin yerel kullanıcı arayüzünden ayrı kalır.
- Yerel kanal yükleri, paylaşılan ajan veya CLI ileti yüzeyi üzerinden sunulmaz.
- Desteklenmeyen sunum özellikleri otomatik olarak en iyi metin gösterimine düşürülür.
- Gönderilen bir iletiyi sabitleme gibi teslim davranışları sunum değil, genel teslim meta verisidir.
Hedef olmayanlar
buildCrossContextComponentsiçin geriye dönük uyumluluk uyarlama katmanı yoktur.components,blocks,buttonsveyacardiçin herkese açık yerel kaçış yolları yoktur.- Core içinde kanala özgü yerel kullanıcı arayüzü kitaplıkları içe aktarılmaz.
- Paketlenmiş kanallar için sağlayıcıya özgü SDK aralıkları yoktur.
Hedef model
ReplyPayload alanına Core tarafından sahip olunan bir presentation alanı ekleyin.
type MessagePresentationTone = "neutral" | "info" | "success" | "warning" | "danger";
type MessagePresentation = {
tone?: MessagePresentationTone;
title?: string;
blocks: MessagePresentationBlock[];
};
type MessagePresentationBlock =
| { type: "text"; text: string }
| { type: "context"; text: string }
| { type: "divider" }
| { type: "buttons"; buttons: MessagePresentationButton[] }
| { type: "select"; placeholder?: string; options: MessagePresentationOption[] };
type MessagePresentationButton = {
label: string;
value?: string;
url?: string;
style?: "primary" | "secondary" | "success" | "danger";
};
type MessagePresentationOption = {
label: string;
value: string;
};
interactive, geçiş sırasında presentation alanının bir alt kümesi haline gelir:
interactivemetin bloğupresentation.blocks[].type = "text"değerine eşlenir.interactivedüğmeler bloğupresentation.blocks[].type = "buttons"değerine eşlenir.interactiveseçim bloğupresentation.blocks[].type = "select"değerine eşlenir.
Dış ajan ve CLI şemaları artık presentation kullanır; interactive, mevcut yanıt üreticileri için dahili bir eski ayrıştırıcı/işleme yardımcısı olarak kalır.
Teslim meta verileri
Kullanıcı arayüzü olmayan gönderim davranışı için Core tarafından sahip olunan bir delivery alanı ekleyin.
type ReplyPayloadDelivery = {
pin?:
| boolean
| {
enabled: boolean;
notify?: boolean;
required?: boolean;
};
};
Anlamlar:
delivery.pin = true, başarıyla teslim edilen ilk iletiyi sabitle anlamına gelir.notifyvarsayılan olarakfalsedeğerindedir.requiredvarsayılan olarakfalsedeğerindedir; desteklenmeyen kanallar veya başarısız sabitleme, teslimi sürdürerek otomatik olarak daha basit bir davranışa düşer.- El ile yapılan
pin,unpinvelist-pinsileti eylemleri mevcut iletiler için kalır.
Mevcut Telegram ACP konu bağlaması channelData.telegram.pin = true değerinden delivery.pin = true değerine taşınmalıdır.
Çalışma zamanı yetenek sözleşmesi
Sunum ve teslim işleme kancalarını denetim düzlemi kanal Plugin'ine değil, çalışma zamanı giden bağdaştırıcısına ekleyin.
type ChannelPresentationCapabilities = {
supported: boolean;
buttons?: boolean;
selects?: boolean;
context?: boolean;
divider?: boolean;
tones?: MessagePresentationTone[];
};
type ChannelDeliveryCapabilities = {
pinSentMessage?: boolean;
};
type ChannelOutboundAdapter = {
presentationCapabilities?: ChannelPresentationCapabilities;
renderPresentation?: (params: {
payload: ReplyPayload;
presentation: MessagePresentation;
ctx: ChannelOutboundSendContext;
}) => ReplyPayload | null;
deliveryCapabilities?: ChannelDeliveryCapabilities;
pinDeliveredMessage?: (params: {
cfg: OpenClawConfig;
accountId?: string | null;
to: string;
threadId?: string | number | null;
messageId: string;
notify: boolean;
}) => Promise<void>;
};
Core davranışı:
- Hedef kanalı ve çalışma zamanı bağdaştırıcısını çözümle.
- Sunum yeteneklerini iste.
- Desteklenmeyen blokları işlemeden önce daha basit biçime düşür.
renderPresentationçağır.- İşleyici yoksa sunumu metin yedeğine dönüştür.
- Başarılı gönderimden sonra,
delivery.pinistenmiş ve destekleniyorsapinDeliveredMessageçağır.
Kanal eşlemesi
Discord:
presentationalanını ç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 denetim düzlemi kodundan
DiscordUiContaineriçe aktarımlarını kaldır.
Slack:
presentationalanını Block Kit'e işle.- Ajan ve CLI
blocksgirdisini kaldır.
Telegram:
- Metin, bağlam ve ayırıcıları metin olarak işle.
- Hedef yüzey için yapılandırıldığında ve izin verildiğinde eylemleri ve seçimi satır içi klavyeler olarak işle.
- Satır içi düğmeler devre dışı olduğunda metin yedeğini kullan.
- ACP konu sabitlemesini
delivery.pinalanına taşı.
Mattermost:
- Yapılandırıldığında eylemleri etkileşimli düğmeler olarak işle.
- Diğer blokları metin yedeği olarak işle.
MS Teams:
presentationalanını Adaptive Cards olarak işle.- El ile
pin/unpin/list-pinseylemlerini koru. - Graph desteği hedef konuşma için güvenilirse isteğe bağlı olarak
pinDeliveredMessageuygula.
Feishu:
presentationalanını etkileşimli kartlara işle.- El ile
pin/unpin/list-pinseylemlerini koru. - API davranışı güvenilirse gönderilen ileti sabitleme için isteğe bağlı olarak
pinDeliveredMessageuygula.
LINE:
presentationalanını mümkün olduğunda Flex veya şablon iletilerine işle.- Desteklenmeyen bloklar için metne geri dön.
- LINE kullanıcı arayüzü yüklerini
channelDataalanından kaldır.
Düz veya sınırlı kanallar:
- Sunumu ölçülü biçimlendirmeyle metne dönüştür.
Yeniden düzenleme adımları
ui-colors.tsdosyasını Carbon destekli kullanıcı arayüzünden ayıran veextensions/discord/src/channel.tsiçindenDiscordUiContainerkaldıran Discord sürüm düzeltmesini yeniden uygula.ReplyPayload, giden yük normalleştirme, teslim özetleri ve kanca yüklerinepresentationvedeliveryekle.- Dar bir SDK/çalışma zamanı alt yolunda
MessagePresentationşeması ve ayrıştırıcı yardımcıları ekle. - İleti yetenekleri olan
buttons,cards,componentsveblocksyerine anlamsal sunum yeteneklerini koy. - Sunum işleme ve teslim sabitleme için çalışma zamanı giden bağdaştırıcı kancaları ekle.
- Bağlamlar arası bileşen oluşturmayı
buildCrossContextPresentationile değiştir. src/infra/outbound/channel-adapters.tsdosyasını sil ve kanal Plugin türlerindenbuildCrossContextComponentskaldır.maybeApplyCrossContextMarkerişlevini yerel parametreler yerinepresentationekleyecek şekilde değiştir.- Plugin-dispatch gönderim yollarını yalnızca anlamsal sunum ve teslim meta verilerini kullanacak şekilde güncelle.
- Ajan ve CLI yerel yük parametrelerini kaldır:
components,blocks,buttonsvecard. - Yerel ileti aracı şemaları oluşturan SDK yardımcılarını kaldır ve yerine sunum şeması yardımcılarını koy.
- Kullanıcı arayüzü/yerel zarfları
channelDataalanından kaldır; kalan her alan gözden geçirilene kadar yalnızca aktarım meta verilerini tut. - Discord, Slack, Telegram, Mattermost, MS Teams, Feishu ve LINE işleyicilerini taşı.
- İleti CLI, kanal sayfaları, Plugin SDK ve yetenek yemek kitabı belgelerini güncelle.
- Discord ve etkilenen kanal giriş noktaları için içe aktarım yayılım profillemesi çalıştır.
1-11 ve 13-14. adımlar, paylaşılan ajan, CLI, Plugin yeteneği ve giden bağdaştırıcı sözleşmeleri için bu yeniden düzenlemede uygulandı. 12. adım, sağlayıcıya özel channelData aktarım zarfları için daha derin bir dahili temizlik geçişi olarak kalıyor. 15. adım, tür/test kapısının ötesinde nicel içe aktarım yayılım sayıları istiyorsak takip doğrulaması olarak kalıyor.
Testler
Ekle veya güncelle:
- Sunum normalleştirme testleri.
- Desteklenmeyen bloklar için sunum otomatik düşürme testleri.
- Plugin dispatch ve Core teslim yolları için bağlamlar arası işaretleyici testleri.
- Discord, Slack, Telegram, Mattermost, MS Teams, Feishu, LINE ve metin yedeği için kanal işleme matrisi testleri.
- Yerel alanların kaldırıldığını kanıtlayan ileti aracı şema testleri.
- Yerel bayrakların kaldırıldığını kanıtlayan CLI testleri.
- Carbon'u kapsayan Discord giriş noktası içe aktarım tembelliği regresyonu.
- Telegram ve genel yedeği kapsayan teslim sabitleme testleri.
Açık sorular
delivery.pinilk geçişte Discord, Slack, MS Teams ve Feishu için de mi uygulanmalı, yoksa önce yalnızca Telegram mı?deliverysonundareplyToId,replyToCurrent,silentveaudioAsVoicegibi mevcut alanları da içine almalı 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ı?