Refatoração do Plugin Canvas
O Canvas é pouco usado e experimental. Trate-o como um Plugin integrado, não como um recurso central. O núcleo pode manter a infraestrutura genérica de Gateway, Node, HTTP, autenticação, configuração e cliente nativo, mas o comportamento específico do Canvas deve ficar emextensions/canvas.
Objetivo
Mover a propriedade do Canvas paraextensions/canvas, preservando o comportamento atual de nós pareados:
- a ferramenta
canvasvoltada para o agente é registrada pelo Plugin Canvas - comandos de nó do Canvas são permitidos somente quando o Plugin Canvas os registra
- arquivos de host/fonte A2UI ficam no Plugin Canvas
- a materialização de documentos Canvas fica no Plugin Canvas
- a implementação de comandos da CLI fica no Plugin Canvas ou delega por meio de um barril de runtime pertencente ao Plugin
- a documentação e o inventário de Plugins descrevem o Canvas como experimental e respaldado por Plugin
Não objetivos
- Não redesenhar a UI Canvas do app nativo nesta refatoração.
- Não remover o suporte de protocolo/cliente Canvas do iOS, Android ou macOS, a menos que uma decisão separada de produto diga que o Canvas deve ser excluído.
- Não criar uma estrutura ampla de serviço de Plugin apenas para o Canvas, a menos que pelo menos outro Plugin integrado precise do mesmo seam.
Estado atual da branch
Concluído:- Adicionado pacote de Plugin integrado em
extensions/canvas. - Adicionado
extensions/canvas/openclaw.plugin.json. - Movida a ferramenta
canvasdo agente desrc/agents/tools/canvas-tool.tsparaextensions/canvas/src/tool.ts. - Removido o registro central de
createCanvasTooldesrc/agents/openclaw-tools.ts. - Movida a implementação do host Canvas de
src/canvas-hostparaextensions/canvas/src/host. - Mantido
extensions/canvas/runtime-api.tscomo o barril de compatibilidade pertencente ao Plugin para testes, empacotamento e helpers públicos externos do Canvas. - Movida a materialização de documentos Canvas de
src/gateway/canvas-documents.tsparaextensions/canvas/src/documents.ts. - Movida a implementação da CLI Canvas e helpers JSONL A2UI para
extensions/canvas/src/cli.ts. - Movidos o URL do host Canvas e helpers de capacidade com escopo para
extensions/canvas/src. - Movidos os padrões de comandos de nó do Canvas para fora de listas rígidas no núcleo e para
nodeInvokePoliciesdo Plugin. - Adicionada configuração de host Canvas pertencente ao Plugin em
plugins.entries.canvas.config.host. - Movido o serviço HTTP do Canvas e A2UI para trás do registro de rotas HTTP do Plugin Canvas.
- Adicionado despacho genérico de upgrade WebSocket de Plugin para rotas HTTP pertencentes a Plugins.
- Substituídos o URL de host Gateway específico do Canvas e a autenticação de capacidade de nó por superfície genérica de Plugin hospedado e helpers de capacidade de nó.
- Adicionados resolvedores de mídia hospedada pertencentes ao Plugin, para que URLs de documentos Canvas sejam resolvidos pelo Plugin Canvas em vez de o núcleo importar detalhes internos de documentos Canvas.
- Adicionado
api.registerNodeCliFeature(...), para que o Canvas possa declararopenclaw nodes canvascomo um recurso de nó pertencente ao Plugin sem soletrar manualmente o caminho do comando pai. - Removidas importações de produção
src/**deextensions/canvas/runtime-api.js. - Movida a fonte do bundle A2UI de
apps/shared/OpenClawKit/Tools/CanvasA2UIparaextensions/canvas/src/host/a2ui-app. - Movida a implementação de build/cópia A2UI para
extensions/canvas/scriptse substituída a fiação de build raiz por hooks genéricos de assets de Plugins integrados. - Removido o alias legado de runtime de configuração de nível superior
canvasHost. - Mantida a migração do doctor do Canvas para que
openclaw doctor --fixreescreva configurações antigas decanvasHostparaplugins.entries.canvas.config.host. - Removida a compatibilidade de protocolo Canvas de agentes antigos atrás do protocolo Gateway v4. Clientes nativos e Gateways agora usam somente
pluginSurfaceUrls.canvasmaisnode.pluginSurface.refresh; o caminho obsoletocanvasHostUrl,canvasCapabilityenode.canvas.capability.refreshé intencionalmente sem suporte nesta refatoração experimental. - Atualizado o inventário gerado de Plugins para incluir Canvas.
- Adicionada documentação de referência do Plugin em
docs/plugins/reference/canvas.md.
- handlers Canvas do app nativo em
apps/ainda consomem intencionalmente a superfície do Plugin Canvas - handlers de protocolo/cliente Canvas do app nativo em
apps/ - a saída do artefato publicado ainda usa
dist/canvas-host/a2uipara busca de runtime compatível com versões anteriores, mas a etapa de cópia agora pertence ao Plugin
Forma alvo
extensions/canvas deve possuir:
- manifesto do Plugin e metadados do pacote
- registro de ferramenta do agente
- política de comando de invocação de nó
- host Canvas e runtime A2UI
- fonte do bundle Canvas A2UI e scripts de build/cópia de assets
- criação de documentos Canvas e resolução de assets
- implementação da CLI Canvas
- página de documentação do Canvas e entrada no inventário de Plugins
- descoberta e registro de Plugins
- registro genérico de ferramentas de agente
- registro genérico de políticas de invocação de nó
- HTTP/autenticação genéricos do Gateway e despacho de upgrade WebSocket
- resolução genérica de URL de superfície de Plugin hospedado
- registro genérico de resolvedor de mídia hospedada
- transporte genérico de capacidade de nó
- infraestrutura genérica de configuração
- descoberta genérica de hooks de assets de Plugins integrados
Etapas de migração
- Tratar
plugins.entries.canvas.config.hostcomo a superfície de configuração pertencente ao Plugin. - Atualizar a documentação para que o Canvas seja descrito como um Plugin integrado experimental.
- Executar testes focados do Canvas, verificações de inventário de Plugins, verificações da API do SDK de Plugin e gates de build/tipos afetados pelos limites de runtime.
Checklist de auditoria
Antes de considerar a refatoração concluída:rg "src/canvas-host|../canvas-host"não retorna importações de fonte ativas.rg "canvas-tool|createCanvasTool" srcnão encontra implementação de ferramenta Canvas pertencente ao núcleo.rg "canvas.present|canvas.snapshot|canvas.a2ui" src/gatewaynão encontra padrões de allowlist rígidos fora de testes genéricos de política de Plugin.rg "extensions/canvas/runtime-api" src --glob '!**/*.test.ts'está vazio.rg "canvas-documents" srcestá vazio.rg "registerNodesCanvasCommands|nodes-canvas" srcestá vazio; o Plugin Canvas registraopenclaw nodes canvaspor meio de metadados aninhados de CLI de Plugin.rg "createCanvasHostHandler|handleA2uiHttpRequest" src/gatewaynão retorna propriedade de runtime do Gateway.rg "apps/shared/OpenClawKit/Tools/CanvasA2UI|canvas-a2ui-copy|extensions/canvas/src/host/a2ui" scripts .github package.jsonencontra somente wrappers de compatibilidade ou caminhos pertencentes ao Plugin.pnpm plugins:inventory:checkpassa.pnpm plugin-sdk:api:checkpassa, ou os baselines de API gerados são atualizados e revisados intencionalmente.- Testes Canvas direcionados passam.
- Testes de lanes alteradas passam para caminhos Canvas host/A2UI.
- O corpo do PR diz explicitamente que o Canvas é experimental e respaldado por Plugin.
Comandos de verificação
Use verificações locais direcionadas durante a iteração:pnpm build antes do push se o barril de runtime, importação lazy, empacotamento ou superfícies publicadas do Plugin mudarem.