macOS companion app
بوم
برنامه macOS یک پنل Canvas کنترلشده توسط عامل را با استفاده از WKWebView در خود جای میدهد. این پنل یک فضای کاری بصری سبک برای HTML/CSS/JS، A2UI و سطحهای کوچک UI تعاملی است.
محل قرارگیری Canvas
وضعیت Canvas در Application Support ذخیره میشود:
~/Library/Application Support/OpenClaw/canvas/<session>/...
پنل Canvas این فایلها را از طریق یک شِمای URL سفارشی ارائه میکند:
openclaw-canvas://<session>/<path>
مثالها:
openclaw-canvas://main/→<canvasRoot>/main/index.htmlopenclaw-canvas://main/assets/app.css→<canvasRoot>/main/assets/app.cssopenclaw-canvas://main/widgets/todo/→<canvasRoot>/main/widgets/todo/index.html
اگر در ریشه هیچ index.html وجود نداشته باشد، برنامه یک صفحه داربست داخلی را نشان میدهد.
رفتار پنل
- پنلی بدون حاشیه و قابل تغییر اندازه که نزدیک نوار منو (یا نشانگر ماوس) لنگر میشود.
- اندازه/موقعیت را برای هر نشست به خاطر میسپارد.
- هنگام تغییر فایلهای Canvas محلی، بهطور خودکار بازبارگذاری میشود.
- در هر زمان فقط یک پنل Canvas قابل مشاهده است (نشست در صورت نیاز عوض میشود).
Canvas را میتوان از Settings → Allow Canvas غیرفعال کرد. هنگام غیرفعال بودن، فرمانهای Node مربوط به canvas مقدار CANVAS_DISABLED را برمیگردانند.
سطح API عامل
Canvas از طریق Gateway WebSocket در دسترس قرار میگیرد، بنابراین عامل میتواند:
- پنل را نمایش/مخفی کند
- به یک مسیر یا URL ناوبری کند
- JavaScript را ارزیابی کند
- یک تصویر snapshot بگیرد
مثالهای CLI:
openclaw nodes canvas present --node <id>
openclaw nodes canvas navigate --node <id> --url "/"
openclaw nodes canvas eval --node <id> --js "document.title"
openclaw nodes canvas snapshot --node <id>
نکات:
canvas.navigateمسیرهای Canvas محلی، URLهایhttp(s)و URLهایfile://را میپذیرد.- اگر
"/"را ارسال کنید، Canvas داربست محلی یاindex.htmlرا نشان میدهد.
A2UI در Canvas
A2UI توسط میزبان Canvas در Gateway میزبانی میشود و داخل پنل Canvas رندر میشود. هنگامی که Gateway یک میزبان Canvas را اعلام میکند، برنامه macOS در اولین باز شدن بهطور خودکار به صفحه میزبان A2UI ناوبری میکند.
URL پیشفرض میزبان A2UI:
http://<gateway-host>:18789/__openclaw__/a2ui/
فرمانهای A2UI (v0.8)
Canvas در حال حاضر پیامهای A2UI v0.8 سرور→کلاینت را میپذیرد:
beginRenderingsurfaceUpdatedataModelUpdatedeleteSurface
createSurface (v0.9) پشتیبانی نمیشود.
مثال CLI:
cat > /tmp/a2ui-v0.8.jsonl <<'EOFA2'
{"surfaceUpdate":{"surfaceId":"main","components":[{"id":"root","component":{"Column":{"children":{"explicitList":["title","content"]}}}},{"id":"title","component":{"Text":{"text":{"literalString":"Canvas (A2UI v0.8)"},"usageHint":"h1"}}},{"id":"content","component":{"Text":{"text":{"literalString":"If you can read this, A2UI push works."},"usageHint":"body"}}}]}}
{"beginRendering":{"surfaceId":"main","root":"root"}}
EOFA2
openclaw nodes canvas a2ui push --jsonl /tmp/a2ui-v0.8.jsonl --node <id>
smoke سریع:
openclaw nodes canvas a2ui push --node <id> --text "Hello from A2UI"
راهاندازی اجرای عامل از Canvas
Canvas میتواند اجرای جدید عامل را از طریق deep linkها راهاندازی کند:
openclaw://agent?...
مثال (در JS):
window.location.href = "openclaw://agent?message=Review%20this%20design";
برنامه درخواست تأیید میکند، مگر اینکه یک کلید معتبر ارائه شده باشد.
نکات امنیتی
- شِمای Canvas پیمایش دایرکتوری را مسدود میکند؛ فایلها باید زیر ریشه نشست قرار داشته باشند.
- محتوای Canvas محلی از یک شِمای سفارشی استفاده میکند (به سرور local loopback نیازی نیست).
- URLهای خارجی
http(s)فقط زمانی مجاز هستند که صراحتاً به آنها ناوبری شده باشد.