dsh-automode:给 DeepSeek Harness 加一个带确定性护栏的 auto mode

前言

让 agent 连续跑任务,权限上通常只有两种选择:要么用保守预设,每一步写操作都停下来等人确认;要么直接切到 danger-full-access,速度快了,但 agent 想做什么就做什么,出了事没有闸门。DeepSeek Harness(DSH)的权限预设——read-only、workspace-write、danger-full-access——都在这两端,中间缺一档「放得开、但危险动作有人拦」。

下面介绍的 dsh-automode 补的就是这一档:它是一个 DSH 插件,提供 Claude Code 风格的 auto mode,让 agent 免手动运行,由确定性护栏和一个成本感知的审查器拦截危险操作。

这是什么

dsh-automode(npm 包 @log.li/dsh-automode)是 GitHub 用户 log-li 维护的 DSH 插件,MIT 许可证。一句话定位:Claude Code–style auto mode for DeepSeek Harness——agent 免手动运行,由确定性护栏和成本感知审查器拦截危险操作。

它插在 agent 和 harness 之间:每个工具调用在执行前先被拦下来。硬性 deny 规则和人工维护的 allowPaths 确定性放行或拒绝,这部分零 LLM 开销;剩下的交给两段式分类器。安全动作自己跑完,有风险的被拦下或转给人工。

安装与启用

先安装插件:

dsh plugin add @log.li/dsh-automode

本地 checkout 调试时,可以指向本地路径:

dsh plugin add ./path/to/dsh-automode

安装后需要重启 dsh web。重启后打开权限选择器(聊天框左下角),会看到 Auto mode 与 read-only、workspace-write、danger-full-access 并列。

会话内有两个命令:

/auto           # 将当前会话切到 auto mode
/auto-status    # 显示诊断信息:预设、审批策略、熔断器状态

工作原理

整体分两层:预执行门拦下所有工具调用做第一轮分拣,需要沙箱升级的调用再走审批瀑布,由分类器裁决。下面按顺序拆开。

预执行门:所有调用的第一道闸

预执行门(pre-execute gate)拦截所有工具调用,按固定顺序处理:

1、只读工具默认放行(命中 deny 的除外);
2、deny 规则(regex)命中即硬拒;
3、allow 规则(prefix-glob)免 LLM 放行;
4、工作目录内的文件操作放行;
5、其余调用按是否需要沙箱升级分流。

注意两点:预执行门只作用于 auto-mode 会话,在 read-only、workspace-write、danger-full-access 等其他预设下是 no-op,不会和你选定的沙箱冲突;审批瀑布只对真正需要沙箱升级的调用运行,其余调用不产生这部分开销。

零确认 allowlist

config.allowPaths 是完全信任区:其中的文件操作和 bash 写命令完全跳过分类器。v0.10.0 起,需要沙箱升级的调用也会经 approval-bridge 自动授予——不弹确认,不往返。适合把常用的外部工作目录加进去,省掉高频确认。

两段式分类器

进入瀑布的动作先过单 token 预筛,只有被标记的才会进入结构化审查;相同动作的判定进缓存,5 分钟内复用,不重复调 LLM。从 0.8.0 起分类器是两态的,只输出 allow 或 reject。

分类器失败时默认 fail-closed(failClosed 默认 true):宁可拒绝,不放行。

熔断器与人工兜底

分类器连续 3 次或累计 20 次输出 DENY,auto mode 暂停,决定权转给人工;人工做出一次决定即恢复,计数重置。这个机制保证出问题时能停下来交还给人,而不是静默跑偏。

审计日志

每一次 allow / deny / bridge 决定都追加写入 ~/.dsh/auto-mode/decisions.jsonl。经过上面的步骤,一个工具调用要么被确定性规则放行或硬拒,要么由分类器裁决,全部留痕,事后可以完整回溯。

规则系统:硬边界与软指引

规则分两层。

第一层是硬边界,确定性执行,不进分类器:

  • deny:regex 模式,命中即硬拒,适合绝不允许发生的操作;
  • allow:prefix-glob 模式,免 LLM 放行,适合完全信任的常规命令。

第二层是分类器指引,以 prose 形式喂给分类器的 LLM:

  • rules.deny:软拒绝描述,分类器将其视为常规拒绝;
  • rules.allow:软放行例外;
  • rules.environment:环境事实,供分类器结合上下文裁决。

三个 rules.* 数组都支持 $defaults:在列表里带上 "$defaults" 这一项,就保留内置规则并追加你的自定义项。

配置

配置写在 profile 的 cordis.patch.yml。所有配置项都有默认值,空 {} 配置也有效。常用项:

  • allowPaths:零确认 allowlist 的目录列表;
  • readOnlyTools:默认放行的只读工具集合;
  • allowInsideWorkingDirectory:工作目录内文件操作是否免分类器放行;
  • preExecuteGate:预执行门开关(仅作用于 auto-mode 会话);
  • classifier.provider / classifier.model:覆盖分类器的 LLM 路由;
  • classifier.reasoningLevel:分类器推理档位,默认 off;
  • rules.deny / rules.allow / rules.environment:分类器的软拒绝、软放行、环境事实指引;
  • failClosed:默认 true,分类器失败时拒绝;
  • timeoutMs:调用超时上限,默认 45000 毫秒。

适用场景与注意

适合谁:想让 agent 长时间免确认跑任务、又不放心直接开 danger-full-access 的 DSH 用户。硬规则挡住明确危险的操作,allowPaths 免掉高频信任操作的确认,分类器兜住剩余的不确定动作,熔断器保证出问题时停下来交还人工。

用之前有几点必须清楚:

1、这不是沙箱。插件运行在 DSH 进程内,以当前 dsh 进程的权限工作,一个刻意作恶的插件能做你的用户账户能做的一切。dsh-automode 减少的是不安全的自主工具调用,它不是 OS 安全边界。

2、安装任何第三方插件前,建议先读一遍源码、确认许可证。dsh-automode 采用 MIT,仓库地址在文末。

3、DSH 的理念是「一切皆插件」,本文提到的插件目录是社区维护的独立站点,与 DeepSeek、幻方没有官方从属关系。

小结

dsh-automode 把「要不要放手让 agent 跑」从二选一变成了可调的梯度:确定性规则处理确定性的事,成本感知的分类器处理不确定的事,熔断器和审计日志兜底。想在 DSH 上跑 auto mode 的,可以从这两处开始:

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜