Stato
Implementato per le superfici dell’agente condiviso, della CLI, delle capacità dei Plugin e della consegna in uscita:ReplyPayload.presentationtrasporta l’interfaccia semantica dei messaggi.ReplyPayload.delivery.pintrasporta le richieste di fissare i messaggi inviati.- Le azioni di messaggio condivise espongono
presentation,deliveryepininvece dicomponents,blocks,buttonsocardnativi del provider. - Il core renderizza o degrada automaticamente la presentazione tramite le capacità in uscita dichiarate dai Plugin.
- I renderer di Discord, Slack, Telegram, Mattermost, MS Teams e Feishu consumano il contratto generico.
- Il codice del piano di controllo del canale Discord non importa più contenitori UI basati su Carbon.
Problema
L’interfaccia dei canali è attualmente divisa tra diverse superfici incompatibili:- Il core possiede un hook di rendering cross-context con forma Discord tramite
buildCrossContextComponents. channel.tsdi Discord può importare l’interfaccia Carbon nativa tramiteDiscordUiContainer, che porta dipendenze UI di runtime nel piano di controllo del Plugin del canale.- L’agente e la CLI espongono vie di fuga per payload nativi come
componentsdi Discord,blocksdi Slack,buttonsdi Telegram o Mattermost, ecarddi Teams o Feishu. ReplyPayload.channelDatatrasporta sia suggerimenti di trasporto sia envelope UI native.- Il modello generico
interactiveesiste, ma è più limitato 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 in base alle capacità dichiarate.
- Le estensioni dichiarano capacità e renderizzano la presentazione semantica in payload di trasporto nativi.
- La Web Control UI resta separata dall’interfaccia nativa della chat.
- I payload nativi dei canali non sono esposti tramite la superficie dei messaggi dell’agente condiviso o della CLI.
- Le funzionalità di presentazione non supportate degradano automaticamente alla migliore rappresentazione testuale.
- Il comportamento di consegna, come fissare un messaggio inviato, è metadato generico di consegna, non presentazione.
Non obiettivi
- Nessuno shim di retrocompatibilità per
buildCrossContextComponents. - Nessuna via di fuga nativa pubblica per
components,blocks,buttonsocard. - Nessuna importazione core di librerie UI native dei canali.
- Nessuna giuntura SDK specifica per provider per i canali inclusi.
Modello di destinazione
Aggiungere 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 di selezione
interactiveviene mappato apresentation.blocks[].type = "select".
presentation; interactive resta un helper interno legacy di parsing/rendering per i produttori di risposte esistenti.
L’API pubblica rivolta ai produttori tratta interactive come deprecato. Il supporto runtime
rimane affinché gli helper di approvazione esistenti e i Plugin più vecchi continuino a
funzionare mentre il nuovo codice emette presentation.
Metadati di consegna
Aggiungere un campodelivery posseduto dal core per il comportamento di invio che non riguarda la UI.
delivery.pin = truesignifica fissare il primo messaggio consegnato correttamente.notifyha valore predefinitofalse.requiredha valore predefinitofalse; canali non supportati o fissaggio non riuscito degradano automaticamente continuando la consegna.- Le azioni manuali di messaggio
pin,unpinelist-pinsrestano per i messaggi esistenti.
channelData.telegram.pin = true a delivery.pin = true.
Contratto delle capacità runtime
Aggiungere hook di rendering della presentazione e della consegna all’adapter runtime in uscita, non al Plugin del canale del piano di controllo.- Risolvere il canale di destinazione e l’adapter runtime.
- Richiedere le capacità di presentazione.
- Degradare i blocchi non supportati e applicare limiti generici delle capacità 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:- Renderizzare
presentationin componenti v2 e contenitori Carbon in moduli solo runtime. - Mantenere gli helper per i colori di accento in moduli leggeri.
- Rimuovere le importazioni di
DiscordUiContainerdal codice del piano di controllo del Plugin del canale.
- Renderizzare
presentationin Block Kit. - Rimuovere l’input
blocksda agente e CLI.
- Renderizzare testo, contesto e divisori come testo.
- Renderizzare azioni e selezione come tastiere inline quando configurato e consentito per la superficie di destinazione.
- Usare il fallback testuale quando i pulsanti inline sono disabilitati.
- Spostare il fissaggio degli argomenti ACP in
delivery.pin.
- Renderizzare le azioni come pulsanti interattivi quando configurato.
- Renderizzare gli altri blocchi come fallback testuale.
- Renderizzare
presentationin Adaptive Cards. - Mantenere le azioni manuali pin/unpin/list-pins.
- Implementare facoltativamente
pinDeliveredMessagese il supporto Graph è affidabile per la conversazione di destinazione.
- Renderizzare
presentationin schede interattive. - Mantenere le azioni manuali pin/unpin/list-pins.
- Implementare facoltativamente
pinDeliveredMessageper fissare i messaggi inviati se il comportamento dell’API è affidabile.
- Renderizzare
presentationin messaggi Flex o template dove possibile. - Ripiegare sul testo per i blocchi non supportati.
- Rimuovere i payload UI di LINE da
channelData.
- Convertire la presentazione in testo con formattazione conservativa.
Passaggi di refactor
- Riapplicare la correzione di rilascio di Discord che separa
ui-colors.tsdalla UI basata su Carbon e rimuoveDiscordUiContainerdaextensions/discord/src/channel.ts. - Aggiungere
presentationedeliveryaReplyPayload, alla normalizzazione dei payload in uscita, ai riepiloghi di consegna e ai payload degli hook. - Aggiungere lo schema
MessagePresentatione gli helper di parser in un sottopercorso SDK/runtime ristretto. - Sostituire le capacità dei messaggi
buttons,cards,componentseblockscon capacità di presentazione semantiche. - Aggiungere hook dell’adapter runtime in uscita per il rendering della presentazione e il fissaggio della consegna.
- Sostituire la costruzione dei componenti cross-context con
buildCrossContextPresentation. - Eliminare
src/infra/outbound/channel-adapters.tse rimuoverebuildCrossContextComponentsdai tipi del Plugin del canale. - Modificare
maybeApplyCrossContextMarkerper allegarepresentationinvece di parametri nativi. - Aggiornare i percorsi di invio di plugin-dispatch affinché consumino solo presentazione semantica e metadati di consegna.
- Rimuovere i parametri nativi dei payload di agente e CLI:
components,blocks,buttonsecard. - Rimuovere gli helper SDK che creano schemi di strumenti di messaggio nativi, sostituendoli con helper dello schema di presentazione.
- Rimuovere gli envelope UI/nativi da
channelData; mantenere solo metadati di trasporto finché ogni campo rimanente non viene revisionato. - Migrare i renderer di Discord, Slack, Telegram, Mattermost, MS Teams, Feishu e LINE.
- Aggiornare la documentazione per CLI dei messaggi, pagine dei canali, SDK dei Plugin e ricettario delle capacità.
- Eseguire il profiling del fanout delle importazioni per Discord e gli entrypoint dei canali interessati.
channelData privati dei provider. Il passaggio 15 resta una validazione di follow-up se vogliamo numeri quantificati sul fanout delle importazioni oltre al gate di tipi/test.
Test
Aggiungere o aggiornare:- Test di normalizzazione della presentazione.
- Test di degradazione automatica della presentazione per blocchi non supportati.
- Test dei marker cross-context per plugin dispatch e percorsi di consegna core.
- Test di matrice di rendering dei canali per Discord, Slack, Telegram, Mattermost, MS Teams, Feishu, LINE e fallback testuale.
- Test degli schemi degli strumenti di messaggio che dimostrino che i campi nativi sono stati rimossi.
- Test CLI che dimostrino che i flag nativi sono stati rimossi.
- Regressione della pigrizia delle importazioni dell’entrypoint Discord che copre Carbon.
- Test del fissaggio di consegna che coprano Telegram e fallback generico.
Domande aperte
delivery.pindovrebbe essere implementato per Discord, Slack, MS Teams e Feishu nel primo passaggio, oppure solo per Telegram inizialmente?deliverydovrebbe infine assorbire campi esistenti comereplyToId,replyToCurrent,silenteaudioAsVoice, oppure restare focalizzato sui comportamenti post-invio?- La presentazione dovrebbe supportare direttamente immagini o riferimenti a file, oppure i media dovrebbero restare separati dal layout UI per ora?