前言¶
在手机上用 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