前言¶
在桌面浏览器里用 DeepSeek Harness(DSH)的 Web 界面,三列布局和折叠侧栏通常够用。把同一套界面缩到手机或平板窄屏(宽度小于 1024px)时,宿主仍会保留折叠侧栏约 56px 的轨道,输入区、顶栏和系统返回键的行为也未按触摸场景优化。社区维护者 Ocean326 的 dsh-mobile-adapt(npm 包名 @ocean326/dsh-mobile-adapt,当前 v0.5.3)是一条纯客户端插件:在窄屏下用抽屉侧栏、浮动入口和 DOM/CSS 契约改写布局与交互,并通过探针脚本验收。下面介绍它做什么、怎么装、日常怎么用。
这是什么¶
dsh-mobile-adapt 归类为 DSH 客户端(web) 插件。README 用一句话概括:在窄屏下把 dsh web 调成手机上能用的样子。实现集中在 lib/client.js;lib/index.js 故意为空,仅用于让插件树能发现客户端入口。插件以 MIT 许可证发布,依赖 Cordis 与若干 @deepseek-ai/dsh-client-ui-* 对等依赖(见 package.json),要求 Node.js ≥ 20。
社区目录页:SkillHub - dsh-mobile-adapt。源码与说明:GitHub - Ocean326/dsh-mobile-adapt。SkillHub 为社区独立站点,与 DeepSeek / 幻方无官方从属关系。
核心功能¶
窄屏判定与宿主一致:视口宽度 max-width: 1023.98px 时生效;桌面拉窄窗口也会进入同一模式。
侧栏与导航¶
- 左侧栏折叠后网格列宽压为 0,侧栏改为绝对定位抽屉,展开时覆盖中间会话区,不再占用约 14% 屏宽。
- 无其他可见入口时保留「打开侧边栏」浮动按钮;存在 DS Bot 等场景时提供「会话 / Bots」双浮动入口,可拖动贴左右边,位置写入
localStorage['dsh-mobile-adapt:opener']。 - 点击抽屉内会话行:在
click阶段收起抽屉,并保证会话真的切换(onRowClick、onPointerUp与ctx.sessions.list.subscribe分工,避免「收起但未导航」)。 - 系统返回键 / 返回手势:先关窄屏全屏右侧面板,再关抽屉,最后在对话页唤出侧栏列表(
history.pushState+onPopState)。
输入区与顶栏¶
- 切换对话后不自动聚焦输入框(
armSuppression/shadowComposerFocus等)。 - iOS 可编辑区
font-size: max(16px, 1em),减轻聚焦时页面放大;非 iOS 保持font-size: inherit。 - 有对话且输入未聚焦时:底部 composer 整片(含 token/步数条、目标栏)约 30% 透明,工具行收起,对话区多约 42px 可视高度;空对话 hero 页不参与该逻辑。
- 顶栏浮层化,正文从栏下穿过,未聚焦时显示自上而下的透明梯度;聚焦输入时顶栏淡出、正文顶满、底部统计条收起。
- 顶栏模型名芯片最大宽约 116px,超出省略,完整名称保留在
title/aria。
与其他组件¶
- 窄屏默认隐藏
dsh-whale-widget浮动卡片(避免挡住发送区);需显示时在控制台设置localStorage['dsh-mobile-adapt:float-card']为'on'后刷新。 - 可与
dsh-web-mobile等适配器共存:本插件通过otherOpenerVisible()等逻辑避免重复浮动按钮;若只想保留一方,可在 profile 的 patch 层将对方disabled: true。
安装与启用¶
README 中的安装流程假定插件源码已在本地 workspace,profile 通过 link: 软链引用。按顺序执行(第二条里的路径需换成你本机插件目录,README 示例为作者环境):
# 把 dsh-mobile-adapt 写进 profile 的 dependencies(link:)
tools/link-plugin.sh dsh-mobile-adapt web
# 装入 web profile 的 bundle 栈(挂载由包内 cordis.patch.yml 提供,id 为 mobile-adapt)
dsh plugin --profile web add link:/home/ocean/Desktop/apps/DSH-Home/plugins/dsh-mobile-adapt
挂载点应只在 bundle 层 出现一次;不要在 profile 的 cordis.patch.yml 里再 insert 同名 loader,否则可能触发 duplicate loader entry id 导致 Web UI 无法启动。安装后可用下面命令自检(输出应为 1):
dsh --profile web --dump-config | grep -c '^- id: mobile-adapt$'
改 lib/client.js 后,在启用 dsh-client-hmr 的环境下通常无需整页刷新即可热替换;改服务端半或 profile 的 hmr 配置可能需要重启进程。
典型用法¶
日常浏览与输入¶
- 在窄屏打开 DSH Web,侧栏默认不占宽;点浮动按钮展开抽屉选会话,选中后抽屉自动收起。
- 需要输入时点 composer 卡片区域唤起键盘;打字时顶栏与底部统计条会按设计收起,腾出纵向空间。
- 使用手机返回:先退出全屏右侧文件/工具面板,再关抽屉,再在主对话页打开会话列表。
可选:打开窄屏浮动卡片¶
默认窄屏关闭 whale 挂件。若要打开:
localStorage.setItem('dsh-mobile-adapt:float-card', 'on'); location.reload();
// 关闭:localStorage.removeItem('dsh-mobile-adapt:float-card'); location.reload();
与 dsh-web-mobile 二选一(可选)¶
- id: dsh-web-mobile
disabled: true
维护者验收命令(可选)¶
仓库内提供 tools/ui-probe.mjs 与多份 tools/probes/mobile-*.js 脚本,用于回归抽屉、点击导航时序、composer 折叠与系统返回等。例如:
node tools/ui-probe.mjs --script tools/probes/mobile-flows.js
node tools/ui-probe.mjs --script tools/probes/mobile-composer.js
node tools/ui-probe.mjs --script tools/probes/mobile-nav.js
适用场景与注意¶
适合经常在手机或窄屏平板浏览器中使用 DSH Web、希望侧栏、输入区和 Android/iOS 返回键行为接近原生 App 的开发者。桌面宽屏下插件 CSS 不介入主要布局(可用探针在 1280×800 验证 composer 样式未变)。
使用前请注意:
- 插件随当前 DSH 进程与 Web 客户端加载,具备与宿主相同的运行上下文;安装前请阅读 GitHub 仓库 源码与 MIT 许可证,并确认 peer 依赖版本与本地 DSH 匹配。
- 功能依赖宿主 DOM 结构(如
[data-composer-card]、会话行类名片段等);宿主大版本升级后可能需要插件跟进。 - 必需注入
layout与sessions上下文;缺失时插件可能停在pending,并影响 Web UI 启动闸门。 - README 记录了与
dsh-web-mobile、dsh-better-sidebar、重复挂载 id 等组合时的坑;生产 profile 建议用--dump-config核对 loader 条目唯一。
结尾¶
dsh-mobile-adapt 把 DSH Web 在窄屏下的侧栏、composer、顶栏和系统返回串成一套可探针验证的触摸适配,服务端零逻辑,适合作为 web profile 的客户端增强插件。目录与安装说明见 SkillHub,实现细节与踩坑记录见 GitHub README。