Status
Implementiert für den gemeinsamen Agenten, die CLI, Plugin-Fähigkeiten und ausgehende Zustellungsoberflächen:ReplyPayload.presentationüberträgt die semantische Nachrichten-UI.ReplyPayload.delivery.pinüberträgt Anfragen zum Anheften gesendeter Nachrichten.- Gemeinsame Nachrichtenaktionen stellen
presentation,deliveryundpinanstelle der Provider-nativencomponents,blocks,buttonsodercardbereit. - Der Kern rendert die Darstellung über vom Plugin deklarierte ausgehende Fähigkeiten oder stuft sie automatisch herab.
- Die Renderer von Discord, Slack, Telegram, Mattermost, MS Teams und Feishu verwenden den generischen Vertrag.
- Der Control-Plane-Code des Discord-Kanals importiert keine Carbon-basierten UI-Container mehr.
Problem
Die Kanal-UI ist derzeit auf mehrere inkompatible Oberflächen verteilt:- Der Kern besitzt über
buildCrossContextComponentseinen Discord-förmigen kontextübergreifenden Renderer-Hook. - Discord
channel.tskann überDiscordUiContainerdie native Carbon-UI importieren, wodurch UI-Laufzeitabhängigkeiten in die Control Plane des Kanal-Plugins gelangen. - Der Agent und die CLI stellen native Payload-Ausweichmöglichkeiten bereit, etwa Discord
components, Slackblocks, Telegram oder Mattermostbuttonssowie Teams oder Feishucard. ReplyPayload.channelDataüberträgt sowohl Transporthinweise als auch native UI-Umschläge.- Das generische Modell
interactiveist vorhanden, aber weniger umfangreich als die bereits von Discord, Slack, Teams, Feishu, LINE, Telegram und Mattermost verwendeten komplexeren Layouts.
Ziele
- Der Kern bestimmt anhand deklarierter Fähigkeiten die beste semantische Darstellung für eine Nachricht.
- Erweiterungen deklarieren Fähigkeiten und rendern die semantische Darstellung in native Transport-Payloads.
- Die Web-Control-UI bleibt von der nativen Chat-UI getrennt.
- Native Kanal-Payloads werden nicht über die gemeinsame Nachrichtenoberfläche des Agenten oder der CLI bereitgestellt.
- Nicht unterstützte Darstellungsfunktionen werden automatisch auf die bestmögliche Textdarstellung herabgestuft.
- Zustellungsverhalten wie das Anheften einer gesendeten Nachricht besteht aus generischen Zustellungsmetadaten und ist keine Darstellung.
Nichtziele
- Kein Abwärtskompatibilitäts-Shim für
buildCrossContextComponents. - Keine öffentlichen nativen Ausweichmöglichkeiten für
components,blocks,buttonsodercard. - Keine Kernimporte nativer UI-Bibliotheken von Kanälen.
- Keine Provider-spezifischen SDK-Schnittstellen für gebündelte Kanäle.
Zielmodell
Fügen SieReplyPayload ein kerneigenes Feld presentation hinzu.
interactive wird während der Migration zu einer Teilmenge von presentation:
- Der Textblock
interactivewirdpresentation.blocks[].type = "text"zugeordnet. - Der Schaltflächenblock
interactivewirdpresentation.blocks[].type = "buttons"zugeordnet. - Der Auswahlblock
interactivewirdpresentation.blocks[].type = "select"zugeordnet.
presentation; interactive bleibt ein interner Legacy-Helfer für das Parsen und Rendern bestehender Antwortproduzenten.
Die öffentliche, an Produzenten gerichtete API behandelt interactive als veraltet. Die Laufzeitunterstützung
bleibt bestehen, damit vorhandene Genehmigungshelfer und ältere Plugins weiterhin
funktionieren, während neuer Code presentation ausgibt.
Zustellungsmetadaten
Fügen Sie für Sendeverhalten, das nicht zur UI gehört, ein kerneigenes Felddelivery hinzu.
delivery.pin = truebedeutet, dass die erste erfolgreich zugestellte Nachricht angeheftet wird.notifyverwendet standardmäßigfalse.requiredverwendet standardmäßigfalse; bei nicht unterstützten Kanälen oder fehlgeschlagenem Anheften wird die Zustellung automatisch fortgesetzt.- Manuelle Nachrichtenaktionen
pin,unpinundlist-pinsbleiben für vorhandene Nachrichten bestehen.
channelData.telegram.pin = true nach delivery.pin = true verschoben werden.
Vertrag für Laufzeitfähigkeiten
Fügen Sie dem ausgehenden Laufzeitadapter Hooks für das Rendern der Darstellung und die Zustellung hinzu, nicht dem Control-Plane-Kanal-Plugin.- Zielkanal und Laufzeitadapter auflösen.
- Darstellungsfähigkeiten abfragen.
- Nicht unterstützte Blöcke herabstufen und vor dem Rendern generische Fähigkeitsgrenzen anwenden.
renderPresentationaufrufen.- Wenn kein Renderer vorhanden ist, die Darstellung in eine Textausweichdarstellung umwandeln.
- Nach erfolgreichem Senden
pinDeliveredMessageaufrufen, wenndelivery.pinangefordert wird und unterstützt ist.
Kanalzuordnung
Discord:presentationin reinen Laufzeitmodulen als Components v2 und Carbon-Container rendern.- Hilfsfunktionen für Akzentfarben in schlanken Modulen belassen.
- Importe von
DiscordUiContaineraus dem Control-Plane-Code des Kanal-Plugins entfernen.
presentationals Block Kit rendern.- Eingabe von
blocksaus Agent und CLI entfernen.
- Text, Kontext und Trennlinien als Text rendern.
- Aktionen und Auswahl als Inline-Tastaturen rendern, sofern sie konfiguriert und für die Zieloberfläche zulässig sind.
- Die Textausweichdarstellung verwenden, wenn Inline-Schaltflächen deaktiviert sind.
- Das Anheften von ACP-Themen nach
delivery.pinverschieben.
- Aktionen als interaktive Schaltflächen rendern, sofern konfiguriert.
- Andere Blöcke als Textausweichdarstellung rendern.
presentationals Adaptive Cards rendern.- Manuelle Aktionen zum Anheften, Lösen und Auflisten angehefteter Nachrichten beibehalten.
pinDeliveredMessageoptional implementieren, wenn die Graph-Unterstützung für die Zielkonversation zuverlässig ist.
presentationals interaktive Karten rendern.- Manuelle Aktionen zum Anheften, Lösen und Auflisten angehefteter Nachrichten beibehalten.
pinDeliveredMessageoptional für das Anheften gesendeter Nachrichten implementieren, wenn das API-Verhalten zuverlässig ist.
presentationnach Möglichkeit als Flex- oder Vorlagennachrichten rendern.- Bei nicht unterstützten Blöcken auf Text zurückgreifen.
- LINE-UI-Payloads aus
channelDataentfernen.
- Die Darstellung mit zurückhaltender Formatierung in Text umwandeln.
Refaktorierungsschritte
- Den Discord-Release-Fix erneut anwenden, der
ui-colors.tsvon der Carbon-basierten UI trennt undDiscordUiContainerausextensions/discord/src/channel.tsentfernt. presentationunddeliveryzuReplyPayload, der Normalisierung ausgehender Payloads, Zustellungszusammenfassungen und Hook-Payloads hinzufügen.- Schema- und Parser-Hilfsfunktionen für
MessagePresentationin einem eng begrenzten SDK-/Laufzeit-Unterpfad hinzufügen. - Die Nachrichtenfähigkeiten
buttons,cards,componentsundblocksdurch semantische Darstellungsfähigkeiten ersetzen. - Hooks zum Rendern der Darstellung und zum Anheften bei der Zustellung zum ausgehenden Laufzeitadapter hinzufügen.
- Die kontextübergreifende Komponentenkonstruktion durch
buildCrossContextPresentationersetzen. src/infra/outbound/channel-adapters.tslöschen undbuildCrossContextComponentsaus den Typen des Kanal-Plugins entfernen.maybeApplyCrossContextMarkerso ändern, dasspresentationanstelle nativer Parameter angehängt wird.- Die Sendepfade der Plugin-Verteilung so aktualisieren, dass sie ausschließlich semantische Darstellung und Zustellungsmetadaten verarbeiten.
- Native Payload-Parameter aus Agent und CLI entfernen:
components,blocks,buttonsundcard. - SDK-Hilfsfunktionen entfernen, die native Schemas für Nachrichtenwerkzeuge erstellen, und sie durch Hilfsfunktionen für Darstellungsschemas ersetzen.
- UI-/native Umschläge aus
channelDataentfernen; ausschließlich Transportmetadaten beibehalten, bis jedes verbleibende Feld überprüft wurde. - Die Renderer für Discord, Slack, Telegram, Mattermost, MS Teams, Feishu und LINE migrieren.
- Die Dokumentation für Nachrichten-CLI, Kanalseiten, Plugin-SDK und das Fähigkeits-Cookbook aktualisieren.
- Import-Fanout-Profiling für Discord und betroffene Kanaleinstiegspunkte ausführen.
channelData-Transportumschläge. Schritt 15 bleibt eine nachgelagerte Validierung, falls quantifizierte Import-Fanout-Zahlen über das Typ-/Test-Gate hinaus benötigt werden.
Tests
Hinzufügen oder aktualisieren:- Tests zur Darstellungsnormalisierung.
- Tests zur automatischen Herabstufung der Darstellung bei nicht unterstützten Blöcken.
- Tests für kontextübergreifende Markierungen bei Plugin-Verteilung und Kernzustellungspfaden.
- Tests der Kanal-Render-Matrix für Discord, Slack, Telegram, Mattermost, MS Teams, Feishu, LINE und die Textausweichdarstellung.
- Tests des Nachrichtenwerkzeug-Schemas, die belegen, dass native Felder entfernt wurden.
- CLI-Tests, die belegen, dass native Flags entfernt wurden.
- Regressionstest für die verzögerte Importinitialisierung des Discord-Einstiegspunkts unter Einbeziehung von Carbon.
- Tests zum Anheften bei der Zustellung für Telegram und den generischen Fallback.
Offene Fragen
- Sollte
delivery.pinim ersten Durchlauf für Discord, Slack, MS Teams und Feishu implementiert werden oder zunächst nur für Telegram? - Sollte
deliverykünftig vorhandene Felder wiereplyToId,replyToCurrent,silentundaudioAsVoiceaufnehmen oder weiterhin auf das Verhalten nach dem Senden ausgerichtet bleiben? - Sollte die Darstellung Bilder oder Dateiverweise direkt unterstützen oder sollten Medien vorerst vom UI-Layout getrennt bleiben?