Skip to content
源码分析手册

DontAsk 模式:非交互环境下的静默拦截态

在 CI/CD 流水线或完全无人值守的自动化脚本中,最怕看到的是程序因等待用户点击而“挂起”。DontAsk 模式(不询问模式)正是为此设计的“静默态”,它的逻辑极其简单却极具确定性。

本质

DontAsk 模式本质上是 将“弹窗询问”降级为“静默拒绝”的确定性策略

  • 它不是什么:它不是“自动放行”。它与 Bypass Permissions 模式恰恰相反,Bypass 是“全过”,DontAsk 是“不确定的全不过”。
  • 它的核心理念:在非交互环境(Headless)下,如果一个操作既不属于白名单也不属于预设的授权范围,与其让程序死等一个永远不会到来的按键,不如直接告诉模型:“此路不通”。

实现机制

DontAsk 模式的实现精髓在于权限判定的末端收敛:

1. 模式信号捕获

claude-code-opensource/src/utils/permissions/PermissionMode.ts 中,dontAsk 被定义为一个低侵扰度的模式。它的配置逻辑确保了系统不会触发任何 TTY 交互。

2. 状态改写逻辑(Result Transformation)

核心逻辑体现在权限判定流的最末端。当权限引擎 canUseTool 执行完毕,根据模型上下文和工具类型原本应该抛出一个 Ask 信号(请求用户审批)时:

  • 拦截信号:系统会检查当前的 permissionMode 是否为 dontAsk
  • 强制降级:如果是,系统会强制将裁决结果从 Ask 改写为 Denied(拒绝)。
  • 反馈模型:这一结果会通过 ToolResult 直接反馈给 Claude。模型会收到一条明确的报错消息:“该操作需要显式权限,但当前处于不询问模式,操作已被自动拦截”。

3. “聪明的模型”反馈循环

这种模式并非死路一条。由于 Claude 模型具备反思能力,当它看到 Denied 反馈时,通常会:

  • 寻找替代方案:例如,如果 Write 被拦住,它可能会尝试先 Read 后生成差异对比;或者如果某个外部 Bash 命令被拦住,它会尝试使用 Node.js 的内置库函数来完成相同任务。

限制与陷阱

  • CI 环境的首选:DontAsk 是 headless 模式下的黄金搭档。它保证了无论模型多想“折腾”,程序都能按预期结束,不会产生僵尸进程或阻塞流水线。
  • 非永久性拒绝:DontAsk 的拒绝是基于当前会话状态的。你随时可以重启一个 default 模式的会话,通过 /permissions 为特定的高频命令手动设置 Allow 规则,然后再次回到 DontAsk 模式,此时这些已授权的操作将不再被拦截。
  • 静默但有痕迹:虽然不弹窗,但所有的拦截动作都会进入 /permissions 的审计视图。你可以事后回溯:到底有哪些好想法被 DontAsk 拦截了。
  • 与 Bypass 的严格区分Bypass 追求的是效率(全过),DontAsk 追求的是极高的安全底线(全关)。

延伸阅读

源码锚点

📄 src/utils/permissions/PermissionMode.ts — `dontAsk` 模式的属性定义。L63-83 of 142
typescript
    color: 'autoAccept',
    external: 'acceptEdits',
  },
  bypassPermissions: {
    title: 'Bypass Permissions',
    shortTitle: 'Bypass',
    symbol: '⏵⏵',
    color: 'error',
    external: 'bypassPermissions',
  },
  dontAsk: {
    title: "Don't Ask",
    shortTitle: 'DontAsk',
    symbol: '⏵⏵',
    color: 'error',
    external: 'dontAsk',
  },
  ...(feature('TRANSCRIPT_CLASSIFIER')
    ? {
        auto: {
          title: 'Auto mode',
📄 src/utils/permissions/permissions.ts — 权限裁决引擎中将 `Ask` 收敛为 `Denied` 的核心实现点。L27-33 of 1487
typescript
  PermissionAskDecision,
  PermissionDecision,
  PermissionDecisionReason,
  PermissionDenyDecision,
  PermissionResult,
} from './PermissionResult.js'
import type {

基于 Claude Code v2.1.88 开源快照的深度分析