DeepSeek Harness plugin

dsh-mobile-remote

Mobile responsive shell (single-column layout, drawer sidebar, overlay details) and WireGuard remote enhancements for the DeepSeek Harness web GUI

Jump to install

Source facts

Repository
az7627/dsh-mobile-remote
Latest update
Aug 17, 2026
Category
Tools & Capabilities
GitHub stars
1
Format
plugin
Catalog evidence
Upstream dsh.bundle evidence
Evidence path
package.json#dsh.bundle
Checked against
0.1.0-rc.8
Upstream check date
2026-08-20

This evidence comes from the upstream catalog. This site has not installed, run, or security-reviewed the plugin.

Install

Start with a prompt that asks an agent to review the GitHub repository and source. Switch to the command if you want to install it yourself.

Copy this prompt into DSH, Codex, or another agent and ask it to review the GitHub repository and source first.

Do not install or run any commands yet. Read this plugin's GitHub repository, README, and relevant source code. Then answer the questions below clearly and directly so I can decide whether it fits my needs:

1. What is this plugin, and what problem does it solve?
2. Who is it for, and what are its typical use cases?
3. How is it used after installation? Include one minimal example.
4. What known limitations or privacy, security, compatibility, or maintenance risks does it have?
5. Give a clear recommendation: recommend, conditionally recommend, or do not recommend, with reasons.

Distinguish statements documented by the repository, inferences from source code, and unknowns. If evidence is insufficient, say so explicitly. Do not guess or simply repeat the README.

GitHub: https://github.com/az7627/dsh-mobile-remote
Plugin: dsh-mobile-remote
Author: az7627

Check the source files

Read the README and other files from this plugin directory before installing.

File explorer3 files
README.mdSource · read only

@az7627/dsh-mobile-remote

DeepSeek Harness Web GUI 的手机响应式适配与 WireGuard 远程增强插件(双面包,不改 Harness 源码、不改 npx 安装内容)。npm 包名带作用域(无作用域的 dsh-mobile-remote 已被他人占用)。

功能

  • 手机布局(≤760px 视口):三栏外壳单栏化;侧边栏变为左滑抽屉(含遮罩与左上角菜单按钮);details 面板变为全屏覆盖层;拖拽把手隐藏;iOS safe-area、输入框 16px 防缩放、触控目标 ≥36px。
  • 弹窗手机化:真正的模态对话框(primitives Modal 与设置面板)在手机上全屏化,内容区独立滚动;普通弹层面板(菜单、上下文面板等)保留自己的盒子与背景,不受影响。
  • 弹层防越界:菜单、列表、带背景阴影的面板等浮层若出屏,自动平移到屏幕内(先钳宽度、再横向平移);触发器位置变化(如工具栏换行)时跟随重算;抽屉、详情面板等自带 transform 动画的表面不受干扰。已实测 320–430px 六档宽度下模型选择菜单始终完整在屏。
  • 预设标签精简:窄屏下 Agent 预设按钮只显示图标 + 标准 / 极简 / PTC / 创造(英文同理),去掉"模式"二字;桌面端保持全称。
  • 桌面零改动:所有规则收窄在媒体查询内,桌面布局与列宽不受影响。
  • 目录选择页重建:本插件把 Harness 的目录选择交互钉为 Web 目录页,并以自研界面取代内置 browse 对话框(宿主 browse 后端保留)。桌面端:大对话框 + 左侧快捷目录(主文件夹/下载/桌面/文档/图片/音乐/视频 + 底部"此电脑"/根目录)、分栏(Miller columns)浏览、四键工具栏(后退/前进/上一级/刷新)、面包屑路径栏(每级可点击,点击空白处可输入路径跳转);手机端:快捷目录落地页 → 单列列表 + 返回键,全屏呈现。任何绑定方式下"添加工作区"都可用,且不再弹系统对话框。
  • 文件管理:侧边栏"设置"上方新增"文件管理"入口——与选择器同一分栏视图;每打开一个目录追加一栏、放不下时底部横向滚动条自动定位到最新栏、每栏独立滚动条且展开新栏时原栏滚动位置保持右键菜单(重命名、复制、粘贴、删除、下载、选择打开方式、复制文件地址、属性、新建、上传、刷新、在终端中打开),粘贴自动加 -copy-2 后缀防重名;按扩展名打开(文本预览/编辑保存、图片/视频/音频内联预览、PDF 新标签页、未知类型自定义打开方式),十六进制编辑(64KB 分窗、8MB 上限)、上传(8MB)、下载、删除(非空文件夹二次确认);文件夹属性显示递归统计的真实大小隐藏文件以半透明显示;手机端保留行内触控按钮。
  • 真 PTY 交互终端:侧边栏"终端"按钮(位于文件管理上方)打开浏览器内终端——宿主 node-pty(Windows 走 ConPTY)会话 + 客户端 xterm.js 渲染:行编辑、ANSI 颜色、全屏 TUI 应用(more/vim/top 等)都能用;终端跟随视口 fit 并同步 PTY 尺寸;输出为有界环形缓冲(256KB),轮询 60ms;空闲回收:客户端停止轮询(页面关闭而未走关闭 RPC)10 分钟后自动杀掉会话,避免 PowerShell 进程泄漏。文件管理右键"在终端中打开"可在任意目录启动终端;Windows 默认 PowerShell(-NoProfile),其他平台 bash。
  • 手机设置页可用(回环补丁):rc.6 对非 loopback 浏览器把设置作用域钉为 persistence:"memory"——手机上的设置标签页(插件配置/通用/模型/欢迎)不发任何请求、整页空白。本插件在可信远程会话中把连接句柄的 isLoopback 置真,并对已消费旧值的设置消费者条目(settings-plugins / settings-general / settings-models / deliverables)做一次 fiber 重应用,让它们重新绑定到主机持久化传输(经下文的特权转发通道)。桌面(loopback)完全不受影响。
  • 远程增强:断线重连状态条;通用设置里的"远程访问状态"行(绑定地址 / 信任来源 / 目录选择后端 / 插件版本,手机可自查);PWA 增强(standalone manifest + PNG 图标 + apple-touch-icon)。
  • 非安全上下文修复:手机经 http://隧道IP(非安全源)访问时浏览器不提供 crypto.randomUUID,导致所有 RPC(设置、目录列表、模型/插件/预设)报 crypto.randomUUID is not a function。插件启动时安装 UUIDv4 回退(基于 crypto.getRandomValues,任何源可用),手机上接口恢复正常。
  • 特权 API 解除 loopback 钉死:rc.6 把设置/凭据/Agent 预设/模型发现等方法钉为仅本机可用(手机上 403 forbidden)。插件把同源特权调用转发到自己的 trusted-host 通道,宿主侧再以回环请求交给内置 apiProxy 分发(信任边界仍是 profile 里的 trustedHosts,即 WireGuard 隧道地址)。

安装

从 npm 安装(推荐)

dsh plugin --profile web add @az7627/dsh-mobile-remote

重启 npx @deepseek-ai/dsh web 生效。

  • 更新:重新执行上面的 add(pnpm 会装最新版)
  • 卸载:dsh plugin --profile web remove @az7627/dsh-mobile-remote

本地开发(link 安装)

dsh plugin --profile web add C:\path\to\dsh-mobile-remote

改完源码 pnpm run build 后重启 npx @deepseek-ai/dsh web 即生效,无需重新 add。

手机(WireGuard)远程访问

> 重要(rc.6 实测):rc.6 的 webserver 只接受 127.0.0.1 / 0.0.0.0 绑定,且 CLI 有意拒绝 0.0.0.0——无法直接把服务绑到 10.66.66.1。远程访问采用:本机绑定 + WireGuard 地址端口转发,目录选择由本插件钉为 Web 目录页(上面已说明)。

1. profile(~/.dsh/profiles/web/cordis.patch.yml)的 web-runtime 配置需包含隧道地址的 trustedHosts(例如 10.66.66.110.66.66.1:3080),手机请求才能通过 /api 信任栅栏。 2. 安装端口转发(一次,需管理员): ``powershell netsh interface portproxy add v4tov4 listenaddress=10.66.66.1 listenport=3080 connectaddress=127.0.0.1 connectport=3080 ` 3. 启动(本机绑定)并访问手机地址 http://10.66.66.1:3080`。

推荐的无人值守启动方式(scripts/start-dsh-web.ps1):

pwsh -File scripts\start-dsh-web.ps1 -InstallPortProxy   # 一次:安装端口转发(管理员)
pwsh -File scripts\start-dsh-web.ps1                     # 启动(检测接口/端口占用/转发状态)
pwsh -File scripts\start-dsh-web.ps1 -RegisterStartup    # 可选:注册登录自启计划任务

目标版本

按 DeepSeek Harness 0.1.0-rc.6 的 Web 外壳 DOM 契约实现(三栏 inline grid、data-sidebar-collapsed/data-details-collapsed 状态属性、ctx.layout 面板契约、shell.overlay/settings.general.item 槽位)。核心升级后需重新验证并随版本跟进。

开发

pnpm install
pnpm run typecheck
pnpm test
pnpm run build
# 一次性测试实例(必须!与真实 ~/.dsh 完全隔离,避免污染真实会话日志):
pwsh -File scripts\start-test-dsh.ps1            # 启动 http://127.0.0.1:3097
pwsh -File scripts\start-test-dsh.ps1 -Remove    # 清空隔离测试目录
# 实测(针对上面的隔离实例):
node scripts/verify-mobile.mjs
node scripts/verify-file-manager.mjs http://127.0.0.1:3097
node scripts/verify-terminal.mjs http://127.0.0.1:3097
node scripts/verify-settings-loopback.mjs http://127.0.0.1:3097   # 手机权威仿真(10.66.66.1 映射回环)
node scripts/verify-usage-remote.mjs http://127.0.0.1:3097        # token-usage /usage 信任栅栏

> ⚠️ 不要用共享 ~/.dsh 的实例跑验证脚本:验证浏览器打开会话会触发加载修复,向真实会话日志写入 closers,与运行中实例的写入冲突会造成日志 seq gap。

License

MIT