🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

移动端外壳 mengqinlol/dsh-mobile-shell

DeepSeek Harness
mengqinlol11 天前有提交已提供中文文档扫描:含敏感能力

让手机浏览器顺畅使用 Web 界面并浏览工作区文件

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/25 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add mengqinlol/dsh-mobile-shell
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 11 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件
查看扫描证据(共 18 处,展示前 11 条)
  • 读取本地文件
    lib/index.js:54
    return readFileSync(new URL(file, ASSET_DIR), "utf8").trim();
  • 读取本地文件
    lib/workspace-files.js:179
    const realRoot = await realpath(root).catch(() => root);
  • 读取本地文件
    lib/workspace-files.js:181
    const real = await realpath(candidate).catch(() => undefined);
  • 读取本地文件
    lib/workspace-files.js:250
    const info = await stat(target.path);
  • 读取本地文件
    lib/workspace-files.js:255
    const entries = (await readdir(target.path, { withFileTypes: true })).slice(0, MAX_ENTRIES);
  • 读取本地文件
    lib/workspace-files.js:261
    childInfo = await stat(childPath);
  • 读取本地文件
    lib/workspace-files.js:330
    const text = await readFile(target.path, "utf8").catch(() => "");
  • 执行外部命令来自配置/变量
    lib/workspace-files.js:470
    const child = spawn(command, [path], { detached: true, stdio: "ignore" });
  • 读取本地文件
    lib/zip.js:117
    const entries = await readdir(directory, { withFileTypes: true });
  • 读取本地文件
    lib/zip.js:124
    info = await lstat(full);
  • 读取本地文件
    lib/zip.js:181
    const source = createReadStream(file.path);
扫描于 2026/11/4(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
dsh-mobile-shell 把 DeepSeek Harness 的 Web GUI 在手机上真正用起来:悬浮式侧栏、页面锁死只滚对话、点输入框不放大、切会话不抢焦点、键盘弹出时输入框贴着键盘上移,并给非安全上下文补上 crypto.randomUUID。顺带还有一个工作区文件浏览器:在手机浏览器里浏览工作区、下载任意文件、在宿主机的资源管理器里打开当前文件夹。 English: A mobile shell layer for the DeepSeek Harness Web GUI — drawer overlay, page lock, no iOS focus zoom, keyboard-aware composer, the crypto.randomUUID polyfill that plain-HTTP (non-secure context) browsing needs, plus a cookie-authenticated workspace file browser with download and "reveal in file manager". 悬浮抽屉对话 为什么需要它 DSH 的 Web GUI 是按桌面设计的:打包后的前端 CSS 里没有任何宽度 media query。
展开完整文档(README 剩余 1 节)
dsh-mobile-shell

把 DeepSeek Harness 的 Web GUI 在手机上真正用起来:悬浮式侧栏、页面锁死只滚对话、点输入框不放大、切会话不抢焦点、键盘弹出时输入框贴着键盘上移,并给非安全上下文补上 crypto.randomUUID。顺带还有一个工作区文件浏览器:在手机浏览器里浏览工作区、下载任意文件、在宿主机的资源管理器里打开当前文件夹。

English: A mobile shell layer for the DeepSeek Harness Web GUI — drawer overlay, page lock, no iOS focus zoom, keyboard-aware composer, the crypto.randomUUID polyfill that plain-HTTP (non-secure context) browsing needs, plus a cookie-authenticated workspace file browser with download and "reveal in file manager".

悬浮抽屉对话

为什么需要它

DSH 的 Web GUI 是按桌面设计的:打包后的前端 CSS 里没有任何宽度 media query。
在手机上(尤其是通过公网 IPv6 + 明文 HTTP 打开时)会遇到这些问题:

| 问题 | 原因 | 本插件的做法 |
| 前端 RPC 全失败、会话列表空白 | 浏览器只在安全上下文(HTTPS / localhost)暴露 crypto.randomUUID,明文 HTTP 下没有 | 注入标准 UUID v4 polyfill(crypto.getRandomValues) |
| 侧栏展开把对话挤成一条缝 | 外壳是 CSS grid,列宽写在内联样式里,且 grid item 有 overflow: hidden | 固化列宽,侧栏改为覆盖式悬浮卡片 + 遮罩,点外面收起 |
| 上下滑动时整页跟着动 | iOS 页面级回弹 / 地址栏收起;插件统计行还把滚动容器横向撑宽 30px | html/body 钉成视口、页面不可滚,只有对话滚动;隐藏统计行 |
| 点输入框整页被放大 | 输入框是 contenteditable 的 div,字号 14px(< 16px 即触发 iOS 聚焦缩放) | 强制 16px、改写 meta viewport、拦 gesturestart |
| 切会话自动弹键盘 | 会话视图挂载时会 focus() 输入框 | 只保留「用户自己点进去」的聚焦,其余立刻 blur() |
| 键盘挡住输入框 | iOS 不为软键盘缩小布局视口 | 用 visualViewport 算键盘 inset,对话列整体上移 |

另外:切会话时抽屉自动收起、设置弹窗改为全屏 + 顶部分组横滑、触控目标 ≥ 32px。

工作区文件浏览器

对话区顶部原本是「对话 / 轨迹」两个标签,插件在它们后面追加了第三个: 工作区文件。点它会在对话区里内嵌打开文件浏览页(iframe),点「对话 / 轨迹」就切回去。

工作区文件标签

也可以绕过标签直接访问 http://<你的地址>/api/workspace-files。

默认定位到当前会话的工作区:GUI 半边把 dsh.sessions.current 里的 session id 通过 ?session= 传给页面,服务端用 workspaceRegistry 的 sessionIds 反查,于是在哪个工作区聊天就打开哪个工作区(想换就点右上角下拉框;w= 显式指定优先;找不到/超界则回落到第一个)。

标题和 GUI 一致:注册表里默认工作区的标题还是自动生成的 default-workspace,GUI 会用
workspaceDisplayTitle() 把它显示成本地化名称。页面照同一规则处理,所以下拉框里显示的是
「默认工作区」而不是那个英文目录名;其它工作区仍按标题原样显示(标题为空时用目录名)。

页面会跟随 DSH 的主题:它被 GUI 以 iframe 嵌在同一个源里,所以直接读父页面的
body[data-ds-dark-theme] 标记切换深/浅配色(独立打开时退回系统偏好),每秒同步一次,
你在界面里换主题它也会跟着换。页面骨架本身的模板在 assets/files-page.html,和 mobile-fix.css / shell.js 一样每次请求读盘,改样式只需刷新。

| 路由 | 作用 |
| GET /api/workspace-files | 网页版文件浏览:工作区切换、面包屑、目录列表;点文件进入预览页 |
| GET /api/workspace-files.view?w=&p= | 行内流(content-disposition: inline)+ HTTP Range,给 / / / PDF 用 |
| GET /api/workspace-files.download?w=&p= | 以附件下载文件(content-disposition,中文名走 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 里打开该文件夹 |

w 是工作区序号(页面下拉框里的顺序),p 是相对工作区根的路径。

预览

点文件不再直接下载,而是进入预览页(左上角「← 返回」回目录,「⬇ 下载」随时可存):

| 类型 | 预览方式 |
| 文本/代码(md、json、js、ts、css、yml、csv、py、ps1 …) | 内联 (等宽、可滚动,上限 2 MB) |
| 图片(png/jpg/gif/webp/svg/bmp/avif) | |
| 视频(mp4/mov/webm/ogv) | |
| 音频(mp3/wav/m4a/ogg/flac) | |
| PDF | 内嵌 (Safari 原生渲染) |
| 其它 | 提示不支持预览 + 下载按钮 |

视频不难,难的是 Range: 要拖动进度条就得有 206 Partial Content,Safari 甚至不给 Range 就不播。workspace-files.view 实现了单区间 Range(bytes=a-b、bytes=a-、 bytes=-n,越界回 416 + Content-Range: bytes /size),所以能直接拖进度条。

视频预览文本预览

zip 的边界(都是明确的报错,不会吐半截坏包):条目数 ≤ 20000、总大小 ≤ 3.5 GiB、不支持 ZIP64;打包前先扫描,超限直接 413。实测 8.7 MB / 177 个文件的目录耗时约 0.5 秒,用 Windows 自带解压器解开后文本逐字节一致、PNG 完好。

安全设计:

- 三个路由都注册在 Connection 的 /api 传输上,自动继承同一套 cookie 鉴权与 Host/Origin 栅栏——没有会话 cookie 一律 401,伪造 Host 403;
- 每次请求都用 realpath 解析并校验「仍在工作区根内」,..、符号链接、跨盘符都会被拒;
- 页面标题/文件名全部 HTML 转义,目录列表上限 2000 条;
- open 只启动宿主机上的 explorer.exe / open / xdg-open,不做任何 shell 拼接。

所以它的暴露面和 GUI 本身一致:能登录 GUI 的人,本来就能让智能体读这些文件。

安装

插件就是一个普通的 DSH bundle(dsh.bundle.patch → cordis.patch.yml),不修改 DSH 本体。

从本地目录
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)生效,桌面端观感不变。建议配合 HTTPS 使用;明文 HTTP 下插件只是「让界面能用」,并不会加密流量。

结构

dsh-mobile-shell/
├── package.json # dsh.bundle.patch → cordis.patch.yml
├── cordis.patch.yml # 只插入自己这一行,不动任何其它行 ├── lib/index.js # index tap:polyfill + + ;挂载文件路由 ├── lib/workspace-files.js # /api/workspace-files(.download|.zip|.open) 四个路由 ├── lib/zip.js # 无依赖流式 ZIP 写入(CRC32 + zlib DEFLATE + central directory) ├── assets/files-page.html # 文件浏览页模板(每次请求读盘) ├── assets/mobile-fix.css # 移动端样式(每次请求读盘) ├── assets/shell.js # 移动端行为 + 抽屉里的「工作区文件」入口(每次请求读盘) └── test/smoke.mjs # 挂载插件,断言注入内容 + 文件路由/zip/越权拦截

lib/index.js 通过 webserver 的 tapIndex 钩子改写 index.html;两个资源文件在每次请求时读盘,所以改样式/前端行为只需刷新页面,不必重启服务。改 lib/.js(路由、注入逻辑)需要重启(Node 的 ESM 模块缓存)。

兼容性

- 在 DSH 0.2.1-rc.2(Windows / Electron)上实测。
- 选择器优先用 DSH 的稳定属性(data-slot / data-composer-card / role="dialog"),再用 :has() 做结构定位;个别 hash 类名(BynINW_、Dc7zOa_*)作为兜底。
DSH 更新后若布局变化,最坏情况是某条修饰失效,不会让页面打不开。
- 不绑定端口、不改 webserver 行:绑定地址始终由 dsh web --host/--port 决定。

开发

npm test # 无需依赖:挂载插件 + 断言注入内容

许可

MIT。crypto.randomUUID polyfill 的思路与实现源自 dsh-lan-access(MIT © Leon0555),其余为本项目实现。
预览分享卡片长什么样 ↓mengqinlol/dsh-mobile-shell
分享 · DeepSeek Harness Hub
mengqinlol/dsh-mobile-shell

让手机浏览器顺畅使用 Web 界面并浏览工作区文件

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部