Registro de compatibilidade
Contratos de compatibilidade de plugins são rastreados no registro central emsrc/plugins/compat/registry.ts.
Cada registro tem:
- um código de compatibilidade estável
- status:
active,deprecated,removal-pendingouremoved - proprietário: SDK, config, configuração, canal, provedor, execução de plugin, runtime do agente ou núcleo
- datas de introdução e depreciação quando aplicável
- orientação de substituição
- docs, diagnósticos e testes que cobrem o comportamento antigo e o novo
src/commands/doctor/shared/deprecation-compat.ts. Esses registros cobrem
formatos antigos de config, layouts do livro-razão de instalação e shims de
reparo que talvez precisem continuar disponíveis depois que o caminho de
compatibilidade do runtime for removido.
Varreduras de release devem verificar ambos os registros. Não exclua uma
migração do doctor só porque o registro correspondente de compatibilidade de
runtime ou config expirou; primeiro verifique se não há um caminho de upgrade
compatível que ainda precise do reparo. Também revalide cada anotação de
substituição durante o planejamento de release, porque a propriedade de plugins
e a presença em config podem mudar à medida que provedores e canais saem do
núcleo.
Pacote do inspetor de plugins
O inspetor de plugins deve ficar fora do repositório central do OpenClaw como um pacote/repositório separado apoiado pelos contratos versionados de compatibilidade e manifesto. A CLI do primeiro dia deve ser:- validação de manifesto/schema
- a versão de compatibilidade do contrato que está sendo verificada
- verificações de metadados de instalação/origem
- verificações de importação de caminho frio
- avisos de depreciação e compatibilidade
--json para saída estável legível por máquina em anotações de CI. O núcleo
do OpenClaw deve expor contratos e fixtures que o inspetor possa consumir, mas
não deve publicar o binário do inspetor pelo pacote principal openclaw.
Faixa de aceitação dos mantenedores
Use Blacksmith Testbox apoiado por Crabbox para a faixa de aceitação de pacote instalável ao validar o inspetor externo contra pacotes de plugins do OpenClaw. Execute-a de um checkout limpo do OpenClaw depois que o pacote for construído:Política de depreciação
O OpenClaw não deve remover um contrato de plugin documentado na mesma release que introduz sua substituição. A sequência de migração é:- Adicionar o novo contrato.
- Manter o comportamento antigo conectado por um adaptador de compatibilidade nomeado.
- Emitir diagnósticos ou avisos quando autores de plugins puderem agir.
- Documentar a substituição e o cronograma.
- Testar os caminhos antigo e novo.
- Aguardar durante a janela de migração anunciada.
- Remover somente com aprovação explícita de release com quebra.
active.
Áreas de compatibilidade atuais
Registros de compatibilidade atuais incluem:- importações amplas legadas do SDK, como
openclaw/plugin-sdk/compat - formatos de plugins legados somente com hooks e
before_agent_start - nomes legados de hooks de limpeza
api.on("deactivate", ...)enquanto plugins migram paragateway_stop - entrypoints legados de plugin
activate(api)enquanto plugins migram pararegister(api) - aliases legados do SDK, como
openclaw/extension-api,openclaw/plugin-sdk/channel-runtime, builders de statusopenclaw/plugin-sdk/command-auth,openclaw/plugin-sdk/test-utils(substituído por subcaminhos de teste focadosopenclaw/plugin-sdk/*) e os aliases de tipoClawdbotConfig/OpenClawSchemaType - allowlist de plugins agrupados e comportamento de habilitação
- metadados legados de manifesto de variáveis de ambiente de provedor/canal
- hooks e aliases de tipo legados de plugin de provedor enquanto provedores migram para hooks explícitos de catálogo, autenticação, pensamento, replay e transporte
- aliases legados de runtime, como
api.runtime.taskFlow,api.runtime.subagent.getSession,api.runtime.stteapi.runtime.config.loadConfig()/api.runtime.config.writeConfigFile(...)depreciados - campos achatados de callback
WebInboundMessagedo WhatsApp, comobody,chatId,reply(...)emediaPath, enquanto consumidores de callbacks migram para os contextos aninhadosevent,payload,quote,groupeplatformdeWebInboundCallbackMessage - campos de admissão de nível superior de
WebInboundMessagedo WhatsApp, comofrom,conversationId,accountId,accessControlPassedechatType, enquanto consumidores de callbacks migram para o envelopeadmission - registro dividido legado de plugin de memória enquanto plugins de memória
migram para
registerMemoryCapability - registro legado de provedor de embedding específico de memória enquanto
provedores de embedding migram para
api.registerEmbeddingProvider(...)econtracts.embeddingProviders - helpers legados do SDK de canal para schemas de mensagens nativas, gating de menções, formatação de envelopes de entrada e aninhamento de capacidade de aprovação
- aliases legados de chave de rota de canal e helper de destino comparável
enquanto plugins migram para
openclaw/plugin-sdk/channel-route - dicas de ativação que estão sendo substituídas por propriedade de contribuição do manifesto
- fallback de runtime
setup-apienquanto descritores de configuração migram para metadados friossetup.requiresRuntime: false - hooks
discoveryde provedor enquanto hooks de catálogo de provedores migram paracatalog.run(...) - metadados
showConfigured/showInSetupde canal enquanto pacotes de canal migram paraopenclaw.channel.exposure - chaves legadas de config de runtime-policy enquanto o doctor migra operadores
para
agentRuntime - fallback de metadados gerados de config de canal agrupado enquanto metadados
channelConfigsregistry-first entram - flags persistidas de ambiente de desativação do registro de plugins e migração
de instalação enquanto fluxos de reparo migram operadores para
openclaw plugins registry --refresheopenclaw doctor --fix - caminhos legados de config de web search, web fetch e x_search pertencentes a
plugins enquanto o doctor os migra para
plugins.entries.<plugin>.config - config autorada legada
plugins.installse aliases de caminho de carregamento de plugins agrupados enquanto metadados de instalação migram para o livro-razão de plugins gerenciado pelo estado
Aliases achatados de callback de entrada do WhatsApp
Callbacks de runtime do WhatsApp entregamWebInboundMessage: os contextos
canônicos aninhados event, payload, quote, group e platform, mais
aliases achatados depreciados para os campos de callback enviados. Novo código
de callback deve ler os contextos aninhados. Código que constrói mensagens de
callback aninhadas limpas pode usar WebInboundCallbackMessage; listeners de
compatibilidade que ainda injetam mensagens antigas achatadas de teste ou plugin
devem usar LegacyFlatWebInboundMessage ou WebInboundMessageInput.
Os aliases achatados permanecem disponíveis até 2026-08-30. Essa janela de
remoção se aplica apenas ao acesso por alias achatado; o formato aninhado de
callback é o contrato canônico de runtime. As anotações TypeScript @deprecated
em cada alias achatado nomeiam sua substituição aninhada exata. Exemplos comuns:
id,timestampeisBatchedpassam paraevent.body,mediaPath,mediaType,mediaFileName,mediaUrl,locationeuntrustedStructuredContextpassam parapayload.to,chatId, campos de remetente/próprio,sendComposing,reply(...)esendMedia(...)passam paraplatform.- campos
replyTo*passam paraquote, e campos de assunto/participante/menção de grupo passam paragroup.
payload.untrustedStructuredContext é extraído de payloads de provedores de
entrada. Plugins devem inspecionar label, source e type antes de tratar seu
payload como autoritativo.
Campos de admissão de entrada do WhatsApp
Mensagens aceitas de callback do WhatsApp agora carregamadmission, um
envelope público e seguro para a decisão de controle de acesso que admitiu a
mensagem. Novo código de callback deve ler fatos de admissão de msg.admission
em vez dos campos de admissão antigos de nível superior.
Os campos de nível superior permanecem disponíveis até 2026-08-30. As
anotações TypeScript @deprecated nomeiam cada substituição:
fromeconversationIdpassam paraadmission.conversation.id.accountIdpassa paraadmission.accountId.accessControlPassedé uma visualização derivada de compatibilidade deadmission.ingress.decision === "allow"; em mensagens que já carregamadmission, escrever o booleano legado não reescreve o grafo de ingresso.chatTypepassa paraadmission.conversation.kind.
Notas de release
Notas de release devem incluir próximas depreciações de plugins com datas-alvo e links para docs de migração. Esse aviso precisa acontecer antes de um caminho de compatibilidade passar pararemoval-pending ou removed.