Skip to content

fix(claude-code): preflight subagent model access - #3043

Merged
MagicLizi merged 1 commit into
makecindy:mainfrom
ZJPex:fix/issue-2915-claude-subagent-model-preflight
Aug 19, 2026
Merged

fix(claude-code): preflight subagent model access#3043
MagicLizi merged 1 commit into
makecindy:mainfrom
ZJPex:fix/issue-2915-claude-subagent-model-preflight

Conversation

@ZJPex

@ZJPex ZJPex commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

Claude Code 的原生 Agent / Task 工具允许显式传入 sonnetopus 等模型,但 Cindy 过去只做目录诊断,没有在任务启动前结合当前账号的权威模型快照校验。即使 Full access 开启,工具调用也会直接进入 SDK,最终在后台请求阶段才返回 403。

本 PR 在 Claude Code PreToolUse 边界增加按调用实时解析的三态预检:

  • 当前会话适用的 XD Gateway 权威 /models 快照明确排除目标模型时,立即拒绝该 Agent/Task 调用,并建议省略 model 使用 Agent 原生默认选择。
  • 权威快照包含模型时允许;别名、完整模型 ID 与 [1m] wire 后缀统一归一化匹配。
  • 静态目录、last-known-good、刷新失败、非权威来源或无法确认的路由一律视为 unknown 并放行,避免误拦合法模型。
  • 本地 Claude 会话和 cc-manager 远程会话都走同一校验语义;cc-manager 通过新的反向 RPC 在每次工具调用时向 Desktop 查询当前状态。
  • 不静默改写用户模型,不从 schema 全局移除 sonnet / opus,也不改变省略 model 时的既有默认选择逻辑。

变更类型

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

范围

UI 变化

不涉及:仅修改 Claude Code 工具调用预检、模型目录状态和内部 manager 协议,无视觉、交互或 UI 文案路径变化。

  • 引用的设计规范:不涉及

怎么验证的

自动验证

聚焦 Vitest:7 个文件,129/129 通过
- maker-core:45/45
- maker-cc-manager:58/58
- desktop:26/26

pnpm --dir apps/desktop exec tsc --noEmit
结果:通过

pnpm --dir packages/maker-cc-manager build
结果:通过

pnpm check:dco
结果:通过;1 个提交均带 Signed-off-by

pnpm test:unit:related
结果:maker-core、maker-cc-manager、lizi-mcps、orca-workflow 均通过;
desktop 除既有 grokOauthCallbackListener 固定端口测试外通过 27,041 项。
该测试的 10 个用例均因本机 127.0.0.1:56121 已被占用而报 EADDRINUSE,与本次改动无关。

手工验证

不涉及真实付费模型请求;使用生产调用边界的确定性回归测试复现并验证:

  • Full access 下显式 model: sonnet 且权威快照明确无权限:修复前仍放行,修复后在 PreToolUse 拒绝。
  • allowed / denied / unknown 三态、别名 / 完整 ID / [1m]、省略 model、强制默认模型、账号切换和刷新失败均有覆盖。
  • 本地 Claude 与 cc-manager 远程路径均覆盖;远程查询失败按 unknown 放行。

未执行的验证

  • 未发起真实无权限账号的付费 403 请求:修复依赖的账号权限事实来自现有 XD Gateway /models 权威响应,行为由生产边界回归测试覆盖。
  • maker-core 全量 tsc --noEmit 仍受仓库现有无关类型错误影响;本次变更文件未产生新增类型错误。
  • desktop 全量单测中的固定端口用例未能通过,原因见自动验证;其余受影响测试与类型检查已通过。

风险

风险分类

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

影响与回滚

  • 影响范围:Claude Code 本地与 cc-manager 会话中,显式覆盖子 Agent 模型的 Agent/Task 调用;XD Gateway 当前账号模型目录同步
  • 协议兼容:cc-manager protocol 提升到 v4,Desktop 与 manager 同仓同步更新;版本不匹配继续由现有握手检查拒绝
  • 权限语义:仅当前会话适用且权威、最新的账号快照可以产生拒绝;任何不确定状态都放行,避免把目录缺失误判为无权限
  • 回滚 / 降级方式:回退本提交即可恢复原有延迟到上游请求阶段判断权限的行为;目录刷新失败时当前实现会自动降级为 unknown 放行

提交前检查

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

Signed-off-by: ZJPex <3258236335@qq.com>
@ZJPex
ZJPex requested a review from a team as a code owner August 19, 2026 13:45
Copilot AI lite review requested due to automatic review settings August 19, 2026 13:45

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@greptile-apps

greptile-apps Bot commented Aug 19, 2026

Copy link
Copy Markdown

Greptile Summary

本 PR 在 Claude Code 本地与 cc-manager 远程会话的 PreToolUse 边界加入显式子代理模型准入预检,并以 XD Gateway 当前账号的权威 /models 快照作为唯一负向判定依据。

  • 新增 allowed、denied、unknown 三态模型准入策略及别名、完整 ID、[1m] 后缀归一化。
  • 为远程会话新增 subagent/model-access 反向 RPC,并将 cc-manager 协议升级至 v4。
  • 在模型同步开始、失败和认证身份变化时撤销权威状态,避免以旧目录产生错误拒绝。
  • 增加本地、远程、协议和账号快照切换相关回归测试。

Confidence Score: 5/5

该 PR 看起来可以安全合并,未发现由本次改动引入且具有可达失败场景的缺陷。

权威快照仅在当前认证世代成功同步后用于拒绝,刷新及身份变化会及时降级为 unknown;本地与远程执行路径都在 Agent/Task 进入 SDK 前复用同一实时判定语义。

Important Files Changed

Filename Overview
apps/desktop/src/main/maker-host/subagent-model-access-policy.ts 实现基于实际 provider、凭证模式和权威 XD 快照的三态判定,非权威或非 XD 目录缺席均不会产生硬拒绝。
apps/desktop/src/main/model-access/index.ts 模型同步生命周期会在刷新开始和认证失效时撤销负向证明,仅同认证世代的成功响应恢复 authoritative 状态。
packages/maker-core/src/agents/claude-code/subagent-model-access.ts 新增本地 Agent/Task PreToolUse guard,统一处理强制模型、显式模型、inherit、异常降级和拒绝文案。
packages/maker-core/src/agents/claude-code/index.ts 将实时 resolver 接入本地 hook 与远程回调,并携带会话 provider、父模型和有效凭证模式。
packages/maker-cc-manager/src/session-registry.ts 远程 daemon 在 Agent/Task 执行前反向查询 Desktop,明确 denied 时阻止调用,查询异常按 unknown 放行。
packages/maker-cc-manager/src/protocol.ts 新增模型准入反向 RPC 类型与方法,并通过协议 v4 阻止不具备该执行边界的旧 daemon 继续连接。

Sequence Diagram

sequenceDiagram
  participant CC as Claude Code SDK
  participant Guard as PreToolUse Guard
  participant Manager as cc-manager
  participant Desktop as Desktop Resolver
  participant Snapshot as XD /models Snapshot
  CC->>Guard: Agent/Task(model)
  alt 本地会话
    Guard->>Desktop: resolve(model, provider, credential)
  else 远程会话
    Guard->>Manager: resolve(model)
    Manager->>Desktop: subagent/model-access
  end
  Desktop->>Snapshot: 读取当前 authoritative 状态与模型
  alt 权威快照明确缺少模型
    Desktop-->>Guard: denied
    Guard-->>CC: "permissionDecision=deny"
  else 包含模型
    Desktop-->>Guard: allowed
    Guard-->>CC: continue
  else 非权威、失败或无法确认
    Desktop-->>Guard: unknown
    Guard-->>CC: continue
  end
Loading

Reviews (1): Last reviewed commit: "fix(claude-code): preflight subagent mod..." | Re-trigger Greptile

@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: 73d963268a

ℹ️ 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 apps/desktop/src/main/maker-host/subagent-model-access-policy.ts
@MagicLizi

Copy link
Copy Markdown
Contributor

⏸️ 维护者确认门(arch)已触发。

原因:核心路径改动 728 行,新增子任务模型访问预检子系统(policy 模块 + cc-manager 反向 RPC + 三态校验),跨 maker-core / cc-manager / maker-host 三个包。

讨论 issue 已创建,等维护者在本 PR 上 Approve 后自动放行。

讨论 issue:#3044

@MagicLizi MagicLizi added the touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) label Aug 19, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

@ZJPex 👋 这个 PR 还有 1 条 review conversation 没 resolve(apps/desktop/src/main/maker-host/subagent-model-access-policy.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

@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.

Code review passed. Well-designed preflight check with tri-state model access gate, correct fail-open defaults, and good test coverage. Approving to release signoff gate (confirmed bugfix — adds missing model access validation).

@MagicLizi MagicLizi removed the awaiting-discussion 等待维护者讨论(review-pr) label Aug 19, 2026
@MagicLizi
MagicLizi merged commit f37e0d2 into makecindy:main Aug 19, 2026
11 checks passed
@MagicLizi

Copy link
Copy Markdown
Contributor

Nice work on this one — the tri-state classification design (allowed/denied/unknown) with fail-open defaults is exactly the right call for a preflight gate that touches live sessions. 🎯

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.

3 participants