让 DSH 在 iPhone/iPad 上可用:显式开启的局域网反向代理(改写 Host/Origin 通过回环信任栅栏,含 WebSocket 升级)、iOS PWA 外壳(主屏幕图标、standalone meta、viewport-fit)、触屏/移动端 CSS(安全区、键盘避让、输入框按钮行适配)。
安装
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:cindyguyuehu123/dsh-mobile
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
让 DeepSeek Harness Web GUI 在 iPhone / iPad 上也能用:局域网反向代理 + iOS PWA(添加到主屏幕)+ 触屏适配。
DeepSeek Harness 的 Web GUI 默认只监听 127.0.0.1(上游出于安全刻意禁止 --host 0.0.0.0)。本插件为它补齐手机端体验:
- 📱 局域网访问 —— 插件自己起一个
0.0.0.0反向代理,把手机/iPad 的请求转发给回环服务,并改写Host/Origin通过/api信任栅栏(HTTP 与 WebSocket 升级都支持)。启动时打印局域网地址和终端二维码。 - 🍎 iOS PWA 外壳 —— 注入
apple-mobile-web-app-capable、viewport-fit=cover、apple-touch-icon等元信息,程序化生成 PNG 图标,增强manifest.webmanifest。Safari「添加到主屏幕」后像原生 App 一样全屏打开,带独立图标。 - 👆 触屏适配 —— 注入移动端 CSS:输入框 ≥16px 防 iOS 聚焦缩放、
touch-action: manipulation去掉双击缩放延迟、iPhone 刘海/Home 指示条安全区留白、软键盘弹出时把输入区抬到键盘上方(visualViewport 监测)、消息操作按钮增大点按目标。 - 🔳 /mobile 扫码页 —— 桌面浏览器打开
http://127.0.0.1:3080/mobile显示大二维码 + 步骤说明,手机相机一扫即开。
⚠️ 安全警告(必读)
启用本插件后,同一局域网内的所有设备都能访问你的 Harness,并且可以完全驱动它——包括执行代码的工具。 这不是瑕疵,是"手机能用"的前提。请务必:
- 只在你自己信任的网络(如家里 Wi-Fi)开启;
- 连接公共/陌生 Wi-Fi 时,从
cordis.patch.yml移除mobile行(或临时把行注释掉)再重启; - 可选:用
allow配置只放行指定手机 IP(见下文)。
🔧 harness 源码补丁(按需,不依赖 dsh-webchatlike)
dsh-mobile 本身完全不依赖 dsh-webchatlike——没装 webchatlike 的原版 harness 也能用移动版。补丁按需应用:
| 补丁 | 必需? | 说明 |
|---|---|---|
| 安全上下文 UUID | ✅ 必须 | 上游 bug: mintRpcId() 用 crypto.randomUUID,该 API 只在安全上下文可用。http://127.0.0.1 是可信源(本机正常),但手机经局域网 IP 访问时不是安全上下文,randomUUID 为 undefined → 每个 RPC 抛错 → 连接握手失败 → 手机端一直转圈白屏。打在上游原版文件上,与 webchatlike 无关 |
| webchatlike 折叠回退 | ⚪ 仅配合 webchatlike | 修 webchatlike 的版本家族折叠在移动端失效(全新浏览器没有 localStorage 记录)。没装 webchatlike 就不需要——原版没有折叠功能,所有会话本来就独立显示 |
补丁 1:安全上下文 UUID(必须,与 webchatlike 无关)
| 文件 | 改动 |
|---|---|
| packages/host/apiproxy/src/fetch/client.ts | mintRpcId() 改用 crypto.getRandomValues 生成 v4 UUID(核心修复) |
| packages/client/ui-conversation/src/client/service.ts | 附件草稿 id 同样替换 |
| packages/llm/llm/src/message.ts | 消息 id 同样替换 |
cd /path/to/deepseek-harness
pnpm run build:lib:client # 客户端 bundle 会被运行中的 GUI 自动热替换
补丁均已备份在 harness-patches/,升级 harness 后重新应用即可。
补丁 2:webchatlike 折叠回退(可选,仅当你也用 dsh-webchatlike)
packages/client/ui-workspace/src/client/tree.ts、WorkspaceBrowser.tsx、index.ts——同样备份在 harness-patches/。
从 GitHub 安装
仓库地址:github.com/cindyguyuehu123/dsh-mobile(已发布,lib/ 构建产物随仓库分发)
方式一(官方插件命令,自动克隆并安装依赖):
dsh plugin --profile web add https://github.com/cindyguyuehu123/dsh-mobile.git
方式二(手动注册,与 dsh-webchatlike 相同):
# 1. 克隆到本地并安装依赖
git clone https://github.com/cindyguyuehu123/dsh-mobile.git
cd dsh-mobile && pnpm install
# 2. 在 ~/.dsh/profiles/web/package.json 的 dependencies 加入
# "dsh-mobile": "link:/绝对/路径/dsh-mobile"
cd ~/.dsh/profiles/web && pnpm install
# 3. 在 ~/.dsh/profiles/web/cordis.patch.yml 插入
# - insert:
# - id: mobile
# name: 'dsh-mobile'
安装
1. 构建
cd /path/to/dsh-mobile
pnpm install
pnpm run build
产物:lib/index.js(host 半)与 lib/client.js(浏览器半,零外部依赖)。
2. 注册到 profile
编辑 ~/.dsh/profiles/web/package.json,加入 link 依赖:
"dependencies": {
"dsh-mobile": "link:/path/to/dsh-mobile"
}
然后:
cd ~/.dsh/profiles/web && pnpm install
编辑 ~/.dsh/profiles/web/cordis.patch.yml,插入 loader 行:
- insert:
- id: mobile
name: 'dsh-mobile'
3. 重启
cd /path/to/deepseek-harness
pnpm dsh web
启动日志会打印:
dsh-mobile: 📱 手机 / iPad 访问: http://192.168.x.x:3090
dsh-mobile: 桌面浏览器打开 http://127.0.0.1:3080/mobile 可显示大二维码
使用
- 手机/iPad 连同一个 Wi-Fi;
- 用 iPhone/iPad 的相机扫桌面
/mobile页的大二维码(或直接输入日志里的地址); - Safari 打开后点 分享 → 添加到主屏幕,以后从主屏幕图标像原生 App 一样进入。
配置
插件行可以带 config(可省略):
- insert:
- id: mobile
name: 'dsh-mobile'
config:
lanPort: 3090 # 代理端口,占用时自动 +1 尝试(默认 3090)
allow: [] # 可选:只允许这些客户端 IP(如 ['192.168.1.20']);空 = 放行全部
工作原理(为什么不需要改 harness 源码)
- 上游 WebServer 的
/api与 WebSocket 升级都经过isTrustedApiRequest信任栅栏:回环Host放行,Origin(如有)必须同源。本插件的代理把Host改写成127.0.0.1:<回环端口>,把同源Origin同步改写,所以手机流量在核心服务器看来和本地流量完全一致——不修改 harness 一行源码,也不需要碰被禁用的--host 0.0.0.0。 - PWA 部分走上游公开的
webServer.tapIndex()与路由注册扩展点,同样是纯增量。 - 浏览器半走标准
dsh.client通道(/plugins/dsh-mobile/client.js),与内置 ui-* 插件同一条加载链路。
开发
pnpm run build # 构建 lib/ (tsdown)
pnpm run typecheck # tsc --noEmit
改动 src/client/ 后重新 build,正在运行的 GUI 会通过 client-modules 的 bundle 轮询热替换,不用重启页面(host 半改动需要重启 dsh web)。
已知边界
- 只能在同一局域网(或你自行打通的路由)内访问;手机走蜂窝网络时无法直连 Mac。
- macOS 首次监听
0.0.0.0时,系统防火墙可能弹窗询问是否允许 Node.js 接受传入连接,选「允许」。 - 真实设备上的键盘/安全区表现以 iPhone/iPad 实测为准(本插件的 JS 逻辑已覆盖主流情况,但不同 iOS 版本细节略有差异)。
链接
同类插件
zhu1090093659/dsh-web#packages/dsh-remote-web-ui★ 8121
手机/PC 远程操控 dsh web 工作区:扫码配对、令牌门控通道、SSE 实时同步,提供移动端与完整桌面 GUI 两种远程形态。
zhu1090093659/dsh-web#packages/dsh-ssh★ 8121
SSH 远程运维面板:Web 终端、SFTP 传输、本地端口转发与一条命令并发集群执行,Agent 与面板共用同一份主机配置。
saya-ch/dsh-mobile★ 333
通过 Android App 或手机浏览器访问 DeepSeek Harness,支持安全局域网连接、远程访问、持久设备配对和可自定义移动界面。
ZSeven-W/dsh-ios★ 308
在对话里直接操作 iOS 模拟器或 USB 连接的 iPhone:22 个 Agent 工具用于启动、构建、按无障碍标识或 OCR 文本驱动 UI、列表行操作与 SwiftUI 预览热重载,并附带可点击拖拽的流式侧边栏面板。
liguobao/ds-harness-remote★ 234
DeepSeek Harness 多端远程访问:从手机、平板、浏览器或另一台电脑继续进行中的会话,端到端加密通道(Noise IK + 自适应 Relay/WebRTC 传输),设备授权管理;远程端仅开放 ApiProxy 能力,支持 dsh-file-viewer 只读文件预览,不提供 Shell、远程桌面或写入权限。
wenbin-wb/dsh-bridge★ 177
DeepSeek Harness 远程与移动端接入插件:提供局域网扫码直连、Cloudflare 与自建公网隧道,以及微信、QQ、飞书、Telegram 机器人交互,内置安全认证与访问控制。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。