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