Skip to content

About

DeepSeek Harness 的非官方客户端:Android App(凭据存 Keystore、发送重试不重复执行)+ Windows 桌面助手 / Unofficial DeepSeek Harness client: Android app + Windows desktop tray helper.

Topics

Resources

Contributing

Security policy

Stars

8 stars

Watchers

0 watching

Forks

Latest commit

 

History

172 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DSH Outpost

DeepSeek Harness 的非官方客户端 —— 把电脑上的 AI 团队装进口袋。

两个部分:

说明
手机 App(Android) 原生 RN 应用,不是网页套壳。看会话、发消息带附件、切模型,还能回答审批、收系统通知。凭据存 Keystore,发送重试不会重复执行任务
桌面助手(Windows) 托盘程序。扫码连接手机、管理隧道、IP 变了自动修复。替代原来的网页插件

核心玩法是**「管家模式」**:你只跟管家说话,它拆任务、派队员去干, 你可以在手机上看着每个队员在干什么。

消息可靠性:弱网、超时、突然断网时,重试会复用同一个幂等键, 服务端自动去重 —— 同一件事不会在电脑上被执行两遍。

⚠️ 本项目是第三方客户端,不隶属于 DeepSeek。它连的是你自己电脑上运行的 DSH 服务, 不包含、也不分发 DSH 本体。


能做什么

聊天

  • 流式输出、历史分页加载(长会话不会只剩「空调话」)
  • 完整 Markdown 渲染:标题、加粗、斜体、列表、引用、表格、代码块
  • 「已思考」可展开看完整推理过程
  • 工具卡片实时显示 执行中 / 完成 / 失败
  • 附件上传:手机相册的图、拍照
  • 切模型、看上下文用量

图片与文档查看(全在 App 内,不用跳出去)

  • 图片:点开全屏查看,双指缩放、双击放大、拖动、下滑关闭
  • Markdown(.md):标题 / 加粗 / 列表 / 引用 / 表格 / 代码块全渲染
  • Word(.docx):标题层级、段落、列表、表格
  • Excel(.xlsx / .xls / .csv):表格渲染、多 sheet 切换、双向滚动
  • .pdf / .doc / .pptx 交给系统应用打开

管家模式

  • 首页变成跟管家对话,活派给队员干
  • 「闲聊 / 计划」双模式:两种都能派队员,区别只在「要不要先给方案」—— 闲聊直接干(轻活自己做、重活派队员),计划先给方案等你确认
  • 底部队员头像条,实时显示谁在干什么、谁完成了
  • 独立任务看板,按 进行中 / 待办 / 已完成 分组
  • 队员全干完后自动唤醒管家做汇总
  • 按项目复用队员,不重复创建
  • 宿主任务运行器(v0.18.2):交代目标后由电脑持续执行,手机退出也不停; 任务进度、恢复和交付在「任务」页。需要在 DSH web profile 安装 dsh-outpost-butler,见 docs/butler-tasks.md

会话管理

  • 搜索:按标题实时过滤,支持中文、多关键词
  • 重命名:长按会话改名,写回 DSH 原生标题
  • 删除 / 恢复:删除 = 归档,内容还在电脑上
  • 长会话虚拟化渲染,100 轮以上也不卡

审批(不用再去电脑上点)

  • 需要授权时手机弹出横幅,直接点「拒绝」/「允许一次」
  • 审批到达时推送通知 + 震动
  • 「我的 → 连接 → 审批通道」能看到连接状态和失败原因
  • 断网恢复后自动重连,不需要重开 App

凭据与设备管理

  • 凭据存在系统级加密存储(Android Keystore / iOS Keychain),不是明文
  • 「断开连接」和「退出并清除所有授权」是两个独立操作 —— 前者保留凭据下次自动恢复,后者彻底清除并通知电脑撤销本设备
  • 设备管理页:列出所有配过对的手机(在线状态、最后活跃时间), 可以撤销任何一台。手机丢了、旧手机卖掉前,在这里把它踢掉

通知

  • 系统通知:App 在后台也能收到,锁屏可见
  • 点通知直接跳回对应会话(含冷启动)
  • 管家同时跑多个任务时都会提醒
  • 应用内横幅:顶部滑入,3.5 秒自动消失

操作手感

  • 边缘手势返回:从左边缘往右滑,页面跟着手指走
  • 三套主题:纯白 / 暖白 / 深色,随时切换
  • 全原生交互,无 react-navigation 依赖

连接方式

场景 方式 手机要装什么
同一个 WiFi 局域网直连 什么都不用装
在外面也要用 Tailscale Tailscale App
在外面用、手机不想装东西 Cloudflare 隧道 什么都不用装

扫码配对一次,30 天内免登录。


它长什么样

配对页 连接帮助 管家首页
配对页 帮助 管家
扫码 / 粘贴 / 手填 三种网络方式都写清楚 tab 变成「管家 / 我的」
模型 + 思考强度 扫码配对 启动页
模型 扫码 启动页

5 分钟上手

1. 电脑上装 DSH

去 DeepSeek Harness 官网 下载安装桌面端。 装好后终端里应该能用 dsh 命令。

2. 启动 Web 服务

先跑一次自检,确认依赖都就绪:

cd <本仓库目录>
.\doctor.ps1

它会把 dsh / cloudflared / node 的查找结果、端口占用、状态文件一次性列出来, 哪里不对会直接告诉你怎么办。

然后启动

cd <本仓库目录>
powershell -NoProfile -ExecutionPolicy Bypass -File .\start-dsh-web.ps1

脚本会自动挑一个手机能访问的地址(装了 Tailscale 就用 tailnet IP,否则用局域网 IP), 启动服务,并打印一条带 token 的链接和二维码。

如果走局域网,脚本会检查 Windows 防火墙:没放行时会打印提示和一条命令, 照着在管理员 PowerShell 里执行一次即可(或加 -AllowFirewall 让脚本自己加)。 不放行的话手机端会一直「连接失败」,这个坑很难自己想到。

常用参数:

.\start-dsh-web.ps1 -Bind lan         # 强制局域网(同一 WiFi)
.\start-dsh-web.ps1 -Bind tailscale   # 强制 Tailscale(人在外面时)
.\start-dsh-web.ps1 -Host 0.0.0.0     # 自己配了 frp / 隧道时
.\start-dsh-web.ps1 -AllowFirewall    # 局域网模式下自动放行防火墙(需管理员)
.\start-dsh-web.ps1 -Port 3095 -NoQr

macOS / Linux 用户:直接用 dsh --profile web --host <你的IP> --port 3095, 然后把终端打印的 URL 拿到手机上。一键脚本目前只有 Windows 版。

3. 装客户端

从 Releases 下载最新版:

平台 文件 说明
Android dsh-outpost-v*.apk 允许「安装未知来源应用」后装上
Windows DSH-Outpost-Desktop-*-win-x64.zip 解压即用,双击 DSH Outpost.exe

⚠️ Windows 首次运行可能弹 SmartScreen「已保护你的电脑」—— 这是因为 exe 没有代码签名。点「更多信息 → 仍要运行」即可。 详见 桌面助手 README。

4. 配对

打开 App,三种方式任选:

方式 说明
扫码(推荐) 点「扫码」,对准电脑终端里的二维码
粘贴整行链接 复制终端打印的那一行贴到 Token 框,地址会自动识别
只粘 token 地址手动填

配对一次,30 天内免登录。服务重启换了 token 也不用重新配对。


网络怎么选

App 只认一个 URL,所以局域网、Tailscale、Cloudflare 隧道都能用:

场景 地址 前提
同一个 WiFi http://192.168.x.x:3095 什么都不用装,最简单(需要放行防火墙)
在外面也要用 http://100.x.x.x:3095 电脑和手机都装 Tailscale,登录同一账号
在外面用、手机不想装东西 https://xxx.trycloudflare.com 电脑上跑 start-tunnel.ps1,手机端零配置

脚本默认优先 Tailscale(有就用),没有就用局域网。用 -Bind 可以强制指定。

Cloudflare 隧道(手机什么都不用装)

Tailscale 要在手机上装 App,Cloudflare 隧道不用——就是一个普通 HTTPS 网址。

.\start-tunnel.ps1          # 启动隧道(约 60-90 秒)
.\start-tunnel.ps1 -Status  # 看当前隧道
.\start-tunnel.ps1 -Stop    # 停止

脚本会自动:探测本机地址 → 起 cloudflared → 拿域名 → 用 --trusted-host 重启 DSH → 抓新 token → 验证连通。

两点注意:

  • 快速隧道的域名每次重启都会变,变了手机要重新配对。想要固定域名得有自己的域名并配命名隧道。
  • 开启隧道会重启一次 DSH,之前的配对 cookie 会失效(cookie 绑定了 authority)。

为什么必须加 --trusted-host:DSH 的 Host/Origin 校验默认只接受绑定的那个 IP, 通过隧道访问时 Host 是 xxx.trycloudflare.com,不在信任列表里就会 403 forbidden。 它只做精确匹配、不支持通配符,所以必须拿到域名之后再重启服务。

桌面助手(Windows)—— 推荐

dsh-outpost-desktop 是一个托盘程序,把「手机连接」从网页侧边栏里独立出来:

  • 托盘常驻,点一下图标就出面板(不用开浏览器找侧边栏)
  • 局域网 / 隧道两个二维码并排,扫哪个都行
  • 启动 / 停止隧道,不用记 PowerShell 命令
  • IP 变了会弹黄条,点「一键修复」自动重启 DSH 和隧道
  • 设备列表(哪些手机配过对、最后活跃时间)
  • 开机自启(静默,不弹窗)
启动方式:解压 zip → 双击 DSH Outpost.exe
或者:  cd dsh-outpost-desktop && npm install && npm start

⚠️ Windows 可能弹 SmartScreen「已保护你的电脑」 —— 这是因为 exe 没有 代码签名(签名证书要钱,个人项目没买)。点「更多信息 → 仍要运行」即可。

不想每次都点的话:右键 exe → 属性 → 常规 → 勾选「解除锁定」。

旧方案:网页插件

装了 dsh-plugin-connect 之后,DSH 网页侧边栏底部会出现「📱 手机连接」:

  • 显示局域网 / Cloudflare 两个地址,各带二维码
  • 点「启动隧道」直接起 cloudflared(需要先跑一次 start-tunnel-service.ps1)
  • IP 变了会显眼提示并给「一键修复」

桌面助手和它功能重合,二选一即可。桌面助手更好用(不用开浏览器), 插件保留是为了兼容已经装了的用户。

http://192.168.x.x:3095  ─┐
                          ├─→  📱 手机连接  →  两种方式 + 二维码 + [启动隧道]
https://xxx.trycloudflare ─┘

开机自启

.\setup-autostart.ps1          # 配置(DSH Web + 隧道服务)
.\setup-autostart.ps1 -Show    # 查看
.\setup-autostart.ps1 -Remove  # 取消

用启动文件夹实现,不需要管理员权限,登录即启动。

手机端审批(强烈建议装)

不装的话,手机上只能看到审批提示,点不了按钮。装了移动网关插件后, 审批卡片上直接出现「拒绝 / 允许一次」,在手机上就能决定。

.\setup-gateway.ps1

它做三件事:装 dsh-plugin-mobile-gateway、写配置、重启 DSH。

装好之后:

  • 手机 App 自动申请配对,审批通道常驻连接(不用进聊天页才连)
  • 审批卡片上直接出现「允许一次 / 拒绝」按钮
  • 审批到达时手机推送通知 + 震动
  • 「我的 → 连接 → 审批通道」能看到 已连通 / 未连通 和具体原因

为什么必须要插件:DSH 的审批是 Host 侧 waterfall,结果靠 Remote Event 监听器的返回值回传,没有 HTTP RPC 可调(12 个候选端点名全部 not found)。 这个插件在 Host 内部接入 waterfall,再用独立 WebSocket 投影给手机。

管家任务(v0.18.2,宿主持续执行)

v0.18.2 新增宿主侧任务运行器:手机交代目标后,由电脑上的 DSH 持续执行; 手机退出、锁屏都不影响,重启后可以恢复,交付物在「任务」页查看。

.\setup-butler.ps1

它会把 dsh-outpost-butler 装进 DSH web profile 并验证配置组合。 端口空闲时可启动 DSH Web;已有进程会保持运行,按提示手动重启后再检查 TaskApi。 详细说明、TaskApi 和限制见 docs/butler-tasks.md。

审批仍由 setup-gateway.ps1 安装的移动网关负责;两个脚本可以都装。

真机排查:如果「审批通道」显示未连通,把后面那行原因发出来。 常见的是 连接被关闭 1006 ... 401 Unauthorized(凭据失效,App 会自动重新配对) 或 400(请求头没发出去)。

详细协议和配置见 docs/mobile-gateway.md。


安全提醒

  • token 就是这台服务的钥匙,拿到它就能操作你电脑上的 DSH。只发给自己的手机。
  • 服务绑定 0.0.0.0 或局域网 IP 时,同一 WiFi 下的其他人也可能访问到。 在不信任的网络里,建议用 Tailscale(端到端加密)而不是直接开局域网。
  • 局域网是明文 HTTP。家里/办公室的可信 WiFi 没问题, 公共 WiFi 下不要用局域网模式 —— 同网段的人能抓到 token。
  • 启动脚本的 -PermissionMode 默认是 workspace-write。 danger-full-access 会关闭审批,不建议在开放网络上使用。
  • 手机端审批等于把「授权」的按钮搬到手机上。设备被他人拿到就能批准操作, 建议给手机设锁屏密码。
  • App 会拒绝用明文 HTTP 连接公网地址(只放行私有网段和 localhost)。 公网访问请用 https(Cloudflare 隧道)或 Tailscale。

凭据怎么保护的

  • 存在系统级加密存储里(Android Keystore / iOS Keychain),不是明文。 仅本机、解锁后可读。
  • 两个操作分开了:
    • 「断开连接」—— 收起会话,凭据留着,下次自动恢复
    • 「退出并清除所有授权」—— Cookie + 网关凭据 + 关联状态全清, 同时通知电脑撤销这台设备,不可恢复
  • 设备管理页(我的 → 设备管理)能看到所有配过对的手机、撤销任何一台。 手机丢了或者旧手机卖掉前,在这里处理。

完整的威胁模型、明文 HTTP 的取舍、token 保护措施见 docs/security.md。


已知限制

项 说明
协议无版本协商 用的是逆向出来的 DSH 内部 RPC(见 docs/protocol-notes.md)。DSH 升级后某些功能可能失效
只支持 Android iOS 需要 Mac + 签名,暂未提供
管家模式依赖 Agent Teams 需要 DSH 装了 agent-team 相关 profile,且子代理工具是启用状态
通知在 App 被杀后收不到 用的是本地通知(不是远程推送)。安卓会杀后台,杀掉后就收不到了。真要做到杀进程也能收,得接厂商推送通道(小米/华为/OPPO 各一套 SDK),工作量远超本项目
Cloudflare 隧道域名会变 快速隧道每次重启换域名,手机要重新配对。固定域名需要自己的域名 + 命名隧道
审批不支持「始终允许」 协议只有一次性决定(allowed-once / rejected)。要长期放行请调权限模式
图片首次加载要 1-2 秒 完整下载到本地后再显示,还没做渐进式加载
PPT / PDF / 老版 doc 不能内置看 .pptx 是幻灯片布局,纯前端排版成本极高;.pdf 没有内置渲染器;.doc 是二进制老格式(mammoth 只吃 .docx)。这三种点开会交给系统应用
docx 会丢掉复杂排版 mammoth 只提取文字结构(标题/段落/列表/表格),浮动图片、分栏、精确字号会丢失。看内容够用,不是完整 Word 渲染
Excel 只看值不看公式/样式 SheetJS 读的是单元格显示值,公式结果对,但公式本身、条件格式、图表不显示

配置

不配置也能跑 —— 默认值从脚本位置和 %LOCALAPPDATA% 推导,代码里没有写死盘符。

需要改的时候用环境变量:

变量 默认 说明
DSH_POCKET_ROOT 脚本所在目录 仓库根
DSH_STATE_DIR %LOCALAPPDATA%\dsh-pocket 状态文件目录
DSH_CLI 自动查找 dsh.cmd 路径
DSH_CLOUDFLARED 自动查找 cloudflared.exe 路径
DSH_WEB_PORT 3095 DSH Web 端口
DSH_TUNNEL_PORT 3199 隧道控制服务端口

改完可以随时用 .\doctor.ps1 验证路径解析对不对。

完整说明见 docs/configuration.md。

安全提醒:状态目录里的 tunnel.json / pairing.json 含 token, 拿到就能操作你电脑上的 DSH。别提交、别外传。


开发

# 手机端
cd dsh-mobile
npm install
npm test                  # 770 项静态检查 + 单测 + typecheck
npm run test:integration  # 61 项集成测试(本地起模拟 DSH,不需要真服务)
npm run android           # 需要 Android SDK + JDK 21

# 桌面端
cd dsh-outpost-desktop
npm install
npm test                  # 45 项(启动健壮性、打包配置、安全边界)
npm start                 # 开发模式直接跑
npm run pack              # 打包成 zip

测试分四层

层 数量 依赖 测什么
静态检查 + 单测 770 无 纯函数行为、配置正确性、危险写法
协议集成 39 本地端口 手搓请求,验证协议形状
产品集成 16 本地端口 import 真实产品代码,验证它能不能正确对接
端到端 手工 真实 DSH 完整链路

桌面端另有 45 项,重点守「启动健壮性」—— 每一轮「双击没反应」 的修复都固化成了一条测试(崩溃日志、窗口显示、单实例、完整性修复)。

集成测试用一个模拟 DSH 服务端(tests/support/fake-dsh.mjs): 真 HTTP + 手写 RFC 6455 WebSocket,验证配对、重连、审批、长会话分页。

为什么分「协议」和「产品」两层:协议测试只能验证「服务端返回 401」, 产品测试才能验证「我的代码收到 401 后有没有清 token 重连」。 后者才是用户真正遇到的 —— 它抓到了两个真实缺陷, 见 docs/known-issues.md。

相关文档:

目录

.
├── dsh-mobile/              # 手机 App(React Native + TypeScript)
│   ├── src/
│   │   ├── core/            # 协议层:transport / rpc / fold / store(不依赖 UI)
│   │   ├── nav/             # 手写导航栈 + 边缘手势
│   │   ├── screens/         # 页面
│   │   ├── components/      # 组件
│   │   └── design/          # 主题 token
│   └── tests/               # Node 单测(770 项)
├── dsh-outpost-desktop/     # Windows 桌面助手(Electron 托盘程序)
├── dsh-outpost-butler/      # v0.18.2 宿主侧任务运行器(DSH bundle)
├── dsh-plugin-connect/      # 隧道服务 + 旧版网页插件
├── docs/                    # 协议笔记、安全模型、真机验证清单、截图
├── start-dsh-web.ps1        # Windows 一键启动脚本
├── start-tunnel.ps1         # Cloudflare 隧道
├── setup-gateway.ps1        # 安装移动网关(手机端审批)
└── setup-butler.ps1         # 安装宿主任务运行器(v0.18.2)

版本

v0.18.3:文件卡片支持局部正文预览与完整阅读,管家审批直接在主聊天中处理,图片支持连续滑动切换。新增 @ 文件/会话引用、电脑端排队消息撤回编辑、从已完成回答分叉继续,以及分享至草稿、聊天正文搜索、Markdown 导出和本地诊断;统一手机与大屏布局,并修复普通聊天误显示「管家已完成」。 完整变更见 Releases。

最近的几个版本:

版本 内容
v0.18.3 文件预览、主聊天审批、连续看图、文件/会话引用、排队撤回编辑、回答分叉、搜索导出与大屏布局优化
v0.18.2 宿主侧管家任务、组件动效、聊天与附件优化、凭据显示保护
v0.18.1 修复公网审批 502、已有授权重连和桌面一键网络修复
v0.18.0 审批安全与通知 + WorkGroup/工具 Diff + 草稿持久化 + 搜索置顶 + UI 与待发送体验
v0.17.0 持久化消息与附件队列(P0-1)+ WebSocket 自动重连与断档补齐(P0-2)+ 认证与连接状态一致性(P0-3)
v0.16.7 消息发送可靠性:重试复用幂等键,不会重复执行任务;超时与失败分开提示
v0.16.6 文件转发 / 保存到手机 / 图片长按存相册
v0.16.5 修连接状态卡「检测中」+ 流式渲染节流(回消息不再卡)
v0.16.4 桌面助手:修「服务未启动」误报 + 一键启动 DSH 服务
v0.16.3 撤销状态持久化、清除授权的 fail-open 修复、CI 签名门禁强化
v0.16.2 设备管理页:查看所有已配对设备、撤销任意设备
v0.16.1 清除授权时同时撤销服务端设备(不只清本地)
v0.16.0 凭据迁进 Android Keystore + 断网不再误清 token
v0.15.8 修复桌面助手无法启动 —— 根因是打包目录继承了 Windows「低完整性」标记
v0.15.7 桌面助手 bat 脚本改纯 ASCII(修 GBK 乱码)+ 自动清除 ELECTRON_RUN_AS_NODE
v0.15.6 桌面助手启动诊断:崩溃日志多路径兜底、诊断脚本
v0.15.5 桌面助手包体积减半(260 → 112 MB)+ 分卷下载
v0.15.3 桌面助手重新打包、统一命名、SmartScreen 说明
v0.15.2 修复 CI:Node 20 不支持直接 import .ts
v0.15.1 修复 CI:Node 20 没有全局 WebSocket
v0.15.0 协议兼容性:依赖清单、错误分类、能力探测
v0.14.0 产品级集成测试(驱动真实代码,发现两个网关缺陷)
v0.13.0 三层测试体系 + 39 项真实协议集成测试
v0.12.0 修复管家模式指令冲突,统一分工规则,加重复杂项检测
v0.11.0 安全审计:地址校验、token 脱敏、日志与凭据权限加固
v0.10.0 项目重命名 dsh-pocket → dsh-outpost
v0.9.1 Windows 桌面助手打包通了
v0.9.0 Windows 桌面助手:托盘常驻,扫码连接手机、管理隧道
v0.8.2 过滤 DSH 的临时工作区(49 个目录 → 3 个,列表终于能看)
v0.8.1 修复尖括号路径的图片不显示(会显示成「!标题」)
v0.8.0 会话搜索、重命名、长会话虚拟化(100 轮以上的会话不再卡顿)
v0.7.0 图片全屏查看 + Word/Excel/Markdown 内置查看;聊天里的 markdown 终于真渲染了
v0.6.3 手机端审批可用了(修了 WS 请求头、端点选择、凭据自愈三个问题)+ 手势真正生效
v0.6.2 图片终于能显示(overflow:'hidden' 在 Fabric 下会把 Image 裁成 0)

许可

MIT

DeepSeek Harness 及其相关商标归杭州深度求索人工智能有限公司所有。 本项目与该公司无隶属关系,也未获得其背书。

About

DeepSeek Harness 的非官方客户端:Android App(凭据存 Keystore、发送重试不重复执行)+ Windows 桌面助手 / Unofficial DeepSeek Harness client: Android app + Windows desktop tray helper.

Topics

Resources

Contributing

Security policy

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages