Documentation Index
Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Status
Implementiert für die Oberflächen des gemeinsamen Agents, der CLI, der Plugin-Fähigkeiten und der ausgehenden Zustellung:ReplyPayload.presentationtransportiert semantische Nachrichten-UI.ReplyPayload.delivery.pintransportiert Anforderungen zum Anheften gesendeter Nachrichten.- Gemeinsame Nachrichtenaktionen legen
presentation,deliveryundpinoffen statt Provider-nativercomponents,blocks,buttonsodercard. - Der Core rendert oder reduziert Presentation automatisch anhand der vom Plugin deklarierten ausgehenden Fähigkeiten.
- Renderer für Discord, Slack, Telegram, Mattermost, MS Teams und Feishu nutzen den generischen Vertrag.
- Der Control-Plane-Code des Discord-Kanals importiert keine Carbon-gestützten UI-Container mehr.
Problem
Kanal-UI ist derzeit auf mehrere inkompatible Oberflächen verteilt:- Der Core besitzt über
buildCrossContextComponentseinen Discord-förmigen Renderer-Hook für kontextübergreifende Nutzung. - Discord
channel.tskann native Carbon-UI überDiscordUiContainerimportieren, wodurch UI-Laufzeitabhängigkeiten in die Control Plane des Kanal-Plugins gezogen werden. - Agent und CLI legen native Payload-Ausweichmechanismen offen, etwa Discord
components, Slackblocks, Telegram- oder Mattermost-buttonssowie Teams- oder Feishu-card. ReplyPayload.channelDatatransportiert sowohl Transporthinweise als auch native UI-Umschläge.- Das generische
interactive-Modell existiert, ist aber enger als die reicheren Layouts, die bereits von Discord, Slack, Teams, Feishu, LINE, Telegram und Mattermost verwendet werden.
Ziele
- Der Core entscheidet anhand deklarierter Fähigkeiten über die beste semantische Presentation für eine Nachricht.
- Erweiterungen deklarieren Fähigkeiten und rendern semantische Presentation in native Transport-Payloads.
- Die 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 Presentation-Funktionen werden automatisch auf die beste Textdarstellung reduziert.
- Zustellverhalten wie das Anheften einer gesendeten Nachricht ist generische Zustellmetadaten, nicht Presentation.
Nichtziele
- Kein Abwärtskompatibilitäts-Shim für
buildCrossContextComponents. - Keine öffentlichen nativen Ausweichmechanismen für
components,blocks,buttonsodercard. - Keine Core-Importe von kanalnativen UI-Bibliotheken.
- Keine Provider-spezifischen SDK-Schnittstellen für gebündelte Kanäle.
Zielmodell
Fügen SieReplyPayload ein Core-eigenes Feld presentation hinzu.
interactive wird während der Migration zu einer Teilmenge von presentation:
- Der
interactive-Textblock wird aufpresentation.blocks[].type = "text"abgebildet. - Der
interactive-Button-Block wird aufpresentation.blocks[].type = "buttons"abgebildet. - Der
interactive-Select-Block wird aufpresentation.blocks[].type = "select"abgebildet.
presentation; interactive bleibt ein interner Legacy-Parser- und Rendering-Helfer für bestehende Antwort-Produzenten.
Zustellmetadaten
Fügen Sie ein Core-eigenes 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 reduziert, indem die Zustellung fortgesetzt wird.- Manuelle Nachrichtenaktionen
pin,unpinundlist-pinsbleiben für bestehende Nachrichten erhalten.
channelData.telegram.pin = true zu delivery.pin = true verschoben werden.
Laufzeit-Fähigkeitsvertrag
Fügen Sie Presentation- und Zustell-Render-Hooks zum ausgehenden Laufzeitadapter hinzu, nicht zum Control-Plane-Kanal-Plugin.- Zielkanal und Laufzeitadapter auflösen.
- Presentation-Fähigkeiten abfragen.
- Nicht unterstützte Blöcke vor dem Rendering reduzieren.
renderPresentationaufrufen.- Wenn kein Renderer vorhanden ist, Presentation in einen Text-Fallback umwandeln.
- Nach erfolgreichem Senden
pinDeliveredMessageaufrufen, wenndelivery.pinangefordert und unterstützt wird.
Kanalzuordnung
Discord:presentationin Runtime-only-Modulen zu Komponenten v2 und Carbon-Containern rendern.- Akzentfarben-Helfer in leichten Modulen behalten.
DiscordUiContainer-Importe aus dem Control-Plane-Code des Kanal-Plugins entfernen.
presentationzu Block Kit rendern.- Agent- und CLI-
blocks-Eingabe entfernen.
- Text, Kontext und Trenner als Text rendern.
- Aktionen und Select als Inline-Keyboards rendern, wenn sie konfiguriert und für die Zieloberfläche erlaubt sind.
- Text-Fallback verwenden, wenn Inline-Buttons deaktiviert sind.
- ACP-Themen-Anheftung zu
delivery.pinverschieben.
- Aktionen als interaktive Buttons rendern, sofern konfiguriert.
- Andere Blöcke als Text-Fallback rendern.
presentationzu Adaptive Cards rendern.- Manuelle Aktionen zum Anheften, Lösen und Auflisten angehefteter Nachrichten behalten.
- Optional
pinDeliveredMessageimplementieren, wenn Graph-Unterstützung für die Zielunterhaltung zuverlässig ist.
presentationzu interaktiven Karten rendern.- Manuelle Aktionen zum Anheften, Lösen und Auflisten angehefteter Nachrichten behalten.
- Optional
pinDeliveredMessagefür das Anheften gesendeter Nachrichten implementieren, wenn das API-Verhalten zuverlässig ist.
presentationnach Möglichkeit zu Flex- oder Vorlagennachrichten rendern.- Für nicht unterstützte Blöcke auf Text zurückfallen.
- LINE-UI-Payloads aus
channelDataentfernen.
- Presentation mit konservativer Formatierung in Text umwandeln.
Refaktorierungsschritte
- Den Discord-Release-Fix erneut anwenden, der
ui-colors.tsvon Carbon-gestützter UI trennt undDiscordUiContainerausextensions/discord/src/channel.tsentfernt. presentationunddeliveryzuReplyPayload, ausgehender Payload-Normalisierung, Zustellzusammenfassungen und Hook-Payloads hinzufügen.MessagePresentation-Schema und Parser-Helfer in einem schmalen SDK-/Runtime-Unterpfad hinzufügen.- Nachrichtenfähigkeiten
buttons,cards,componentsundblocksdurch semantische Presentation-Fähigkeiten ersetzen. - Hooks für ausgehende Runtime-Adapter für Presentation-Rendering und Zustell-Anheftung hinzufügen.
- Kontexübergreifende Komponentenkonstruktion durch
buildCrossContextPresentationersetzen. src/infra/outbound/channel-adapters.tslöschen undbuildCrossContextComponentsaus Kanal-Plugin-Typen entfernen.maybeApplyCrossContextMarkerso ändern, dasspresentationstatt nativer Parameter angehängt wird.- Sendepfade von Plugin-Dispatch aktualisieren, sodass sie nur semantische Presentation und Zustellmetadaten verwenden.
- Native Payload-Parameter aus Agent und CLI entfernen:
components,blocks,buttonsundcard. - SDK-Helfer entfernen, die native Nachrichtenwerkzeug-Schemas erstellen, und durch Presentation-Schema-Helfer ersetzen.
- UI-/native Umschläge aus
channelDataentfernen; nur Transportmetadaten behalten, bis jedes verbleibende Feld überprüft wurde. - Renderer für Discord, Slack, Telegram, Mattermost, MS Teams, Feishu und LINE migrieren.
- Docs für Nachrichten-CLI, Kanalseiten, Plugin-SDK und Fähigkeiten-Cookbook aktualisieren.
- Import-Fanout-Profiling für Discord und betroffene Kanal-Einstiegspunkte ausführen.
channelData-Transportumschläge. Schritt 15 bleibt eine Folgevalidierung, falls wir quantifizierte Import-Fanout-Zahlen über das Typ-/Test-Gate hinaus wünschen.
Tests
Hinzufügen oder aktualisieren:- Presentation-Normalisierungstests.
- Presentation-Tests für automatische Reduktion nicht unterstützter Blöcke.
- Kontexübergreifende Marker-Tests für Plugin-Dispatch- und Core-Zustellpfade.
- Kanal-Render-Matrix-Tests 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-Regressionsabdeckung für Import-Laziness mit Carbon.
- Zustell-Anheftungstests für Telegram und generischen Fallback.
Offene Fragen
- Soll
delivery.pinim ersten Durchlauf für Discord, Slack, MS Teams und Feishu implementiert werden, oder zunächst nur für Telegram? - Soll
deliverykünftig bestehende Felder wiereplyToId,replyToCurrent,silentundaudioAsVoiceaufnehmen, oder auf Verhalten nach dem Senden fokussiert bleiben? - Soll Presentation Bilder oder Dateireferenzen direkt unterstützen, oder sollen Medien vorerst getrennt vom UI-Layout bleiben?