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
羽毛球分组比赛记分
小程序二维码

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

小夜