zzh799/dsh-mobile-adaptive ↗★ 0
dsh-mobile-adaptive
dsh web 移动端适配插件:侧边栏抽屉 + 设置页单列布局(P1);宿主目录浏览移动端化 + 本地上传到工作区 ./上传/(P2)。
安装
此插件尚未提供可验证的 bundle,或兼容性检查未通过。请先阅读仓库说明。 阅读完整 README ↗
说明文档
阅读完整 README ↗dsh-mobile-adaptive
dsh web 的移动端适配插件。以 dsh 客户端插件形式挂载,纯 CSS/JS 注入,不改 dsh 业务逻辑;桌面(>=1024px)零改动。
- P1 侧边栏折叠 · 设置页单列
- P2 目录浏览移动端化 · 本地上传 · 顶部工具条
功能一览
| 功能 | 说明 |
|---|---|
| 侧边栏折叠 | /上传/、重名自动改名、失败可重试 |
| 顶部工具条 | ≤1023px:权限/模型选择从输入栏上移到会话头部,原头部条目收进 + 号弹出面板;桌面端全部还原 |
目录结构
src/client.tsx 浏览器半边:抽屉交互、上传按钮 + 进度面板、store
src/mobile.css 全部移动端结构样式(锚定 data-slot / 属性选择器)
src/index.ts 宿主半边:挂载 /dsh-mobile-adaptive 上传通道
src/upload-host.ts 上传后端:分片落盘、改名、护栏、清扫
build.mjs esbuild 构建(closure-factory 工件),--watch 热更
挂载
~/.dsh/profiles/web/package.json的 dependencies 加"dsh-mobile-adaptive": "^0.1.0",并pnpm install。(本地开发时可用"dsh-mobile-adaptive": "link:本机仓库路径"代替。)~/.dsh/profiles/web/cordis.patch.yml追加:- insert: - id: dsh-mobile-adaptive name: 'dsh-mobile-adaptive'- 重启
pnpm dsh web(launchd 服务com.deepseek.dsh-web,launchctl kickstart -k gui/$(id -u)/com.deepseek.dsh-web)。
日常使用
cd
node build.mjs # 一次性构建
node build.mjs --watch # 开发:浏览器半边热更
注意:浏览器半边(lib/client.js)热更;宿主半边(lib/index.js,上传通道)改动需重启 dsh web。
目录选择固定为 browse(应用内目录树)
原因:dsh 由 launchd 托管、绑定 127.0.0.1,远程访问走组网 + NGINX 转发。directory-picker-auto boot 采样只见「回环 + darwin」,误判成桌面场景而挂载 native(Finder 选择器)。手机上点"打开工作区/目录选择"会在无人值守的 Mac 上弹 Finder,浏览器侧无 UI、功能不可用。故显式固定为 browse(应用内目录树)。
方法(配置在 ~/.dsh/profiles/web/cordis.patch.yml,profile 补丁层,非插件代码):
# 关掉 auto 判定(否则仍动态挂载 native),静态装配 browse 那一对。
- id: directory-picker
disabled: true
- insert:
- id: directory-picker-browse
name: '@deepseek-ai/dsh-host-directory-picker-browse'
- id: directory-picker-browse-surface
name: '@deepseek-ai/dsh-client-ui-directory-picker-browse'
要点:
- 两个 browse 包(host 后端 + client 界面)在 web-app bundle 已声明依赖,插到补丁列表即可。
- 生效需重启 dsh web。
- 回退默认行为(重新启用 auto)只需删掉这段并重启——会回到"远程弹 Finder、手机无 UI"的原问题。
上传传输设计
- 客户端按 1 MiB 切片 base64 走通用 RPC 通道
/dsh-mobile-adaptive(upload/begin|append|commit|abort),复用宿主连接传输层的信任围栏,不新增 HTTP 面。 - 宿主只写
/上传/:cwd 必须是已存在的绝对路径目录;文件名清洗为单路径段(剥分隔符/控制字符、240 字节截断),无法逃逸暂存目录。 - 重名改名用 no-clobber
link()(EEXIST 换(1) (2) …至 999),无 TOCTOU 窗口,并发同名不互相覆盖。 - commit 校验
received === expected,不完整会话拒绝落盘;.part临时文件 1 小时清扫、卸载时清除。
已确认的边界
- 目录浏览当前固定为 browse(见上节)。
=1024px):除附件按钮移至 + 命令按钮右侧外,与改动前一致,无回归 ✓