dsh_plugin_refresh:装完即用、无需重启的 DSH 插件激活与热重载

前言

在 DeepSeek Harness(DSH)里装插件,常见流程是改 profile、等 plugin-manager 落盘,然后重启进程才确认「真的跑起来了」。官方在在线 profile 且 hmr 已组合时,对全新 bundle 安装已经能进程内生效;但重装同名依赖、首次 import 失败后再改文件、或改动了 node_modules 里同路径的插件代码,仍经常变成「下次启动才生效」。若你频繁试装插件、本地 link: 开发,或依赖 Web 插件页操作,这类空窗会反复出现。

下面介绍社区维护的 Host 侧插件 dsh_plugin_refresh(维护者 lixiaohao001,分类:客户端):它监视已安装组合,在运行中的进程里完成激活与深度重载,且不写入 profile manifest 或 patch 层。插件目录页见 SkillHub,源码与文档在 GitHub(MIT,当前 package 版本 0.1.0)。

这是什么

dsh_plugin_refresh 是 DSH 的 Host 插件:安装后默认自动检查已选中的 bundle,对「已选中但未挂载」的行走与 Web 插件页相同的官方路径重新驱动,并对路径未变但文件已变的插件模块做就地 deep reload。它不执行 npm 安装/卸载,也不改你的 profile 文件内容。

它补齐的三类缺口

README 用表格归纳了没有本插件时的典型表现,核心如下。

情况 没有本插件时
依赖名在 profile 中已存在(重装、升级、本地 re-link) installBundle 可能在重载前返回 application: "restart-required",选择已保存但未挂载
插件第一次 import 失败 Node 缓存失败的 module job,修文件后同 URL 仍报错,直到重启
插件文件在同一路径下被改动(重建 bundle、本地开发) 包在 node_modules 下,官方热重载按设计忽略该目录,进程仍跑旧代码

核心能力

一次串行化的 pass,在启动延迟后、每次 plugin-manager 操作后、以及监视路径变化时触发(事件驱动,辅以指纹轮询)。

  1. 深度重载(deep reload)
    对模块文件在路径不变前提下已变更的在线插件,按 @deepseek-ai/dsh-hmr 同类步骤清理 ESM loadCache(Node 24 需用 Map.prototype.delete)与 CJS require.cache、重新 import、替换 registry 中的旧代并在原 fiber 上重新激活,尽量保留 Loader Entry 与 config。

  2. 自动修复(repair)
    对已选中但没有运行行的 bundle:丢弃被污染的 module job,先 import 一次以捕获真实异常,再通过 pluginManager.setBundleEnabled() 重走官方组合路径。若裸 specifier 无法解析(常见于 profile 外的 link: 安装),则改用已解析的文件 URL 激活。

  3. 状态上报
    输出每个 bundle 的健康表(选中、运行行、错误)与有界 pass 历史,写入日志,并可通过 HTTP 查询;修复详情中的 repairs[].probe.error 往往比 plugin-manager 的 failed to import 更具体。

与社区里其他「免重启」方案相比,README 明确本包侧重:自动、无第三方依赖(仅 node: 内置模块)、修复首次 import 失败、支持本地 link:;不提供浏览器 UI,也不代替 plugin-manager 做包操作,且会触及 Node loader 内部实现,对 DSH / Node 版本较敏感。

安装与启用

从 GitHub 安装(README 原文命令,无需 npm 发布):

dsh plugin --profile desktop add github:lixiaohao001/dsh_plugin_refresh

本地开发时可将仓库路径作为 bundle 安装(编辑即运行,无构建步骤):

dsh plugin --profile desktop add /absolute/path/to/dsh_plugin_refresh

在 Agent 会话中,也可通过 plugin_manager 工具的 install_bundle,传入同样的绝对路径。包声明 dsh.bundle.patch,会作为 profile bundle 插入一行 id: plugin-refresh、name: dsh_plugin_refresh。

环境要求(来自 package.json 与 README)

  • Node:^22.19.0 || >=24.0.0
  • DSH peer:@deepseek-ai/dsh >=0.2.0-rc.2 <0.3.0-0(README 徽章标注在 0.2.0-rc.2 的 desktop profile 上验证)
  • hmr、pluginManager、webServer 等均为可选依赖;缺少时插件会加载并报告无法完成的项

配置

在 profile 的 patch 里为 plugin-refresh 行覆盖 config。常用字段默认值均为面向「装完即检、即修、即重载」:

字段 默认 含义
autoCheck true 启动后与每次 plugin-manager 操作后检查
autoRepair true 对刚安装/启用但未运行行的 bundle 重驱动
deepReload true 对同路径下文件已变的模块做深度重载
watchProfile true 监视 profile patch 与 manifest
devWatch [] 额外监视的绝对路径(开发用)
devReload true devWatch 变化时 deep reload
pollIntervalMs 2000 指纹轮询间隔,0 关闭
debounceMs 400 合并短时间内的多次变更
startupDelayMs 1200 应用就绪后首次检查的延迟
route /api/plugin-refresh HTTP 前缀;空字符串关闭接口
verbose false 是否记录「无事可做」的 pass

开发时监视自有插件目录的示例:

- id: plugin-refresh
  config:
    devWatch:
      - /absolute/path/to/my-plugin/lib

典型用法

日常:安装其他插件后等待自动 pass

保持默认 autoCheck / autoRepair / deepReload 即可。安装或启用 bundle 后,无需手动重启 DSH;若仍异常,再查状态接口(见下)。

手动触发检查或重载

HTTP 仅绑定回环地址,与 DSH Web server 一致;POST 需同源请求(浏览器)或不带 Origin 的客户端。

方法 路径 作用
GET /api/plugin-refresh/status 配置、最近 pass、bundle 健康、历史
GET /api/plugin-refresh/status?detail=1 附加各 entry 模块快照
POST /api/plugin-refresh/check 立即执行一次 pass
POST /api/plugin-refresh/repair?bundle=<名字> 修复指定 bundle;省略参数则处理全部不健康 bundle
POST /api/plugin-refresh/reload?path=<绝对路径> 对拥有该路径的插件 deep reload

改完插件源码后,可 POST reload(README 示例端口为 19387,以你本机 Web 端口为准):

Invoke-WebRequest -Uri 'http://127.0.0.1:19387/api/plugin-refresh/reload?path=<my-plugin>/lib' -Method POST

成功就地替换自身或其它插件时,/status 中的 generation 会变化,便于确认热重载是否发生。

排错时读 status

  • pass 级 error:检查流程本身失败
  • repairs[].probe.error:真实 import 原因
  • repairs[].purgedModules > 0:已清除失败 module job
  • repairs[].rebound:通过解析后的 file URL 启动
  • health[].needsRepair === true:已选中但无运行行

适用场景与注意

适合:经常在同一 DSH 进程里安装/升级插件、用本地 link: 联调 Host 插件、或需要改 node_modules 内同路径 bundle 后立即验证的行为。

务必知晓:

  • 插件以当前 DSH 进程的权限运行;安装前请阅读源码与 MIT 许可证,仅从可信来源安装。
  • 若替换导致解析到的包目录变化(例如 node_modules 下换了一个版本目录),仍可能需要重启;同路径文件内容变更才由 deep reload 覆盖。
  • Host 侧激活后,浏览器模块仍依赖 dsh-client-modules / dsh-client-hmr;客户端未更新时,页面可能需要手动刷新。
  • 状态路由无额外鉴权(仅 loopback),会暴露插件名与路径;敏感环境可将 route 设为 "" 关闭。
  • 每个 bundle 的 repair 约 15 秒内限一次,避免与 plugin-manager 事件形成环路。

DSH 生态强调「一切皆插件」;SkillHub 等社区目录独立于 DeepSeek / 幻方,并非官方应用商店。

结尾

dsh_plugin_refresh 把「装完插件还要重启」缩成默认自动的检查、修复与深度重载流程,并补上了首次 import 失败与 link: 本地安装等边角。若你在 desktop profile 上迭代插件,可先按上文命令安装,再用 /api/plugin-refresh/status 核对 bundle 健康。

  • 目录页:https://www.skillhub.cn/plugins/lixiaohao001/dsh_plugin_refresh
  • 仓库:https://github.com/lixiaohao001/dsh_plugin_refresh
羽毛球分组比赛记分
小程序二维码

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

小夜