Back to home

SipengXie2024

dsh-auto-approval

LLM-gated auto approval for DeepSeek Harness: a model judges every approval ask first, low-risk operations pass without prompting (fail-closed)

Stars
0
Language
TypeScript
Created
Aug 15, 2026
Updated
Aug 15, 2026

Introduction

dsh-auto-approval

English: An LLM-gated auto-approval plugin for DeepSeek Harness (dsh). It adds an "auto" stance on top of dsh's four permission presets: every operation that would normally pop an approval prompt is first judged by your current default model — low-risk operations proceed without interrupting you, anything doubtful still asks. Fail-closed by design: judge errors, timeouts, and unparseable replies always fall back to the human. See 安装与使用 below (Chinese).


一个给 DeepSeek Harness(dsh)加「Auto 审批模式」的插件。

dsh 自带四种权限模式(Read-only / Workspace / Write / Full Access),但「要不要弹窗问用户」这件事只有 ask / never 两档。这个插件加了第五种姿态:每次要弹窗的操作,先由你当前选用的模型判定风险——明确安全的直接放行,拿不准的照常问你。思路与 Codex 的「替我审批」、Claude Code 的 auto 模式一致,但实现完全走 dsh 自己的审批管线。

工作原理

工具调用需要审批
      │
      ▼
ApprovalService.request()           ← 记 approval/asked 审计事件
      │
      ▼
approval/request 瀑布(本插件 prepend 在链首)
      │
      ├─ Auto 关 → next() → 内置 answerer 弹窗
      ▼
  判定模型(当前默认模型)
  输入:工具名 + 完整参数 JSON + 申请理由 + 工作区路径
      │
      ├─ "approve" → 返回 allowed-once,不弹窗,直接执行
      └─ 其他一切  → next() → 照常弹窗(ask / 解析失败 / 报错 / 30s 超时)

两个关键实现细节(都是踩坑换来的):

  • 必须 prepend:approval/request 瀑布里,dsh 内置的 web answerer(dsh-host-apiproxy)在启动时注册,认领请求时不调 next()——正常 append 的监听器永远轮不到执行。本插件以 ctx.on('approval/request', fn, true) 插到链首。
  • 参数是旁路缓存的:ApprovalRequest 只带 toolName / callId / reason,不带工具参数。插件另挂 tools/pre-execute 观察者,按 callId 缓存每个调用的参数快照,判定时拼进 prompt。

审计不受影响:approval/asked + approval/decided 由 ApprovalService 自己记录,无论谁认领。

安全边界

  • 不改变沙箱:Read-only 模式下该被沙箱拦的操作照样被拦;Auto 只接管「本来要问你」的那一步。
  • fail-closed:判定模型报错、超时(默认 30s)、返回无法解析的内容、或回答 ask——全部落到你熟悉的弹窗。
  • 判定每次调用消耗一点额外 token(用的就是你当前会话的模型)。

安装与使用

从 Release 安装(推荐)

# 下载 release 里的 dsh-auto-approval-<version>.tgz,然后:
dsh plugin --profile web add dsh-auto-approval-<version>.tgz
# 重启 dsh

从源码构建

git clone https://github.com/SipengXie2024/dsh-auto-approval.git
cd dsh-auto-approval
npm install
npm run build    # tsc(host)+ tsdown(client 闭包工厂 bundle)
npm pack         # 产出 dsh-auto-approval-<version>.tgz
dsh plugin --profile web add dsh-auto-approval-<version>.tgz
# 重启 dsh

使用

  • 输入框工具排(权限模式开关旁)有 Auto 药丸,点一下开关;
  • 「设置 → Auto 审批」页有完整面板:开关、见证/放行/转人工/判定失败四项统计、带理由的判定记录、清空按钮;
  • 默认开启(config enabled: true)。想默认关:在 profile 的 patch 里给 auto-approval 行加 config: { enabled: false }

配置项

默认说明
enabledtrue启动时是否开启 Auto 模式
judgeTimeoutMs30000判定调用超时,超时转人工
judgeMaxTokens256判定输出预算

适用与局限

  • 目前判定路由跟随会话的默认模型(provider/model),暂未支持单独指定一个小模型;
  • 判定偏保守是设计使然:只有模型明确说 approve 才放行。在低权限模式下,会触发审批的操作大多是提权类,天然落在「转人工」区间——Auto 的价值是筛掉重复的低危确认,不是替你点掉所有弹窗;
  • 插件作用于整个进程:对本进程所有会话(含子 agent)的审批生效。

相关

  • 灵感:Codex 的 agent-approved 模式、Claude Code 的 auto 模式;
  • 工程骨架参照 dsh-memory-hermes 的打包姿势(tsc + tsdown 闭包工厂 client bundle + dsh.bundle.patch)。

License

MIT