makecindy / makecindy/cindy

🐛 Bug: 自动审批(Auto)模式对话过程中被静默降级为默认权限(ask)

Open
#1,077 0 comments 0 reactions 0 assignees View on GitHub
bug
Dominant language
TypeScript
Stars
2.7k
Forks
401
Avg merge
21h 48m
Merged PRs (30d)
776

Description

## 问题描述

在新建对话时选择了"自动审批"(Auto permission mode),期望整个对话过程中都保持自动执行,不需要手动确认每个工具调用。但在实际使用中,对话进行一段时间后,权限模式会**自动变回默认权限(需要手动审批)**,导致 AI 不断弹出权限请求框,完全打断自动化流程。

## 复现步骤

1. 打开 Cindy Desktop(版本 0.1.22)
2. 新建对话,在权限模式选择器中选择 "Auto"(自动审批)
3. 输入一个需要执行多个工具调用的复杂任务(例如写代码、修改文件、运行命令等)
4. 观察对话执行过程中,某个时刻开始工具调用会突然弹出权限确认框
5. 检查权限模式选择器,会发现已经变成了 "Default permissions"(默认权限)

## 预期行为

选择 "Auto" 模式后,应该在整个对话生命周期中保持自动审批,除非用户手动切换。即使自动审查服务暂时不可用,也不应该静默降级,至少应该:
1. 明确通知用户权限模式被降级
2. 提供一键恢复 Auto 模式的选项
3. 错误/超时应该重试,而不是直接降级

## 实际行为

当 Codex auto permission classifier(自动权限审查服务)返回 **超时(timedOut)** 或 **500错误** 时,主进程代码会**静默且强制**将权限模式从 `auto` 修改为 `ask`(默认权限),没有任何用户提示。

## 根因分析

**定位到问题代码在主进程 Codex agent 集成中(`apps/desktop` 构建产物 `.vite/build/index-BsRk6Lnc.js`)**:

```js
// 强制降级函数
ii=()=>{
if(We!=="auto")return!1;
Rr("permission_mode_changed_to_ask","deny"); // 埋点记录
We="ask"; // ← BUG: 直接修改当前权限模式为 ask(默认)
const T=hn("ask"); // 更新权限策略
return!Y&&(dr||T)&&(C!==null?Xt(C):($||T)&&(_t=!0)),!0
}

// auto review 结果回调
si=T=>{
if(!ii()||typeof r.sessionId!="string")return; // ← 超时/500时调用 ii() 触发降级
const U=this.deps.onAutoPermissionClassifierUnavailable;
if(!U)return;
const Q=T.review.status==="timedOut"?408:500;
queueMicrotask(()=>{
try{U({sessionId:r.sessionId,agentKind:"codex",status:Q})}catch(le){
n.warn("Codex Auto fallback notification threw",{reviewId:T.reviewId,error:String(le)})
}
})
}
```

当 `review.status === "timedOut"`(超时)或其他错误状态(5xx)时,`si()` 调用 `ii()`,直接把运行中 agent 的 `We`(当前 permissionMode)改成 `"ask"`,导致后续所有工具调用都需要手动审批。

## 问题影响

- 完全破坏了用户选择 Auto 模式的期望(无人值守自动化任务执行)
- 降级是静默发生的,用户不知道为什么突然开始弹权限框,误以为是自己设置错了
- 无法自动恢复,用户必须手动重新选择 Auto 模式,但下一次超时又会被降级,形成循环
- 严重影响长任务、批处理任务的执行体验

## 建议修复方向

1. **不要静默降级**:当 auto classifier 超时时,应该重试几次或对该次操作降级为 ask,而不是修改整个会话的权限模式
2. **需要降级时明确通知用户**:UI 上显示一个提示,说明"自动审查服务暂时不可用,权限已临时降级",并提供恢复按钮
3. **持久化用户选择**:permissionMode 是用户在会话开始时明确选择的,不应该因为单次服务错误就永久修改会话级别的设置
4. **降级应该是临时的**:只影响当前需要审查的操作,下一次操作应该继续尝试 auto 模式
5. 参考 `turnPermissionPolicy` 机制(按 turn 处理),而不是修改会话级全局 permissionMode

## 环境

- Cindy Desktop v0.1.22 (Windows)
- Codex provider
- Auto permission mode

Contributor guide

Open the contributing guide

Research direction

The reported path is apps/desktop/.vite/build/index-BsRk6Lnc.js; begin at ii() and si(), then trace the onAutoPermissionClassifierUnavailable callback and the turnPermissionPolicy reference. Reproduce a timedOut or 500 classifier result in the Codex desktop flow and verify that the user’s Auto selection is not silently changed for later tool calls.

Written by the indexing model from the issue text.

Assessment

Tech stack
electron, typescript
Domain
desktop
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.