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 / 幻方無官方從屬關係。

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

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

小夜