Status
Implementado para o agente compartilhado, CLI, capacidade de Plugin e superfícies de entrega de saída:ReplyPayload.presentationcarrega a UI semântica de mensagens.ReplyPayload.delivery.pincarrega solicitações de fixação de mensagens enviadas.- Ações de mensagem compartilhadas expõem
presentation,deliveryepinem vez decomponents,blocks,buttonsoucardnativos do provedor. - O core renderiza ou autodegrada a apresentação por meio das capacidades de saída declaradas pelo Plugin.
- Renderizadores do Discord, Slack, Telegram, Mattermost, MS Teams e Feishu consomem o contrato genérico.
- O código do plano de controle do canal Discord não importa mais contêineres de UI baseados em Carbon.
Problema
A UI de canais está atualmente dividida entre várias superfícies incompatíveis:- O core possui um hook de renderizador entre contextos com formato de Discord por meio de
buildCrossContextComponents. - O
channel.tsdo Discord pode importar UI Carbon nativa por meio deDiscordUiContainer, o que traz dependências de UI em runtime para o plano de controle do Plugin de canal. - O agente e a CLI expõem escapes de payload nativo, como
componentsdo Discord,blocksdo Slack,buttonsdo Telegram ou Mattermost ecarddo Teams ou Feishu. ReplyPayload.channelDatacarrega tanto dicas de transporte quanto envelopes de UI nativa.- O modelo genérico
interactiveexiste, mas é mais restrito do que os layouts mais ricos já usados por Discord, Slack, Teams, Feishu, LINE, Telegram e Mattermost.
Objetivos
- O core decide a melhor apresentação semântica para uma mensagem a partir das capacidades declaradas.
- Extensões declaram capacidades e renderizam apresentação semântica em payloads de transporte nativos.
- A UI de Controle Web permanece separada da UI nativa de chat.
- Payloads nativos de canal não são expostos pela superfície de mensagens do agente compartilhado ou da CLI.
- Recursos de apresentação sem suporte são autodegradados para a melhor representação em texto.
- Comportamento de entrega, como fixar uma mensagem enviada, é metadado genérico de entrega, não apresentação.
Não objetivos
- Nenhum shim de compatibilidade retroativa para
buildCrossContextComponents. - Nenhum escape nativo público para
components,blocks,buttonsoucard. - Nenhuma importação pelo core de bibliotecas de UI nativas de canal.
- Nenhuma interface de SDK específica de provedor para canais empacotados.
Modelo-alvo
Adicione um campopresentation de propriedade do core a ReplyPayload.
interactive se torna um subconjunto de presentation durante a migração:
- Bloco de texto de
interactiveé mapeado parapresentation.blocks[].type = "text". - Bloco de botões de
interactiveé mapeado parapresentation.blocks[].type = "buttons". - Bloco de seleção de
interactiveé mapeado parapresentation.blocks[].type = "select".
presentation; interactive permanece como helper interno legado de análise/renderização para produtores de resposta existentes.
A API pública voltada a produtores trata interactive como obsoleto. O suporte em runtime
permanece para que helpers de aprovação existentes e Plugins mais antigos continuem
funcionando enquanto o código novo emite presentation.
Metadados de entrega
Adicione um campodelivery de propriedade do core para comportamento de envio que não é UI.
delivery.pin = truesignifica fixar a primeira mensagem entregue com sucesso.notifyusafalsecomo padrão.requiredusafalsecomo padrão; canais sem suporte ou falha na fixação são autodegradados ao continuar a entrega.- Ações manuais de mensagem
pin,unpinelist-pinspermanecem para mensagens existentes.
channelData.telegram.pin = true para delivery.pin = true.
Contrato de capacidade em runtime
Adicione hooks de renderização de apresentação e entrega ao adaptador de saída em runtime, não ao Plugin de canal do plano de controle.- Resolver o canal de destino e o adaptador em runtime.
- Consultar capacidades de apresentação.
- Degradar blocos sem suporte e aplicar limites genéricos de capacidade antes de renderizar.
- Chamar
renderPresentation. - Se nenhum renderizador existir, converter a apresentação para fallback de texto.
- Após envio bem-sucedido, chamar
pinDeliveredMessagequandodelivery.pinfor solicitado e suportado.
Mapeamento de canais
Discord:- Renderizar
presentationpara componentes v2 e contêineres Carbon em módulos somente de runtime. - Manter helpers de cor de destaque em módulos leves.
- Remover importações de
DiscordUiContainerdo código do plano de controle do Plugin de canal.
- Renderizar
presentationpara Block Kit. - Remover entrada
blocksdo agente e da CLI.
- Renderizar texto, contexto e divisores como texto.
- Renderizar ações e seleção como teclados inline quando configurado e permitido para a superfície de destino.
- Usar fallback de texto quando botões inline estiverem desativados.
- Mover a fixação de tópico ACP para
delivery.pin.
- Renderizar ações como botões interativos quando configurado.
- Renderizar outros blocos como fallback de texto.
- Renderizar
presentationpara Adaptive Cards. - Manter ações manuais de fixar/desafixar/listar fixados.
- Opcionalmente implementar
pinDeliveredMessagese o suporte do Graph for confiável para a conversa de destino.
- Renderizar
presentationpara cartões interativos. - Manter ações manuais de fixar/desafixar/listar fixados.
- Opcionalmente implementar
pinDeliveredMessagepara fixação de mensagem enviada se o comportamento da API for confiável.
- Renderizar
presentationpara mensagens Flex ou de modelo quando possível. - Fazer fallback para texto em blocos sem suporte.
- Remover payloads de UI do LINE de
channelData.
- Converter apresentação para texto com formatação conservadora.
Etapas de refatoração
- Reaplicar a correção de release do Discord que separa
ui-colors.tsda UI baseada em Carbon e removeDiscordUiContainerdeextensions/discord/src/channel.ts. - Adicionar
presentationedeliveryaReplyPayload, normalização de payload de saída, resumos de entrega e payloads de hook. - Adicionar schema
MessagePresentatione helpers de parser em um subcaminho estreito de SDK/runtime. - Substituir capacidades de mensagem
buttons,cards,componentseblockspor capacidades de apresentação semântica. - Adicionar hooks de adaptador de saída em runtime para renderização de apresentação e fixação de entrega.
- Substituir construção de componentes entre contextos por
buildCrossContextPresentation. - Excluir
src/infra/outbound/channel-adapters.tse removerbuildCrossContextComponentsdos tipos de Plugin de canal. - Alterar
maybeApplyCrossContextMarkerpara anexarpresentationem vez de parâmetros nativos. - Atualizar caminhos de envio de despacho de Plugins para consumir somente apresentação semântica e metadados de entrega.
- Remover parâmetros de payload nativo do agente e da CLI:
components,blocks,buttonsecard. - Remover helpers do SDK que criam schemas de ferramenta de mensagem nativa, substituindo-os por helpers de schema de apresentação.
- Remover envelopes de UI/nativos de
channelData; manter somente metadados de transporte até que cada campo restante seja revisado. - Migrar renderizadores do Discord, Slack, Telegram, Mattermost, MS Teams, Feishu e LINE.
- Atualizar documentação para CLI de mensagens, páginas de canal, SDK de Plugin e cookbook de capacidades.
- Executar perfilamento de fanout de importação para Discord e entrypoints de canais afetados.
channelData privados de provedor. A etapa 15 permanece como validação de acompanhamento se quisermos números quantificados de fanout de importação além do gate de tipo/teste.
Testes
Adicionar ou atualizar:- Testes de normalização de apresentação.
- Testes de autodegradação de apresentação para blocos sem suporte.
- Testes de marcador entre contextos para despacho de Plugin e caminhos de entrega do core.
- Testes de matriz de renderização de canais para Discord, Slack, Telegram, Mattermost, MS Teams, Feishu, LINE e fallback de texto.
- Testes de schema de ferramenta de mensagem provando que campos nativos desapareceram.
- Testes de CLI provando que flags nativas desapareceram.
- Regressão de preguiça de importação do entrypoint do Discord cobrindo Carbon.
- Testes de fixação de entrega cobrindo Telegram e fallback genérico.
Perguntas em aberto
delivery.pindeve ser implementado para Discord, Slack, MS Teams e Feishu na primeira passada, ou somente Telegram primeiro?deliverydeve eventualmente absorver campos existentes comoreplyToId,replyToCurrent,silenteaudioAsVoice, ou permanecer focado em comportamentos pós-envio?- A apresentação deve dar suporte direto a imagens ou referências de arquivo, ou a mídia deve permanecer separada do layout de UI por enquanto?