前言¶
DSH 提供了两种与文件系统交互的路径:一是 ctx.fs 以及配套的 read/write/edit 工具,它们只有 stat/read/list/write/edit,没有删除能力;二是通过 shell 工具(pwsh / bash)执行命令,但子进程以 Low integrity 运行,无法在 DSH 的家目录等高完整性目录中写入或删除文件。在 Windows 上,这就意味着很多需要操作宿主机文件系统的场景无法实现。
插件可以以宿主进程的身份运行,拥有与用户相同的完整性级别。dsh-host-fs 利用这一点,在宿主进程中直接调用 node:fs 的删除与移动接口,填补了 DSH 自身文件工具缺失的删除能力,也解决了 shell 工具因安全隔离而无法访问工作区外目录的问题。
是什么¶
dsh-host-fs 是一个为 DSH(DeepSeek Harness)编写的插件,由维护者 sniperdown 提供。它将 fs_remove 和 fs_move 两个文件操作工具注入到 DSH 会话中,支持在宿主进程内删除与移动文件,包括工作区之外的路径。插件自带会话闸门与路径闸门,默认拒绝所有访问,需要显式配置后才能使用。
核心功能¶
- 在宿主进程中执行文件删除与移动操作
- 工具名称:
fs_remove、fs_move - 命令:
/fs-acl(查看当前会话与已加载的配置) - 会话闸门:通过
sessionMode与sessionList控制哪些会话可以使用工具 - 路径闸门:通过
pathAllow与pathDeny限制可访问的目录 - 一键审批:当路径不在白名单与黑名单中时,可通过 DSH 的审批 API 进行一次性放行(
askOutside)
安装与启用¶
安装方式可以从 npm(待发布)、Git 仓库或本地检出中任选其一:
# 从 npm 安装(插件发布后可用)
dsh plugin --profile <name> add dsh-host-fs
# 从 Git 仓库安装
dsh plugin --profile <name> add github:sniperdown/dsh-host-fs
# 从本地检出安装
dsh plugin --profile <name> add link:/absolute/path/to/dsh-host-fs
安装后需要重启 DSH 一次,插件才会在加载时导入。
配置¶
安装完成后,在 DSH 的设置页面进入「Plugins」→「Files」选项卡(或进入插件「dsh-host-fs」对应的设置页)。主要配置项包括:
sessionMode:会话闸门模式,可选off、allowlist、denylist、all,默认off(无人可用)sessionList:允许或拒绝的会话列表,每行一个,支持精确 id、前缀通配符(如qq-*)、预设(preset:example)或通配符*pathAllow:白名单,每行一个路径,该路径及其所有子路径均被允许pathDeny:黑名单,同样每行一个路径,优先级高于白名单askOutside:当路径既不在白名单也不在黑名单中时,是否通过 DSH 的审批 API 请求一次性放行,默认true
配置保存时会一次性写入到配置中,单独勾选不会持久化。
工具使用¶
fs_remove¶
在允许使用的会话中调用 fs_remove,参数如下:
path:要删除的路径(字符串,必填),可以是绝对路径,相对路径则相对于会话工作目录解析recursive:是否递归删除非空目录(布尔值,必填)dryRun:仅测量并报告,不实际删除(布尔值)
返回值包含 { path, kind, entries, bytes, dryRun, approved },其中 kind 为 file/dir/link/other/missing。如果路径不存在,kind 为 missing,不会抛出错误。
fs_move¶
fs_move 用于移动文件或目录,参数包括:
from:源路径(字符串,必填)to:目标路径(字符串,必填)overwrite:是否覆盖已存在的目标(布尔值)dryRun:仅报告,不实际移动(布尔值)
插件会自动创建缺失的父目录,拒绝将目录移动到其自身的子树中,跨盘移动时则转为复制后再删除。
/fs-acl¶
在会话中输入 /fs-acl 可以查看当前会话的 id、预设、工作目录以及当前加载的配置。报告还会给出一行可直接放入 sessionList 以放行当前会话的示例。
适用场景与注意¶
- 适合需要在 DSH 中直接删除或移动宿主机文件(尤其是工作区外路径)的场景
- 需要配合会话闸门与路径闸门使用,默认安全关闭,建议先以
dryRun: true测试 - 插件以宿主进程权限运行,请确保从可信来源安装并检查许可证
- 在 Windows 上,junction 的检测与删除行为有特殊处理,请参考插件 README 中的说明
小结¶
dsh-host-fs 通过在 DSH 宿主进程中直接调用文件系统接口,补齐了 DSH 自身文件工具在删除与移动方面的空白,同时为 shell 工具无法访问的目录提供了可行方案。借助会话与路径的双重闸门,它可以在安全与能力之间取得平衡。