dsh-plugin-update-center:侧边栏集中更新 profile 插件

前言

DeepSeek Harness(DSH)的 desktop profile 里,插件往往通过 npm 包名安装并写在 package.json 里。官方插件页可以逐个添加,但「哪些已装插件有新版本、能否批量更新、更新失败怎么回滚」并没有一套与 DSH 界面风格一致的集中入口。手动改依赖、在终端里反复 remove / install,既容易漏掉 engines 与 bundle 校验,也会在对话或后台任务仍在运行时撞上文件锁。

下面介绍社区插件 dsh-plugin-update-center(维护者 darkings,分类 admin-security)。它在侧边栏账号行提供与 DSH 原生更新提示并排的 chip,只处理 npm registry 来源的 profile 插件;自带检查缓存、排队等待空闲、快照回滚、安装后校验,以及卸载残留扫描。DSH 自带插件、github: / git: / file: 等来源的插件,以及 DSH 本体更新,都不在本插件职责范围内。

这是什么

dsh-plugin-update-center 是发布在 npm 上的 DSH bundle(当前资料中 package 版本为 1.0.2,MIT 许可证)。Host 侧注册 API,客户端通过 shell.overlay 与 React portal 把更新 chip 挂到侧边栏底部登录名右侧,视觉规格对齐 DSH 的 DesktopUpdateIndicator。

它解决的核心问题是:在不动 DSH 本体更新的前提下,对 profile 里已安装、可移除、无错误的 npm 插件做版本检查与串行更新,并在批次开始前写 profile 快照,失败时按插件回滚,避免 profile 与 patch 元数据损坏导致无法启动。

核心功能

更新检查

检查逻辑从 pluginManager.listBundles() 出发,只保留 installed 且 availability === "profile" 的 bundle,并解析依赖是否为 name@版本/范围 形式的 npm 安装。

向 registry.npmjs.org 查询 dist-tags.latest 与 manifest;失败时回退 registry.npmmirror.com。过滤稳定版、未 deprecated、含 dsh.bundle、sha512 合法、且 engines.dsh / engines.node 与当前环境兼容的包;仅当最新版严格大于已装版本时才列入可更新列表。

结果在 Host 内存缓存 30 分钟;刷新页面不会重复请求,弹窗内「重新检查」会强制刷新。

侧边栏更新与进度

  • 更新 chip:下载图标;无可更新时不显示;有更新时显示数量;排队显示时钟;更新中显示旋转图标与 n/total。
  • 点击打开 DSH 原生风格弹窗:勾选插件后点「更新 N 个插件」。有任务运行时按钮变为「任务完成后自动更新」,进入 Host 侧队列。
  • 进度视图包含总进度条、当前插件名,以及每个插件的阶段:等待 / 核对版本 / 移除旧版 / 安装新版 / 已更新 / 待重启 / 失败。官方 API 不暴露 pnpm 字节级下载进度,进度按阶段权重推进(核对 5% → 移除 35% → 安装 65% → 完成 100%)。

DSH 本体处于 available / downloading / installing / ready 等更新阶段时,禁止开始插件更新,队列也会等待。

更新与回滚

因当前 DSH 的 pluginManager 没有 updateBundle,单个插件按与官方插件页相同的方式更新:

removeBundle(name)
installBundle(`${name}@${latest}`, { enabled: 原状态, saveExact: true, registry, requestId })

失败按插件处理:失败项自动装回旧版本(含 remove 阶段失败导致旧版已被删的情况),已成功项保持新版本。EPERM、EBUSY、ECONNRESET 等瞬态错误短退避重试 3 次。依赖失败插件的项标记为「跳过」。仅当回滚也失败或 package.json / patch 元数据损坏时才停止批次,并提示恢复快照。

批次开始前会把 package.json、pnpm-lock.yaml、pnpm-workspace.yaml、cordis.patch.yml、cordis.yml 复制到 $DSH_HOME/plugin-updates/snapshots/<timestamp>/;快照失败则拒绝开始更新。对「启动关键」与「被其他插件 inject」的插件默认不勾选,勾选时有警告。

排队与生效

有对话 turn 或后台 job 时,直接更新会 busy;可进入队列,等待任务空闲后再静默 10 秒、5 秒倒计时开始(倒计时内来新任务会退回等待)。队列保存在 Host 内存,页面刷新不影响,Host 重启后不自动续跑。

全部完成后:有失败则不自动刷新并支持「重试失败项」;否则若需重启则只提示重启;否则若成功项含 dsh.client 则 3 秒倒计时后自动刷新(可取消)。插件不自动重启 DSH。

卸载残留

只做检测与提示,不接管官方卸载。检测三类:profile 里悬空的插件选择、cordis.patch.yml 中引用不存在包的 name: 行、与悬空包同名的 $DSH_HOME 数据目录。

残留 chip 使用垃圾桶图标与警告色,与更新 chip 区分。窗口底部「清理」会删除悬空 bundle 选择与失效补丁条目(先快照、原子写回);数据目录仅报告,不自动删除。

离线恢复

仓库提供 repair.cmd / repair.mjs。DSH 打不开时,可先使用错误对话框中的「禁用第三方插件、备份 profile patch 并重启」,再运行:

repair.cmd --list
repair.cmd                     # 恢复最新快照并重装依赖
repair.cmd --snapshot <目录名>  # 指定快照
repair.cmd --no-install        # 只恢复文件

安装与启用

npm 包名:dsh-plugin-update-center。

通过 DSH CLI 安装到 desktop profile:

dsh plugin --profile desktop add dsh-plugin-update-center

也可以在 DSH「插件 → 添加插件」中输入 dsh-plugin-update-center。

资料要求 engines:dsh >= 0.2.0-rc.1,node 为 ^22.19.0 || >=24.0.0。安装前请阅读仓库源码与 MIT 许可证;插件以当前 DSH 进程权限运行,属于 admin-security 类能力,应自行评估信任边界。

典型用法

  1. 安装并刷新 Web 页面一次(新装或更新 client 插件后需刷新才能加载 Client 模块;Host 半可由 HMR 重载)。
  2. 在侧边栏账号行查看更新 chip;点击打开列表,勾选要更新的插件(启动关键项建议一次只更新一个,更新后重启验证)。
  3. 若当前有任务,选择「任务完成后自动更新」进入队列。
  4. 更新完成后按提示重启 DSH 或刷新页面;若出现 fatal 异常,先 repair.cmd 回到快照再单独排查,避免连续重试。
  5. 若发现残留 chip,打开窗口查看明细,确认后再点「清理」。

维护者建议:普通插件可批量;启动关键或被依赖插件一次一个,更新后先重启确认能打开再继续下一批。

适用场景与注意

适合:长期在 desktop profile 中维护较多 npm 来源 DSH 插件、希望与 DSH 桌面更新提示同一入口检查版本,并需要快照与按插件回滚的用户。

务必知晓的限制(来自 README 已知限制):

  • 只处理顶层 profile 依赖;Suite 组合包子插件需按组合包自身方式更新。
  • 账号行无官方 list 插槽,chip 依赖 DOM 锚点;DSH 大版本改动相关 DOM 时可能需插件同步适配。
  • 更新为「先卸后装」;Windows 上 package.json 被占用(EPERM)可先重试或重启 DSH 释放锁。
  • 浏览器模式无法订阅 dshDesktop.updates,DSH 本体更新门控与桌面 preload 行为不一致时,仅能按运行版本重查兼容性。
  • 社区目录 SkillHub 插件页 与 GitHub 仓库由社区维护,与 DeepSeek / 幻方无官方从属关系;星标与目录信息以各站点当时展示为准。

结尾

dsh-plugin-update-center 把 profile 内 npm 插件的版本检查、排队更新、快照回滚、安装校验和卸载残留提示收进侧边栏,并尽量对齐 DSH 原生更新交互。需要源码、问题反馈与 repair 脚本说明时,见 GitHub:darkings/dsh-plugin-update-center。

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

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

小夜