控制工具权限#
在 Web 或安装的 App 中使用权限菜单;终端使用 /permissions,也可以通过 Shift+Tab 循环切换普通模式。Bypass 保留显式启用确认。
| 模式 | 自动放行范围 |
|---|---|
| 逐次确认 | 安全读取;其他操作要求审批。 |
| 接受编辑 | 安全读取及工作目录内支持的安全编辑;命令仍需审批。 |
| 计划模式 | 既有只读计划工具策略允许的操作。 |
| 自动判定 | 安全工具及风险分类器允许的操作。 |
| 跳过审批 | 普通操作不经过审批和风险分类。 |
Bypass 不覆盖显式 deny 或 ask 规则、计划退出或自更新的强制审批、插件限制、身份权限上限以及 Sandbox。
问题和审批显示为对话中的独立卡片。每个问题的下方显示回答控件,多问题和表单字段一起排列;填写后点击一次“提交回答”。提交的答案继续显示在对应问题下方。主输入框仍用于普通消息。卡片显示已提交的答案、提交进度以及确认或重试状态。确认回执保留至页面刷新,仍待回答的请求会在重连后恢复。
工具审批只显示当前操作,以及“同意”和“拒绝”。点击即提交,服务端确认后才关闭;结果未确认时可重试同一答复。长期规则仍可在 History 的项目设置中管理。
人工工具审批默认没有时间限制。等待时保存执行进度并释放当前执行实例,重新打开 App 后恢复待审批请求。恢复使用本轮已保存的上下文,之后的记忆或日期更新不会使审批失效。工具、权限和工作目录仍会重新检查。如果执行无法恢复,对话会明确说明待执行的操作尚未运行。取消任务会撤销审批。以前已过期的请求不会重新生效,也不能批准新的操作。
edit、write 和 apply_patch 会保存审批时的文件状态,在执行前和写入前检查。文件已删除时不利用旧审批重新创建;内容变化时,需要先读取当前内容再提出新操作。界面只显示当前待批准内容,不显示变更历史。任意命令不能完整声明涉及的文件,所以这项文件检查不覆盖任意命令的所有副作用。
普通提问保留答题控件和 “先讨论”入口;工具审批不提供讨论输入框。
新的 owner 轮次在 Auto 或 Bypass 下,不会仅因之前无关轮次中断而额外要求批准。来源验证通过的嵌套浏览器和 Program 调用使用相同范围。当前执行内结果不确定的操作仍需精确批准,旧操作记录继续保留。这不会改变 macOS 访问权限,也不会使只读磁盘变为可写。
任务运行中修改权限#
已有会话的选择会发送到后端,获得确认后才显示为有效模式。界面已知后端确认版本时,选择后立即发送修改。后端确认 Bypass 后,后续普通工具调用不再要求审批,即使模型仍在推理、输出文字或生成工具参数;同一条回复中的后续工具也使用新模式。无需停止生成或再发一条消息。新模式会出现在后续模型请求的运行时说明中,已经在生成的文字不会被改写。已经获得执行授权的调用保留该次授权。切换到计划模式会阻止尚未获准的写入。
普通审批如果不再需要,会通过 execution 的持久化等待自动处理并恢复任务。显式 ask、强制审批、用户问题、表单及 Sandbox 升级不会因为切换模式而自动回答。重复回答、取消、超时和恢复不得重复执行已完成调用。
修改只影响当前会话。其他窗口接收已确认的模式,旧版本修改会被拒绝,不能覆盖新选择。断线或失败的修改保持未确认;重新连接后检查当前模式再重试。尚未发送的草稿将选择保存在本地,并在首条消息中传入。
有效默认值按会话 override、项目默认、逐次确认的顺序解析。经过身份验证的 owner Agent 创建子 Agent 时,子 Agent 继承父 Agent 当时有效的权限模式和显式规则。例如,使用 Bypass 的父 Agent 创建的子 Agent 可以执行无需普通审批的命令。子 Agent 保留自己的身份和非交互限制;显式 ask 规则和强制审批仍会阻止需要审批者的操作。后续模式变化不会改写已经接纳的子 Agent。独立定时任务和外部渠道不会从本地会话获得 owner 权限或 Bypass。
在 History 中管理项目规则#
打开 History → Projects,选择项目,再进入 Settings → Permission Rules。三个列表分别显示该项目的拒绝、询问和允许规则。使用 ToolName 或 ToolName(pattern) 语法添加规则;删除已有规则即可撤销它。修改规则时,先删除旧条目,再添加替代条目。拒绝优先于询问,询问优先于允许。项目列表为空时,会话和全局规则仍可能影响结果。
界面收到匹配当前项目的服务端确认后才清空已提交的规则。保存失败或结果未确认时保留输入并显示状态;成功修改会同步到该项目其他已打开的视图。经过认证的交互式 owner 会话在下一次操作时读取最新规则,包括当前 turn 运行期间的修改。已经获准的操作保留该次授权;已有审批等待仍需单独答复。已经接纳的子 Agent 保留创建时的策略。
同意和拒绝只答复当前请求,不创建项目规则。删除项目规则影响后续授权,不会改变已经执行的操作历史。
理解工具拒绝#
Windows 路径规则可使用正斜杠避免转义歧义,例如
read(C:/Users/me/project/**)。盘符路径中的普通反斜杠会保留;规则语法仍用
\\、\(、\) 转义自身的特殊字符。写入 JSON 配置时,还需遵守 JSON 的反斜杠转义规则。
工具结果会区分 Authority、权限规则、计划模式、Auto 分类和 Sandbox 拒绝。AUTHORITY_TIER_MISSING 表示执行请求缺少认证权限级别,Bypass 不能解决。新的认证聊天提交会携带完整身份;缺少身份的旧 admission 必须通过认证界面重新提交。
Sandbox 位于输入框 Plus 菜单,与审批模式独立。修改 Sandbox 影响后续 turn。Bypass 保持当前沙箱限制,普通工具审批不能用于沙箱升级。如果拒绝不能创建独立升级等待,需要用户显式修改相关设置后发起新调用。
macOS 在更新后再次询问权限#
文件夹访问、照片、屏幕录制和辅助功能属于 macOS 系统权限。Bypass 控制工具审批,不能授予这些权限。桌面 App 和具名后台服务都是签名应用,macOS 可能分别保存它们的权限记录;开启一个同名条目,不代表当前执行任务的后台已经获得授权。
本地刷新 App、本地打包安装和对话自更新复用 ~/Library/Application Support/OpenProgram/local-signing 中的私有签名身份,使后续构建保持同一证书身份,而不是每次构建都改变。清理构建文件时保留此目录,其中包含本地签名钥匙串。签名状态缺失或损坏时构建会停止,不会自动创建替代身份。
首次从旧的临时签名迁移时,macOS 可能需要再次确认权限。旧条目可能仍显示已开启,但系统拒绝更新后的签名。系统权限页面检查实际执行程序,不把设置开关当作授权成功的证据。点击“请求授权”触发系统授权;“打开系统设置”是独立操作,辅助功能及之前被拒绝的权限可能需要在该界面确认。如果已记录的成功授权属于旧的已验证签名身份,显式授权操作仅对这项 OpenProgram 权限更新一次。启动及普通状态检查不会重置授权,也不会代替用户接受系统弹窗。本地签名仅用于这台电脑上的开发构建;公开分发仍需 Developer ID 签名和公证。
Auto 模式在执行前审查完整操作,包括 Shell 命令。审查输入上限为 64 KiB;输入超限或分类器不可用时拒绝执行,不会依据截断内容批准。每个候选模型的超时为 30 秒。参数或实时权限策略变化会使原审查结果失效。显式拒绝规则和强制审批仍优先执行。
Auto 风险拒绝连续达到 3 次或累计达到 20 次时,已认证的交互式本地用户可以通过现有审批流程批准具体操作。显式禁止规则和硬性限制仍然有效。计数按会话与权限版本保存;改变权限版本开始新的计数周期。允许或批准的操作重置连续次数;累计阈值触发的审批完成也重置累计次数。分类器故障、无效回复和取消不计为风险拒绝。持久化调用身份避免恢复后重复计数,并发更新使用执行数据库事务。非交互任务收到拒绝结果后仍可执行其他允许的操作。回退审批只允许当前操作,绑定原参数、工作目录、权限版本和文件状态。
自动风险拒绝不计入重复执行失败限制,因此相同操作反复被拒绝时仍可进入人工审批。达到累计阈值后的审批完成会重置累计计数。已完成及被拒绝操作在检查点恢复时保留宿主记录的结果状态。
主机权限使用统一设置入口#
执行主机使用一个统一的能力注册表,当前包含屏幕录制、辅助功能、自动化、日历、提醒事项、文件读取与写入、麦克风和摄像头。每行记录当前状态、被检查的执行身份、需要它的操作,以及平台是否支持申请。设置页、CLI/TUI doctor、GUI 前置检查、持久化的系统权限等待和 HTTP 接口都读取同一份注册表。
GET /api/system/access 只做不会弹窗的状态检查。在安装的 App 中打开“设置 → 系统权限”查看按类别分组的能力。“初始化全部 OpenProgram 权限”是首次设置已登记本机能力的统一入口,会返回一份合并后的状态报告;也可以对单行使用“请求授权”和“打开系统设置”。这些操作都必须由本机用户明确点击。重连、轮询、历史回放、模型输出、启动检查和普通重试都不会打开系统权限弹窗。缺少权限时,只暂停声明了这项能力的操作;浏览器、虚拟机、无桌面和普通聊天操作不会自动要求桌面权限。
状态含义不同:granted 表示当前具名执行程序刚刚检查通过;not_granted 表示系统确认缺少授权;unknown 表示主机无法确认状态;unavailable 表示原生依赖缺失;unsupported 表示当前后端没有实现。unknown 和 unavailable 不会被当作拒绝。
自动化权限按目标应用分别授权,文件访问按用户选择的路径控制。日历、提醒事项、麦克风和摄像头可能各自触发 macOS 授权。程序不能预先授权尚未指定的应用或尚未选择的路径。系统设置中的 python3、node 或缓存目录应用条目不是具名 OpenProgram 执行程序的授权证据。已安装产品的所有原生检查和授权都使用签名 runtime bundle 身份 ai.openprogram.runtime,外层 App 不再作为第二个原生执行身份。普通检查不会重置 TCC 记录,也不会修改其他应用的权限。
解释和自测权限规则#
openprogram permissions check 只读判断所提供的 JSON 规则,不执行工具:
openprogram permissions check --rules rules.json --tool bash --args '{"command":"git status"}' --expect allow
openprogram permissions test --rules rules.json --cases cases.json
规则文件包含 allow、ask、deny 数组,例如 {"allow":["bash(git:*)"],"ask":[],"deny":["bash(rm:*)"]}。样例文件是非空数组,每项必须包含 tool、args 和 expected,例如 [{"tool":"bash","args":{"command":"git status"},"expected":"allow"}]。
JSON 结果按 deny、ask、allow 的实际执行优先级列出命中规则;unmatched 表示所提供的规则均未命中。期望匹配时退出码为 0,不匹配为 1,输入无效为 2。check 未设置 --expect 时,任何有效判断均返回 0。诊断只检查传入文件,不合并会话配置,不运行风险分类器,不批准工具,也不绕过硬性限制或操作系统沙箱。
将沙箱命令限制到公网域名#
macOS 上设置 sandbox.network=true,再将 sandbox.network_domains 设为映射,例如 {"example.com":"allow","*.example.org":"allow","blocked.example.org":"deny"}。
支持精确域名与任意深度子域 *.example.org(不包含根域),deny 优先。空映射拒绝全部目标,null 保留原有网络开关。私有、本地、组播和保留 IP 始终拒绝,即使域名在允许列表中。代理检查全部 DNS 返回地址,并直接连接已检查的地址。
每条命令使用带临时认证的本地代理,macOS 沙箱阻止绕过代理直连。支持端口 80 的 HTTP 和端口 443 的 HTTPS CONNECT;客户端需要支持常规 HTTP 代理设置。域名规则授权目标连接,不检查加密 HTTPS 的方法或正文。不支持 TLS 拦截、SOCKS/UDP、任意端口、本地网络或上游代理串联。不支持明文 HTTP 的 chunked 上传和 Upgrade;HTTPS 隧道支持普通 HTTPS 与 WSS。
命令结束或取消时关闭代理和活动连接。Linux/Windows/WSL 暂不支持域名策略,会明确拒绝执行,不会改为无限制网络。沙箱不可用时,即使普通不可用策略设为 warn,域名限制仍拒绝执行。显式关闭 Sandbox 仍会关闭其限制。这些设置作用于沙箱命令,不限制宿主的模型服务请求或所有其他工具传输。
中断的操作#
新的交互式所有者轮次按所选 Auto 或 Bypass 模式执行,即使旧轮次有外部结果未知的记录。旧记录仍保留为未知,不会自动重放。恢复同一个中断执行仍需要核对结果或批准确切操作。显式 deny/ask 规则和强制审批继续生效。
允许保存规则的请求提供“始终允许”,将支持的确切操作规则保存到当前项目。“始终允许此路径”仅用于 Sandbox 路径授权。只允许单次审批的请求不提供持久授权。
停止会中断正在等待的模型请求和异步工具操作。执行程序退出后,轮次结束;外部操作结果未知时,Activity 仍保留该记录。暂停则等待当前操作到达可恢复的位置。界面显示请求正在处理;需要立即中断时使用停止。