DSH(DeepSeek Harness)默认采用沙盒机制,Agent 在非工作区目录进行写入时,常陷入“拒绝访问 → 升级重试 → 手动审批”的循环。dsh-fs-allowlist 插件旨在解决这一痛点,通过拦截写操作,允许对配置的白名单目录进行免审批访问,同时提供设置界面和 Bash 命令的自动批准功能。
核心功能¶
该插件主要解决两类写入场景的审批问题:
- 文件工具(write/edit):包装了
ctx.fs.checkedTarget沙盒拦截器。当目标路径位于白名单根目录下时,请求会直接通过,无需触发人工审批流程。 - Bash 命令:利用
tools/pre-execute监听命令文本,结合approval/request答案机制。若 Bash 命令文本或升级理由中包含白名单路径(支持递归匹配),系统将自动批准该次执行,不再弹出审批窗口。
安装与启用¶
使用官方命令安装插件到 web 配置文件:
dsh plugin --profile web add "github:wzn16/dsh-fs-allowlist#main"
安装后,需重启 DSH Desktop 才能生效。修改源码目录后同样需要重启。
配置与用法¶
1. 设置界面管理¶
推荐使用图形界面配置。在 DSH Desktop 中进入设置,找到“Plugins”选项卡下的“Directory Allowlist”,添加需要免审批写入的目录路径。
2. 配置文件编辑¶
也可以直接编辑配置文件 $DSH_HOME/fs-allowlist.json。文件格式如下:
{
"extraWritableRoots": [
"/Users/you/ObsidianVault"
],
"bashAutoApprove": true
}
extraWritableRoots:定义白名单目录。bashAutoApprove:控制是否自动批准 Bash 命令,默认为true。
配置支持热重载,界面修改即时生效,手动修改配置文件通常在 3 秒内被识别。
工作原理¶
写入层¶
DSH 的写入操作默认经过 dsh-fs-sandbox 挂载的 ctx.fs.checkedTarget 拦截器。本插件挂载在该拦截器之上:
- 命中白名单:使用 realpath(解析后的绝对路径)检查目标是否在白名单根目录下,命中则放行。
- 未命中:委托给原始拦截器,维持原有的拒绝/审批逻辑。
Bash 层¶
Bash 运行在 Seatbelt 进程沙盒中,插件无法扩展其配置。因此采用启发式匹配:
1. 在 tools/pre-execute 阶段记录命令文本。
2. 在审批请求阶段,解析命令文本和理由,展开 ~ 符号。
3. 递归检查是否包含白名单路径。若匹配,自动回复 allowed-once。
注意事项¶
- 许可证:采用 MIT 许可证。
- Bash 启发式限制:自动批准依赖于命令文本和理由中包含白名单路径。若两者均不匹配,系统会回退到人工审批(这是安全机制)。
- 内部依赖风险:插件依赖 DSH 内部的
ctx.fs.checkedTarget接口(seam)。若 DSH 进行版本升级并重构了该接口,插件行为可能退化,表现为透明(等同于未安装)。 - 安全风险:白名单项意味着 Agent 可无询问写入,请务必保持列表精简。
- 配置缺失处理:若配置文件缺失、内容为空或格式无效,插件行为等同于卸载,不会破坏现有会话。