DSH 热更新插件管理器:在运行中的实例上管理插件 bundle

前言

DeepSeek Harness(DSH)的扩展能力通常以插件 bundle 的形式提供。对插件做安装、卸载、更新或启用/禁用后,如果每次都要重启实例,调试和切换配置会比较慢。

kyorakuyk/dsh-hotreload-plugin-manager 是一个树外 DSH 插件:它可以在运行中的实例上热安装、热卸载、更新、禁用/启用 profile 插件 bundle,并提供 Web 设置页标签页。下面介绍它的定位、安装方式和主要边界。

这是什么

这是一个由 kyorakuyk 维护的 MIT 许可证插件。

它的特点是:

  • 零内核改动:纯树外 bundle。
  • 双面包:一个 npm 包同时是 host 网关与浏览器设置标签页。
  • 提供 Web 设置页标签页:设置 → 插件 → 插件管理。
  • 提供 /plugin-manager/* HTTP API,用于列表、安装、卸载、更新和启用/禁用。

它解决的问题是:在运行中的 DSH 实例上,对 profile 插件 bundle 做生命周期管理,而不是每次都在外部改完配置后重启实例。

核心能力

下面介绍已确认的主要能力。

热安装 bundle

支持按 spec 安装插件 bundle。可接受的来源形式包括:

  • npm 包名
  • git URL
  • github:owner/repo
  • file: / link: 路径

热卸载 bundle

卸载时会移除行与 fiber、清理依赖,并移除陈旧 bundle 层条目。

禁用 / 启用 bundle

已安装 bundle 可以被禁用或启用。状态持久化且立即生效。

热更新 bundle

热更新会替换 bundle 的补丁行并实时重放配置。

需要注意:这里热更新的是组合与配置,不是模块代码。模块代码或 exports map 变更仍需要重启。

Web 设置页

安装并启用后,可以在 Web UI 中进入:

设置 → 插件 → 插件管理

在这个标签页中,可以按 spec 安装其他插件,并对已安装项执行更新、禁用/启用、卸载。

HTTP API

插件提供 /plugin-manager/* HTTP API。常见操作包括:

操作 方法与路径 Body 字段
列表 GET /plugin-manager/list
安装 POST /plugin-manager/install { spec }
卸载 POST /plugin-manager/uninstall { packageName }
更新 POST /plugin-manager/update { packageName }
启用 / 禁用 POST /plugin-manager/setEnabled { entryId, enabled }

安装与启用

前置条件:

  • Node ≥ 22
  • pnpm ≥ 10
  • 已安装 dsh
  • 已初始化目标 profile

下面以 web profile 为例。

1、安装本插件

可以直接从 GitHub 安装:

dsh plugin --profile web add "github:kyorakuyk/dsh-hotreload-plugin-manager"

也可以使用完整 git URL:

dsh plugin --profile web add "https://github.com/kyorakuyk/dsh-hotreload-plugin-manager.git"

如果希望本地克隆后安装,可以先克隆仓库:

git clone https://github.com/kyorakuyk/dsh-hotreload-plugin-manager.git

然后使用本地路径安装:

dsh plugin --profile web add "file:$(pwd)/dsh-hotreload-plugin-manager"

如果以 npm 包形式发布,也可以使用 npm 包名 spec。示例中出现的包名是:

dsh plugin --profile web add "@kyorakuyk/dsh-plugin-manager"

这个 npm 包名与仓库名不一致,使用前需要确认实际发布目标。

2、重启 dsh web 实例

安装本插件后,必须重启 dsh web 实例:

dsh --profile web

3、浏览器硬刷新一次

浏览器需要硬刷新一次:

Ctrl+Shift+R

4、打开插件管理页

进入 Web UI 后打开:

设置 → 插件 → 插件管理

完成上面的步骤后,就可以在这个页面管理其他插件 bundle。

典型用法

安装其他 bundle

在插件管理页中,按 spec 填写安装对象。可填写的来源形式包括:

  • npm 包名
  • git URL
  • github:owner/repo
  • file: / link: 路径

例如,本地路径形式可以是:

file:$(pwd)/some-dsh-bundle

这里只是说明 spec 形式;具体安装哪个 bundle,取决于你要引入的插件。

管理已安装 bundle

安装后,可以对已安装项执行:

  • 更新
  • 禁用
  • 启用
  • 卸载

禁用/启用会改变条目状态,并且状态持久化。

通过 HTTP API 操作

如果不在 Web UI 中操作,也可以调用 /plugin-manager/* 接口。

例如,查询列表:

GET /plugin-manager/list

安装一个 bundle:

POST /plugin-manager/install
{ "spec": "<bundle-spec>" }

卸载一个 bundle:

POST /plugin-manager/uninstall
{ "packageName": "<package-name>" }

更新一个 bundle:

POST /plugin-manager/update
{ "packageName": "<package-name>" }

启用或禁用一个条目:

POST /plugin-manager/setEnabled
{ "entryId": "<entry-id>", "enabled": true }

限制与注意事项

热更新不是替换模块代码

热更新替换的是组合与配置,不是模块代码。

如果 bundle 的模块代码或 exports map 变更,需要重启后才生效。

不要与 dsh plugin CLI 混用

不要与 dsh plugin CLI 对同一 bundle 混用。每个 bundle 只使用一种安装与清理机制,避免同一个 bundle 被重复组合。

行 id 冲突会被拒绝

如果补丁行 id 与用户层或其他 bundle 冲突,该 bundle 会被拒绝安装。

无法解析包名的 git spec 会失败

使用 git spec 安装时,如果无法解析出包名,会明确失败。

普通库会被拒绝

没有 dsh.bundle.patch 的普通库会被拒绝,并自动 pnpm remove 回滚。

旧安装格式不支持

旧的 .dsh-plugin / config.yaml 安装格式不支持。

非闭包 peer 由 bundle 作者负责

如果 bundle import 的 peer 既不在 profile 中,也不在 DSH 安装闭包中,其可用性由 bundle 作者负责。

远程信任需要注意

/plugin-manager/* 路由对任何能触达服务器的人都开放。

如果将实例暴露到局域网,不能依赖 /api 信任围栏的保护。暴露前需要先确认网络边界和访问控制。

pnpm minimumReleaseAge

pnpm ≥ 11 的 minimumReleaseAge 默认会拒绝刚发布的包。

管理器执行 pnpm 时会附加:

--config.minimumReleaseAge=0

安装前应检查源码与许可证

这个插件会在当前 dsh 实例中管理 profile 插件 bundle,并以当前 dsh 进程权限运行。

在安装其他插件前,应先检查目标 bundle 的源码、许可证和依赖来源。

链接

  • 社区目录:https://www.skillhub.cn/plugins/kyorakuyk/dsh-hotreload-plugin-manager
  • GitHub:https://github.com/kyorakuyk/dsh-hotreload-plugin-manager

该目录页是社区目录,不是官方应用商店;它作为独立站点列出插件,与 DeepSeek / 幻方无官方从属关系。

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

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

Xiaoye