Deep Code 内置了一套细粒度的权限控制机制,在 AI 助手执行工具调用(如执行 Shell 命令、读写文件、访问网络等)前,根据用户配置的策略决定是自动放行、直接拒绝、还是弹出交互式确认。
每次 AI 助手调用工具时,系统会自动分析该操作涉及的权限范围(Permission Scope),然后根据 settings.json 中的权限配置做出决策。对于需要用户确认的操作,会在终端中弹出交互式选择界面,用户可以选择:
- Yes — 仅本次放行
- Yes, and always allow — 本次放行,并将该权限范围写入项目配置文件,后续同类操作不再询问
- No — 拒绝本次操作
Deep Code 定义了以下 10 种权限范围,覆盖了工具调用的各类风险场景:
| 权限范围 | 说明 |
|---|---|
read-in-cwd |
读取当前工作区内的文件 |
read-out-cwd |
读取当前工作区外的文件 |
write-in-cwd |
在当前工作区内创建或覆写文件 |
write-out-cwd |
在当前工作区外创建或覆写文件 |
delete-in-cwd |
删除当前工作区内的文件 |
delete-out-cwd |
删除当前工作区外的文件 |
query-git-log |
查询 Git 历史(如 git log、git show、git blame) |
mutate-git-log |
修改 Git 历史(如 git commit、git rebase、git tag) |
network |
访问网络(如 curl、npm install 等联网操作) |
mcp |
调用 MCP 外部工具 |
此外还有一个特殊的 unknown 范围,当 LLM 无法准确分类命令的副作用时使用,unknown 总是触发询问。
在 ~/.deepcode/settings.json(用户级)或 .deepcode/settings.json(项目级)中通过 permissions 字段配置:
{
"permissions": {
"allow": [],
"deny": [],
"ask": [],
"defaultMode": "allowAll"
}
}| 字段 | 类型 | 说明 |
|---|---|---|
allow |
string[] |
始终自动放行的权限范围列表 |
deny |
string[] |
始终自动拒绝的权限范围列表 |
ask |
string[] |
始终弹出询问的权限范围列表 |
defaultMode |
"allowAll" | "askAll" |
未在 allow/deny/ask 中明确列出的权限范围的默认处理方式。默认为 "allowAll" |
当一个工具调用涉及多个权限范围时,决策按以下优先级进行:
- 若任一范围命中
deny→ 拒绝 - 若任一范围命中
ask→ 询问 - 若所有范围均在
allow中 → 自动放行 - 否则 → 按
defaultMode处理
{
"permissions": {
"defaultMode": "allowAll"
}
}默认行为:所有操作自动放行,无需确认。
{
"permissions": {
"allow": ["read-in-cwd", "write-in-cwd", "query-git-log"],
"defaultMode": "askAll"
}
}此配置的效果:
- 工作区内读写、Git 查询 → 自动放行
- 其他操作都需要用户确认。
当用户在权限提示中选择 "Yes, and always allow" 后,对应的权限范围会被写入当前项目的 .deepcode/settings.json 文件中:
- 新增范围会追加到
permissions.allow列表 - 如果该范围之前存在于
deny或ask中,会被自动移除 - 不会重复写入已存在的范围
这样后续同类操作就不再询问。