Plan de refactorisation de la présentation des canaux
Statut
Implémenté pour l’agent partagé, la CLI, la capacité du Plugin et les surfaces de distribution sortante :ReplyPayload.presentationtransporte l’interface sémantique des messages.ReplyPayload.delivery.pintransporte les demandes d’épinglage des messages envoyés.- Les actions de message partagées exposent
presentation,deliveryetpinau lieu decomponents,blocks,buttonsoucardnatifs au provider. - Le core effectue le rendu ou l’auto-dégradation de la présentation via les capacités sortantes déclarées par le Plugin.
- Les moteurs de rendu Discord, Slack, Telegram, Mattermost, Microsoft Teams et Feishu consomment le contrat générique.
- Le code de plan de contrôle du canal Discord n’importe plus de conteneurs d’interface adossés à Carbon.
Problème
L’interface des canaux est actuellement répartie sur plusieurs surfaces incompatibles :- Le core possède un hook de rendu inter-contexte de forme Discord via
buildCrossContextComponents. channel.tsde Discord peut importer l’interface native viaDiscordUiContainer, ce qui tire des 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 comme
componentspour Discord,blockspour Slack,buttonspour Telegram ou Mattermost, etcardpour Teams ou Feishu. 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 étroit que les mises en page plus riches déjà utilisées par Discord, Slack, Teams, Feishu, LINE, Telegram et Mattermost.
Objectifs
- Le core décide de 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 distincte de l’interface native de chat.
- Les charges utiles natives de canal 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 distribution, comme l’épinglage d’un message envoyé, est une métadonnée de distribution générique, pas une présentation.
Non-objectifs
- Aucun shim de rétrocompatibilité pour
buildCrossContextComponents. - Aucune échappatoire native publique pour
components,blocks,buttonsoucard. - Aucune importation par le core de bibliothèques d’interface natives de canal.
- Aucune seam SDK spécifique au provider pour les canaux intégrés.
Modèle cible
Ajouter un champpresentation possédé par le core à ReplyPayload.
interactive devient un sous-ensemble de presentation pendant la migration :
- le bloc texte
interactivese mappe verspresentation.blocks[].type = "text". - le bloc boutons
interactivese mappe verspresentation.blocks[].type = "buttons". - le bloc sélection
interactivese mappe verspresentation.blocks[].type = "select".
presentation ; interactive reste un helper interne hérité d’analyse/rendu pour les producteurs de réponses existants.
Métadonnées de distribution
Ajouter un champdelivery possédé par le core 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 un échec d’épinglage se dégradent automatiquement en poursuivant la distribution.- Les actions manuelles de message
pin,unpinetlist-pinsrestent 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 distribution à 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 avant le rendu.
- Appeler
renderPresentation. - S’il n’existe pas de moteur de rendu, convertir la présentation en repli texte.
- Après un envoi réussi, appeler
pinDeliveredMessagelorsquedelivery.pinest demandé et pris en charge.
Correspondance par canal
Discord :- Rendre
presentationen components v2 et conteneurs Carbon dans des modules runtime-only. - Conserver les helpers 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 texte, contexte et séparateurs en texte.
- Rendre actions et sélection sous forme de claviers inline lorsqu’ils sont configurés et autorisés pour la surface cible.
- Utiliser le repli texte lorsque les boutons inline sont désactivés.
- Déplacer l’épinglage du sujet ACP vers
delivery.pin.
- Rendre les actions sous forme de boutons interactifs lorsqu’ils sont configurés.
- Rendre les autres blocs via un repli texte.
- 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 des messages envoyés si le comportement de l’API est fiable.
- Rendre
presentationen messages Flex ou template 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 une mise en forme conservative.
Étapes de refactorisation
- Réappliquer le correctif de release Discord qui sépare
ui-colors.tsde l’interface adossée à Carbon et supprimeDiscordUiContainerdeextensions/discord/src/channel.ts. - Ajouter
presentationetdeliveryàReplyPayload, à la normalisation des charges utiles sortantes, aux résumés de distribution et aux charges utiles de hook. - Ajouter le schéma
MessagePresentationet des helpers d’analyse dans un sous-chemin SDK/runtime é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 distribution.
- Remplacer la construction de composants inter-contexte par
buildCrossContextPresentation. - Supprimer
src/infra/outbound/channel-adapters.tset retirerbuildCrossContextComponentsdes types du Plugin de canal. - Modifier
maybeApplyCrossContextMarkerpour attacherpresentationau lieu de paramètres natifs. - Mettre à jour les chemins d’envoi plugin-dispatch afin qu’ils ne consomment que la présentation sémantique et les métadonnées de distribution.
- Supprimer les paramètres de charge utile native de l’agent et de la CLI :
components,blocks,buttonsetcard. - Supprimer les helpers SDK qui créent des schémas natifs d’outil de message, en les remplaçant par des helpers de schéma de présentation.
- Supprimer les enveloppes UI/natives de
channelData; ne conserver que les métadonnées de transport jusqu’à examen de chaque champ restant. - Migrer les moteurs de rendu Discord, Slack, Telegram, Mattermost, Microsoft Teams, Feishu et LINE.
- Mettre à jour la documentation de la CLI de message, des pages de canal, du Plugin SDK et du cookbook de capacités.
- Exécuter un profilage de diffusion des imports pour Discord et les points d’entrée de canal affectés.
channelData privées au provider. L’étape 15 reste une validation de suivi si nous voulons des chiffres quantifiés de diffusion des imports au-delà de la gate de types/tests.
Tests
Ajouter ou mettre à jour :- tests de normalisation de présentation.
- tests d’auto-dégradation de la présentation pour les blocs non pris en charge.
- tests de marqueur inter-contexte pour les chemins plugin-dispatch et de distribution core.
- tests de matrice de rendu de canal pour Discord, Slack, Telegram, Mattermost, Microsoft Teams, Feishu, LINE et le repli texte.
- tests de schéma d’outil de message prouvant que les champs natifs ont disparu.
- tests CLI prouvant que les flags natifs ont disparu.
- régression de paresse d’import du point d’entrée Discord couvrant Carbon.
- tests d’épinglage de distribution couvrant Telegram et le repli générique.
Questions ouvertes
delivery.pindoit-il être implémenté pour Discord, Slack, Microsoft Teams et Feishu dès le premier passage, ou seulement pour Telegram d’abord ?deliverydoit-il à terme absorber des champs existants commereplyToId,replyToCurrent,silentetaudioAsVoice, ou rester centré sur les comportements post-envoi ?- La présentation doit-elle prendre directement en charge les images ou références de fichier, ou les médias doivent-ils rester séparés de la mise en page de l’interface pour le moment ?