Get started
Refatoração do Plugin Canvas
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 em extensions/canvas.
Objetivo
Mover a propriedade do Canvas para extensions/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.
Superfícies Canvas conhecidas que ainda pertencem ao núcleo:
- 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
O núcleo deve possuir apenas seams genéricos:
- 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
Apps nativos podem manter handlers de comando Canvas como clientes do protocolo. Eles não são os proprietários do runtime do Plugin.
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 test extensions/canvas/src/host/server.test.ts extensions/canvas/src/host/server.state-dir.test.ts extensions/canvas/src/host/file-resolver.test.ts
pnpm test src/gateway/server.plugin-node-capability-auth.test.ts src/gateway/server-import-boundary.test.ts
pnpm test extensions/canvas/src/config-migration.test.ts src/commands/doctor-legacy-config.migrations.test.ts
pnpm test test/scripts/changed-lanes.test.ts test/scripts/build-all.test.ts extensions/canvas/scripts/bundle-a2ui.test.ts test/scripts/bundled-plugin-assets.test.ts extensions/canvas/scripts/copy-a2ui.test.ts src/infra/run-node.test.ts
pnpm tsgo:extensions
pnpm plugins:inventory:check
pnpm plugin-sdk:api:check
Execute pnpm build antes do push se o barril de runtime, importação lazy, empacotamento ou superfícies publicadas do Plugin mudarem.