feat: 声明式权限(opencode 式 allow/ask/deny 配置化)

- safety.check 在 plan 模式之后、安全模式之前插入声明式权限判定:
  deny(阻断) > ask(强制确认) > allow(自动放行) > 默认(按安全模式)
- 规则语法支持 "*"全匹配 / "tool"精确 / "tool:*"任意操作 / "tool:op"操作前缀
- 读取 config.permissions;提供 set_permissions 显式注入(测试/启动用)
- config.json 顶层加 permissions 段(allow/ask/deny 示例,该文件被 gitignore 不入库)
- 修复:test_normal_mode_does_not_plan_block 隔离真实 config 权限,避免污染
- 新增 tests/test_permissions.py(14 项:规则匹配+deny/ask/allow+优先级)

Co-Authored-By: WorkBuddy <workbuddy@tencent.com>
This commit is contained in:
shuiyu67andWorkBuddy committed 2026-08-05 17:56:25 +08:00
1 parent 9dd418ec89
commit 160d4e924e
3 files changed
+196

No files matched your search

+3
View File
@@ -118,9 +118,11 @@ def test_normal_mode_does_not_plan_block():
safety = get_safety()
saved_cli = safety.cli
saved_mode = safety.mode
saved_perm = safety._permissions_override
fake_cli = types.SimpleNamespace(plan_mode=False)
safety.set_cli(fake_cli)
safety.set_mode(0) # MODE_UNRESTRICTED:直接放行,不消耗 AI
safety.set_permissions(allow=[], ask=[], deny=[]) # 隔离真实 config 的权限规则
try:
allowed, _ = safety.check("code_editor", "write a.py x")
assert allowed is True
@@ -129,6 +131,7 @@ def test_normal_mode_does_not_plan_block():
finally:
safety.set_cli(saved_cli)
safety.set_mode(saved_mode)
safety._permissions_override = saved_perm
# ── system prompt 注入 ──