Diese Seite ist der Zielentwurf, um verstreute Hilfsfunktionen für Channel-Turns, Reply-Dispatch, Preview-Streaming und ausgehende Zustellung durch einen dauerhaften Nachrichten-Lebenszyklus zu ersetzen. Die Kurzfassung: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.
- Die Kernprimitive sollten Empfangen und Senden sein, nicht Antworten.
- Eine Antwort ist nur eine Relation auf einer ausgehenden Nachricht.
- Ein Turn ist eine Erleichterung für die Verarbeitung eingehender Nachrichten, nicht der Besitzer der Zustellung.
- Senden muss kontextbasiert sein:
begin, rendern, Vorschau oder streamen, final senden, committen, fehlschlagen. - Empfangen muss ebenfalls kontextbasiert sein: normalisieren, deduplizieren, routen, aufzeichnen, dispatchen, Plattform-Ack, fehlschlagen.
- Das öffentliche Plugin-SDK sollte auf eine kleine Channel-Message-Oberfläche reduziert werden.
Probleme
Der aktuelle Channel-Stack ist aus mehreren berechtigten lokalen Anforderungen entstanden:- Einfache eingehende Adapter verwenden
runtime.channel.turn.run. - Umfangreiche Adapter verwenden
runtime.channel.turn.runPrepared. - Legacy-Hilfsfunktionen verwenden
dispatchInboundReplyWithBase,recordInboundSessionAndDispatchReply, Reply-Payload-Hilfsfunktionen, Reply-Chunking, Reply-Referenzen und ausgehende Runtime-Hilfsfunktionen. - Preview-Streaming lebt in Channel-spezifischen Dispatchern.
- Dauerhaftigkeit für finale Zustellung wird um bestehende Reply-Payload-Pfade herum hinzugefügt.
Ziele
- Ein Kern-Lebenszyklus für alle Pfade zum Empfangen und Senden von Channel-Nachrichten.
- Dauerhafte finale Sends standardmäßig im neuen Nachrichten-Lebenszyklus, nachdem ein Adapter replay-sicheres Verhalten deklariert.
- Gemeinsame Semantik für Vorschau, Bearbeitung, Stream, Finalisierung, Wiederholung, Wiederherstellung und Belege.
- Eine kleine Plugin-SDK-Oberfläche, die Drittanbieter-Plugins lernen und warten können.
- Kompatibilität für bestehende
channel.turn-Aufrufer während der Migration. - Klare Erweiterungspunkte für neue Channel-Fähigkeiten.
- Keine plattformspezifischen Zweige im Kern.
- Keine Token-Delta-Channel-Nachrichten. Channel-Streaming bleibt Nachrichten-Vorschau, Bearbeitung, Anhängen oder Zustellung abgeschlossener Blöcke.
- Strukturierte Metadaten mit OpenClaw-Ursprung für Betriebs-/Systemausgaben, damit sichtbare Gateway-Fehler nicht als neue Prompts in gemeinsam genutzte Räume mit aktivierten Bots zurückfließen.
Nichtziele
runtime.channel.turn.*in der ersten Phase nicht entfernen.- Nicht jeden Channel zu demselben nativen Transportverhalten zwingen.
- Den Kern nicht mit Telegram-Themen, nativen Slack-Streams, Matrix-Redactions, Feishu-Karten, QQ-Voice oder Teams-Aktivitäten vertraut machen.
- Nicht alle internen Migrationshilfen als stabile SDK-API veröffentlichen.
- Wiederholungen dürfen abgeschlossene, nicht idempotente Plattformoperationen nicht erneut abspielen.
Referenzmodell
Vercel Chat hat ein gutes öffentliches mentales Modell:ChatThreadChannelMessage- Adaptermethoden wie
postMessage,editMessage,deleteMessage,stream,startTypingund History-Abrufe - einen State-Adapter für Deduplizierung, Locks, Queues und Persistenz
- Dauerhafte ausgehende Send-Absichten vor direkten Transportaufrufen.
- Explizite Send-Kontexte mit Begin, Commit und Fail.
- Receive-Kontexte, die die Plattform-Ack-Richtlinie kennen.
- Belege, die einen Neustart überstehen und Bearbeitungen, Löschungen, Wiederherstellung und Unterdrückung von Duplikaten steuern können.
- Ein kleineres öffentliches SDK. Gebündelte Plugins können interne Runtime-Hilfsfunktionen verwenden, aber Drittanbieter-Plugins sollten eine kohärente Nachrichten-API sehen.
- Agent-spezifisches Verhalten: Sitzungen, Transkripte, Block-Streaming, Tool-Fortschritt, Genehmigungen, Medienanweisungen, stille Antworten und Gruppen-Erwähnungshistorie.
thread.post() reichen für OpenClaw nicht aus. Sie verbergen die
Transaktionsgrenze, die entscheidet, ob ein Send wiederherstellbar ist.
Kernmodell
Die neue Domäne sollte unter einem internen Kern-Namespace wiesrc/channels/message/* leben.
Sie hat vier Konzepte:
receive besitzt den eingehenden Lebenszyklus.
send besitzt den ausgehenden Lebenszyklus.
live besitzt Vorschau-, Bearbeitungs-, Fortschritts- und Stream-Zustand.
state besitzt dauerhafte Intent-Speicherung, Belege, Idempotenz, Wiederherstellung, Locks und
Deduplizierung.
Nachrichtenterminologie
Nachricht
Eine normalisierte Nachricht ist plattformneutral:Ziel
Das Ziel beschreibt, wo die Nachricht lebt:Relation
Reply ist eine Relation, kein API-Wurzelelement:Ursprung
Der Ursprung beschreibt, wer eine Nachricht erzeugt hat und wie OpenClaw Echos dieser Nachricht behandeln soll. Er ist von der Relation getrennt: Eine Nachricht kann eine Antwort an einen Benutzer sein und trotzdem von OpenClaw stammende Betriebsausgabe sein.allowBots aktiviert ist.
Beleg
Belege sind erstklassig:Receive-Kontext
Empfangen sollte kein bloßer Hilfsfunktionsaufruf sein. Der Kern benötigt einen Kontext, der Deduplizierung, Routing, Sitzungsaufzeichnung und Plattform-Ack-Richtlinie kennt.- Transport-Ack: teilt dem Plattform-Webhook oder Socket mit, dass OpenClaw den Event-Umschlag akzeptiert hat. Einige Plattformen verlangen dies vor dem Dispatch.
- Polling-Offset-Ack: setzt einen Cursor vor, sodass dasselbe Event nicht erneut abgerufen wird. Dies darf nicht über Arbeit hinaus voranschreiten, die nicht wiederhergestellt werden kann.
- Eingangsaufzeichnungs-Ack: bestätigt, dass OpenClaw genug eingehende Metadaten persistiert hat, um eine erneute Zustellung zu deduplizieren und zu routen.
- Benutzersichtbarer Beleg: optionales Lese-/Status-/Typing-Verhalten; niemals eine Dauerhaftigkeitsgrenze.
ReceiveAckPolicy steuert nur Transport- oder Polling-Bestätigung. Sie darf
nicht für Lesebestätigungen oder Statusreaktionen wiederverwendet werden.
Vor der Bot-Autorisierung muss Receive die gemeinsame OpenClaw-Echo-Richtlinie anwenden,
wenn der Channel Nachrichtenursprungs-Metadaten decodieren kann:
allowBots-Autorisierung.
Die Ack-Richtlinie ist explizit:
getUpdates-Abruf-Offset wird weiterhin von
der Polling-Bibliothek gesteuert, daher ist der verbleibende tiefere Eingriff eine vollständig dauerhafte Polling-
Quelle, falls wir plattformseitige erneute Zustellung über OpenClaws Neustart-
Wasserzeichen hinaus benötigen. Webhook-Plattformen benötigen eventuell sofortiges HTTP-Ack, aber sie benötigen trotzdem
eingehende Deduplizierung und dauerhafte ausgehende Send-Intents, weil Webhooks erneut zustellen können.
Send-Kontext
Senden ist ebenfalls kontextbasiert:unknown_after_send fortgesetzt werden, nicht blind erneut abgespielt werden. Channels
ohne Abgleich können At-least-once-Replay nur wählen, wenn doppelt sichtbare
Nachrichten ein akzeptabler, dokumentierter Kompromiss für diesen Channel und diese Beziehung sind.
Die aktuelle SDK-Abgleichsbrücke erfordert, dass der Adapter
reconcileUnknownSend deklariert, und fordert dann durableFinal.reconcileUnknownSend auf,
einen unbekannten Eintrag als sent, not_sent oder unresolved zu
klassifizieren; nur not_sent erlaubt Replay, und nicht aufgelöste Einträge bleiben terminal oder wiederholen nur die
Abgleichsprüfung.
Die Dauerhaftigkeitsrichtlinie muss explizit sein:
required bedeutet, dass Core geschlossen fehlschlagen muss, wenn es den dauerhaften Intent nicht schreiben kann.
best_effort kann durchlaufen, wenn Persistenz nicht verfügbar ist. disabled behält
das alte direkte Sendeverhalten bei. Während der Migration verwenden Legacy-Wrapper und öffentliche
Kompatibilitäts-Hilfsfunktionen standardmäßig disabled; sie dürfen required nicht daraus ableiten,
dass ein Channel einen generischen ausgehenden Adapter hat.
Sendekontexte besitzen außerdem Channel-lokale Effekte nach dem Senden. Eine Migration ist nicht sicher,
wenn dauerhafte Zustellung lokales Verhalten umgeht, das zuvor an den
direkten Sendepfad des Channels angehängt war. Beispiele sind Caches zur Unterdrückung von Selbst-Echos,
Marker für Thread-Teilnahme, native Bearbeitungsanker, Rendering von Modellsignaturen
und plattformspezifische Schutzmechanismen gegen Duplikate. Diese Effekte müssen entweder in den
Sende-Adapter, den Render-Adapter oder einen benannten Sendekontext-Hook verschoben werden, bevor dieser
Channel dauerhafte generische Endzustellung aktivieren kann.
Sende-Hilfsfunktionen müssen Receipts bis zu ihrem Aufrufer zurückgeben. Dauerhafte
Wrapper dürfen Nachrichten-IDs nicht verschlucken oder ein Channel-Zustellergebnis durch
undefined ersetzen; gepufferte Dispatcher verwenden diese IDs für Thread-Anker, spätere Bearbeitungen,
Preview-Finalisierung und Duplikatunterdrückung.
Fallback-Sends arbeiten mit Batches, nicht mit einzelnen Payloads. Umschreibungen für stille Antworten,
Medien-Fallback, Karten-Fallback und Chunk-Projektion können alle mehr als
eine zustellbare Nachricht erzeugen, daher muss ein Sendekontext entweder den gesamten
projizierten Batch zustellen oder explizit dokumentieren, warum nur ein Payload gültig ist.
unknown_after_send markieren, bis der Adapter ihn abgleicht.
Live-Kontext
Preview-, Bearbeitungs-, Fortschritts- und Stream-Verhalten sollten ein einziger Opt-in-Lebenszyklus sein.- Telegram-Senden plus Bearbeitungs-Preview, mit frischem Finale nach veraltetem Preview-Alter.
- Discord-Senden plus Bearbeitungs-Preview, Abbruch bei Medien/Fehler/expliziter Antwort.
- Nativer Slack-Stream oder Entwurfs-Preview je nach Thread-Form.
- Finalisierung von Mattermost-Entwurfsbeiträgen.
- Finalisierung von Matrix-Entwurfsereignissen oder Redaktion bei Abweichung.
- Nativer Teams-Fortschrittsstream.
- QQ-Bot-Stream oder akkumulierter Fallback.
Adapter-Oberfläche
Das öffentliche SDK-Ziel sollte ein einzelner Unterpfad sein:origin.decode OpenClaw-Ursprungsmetadaten zurückgibt. Der Empfangs-Adapter
liefert Plattformfakten wie Bot-Autor und Raumform; Core besitzt die Drop-
Entscheidung und Reihenfolge, damit Channels Textfilter nicht erneut implementieren.
Ursprungs-Adapter:
MessageOrigin. Channels übersetzen es nur in native
Transportmetadaten und zurück. Slack ordnet dies chat.postMessage({ metadata }) und
eingehendem message.metadata zu; Matrix kann es zusätzlichen Ereignisinhalten zuordnen; Channels
ohne native Metadaten können eine Receipt-/Outbound-Registry verwenden, wenn dies die
beste verfügbare Annäherung ist.
Capabilities:
Reduzierung der öffentlichen SDK-Oberfläche
Die neue öffentliche Oberfläche sollte diese konzeptionellen Bereiche aufnehmen oder als veraltet markieren:reply-runtimereply-dispatch-runtimereply-referencereply-chunkingreply-payloadinbound-reply-dispatchchannel-reply-pipeline- die meisten öffentlichen Verwendungen von
outbound-runtime - Ad-hoc-Hilfsfunktionen für den Entwurfsstream-Lebenszyklus
plugin-sdk/channel-message führen, sobald es existiert.
Beziehung zum Channel-Turn
runtime.channel.turn.* sollte während der Migration bestehen bleiben.
Es sollte zu einem Kompatibilitäts-Adapter werden:
channel.turn.runPrepared sollte zunächst ebenfalls bestehen bleiben:
channel.turn als veraltet markiert werden. Es sollte nicht entfernt werden, bevor es einen
veröffentlichten SDK-Migrationspfad und Vertragstests gibt, die belegen, dass alte Plugins weiterhin funktionieren
oder mit einem klaren Versionsfehler fehlschlagen.
Kompatibilitäts-Leitplanken
Während der Migration ist generische dauerhafte Zustellung Opt-in für jeden Channel, dessen bestehender Zustell-Callback über „diesen Payload senden“ hinausgehende Seiteneffekte hat. Legacy-Einstiegspunkte sind standardmäßig nicht dauerhaft:channel.turn.rununddispatchAssembledChannelTurnverwenden den Zustell-Callback des Channels, es sei denn, dieser Channel stellt explizit ein geprüftes dauerhaftes Richtlinien-/Optionsobjekt bereit.channel.turn.runPreparedbleibt Channel-eigen, bis der vorbereitete Dispatcher explizit den Sendekontext aufruft.- Öffentliche Kompatibilitäts-Hilfsfunktionen wie
recordInboundSessionAndDispatchReply,dispatchInboundReplyWithBaseund Direct-DM-Hilfsfunktionen injizieren niemals generische dauerhafte Zustellung vor dem vom Aufrufer bereitgestelltendeliver- oderreply-Callback.
durable: undefined „nicht dauerhaft“. Der
dauerhafte Pfad wird nur durch einen expliziten Richtlinien-/Optionswert aktiviert. durable: false kann als Kompatibilitätsschreibweise bestehen bleiben, aber die Implementierung sollte nicht
erfordern, dass jeder nicht migrierte Channel sie hinzufügt.
Aktueller Brückencode muss die Dauerhaftigkeitsentscheidung explizit halten:
- Die dauerhafte finale Zustellung gibt einen diskriminierten Status zurück.
handled_visibleundhandled_no_sendsind terminal;unsupportedundnot_applicablekönnen auf kanaleigene Zustellung zurückfallen;failedleitet den Sendefehler weiter. - Die generische dauerhafte finale Zustellung wird durch Adapterfähigkeiten wie stille Zustellung, Erhaltung des Antwortziels, Erhaltung nativer Zitate und Hooks zum Senden von Nachrichten begrenzt. Fehlende Parität sollte kanaleigene Zustellung wählen, keinen generischen Sendevorgang, der für Benutzer sichtbares Verhalten ändert.
- Warteschlangengestützte dauerhafte Sendevorgänge stellen eine Referenz auf die
Zustellungsabsicht bereit. Vorhandene
pendingFinalDelivery*-Sitzungsfelder können während der Umstellung die Intent-ID tragen; der Endzustand ist einMessageSendIntent-Speicher statt eingefrorenem Antworttext plus Ad-hoc- Kontextfeldern.
- Der generische Sendeadapter führt dasselbe Rendering- und Transportverhalten wie der alte direkte Pfad aus.
- Lokale Nach-dem-Senden-Nebeneffekte bleiben über den Sendekontext erhalten.
- Der Adapter gibt Belege oder Zustellergebnisse mit allen Plattform- Nachrichten-IDs zurück.
- Vorbereitete Dispatcher-Pfade rufen entweder den neuen Sendekontext auf oder bleiben als außerhalb der dauerhaften Garantie dokumentiert.
- Die Fallback-Zustellung verarbeitet jede projizierte Nutzlast, nicht nur die erste.
- Die dauerhafte Fallback-Zustellung zeichnet das gesamte projizierte Nutzlastarray als eine wiederabspielbare Absicht oder einen Batch-Plan auf.
- Die iMessage-Monitor-Zustellung zeichnet gesendete Nachrichten nach einem erfolgreichen Senden in einem Echo-Cache auf. Dauerhafte finale Sendevorgänge müssen diesen Cache weiterhin befüllen, sonst kann OpenClaw seine eigenen finalen Antworten erneut als eingehende Benutzernachrichten aufnehmen.
- Tlon hängt eine optionale Modellsignatur an und zeichnet nach Gruppenantworten beteiligte Threads auf. Generische dauerhafte Zustellung darf diese Effekte nicht umgehen; verschieben Sie sie entweder in Tlon-Render-/Sende-/ Finalisierungsadapter oder belassen Sie Tlon auf dem kanaleigenen Pfad.
- Discord und andere vorbereitete Dispatcher besitzen bereits direkte Zustellung und Vorschauverhalten. Sie sind nicht von einer dauerhaften Garantie für zusammengesetzte Turns abgedeckt, bis ihre vorbereiteten Dispatcher finale Nachrichten ausdrücklich durch den Sendekontext leiten.
- Die stille Telegram-Fallback-Zustellung muss das vollständige projizierte Nutzlastarray zustellen. Eine Abkürzung mit nur einer Nutzlast kann nach der Projektion zusätzliche Fallback-Nutzlasten verwerfen.
- LINE, Zalo, Nostr und andere vorhandene zusammengesetzte/Helferpfade können Behandlung von Antwort-Token, Medien-Proxying, Caches für gesendete Nachrichten, Lade-/Statusbereinigung oder reine Callback-Ziele haben. Sie bleiben auf kanaleigener Zustellung, bis diese Semantik durch den Sendeadapter abgebildet und durch Tests verifiziert ist.
- Direct-DM-Helfer können einen Antwort-Callback haben, der das einzige korrekte
Transportziel ist. Generischer ausgehender Versand darf nicht aus
OriginatingTooderToraten und diesen Callback überspringen. - OpenClaw-Gateway-Fehlerausgaben müssen für Menschen sichtbar bleiben, aber
markierte, botverfasste Raum-Echos müssen vor der
allowBots-Autorisierung verworfen werden. Kanäle dürfen dies nicht mit Filtern für sichtbare Textpräfixe implementieren, außer als kurze Notfallmaßnahme; der dauerhafte Vertrag besteht aus strukturierten Ursprungsmetadaten.
Interner Speicher
Die dauerhafte Warteschlange sollte Nachrichtensende-Intents speichern, keine Antwortnutzlasten.Fehlerklassen
Kanaladapter klassifizieren Transportfehler in geschlossene Kategorien:transientundrate_limiterneut versuchen.invalid_payloadnicht erneut versuchen, es sei denn, ein Rendering-Fallback existiert.authoderpermissionnicht erneut versuchen, bis sich die Konfiguration ändert.- Für
not_founddie Live-Finalisierung von Bearbeitung auf frisches Senden zurückfallen lassen, wenn der Kanal dies als sicher deklariert. - Für
conflictBeleg-/Idempotenzregeln verwenden, um zu entscheiden, ob die Nachricht bereits existiert. - Jeder Fehler, nachdem der Adapter möglicherweise Plattform-I/O abgeschlossen
hat, aber bevor der Beleg festgeschrieben wurde, wird zu
unknown_after_send, sofern der Adapter nicht beweisen kann, dass der Plattformvorgang nicht stattgefunden hat.
Kanalzuordnung
| Kanal | Zielmigration |
|---|---|
| Telegram | Empfangsbestätigungsrichtlinie plus dauerhafte finale Sendungen. Der Live-Adapter besitzt Senden plus Vorschau bearbeiten, finale Sendung bei veralteter Vorschau, Themen, Überspringen der Zitat-Antwort-Vorschau, Medien-Fallback und Retry-after-Behandlung. |
| Discord | Der Sendeadapter kapselt die vorhandene dauerhafte Payload-Zustellung. Der Live-Adapter besitzt Entwurfsbearbeitung, Fortschrittsentwurf, Abbruch von Medien-/Fehlervorschauen, Erhalt des Antwortziels und Belege für Nachrichten-IDs. Prüfen Sie bot-verfasste Gateway-Fehler-Echos in gemeinsam genutzten Räumen; verwenden Sie ein ausgehendes Register oder ein anderes natives Äquivalent, wenn Discord Ursprungsmetadaten auf normalen Nachrichten nicht tragen kann. |
| Slack | Der Sendeadapter verarbeitet normale Chat-Beiträge. Der Live-Adapter wählt den nativen Stream, wenn die Thread-Form ihn unterstützt, andernfalls eine Entwurfsvorschau. Belege bewahren Thread-Zeitstempel. Der Ursprungsadapter bildet OpenClaw-Gateway-Fehler auf Slack-chat.postMessage.metadata ab und verwirft markierte Bot-Raum-Echos vor der allowBots-Autorisierung. |
| Der Sendeadapter besitzt Text-/Medienversand mit dauerhaften finalen Intents. Der Empfangsadapter verarbeitet Gruppenerwähnungen und Senderidentität. Live kann fehlen, bis WhatsApp einen bearbeitbaren Transport hat. | |
| Matrix | Der Live-Adapter besitzt Entwurfs-Event-Bearbeitungen, Finalisierung, Redaktion, Einschränkungen für verschlüsselte Medien und Fallback bei Antwortziel-Abweichungen. Der Empfangsadapter besitzt Hydration und Deduplizierung verschlüsselter Events. Der Ursprungsadapter sollte den Ursprung von OpenClaw-Gateway-Fehlern in Matrix-Event-Inhalte codieren und konfigurierte Bot-Raum-Echos vor der allowBots-Behandlung verwerfen. |
| Mattermost | Der Live-Adapter besitzt einen Entwurfsbeitrag, Fortschritts-/Tool-Faltung, Finalisierung an Ort und Stelle und Fallback auf frisches Senden. |
| Microsoft Teams | Der Live-Adapter besitzt natives Fortschritts- und Block-Stream-Verhalten. Der Sendeadapter besitzt Aktivitäten und Belege für Anhänge/Karten. |
| Feishu | Der Render-Adapter besitzt Text-/Karten-/Roh-Rendering. Der Live-Adapter besitzt Streaming-Karten und Unterdrückung doppelter finaler Nachrichten. Der Sendeadapter besitzt Kommentare, Themensitzungen, Medien und Sprachunterdrückung. |
| QQ Bot | Der Live-Adapter besitzt C2C-Streaming, Akkumulator-Timeout und finale Fallback-Sendung. Der Render-Adapter besitzt Medien-Tags und Text-als-Sprache. |
| Signal | Einfacher Empfang plus Sendeadapter. Kein Live-Adapter, außer signal-cli ergänzt zuverlässige Bearbeitungsunterstützung. |
| iMessage | Einfacher Empfang plus Sendeadapter. iMessage-Senden muss die Befüllung des Monitor-Echo-Caches bewahren, bevor dauerhafte finale Nachrichten die Monitor-Zustellung umgehen können. |
| Google Chat | Einfacher Empfang plus Sendeadapter mit Thread-Beziehung, die auf Spaces und Thread-IDs abgebildet wird. Prüfen Sie das Raumverhalten bei allowBots=true für markierte OpenClaw-Gateway-Fehler-Echos. |
| LINE | Einfacher Empfang plus Sendeadapter mit Reply-Token-Einschränkungen, die als Ziel-/Beziehungsfähigkeit modelliert werden. |
| Nextcloud Talk | SDK-Empfangsbrücke plus Sendeadapter. |
| IRC | Einfacher Empfang plus Sendeadapter, keine dauerhaften Bearbeitungsbelege. |
| Nostr | Empfang plus Sendeadapter für verschlüsselte DMs; Belege sind Event-IDs. |
| QA-Kanal | Vertragstest-Adapter für Empfangs-, Sende-, Live-, Wiederholungs- und Wiederherstellungsverhalten. |
| Synology Chat | Einfacher Empfang plus Sendeadapter. |
| Tlon | Der Sendeadapter muss das Rendering von Modellsignaturen und die Nachverfolgung beteiligter Threads bewahren, bevor die generische dauerhafte finale Zustellung aktiviert wird. |
| Twitch | Einfacher Empfang plus Sendeadapter mit Rate-Limit-Klassifizierung. |
| Zalo | Einfacher Empfang plus Sendeadapter. |
| Zalo Personal | Einfacher Empfang plus Sendeadapter. |
Migrationsplan
Phase 1: Interne Nachrichtendomäne
- Fügen Sie
src/channels/message/*-Typen für Nachrichten, Ziele, Beziehungen, Ursprünge, Belege, Fähigkeiten, dauerhafte Intents, Empfangskontext, Sende- kontext, Live-Kontext und Fehlerklassen hinzu. - Fügen Sie
origin?: MessageOriginzum Payload-Typ der Migrationsbrücke hinzu, der von der aktuellen Antwortzustellung verwendet wird, und verschieben Sie dieses Feld dann nachChannelMessageund in gerenderte Nachrichtentypen, während das Refactoring Antwort-Payloads ersetzt. - Halten Sie dies intern, bis Adapter und Tests die Form bestätigen.
- Fügen Sie reine Unit-Tests für Zustandsübergänge und Serialisierung hinzu.
Phase 2: Dauerhafter Sendekern
- Verschieben Sie die vorhandene ausgehende Warteschlange von Antwort-Payload- Dauerhaftigkeit zu dauerhaften Nachrichtensende-Intents.
- Lassen Sie einen dauerhaften Sende-Intent ein projiziertes Payload-Array oder einen Batch-Plan tragen, nicht nur eine einzelne Antwort-Payload.
- Bewahren Sie das aktuelle Warteschlangen-Wiederherstellungsverhalten durch Kompatibilitätskonvertierung.
- Lassen Sie
deliverOutboundPayloadsmessages.sendaufrufen. - Machen Sie Dauerhaftigkeit finaler Sendungen zum Standard und schlagen Sie geschlossen fehl, wenn der dauerhafte Intent im neuen Nachrichtenlebenszyklus nicht geschrieben werden kann, nachdem der Adapter Wiederholsicherheit deklariert hat. Vorhandene Kanal-Turn- und SDK-Kompatibilitätspfade bleiben in dieser Phase standardmäßig direkte Sendungen.
- Erfassen Sie Belege konsistent.
- Geben Sie Belege und Zustellergebnisse an den ursprünglichen Dispatcher- Aufrufer zurück, statt dauerhaftes Senden als terminalen Seiteneffekt zu behandeln.
- Persistieren Sie den Nachrichtenursprung durch dauerhafte Sende-Intents, damit Wiederherstellung, Wiederholung und segmentierte Sendungen die operative Provenienz von OpenClaw bewahren.
Phase 3: Kanal-Turn-Brücke
- Implementieren Sie
channel.turn.rununddispatchAssembledChannelTurnneu auf Basis vonmessages.receiveundmessages.send. - Halten Sie aktuelle Faktentypen stabil.
- Bewahren Sie Legacy-Verhalten standardmäßig. Ein Kanal mit zusammengesetztem Turn wird nur dann dauerhaft, wenn sein Adapter sich explizit mit einer wiederholungssicheren Dauerhaftigkeitsrichtlinie anmeldet.
- Behalten Sie
durable: falseals Kompatibilitätsausstieg für Pfade bei, die native Bearbeitungen finalisieren und noch nicht sicher wiederholen können, aber verlassen Sie sich nicht auffalse-Marker, um nicht migrierte Kanäle zu schützen. - Aktivieren Sie Dauerhaftigkeit für zusammengesetzte Turns standardmäßig nur im neuen Nachrichtenlebenszyklus, nachdem die Kanalzuordnung bewiesen hat, dass der generische Sendepfad die alte Kanalzustellungssemantik bewahrt.
Phase 4: Prepared-Dispatcher-Brücke
- Ersetzen Sie
deliverDurableInboundReplyPayloaddurch eine Sendekontext-Brücke. - Behalten Sie den alten Hilfsaufruf als Wrapper bei.
- Portieren Sie zuerst Telegram, WhatsApp, Slack, Signal, iMessage und Discord, weil sie bereits Arbeit für dauerhafte finale Ausgaben oder einfachere Sendepfade haben.
- Behandeln Sie jeden vorbereiteten Dispatcher als nicht abgedeckt, bis er sich ausdrücklich für den Sendekontext entscheidet. Dokumentation und Changelog-Einträge müssen „zusammengesetzte Kanal-Turns“ sagen oder die migrierten Kanalpfade nennen, statt alle automatischen finalen Antworten zu beanspruchen.
- Halten Sie
recordInboundSessionAndDispatchReply, Hilfsaufrufe für direkte DMs und ähnliche öffentliche Kompatibilitäts-Hilfsaufrufe verhaltenserhaltend. Sie können später eine ausdrückliche Sendekontext-Opt-in-Option verfügbar machen, dürfen aber nicht automatisch eine generische dauerhafte Zustellung vor dem vom Aufrufer verwalteten Zustellungs-Callback versuchen.
Phase 5: Einheitlicher Live-Lebenszyklus
- Erstellen Sie
messages.livemit zwei Nachweis-Adaptern:- Telegram für Senden plus Bearbeiten plus Senden veralteter finaler Ausgaben.
- Matrix für Entwurfsfinalisierung plus Schwärzungs-Fallback.
- Migrieren Sie anschließend Discord, Slack, Mattermost, Teams, QQ Bot und Feishu.
- Löschen Sie duplizierten Code zur Vorschau-Finalisierung erst, nachdem jeder Kanal Paritätstests hat.
Phase 6: Öffentliches SDK
- Fügen Sie
openclaw/plugin-sdk/channel-messagehinzu. - Dokumentieren Sie es als bevorzugte Kanal-Plugin-API.
- Aktualisieren Sie Paket-Exporte, Einstiegspunkt-Inventar, generierte API-Baselines und Plugin-SDK-Dokumentation.
- Nehmen Sie
MessageOrigin, Hooks zum Kodieren/Dekodieren des Ursprungs und das gemeinsame PrädikatshouldDropOpenClawEchoin die SDK-Oberfläche von channel-message auf. - Behalten Sie Kompatibilitäts-Wrapper für alte Unterpfade bei.
- Markieren Sie antwortbenannte SDK-Hilfsaufrufe in der Dokumentation als veraltet, nachdem gebündelte Plugins migriert sind.
Phase 7: Alle Sender
Verschieben Sie alle ausgehenden Erzeuger, die keine Antworten sind, aufmessages.send:
- Cron- und Heartbeat-Benachrichtigungen
- Aufgabenabschlüsse
- Hook-Ergebnisse
- Genehmigungsaufforderungen und Genehmigungsergebnisse
- Sendevorgänge des Nachrichtentools
- Abschlussankündigungen von Subagenten
- ausdrückliche Sendevorgänge aus CLI oder Control UI
- Automatisierungs-/Broadcast-Pfade
Phase 8: Turn als veraltet markieren
- Behalten Sie
channel.turnfür mindestens ein Kompatibilitätsfenster als Wrapper bei. - Veröffentlichen Sie Migrationshinweise.
- Führen Sie Plugin-SDK-Kompatibilitätstests gegen alte Importe aus.
- Entfernen oder verbergen Sie alte interne Hilfsaufrufe erst, nachdem kein gebündeltes Plugin sie mehr benötigt und Drittanbieter-Verträge einen stabilen Ersatz haben.
Testplan
Unit-Tests:- Serialisierung und Wiederherstellung dauerhafter Sendeabsichten.
- Wiederverwendung von Idempotenzschlüsseln und Unterdrückung von Duplikaten.
- Receipt-Commit und Überspringen bei Wiederholung.
unknown_after_send-Wiederherstellung, die vor der Wiederholung abgleicht, wenn ein Adapter Abgleich unterstützt.- Richtlinie zur Fehlerklassifizierung.
- Sequenzierung der Empfangsbestätigungsrichtlinie.
- Relationszuordnung für Antwort-, Follow-up-, System- und Broadcast-Sendevorgänge.
- Ursprungsfactory für Gateway-Fehler und Prädikat
shouldDropOpenClawEcho. - Ursprungserhaltung durch Payload-Normalisierung, Aufteilung in Chunks, Serialisierung dauerhafter Warteschlangen und Wiederherstellung.
- Einfacher Adapter von
channel.turn.runzeichnet weiterhin auf und sendet. - Zustellung über alte zusammengesetzte Turns wird nicht dauerhaft, es sei denn, der Kanal entscheidet sich ausdrücklich dafür.
- Brücke von
channel.turn.runPreparedzeichnet weiterhin auf und finalisiert. - Öffentliche Kompatibilitäts-Hilfsaufrufe rufen standardmäßig vom Aufrufer verwaltete Zustellungs-Callbacks auf und senden nicht generisch vor diesen Callbacks.
- Dauerhafte Fallback-Zustellung spielt nach einem Neustart das gesamte projizierte Payload-Array erneut ab und kann die späteren Payloads nach einem frühen Absturz nicht unaufgezeichnet lassen.
- Dauerhafte Zustellung zusammengesetzter Turns gibt Plattformnachrichten-IDs an den gepufferten Dispatcher zurück.
- Benutzerdefinierte Zustellungs-Hooks geben weiterhin Plattformnachrichten-IDs zurück, wenn dauerhafte Zustellung deaktiviert oder nicht verfügbar ist.
- Finale Antwort übersteht einen Neustart zwischen Assistentenabschluss und Plattformversand.
- Vorschauentwurf wird an Ort und Stelle finalisiert, wenn erlaubt.
- Vorschauentwurf wird abgebrochen oder geschwärzt, wenn Medien-/Fehler-/Antwortzielkonflikte normale Zustellung erfordern.
- Block-Streaming und Vorschau-Streaming liefern nicht beide denselben Text aus.
- Früh gestreamte Medien werden in der finalen Zustellung nicht dupliziert.
- Telegram-Themenantwort mit verzögerter Polling-Bestätigung bis zur sicheren abgeschlossen-Watermark des Empfangskontexts.
- Telegram-Polling-Wiederherstellung für akzeptierte, aber nicht zugestellte Updates, abgedeckt durch das persistierte Modell für sichere abgeschlossen-Offsets.
- Veraltete Telegram-Vorschau sendet frische finale Ausgabe und bereinigt die Vorschau.
- Stiller Telegram-Fallback sendet jeden projizierten Fallback-Payload.
- Dauerhaftigkeit des stillen Telegram-Fallbacks zeichnet das vollständige projizierte Fallback-Array atomar auf, nicht eine einzelne Ein-Payload-Sendeabsicht pro Schleifendurchlauf.
- Discord-Vorschauabbruch bei Medien/Fehler/ausdrücklicher Antwort.
- Finale Ausgaben des vorbereiteten Discord-Dispatchers laufen durch den Sendekontext, bevor Dokumentation oder Changelog Dauerhaftigkeit finaler Discord-Antworten beanspruchen.
- Dauerhafte finale iMessage-Sendevorgänge befüllen den Echo-Cache gesendeter Nachrichten des Monitors.
- Alte Zustellungspfade von LINE, Zalo und Nostr werden nicht durch generisches dauerhaftes Senden umgangen, bis ihre Adapter-Paritätstests existieren.
- Callback-Zustellung für direkte DMs/Nostr bleibt maßgeblich, sofern sie nicht ausdrücklich auf ein vollständiges Nachrichtenziel und einen wiederholungssicheren Sendeadapter migriert wurde.
- Markierte Slack-Gateway-Fehlermeldungen von OpenClaw bleiben ausgehend sichtbar, markierte
Bot-Raum-Echos werden vor
allowBotsverworfen, und nicht markierte Bot-Nachrichten mit demselben sichtbaren Text folgen weiterhin der normalen Bot-Autorisierung. - Slack-nativer Stream-Fallback auf Entwurfsvorschau in Top-Level-DMs.
- Matrix-Vorschau-Finalisierung und Schwärzungs-Fallback.
- Markierte Matrix-Raum-Echos von OpenClaw-Gateway-Fehlern aus konfigurierten Bot-Konten
werden vor der
allowBots-Behandlung verworfen. - Kaskadenprüfungen für Gateway-Fehler in gemeinsam genutzten Räumen von Discord und Google Chat decken
allowBots-Modi ab, bevor dort generischer Schutz beansprucht wird. - Mattermost-Entwurfsfinalisierung und Frischsende-Fallback.
- Native Teams-Fortschrittsfinalisierung.
- Unterdrückung doppelter finaler Feishu-Ausgaben.
- Timeout-Fallback des QQ Bot-Akkumulators.
- Dauerhafte finale Tlon-Sendevorgänge erhalten Rendering von Modellsignaturen und Verfolgung teilgenommener Threads.
- Einfache dauerhafte finale Sendevorgänge für WhatsApp, Signal, iMessage, Google Chat, LINE, IRC, Nostr, Nextcloud Talk, Synology Chat, Tlon, Twitch, Zalo und Zalo Personal.
- Gezielte Vitest-Dateien während der Entwicklung.
pnpm check:changedin Testbox für die gesamte geänderte Oberfläche.- Umfassenderes
pnpm checkin Testbox vor dem Landen des vollständigen Refactorings oder nach Änderungen an öffentlichem SDK/Exporten. - Live- oder qa-channel-Smoke-Test für mindestens einen bearbeitungsfähigen Kanal und einen einfachen send-only-Kanal, bevor Kompatibilitäts-Wrapper entfernt werden.
Offene Fragen
- Ob Telegram die grammY-Runner-Quelle letztlich durch eine vollständig dauerhafte Polling-Quelle ersetzen sollte, die erneute Zustellung auf Plattformebene steuern kann, nicht nur OpenClaws persistierte Neustart-Watermark.
- Ob dauerhafter Live-Vorschaustatus im selben Warteschlangendatensatz wie die finale Sendeabsicht oder in einem benachbarten Live-Statusspeicher gespeichert werden sollte.
- Wie lange Kompatibilitäts-Wrapper nach der Auslieferung von
plugin-sdk/channel-messagedokumentiert bleiben. - Ob Drittanbieter-Plugins Empfangsadapter direkt implementieren oder nur
Normalize-/Send-/Live-Hooks über
defineChannelMessageAdapterbereitstellen sollten. - Welche Receipt-Felder sicher im öffentlichen SDK gegenüber internem Runtime-Status verfügbar gemacht werden können.
- Ob Nebeneffekte wie Self-Echo-Caches und Markierungen teilgenommener Threads als Sendekontext-Hooks, adaptereigene Finalisierungsschritte oder Receipt-Abonnenten modelliert werden sollten.
- Welche Kanäle native Ursprungsmetadaten haben, welche persistierte ausgehende Registries benötigen und welche keine zuverlässige kanalübergreifende Echo-Unterdrückung bieten können.
Akzeptanzkriterien
- Jeder gebündelte Nachrichtenkanal sendet finale sichtbare Ausgabe über
messages.send. - Jede eingehende Nachricht gelangt über
messages.receiveoder einen dokumentierten Kompatibilitäts-Wrapper in das System. - Jeder Vorschau-/Bearbeitungs-/Stream-Kanal verwendet
messages.livefür Entwurfsstatus und Finalisierung. channel.turnist nur ein Wrapper.- Antwortbenannte SDK-Hilfsaufrufe sind Kompatibilitätsexporte, nicht der empfohlene Pfad.
- Dauerhafte Wiederherstellung kann ausstehende finale Sendevorgänge nach einem Neustart erneut abspielen, ohne die finale Antwort zu verlieren oder bereits committete Sendevorgänge zu duplizieren; Sendevorgänge, deren Plattformausgang unbekannt ist, werden vor der Wiederholung abgeglichen oder für diesen Adapter als mindestens-einmal dokumentiert.
- Dauerhafte finale Sendevorgänge schlagen geschlossen fehl, wenn die dauerhafte Absicht nicht geschrieben werden kann, sofern ein Aufrufer nicht ausdrücklich einen dokumentierten nicht-dauerhaften Modus ausgewählt hat.
- Alte channel-turn- und SDK-Kompatibilitäts-Hilfsaufrufe verwenden standardmäßig direkte kanalverwaltete Zustellung; generisches dauerhaftes Senden ist nur ausdrückliches Opt-in.
- Receipts erhalten alle Plattformnachrichten-IDs für mehrteilige Zustellungen und eine primäre ID für Threading-/Bearbeitungskomfort.
- Dauerhafte Wrapper erhalten kanallokale Nebeneffekte, bevor sie direkte Zustellungs-Callbacks ersetzen.
- Vorbereitete Dispatcher werden nicht als dauerhaft gezählt, bis ihr finaler Zustellungspfad ausdrücklich den Sendekontext verwendet.
- Fallback-Zustellung verarbeitet jeden projizierten Payload.
- Dauerhafte Fallback-Zustellung zeichnet jeden projizierten Payload in einer wiederholbaren Absicht oder einem Batch-Plan auf.
- Von OpenClaw stammende Gateway-Fehlerausgabe ist für Menschen sichtbar, aber markierte botverfasste Raum-Echos werden vor der Bot-Autorisierung auf Kanälen verworfen, die Unterstützung für den Ursprungsvertrag deklarieren.
- Die Dokumentation erklärt Senden, Empfangen, Live, Status, Receipts, Relationen, Fehler- richtlinie, Migration und Testabdeckung.