权限策略 —— 决定哪些工具可以执行。 对应源码: permissions.rs:49-134
| 138 | # 3. authorize() 方法:判断某个工具能否执行 |
| 139 | |
| 140 | class PermissionPolicy: |
| 141 | """ |
| 142 | 权限策略 —— 决定哪些工具可以执行。 |
| 143 | |
| 144 | 对应源码: permissions.rs:49-134 |
| 145 | """ |
| 146 | |
| 147 | def __init__(self, active_mode: PermissionMode | str): |
| 148 | """ |
| 149 | 参数: |
| 150 | active_mode: 当前的权限模式 |
| 151 | 可以是 PermissionMode 枚举值 |
| 152 | 或 "prompt"(每次询问) / "allow"(全部允许) |
| 153 | """ |
| 154 | self.active_mode = active_mode |
| 155 | # 每个工具需要的权限等级 |
| 156 | # 默认所有工具都需要最高权限,然后逐个设置 |
| 157 | self._tool_requirements: dict[str, PermissionMode] = {} |
| 158 | |
| 159 | def with_tool_requirement(self, tool_name: str, required_mode: PermissionMode) -> "PermissionPolicy": |
| 160 | """ |
| 161 | 设置某个工具需要的权限等级。 |
| 162 | |
| 163 | 链式调用:policy.with_tool_requirement("bash", DANGER).with_tool_requirement("read", READ) |
| 164 | """ |
| 165 | self._tool_requirements[tool_name] = required_mode |
| 166 | return self |
| 167 | |
| 168 | def required_mode_for(self, tool_name: str) -> PermissionMode: |
| 169 | """查询某个工具需要什么权限""" |
| 170 | return self._tool_requirements.get(tool_name, PermissionMode.DANGER_FULL_ACCESS) |
| 171 | |
| 172 | def authorize( |
| 173 | self, |
| 174 | tool_name: str, |
| 175 | tool_input: str, |
| 176 | prompter: Optional[PermissionPrompter] = None, |
| 177 | ) -> tuple[bool, str]: |
| 178 | """ |
| 179 | 判断某个工具是否可以执行。 |
| 180 | |
| 181 | 核心逻辑(和 Claude Code 源码一致): |
| 182 | 1. 如果是 "allow" 模式 → 直接允许 |
| 183 | 2. 如果当前权限 >= 需要的权限 → 允许 |
| 184 | 3. 如果当前权限不够但可以询问 → 问用户 |
| 185 | 4. 否则 → 拒绝 |
| 186 | |
| 187 | 返回: |
| 188 | (是否允许, 原因说明) |
| 189 | |
| 190 | 对应源码: permissions.rs:89-134 |
| 191 | """ |
| 192 | # 情况 1: allow 模式,全部放行 |
| 193 | if self.active_mode == ALLOW_MODE: |
| 194 | return (True, "allow mode: all tools permitted") |
| 195 | |
| 196 | required = self.required_mode_for(tool_name) |
| 197 |