前言¶
DeepSeek Harness(DSH)的 desktop profile 裏,插件往往通過 npm 包名安裝並寫在 package.json 裏。官方插件頁可以逐個添加,但「哪些已裝插件有新版本、能否批量更新、更新失敗怎麼回滾」並沒有一套與 DSH 界面風格一致的集中入口。手動改依賴、在終端裏反覆 remove / install,既容易漏掉 engines 與 bundle 校驗,也會在對話或後臺任務仍在運行時撞上文件鎖。
下面介紹社區插件 dsh-plugin-update-center(維護者 darkings,分類 admin-security)。它在側邊欄賬號行提供與 DSH 原生更新提示並排的 chip,只處理 npm registry 來源的 profile 插件;自帶檢查緩存、排隊等待空閒、快照回滾、安裝後校驗,以及卸載殘留掃描。DSH 自帶插件、github: / git: / file: 等來源的插件,以及 DSH 本體更新,都不在本插件職責範圍內。
這是什麼¶
dsh-plugin-update-center 是發佈在 npm 上的 DSH bundle(當前資料中 package 版本爲 1.0.2,MIT 許可證)。Host 側註冊 API,客戶端通過 shell.overlay 與 React portal 把更新 chip 掛到側邊欄底部登錄名右側,視覺規格對齊 DSH 的 DesktopUpdateIndicator。
它解決的核心問題是:在不動 DSH 本體更新的前提下,對 profile 裏已安裝、可移除、無錯誤的 npm 插件做版本檢查與串行更新,並在批次開始前寫 profile 快照,失敗時按插件回滾,避免 profile 與 patch 元數據損壞導致無法啓動。
核心功能¶
更新檢查¶
檢查邏輯從 pluginManager.listBundles() 出發,只保留 installed 且 availability === "profile" 的 bundle,並解析依賴是否爲 name@版本/範圍 形式的 npm 安裝。
向 registry.npmjs.org 查詢 dist-tags.latest 與 manifest;失敗時回退 registry.npmmirror.com。過濾穩定版、未 deprecated、含 dsh.bundle、sha512 合法、且 engines.dsh / engines.node 與當前環境兼容的包;僅當最新版嚴格大於已裝版本時才列入可更新列表。
結果在 Host 內存緩存 30 分鐘;刷新頁面不會重複請求,彈窗內「重新檢查」會強制刷新。
側邊欄更新與進度¶
- 更新 chip:下載圖標;無可更新時不顯示;有更新時顯示數量;排隊顯示時鐘;更新中顯示旋轉圖標與
n/total。 - 點擊打開 DSH 原生風格彈窗:勾選插件後點「更新 N 個插件」。有任務運行時按鈕變爲「任務完成後自動更新」,進入 Host 側隊列。
- 進度視圖包含總進度條、當前插件名,以及每個插件的階段:等待 / 覈對版本 / 移除舊版 / 安裝新版 / 已更新 / 待重啓 / 失敗。官方 API 不暴露 pnpm 字節級下載進度,進度按階段權重推進(覈對 5% → 移除 35% → 安裝 65% → 完成 100%)。
DSH 本體處於 available / downloading / installing / ready 等更新階段時,禁止開始插件更新,隊列也會等待。
更新與回滾¶
因當前 DSH 的 pluginManager 沒有 updateBundle,單個插件按與官方插件頁相同的方式更新:
removeBundle(name)
installBundle(`${name}@${latest}`, { enabled: 原狀態, saveExact: true, registry, requestId })
失敗按插件處理:失敗項自動裝回舊版本(含 remove 階段失敗導致舊版已被刪的情況),已成功項保持新版本。EPERM、EBUSY、ECONNRESET 等瞬態錯誤短退避重試 3 次。依賴失敗插件的項標記爲「跳過」。僅當回滾也失敗或 package.json / patch 元數據損壞時才停止批次,並提示恢復快照。
批次開始前會把 package.json、pnpm-lock.yaml、pnpm-workspace.yaml、cordis.patch.yml、cordis.yml 複製到 $DSH_HOME/plugin-updates/snapshots/<timestamp>/;快照失敗則拒絕開始更新。對「啓動關鍵」與「被其他插件 inject」的插件默認不勾選,勾選時有警告。
排隊與生效¶
有對話 turn 或後臺 job 時,直接更新會 busy;可進入隊列,等待任務空閒後再靜默 10 秒、5 秒倒計時開始(倒計時內來新任務會退回等待)。隊列保存在 Host 內存,頁面刷新不影響,Host 重啓後不自動續跑。
全部完成後:有失敗則不自動刷新並支持「重試失敗項」;否則若需重啓則只提示重啓;否則若成功項含 dsh.client 則 3 秒倒計時後自動刷新(可取消)。插件不自動重啓 DSH。
卸載殘留¶
只做檢測與提示,不接管官方卸載。檢測三類:profile 裏懸空的插件選擇、cordis.patch.yml 中引用不存在包的 name: 行、與懸空包同名的 $DSH_HOME 數據目錄。
殘留 chip 使用垃圾桶圖標與警告色,與更新 chip 區分。窗口底部「清理」會刪除懸空 bundle 選擇與失效補丁條目(先快照、原子寫回);數據目錄僅報告,不自動刪除。
離線恢復¶
倉庫提供 repair.cmd / repair.mjs。DSH 打不開時,可先使用錯誤對話框中的「禁用第三方插件、備份 profile patch 並重啓」,再運行:
repair.cmd --list
repair.cmd # 恢復最新快照並重裝依賴
repair.cmd --snapshot <目錄名> # 指定快照
repair.cmd --no-install # 只恢復文件
安裝與啓用¶
npm 包名:dsh-plugin-update-center。
通過 DSH CLI 安裝到 desktop profile:
dsh plugin --profile desktop add dsh-plugin-update-center
也可以在 DSH「插件 → 添加插件」中輸入 dsh-plugin-update-center。
資料要求 engines:dsh >= 0.2.0-rc.1,node 爲 ^22.19.0 || >=24.0.0。安裝前請閱讀倉庫源碼與 MIT 許可證;插件以當前 DSH 進程權限運行,屬於 admin-security 類能力,應自行評估信任邊界。
典型用法¶
- 安裝並刷新 Web 頁面一次(新裝或更新 client 插件後需刷新才能加載 Client 模塊;Host 半可由 HMR 重載)。
- 在側邊欄賬號行查看更新 chip;點擊打開列表,勾選要更新的插件(啓動關鍵項建議一次只更新一個,更新後重啓驗證)。
- 若當前有任務,選擇「任務完成後自動更新」進入隊列。
- 更新完成後按提示重啓 DSH 或刷新頁面;若出現 fatal 異常,先
repair.cmd回到快照再單獨排查,避免連續重試。 - 若發現殘留 chip,打開窗口查看明細,確認後再點「清理」。
維護者建議:普通插件可批量;啓動關鍵或被依賴插件一次一個,更新後先重啓確認能打開再繼續下一批。
適用場景與注意¶
適合:長期在 desktop profile 中維護較多 npm 來源 DSH 插件、希望與 DSH 桌面更新提示同一入口檢查版本,並需要快照與按插件回滾的用戶。
務必知曉的限制(來自 README 已知限制):
- 只處理頂層 profile 依賴;Suite 組合包子插件需按組合包自身方式更新。
- 賬號行無官方 list 插槽,chip 依賴 DOM 錨點;DSH 大版本改動相關 DOM 時可能需插件同步適配。
- 更新爲「先卸後裝」;Windows 上
package.json被佔用(EPERM)可先重試或重啓 DSH 釋放鎖。 - 瀏覽器模式無法訂閱
dshDesktop.updates,DSH 本體更新門控與桌面 preload 行爲不一致時,僅能按運行版本重查兼容性。 - 社區目錄 SkillHub 插件頁 與 GitHub 倉庫由社區維護,與 DeepSeek / 幻方無官方從屬關係;星標與目錄信息以各站點當時展示爲準。
結尾¶
dsh-plugin-update-center 把 profile 內 npm 插件的版本檢查、排隊更新、快照回滾、安裝校驗和卸載殘留提示收進側邊欄,並儘量對齊 DSH 原生更新交互。需要源碼、問題反饋與 repair 腳本說明時,見 GitHub:darkings/dsh-plugin-update-center。