dsh-plugin-mobile-ux

让 DeepSeek Harness 的 Web 界面在手机上真正好用

一个纯客户端插件,把窄屏布局、iOS 键盘与输入框跟随、侧边栏单击切换会话三件事一次补齐:不改壳层源码、桌面端零回归、每一节都能单独关掉。

dsh plugin --profile web add github:68110923/dsh-plugin-mobile-ux
# 改完插件必须重启,否则浏览器永远拿到旧代码(immutable 缓存)
systemctl restart dsh-web

它修的是七个具体问题

全部来自真机使用,而不是“看起来可以更好”。

# 现象 根因
1 设置弹窗被压成一条缝、导航标签挤成一列 壳层没有 < 768px 的手机档
2 输入框底部按钮折行、互相叠住 composer 按桌面宽度排版
3 侧边栏一展开就把对话区挤到约 110px 宽 侧边栏是栅格列,不浮层
4 点输入框整页被放大,输入框看不见 编辑器 14px;iOS 对“聚焦时字号 < 16px”的可编辑元素强制缩放整页
5 打字/回撤后输入框掉到键盘后面 外壳高度 = 布局视口,而键盘是覆盖层只缩小视觉视口;页面因此可滚,浏览器把输入框滚出可视区
6 键盘收起后,输入框和键盘之间留一段空白 键盘动画结束前测到的高度是过期值,之后再没有事件纠正
7 切换会话要点两次,且不能快速双击 行是单击打开,但“重命名”挂在行内标题的双击上;第二次点击被判定成双击

三个能力

分节实现、分节开关,手机是唯一能判断它们好坏的地方。

§1 窄屏布局

≤ 700px 媒体查询

  • 设置弹窗全屏纵向,导航变一行可横滑的标签
  • 输入框底栏不换行:工具区可压缩、发送键不压缩
  • 侧边栏浮在对话之上,栅格始终保留 56px 轨道
  • 点抽屉外部收起

§2 iOS 键盘与可视视口

触屏 + 聚焦可编辑元素时

  • 防聚焦缩放:可编辑元素字号提到 17px,且写在样式表里
  • 输入框跟随键盘:外壳高度钉到 visualViewport.height,只向下取整
  • 键盘期间锁住文档滚动
  • 键盘落定后补测几次,消掉空白带

§3 单击切换会话

触屏 + 窄屏;桌面双击重命名照旧

  • 单击即切换,不等双击判定窗口
  • 切完自动收起抽屉(点抽屉自己的开合按钮)
  • 600ms 内吞掉双击,不再误触发重命名
  • 复用产品的打开逻辑,不重写会话语义

安装与验证

需要 Node ≥ 22 与一个 DSH Web profile。

  1. 装进 profile:
    dsh plugin --profile web add github:68110923/dsh-plugin-mobile-ux
  2. 重启服务:
    systemctl restart dsh-web   # 或你的 dsh web 进程
  3. 手机上强制刷新页面(Safari 下拉刷新),然后依次验证:
    • 点左上角图标展开侧边栏 → 应该是浮层抽屉,点空白处收起
    • 输入框底部按钮保持一行,不折行不叠层
    • 设置面板全屏纵向、标签可横滑
    • 点输入框 → 页面不放大;打字/回撤 → 输入框不掉下去
    • 点一个未选中的会话 → 一次点击就切换,且抽屉自动收起

为什么必须重启: DSH 用文件的 mtime/ctime/size 算 bundle 版本号,响应头又是 immutable 一年缓存。不重启的话,磁盘上改了、服务端也返回新内容,浏览器却仍然执行旧代码——这一条曾让人误判过好几次。

开关

URL 参数 ?dshMobileUx= 后接逗号分隔的值;也可以加载前用 window.__dshMobileUxOptions = { keyboard: false } 覆盖(注意是 …Options——读数 API 在 window.__dshMobileUx 上,两者互不覆盖)。

值 作用
0 / off整包不生效
layout / keyboard / tap / trajectory只保留列出的这几节(白名单是排他的,见下方提醒)
nolayout / nokeyboard / notap / notrajectory关掉列出的这几节
keepdrawer单击切换后不自动收起侧边栏
nolock键盘打开时不锁文档滚动
freezoom / nozoom允许 / 禁止页面被放大。默认钉住缩放(maximum-scale=1),这是压住 iOS 聚焦放大的唯一手段,代价是双指缩放一并失效
hud左上角显示实时读数 vvH / root / kb / lock / y / oT

白名单是排他的: ?dshMobileUx=tap 的含义是「只留单击切换」,连键盘跟随一起关掉——想让某一节失效请用 no<节名>。hud / lock / zoom 是修饰开关,不参与白名单。

参考项目与致谢

§1 的样式与“点外部收起抽屉”源自上游,§2 是与真机一起磨出来的。

项目 用处
AcidGr/dsh-web-mobile-fix §1 的原始实现(设置面板、浮层侧边栏、遮罩、点外部收起),MIT
TecFancy/dsh-mobile 手机档适配的另一种做法(断点层 + 状态桥 + data-slot 样式表),参考了它的取舍,MIT
langyo/dsh-mobile-upgrade 同类问题的另一种整理方式,安装与排错思路有参考
DeepSeek Harness 被适配的壳层本体;插件只锚在它的 data-slot 与类名前缀契约上

§1 的样式与 §3 的“点击外部收起侧边栏”逻辑直接源自 dsh-web-mobile-fix(MIT),本仓库在其基础上做了整合与修正;§2 没有上游可抄,结论全部来自这台设备上的实测。

已知边界