Get started
Canvas Plugin のリファクタリング
Canvas Plugin リファクター
Canvas は利用が少なく実験的です。コア機能ではなく、バンドル済みPluginとして扱ってください。コアは汎用の Gateway、Node、HTTP、認証、設定、ネイティブクライアントの配管を保持してもよいですが、Canvas 固有の挙動は extensions/canvas 配下に置くべきです。
目標
現在のペアリング済みNodeの挙動を維持しながら、Canvas の所有権を extensions/canvas に移します。
- エージェント向けの
canvasツールは Canvas Plugin によって登録される - Canvas Node コマンドは、Canvas Plugin が登録した場合にのみ許可される
- A2UI ホスト/ソースファイルは Canvas Plugin 配下に置く
- Canvas ドキュメントの具現化は Canvas Plugin 配下に置く
- CLI コマンド実装は Canvas Plugin 配下に置くか、Plugin 所有のランタイムバレル経由で委譲する
- ドキュメントと Plugin インベントリは Canvas を実験的で Plugin に支えられたものとして説明する
非目標
- このリファクターでネイティブアプリの Canvas UI を再設計しない。
- Canvas を削除すべきという別のプロダクト判断がない限り、iOS、Android、macOS から Canvas プロトコル/クライアントサポートを削除しない。
- 少なくとも他のバンドル済みPlugin 1つが同じ継ぎ目を必要としない限り、Canvas のためだけに広範な Plugin サービスフレームワークを構築しない。
現在のブランチ状態
完了:
extensions/canvasにバンドル済みPlugin パッケージを追加。extensions/canvas/openclaw.plugin.jsonを追加。- エージェントの
canvasツールをsrc/agents/tools/canvas-tool.tsからextensions/canvas/src/tool.tsに移動。 src/agents/openclaw-tools.tsからcreateCanvasToolのコア登録を削除。- Canvas ホスト実装を
src/canvas-hostからextensions/canvas/src/hostに移動。 - テスト、パッケージング、外部公開 Canvas ヘルパー向けの Plugin 所有互換バレルとして
extensions/canvas/runtime-api.tsを保持。 - Canvas ドキュメントの具現化を
src/gateway/canvas-documents.tsからextensions/canvas/src/documents.tsに移動。 - Canvas CLI 実装と A2UI JSONL ヘルパーを
extensions/canvas/src/cli.tsに移動。 - Canvas ホスト URL とスコープ付き capability ヘルパーを
extensions/canvas/srcに移動。 - Canvas Node コマンドのデフォルトをハードコードされたコアリストから Plugin の
nodeInvokePoliciesに移動。 - Plugin 所有の Canvas ホスト設定を
plugins.entries.canvas.config.hostに追加。 - Canvas と A2UI の HTTP 配信を Canvas Plugin の HTTP ルート登録の背後へ移動。
- Plugin 所有 HTTP ルート向けの汎用 Plugin WebSocket アップグレードディスパッチを追加。
- Canvas 固有の Gateway ホスト URL と Node capability 認証を、汎用のホスト済みPlugin surface と Node capability ヘルパーに置き換え。
- Canvas ドキュメント URL が、コアが Canvas ドキュメント内部をインポートする代わりに Canvas Plugin 経由で解決されるよう、Plugin 所有のホスト済みメディアリゾルバーを追加。
- Canvas が親コマンドパスを手動で明記せずに
openclaw nodes canvasを Plugin 所有の Node 機能として宣言できるよう、api.registerNodeCliFeature(...)を追加。 extensions/canvas/runtime-api.jsの本番src/**インポートを削除。- A2UI バンドルソースを
apps/shared/OpenClawKit/Tools/CanvasA2UIからextensions/canvas/src/host/a2ui-appに移動。 - A2UI のビルド/コピー実装を
extensions/canvas/scripts配下に移し、ルートのビルド配線を汎用のバンドル済みPlugin アセットフックに置き換え。 - ランタイムのレガシートップレベル
canvasHost設定エイリアスを削除。 openclaw doctor --fixが古いcanvasHost設定をplugins.entries.canvas.config.hostに書き換えるよう、Canvas doctor マイグレーションを保持。- Gateway プロトコル v4 の背後にあった古いエージェント向け Canvas プロトコル互換性を削除。ネイティブクライアントと Gateway は現在、
pluginSurfaceUrls.canvasとnode.pluginSurface.refreshのみを使用します。非推奨のcanvasHostUrl、canvasCapability、node.canvas.capability.refreshパスは、この実験的リファクターでは意図的にサポートされません。 - 生成済みPlugin インベントリを更新して Canvas を含めた。
docs/plugins/reference/canvas.mdに Plugin リファレンスドキュメントを追加。
既知の残存するコア所有 Canvas surface:
apps/配下のネイティブアプリ Canvas ハンドラーは、引き続き意図的に Canvas Plugin surface を利用するapps/配下のネイティブアプリ Canvas プロトコル/クライアントハンドラー- 公開アーティファクト出力は後方互換のランタイム検索のために引き続き
dist/canvas-host/a2uiを使用するが、コピー手順は現在 Plugin 所有
目標形
extensions/canvas が所有すべきもの:
- Plugin マニフェストとパッケージメタデータ
- エージェントツール登録
- Node invoke コマンドポリシー
- Canvas ホストと A2UI ランタイム
- Canvas A2UI バンドルソースとアセットのビルド/コピー scripts
- Canvas ドキュメント作成とアセット解決
- Canvas CLI 実装
- Canvas ドキュメントページと Plugin インベントリエントリ
コアが所有すべきなのは汎用の継ぎ目のみです。
- Plugin の発見と登録
- 汎用エージェントツールレジストリ
- 汎用 Node invoke ポリシーレジストリ
- 汎用 Gateway HTTP/認証と WebSocket アップグレードディスパッチ
- 汎用ホスト済みPlugin surface URL 解決
- 汎用ホスト済みメディアリゾルバー登録
- 汎用 Node capability トランスポート
- 汎用設定の配管
- 汎用バンドル済みPlugin アセットフック検出
ネイティブアプリはプロトコルのクライアントとして Canvas コマンドハンドラーを保持してもかまいません。Plugin ランタイムの所有者ではありません。
移行手順
plugins.entries.canvas.config.hostを Plugin 所有の設定 surface として扱う。- Canvas が実験的なバンドル済みPlugin と説明されるようにドキュメントを更新する。
- 集中的な Canvas テスト、Plugin インベントリチェック、Plugin SDK API チェック、ランタイム境界の影響を受けるビルド/型ゲートを実行する。
監査チェックリスト
リファクター完了と呼ぶ前に:
rg "src/canvas-host|../canvas-host"がライブなソースインポートを返さない。rg "canvas-tool|createCanvasTool" srcがコア所有の Canvas ツール実装を見つけない。rg "canvas.present|canvas.snapshot|canvas.a2ui" src/gatewayが、汎用 Plugin ポリシーテスト以外にハードコードされた許可リストのデフォルトを見つけない。rg "extensions/canvas/runtime-api" src --glob '!**/*.test.ts'が空。rg "canvas-documents" srcが空。rg "registerNodesCanvasCommands|nodes-canvas" srcが空。Canvas Plugin はネストされた Plugin CLI メタデータを通じてopenclaw nodes canvasを登録する。rg "createCanvasHostHandler|handleA2uiHttpRequest" src/gatewayが Gateway ランタイム所有権を返さない。rg "apps/shared/OpenClawKit/Tools/CanvasA2UI|canvas-a2ui-copy|extensions/canvas/src/host/a2ui" scripts .github package.jsonが互換ラッパーまたは Plugin 所有パスのみを見つける。pnpm plugins:inventory:checkが通る。pnpm plugin-sdk:api:checkが通る、または生成済み API ベースラインが意図的に更新されレビューされている。- 対象を絞った Canvas テストが通る。
- Canvas ホスト/A2UI パスに対する changed-lanes テストが通る。
- PR 本文が Canvas は実験的で Plugin に支えられていると明示している。
検証コマンド
反復中は対象を絞ったローカルチェックを使用します。
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
ランタイムバレル、遅延インポート、パッケージング、または公開 Plugin surface が変わる場合は、push 前に pnpm build を実行してください。