État
Implémenté pour l’agent partagé, la CLI, la capacité de Plugin et les surfaces de livraison sortante:ReplyPayload.presentationtransporte l’interface de message sémantique.ReplyPayload.delivery.pintransporte les demandes d’épinglage des messages envoyés.- Les actions de message partagées exposent
presentation,deliveryetpinau lieu decomponents,blocks,buttonsoucardnatifs du fournisseur. - Le noyau affiche ou dégrade automatiquement la présentation via les capacités sortantes déclarées par les plugins.
- Les moteurs de rendu Discord, Slack, Telegram, Mattermost, MS Teams et Feishu consomment le contrat générique.
- Le code de plan de contrôle du canal Discord n’importe plus les conteneurs d’interface basés sur Carbon.
Problème
L’interface des canaux est actuellement répartie sur plusieurs surfaces incompatibles:- Le noyau possède un hook de moteur de rendu intercontextuel de forme Discord via
buildCrossContextComponents. - Le fichier Discord
channel.tspeut importer l’interface Carbon native viaDiscordUiContainer, ce qui attire les dépendances d’interface d’exécution dans le plan de contrôle du Plugin de canal. - L’agent et la CLI exposent des échappatoires de charge utile natives telles que Discord
components, Slackblocks, Telegram ou Mattermostbuttons, et Teams ou Feishucard. ReplyPayload.channelDatatransporte à la fois des indications de transport et des enveloppes d’interface natives.- Le modèle générique
interactiveexiste, mais il est plus restreint que les mises en page plus riches déjà utilisées par Discord, Slack, Teams, Feishu, LINE, Telegram et Mattermost.
Objectifs
- Le noyau choisit la meilleure présentation sémantique pour un message à partir des capacités déclarées.
- Les extensions déclarent des capacités et rendent la présentation sémantique en charges utiles de transport natives.
- L’interface Web Control reste séparée de l’interface native de chat.
- Les charges utiles de canal natives ne sont pas exposées via la surface de message partagée de l’agent ou de la CLI.
- Les fonctionnalités de présentation non prises en charge se dégradent automatiquement vers la meilleure représentation textuelle.
- Le comportement de livraison, comme l’épinglage d’un message envoyé, est une métadonnée de livraison générique, pas une présentation.
Non-objectifs
- Aucun shim de rétrocompatibilité pour
buildCrossContextComponents. - Aucune échappatoire native publique pour
components,blocks,buttonsoucard. - Aucun import par le noyau de bibliothèques d’interface natives de canal.
- Aucun point d’intégration SDK spécifique au fournisseur pour les canaux groupés.
Modèle cible
Ajouter un champpresentation possédé par le noyau à ReplyPayload.
interactive devient un sous-ensemble de presentation pendant la migration:
- Le bloc de texte
interactivecorrespond àpresentation.blocks[].type = "text". - Le bloc de boutons
interactivecorrespond àpresentation.blocks[].type = "buttons". - Le bloc de sélection
interactivecorrespond àpresentation.blocks[].type = "select".
presentation; interactive reste un ancien assistant interne d’analyse et de rendu pour les producteurs de réponses existants.
L’API publique destinée aux producteurs traite interactive comme obsolète. La prise en charge à l’exécution reste en place afin que les assistants d’approbation existants et les anciens plugins continuent de fonctionner pendant que le nouveau code émet presentation.
Métadonnées de livraison
Ajouter un champdelivery possédé par le noyau pour le comportement d’envoi qui n’est pas de l’interface.
delivery.pin = truesignifie épingler le premier message livré avec succès.notifyvautfalsepar défaut.requiredvautfalsepar défaut; les canaux non pris en charge ou les échecs d’épinglage se dégradent automatiquement en poursuivant la livraison.- Les actions de message manuelles
pin,unpinetlist-pinsrestent disponibles pour les messages existants.
channelData.telegram.pin = true à delivery.pin = true.
Contrat de capacité d’exécution
Ajouter des hooks de rendu de présentation et de livraison à l’adaptateur sortant d’exécution, pas au Plugin de canal du plan de contrôle.- Résoudre le canal cible et l’adaptateur d’exécution.
- Demander les capacités de présentation.
- Dégrader les blocs non pris en charge et appliquer les limites de capacité génériques avant le rendu.
- Appeler
renderPresentation. - Si aucun moteur de rendu n’existe, convertir la présentation en repli textuel.
- Après un envoi réussi, appeler
pinDeliveredMessagequanddelivery.pinest demandé et pris en charge.
Correspondance des canaux
Discord:- Rendre
presentationen composants v2 et conteneurs Carbon dans des modules réservés à l’exécution. - Conserver les assistants de couleur d’accent dans des modules légers.
- Supprimer les imports
DiscordUiContainerdu code de plan de contrôle du Plugin de canal.
- Rendre
presentationen Block Kit. - Supprimer l’entrée
blocksde l’agent et de la CLI.
- Rendre le texte, le contexte et les séparateurs sous forme de texte.
- Rendre les actions et la sélection sous forme de claviers intégrés quand cela est configuré et autorisé pour la surface cible.
- Utiliser le repli textuel lorsque les boutons intégrés sont désactivés.
- Déplacer l’épinglage de sujet ACP vers
delivery.pin.
- Rendre les actions sous forme de boutons interactifs lorsque cela est configuré.
- Rendre les autres blocs sous forme de repli textuel.
- Rendre
presentationen Adaptive Cards. - Conserver les actions manuelles pin/unpin/list-pins.
- Implémenter éventuellement
pinDeliveredMessagesi la prise en charge Graph est fiable pour la conversation cible.
- Rendre
presentationen cartes interactives. - Conserver les actions manuelles pin/unpin/list-pins.
- Implémenter éventuellement
pinDeliveredMessagepour l’épinglage de messages envoyés si le comportement de l’API est fiable.
- Rendre
presentationen messages Flex ou modèles lorsque c’est possible. - Revenir au texte pour les blocs non pris en charge.
- Supprimer les charges utiles d’interface LINE de
channelData.
- Convertir la présentation en texte avec un formatage conservateur.
Étapes de refactorisation
- Réappliquer le correctif de publication Discord qui sépare
ui-colors.tsde l’interface basée sur Carbon et supprimeDiscordUiContainerdeextensions/discord/src/channel.ts. - Ajouter
presentationetdeliveryàReplyPayload, à la normalisation des charges utiles sortantes, aux résumés de livraison et aux charges utiles de hooks. - Ajouter le schéma
MessagePresentationet des assistants d’analyse dans un sous-chemin SDK/exécution étroit. - Remplacer les capacités de message
buttons,cards,componentsetblockspar des capacités de présentation sémantiques. - Ajouter des hooks d’adaptateur sortant d’exécution pour le rendu de présentation et l’épinglage de livraison.
- Remplacer la construction de composants intercontextuels par
buildCrossContextPresentation. - Supprimer
src/infra/outbound/channel-adapters.tset retirerbuildCrossContextComponentsdes types de Plugin de canal. - Modifier
maybeApplyCrossContextMarkerpour attacherpresentationau lieu de paramètres natifs. - Mettre à jour les chemins d’envoi de répartition de plugins pour consommer uniquement la présentation sémantique et les métadonnées de livraison.
- Supprimer les paramètres de charge utile native de l’agent et de la CLI:
components,blocks,buttonsetcard. - Supprimer les assistants SDK qui créent des schémas d’outils de message natifs, et les remplacer par des assistants de schéma de présentation.
- Supprimer les enveloppes d’interface/natives de
channelData; conserver uniquement les métadonnées de transport jusqu’à ce que chaque champ restant soit examiné. - Migrer les moteurs de rendu Discord, Slack, Telegram, Mattermost, MS Teams, Feishu et LINE.
- Mettre à jour la documentation pour la CLI de message, les pages de canaux, le SDK de Plugin et le guide pratique des capacités.
- Exécuter le profilage du fanout d’import pour Discord et les points d’entrée de canal affectés.
channelData privées aux fournisseurs. L’étape 15 reste une validation de suivi si nous voulons des nombres quantifiés de fanout d’import au-delà de la barrière de types/tests.
Tests
Ajouter ou mettre à jour:- Tests de normalisation de présentation.
- Tests de dégradation automatique de présentation pour les blocs non pris en charge.
- Tests de marqueur intercontextuel pour la répartition des plugins et les chemins de livraison du noyau.
- Tests de matrice de rendu de canal pour Discord, Slack, Telegram, Mattermost, MS Teams, Feishu, LINE et le repli textuel.
- Tests de schéma d’outil de message prouvant que les champs natifs ont disparu.
- Tests CLI prouvant que les indicateurs natifs ont disparu.
- Régression de paresse d’import du point d’entrée Discord couvrant Carbon.
- Tests d’épinglage de livraison couvrant Telegram et le repli générique.
Questions ouvertes
delivery.pindoit-il être implémenté pour Discord, Slack, MS Teams et Feishu lors de la première passe, ou seulement pour Telegram d’abord?deliverydoit-il finir par absorber les champs existants tels quereplyToId,replyToCurrent,silentetaudioAsVoice, ou rester concentré sur les comportements post-envoi?- La présentation doit-elle prendre en charge directement les images ou les références de fichiers, ou les médias doivent-ils rester séparés de la mise en page d’interface pour l’instant?