前言¶
在手機上用 DSH(DeepSeek Harness)的 Web 界面時,常見場景是切到後臺、換主題、彈軟鍵盤或熄屏再亮屏。WebView 回到前臺後,底部輸入欄有時會「看着沒了」:佈局尺寸仍在 DOM 裏,但畫不出來或位置不對。手動刷新頁面可以恢復,會話在服務端,重載後一般能回到原會話。若每次都要自己刷新,體驗很打斷。下面介紹社區插件 dsh-composer-guard(維護者 xyh-sb,分類:客戶端):它不嘗試在頁內修樣式,只在判定輸入欄確實處於已知壞態時,自動把頁面重新加載一次。
這是什麼¶
dsh-composer-guard 是面向 DSH Web GUI 的移動端兜底守衛。package.json 中的描述爲:當應用從後臺返回後若 composer 仍處於損壞狀態,則刷新頁面一次(實際實現含喚醒重試與刷新次數上限,見下文)。
插件版本 0.1.0,許可證 MIT,依賴 @deepseek-ai/cordis ^4.0.1。宿主側不聲明任何 inject,避免因缺服務拖垮整棵插件樹。
它解決什麼問題¶
README 歸納了三種已知的壞相(均可用 DOM 讀數驗證):
| 壞相 | 現象 | 真實讀數 |
|---|---|---|
| 錯位 | 只看得見一排圖標貼在屏幕最下沿,卡片懸在中間偏上 | 座位 [data-composer-seat] 底邊停在鍵盤彈起時的視口高度,而滾動區底邊更高 |
| 透明 | 白底頁面上輸入區塊是空的 | 卡片 [data-composer-card] 的 background 解析爲 rgba(0, 0, 0, 0) |
| 字號歸零 | 字在 DOM 裏但完全看不見 | 佔位文字 computed font-size: 0px |
2026-10-30 在 Android 17 / WebView(390×844)上的排查結論是:壞態裏幾何可以算出來、樣式也可以寫回,但像素仍不對;手動刷新必定恢復。插件因此只做「偵察 + 重載」,不碰佈局。
判定與守衛邏輯¶
何時檢查¶
每次從後臺恢復相關事件(visibilitychange / pageshow / focus / blur / resize)後 900ms 檢查一次。另有兩路兜底:
- 尺寸驅動:
ResizeObserver觀察滾動區與座位,盒子尺寸變化時再判一次(靜止時開銷很小)。 - 慢輪詢:每 10 秒 一次,覆蓋熄屏再亮屏但幾乎不發 DOM 事件的場景。
刷新前的一次喚醒¶
發現壞相後,先做一次無副作用喚醒(派發 resize、將滾動區橫向滾動歸零),200ms 後再看;仍壞才刷新。
防死循環¶
- 頁面加載滿 5 秒 纔開始判定,避免初次進入誤刷。
- 只累計「刷完還壞」的次數,上限 2 次;任一次恢復到好狀態,配額立即歸還。
- 讀數邏輯包在
try/catch內,避免守衛本身拖垮頁面。
安裝與啓用¶
安裝步驟以 GitHub README 爲準。插件以當前 dsh 進程權限運行,安裝前應自行審閱源碼與 MIT 許可證。
先克隆倉庫到本地路徑(README 示例爲 /root/dsha-composer-guard):
git clone https://github.com/xyh-sb/dsh-composer-guard.git /root/dsha-composer-guard
在 Web profile 的 package.json(路徑示例 ~/.dsh/profiles/web/package.json)中增加依賴並在 bundles 中註冊:
{
"dependencies": { "dsh-composer-guard": "link:/root/dsha-composer-guard" },
"dsh": { "profile": { "bundles": [ /* ... */, "dsh-composer-guard" ] } }
}
建立軟鏈並重啓 dsh web(bundles 在啓動時讀取):
ln -sfn ../../../../dsha-composer-guard ~/.dsh/profiles/web/node_modules/dsh-composer-guard
典型用法¶
本插件無單獨配置文件或 CLI:啓用 bundle 並重啓 dsh web 後,在手機窄屏上正常使用 DSH Web 即可。邏輯依賴 DSH Web 上的 [data-conversation-scroll]、[data-composer-seat]、[data-composer-card] 標記,桌面端不會觸發。
無需額外調用接口;從後臺回到會話、或長時間熄屏後,若輸入欄落入上述壞相且喚醒無效,頁面會自動 reload 一次(在次數上限內)。
適用場景與注意¶
適合誰:主要在 Android 等 WebView 裏用手機訪問 DSH Web、且遇到過底部輸入欄假死/錯位/透明問題的開發者或日常用戶。
邊界(來自 README):
- 刷新會打斷頁面內滾動位置;未提交輸入草稿是否保留取決於 DSH 版本自身的持久化行爲。
- 治的是「回前臺後畫不出來」的症狀,根因在 WebView 層,插件不修復 WebView。
DSH 生態是「一切皆插件」;社區目錄 SkillHub 插件頁 爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。
結尾¶
dsh-composer-guard 用最小職責換可預期恢復:壞態判定 → 喚醒 → 必要時整頁重載,並限制連續失敗刷新次數。若你在移動端依賴 DSH Web 輸入欄,可將其作爲客戶端 bundle 一併啓用。
- 目錄頁:https://www.skillhub.cn/plugins/xyh-sb/dsh-composer-guard
- 源碼與說明:https://github.com/xyh-sb/dsh-composer-guard