DSH Crash Guard:啓動防白屏與插件崩潰隔離

前言

DeepSeek Harness(DSH)採用「一切皆插件」的架構,Profile 裏往往同時掛着多個社區前端插件。只要某個 bundle 在構建或運行階段出現語法錯誤、Lazy-CJS 契約不符,或依賴未就緒導致條目長期未激活,官方啓動審計就可能拋出 N entries did not activate 一類錯誤,Electron 窗口直接白屏或彈出崩潰對話框。常見應對方式是用外部 watchdog 包裝啓動腳本,或在出事後手改 package.json、state.json 與 cordis.patch.yml 逐個禁用插件——前者增加啓動鏈路複雜度,後者容易誤傷正常配置。

下面介紹維護者 zxzc114514 發佈的 dsh-crash-guard(目錄分類 admin-security)。它以純插件形態接入 DSH 0.2.0-rc.2 起引入的 ClientModuleRegistry 與瀏覽器端 IZ() 審計流程,在 Node 與 Web 兩層主動攔截故障條目,並用文件指紋(rev)做靜默隔離,儘量在不改動用戶正式配置文件的前提下恢復 GUI 啓動。

這是什麼

DSH Crash Guard(防崩衛士) 是面向 DSH 的啓動容錯插件:隔離損壞或未成功激活的前端插件產物,避免整窗白屏,並在插件代碼或市場版本變更後自動解除隔離、重新嘗試加載。設計思路參考 Minecraft 社區 Not Enough Crashes 的容錯思路,但實現完全落在 DSH 插件體系內,不依賴外部守護進程。

核心功能

雙層崩潰防護

Node 宿主預檢:服務端啓動時對前端插件 bundle 做基於文件指紋(rev)的 V8 經典腳本語法與 Lazy-CJS 契約預檢。預檢失敗的條目會從 ClientModuleRegistry 剝離,並調用 compose() 重建乾淨的啓動圖譜,避免向後端/前端分發損壞 bundle。

Web 引導攔截:在瀏覽器端官方 IZ() 嚴格審計之前,通過包裝 __ModuleLoader__.create 動態介入;對未成功激活的前端條目執行 loader.remove(),並清理殘留樣式,降低因未激活條目觸發的白屏崩潰彈窗概率。

指紋綁定靜默隔離(Revision-bound Quarantine)

啓動階段發現故障時寫入獨立隔離文件 .dsh-market/crash-guard-quarantine.json,不修改用戶的 package.json、state.json 與 cordis.patch.yml。同一插件代碼指紋不變時,下次啓動會靜默跳過且不再彈窗;本地改碼或市場更新導致指紋變化後,自動解除隔離並重新加載。

手動持久化禁用

若確認需要徹底停用某個插件,可在頂欄救援面板中選擇永久禁用。此時會同步寫入 .dsh-market/state.json、從 package.json 的 dsh.profile.bundles 移除對應項,並在 cordis.patch.yml 中將條目標記爲 disabled: true。

頂欄救援面板

面板使用 DSH 系統語義色彩變量(--dsw-alias-*),明暗主題自適應。膠囊嵌在 Windows 40px 標題欄右側、最小化按鈕左側拖拽帶內(right: 150px),展開後可查看故障分類、上游阻斷源(blockedBy)與報錯堆棧。

安裝與啓用

插件聲明的 DSH 版本範圍爲 >=0.2.0-rc.2 <0.3.0-0,Node.js 需 >=20;不向下兼容 0.1.x。

方式一:DSH 命令行

官方 npm 源:

dsh plugin add dsh-crash-guard

GitHub 源碼倉庫:

dsh plugin add github:zxzc114514/dsh-crash-guard

方式二:Profile 手動引入

在 Profile 的 package.json(常見路徑如 ~/.dsh/profiles/desktop/package.json)中聲明依賴並加入 bundle:

{
  "dependencies": {
    "dsh-crash-guard": "^1.0.0"
  },
  "dsh": {
    "profile": {
      "bundles": [
        "dsh-crash-guard"
      ]
    }
  }
}

引用 GitHub 固定標籤示例:

{
  "dependencies": {
    "dsh-crash-guard": "github:zxzc114514/dsh-crash-guard#v1.0.0"
  }
}

安裝完成後按常規定義將其列入 Profile 的 bundles 並重啓 DSH 進程即可參與啓動鏈路。

典型行爲與驗證記錄

README 在 DSH 0.2.0-rc.2 與 0.2.0-rc.3 下記錄了兩種場景的實測:

  1. 客戶端腳本語法損壞:向測試插件注入非法頂層 return。Node 預檢在約 11ms 內捕獲語法異常,移入隔離記錄並重構啓動圖,避免分發損壞 bundle。
  2. 缺失上游依賴導致未激活:測試插件聲明未安裝的依賴,條目停滯在初始化。Web 引導攔截在 IZ() 審計前剪除未激活節點,窗口進入主界面;救援膠囊標註故障插件並高亮 blockedBy 依賴包名。

日常使用中,多數故障會在首次啓動時被靜默隔離;需要排查時點擊標題欄膠囊查看堆棧與阻斷鏈,確認無誤後再選擇永久禁用或修復上游插件後等待指紋變更自動重試。

與外部 watchdog 方案的差異(摘要)

維度 外部守護進程包裝啓動 dsh-crash-guard
形態 需改寫 bin/dsh.cmd 等啓動鏈 純插件,零外部依賴
攔截時機 進程掛起或崩潰後被動介入 Node 預檢 + 渲染層 __ModuleLoader__ 主動攔截
前端白屏 難以阻斷 IZ() 審計拋錯 審計前拓撲剪枝(pruneInactiveEntries)
隔離 常依賴改配置文件 rev 綁定隔離文件,正式配置不動
排查 日誌或命令行 標題欄救援膠囊

適用場景與注意

適合:Profile 中前端插件較多、頻繁試裝社區 bundle,且希望在單插件損壞時仍能打開 DSH 主界面的開發者或運維。

注意:

  • 插件以當前 DSH 進程的權限運行,會讀取並掛鉤模塊註冊表、注入 Web 引導邏輯;安裝前應閱讀倉庫源碼與 MIT 許可證,確認符合你的安全策略。
  • 版本約束嚴格綁定 0.2.x RC 段;升級 DSH 主版本前需覈對 engines.dsh 是否仍匹配。
  • 社區目錄 skillhub.cn 爲獨立生態站點,與 DeepSeek / 幻方無官方從屬關係;星標與分類信息以目錄頁爲準(當前簡介側寫爲 admin-security)。

結尾

dsh-crash-guard 把啓動穩定性收攏到 DSH 插件層:預檢 + Web 剪枝 + 指紋隔離,必要時再通過救援面板做正式禁用。若你正在維護多插件 Profile,可先通過命令行或 Profile 依賴安裝,再在故意損壞的測試 bundle 上對照 README 的驗證步驟確認行爲。

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

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

小夜