Get started
Refaktorierung des Canvas-Plugins
Refactoring des Canvas-Plugins
Canvas wird wenig genutzt und ist experimentell. Behandeln Sie es als mitgeliefertes Plugin, nicht als Core-Funktion. Der Core darf generische Gateway-, Node-, HTTP-, Authentifizierungs-, Config- und Native-Client-Infrastruktur behalten, Canvas-spezifisches Verhalten sollte jedoch unter extensions/canvas liegen.
Ziel
Die Zuständigkeit für Canvas nach extensions/canvas verschieben und dabei das aktuelle Verhalten gekoppelter Nodes beibehalten:
- das agentenseitige
canvas-Tool wird vom Canvas-Plugin registriert - Canvas-Node-Befehle sind nur erlaubt, wenn das Canvas-Plugin sie registriert
- A2UI-Host-/Quelldateien liegen unter dem Canvas-Plugin
- Canvas-Dokumentmaterialisierung liegt unter dem Canvas-Plugin
- die CLI-Befehlsimplementierung liegt unter dem Canvas-Plugin oder delegiert über ein Plugin-eigenes Runtime-Barrel
- Dokumentation und Plugin-Inventar beschreiben Canvas als experimentell und Plugin-gestützt
Nichtziele
- Die native App-Canvas-UI in diesem Refactoring nicht neu entwerfen.
- Canvas-Protokoll-/Client-Unterstützung nicht aus iOS, Android oder macOS entfernen, es sei denn, eine separate Produktentscheidung besagt, dass Canvas gelöscht werden soll.
- Kein breites Plugin-Service-Framework nur für Canvas bauen, es sei denn, mindestens ein anderes mitgeliefertes Plugin benötigt dieselbe Schnittstelle.
Aktueller Branch-Zustand
Erledigt:
- Mitgeliefertes Plugin-Paket in
extensions/canvashinzugefügt. extensions/canvas/openclaw.plugin.jsonhinzugefügt.- Das Agent-
canvas-Tool vonsrc/agents/tools/canvas-tool.tsnachextensions/canvas/src/tool.tsverschoben. - Core-Registrierung von
createCanvasToolaussrc/agents/openclaw-tools.tsentfernt. - Canvas-Host-Implementierung von
src/canvas-hostnachextensions/canvas/src/hostverschoben. extensions/canvas/runtime-api.tsals Plugin-eigenes Kompatibilitäts-Barrel für Tests, Paketierung und externe öffentliche Canvas-Hilfsfunktionen beibehalten.- Canvas-Dokumentmaterialisierung von
src/gateway/canvas-documents.tsnachextensions/canvas/src/documents.tsverschoben. - Canvas-CLI-Implementierung und A2UI-JSONL-Hilfsfunktionen nach
extensions/canvas/src/cli.tsverschoben. - Canvas-Host-URL und Hilfsfunktionen für bereichsgebundene Capabilities nach
extensions/canvas/srcverschoben. - Canvas-Node-Befehlsdefaults aus hartcodierten Core-Listen in Plugin-
nodeInvokePoliciesverschoben. - Plugin-eigene Canvas-Host-Config unter
plugins.entries.canvas.config.hosthinzugefügt. - Canvas- und A2UI-HTTP-Bereitstellung hinter die HTTP-Routenregistrierung des Canvas-Plugins verschoben.
- Generisches Plugin-WebSocket-Upgrade-Dispatching für Plugin-eigene HTTP-Routen hinzugefügt.
- Canvas-spezifische Gateway-Host-URL und Node-Capability-Authentifizierung durch generische gehostete Plugin-Oberfläche und Node-Capability-Hilfsfunktionen ersetzt.
- Plugin-eigene Resolver für gehostete Medien hinzugefügt, damit Canvas-Dokument-URLs über das Canvas-Plugin aufgelöst werden, statt dass der Core Canvas-Dokumentinterna importiert.
api.registerNodeCliFeature(...)hinzugefügt, damit Canvasopenclaw nodes canvasals Plugin-eigenes Node-Feature deklarieren kann, ohne den übergeordneten Befehlspfad manuell auszuschreiben.- Produktionsimporte von
extensions/canvas/runtime-api.jsaussrc/**entfernt. - Die A2UI-Bundle-Quelle von
apps/shared/OpenClawKit/Tools/CanvasA2UInachextensions/canvas/src/host/a2ui-appverschoben. - A2UI-Build-/Copy-Implementierung unter
extensions/canvas/scriptsverschoben und Root-Build-Verdrahtung durch generische Asset-Hooks für mitgelieferte Plugins ersetzt. - Den Runtime-Legacy-Top-Level-Config-Alias
canvasHostentfernt. - Canvas-Doctor-Migration beibehalten, damit
openclaw doctor --fixaltecanvasHost-Configs inplugins.entries.canvas.config.hostumschreibt. - Alte Agent-Canvas-Protokollkompatibilität hinter Gateway-Protokoll v4 entfernt. Native Clients und Gateways verwenden jetzt nur noch
pluginSurfaceUrls.canvasplusnode.pluginSurface.refresh; der veraltete PfadcanvasHostUrl,canvasCapabilityundnode.canvas.capability.refreshwird in diesem experimentellen Refactoring absichtlich nicht unterstützt. - Generiertes Plugin-Inventar aktualisiert, um Canvas einzuschließen.
- Plugin-Referenzdokumentation unter
docs/plugins/reference/canvas.mdhinzugefügt.
Bekannte verbleibende Core-eigene Canvas-Oberflächen:
- Native App-Canvas-Handler unter
apps/konsumieren weiterhin absichtlich die Canvas-Plugin-Oberfläche - Native App-Canvas-Protokoll-/Client-Handler unter
apps/ - Die veröffentlichte Artefaktausgabe verwendet weiterhin
dist/canvas-host/a2uifür rückwärtskompatible Runtime-Lookups, aber der Copy-Schritt ist jetzt Plugin-eigen
Zielstruktur
extensions/canvas sollte Folgendes besitzen:
- Plugin-Manifest und Paketmetadaten
- Agent-Tool-Registrierung
- Node-Invoke-Befehlspolicy
- Canvas-Host und A2UI-Runtime
- Canvas-A2UI-Bundle-Quelle und Asset-Build-/Copy-Skripte
- Canvas-Dokumenterstellung und Asset-Auflösung
- Canvas-CLI-Implementierung
- Canvas-Dokumentationsseite und Plugin-Inventareintrag
Der Core sollte nur generische Schnittstellen besitzen:
- Plugin-Erkennung und -Registrierung
- generische Agent-Tool-Registry
- generische Node-Invoke-Policy-Registry
- generisches Gateway-HTTP/Auth und WebSocket-Upgrade-Dispatching
- generische URL-Auflösung für gehostete Plugin-Oberflächen
- generische Registrierung von Resolvern für gehostete Medien
- generischer Node-Capability-Transport
- generische Config-Infrastruktur
- generische Asset-Hook-Erkennung für mitgelieferte Plugins
Native Apps dürfen Canvas-Befehlshandler als Clients des Protokolls behalten. Sie sind nicht der Runtime-Eigentümer des Plugins.
Migrationsschritte
plugins.entries.canvas.config.hostals Plugin-eigene Config-Oberfläche behandeln.- Dokumentation aktualisieren, sodass Canvas als experimentelles mitgeliefertes Plugin beschrieben wird.
- Fokussierte Canvas-Tests, Plugin-Inventarprüfungen, Plugin-SDK-API-Prüfungen sowie Build-/Typ-Gates ausführen, die von Runtime-Grenzen betroffen sind.
Audit-Checkliste
Bevor das Refactoring als abgeschlossen gilt:
rg "src/canvas-host|../canvas-host"gibt keine Live-Quellimporte zurück.rg "canvas-tool|createCanvasTool" srcfindet keine Core-eigene Canvas-Tool-Implementierung.rg "canvas.present|canvas.snapshot|canvas.a2ui" src/gatewayfindet keine hartcodierten Allowlist-Defaults außerhalb generischer Plugin-Policy-Tests.rg "extensions/canvas/runtime-api" src --glob '!**/*.test.ts'ist leer.rg "canvas-documents" srcist leer.rg "registerNodesCanvasCommands|nodes-canvas" srcist leer; das Canvas-Plugin registriertopenclaw nodes canvasüber verschachtelte Plugin-CLI-Metadaten.rg "createCanvasHostHandler|handleA2uiHttpRequest" src/gatewaygibt keine Gateway-Runtime-Zuständigkeit zurück.rg "apps/shared/OpenClawKit/Tools/CanvasA2UI|canvas-a2ui-copy|extensions/canvas/src/host/a2ui" scripts .github package.jsonfindet nur Kompatibilitäts-Wrapper oder Plugin-eigene Pfade.pnpm plugins:inventory:checkbesteht.pnpm plugin-sdk:api:checkbesteht, oder generierte API-Baselines werden absichtlich aktualisiert und überprüft.- Zielgerichtete Canvas-Tests bestehen.
- Changed-Lanes-Tests für Canvas-Host-/A2UI-Pfade bestehen.
- Der PR-Body sagt ausdrücklich, dass Canvas experimentell und Plugin-gestützt ist.
Verifizierungsbefehle
Verwenden Sie beim Iterieren zielgerichtete lokale Prüfungen:
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
Führen Sie pnpm build vor dem Push aus, wenn sich Runtime-Barrel, Lazy Import, Paketierung oder veröffentlichte Plugin-Oberflächen ändern.