dsh-plugin-mobile-ux:DSH Web 壳层手机端体验优化

前言

在 DeepSeek Harness(DSH)里用 Web profile 跑智能体时,桌面浏览器往往够用;换成 iPhone + Safari,同一套壳层会出现布局挤乱、键盘顶起输入框后留空白、侧边栏要双击才能切会话、轨迹面板停在半路等问题。社区里已有 dsh-web-mobile-fix、dsh-mobile 等窄屏或键盘方向的零散修补,本插件把窄屏布局、iOS 键盘与输入框跟随、单击切换会话、轨迹面板滚到最新、页面缩放钉住五类改动收成一个纯客户端 DSH 插件:不改壳层源码,桌面端通过媒体查询与设备判定保持零回归,每一节还可单独关闭便于真机对照。

这是什么

dsh-plugin-mobile-ux(维护者 68110923,分类:客户端)面向 DSH 的 Web profile,在浏览器侧注入客户端逻辑。当前 package.json 版本为 2.3.2,许可证 MIT;插件在 Skillhub 目录 与 GitHub 均可查阅。作者在 iPhone + Safari(iOS 17)上实测打磨;兼容说明写明在 DSH Web 0.1.x(含 0.1.7-rc.1)上验证,选择器锚定产品的 data-slot 与 CSS Module 类名前缀,大版本改版后可能需要小改。

核心功能

下面按插件自述的五个能力块说明;除文档标明外,§1、§3 在桌面宽屏或精指针设备上不生效,§2 在非触屏上不做写入。

窄屏布局(宽度 ≤ 700px)

  1. 设置弹窗改为全屏纵向布局,导航变为一行可横向滑动的标签。
  2. 输入框底栏不换行:工具区可压缩,发送键不压缩。
  3. 侧边栏浮在对话之上(栅格保持 56px 轨道,抽屉溢出覆盖),对话区域加遮罩。

§1 样式与部分交互逻辑改编自 MIT 项目 AcidGr/dsh-web-mobile-fix,并参考 TecFancy/dsh-mobile 的同类取舍。

iOS 键盘与可视视口

插件不写 font-size,避免与 DSH 自带字号设置(12–17px)冲突。改为在 viewport meta 上钉 maximum-scale=1,抑制 iOS 聚焦小字号输入框时的整页放大(文档记载实测可视高度由约 345 恢复到约 500)。键盘打开时:

  • 外壳高度对齐 visualViewport.height(仅向下取整,避免多 1px 导致文档可滚)。
  • 键盘期对 html, body 设置 overflow: hidden 与 overscroll-behavior: none,并在 focus 后按 100/250/500/900ms 补测,消掉动画期间的过期测量。
  • 以可编辑元素获得焦点为主信号,可视区收缩为确认(部分机型 innerHeight 与 visualViewport.height 不变)。

文档说明 #root 在键盘期改为 position: fixed,是为了去掉文档流下方的可滚动余量,避免「输入框与键盘之间的空白带」。

侧边栏单击切换会话

在粗指针设备 + 窄屏下:单击列表行即切换会话,并默认自动收起抽屉(调用壳层 aria-label="Collapse sidebar" 按钮的真实路径)。实现上在 pointerup 捕获阶段重派发该行的 onClick(复用产品逻辑),并在 600ms 内吞掉同行 dblclick,从而避免快速双击误触重命名;桌面端双击重命名照旧。data-row-key 形如 project:… 的分组行不参与。

轨迹面板打开即到最新

轨迹表为虚拟列表,手机上行高与总高在挂载后仍可能继续增长;仅依赖「距底部距离」会在列表还在长高时停在中途(文档举例 scrollTop=365、最大约 1013)。插件用定时补正(60/200/500/1000/1800ms)加约 2 秒的逐帧看门狗:打开面板即意图滚到底,列表追加在下方时持续跟随,检测到用户主动上滑(非本插件触发的滚轮)则停止。

页面缩放

默认限制页面缩放以配合上述 iOS 行为;可用开关换回双指缩放(见下文 freezoom)。

安装与启用

插件以当前 dsh web 进程 所加载的 bundle 运行,安装前请自行查看仓库源码与 MIT 许可证。npm 尚未发布,推荐从 GitHub 安装。

dsh plugin --profile web add github:68110923/dsh-plugin-mobile-ux

安装后需重启 Web 服务并硬刷新浏览器。DSH 用文件 mtime/ctime/size 计算 bundle 版本,且静态资源带长期 immutable 缓存,不重启时浏览器可能一直用旧包。

systemctl restart dsh-web     # 或你的 dsh web 进程

本地离线可按目录安装(link: 语义,改源码后重启即生效):

dsh plugin --profile web add /path/to/dsh-plugin-mobile-ux

更完整的接入场景(SSH 隧道、nginx + IP/域名 + TLS)见作者站点 接入指南。

开关与典型用法

手机端是验证这些改动的最佳环境,因此每一节可单独关闭。URL 查询参数 ?dshMobileUx= 后接逗号分隔的值,例如只关键盘相关:

?dshMobileUx=nokeyboard

组合示例(关布局并打开调试 HUD):

?dshMobileUx=nolayout,hud

关轨迹滚到底:

?dshMobileUx=notrajectory

加载前也可用对象覆盖(注意属性名为 __dshMobileUxOptions,与读数 API __dshMobileUx 不同):

window.__dshMobileUxOptions = { keyboard: false };

常用取值含义(摘自 README 开关表):

值 作用
0 / off 整包不生效
layout / keyboard / tap / trajectory 仅保留所列节(白名单,排他)
nolayout / nokeyboard / notap / notrajectory 关闭对应节
keepdrawer 单击切换后不自动收起侧边栏
freezoom / nozoom 允许 / 禁止页面放大(默认钉住缩放)
nolock 键盘打开时不锁文档滚动
hud 左上角显示实时读数

白名单是排他的:例如 ?dshMobileUx=tap 表示只保留单击切换,键盘跟随等其余节会一并关闭;若只想关掉某一节,请用 no<节名>。

适用场景与注意

适合谁:需要在手机浏览器里长期使用 DSH Web(巡检会话、看轨迹、窄屏改设置)且希望不动壳层源码的部署者。

桌面端:§1 由媒体查询限定、§3 由粗指针限定,文档明确桌面零影响;仍建议在发版前用桌面做一次冒烟,确认未误开 HUD 或 URL 白名单。

已知边界(仓库自述):插件不改字号;钉住缩放时双指缩放不可用,可用 freezoom 换回。§3 目前只处理侧边栏会话列表行,搜索结果会话行未纳入。插件不依赖服务端组件。

开发与自测(维护者用法,非安装必需):

node tools/client.test.mjs     # 72 项纯逻辑断言
node --check client.js         # 语法

结尾

dsh-plugin-mobile-ux 把 DSH Web 在窄屏与 iOS 上常见的五类摩擦收成单一客户端插件,并靠 URL / window.__dshMobileUxOptions 做分节开关,便于在真机上逐项对照。目录与介绍见 Skillhub、GitHub 仓库 与作者 GitHub Pages 站点(含 安装指南)。

羽毛球分组比赛记分
小程序二维码

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

小夜