Status
Implementiert für den gemeinsamen Agent, die CLI, Plugin-Fähigkeiten und Oberflächen für ausgehende Zustellung:ReplyPayload.presentationträgt semantische Nachrichten-UI.ReplyPayload.delivery.pinträgt Anforderungen zum Anheften gesendeter Nachrichten.- Gemeinsame Nachrichtenaktionen stellen
presentation,deliveryundpinbereit statt Provider-nativencomponents,blocks,buttonsodercard. - Der Kern rendert Präsentation oder stuft sie automatisch über von Plugins deklarierte ausgehende Fähigkeiten herab.
- Discord-, Slack-, Telegram-, Mattermost-, MS Teams- und Feishu-Renderer verwenden den generischen Vertrag.
- Code der Discord-Kanal-Steuerungsebene importiert keine Carbon-basierten UI-Container mehr.
Problem
Kanal-UI ist derzeit auf mehrere inkompatible Oberflächen verteilt:- Der Kern besitzt über
buildCrossContextComponentseinen Discord-förmigen Renderer-Hook für kontextübergreifende Nutzung. - Discord
channel.tskann native Carbon-UI überDiscordUiContainerimportieren, wodurch Laufzeit-UI-Abhängigkeiten in die Steuerungsebene des Kanal-Plugins gezogen werden. - Der Agent und die CLI stellen native Payload-Ausweichpfade wie Discord
components, Slackblocks, Telegram- oder Mattermost-buttonssowie Teams- oder Feishu-cardbereit. ReplyPayload.channelDataträgt sowohl Transporthinweise als auch native UI-Umschläge.- Das generische
interactive-Modell existiert, ist aber schmaler als die reicheren Layouts, die bereits von Discord, Slack, Teams, Feishu, LINE, Telegram und Mattermost verwendet werden.
Ziele
- Der Kern entscheidet anhand deklarierter Fähigkeiten über die beste semantische Präsentation für eine Nachricht.
- Erweiterungen deklarieren Fähigkeiten und rendern semantische Präsentation in native Transport-Payloads.
- Web Control UI bleibt von nativer Chat-UI getrennt.
- Native Kanal-Payloads werden nicht über die gemeinsame Nachrichtenoberfläche von Agent oder CLI offengelegt.
- Nicht unterstützte Präsentationsfunktionen werden automatisch zur besten Textdarstellung herabgestuft.
- Zustellverhalten wie das Anheften einer gesendeten Nachricht ist generische Zustellmetadaten, keine Präsentation.
Nicht-Ziele
- Kein Abwärtskompatibilitäts-Shim für
buildCrossContextComponents. - Keine öffentlichen nativen Ausweichpfade für
components,blocks,buttonsodercard. - Keine Kernimporte von kanalnativen UI-Bibliotheken.
- Keine Provider-spezifischen SDK-Schnittstellen für gebündelte Kanäle.
Zielmodell
Fügen Sie ein kernverwaltetes Feldpresentation zu ReplyPayload hinzu.
interactive wird während der Migration zu einer Teilmenge von presentation:
interactive-Textblock wird aufpresentation.blocks[].type = "text"abgebildet.interactive-Buttonblock wird aufpresentation.blocks[].type = "buttons"abgebildet.interactive-Selectblock wird aufpresentation.blocks[].type = "select"abgebildet.
presentation; interactive bleibt ein interner Legacy-Parser-/Rendering-Helfer für bestehende Antwortproduzenten.
Die öffentliche, produzentenorientierte API behandelt interactive als veraltet. Laufzeitunterstützung
bleibt erhalten, damit bestehende Genehmigungshelfer und ältere Plugins weiter
funktionieren, während neuer Code presentation ausgibt.
Zustellmetadaten
Fügen Sie ein kernverwaltetes Felddelivery für Sendeverhalten hinzu, das keine UI ist.
delivery.pin = truebedeutet, die erste erfolgreich zugestellte Nachricht anzuheften.notifyist standardmäßigfalse.requiredist standardmäßigfalse; nicht unterstützte Kanäle oder fehlgeschlagenes Anheften werden automatisch herabgestuft, indem die Zustellung fortgesetzt wird.- Manuelle Nachrichtenaktionen
pin,unpinundlist-pinsbleiben für bestehende Nachrichten erhalten.
channelData.telegram.pin = true zu delivery.pin = true wechseln.
Laufzeit-Fähigkeitsvertrag
Fügen Sie Präsentations- und Zustell-Renderer-Hooks zum ausgehenden Laufzeitadapter hinzu, nicht zum Kanal-Plugin der Steuerungsebene.- Zielkanal und Laufzeitadapter auflösen.
- Präsentationsfähigkeiten abfragen.
- Nicht unterstützte Blöcke herabstufen und generische Fähigkeitsgrenzen vor dem Rendering anwenden.
renderPresentationaufrufen.- Wenn kein Renderer existiert, Präsentation in Text-Fallback umwandeln.
- Nach erfolgreichem Senden
pinDeliveredMessageaufrufen, wenndelivery.pinangefordert und unterstützt wird.
Kanalzuordnung
Discord:presentationin Komponenten v2 und Carbon-Container in Nur-Laufzeit-Modulen rendern.- Akzentfarben-Helfer in leichten Modulen behalten.
DiscordUiContainer-Importe aus Code der Kanal-Plugin-Steuerungsebene entfernen.
presentationin Block Kit rendern.- Agent- und CLI-
blocks-Eingabe entfernen.
- Text, Kontext und Trenner als Text rendern.
- Aktionen und Select als Inline-Tastaturen rendern, wenn sie für die Zieloberfläche konfiguriert und erlaubt sind.
- Text-Fallback verwenden, wenn Inline-Buttons deaktiviert sind.
- ACP-Themenanheftung zu
delivery.pinverschieben.
- Aktionen als interaktive Buttons rendern, sofern konfiguriert.
- Andere Blöcke als Text-Fallback rendern.
presentationin Adaptive Cards rendern.- Manuelle Aktionen zum Anheften, Lösen und Auflisten von Pins behalten.
- Optional
pinDeliveredMessageimplementieren, wenn Graph-Unterstützung für die Zielunterhaltung zuverlässig ist.
presentationin interaktive Karten rendern.- Manuelle Aktionen zum Anheften, Lösen und Auflisten von Pins behalten.
- Optional
pinDeliveredMessagefür das Anheften gesendeter Nachrichten implementieren, wenn das API-Verhalten zuverlässig ist.
presentationnach Möglichkeit in Flex- oder Vorlagennachrichten rendern.- Für nicht unterstützte Blöcke auf Text zurückfallen.
- LINE-UI-Payloads aus
channelDataentfernen.
- Präsentation mit konservativer Formatierung in Text umwandeln.
Refaktorierungsschritte
- Wenden Sie den Discord-Release-Fix erneut an, der
ui-colors.tsvon Carbon-basierter UI trennt undDiscordUiContainerausextensions/discord/src/channel.tsentfernt. - Fügen Sie
presentationunddeliveryzuReplyPayload, der Normalisierung ausgehender Payloads, Zustellzusammenfassungen und Hook-Payloads hinzu. - Fügen Sie
MessagePresentation-Schema und Parser-Helfer in einem schmalen SDK-/Laufzeit-Unterpfad hinzu. - Ersetzen Sie Nachrichtenfähigkeiten
buttons,cards,componentsundblocksdurch semantische Präsentationsfähigkeiten. - Fügen Sie Hooks für Präsentations-Rendering und Zustellungsanheftung zum ausgehenden Laufzeitadapter hinzu.
- Ersetzen Sie die kontextübergreifende Komponentenerstellung durch
buildCrossContextPresentation. - Löschen Sie
src/infra/outbound/channel-adapters.tsund entfernen SiebuildCrossContextComponentsaus Kanal-Plugin-Typen. - Ändern Sie
maybeApplyCrossContextMarker, sodasspresentationstatt nativer Parameter angehängt wird. - Aktualisieren Sie Plugin-Dispatch-Sendepfade so, dass sie nur semantische Präsentation und Zustellmetadaten verwenden.
- Entfernen Sie native Payload-Parameter von Agent und CLI:
components,blocks,buttonsundcard. - Entfernen Sie SDK-Helfer, die native Nachrichtenwerkzeug-Schemas erstellen, und ersetzen Sie sie durch Präsentationsschema-Helfer.
- Entfernen Sie UI-/native Umschläge aus
channelData; behalten Sie nur Transportmetadaten, bis jedes verbleibende Feld geprüft wurde. - Migrieren Sie Discord-, Slack-, Telegram-, Mattermost-, MS Teams-, Feishu- und LINE-Renderer.
- Aktualisieren Sie Dokumentation für Nachrichten-CLI, Kanalseiten, Plugin-SDK und Fähigkeits-Cookbook.
- Führen Sie Import-Fanout-Profiling für Discord und betroffene Kanal-Einstiegspunkte aus.
channelData-Transportumschläge. Schritt 15 bleibt Folgevalidierung, falls wir quantifizierte Import-Fanout-Zahlen über das Typ-/Test-Gate hinaus wünschen.
Tests
Hinzufügen oder aktualisieren:- Tests für Präsentationsnormalisierung.
- Tests für automatische Herabstufung der Präsentation bei nicht unterstützten Blöcken.
- Tests für kontextübergreifende Marker für Plugin-Dispatch und Kernzustellungspfade.
- Kanal-Rendering-Matrixtests für Discord, Slack, Telegram, Mattermost, MS Teams, Feishu, LINE und Text-Fallback.
- Nachrichtenwerkzeug-Schematests, die belegen, dass native Felder entfernt sind.
- CLI-Tests, die belegen, dass native Flags entfernt sind.
- Discord-Einstiegspunkt-Regression für träge Importe mit Carbon-Abdeckung.
- Tests für Zustellungsanheftung mit Telegram und generischem Fallback.
Offene Fragen
- Sollte
delivery.pinim ersten Durchgang für Discord, Slack, MS Teams und Feishu implementiert werden oder zunächst nur für Telegram? - Sollte
deliverylangfristig bestehende Felder wiereplyToId,replyToCurrent,silentundaudioAsVoiceaufnehmen oder auf Verhalten nach dem Senden fokussiert bleiben? - Sollte Präsentation Bilder oder Dateireferenzen direkt unterstützen, oder sollten Medien vorerst getrennt vom UI-Layout bleiben?