审批与“Confirm on Mac”
审批卡片可以描述真实请求,但不一定持有能够回答它的通道。只有路由真实且仍在有效期内时,Moshline 才展示远程动作。
更新时间: 2026-07-23适用范围: Host Helper 的 bridge_relay 与 host_local 审批范围
完成后
你可以判断手机动作是否真的会解除 Agent 阻塞,理解哪些请求保持 host-local,以及超时和风险策略如何改变可用动作。
可见与可控制是两个事实
Hook 可以上报观察到的权限请求。远程审批还要求 Provider Hook 保持阻塞、Moshline 保留精确请求身份,并且 Provider 定义了可写回 stdout 的 allow/deny 协议。
Moshline 用 approval_scope 记录这一区别。bridge_relay 表示存在同步路径;host_local 表示信息真实可读,但必须在 Provider 所在主机回答。
当前审批路由
| 路径 | 手机动作 | 如何抵达 Agent | 降级 |
|---|---|---|---|
| Claude Code PermissionRequest + 当前 Hook | Relay 有效期内 Approve / Deny | Hook stdout 返回 Claude allow / deny JSON | Claude 本机权限界面 |
| 没有同步通道的 Claude 事件 | Confirm on Mac / Open Terminal | 不发送远程决定 | Claude 本机界面 |
| Codex 原生 Hook | Confirm on Mac / Open Terminal | 只观察事件 | Codex 本机界面 |
| 其他观察型 Provider Hook | Confirm on Mac / Open Terminal | 只观察事件 | Provider 本机界面 |
| Bridge 托管兼容 Runner | Runner 活跃时 Approve / Deny | Runner 专用协议响应 | Runner 或终端提示 |
| Apple Watch | 低风险动作经 iPhone 转发 | 复用可信移动路由 | 打开 iPhone 或终端 |
Claude Relay 如何抵达被阻塞的 Hook
- 01Claude 调用 Moshline PermissionRequest Hook 并等待。
- 02Hook 把请求连同 awaiting_decision 与截止时间发给本机 Host daemon。
- 03Daemon 返回已保存的 event ID;Hook 对带鉴权的决策端点进行长轮询。
- 04iPhone 或 Watch 提交绑定到精确 request 与 agent run 的决定。
- 05Daemon 记录 permission.decided 并唤醒对应 Hook waiter。
- 06Hook 把 Claude 所需的 allow 或 deny JSON 写入 stdout,Provider 解除阻塞。
超时或网络失败会发生什么
- 过期 Relay 不再接受迟到的移动决定。
- Bridge 不可达或没有有效决定时,Hook stdout 保持为空。
- 空 stdout 会把控制权交回 Provider 正常的本机权限提示。
- Inbox 保留事件上下文,但在路由过期后移除远程动作。
- Open Terminal 仍可用于完整上下文和手动确认。
风险策略仍然生效
技术上可达并不表示适合所有表面。Apple Watch 只展示 iPhone 判断为可在有限上下文下安全操作的决定;高风险或未知请求应在 App 或终端查看命令、cwd、风险、策略与 reason 后再处理。
“Confirm on Mac”到底表示什么
它通常表示 Moshline 收到了真实请求,但没有该 Provider 的有效同步回复通道,或者原本有效的 Relay 已过期。它不一定是配对或通知故障。
- 打开对应终端会话,在 Provider 提示中回答。
- Claude Code 若长期没有远程动作,重跑 Host Helper setup 以刷新 PermissionRequest Hook。
- Codex 中信任当前 Hook 定义以保持事件可见;原生远程审批仍是 host-local。
- 不要在 Relay 截止时间后反复操作旧通知。
相关文档