Deze pagina is het doelontwerp voor het vervangen van verspreide helpers voor kanaalbeurten, antwoorddispatch, preview-streaming en uitgaande levering door één duurzame berichtlevenscyclus. De korte versie:Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
- De kernprimitieven moeten ontvangen en verzenden zijn, niet antwoorden.
- Een antwoord is alleen een relatie op een uitgaand bericht.
- Een beurt is een hulpmiddel voor inkomende verwerking, niet de eigenaar van levering.
- Verzenden moet contextgebaseerd zijn:
begin, renderen, preview of streamen, definitief verzenden, committen, mislukken. - Ontvangen moet ook contextgebaseerd zijn: normaliseren, dedupliceren, routeren, registreren, dispatchen, platform-ack, mislukken.
- De publieke plugin-SDK moet worden teruggebracht tot één klein oppervlak voor kanaalberichten.
Problemen
De huidige kanaalstack is ontstaan uit meerdere geldige lokale behoeften:- Eenvoudige inkomende adapters gebruiken
runtime.channel.turn.run. - Rijke adapters gebruiken
runtime.channel.turn.runPrepared. - Legacy-helpers gebruiken
dispatchInboundReplyWithBase,recordInboundSessionAndDispatchReply, helpers voor antwoordpayloads, antwoordchunking, antwoordreferenties en helpers voor uitgaande runtime. - Preview-streaming leeft in kanaalspecifieke dispatchers.
- Duurzaamheid van definitieve levering wordt toegevoegd rond bestaande paden voor antwoordpayloads.
Doelen
- Eén core-levenscyclus voor alle ontvang- en verzendpaden van kanaalberichten.
- Duurzame definitieve verzendingen standaard in de nieuwe berichtlevenscyclus nadat een adapter replay-veilig gedrag declareert.
- Gedeelde semantiek voor preview, bewerken, streamen, finalisatie, opnieuw proberen, herstel en ontvangstbewijzen.
- Een klein plugin-SDK-oppervlak dat externe plugins kunnen leren en onderhouden.
- Compatibiliteit voor bestaande
channel.turn-aanroepers tijdens de migratie. - Duidelijke uitbreidingspunten voor nieuwe kanaalmogelijkheden.
- Geen platformspecifieke branches in core.
- Geen token-delta-kanaalberichten. Kanaalstreaming blijft berichtpreview, bewerken, toevoegen of levering van voltooide blokken.
- Gestructureerde metadata van OpenClaw-oorsprong voor operationele/systeemuitvoer, zodat zichtbare gatewayfouten niet opnieuw gedeelde bot-ingeschakelde ruimtes binnenkomen als nieuwe prompts.
Niet-doelen
- Verwijder
runtime.channel.turn.*niet in de eerste fase. - Dwing niet elk kanaal in hetzelfde native transportgedrag.
- Leer core geen Telegram-onderwerpen, Slack-native 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 geschiedenisfetches - een statusadapter voor deduplicatie, locks, wachtrijen en persistentie
- Duurzame intenties voor uitgaande verzending vóór directe transportaanroepen.
- Expliciete verzendcontexten met begin, commit en fail.
- Ontvangcontexten die het beleid voor platform-ack 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 samenhangende bericht-API zien.
- Agentspecifiek gedrag: sessies, transcripts, block streaming, toolvoortgang, goedkeuringen, mediarichtlijnen, stille antwoorden en geschiedenis van groepsvermeldingen.
thread.post()-stijl 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 bezit de inkomende levenscyclus.
send bezit de uitgaande levenscyclus.
live bezit preview, bewerken, voortgang en streamstatus.
state bezit 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 uitvoer zijn die van OpenClaw afkomstig is.allowBots is ingeschakeld.
Ontvangstbewijs
Ontvangstbewijzen zijn first-class:Ontvangcontext
Ontvangen moet geen kale helperaanroep zijn. De core heeft een context nodig die deduplicatie, routering, sessieregistratie en platform-ack-beleid 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: schuift een cursor op zodat hetzelfde event niet opnieuw wordt opgehaald. Dit mag niet voorbij werk opschuiven dat niet kan worden hersteld.
- Inkomende-record-ack: bevestigt dat OpenClaw genoeg inkomende metadata heeft gepersisteerd om een herlevering te dedupliceren en routeren.
- Zichtbaar ontvangstbewijs voor gebruiker: optioneel lees-/status-/typgedrag; nooit een duurzaamheidsgrens.
ReceiveAckPolicy regelt alleen transport- of pollingbevestiging. Het mag niet worden hergebruikt voor leesbevestigingen of statusreacties.
Vóór botautorisatie moet ontvangen het gedeelde OpenClaw-echobeleid toepassen wanneer het kanaal metadata over berichtoorsprong kan decoderen:
allowBots-autorisatie.
Ack-beleid is expliciet:
getUpdates-fetch-offset van Telegram wordt nog steeds beheerd door de pollingbibliotheek, dus de resterende diepere ingreep is een volledig duurzame pollingbron als we platformniveau-herlevering buiten OpenClaw’s herstartwatermerk nodig hebben. Webhookplatforms kunnen onmiddellijke HTTP-ack nodig hebben, maar hebben nog steeds inkomende deduplicatie en duurzame uitgaande verzendintenties nodig omdat webhooks opnieuw kunnen leveren.
Verzendcontext
Verzenden is ook contextgebaseerd:unknown_after_send, niet blind opnieuw worden afgespeeld. Kanalen
zonder reconciliatie mogen at-least-once replay alleen kiezen als dubbele zichtbare
berichten een aanvaardbare, gedocumenteerde afweging zijn voor dat kanaal en die relatie.
De huidige SDK-reconciliatiebrug vereist dat de adapter
reconcileUnknownSend declareert, en vraagt daarna durableFinal.reconcileUnknownSend om
een onbekende entry te classificeren als sent, not_sent of unresolved; alleen not_sent
staat replay toe, en onopgeloste entries blijven terminaal of proberen alleen de
reconciliatiecontrole opnieuw.
Duurzaamheidsbeleid moet expliciet zijn:
required betekent dat core gesloten moet falen wanneer de duurzame intentie niet kan worden geschreven.
best_effort kan doorgaan wanneer persistentie niet beschikbaar is. disabled behoudt
het oude directe verzendgedrag. Tijdens migratie gebruiken legacy-wrappers en publieke
compatibiliteitshelpers standaard disabled; ze mogen required niet afleiden uit
het feit dat een kanaal een generieke uitgaande adapter heeft.
Verzendcontexten bezitten 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 onderdrukking van zelf-echo’s,
markeringen voor threaddeelname, native bewerkingsankers, rendering van modelhandtekeningen
en platformspecifieke dubbele guards. Die effecten moeten worden verplaatst naar de
verzendadapter, de renderadapter of een benoemde verzendcontexthaak voordat dat
kanaal duurzame generieke eindlevering kan inschakelen.
Verzendhelpers moeten receipts helemaal teruggeven aan hun aanroeper. Duurzame
wrappers mogen bericht-id’s niet inslikken of een kanaalleveringsresultaat vervangen door
undefined; gebufferde dispatchers gebruiken die id’s voor threadankers, latere bewerkingen,
preview-finalisatie en onderdrukking van duplicaten.
Fallback-verzendingen werken op batches, niet op afzonderlijke payloads. Stil-antwoord-herschrijvingen,
mediafallback, cardfallback en chunk-projectie kunnen allemaal meer dan
één leverbaar bericht produceren, dus een verzendcontext moet ofwel de volledige
geprojecteerde batch leveren, of expliciet documenteren waarom slechts één payload geldig is.
unknown_after_send totdat de adapter deze reconcilieert.
Live-context
Preview-, bewerkings-, voortgangs- en streamgedrag moeten één opt-in levenscyclus zijn.- Telegram-verzending plus bewerkingspreview, met nieuwe finale na verouderde previewleeftijd.
- Discord-verzending plus bewerkingspreview, annuleren bij media/fout/expliciet antwoord.
- Slack-native stream of conceptpreview, afhankelijk van de threadvorm.
- Mattermost-finalisatie van conceptpost.
- Matrix-finalisatie van conceptevent 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-oorsprongsmetadata retourneert. De ontvangstadapter
levert platformfeiten zoals botauteur en ruimtevorm; core bezit de drop-
beslissing en volgorde, zodat kanalen geen tekstfilters 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 dit mappen naar extra eventcontent; kanalen
zonder native metadata kunnen een receipt-/uitgaand register gebruiken wanneer dat de
beste beschikbare benadering is.
Capabilities:
Reductie van de publieke SDK
Het nieuwe publieke oppervlak moet deze conceptuele gebieden absorberen of afschaffen:reply-runtimereply-dispatch-runtimereply-referencereply-chunkingreply-payloadinbound-reply-dispatchchannel-reply-pipeline- de meeste publieke gebruiken van
outbound-runtime - ad-hochulpmiddelen voor de levenscyclus van conceptstreams
plugin-sdk/channel-message sturen zodra dit bestaat.
Relatie tot channel turn
runtime.channel.turn.* moet tijdens de migratie blijven bestaan.
Het moet een compatibiliteitsadapter worden:
channel.turn.runPrepared moet in eerste instantie ook blijven bestaan:
channel.turn worden afgeschaft. Het mag pas worden verwijderd wanneer er een
gepubliceerd SDK-migratiepad is en contracttests bewijzen dat oude plugins nog werken
of falen met een duidelijke versiefout.
Compatibiliteitsrails
Tijdens de migratie is generieke duurzame levering opt-in voor elk kanaal waarvan de bestaande leveringscallback neveneffecten heeft naast “deze payload verzenden”. Legacy-entrypoints zijn standaard niet-duurzaam:channel.turn.runendispatchAssembledChannelTurngebruiken de leveringscallback van het kanaal, tenzij dat kanaal expliciet een geaudit duurzaam beleid-/optiesobject levert.channel.turn.runPreparedblijft kanaaleigendom totdat de voorbereide dispatcher expliciet de verzendcontext 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 beleid-/optiewaarde. durable: false kan als compatibiliteitsspelling blijven bestaan, maar de implementatie moet niet
vereisen dat elk ongemigreerd kanaal dit toevoegt.
Huidige brugcode moet de duurzaamheidsbeslissing expliciet houden:
- Duurzame uiteindelijke levering retourneert een gediscrimineerde status.
handled_visibleenhandled_no_sendzijn terminaal;unsupportedennot_applicablekunnen terugvallen op kanaaleigen levering;failedpropageert de verzendfout. - Generieke duurzame uiteindelijke levering wordt afgeschermd door adaptermogelijkheden zoals stille levering, behoud van antwoorddoel, behoud van native citaten en hooks voor berichtverzending. Ontbrekende gelijkwaardigheid moet kanaaleigen levering kiezen, niet een generieke verzending die zichtbaar gebruikersgedrag wijzigt.
- Wachtrijgebaseerde duurzame verzendingen stellen een leveringsintentie-referentie beschikbaar. Bestaande
pendingFinalDelivery*-sessievelden kunnen tijdens de overgang de intentie-id bevatten; de eindtoestand is eenMessageSendIntent-opslag in plaats van bevroren antwoordtekst plus ad-hoc contextvelden.
- De generieke verzendadapter voert hetzelfde rendering- 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 ofwel de nieuwe verzendcontext aan, of blijven gedocumenteerd als buiten de duurzame garantie.
- Terugvallevering verwerkt elke geprojecteerde payload, niet alleen de eerste.
- Duurzame terugvallevering registreert de volledige geprojecteerde payload-array als één herhaalbare intentie of batchplan.
- iMessage-monitorlevering registreert verzonden berichten in een echo-cache na een succesvolle verzending. Duurzame uiteindelijke verzendingen moeten die cache nog steeds vullen, anders kan OpenClaw zijn eigen uiteindelijke antwoorden opnieuw opnemen als inkomende gebruikersberichten.
- Tlon voegt een optionele modelhandtekening toe en registreert deelgenomen threads na groepsantwoorden. Generieke duurzame levering mag die effecten niet omzeilen; verplaats ze ofwel naar Tlon-render-/verzend-/finalisatieadapters, of houd Tlon op het kanaaleigen pad.
- Discord en andere voorbereide dispatchers bezitten al directe levering en voorbeeld- gedrag. Ze vallen niet onder een duurzame garantie voor samengestelde beurten totdat hun voorbereide dispatchers uiteindelijke antwoorden expliciet via de verzendcontext routeren.
- Stille terugvallevering van Telegram moet de volledige geprojecteerde payload- array leveren. Een snelpad voor één payload kan extra terugvalpayloads na projectie laten vallen.
- LINE, BlueBubbles, Zalo, Nostr en andere bestaande samengestelde/helperpaden kunnen afhandeling van antwoordtokens, mediaproxying, caches voor verzonden berichten, opschoning van laad-/status- gegevens of doelen met alleen callbacks hebben. Ze blijven op kanaaleigen levering totdat die semantiek door de verzendadapter wordt vertegenwoordigd en door tests is geverifieerd.
- Direct-DM-helpers kunnen een antwoordcallback hebben die het enige correcte transport-
doel is. Generieke uitgaande verzending mag niet gokken op basis van
OriginatingToofToen die callback overslaan. - Foutuitvoer van de OpenClaw Gateway moet zichtbaar blijven voor mensen, maar getagde
door bots geschreven kamerecho’s moeten worden verwijderd vóór
allowBots-autorisatie. Kanalen mogen dit niet implementeren met prefixfilters op zichtbare tekst, behalve als korte noodoplossing; het duurzame contract is gestructureerde oorsprongsmetadata.
Interne opslag
De duurzame wachtrij moet verzendintenties voor berichten opslaan, geen antwoordpayloads.Foutklassen
Kanaaladapters classificeren transportfouten in gesloten categorieën:- Probeer
transientenrate_limitopnieuw. - Probeer
invalid_payloadniet opnieuw, tenzij er een renderingterugval bestaat. - Probeer
authofpermissionniet opnieuw totdat de configuratie wijzigt. - Laat live finalisatie voor
not_foundterugvallen van bewerken naar een nieuwe verzending wanneer het kanaal verklaart dat dit veilig is. - Gebruik voor
conflictontvangstbewijs-/idempotentieregels om te bepalen of het bericht al bestaat. - Elke fout nadat de adapter platform-I/O mogelijk heeft voltooid maar voordat het ontvangstbewijs is
vastgelegd, wordt
unknown_after_send, tenzij de adapter kan bewijzen dat de platform- bewerking niet heeft plaatsgevonden.
Kanaaltoewijzing
| Kanaal | Doelmigratie |
|---|---|
| Telegram | Ontvangstbeleid voor bevestigingen plus duurzame finale verzendingen. Live-adapter beheert verzenden plus bewerken van previews, finale verzending van verouderde previews, onderwerpen, overslaan van previews voor geciteerde antwoorden, mediafallback en retry-after-afhandeling. |
| Discord | Verzendadapter verpakt bestaande duurzame payloadbezorging. Live-adapter beheert conceptbewerking, voortgangsconcept, annulering van media-/foutpreview, behoud van antwoorddoel en ontvangstbewijzen voor bericht-id’s. Audit echo’s van door bots gemaakte Gateway-fouten in gedeelde kamers; gebruik een uitgaand register of een ander native equivalent als Discord geen oorsprongsmetadata op normale berichten kan dragen. |
| Slack | Verzendadapter verwerkt normale chatberichten. Live-adapter kiest een native stream wanneer de threadvorm dat ondersteunt, anders een conceptpreview. Ontvangstbewijzen behouden thread-timestamps. Oorsprongadapter koppelt OpenClaw Gateway-fouten aan Slack chat.postMessage.metadata en verwijdert getagde echo’s in botkamers voor allowBots-autorisatie. |
| Verzendadapter beheert tekst-/mediaverzending met duurzame finale intenties. Ontvangstadapter verwerkt groepsvermelding en afzenderidentiteit. Live kan afwezig blijven totdat WhatsApp een bewerkbaar transport heeft. | |
| Matrix | Live-adapter beheert bewerkingen van conceptevents, finalisatie, redactie, beperkingen voor versleutelde media en fallback bij mismatch van antwoorddoel. Ontvangstadapter beheert hydratie en deduplicatie van versleutelde events. Oorsprongadapter moet de oorsprong van OpenClaw Gateway-fouten coderen in Matrix-eventinhoud en echo’s van geconfigureerde botkamers verwijderen vóór allowBots-afhandeling. |
| Mattermost | Live-adapter beheert één conceptbericht, inklappen van voortgang/tools, finalisatie ter plekke en fallback voor nieuwe verzending. |
| Microsoft Teams | Live-adapter beheert native voortgang en blokstreamgedrag. Verzendadapter beheert activiteiten en ontvangstbewijzen voor bijlagen/kaarten. |
| Feishu | Renderadapter beheert rendering van tekst/kaarten/raw. Live-adapter beheert streamingkaarten en onderdrukking van dubbele finales. Verzendadapter beheert opmerkingen, onderwerpsessies, media en spraakonderdrukking. |
| QQ Bot | Live-adapter beheert C2C-streaming, accumulatortime-out en fallback voor finale verzending. Renderadapter beheert mediatags en tekst-als-spraak. |
| Signal | Eenvoudige ontvangst plus verzendadapter. Geen live-adapter tenzij signal-cli betrouwbare bewerkingsondersteuning toevoegt. |
| iMessage and BlueBubbles | Eenvoudige ontvangst plus verzendadapter. iMessage-verzending moet de populatie van de echo-cache van de monitor behouden voordat duurzame finales monitorbezorging kunnen omzeilen. BlueBubbles-specifiek typen, reacties en bijlagen blijven adaptercapaciteiten. |
| Google Chat | Eenvoudige ontvangst plus verzendadapter met threadrelatie gekoppeld aan ruimten en thread-id’s. Audit kamergedrag met allowBots=true voor getagde echo’s van OpenClaw Gateway-fouten. |
| LINE | Eenvoudige ontvangst plus verzendadapter met beperkingen voor antwoordtokens gemodelleerd als doel-/relatiecapaciteit. |
| Nextcloud Talk | SDK-ontvangstbrug plus verzendadapter. |
| IRC | Eenvoudige ontvangst plus verzendadapter, geen duurzame ontvangstbewijzen voor bewerkingen. |
| Nostr | Ontvangst plus verzendadapter voor versleutelde DM’s; ontvangstbewijzen zijn event-id’s. |
| QA Channel | Contracttestadapter voor ontvangst-, verzend-, live-, retry- en herstelgedrag. |
| Synology Chat | Eenvoudige ontvangst plus verzendadapter. |
| Tlon | Verzendadapter moet modelhandtekening-rendering en tracking van threads waaraan is deelgenomen behouden voordat generieke duurzame finale bezorging wordt ingeschakeld. |
| Twitch | Eenvoudige ontvangst plus verzendadapter met classificatie van rate limits. |
| Zalo | Eenvoudige ontvangst plus verzendadapter. |
| Zalo Personal | Eenvoudige ontvangst plus verzendadapter. |
Migratieplan
Fase 1: Intern berichtdomein
- Voeg
src/channels/message/*-typen toe voor berichten, doelen, relaties, oorsprongen, ontvangstbewijzen, capaciteiten, duurzame intenties, ontvangstcontext, verzendcontext, live-context en foutklassen. - Voeg
origin?: MessageOrigintoe aan het migratiebrug-payloadtype dat wordt gebruikt door de 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 unittests toe voor statusovergangen en serialisatie.
Fase 2: Kern voor duurzaam verzenden
- Verplaats de bestaande uitgaande wachtrij van duurzaamheid voor antwoordpayloads naar duurzame intenties voor berichtverzending.
- Laat een duurzame verzendintentie een geprojecteerde payloadarray of batchplan dragen, niet slechts één antwoordpayload.
- Behoud het huidige wachtrijherstelgedrag via compatibiliteitsconversie.
- Laat
deliverOutboundPayloadsmessages.sendaanroepen. - Maak duurzaamheid van finale verzending de standaard en faal gesloten wanneer de duurzame intentie niet kan worden geschreven in de nieuwe berichtlevenscyclus, nadat de adapter replay-veiligheid verklaart. Bestaande channel-turn- en SDK-compatibiliteitspaden blijven tijdens deze fase standaard directe verzending.
- Registreer ontvangstbewijzen consistent.
- Geef ontvangstbewijzen en bezorgresultaten terug aan de oorspronkelijke dispatcher-aanroeper in plaats van duurzaam verzenden als een terminaal neveneffect te behandelen.
- Persisteer berichtoorsprong via duurzame verzendintenties zodat herstel, replay en verzending in chunks de operationele herkomst van OpenClaw behouden.
Fase 3: Brug voor kanaalturns
- Herimplementeer
channel.turn.runendispatchAssembledChannelTurnboven opmessages.receiveenmessages.send. - Houd huidige feittypen stabiel.
- Behoud standaard legacygedrag. Een kanaal met samengestelde turns wordt alleen duurzaam wanneer de adapter daar expliciet voor kiest 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 ongemigreerde kanalen te beschermen. - Schakel standaardduurzaamheid voor samengestelde turns alleen in de nieuwe berichtlevenscyclus in, nadat de kanaalkoppeling bewijst dat het generieke verzendpad de oude kanaalbezorgingssemantiek behoudt.
Fase 4: Brug voor voorbereide dispatcher
- 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 send-paden hebben.
- Behandel elke voorbereide dispatcher als ongedekt totdat deze expliciet kiest voor de send-context. Documentatie en changelog-vermeldingen moeten “samengestelde kanaalbeurten” zeggen of de gemigreerde kanaalpaden noemen, in plaats van alle automatische final replies te claimen.
- Houd het gedrag van
recordInboundSessionAndDispatchReply, direct-DM helpers en vergelijkbare openbare compatibiliteitshelpers behoudend. Ze mogen later een expliciete send-context opt-in aanbieden, maar mogen niet automatisch proberen generieke durable delivery uit te voeren vóór de delivery callback die eigendom is van de aanroeper.
Fase 5: Unified Live Lifecycle
- Bouw
messages.livemet twee bewijsadapters:- Telegram voor send plus edit plus stale final send.
- Matrix voor draft-finalisatie plus redaction fallback.
- Migreer daarna Discord, Slack, Mattermost, Teams, QQ Bot en Feishu.
- Verwijder gedupliceerde preview-finalisatiecode pas nadat elk kanaal pariteitstests heeft.
Fase 6: Openbare SDK
- Voeg
openclaw/plugin-sdk/channel-messagetoe. - Documenteer dit als de voorkeurs-API voor kanaalplugins.
- Werk package-exports, entrypoint-inventaris, gegenereerde API-baselines en Plugin SDK-documentatie bij.
- Neem
MessageOrigin, origin encode/decode hooks en de gedeeldeshouldDropOpenClawEchopredicate op in het channel-message 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 Senders
Verplaats alle niet-reply outbound producers naarmessages.send:
- cron- en heartbeatmeldingen
- taakvoltooiingen
- hook-resultaten
- goedkeuringsprompts en goedkeuringsresultaten
- sends van de message tool
- aankondigingen van subagent-voltooiing
- expliciete CLI- of Control UI-sends
- automation/broadcast-paden
Fase 8: Turn verouderd maken
- Behoud
channel.turnten minste één compatibiliteitsvenster als wrapper. - Publiceer migratienotities.
- Voer Plugin SDK-compatibiliteitstests uit tegen oude imports.
- Verwijder of verberg oude interne helpers pas nadat geen gebundelde plugin ze meer nodig heeft en externe contracten een stabiele vervanging hebben.
Testplan
Unittests:- Durable send intent-serialisatie en herstel.
- Hergebruik van idempotency keys en duplicate suppression.
- Receipt-commit en replay-skip.
unknown_after_send-herstel dat vóór replay reconcilieert wanneer een adapter reconciliatie ondersteunt.- Beleid voor failure classification.
- Sequentiebepaling voor receive ack-beleid.
- Relation mapping voor reply-, followup-, system- en broadcast-sends.
- Gateway-failure origin factory en
shouldDropOpenClawEchopredicate. - Behoud van origin via payload-normalisatie, chunking, durable queue- serialisatie en herstel.
channel.turn.runsimple adapter registreert en verzendt nog steeds.- Legacy assembled-turn delivery wordt niet durable tenzij het kanaal expliciet opt-in doet.
channel.turn.runPreparedbridge registreert en finaliseert nog steeds.- Openbare compatibiliteitshelpers roepen standaard caller-owned delivery callbacks aan en doen geen generic-send vóór die callbacks.
- Durable fallback delivery speelt de volledige geprojecteerde payload-array opnieuw af na herstart en kan de latere payloads niet ongeregistreerd laten na een vroege crash.
- Durable assembled-turn delivery retourneert platform message ids aan de gebufferde dispatcher.
- Custom delivery hooks retourneren nog steeds platform message ids wanneer durable delivery uitgeschakeld of niet beschikbaar is.
- Final reply overleeft een herstart tussen assistant-voltooiing en platform send.
- Preview draft finaliseert in-place wanneer toegestaan.
- Preview draft wordt geannuleerd of geredigeerd wanneer media/error/reply-target mismatch normale delivery vereist.
- Block streaming en preview streaming leveren niet beide dezelfde tekst.
- Vroeg gestreamde media wordt niet gedupliceerd in final delivery.
- Telegram topic reply met polling ack vertraagd tot het veilige voltooide watermark van de receive context.
- Telegram polling recovery voor geaccepteerde maar niet-geleverde updates, gedekt door het persisted safe-completed offset model.
- Telegram stale preview verzendt een verse final en ruimt preview op.
- Telegram silent fallback verzendt elke geprojecteerde fallback-payload.
- Telegram silent fallback durability registreert de volledige geprojecteerde fallback-array atomisch, niet één single-payload durable intent per lusiteratie.
- Discord preview cancel bij media/error/expliciete reply.
- Discord prepared dispatcher finals lopen via de send context voordat docs of changelog Discord final-reply durability claimen.
- iMessage durable final sends vullen de monitor sent-message echo cache.
- LINE, BlueBubbles, Zalo en Nostr legacy delivery-paden worden niet omzeild door generic durable send totdat hun adapterpariteitstests bestaan.
- Direct-DM/Nostr callback delivery blijft gezaghebbend tenzij expliciet gemigreerd naar een volledig message target en replay-safe send adapter.
- Slack getagde OpenClaw Gateway failure messages blijven zichtbaar outbound,
getagde bot-room echoes vallen weg vóór
allowBots, en ongetagde botberichten met dezelfde zichtbare tekst volgen nog steeds normale botautorisatie. - Slack native stream fallback naar draft preview in top-level DMs.
- Matrix preview-finalisatie en redaction fallback.
- Matrix getagde OpenClaw Gateway-failure room echoes van geconfigureerde
botaccounts vallen weg vóór
allowBots-afhandeling. - Discord en Google Chat shared-room gateway-failure cascade audits dekken
allowBots-modi voordat daar generieke bescherming wordt geclaimd. - Mattermost draft-finalisatie en fresh-send fallback.
- Teams native progress-finalisatie.
- Feishu duplicate final suppression.
- QQ Bot accumulator timeout fallback.
- Tlon durable final sends 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 simple durable final sends.
- 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 openbare SDK/export-wijzigingen. - Live of qa-channel smoke voor ten minste één edit-capable kanaal en één eenvoudig send-only kanaal voordat compatibiliteitswrappers worden verwijderd.
Open vragen
- Of Telegram uiteindelijk de grammY runner source moet vervangen door een volledig durable polling source die platform-level redelivery kan aansturen, niet alleen OpenClaw’s persisted restart watermark.
- Of durable live preview state in hetzelfde queue record als de final send intent moet worden opgeslagen of in een sibling live-state store.
- Hoe lang compatibiliteitswrappers gedocumenteerd blijven nadat
plugin-sdk/channel-messageis verzonden. - Of externe plugins receive adapters rechtstreeks moeten implementeren of
alleen normalize/send/live hooks moeten bieden via
defineChannelMessageAdapter. - Welke receipt-velden veilig zijn om in de openbare SDK bloot te stellen versus interne runtime state.
- Of bijwerkingen zoals self-echo caches en participated-thread markers moeten worden gemodelleerd als send-context hooks, adapter-owned finalize steps of receipt subscribers.
- Welke kanalen native origin metadata hebben, welke persisted outbound registries nodig hebben en welke geen betrouwbare cross-bot echo suppression kunnen bieden.
Acceptatiecriteria
- Elk gebundeld message channel verzendt final visible output via
messages.send. - Elk inbound message channel komt binnen via
messages.receiveof een gedocumenteerde compatibiliteitswrapper. - Elk preview/edit/stream channel gebruikt
messages.livevoor draft state en finalization. channel.turnis alleen een wrapper.- Reply-genoemde SDK-helpers zijn compatibiliteitsexports, niet het aanbevolen pad.
- Durable recovery kan pending final sends na herstart opnieuw afspelen zonder de final response te verliezen of reeds gecommitte sends te dupliceren; sends waarvan de platformuitkomst onbekend is, worden vóór replay gereconcilieerd of gedocumenteerd als at-least-once voor die adapter.
- Durable final sends fail closed wanneer de durable intent niet kan worden geschreven, tenzij een aanroeper expliciet een gedocumenteerde non-durable mode heeft geselecteerd.
- Legacy channel-turn en SDK-compatibiliteitshelpers gebruiken standaard directe channel-owned delivery; generic durable send is alleen expliciete opt-in.
- Receipts behouden alle platform message ids voor meerdelige deliveries en een primaire id voor threading/edit convenience.
- Durable wrappers behouden channel-local side effects voordat direct delivery callbacks worden vervangen.
- Prepared dispatchers tellen niet als durable totdat hun final delivery path expliciet de send context gebruikt.
- Fallback delivery verwerkt elke geprojecteerde payload.
- Durable fallback delivery registreert elke geprojecteerde payload in één replayable intent of batch plan.
- OpenClaw-originated Gateway failure output is zichtbaar voor mensen, maar getagde bot-authored room echoes worden vóór botautorisatie verwijderd op kanalen die ondersteuning voor het origin contract declareren.
- De documentatie legt send, receive, live, state, receipts, relations, failure policy, migration en test coverage uit.