前言¶
在 DSHM(DeepSeek Harness 移動端)裏,Host 跑在 App 進程內的主 node 線程上。想徹底離開應用、回到桌面,往往只能到系統多任務裏把進程劃掉,側欄裏並沒有一條明確的「關掉整個 App」入口。官方賬戶菜單隻有設置、聯繫我們、登錄或退出登錄等項,平臺也沒有提供往該菜單追加條目的 slot。
下面介紹社區插件 dsh-quit(維護者 yinghan-123):在側欄底部賬戶菜單裏注入「退出 dsh」,確認後直接結束 App 進程,表現與在多任務裏劃掉應用等效。插件分類爲客戶端,當前版本 0.8.2,許可證 MIT,兼容 DSH >=0.2.0-rc.1 <0.3.0-0。
這是什麼¶
dsh-quit 是 DSHM 端側的退出插件:在側欄底部的賬戶菜單(頭像或 ⋯ 彈出的「設置 / 聯繫我們 / 登錄或退出登錄」菜單)裏 DOM 注入一行「退出 dsh」,樣式與官方菜單項一致(危險色文字、電源圖標、分隔線),點擊後經 shell.overlay 確認,再觸發 Host 側四級退出邏輯,約 150 ms 後開始結束進程。
重啓 App(關閉後自動重開)功能已按 README 說明去除:需要改 App 側 ArkTS 且無 App 源碼,插件只保留「退出」。
核心功能¶
界面入口¶
賬戶菜單由官方賬戶插件 AccountMenu 渲染,菜單項寫死在 items 裏,沒有「加一條」的 slot;佔用 settings.launcher 會替換整個賬戶入口,代價過大。插件因此採用只追加、不改寫的 DOM 注入:
MutationObserver監聽document.body;- 出現
[role="menu"]且文本命中兩個以上特徵詞(設置、聯繫我們、登錄、退出登錄及英文對應項)→ 認定爲賬戶菜單; - 克隆最後一項作爲外殼,換電源圖標與危險色文案,上方補分隔線,插入原項之後;
- 點擊打開確認面板。
找不到菜單或官方 DOM 變更時不注入,官方菜單原樣可用;React 重渲染沖掉節點時觀察器會冪等補回。注入項 [data-dsh-quit-item] 可用作是否命中診斷;鍵盤方向鍵不會聚焦到該項(不在 React 菜單列表裏)。
客戶端依賴平臺 react 與 ctx.slots;缺 React 時降級爲惰性元素描述。無額外 npm 依賴。
退出行爲¶
點「退出 dsh」→ 確認 → Host 先把 HTTP 響應送回瀏覽器 → 150 ms 後開始結束進程。結束主 node 線程等於整個 App 結束,下次打開應用時 Host 會重新啓動。
真機實測(README 記載,2026-10-26,v0.4.0 語境):嵌入環境裏 process.exit(0) 可能不生效,故按「越硬越靠前」依次嘗試,成敗寫入 $DSH_HOME/dsh-quit.log:
process.kill(pid, 'SIGKILL')process.abort()process.exit(0)- koffi 調用 libc 的
_exit(0)
四級均失敗會記錄「四級退出手段全部無效」,需 App 側配合。
會中斷什麼¶
確認面板會先說明:進行中的模型對話會中斷;已落盤的會話日誌不丟,未完成的 turn 斷在那裏;後臺 job 隨之停止。
HTTP 接口¶
| 方法 | 路徑 | 說明 |
|---|---|---|
POST |
/dsh-quit/quit |
迴響應後 150 ms 開始四級退出 |
GET |
/dsh-quit/state |
只讀:pid、home、pending、上次動作 |
POST 須帶請求頭 x-dsh-quit: 1(任意非空值)。帶 Origin 的請求須來自本機(127.0.0.1 / localhost / ::1 或與 Host 一致);無 Origin 的 curl/腳本放行。
典型本機調用(端口以你環境爲準,README 示例爲 3120):
curl -s http://127.0.0.1:3120/dsh-quit/state
curl -s -X POST -H 'x-dsh-quit: 1' http://127.0.0.1:3120/dsh-quit/quit
診斷還可查看 $DSH_HOME/dsh-quit.log 與 state 中的 pid、$DSH_HOME 等字段。
安裝與啓用¶
DSHM 端側「一行安裝」(Host 佈置的 pnpm 殼,add 走安裝隊列):
pnpm add github.com/yinghan-123/dsh-quit
手工落盤時:
- 將
dsh-quit/放到 profile 的node_modules,例如:
$DSH_HOME/profiles/ondevice/node_modules/dsh-quit/
(示例路徑:/data/storage/el2/base/haps/phone/files/dsh/home)
2. 在 $DSH_HOME/profiles/ondevice/package.json 的 dependencies 增加 "dsh-quit": "github:yinghan-123/dsh-quit"(或 file: 本地路徑),並在 dsh.profile.bundles 追加 "dsh-quit"。
3. 重啓一次 DSHM 應用,以便客戶端重新掃描 dsh.client 聲明。
倉庫內更新可用:
python deploy.py
回滾:從 dsh.profile.bundles 與 dependencies 去掉 dsh-quit 並重啓,或刪除 node_modules/dsh-quit/。插件只新增文件,不改官方裝載行。
典型用法¶
- 安裝並重啓 DSHM 後,打開側欄底部賬戶菜單,應看到「退出 dsh」(若官方 DOM 未變且注入成功)。
- 點擊 → 在 overlay 確認 → 應用關閉回桌面。
- 腳本或自動化可調用
GET /dsh-quit/state查狀態,或在確認風險後帶x-dsh-quit頭POST /dsh-quit/quit。
倉庫提供結構自檢(端側可用 Agent 的 Python):
python check.py .
適用場景與注意¶
適合需要在 DSHM Web 界面內明確退出整個 App、又不想依賴多任務劃掉的開發者與用戶。插件以當前 DSH/Host 進程權限運行,安裝前請自行審閱 GitHub 源碼 與 MIT 許可證。
務必知曉的邊界(來自 README):
- 這是結束進程式退出,不是走 App
onDestroy的窗口關閉流程;在 DSHM 裏這是讓 App 真正消失的可行路徑之一。 - App 與 Host 同進程,不存在「App 退了、核心還在」。
- 無 CLI 或其它前端入口;僅 Web 側賬戶菜單與上述 HTTP 接口。
- 官方升級改賬戶菜單結構時,注入可能靜默失效(僅少一行菜單,不破壞界面)。
DeepSeek Harness 生態強調「一切皆插件」;社區目錄 SkillHub 插件頁 爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。
結尾¶
dsh-quit 在官方未開放賬戶菜單擴展點的前提下,用安全的 DOM 注入加上 Host 側多級退出,把「退出 dsh」放到側欄賬戶菜單裏,並配合確認與 CSRF 約束的 HTTP 接口。需要細節與變更記錄時,以倉庫 README 爲準。
- 目錄頁:https://www.skillhub.cn/plugins/yinghan-123/dsh-quit
- GitHub:https://github.com/yinghan-123/dsh-quit