前言¶
让 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 的,可以从这两处开始: