🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

自动更新管家 niubi6668889595/dsh-autoupdater

DeepSeek Harness
niubi66688895958 天前有提交已提供中文文档扫描:高危

DeepSeek HarnessDSH自动更新插件 —— 定时检查 DSH…

35.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/26 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add niubi6668889595/dsh-autoupdater
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · market
装得上吗
静态安装检查有提示项,装前建议看一眼 README
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 8 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-autoupdater(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/3 03:20:20

🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0
🔴 扫描:高危尚无人工评估

静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。

命令参数由运行时变量拼接读写/删除本地文件发起外部网络请求
查看扫描证据(共 54 处,展示前 40 条)
  • 读取本地文件
    main.js:151
    try { return JSON.parse(await readFile(path, 'utf8')); } catch { return null; }
  • 读取本地文件
    main.js:183
    const candidates = readdirSync(base)
  • 读取本地文件
    main.js:185
    .filter((dir) => existsSync(`${dir}/node_modules`));
  • 读取本地文件
    main.js:190
    .map((dir) => ({ dir, m: statSync(`${dir}/node_modules`).mtimeMs }))
  • 执行外部命令运行时拼接
    main.js:219
    const out = execSync(
  • 写入本地文件
    main.js:247
    await mkdir(stateDir, { recursive: true });
  • 写入本地文件
    main.js:248
    await writeFile(statePath, JSON.stringify(state, null, 2));
  • 写入本地文件
    main.js:253
    await mkdir(stateDir, { recursive: true });
  • 写入本地文件
    main.js:254
    await appendFile(historyPath, JSON.stringify({ at: new Date().toISOString(), ...entry }) + '\n');
  • 读取本地文件
    main.js:256
    const raw = await readFile(historyPath, 'utf8').catch(() => '');
  • 写入本地文件
    main.js:259
    await writeFile(historyPath, lines.slice(-300).join('\n') + '\n');
  • 发起网络请求
    main.js:316
    const res = await fetch(`${base}/${encodeURIComponent(pkg)}`, fetchOpts);
  • 读取本地文件
    main.js:376
    return readFileSync('/proc/self/cmdline', 'utf8').split('\0').filter(Boolean);
  • 写入本地文件
    main.js:398
    await mkdir(stateDir, { recursive: true });
  • 发起网络请求
    client.js:363
    const r = await fetch('/api/autoupdater/config');
  • 发起网络请求
    client.js:381
    const r = await fetch('/api/autoupdater/config', {
  • 发起网络请求
    client.js:402
    const r = await fetch('/api/autoupdater/run-now', { method: 'POST' });
  • 写入本地文件
    apply-update.mjs:22
    mkdirSync(stateDir, { recursive: true });
  • 写入本地文件
    apply-update.mjs:23
    appendFileSync(logPath, `${new Date().toISOString()} ${msg}\n`);
  • 写入本地文件
    apply-update.mjs:27
    try { appendFileSync(historyPath, JSON.stringify({ at: new Date().toISOString(), ...obj }) + '\n'); } catch {}
  • 读取本地文件
    apply-update.mjs:34
    if (!existsSync(pendingPath)) { alog('no pending-update.json'); process.exit(0); }
  • 读取本地文件
    apply-update.mjs:36
    const instruction = JSON.parse(readFileSync(pendingPath, 'utf8'));
  • 写入本地文件
    apply-update.mjs:55
    mkdirSync(snapDir, { recursive: true });
  • 读取本地文件
    apply-update.mjs:56
    try { snap.dshVersion = JSON.parse(readFileSync(`${globalRoot}/package.json`, 'utf8')).version; } catch {}
  • 读取本地文件
    apply-update.mjs:60
    if (existsSync(src)) {
  • 写入本地文件
    apply-update.mjs:66
    writeFileSync(join(snapDir, 'snapshot.json'), JSON.stringify(snap, null, 2));
  • 执行外部命令来自配置/变量
    apply-update.mjs:75
    const r = spawnSync(npmBin, ['install', '-g', targetSpec], { encoding: 'utf8', timeout: 900000 });
  • 读取本地文件
    apply-update.mjs:88
    try { return JSON.parse(readFileSync(`${globalRoot}/package.json`, 'utf8')).version; } catch { return null; }
  • 读取本地文件
    apply-update.mjs:94
    if (!existsSync(dshBin)) {
  • 删除本地文件
    apply-update.mjs:97
    try { rmSync(pendingPath); } catch {}
  • 执行外部命令固定命令
    apply-update.mjs:117
    const r = spawnSync('grep', ['-rl', '--include=*.js', name, nm], { encoding: 'utf8' });
  • 删除本地文件
    apply-update.mjs:135
    try { rmSync(pendingPath); } catch {}
  • 删除本地文件
    apply-update.mjs:145
    try { rmSync(pendingPath); } catch {}
  • 执行外部命令固定命令
    apply-update.mjs:155
    const r = spawn('sudo', ['-n', 'systemctl', 'restart', unit], { stdio: 'ignore' });
  • 执行外部命令来自配置/变量
    apply-update.mjs:168
    const child = spawn(argv[1], argv.slice(2), { detached: true, stdio: 'ignore' });
  • 执行外部命令固定命令
    apply-update.mjs:184
    const r = spawnSync('systemctl', ['is-active', unit], { encoding: 'utf8' });
  • 发起网络请求
    apply-update.mjs:189
    const res = await fetch(`http://127.0.0.1:${port}/`, { signal: AbortSignal.timeout(5000) });
  • 删除本地文件
    apply-update.mjs:204
    try { rmSync(pendingPath); } catch {}
  • 删除本地文件
    apply-update.mjs:228
    try { rmSync(pendingPath); } catch {}
  • 删除本地文件
    apply-update.mjs:233
    try { rmSync(pendingPath); } catch {}
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 的定时空闲自动更新:DSH 本体加已装插件。四种调度模式、双向白名单、网页面板。

README

由 DeepSeek 最新模型翻译生成
dsh-autoupdater DeepSeek Harness(DSH)自动更新插件 —— 定时检查 DSH 本体与已安装插件的更新,只在无人使用的空闲窗口执行。四种调度模式、双向白名单、可视化设置面板。 English below · English 功能 - 定时检查:四种调度模式任选——每日 HH:MM / 每 N 小时(整点对齐)/ 每 N 天 / 每 N 分钟 - 空闲门槛:会话日志 2 分钟无写入 + 无运行中 Agent 才动手;定时触发再叠加持续静默采样,绝不打断使用 - 插件批量更新:遍历已安装插件,逐个对比 npm 最新版并升级(带 包名@版本 显式安装 + 磁盘回读验证,杜绝假更新) - 双向白名单:白名单内只提醒 / 白名单内自动升级,两种语义随你切换 - DSH 本体更新:三种策略——不管 / 只暂存+通知 / 通知后宽限自动重启(宽限期内任何会话活动即推迟) - Web 设置面板:插件管理器内嵌卡片,改配置保存即生效(热配置,无需重启) - 最近活动日志:每次检查/更新/重启都有可读记录,面板内直接查看 - 防变砖检查:本体更新后校验 dsh 二进制存在才重启,npm 中断不留半更新状态 安装 dsh plugin --profile web add dsh-autoupdater 或从 GitHub:
展开完整文档(README 剩余 1 节)
dsh-autoupdater

DeepSeek Harness(DSH)自动更新插件 —— 定时检查 DSH 本体与已安装插件的更新,只在无人使用的空闲窗口执行。四种调度模式、双向白名单、可视化设置面板。

English below · English

功能

- 定时检查:四种调度模式任选——每日 HH:MM / 每 N 小时(整点对齐)/ 每 N 天 / 每 N 分钟
- 空闲门槛:会话日志 2 分钟无写入 + 无运行中 Agent 才动手;定时触发再叠加持续静默采样,绝不打断使用
- 插件批量更新:遍历已安装插件,逐个对比 npm 最新版并升级(带 包名@版本 显式安装 + 磁盘回读验证,杜绝假更新)
- 双向白名单:白名单内只提醒 / 白名单内自动升级,两种语义随你切换
- DSH 本体更新:三种策略——不管 / 只暂存+通知 / 通知后宽限自动重启(宽限期内任何会话活动即推迟)
- Web 设置面板:插件管理器内嵌卡片,改配置保存即生效(热配置,无需重启)
- 最近活动日志:每次检查/更新/重启都有可读记录,面板内直接查看
- 防变砖检查:本体更新后校验 dsh 二进制存在才重启,npm 中断不留半更新状态

安装

dsh plugin --profile web add dsh-autoupdater

或从 GitHub:

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. 会话日志 mtime:$DSH_HOME/sessions 下任意文件 2 分钟内无写入 = 无进行中的工作(借鉴 dsh-self-upgrade,比 agent.status 可靠——实测 turn 结束后 status 可能停留 running)
2. 定时触发额外要求持续静默 idleSeconds 秒,双重采样防瞬时空档误判
3. 手动触发(面板"立即检查")只要求此刻无运行中会话——你主动点的,不再等静默
4. 探测失败保守当忙,宁可不更新也不冒险

本体更新的重启方式

- 配置了 systemdUnit(或自动探测到)→ sudo -n systemctl restart <unit>。前置条件:你的部署用户已配置该命令的 sudoers 免密,例如:

youruser ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart your-dsh-service

未配置免密时 sudo 会失败,日志里如实记录,插件不会反复重试
- 未探测到 systemd → 按原 argv 脱离子进程拉起(兜底)
- npm 全局安装后校验 dsh 二进制存在,缺失则放弃重启(防变砖)

安全模型

- 默认 harnessMode: notify——只暂存并通知,重启动作需你显式改为 auto
- 空闲门槛不可绕过:面板不提供"忽略空闲"开关
- 更新前后均有磁盘版本校验,结果写入 ~/.dsh/autoupdater/history.jsonl
- API 仅写本地 config.json,不触碰系统配置

已知限制

- 插件更新只覆盖声明 dsh.bundle 的 npm 形态插件;GitHub 源码安装的插件版本比对不适用
- 本体更新依赖 npm 全局安装形态(git checkout 形态请用 dsh-updater)
- 空闲判定基于本机 $DSH_HOME/sessions 的文件 mtime,远程会话(SSH 场景)不计入

致谢

设计借鉴了社区同类项目:dsh-self-upgrade(会话日志 mtime 空闲判定、防变砖校验)、dsh-updater(保守失败语义)、dsh-auto-update(stage + 退出后应用架构)。

License

MIT

dsh-autoupdater (English)

DeepSeek Harness(DSH)自动更新插件 —— 定时检查 DSH 自身和已安装插件的更新,只在空闲窗口内应用。

- 四种调度模式:每天 HH:MM / 每 N 小时(对齐时钟)/ 每 N 天 / 每 N 分钟
- 空闲门控:会话日志 mtime 静默 2 分钟 + 没有运行中的智能体;定时运行还要求持续静默,并做双重采样
- 批量更新插件:逐个插件比对 npm 版本,显式执行 name@version 安装,安装后校验磁盘(杜绝幽灵更新)
- 双向白名单:白名单通知其他插件自动更新,或反过来
- Harness 更新策略:off / stage+notify(默认)/ 先通知,宽限期后自动重启,期间任何会话活动都会推迟重启
- Web 设置面板:内嵌在插件管理器里;配置热重载 —— 改动无需重启即可生效
- 活动日志:每次检查、更新、重启都有记录,可在面板中查看
- 防变砖保护:重启前先确认 npm install 之后 dsh 二进制文件仍然存在

安装:dsh plugin --profile web add dsh-autoupdater,然后重启 DSH,在 Plugin Manager → dsh-autoupdater 下配置。

完整细节见上面的中文部分 —— 配置表和空闲检测说明对两种语言都适用。
预览分享卡片长什么样 ↓niubi6668889595/dsh-autoupdater
分享 · DeepSeek Harness Hub
niubi6668889595/dsh-autoupdater

DeepSeek HarnessDSH自动更新插件 —— 定时检查 DSH…

这是你的仓库?认领条目

回到顶部