跳到正文
FunCoding

搜索

搜索文档、Skill 和 MCP

多客户端审批策略

配置 first-responder、designated、consensus 或 local-only,并理解默认等待。

MultiClientPermissionMediator 为同一 bridge 的审批请求收集投票。多个客户端可以看到同一请求,但如何接受选择由请求创建时捕获的策略决定。

四种策略

策略普通选择的规则
first-responder首个有效投票决定,默认策略
designated只有当前 prompt 的 originatorClientId 可决定
consensus请求发出时的 client ID 快照中,足够票数选择同一选项
local-only只接受从 loopback 到达的普通选择

settings.json 使用 policy.permissionStrategy 和可选 policy.consensusQuorum:

{
  "policy": {
    "permissionStrategy": "consensus",
    "consensusQuorum": 2
  }
}

capabilities 中 permission_mediation.modes 表示构建支持的策略集合;policy.permission 表示当前正在运行的策略。不能将支持列表当作本次请求的实际策略。

Consensus 的人数与时点

未显式指定 quorum 时,N=max(1,floor(M/2)+1),M 来自请求发出时已登记 client IDs 的快照。两名客户端需要两票一致;三名需要两票,四名需要三票。

新客户端在请求发出后加入,若其 ID 不在快照中,普通投票会以 designated_mismatch 拒绝。先连接与登记参与者,再发起需要共同审查的 prompt。

两人各选不同选项时没有选项达到 quorum。需要投票取消、session cancel 或显式配置的交互超时来结束;默认 permissionResponseTimeoutMs=0,不会自动到期。将 quorum 设为 1 会改变为一票可决定,应明确按需要选择。

请求状态与计时

request 创建时固定 policy、允许选项、originator 和 consensus voter snapshot。后续修改全局策略不会重解释已经发出的请求。

启用正超时后,计时器必须在 request 内同步建立,不把设置延后到可能被会话清理打断的步骤。forgetSession 会清除计时器并把待审批结算为 cancelled/session_closed。

已解决请求保留最近 512 条 FIFO 记录,用于给迟到或重复投票返回 already_resolved;记录被淘汰后返回 unknown_request。这个窗口不是永久审计库。

UI 事件

consensus 的中间票产生 permission_partial_vote;designated、consensus 和 local-only 的拒绝可产生 permission_forbidden。不要在 first-responder 下等待部分票事件。

designated 与 consensus 共同使用 designated_mismatch;local-only 使用 remote_not_allowed。界面应按实际返回展示,不由同名 reason 推断唯一策略。

身份与取消的限制

v1 X-Qwen-Client-Id 是格式受限的自报标识,没有 proof-of-possession。designated 或 consensus 不能单独证明不同 ID 对应不同真实操作者,更不能单独提供租户隔离。

显式 cancelled 走跨策略取消路径:即使 local-only 或 consensus 也不能用该策略禁止取消。它仍需经过路由、session 和 client 检查;不是任意未认证网络请求都可取消。

强身份要求必须由实际部署认证边界承担,具体传输检查见审批路由。