dsh-ops-guard:在 pre-execute 层强制下载走 aria2、文件名搜索走 Everything

前言

在 DeepSeek Harness(DSH)里跑智能体时,常见两类「写在技能里、运行时却没人遵守」的规则:大文件下载应走本机 aria2 引擎,按路径找文件应走 Everything 而不是内置 glob。提示词只是建议,模型仍可能用 curl -o、wget -O 或内置 glob,速度和可观测性都会差一截。下面介绍社区插件 dsh-ops-guard(维护者 BeiWay1145,分类 admin-security),它把上述建议变成 tools/pre-execute 上的运行时裁决。

这是什么

dsh-ops-guard 是 DSH 插件,监听 cordis 的 tools/pre-execute 钩子(waterfall 模式),在 shell 与 glob 真正执行前拦截并处置:

守卫 规则 替代通道
下载守卫 大文件下载必须走 aria2 随包脚本 aria2-dl.cjs → aria2-next(Motrix Next)
搜索守卫 按路径找文件必须走 Everything Everything 常驻 IPC(\\.\PIPE\Everything IPC)

两者拦截点相同,拦截后的处理不同,这是插件设计的核心:

  • 下载守卫:拒绝执行,并在拒绝理由里给出可复制的 aria2 命令(下载有副作用,守卫不能替模型执行)。
  • 搜索守卫:拒绝执行内置 glob,但在拒绝理由里直接返回 Everything 的查询结果(只读查询,守卫在 DSH 进程内走 IPC 算完再返回)。

仓库:https://github.com/BeiWay1145/dsh-ops-guard
社区目录页:https://www.skillhub.cn/plugins/BeiWay1145/dsh-ops-guard

为什么需要运行时守卫

下载:shell 命令与 aria2 脚本在形态上无法区分

README 记载:同一条约 4.76 GB 镜像,aria2-next 通道实测约 11.78 MB/s,而用 node 单连接 https 的绕过通道约 0.13 MB/s,断点续传能力也不一致。agent 只要手边有 download.cjs,在 shell 里执行 node download.cjs 与走 aria2-dl.js 看起来一样,没有机制在提示词层区分,因此需要在 pre-execute 拒绝 curl -o、wget -O 等落盘下载。

搜索:内置 glob 能用,模型没有动力换 Everything

内核 glob 可用时,模型没有理由主动用 Everything。规则必须落到运行时;守卫在 IPC 可用时用索引回答,成本主要是 IPC 往返(Everything 进程已常驻),而不是每次启动 ripgrep/glob 遍历目录树。README 中的 bench/scope-latency.mjs 数据表明:在多种搜索范围下,守卫相对内置 glob 的中位延迟更低(例如整盘级路径 D:\VibeCoding 量级差异 README 记为约 68 倍)。Everything 是文件名索引,不是内容索引;刚创建的文件可能有约数秒索引延迟,且内容搜索需用户显式开启——因此守卫只拦 glob,不拦 grep。

拦截规则与放行边界

会拦截的情况

规则 触发 处置
curl-output curl -o / -O 拒绝 + aria2 命令
wget-output wget -O 拒绝 + aria2 命令
invoke-webrequest-outfile Invoke-WebRequest -OutFile 拒绝 + aria2 命令
bits-transfer Start-BitsTransfer 拒绝 + aria2 命令
glob 内置 glob 工具 拒绝 + 实际搜索结果

必须放行的例子

  • curl https://api.x/data:输出到 stdout,不落盘。
  • Invoke-RestMethod 等不落盘请求。
  • 非 shell 工具、grep(内容搜索仍走内置工具)。
  • 拒绝理由中会说明 grep 未被拦截,避免模型误绕路。

管道或 Everything 不可用时,搜索守卫会回落为「给命令」模式(searchDenialMessage),避免因守卫本身让搜索完全失效。

安装与启用

官方安装命令(来自 README):

cd ~/.dsh && dsh plugin --profile <your-profile> add "dsh-ops-guard@github:BeiWay1145/dsh-ops-guard"

安装后重启 DSH 生效。搜索守卫要求本机运行 Everything(含 es.exe);下载守卫要求本机运行 aria2-next 引擎(Motrix Next 内置),随包脚本通过 JSON-RPC 与之通信,不依赖 aria2c.exe。

插件以当前 DSH 进程权限运行;安装前请自行查看仓库源码与 MIT 许可证(package.json 版本 0.1.0,要求 Node >= 20)。

典型用法

被拦截的下载:按拒绝理由改用 aria2-dl

拦截后模型会看到类似说明:下载必须走本机 aria2,并给出随包脚本的绝对路径(由 import.meta.url 解析),URL 会从被拦命令中自动提取。可直接在终端使用:

node scripts/aria2-dl.cjs <url> --out=<文件名> [--dir=<目录>] [--no-wait]
node scripts/aria2-dl.cjs --status <gid>
node scripts/aria2-dl.cjs --list

环境变量(README 记载):

变量 默认 说明
ARIA2_RPC_PORT 16800 引擎 RPC 端口
ARIA2_RPC_TIMEOUT_MS 15000 RPC 超时
ARIA2_DOWNLOAD_DIR 用户 Downloads 目录 默认落盘目录

引擎未启动时脚本会明确报错,而不是静默失败。

被拦截的 glob:结果已在拒绝理由中

搜索守卫不会让模型再跑一次 glob;拒绝文本中包含匹配数量、路径列表、IPC 耗时,以及必要时 es.exe 的示例命令。若需不同查询,可按提示使用与 Everything 相同的模式语言。

工作原理(简述)

模型请求 glob("**/*.md", path: "D:/proj")
    ↓
tools/pre-execute 钩子触发
    ↓
搜索守卫经 Everything IPC 查询 → 拿到结果
    ↓
返回 { kind: 'deny', reason: '<拒绝说明 + 实际结果>' }
    ↓
内置 glob 未执行,模型直接读到结果

下载路径同理:pre-execute 只能 allow/deny/ask/cancel,无法改写调用,故下载侧采用「拒绝 + 完整替代命令」。

适用场景与已知边界

适合:希望在 DSH 会话内统一大文件下载到 Motrix Next / aria2-next,并强制文件名搜索走 Everything IPC 的团队或个人;与「一切皆插件」的 DSH 生态一致,插件来自社区目录 SkillHub,与 DeepSeek / 幻方无官方从属关系。

注意:

  • 拦不住命令内部的下载(例如 python script.py 内 urllib);DSH 外终端里的 curl -o 不受影响。
  • Everything IPC 协议未公开,版本变更可能导致守卫回落为「给命令」模式。
  • 新写入磁盘的文件可能短暂查不到;内容搜索请继续使用 grep。

结尾

dsh-ops-guard 把 aria2 下载与 Everything 文件搜索从「技能建议」收束为 pre-execute 上的强制策略,并用「拒绝 + 命令」与「拒绝 + 结果」两种处置区分副作用操作与只读查询。如需安装或 issue,见 GitHub 仓库 与 SkillHub 目录页。

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

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

Xiaoye