Canvas 是低使用率的实验性功能,将其从 core 迁移为捆绑插件(extensions/canvas),而非 core 特性。
目标
将 Canvas 所有权移至 extensions/canvas,同时保留当前的配对节点行为:
- agent 面向的
canvas工具由 Canvas 插件注册 - Canvas 节点命令仅在 Canvas 插件注册时允许
- A2UI host/source 文件位于 Canvas 插件下
- Canvas 文档物化位于 Canvas 插件下
- CLI 命令实现位于 Canvas 插件下,或通过插件拥有的运行时 barrel 委托
已完成工作
- 在
extensions/canvas添加捆绑插件包和openclaw.plugin.json - 将 agent
canvas工具从src/agents/tools/canvas-tool.ts移至extensions/canvas/src/tool.ts - 将 Canvas host 从
src/canvas-host移至extensions/canvas/src/host - 将 Canvas 文档物化从
src/gateway/canvas-documents.ts移至extensions/canvas/src/documents.ts - 将 Canvas CLI 实现和 A2UI JSONL helpers 移入
extensions/canvas/src/cli.ts - 将 Canvas 节点命令默认值从硬编码 core 列表移至插件
nodeInvokePolicies - 添加插件拥有的 Canvas host 配置:
plugins.entries.canvas.config.host - 将 Canvas 和 A2UI HTTP 服务移至 Canvas 插件 HTTP 路由注册
- 添加通用插件 WebSocket 升级分发
- 将 A2UI bundle 源从
apps/shared/OpenClawKit/Tools/CanvasA2UI移至extensions/canvas/src/host/a2ui-app - 移除运行时遗留顶层
canvasHost配置别名(保留 doctor 迁移)
Core 保留的通用接缝
- 插件发现和注册
- 通用 agent 工具注册表
- 通用节点调用策略注册表
- 通用 gateway HTTP/auth 和 WebSocket 升级分发
- 通用托管插件 surface URL 解析
- 通用托管媒体解析器注册
- 通用 config 管道
- 通用捆绑插件资产钩子发现
审计检查清单
rg "src/canvas-host|../canvas-host" # 应无结果
rg "canvas-tool|createCanvasTool" src # 应无 core 拥有的实现
rg "canvas-documents" src # 应无结果
rg "registerNodesCanvasCommands|nodes-canvas" src # 应无结果
pnpm plugins:inventory:check
pnpm plugin-sdk:api:check验证命令
pnpm test extensions/canvas/src/host/server.test.ts
pnpm test src/gateway/server.plugin-node-capability-auth.test.ts
pnpm tsgo:extensions
pnpm plugins:inventory:check
pnpm plugin-sdk:api:check