Get started
การปรับโครงสร้าง Plugin Canvas
การปรับโครงสร้าง Plugin Canvas
Canvas มีการใช้งานน้อยและอยู่ในขั้นทดลอง ให้ถือว่าเป็น Plugin ที่รวมมาในชุด ไม่ใช่ฟีเจอร์หลัก ส่วนแกนอาจคงระบบเชื่อมต่อทั่วไปสำหรับ Gateway, Node, HTTP, การยืนยันตัวตน, การกำหนดค่า และไคลเอนต์เนทีฟไว้ได้ แต่พฤติกรรมเฉพาะของ Canvas ควรอยู่ภายใต้ extensions/canvas
เป้าหมาย
ย้ายความเป็นเจ้าของ Canvas ไปยัง extensions/canvas โดยคงพฤติกรรม Node ที่จับคู่ไว้ในปัจจุบัน:
- เครื่องมือ
canvasสำหรับเอเจนต์ได้รับการลงทะเบียนโดย Plugin Canvas - อนุญาตคำสั่ง Node ของ Canvas เฉพาะเมื่อ Plugin Canvas ลงทะเบียนคำสั่งเหล่านั้น
- ไฟล์โฮสต์/ซอร์สของ A2UI อยู่ภายใต้ Plugin Canvas
- การสร้างเอกสาร Canvas ให้อยู่ในรูปที่ใช้งานได้อยู่ภายใต้ Plugin Canvas
- การใช้งานคำสั่ง CLI อยู่ภายใต้ Plugin Canvas หรือมอบหมายผ่าน runtime barrel ที่ Plugin เป็นเจ้าของ
- เอกสารและรายการ Plugin ระบุว่า Canvas เป็นฟีเจอร์ทดลองที่ทำงานผ่าน Plugin
สิ่งที่ไม่ใช่เป้าหมาย
- อย่าออกแบบ UI Canvas ของแอปเนทีฟใหม่ในการปรับโครงสร้างครั้งนี้
- อย่าลบการรองรับโปรโตคอล/ไคลเอนต์ Canvas ออกจาก iOS, Android หรือ macOS เว้นแต่จะมีการตัดสินใจด้านผลิตภัณฑ์แยกต่างหากให้ลบ Canvas
- อย่าสร้างเฟรมเวิร์กบริการ Plugin แบบกว้างเพียงเพื่อ Canvas เว้นแต่จะมี Plugin อื่นที่รวมมาในชุดอย่างน้อยหนึ่งรายการต้องใช้จุดเชื่อมเดียวกัน
สถานะของบรานช์ปัจจุบัน
เสร็จแล้ว:
- เพิ่มแพ็กเกจ Plugin ที่รวมมาในชุดใน
extensions/canvas - เพิ่ม
extensions/canvas/openclaw.plugin.json - ย้ายเครื่องมือ
canvasของเอเจนต์จากsrc/agents/tools/canvas-tool.tsไปยังextensions/canvas/src/tool.ts - ลบการลงทะเบียน
createCanvasToolในแกนออกจากsrc/agents/openclaw-tools.ts - ย้ายการใช้งานโฮสต์ Canvas จาก
src/canvas-hostไปยังextensions/canvas/src/host - คง
extensions/canvas/runtime-api.tsไว้เป็น compatibility barrel ที่ Plugin เป็นเจ้าของ สำหรับการทดสอบ การจัดแพ็กเกจ และตัวช่วย Canvas สาธารณะภายนอก - ย้ายการสร้างเอกสาร Canvas ให้อยู่ในรูปที่ใช้งานได้จาก
src/gateway/canvas-documents.tsไปยังextensions/canvas/src/documents.ts - ย้ายการใช้งาน CLI ของ Canvas และตัวช่วย JSONL ของ A2UI ไปไว้ใน
extensions/canvas/src/cli.ts - ย้าย URL โฮสต์ Canvas และตัวช่วยความสามารถแบบจำกัดขอบเขตไปไว้ใน
extensions/canvas/src - ย้ายค่าเริ่มต้นของคำสั่ง Node สำหรับ Canvas ออกจากรายการที่ฮาร์ดโค้ดในแกนไปไว้ใน
nodeInvokePoliciesของ Plugin - เพิ่มการกำหนดค่าโฮสต์ Canvas ที่ Plugin เป็นเจ้าของใน
plugins.entries.canvas.config.host - ย้ายการให้บริการ HTTP ของ Canvas และ A2UI ไปอยู่เบื้องหลังการลงทะเบียนเส้นทาง HTTP ของ Plugin Canvas
- เพิ่มการส่งต่อการอัปเกรด WebSocket แบบทั่วไปสำหรับเส้นทาง HTTP ที่ Plugin เป็นเจ้าของ
- แทนที่ URL โฮสต์ Canvas และการยืนยันสิทธิ์ความสามารถของ Node ที่เฉพาะเจาะจงกับ Canvas ใน Gateway ด้วยพื้นผิว Plugin แบบโฮสต์และตัวช่วยความสามารถของ Node ที่เป็นแบบทั่วไป
- เพิ่มตัวแก้ไขสื่อที่โฮสต์ซึ่ง Plugin เป็นเจ้าของ เพื่อให้ URL เอกสาร Canvas แก้ไขผ่าน Plugin Canvas แทนที่แกนจะนำเข้ารายละเอียดภายในของเอกสาร Canvas
- เพิ่ม
api.registerNodeCliFeature(...)เพื่อให้ Canvas สามารถประกาศopenclaw nodes canvasเป็นฟีเจอร์ Node ที่ Plugin เป็นเจ้าของได้โดยไม่ต้องระบุพาธคำสั่งแม่ด้วยตนเอง - ลบการนำเข้า
extensions/canvas/runtime-api.jsของsrc/**ในโปรดักชัน - ย้ายซอร์สบันเดิล A2UI จาก
apps/shared/OpenClawKit/Tools/CanvasA2UIไปยังextensions/canvas/src/host/a2ui-app - ย้ายการใช้งานสำหรับสร้าง/คัดลอก A2UI ไปไว้ภายใต้
extensions/canvas/scriptsและแทนที่การเชื่อมต่อระบบสร้างที่รูทด้วยฮุกแอสเซ็ต Plugin ที่รวมมาในชุดแบบทั่วไป - ลบชื่อแทนการกำหนดค่าระดับบนสุด
canvasHostแบบเก่าที่ runtime ใช้ออก - คงการย้ายข้อมูล Canvas ของ doctor ไว้ เพื่อให้
openclaw doctor --fixเขียนการกำหนดค่าcanvasHostแบบเก่าใหม่เป็นplugins.entries.canvas.config.host - ลบความเข้ากันได้ของโปรโตคอล Canvas สำหรับเอเจนต์รุ่นเก่าภายใต้โปรโตคอล Gateway v4 ขณะนี้ไคลเอนต์เนทีฟและ Gateway ใช้เฉพาะ
pluginSurfaceUrls.canvasร่วมกับnode.pluginSurface.refreshเท่านั้น โดยพาธcanvasHostUrl,canvasCapabilityและnode.canvas.capability.refreshที่เลิกใช้แล้วไม่ได้รับการรองรับโดยเจตนาในการปรับโครงสร้างเชิงทดลองครั้งนี้ - อัปเดตรายการ Plugin ที่สร้างขึ้นให้รวม Canvas
- เพิ่มเอกสารอ้างอิง Plugin ที่
docs/plugins/reference/canvas.md
พื้นผิว Canvas ที่แกนยังเป็นเจ้าของและทราบว่ายังคงเหลืออยู่:
- ตัวจัดการ Canvas ของแอปเนทีฟภายใต้
apps/ยังคงใช้งานพื้นผิวของ Plugin Canvas โดยเจตนา - ตัวจัดการโปรโตคอล/ไคลเอนต์ Canvas ของแอปเนทีฟภายใต้
apps/ - เอาต์พุตอาร์ติแฟกต์ที่เผยแพร่ยังคงใช้
dist/canvas-host/a2uiสำหรับการค้นหา runtime ที่เข้ากันได้ย้อนหลัง แต่ขณะนี้ขั้นตอนการคัดลอกเป็นของ Plugin แล้ว
โครงสร้างเป้าหมาย
extensions/canvas ควรเป็นเจ้าของ:
- ไฟล์ manifest และข้อมูลเมตาของแพ็กเกจ Plugin
- การลงทะเบียนเครื่องมือของเอเจนต์
- นโยบายคำสั่งเรียกใช้ Node
- โฮสต์ Canvas และ runtime ของ A2UI
- ซอร์สบันเดิล A2UI ของ Canvas และสคริปต์สร้าง/คัดลอกแอสเซ็ต
- การสร้างเอกสาร Canvas และการแก้ไขแอสเซ็ต
- การใช้งาน CLI ของ Canvas
- หน้าเอกสาร Canvas และรายการในบัญชี Plugin
แกนควรเป็นเจ้าของเฉพาะจุดเชื่อมทั่วไป:
- การค้นหาและลงทะเบียน Plugin
- รีจิสทรีเครื่องมือของเอเจนต์แบบทั่วไป
- รีจิสทรีนโยบายการเรียกใช้ Node แบบทั่วไป
- HTTP/การยืนยันตัวตนของ Gateway และการส่งต่อการอัปเกรด WebSocket แบบทั่วไป
- การแก้ไข URL ของพื้นผิว Plugin แบบโฮสต์โดยทั่วไป
- การลงทะเบียนตัวแก้ไขสื่อแบบโฮสต์โดยทั่วไป
- การขนส่งความสามารถของ Node แบบทั่วไป
- ระบบเชื่อมต่อการกำหนดค่าแบบทั่วไป
- การค้นหาฮุกแอสเซ็ตของ Plugin ที่รวมมาในชุดแบบทั่วไป
แอปเนทีฟอาจคงตัวจัดการคำสั่ง Canvas ไว้ในฐานะไคลเอนต์ของโปรโตคอล แอปเหล่านี้ไม่ใช่เจ้าของ runtime ของ Plugin
ขั้นตอนการย้าย
- ถือว่า
plugins.entries.canvas.config.hostเป็นพื้นผิวการกำหนดค่าที่ Plugin เป็นเจ้าของ - อัปเดตเอกสารเพื่ออธิบายว่า Canvas เป็น Plugin แบบทดลองที่รวมมาในชุด
- เรียกใช้การทดสอบ Canvas แบบเจาะจง การตรวจสอบรายการ Plugin การตรวจสอบ API ของ Plugin SDK และเกตการสร้าง/ชนิดข้อมูลที่ได้รับผลกระทบจากขอบเขต runtime
รายการตรวจสอบการตรวจประเมิน
ก่อนระบุว่าการปรับโครงสร้างเสร็จสมบูรณ์:
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ว่างเปล่า โดย Plugin Canvas ลงทะเบียนopenclaw nodes canvasผ่านข้อมูลเมตา CLI ของ Plugin แบบซ้อนrg "createCanvasHostHandler|handleA2uiHttpRequest" src/gatewayไม่พบความเป็นเจ้าของ runtime ของ Gatewayrg "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 แบบเจาะจงผ่าน
- การทดสอบ changed-lanes สำหรับพาธโฮสต์ Canvas/A2UI ผ่าน
- เนื้อหา 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.tspnpm test src/gateway/server.plugin-node-capability-auth.test.ts src/gateway/server-import-boundary.test.tspnpm test extensions/canvas/src/config-migration.test.ts src/commands/doctor-legacy-config.migrations.test.tspnpm 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.tspnpm tsgo:extensionspnpm plugins:inventory:checkpnpm plugin-sdk:api:checkเรียกใช้ pnpm build ก่อน push หาก runtime barrel, การนำเข้าแบบ lazy, การจัดแพ็กเกจ หรือพื้นผิว Plugin ที่เผยแพร่มีการเปลี่ยนแปลง