前言¶
DeepSeek Harness(DSH)桌面端在調試或遇到卡頓時,往往需要手動結束進程再重新打開。重複這一套操作比較麻煩。dsh-restart-button 插件在聊天標題欄右上角加了一個圓形箭頭,點擊後可直接重啓應用;再打一個可選補丁,還能把「重啓」加進系統托盤菜單。
插件定位¶
- 維護者:CZY1326
- 功能:在 DeepSeek Harness 客戶端提供重啓入口,支持頂欄按鈕與可選托盤菜單
- 分類:客戶端
核心功能¶
頂欄重啓按鈕¶
按鈕位於聊天標題欄右上角、「打開方式」選擇器(文件管理器 / git bash)的左側,尺寸 28×28、圖標 15px。它註冊在 conversation.session.header.actions 槽位,點擊後按順序嘗試兩條通道:
| 順序 | 通道 | 前置條件 | 行爲 |
|---|---|---|---|
| 1 | dsh-app://app/__dsh-restart |
打了可選補丁 | Electron 調用 app.relaunch(),優雅重啓 |
| 2 | POST /dsh-restart-button/restart |
無 | 派生一個脫離的 shell:等 2 秒 → 按進程映像名結束應用 → 輪詢等進程消失 → 重新拉起 exe |
第 2 條是保險,保證未打補丁也能用。它不是優雅退出,正在跑的任務會被直接掐斷(會話與任務記錄都已落盤,重開即可續上)。
安全措施¶
helper 有三條安全措施:
- 啓動前先確認 exe 還在:不在就只記日誌、什麼都不殺,避免「殺完起不來」。
- 殺完輪詢
tasklist等映像真正消失再拉起:最多等約 30 秒。 - 每一步都寫日誌到
%TEMP%\dsh-restart-button.log。
可選托盤補丁¶
補丁直接改打包進 app.asar 的 lib/main.js(Electron 主進程),做兩件事:
- 托盤菜單在「打開」「退出」之間插入「重啓 DeepSeek Harness」(與另外兩項同樣的格式)。
dsh-app://app/__dsh-restart路由 →app.relaunch(); quitWithoutConfirmation();。
腳本會自己找到 app.asar(常見安裝目錄、Programs\*deepseek*,以及正在運行的應用 exe 所在目錄);找不到時把 /dsh-restart-button/ping 返回的 asar 傳給 --asar 即可。
補丁特性¶
- 等長原地補丁:asar 是一個帶 JSON 索引的大文件,長度一變後面所有條目都要整體搬家。補丁把插入的字節數從旁邊的文檔註釋裏原樣摳回來(註釋改寫到完全相同的寬度),文件長度、索引偏移、其他條目全部不變。
- 版本相關:腳本內置對
lib/main.js的 sha256 指紋,只認它寫過的那幾個版本。版本對不上就拒絕執行(不會寫壞文件),此時頂欄按鈕照常可用。 - 可還原:原始字節寫在
<app.asar>.dsh-restart-button.bak,清單在同名.json裏。
打補丁後,應用升級會覆蓋 app.asar,托盤那項會消失,需要重新打補丁。
當前支持的版本¶
| 應用版本 | 狀態 |
|---|---|
| 0.2.1-rc.2 | ✅ 已內置指紋 |
| 0.2.1-rc.3 | ✅ 已內置指紋(lib/main.js 與 rc.2 只差版本號字符串) |
其他版本:腳本會打印 sha256,提 issue 附上即可加進來。
自定義安裝目錄(例如裝在 D:\Tools\...)時腳本的自動探測找不到 app.asar,把 /dsh-restart-button/ping 返回的 asar 傳給 --asar 即可。
安裝與啓用¶
# 推薦:從 npm 裝
dsh plugin add @czy1326/dsh-restart-button
# 或者直接從 GitHub 裝
dsh plugin add git+https://github.com/CZY1326/dsh-restart-button.git
# GitHub 簡寫
dsh plugin add github:CZY1326/dsh-restart-button
安裝後重啓一次應用(或刷新頁面)即可看到按鈕。
倉庫裏提交的就是可直接運行的 JS(
lib/index.js、lib/client.js),package.json沒有prepare/postinstall腳本,所以安裝時不需要構建,也不需要給 pnpm 開allowBuilds。
如果你的網絡把github.com改寫到了鏡像/代理而推送拉取失敗,把地址寫成git+https://github.com:443/CZY1326/dsh-restart-button.git可繞過 URL 重寫。桌面端的 profile 由 Electron 應用獨佔管理,安裝插件前請完全退出應用,否則 profile 會被佔用。
典型用法¶
基本重啓(頂欄按鈕)¶
- 安裝插件後重啓應用。
- 在任意會話的標題欄右上角找到圓形箭頭。
- 點擊後應用會重啓。
使用托盤菜單重啓(打補丁後)¶
- 關閉應用。
- 執行補丁腳本:
node scripts/patch-asar.cjs --dry-run
node scripts/patch-asar.cjs
- 重啓應用。
- 在系統托盤菜單的「打開」「退出」之間,會出現「重啓 DeepSeek Harness」選項,點擊即可。
還原補丁¶
node scripts/restore-asar.cjs --check # 看狀態:original / patched / unknown
node scripts/restore-asar.cjs # 還原(應用需先退出)
實現說明¶
目錄結構:
dsh-restart-button/
├── lib/index.js 宿主半邊:註冊 /ping 與 /restart 兩條路由,派生脫離的重啓 shell
├── lib/client.js 界面半邊:頂欄圓形箭頭(slot: conversation.session.header.actions)
├── cordis.patch.yml bundle 補丁:把這個包插進 profile 的插件列表
└── scripts/ 可選的 asar 補丁與還原
- 宿主側不依賴 Electron API,所以「純插件」也能重啓:
spawn(cmd.exe, ["/c", helper.cmd], { detached: true, stdio: "ignore" }),helper 先taskkill /F /IM "<exe>",輪詢到映像消失後start "" "<exe>";它自己的映像名是cmd.exe,不會被自己殺掉。(注意cmd.exe不喫 Node 的 MSVCRT 引號轉義:給spawn傳單個腳本路徑而不是帶引號的內聯命令。) /restart只接受POST且要求x-dsh-restart: 1頭,避免爬蟲或別的標籤頁誤觸發。- 按鈕在非桌面殼(普通瀏覽器裏的
http://127.0.0.1:<port>)不渲染:location.protocol !== "dsh-app:"時直接返回。
自檢¶
# 宿主是否認出桌面端、重啓目標是誰、app.asar 在哪
curl http://127.0.0.1:<port>/dsh-restart-button/ping
# → {"ok":true,"desktop":true,"exe":"…\\DeepSeek Harness.exe","resources":"…","asar":"…\\resources\\app.asar"}
# 只跑「派生 helper」這一段,不殺任何進程,結果寫進 %TEMP%\dsh-restart-button-probe.txt
curl -X POST -H "x-dsh-restart: 1" "http://127.0.0.1:<port>/dsh-restart-button/restart?probe=1"
第二條能寫出一行 probe exe=… image=…,就說明宿主能正常派生脫離的 helper;真正點按鈕時只是把它換成 taskkill + start。
已知限制¶
- 托盤那一項只能靠補丁:托盤菜單在 Electron 主進程裏,插件運行在宿主進程,夠不到。長期正解是給上游提 PR / issue(
DeepSeek Harness桌面端)。 - 純插件模式是硬退出,不是優雅退出。
- 補丁是版本相關的等長改寫,不是通用補丁器。
適用場景與注意¶
適合需要頻繁重啓 DeepSeek Harness 桌面端、希望減少手動操作的開發與調試場景。
務必注意:插件以當前 DSH 進程權限運行。安裝前建議檢查源碼與許可證(MIT)。
結尾¶
這個插件在保持簡潔的同時提供了實用的重啓能力,讓開發者能更快速地恢復工作流。更多細節與源碼,參見: