Blank-not-black/dsh-Remote 预览 preview

Blank-not-black/dsh-Remote

DSH Remote · 口袋里的 DSH 控制台 会话 · 审批 · 提问 · 文件传输,局域网 / Tailscale 直连 多服务器自动选优,聊天记录离线可看 带 Token 鉴权,数据只在你的设备之间流动

项目介绍Project Overview

DSH Remote 是面向 DSH 的远程控制台插件,由插件、网关与 Android 应用/桌面 WebUI 组成。它支持在手机或电脑查看会话、处理审批与提问、传输文件及查看主机运行状态,并通过局域网、Tailscale 或 WebSocket 隧道接入。Token 等同于远程操作凭证,公网部署时需严格保护,并警惕图片能力受 DSH 组合与模型路由限制。

DSH Remote is a remote console plugin for DSH, combining a DSH plugin, a standalone gateway, and an Android app or desktop WebUI. It lets users view sessions, handle approvals and questions, transfer files, and monitor host status from a phone or another computer, with access over LAN, Tailscale, or a WebSocket tunnel. Use it when working on a desktop host but needing mobile or remote reach. The gateway token is the sole remote credential and must be safeguarded like an SSH key.

或使用命令行安装(适合开发者)Or use CLI install (for developers)

命令行安装CLI Install

dsh plugin --profile web add dsh-remote-plugin

Blank-not-black/dsh-Remote 加入你的 DSH 配置(web profile)即可启用。

READMEREADME

DSH Remote

把电脑上的 DSH,带到你的掌心。

DSH Remote 是一套面向 DSH 的远程控制台:在手机或另一台电脑上查看会话、处理审批与提问、传输文件,并掌握主机运行状态。

中文 · English

npm Release CI Compat License Android WebUI

快速开始 · 查看截图 · 下载 · 反馈问题

不是把整台电脑搬到手机上,而是把 DSH 最重要的决策面带到你身边。

DSH Remote 由三个相互配合的部分组成:DSH 插件、独立网关和 Android 应用 / WebUI。插件负责在 DSH 侧提供入口并管理网关;网关负责鉴权、实时连接和文件传输;手机端与桌面端则把不同场景下的远程操作做得更清晰、更顺手。

3 分钟开始连接

dsh plugin --profile web add dsh-remote-plugin

完整重启 DSH Web 后,从侧栏打开 DSH Remote。管理控制台会按顺序检查 DSH、网关、局域网地址、主机防火墙、终端配对与实时通道;跟随提示启动网关并扫码,即可在手机继续会话。详细步骤和故障排查见快速开始

手机和电脑应位于同一可信局域网,或通过 Tailscale 互通。不要把网关端口直接暴露到公网,也不要公开配对令牌。

✨ 为什么是 DSH Remote

能力 你能得到什么
🧠 会话远程控制 随时查看会话、继续工作、切换模型、处理目标与后台任务
🔔 实时决策通知 审批、提问、任务状态实时到达;网络波动时自动降级并恢复
📁 文件与图片 浏览主机目录、断点传输文件,把照片或相册图片作为会话附件发送
📊 运行全景 DSH 版本、网关链路、设备连接、Token、费用和近期活动集中呈现
🌐 多网络接入 支持局域网、Tailscale 和可靠的 WebSocket 隧道
🎨 一套设计语言 手机端、桌面端、插件面板和管理控制台共享主题与状态色

🧩 三个部分,各司其职

部分 角色
DSH 插件 提供 DSH 内入口,自动管理网关,展示主机与网关状态
独立网关 负责令牌鉴权、实时 mux/host 链路、文件传输和设备监控
Android 应用 / WebUI 提供手机、桌面浏览器和插件内嵌的远程操作界面

🔐 令牌就是远程控制凭证。默认不额外引入账号系统,部署简单,但请像保护 SSH 密钥一样保护它。

🖼️ 应用内截图

真实界面示例,截图中的会话标题、地址和令牌已做模糊处理。

新版手机端主页
新版主页:链路健康、运行指标与活动
新版手机端设置
新版设置:服务器、通知、皮肤与反馈

DSH Remote 插件面板
插件面板:网关状态、用量概览与快捷控制

DSH Remote 网关管理控制台
网关控制台:版本、设备、请求和 Token 用量一屏掌握

🎯 适合什么场景

  • DSH 在电脑上运行,但你想用手机查看会话、回复提问或处理工具审批。
  • 你需要在手机与 DSH 工作目录之间传输文件,或把图片作为当前会话的附件发送。
  • 你需要从另一台电脑查看会话、文件、Token 统计和设备连接状态。
  • 你希望通过局域网或 Tailscale 访问,而不为 DSH 额外搭建账号系统。

🧭 当前界面

📱 手机端 / Android 应用

手机端进入后默认显示主页,底部导航为:

页面 主要内容
会话 会话列表、工作台项目、运行状态、归档和新建会话
文件 目录浏览、下载、上传、断点续传、暂停/继续/取消
主页 DSH 版本、网关状态、链路健康、待处理事项、近期活动
统计 Token 四桶、费用、高峰占比和近 7 日用量
设置 服务器、令牌、通知、后台轮询、皮肤、更新和反馈

会话详情页支持实时消息、历史加载、目标控制、子代理中断、斜杠命令、模型切换和全屏输入。全屏输入会保留会话标题栏,发送动作上移到标题栏;退出全屏可以点击收起按钮、下滑顶部手柄或使用系统返回键。

图片附件入口支持拍照和相册选择。图片会作为 session.prompt 的图片内容发送到当前 DSH 会话;图片能力仍取决于当前 DSH 组合和模型路由是否支持图像输入。

🖥️ 桌面端 WebUI

电脑浏览器打开网关地址时会自动进入桌面布局:

  • 左侧会话列表与工作台项目;
  • 文件传输;
  • 主页总览;
  • 统计抽屉;
  • 设置、服务器分组和主题切换;
  • 审批 / 提问通知卡片栈。

🛠️ 插件面板与管理控制台

DSH 插件入口提供快速状态面板,可查看网关运行情况、设备数、Token 用量和快捷操作。进入管理控制台后可以查看:

  • 网关版本、运行时长、端口和 DSH 上游状态;
  • 主机 IP、已连接设备、请求数、通道和最后活跃时间;
  • Token 统计与近 7 日峰谷用量;
  • 令牌复制、二维码配对和令牌轮换;
  • 首次连接向导与 Doctor 自检,逐项显示 DSH、网关、网络、终端和实时链路状态;
  • 网关启动 / 停止、自愈设置和更新检查。

📦 下载

所有正式版资产位于 GitHub Releases。RC 版本只用于真机验收,不会替代 Latest 正式版。

平台 资产 说明
Android dsh-remote.apk 手机远程控制台,支持相机、通知和应用内更新
Windows x64 dsh-remote-win-x64.exe 单文件网关,不需要额外安装 Node.js
Linux x64 dsh-remote-linux-x64 单文件网关,赋予执行权限后运行
macOS Apple Silicon dsh-remote-macos-arm64 独立预览产物,未承诺与主版本同步

🚀 快速开始:插件模式(推荐)

先确认 DSH Web 本身可以在这台电脑上正常打开,然后在安装 DSH 的同一用户下执行:

dsh plugin --profile web add dsh-remote-plugin
dsh plugin --profile web list --depth 0

第二条命令用于确认插件确实装进了 web profile。接着:

  1. 完整重启 DSH Web 进程。如果你是手动运行 dsh web,先停止旧进程再重新运行;如果你配置了 systemd 用户服务,可执行 systemctl --user restart dsh-web
  2. 在 DSH Web 中执行一次 Ctrl+F5,从左侧入口打开 DSH Remote 面板。
  3. 在插件面板确认“网关已运行”,然后先在 DSH 主机上打开 http://127.0.0.1:8787/health。看到 JSON 即表示网关端口已可用。
  4. 从插件面板复制令牌或打开配对二维码。令牌也保存在 ~/.dsh-remote/token,请勿公开。
  5. 安装 Android 应用,在「设置 → 服务器」中扫码,或手动填写 http://电脑局域网IP:8787 和令牌。手机中不能填 127.0.0.1localhost,它们指向手机自己。
  6. 另一台电脑可直接打开 http://DSH主机IP:8787,桌面浏览器会进入桌面 WebUI。

也可以安装指定版本或 Git 源:

# 指定正式版本
dsh plugin --profile web add dsh-remote-plugin@0.6.8

# monorepo 插件目录
dsh plugin --profile web add "github:Blank-not-black/dsh-Remote#main&path:/packages/plugin"

插件内置网关,默认监听 0.0.0.0:8787,并随 DSH 自动启动和自愈。网关意图保存在 ~/.dsh-remote/gateway.enabled,令牌保存在 ~/.dsh-remote/token

🩺 网关打不开:按顺序排查

先在 DSH 所在电脑 上测试,再测手机。这样可以快速区分“网关没启动”和“网络无法到达”。

# 1. 网关是否在监听
curl -i http://127.0.0.1:8787/health

# 2. Linux 查看 8787 端口的真实占用者
ss -ltnp | grep ':8787'

# 3. DSH Web 上游是否可访问(默认 3080)
curl -i http://127.0.0.1:3080/

Windows 可用 netstat -ano | findstr :8787,或在 PowerShell 执行 Invoke-RestMethod http://127.0.0.1:8787/health

现象 原因与处理
本机 127.0.0.1:8787 直接拒绝连接 网关未启动、插件未装在 web profile、自动启动被关闭,或者端口已被其他进程占用。先查插件面板,再完整重启 DSH Web。
/health 返回 ok: trueupstreamOk: false 网关已打开,是 DSH Web 上游不可达。检查 3080 端口和 DSH Web 进程;不要把 degraded 误当成网关未启动。
本机能打开,手机打不开 确认手机使用的是电脑局域网 IP 或 Tailscale IP,不是 127.0.0.1;确认两端网络互通、路由器未启用 AP 隔离,且防火墙允许 TCP 8787 入站。不需要对公网放行 DSH 3080。
页面打开但提示 401/未授权 网络正常,令牌不一致。从当前插件面板重新扫码,或重新复制 ~/.dsh-remote/token
页面黑屏或升级后功能没变 先 Ctrl+F5 强刷,手机端完全退出 App 后重开,避免旧静态资源缓存。
改过端口后 8787 打不开 实际端口优先级为 DSH_REMOTE_GATEWAY_PORT~/.dsh-remote/gateway-port → 8787。手机、防火墙和浏览器地址必须同步修改。

如果使用 systemd 运行 DSH,还可查看:

systemctl --user status dsh-web --no-pager
journalctl --user -u dsh-web -n 100 --no-pager

插件拉起的网关可能是 transient 进程,不要把 systemctl --user restart dsh-remote-gateway.service 作为通用重启方式。优先使用插件面板的“启动网关”,或重启 DSH Web 让插件自愈拉起。发布日志或截图前,请隐藏令牌。

🧰 独立网关模式

不使用 DSH 插件时,可以直接下载对应平台的单文件网关:

./dsh-remote-linux-x64

# 自定义端口或固定令牌
PORT=9000 TOKEN=your-token ./dsh-remote-linux-x64

默认上游为本机 DSH Web http://127.0.0.1:3080,默认监听 0.0.0.0:8787。管理页地址为 http://127.0.0.1:8787/admin

📁 文件传输

手机端和桌面端都可以使用文件页。网关文件端点受到 Bearer token 保护:默认允许当前用户目录,并会向本机 DSH 校验后自动允许 workspace.list 中已登记的工作区目录。

  • 默认单文件上限为 2GB,可通过 DSH_REMOTE_FS_MAX_UPLOAD 调整;
  • 上传支持分块、断点续传、暂停、继续和取消;
  • 完成上传前进行 SHA-256 校验,校验通过后再原子落位;
  • 拒绝 ../ 路径穿越、绝对路径逃逸和指向允许根目录之外的符号链接;
  • DSH 工作区无需手动配置允许范围;对于 DSH 尚未登记的其他目录,可用 DSH_REMOTE_FS_ROOT 配置多个允许根目录,Linux/macOS 使用 : 分隔,Windows 使用 ; 分隔。

示例:

TOKEN=$(cat ~/.dsh-remote/token)
HOST=http://127.0.0.1:8787

curl -H "Authorization: Bearer $TOKEN" "$HOST/fs/list"
curl -OJ -H "Authorization: Bearer $TOKEN" "$HOST/fs/file?path=~/Downloads/example.zip"
curl -H "Authorization: Bearer $TOKEN" --data-binary @./photo.jpg \
  "$HOST/fs/upload?path=~/Downloads&name=photo.jpg"

🌐 远程访问与安全

  • 局域网访问:手机和电脑在同一网络,访问电脑的局域网 IP;
  • Tailscale:两端加入同一网络后,使用电脑的 100.x.x.x 地址;
  • 公网隧道:只使用带认证、可靠支持 WebSocket 的方案,并限制暴露范围。

网关默认监听所有网卡,令牌等同于 DSH 的远程操作凭证。请不要把令牌提交到仓库、截图公开或写入 URL 后转发给他人。实时连接使用 WebSocket;连续失败后会自动降级为轮询,恢复后再切回实时通道。

网关控制台可以选择开启「独立设备密钥」。开启后,共享令牌只用于进入管理控制台,每台手机或浏览器使用各自的设备令牌;控制台按“备注、最近 IP、Token”列出设备密钥,并支持分别生成二维码、轮换、复制和退出。开启或关闭模式、轮换令牌、退出设备时,受影响的现有实时连接会立即断开,避免旧凭证继续使用。独立设备密钥保存在 ~/.dsh-remote/device-keys.json,文件权限会收紧为仅当前用户可读写;可用 DSH_REMOTE_DEVICE_KEYS 覆盖保存位置。

/health 同时返回 protocol.versioncapabilities。新版 App 会根据明确声明的能力选择短时 WebSocket ticket、DSH 生命周期控制等路径;旧网关没有能力声明时仍按兼容路径尝试,不会仅因缺少该字段拒绝连接。

🔔 通知、公告与后台轮询

  • 通知设置支持审批 / 提问通知、峰谷提醒、后台轮询和任务结束通知;
  • 「设置 → 通知 → 历史公告」会保存已获取的公告,方便再次查看;
  • 公告默认从项目的中央 HTTPS 公告源读取,网关会短时缓存并在中央源不可达时回退安装包内的 announcements.json,格式如下:
{
  "items": [
    {
      "id": "release-0.6.8",
      "title": "0.6.8 正式版",
      "content": "本次更新修复了会话输入和通知显示问题。",
      "minVersion": "0.6.8",
      "publishedAt": "2026-08-22T10:00:00+08:00",
      "expiresAt": "2026-09-30T23:59:59+08:00",
      "actionUrl": "https://github.com/Blank-not-black/dsh-Remote/releases",
      "actionText": "查看版本详情",
      "poll": {
        "id": "next-update-priority-2026-09",
        "question": "下一步你更希望优先改进什么?",
        "options": [
          { "id": "stability", "label": "连接稳定性", "description": "继续优化弱网和重连" },
          { "id": "files", "label": "文件能力", "description": "增加更多预览与管理功能" }
        ]
      }
    }
  ]
}

公告按版本、发布时间和有效期筛选,内容按纯文本展示,不执行远端 HTML 或脚本;需要用户确认后才能关闭时可设置 "force": true

投票为单选,每个公告支持 2–8 个选项。网关会根据中央公告缓存(中央源不可达时回退内置文件)校验 announcementIdpollIdoptionId,不接受客户端伪造的选项名;合法投票会通过现有反馈收集器提交结构化字段,同时用稳定的 POLL {...} 文本兼容只保留通用字段的旧收集器。客户端只在服务端确认成功后记录“已投票”;未投票的公告可从历史公告再次打开。系统不收集账号,仍使用网关原有的频率限制和脱敏 IP。

可以直接对收集器的 JSONL 文件生成去标识化计数和百分比,脚本不输出联系方式或 IP:

node scripts/summarize-polls.mjs /path/to/feedback.jsonl
node scripts/summarize-polls.mjs /path/to/feedback.jsonl --json

App/页面启动后约 4 秒检查公告,前台运行时每 30 秒检查一次;重新回到前台或网络恢复时也会立即补查。网关默认从 https://vm-0-2-ubuntu.tail1f6fc4.ts.net/announcements.json 读取中央公告,15 秒内复用缓存,中央源失败时优先保留上次成功内容,冷启动失败才回退内置文件。可用 DSH_REMOTE_ANNOUNCEMENTS_URL 覆盖中央源,设为空字符串则完全禁用中央源;自定义公网地址必须使用 HTTPS(仅测试时允许 localhost HTTP)。

维护者更新 public/announcements.json 后运行 bash scripts/sync-central-announcements.sh,即可原子上传并回读验证中央公告。中央源只提供经过大小和 JSON 结构校验的公开数据,公告正文仍按纯文本展示,不执行远端 HTML 或脚本。

Android 后台轮询由前台服务执行,间隔为 30 秒、1 分钟、5 分钟或 15 分钟。灭屏后的 Doze 策略可能拉长实际间隔;部分系统还需要允许应用自启动、后台运行和不受限电量使用。

🎨 主题与反馈

当前保留四套配色:默认深空、落日、易北爱乐厅、草原孤塔。主题变量同时作用于页面、图标和状态色,避免切换皮肤后图标融入背景。

App、桌面端和管理页都提供反馈入口。App / 桌面端的「写反馈」会通过网关转发到反馈收集器,也可以直接提交 GitHub Issues

🧪 开发与发布

项目约束:零新增运行时依赖、单文件网关、零构建纯 JavaScript WebUI。修改 WebUI 时只编辑根目录 public/,然后同步插件副本。

npm install
npm run check          # 语法检查 + Node 测试
npm run sync-plugin    # 同步 public/、gateway.cjs 与插件资源
npm run build-app      # 构建 Android APK
npm run publish        # 复制 APK、生成 update.json 并同步插件
npm run build-bin      # 构建 Windows/Linux 单文件网关

模块结构、功能边界、实现方式、数据契约和 Vibe Coding 变更规则见模块文档与开发规范

正式发布使用:

npm run release 0.6.8

发布脚本会更新稳定版本号、本地构建 APK、同步插件、提交并推送 main、创建 v0.6.8 tag。GitHub Actions 随后构建 Windows/Linux 网关和 APK,生成 SHA256SUMS.txt,上传 GitHub Release,发布 npm 包并同步独立插件仓库。发布所需的仓库凭据由 GitHub Actions Secrets 管理。

🗂️ 项目结构

gateway.js                 # 单文件网关
public/                    # 手机端、桌面端、管理页与公共资源
packages/plugin/           # DSH 插件及同步后的插件资源
android/                   # Capacitor Android 工程
docs/modules/              # 模块说明、跨端契约与 Vibe Coding 规范
tests/                     # 网关、Markdown、统计测试
scripts/                   # 同步、构建、发布脚本

☕ 支持项目

如果 DSH Remote 对你的工作流有帮助,欢迎给项目点一个 Star,或请作者喝杯咖啡。每一份反馈、Issue、PR 和赞赏,都会帮助这个小工具继续变得更可靠。

DSH Remote 赞赏码

License

MIT

上一个 Prev dsh-lark-link 下一个 Next dsh-tui