Status
Diimplementasikan untuk permukaan agen bersama, CLI, kemampuan Plugin, dan pengiriman keluar:ReplyPayload.presentationmembawa UI pesan semantik.ReplyPayload.delivery.pinmembawa permintaan pin pesan terkirim.- Tindakan pesan bersama mengekspos
presentation,delivery, danpinalih-alihcomponents,blocks,buttons, ataucardyang native penyedia. - Core merender atau menurunkan presentasi secara otomatis melalui kemampuan keluar yang dideklarasikan Plugin.
- Renderer Discord, Slack, Telegram, Mattermost, MS Teams, dan Feishu mengonsumsi kontrak generik.
- Kode control-plane channel Discord tidak lagi mengimpor container UI berbasis Carbon.
Masalah
UI channel saat ini terpecah di beberapa permukaan yang tidak kompatibel:- Core memiliki hook renderer lintas konteks berbentuk Discord melalui
buildCrossContextComponents. - Discord
channel.tsdapat mengimpor UI Carbon native melaluiDiscordUiContainer, yang menarik dependensi UI runtime ke control plane Plugin channel. - Agen dan CLI mengekspos escape hatch payload native seperti Discord
components, Slackblocks, Telegram atau Mattermostbuttons, dan Teams atau Feishucard. ReplyPayload.channelDatamembawa petunjuk transport sekaligus envelope UI native.- Model
interactivegenerik ada, tetapi lebih sempit daripada tata letak yang lebih kaya yang sudah digunakan oleh Discord, Slack, Teams, Feishu, LINE, Telegram, dan Mattermost.
Tujuan
- Core memutuskan presentasi semantik terbaik untuk sebuah pesan dari kemampuan yang dideklarasikan.
- Extension mendeklarasikan kemampuan dan merender presentasi semantik ke payload transport native.
- UI Web Control tetap terpisah dari UI native chat.
- Payload channel native tidak diekspos melalui permukaan pesan agen atau CLI bersama.
- Fitur presentasi yang tidak didukung otomatis diturunkan ke representasi teks terbaik.
- Perilaku pengiriman seperti mem-pin pesan terkirim adalah metadata pengiriman generik, bukan presentasi.
Bukan Tujuan
- Tidak ada shim kompatibilitas mundur untuk
buildCrossContextComponents. - Tidak ada escape hatch native publik untuk
components,blocks,buttons, ataucard. - Tidak ada impor core terhadap library UI native channel.
- Tidak ada seam SDK khusus penyedia untuk channel bawaan.
Model Target
Tambahkan fieldpresentation milik core ke ReplyPayload.
interactive menjadi subset dari presentation selama migrasi:
- Blok teks
interactivedipetakan kepresentation.blocks[].type = "text". - Blok tombol
interactivedipetakan kepresentation.blocks[].type = "buttons". - Blok select
interactivedipetakan kepresentation.blocks[].type = "select".
presentation; interactive tetap menjadi helper parser/rendering internal legacy untuk producer balasan yang sudah ada.
Metadata Pengiriman
Tambahkan fielddelivery milik core untuk perilaku pengiriman yang bukan UI.
delivery.pin = trueberarti mem-pin pesan pertama yang berhasil dikirim.notifydefault kefalse.requireddefault kefalse; channel yang tidak didukung atau kegagalan pin otomatis diturunkan dengan tetap melanjutkan pengiriman.- Tindakan pesan manual
pin,unpin, danlist-pinstetap ada untuk pesan yang sudah ada.
channelData.telegram.pin = true ke delivery.pin = true.
Kontrak Kemampuan Runtime
Tambahkan hook render presentasi dan pengiriman ke adapter keluar runtime, bukan Plugin channel control-plane.- Resolusikan channel target dan adapter runtime.
- Tanyakan kemampuan presentasi.
- Turunkan blok yang tidak didukung sebelum rendering.
- Panggil
renderPresentation. - Jika tidak ada renderer, ubah presentasi menjadi fallback teks.
- Setelah pengiriman berhasil, panggil
pinDeliveredMessagesaatdelivery.pindiminta dan didukung.
Pemetaan Channel
Discord:- Render
presentationke komponen v2 dan container Carbon di modul khusus runtime. - Pertahankan helper warna aksen di modul ringan.
- Hapus impor
DiscordUiContainerdari kode control-plane Plugin channel.
- Render
presentationke Block Kit. - Hapus input
blocksdari agen dan CLI.
- Render teks, konteks, dan divider sebagai teks.
- Render actions dan select sebagai keyboard inline saat dikonfigurasi dan diizinkan untuk permukaan target.
- Gunakan fallback teks saat tombol inline dinonaktifkan.
- Pindahkan pinning topik ACP ke
delivery.pin.
- Render actions sebagai tombol interaktif saat dikonfigurasi.
- Render blok lain sebagai fallback teks.
- Render
presentationke Adaptive Cards. - Pertahankan tindakan manual pin/unpin/list-pins.
- Secara opsional implementasikan
pinDeliveredMessagejika dukungan Graph andal untuk percakapan target.
- Render
presentationke kartu interaktif. - Pertahankan tindakan manual pin/unpin/list-pins.
- Secara opsional implementasikan
pinDeliveredMessageuntuk pinning pesan terkirim jika perilaku API andal.
- Render
presentationke pesan Flex atau template jika memungkinkan. - Fallback ke teks untuk blok yang tidak didukung.
- Hapus payload UI LINE dari
channelData.
- Ubah presentasi menjadi teks dengan format konservatif.
Langkah Refaktor
- Terapkan kembali perbaikan rilis Discord yang memisahkan
ui-colors.tsdari UI berbasis Carbon dan menghapusDiscordUiContainerdariextensions/discord/src/channel.ts. - Tambahkan
presentationdandeliverykeReplyPayload, normalisasi payload keluar, ringkasan pengiriman, dan payload hook. - Tambahkan skema dan helper parser
MessagePresentationdi subpath SDK/runtime yang sempit. - Ganti kemampuan pesan
buttons,cards,components, danblocksdengan kemampuan presentasi semantik. - Tambahkan hook adapter keluar runtime untuk render presentasi dan pinning pengiriman.
- Ganti konstruksi komponen lintas konteks dengan
buildCrossContextPresentation. - Hapus
src/infra/outbound/channel-adapters.tsdan hapusbuildCrossContextComponentsdari tipe Plugin channel. - Ubah
maybeApplyCrossContextMarkeragar melampirkanpresentationalih-alih parameter native. - Perbarui jalur kirim plugin-dispatch agar hanya mengonsumsi presentasi semantik dan metadata pengiriman.
- Hapus parameter payload native agen dan CLI:
components,blocks,buttons, dancard. - Hapus helper SDK yang membuat skema message-tool native, menggantinya dengan helper skema presentasi.
- Hapus envelope UI/native dari
channelData; pertahankan hanya metadata transport sampai setiap field yang tersisa ditinjau. - Migrasikan renderer Discord, Slack, Telegram, Mattermost, MS Teams, Feishu, dan LINE.
- Perbarui dokumentasi untuk CLI pesan, halaman channel, SDK Plugin, dan capability cookbook.
- Jalankan profiling fanout impor untuk Discord dan entrypoint channel yang terdampak.
channelData yang privat bagi penyedia. Langkah 15 tetap menjadi validasi lanjutan jika kita menginginkan angka fanout impor yang terukur di luar gerbang type/test.
Pengujian
Tambahkan atau perbarui:- Pengujian normalisasi presentasi.
- Pengujian auto-degrade presentasi untuk blok yang tidak didukung.
- Pengujian penanda lintas konteks untuk jalur pengiriman plugin dispatch dan core.
- Pengujian matriks render channel untuk Discord, Slack, Telegram, Mattermost, MS Teams, Feishu, LINE, dan fallback teks.
- Pengujian skema message tool yang membuktikan field native sudah hilang.
- Pengujian CLI yang membuktikan flag native sudah hilang.
- Regresi kelazy-an impor entrypoint Discord yang mencakup Carbon.
- Pengujian pin pengiriman yang mencakup Telegram dan fallback generik.
Pertanyaan Terbuka
- Haruskah
delivery.pindiimplementasikan untuk Discord, Slack, MS Teams, dan Feishu pada tahap pertama, atau hanya Telegram terlebih dahulu? - Haruskah
deliverypada akhirnya menyerap field yang sudah ada sepertireplyToId,replyToCurrent,silent, danaudioAsVoice, atau tetap fokus pada perilaku pasca-pengiriman? - Haruskah presentasi mendukung gambar atau referensi file secara langsung, atau media sebaiknya tetap dipisahkan dari tata letak UI untuk saat ini?