Canvas 作为应用平台,在 OpenClaw Canvas 上构建、存储和运行丰富的可视化应用。
Canvas OS.是一项面向实际任务的技能,主要用于Canvas 是一个应用平台.;OpenClaw Canvas 上创建,存储,运行丰富的视觉应用.;
Apps是本地建设的,运行于 Canvas.;Rich HT.。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
Canvas 作为一个应用平台:在 OpenClaw Canvas 上构建、存储并运行富交互可视化应用。
你即操作系统(OS)。Canvas 是你的窗口。应用在本地构建,并在 Canvas 上运行。
富交互 HTML/CSS/JS 界面 —— 不仅限于纯文本,支持完整交互、动画与实时数据。
| 命令 | Jarvis 执行操作 |
|---|---|
| “Open [app]” | 启动服务端、导航至 Canvas、注入数据 |
| “Build me a [type]” | 基于模板创建应用并打开 |
| “Update [element]” | 注入 JS 实时修改页面元素 |
| “Show [data] on canvas” | 快速 A2UI 展示 |
| “Close canvas” | 停止服务端、隐藏 Canvas |
核心原则:应用运行于 Canvas,而非浏览器标签页。Canvas 即你的 UI 窗口。
Canvas 具有安全限制,禁止访问本地文件路径。以下三种方式可行:
| 方式 | 适用场景 | 优势 | 劣势 |
|---|---|---|---|
| 本地服务器(localhost) | 复杂应用、含外部资源 | 支持全部浏览器特性 | 需手动管理端口 |
| 直接 HTML 注入 | 快速展示、演示场景 | 即时生效,无需启动服务端 | 不支持外部资源,内容大小受限 |
| Data URLs | 小型内容 | 自包含,无依赖 | 部分系统下不可靠 |
❌ 不可用方式: file:///path/to/file.html(被 Canvas 安全策略拦截)
📖 参考文档: CANVAS-LOADING.md(含详细指南与排障说明)
辅助脚本: canvas-inject.py —— 格式化 HTML 以适配直接注入
~/.openclaw/workspace/apps/[app-name]/ ├── index.html # UI 页面(推荐采用自包含形式) ├── data.json # 持久化状态数据 └── manifest.json # 应用元数据
cd ~/.openclaw/workspace/apps/[app-name] python3 -m http.server [PORT] > /dev/null 2>&1 &
NODE="Your Node Name" # 通过命令获取:openclaw nodes status openclaw nodes canvas navigate --node "$NODE" "http://localhost:[PORT]/"
重要提示: 此操作将应用打开在 Canvas(可视化面板)中,而非浏览器标签页。
openclaw nodes canvas eval --node "$NODE" --js "app.setData({...})"
注意: 当前 OpenClaw 版本中 openclaw-canvas:// URL Scheme 存在兼容性问题,请改用 http://localhost:。
该操作的作用: 在 Canvas(可视化面板)中显示应用,而非在浏览器标签页中打开。
完整执行流程:
NODE="Your Node Name"
PORT=9876
APP="my-app"
# 1. 终止该端口上已存在的服务进程
lsof -ti:$PORT | xargs kill -9 2>/dev/null
# 2. 启动服务端
cd ~/.openclaw/workspace/apps/$APP
python3 -m http.server $PORT > /dev/null 2>&1 &
# 3. 等待服务就绪
sleep 1
# 4. 导航 Canvas 至应用地址
openclaw nodes canvas navigate --node "$NODE" "http://localhost:$PORT/"
# 5. 注入初始数据
openclaw nodes canvas eval --node "$NODE" --js "app.loadData({...})"
适用场景: Canvas 因安全沙箱机制禁止使用文件路径(file://);Data URLs 在部分环境下不稳定。此方式无需启动本地服务,可实现即时渲染。
# 示例:使用 canvas 工具
canvas.present(url="about:blank", target=node_name)
html_content = """
Your Content Here
"""
# 转义反引号后注入
js_code = f"""document.open();
document.write(`{html_content}`);
document.close();"""
canvas.eval(javaScript=js_code, target=node_name)
关键限制: 文件路径(file:///path/to/file.html)因安全策略在 Canvas 中被明确禁止。请始终使用 localhost 或直接注入方式。
每个应用应暴露 window.app 或 window.[appname] 对象:
window.app = {
// 更新单个字段值
setValue: (key, val) => {
document.getElementById(key).textContent = val;
},
// 批量更新数据
loadData: (data) => { /* 渲染全部内容 */ },
// 显示通知
notify: (msg) => { /* 弹出 toast 提示 */ }
};
应用可通过深度链接(deep links)向 Agent 发送指令:
function sendToAgent(message) {
window.location.href = `openclaw://agent?message=${encodeURIComponent(message)}`;
}
// 按钮点击 → 触发 Agent 命令
document.getElementById('btn').onclick = () => {
sendToAgent('Refresh my dashboard');
};
含统计卡片、进度条、列表等内容的自包含 HTML 应用。
dashboard.setRevenue()、dashboard.setProgress()、dashboard.notify()支持习惯/任务勾选与连续打卡功能的自包含 HTML 应用。
tracker.setItems()、tracker.addItem()、tracker.toggleItem()适用于无需完整应用结构的临时信息展示:
openclaw nodes canvas a2ui push --node "$NODE" --text " 📊 QUICK STATUS Revenue: $500 Users: 100 Done! "
| 应用类型 | 默认端口 |
|---|---|
| Dashboard | 9876 |
| Tracker | 9877 |
| Timer | 9878 |
| Display | 9879 |
| Custom | 9880+ |
:root {
--bg-primary: #0a0a0a;
--bg-card: #1a1a2e;
--accent-green: #00d4aa;
--accent-blue: #4a9eff;
--accent-orange: #f59e0b;
--text-primary: #fff;
--text-muted: #888;
--border: #333;
}
window.app.* 动态更新应用在浏览器中打开而非 Canvas?
openclaw nodes canvas navigate,而非普通 open 命令canvas navigate 明确作用于 Canvas 面板Canvas 显示 “Not Found”?
file:/// 协议 URLcanvas eval + document.write() 进行直接 HTML 注入curl http://localhost:[PORT]/http://localhost:,避免使用存在兼容问题的 openclaw-canvas://URL 正确但 Canvas 仍显示 “Not Found”?
应用未响应更新?
window.app API 是否已正确定义:openclaw nodes canvas eval --js "typeof window.app"端口已被占用?
lsof -ti:[PORT] | xargs kill -9用于直接 HTML 注入(方法 2)的 Python 辅助工具。
# Python 中调用示例
from canvas_inject import inject_html_to_canvas
html = open("my-dashboard.html").read()
commands = inject_html_to_canvas(html, node_name="Your Node")
# 后续使用 canvas 工具执行返回的指令
canvas.present(**commands["step1_present"])
canvas.eval(**commands["step2_inject"])
或手动遵循 “启动一个应用” 小节中方法 2 的操作模式。
http.server)