- De kernprimitieven moeten ontvangen en verzenden zijn, niet antwoorden.
- Een antwoord is alleen een relatie op een uitgaand bericht.
- Een beurt is een gemak voor inkomende verwerking, niet de eigenaar van bezorging.
- Verzenden moet contextgebaseerd zijn:
begin, renderen, preview of stream, definitief verzenden, committen, falen. - Ontvangen moet ook contextgebaseerd zijn: normaliseren, dedupliceren, routeren, vastleggen, dispatchen, platform-ack, falen.
- De publieke Plugin-SDK moet worden teruggebracht tot één klein oppervlak voor uitgaande kanaalberichten.
Problemen
De huidige kanaalstack is ontstaan uit meerdere geldige lokale behoeften:- Eenvoudige inkomende adapters gebruiken
runtime.channel.inbound.run. - Rijke adapters gebruiken
runtime.channel.inbound.runPreparedReply. - Legacy-helpers gebruiken
dispatchInboundReplyWithBase,recordInboundSessionAndDispatchReply, helpers voor antwoordpayloads, antwoordchunking, antwoordreferenties en runtimehelpers voor uitgaand verkeer. - Previewstreaming leeft in kanaalspecifieke dispatchers.
- Duurzaamheid van definitieve bezorging wordt toegevoegd rond bestaande paden voor antwoordpayloads.
Doelen
- Eén core-levenscyclus voor alle paden voor het ontvangen en verzenden van kanaalberichten.
- Duurzame definitieve verzendingen standaard in de nieuwe berichtlevenscyclus nadat een adapter replay-veilig gedrag declareert.
- Gedeelde semantiek voor preview, bewerken, streamen, finalisatie, retry, herstel en ontvangstbewijzen.
- Een klein Plugin-SDK-oppervlak dat externe Plugins kunnen leren en onderhouden.
- Compatibiliteit voor bestaande inkomende antwoordcompatibiliteitscallers tijdens migratie.
- Duidelijke uitbreidingspunten voor nieuwe kanaalmogelijkheden.
- Geen platformspecifieke branches in core.
- Geen token-delta-kanaalberichten. Kanaalstreaming blijft berichtpreview, bewerken, toevoegen of bezorging van voltooide blokken.
- Gestructureerde metadata met OpenClaw-oorsprong voor operationele/systeemoutput zodat zichtbare Gateway-fouten niet opnieuw als nieuwe prompts in gedeelde bot-enabled rooms terechtkomen.
Niet-doelen
- Dwing niet elk bestaand kanaal in de eerste fase naar duurzame berichtbezorging.
- Dwing niet elk kanaal in hetzelfde native transportgedrag.
- Leer core geen Telegram-topics, native Slack-streams, Matrix-redacties, Feishu-kaarten, QQ-spraak of Teams-activiteiten.
- Publiceer niet alle interne migratiehelpers als stabiele SDK-API.
- Laat retries geen voltooide niet-idempotente platformbewerkingen opnieuw afspelen.
Referentiemodel
Vercel Chat heeft een goed publiek mentaal model:ChatThreadChannelMessage- adaptermethoden zoals
postMessage,editMessage,deleteMessage,stream,startTypingen het ophalen van geschiedenis - een state-adapter voor deduplicatie, locks, queues en persistentie
- Duurzame intenties voor uitgaande verzending vóór directe transportcalls.
- Expliciete verzendcontexten met begin, commit en fail.
- Ontvangstcontexten die het platform-ackbeleid kennen.
- Ontvangstbewijzen die een herstart overleven en bewerkingen, verwijderingen, herstel en duplicate suppression kunnen aansturen.
- Een kleinere publieke SDK. Gebundelde Plugins kunnen interne runtimehelpers gebruiken, maar externe Plugins moeten één coherente bericht-API zien.
- Agentspecifiek gedrag: sessies, transcripts, blokstreaming, toolvoortgang, approvals, mediadirectieven, stille antwoorden en geschiedenis van groepsmentions.
thread.post()-achtige promises zijn niet genoeg voor OpenClaw. Ze verbergen de
transactiegrens die bepaalt of een verzending herstelbaar is.
Core-model
Het nieuwe domein moet onder een interne core-namespace leven, zoalssrc/channels/message/*.
Het heeft vier concepten:
receive beheert de inkomende levenscyclus.
send beheert de uitgaande levenscyclus.
live beheert preview-, bewerk-, voortgangs- en streamstatus.
state beheert duurzame intentieopslag, ontvangstbewijzen, idempotentie,
herstel, locks en deduplicatie.
Berichttermen
Bericht
Een genormaliseerd bericht is platformneutraal:Doel
Het doel beschrijft waar het bericht leeft:Relatie
Antwoord is een relatie, geen API-root:Oorsprong
Oorsprong beschrijft wie een bericht heeft geproduceerd en hoe OpenClaw echo’s van dat bericht moet behandelen. Het staat los van relatie: een bericht kan een antwoord aan een gebruiker zijn en nog steeds operationele output met OpenClaw-oorsprong zijn.allowBots is ingeschakeld.
Ontvangstbewijs
Ontvangstbewijzen zijn first-class:Ontvangstcontext
Ontvangen moet geen kale helpercall zijn. Core heeft een context nodig die deduplicatie, routering, sessieregistratie en platform-ackbeleid kent.- Transport-ack: vertelt de platformwebhook of socket dat OpenClaw de event-envelope heeft geaccepteerd. Sommige platforms vereisen dit vóór dispatch.
- Polling-offset-ack: verplaatst een cursor zodat hetzelfde event niet opnieuw wordt opgehaald. Dit mag niet voorbij werk gaan dat niet kan worden hersteld.
- Inkomende-record-ack: bevestigt dat OpenClaw genoeg inkomende metadata heeft gepersisteerd om een herbezorging te dedupliceren en routeren.
- Gebruikerszichtbaar ontvangstbewijs: optioneel lees-/status-/typinggedrag; nooit een duurzaamheidsgrens.
ReceiveAckPolicy beheert alleen transport- of pollingbevestiging. Het mag niet
worden hergebruikt voor leesbevestigingen of statusreacties.
Vóór botautorisatie moet ontvangst het gedeelde OpenClaw-echobeleid toepassen
wanneer het kanaal metadata over berichtoorsprong kan decoderen:
allowBots-autorisatie.
Ackbeleid is expliciet:
getUpdates-fetchoffset wordt nog steeds beheerd
door de pollingbibliotheek, dus de resterende diepere ingreep is een volledig
duurzame pollingbron als we redelivery op platformniveau nodig hebben voorbij de
herstart-watermark van OpenClaw. Webhookplatforms hebben mogelijk onmiddellijke
HTTP-ack nodig, maar ze hebben nog steeds inkomende deduplicatie en duurzame
intenties voor uitgaande verzending nodig omdat webhooks kunnen herbezorgen.
Verzendcontext
Verzenden is ook contextgebaseerd:unknown_after_send, niet blind opnieuw worden afgespeeld. Kanalen
zonder reconciliatie mogen alleen kiezen voor at-least-once opnieuw afspelen als dubbele zichtbare
berichten een acceptabele, gedocumenteerde afweging zijn voor dat kanaal en die relatie.
De huidige SDK-reconciliatiebridge vereist dat de adapter
reconcileUnknownSend declareert, en vraagt vervolgens durableFinal.reconcileUnknownSend om
een onbekende entry te classificeren als sent, not_sent of unresolved; alleen not_sent
staat opnieuw afspelen toe, en onopgeloste entries blijven terminaal of proberen alleen de
reconciliatiecontrole opnieuw.
Duurzaamheidsbeleid moet expliciet zijn:
required betekent dat core fail-closed moet zijn wanneer het de duurzame intent niet kan schrijven.
best_effort kan doorvallen wanneer persistentie niet beschikbaar is. disabled behoudt
het oude directe verzendgedrag. Tijdens migratie gebruiken legacy wrappers en publieke
compatibiliteitshelpers standaard disabled; ze mogen niet required afleiden uit
het feit dat een kanaal een generieke outbound-adapter heeft.
Verzendcontexten beheren ook kanaallokale effecten na verzending. Een migratie is niet veilig
als duurzame levering lokaal gedrag omzeilt dat eerder was gekoppeld aan het
directe verzendpad van het kanaal. Voorbeelden zijn caches voor het onderdrukken van self-echo’s,
markers voor deelname aan threads, native edit-ankers, rendering van modelhandtekeningen
en platformspecifieke bescherming tegen duplicaten. Die effecten moeten ofwel naar de
send-adapter, de render-adapter, of een benoemde send-context-hook verhuizen voordat dat
kanaal duurzame generieke eindlevering kan inschakelen.
Verzendhelpers moeten receipts helemaal teruggeven aan hun aanroeper. Duurzame
wrappers mogen message-id’s niet inslikken of een kanaalleveringsresultaat vervangen door
undefined; gebufferde dispatchers gebruiken die id’s voor thread-ankers, latere edits,
previewfinalisatie en duplicaatonderdrukking.
Fallback-verzendingen werken op batches, niet op losse payloads. Silent-reply-herschrijvingen,
mediafallback, cardfallback en chunkprojectie kunnen allemaal meer dan
één leverbaar bericht produceren, dus een verzendcontext moet ofwel de hele
geprojecteerde batch leveren, of expliciet documenteren waarom slechts één payload geldig is.
unknown_after_send totdat de adapter deze reconcilieert.
Live context
Preview-, edit-, voortgangs- en streamgedrag moeten één opt-in lifecycle zijn.- Telegram-verzending plus edit-preview, met een verse finale na verouderde previewleeftijd.
- Discord-verzending plus edit-preview, annuleren bij media/fout/expliciet antwoord.
- Slack native stream of concept-preview afhankelijk van threadvorm.
- Mattermost-finalisatie van conceptpost.
- Matrix-finalisatie van concept-event of redactie bij mismatch.
- Teams native voortgangsstream.
- QQ Bot-stream of geaccumuleerde fallback.
Adapteroppervlak
Het publieke SDK-doel moet één subpad zijn:origin.decode OpenClaw-origin-metadata retourneert. De receive-adapter
levert platformfeiten zoals bot-auteur en roomvorm; core beheert de drop-
beslissing en ordening, zodat kanalen tekstfilters niet opnieuw implementeren.
Origin-adapter:
MessageOrigin in. Kanalen vertalen dit alleen naar en van native
transportmetadata. Slack mapt dit naar chat.postMessage({ metadata }) en
inkomende message.metadata; Matrix kan het mappen naar extra eventcontent; kanalen
zonder native metadata kunnen een receipt/outbound-register gebruiken wanneer dat de
best beschikbare benadering is.
Capabilities:
Publieke SDK-reductie
Het nieuwe publieke oppervlak moet deze conceptuele gebieden absorberen of afkeuren:reply-runtimereply-dispatch-runtimereply-referencereply-chunkingreply-payloadinbound-reply-dispatchchannel-reply-pipeline- de meeste publieke gebruiken van
outbound-runtime - ad-hoc helpers voor de concept-stream-lifecycle
plugin-sdk/channel-outbound sturen zodra dit bestaat.
Relatie tot channel inbound
runtime.channel.inbound.* is de runtimebridge tijdens migratie.
Het moet een compatibiliteitsadapter worden:
channel.inbound.runPreparedReply moet in eerste instantie ook blijven bestaan:
channel.turn-runtimeoppervlak is verwijderd. Runtime-aanroepers gebruiken
channel.inbound.*; kanaaldocs en SDK-subpaden gebruiken inbound/message-naamwoorden.
Compatibiliteitsrails
Tijdens migratie is generieke duurzame levering opt-in voor elk kanaal waarvan de bestaande delivery-callback bijwerkingen heeft buiten “verzend deze payload”. Legacy entrypoints zijn standaard niet-duurzaam:channel.inbound.runendispatchChannelInboundReplygebruiken de delivery-callback van het kanaal tenzij dat kanaal expliciet een gecontroleerd duurzaam beleid/options-object levert.channel.inbound.runPreparedReplyblijft kanaal-eigendom totdat de prepared dispatcher expliciet de send-context aanroept.- Publieke compatibiliteitshelpers zoals
recordInboundSessionAndDispatchReply,dispatchInboundReplyWithBaseen direct-DM-helpers injecteren nooit generieke duurzame levering vóór de door de aanroeper geleverdedeliver- ofreply-callback.
durable: undefined “niet duurzaam”. Het
duurzame pad wordt alleen ingeschakeld door een expliciete policy/options-waarde. durable: false kan als compatibiliteitsspelling blijven bestaan, maar de implementatie mag niet
vereisen dat elk ongemigreerd kanaal dit toevoegt.
Huidige bridgecode moet de duurzaamheidsbeslissing expliciet houden:
- Duurzame eindlevering retourneert een gediscrimineerde status.
handled_visibleenhandled_no_sendzijn terminal;unsupportedennot_applicablekunnen terugvallen op kanaalbeheerde levering;failedpropageert de verzendfout. - Generieke duurzame eindlevering wordt afgeschermd door adaptermogelijkheden zoals stille levering, behoud van antwoorddoel, behoud van native citaten en hooks voor berichtverzending. Ontbrekende pariteit moet kanaalbeheerde levering kiezen, geen generieke verzending die zichtbaar gedrag voor gebruikers wijzigt.
- Wachtrijgedragen duurzame verzendingen geven een referentie naar de leveringsintentie vrij. Bestaande
pendingFinalDelivery*-sessievelden kunnen de intentie-id tijdens de overgang dragen; de eindtoestand is eenMessageSendIntent-opslag in plaats van bevroren antwoordtekst plus ad-hoc contextvelden.
- De generieke verzendadapter voert hetzelfde render- en transportgedrag uit als het oude directe pad.
- Lokale neveneffecten na verzending blijven behouden via de verzendcontext.
- De adapter retourneert ontvangstbewijzen of leveringsresultaten met alle platformbericht- id’s.
- Voorbereide dispatcher-paden roepen de nieuwe verzendcontext aan of blijven gedocumenteerd als buiten de duurzame garantie.
- Fallback-levering verwerkt elke geprojecteerde payload, niet alleen de eerste.
- Duurzame fallback-levering registreert de volledige geprojecteerde payload-array als één herspeelbare intentie of batchplan.
- iMessage-monitorlevering registreert verzonden berichten in een echo-cache na een geslaagde verzending. Duurzame eindverzendingen moeten die cache nog steeds vullen, anders kan OpenClaw zijn eigen eindantwoorden opnieuw opnemen als inkomende gebruikersberichten.
- Tlon voegt een optionele modelhandtekening toe en registreert deelnemende threads na groepsantwoorden. Generieke duurzame levering mag die effecten niet omzeilen; verplaats ze naar Tlon-render-/verzend-/finalize-adapters of houd Tlon op het kanaalbeheerde pad.
- Discord en andere voorbereide dispatchers beheren al directe levering en preview- gedrag. Ze vallen niet onder een duurzame garantie voor een samengestelde beurt totdat hun voorbereide dispatchers eindberichten expliciet via de verzendcontext routeren.
- Stille Telegram-fallback-levering moet de volledige geprojecteerde payload- array leveren. Een snelkoppeling voor één payload kan extra fallback-payloads na projectie laten vallen.
- LINE, Zalo, Nostr en andere bestaande samengestelde/helper-paden kunnen reply-tokenverwerking, mediaproxying, caches voor verzonden berichten, opschoning van laad-/status- informatie of doelen met alleen callback hebben. Ze blijven op kanaalbeheerde levering totdat die semantiek door de verzendadapter wordt weergegeven en door tests is geverifieerd.
- Direct-DM-helpers kunnen een antwoordcallback hebben die het enige juiste transport-
doel is. Generieke uitgaande verzending mag niet raden op basis van
OriginatingToofToen die callback overslaan. - OpenClaw Gateway-foutuitvoer moet zichtbaar blijven voor mensen, maar getagde
door bots geschreven kamer-echo’s moeten worden verwijderd vóór
allowBots-autorisatie. Kanalen mogen dit niet implementeren met prefixfilters op zichtbare tekst, behalve als een korte noodstop; het duurzame contract is gestructureerde oorsprongsmetadata.
Interne opslag
De duurzame wachtrij moet berichtverzendintenties opslaan, geen antwoordpayloads.Foutklassen
Kanaaladapters classificeren transportfouten in gesloten categorieën:- Probeer
transientenrate_limitopnieuw. - Probeer
invalid_payloadniet opnieuw, tenzij er een renderfallback bestaat. - Probeer
authofpermissionniet opnieuw totdat de configuratie wijzigt. - Laat live-finalisatie bij
not_foundterugvallen van bewerken naar een nieuwe verzending wanneer het kanaal verklaart dat dit veilig is. - Gebruik bij
conflictontvangstbewijs-/idempotentieregels om te bepalen of het bericht al bestaat. - Elke fout nadat de adapter mogelijk platform-I/O heeft voltooid maar vóór het vastleggen van het ontvangstbewijs
wordt
unknown_after_send, tenzij de adapter kan bewijzen dat de platform- operatie niet heeft plaatsgevonden.
Kanaaltoewijzing
| Kanaal | Doelmigratie |
|---|---|
| Telegram | Ontvangstbevestigingsbeleid plus duurzame definitieve verzendingen. Live-adapter beheert verzending plus bewerking van voorbeeld, definitieve verzending bij verouderd voorbeeld, onderwerpen, overslaan van quote-antwoordvoorbeeld, mediafallback en retry-after-afhandeling. |
| Discord | Verzendadapter verpakt bestaande duurzame payloadbezorging. Live-adapter beheert conceptbewerking, voortgangsconcept, annulering van media-/foutvoorbeeld, behoud van antwoorddoel en ontvangstbewijzen voor bericht-id’s. Audit door bot geschreven echo’s van Gateway-fouten in gedeelde ruimtes; gebruik een uitgaand register of ander native equivalent als Discord geen oorsprongsmetadata op normale berichten kan dragen. |
| Slack | Verzendadapter verwerkt normale chatberichten. Live-adapter kiest native stream wanneer de threadvorm dit ondersteunt, anders conceptvoorbeeld. Ontvangstbewijzen behouden thread-tijdstempels. Oorsprongadapter koppelt OpenClaw Gateway-fouten aan Slack chat.postMessage.metadata en verwijdert getagde bot-ruimte-echo’s vóór allowBots-autorisatie. |
| Verzendadapter beheert tekst-/mediaverzending met duurzame definitieve intents. Ontvangstadapter verwerkt groepsvermelding en afzenderidentiteit. Live kan afwezig blijven totdat WhatsApp een bewerkbaar transport heeft. | |
| Matrix | Live-adapter beheert bewerkingen van conceptgebeurtenissen, finalisatie, redactie, beperkingen voor versleutelde media en fallback bij niet-overeenkomend antwoorddoel. Ontvangstadapter beheert hydratatie en deduplicatie van versleutelde gebeurtenissen. Oorsprongadapter moet de oorsprong van OpenClaw Gateway-fouten coderen in Matrix-gebeurtenisinhoud en geconfigureerde bot-ruimte-echo’s verwijderen vóór allowBots-afhandeling. |
| Mattermost | Live-adapter beheert één conceptbericht, samenvoegen van voortgang/tools, finalisatie op dezelfde plek en fallback naar verse verzending. |
| Microsoft Teams | Live-adapter beheert native voortgang en blokstreamgedrag. Verzendadapter beheert activiteiten en ontvangstbewijzen voor bijlagen/kaarten. |
| Feishu | Renderadapter beheert tekst-/kaart-/raw-rendering. Live-adapter beheert streamingkaarten en onderdrukking van dubbele definitieve berichten. Verzendadapter beheert opmerkingen, onderwerpsessies, media en stemonderdrukking. |
| QQ Bot | Live-adapter beheert C2C-streaming, accumulatortime-out en definitieve fallbackverzending. Renderadapter beheert mediatags en tekst-als-spraak. |
| Signal | Eenvoudige ontvangstadapter plus verzendadapter. Geen live-adapter tenzij signal-cli betrouwbare bewerkingsondersteuning toevoegt. |
| iMessage | Eenvoudige ontvangstadapter plus verzendadapter. iMessage-verzending moet populatie van de monitor-echo-cache behouden voordat duurzame definitieve berichten monitorbezorging kunnen omzeilen. |
| Google Chat | Eenvoudige ontvangstadapter plus verzendadapter met threadrelatie gekoppeld aan ruimtes en thread-id’s. Audit ruimtegedrag met allowBots=true voor getagde echo’s van OpenClaw Gateway-fouten. |
| LINE | Eenvoudige ontvangstadapter plus verzendadapter met reply-tokenbeperkingen gemodelleerd als doel-/relatiecapaciteit. |
| Nextcloud Talk | SDK-ontvangstbridge plus verzendadapter. |
| IRC | Eenvoudige ontvangstadapter plus verzendadapter, geen duurzame ontvangstbewijzen voor bewerkingen. |
| Nostr | Ontvangstadapter plus verzendadapter voor versleutelde DM’s; ontvangstbewijzen zijn gebeurtenis-id’s. |
| QA-kanaal | Contracttestadapter voor ontvangst-, verzend-, live-, retry- en herstelgedrag. |
| Synology Chat | Eenvoudige ontvangstadapter plus verzendadapter. |
| Tlon | Verzendadapter moet modelhandtekening-rendering en tracking van deelgenomen threads behouden voordat generieke duurzame definitieve bezorging wordt ingeschakeld. |
| Twitch | Eenvoudige ontvangstadapter plus verzendadapter met rate-limitclassificatie. |
| Zalo | Eenvoudige ontvangstadapter plus verzendadapter. |
| Zalo Personal | Eenvoudige ontvangstadapter plus verzendadapter. |
Migratieplan
Fase 1: Intern berichtdomein
- Voeg
src/channels/message/*-typen toe voor berichten, doelen, relaties, oorsprongen, ontvangstbewijzen, capaciteiten, duurzame intents, ontvangstcontext, verzendcontext, live-context en foutklassen. - Voeg
origin?: MessageOrigintoe aan het migratiebridge-payloadtype dat wordt gebruikt door huidige antwoordbezorging, en verplaats dat veld daarna naarChannelMessageen gerenderde berichttypen terwijl de refactor antwoordpayloads vervangt. - Houd dit intern totdat adapters en tests de vorm bewijzen.
- Voeg pure unit-tests toe voor statusovergangen en serialisatie.
Fase 2: Kern voor duurzame verzending
- Verplaats de bestaande uitgaande wachtrij van duurzaamheid voor antwoordpayloads naar duurzame intents voor berichtverzending.
- Laat een duurzame verzend-intent een geprojecteerde payload-array of batchplan dragen, niet slechts één antwoordpayload.
- Behoud het huidige wachtrijherstelgedrag via compatibiliteitsconversie.
- Laat
deliverOutboundPayloadsmessages.sendaanroepen. - Maak duurzaamheid van definitieve verzending de standaard en faal gesloten wanneer de duurzame intent niet kan worden geschreven in de nieuwe berichtlevenscyclus, nadat de adapter replay-veiligheid verklaart. Bestaande inbound runner- en SDK-compatibiliteitspaden blijven tijdens deze fase standaard directe verzending gebruiken.
- Registreer ontvangstbewijzen consistent.
- Retourneer ontvangstbewijzen en bezorgresultaten aan de oorspronkelijke dispatcher-aanroeper in plaats van duurzame verzending als een terminaal neveneffect te behandelen.
- Bewaar berichtoorsprong via duurzame verzend-intents zodat herstel, replay en verzending in chunks de operationele herkomst van OpenClaw behouden.
Fase 3: Channel Inbound Bridge
- Implementeer
channel.inbound.runendispatchChannelInboundReplyopnieuw boven opmessages.receiveenmessages.send. - Houd huidige fact-typen stabiel.
- Behoud standaard legacy-gedrag. Een assembled-turn-kanaal wordt alleen duurzaam wanneer de adapter expliciet opt-in doet met een replay-veilig duurzaamheidsbeleid.
- Houd
durable: falseals compatibiliteitsuitweg voor paden die native bewerkingen finaliseren en nog niet veilig kunnen replayen, maar vertrouw niet opfalse-markeringen om niet-gemigreerde kanalen te beschermen. - Stel assembled-turn-duurzaamheid alleen standaard in binnen de nieuwe berichtlevenscyclus, nadat de kanaalkoppeling bewijst dat het generieke verzendpad de oude kanaalbezorgingssemantiek behoudt.
Fase 4: Prepared Dispatcher Bridge
- Vervang
deliverDurableInboundReplyPayloaddoor een send-context-bridge. - Behoud de oude helper als wrapper.
- Porteer eerst Telegram, WhatsApp, Slack, Signal, iMessage en Discord, omdat ze al durable-final-werk of eenvoudigere verzendpaden hebben.
- Behandel elke voorbereide dispatcher als niet gedekt totdat deze expliciet kiest voor de send context. Documentatie en changelog-vermeldingen moeten “samengestelde channel turns” zeggen of de gemigreerde kanaalpaden noemen in plaats van alle automatische eindantwoorden te claimen.
- Houd
recordInboundSessionAndDispatchReply, direct-DM-helpers en vergelijkbare publieke compatibiliteitshelpers gedragsbehoudend. Ze mogen later een expliciete send-context-opt-in blootstellen, maar mogen niet automatisch proberen generieke duurzame levering uit te voeren vóór de door de caller beheerde delivery callback.
Fase 5: Uniforme live-levenscyclus
- Bouw
messages.livemet twee proof-adapters:- Telegram voor verzenden plus bewerken plus verouderde eindverzending.
- Matrix voor conceptfinalisatie plus redactie-fallback.
- Migreer daarna Discord, Slack, Mattermost, Teams, QQ Bot en Feishu.
- Verwijder gedupliceerde code voor preview-finalisatie pas nadat elk kanaal pariteitstests heeft.
Fase 6: Publieke SDK
- Voeg
openclaw/plugin-sdk/channel-outboundtoe. - Documenteer dit als de voorkeurs-API voor channel-Plugins.
- Werk package-exports, entrypoint-inventaris, gegenereerde API-baselines en Plugin-SDK-documentatie bij.
- Neem
MessageOrigin, origin-encode/decode-hooks en het gedeeldeshouldDropOpenClawEcho-predicaat op in het channel-outbound-SDK-oppervlak. - Behoud compatibiliteitswrappers voor oude subpaden.
- Markeer reply-genoemde SDK-helpers als verouderd in de documentatie nadat gebundelde Plugins zijn gemigreerd.
Fase 7: Alle afzenders
Verplaats alle niet-reply outbound producers naarmessages.send:
- cron- en Heartbeat-meldingen
- taakvoltooiingen
- hook-resultaten
- goedkeuringsprompts en goedkeuringsresultaten
- verzendingen van message tools
- aankondigingen van voltooiing door subagents
- expliciete CLI- of Control UI-verzendingen
- automatiserings-/broadcastpaden
Fase 8: Turn-genoemde compatibiliteit verwijderen
- Behoud inbound/message-genoemde wrappers als compatibiliteitsvenster.
- Publiceer migratienotities.
- Voer Plugin-SDK-compatibiliteitstests uit tegen oude imports.
- Verwijder of verberg oude interne helpers pas nadat geen gebundelde Plugin ze nog nodig heeft en contracten van derden een stabiele vervanging hebben.
Testplan
Unittests:- Serialisatie en herstel van duurzame verzendintenties.
- Hergebruik van idempotentiesleutels en onderdrukking van duplicaten.
- Receipt-commit en replay-skip.
unknown_after_send-herstel dat reconcile uitvoert vóór replay wanneer een adapter reconciliation ondersteunt.- Beleid voor foutclassificatie.
- Volgordebepaling van receive-ack-beleid.
- Relatiemapping voor reply-, followup-, system- en broadcast-verzendingen.
- Origin-factory voor Gateway-fouten en
shouldDropOpenClawEcho-predicaat. - Behoud van origin via payloadnormalisatie, chunking, serialisatie van durable queue en herstel.
channel.inbound.runeenvoudige adapter registreert en verzendt nog steeds.- Verouderde assembled-event-levering wordt niet duurzaam tenzij het kanaal expliciet opt-in doet.
channel.inbound.runPreparedReply-bridge registreert en finaliseert nog steeds.- Publieke compatibiliteitshelpers roepen standaard door de caller beheerde delivery callbacks aan en generic-senden niet vóór die callbacks.
- Duurzame fallback-levering speelt de volledige geprojecteerde payload-array opnieuw af na herstart en kan de latere payloads niet ongeregistreerd laten na een vroege crash.
- Duurzame assembled-event-levering retourneert platformbericht-id’s aan de gebufferde dispatcher.
- Aangepaste delivery hooks retourneren nog steeds platformbericht-id’s wanneer duurzame levering is uitgeschakeld of niet beschikbaar is.
- Eindantwoord overleeft herstart tussen assistant-voltooiing en platformverzending.
- Preview-concept finaliseert op zijn plaats wanneer toegestaan.
- Preview-concept wordt geannuleerd of geredacteerd wanneer media-/fout-/reply-target-mismatch normale levering vereist.
- Block-streaming en preview-streaming leveren niet allebei dezelfde tekst.
- Vroeg gestreamde media worden niet gedupliceerd in de uiteindelijke levering.
- Telegram-topicantwoord met polling-ack uitgesteld tot de safe completed-watermark van de receive context.
- Telegram-pollingherstel voor geaccepteerde maar niet-geleverde updates gedekt door het persistente safe-completed-offsetmodel.
- Telegram verouderde preview verzendt verse finale en ruimt preview op.
- Telegram silent fallback verzendt elke geprojecteerde fallback-payload.
- Telegram silent fallback-duurzaamheid registreert de volledige geprojecteerde fallback-array atomisch, niet één duurzame single-payload-intentie per lusiteratie.
- Discord-preview-annulering bij media/fout/expliciete reply.
- Discord voorbereide dispatcher-finales routeren via de send context voordat docs of changelog Discord-final-reply-duurzaamheid claimen.
- iMessage duurzame eindverzendingen vullen de echo-cache voor verzonden berichten van de monitor.
- LINE, Zalo en Nostr legacy-delivery-paden worden niet omzeild door generic durable send totdat hun adapterpariteitstests bestaan.
- Direct-DM-/Nostr-callbacklevering blijft gezaghebbend tenzij expliciet gemigreerd naar een compleet message target en replay-veilige send-adapter.
- Slack getagde OpenClaw-Gateway-foutberichten blijven zichtbaar outbound, getagde
bot-room-echo’s worden gedropt vóór
allowBots, en ongetagde botberichten met dezelfde zichtbare tekst volgen nog steeds normale botautorisatie. - Slack native stream-fallback naar conceptpreview in top-level-DM’s.
- Matrix-previewfinalisatie en redactie-fallback.
- Matrix getagde OpenClaw-Gateway-fout-room-echo’s van geconfigureerde bot
accounts worden gedropt vóór
allowBots-afhandeling. - Discord en Google Chat shared-room-Gateway-failure-cascade-audits dekken
allowBots-modi voordat daar generieke bescherming wordt geclaimd. - Mattermost-conceptfinalisatie en fresh-send-fallback.
- Teams native voortgangsfinalisatie.
- Feishu-onderdrukking van dubbele finale.
- QQ Bot accumulator-timeout-fallback.
- Tlon duurzame eindverzendingen behouden model-signature-rendering en participated thread-tracking.
- WhatsApp, Signal, iMessage, Google Chat, LINE, IRC, Nostr, Nextcloud Talk, Synology Chat, Tlon, Twitch, Zalo en Zalo Personal eenvoudige duurzame eindverzendingen.
- Gerichte Vitest-bestanden tijdens ontwikkeling.
pnpm check:changedin Testbox voor het volledige gewijzigde oppervlak.- Bredere
pnpm checkin Testbox vóór het landen van de volledige refactor of na publieke SDK-/exportwijzigingen. - Live of qa-channel-smoke voor ten minste één kanaal dat bewerken ondersteunt en één eenvoudig send-only-kanaal voordat compatibiliteitswrappers worden verwijderd.
Open vragen
- Of Telegram uiteindelijk de grammY-runnerbron moet vervangen door een volledig duurzame pollingbron die platformniveau-herlevering kan sturen, niet alleen OpenClaw’s persistente herstart-watermark.
- Of duurzame live-previewstatus moet worden opgeslagen in hetzelfde queue-record als de uiteindelijke verzendintentie of in een sibling live-state-store.
- Hoe lang compatibiliteitswrappers gedocumenteerd blijven nadat
plugin-sdk/channel-outboundwordt verzonden. - Of Plugins van derden receive-adapters rechtstreeks moeten implementeren of alleen
normalize/send/live-hooks moeten leveren via
defineChannelMessageAdapter. - Welke receipt-velden veilig zijn om bloot te stellen in de publieke SDK versus interne runtime state.
- Of side-effects zoals self-echo-caches en participated-thread-markers moeten worden gemodelleerd als send-context-hooks, finalize-stappen beheerd door adapters, of receipt-subscribers.
- Welke kanalen native origin-metadata hebben, welke persistente outbound registries nodig hebben en welke geen betrouwbare cross-bot-echo-onderdrukking kunnen bieden.
Acceptatiecriteria
- Elk gebundeld berichtenkanaal verzendt uiteindelijke zichtbare uitvoer via
messages.send. - Elk inbound berichtenkanaal komt binnen via
messages.receiveof een gedocumenteerde compatibiliteitswrapper. - Elk preview-/edit-/stream-kanaal gebruikt
messages.livevoor conceptstatus en finalisatie. channel.inboundis alleen een wrapper.- Reply-genoemde SDK-helpers zijn compatibiliteitsexports, niet het aanbevolen pad.
- Duurzaam herstel kan pending eindverzendingen na herstart opnieuw afspelen zonder het eindantwoord te verliezen of reeds gecommitte verzendingen te dupliceren; verzendingen waarvan de platformuitkomst onbekend is, worden vóór replay gereconciled of gedocumenteerd als at-least-once voor die adapter.
- Duurzame eindverzendingen fail closed wanneer de durable intent niet kan worden geschreven, tenzij een caller expliciet een gedocumenteerde niet-duurzame modus heeft geselecteerd.
- Legacy SDK-compatibiliteitshelpers gebruiken standaard directe door het kanaal beheerde levering; generic durable send is alleen expliciete opt-in.
- Receipts behouden alle platformbericht-id’s voor leveringen met meerdere delen en een primaire id voor threading-/edit-gemak.
- Duurzame wrappers behouden kanaallokale side-effects voordat directe delivery callbacks worden vervangen.
- Voorbereide dispatchers worden niet als duurzaam meegeteld totdat hun uiteindelijke delivery path expliciet de send context gebruikt.
- Fallback-levering verwerkt elke geprojecteerde payload.
- Duurzame fallback-levering registreert elke geprojecteerde payload in één replaybare intentie of batchplan.
- Door OpenClaw afkomstige Gateway-foutoutput is zichtbaar voor mensen, maar getagde door bots gemaakte room-echo’s worden gedropt vóór botautorisatie op kanalen die ondersteuning voor het origin-contract declareren.
- De docs leggen send, receive, live, state, receipts, relations, failure policy, migration en test coverage uit.