dsh-autoupdater:空闲窗口内的 DSH 与插件定时更新

前言

跑 DeepSeek Harness(DSH)时,本体和插件版本会随 npm 发布变动。手动逐个 npm update 或盯着 changelog 既费时间,也容易在有人正在用 Agent 时重启服务。社区里已有若干「自检升级」类插件,侧重点各不相同:有的只关心 Harness 本体,有的用会话状态判断是否在忙——实测 turn 结束后 agent.status 仍可能长时间停在 running。

下面介绍 dsh-autoupdater(维护者 niubi6668889595,SkillHub 分类:工作流):在可配置的定时节奏下检查 DSH 本体与已安装插件的更新,并只在判定为「无人使用」的空闲窗口里执行升级或暂存通知,配合 Web 面板改配置、看活动日志。

这是什么

dsh-autoupdater 是 DSH 的自动更新插件(npm 包名 dsh-autoupdater,当前资料中版本 0.6.0,MIT 许可证)。它解决两类问题:

  1. 何时检查:四种调度模式(每日时刻 / 每 N 小时整点对齐 / 每 N 天 / 每 N 分钟)任选。
  2. 何时动手:定时任务触发后,还要满足空闲门槛(会话日志静默 + 无运行中 Agent);手动「立即检查」则只要求此刻无运行中会话。

插件在 插件管理器 内嵌 自动更新 卡片;配置写入本地并热加载,无需重启 DSH 进程即可生效(本体若需重启则另按策略处理)。

目录页:https://www.skillhub.cn/plugins/niubi6668889595/dsh-autoupdater
源码:https://github.com/niubi6668889595/dsh-autoupdater

SkillHub 为社区插件目录,与 DeepSeek / 幻方无官方从属关系;安装前请自行审阅源码与许可证。插件以当前 DSH 进程的用户与权限运行。

核心功能

定时检查

四种 scheduleMode:

  • daily:每天在 dailyTime(默认 "04:30")触发。
  • everyHours:每 N 小时,整点对齐(默认 6,范围 1–168)。
  • everyDays:每 N 天,锚定 dailyTime(默认 1,范围 1–365)。
  • everyMinutes:每 N 分钟(默认 60,范围 1–10080)。

空闲门槛

设计借鉴社区项目 dsh-self-upgrade,用 $DSH_HOME/sessions 下文件的 mtime 判断是否在干活:

  1. 任意会话日志 2 分钟内无写入,且 无运行中 Agent,才视为可更新。
  2. 定时触发时,在触发点之外还要 持续静默 idleSeconds 秒(默认 300),双重采样,避免瞬时空档误判。
  3. 面板手动「立即检查」:只要求此刻无运行中会话,不再等待额外静默。
  4. 探测失败时 保守当作仍在忙,宁可跳过更新也不打断使用。

另可配置 idleTimeoutMinutes(默认 120):单次检查等待空闲的最长时间。

插件批量更新

遍历已安装插件,与 npm 最新版对比;升级时使用显式 包名@版本 安装,并在磁盘上回读验证,避免「假更新」。
限制:仅适用于声明了 dsh.bundle 的 npm 形态插件;从 GitHub 源码安装的插件不做版本比对。

双向白名单

通过 pluginMode 与 whitelist(插件包名列表)组合,语义包括:白名单内只提醒、其余自动;或白名单内自动、其余只提醒;以及全自动、全提醒、关闭等(默认 regexmode-ignore)。具体枚举以 README 与面板为准。

DSH 本体更新

harnessMode 三种策略(默认 notify):

  • off:不处理本体更新。
  • notify:暂存并通知,不自动重启。
  • auto:通知后在 graceMinutes(默认 30)宽限期内自动重启;宽限期内任何会话活动会推迟重启。

npm 全局安装完成后会 校验 dsh 二进制是否存在,缺失则 放弃重启,降低半更新变砖风险。git checkout 形态的本体更新 README 建议改用 dsh-updater。

Web 设置面板与活动日志

配置项可在 插件管理器 → 自动更新 卡片中修改,保存即生效。每次检查、更新、重启会写入可读记录,面板内可查看;磁盘上还有 ~/.dsh/autoupdater/history.jsonl。API 仅写本地 config.json,不修改系统级配置。

安全与默认策略

  • 默认 harnessMode: notify,自动重启需显式改为 auto。
  • 面板 不提供「忽略空闲」开关。
  • 空闲判定基于本机 $DSH_HOME/sessions;远程 SSH 会话不计入。

安装与启用

环境要求:Node >= 20(见 package.json 的 engines)。

从 npm 安装(README 原文):

dsh plugin --profile web add dsh-autoupdater

或从 GitHub(将 <owner> 换为仓库所有者,README 原文为占位形式):

dsh plugin --profile web add github:<owner>/dsh-autoupdater

安装后 重启 DSH。若使用 systemd,例如:

sudo systemctl restart <你的dsh服务名>

然后在 插件管理器 → 自动更新 卡片中完成配置。

配置要点

初始默认值来自 cordis.patch.yml,面板可覆盖并热生效。常用字段如下:

字段 默认值 说明
scheduleMode daily daily / everyHours / everyDays / everyMinutes
dailyTime "04:30" 每日 / 每 N 天模式的锚定时刻
everyHours 6 每 N 小时(整点对齐,1–168)
everyDays 1 每 N 天(锚定 dailyTime,1–365)
everyMinutes 60 每 N 分钟(1–10080)
idleSeconds 300 判定无人使用的持续静默秒数
idleTimeoutMinutes 120 每次检查等待空闲的最长时间
harnessMode notify off / notify / auto
graceMinutes 30 auto 模式通知后的宽限分钟数
systemdUnit "" 重启用的 systemd 服务名;空则尝试从 cgroup 自动探测
pluginMode regexmode-ignore 白名单与自动/提醒的组合策略
whitelist [] 插件包名列表,含义随 pluginMode

典型用法

  1. 日常维护:scheduleMode: daily,dailyTime 设为业务低峰;harnessMode: notify,先看通知再决定是否改为 auto。
  2. 插件全自动、个别包只提醒:在 whitelist 填入包名,将 pluginMode 设为「白名单内只提醒、其余自动」或反向语义(以面板/README 枚举为准)。
  3. 本体 auto 重启:配置 systemdUnit 或依赖自动探测;部署用户需对 systemctl restart 配置 sudoers 免密,例如:
youruser ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart your-dsh-service

未配置免密时 sudo 会失败,日志会记录,插件不会反复重试。未探测到 systemd 时,会按原 argv 脱离子进程拉起作为兜底。

  1. 急需检查:在面板使用「立即检查」——只要当前无运行中会话即可执行,无需再等 idleSeconds。

适用场景与注意

适合:长期跑 DSH Web 形态、插件以 npm 包安装、希望定时对齐上游版本又不愿打断正在进行的 Agent 会话的部署。

注意:

  • 插件更新不覆盖 GitHub 源码安装的插件;本体更新依赖 npm 全局安装形态。
  • 重启与 npm 操作依赖主机权限与 sudo 策略,生产环境安装前应通读仓库源码。
  • 设计还参考 dsh-updater、dsh-auto-update 等社区项目的思路,可按需对比选型。

结尾

dsh-autoupdater 把「什么时候查更新」和「什么时候真的改磁盘/重启」拆开:调度可配,执行受空闲门槛约束,本体默认只通知,插件支持白名单双向语义,并在面板里完成配置与日志查看。若你在 SkillHub 浏览工作流类插件,可从目录页进入详情,或直接打开 GitHub README 核对安装命令与配置表。

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

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

Xiaoye