前言¶
在 DSH 里做移动端自动化或联调时,常见做法是分别装 Android / iOS 插件,用 adb 截屏或模拟器 MJPEG 把画面塞进工作区。社区里已有 dsh-android、dsh-ios 等方案,但取帧往往是整帧 PNG 循环,1080p 每帧几百 KB,实测帧率只有约 1.8fps 量级,瓶颈不在 adb,而在每帧搬运完整位图。
mobilecli 是一条覆盖 iOS 与 Android 的设备控制 CLI,支持 H.264 / MJPEG 等流式取帧,也有 screencapture,但输出只能写到 stdout,没有可点的面板。下面介绍维护者 j62268781-alt 的客户端插件 dsh-sidebar-mobile(npm 包 @j62268781-alt/dsh-sidebar-mobile,当前版本 0.1.0,MIT 许可证):把 mobilecli 封进 DSH 右侧边栏,提供实时画面与直接点击/拖拽,并用一套 API 同时覆盖两端,还把 mobilecli 自带的 skill 注册给模型。
这是什么¶
dsh-sidebar-mobile 是 DeepSeek Harness 的 web 客户端插件(分类:客户端)。它不在浏览器里直连设备端口,而是通过 DSH 自己的 web 路由转发 mobilecli 的流与交互;对人提供「移动设备」侧边栏面板,对模型提供 11 个精选工具,并可选注册上游 mobilecli 的 playbook skill。
插件在 package.json 中声明运行时依赖为 0:React 使用宿主版本,客户端产物已提交,安装方无需本地跑前端工具链(开发构建见上游 README)。
核心功能¶
实时画面与侧边栏操作¶
- Android 走 mobilecli 的 AVC/H.264(README 实测 104fps);iOS 模拟器走 MJPEG(实测 131fps)。与 PNG 循环截屏相比,码流体积差约两个数量级。
- 在画面上点击、拖拽会按显示比例换算回设备物理坐标。
- 设备下拉按真机 / 模拟器分组;离线模拟器可先启动(冷启动可能数分钟),离线真机只选中不启动。
- 面板提供主屏幕、返回(仅 Android)、旋转、重连令牌、外观切换等控件;状态栏显示是否串流、平台及流格式(
H.264或MJPEG)。
一套 API,iOS 与 Android 同路径¶
真机、模拟器、模拟机走同一条 mobilecli 路径,插件侧不按平台分叉实现。
给模型的 11 个工具¶
只注册 README 列出的工具(坐标点击、滑动、输入等薄包装已删除,改由 shell 直接跑 mobilecli 命令,并写在 skill 里):
| 工具 | 用途 |
|---|---|
mobile_devices |
列出设备(应先执行以拿到 device id) |
mobile_boot |
启动设备并开始串流 |
mobile_ui_tree |
读 UI 树(结构化,首选) |
mobile_screenshot |
截图(给人或多模态看) |
mobile_tap_element |
按标识/文本点元素 |
mobile_list_apps |
列已安装应用 |
mobile_find_text / mobile_tap_text |
OCR 找字/点字(兜底) |
mobile_wait_for |
等文本出现或消失 |
mobile_logs |
读设备日志 |
mobile_open_panel |
打开侧边栏移动设备面板给用户看(非给模型读界面) |
观察方式代价在工具描述中有说明:mobile_ui_tree 约 100–300ms,mobile_screenshot 约 200–400ms,mobile_find_text 约 1s。
自带 mobilecli skill¶
上游 SKILL.md 与 reference.md 被打包注册;配置项 registerSkills 默认为 true。不必手动往 .agents/ 复制 playbook。
安全与依赖边界¶
浏览器不接触 mobilecli 监听在 localhost 的端口;画面经 /_dsh/dsh-sidebar-mobile/stream/<token> 等 DSH 路由,带签名令牌与 loopback 围栏(细节见上游「安全模型」一节)。
安装与启用¶
插件以当前 dsh 进程 的权限运行;安装前建议查看 GitHub 仓库 源码与 MIT 许可证。引擎要求:Node >= 20,dsh >= 0.2.0-0(README 徽章标注 DSH 0.2.0-rc.2 实测)。
前置:mobilecli¶
npm install -g mobilecli@latest
mobilecli devices # 确认能看到设备
前置:adb(Android 必需)¶
mobilecli 调用外部 adb;adb 缺失时 mobilecli devices 仍可能返回空列表且 exit 0。需安装 platform-tools、配置 PATH 或 ANDROID_HOME,装好后 重启 DSH,并执行 mobilecli daemon stop 让 daemon 重新读环境(daemon 会缓存启动时的环境)。
前置:iOS agent¶
iOS 真机与模拟器均需 agent;本插件不会自动安装:
mobilecli agent status --device <udid>
mobilecli agent install --device <udid> # 真机需要 provisioning profile
安装插件¶
Web profile:
dsh plugin --profile web add @j62268781-alt/dsh-sidebar-mobile@latest
dsh web
或作为 profile 包依赖:
pnpm add @j62268781-alt/dsh-sidebar-mobile
装完后刷新页面,右侧边栏「开始」页出现「移动设备」入口。快捷键:桌面 Ctrl+Shift+M(macOS 为 ⌘⇧M),浏览器 Ctrl+Alt+M(macOS 为 ⌘⌥M);可在 设置 → 快捷键 修改。桌面版请通过 设置 → 插件市场 安装(desktop profile 不由 CLI dsh plugin --profile desktop 添加)。
配置¶
在 profile 的 cordis.patch.yml 中,键挂在 dsh-sidebar-mobile 下。常用项包括:
| 键 | 默认 | 说明 |
|---|---|---|
enabled |
true |
总开关 |
binaryPath |
null |
mobilecli 路径;null 时按环境变量、PATH、包内平台包四级解析 |
homeDir |
null |
MOBILECLI_HOME |
routePrefix |
/_dsh/dsh-sidebar-mobile |
路由前缀 |
registerSkills |
true |
是否注册 mobilecli skill |
stream.idleStopSeconds |
300 |
无消费者后停流时间 |
stream.restartDelayMs |
5000 |
流崩溃后重启延迟 |
stream.defaultScale |
1.0 |
缩放(如 0.5 在 iOS 上可降低码率) |
useDaemonRpc |
true |
交互优先走 daemon unix socket |
trustedAuthorities |
[] |
反向代理时显式 authority |
典型用法¶
人在面板里操作¶
右侧边栏 →「移动设备」→ 选择设备 → 在画面上点击或拖拽。画面卡住时可点重连(重新申请令牌)。
模型驱动设备¶
- 先
mobile_devices拿 device id。 - 需要看界面结构时用
mobile_ui_tree;点元素用mobile_tap_element;树读不到再用mobile_find_text/mobile_tap_text。 - 启动应用前先
mobile_list_apps,勿猜包名。 - 坐标点击、滑动、输入、按键、启动应用等,在 shell 中直接调用 mobilecli(与已删工具等价),例如:
mobilecli io tap --device <id> 540,1200
mobilecli io swipe --device <id> --duration 250 540,1800,540,700
mobilecli io text --device <id> "hello"
mobilecli io button --device <id> BACK
mobilecli apps launch --device <id> com.example.app
注意:io swipe 必须传 --duration;坐标为物理像素;输入前需先聚焦目标。
需要用户亲眼看屏时¶
模型可调用 mobile_open_panel 打开侧边栏面板;面板内容不在模型上下文中,用途是让人看实时画面。
适用场景与注意¶
适合:在 DSH 会话里同时写代码、让模型读 UI 树/日志、并在侧边栏低延迟预览 Android / iOS(含模拟器)画面;希望一套工具覆盖双端且自带 mobilecli 使用说明的场景。
注意:
- Flutter 应用的无障碍树往往只有匿名 View,读不到 widget 语义;这是 Flutter 渲染模型限制,不是 mobilecli 独有缺陷。要 widget 级树需 Dart VM Service 或工程内
integration_test/ Patrol;本插件不提供mobile_flutter_tree(上游已删除)。 - 「开始」页胶囊超过 4 个时,DSH 会关闭所有胶囊副标题;装上本插件后可能影响其他入口副标题显示,属宿主规则,插件无法单独豁免。
- 社区目录 SkillHub 插件页 与 GitHub 为独立信息源,与 DeepSeek / 幻方无官方从属关系;星标等数据以页面当时展示为准(资料中 GitHub 1 star)。
结尾¶
dsh-sidebar-mobile 把 mobilecli 的流式取帧与设备控制收进 DSH 右侧边栏,并用 11 个工具加 bundled skill 把能力同时给人和模型用,在 README 给出的帧率对比下,相对传统 PNG 截屏方案更适合需要流畅预览与结构化读界的 Harness 工作流。
- 目录页:https://www.skillhub.cn/plugins/j62268781-alt/dsh-sidebar-mobile
- 仓库:https://github.com/j62268781-alt/dsh-sidebar-mobile