🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

审批决策管道 lyaoliu/dsh-approval-core

DeepSeek 客户端
lyaoliu39 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

例行操作自动放行,危险请求转人工审核

29.6/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/29 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/lyaoliu/dsh-approval-core.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 39 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 32 处,展示前 19 条)
  • 读取本地文件
    src/index.mjs:80
    const buf = readFileSync(absPath)
  • 读取本地文件
    src/index.mjs:88
    try { return readdirSync(dir) } catch { return [] }
  • 读取本地文件
    src/index.mjs:91
    try { return statSync(absPath).size } catch { return 0 }
  • 删除本地文件
    src/index.mjs:94
    rmSync(absPath, { force: true })
  • 读取本地文件
    src/index.mjs:101
    const data = JSON.parse(readFileSync(absPath, 'utf8'))
  • 读取本地文件
    src/index.mjs:119
    if (existsSync(abs)) return abs
  • 写入本地文件
    src/index.mjs:154
    mkdirSync(SNAPSHOTS_DIR, { recursive: true })
  • 写入本地文件
    src/index.mjs:155
    writeFileSync(join(SNAPSHOTS_DIR, String(eventId) + '.json'), JSON.stringify({ eventId, sessionId: String(sessionId || ''), cwd: cwdUsed, snapshots },
  • 读取本地文件
    src/index.mjs:164
    const raw = readFileSync(join(SNAPSHOTS_DIR, String(eventId) + '.json'), 'utf8')
  • 写入本地文件
    src/index.mjs:218
    appendFileSync(join(DATA_DIR, 'reverts.jsonl'),
  • 写入本地文件
    src/index.mjs:448
    appendFileSync(EVENTS_PATH, JSON.stringify(ev) + '\n', 'utf8')
  • 写入本地文件
    src/index.mjs:531
    try { mkdirSync(DATA_DIR, { recursive: true }) } catch { }
  • 写入本地文件
    src/index.mjs:555
    writeFileSync(path, JSON.stringify(data, null, 2) + '\n', 'utf8')
  • 发起网络请求
    client.js:193
    return fetch(q, { headers: { 'cache-control': 'no-cache' } }).then(function (r) {
  • 发起网络请求
    client.js:345
    fetch('/api/auto-approve/diff?eventId=' + eventId + '&path=' + encodeURIComponent(path), { headers: { 'cache-control': 'no-cache' } })
  • 发起网络请求
    client.js:353
    fetch('/api/auto-approve/reverts?eventId=' + eventId, { headers: { 'cache-control': 'no-cache' } })
  • 发起网络请求
    client.js:373
    fetch('/api/auto-approve/revert', {
  • 发起网络请求
    client.js:413
    fetch('/api/auto-approve/revert', {
  • 发起网络请求
    client.js:543
    fetch('/api/auto-approve/snapshots-stats' + q, { headers: { 'cache-control': 'no-cache' } })
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 例行操作自动放行
  • 危险请求转人工
  • 分级配置界面
展开完整介绍(123 字)↓

DeepSeek Harness 自动审批决策管道:例行沙箱越界自动放行,危险/拿不准/失败一律转人工(fail-safe);学习受约束可一键清空;含分级配置 UI 与块级撤销审查视图。fork 自 dsh-approval-gate 的加固版。

README

由 DeepSeek 最新模型翻译生成
dsh-approval-core 自动审批决策管道:例行放行、危险转人工(fail-safe),学习受约束。 设计文档见 docs/specs/2026-09-06-dsh-approval-core-design.md。 安装 dsh plugin --profile web add ./dsh-approval-core 配置(v0.2.0 恢复受限规则 API) 规则、阈值与学习开关既可以编辑配置文件,也可以通过受限的 HTTP 接口修改: - $DSH_HOME/auto-approve/allowlist.json:denyKeywords / allowRules / denyRules / hardCategories / riskyThreshold / judgeTimeoutMs / learning / dataDir / classifierModel。保存后自动生效(每次审批前热读盘,无需重启;其中 dataDir 变更需重启);其中 denyKeywords 的正则危险清单在插件加载时编译,变更需重启 dsh web。 - 权限预设:直接在 profile 的 cordis.patch.yml 中添加 auto-approve 权限预设(预设表在配置构造时冻结,无法自动扩展)。
展开完整文档(README 剩余 1 节)
dsh-approval-core

自动审批决策管道:例行放行、危险转人工(fail-safe),学习受约束。

设计文档见 docs/specs/2026-09-06-dsh-approval-core-design.md。

安装

dsh plugin --profile web add ./dsh-approval-core

配置(v0.2.0 恢复受限规则 API)

规则、阈值与学习开关既可以编辑配置文件,也可以通过受限的 HTTP 接口修改:

- $DSH_HOME/auto-approve/allowlist.json:denyKeywords / allowRules / denyRules / hardCategories / riskyThreshold / judgeTimeoutMs / learning / dataDir / classifierModel。保存后自动生效(每次审批前热读盘,无需重启;其中 dataDir 变更需重启);其中 denyKeywords 的正则危险清单在插件加载时编译,变更需重启 dsh web。
- 权限预设:直接在 profile 的 cordis.patch.yml 中添加 auto-approve 权限预设(预设表在配置构造时冻结,无法自动扩展)。

HTTP 接口:

- GET /api/auto-approve/rules — 只读展示(配置 + 学习状态 + 预置清单 + 各 kind 的 permission 级别,供 UI 渲染)。
- POST /api/auto-approve/rules — 受限写接口,服务端两级校验:classifyOp(四级权限矩阵:free/confirm/forbidden)→ validateValue(结构与范围)。forbidden 返回 403,校验失败返回 400。hardCategories 永远 forbidden;删除预置项 forbidden;danger-full-access 不可加入白名单。
- 其余只读查询(GET events / GET diff / GET snapshots-stats)与两种非规则操作(POST revert、POST snapshots-clear)。

dataDir(可选,绝对路径):把 learning.json / audit.log / events.jsonl / snapshots 迁到自定义目录(如 D:\data\dsh-approval)。仅接受绝对路径,相对路径视为配置错误回退默认(fail-safe)。迁移方式:手动把旧文件拷到新目录;allowlist.json 本身始终留在默认目录(它声明了 dataDir)。修改 dataDir 需重启 DSH Desktop 生效(路径在插件加载时解析;allowlist.json 的其它字段热读,无需重启)。

配置 UI 权限分级

设置页按四级权限渲染每个配置项;安全边界在服务端 classifyOp + validateValue,UI 确认框只是体验层:

| 级别 | 配置项 | 交互 |
| 🟢 只读 | 管道总览、学习进度、数据目录、分类模型 | 仅展示,无写控件 |
| 🟡 自由改 | riskyThreshold(1-20)、judgeTimeoutMs(5s-120s) | 直接改,服务端范围校验(400) |
| 🟠 确认改 | 加黑名单词 / 加白名单规则 / 删除自定义项 | 弹确认框后提交 |
| 🔴 UI 禁改 + 服务端 403 | 硬风险类别、删除预置项、danger-full-access 加白 | UI 无控件;绕过 UI 直发请求也被服务端拒绝 |

分类模型

allowlist.json 加 "classifierModel": {"provider": "...", "model": "..."} 指定 flash 分类器模型,优先于会话默认模型(优先级:显式配置 > 会话默认模型 > 内置回退)。改文件即生效,POST /rules 不开放修改(避免 UI 误配烧 token);配置不合法时自然回落会话默认模型。

行为(真机验证 2026-09-07, DSH Desktop 2.0.5 / 0.1.2-rc.1)

| 场景 | 行为 |
| 工作区内写文件 | 沙箱直接放行(不经过审批瀑布),零打扰 |
| 越界请求(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) |

数据文件($DSH_HOME/auto-approve/,可通过 dataDir 迁移):

- allowlist.json — 规则与配置(人工编辑,热读生效)
- learning.json — 学习状态(独立于主白名单,可一键清空)
- audit.log — 每次判定的决策审计(DENY/ALLOW/RISKY/OUTCOME/LEARN)
- events.jsonl — 审查 UI 轮询用的事件流(自动放行提示条 + 审批历史视图)
- reverts.jsonl — 已执行撤销的记录(事件 + 块指纹 + 时间),服务端持久去重

审查视图与撤销

审批历史视图(会话右侧「审批」tab)提供:

- 文件改动 diff:点事件的文件 chip 查看红删绿增对比(改动前快照 vs 当前文件)
- 整文件撤销:面板底部「撤销此改动」,投递"恢复审批前状态"指令
- 块级撤销:每个改动块(hunk)末尾「撤销此块」,只撤该块、其余保留;指令为两步式(删除新增行 / 恢复删除行)+ 定位锚点 + 完成后自查
- 撤销去重:reverts.jsonl 持久记录已撤销的(事件+块);重复撤销返回 409 红字提示;已撤销的块重开面板显示「已撤销」置灰不可点
- 撤销走 AI 执行(非程序直接写文件):走正常审批瀑布、留会话痕迹、动手前以锚点核对行号防漂移

与上游 dsh-approval-gate 的差异

- 修复:permissionPresets.current(session.events) → current(session)。上游在 0.1.2-rc.1 上传入的 session.events 属性不存在(undefined),导致预设判定必崩、插件从不接管(fail-safe 只表现为"原生弹窗")。本 fork 传入完整 Session 实例,真机验证管道正常接管。
- 加固:关键词 DENY 层替换为 13 条确定性正则危险清单(移植自 dsh-auto-approve)+ denyKeywords 字面量第二层;分类输出严格双协议解析(精确 JSON {"verdict":"approve"|"ask"} 或 SAFE/RISKY:),垃圾输出一律转人工;NOT SAFE/UNSAFE/不确定措辞不再被误判为 safe。
- 学习约束(方案 B):阈值默认 5;沉淀必须指纹强命中;学习态独立存储(learning.json)可一键清空;learning.enabled=false 时全部转人工。
- 安全:v0.2.0 恢复受限版 POST /api/auto-approve/rules——写操作必须通过 configRules.mjs 的 classifyOp(四级权限矩阵)+ validateValue 双重服务端校验;硬类别与 classifierModel 不可经 UI 修改。上游的对应 API 无鉴权全开放。
- 移植上游 0.5.2:① callId 回溯 tool/call 参数拿结构化文件路径(B 层,diff 审查定位更准);② 只读命令假快照过滤 + manual-pending 也存快照 + Windows 盘符路径修复(最后一项超出上游的修复)。
- 测试:49 个 node:test 用例(danger-patterns 7 / classifier 4 / learning 7 / pipeline 7 / config-rules 13 / reverse-hunk 5 / revert-key 6)+ 41 断言 mock 宿主冒烟(含 dataDir 可配、结构化路径、拒绝事件快照场景;本机用 node test/*.test.mjs 进程内执行)。

许可

MIT,见 LICENSE。本项目是 dsh-approval-gate 的 fork,上游版权归属与改动说明见 NOTICE 及上文「与上游 dsh-approval-gate 的差异」。
预览分享卡片长什么样 ↓lyaoliu/dsh-approval-core
分享 · DeepSeek Harness Hub
lyaoliu/dsh-approval-core

例行操作自动放行,危险请求转人工审核

这是你的仓库?认领条目

回到顶部