dsh-stall-guard:下载卡住时自动中止,并把换源提示交给智能体

前言

在 DSH 里让智能体拉依赖、克隆仓库时,国内访问 GitHub 等源经常时通时不通。命令挂在那儿几分钟没有输出,智能体往往会一直等到超时或放弃,中间既浪费轮次,也容易误判成「命令写错了」而去改无关参数。

dsh-stall-guard(卡顿守卫)针对的是工具执行层:识别下载类命令,在独立超时预算内没有进展就中止,并把一段结构化、面向智能体的「换源重试」说明写进工具结果。提示来自内置文案或你在面板里配置的占位符模板,不调用任何模型。

这是什么

  • 仓库: 1250589385/dsh-stall-guard
  • 维护者:1250589385
  • 分类:工作流(DeepSeek Harness 社区插件目录)
  • 许可:MIT

一句话:下载卡住 → 掐掉 → 把换源提示写给智能体(事中处理),与事后解释失败原因的 dsh-turn-doctor、LLM 层换 provider 的 dsh-llm-fallbacks 等插件职责不同。

核心能力

下载检测与中止

插件监视 shell 里的下载类命令。超过 downloadSeconds(默认 30 秒)仍无完成迹象时中止命令,并在工具结果里写入说明,而不是仅返回干巴巴的 timeout。

提示里通常会包含:

  1. 卡在什么目标(例如 git repository github.com/...)、阈值与实际耗时。
  2. 说明更可能是到源的网络问题,而非命令语法错误。
  3. 按渠道给出的换源候选(镜像列为候选,文档明确未逐一验证可用性)。
  4. 被中止的 git clone 可能留下半成品目录,重试前需删除或换空目录。
  5. 附上原始命令,便于智能体无需回翻上下文。

覆盖的渠道(节选)

渠道 认得出的命令示例 换源提示方向
git git clone、git fetch、git pull、git submodule update 等 代理前缀、insteadOf、tarball
npm 系 pnpm install、npm i、yarn add、bun 等 --registry https://registry.npmmirror.com
pip pip install、pip download、uv sync 清华等 PyPI 镜像
cargo / go cargo install、go get 等 常见 crates / Go 代理
http curl、wget、aria2c 等 换主机、gh-proxy、断点续传

curl --version、git status、git log 等本地查询不会被当成下载,避免误报。

其他工具类型的超时策略

除下载外,插件还对 web_fetch、web_search、读写、执行等场景设默认秒数。下载使用独立预算,不占用普通 exec 的 30 秒。写入类操作超时只提示、不中止,避免写坏用户文件;普通 bash 非下载命令同样不强行中止。

默认阈值(可在配置中调整):

类型 默认秒数 卡住后
下载 30 中止 + 换源提示给智能体
web_fetch 15 中止 + 建议改用搜索
web_search 15 中止 + 重试一次
读取 20 只提示
写入 30 只提示,不中止
执行 30 只提示(若判定为下载则按下载处理)
长任务 120 只提示

Token 与模型

守卫逻辑、计时、本机轮询 state.json、状态栏文案均不调用模型。进入智能体上下文的主要是卡顿时的换源提示(文档估算约 195–325 token/次,仅在真卡住时产生)。插件不提供「用模型生成提示」选项。

监督员 UI(次要)

会话头可显示监督员形象(点、图标或圆鲸鱼 avatar),卡顿时有视觉反馈;可关显示但守卫仍工作。文案来自内置中英文表,切换界面语言时已在屏上的提示会跟着改。外观偏好存浏览器 localStorage,不同步到 Host 配置。

安装与启用

在已安装 DSH CLI 的环境下,对指定 profile 添加插件:

dsh plugin --profile <你的profile> add dsh-stall-guard

桌面版常见 profile 可通过环境变量查看:

$env:DSH_PROFILE   # 桌面版一般是 desktop

安装后刷新页面即可,默认生效,无需额外配置。

配置

在面板中通过监督员形象打开设置,或编辑 $DSH_HOME/stall-guard/config.json。示例结构如下:

{
  "version": 1,
  "enabled": true,
  "watchDownloads": true,
  "downloadSeconds": 30,
  "timers": { "fetch": 15, "search": 15, "read": 20, "write": 30, "exec": 30, "long": 120, "other": 30 },
  "overrides": { "web_fetch": 45 },
  "autoSwitch": true,
  "scenes": {
    "download": { "enabled": true, "seconds": 30 },
    "fetch": { "enabled": true, "seconds": 15 },
    "search": { "enabled": true, "seconds": 15 }
  },
  "supervisor": { "show": true, "display": "avatar" }
}

常用项:

  • downloadSeconds:下载超时预算;源慢可调大,希望更快换源可调小。
  • watchDownloads: false:关闭下载专项检测,下载命令按普通 exec 处理(只提示不中止)。
  • overrides:为单个工具单独设秒数。

面板还支持为「下载 / 抓取 / 搜索」三个场景自定义发给智能体的原文,用 {{label}}、{{command}}、{{hints}} 等占位符替换;留空则使用内置文案。自定义预设仍会追加清理半成品目录的提醒。

典型用法与预期行为

智能体执行例如:

git clone https://github.com/nodejs/node.git

若 30 秒内未完成,工具结果中会收到类似下面的说明(节选,实际以运行环境为准):

下载卡住了:git repository github.com/nodejs/node.git 在 30 秒内没完成(已经跑了 30 秒,已中止)。

这条命令被终止了。原因多半是到这个源的网络不通,而不是命令本身写错。
换一个源重试,不要用同一个源继续硬等:
1. 在 GitHub 地址前加代理前缀,例如 https://gh-proxy.com/https://github.com/<owner>/<repo>.git
...

智能体应换源或 tarball 等方式重试,并在重试前处理可能残留的目录。

用户侧状态栏可能出现简短中文提示,例如:「下载 30s 没完成,已中止,换源提示已交给智能体。」

适用场景与注意

适合:经常让智能体执行 git clone、pnpm install、pip install、curl 拉取资源,且网络到境外源不稳定的环境。

兼容性(据 README):需要 tools/execute waterfall 和 webServer;无 webServer 时守卫仍工作,只是没有面板。不注册工具、不占工具名;使用 slot conversation.session.header.utilities。

安装前:插件随当前 DSH 进程权限执行,安装前应自行查看 GitHub 源码 与 MIT 许可证。社区目录 SkillHub 插件页 为独立站点,与 DeepSeek / 幻方无官方从属关系。

隐私(据 README):配置写在本地 ~/.dsh;卡顿记录仅在内存、最多 10 条,重启清空。

结尾

dsh-stall-guard 把「下载挂死」从长时间空等变成可操作的换源指令,且全程不消耗模型 token。若你的工作流里智能体频繁拉 GitHub 或包管理器源,可以按上文命令装入对应 profile 试用。

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

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

Xiaoye