审批
每次副作用工具调用在执行前都会被分类。
| 维度 | 值 |
|---|---|
| 风险 | Read、Write、Privileged、Forbidden |
| 权限 | Workspace、OutsideWorkspace、Network、PrivilegedEscalation |
| 授权 | Once、Session、Persistent |
| 模式 | 直接放行 | 仍然询问 |
|---|---|---|
| Default | 工作区读取。Skills 打开时,Skills 搜索目录中的任何路径 | 写入、shell,以及工作区外的路径 |
| Edit | 内置 write 和 edit 的工作区更改 |
Shell、外部工具,以及工作区外的路径 |
| Review | 与 Edit 相同的文件更改。Skills 打开时,Skills 搜索目录 | 其余调用由另一个模型检查。见下 |
| Audit | 没有额外放行。工作区 write 和 edit 也会被检查 |
审查者与 Review 相同 |
| Full | 限制在工作区内、策略允许的动作,包括保持 Write + Workspace 的外部工具 | Forbidden、Privileged、工作区外和强制提示的调用 |
不要把模式命名为 auto。这个词在审查和完全放行之间含糊。不带参数的 /approval 循环 Default、Edit、Review、Audit 和 Full。/approval review 以及其他名称设置一种模式并写入 config.json。旧值 autoedit、fullreview 和 full-review 仍然可以解析。
Review
Section titled “Review”Review 和 Audit 把其余每个副作用调用交给另一个模型。这包括 bash、bash_start、bash_stop、工作区外的读取和编辑,以及外部 Write。
审查者看到有界摘录:最早和最新的用户回合、放得下的其他用户回合,然后是最近的助手和工具证据。压缩摘要代表被折叠的回合。没有这些证据时,宿主询问你。之后的用户消息细化任务。状态问题不会撤销先前的授权。通过 question 工具给出的答案算作授权。
| 结果 | 发生什么 |
|---|---|
| Allow | 运行工具,除非该调用是 Forbidden 或需要强制提示 |
| Deny | 变成模型可见的拒绝文本 |
| Ask、对 Forbidden 的 allow、强制提示的 allow | 回到你 |
审查者请求的瞬时失败按 approvalRetry 重试(默认五次)。仍然失败时询问你。Review 不是授权,也不是完全放行。
除非你打开单独的审批模型,否则审查者就是会话模型。
| 命令 | 效果 |
|---|---|
/approval model |
显示 Approval model Off,或 On <provider> <model>。已保存的非默认档位追加为 · Think High |
/approval model on|off |
保存开关。已保存的提供商、模型和档位留在原地 |
/approval model <model> |
选择目录中的模型,保留已保存的档位,并打开开关。<provider> <model> 跨提供商做同样的事 |
/approval thinking |
循环该模型的档位,或按名称设置,并保存。开关关闭时也能用 |
模型必须存在于 providers.json。缺少凭据或未知模型会被拒绝,先前设置不变。开关打开时,Review 和 Audit 用该模型自己的凭据和已保存档位调用它。模型不提供的已保存档位回退到提供商默认值。无法关闭思考的模型上,/approval thinking 拒绝 off。
Tab 从 on、off 和目录补全 /approval model,并从该模型的档位补全 /approval thinking。/model 和工作思考档位不会改变它。压缩留在会话模型上。开关关闭时不创建单独的客户端,Review 和 Audit 跟随 /model。更改审批模型前先结束当前回合。
/status 只在开关打开时增加 Approval model 和 Approval thinking 行。/status full 列出有效的 retry 和 approvalRetry 策略。状态栏不会。
覆盖层是两列:Status、Reason、Risk、Authority。审查时还有 Outcome 和理由。
| 键 | 授权 |
|---|---|
| Y、Enter 或 1 | Once |
| S 或 2 | Session |
| A 或 3 | Always(持久) |
| N、Escape 或 4 | Deny |
持久授权存在 ~/.crystal/permissions.json。Session 和 Always 只提供给没有强制提示的普通 Workspace Read/Write 调用。OutsideWorkspace、Network、Privileged、Forbidden 和强制提示只提供 Once 和 Deny。Session 和 Always 键被忽略。
每次调用都会对照当前分类检查现有授权。它们不能绕过升级。审查者 Allow 之后,强制提示仍会询问你。审查者 Deny 则拒绝。crystal run 拒绝任何到达此提示的调用。
自动放行卡片
Section titled “自动放行卡片”调用自动放行时,shell 打印 Status、Reason、Risk、Authority 和分类器摘要。审查允许还会打印 Outcome、审查者的风险和授权,以及理由。
| 命令 | 隐藏或显示 |
|---|---|
/verbose approvals |
策略和授权卡片 |
/verbose review |
审查允许卡片,包括 Outcome 和理由 |
除非 config.json 中对应字段为 false,否则各自保持打开。已经打印的卡片跟随各自的开关。已保存的 verboseApprovals 为 false 不再隐藏审查允许卡片。询问你时仍然使用覆盖层。
Shell 分类把 sudo、破坏性文件系统命令、管道到 shell 的下载、强制推送和凭据路径写入视为 Forbidden 或 Privileged。Forbidden 从不完全自动放行。Review 和 Audit 可以拒绝这些调用,或把它们交给你。.ssh、.gnupg 或 ~/.crystal/credentials.json 下的写入是 Forbidden。