Status
Geïmplementeerd voor de gedeelde agent, CLI, Plugin-capability en uitgaande afleveringsinterfaces:ReplyPayload.presentationdraagt semantische bericht-UI.ReplyPayload.delivery.pindraagt aanvragen om verzonden berichten vast te pinnen.- Gedeelde berichtacties stellen
presentation,deliveryenpinbeschikbaar in plaats van provider-nativecomponents,blocks,buttonsofcard. - De kern rendert of degradeert presentatie automatisch via door Plugins gedeclareerde uitgaande capabilities.
- Discord-, Slack-, Telegram-, Mattermost-, MS Teams- en Feishu-renderers gebruiken het generieke contract.
- Discord-kanaalcode voor de control plane importeert geen door Carbon ondersteunde UI-containers meer.
Probleem
Kanaal-UI is momenteel verdeeld over meerdere incompatibele oppervlakken:- De kern bezit een Discord-vormige cross-context renderer-hook via
buildCrossContextComponents. - Discord
channel.tskan native Carbon-UI importeren viaDiscordUiContainer, waardoor runtime-UI-afhankelijkheden in de control plane van de kanaal-Plugin terechtkomen. - De agent en CLI stellen native payload-uitwegen beschikbaar, zoals Discord
components, Slackblocks, Telegram- of Mattermost-buttonsen Teams- of Feishu-card. ReplyPayload.channelDatadraagt zowel transporthints als native UI-enveloppen.- Het generieke
interactive-model bestaat, maar is smaller dan de rijkere layouts die al worden gebruikt door Discord, Slack, Teams, Feishu, LINE, Telegram en Mattermost.
Doelen
- De kern bepaalt de beste semantische presentatie voor een bericht op basis van gedeclareerde capabilities.
- Extensies declareren capabilities en renderen semantische presentatie naar native transportpayloads.
- Web Control UI blijft gescheiden van chat-native UI.
- Native kanaalpayloads worden niet beschikbaar gesteld via het gedeelde agent- of CLI-berichtoppervlak.
- Niet-ondersteunde presentatiefuncties degraderen automatisch naar de beste tekstrepresentatie.
- Aflevergedrag zoals het vastpinnen van een verzonden bericht is generieke afleveringsmetadata, geen presentatie.
Niet-doelen
- Geen achterwaartse-compatibiliteitsshims voor
buildCrossContextComponents. - Geen openbare native uitwegen voor
components,blocks,buttonsofcard. - Geen kernimports van kanaal-native UI-bibliotheken.
- Geen provider-specifieke SDK-naden voor gebundelde kanalen.
Doelmodel
Voeg een door de kern beheerd veldpresentation toe aan ReplyPayload.
interactive wordt tijdens de migratie een subset van presentation:
interactive-tekstblok mappt naarpresentation.blocks[].type = "text".interactive-knoppenblok mappt naarpresentation.blocks[].type = "buttons".interactive-selectieblok mappt naarpresentation.blocks[].type = "select".
presentation; interactive blijft een interne legacy parser/rendering-helper voor bestaande reply-producenten.
De openbare API voor producenten behandelt interactive als verouderd. Runtime-
ondersteuning blijft bestaan zodat bestaande goedkeuringshelpers en oudere Plugins blijven
werken terwijl nieuwe code presentation uitzendt.
Afleveringsmetadata
Voeg een door de kern beheerd velddelivery toe voor verzendgedrag dat geen UI is.
delivery.pin = truebetekent dat het eerste succesvol afgeleverde bericht wordt vastgepind.notifyis standaardfalse.requiredis standaardfalse; niet-ondersteunde kanalen of mislukt vastpinnen degraderen automatisch door aflevering voort te zetten.- Handmatige berichtacties
pin,unpinenlist-pinsblijven bestaan voor bestaande berichten.
channelData.telegram.pin = true naar delivery.pin = true.
Runtime-capabilitycontract
Voeg presentatie- en afleveringsrender-hooks toe aan de runtime-uitgaande adapter, niet aan de control-plane kanaal-Plugin.- Los het doelkanaal en de runtime-adapter op.
- Vraag om presentatie-capabilities.
- Degradeer niet-ondersteunde blokken en pas generieke capabilitylimieten toe vóór rendering.
- Roep
renderPresentationaan. - Als er geen renderer bestaat, converteer presentatie naar tekstfallback.
- Roep na succesvol verzenden
pinDeliveredMessageaan wanneerdelivery.pinis aangevraagd en wordt ondersteund.
Kanaaltoewijzing
Discord:- Render
presentationnaar components v2 en Carbon-containers in modules die alleen in runtime worden gebruikt. - Houd helpers voor accentkleuren in lichte modules.
- Verwijder
DiscordUiContainer-imports uit control-plane-code van de kanaal-Plugin.
- Render
presentationnaar Block Kit. - Verwijder agent- en CLI-invoer
blocks.
- Render tekst, context en scheidingslijnen als tekst.
- Render acties en selectie als inline toetsenborden wanneer geconfigureerd en toegestaan voor het doeloppervlak.
- Gebruik tekstfallback wanneer inline knoppen zijn uitgeschakeld.
- Verplaats ACP-topicvastpinnen naar
delivery.pin.
- Render acties als interactieve knoppen waar geconfigureerd.
- Render andere blokken als tekstfallback.
- Render
presentationnaar Adaptive Cards. - Behoud handmatige acties voor vastpinnen, losmaken en pins weergeven.
- Implementeer eventueel
pinDeliveredMessageals Graph-ondersteuning betrouwbaar is voor het doelgesprek.
- Render
presentationnaar interactieve kaarten. - Behoud handmatige acties voor vastpinnen, losmaken en pins weergeven.
- Implementeer eventueel
pinDeliveredMessagevoor het vastpinnen van verzonden berichten als API-gedrag betrouwbaar is.
- Render
presentationwaar mogelijk naar Flex- of templateberichten. - Val terug op tekst voor niet-ondersteunde blokken.
- Verwijder LINE-UI-payloads uit
channelData.
- Converteer presentatie naar tekst met conservatieve opmaak.
Refactorstappen
- Pas de Discord-releasefix opnieuw toe die
ui-colors.tssplitst van door Carbon ondersteunde UI enDiscordUiContainerverwijdert uitextensions/discord/src/channel.ts. - Voeg
presentationendeliverytoe aanReplyPayload, normalisatie van uitgaande payloads, afleveringssamenvattingen en hook-payloads. - Voeg
MessagePresentation-schema en parserhelpers toe in een smal SDK/runtime-subpad. - Vervang bericht-capabilities
buttons,cards,componentsenblocksdoor semantische presentatie-capabilities. - Voeg runtime-uitgaande adapter-hooks toe voor presentatierendering en afleveringsvastpinnen.
- Vervang cross-context componentconstructie door
buildCrossContextPresentation. - Verwijder
src/infra/outbound/channel-adapters.tsen verwijderbuildCrossContextComponentsuit kanaal-Plugin-typen. - Wijzig
maybeApplyCrossContextMarkerzodat dezepresentationkoppelt in plaats van native parameters. - Werk plugin-dispatch-verzendpaden bij zodat ze alleen semantische presentatie en afleveringsmetadata gebruiken.
- Verwijder native payload-parameters voor agent en CLI:
components,blocks,buttonsencard. - Verwijder SDK-helpers die native berichttool-schema’s maken en vervang ze door presentatieschemahelpers.
- Verwijder UI/native enveloppen uit
channelData; behoud alleen transportmetadata totdat elk resterend veld is beoordeeld. - Migreer Discord-, Slack-, Telegram-, Mattermost-, MS Teams-, Feishu- en LINE-renderers.
- Werk documentatie bij voor bericht-CLI, kanaalpagina’s, Plugin-SDK en capability-cookbook.
- Voer import-fanoutprofilering uit voor Discord en getroffen kanaal-entrypoints.
channelData-transportenveloppen. Stap 15 blijft vervolgvalidatie als we gekwantificeerde import-fanoutcijfers willen naast de type-/testgate.
Tests
Toevoegen of bijwerken:- Tests voor presentatienormalisatie.
- Tests voor automatische presentatiedegradatie bij niet-ondersteunde blokken.
- Cross-context markertests voor plugin-dispatch en kernafleveringspaden.
- Kanaalrender-matrixtests voor Discord, Slack, Telegram, Mattermost, MS Teams, Feishu, LINE en tekstfallback.
- Tests voor berichttool-schema’s die bewijzen dat native velden verdwenen zijn.
- CLI-tests die bewijzen dat native flags verdwenen zijn.
- Regressietest voor importluiheid van Discord-entrypoint rond Carbon.
- Tests voor afleveringsvastpinnen voor Telegram en generieke fallback.
Open vragen
- Moet
delivery.pinin de eerste pass worden geïmplementeerd voor Discord, Slack, MS Teams en Feishu, of eerst alleen voor Telegram? - Moet
deliveryuiteindelijk bestaande velden opnemen zoalsreplyToId,replyToCurrent,silentenaudioAsVoice, of gericht blijven op gedrag na verzending? - Moet presentatie direct afbeeldingen of bestandsverwijzingen ondersteunen, of moet media voorlopig gescheiden blijven van UI-layout?