@qingshanyuluo/dsh-client-ui-mobile
v0.1.3
Published
DeepSeek Harness mobile shell adaptation: zero-space sidebar drawer, floating hamburger pill, tighter conversation gutters. Ships as a real dsh client plugin.
Maintainers
Readme
dsh-mobile-ux
DeepSeek Harness Web GUI 的移动端体验增强套件:手机上看(或窄窗口)时,侧边栏收成悬浮按钮、内容占满全屏、留白收紧;并可把 DSH 通过 Cloudflare 隧道发布成带密码的公网地址、用极简 Android App 全屏访问。
三件套,可单独使用:
| 组件 | 目录 | 作用 |
| --- | --- | --- |
| 移动端 UI 插件 | client.js / styles/mobile.css | ≤1023px 时:侧边栏 0 占用 + 悬浮汉堡按钮 + 抽屉 + 收紧留白(纯 CSS,不改 dsh) |
| Cloudflare 隧道 | tunnel/ | Caddy 密码网关 + cloudflared 临时隧道,launchd 开机自启,地址变化自动记录 |
| Android App | apk/ | 全屏 WebView 打开隧道地址,记住用户名密码,免密码弹窗 |
移动端插件
窗口/设备宽度 < 1024px 时自动生效:
- 三列栅格改为全宽中列;侧边栏与 details 不再占布局;
- 折叠的侧边栏变成左上角 56px 悬浮汉堡按钮,点击弹出 280px 抽屉(带遮罩);
- 对话区左右留白 32px → 12px;触屏隐藏拖拽手柄;
- 桌面宽度(≥1024px)行为不变。
已知限制:手机端 details 面板无法打开(壳的列宽计算在窄屏强制为 0,纯 CSS 无法覆盖 JS 逻辑);会话头部的轨迹视图可作为替代。
作为临时动态插件使用
在 DSH 会话里让 agent 用 Cordis 动态插件机制定义/激活 client.js 的内容(styles.insert),效果与会话同生命周期,重启 dsh 后失效。
作为正式 dsh 插件安装(推荐)
见 docs/dsh-plugin.md:把它装进 ~/.dsh/profiles/<profile>/node_modules,在 cordis.patch.yml 加一行,重启 dsh web 即永久生效,不再依赖会话。
⚠️ CSS 选择器(
.pI_x6G_*、.wSkVaW_*、.Md3f7G_*等)来自特定前端构建产物,@deepseek-ai/dsh-web-frontend/dsh-client-ui-*升级后需重新提取对齐。
Cloudflare 隧道
无需域名:本地运行 cloudflared tunnel --url http://127.0.0.1:3081(随机 *.trycloudflare.com 地址)+ Caddy 密码网关。地址每次进程重启会变化,机制上无法固定;要固定地址请使用自己的域名(加进 Cloudflare 后走命名隧道,本套件不含该部分)。
brew install caddy cloudflared
bash tunnel/install.sh # 交互设置密码,安装 launchd 服务并启动
cat ~/.dsh/public-tunnel/url.txt # 当前公网地址- 公网地址(带密码)→ Caddy(
127.0.0.1:3081,仅本机监听)→dsh web(127.0.0.1:3080); - Caddy 统一改写
Host/Origin为回环地址,通过 dsh 的/api浏览器信任围栏(防 DNS 投毒),无需改 dsh 配置; - 密码保存在
~/.dsh/public-tunnel/Caddyfile(bcrypt),不要把真实密码提交到 git; - 管理:改密码或重启
launchctl kickstart -k gui/$(id -u)/com.dsh.public-tunnel;卸载launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.dsh.public-tunnel.plist。
Android App(DSHViewer)
极简 WebView 壳:
- 全屏加载隧道地址,Basic Auth 自动填入(记住用户名/密码,永不弹密码框);
- 首次打开填写:网页地址、用户名、密码;之后用右下角半透明 ⚙ 修改;
- 返回键 = 网页后退。
构建(需要 JDK 17+、Android SDK、Gradle;macOS/Homebrew):
brew install --cask android-commandlinetools gradle
export ANDROID_HOME=/opt/homebrew/share/android-commandlinetools
yes | sdkmanager --sdk_root="$ANDROID_HOME" --licenses
sdkmanager --sdk_root="$ANDROID_HOME" "platform-tools" "platforms;android-35" "build-tools;35.0.0"
cd apk && bash build.sh # 产物:app/build/outputs/apk/debug/app-debug.apk安装:把 APK 传到手机打开(允许未知来源),填写地址/密码。
安全提醒
- 公网地址是完整 Harness(可执行命令),仅给信任的人;
- 隧道密码为共享口令,定期更换;想更强可用自己的域名 + Cloudflare Access(邮箱验证码,按人审计);
- 本仓库不含任何真实密码/地址。
License
MIT
