词元之母TOK.MOM - 平台充值汇率 1:1 即 1 人民币充值到账 1 美元,支持一个 Key 调用近 600+ 海内外模型,限时特价模型低至 1 折,欢迎上岸!
精确控制 Agent 可以做什么、不可以做什么。

| 动作 | 说明 | 效果 |
|---|---|---|
allow | 允许 | 直接执行,无需确认 |
ask | 询问 | 弹出确认框,用户决定 |
deny | 禁止 | 拒绝执行,Agent 收到错误 |
默认权限(源码定义)
↓ 覆盖
全局配置 permission
↓ 覆盖
Agent 级别 permission来源: config.ts:418-447,agent.ts:194
{
"permission": {
"bash": {
"*": "ask", // 规则 1:所有命令需确认
"git *": "allow", // 规则 2:git 命令允许
"git push*": "deny" // 规则 3:git push 禁止
}
}
}git push origin main:*)→ askgit *)→ allowgit push*)→ deny来源: agents.mdx:473,permissions.mdx:70
| 权限 | 匹配对象 | 说明 |
|---|---|---|
read | 文件路径 | 读取文件 |
edit | 文件路径 | 所有文件修改(edit/write/patch/multiedit) |
glob | glob 模式 | 文件搜索 |
grep | 正则表达式 | 内容搜索 |
list | 目录路径 | 列出目录内容 |
bash | 命令字符串 | 执行 shell 命令 |
task | subagent 名称 | 调用子 Agent |
skill | skill 名称 | 加载技能 |
lsp | - | LSP 查询(目前不支持细粒度) |
todoread | - | 读取 Todo 列表 |
todowrite | - | 更新 Todo 列表 |
webfetch | URL | 获取网页内容 |
websearch | 查询字符串 | 网页搜索 |
codesearch | 查询字符串 | 代码搜索 |
external_directory | - | 访问项目目录之外的路径 |
doom_loop | - | 检测重复调用(同一工具连续调用 3 次相同输入) |
question | - | 向用户提问(默认 deny,防止 subagent 打扰用户) |
plan_enter | - | 进入计划模式(代码已弃用) |
plan_exit | - | 退出计划模式,切换到 build agent |
来源: config.ts:614-645
{
"permission": {
"edit": "allow", // 所有文件编辑允许
"bash": "ask", // 所有命令需确认
"webfetch": "deny" // 禁止获取网页
}
}{
"permission": "allow" // 所有权限都允许
}{
"permission": {
"bash": {
"*": "ask", // 默认需确认
"git status": "allow", // git status 允许
"git log*": "allow", // git log 开头的允许
"rm -rf*": "deny" // rm -rf 禁止
}
}
}| 符号 | 含义 | 示例 |
|---|---|---|
* | 匹配任意字符(0个或多个) | git * 匹配 git status、git log |
? | 匹配单个字符 | file?.txt 匹配 file1.txt |
{
"permission": {
"bash": {
"*": "ask", // 默认需确认
// Git 命令
"git status": "allow",
"git log*": "allow",
"git diff*": "allow",
"git branch*": "allow",
"git checkout*": "ask", // 切换分支要确认
"git push*": "ask", // 推送要确认
"git reset --hard*": "deny", // 硬重置禁止
// 包管理
"npm install*": "allow",
"npm run*": "allow",
"npm publish*": "deny", // 发布禁止
// 危险命令
"rm -rf*": "deny",
"sudo*": "deny",
"chmod 777*": "deny"
}
}
}{
"agent": {
"plan": {
"permission": {
"bash": {
"*": "deny", // 默认禁止
"git log*": "allow", // 只读命令允许
"git diff*": "allow",
"git status": "allow",
"ls*": "allow",
"cat*": "allow",
"head*": "allow",
"tail*": "allow"
}
}
}
}
}edit 工具write 工具patch 工具multiedit 工具{
"permission": {
"edit": {
"*": "allow", // 默认允许
// 敏感文件
"*.env": "deny",
"*.env.*": "deny",
"*.env.example": "allow", // 示例文件允许
".env.local": "deny",
// 系统文件
"package-lock.json": "deny", // 锁文件不要改
"pnpm-lock.yaml": "deny",
"yarn.lock": "deny",
// 目录
"node_modules/*": "deny",
".git/*": "deny",
"dist/*": "deny"
}
}
}{
"agent": {
"readonly-auditor": {
"description": "只读代码审计,不修改任何文件",
"mode": "subagent",
"permission": {
"edit": "deny" // 禁止所有编辑
}
}
}
}task: deny 时:注意:用户仍可通过 @agent-name手动调用任何 subagent。task 权限只影响 Agent 自动调用。来源: agents.mdx:557-565
{
"agent": {
"safe-orchestrator": {
"description": "安全编排器,只能调用指定的 subagent",
"mode": "primary",
"permission": {
"task": {
"*": "deny", // 禁止所有
"docs-writer": "allow", // 允许文档
"code-reviewer": "allow", // 允许审查
"dangerous-agent": "deny" // 显式禁止
}
}
}
}
}{
"agent": {
"orchestrator": {
"permission": {
"task": {
"*": "deny",
"safe-*": "allow", // 所有 safe- 开头的允许
"internal/*": "allow", // 嵌套目录的允许
"code-reviewer": "ask" // 需要确认
}
}
}
}
}description | string | 是 | 任务描述(3-5 个词),用作子会话标题 |prompt | string | 是 | 子代理要执行的任务提示 |subagent_type | string | 是 | 要调用的子代理名称(必须是非 primary agent) |session_id | string | 否 | 继续已存在的子会话 |command | string | 否 | 触发此任务的命令(用于调试) |主 Agent (Build)
↓
1. 权限检查
- 检查调用者是否有 task 权限
- 过滤可访问的 subagent
↓
2. 创建子会话
- 在主会话下创建独立 session
- 标题:描述 + (@subagent subagent)
- 应用限制权限(todowrite/todoread/task)
↓
3. 调用子代理
- 子代理在独立 session 中执行
- 上下文仅包含传入的 prompt
- 监听 PartUpdated 事件获取进度
↓
4. 返回结果
- 收集所有工具调用摘要
- 生成对话摘要
- 返回给主 Agent关键点:子代理运行在独立的 Session 中,看不到主 Agent 的对话历史。调用时必须提供完整上下文。
@ 手动调用)受到以下硬编码限制:| 限制 | 说明 | 原因 |
|---|---|---|
todowrite: deny | 禁止写入待办列表 | 防止子代理干扰主 Agent 任务管理 |
todoread: deny | 禁止读取待办列表 | 同上 |
task: deny | 禁止再调用子代理 | 防止无限递归 |
{
"agent": {
"orchestrator": {
"description": "任务编排 Agent,可调用专门子代理",
"mode": "primary",
"permission": {
"task": {
"docs-writer": "allow", // 允许文档写作
"code-reviewer": "allow", // 允许代码审查
"general": "allow", // 允许通用任务
"*": "deny" // 其他禁止
}
}
}
}
}session_id 继续之前的工作:TaskTool(
description: "完善文档",
prompt: "检查文档完整性并补充缺失内容",
subagent_type: "docs-writer",
session_id: "abc123" // 继续之前的会话
)来源: packages/opencode/src/tool/task.ts:23-193
{
"agent": {
"restricted-agent": {
"description": "受限 Agent,只能使用指定技能",
"mode": "subagent",
"permission": {
"skill": {
"*": "deny", // 禁止所有技能
"docs-writer": "allow", // 只允许文档技能
"translator": "allow"
}
}
}
}
}来源: skill.ts:15-21
// 内置默认配置
{
"permission": {
"read": {
"*": "allow",
"*.env": "ask", // .env 文件需确认(安全考虑)
"*.env.*": "ask", // .env.xxx 也需确认
"*.env.example": "allow" // 示例文件允许
}
}
}来源: agent.ts:67-72
{
"permission": {
"doom_loop": "ask" // 默认值:提示用户确认
}
}| 默认值 | 说明 |
|---|---|
subagent: deny | 防止 subagent 随意打扰用户 |
build agent: allow | 主 Agent 可以提问 |
allow。{
"agent": {
"interactive-helper": {
"permission": {
"question": "allow" // 允许这个 subagent 提问
}
}
}
}来源: agent.ts:56-64,question.ts
{
"permission": {
"external_directory": "ask" // 默认值:提示用户确认
}
}plan_enter:进入计划模式(代码已实现但被注释弃用,计划模式通过 /plan 命令触发)plan_exit:退出计划模式,切换到 build agentdeny,只有 build agent 和 plan agent 允许调用。{
"agent": {
"build": {
"permission": {
"plan_enter": "allow", // build agent 允许切换到 plan
"plan_exit": "deny" // 不允许退出(只有 plan agent 可以)
}
}
}
}来源: agent.ts:56-65,plan.ts
tools 字段已废弃,请使用 permission 字段代替。{
"agent": {
"my-agent": {
"tools": {
"bash": false, // 禁用 bash
"edit": true // 允许编辑
}
}
}
}{
"agent": {
"my-agent": {
"permission": {
"bash": "deny", // 禁用 bash
"edit": "allow" // 允许编辑
}
}
}
}tools 中的 write/edit/patch/multiedit 都映射到 edit 权限true → "allow",false → "deny"来源: config.ts:675-737
todowrite 和 todoread。primary_tools 中的工具,子代理无法使用。task 权限)。explore 无法调用 general,因为它的默认权限是 *: deny。{
"permission": {
"bash": {
"*": "ask",
"git status": "allow"
}
},
"agent": {
"build": {
"permission": {
"bash": {
"git push": "allow" // build agent 额外允许 push
}
}
},
"plan": {
"permission": {
"bash": {
"*": "deny", // plan agent 禁止所有命令
"git log*": "allow" // 除了查看日志
}
}
}
}
}// ❌ 不好:过于宽松
{
"agent": {
"my-agent": {
"permission": "allow"
}
}
}
// ✅ 好:明确列出需要的权限
{
"agent": {
"my-agent": {
"permission": {
"read": "allow",
"edit": {
"docs/*": "allow"
},
"bash": "deny"
}
}
}
}// ❌ 不好:允许所有,然后禁止危险的
{
"permission": {
"bash": {
"*": "allow",
"rm -rf*": "deny"
}
}
}
// ✅ 好:禁止所有,然后允许需要的
{
"permission": {
"bash": {
"*": "deny",
"git status": "allow",
"npm test": "allow"
}
}
}{
"permission": {
"bash": {
"*": "allow",
"git push*": "ask", // 推送需确认
"npm publish*": "ask", // 发布需确认
"docker *": "ask" // Docker 操作需确认
}
}
}| 现象 | 原因 | 解决 |
|---|---|---|
| 权限不生效 | 规则顺序错误 | * 放最前面,具体规则放后面 |
| subagent 仍能被调用 | 用户 @ 调用不受限 | task 权限只影响 Task tool |
| bash 命令匹配失败 | 匹配的是解析后的命令 | 检查实际命令格式(含参数) |
| .env 无需确认就读取 | 自定义规则覆盖了默认 | 如需保护,设为 .env ask |
| 权限太严格 | 设了 *: deny 忘了允许必要的 | 逐条添加允许规则 |
配置好权限,还有更多高级技巧:工具接口设计、透传参数、调试方法。