Estado
Implementado para las superficies compartidas del agente, la CLI, la capacidad del Plugin y la entrega saliente:ReplyPayload.presentationtransporta UI semántica de mensajes.ReplyPayload.delivery.pintransporta solicitudes de fijación de mensajes enviados.- Las acciones compartidas de mensajes exponen
presentation,deliveryypinen lugar decomponents,blocks,buttonsocardnativos del proveedor. - El núcleo renderiza o degrada automáticamente la presentación mediante capacidades salientes declaradas por el Plugin.
- Los renderizadores de Discord, Slack, Telegram, Mattermost, MS Teams y Feishu consumen el contrato genérico.
- El código del plano de control de canal de Discord ya no importa contenedores de UI respaldados por Carbon.
Problema
La UI de canal está actualmente dividida entre varias superficies incompatibles:- El núcleo posee un hook de renderizado entre contextos con forma de Discord mediante
buildCrossContextComponents. channel.tsde Discord puede importar UI nativa de Carbon medianteDiscordUiContainer, lo que arrastra dependencias de UI en tiempo de ejecución al plano de control del Plugin de canal.- El agente y la CLI exponen vías de escape de carga útil nativa como
componentsde Discord,blocksde Slack,buttonsde Telegram o Mattermost ycardde Teams o Feishu. ReplyPayload.channelDatatransporta tanto sugerencias de transporte como envoltorios de UI nativa.- El modelo genérico
interactiveexiste, pero es más limitado que los diseños más ricos ya usados por Discord, Slack, Teams, Feishu, LINE, Telegram y Mattermost.
Objetivos
- El núcleo decide la mejor presentación semántica para un mensaje a partir de capacidades declaradas.
- Las extensiones declaran capacidades y renderizan la presentación semántica en cargas útiles nativas de transporte.
- La UI de Control web permanece separada de la UI nativa del chat.
- Las cargas útiles nativas de canal no se exponen mediante la superficie compartida del agente o la CLI.
- Las funciones de presentación no compatibles se degradan automáticamente a la mejor representación de texto.
- El comportamiento de entrega, como fijar un mensaje enviado, es metadato genérico de entrega, no presentación.
No objetivos
- No habrá shim de compatibilidad hacia atrás para
buildCrossContextComponents. - No habrá vías de escape nativas públicas para
components,blocks,buttonsocard. - No habrá importaciones en el núcleo de bibliotecas de UI nativas del canal.
- No habrá interfaces de SDK específicas del proveedor para canales incluidos.
Modelo objetivo
Agrega un campopresentation propiedad del núcleo a ReplyPayload.
interactive se convierte en un subconjunto de presentation durante la migración:
- el bloque de texto
interactivese asigna apresentation.blocks[].type = "text". - el bloque de botones
interactivese asigna apresentation.blocks[].type = "buttons". - el bloque select
interactivese asigna apresentation.blocks[].type = "select".
presentation; interactive permanece como helper interno heredado de análisis/renderizado para productores de respuestas existentes.
Metadatos de entrega
Agrega un campodelivery propiedad del núcleo para el comportamiento de envío que no es UI.
delivery.pin = truesignifica fijar el primer mensaje entregado con éxito.notifytoma el valor predeterminadofalse.requiredtoma el valor predeterminadofalse; los canales no compatibles o los fallos al fijar se degradan automáticamente continuando la entrega.- Las acciones manuales de mensaje
pin,unpinylist-pinsse mantienen para mensajes existentes.
channelData.telegram.pin = true a delivery.pin = true.
Contrato de capacidad en tiempo de ejecución
Agrega hooks de renderizado de presentación y entrega al adaptador saliente del tiempo de ejecución, no al Plugin de canal del plano de control.- Resolver el canal de destino y el adaptador del tiempo de ejecución.
- Solicitar capacidades de presentación.
- Degradar bloques no compatibles antes de renderizar.
- Llamar a
renderPresentation. - Si no existe renderizador, convertir la presentación a texto fallback.
- Después de un envío exitoso, llamar a
pinDeliveredMessagecuando se solicitedelivery.piny sea compatible.
Mapeo de canales
Discord:- Renderizar
presentationa components v2 y contenedores Carbon en módulos de solo tiempo de ejecución. - Mantener helpers de color de acento en módulos ligeros.
- Eliminar importaciones de
DiscordUiContainerdel código del plano de control del Plugin de canal.
- Renderizar
presentationa Block Kit. - Eliminar la entrada
blocksdel agente y la CLI.
- Renderizar texto, contexto y divisores como texto.
- Renderizar acciones y select como teclados en línea cuando estén configurados y permitidos para la superficie objetivo.
- Usar fallback de texto cuando los botones en línea estén deshabilitados.
- Mover la fijación de temas ACP a
delivery.pin.
- Renderizar acciones como botones interactivos cuando estén configurados.
- Renderizar los demás bloques como fallback de texto.
- Renderizar
presentationa Adaptive Cards. - Mantener las acciones manuales
pin/unpin/list-pins. - Implementar opcionalmente
pinDeliveredMessagesi el soporte de Graph es fiable para la conversación objetivo.
- Renderizar
presentationa tarjetas interactivas. - Mantener las acciones manuales
pin/unpin/list-pins. - Implementar opcionalmente
pinDeliveredMessagepara fijación de mensajes enviados si el comportamiento de la API es fiable.
- Renderizar
presentationa mensajes Flex o de plantilla cuando sea posible. - Recurrir a texto para bloques no compatibles.
- Eliminar cargas útiles de UI de LINE de
channelData.
- Convertir la presentación a texto con formato conservador.
Pasos de refactorización
- Reaplicar la corrección de versión de Discord que separa
ui-colors.tsde la UI respaldada por Carbon y eliminaDiscordUiContainerdeextensions/discord/src/channel.ts. - Agregar
presentationydeliveryaReplyPayload, normalización de carga útil saliente, resúmenes de entrega y cargas útiles de hooks. - Agregar el esquema y los helpers de análisis de
MessagePresentationen una subruta estrecha de SDK/tiempo de ejecución. - Reemplazar las capacidades de mensajes
buttons,cards,componentsyblockspor capacidades de presentación semántica. - Agregar hooks de adaptador saliente en tiempo de ejecución para renderizado de presentación y fijación de entrega.
- Reemplazar la construcción de componentes entre contextos por
buildCrossContextPresentation. - Eliminar
src/infra/outbound/channel-adapters.tsy quitarbuildCrossContextComponentsde los tipos de Plugins de canal. - Cambiar
maybeApplyCrossContextMarkerpara adjuntarpresentationen lugar de parámetros nativos. - Actualizar las rutas de envío de despacho de Plugins para que consuman solo presentación semántica y metadatos de entrega.
- Eliminar los parámetros nativos de carga útil del agente y la CLI:
components,blocks,buttonsycard. - Eliminar los helpers de SDK que crean esquemas nativos de herramientas de mensaje, sustituyéndolos por helpers de esquema de presentación.
- Eliminar envoltorios de UI/nativos de
channelData; conservar solo metadatos de transporte hasta revisar cada campo restante. - Migrar renderizadores de Discord, Slack, Telegram, Mattermost, MS Teams, Feishu y LINE.
- Actualizar la documentación de la CLI de mensajes, páginas de canales, SDK de Plugins y recetario de capacidades.
- Ejecutar perfilado de fanout de importación para Discord y los entrypoints de canales afectados.
channelData privados del proveedor. El paso 15 sigue siendo una validación posterior si queremos cifras cuantificadas de fanout de importación más allá de la puerta de tipos/pruebas.
Pruebas
Agregar o actualizar:- Pruebas de normalización de presentación.
- Pruebas de degradación automática de presentación para bloques no compatibles.
- Pruebas de marcadores entre contextos para despacho de Plugins y rutas de entrega del núcleo.
- Pruebas de matriz de renderizado de canales para Discord, Slack, Telegram, Mattermost, MS Teams, Feishu, LINE y fallback de texto.
- Pruebas del esquema de la herramienta message que demuestren que los campos nativos han desaparecido.
- Pruebas de CLI que demuestren que las banderas nativas han desaparecido.
- Regresión de carga diferida del entrypoint de Discord que cubra Carbon.
- Pruebas de fijación de entrega que cubran Telegram y fallback genérico.
Preguntas abiertas
- ¿Debería implementarse
delivery.pinpara Discord, Slack, MS Teams y Feishu en la primera pasada, o solo primero para Telegram? - ¿Debería
deliveryacabar absorbiendo campos existentes comoreplyToId,replyToCurrent,silentyaudioAsVoice, o mantenerse centrado en comportamientos posteriores al envío? - ¿Debería la presentación admitir directamente imágenes o referencias de archivos, o el contenido multimedia debería seguir separado del diseño de UI por ahora?