Skip to content

[feature] askUserChoice 前端接入(ADR-0018)—— 接通 permission ask 路径 #2

Description

@mirror29

想解决的问题

当前 `packages/orchestration/src/hooks/with-hooks.ts:154-162` 的 ask 路径没有前端实现——permission engine 返 `ask` 时只是返 `isError + "requires approval (ask path not yet wired; see ADR-0011)"`,agent 撞墙后只能让用户手动 curl/admin。

这导致 D-9 `paper.promote_candidate` 不得不用 workaround 走 `allow` + prompt 自检 + 后端硬校验代替 `ask` 拦截(见本次 promote 修复的 `permissions/defaults.ts` 注释 + `tools/strategy.ts` 文件头)。

长期影响:

  • 任何"金融硬约束 — 人保留最终决定权"的 tool 都没有正式审批通道(promote、未来的实盘开关、risk config 修改等)
  • `permissions/defaults.ts` 里 `ask` 列表(`live.submit_order(notional<1000)` / `risk.update_config`)实际等同于 deny + 提示,规则被悄悄改变

提议的方向

实现 ADR-0018 askUserChoice:

  1. 后端:with-hooks 收到 `ask` 时挂起 tool 调用,发 SSE / WebSocket 事件到前端(包含 tool name + input + 调用理由)
  2. 前端:CopilotKit / Mastra Studio 收到事件后弹气泡,用户点"允许 / 拒绝"
  3. 回执:前端 POST `/api/permissions/{request_id}/respond`,后端拿到 decision 后恢复 tool 调用或抛 deny
  4. 超时:30s 无响应默认 deny + audit log

回归路径:接通后把 `paper.promote_candidate` 从 `allow` 改回 `ask`(见 `permissions/defaults.ts` 现有注释 TODO)。

这个建议属于哪个 Phase?

  • D-8b(持久化 trade_plans / approval_tokens)—— 同期接入合理
  • D-9
  • D-10 及之后
  • 不确定 / 需要讨论

是否破坏现有约束?

  • 只涉及 crypto 市场,不引入 A 股 / 美股逻辑
  • 不让 LLM 获得直接下单路径 —— 反而增强人保留最终决定权
  • 不动 `services/_shared/`
  • 不引入与 AGPL-3.0 不兼容的依赖

其他

验收标准

  1. 把 `paper.promote_candidate` 临时回退到 `ask` 后,agent 调用时前端弹气泡
  2. 用户允许 → tool 真执行;用户拒绝 → agent 收到清晰错误信息
  3. 超时 / 用户关页面 → 默认 deny

关联

  • ADR-0011(permission engine)
  • ADR-0018(askUserChoice 设计)
  • 本次 promote 修复用 workaround 绕开了 ask 拦截
  • `packages/orchestration/src/permissions/defaults.ts` 里 `paper.promote_candidate` 的注释 TODO

优先级判断:HIGH —— 长期阻塞所有"高危操作走 ask 审批门"的设计,当前 D-9 是临时绕开。

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions