前言¶
在 DeepSeek Harness(DSH)里跑智能体时,工具调用往往要过一层人工审批:工作区内改文件可以静默放行,但越界命令、删库、凭据、远程执行一类操作若一律弹窗,日常开发会被打断;若一律自动放行,又容易踩雷。社区里已有基于审批门的插件思路;dsh-approval-core 是在 dsh-approval-gate 上 fork 并加固的版本,由维护者 lyaoliu 发布,分类为 admin-security,目标是把「例行沙箱内 / 可学习重复模式」与「硬风险、正则命中、分类器拿不准」分开处理:前者可自动放行或受约束学习,后者一律转人工(fail-safe)。
下面介绍它是什么、核心行为、安装配置,以及审查视图与撤销能力。事实以 GitHub README 与设计文档为准;DSH 生态是「一切皆插件」,SkillHub 目录页 为社区站点,与 DeepSeek / 幻方无官方从属关系。
这是什么¶
dsh-approval-core(当前 package 版本 0.2.0,MIT)是一套挂在 DSH Web 侧的自动审批决策管道:工作区内写文件由沙箱直接放行(不经过审批瀑布);越界等 neutral 类请求默认先转人工,并在指纹命中与学习阈值满足后可选自动放行;硬风险类别、正则危险清单、分类器超时/失败/无法解析的输出,一律转人工。学习数据独立存放,可一键清空;附带分级配置 UI 与块级撤销审查视图。
维护者:lyaoliu。上游为 dsh-approval-gate;版权与改动说明见仓库 NOTICE 与 README「与上游差异」一节。
核心功能与行为¶
README 在 DSH Desktop 2.0.5 / 插件 0.1.2-rc.1 上做过真机验证,行为可概括为下表(阈值与清单以 allowlist.json 为准):
| 场景 | 行为 |
|---|---|
| 工作区内写文件 | 沙箱直接放行,零打扰 |
| 越界请求(neutral 类) | 前 riskyThreshold(默认 5)次转人工,并按操作指纹记入学习样本 |
| 同指纹同类操作达阈值后 | 自动放行(fp-hit),审计标记 auto-learned |
| 硬风险类别(deletion/credential/remote/system/bulk) | 永远人工,不计数、不学习 |
正则危险清单命中(如 rm -rf、force-push、curl|sh 等 13 条 + denyKeywords) |
永远人工,先于分类器执行 |
| 分类器超时/失败/输出无法解析 | fail-safe 转人工 |
| 人工拒绝 | 升级为永久人工规则(denyRules),清除该类学习计数 |
命令 /approval-core-clear-learning |
一键清空全部学习沉淀(stats 与 history) |
与上游的主要差异(节选):修复 permissionPresets 传入 Session 的方式,避免插件从不接管;关键词 DENY 层改为 13 条确定性正则 + denyKeywords 第二层;学习独立 learning.json 且可清空;v0.2.0 恢复受限 POST /api/auto-approve/rules(服务端 classifyOp + validateValue);移植 callId 回溯、快照与 Windows 路径等修复。仓库含 49 个 node:test 用例。
安装与启用¶
官方 README 给出的安装方式为本地目录加入 web profile(非 git clone 后的远程一键命令,请按你实际获取插件包的路径替换 ./dsh-approval-core):
dsh plugin --profile web add ./dsh-approval-core
插件以当前 DSH 进程权限运行;安装前应自行阅读源码与 LICENSE(MIT),确认符合你的安全策略。
数据与配置目录(默认 $DSH_HOME/auto-approve/,可通过 dataDir 迁到绝对路径):
allowlist.json— 规则与配置(热读,每次审批前读盘;denyKeywords正则编译在加载时,改后需重启 dsh web)learning.json— 学习状态(可一键清空)audit.log— 决策审计events.jsonl— 审查 UI 事件流reverts.jsonl— 已执行撤销记录(服务端去重)
可选 "dataDir" 为绝对路径时,learning/audit/events/snapshots 等迁到该目录;allowlist.json 仍在默认目录。改 dataDir 需重启 DSH Desktop。
配置与 HTTP 接口¶
规则、阈值与学习开关可编辑 allowlist.json,也可通过受限 HTTP 接口修改(v0.2.0 恢复受限规则 API)。主要字段包括:denyKeywords、allowRules、denyRules、hardCategories、riskyThreshold、judgeTimeoutMs、learning、dataDir、classifierModel 等。
只读与写接口(写操作经四级权限矩阵 + 结构校验):
GET /api/auto-approve/rules— 配置、学习状态、预置清单、各 kind 的 permission 级别(供 UI)POST /api/auto-approve/rules— 受限写;hardCategories永远 forbidden;删除预置项 forbidden;danger-full-access不可加白名单- 另有
GET events/GET diff/GET snapshots-stats,以及POST revert、POST snapshots-clear
配置 UI 权限分级(服务端为最终边界):
| 级别 | 示例 | 交互 |
|---|---|---|
| 只读 | 管道总览、学习进度、数据目录、分类模型 | 仅展示 |
| 自由改 | riskyThreshold(1–20)、judgeTimeoutMs(5s–120s) |
直接改,越界 400 |
| 确认改 | 加黑名单词、加白名单规则、删自定义项 | 确认后提交 |
| 禁改 + 403 | 硬风险类别、删预置项、danger-full-access 加白 |
UI 无控件,直发请求也拒绝 |
分类模型:在 allowlist.json 设置 "classifierModel": {"provider": "...", "model": "..."},优先于会话默认模型;改文件即生效,POST /rules 不开放改此项。
权限预设也可在 profile 的 cordis.patch.yml 中添加 auto-approve 预设(预设表在配置构造时冻结)。
审查视图与撤销¶
会话右侧「审批」tab 提供审批历史:文件 chip 可看改动 diff(改动前快照 vs 当前文件);底部「撤销此改动」恢复审批前状态;每个 hunk 可「撤销此块」。撤销走 AI 执行与正常审批瀑布,非程序直接写盘,并用锚点核对行号。已撤销记录在 reverts.jsonl,重复撤销返回 409;已撤销块置灰不可再点。
适用场景与注意¶
适合:希望在 DSH Web 侧统一「沙箱内静默 + 越界可学习 + 硬风险与 fail-safe 永不过线」的团队或个人;需要从 fork 版获得修复后的 Session 预设判定、正则 DENY 层与受限规则 API 的用户。
注意:
learning.enabled=false时学习路径关闭,相关请求按规则转人工。- 分类器输出需符合 README 所述双协议(JSON
verdict或SAFE/RISKY:<category>),否则 fail-safe。 - 目录页星标等元数据以 SkillHub / GitHub 页面为准(撰写时 GitHub 星标为 0)。
设计细节见仓库 docs/specs/2026-09-06-dsh-approval-core-design.md。
结尾¶
dsh-approval-core 把自动审批做成一条可审计、可回滚、可清空学习的管道:例行越界在约束下可沉淀为放行,危险与不确定一律人工。若要安装或看分类说明,可打开 SkillHub 目录页 与 GitHub 仓库。