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
羽毛球分组比赛记分
小程序二维码

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

小夜