中文 | English
ds-harness-remote 的第三方桌面 / Android 客户端: 登录 DSH Remote Server 账号,选择在线 Host,通过端到端加密(Noise IK)隧道远程操作 DeepSeek Harness —— 发送文本与图片、查看流式回复与工具调用、应答审批与提问、取消任务、切换模型。
界面层修改自 OpenCodeUI(Tauri 2 + React 19,GPL-3.0 衍生作品), 在其聊天渲染 / 多窗格 / 主题 / 移动端布局之上,针对「远程 Host + 移动端」重做了交互体验: 过程折叠、连接路径可视化、后台不掉线、长会话流式不卡顿。
| 上游 | 关系 | 本仓库对它的依赖 |
|---|---|---|
| lehhair/OpenCodeUI | UI 上游 / 直接来源 | 前端与桌面壳的起点(聊天渲染、多窗格、终端、主题、Tauri 壳);本仓库是它的 GPL-3.0 衍生作品,保留原许可证与署名 |
| liguobao/ds-harness-remote | 协议与服务端上游 | vendor 其 packages/protocol、packages/webrtc、packages/client-core(见 src/dsh/VENDOR.md);本仓库是它的第三方客户端,不是官方客户端 |
@deepseek-ai/dsh web |
被远程操作的 Host 运行时 | 官方 npm 包,不属于本仓库 |
| DSH Remote Server | 控制通道 / Relay / Signaling 服务 | 官方部署 https://dsh.r2049.cn |
本仓库既不是 OpenCodeUI 的官方 fork,也不是 ds-harness-remote 的官方客户端。 协议细节以两份上游文档为准(
ds-harness-remote/docs/protocol.md是线协议权威规范)。
(Android 平板,P2P 直连;顶部状态条显示连接路径与 Host 工作目录)
- 远程会话适配:
harness.api.*(rc.2)/harness.remote.*(alpha)官方隧道 →sessionStore状态机(bootstrap → login → host list → connect → chat),session.history还原历史 + mux 实时流渲染(text / reasoning 流式、工具卡片、审批、提问)。 - 连接体验:
lan > p2p > turn > relay自适应传输,标题栏徽标实时显示实际选中的路径与 RTT; 控制通道由 Rust 侧 tokio-tungstenite 拨号(不带 Origin 头,绕开服务器 Origin 白名单), 应用层心跳 pong 由 Rust 原生回(WebView 后台冻结也不掉线),回前台自动补一次重连。 - 过程折叠:一个回合的中间过程收进「已处理 Xm Ys」折叠块,最终回答留在外面 (默认开启,设置 → 对话 → 过程折叠可关)。
- 渲染性能:ChatItem → UI Message 的引用稳定投影(WeakMap 缓存)+ bridge 推送节流(~10fps)
- 虚拟滚动,长会话持续流式不再打满主线程。
- 移动端:Tauri Android(arm64 / armeabi-v7a),状态栏 inset 与安全区、三栏 pager、 主机列表垂直居中、侧栏「切换主机」入口。
- 品牌与数据迁移:
dsh-*localStorage 键 / IndexedDB 库名 / DOM 标识全量改名, 启动时一次性迁移旧键(见src/utils/legacyStorageMigration.ts)。
从 Releases 下载:
| 平台 | 产物 |
|---|---|
| Android | DSH-Remote-<版本>-android-arm64.apk / -armv7.apk(包名 cn.r2049.dsh.remote) |
| Windows | NSIS 安装包 .exe |
| macOS | .dmg(Apple Silicon / Intel) |
| Linux | .deb |
Android 签名密钥不入库(src-tauri/gen/android/dsh-remote.keystore,已 git-ignore):
官方包始终使用同一把密钥,升级时请安装同一来源的 APK,否则会因签名不一致而无法覆盖安装。
- 登录:知乎 OAuth / GitHub OAuth(打开系统浏览器授权 →
dshremote://oauth回跳完成设备注册) 或邮箱密码;本机生成 X25519 设备身份并注册(POST /api/v1/devices/register);访问令牌到期前自动刷新。 - 主机列表:同账号下的 Host(在线状态 / 版本 / 指纹),点选后完成
connect.request → connect.incoming → Noise IK 握手,状态条展示 auth → transport → secure → loading → ready。 - 会话:
workspace.list选择工作区 → 会话侧栏(按 Host 工作区分组)→ 历史还原 + 实时流; 支持重命名、置顶、归档、懒建会话。 - 交互:发送文本与图片(>2 MiB 自动走 transfer 分块)、
session.cancel停止、切换模型、 应答审批 / 提问、断线指数退避重连 + 历史重拉。 - 协议合规:只使用上游官方隧道;协议栈直接 vendor 自
ds-harness-remote,自带协议 conformance 测试。
npm install
npm run dev # vite;dev 代理 /api、/ws → https://dsh.r2049.cn(VITE_DSH_SERVER 可覆盖)
npm run validate # typecheck + lint + test + build
npm run tauri dev # 桌面应用(先起 vite,再起 Rust)注册入口:https://dsh.r2049.cn/app/register。
# release(默认产物,存在 gen/android/keystore.properties 时自动签名)
npx tauri android build --apk --target aarch64
# 产物:src-tauri/gen/android/app/build/outputs/apk/universal/release/app-universal-release.apk
adb install -r src-tauri/gen/android/app/build/outputs/apk/universal/release/app-universal-release.apkkeystore.properties 需包含 storeFile / storePassword / keyAlias / keyPassword
(密钥与口令均已 git-ignore,丢失后已安装版本无法升级,请备份)。
CI 发布签名 APK 时,在仓库 Secrets 里配置 KEYSTORE_BASE64、KEYSTORE_PASSWORD、
KEY_ALIAS、KEY_PASSWORD(未配置时 Release 工作流会跳过 Android 产物)。
docker compose -f docker-compose.standalone.yml up -d --builddocker/Caddyfile.standalone 托管静态文件并把 /api、/ws 反代到 $DSH_SERVER
(默认 dsh.r2049.cn:443),绕过浏览器跨源限制;Tauri 桌面 / Android 构建不受 CORS 影响。
OpenCodeUI UI(ChatArea / InputBox / Sidebar / ModelSelector /
PermissionDialog / QuestionDialog / 移动端三栏 pager)
│ Message{info, parts[]}(渲染边界)
┌───────▼────────────────────────────────────────────┐
│ dsh 适配层(src/dsh/) │
│ event-reducer.ts(native 事件 → ChatItem,纯函数) │
│ toUiMessages.ts(ChatItem → Message/Part,引用稳定) │
│ sessionStore(连接 / 会话 / 审批 / 提问,zustand) │
│ RemoteApiProxy(rc.2) ── HarnessAlphaClient(alpha) │
│ RemoteClientCore + SecureTransport(Noise IK) │
│ AdaptiveTransport(Control WSS + WebRTC/Relay) │
│ RemoteServerApi(REST:login/register/refresh/TURN) │
└───────┬────────────────────────────────────────────┘
│ HTTPS + WSS
DSH Remote Server ──relay──▶ Host 插件(真实 Harness)
- 本仓库以 GPL-3.0-only 发布,继承自上游 OpenCodeUI;
上游版权与许可证声明见
LICENSE与NOTICE。 - 协议栈源码 vendor 自 ds-harness-remote(MIT),
来源与改动记录见
src/dsh/VENDOR.md。 - 保留不动的上游遗留物:
@opencode-ai/sdk类型导入、docker/、openapi*.json。
