Piano di refactoring della presentazione dei canali
Stato
Implementato per l’agente condiviso, la CLI, la funzionalità del Plugin e le superfici di consegna in uscita:ReplyPayload.presentationtrasporta la UI semantica del messaggio.ReplyPayload.delivery.pintrasporta le richieste di pin dei messaggi inviati.- Le azioni condivise dei messaggi espongono
presentation,deliveryepininvece dei campi nativi del providercomponents,blocks,buttonsocard. - Il core esegue il rendering o il degrado automatico della presentazione tramite le funzionalità in uscita dichiarate dal Plugin.
- I renderer di Discord, Slack, Telegram, Mattermost, Microsoft Teams e Feishu usano il contratto generico.
- Il codice del control plane del canale Discord non importa più contenitori UI supportati da Carbon.
Problema
La UI del canale è attualmente suddivisa in diverse superfici incompatibili:- Il core possiede un hook di renderer cross-context con forma Discord tramite
buildCrossContextComponents. channel.tsdi Discord può importare UI nativa Carbon tramiteDiscordUiContainer, che trascina dipendenze UI runtime nel control plane del Plugin di canale.- L’agente e la CLI espongono vie di fuga verso payload nativi come
componentsdi Discord,blocksdi Slack,buttonsdi Telegram o Mattermost ecarddi Teams o Feishu. ReplyPayload.channelDatatrasporta sia suggerimenti di trasporto sia buste UI native.- Il modello generico
interactiveesiste, ma è più ristretto dei layout più ricchi già usati da Discord, Slack, Teams, Feishu, LINE, Telegram e Mattermost.
Obiettivi
- Il core decide la migliore presentazione semantica per un messaggio a partire dalle funzionalità dichiarate.
- Le estensioni dichiarano le funzionalità e convertono la presentazione semantica in payload di trasporto nativi.
- La Control UI web rimane separata dalla UI nativa della chat.
- I payload nativi dei canali non vengono esposti attraverso la superficie condivisa dei messaggi dell’agente o della CLI.
- Le funzionalità di presentazione non supportate degradano automaticamente nella migliore rappresentazione testuale.
- Il comportamento di consegna, come il pin di un messaggio inviato, è metadato di consegna generico, non presentazione.
Non obiettivi
- Nessun shim di retrocompatibilità per
buildCrossContextComponents. - Nessuna via di fuga pubblica nativa per
components,blocks,buttonsocard. - Nessun import nel core di librerie UI native del canale.
- Nessuna seam SDK specifica del provider per i canali inclusi.
Modello di destinazione
Aggiungi un campopresentation posseduto dal core a ReplyPayload.
interactive diventa un sottoinsieme di presentation durante la migrazione:
- Il blocco di testo
interactiveviene mappato apresentation.blocks[].type = "text". - Il blocco di pulsanti
interactiveviene mappato apresentation.blocks[].type = "buttons". - Il blocco select
interactiveviene mappato apresentation.blocks[].type = "select".
presentation; interactive rimane un helper legacy interno di parser/rendering per i producer di risposte esistenti.
Metadati di consegna
Aggiungi un campodelivery posseduto dal core per il comportamento di invio che non è UI.
delivery.pin = truesignifica fare il pin del primo messaggio consegnato con successo.notifyèfalseper impostazione predefinita.requiredèfalseper impostazione predefinita; i canali non supportati o gli errori di pin degradano automaticamente continuando la consegna.- Le azioni manuali dei messaggi
pin,unpinelist-pinsrestano per i messaggi esistenti.
channelData.telegram.pin = true a delivery.pin = true.
Contratto di funzionalità runtime
Aggiungi hook di rendering della presentazione e di consegna al runtime outbound adapter, non al Plugin di canale del control plane.- Risolvere il canale di destinazione e il runtime adapter.
- Richiedere le funzionalità di presentazione.
- Degradare i blocchi non supportati prima del rendering.
- Chiamare
renderPresentation. - Se non esiste alcun renderer, convertire la presentazione in fallback testuale.
- Dopo un invio riuscito, chiamare
pinDeliveredMessagequandodelivery.pinè richiesto e supportato.
Mappatura dei canali
Discord:- Eseguire il rendering di
presentationin components v2 e contenitori Carbon in moduli solo runtime. - Mantenere gli helper dei colori accent in moduli leggeri.
- Rimuovere gli import di
DiscordUiContainerdal codice del control plane del Plugin di canale.
- Eseguire il rendering di
presentationin Block Kit. - Rimuovere l’input
blocksda agente e CLI.
- Eseguire il rendering di testo, context e divider come testo.
- Eseguire il rendering di azioni e select come tastiere inline quando configurate e consentite per la superficie di destinazione.
- Usare il fallback testuale quando i pulsanti inline sono disabilitati.
- Spostare il pin del topic ACP in
delivery.pin.
- Eseguire il rendering delle azioni come pulsanti interattivi quando configurato.
- Eseguire il rendering degli altri blocchi come fallback testuale.
- Eseguire il rendering di
presentationin Adaptive Cards. - Mantenere le azioni manuali
pin/unpin/list-pins. - Implementare facoltativamente
pinDeliveredMessagese il supporto Graph è affidabile per la conversazione di destinazione.
- Eseguire il rendering di
presentationin schede interattive. - Mantenere le azioni manuali
pin/unpin/list-pins. - Implementare facoltativamente
pinDeliveredMessageper il pin dei messaggi inviati se il comportamento API è affidabile.
- Eseguire il rendering di
presentationin messaggi Flex o template dove possibile. - Tornare al testo per i blocchi non supportati.
- Rimuovere i payload UI di LINE da
channelData.
- Convertire la presentazione in testo con formattazione conservativa.
Passi del refactoring
- Riapplicare la correzione della release Discord che separa
ui-colors.tsdalla UI supportata da Carbon e rimuoveDiscordUiContainerdaextensions/discord/src/channel.ts. - Aggiungere
presentationedeliveryaReplyPayload, alla normalizzazione del payload in uscita, ai riepiloghi di consegna e ai payload degli hook. - Aggiungere schema
MessagePresentatione helper parser in un sottopercorso SDK/runtime ristretto. - Sostituire le funzionalità del messaggio
buttons,cards,componentseblockscon funzionalità di presentazione semantica. - Aggiungere hook del runtime outbound adapter per il rendering della presentazione e il pin di consegna.
- Sostituire la costruzione di componenti cross-context con
buildCrossContextPresentation. - Eliminare
src/infra/outbound/channel-adapters.tse rimuoverebuildCrossContextComponentsdai tipi del Plugin di canale. - Cambiare
maybeApplyCrossContextMarkerin modo che alleghipresentationinvece di parametri nativi. - Aggiornare i percorsi di invio plugin-dispatch in modo che consumino solo presentazione semantica e metadati di consegna.
- Rimuovere i parametri di payload nativi da agente e CLI:
components,blocks,buttonsecard. - Rimuovere gli helper SDK che creano schemi nativi dello strumento messaggio, sostituendoli con helper di schema della presentazione.
- Rimuovere le buste UI/native da
channelData; mantenere solo i metadati di trasporto finché ogni campo rimanente non viene riesaminato. - Migrare i renderer di Discord, Slack, Telegram, Mattermost, Microsoft Teams, Feishu e LINE.
- Aggiornare la documentazione per la CLI dei messaggi, le pagine dei canali, il Plugin SDK e il cookbook delle funzionalità.
- Eseguire la profilazione del fanout degli import per Discord e gli entrypoint dei canali interessati.
channelData private del provider. Il passo 15 resta una validazione successiva se vogliamo numeri quantificati del fanout degli import oltre al gate di tipi/test.
Test
Aggiungere o aggiornare:- Test di normalizzazione della presentazione.
- Test di degrado automatico della presentazione per blocchi non supportati.
- Test dei marker cross-context per i percorsi plugin-dispatch e core delivery.
- Test della matrice di rendering dei canali per Discord, Slack, Telegram, Mattermost, Microsoft Teams, Feishu, LINE e fallback testuale.
- Test dello schema dello strumento messaggio che dimostrano che i campi nativi sono stati rimossi.
- Test CLI che dimostrano che i flag nativi sono stati rimossi.
- Regressione della lazy initialization degli import dell’entrypoint Discord che copre Carbon.
- Test di pin della consegna per Telegram e fallback generico.
Questioni aperte
delivery.pindovrebbe essere implementato per Discord, Slack, Microsoft Teams e Feishu al primo passaggio, oppure prima solo per Telegram?deliverydovrebbe in futuro assorbire campi esistenti comereplyToId,replyToCurrent,silenteaudioAsVoice, oppure restare focalizzato sui comportamenti post-invio?- Il supporto della presentazione dovrebbe includere direttamente immagini o riferimenti a file, oppure per ora i contenuti multimediali dovrebbero restare separati dal layout UI?