Registro di compatibilità
I contratti di compatibilità dei plugin sono tracciati nel registro core insrc/plugins/compat/registry.ts.
Ogni record contiene:
- un codice di compatibilità stabile
- stato:
active,deprecated,removal-pendingoremoved - proprietario: SDK, configurazione, setup, canale, provider, esecuzione del plugin, runtime dell’agente o core
- date di introduzione e deprecazione quando applicabili
- indicazioni per la sostituzione
- documentazione, diagnostica e test che coprono il comportamento vecchio e nuovo
src/commands/doctor/shared/deprecation-compat.ts. Quei record coprono vecchie forme di configurazione, layout del registro installazioni e shim di riparazione che potrebbero dover restare disponibili dopo la rimozione del percorso di compatibilità runtime.
Le revisioni di release dovrebbero controllare entrambi i registri. Non eliminare una migrazione di doctor solo perché il record di compatibilità runtime o di configurazione corrispondente è scaduto; prima verifica che non esista un percorso di aggiornamento supportato che abbia ancora bisogno della riparazione. Rivalida inoltre ogni annotazione di sostituzione durante la pianificazione della release, perché la proprietà dei plugin e l’impronta della configurazione possono cambiare quando provider e canali escono dal core.
Pacchetto ispettore dei plugin
L’ispettore dei plugin dovrebbe vivere fuori dal repository core di OpenClaw come pacchetto/repository separato, basato sui contratti di compatibilità e manifest versionati. La CLI del primo giorno dovrebbe essere:- validazione manifest/schema
- la versione di compatibilità del contratto controllata
- controlli dei metadati di installazione/sorgente
- controlli di importazione cold-path
- avvisi di deprecazione e compatibilità
--json per un output stabile leggibile da macchina nelle annotazioni CI. Il core OpenClaw dovrebbe esporre contratti e fixture che l’ispettore può consumare, ma non dovrebbe pubblicare il binario dell’ispettore dal pacchetto principale openclaw.
Corsia di accettazione per maintainer
Usa Blacksmith Testbox con backend Crabbox per la corsia di accettazione del pacchetto installabile quando validi l’ispettore esterno rispetto ai pacchetti plugin di OpenClaw. Eseguila da un checkout OpenClaw pulito dopo la build del pacchetto:Criterio di deprecazione
OpenClaw non dovrebbe rimuovere un contratto plugin documentato nella stessa release che introduce la sua sostituzione. La sequenza di migrazione è:- Aggiungi il nuovo contratto.
- Mantieni il vecchio comportamento collegato tramite un adattatore di compatibilità nominato.
- Emetti diagnostica o avvisi quando gli autori di plugin possono intervenire.
- Documenta sostituzione e tempistiche.
- Testa sia i vecchi sia i nuovi percorsi.
- Attendi per tutta la finestra di migrazione annunciata.
- Rimuovi solo con approvazione esplicita per release breaking.
active.
Aree di compatibilità attuali
I record di compatibilità attuali includono:- vecchi import SDK ampi come
openclaw/plugin-sdk/compat - vecchie forme di plugin solo hook e
before_agent_start - vecchi nomi di hook di pulizia
api.on("deactivate", ...)mentre i plugin migrano agateway_stop - vecchi entrypoint plugin
activate(api)mentre i plugin migrano aregister(api) - vecchi alias SDK come
openclaw/extension-api,openclaw/plugin-sdk/channel-runtime, builder di statoopenclaw/plugin-sdk/command-auth,openclaw/plugin-sdk/test-utils(sostituito da sottopercorsi di testopenclaw/plugin-sdk/*mirati) e gli alias di tipoClawdbotConfig/OpenClawSchemaType - comportamento di allowlist e abilitazione dei plugin bundled
- vecchi metadati manifest per env-var di provider/canale
- vecchi hook dei plugin provider e alias di tipo mentre i provider passano a hook espliciti di catalogo, autenticazione, thinking, replay e trasporto
- vecchi alias runtime come
api.runtime.taskFlow,api.runtime.subagent.getSession,api.runtime.stte i deprecatiapi.runtime.config.loadConfig()/api.runtime.config.writeConfigFile(...) - campi callback piatti
WebInboundMessagedi WhatsApp comebody,chatId,reply(...)emediaPathmentre i consumatori di callback migrano ai contesti annidatiWebInboundCallbackMessageevent,payload,quote,groupeplatform - campi di ammissione top-level
WebInboundMessagedi WhatsApp comefrom,conversationId,accountId,accessControlPassedechatTypementre i consumatori di callback migrano all’envelopeadmission - vecchia registrazione separata dei plugin di memoria mentre i plugin di memoria passano a
registerMemoryCapability - vecchia registrazione di provider di embedding specifica per memoria mentre i provider di embedding passano a
api.registerEmbeddingProvider(...)econtracts.embeddingProviders - vecchi helper SDK di canale per schemi di messaggi nativi, gating delle menzioni, formattazione degli envelope in ingresso e annidamento delle capability di approvazione
- vecchi alias della chiave di route di canale e degli helper comparable-target mentre i plugin passano a
openclaw/plugin-sdk/channel-route - suggerimenti di attivazione che vengono sostituiti dalla proprietà dei contributi nel manifest
- fallback runtime
setup-apimentre i descrittori di setup passano ai metadati coldsetup.requiresRuntime: false - hook
discoverydei provider mentre gli hook di catalogo dei provider passano acatalog.run(...) - metadati di canale
showConfigured/showInSetupmentre i pacchetti canale passano aopenclaw.channel.exposure - vecchie chiavi di configurazione runtime-policy mentre doctor migra gli operatori a
agentRuntime - fallback dei metadati di configurazione dei canali bundled generati mentre arrivano i metadati
channelConfigsregistry-first - flag env persistiti di disabilitazione del registro plugin e migrazione installazioni mentre
i flussi di riparazione migrano gli operatori a
openclaw plugins registry --refresheopenclaw doctor --fix - vecchi percorsi di configurazione di web search, web fetch e x_search di proprietà dei plugin mentre
doctor li migra a
plugins.entries.<plugin>.config - vecchia configurazione autoriale
plugins.installse alias dei percorsi di caricamento dei plugin bundled mentre i metadati di installazione passano al registro plugin gestito dallo stato
Alias piatti dei callback inbound di WhatsApp
I callback runtime di WhatsApp consegnanoWebInboundMessage: i contesti canonici annidati
event, payload, quote, group e platform più alias piatti deprecati per i campi callback rilasciati. Il nuovo codice callback dovrebbe leggere i contesti annidati. Il codice che costruisce messaggi callback annidati puliti può usare
WebInboundCallbackMessage; i listener di compatibilità che iniettano ancora vecchi messaggi di test o plugin piatti dovrebbero usare LegacyFlatWebInboundMessage o
WebInboundMessageInput.
Gli alias piatti restano disponibili fino al 2026-08-30. Quella finestra di rimozione si applica solo all’accesso agli alias piatti; la forma callback annidata è il contratto runtime canonico. Le annotazioni TypeScript @deprecated su ogni alias piatto indicano la sua sostituzione annidata esatta. Esempi comuni:
id,timestampeisBatchedsi spostano sottoevent.body,mediaPath,mediaType,mediaFileName,mediaUrl,locationeuntrustedStructuredContextsi spostano sottopayload.to,chatId, campi mittente/self,sendComposing,reply(...)esendMedia(...)si spostano sottoplatform.- I campi
replyTo*si spostano sottoquote, e i campi di oggetto gruppo/partecipante/menzione si spostano sottogroup.
payload.untrustedStructuredContext viene estratto dai payload dei provider in ingresso.
I plugin dovrebbero ispezionare label, source e type prima di trattare il suo
payload come autorevole.
Campi di ammissione inbound di WhatsApp
I messaggi callback WhatsApp accettati ora trasportanoadmission, un envelope sicuro per il pubblico per la decisione di controllo degli accessi che ha ammesso il messaggio. Il nuovo codice callback dovrebbe leggere i fatti di ammissione da msg.admission invece che dai vecchi campi di ammissione top-level.
I campi top-level restano disponibili fino al 2026-08-30. Le annotazioni TypeScript
@deprecated indicano ogni sostituzione:
fromeconversationIdsi spostano inadmission.conversation.id.accountIdsi sposta inadmission.accountId.accessControlPassedè una vista di compatibilità derivata daadmission.ingress.decision === "allow"; sui messaggi che trasportano giàadmission, scrivere il booleano legacy non riscrive il grafo ingress.chatTypesi sposta inadmission.conversation.kind.
Note di release
Le note di release dovrebbero includere le prossime deprecazioni dei plugin con date obiettivo e link alla documentazione di migrazione. Quell’avviso deve avvenire prima che un percorso di compatibilità passi aremoval-pending o removed.