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

自更新守护 a1113622001/dsh-auto-update

DeepSeek 客户端
a111362200147 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

自动检测并暂存新版,退出时无缝完成升级

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

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

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/a1113622001/dsh-auto-update.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
生态插件
可安装,未声明 dsh 能力
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/09/28·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 47 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安装兼容性检查⚠ 装前注意

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

展开查看检查明细 ↓

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

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

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/31 04:48:34

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 38 处,展示前 31 条)
  • 执行外部命令来自配置/变量
    lib/index.js:574
    const child = spawn(process.execPath, [manifest.helper, this.updatesDir], {
  • 发起网络请求
    lib/client.js:34
    const response = await fetch(`/auto-update/${endpoint}`, {
  • 读取本地文件
    lib/updater.js:34
    if (existsSync("/.dockerenv") || existsSync("/run/.containerenv")) return true;
  • 读取本地文件
    lib/updater.js:36
    if (existsSync("/proc/1/cgroup")) {
  • 读取本地文件
    lib/updater.js:37
    const cgroup = readFileSync("/proc/1/cgroup", "utf8");
  • 读取本地文件
    lib/updater.js:59
    if (existsSync(shim)) return { command: shim, args };
  • 读取本地文件
    lib/updater.js:73
    if (existsSync(cand)) return { command: cand, args };
  • 读取本地文件
    lib/updater.js:142
    const pkg = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
  • 执行外部命令来自配置/变量
    lib/updater.js:204
    const out = spawnSync(npmCommand(), ["root", "-g"], {
  • 执行外部命令来自配置/变量
    lib/updater.js:231
    const child = spawn(npmCommand(), args, {
  • 写入本地文件
    lib/updater.js:307
    await mkdir(updatesDir, { recursive: true });
  • 写入本地文件
    lib/updater.js:310
    await writeFile(tmp, JSON.stringify(manifest, null, 2) + "\n", "utf8");
  • 写入本地文件
    lib/updater.js:311
    await rename(tmp, target);
  • 写入本地文件
    lib/updater.js:318
    await rename(target, join(updatesDir, `pending-archived-${Date.now()}.json`));
  • 写入本地文件
    lib/updater.js:326
    await mkdir(updatesDir, { recursive: true });
  • 写入本地文件
    lib/updater.js:327
    await appendFile(join(updatesDir, HISTORY_FILE), JSON.stringify(entry) + "\n", "utf8");
  • 写入本地文件
    bin/apply-update.js:50
    appendFileSync(join(process.argv[2] ?? ".", "apply.log"), line + "\n");
  • 读取本地文件
    bin/apply-update.js:58
    return JSON.parse(readFileSync(join(updatesDir, PENDING_FILE), "utf8"));
  • 读取本地文件
    bin/apply-update.js:124
    owner = Number.parseInt(readFileSync(path, "utf8"), 10);
  • 删除本地文件
    bin/apply-update.js:130
    unlinkSync(path);
  • 删除本地文件
    bin/apply-update.js:146
    unlinkSync(join(updatesDir, LOCK_FILE));
  • 执行外部命令来自配置/变量
    bin/apply-update.js:179
    const result = spawnSync(npmCommand(), args, {
  • 读取本地文件
    bin/apply-update.js:199
    const pkg = JSON.parse(readFileSync(join(installRoot, "package.json"), "utf8"));
  • 写入本地文件
    bin/apply-update.js:213
    mkdirSync(updatesDir, { recursive: true });
  • 写入本地文件
    bin/apply-update.js:214
    appendFileSync(join(updatesDir, HISTORY_FILE), JSON.stringify(entry) + "\n", "utf8");
  • 写入本地文件
    bin/apply-update.js:215
    writeFileSync(join(updatesDir, RESULT_FILE), JSON.stringify(entry, null, 2) + "\n", "utf8");
  • 写入本地文件
    bin/apply-update.js:223
    renameSync(join(updatesDir, PENDING_FILE), join(updatesDir, `applied-${Date.now()}.json`));
  • 读取本地文件
    bin/apply-update.js:240
    if (existsSync(shim)) return { command: shim, args };
  • 读取本地文件
    bin/apply-update.js:253
    if (existsSync(cand)) return { command: cand, args };
  • 读取本地文件
    bin/apply-update.js:276
    if (!manifest.installRoot || !existsSync(join(manifest.installRoot, "package.json"))) {
  • 执行外部命令来自配置/变量
    bin/apply-update.js:336
    const child = spawn(relaunch.command, relaunch.args, {
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 检测npm新版
  • 暂存更新包
  • 退出时应用升级

README

由 DeepSeek 最新模型翻译生成
🔄 dsh-auto-update 🚀 DeepSeek Harness 自更新守护插件 · 跨平台/容器环境自适应 Listed on dsh-plugin.org Node Platform License English · 简体中文 · 更新日志 📖 项目简介 dsh-auto-update 是已收录于 dsh-plugin.org(DeepSeek Harness 社区插件市场)的自更新守护插件。 在 Windows 及 POSIX 平台上,运行中的 Node 原生插件(sharp/koffi/node-pty)会被操作系统加锁,直接热覆盖必报 EBUSY;而在容器中,主进程退出又会直接导致容器销毁。 本项目通过 Stage(暂存) + Post-Exit Detached Apply(退出后脱离子进程替换) + 容器智能感知保护 三阶段设计,完美解决了 Harness 在各类环境下的自动升级难题。
展开完整文档(README 剩余 1 节)
🔄 dsh-auto-update
🚀 DeepSeek Harness 自更新守护插件 · 跨平台/容器环境自适应

Listed on dsh-plugin.org
Node
Platform
License

English · 简体中文 · 更新日志

📖 项目简介

dsh-auto-update 是已收录于 dsh-plugin.org(DeepSeek Harness 社区插件市场)的自更新守护插件。

在 Windows 及 POSIX 平台上,运行中的 Node 原生插件(sharp/koffi/node-pty)会被操作系统加锁,直接热覆盖必报 EBUSY;而在容器中,主进程退出又会直接导致容器销毁。

本项目通过 Stage(暂存) + Post-Exit Detached Apply(退出后脱离子进程替换) + 容器智能感知保护 三阶段设计,完美解决了 Harness 在各类环境下的自动升级难题。

🛒 插件市场与安装方式

方式 1:通过插件市场安装(推荐)

Harness 自身不内置市场界面;市场 UI 由社区插件 dsh-plugin 提供,需先安装它:

dsh plugin --profile web add dsh-plugin

1. 重启 dsh web(默认 http://127.0.0.1:3080);
2. 打开 设置 (Settings) -> 插件市场;
3. 搜索 dsh-auto-update,点击 安装 即可完成热加载。

方式 2:通过 Harness CLI 命令行安装

从 GitHub 仓库安装(推荐)
dsh plugin --profile web add github:a1113622001/dsh-auto-update

本插件目前仅通过 GitHub 仓库分发,尚未发布到 npm registry,因此 dsh plugin add dsh-auto-update(不带 github: 前缀)会因包不存在而失败。

🏗️ 架构与生命周期

sequenceDiagram
autonumber
participant H as Harness 主进程 participant C as 客户端 UI 面板 participant NPM as npm 官方源 / 镜像 participant F as 磁盘暂存区 (DSH_HOME/updates) participant D as 脱离执行器 (apply-update.js)

Note over H,C: 阶段 1: 探测与暂存 (Stage) H->>NPM: 检查 dist-tag 远端最新版本 H->>F: 下载精确 tarball 并写入 pending-update.json
H-->>C: 前端显示可更新状态 (胶囊徽标)

Note over H,D: 阶段 2: 退出与句柄释放 C->>H: 用户点击 "更新并重启" (或正常退出) H->>D: 派生独立脱离子进程 (detached child) H->>H: process.exit(0) 释放原生模块文件句柄

Note over D: 阶段 3: 执行替换与自动拉起 (Apply) D->>D: 等待父进程 PID 彻底终止 D->>NPM: 执行 npm install -g tarball D->>D: 写入 update-history.jsonl D->>H: 按原启动参数重启 dsh web

✨ 核心特性

- 🛡️ 突破 Windows EBUSY 文件锁:两阶段更新设计,运行期仅做暂存,主进程退出释放原生 DLL 句柄后再执行原子替换。
- 🐳 容器智能感知(Container-Aware):自动检测 Docker / K8s / Podman 容器环境,禁止触发 process.exit(0),并在 UI 友好提示“请拉取最新镜像更新”。
- 🌐 全平台软链适配:支持 Windows (/dsh.cmd) 与 Linux/macOS POSIX (/bin/dsh) 重启寻址。
- 💊 极简胶囊交互:Web 界面右下角默认折叠为轻量胶囊,点击展开查看版本差异、手动检查或一键重启。
- 🔄 原子并发锁保护:内置 apply.lock,防止多个更新进程并发冲突损坏全局环境。

⚙️ 配置文件说明 (cordis.patch.yml)

插件安装后会自动注入配置。如需自定义参数,可在 %USERPROFILE%\.dsh\profiles\web\cordis.patch.yml 中调整: dsh-auto-update 配置项
- insert:
- id: auto-update
name: 'dsh-auto-update'
config:
distTag: latest # 跟踪的 npm dist-tag (如 latest, next) checkOnStart: true # 启动时立即执行一次版本检查 checkIntervalMinutes: 240 # 定期检查间隔 (分钟) autoStage: true # 发现新版本后自动下载暂存 applyOnExit: true # Harness 退出时自动应用更新 relaunch: false # 应用更新后是否自动重启 harness

📄 开源许可证

本项目采用 MIT License 授权开源。
预览分享卡片长什么样 ↓a1113622001/dsh-auto-update
分享 · DeepSeek Harness Hub
a1113622001/dsh-auto-update

自动检测并暂存新版,退出时无缝完成升级

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部