前言¶
在 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 操作后、以及监视路径变化时触发(事件驱动,辅以指纹轮询)。
-
深度重载(deep reload)
对模块文件在路径不变前提下已变更的在线插件,按@deepseek-ai/dsh-hmr同类步骤清理 ESMloadCache(Node 24 需用Map.prototype.delete)与 CJSrequire.cache、重新 import、替换 registry 中的旧代并在原 fiber 上重新激活,尽量保留 LoaderEntry与 config。 -
自动修复(repair)
对已选中但没有运行行的 bundle:丢弃被污染的 module job,先 import 一次以捕获真实异常,再通过pluginManager.setBundleEnabled()重走官方组合路径。若裸 specifier 无法解析(常见于 profile 外的link:安装),则改用已解析的文件 URL 激活。 -
状态上报
输出每个 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的desktopprofile 上验证) 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 jobrepairs[].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