openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
127 lines (126 loc) • 4.28 kB
JavaScript
import { t as definePluginEntry } from "../../plugin-entry-C7DUzV0e.js";
import { n as isCanvasHostEnabled, t as canvasConfigSchema } from "../../config-vBnpZ1fy.js";
import { n as CANVAS_HOST_PATH, r as CANVAS_WS_PATH, t as A2UI_PATH } from "../../a2ui-shared-omDTtmu5.js";
import { t as CanvasToolSchema } from "../../tool-schema-Bd39QYmV.js";
//#region extensions/canvas/index.ts
const CANVAS_NODE_COMMANDS = [
"canvas.present",
"canvas.hide",
"canvas.navigate",
"canvas.eval",
"canvas.snapshot",
"canvas.a2ui.push",
"canvas.a2ui.pushJSONL",
"canvas.a2ui.reset"
];
function createLazyCanvasTool(params) {
let toolPromise;
const loadTool = async () => {
toolPromise ??= import("../../tool-qE5pYv7r.js").then(({ createCanvasTool }) => createCanvasTool({
config: params.config,
workspaceDir: params.workspaceDir
}));
return await toolPromise;
};
return {
label: "Canvas",
name: "canvas",
description: "Control node canvases (present/hide/navigate/eval/snapshot/A2UI). Use snapshot to capture the rendered UI.",
parameters: CanvasToolSchema,
execute: async (...args) => await (await loadTool()).execute(...args)
};
}
var canvas_default = definePluginEntry({
id: "canvas",
name: "Canvas",
description: "Experimental Canvas control and A2UI rendering surfaces for paired nodes.",
configSchema: canvasConfigSchema,
reload: { restartPrefixes: [
"plugins.enabled",
"plugins.allow",
"plugins.deny",
"plugins.entries.canvas"
] },
register(api) {
if (isCanvasHostEnabled(api.config)) {
let httpRouteHandlerPromise;
const loadHttpRouteHandler = async () => {
httpRouteHandlerPromise ??= import("../../http-route-D09PIVN8.js").then(({ createCanvasHttpRouteHandler }) => createCanvasHttpRouteHandler({
config: api.config,
pluginConfig: api.pluginConfig,
runtime: {
log: (...args) => api.logger.info(args.map(String).join(" ")),
error: (...args) => api.logger.error(args.map(String).join(" ")),
exit: (code) => {
throw new Error(`canvas host requested process exit ${code}`);
}
}
}));
return await httpRouteHandlerPromise;
};
const handleHttpRequest = async (req, res) => await (await loadHttpRouteHandler()).handleHttpRequest(req, res);
const handleUpgrade = async (req, socket, head) => await (await loadHttpRouteHandler()).handleUpgrade(req, socket, head);
const nodeCapability = { surface: "canvas" };
api.registerHttpRoute({
path: A2UI_PATH,
auth: "plugin",
match: "prefix",
nodeCapability,
handler: handleHttpRequest
});
api.registerHttpRoute({
path: CANVAS_HOST_PATH,
auth: "plugin",
match: "prefix",
nodeCapability,
handler: handleHttpRequest
});
api.registerHttpRoute({
path: CANVAS_WS_PATH,
auth: "plugin",
match: "exact",
nodeCapability,
handler: handleHttpRequest,
handleUpgrade
});
api.registerService({
id: "canvas-host",
start: () => {},
stop: async () => {
await (httpRouteHandlerPromise ? await httpRouteHandlerPromise : null)?.close();
}
});
let resolveCanvasHttpPathToLocalPathPromise;
api.registerHostedMediaResolver(async (mediaUrl) => {
resolveCanvasHttpPathToLocalPathPromise ??= import("../../documents-DvC9Hnh-.js").then(({ resolveCanvasHttpPathToLocalPath }) => resolveCanvasHttpPathToLocalPath);
return (await resolveCanvasHttpPathToLocalPathPromise)(mediaUrl);
});
}
api.registerNodeInvokePolicy({
commands: CANVAS_NODE_COMMANDS,
defaultPlatforms: [
"ios",
"android",
"macos",
"windows",
"unknown"
],
foregroundRestrictedOnIos: true,
handle: (ctx) => ctx.invokeNode()
});
api.registerTool((ctx) => createLazyCanvasTool({
config: ctx.runtimeConfig ?? ctx.config,
workspaceDir: ctx.workspaceDir
}));
api.registerNodeCliFeature(async ({ program }) => {
const { createDefaultCanvasCliDependencies, registerNodesCanvasCommands } = await import("../../cli-aNKVf8Kf.js");
registerNodesCanvasCommands(program, createDefaultCanvasCliDependencies());
}, { descriptors: [{
name: "canvas",
description: "Capture or render canvas content from a paired node",
hasSubcommands: true
}] });
}
});
//#endregion
export { canvas_default as default };