场景
OpenClaw 在 tools.exec.mode: allowlist + ask: on-miss 配置下,当命令不匹配 allowlist 时,会通过 WebSocket 广播 exec.approval.request 事件,等待客户端决定批准或拒绝。ClawPanel 目前已有 /communication 页面的审批转发配置,以及 exec.approval.list/get 的 RPC 方法,但缺少实时审批弹窗 UI——收到审批请求时没有任何提示,导致命令卡死。
建议实现
在 ws-client.js 的事件分发中,订阅 exec.approval.request 事件:
复制
// 在 _handleMessage 的 event 转发分支添加
if (msg.event === 'exec.approval.request') {
this._emit('exec.approval', msg.payload)
}
实现一个审批弹窗组件(Modal),包含:
待执行的命令文本(带高亮)
命令来源信息(agent、session)
三个按钮:允许一次(Allow Once)、始终允许(Allow Always)、拒绝(Deny)
审批结果通过 RPC exec.approval.respond 或 /approve 指令返回给 Gateway。
参考实现
OpenClaw Control UI 的审批弹窗行为
ws-client.js 中已有的 execApprovalList() / execApprovalGet() 方法
技术背景
OpenClaw approvals 文档见:https://docs.openclaw.ai/tools/exec-approvals
WebSocket 审批事件包格式(未公开文档化,建议参考 Control UI 源码或直接测试抓包)。
场景
OpenClaw 在 tools.exec.mode: allowlist + ask: on-miss 配置下,当命令不匹配 allowlist 时,会通过 WebSocket 广播 exec.approval.request 事件,等待客户端决定批准或拒绝。ClawPanel 目前已有 /communication 页面的审批转发配置,以及 exec.approval.list/get 的 RPC 方法,但缺少实时审批弹窗 UI——收到审批请求时没有任何提示,导致命令卡死。
建议实现
在 ws-client.js 的事件分发中,订阅 exec.approval.request 事件:
复制
// 在 _handleMessage 的 event 转发分支添加
if (msg.event === 'exec.approval.request') {
this._emit('exec.approval', msg.payload)
}
实现一个审批弹窗组件(Modal),包含:
待执行的命令文本(带高亮)
命令来源信息(agent、session)
三个按钮:允许一次(Allow Once)、始终允许(Allow Always)、拒绝(Deny)
审批结果通过 RPC exec.approval.respond 或 /approve 指令返回给 Gateway。
参考实现
OpenClaw Control UI 的审批弹窗行为
ws-client.js 中已有的 execApprovalList() / execApprovalGet() 方法
技术背景
OpenClaw approvals 文档见:https://docs.openclaw.ai/tools/exec-approvals
WebSocket 审批事件包格式(未公开文档化,建议参考 Control UI 源码或直接测试抓包)。