前言¶
DeepSeek Harness(下文簡稱 dsh)是 DeepSeek 開源的智能體運行時,官方倉庫在 deepseek-ai/deepseek-harness,核心理念是「一切皆插件」:模型適配、工具、會話、循環、界面都可以換成插件,掛到 Cordis 運行時上。它目前仍是 developer preview,上游幾乎每天會發一個新的 snapshots/... 快照分支。
對長期掛着 dsh web 的人來說,這會帶來一組很具體的問題:今天的快照能不能安全切過去?切完 web 起不來怎麼辦?重啓會不會把正在跑的 agent 打斷?會話看起來丟了,該從哪修?這些問題不是換皮膚能解決的,而是運維問題。
社區目錄 DeepSeek Harness 插件庫 把 dsh-harness-ops 收在「界面增強」分類下。需要先說清楚:這個站點是獨立的社區目錄,與 DeepSeek 或幻方沒有從屬、背書或贊助關係;官方發現插件的入口仍是 GitHub topic dsh-plugin。本文只介紹這個倉庫已經寫進 README 和安裝腳本的能力,不把它寫成官方應用商店裏的推薦位。
這是什麼¶
dsh-harness-ops 是一套給 dsh 用的運維工具箱,GitHub 倉庫爲 fakechris/dsh-harness-ops,維護者是 fakechris。許可證是 MIT,版權欄寫的是 songchuansheng(2026)。倉庫根目錄 VERSION 當前爲 0.3.2(CHANGELOG 標註日期 2026-08-14);截至 2026-08-17,GitHub 顯示 11 星,目錄頁仍寫 9 星,以倉庫頁面爲準。
它不是單一的 Cordis 插件,而是「4 個 skill + 1 個 bundle 插件」的混合倉庫。2026-08-11 曾用名 dsh-skill-snapshot-ab,後來從「純 A/B 輪換 skill」長成了現在的工具箱;skill 目錄名 dsh-snapshot-ab 保持不變,因爲它同時是觸發名和 ab.sh 的安裝路徑。
倉庫 README 用五個問題概括它要回答的事:
- web 掛了誰拉起?
- 拉起後工作繼續嗎?
- 會話看起來丟了怎麼辦?
- 官方發新版本怎麼安全切換?
- A/B 兩個槽都掛了怎麼一鍵救?
對應組件如下。
| 組件 | 類型 | 管什麼 |
|---|---|---|
skills/dsh-snapshot-ab |
skill | 官方每日快照 A/B 雙槽輪換,驗收通過才原子切換 |
skills/dsh-web-guard |
skill | launchd / systemd 守護,端口空閒約 10 秒內拉起 dsh web |
skills/dsh-session-recovery |
skill | 「0 sessions」或日誌損壞時的定位與無損修復 |
skills/dsh-web-doctor |
skill | web / A/B 全掛時,終端一鍵診斷 → 修復 → 拉起 |
plugins/dsh-restart-recover |
Cordis bundle | 重啓後檢測被打斷的 turn,自動注入續接 |
bundle 插件已發佈到 npm,包名是 @fakechris/dsh-restart-recover,當前 package.json 版本爲 0.2.1。skill 走的是 ~/.dsh/skills/ 目錄掃描,不進 npm。
核心功能¶
A/B 雙槽:新快照先進隔離槽¶
心智模型可以畫成下面這樣:
~/.local/bin/dsh
└─> ~/.dsh/source/current ← 符號鏈接,指向當前生效的槽
├─ slot-a/ 舊版(已驗證,生產兜底)
└─ slot-b/ 新快照(構建 + 驗收通過後的候選)
生產實例永遠只跑 current 指向的那個槽,默認地址是 http://127.0.0.1:3080。切換是一次原子的 ln -sfn,再加上重啓 dsh web。A/B 是槽位身份,目錄名固定;內容每天互換:舊版佔一個槽,新快照進另一個槽。
prepare 在非當前槽裏做完整流水線:檢出快照、pnpm install --frozen-lockfile、build:lib + build:web、擴展 relink、typecheck / build / test、運行時依賴檢查、staging 端口(默認 3081)冒煙 HTTP 200。任何一步失敗都會還原擴展鏈接,不動生產,phase 回到 idle。
驗收過了才 switch。默認 acceptance.mode 是 manual,必須帶 --yes;也可以改成 auto,前提是 e2e 已經用真實瀏覽器斷言過配置裏的 UI 元素(例如 #dsh-track-fab)。切換後還要 $AB confirm,纔會解鎖下一天回收回滾槽——在此之前,舊槽始終是退路。$AB rollback --yes 會把 current 指回上一版並重啓 web。
倉庫把這套設計和官方 dsh-upgrade 區分開:後者是 rebase 到上游 master 的整合流程;本機制面向「官方每日快照 + 本地擴展外掛」的日常輪換,兩者可以共存。
10 秒守護 + 斷點續接¶
dsh-web-guard 用 macOS 的 launchd 或 Linux 的 systemd 託管,PPID=1,不跟 web 進程綁在一起。v0.3.1 起判活只認 LISTEN 態 socket(lsof -ti :PORT -sTCP:LISTEN),避免瀏覽器還掛着舊連接時把端口誤判爲「被佔用」,從而永不拉起。CHANGELOG 記錄過 2026-08-14 的實測:舊判定下 3080 停機大約 20 分鐘都沒有被拉起來。
光把進程拉起來不夠。dsh-restart-recover 監聽 agent/created,發現上一輪是 interrupted 就自動注入續接消息,用戶不用再敲「繼續」。它和 guard 的分工是:guard 負責進程,bundle 負責會話。ab.sh switch/rollback 殺掉 web 之後,guard 拉起新的 current,restart-recover 再續上被打斷的 turn。
web 全掛時走終端醫生¶
agent 是由 web 託管的。web 起不來,GUI 和 agent 一起沒了,這時再依賴頁面上的插件沒有意義。dsh-web-doctor 是 out-of-band 入口:純終端,不加載 web 擴展,依賴本機的 node / zstd / jq / curl / ps / lsof。
安裝腳本會把 doctor.sh 鏈到 ~/.local/bin/dsh-doctor。常用入口:
dsh-doctor # 交互菜單(默認英文,菜單裏可切中文)
dsh-doctor --guide # mini TUI:看完整思維鏈,隨時 Ctrl-C 打斷再指引
診斷固定九項:web 健康、launcher 鏈、擴展 relink、槽可啓動、session 文件層、web.log、profile bundles 依賴、LLM 配置(.env key)、最近會話最後發生的事。修復分兩層:菜單 2 是機械修復已知配置故障(relink、插件依賴、launcher、session、LLM 憑據),不調模型;菜單 3 / 4 用 dsh --profile headless 起一次性 agent,讀報告和日誌推理根因。headless 不加載 web 的擴展 bundle,所以擴展把 web 搞掛時,醫生自己還能跑。
README 寫明:2026-08-13 有一次無人值守的 --agent 長跑失敗,所以後來加了 --guide 的人機協同模式——LLM 自動判斷和修復,人看完整思維鏈,覺得不對就打斷。這是倉庫自己的設計取捨,不是第三方評測。
會話如果只是「側邊欄變成 0 sessions」或 zstd 日誌損壞,先走同倉庫的 dsh-session-recovery,不要一上來就整槽回滾。
安裝與啓用¶
目錄頁給出的安裝命令如下,在 DeepSeek Harness 終端裏可以直接跑:
dsh plugin add github:fakechris/dsh-harness-ops
如需可復現安裝,按目錄頁說明固定 commit 哈希。截至 2026-08-17,倉庫 main 最新提交是 c2d10c9d4707eb6685669ff375fa7617a7554a47:
dsh plugin add github:fakechris/dsh-harness-ops#c2d10c9d4707eb6685669ff375fa7617a7554a47
這條命令走的是 dsh CLI 的 GitHub 解析路徑。對本倉庫來說,完整工具箱(4 個 skill、dsh-doctor 入口、以及 web profile 裏的 restart-recover bundle)以 README 的 git clone + scripts/install.sh 爲準。README 原文克隆的是 dsh-external/dsh-harness-ops;該地址目前可以打開,內容與 fakechris/dsh-harness-ops 一致。下面按已覈實的維護者倉庫來寫:
git clone https://github.com/fakechris/dsh-harness-ops.git
cd dsh-harness-ops
bash scripts/install.sh
install.sh 做四件事:把四個 skill 拷進 ~/.dsh/skills/;用 dsh plugin --profile web add @fakechris/dsh-restart-recover@<version> 把已發佈的 npm 包裝進 web profile(不再本地 link:,避免倉庫裏被 gitignore 的 lib/ 被清掉後 web 起不來);把 dsh-doctor 鏈到 ~/.local/bin;提示可選的守護進程安裝。腳本可重複執行。
自愈守護是可選的,macOS 走 launchd,Linux 走 systemd:
bash skills/dsh-web-guard/scripts/install.sh
之後更新不必本地構建插件:
cd dsh-harness-ops && bash scripts/update.sh
update.sh 的流程是 git pull --ff-only → 重跑 install.sh → 從 npm 重裝 bundle。首次建議看一下 ~/.dsh/source/ab-config.json,確認 extensions(示例裏包含 dsh-restart-recover)、web.port(默認 3081)和 web.productionPort(默認 3080),然後:
# $AB 指 ~/.dsh/skills/dsh-snapshot-ab/scripts/ab.sh
$AB status
插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。裝之前應檢查源碼倉庫和 MIT 許可證。
典型用法¶
約定:下文 $AB 均指裝好 skill 之後的 ~/.dsh/skills/dsh-snapshot-ab/scripts/ab.sh。
第一次把正在跑的版本收編爲 A 槽,不會重啓服務:
$AB status # 確認 current 指向、slots 爲空、phase=idle
$AB init --yes # 新建 slot-a worktree,pnpm install + 完整構建
$AB status # current=a,phase=idle
日常生產啓動不指定 A/B,永遠跑 current:
dsh web
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:3080/
只想看官方今天改了什麼、先不切版本,在對話裏說「分析一下今天和昨天的快照」即可觸發 skill;等價命令是:
$AB discover # fetch 上游,列快照,候選更新時附官方 changelog
$AB notes # 打印兩個快照之間新增的 Agent Note
官方倉庫沒有獨立 CHANGELOG 文檔,但非平凡改動會寫進 .agents/notes/implemented/。discover / notes 把這段筆記當成該快照的 changelog 列出來。
真正升級走完整輪換:
$AB status
$AB discover
$AB prepare # 在非當前槽構建、掛擴展、staging 冒煙,全程不動生產
$AB verify # 可選,對已 prepared 的候選重跑擴展測試 + 冒煙
$AB e2e # 可選但推薦:真實瀏覽器斷言前端真的掛上了
$AB switch --yes # manual 模式必須 --yes;會重啓 web,當前會話會斷
switch 會斷當前 agent 會話,這是預期行爲,不是故障。切完後:
readlink ~/.dsh/source/current
$AB status # current 已切到候選槽,confirmed=false
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:3080/
瀏覽器需要硬刷新(macOS 上是 Cmd+Shift+R)。README 記載過 2026-08-11 的坑:舊 tab 仍是切換前加載的 boot manifest,新的 client 面板不會出現。觀察幾天沒問題再執行:
$AB confirm
新版有問題隨時回滾:
$AB rollback --yes
web 徹底起不來、連 agent 都沒有時:
dsh-doctor --guide
想確認守護是否會拉起,README 給的自愈驗證是:kill $(lsof -ti :3080),大約 10 秒內應自動拉起,已裝 restart-recover 時會話會自動續接。這會中斷當前 web,只在你明確要做故障演練時使用。
適用場景與注意事項¶
適合已經把 dsh 當日常工作臺、並且會跟官方每日快照走的人:本機長期跑 dsh web 的用戶、要在新快照上驗證自有擴展的插件作者、需要回滾和自愈而不是每次重裝的部署人員。如果只用官方模板偶爾試一下,沒有本地擴展、也不在乎快照日期,這套 A/B 機制偏重。
使用時有幾條硬邊界,都來自倉庫自己的說明,不是額外發揮:
- 兩個槽共享
~/.dsh。 sessions 是 append-only 共享文件,storages 是單進程串行寫。生產只保留一個常駐實例;另一個槽用$AB stage短起、只讀、看完即關。不要直接<槽>/bin/dsh web --port 3081裸跑。 switch/rollback會斷當前會話。 會話文件在~/.dsh/sessions/,重啓後會重新索引,一般不會丟盤;但當前這一輪對話會被打斷。裝了 restart-recover 會嘗試從 interrupted turn 續上。- 切完必須硬刷新。 普通刷新不夠。
prepare失敗不要切。 失敗時current不動。擴展 typecheck / build / test 紅,說明擴展和該快照不兼容,應先修擴展再重跑prepare。- 守護進程綁定平臺。
dsh-web-guard的安裝腳本面向 macOS launchd 與 Linux systemd,README 沒有把 Windows 服務列爲同等支持。 - 醫生會調 LLM。 機械修復不依賴模型;深度檢測需要本機 LLM 憑據,推理過程會打到終端。不要在不信任的環境把診斷日誌隨手外發。
- 權限與許可證。 插件以當前 dsh 進程權限運行,安裝腳本會往
~/.dsh/skills、webprofile 和~/.local/bin寫文件。安裝前檢查 源碼 和 MIT 許可證。
小結¶
dsh-harness-ops 把「切對版本、拉起進程、續上會話、全掛自救」收進同一個倉庫。A/B 雙槽讓官方每日快照先在隔離槽裏構建和驗收,通過才原子切換,舊槽一直能回滾;guard 在 web 死後約 10 秒拉起進程;restart-recover 把被打斷的 turn 接回去;dsh-doctor 在 GUI 完全不可用時提供終端入口。
它解決的是 preview 階段跟快照跑的運維成本,不是把 dsh 變成託管服務。目錄頁與源碼地址如下,安裝前以倉庫 README 和 scripts/install.sh 爲準:
- 目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-harness-ops/
- GitHub:https://github.com/fakechris/dsh-harness-ops