dsh-composer-guard:手機端 DSH Web 輸入欄壞態自動刷新

前言

在手機上用 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 檢查一次。另有兩路兜底:

  1. 尺寸驅動:ResizeObserver 觀察滾動區與座位,盒子尺寸變化時再判一次(靜止時開銷很小)。
  2. 慢輪詢:每 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
羽毛球分组比赛记分
小程序二维码

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

小夜