OpenClaw 深度解析(六):节点、Canvas 与子 Agent
场景AI 助手的边界问题把 OpenClaw 当作个人 AI 助手使用一段时间后会遇到几个让单进程模型力不从心的场景远程执行你想让 AI 帮你在家里的 Linux 服务器上跑一段脚本但 OpenClaw Gateway 运行在 Mac 上——AI 怎么触达那台服务器的 Shell手机上的交互 UI你想在手机上看到 AI 生成的实时仪表盘并且能点击按钮触发下一步操作——AI 怎么向移动端 WebView 推送 UIWebView 里的点击又怎么反馈给 AI并行任务你让 AI 帮你整理 1000 封邮件——用一个 Agent 串行处理太慢了能不能派出多个 AI 同时干这三个场景分别对应 OpenClaw 的三个核心扩展机制Node Host节点主机、Canvas A2UI、子 AgentSub-agent。一、Node Host让 AI 触达远程机器问题Gateway 和执行目标不在同一台机器Gateway 负责对话管理和 Agent 执行但system.run执行 Shell 命令这类工具需要在目标机器上运行——可能是远程服务器、NAS、Raspberry Pi或者同一台 Mac 上受限环境的另一个进程。Node是解决这个问题的抽象一个独立进程连接到 Gateway响应执行请求。Node 通过标准的GatewayClientWebSocket注册自己// src/node-host/runner.tsconstclientnewGatewayClient({url:wss://${gatewayHost}:${gatewayPort},instanceId:nodeId,// 节点唯一标识如机器 hostnameclientName:node-host,role:node,// 区别于 agent、cli 角色caps:[system,browser],// 声明此节点支持的能力commands:NODE_SYSTEM_RUN_COMMANDS,// 支持的命令列表onEvent:(evt){if(evt.event!node.invoke.request)return;constpayloadcoerceNodeInvokePayload(evt.payload);voidhandleInvoke(payload,client,skillBins);// 处理执行请求},});client.start();数据流Agent 调用 system.run 工具 → Gateway 路由到目标 nodeId 的 WebSocket 连接 → 发送 node.invoke.request 事件 → Node 执行命令 (spawn子进程) → node.invoke.result 返回结果 → Gateway 把结果交给 Agent执行安全三级权限模型Node 不是无限制的 Shell 执行器。exec-approvals.ts实现了一个三级安全模型typeExecSecuritydeny|allowlist|full;deny拒绝所有命令执行allowlist默认只允许exec-approvals.json白名单中的命令full允许所有命令高信任环境下使用白名单文件用哈希防止竞态修改——读取和更新都需要传入baseHash若文件已被其他进程改动返回INVALID_REQUEST: exec approvals changed; reload and retry。这防止了 TOCTOU 攻击。还有一个特殊路径在 macOS 上preferMacAppExecHost为 true 时执行请求会优先通过 macOS 应用的 Exec HostUnix socket而不是直接spawn。这是因为 macOS 沙盒限制了某些路径的访问权限通过应用层代理绕过这个限制。Node 的输出上限命令的输出被硬性截断constOUTPUT_CAP200_000;// 累计输出上限字节constOUTPUT_EVENT_TAIL20_000;// 单次事件的输出尾部字节超出上限的内容被丢弃结果中truncated: true。这保证了大量输出如日志文件不会撑爆 Agent 的上下文窗口。二、Canvas在手机上渲染 AI 生成的 UI问题AI 的回复只能是文字吗AI 擅长生成代码能不能生成 HTML 仪表盘、然后在用户手机上直接显示并支持交互Canvas是 Gateway 内置的一个轻量 HTTP 服务器挂载在/__openclaw__/canvas专门伺服 AI 生成的 HTML/JS/CSS 文件// 目录结构~/.openclaw/canvas/index.html ←AI生成后写到这里 app.js style.cssGateway 启动时createCanvasHostHandler会在~/.openclaw/canvas/创建默认的index.html如果不存在用chokidar监听目录变化文件变化时通过 WebSocket/__openclaw__/ws推送reload给所有已连接的客户端被注入的实时重载脚本// 每个 HTML 页面末尾都会自动注入constwsnewWebSocket(wss://host/__openclaw__/ws);ws.onmessage(ev){if(String(ev.data||)reload)location.reload();};这意味着AI 重写index.html→ chokidar 检测到文件变化 → WebSocket 广播reload→ 用户手机上的 WebView 自动刷新。文件系统边界文件服务有安全约束。resolveFileWithinRoot用open(fd)realpath验证每个请求的文件路径都在 Canvas 根目录内——这与上一篇 Plugin SDK 里的openBoundaryFileSync是同一类防护都是防止路径遍历攻击。三、A2UIWebView 与 Agent 的双向通信问题Canvas 页面里的按钮点击怎么回传给 AgentCanvas 里的 HTML 页面可以显示数据但它本身没有办法与 OpenClaw 通信——它是运行在 iOS/Android WebView 里的孤立页面。A2UIAgent-to-UI解决了这个方向问题提供一套跨平台的 JavaScript 桥接 API让 WebView 里的代码可以触发 OpenClaw Agent 的动作。A2UI 包src/canvas-host/a2ui/通过/__openclaw__/a2ui/伺服并在每个 Canvas 页面的 HTML 里自动注入一段引导脚本// 被注入到每个 Canvas HTML 页面的桥接脚本简化functionpostToNode(payload){constrawtypeofpayloadstring?payload:JSON.stringify(payload);// iOS 桥接constiosHandlerglobalThis.webkit?.messageHandlers?.openclawCanvasA2UIAction;if(iosHandler?.postMessage){iosHandler.postMessage(raw);returntrue;}// Android 桥接constandroidHandlerglobalThis.openclawCanvasA2UIAction;if(androidHandler?.postMessage){androidHandler.postMessage(raw);returntrue;}returnfalse;}// 给 Canvas 页面的公开 APIglobalThis.openclawSendUserAction(userAction){constiduserAction.id||crypto.randomUUID();returnpostToNode({userAction:{...userAction,id}});};Canvas 页面里的代码可以这样触发动作// 用户点击了执行备份按钮window.openclawSendUserAction({name:run_backup,surfaceId:main,sourceComponentId:backup.button,context:{target:nas-01,compress:true}});这条消息经由Canvas JS → native MessageHandleriOS/Android → OpenClaw Node Host 的 node.event → Gateway → 对应的 Agent 会话作为用户输入 → Agent 决定下一步行动动作结果回传Agent 处理完动作后可以通过window.dispatchEvent(new CustomEvent(openclaw:a2ui-action-status, { detail: { id, ok, error } }))通知 Canvas 页面操作已完成。这构成了一个完整的请求-响应循环。四、ACP标准化的 Agent 互操作协议问题外部工具如何调用 OpenClawagentclientprotocol/sdk是 Agent Client Protocol 的实现OpenClaw 通过它暴露一个标准接口让任何兼容 ACP 的工具都能与 OpenClaw 的 Agent 会话交互。// src/acp/server.tsexportasyncfunctionserveAcpGateway(opts:AcpServerOptions):Promisevoid{// 监听本地端口将 ACP 请求翻译成 Gateway 操作constagentnewAcpGatewayAgent(gateway);// 每个 ACP 会话映射到一个 OpenClaw 会话sessionKey}ACP 会话有两种模式exportconstACP_SPAWN_MODES[run,session]asconst;// run → 一次性任务完成后关闭会话// session → 持久会话完成后保留后续请求继续使用同一上下文这让 CI/CD 系统、IDE 插件、或其他 AI 工具可以把 OpenClaw 当作一个可编程的 AI 后端调用而不需要理解 OpenClaw 内部的协议细节。五、子 Agent并行任务分解问题串行处理大任务太慢一个复杂任务整理 1000 封邮件分析 50 个代码文件用单个 Agent 串行处理太慢。子 Agent 机制让 Agent 可以派生spawn独立的子 Agent 并行执行子任务。// Agent 使用 sessions.spawn 工具派生子 AgentexportasyncfunctionspawnSubagentDirect(params:SpawnSubagentParams,ctx:SpawnSubagentContext,):PromiseSpawnSubagentResultSpawnSubagentParams的核心字段typeSpawnSubagentParams{task:string;// 子任务描述注入为子 Agent 的第一条消息label?:string;// 可读标签用于状态显示agentId?:string;// 指定使用哪个 agent 配置model?:string;// 子 Agent 的模型可以与父 Agent 不同thinking?:string;// 子 Agent 的思考等级runTimeoutSeconds?:number;// 超时控制thread?:boolean;// 是否绑定到聊天线程结果直接发到聊天mode?:run|session;// 一次性 vs 持久会话cleanup?:delete|keep;// 完成后是否清理会话};子 Agent 的生命周期父 Agent 调用 sessions.spawn ↓ spawnSubagentDirect() → 创建新 SessionKey格式agentId:session-xxxxxxxx → 在 AGENT_LANE_SUBAGENT 通道里排队 → 注册到 SubagentRegistry追踪运行状态 ↓ 子 Agent 在独立 Lane 里执行与父 Agent 并行 ↓ 完成后subagent-announce 把结果发回给父 Agent → 作为父 Agent 会话里的一条用户消息 → 父 Agent 继续处理不要轮询注意事项子 Agent 完成后会主动宣告announce结果而不是等父 Agent 来查询。父 Agent 在派生子任务后应该继续其他工作而不是在循环里等待子任务完成。子任务的结果会自动以用户消息的形式重新注入父 Agent 的上下文。// 子 Agent 结果宣告文案src/agents/subagent-spawn.ts export const SUBAGENT_SPAWN_ACCEPTED_NOTE auto-announces on completion, do not poll/sleep. The response will be sent back as an user message.;深度限制为了防止无限递归子 Agent 再派生子 Agent 再派生……系统维护一个深度计数器subagent-depth.ts并且有默认上限// src/config/agent-limits.tsexportconstDEFAULT_SUBAGENT_MAX_SPAWN_DEPTH3;超过这个深度的派生请求会被拒绝返回forbidden状态。子 Agent 绑定线程thread: true参数让子 Agent 的结果直接投递到当前聊天线程而不是等父 Agent 转发父 Agent在 Telegram 对话里 → 派生子 Agentthread: true → 子 Agent 完成后结果直接发送到 Telegram 对话 → 用户在 Telegram 里直接看到子任务的输出这个功能依赖subagent_spawning生命周期钩子——只有实现了该钩子的通道插件能绑定线程的聊天平台才能使用。小结三个边界突破机制机制突破的边界核心数据流Node Host执行边界——让 AI 触达远程机器Gateway → WebSocket → Node →spawn→ 结果返回Canvas A2UIUI 边界——让 AI 的输出变成交互式 UIAI 写文件 → chokidar → WebSocket → WebView 重载用户点击 → native bridge → node.event → Agent子 Agent并发边界——让 AI 并行分解任务父 Agent spawn → 子 Agent 独立执行 → 完成后 announce 回注入父会话三者共同扩展了个人 AI 助手的能力边界不只是对话而是可编程的执行引擎 交互式 UI 宿主 多 Agent 协作系统。下一篇也是系列的最后一篇我们将进入 OpenClaw 的安全模型与沙盒——系统性梳理 Gateway 认证、工具策略、沙盒隔离、API Key 保护、以及整个系统的信任边界设计。

相关新闻

JavaScript性能优化实战剖蚊

JavaScript性能优化实战剖蚊

JavaScript性能优化实战技术文章大纲 性能优化的核心原则 减少代码执行时间 降低内存占用 优化网络请求 提升用户体验 代码层面的优化 避免全局变量污染,使用模块化或闭包 减少DOM操作,批量更新或使用文档片段 使用事件委托减少事件监听器数量 优化循环结…

2026/7/3 1:37:55 阅读更多 →
智能知识网络构建工具:如何让非结构化文本转化为可视化知识图谱?

智能知识网络构建工具:如何让非结构化文本转化为可视化知识图谱?

智能知识网络构建工具:如何让非结构化文本转化为可视化知识图谱? 【免费下载链接】ai-knowledge-graph AI Powered Knowledge Graph Generator 项目地址: https://gitcode.com/gh_mirrors/aik/ai-knowledge-graph 在信息爆炸的时代,如…

2026/5/17 4:16:17 阅读更多 →
RDP Wrapper技术指南:突破Windows远程桌面限制的完整解决方案

RDP Wrapper技术指南:突破Windows远程桌面限制的完整解决方案

RDP Wrapper技术指南:突破Windows远程桌面限制的完整解决方案 【免费下载链接】rdpwrap RDP Wrapper Library 项目地址: https://gitcode.com/gh_mirrors/rd/rdpwrap 一、痛点分析:Windows远程桌面的固有局限 在现代办公环境中,远程桌…

2026/7/2 23:04:04 阅读更多 →

最新新闻

电力负荷预测:SVM与PSO优化算法实战解析

电力负荷预测:SVM与PSO优化算法实战解析

1. 电力短期负荷预测的技术挑战与算法选型 电力系统调度面临的核心难题之一是如何准确预测未来24小时至一周内的负荷变化。传统的时间序列分析方法(如ARIMA)和回归模型在处理非线性、非平稳的负荷数据时表现乏力,特别是在面对极端天气事件、节…

2026/7/4 11:44:41 阅读更多 →
基于YOLOv8的混凝土缺陷智能检测系统开发

基于YOLOv8的混凝土缺陷智能检测系统开发

1. 项目概述:混凝土缺陷智能检测系统 在土木工程领域,混凝土结构的安全评估一直是个耗时费力的工作。传统的人工检测方法不仅效率低下,而且受限于检测人员的专业水平和工作状态。我们开发的这套基于YOLOv8的混凝土缺陷检测系统,能…

2026/7/4 11:44:41 阅读更多 →
研究生科研效率提升:AI工具筛选与实战指南

研究生科研效率提升:AI工具筛选与实战指南

1. 研究生科研效率提升的关键痛点读研期间最宝贵的资源就是时间。我见过太多同学把大量精力耗费在低效的文献阅读、数据整理和论文写作上,最终导致研究进度滞后。根据Nature最新调查,全球62%的研究生存在"时间贫困"现象,其中AI工具…

2026/7/4 11:44:41 阅读更多 →
Web界面配置NAT:从原理到实战的完整指南

Web界面配置NAT:从原理到实战的完整指南

1. 项目概述:为什么我们需要Web界面来配置NAT? 如果你管理过网络,无论是家庭的小型路由器,还是企业级的防火墙,大概率都接触过NAT(网络地址转换)。这个技术可以说是现代互联网的“隐形守护者”&…

2026/7/4 11:42:41 阅读更多 →
PIC18F85J50与UG95 LTE模块的嵌入式通信方案解析

PIC18F85J50与UG95 LTE模块的嵌入式通信方案解析

1. 项目背景与核心价值在嵌入式系统开发领域,地理位置的限制常常成为项目实施的瓶颈。传统方案要么依赖昂贵的卫星通信模块,要么受制于特定运营商的网络覆盖。而UG95(Quectel UG95) LTE Cat 1模块与PIC18F85J50微控制器的组合&…

2026/7/4 11:40:40 阅读更多 →
2026年渗透测试工程师面试指南:15道核心题目深度解析与实战技巧

2026年渗透测试工程师面试指南:15道核心题目深度解析与实战技巧

1. 项目概述:一份来自实战的面试通关指南 又到了招聘季,看着身边不少朋友和团队里的新人开始为面试奔波,我总想起自己当年在会议室里被连环追问的场景。对于“渗透测试工程师”这个岗位来说,面试从来不只是考察你会不会用几个工具…

2026/7/4 11:38:40 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻