Get started
Refaktoryzacja Pluginu Canvas
Refaktoryzacja Plugin Canvas
Canvas jest mało używany i eksperymentalny. Traktuj go jako dołączony Plugin, a nie funkcję rdzenia. Rdzeń może zachować ogólną obsługę Gateway, Node, HTTP, uwierzytelniania, konfiguracji i natywnego klienta, ale zachowanie specyficzne dla Canvas powinno znajdować się w extensions/canvas.
Cel
Przenieść własność Canvas do extensions/canvas, zachowując obecne zachowanie sparowanego węzła:
- narzędzie
canvasprzeznaczone dla agenta jest rejestrowane przez Plugin Canvas - polecenia węzła Canvas są dozwolone tylko wtedy, gdy Plugin Canvas je rejestruje
- pliki hosta/źródłowe A2UI znajdują się w Plugin Canvas
- materializacja dokumentów Canvas znajduje się w Plugin Canvas
- implementacja polecenia CLI znajduje się w Plugin Canvas albo deleguje przez należący do Plugin barrel środowiska uruchomieniowego
- dokumentacja i inwentarz Plugin opisują Canvas jako eksperymentalny i oparty na Plugin
Poza zakresem
- Nie przeprojektowuj natywnego interfejsu Canvas w tej refaktoryzacji.
- Nie usuwaj obsługi protokołu/klienta Canvas z iOS, Androida ani macOS, chyba że osobna decyzja produktowa mówi, że Canvas należy usunąć.
- Nie buduj szerokiej platformy usług Plugin tylko dla Canvas, chyba że co najmniej jeden inny dołączony Plugin potrzebuje tego samego punktu integracji.
Obecny stan gałęzi
Zrobione:
- Dodano pakiet dołączonego Plugin w
extensions/canvas. - Dodano
extensions/canvas/openclaw.plugin.json. - Przeniesiono narzędzie agenta
canvaszsrc/agents/tools/canvas-tool.tsdoextensions/canvas/src/tool.ts. - Usunięto rejestrację rdzeniową
createCanvasToolzsrc/agents/openclaw-tools.ts. - Przeniesiono implementację hosta Canvas z
src/canvas-hostdoextensions/canvas/src/host. - Zachowano
extensions/canvas/runtime-api.tsjako należący do Plugin barrel zgodności dla testów, pakowania i zewnętrznych publicznych helperów Canvas. - Przeniesiono materializację dokumentów Canvas z
src/gateway/canvas-documents.tsdoextensions/canvas/src/documents.ts. - Przeniesiono implementację CLI Canvas i helpery JSONL A2UI do
extensions/canvas/src/cli.ts. - Przeniesiono URL hosta Canvas i helpery ograniczonych capability do
extensions/canvas/src. - Przeniesiono domyślne polecenia węzła Canvas z zakodowanych na stałe list rdzenia do Plugin
nodeInvokePolicies. - Dodano należącą do Plugin konfigurację hosta Canvas w
plugins.entries.canvas.config.host. - Przeniesiono serwowanie HTTP Canvas i A2UI za rejestrację tras HTTP Plugin Canvas.
- Dodano ogólne przekazywanie upgrade WebSocket Plugin dla należących do Plugin tras HTTP.
- Zastąpiono specyficzne dla Canvas uwierzytelnianie URL hosta Gateway i capability węzła ogólną powierzchnią hostowanego Plugin oraz helperami capability węzła.
- Dodano należące do Plugin resolvery hostowanych mediów, aby adresy URL dokumentów Canvas były rozwiązywane przez Plugin Canvas zamiast importowania przez rdzeń wewnętrznych części dokumentów Canvas.
- Dodano
api.registerNodeCliFeature(...), aby Canvas mógł deklarowaćopenclaw nodes canvasjako należącą do Plugin funkcję węzła bez ręcznego wypisywania ścieżki polecenia nadrzędnego. - Usunięto produkcyjne importy
src/**zextensions/canvas/runtime-api.js. - Przeniesiono źródło pakietu A2UI z
apps/shared/OpenClawKit/Tools/CanvasA2UIdoextensions/canvas/src/host/a2ui-app. - Przeniesiono implementację budowania/kopiowania A2UI pod
extensions/canvas/scriptsi zastąpiono główne powiązanie budowania ogólnymi hookami zasobów dołączonych Plugin. - Usunięto alias starszej konfiguracji najwyższego poziomu
canvasHostz runtime. - Zachowano migrację doctor dla Canvas, aby
openclaw doctor --fixprzepisywało stare konfiguracjecanvasHostdoplugins.entries.canvas.config.host. - Usunięto zgodność starego protokołu Canvas agenta za Gateway protocol v4. Natywni klienci i Gateway używają teraz wyłącznie
pluginSurfaceUrls.canvasoraznode.pluginSurface.refresh; przestarzałe ścieżkicanvasHostUrl,canvasCapabilityinode.canvas.capability.refreshsą celowo nieobsługiwane w tej eksperymentalnej refaktoryzacji. - Zaktualizowano wygenerowany inwentarz Plugin, aby uwzględniał Canvas.
- Dodano dokumentację referencyjną Plugin w
docs/plugins/reference/canvas.md.
Znane pozostałe powierzchnie Canvas należące do rdzenia:
- Handlery Canvas natywnej aplikacji pod
apps/nadal celowo używają powierzchni Plugin Canvas - handlery protokołu/klienta Canvas natywnej aplikacji pod
apps/ - wyjście publikowanego artefaktu nadal używa
dist/canvas-host/a2uidla zgodnego wstecznie wyszukiwania runtime, ale krok kopiowania należy teraz do Plugin
Docelowy kształt
extensions/canvas powinno posiadać:
- manifest Plugin i metadane pakietu
- rejestrację narzędzia agenta
- politykę poleceń wywołań węzła
- host Canvas i runtime A2UI
- źródło pakietu Canvas A2UI oraz skrypty budowania/kopiowania zasobów
- tworzenie dokumentów Canvas i rozwiązywanie zasobów
- implementację CLI Canvas
- stronę dokumentacji Canvas i wpis w inwentarzu Plugin
Rdzeń powinien posiadać tylko ogólne punkty integracji:
- wykrywanie i rejestrację Plugin
- ogólny rejestr narzędzi agenta
- ogólny rejestr polityk wywołań węzła
- ogólne HTTP/uwierzytelnianie Gateway i przekazywanie upgrade WebSocket
- ogólne rozwiązywanie URL powierzchni hostowanego Plugin
- ogólną rejestrację resolvera hostowanych mediów
- ogólny transport capability węzła
- ogólne okablowanie konfiguracji
- ogólne wykrywanie hooków zasobów dołączonych Plugin
Natywne aplikacje mogą zachować handlery poleceń Canvas jako klienci protokołu. Nie są właścicielem runtime Plugin.
Kroki migracji
- Traktuj
plugins.entries.canvas.config.hostjako należącą do Plugin powierzchnię konfiguracji. - Zaktualizuj dokumentację, aby Canvas był opisany jako eksperymentalny dołączony Plugin.
- Uruchom ukierunkowane testy Canvas, sprawdzenia inwentarza Plugin, sprawdzenia API Plugin SDK oraz bramki build/type, na które wpływają granice runtime.
Lista kontrolna audytu
Przed uznaniem refaktoryzacji za ukończoną:
rg "src/canvas-host|../canvas-host"nie zwraca żadnych aktywnych importów źródłowych.rg "canvas-tool|createCanvasTool" srcnie znajduje należącej do rdzenia implementacji narzędzia Canvas.rg "canvas.present|canvas.snapshot|canvas.a2ui" src/gatewaynie znajduje zakodowanych na stałe domyślnych list dozwolonych poza ogólnymi testami polityk Plugin.rg "extensions/canvas/runtime-api" src --glob '!**/*.test.ts'jest puste.rg "canvas-documents" srcjest puste.rg "registerNodesCanvasCommands|nodes-canvas" srcjest puste; Plugin Canvas rejestrujeopenclaw nodes canvasprzez zagnieżdżone metadane CLI Plugin.rg "createCanvasHostHandler|handleA2uiHttpRequest" src/gatewaynie zwraca własności runtime Gateway.rg "apps/shared/OpenClawKit/Tools/CanvasA2UI|canvas-a2ui-copy|extensions/canvas/src/host/a2ui" scripts .github package.jsonznajduje tylko wrappery zgodności albo ścieżki należące do Plugin.pnpm plugins:inventory:checkprzechodzi.pnpm plugin-sdk:api:checkprzechodzi albo wygenerowane baseline’y API są celowo zaktualizowane i sprawdzone.- Ukierunkowane testy Canvas przechodzą.
- Testy changed-lanes przechodzą dla ścieżek hosta Canvas/A2UI.
- Treść PR wyraźnie mówi, że Canvas jest eksperymentalny i oparty na Plugin.
Polecenia weryfikacyjne
Używaj ukierunkowanych lokalnych sprawdzeń podczas iteracji:
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
Uruchom pnpm build przed push, jeśli zmienia się barrel runtime, leniwy import, pakowanie albo publikowane powierzchnie Plugin.