Get started
Рефакторинг Canvas Plugin
Рефакторинг Canvas Plugin
Canvas використовується мало й є експериментальним. Розглядайте його як вбудований Plugin, а не як основну функцію ядра. Ядро може зберігати загальну обв’язку Gateway, Node, HTTP, автентифікації, конфігурації та нативного клієнта, але специфічна для Canvas поведінка має жити в extensions/canvas.
Мета
Перенести володіння Canvas до extensions/canvas, зберігши поточну поведінку спареного Node:
- агентський інструмент
canvasреєструється Canvas Plugin - команди Canvas Node дозволені лише тоді, коли Canvas Plugin їх реєструє
- файли хоста/джерел A2UI живуть у Canvas Plugin
- матеріалізація документів Canvas живе у Canvas Plugin
- реалізація команди CLI живе у Canvas Plugin або делегує через runtime barrel, яким володіє Plugin
- документація та інвентар Plugin описують Canvas як експериментальний і підтриманий Plugin
Нецілі
- Не переробляти Canvas UI нативного застосунку в цьому рефакторингу.
- Не видаляти підтримку протоколу/клієнта Canvas з iOS, Android або macOS, якщо окреме продуктове рішення не каже, що Canvas потрібно видалити.
- Не будувати широкий фреймворк сервісів Plugin лише для Canvas, якщо принаймні один інший вбудований Plugin не потребує такого самого шва.
Поточний стан гілки
Зроблено:
- Додано пакет вбудованого Plugin у
extensions/canvas. - Додано
extensions/canvas/openclaw.plugin.json. - Переміщено агентський інструмент
canvasзsrc/agents/tools/canvas-tool.tsдоextensions/canvas/src/tool.ts. - Видалено реєстрацію
createCanvasToolу ядрі зsrc/agents/openclaw-tools.ts. - Переміщено реалізацію хоста Canvas з
src/canvas-hostдоextensions/canvas/src/host. - Залишено
extensions/canvas/runtime-api.tsяк сумісний barrel, яким володіє Plugin, для тестів, пакування та зовнішніх публічних помічників Canvas. - Переміщено матеріалізацію документів Canvas з
src/gateway/canvas-documents.tsдоextensions/canvas/src/documents.ts. - Переміщено реалізацію Canvas CLI та JSONL-помічники A2UI до
extensions/canvas/src/cli.ts. - Переміщено URL хоста Canvas і scoped capability-помічники до
extensions/canvas/src. - Переміщено типові значення команд Canvas Node з жорстко закодованих списків ядра до Plugin
nodeInvokePolicies. - Додано конфігурацію хоста Canvas, якою володіє Plugin, у
plugins.entries.canvas.config.host. - Переміщено HTTP-обслуговування Canvas і A2UI за реєстрацію HTTP-маршрутів Canvas Plugin.
- Додано загальну диспетчеризацію оновлень WebSocket Plugin для HTTP-маршрутів, якими володіє Plugin.
- Замінено специфічні для Canvas URL хоста Gateway та автентифікацію capability Node на загальну поверхню розміщеного Plugin і помічники capability Node.
- Додано hosted media resolver, яким володіє Plugin, щоб URL документів Canvas розв’язувалися через Canvas Plugin, а не через імпорт ядром внутрішніх частин документів Canvas.
- Додано
api.registerNodeCliFeature(...), щоб Canvas міг оголошуватиopenclaw nodes canvasяк функцію Node, якою володіє Plugin, без ручного прописування шляху батьківської команди. - Видалено production-імпорти
extensions/canvas/runtime-api.jsзsrc/**. - Переміщено джерело пакета A2UI з
apps/shared/OpenClawKit/Tools/CanvasA2UIдоextensions/canvas/src/host/a2ui-app. - Переміщено реалізацію збирання/копіювання A2UI під
extensions/canvas/scriptsі замінено кореневу прив’язку збірки загальними хуками ресурсів вбудованих Plugin. - Видалено runtime-застарілий верхньорівневий псевдонім конфігурації
canvasHost. - Залишено міграцію Canvas doctor, щоб
openclaw doctor --fixпереписував старі конфігураціїcanvasHostуplugins.entries.canvas.config.host. - Видалено сумісність протоколу Canvas для старих агентів за Gateway protocol v4. Нативні клієнти та Gateway тепер використовують лише
pluginSurfaceUrls.canvasплюсnode.pluginSurface.refresh; застарілий шляхcanvasHostUrl,canvasCapabilityіnode.canvas.capability.refreshнавмисно не підтримується в цьому експериментальному рефакторингу. - Оновлено згенерований інвентар Plugin, щоб включити Canvas.
- Додано довідкову документацію Plugin у
docs/plugins/reference/canvas.md.
Відомі поверхні Canvas, якими й далі володіє ядро:
- обробники Canvas нативного застосунку під
apps/досі навмисно споживають поверхню Canvas Plugin - обробники протоколу/клієнта Canvas нативного застосунку під
apps/ - вихід опублікованого артефакту досі використовує
dist/canvas-host/a2uiдля зворотно сумісного runtime-пошуку, але крок копіювання тепер належить Plugin
Цільова форма
extensions/canvas має володіти:
- маніфестом Plugin і метаданими пакета
- реєстрацією агентського інструмента
- політикою команд виклику Node
- хостом Canvas і runtime A2UI
- джерелом пакета Canvas A2UI і скриптами збирання/копіювання ресурсів
- створенням документів Canvas і розв’язанням ресурсів
- реалізацією Canvas CLI
- сторінкою документації Canvas і записом інвентарю Plugin
Ядро має володіти лише загальними швами:
- виявленням і реєстрацією Plugin
- загальним реєстром агентських інструментів
- загальним реєстром політик виклику Node
- загальними Gateway HTTP/автентифікацією і диспетчеризацією оновлень WebSocket
- загальним розв’язанням URL поверхні розміщеного Plugin
- загальною реєстрацією hosted media resolver
- загальним транспортом capability Node
- загальною обв’язкою конфігурації
- загальним виявленням хуків ресурсів вбудованого Plugin
Нативні застосунки можуть зберігати обробники команд Canvas як клієнти протоколу. Вони не є власником runtime Plugin.
Кроки міграції
- Розглядати
plugins.entries.canvas.config.hostяк конфігураційну поверхню, якою володіє Plugin. - Оновити документацію, щоб Canvas описувався як експериментальний вбудований Plugin.
- Запустити сфокусовані тести Canvas, перевірки інвентарю Plugin, перевірки API Plugin SDK і build/type-гейти, на які впливають runtime-межі.
Контрольний список аудиту
Перед тим як вважати рефакторинг завершеним:
rg "src/canvas-host|../canvas-host"не повертає живих імпортів джерел.rg "canvas-tool|createCanvasTool" srcне знаходить реалізації інструмента Canvas, якою володіє ядро.rg "canvas.present|canvas.snapshot|canvas.a2ui" src/gatewayне знаходить жорстко закодованих типових allowlist поза загальними тестами політики Plugin.rg "extensions/canvas/runtime-api" src --glob '!**/*.test.ts'порожній.rg "canvas-documents" srcпорожній.rg "registerNodesCanvasCommands|nodes-canvas" srcпорожній; Canvas Plugin реєструєopenclaw nodes canvasчерез вкладені метадані Plugin CLI.rg "createCanvasHostHandler|handleA2uiHttpRequest" src/gatewayне повертає володіння runtime Gateway.rg "apps/shared/OpenClawKit/Tools/CanvasA2UI|canvas-a2ui-copy|extensions/canvas/src/host/a2ui" scripts .github package.jsonзнаходить лише сумісні wrappers або шляхи, якими володіє Plugin.pnpm plugins:inventory:checkпроходить.pnpm plugin-sdk:api:checkпроходить, або згенеровані базові лінії API навмисно оновлені й переглянуті.- Цільові тести Canvas проходять.
- Тести changed-lanes проходять для шляхів Canvas host/A2UI.
- Тіло PR явно каже, що Canvas експериментальний і підтриманий Plugin.
Команди перевірки
Використовуйте цільові локальні перевірки під час ітерацій:
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
Запустіть pnpm build перед push, якщо змінюється runtime barrel, lazy import, пакування або опубліковані поверхні Plugin.