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

版本更新管家 zudazhuang/dsh-update-safe

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

DeepSeek Harness 源码安装的更新插件。它把一次更新拆成可回退的几步:核对官方发布 →…

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
生态插件
可安装,未声明 dsh 能力
暂无时间戳·判据 →
装得上吗[实装验证]—
静态安装检查有提示项,装前建议看一眼 README
L4 · 真实安装等级说明 →
数据截至 2026/10/31·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/05·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 15 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

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

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

展开查看检查明细 ↓

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

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

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/12 22:46:54

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 36 处,展示前 35 条)
  • 读取本地文件
    index.js:36
    function realpathPackage(root) { return readFileSync(join(root, 'package.json'), 'utf8') }
  • 写入本地文件
    index.js:49
    await mkdir(root, { recursive: true, mode: 0o700 })
  • 执行外部命令来自配置/变量
    engine.js:21
    const child = spawn(file, args, { cwd: options.cwd, env: options.env ?? buildEnvironment(), stdio: ['ignore', 'pipe', 'pipe'], detached: true })
  • 读取本地文件
    engine.js:60
    return JSON.parse(await readFile(file, 'utf8'))
  • 删除本地文件递归
    engine.js:61
    } finally { await rm(directory, { recursive: true, force: true }) }
  • 删除本地文件递归
    engine.js:79
    } finally { await rm(temp, { recursive: true, force: true }) }
  • 读取本地文件
    engine.js:87
    try { hash.update(await readFile(file)) }
  • 执行外部命令固定命令
    engine.js:106
    const child = spawn('pnpm', ['dsh', 'web', '--port', '0', '--no-open'], { cwd: source, env, detached: true, stdio: ['ignore', 'pipe', 'pipe'] })
  • 发起网络请求
    engine.js:116
    const bootstrap = await fetch(url, { redirect: 'manual', signal: AbortSignal.timeout(10000) })
  • 发起网络请求
    engine.js:118
    const response = await fetch(new URL('/api/safe-release-update.health', url), { method: 'POST', headers: { 'Content-Type': 'application/json', Cookie:
  • 写入本地文件
    engine.js:141
    await writeFile(patch, '', { mode: 0o600 })
  • 读取本地文件
    engine.js:143
    if (!(await readFile(patch)).length) return false
  • 写入本地文件
    engine.js:169
    await writeFile(archive, '', { flag: 'wx', mode: 0o600 })
  • 读取本地文件
    engine.js:174
    try { bytes = await readFile(cachedArchive) }
  • 写入本地文件
    engine.js:178
    if (bytes) await writeFile(archive, bytes)
  • 写入本地文件
    engine.js:182
    await mkdir(source)
  • 读取本地文件
    engine.js:186
    const complete = await readFile(archive)
  • 写入本地文件
    engine.js:187
    await mkdir(cacheDirectory, { recursive: true, mode: 0o700 })
  • 写入本地文件
    engine.js:188
    await writeFile(cachedArchive, complete, { mode: 0o600 })
  • 读取本地文件
    store.js:8
    try { return JSON.parse(await readFile(path, 'utf8')) }
  • 写入本地文件
    store.js:14
    await writeFile(temp, `${JSON.stringify(value, null, 2)}\n`, { flag: 'wx', mode: 0o600 })
  • 写入本地文件
    store.js:15
    await rename(temp, path)
  • 写入本地文件
    store.js:19
    await mkdir(root, { recursive: true, mode: 0o700 })
  • 写入本地文件
    store.js:22
    await writeFile(path, JSON.stringify({ pid: process.pid, token }), { flag: 'wx', mode: 0o600 })
  • 删除本地文件
    store.js:26
    await unlink(path)
  • 写入本地文件
    supervisor.mjs:13
    await rename(home, failedHome)
  • 发起网络请求
    supervisor.mjs:56
    const bootstrap = await fetch(match[1], { redirect: 'manual', signal: AbortSignal.timeout(5000) })
  • 发起网络请求
    supervisor.mjs:58
    const res = await fetch(`${origin}/api/safe-release-update.health`, { method: 'POST', headers: { 'Content-Type': 'application/json', Origin: origin, C
  • 写入本地文件
    supervisor.mjs:73
    await mkdir(root, { recursive: true, mode: 0o700 })
  • 执行外部命令固定命令
    supervisor.mjs:91
    child = spawn('pnpm', args, { cwd: candidate, env: { ...process.env, DSH_HOME: home, DSH_SAFE_UPDATE_ROOT: root, DSH_SAFE_SUPERVISOR_ID: owner }, deta
  • 读取本地文件
    supervisor.mjs:102
    if (await healthFromLog(await readFile(runtime.log, 'utf8'), expected)) return
  • 写入本地文件
    supervisor.mjs:144
    await rename(destination, join(home, 'profiles', `web.previous-${randomUUID()}`))
  • 删除本地文件
    supervisor.mjs:152
    await unlink(join(root, 'pending.json'))
  • 删除本地文件
    supervisor.mjs:157
    await unlink(join(root, 'pending.json'))
  • 删除本地文件
    supervisor.mjs:174
    await unlink(supervisorPath)
扫描于 2026/11/5(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

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

功能亮点

  • 检查官方新版本
  • 定时自动更新
  • 受控回滚

DeepSeek Harness 更新插件:官方发布检查、定时更新与受控回滚

README

由 DeepSeek 最新模型翻译生成
dsh-update-safe DeepSeek Harness 源码安装的更新插件。它把一次更新拆成可回退的几步:核对官方发布 → 在独立目录构建候选版本 → 试启动并检查实际运行版本 → 由监督进程切换 → 失败时恢复原环境。 只适用于 macOS/Linux 上用 pnpm dsh web 从源码运行的 Harness;npm 全局安装和 Electron 桌面包不适用。 它做什么 - 启动时检查、手动「检查更新」、可关闭的定时检查(默认启动检查 + 每 30 分钟) - 同时核对 GitHub 官方发布与 npm 发布记录,两者不一致就不更新;网络错误显示「未验证」 - 预发布与稳定渠道分别比较,禁止降级 - 每日安装时段(默认 03:00–04:00),只在空闲够久、监督启动有效、源码无改动时准备和安装;自动安装默认关闭 - 切换前为未提交改动生成私有快照;切换后启动失败则恢复一致性快照和原环境 - 侧栏底部更新入口与新版提示;插件详情页可配置检查间隔、渠道、空闲时长 使用 社区插件,非 DeepSeek 官方产品。发布在 GitHub Releases 和 npm(dsh-update-safe)。支持 Harness 源码 Web 安装;当前在 0.2.1-alpha.1 验证,适配 ConfigForms 设置接口。
展开完整文档(README 剩余 1 节)
dsh-update-safe

DeepSeek Harness 源码安装的更新插件。它把一次更新拆成可回退的几步:核对官方发布 → 在独立目录构建候选版本 → 试启动并检查实际运行版本 → 由监督进程切换 → 失败时恢复原环境。

只适用于 macOS/Linux 上用 pnpm dsh web 从源码运行的 Harness;npm 全局安装和 Electron 桌面包不适用。

它做什么

- 启动时检查、手动「检查更新」、可关闭的定时检查(默认启动检查 + 每 30 分钟)
- 同时核对 GitHub 官方发布与 npm 发布记录,两者不一致就不更新;网络错误显示「未验证」
- 预发布与稳定渠道分别比较,禁止降级
- 每日安装时段(默认 03:00–04:00),只在空闲够久、监督启动有效、源码无改动时准备和安装;自动安装默认关闭
- 切换前为未提交改动生成私有快照;切换后启动失败则恢复一致性快照和原环境
- 侧栏底部更新入口与新版提示;插件详情页可配置检查间隔、渠道、空闲时长

使用

社区插件,非 DeepSeek 官方产品。发布在 GitHub Releases 和 npm(dsh-update-safe)。支持 Harness 源码 Web 安装;当前在 0.2.1-alpha.1 验证,适配 ConfigForms 设置接口。需要 Node.js ^22.19 或 >=24、pnpm、Git;Mac 登录自动启动还需 Python 3。

在 Harness 源码目录从 npm 安装,版本固定,依赖走 registry(国内可配 npmmirror 镜像):

pnpm dsh plugin --profile web add dsh-update-safe@0.4.2

也可以直接用 Release 附件的固定地址;profile 记录的是该 URL,换机或清理下载目录都不影响:

pnpm dsh plugin --profile web add https://github.com/zudazhuang/dsh-update-safe/releases/download/v0.4.2/dsh-update-safe-0.4.2.tgz

也可从 Releases 下载 dsh-update-safe-0.4.2.tgz 后运行 pnpm dsh plugin --profile web add /absolute/path/dsh-update-safe-0.4.2.tgz;这种本地路径形式会写进 profile,移动或删除该文件后重装会失败,优先用上面的 URL。安装后重启 Harness,侧栏底部出现更新入口,插件详情页名为 dsh-update-safe。

开发者也可克隆本仓库,运行 npm ci、npm test、npm pack 后安装生成的包。插件 → dsh-update-safe 提供检查、隔离构建、切换操作和检查间隔、渠道、空闲时长、自动切换配置。自动切换默认关闭;未使用监督启动时,自动安装暂停;页面允许保存自动安装偏好,满足条件后只在指定时段执行。

本机启动:

DSH_SOURCE=/path/to/deepseek-harness ./start-harness.sh

脚本通过 pnpm dsh web --no-open 启动受监督的 Web profile。可用 DSH_SOURCE、DSH_HOME、DSH_SAFE_UPDATE_ROOT 指定源码、用户数据及更新目录。未设置 DSH_SOURCE 时使用本插件仓库旁的 deepseek-harness;其他目录布局必须显式指定。更新目录必须在用户数据目录之外。监督进程退出时会等待受管理的 Harness 进程组完全退出。其他启动方式仍可检查和准备,但不能切换。

启动和定时更新

「启动 Harness 时检查更新」控制每次应用启动的检查;「定时检查官方版本」独立控制周期检查。手动按钮始终可用。检查间隔实时生效,电脑睡眠后恢复会补做已到期检查;网络失败等待下个周期,不持续重试。页面显示最近检查、下次检查和下次安装时段。

自动安装按本机时间每天执行,默认安装时段为 03:00–04:00,可设置开始时间及 15–240 分钟的时段长度。每个时段开始后核对一次官方版本,只有空闲达到设置时长、监督启动有效且源码无修改时才准备和安装;整个时段繁忙则延后到次日,不在指定时段之外启动自动安装。已开始的构建可以跨过时段结束;切换前仍重新检查时段和活动任务。

本机 Mac 登录自动启动通过用户级 LaunchAgent 实现,不使用管理员权限。启用前停止已运行的监督脚本,然后运行 DSH_SOURCE=/path/to/deepseek-harness python3 install-login-start.py;它立即启动 Harness,随后每次用户登录启动。禁用用 python3 install-login-start.py --remove,同时停止该登录任务。自动启动不打开浏览器,访问 http://127.0.0.1:3080/ 使用页面。手动运行启动脚本与登录任务共用同一进程锁,避免重复启动。

更新与恢复

准备阶段只从 deepseek-ai/deepseek-harness 下载指定发布标签,验证源码版本,与官方 npm 发布信息交叉核对;随后在独立目录安装锁定依赖并构建。在用户数据副本中升级官方外部 DSH 依赖、试启动整个 profile 并检查实际运行版本。外部插件版本保持固定;宿主的版本兼容检查仍生效,不能通过允许不兼容版本绕过。

本插件核对 npm 发布完整性元数据,源码通过 GitHub 官方 HTTPS 标签归档传输。它没有额外的发布签名验证。试启动检查的是 Host 激活与版本,前端第三方插件的全部业务行为仍需要更新后验证;本机安装后的前端通过实际浏览器验证。

切换前重新核对源码 commit、部署文件和活动会话及任务。未提交修改和未被 Git 忽略的新增文件自动生成私有快照并迁移;本插件不会自动 stash、提交、推送或 reset 原目录。切换时所有已存在 Agent 的 maintenance 阶段被占用,新建 Agent 暂时拒绝;已有运行工作阻止切换。维护期内用户新输入可能排队,切换后请确认投递状态。

监督进程等待旧 Harness 完全退出,再复制整个用户数据目录,保留旧源码、node_modules 与构建文件,并替换 Web profile 的依赖环境。启动失败时先保存升级后的完整用户目录,再恢复一致性快照并启动原环境,避免旧程序读取较新的 Session 格式。更新后的数据副本位于用户目录旁的 .dsh.failed-update-*,不会静默删除。
更新记录、快照和日志默认位于 ~/.local/share/dsh-safe-release-update,使用用户私有权限。运行日志含本地启动认证信息,不要分享原文件。构建命令移除继承的密钥、令牌和 Git 凭据环境,页面只显示固定阶段与错误原因,不展示子进程原始输出。

如果进程在切换中断电或被强制结束,监督启动拒绝继续运行不确定的状态。transaction.json 记录原环境、目标和快照路径,runtime.json 记录受管进程。检查并确认该进程组已停止后,保留现有用户数据副本,再从已完成的快照恢复,记录恢复状态并清理已失效的锁。未完成快照不能用于恢复。自动恢复此类系统中断尚未开放。

自动更新失败后,同一目标版本停止自动尝试,手动重新准备可重试。官方发布与 npm 元数据不一致时不更新。

测试

npm test 使用独立临时目录,覆盖渠道选择、双源不一致、禁止降级、脏目录阻断、并发锁、取消、隔离构建失败、准备完成、活动任务检查、健康检查失败、数据恢复顺序与恢复失败阻断。调度测试覆盖睡眠补查、实时修改、关闭周期检查、每日时段与跨午夜时段。

细节与限制

- 源码通过 GitHub codeload 的 HTTPS 标签归档下载,运行环境需提供 curl 与 tar;解压后检查 CLI 版本并建立本地标签,再按三方迁移应用本地改动。
- 完整且校验通过的归档缓存在插件状态目录的 archives/ 中,复用前核对 SHA-256,损坏的缓存重新下载。
- 版本元数据通过 curl 获取,单次 60 秒、最多重试两次;下载默认允许 3600 秒、连接限时 20 秒,高级设置中可在 120–7200 秒之间调整。
- 本地工作文件通过私有临时 Git 索引生成快照,不改动用户原有的索引、分支和文件;Git 忽略的文件不迁移。
- 本地依赖调整通过 package.json、pnpm-workspace.yaml 和 .npmrc 迁移,不套用旧 pnpm-lock.yaml;存在这类调整时,候选目录重新解析依赖并提交生成的锁文件再构建。
- 源码三方合并冲突时停止更新,列出冲突文件名,原环境继续运行,不自动覆盖任何一方。
- 监督启动支持 DSH_SAFE_PORT 指定监听端口(0 为系统分配),默认使用 Harness 默认端口,可用于隔离验证。
- 页面请使用监督实例的地址(默认 3080);其他已运行的实例需重启才会加载新插件。
预览分享卡片长什么样 ↓zudazhuang/dsh-update-safe
分享 · DeepSeek Harness Hub
zudazhuang/dsh-update-safe

DeepSeek Harness 源码安装的更新插件。它把一次更新拆成可回退的几步:核对官方发布 →…

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