macOS companion app
Canvas
De macOS-app bevat een door een agent aangestuurd Canvas-paneel met WKWebView, een
lichte visuele werkruimte voor HTML/CSS/JS, A2UI en kleine interactieve
UI-oppervlakken.
Waar Canvas zich bevindt
De Canvas-status wordt opgeslagen onder Application Support:
~/Library/Application Support/OpenClaw/canvas/<session>/...
Het Canvas-paneel biedt deze bestanden aan via een aangepast URL-schema,
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
Als er geen index.html in de hoofdmap bestaat, toont de app een ingebouwde basispagina.
Gedrag van het paneel
- Randloos paneel waarvan het formaat kan worden gewijzigd, verankerd bij de menubalk (of muiscursor).
- Canvas weergeven wisselt niet van app en neemt de toetsenbordfocus niet over.
- Onthoudt formaat en positie per sessie.
- Wordt automatisch opnieuw geladen wanneer lokale Canvas-bestanden veranderen.
- Er is slechts één Canvas-paneel tegelijk zichtbaar (er wordt indien nodig van sessie gewisseld).
Canvas kan worden uitgeschakeld via Settings -> Allow Canvas. Als Canvas is uitgeschakeld,
retourneren Canvas-nodeopdrachten CANVAS_DISABLED.
API-oppervlak voor agents
Canvas is beschikbaar via de Gateway-WebSocket, zodat de agent het paneel kan weergeven of verbergen, naar een pad of URL kan navigeren, JavaScript kan evalueren en een momentopname kan maken:
openclaw nodes canvas present --node <id>openclaw nodes canvas navigate --node <id> "/"openclaw nodes canvas eval --node <id> --js "document.title"openclaw nodes canvas snapshot --node <id>eval en a2ui.* werken de inhoud bij zonder het paneel te openen of zichtbaar te maken. Alleen
present, navigate of een gebruikersactie toont het; nadat het paneel is verborgen, blijven inhoudsupdates
van toepassing op het verborgen paneel. snapshot vereist een zichtbaar paneel en
retourneert anders CANVAS_HIDDEN; voer eerst present uit.
canvas.navigate accepteert lokale Canvas-paden, http(s)-URL's en file://-
URL's. Als je "/" doorgeeft, wordt de lokale basispagina of index.html weergegeven.
Door de Gateway gehoste doelen onder /__openclaw__/canvas/ en
/__openclaw__/a2ui/ worden omgezet via de huidige Canvas-URL met beperkt
bereik van de nodesessie. De app vernieuwt deze kortlevende bevoegdheid vóór de navigatie;
je hoeft niet zelf een bevoegdheids-URL samen te stellen of te kopiëren.
A2UI in Canvas
A2UI wordt gehost door de Canvas-host van de Gateway en weergegeven in het Canvas-paneel. Wanneer de Gateway een Canvas-host aankondigt, navigeert de macOS-app bij de eerste opening automatisch naar de A2UI-hostpagina.
De aangekondigde URL heeft een bevoegdheidsbeperkt bereik, bijvoorbeeld
http://<gateway-host>:18789/__openclaw__/cap/<token>/__openclaw__/a2ui/?platform=macos.
Behandel deze als tijdelijke aanmeldgegevens, niet als een permanente link.
A2UI-opdrachten (v0.8)
Canvas accepteert A2UI v0.8-berichten van server naar client: beginRendering,
surfaceUpdate, dataModelUpdate, deleteSurface. createSurface (v0.9) wordt
nog niet ondersteund.
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":"Als je dit kunt lezen, werkt A2UI-push."},"usageHint":"body"}}}]}}{"beginRendering":{"surfaceId":"main","root":"root"}}EOFA2 openclaw nodes canvas a2ui push --jsonl /tmp/a2ui-v0.8.jsonl --node <id>Snelle rooktest:
openclaw nodes canvas a2ui push --node <id> --text "Hallo vanuit A2UI"Agentruns activeren vanuit Canvas
Canvas kan nieuwe agentruns activeren via openclaw://agent?...-deeplinks:
window.location.href = "openclaw://agent?message=Review%20this%20design";Ondersteunde queryparameters:
| Parameter | Betekenis |
|---|---|
message |
Vooraf ingevulde agentprompt. |
sessionKey |
Stabiele sessie-id. |
thinking |
Optioneel denkprofiel. |
deliver, to, channel |
Afleverdoel. |
timeoutSeconds |
Optionele time-out voor de run. |
key |
Door de app gegenereerd beveiligingstoken voor vertrouwde lokale aanroepers. |
De app vraagt om bevestiging, tenzij een geldige sleutel wordt verstrekt. Links zonder sleutel tonen vóór goedkeuring het bericht en de URL en negeren velden voor afleverroutering; links met een sleutel gebruiken het normale runpad van de Gateway.
Beveiligingsopmerkingen
- Het Canvas-schema blokkeert directorytraversal; bestanden moeten zich onder de sessiehoofdmap bevinden.
- Lokale Canvas-inhoud gebruikt een aangepast schema (geen loopbackserver vereist).
- Externe
http(s)-URL's zijn alleen toegestaan wanneer er expliciet naartoe wordt genavigeerd. - Gewone webpagina's kunnen alleen worden weergegeven. Agentacties worden alleen geaccepteerd vanuit het Canvas-schema dat eigendom is van de app of vanuit het exacte, door een bevoegdheid beperkte Gateway A2UI-document dat door de app is geselecteerd; subframes, omleidingen, verlopen bevoegdheden en gewijzigde query's kunnen geen acties verzenden.