Estado
Implementado para las superficies del agente compartido, la CLI, las capacidades de plugins y la entrega saliente:ReplyPayload.presentationtransporta la interfaz semántica de mensajes.ReplyPayload.delivery.pintransporta solicitudes para fijar mensajes enviados.- Las acciones de mensajes compartidas exponen
presentation,deliveryypinen lugar de los elementos nativos del proveedorcomponents,blocks,buttonsocard. - El núcleo renderiza o degrada automáticamente la presentación mediante las capacidades de salida declaradas por los plugins.
- 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 de Discord ya no importa contenedores de interfaz respaldados por Carbon.
Problema
Actualmente, la interfaz de los canales está dividida entre varias superficies incompatibles:- El núcleo posee un hook de renderización entre contextos con la estructura de Discord mediante
buildCrossContextComponents. channel.tsde Discord puede importar la interfaz nativa de Carbon medianteDiscordUiContainer, lo que incorpora dependencias de interfaz en tiempo de ejecución al plano de control del plugin del canal.- El agente y la CLI exponen mecanismos de escape para cargas útiles nativas, como
componentsde Discord,blocksde Slack,buttonsde Telegram o Mattermost ycardde Teams o Feishu. ReplyPayload.channelDatatransporta tanto indicaciones de transporte como envoltorios de interfaz nativos.- El modelo genérico
interactiveexiste, pero es más limitado que los diseños más completos que ya utilizan 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 como cargas útiles nativas de transporte.
- La interfaz web de control permanece separada de la interfaz nativa de chat.
- Las cargas útiles nativas de los canales no se exponen mediante la superficie compartida de mensajes del agente ni de la CLI.
- Las funciones de presentación no compatibles se degradan automáticamente a la mejor representación textual.
- El comportamiento de entrega, como fijar un mensaje enviado, constituye metadatos genéricos de entrega, no de presentación.
No objetivos
- Ninguna capa de compatibilidad con versiones anteriores para
buildCrossContextComponents. - Ningún mecanismo público de escape nativo para
components,blocks,buttonsocard. - Ninguna importación en el núcleo de bibliotecas de interfaz nativas de los canales.
- Ninguna interfaz del SDK específica del proveedor para los canales incluidos.
Modelo de destino
Añada 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 auxiliar interno heredado de análisis y renderización para los productores de respuestas existentes.
La API pública orientada a productores trata interactive como obsoleto. La compatibilidad
en tiempo de ejecución se mantiene para que los auxiliares de aprobación existentes y los plugins más antiguos sigan
funcionando mientras el código nuevo emite presentation.
Metadatos de entrega
Añada un campodelivery, propiedad del núcleo, para el comportamiento de envío que no corresponde a la interfaz.
delivery.pin = truesignifica fijar el primer mensaje entregado correctamente.notifytiene como valor predeterminadofalse.requiredtiene como valor predeterminadofalse; los canales no compatibles o los errores al fijar se degradan automáticamente y permiten que la entrega continúe.- Las acciones manuales de mensajes
pin,unpinylist-pinspermanecen disponibles para los mensajes existentes.
channelData.telegram.pin = true a delivery.pin = true.
Contrato de capacidades del entorno de ejecución
Añada hooks de renderización de presentación y entrega al adaptador de salida del entorno de ejecución, no al plugin del canal del plano de control.- Resolver el canal de destino y el adaptador del entorno de ejecución.
- Consultar las capacidades de presentación.
- Degradar los bloques no compatibles y aplicar los límites genéricos de capacidad antes de renderizar.
- Invocar
renderPresentation. - Si no existe ningún renderizador, convertir la presentación en texto de respaldo.
- Tras un envío correcto, invocar
pinDeliveredMessagecuando se solicitedelivery.piny sea compatible.
Asignación de canales
Discord:- Renderizar
presentationcomo componentes v2 y contenedores de Carbon en módulos exclusivos del entorno de ejecución. - Mantener los auxiliares de color de realce en módulos ligeros.
- Eliminar las importaciones de
DiscordUiContainerdel código del plano de control del plugin del canal.
- Renderizar
presentationcomo Block Kit. - Eliminar la entrada
blocksdel agente y de la CLI.
- Renderizar el texto, el contexto y los divisores como texto.
- Renderizar las acciones y la selección como teclados en línea cuando estén configurados y permitidos para la superficie de destino.
- Utilizar texto de respaldo cuando los botones en línea estén desactivados.
- Trasladar la fijación de temas ACP a
delivery.pin.
- Renderizar las acciones como botones interactivos cuando estén configuradas.
- Renderizar los demás bloques como texto de respaldo.
- Renderizar
presentationcomo Adaptive Cards. - Mantener las acciones manuales para fijar, dejar de fijar y enumerar los elementos fijados.
- Implementar opcionalmente
pinDeliveredMessagesi la compatibilidad con Graph es fiable para la conversación de destino.
- Renderizar
presentationcomo tarjetas interactivas. - Mantener las acciones manuales para fijar, dejar de fijar y enumerar los elementos fijados.
- Implementar opcionalmente
pinDeliveredMessagepara fijar mensajes enviados si el comportamiento de la API es fiable.
- Renderizar
presentationcomo mensajes Flex o de plantilla cuando sea posible. - Utilizar texto de respaldo para los bloques no compatibles.
- Eliminar las cargas útiles de interfaz de LINE de
channelData.
- Convertir la presentación en texto con un formato conservador.
Pasos de refactorización
- Volver a aplicar la corrección de la versión de Discord que separa
ui-colors.tsde la interfaz respaldada por Carbon y eliminaDiscordUiContainerdeextensions/discord/src/channel.ts. - Añadir
presentationydeliveryaReplyPayload, la normalización de cargas útiles salientes, los resúmenes de entrega y las cargas útiles de hooks. - Añadir el esquema
MessagePresentationy los auxiliares de análisis en una subruta específica del SDK o del entorno de ejecución. - Sustituir las capacidades de mensajes
buttons,cards,componentsyblockspor capacidades de presentación semántica. - Añadir hooks al adaptador de salida del entorno de ejecución para renderizar la presentación y fijar elementos durante la entrega.
- Sustituir la construcción de componentes entre contextos por
buildCrossContextPresentation. - Eliminar
src/infra/outbound/channel-adapters.tsy quitarbuildCrossContextComponentsde los tipos de plugins de canales. - Cambiar
maybeApplyCrossContextMarkerpara adjuntarpresentationen lugar de parámetros nativos. - Actualizar las rutas de envío del despacho de plugins para que consuman únicamente la presentación semántica y los metadatos de entrega.
- Eliminar los parámetros de cargas útiles nativas del agente y de la CLI:
components,blocks,buttonsycard. - Eliminar los auxiliares del SDK que crean esquemas nativos de herramientas de mensajes y sustituirlos por auxiliares de esquemas de presentación.
- Eliminar los envoltorios de interfaz o nativos de
channelData; conservar únicamente los metadatos de transporte hasta revisar cada campo restante. - Migrar los renderizadores de Discord, Slack, Telegram, Mattermost, MS Teams, Feishu y LINE.
- Actualizar la documentación de la CLI de mensajes, las páginas de canales, el SDK de plugins y el recetario de capacidades.
- Ejecutar un análisis de la propagación de importaciones para Discord y los puntos de entrada de los canales afectados.
channelData privados del proveedor. El paso 15 queda pendiente como validación posterior si se desean cifras cuantificadas de propagación de importaciones más allá de la barrera de tipos y pruebas.
Pruebas
Añadir o actualizar:- Pruebas de normalización de la presentación.
- Pruebas de degradación automática de la presentación para bloques no compatibles.
- Pruebas de marcadores entre contextos para el despacho de plugins y las rutas de entrega del núcleo.
- Pruebas de la matriz de renderización de canales para Discord, Slack, Telegram, Mattermost, MS Teams, Feishu, LINE y el respaldo de texto.
- Pruebas del esquema de herramientas de mensajes que demuestren que los campos nativos han desaparecido.
- Pruebas de la CLI que demuestren que las opciones nativas han desaparecido.
- Prueba de regresión de la carga diferida de importaciones del punto de entrada de Discord que abarque Carbon.
- Pruebas de fijación durante la entrega que abarquen Telegram y el respaldo genérico.
Preguntas abiertas
- ¿Debería implementarse
delivery.pinpara Discord, Slack, MS Teams y Feishu en la primera fase, o inicialmente solo para Telegram? - ¿Debería
deliveryincorporar finalmente campos existentes comoreplyToId,replyToCurrent,silentyaudioAsVoice, o mantenerse centrado en los comportamientos posteriores al envío? - ¿Debería la presentación admitir directamente imágenes o referencias a archivos, o deberían los elementos multimedia permanecer separados del diseño de la interfaz de usuario por ahora?