Estado
Implementado para las superficies compartidas de agente, CLI, capacidad de plugin y entrega saliente:ReplyPayload.presentationtransporta UI semántica de mensajes.ReplyPayload.delivery.pintransporta solicitudes para fijar mensajes enviados.- Las acciones de mensajes compartidas 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 del canal Discord ya no importa contenedores de UI respaldados por Carbon.
Problema
La UI de canales está actualmente dividida entre varias superficies incompatibles:- El núcleo posee un hook de renderizador 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 escapes de payload nativos como
componentsde Discord,blocksde Slack,buttonsde Telegram o Mattermost, ycardde Teams o Feishu. ReplyPayload.channelDatatransporta tanto indicaciones de transporte como sobres de UI nativa.- El modelo genérico
interactiveexiste, pero es más limitado que los diseños más ricos que ya usan 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 las capacidades declaradas.
- Las extensiones declaran capacidades y renderizan la presentación semántica en payloads de transporte nativos.
- La Web Control UI permanece separada de la UI nativa de chat.
- Los payloads nativos de canal no se exponen mediante la superficie compartida de mensajes del agente o la CLI.
- Las características de presentación no admitidas 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
- Sin shim de compatibilidad hacia atrás para
buildCrossContextComponents. - Sin escapes nativos públicos para
components,blocks,buttonsocard. - Sin importaciones del núcleo de bibliotecas de UI nativas de canal.
- Sin seams de SDK específicos de proveedor para canales incluidos.
Modelo objetivo
Añadir 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 de selección
interactivese asigna apresentation.blocks[].type = "select".
presentation; interactive permanece como un helper interno heredado de análisis/renderizado para productores de respuestas existentes.
La API pública orientada a productores trata interactive como obsoleto. El soporte en runtime
permanece para que los helpers de aprobación existentes y los plugins antiguos sigan
funcionando mientras el código nuevo emite presentation.
Metadatos de entrega
Añadir un campodelivery propiedad del núcleo para comportamiento de envío que no es UI.
delivery.pin = truesignifica fijar el primer mensaje entregado correctamente.notifytienefalsecomo valor predeterminado.requiredtienefalsecomo valor predeterminado; los canales no admitidos o los fallos al fijar se degradan automáticamente continuando la entrega.- Las acciones manuales de mensaje
pin,unpinylist-pinspermanecen para mensajes existentes.
channelData.telegram.pin = true a delivery.pin = true.
Contrato de capacidades del runtime
Añadir hooks de renderizado de presentación y entrega al adaptador saliente del runtime, no al plugin de canal del plano de control.- Resolver el canal objetivo y el adaptador de runtime.
- Pedir las capacidades de presentación.
- Degradar bloques no admitidos y aplicar límites genéricos de capacidades antes de renderizar.
- Llamar a
renderPresentation. - Si no existe renderizador, convertir la presentación a una alternativa de texto.
- Después de un envío correcto, llamar a
pinDeliveredMessagecuandodelivery.pinse solicite y esté admitido.
Mapeo de canales
Discord:- Renderizar
presentationa componentes v2 y contenedores Carbon en módulos solo de runtime. - 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 selección como teclados en línea cuando esté configurado y permitido para la superficie objetivo.
- Usar alternativa de texto cuando los botones en línea estén deshabilitados.
- Mover el fijado de temas ACP a
delivery.pin.
- Renderizar acciones como botones interactivos donde esté configurado.
- Renderizar otros bloques como alternativa 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 fijar 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 admitidos.
- Eliminar payloads de UI de LINE de
channelData.
- Convertir la presentación a texto con formato conservador.
Pasos de refactorización
- Volver a aplicar la corrección de lanzamiento de Discord que separa
ui-colors.tsde la UI respaldada por Carbon y eliminaDiscordUiContainerdeextensions/discord/src/channel.ts. - Añadir
presentationydeliveryaReplyPayload, la normalización de payloads salientes, los resúmenes de entrega y los payloads de hooks. - Añadir el esquema
MessagePresentationy helpers de análisis en una subruta estrecha de SDK/runtime. - Reemplazar las capacidades de mensaje
buttons,cards,componentsyblockspor capacidades de presentación semántica. - Añadir hooks de adaptador saliente de runtime para renderizado de presentación y fijado de entrega.
- Reemplazar la construcción de componentes entre contextos por
buildCrossContextPresentation. - Eliminar
src/infra/outbound/channel-adapters.tsy quitarbuildCrossContextComponentsde los tipos de plugin de canal. - Cambiar
maybeApplyCrossContextMarkerpara adjuntarpresentationen lugar de parámetros nativos. - Actualizar las rutas de envío de plugin-dispatch para consumir solo presentación semántica y metadatos de entrega.
- Eliminar parámetros de payload nativo del agente y la CLI:
components,blocks,buttonsycard. - Eliminar helpers del SDK que crean esquemas nativos de herramientas de mensaje, reemplazándolos por helpers de esquema de presentación.
- Eliminar sobres UI/nativos de
channelData; conservar solo metadatos de transporte hasta que se revise cada campo restante. - Migrar los renderizadores de Discord, Slack, Telegram, Mattermost, MS Teams, Feishu y LINE.
- Actualizar la documentación para la CLI de mensajes, páginas de canales, SDK de plugins y recetario de capacidades.
- Ejecutar perfilado de fanout de importaciones para Discord y los entrypoints de canal afectados.
channelData privados del proveedor. El paso 15 queda como validación de seguimiento si queremos números cuantificados de fanout de importaciones más allá de la barrera de tipos/pruebas.
Pruebas
Añadir o actualizar:- Pruebas de normalización de presentación.
- Pruebas de degradación automática de presentación para bloques no admitidos.
- Pruebas de marcador entre contextos para rutas de plugin dispatch y entrega del núcleo.
- Pruebas de matriz de renderizado de canales para Discord, Slack, Telegram, Mattermost, MS Teams, Feishu, LINE y alternativa de texto.
- Pruebas de esquema de herramientas de mensaje que demuestren que los campos nativos ya no están.
- Pruebas de CLI que demuestren que las flags nativas ya no están.
- Regresión de carga diferida de importaciones del entrypoint de Discord que cubra Carbon.
- Pruebas de fijado de entrega que cubran Telegram y la alternativa genérica.
Preguntas abiertas
- ¿Debe implementarse
delivery.pinpara Discord, Slack, MS Teams y Feishu en la primera pasada, o solo Telegram primero? - ¿Debe
deliveryabsorber eventualmente campos existentes comoreplyToId,replyToCurrent,silentyaudioAsVoice, o mantenerse centrado en comportamientos posteriores al envío? - ¿Debe la presentación admitir imágenes o referencias a archivos directamente, o los medios deben permanecer separados del diseño de UI por ahora?