dsh-startup-guard:在 DSH 啓動前修復會話日誌、預檢插件組合並隔離崩潰源

前言

DSH 的擴展能力依賴大量第三方插件組合而成。一個插件包缺失、cordis.patch.yml 中的條目失效、client 產物不可用,或者宿主插件在啓動階段拋出運行時錯誤,都可能在啓動時把 dsh web 卡住。

dsh-startup-guard 是一個面向 DeepSeek Harness 的啓動守衛插件。它在啓動前檢查會話日誌、插件清單、bundle 解析、patch 組合、client 產物和宿主 apply(),把可修復的問題先處理掉,並把高風險插件隔離起來。

這是什麼

dsh-startup-guard 由 aokamoaki 維護,許可證爲 MIT。

它的一句話定位是:在啓動前修復會話日誌、預檢插件組合、執行宿主插件冒煙測試,並隔離崩潰源,避免「插件損壞 / 日誌損壞」把 DSH 卡死在啓動。

這個插件不是替代 DSH 本身,而是在 DSH 插件體系內提供一個啓動前檢查與兜底層。

核心功能

下面介紹它已覈實的幾項能力。

會話日誌修復

它可以修復 session.jsonl[.zstd] 中的 seq 損壞、torn 尾幀和過期緩存,並在修復前備份原件。

適合的場景是:本地 ~/.dsh 中的會話日誌已經出現異常,但不想直接刪除整份日誌,先做一次可回溯的修復。

插件清單與源碼快照

它會爲 profile 的 package.json、cordis.patch.yml、pnpm 清單以及 link 插件源碼生成快照,並記錄 host/client/patch 指紋。

這一步的作用是把當前插件組合固定下來,後續回滾或排查時有可比較的基線。

bundle 預檢與回滾

它會校驗第三方 bundle 目錄是否可解析。缺失時會回滾到可解析快照,並把壞清單另存爲 package.json.broken。

這適合處理插件包安裝後目錄不完整、路徑解析失敗、或 package.json 與真實 bundle 不一致的問題。

組合預檢與自動禁用

它會檢測 entry id 重複、name 不可解析和 YAML 致命形態。

對 name 失效的 row,它可以自動禁用;在 strict 模式下,會寫塊標記並讓啓動器拒絕啓動。

client 產物校驗

它會校驗 client 產物中的 exports['./client'] 與 __ModuleLoader__.load 註冊,並在 vm 沙箱中執行加載,同時檢測重複 client id。

這一步針對的是“插件能安裝,但 client 產物不可用”的情況。

宿主 apply() 冒煙

它會在子進程和 mock Cordis 環境中執行第三方插件的 apply(),識別啓動即拋出的錯誤,並按指紋緩存結果。

這一步用於發現宿主插件在啓動早期就拋異常的運行時問題。

崩潰隔離

它會基於崩潰標記或啓動標記觸發全量冒煙。是否自動禁用冒煙失敗插件,還要看崩潰標記是否在場、插件是否顯式聲明 smoke 爲 true,或是否屬於客戶端產物損壞。

這個機制在純 dsh web 場景下也會生效。

安裝與啓用

先安裝插件:

dsh plugin --profile web add dsh-startup-guard

如果要從 GitHub 源碼安裝,可以用:

dsh plugin --profile web add github:aokamoaki/dsh-startup-guard

安裝後,重啓 dsh web 即自動生效。

運行環境方面,package.json 要求 Node >=22.13,並聲明 peerDependency:

"@deepseek-ai/cordis": "^4.0.1"

配置文件位於:

~/.dsh/dsh-startup-guard.json

該配置可選,缺省使用默認值。

模式包含 report、fix 和 strict,其中 fix 是默認模式;strict 會寫塊標記並讓啓動器拒絕啓動。

典型用法

首次啓動

首次啓動後,它會執行以下動作:

1、掃描並修復會話日誌;
2、快照當前插件清單;
3、執行宿主冒煙和客戶端校驗;
4、寫入運行報告。

報告文件位於:

~/.dsh/dsh-preflight-report.json

本地幹跑

如果只是想看檢查結果,可以先運行:

node guard-sessions.mjs --dry-run

如果要在 strict 模式下檢查:

node guard-sessions.mjs --mode strict

調用核心入口

它也可以通過核心 API 調用:

import { runGuard } from 'dsh-startup-guard/lib/guard-core.mjs';

const r = await runGuard(home, { dryRun: true });

runGuard 是核心入口,傳入 home 目錄和運行參數,返回本次 guard 的執行結果。

運行數據與恢復

運行數據會寫入 ~/.dsh,包括:

dsh-preflight.log
dsh-preflight-state.json
dsh-preflight-report.json
dsh-crash-state.json
dsh-boot-state.json
dsh-preflight-block.json
repair-backups/
plugin-snapshots/

其中,repair-backups/ 用於保存修復或禁用前的原文件備份;plugin-snapshots/ 用於保存插件清單和源碼快照。

如果發生誤禁用,可以刪除對應 profile 的 cordis.patch.yml 中的 disabled 條目。原 patch 已備份到 repair-backups/。

自動禁用策略

這裏需要注意它的禁用邊界:

1、單獨的冒煙失敗不會自動禁用;
2、崩潰標記在場,且冒煙失敗時,對應插件可被自動禁用;
3、插件顯式聲明 smoke 爲 true 時,冒煙失敗可被自動禁用;
4、客戶端產物損壞則照常自動禁用。

這個策略比較謹慎:冒煙跑在 mock 環境,失敗既可能是真實錯誤,也可能是插件依賴真實 DSH 服務導致的環境缺口。

適用場景與注意

適合以下使用者:

1、日常維護 dsh web profile 的人;
2、組合多個第三方 DSH 插件的開發者;
3、希望把會話日誌損壞、patch 失效、bundle 解析失敗、client 產物問題從“啓動即崩”變成“啓動前檢查 + 可回滾”的人。

使用前需要確認:

1、許可證爲 MIT;
2、README 聲明與 DeepSeek 官方無關;
3、插件以當前 dsh 進程權限運行,安裝前應檢查源碼與許可證;
4、不要把它理解成 DSH 官方應用商店或官方發行渠道的一部分;
5、目錄頁 URL 未在已覈實資料中確認,建議以 GitHub 倉庫爲準。

鏈接

GitHub 倉庫:

https://github.com/aokamoaki/dsh-startup-guard

安裝命令:

dsh plugin --profile web add dsh-startup-guard
羽毛球分组比赛记分
小程序二维码

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

小夜