Skip to content

fix: 防止子 Agent 直接弹出用户问答卡 - #3316

Merged
MagicLizi merged 5 commits into
mainfrom
dash/subagent-tool-visibility
Aug 24, 2026
Merged

fix: 防止子 Agent 直接弹出用户问答卡#3316
MagicLizi merged 5 commits into
mainfrom
dash/subagent-tool-visibility

Conversation

@dashhuang

Copy link
Copy Markdown
Member

这次改了什么

摘要

收口子 Agent 的用户问答能力,避免 native subagent 或 Codex descendant 直接创建用户问答卡,同时保留主 Agent 的正常提问能力和子 Agent 的权限审批能力。

变更类型

  • fix 缺陷修复
  • feat 新功能
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护
  • 其他:

范围

  • 关联 Issue / 需求:无
  • 本 PR 包含:
    • Codex dynamic ask_user_question 和原生 requestUserInput 的 descendant 拒绝。
    • Claude 本地 PreToolUse 与远程 cc-manager 的 root-only 守卫。
    • Codex、Claude、cc-manager 相关单测。
  • 明确不包含:
    • Codex per-thread MCP 工具隔离。
    • 其他尚未裁决的 root-only 能力分层。
    • Pi 改动;Pi 已通过显式工具白名单隔离。
  • 用户可见变化:子 Agent 不再直接弹出用户问答卡;主 Agent 仍可提问,权限审批不受影响。
  • 是否存在 breaking change:无

UI 变化

  • 不涉及:本 PR 只修改 Agent/cc-manager 调用权限与测试,没有 UI 代码或视觉变化。
  • 引用的设计规范:不涉及。

怎么验证的

自动验证

pnpm --filter @cindy/maker-core exec vitest run src/agents/codex/index.test.ts src/agents/claude-code/__tests__/capability-routing.test.ts src/agents/claude-code/__tests__/mcp-approval-policy.test.ts
结果:3 个测试文件、574 个测试全部通过。

pnpm --filter @cindy/maker-cc-manager exec vitest run __tests__/sdk-handlers.test.ts __tests__/session-registry.test.ts
结果:2 个测试文件、40 个测试全部通过。

pnpm --filter @cindy/maker-cc-manager build
结果:通过。

pnpm check:dco
结果:通过,1 个提交带 DCO 签名。

bash /Users/dash/Code/XD/dash/Skills/git/scripts/run-unit-gate.sh /Users/dash/Code/Cindy/cindy-subagent-tool-visibility
结果:相关 packages 通过;apps/desktop 因隔离 worktree 的 Electron 未正确安装导致大量收集失败,另有 2 个未改动的 ghost receipt 基线断言失败。完整日志已由门禁脚本写入临时日志。

手工验证

不涉及。

未执行的验证

未进行 Desktop 实机手工验证;本 PR 不包含 UI 改动。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:

影响与回滚

  • 影响范围:仅 Agent 子调用用户问答的权限边界;Codex descendant 与 Claude native subagent 被拒绝,root 调用和权限审批保持原行为。
  • 回滚 / 降级方式:回滚本 PR 提交即可恢复旧行为;不涉及数据迁移。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s,见 DCO
  • UI 改动已在「UI 变化」注明引用的设计规范章节(不涉及 UI 则跳过)
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档
  • 已确认测试结果或说明未执行原因

Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
@dashhuang
dashhuang requested a review from a team as a code owner August 24, 2026 01:23

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c0b81e2d8f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/maker-core/src/agents/claude-code/index.ts
@greptile-apps

greptile-apps Bot commented Aug 24, 2026

Copy link
Copy Markdown

Greptile Summary

本 PR 收紧 Codex 与 Claude 子 Agent 的用户问答能力,同时保留 root Agent 提问和子 Agent 权限审批路径。

  • Codex 根据线程归属拒绝 descendant 的动态及原生用户问答请求。
  • Claude 本地 hook 与远程 cc-manager 增加 AskUserQuestion root-only 守卫。
  • cc-manager 协议及 bundle 版本升级,并补充相关回归测试。

Confidence Score: 4/5

当前 PR 不宜直接合并,因为 Codex descendant 的合法权限请求仍可能在 item provenance 稍晚到达时被立即拒绝。

回复称此前的 provenance 等待修复已解决乱序审批,但当前代码删除等待并在上下文缺失时立即返回空答案;合法权限请求先于对应 item 通知进入 handler 即构成残留反例。

Files Needing Attention: packages/maker-core/src/agents/codex/index.ts

Important Files Changed

Filename Overview
packages/maker-core/src/agents/codex/index.ts 增加 descendant 用户问答拒绝逻辑,但同步 provenance 查询仍会把先于 item 通知到达的合法权限请求误拒。
packages/maker-core/src/agents/claude-code/capability-routing.ts 为本地和远程 Claude 会话增加一致的 AskUserQuestion root-only 守卫。
packages/maker-core/src/agents/claude-code/index.ts 将新的本地 provenance hook 和远程 root-only guard 接入 Claude 会话启动流程。
packages/maker-cc-manager/src/sdk-handlers.ts 扩展远程 guard 校验以接受原生 AskUserQuestion 的精确工具名。
packages/maker-cc-manager/src/protocol.ts 将协议升级至 v5、bundle 升级至 0.0.10,以强制远端 daemon 支持新增守卫。

Sequence Diagram

sequenceDiagram
    participant Child as 子 Agent
    participant Runtime as Agent Runtime
    participant Context as Tool Context
    participant UI as 用户交互
    Child->>Runtime: requestUserInput
    Runtime->>Context: 查询 item provenance
    alt 已识别为权限请求
        Runtime->>UI: 打开权限审批
        UI-->>Runtime: 审批结果
        Runtime-->>Child: 返回权限答案
    else 已识别为用户问答
        Runtime-->>Child: 拒绝并要求上报父 Agent
    else provenance 尚未到达
        Runtime-->>Child: 当前实现立即返回空答案
    end
Loading

Reviews (5): Last reviewed commit: "fix: simplify descendant input classific..." | Re-trigger Greptile

Comment thread packages/maker-core/src/agents/codex/index.ts
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5aa147ac3d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/maker-core/src/agents/codex/index.ts Outdated
Comment thread packages/maker-core/src/agents/codex/index.ts Outdated
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2ca1250a8b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/maker-core/src/agents/codex/index.ts Outdated
Comment thread packages/maker-core/src/agents/codex/index.ts Outdated
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Comment thread packages/maker-core/src/agents/codex/index.ts Outdated
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
@dashhuang

Copy link
Copy Markdown
Member Author

收敛检查点:Codex descendant 用户输入

本轮把连续反馈归为同一个失败族:把 Codex app-server 的确定协议顺序假设成可乱序竞态,继而在客户端增加 provenance 等待、取消和超时机制。

一句话不变量:descendant 的用户问答永远不能创建问答卡;descendant 的权限审批仅在同一 itemId 已被 app-server 声明为 MCP 或非问答 dynamic tool 时进入权限 UI;root 行为保持不变。

唯一状态 owneractiveToolContexts 是输入分类的唯一 provenance owner。item/started / item/updated 写入,item 完成或 turn/session 清理删除;requestUserInput 只读取,不再创建 waiter、timer、completed-context cache 或第二套取消状态。

调用方与上下文 预期行为
root + 任意上下文 保持既有提问或权限流程
descendant + mcpToolCall 进入权限审批
descendant + 非问答 dynamicToolCall 进入权限审批
descendant + cindy__ask_user_question 拒绝,不创建问答卡,并要求上报父 Agent
descendant + 未知或已清理上下文 fail-closed,返回空答案,不创建问答卡

协议依据:仓库固定运行时为 tools/codex/latest.json 中的 Codex 0.145.0。该版本在 MCP 调用路径中先 await notify_mcp_tool_call_started(...),再执行 maybe_request_mcp_tool_approval(...);fallback 权限审批随后才调用 request_user_input。因此受支持的权限路径不存在“权限请求先于 item provenance 到达”的状态。Codex 自身的原生 request_user_input handler 也明确拒绝非 root Agent。

对称路径与测试:现有回归覆盖 root 提问、descendant 原生未知请求拒绝、descendant MCP 权限放行、descendant dynamic 问答拒绝,以及 Claude 本地/远程 AskUserQuestion root-only guard。上一轮为虚构乱序补出的 500ms/10s 等待、取消和超时状态已经整体删除,没有继续追加机制。

结论:Greptile 总结中的“provenance 稍晚到达”反例不适用于本仓固定的 Codex 0.145.0 调用链;当前实现按上述不变量保留。

@MagicLizi MagicLizi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

按维护者指示批准;合并仍需通过 review-pr 的代码审查与其余安全门。

@MagicLizi MagicLizi added the touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) label Aug 24, 2026
@MagicLizi
MagicLizi merged commit 17c9604 into main Aug 24, 2026
19 checks passed
@MagicLizi
MagicLizi deleted the dash/subagent-tool-visibility branch August 24, 2026 10:41
@MagicLizi

Copy link
Copy Markdown
Contributor

合了。子 Agent 再不会直接弹问答卡到用户脸上,该问的还是回到父任务里处理。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants