dsh-sidebar-mobile:在 DSH 右侧边栏看真机画面并直接操作

前言

在 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

典型用法

人在面板里操作

右侧边栏 →「移动设备」→ 选择设备 → 在画面上点击或拖拽。画面卡住时可点重连(重新申请令牌)。

模型驱动设备

  1. 先 mobile_devices 拿 device id。
  2. 需要看界面结构时用 mobile_ui_tree;点元素用 mobile_tap_element;树读不到再用 mobile_find_text / mobile_tap_text。
  3. 启动应用前先 mobile_list_apps,勿猜包名。
  4. 坐标点击、滑动、输入、按键、启动应用等,在 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye