UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

77 lines (75 loc) 3.23 kB
import { r as lowercasePreservingWhitespace } from "./string-coerce-mnp54Vah.js"; import "./string-coerce-runtime-CEGJWkQ_.js"; //#region extensions/canvas/src/host/a2ui-shared.ts /** * Shared A2UI/Canvas host paths and live-reload injection helpers. */ /** Hosted path prefix for bundled A2UI assets. */ const A2UI_PATH = "/__openclaw__/a2ui"; /** Hosted path prefix for Canvas document/static assets. */ const CANVAS_HOST_PATH = "/__openclaw__/canvas"; /** Hosted WebSocket path for Canvas live reload. */ const CANVAS_WS_PATH = "/__openclaw__/ws"; /** Returns whether a URL path targets the hosted A2UI asset surface. */ function isA2uiPath(pathname) { return pathname === "/__openclaw__/a2ui" || pathname.startsWith(`/__openclaw__/a2ui/`); } /** Injects Canvas bridge helpers and live-reload WebSocket code into HTML. */ function injectCanvasLiveReload(html) { const snippet = ` <script> (() => { // Cross-platform action bridge helper. // Works on: // - iOS: window.webkit.messageHandlers.openclawCanvasA2UIAction.postMessage(...) // - Android: window.openclawCanvasA2UIAction.postMessage(...) const handlerNames = ["openclawCanvasA2UIAction"]; function postToNode(payload) { try { const raw = typeof payload === "string" ? payload : JSON.stringify(payload); for (const name of handlerNames) { const iosHandler = globalThis.webkit?.messageHandlers?.[name]; if (iosHandler && typeof iosHandler.postMessage === "function") { iosHandler.postMessage(raw); return true; } const androidHandler = globalThis[name]; if (androidHandler && typeof androidHandler.postMessage === "function") { // Important: call as a method on the interface object (binding matters on Android WebView). androidHandler.postMessage(raw); return true; } } } catch {} return false; } function sendUserAction(userAction) { const id = (userAction && typeof userAction.id === "string" && userAction.id.trim()) || (globalThis.crypto?.randomUUID?.() ?? String(Date.now())); const action = { ...userAction, id }; return postToNode({ userAction: action }); } globalThis.OpenClaw = globalThis.OpenClaw ?? {}; globalThis.OpenClaw.postMessage = postToNode; globalThis.OpenClaw.sendUserAction = sendUserAction; globalThis.openclawPostMessage = postToNode; globalThis.openclawSendUserAction = sendUserAction; try { const cap = new URLSearchParams(location.search).get("oc_cap"); const proto = location.protocol === "https:" ? "wss" : "ws"; const capQuery = cap ? "?oc_cap=" + encodeURIComponent(cap) : ""; const ws = new WebSocket(proto + "://" + location.host + ${JSON.stringify(CANVAS_WS_PATH)} + capQuery); ws.onmessage = (ev) => { if (String(ev.data || "") === "reload") location.reload(); }; } catch {} })(); <\/script> `.trim(); const idx = lowercasePreservingWhitespace(html).lastIndexOf("</body>"); if (idx >= 0) return `${html.slice(0, idx)}\n${snippet}\n${html.slice(idx)}`; return `${html}\n${snippet}\n`; } //#endregion export { isA2uiPath as a, injectCanvasLiveReload as i, CANVAS_HOST_PATH as n, CANVAS_WS_PATH as r, A2UI_PATH as t };