前言¶
DeepSeek Harness(DSH)的 Web GUI 是按桌面设计的,在手机上会遇到 RPC 失败、侧栏挤压、整页回弹、输入框放大、自动弹键盘、键盘遮挡输入框等问题。这些体验在开发调试时非常影响效率。mengqinlol/dsh-mobile-shell 是一个为 DSH Web GUI 提供移动端适配的插件,通过悬浮抽屉、页面锁定、iOS 缩放控制、键盘感知输入框以及工作区文件浏览器,把 Web GUI 在手机上的可用性提升到接近原生应用的程度。
插件定位¶
mengqinlol/dsh-mobile-shell 是一个 DSH 插件,分类为「客户端」。它通过 Cordis patch 的方式挂载到 DSH webserver,不修改 DSH 本体。插件的核心价值在于:让 DSH Web GUI 在移动浏览器(尤其是 iOS Safari)上具备稳定、流畅、可用的交互体验,并增加一个基于 Cookie 鉴权的工作区文件浏览功能。
核心功能¶
1. 移动端界面适配¶
插件针对 DSH Web GUI 在移动端的常见问题做了逐项修复:
- 悬浮抽屉:原侧栏展开会把对话挤成一条缝,插件改为覆盖式悬浮卡片 + 遮罩,点外部自动收起。
- 页面锁定:iOS 页面级回弹 / 地址栏收起会导致整页跟着动,插件将
html/body钉成视口,页面不可滚,只有对话区域可滚动,并隐藏统计行。 - iOS 聚焦缩放控制:输入框是
contenteditable的 div,字号 14px 会触发 iOS 聚焦缩放。插件强制 16px,改写meta viewport,并拦截gesturestart。 - 会话切换不抢焦点:会话视图挂载时会
focus()输入框,插件只保留「用户主动点击」的聚焦,其余立刻blur()。 - 键盘感知输入框:iOS 不为软键盘缩小布局视口,插件利用
visualViewport算出键盘 inset,让对话列整体上移,避免输入框被键盘遮挡。 - 主题同步:文件浏览页跟随 DSH 的深/浅主题,读取父页面的
body[data-ds-dark-theme]标记,每秒同步一次。
2. crypto.randomUUID Polyfill¶
DSH Web GUI 前端 RPC 需要调用 crypto.randomUUID,但浏览器只在安全上下文(HTTPS / localhost)暴露该方法,明文 HTTP 下没有。插件注入标准 UUID v4 polyfill(基于 crypto.getRandomValues),让明文 HTTP 下也能正常通信。
3. 工作区文件浏览器¶
在对话区顶部追加了第三个标签「工作区文件」,点击可在对话区内嵌打开文件浏览页。功能包括:
- 工作区切换:默认定位到当前会话的工作区,可通过下拉框切换;
w=参数可显式指定工作区序号,找不到/超界则回落到第一个。 - 文件预览:
- 文本/代码(md、json、js、ts、css、yml、csv、py、ps1 等):内联
<pre>,等宽可滚动,上限 2 MB。 - 图片(png/jpg/gif/webp/svg/bmp/avif):
<img>。 - 视频(mp4/mov/webm/ogv):
<video controls playsinline preload=metadata>,支持拖动进度条。 - 音频(mp3/wav/m4a/ogg/flac):
<audio controls>。 - PDF:内嵌
<iframe>,Safari 原生渲染。 - 其它:提示不支持预览 + 下载按钮。
- 文件下载:通过
GET /api/workspace-files.download?w=&p=以附件方式下载,中文名走filename*=UTF-8''。 - 文件夹打包:
GET /api/workspace-files.zip?w=&p=把当前文件夹流式打包成 ZIP(无依赖实现:zlib + 自写 ZIP 容器;文本走 DEFLATE,>64 MB 的媒体走 STORE)。 - 在宿主机打开:
POST /api/workspace-files.open?w=&p=在宿主机资源管理器 / Finder 里打开该文件夹。
4. 安全设计¶
文件浏览相关路由注册在 Connection 的 /api 传输上,自动继承同一套 cookie 鉴权与 Host/Origin 栅栏。每次请求都用 realpath 解析并校验仍在工作区根内,拒绝 ..、符号链接、跨盘符。页面标题/文件名全部 HTML 转义,目录列表上限 2000 条。open 只启动宿主机上的 explorer.exe / open / xdg-open,不做任何 shell 拼接。因此暴露面与 GUI 本身一致:能登录 GUI 的人,本来就能让 agent 读这些文件。
安装与启用¶
插件安装命令如下:
# 从本地目录
dsh plugin --profile web add file:/path/to/dsh-mobile-shell
# 或从 Git
dsh plugin --profile web add git+https://github.com/mengqinlol/dsh-mobile-shell.git
# 开发时用 link:,profile 直接跑源码
dsh plugin --profile web add link:/path/to/dsh-mobile-shell
安装后重启 DSH 服务,打开 Web GUI 即生效。插件没有配置项,只针对窄屏(max-width: 820px)生效,桌面端观感不变。
典型用法¶
- 安装插件后重启 DSH 服务。
- 在手机浏览器中访问 DSH Web GUI(建议配合 HTTPS 使用,明文 HTTP 下插件只是「让界面能用」,并不会加密流量)。
- 在移动端界面中,点击左侧菜单按钮,侧栏以悬浮卡片形式展开,点击外部可收起。
- 在对话区上下滑动时,只有对话内容滚动,页面不会整体回弹。
- 点击输入框不会触发 iOS 聚焦缩放,键盘弹出时输入框会自动上移。
- 点击对话区顶部的「工作区文件」标签,在对话区中嵌入打开文件浏览页。
- 在文件浏览页中切换工作区、浏览目录、点击文件预览或下载。
- 点击「下载」按钮将文件保存到本地,或点击「在宿主机打开」在电脑上查看。
适用场景与注意¶
- 适合需要在移动端调试、查看会话、管理文件的开发者和 AI 工作者。
- 插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。
- 触控目标 ≥ 32px,切会话时抽屉自动收起,设置弹窗改为全屏 + 顶部分组横滑。
- 文件预览的上限 2 MB(文本/代码)、条目数 ≤ 20000、总大小 ≤ 3.5 GiB(ZIP 打包),不支持 ZIP64。
- 在 DSH
0.2.1-rc.2(Windows / Electron)上实测,选择器优先用 DSH 的稳定属性(data-slot/data-composer-card/role="dialog"),再用:has()做结构定位。
小结¶
mengqinlol/dsh-mobile-shell 通过悬浮抽屉、页面锁定、iOS 缩放控制、键盘感知输入框以及工作区文件浏览器,让 DSH Web GUI 在手机上的可用性大幅提升。它不仅解决了界面交互上的痛点,还提供了一个基于 Cookie 鉴权、支持预览与下载的文件浏览功能,让开发者在移动端也能高效管理会话与文件。
参考资料¶
- 插件目录页:https://www.skillhub.cn/plugins/mengqinlol/dsh-mobile-shell
- GitHub:https://github.com/mengqinlol/dsh-mobile-shell