Get started
Tái cấu trúc Plugin Canvas
Tái cấu trúc Canvas plugin
Canvas ít được sử dụng và đang thử nghiệm. Hãy xem đây là một Plugin tích hợp, không phải tính năng lõi. Phần lõi có thể giữ lại hệ thống Gateway, node, HTTP, xác thực, cấu hình và native-client chung, nhưng hành vi riêng của Canvas nên nằm trong extensions/canvas.
Mục tiêu
Chuyển quyền sở hữu Canvas sang extensions/canvas trong khi vẫn giữ hành vi paired-node hiện tại:
- công cụ
canvasdành cho agent được đăng ký bởi Canvas plugin - các lệnh node Canvas chỉ được cho phép khi Canvas plugin đăng ký chúng
- tệp host/source A2UI nằm trong Canvas plugin
- việc hiện thực hóa tài liệu Canvas nằm trong Canvas plugin
- phần triển khai lệnh CLI nằm trong Canvas plugin, hoặc ủy quyền qua runtime barrel do plugin sở hữu
- tài liệu và kho kiểm kê Plugin mô tả Canvas là thử nghiệm và dựa trên Plugin
Không phải mục tiêu
- Không thiết kế lại UI Canvas của ứng dụng native trong lần tái cấu trúc này.
- Không gỡ bỏ hỗ trợ giao thức/client Canvas khỏi iOS, Android hoặc macOS trừ khi có quyết định sản phẩm riêng rằng Canvas nên bị xóa.
- Không xây dựng một framework dịch vụ plugin rộng chỉ dành cho Canvas trừ khi có ít nhất một Plugin tích hợp khác cần cùng seam đó.
Trạng thái nhánh hiện tại
Đã xong:
- Đã thêm package Plugin tích hợp trong
extensions/canvas. - Đã thêm
extensions/canvas/openclaw.plugin.json. - Đã chuyển công cụ agent
canvastừsrc/agents/tools/canvas-tool.tssangextensions/canvas/src/tool.ts. - Đã gỡ bỏ đăng ký lõi của
createCanvasToolkhỏisrc/agents/openclaw-tools.ts. - Đã chuyển triển khai Canvas host từ
src/canvas-hostsangextensions/canvas/src/host. - Đã giữ
extensions/canvas/runtime-api.tslàm compatibility barrel do plugin sở hữu cho kiểm thử, đóng gói và các helper Canvas public bên ngoài. - Đã chuyển việc hiện thực hóa tài liệu Canvas từ
src/gateway/canvas-documents.tssangextensions/canvas/src/documents.ts. - Đã chuyển triển khai CLI Canvas và các helper A2UI JSONL vào
extensions/canvas/src/cli.ts. - Đã chuyển các helper URL Canvas host và scoped capability vào
extensions/canvas/src. - Đã chuyển mặc định lệnh node Canvas ra khỏi danh sách hardcode của lõi và vào
nodeInvokePoliciescủa plugin. - Đã thêm cấu hình Canvas host do plugin sở hữu tại
plugins.entries.canvas.config.host. - Đã chuyển việc phục vụ HTTP Canvas và A2UI ra sau đăng ký route HTTP của Canvas plugin.
- Đã thêm cơ chế dispatch nâng cấp WebSocket plugin chung cho các route HTTP do plugin sở hữu.
- Đã thay thế URL gateway host và xác thực node capability riêng của Canvas bằng hosted plugin surface chung và helper node capability chung.
- Đã thêm hosted media resolver do plugin sở hữu để URL tài liệu Canvas được resolve qua Canvas plugin thay vì lõi import nội bộ tài liệu Canvas.
- Đã thêm
api.registerNodeCliFeature(...)để Canvas có thể khai báoopenclaw nodes canvaslà tính năng node do plugin sở hữu mà không cần tự viết thủ công đường dẫn lệnh cha. - Đã gỡ bỏ các import production
src/**củaextensions/canvas/runtime-api.js. - Đã chuyển mã nguồn bundle A2UI từ
apps/shared/OpenClawKit/Tools/CanvasA2UIsangextensions/canvas/src/host/a2ui-app. - Đã chuyển triển khai build/copy A2UI vào
extensions/canvas/scriptsvà thay wiring build gốc bằng hook tài sản Plugin tích hợp chung. - Đã gỡ bỏ alias cấu hình runtime legacy cấp cao nhất
canvasHost. - Đã giữ migration doctor Canvas để
openclaw doctor --fixviết lại cấu hìnhcanvasHostcũ thànhplugins.entries.canvas.config.host. - Đã gỡ bỏ tương thích giao thức Canvas của agent cũ phía sau giao thức gateway v4. Native client và gateway hiện chỉ dùng
pluginSurfaceUrls.canvascùngnode.pluginSurface.refresh; đường dẫn đã ngừng dùngcanvasHostUrl,canvasCapability, vànode.canvas.capability.refreshcố ý không được hỗ trợ trong lần tái cấu trúc thử nghiệm này. - Đã cập nhật kho kiểm kê Plugin được tạo để bao gồm Canvas.
- Đã thêm tài liệu tham chiếu Plugin tại
docs/plugins/reference/canvas.md.
Các bề mặt Canvas còn lại đã biết do lõi sở hữu:
- Handler Canvas của ứng dụng native trong
apps/vẫn chủ ý tiêu thụ bề mặt Canvas plugin - handler giao thức/client Canvas của ứng dụng native trong
apps/ - đầu ra artifact đã phát hành vẫn dùng
dist/canvas-host/a2uiđể tra cứu runtime tương thích ngược, nhưng bước copy hiện do plugin sở hữu
Hình dạng mục tiêu
extensions/canvas nên sở hữu:
- manifest plugin và metadata package
- đăng ký công cụ agent
- chính sách lệnh node invoke
- Canvas host và runtime A2UI
- mã nguồn bundle A2UI Canvas và script build/copy tài sản
- tạo tài liệu Canvas và resolve tài sản
- triển khai CLI Canvas
- trang tài liệu Canvas và mục kiểm kê Plugin
Lõi chỉ nên sở hữu các seam chung:
- khám phá và đăng ký plugin
- registry công cụ agent chung
- registry chính sách node invoke chung
- HTTP/xác thực Gateway chung và dispatch nâng cấp WebSocket
- resolve URL hosted plugin surface chung
- đăng ký hosted media resolver chung
- transport node capability chung
- hệ thống cấu hình chung
- khám phá hook tài sản Plugin tích hợp chung
Ứng dụng native có thể giữ handler lệnh Canvas với vai trò client của giao thức. Chúng không phải chủ sở hữu runtime plugin.
Các bước migration
- Xem
plugins.entries.canvas.config.hostlà bề mặt cấu hình do plugin sở hữu. - Cập nhật tài liệu để Canvas được mô tả là Plugin tích hợp thử nghiệm.
- Chạy các kiểm thử Canvas tập trung, kiểm tra kho kiểm kê Plugin, kiểm tra API plugin SDK và các cổng build/type bị ảnh hưởng bởi ranh giới runtime.
Checklist kiểm tra
Trước khi xem quá trình tái cấu trúc là hoàn tất:
rg "src/canvas-host|../canvas-host"không trả về import source đang hoạt động nào.rg "canvas-tool|createCanvasTool" srckhông tìm thấy triển khai công cụ Canvas do lõi sở hữu.rg "canvas.present|canvas.snapshot|canvas.a2ui" src/gatewaykhông tìm thấy mặc định allowlist hardcode nào ngoài các kiểm thử chính sách plugin chung.rg "extensions/canvas/runtime-api" src --glob '!**/*.test.ts'rỗng.rg "canvas-documents" srcrỗng.rg "registerNodesCanvasCommands|nodes-canvas" srcrỗng; Canvas plugin đăng kýopenclaw nodes canvasthông qua metadata CLI plugin lồng nhau.rg "createCanvasHostHandler|handleA2uiHttpRequest" src/gatewaykhông trả về quyền sở hữu runtime gateway nào.rg "apps/shared/OpenClawKit/Tools/CanvasA2UI|canvas-a2ui-copy|extensions/canvas/src/host/a2ui" scripts .github package.jsonchỉ tìm thấy wrapper tương thích hoặc đường dẫn do plugin sở hữu.pnpm plugins:inventory:checkvượt qua.pnpm plugin-sdk:api:checkvượt qua, hoặc baseline API được tạo được cập nhật và review có chủ ý.- Các kiểm thử Canvas mục tiêu vượt qua.
- Kiểm thử changed-lanes vượt qua cho các đường dẫn Canvas host/A2UI.
- Nội dung PR nói rõ Canvas là thử nghiệm và dựa trên plugin.
Lệnh xác minh
Dùng các kiểm tra cục bộ có mục tiêu trong khi lặp:
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
Chạy pnpm build trước khi push nếu runtime barrel, lazy import, đóng gói hoặc các bề mặt plugin đã phát hành thay đổi.