Get started
Refaktor Plugin Canvas
Refaktor Plugin Canvas
Canvas jarang digunakan dan bersifat eksperimental. Perlakukan ini sebagai Plugin bawaan, bukan fitur inti. Inti boleh tetap menyimpan plumbing Gateway, Node, HTTP, auth, konfigurasi, dan klien native yang generik, tetapi perilaku khusus Canvas harus berada di bawah extensions/canvas.
Tujuan
Memindahkan kepemilikan Canvas ke extensions/canvas sambil mempertahankan perilaku node berpasangan saat ini:
- tool
canvasyang menghadap agen didaftarkan oleh Plugin Canvas - perintah node Canvas hanya diizinkan ketika Plugin Canvas mendaftarkannya
- file host/sumber A2UI berada di bawah Plugin Canvas
- materialisasi dokumen Canvas berada di bawah Plugin Canvas
- implementasi perintah CLI berada di bawah Plugin Canvas, atau mendelegasikan melalui barrel runtime milik Plugin
- dokumentasi dan inventaris Plugin mendeskripsikan Canvas sebagai eksperimental dan didukung Plugin
Bukan tujuan
- Jangan mendesain ulang UI Canvas aplikasi native dalam refaktor ini.
- Jangan menghapus dukungan protokol/klien Canvas dari iOS, Android, atau macOS kecuali keputusan produk terpisah mengatakan Canvas harus dihapus.
- Jangan membangun kerangka kerja layanan Plugin yang luas hanya untuk Canvas kecuali setidaknya satu Plugin bawaan lain membutuhkan seam yang sama.
Status branch saat ini
Selesai:
- Menambahkan paket Plugin bawaan di
extensions/canvas. - Menambahkan
extensions/canvas/openclaw.plugin.json. - Memindahkan tool agen
canvasdarisrc/agents/tools/canvas-tool.tskeextensions/canvas/src/tool.ts. - Menghapus pendaftaran inti
createCanvasTooldarisrc/agents/openclaw-tools.ts. - Memindahkan implementasi host Canvas dari
src/canvas-hostkeextensions/canvas/src/host. - Mempertahankan
extensions/canvas/runtime-api.tssebagai barrel kompatibilitas milik Plugin untuk pengujian, pemaketan, dan helper Canvas publik eksternal. - Memindahkan materialisasi dokumen Canvas dari
src/gateway/canvas-documents.tskeextensions/canvas/src/documents.ts. - Memindahkan implementasi CLI Canvas dan helper JSONL A2UI ke
extensions/canvas/src/cli.ts. - Memindahkan URL host Canvas dan helper kapabilitas bercakupan ke
extensions/canvas/src. - Memindahkan default perintah node Canvas keluar dari daftar inti yang di-hardcode dan masuk ke
nodeInvokePoliciesPlugin. - Menambahkan konfigurasi host Canvas milik Plugin di
plugins.entries.canvas.config.host. - Memindahkan penyajian HTTP Canvas dan A2UI ke balik pendaftaran rute HTTP Plugin Canvas.
- Menambahkan dispatch upgrade WebSocket Plugin generik untuk rute HTTP milik Plugin.
- Mengganti URL host Gateway dan auth kapabilitas node khusus Canvas dengan permukaan Plugin ter-host generik dan helper kapabilitas node.
- Menambahkan resolver media ter-host milik Plugin sehingga URL dokumen Canvas diselesaikan melalui Plugin Canvas, bukan inti yang mengimpor internal dokumen Canvas.
- Menambahkan
api.registerNodeCliFeature(...)sehingga Canvas dapat mendeklarasikanopenclaw nodes canvassebagai fitur node milik Plugin tanpa mengeja jalur perintah induk secara manual. - Menghapus impor produksi
src/**dariextensions/canvas/runtime-api.js. - Memindahkan sumber bundel A2UI dari
apps/shared/OpenClawKit/Tools/CanvasA2UIkeextensions/canvas/src/host/a2ui-app. - Memindahkan implementasi build/salin A2UI ke bawah
extensions/canvas/scriptsdan mengganti wiring build root dengan hook aset Plugin bawaan generik. - Menghapus alias konfigurasi runtime top-level lama
canvasHost. - Mempertahankan migrasi doctor Canvas sehingga
openclaw doctor --fixmenulis ulang konfigurasi lamacanvasHostmenjadiplugins.entries.canvas.config.host. - Menghapus kompatibilitas protokol Canvas agen lama di balik protokol Gateway v4. Klien native dan Gateway sekarang hanya menggunakan
pluginSurfaceUrls.canvasplusnode.pluginSurface.refresh; jalur usangcanvasHostUrl,canvasCapability, dannode.canvas.capability.refreshsengaja tidak didukung dalam refaktor eksperimental ini. - Memperbarui inventaris Plugin yang dihasilkan agar menyertakan Canvas.
- Menambahkan dokumentasi referensi Plugin di
docs/plugins/reference/canvas.md.
Permukaan Canvas milik inti yang diketahui masih tersisa:
- Handler Canvas aplikasi native di bawah
apps/masih sengaja mengonsumsi permukaan Plugin Canvas - handler protokol/klien Canvas aplikasi native di bawah
apps/ - output artefak terpublikasi masih menggunakan
dist/canvas-host/a2uiuntuk lookup runtime yang kompatibel ke belakang, tetapi langkah penyalinan sekarang dimiliki Plugin
Bentuk target
extensions/canvas harus memiliki:
- manifes Plugin dan metadata paket
- pendaftaran tool agen
- kebijakan perintah invoke node
- host Canvas dan runtime A2UI
- sumber bundel Canvas A2UI dan skrip build/salin aset
- pembuatan dokumen Canvas dan resolusi aset
- implementasi CLI Canvas
- halaman dokumentasi Canvas dan entri inventaris Plugin
Inti hanya boleh memiliki seam generik:
- penemuan dan pendaftaran Plugin
- registry tool agen generik
- registry kebijakan invoke node generik
- HTTP/auth Gateway generik dan dispatch upgrade WebSocket
- resolusi URL permukaan Plugin ter-host generik
- pendaftaran resolver media ter-host generik
- transport kapabilitas node generik
- plumbing konfigurasi generik
- penemuan hook aset Plugin bawaan generik
Aplikasi native boleh mempertahankan handler perintah Canvas sebagai klien protokol. Aplikasi tersebut bukan pemilik runtime Plugin.
Langkah migrasi
- Perlakukan
plugins.entries.canvas.config.hostsebagai permukaan konfigurasi milik Plugin. - Perbarui dokumentasi sehingga Canvas dideskripsikan sebagai Plugin bawaan eksperimental.
- Jalankan pengujian Canvas terfokus, pemeriksaan inventaris Plugin, pemeriksaan API SDK Plugin, serta gate build/tipe yang terdampak oleh batas runtime.
Checklist audit
Sebelum menyatakan refaktor selesai:
rg "src/canvas-host|../canvas-host"tidak mengembalikan impor sumber live.rg "canvas-tool|createCanvasTool" srctidak menemukan implementasi tool Canvas milik inti.rg "canvas.present|canvas.snapshot|canvas.a2ui" src/gatewaytidak menemukan default allowlist yang di-hardcode di luar pengujian kebijakan Plugin generik.rg "extensions/canvas/runtime-api" src --glob '!**/*.test.ts'kosong.rg "canvas-documents" srckosong.rg "registerNodesCanvasCommands|nodes-canvas" srckosong; Plugin Canvas mendaftarkanopenclaw nodes canvasmelalui metadata CLI Plugin bersarang.rg "createCanvasHostHandler|handleA2uiHttpRequest" src/gatewaytidak mengembalikan kepemilikan runtime Gateway.rg "apps/shared/OpenClawKit/Tools/CanvasA2UI|canvas-a2ui-copy|extensions/canvas/src/host/a2ui" scripts .github package.jsonhanya menemukan wrapper kompatibilitas atau jalur milik Plugin.pnpm plugins:inventory:checkberhasil.pnpm plugin-sdk:api:checkberhasil, atau baseline API yang dihasilkan sengaja diperbarui dan ditinjau.- Pengujian Canvas tertarget berhasil.
- Pengujian changed-lanes berhasil untuk jalur host/A2UI Canvas.
- Isi PR secara eksplisit mengatakan Canvas bersifat eksperimental dan didukung Plugin.
Perintah verifikasi
Gunakan pemeriksaan lokal tertarget saat iterasi:
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
Jalankan pnpm build sebelum push jika barrel runtime, impor lazy, pemaketan, atau permukaan Plugin terpublikasi berubah.