Plugin maintainer reference
Compatibilité des Plugins
OpenClaw conserve les anciens contrats de Plugins branchés via des adaptateurs de compatibilité nommés avant de les supprimer. Cela protège les Plugins groupés et externes existants pendant que les contrats du SDK, du manifeste, de la configuration, de la config et du runtime d’agent évoluent.
Registre de compatibilité
Les contrats de compatibilité des Plugins sont suivis dans le registre central à
src/plugins/compat/registry.ts.
Chaque enregistrement comporte :
- un code de compatibilité stable
- un statut :
active,deprecated,removal-pendingouremoved - un propriétaire : SDK, config, configuration, canal, fournisseur, exécution de Plugin, runtime d’agent, ou core
- les dates d’introduction et de dépréciation, le cas échéant
- des consignes de remplacement
- la documentation, les diagnostics et les tests qui couvrent l’ancien et le nouveau comportement
Le registre est la source pour la planification des mainteneurs et les futurs contrôles de l’inspecteur de Plugins. Si un comportement exposé aux Plugins change, ajoutez ou mettez à jour l’enregistrement de compatibilité dans le même changement qui ajoute l’adaptateur.
La compatibilité des réparations et migrations de Doctor est suivie séparément dans
src/commands/doctor/shared/deprecation-compat.ts. Ces enregistrements couvrent les anciennes formes de config, les dispositions de journal d’installation et les shims de réparation qui peuvent devoir rester disponibles après la suppression du chemin de compatibilité du runtime.
Les balayages de release doivent vérifier les deux registres. Ne supprimez pas une migration Doctor simplement parce que l’enregistrement de compatibilité runtime ou config correspondant a expiré ; vérifiez d’abord qu’aucun chemin de mise à niveau pris en charge n’a encore besoin de cette réparation. Revalidez aussi chaque annotation de remplacement pendant la planification de release, car la propriété des Plugins et l’empreinte de config peuvent changer à mesure que les fournisseurs et les canaux sortent du core.
Package d’inspecteur de Plugins
L’inspecteur de Plugins doit vivre en dehors du repo core OpenClaw, sous forme de package/référentiel séparé adossé aux contrats de compatibilité et de manifeste versionnés.
La CLI du premier jour doit être :
openclaw-plugin-inspector ./my-pluginElle doit émettre :
- la validation du manifeste/schéma
- la version de compatibilité de contrat vérifiée
- les contrôles des métadonnées d’installation/source
- les contrôles d’import sur chemin froid
- les avertissements de dépréciation et de compatibilité
Utilisez --json pour une sortie stable lisible par machine dans les annotations CI. Le core OpenClaw doit exposer les contrats et fixtures que l’inspecteur peut consommer, mais ne doit pas publier le binaire de l’inspecteur depuis le package principal openclaw.
Voie d’acceptation des mainteneurs
Utilisez Blacksmith Testbox adossé à Crabbox pour la voie d’acceptation des packages installables lors de la validation de l’inspecteur externe contre des packages de Plugins OpenClaw. Exécutez-la depuis un checkout OpenClaw propre après la construction du package :
pnpm crabbox:run -- --provider blacksmith-testbox --timing-json --shell -- "pnpm install && pnpm build && npm exec --yes @openclaw/plugin-inspector@0.1.0 -- ./extensions/telegram --json"pnpm crabbox:run -- --provider blacksmith-testbox --timing-json --shell -- "npm exec --yes @openclaw/plugin-inspector@0.1.0 -- ./extensions/discord --json"pnpm crabbox:run -- --provider blacksmith-testbox --timing-json --shell -- "npm exec --yes @openclaw/plugin-inspector@0.1.0 -- <clawhub-plugin-dir> --json"Gardez cette voie opt-in pour les mainteneurs, car elle installe un package npm externe et peut inspecter des packages de Plugins clonés hors du repo. Les garde-fous du repo local couvrent l’export map du SDK, les métadonnées du registre de compatibilité, la réduction des imports SDK dépréciés et les limites d’import des extensions groupées ; la preuve de l’inspecteur Testbox couvre le package tel que les auteurs de Plugins externes le consomment.
Politique de dépréciation
OpenClaw ne doit pas supprimer un contrat de Plugin documenté dans la même release qui introduit son remplacement.
La séquence de migration est :
- Ajouter le nouveau contrat.
- Garder l’ancien comportement branché via un adaptateur de compatibilité nommé.
- Émettre des diagnostics ou avertissements lorsque les auteurs de Plugins peuvent agir.
- Documenter le remplacement et le calendrier.
- Tester les anciens et nouveaux chemins.
- Attendre pendant la fenêtre de migration annoncée.
- Supprimer uniquement avec une approbation explicite de release avec changements cassants.
Les enregistrements dépréciés doivent inclure une date de début d’avertissement, un remplacement, un lien de documentation et une date de suppression finale au plus tard trois mois après le début de l’avertissement. N’ajoutez pas de chemin de compatibilité déprécié avec une fenêtre de suppression ouverte, sauf si les mainteneurs décident explicitement qu’il s’agit d’une compatibilité permanente et le marquent plutôt active.
Zones de compatibilité actuelles
Les enregistrements de compatibilité actuels incluent :
- les anciens imports SDK larges comme
openclaw/plugin-sdk/compat - les anciennes formes de Plugins à hooks uniquement et
before_agent_start - les anciens noms de hook de nettoyage
api.on("deactivate", ...)pendant que les Plugins migrent versgateway_stop - les anciens points d’entrée de Plugin
activate(api)pendant que les Plugins migrent versregister(api) - les anciens alias SDK comme
openclaw/extension-api,openclaw/plugin-sdk/channel-runtime, les constructeurs de statutopenclaw/plugin-sdk/command-auth,openclaw/plugin-sdk/test-utils(remplacé par des sous-chemins de test ciblésopenclaw/plugin-sdk/*) et les alias de typeClawdbotConfig/OpenClawSchemaType - le comportement de liste d’autorisation et d’activation des Plugins groupés
- les anciennes métadonnées de manifeste de variables d’environnement fournisseur/canal
- les anciens hooks de Plugins fournisseurs et alias de type pendant que les fournisseurs migrent vers les hooks explicites de catalogue, auth, thinking, replay et transport
- les anciens alias runtime comme
api.runtime.taskFlow,api.runtime.subagent.getSession,api.runtime.sttet les méthodes dépréciéesapi.runtime.config.loadConfig()/api.runtime.config.writeConfigFile(...) - les champs plats de callback WhatsApp
WebInboundMessagecommebody,chatId,reply(...)etmediaPathpendant que les consommateurs de callbacks migrent vers les contextes imbriquésevent,payload,quote,groupetplatformdeWebInboundCallbackMessage - les champs d’admission de premier niveau WhatsApp
WebInboundMessagecommefrom,conversationId,accountId,accessControlPassedetchatTypependant que les consommateurs de callbacks migrent vers l’enveloppeadmission - l’ancienne inscription scindée des Plugins de mémoire pendant que les Plugins de mémoire migrent vers
registerMemoryCapability - l’ancienne inscription de fournisseurs d’embeddings spécifique à la mémoire pendant que les fournisseurs d’embeddings
migrent vers
api.registerEmbeddingProvider(...)etcontracts.embeddingProviders - les anciens helpers SDK de canal pour les schémas de messages natifs, le filtrage des mentions, la mise en forme d’enveloppes entrantes et l’imbrication des capacités d’approbation
- l’ancienne clé de route de canal et les alias de helpers de cible comparable pendant que les Plugins
migrent vers
openclaw/plugin-sdk/channel-route - les indices d’activation qui sont remplacés par la propriété des contributions de manifeste
- le fallback runtime
setup-apipendant que les descripteurs de configuration migrent vers les métadonnées froidessetup.requiresRuntime: false - les hooks
discoveryde fournisseur pendant que les hooks de catalogue fournisseur migrent verscatalog.run(...) - les métadonnées de canal
showConfigured/showInSetuppendant que les packages de canal migrent versopenclaw.channel.exposure - les anciennes clés de config de politique runtime pendant que Doctor migre les opérateurs vers
agentRuntime - le fallback des métadonnées générées de config de canal groupé pendant que les métadonnées
channelConfigsregistry-first arrivent - les flags env de désactivation du registre de Plugins persistant et de migration d’installation pendant que
les flux de réparation migrent les opérateurs vers
openclaw plugins registry --refreshetopenclaw doctor --fix - les anciens chemins de config de recherche Web, récupération Web et x_search détenus par des Plugins pendant que
Doctor les migre vers
plugins.entries.<plugin>.config - l’ancienne config rédigée
plugins.installset les alias de chemin de chargement de Plugins groupés pendant que les métadonnées d’installation migrent dans le registre de Plugins géré par l’état
Le nouveau code de Plugin doit préférer le remplacement indiqué dans le registre et dans le guide de migration spécifique. Les Plugins existants peuvent continuer à utiliser un chemin de compatibilité jusqu’à ce que la documentation, les diagnostics et les notes de release annoncent une fenêtre de suppression.
Alias plats de callbacks entrants WhatsApp
Les callbacks runtime WhatsApp livrent WebInboundMessage : les contextes imbriqués canoniques
event, payload, quote, group et platform, plus des alias plats dépréciés pour les champs de callback livrés. Le nouveau code de callback doit lire les contextes imbriqués. Le code qui construit des messages de callback imbriqués propres peut utiliser
WebInboundCallbackMessage ; les écouteurs de compatibilité qui injectent encore d’anciens messages de test ou de Plugin plats doivent utiliser LegacyFlatWebInboundMessage ou
WebInboundMessageInput.
Les alias plats restent disponibles jusqu’au 2026-08-30. Cette fenêtre de suppression s’applique uniquement à l’accès aux alias plats ; la forme imbriquée de callback est le contrat runtime canonique. Les annotations TypeScript @deprecated sur chaque alias plat nomment son remplacement imbriqué exact. Exemples courants :
id,timestampetisBatchedpassent sousevent.body,mediaPath,mediaType,mediaFileName,mediaUrl,locationetuntrustedStructuredContextpassent souspayload.to,chatId, les champs expéditeur/soi-même,sendComposing,reply(...)etsendMedia(...)passent sousplatform.- Les champs
replyTo*passent sousquote, et les champs de sujet/participant/mention de groupe passent sousgroup.
payload.untrustedStructuredContext est extrait des payloads fournisseurs entrants.
Les Plugins doivent inspecter label, source et type avant de traiter son
payload comme faisant autorité.
Champs d’admission entrants WhatsApp
Les messages de callback WhatsApp acceptés portent désormais admission, une enveloppe sûre pour le public pour la décision de contrôle d’accès qui a admis le message. Le nouveau code de callback doit lire les faits d’admission depuis msg.admission plutôt que depuis les anciens champs d’admission de premier niveau.
Les champs de premier niveau restent disponibles jusqu’au 2026-08-30. Les annotations TypeScript
@deprecated nomment chaque remplacement :
frometconversationIdpassent àadmission.conversation.id.accountIdpasse àadmission.accountId.accessControlPassedest une vue de compatibilité dérivée deadmission.ingress.decision === "allow"; sur les messages qui portent déjàadmission, écrire le booléen legacy ne réécrit pas le graphe d’ingress.chatTypepasse àadmission.conversation.kind.
Notes de release
Les notes de release doivent inclure les dépréciations de Plugins à venir avec les dates cibles et les liens vers les documents de migration. Cet avertissement doit avoir lieu avant qu’un chemin de compatibilité passe à removal-pending ou removed.