deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:mrRisega/dsh-remote
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
离开电脑也能用手机 100% 全功能接管电脑上的 DeepSeek Harness(
dsh web)——发消息、看工具执行、审批权限、改设置、管凭据(含特权操作),操作体验与坐在电脑前完全一致。免内网穿透,局域网即连。一条命令安装:
npx @mrrisega/dsh-remote
dsh-remote 是一个轻量的隧道模式远程控制方案:电脑端运行一个守护进程(bridge),
主动连接中继服务器(relay-router)注册为在线设备;手机浏览器打开 PWA 页面,
登录后选择设备,即可经隧道进入电脑上的 dsh web(HTTP / WebSocket 全量透传)。
手机浏览器
└─ /app/ (PWA) 登录 → /_devices 实时设备列表 → 选择设备
│
nginx (HTTPS)
├─ /app/ → 静态 PWA (native.html)
├─ /_devices /_login /remote/ /_bridge / → relay-router
└─ /_bridge → relay-router (WebSocket)
└→ bridge (电脑端) → 127.0.0.1:3080 (dsh web)
预发中:先以
0.6.7-beta.x发布在 npmbeta通道(latest仍是 0.6.6), 待 Windows 真机验证通过后转正式版。安装预发版:npx @mrrisega/dsh-remote@0.6.7-beta.3;若 dsh web 已起不来,用npx @mrrisega/dsh-remote@0.6.7-beta.3 repair(只修 profile,不联网)。
0.6.6 及更早的插件半整套「服务状态 / 启停 / 重启」是按 macOS/Linux 写死的 (launchctl / systemd / pgrep / ps / /bin/sh),在 Windows 上安装一切正常、运行期必死: 面板红字「读取状态失败: process.getuid is not a function」、状态永远停在「查询中…」、 运行环境补不上、点「重启 DeepSeek harness」还会把 dsh web 打挂。本轮全部修掉:
process.getuid 在 Windows 上根本不存在(不是返回 undefined),
旧的 launchTarget() 无条件调它 → 所有读状态接口抛错。现在非 macOS 直接短路 launchd 查询。spawn("npx.cmd") 在 Node ≥20.12 起不带 shell 会抛 EINVAL。
现在用当前 node 直接跑 npm 自带的 npx-cli.js(不经 cmd.exe),退回 .cmd 时必带 shell: true。.mjs 助手(不再 /bin/sh),
且先校验 node/入口/工作目录存在再动旧进程,spawn 真正成功才回报成功。.dsh-watcher.pid / .dsh-bridge.pid,插件按 pid 判活
(不再依赖 Windows 上不存在的 pgrep/ps),必要时用 PowerShell 扫 node 进程兜底。dsh-remote-bridge,卸载时一并删除;
插件自愈也会隐藏地把 bridge 拉起来(日常使用看不到控制台窗口)。bridge-status 轮询连续失败 3 次会把原因摆到连接卡上(原先静默 catch)。平台支持:macOS / Linux / Windows 均可运行。自启动方式按平台分别是 launchd、systemd --user、任务计划程序(Windows)。macOS/Linux 的行为与 0.6.6 完全一致。
dsh-remote-web 安装(不用敲命令;搜索词是包名 dsh-remote-web,不是 dsh-remote);没有就复制一条命令;两条路都收敛到「登录后稍等,电脑会自己出现」。gui/<uid> 会话域置为 on-demand-only,RunAtLoad / KeepAlive 失效(服务只登记不启动,runs = 0)。现在优先用 user/<uid> 域启动(该域仍支持开机自启与崩溃自愈),失败才回退 gui/<uid> + kickstart(只拉起这一次,会明确告知不支持崩溃自愈),再不行退化为后台进程(现在能用、无自启)。自启动服务的 PATH 也补了 /usr/sbin、/sbin(bridge 要调 ioreg)。0.6.2 起已有
0.6.1 起已有
0.6.0 起已有
| 手机端进入 dsh web,100% 还原电脑端体验 | 手机端密钥登录后的在线设备列表 |
|---|---|
![]() |
![]() |
| 电脑端 dsh web 插件设置(自建服务模式) |
|---|
![]() |
| 开源版(本仓库) | SaaS 云服务版 | |
|---|---|---|
| 服务器 | 你自己部署(任意有公网 IP 的机器) | 由服务商托管 |
| 账号体系 | 无需账号:访问密钥认证(/_login 换本地 JWT) |
手机号 + 短信验证码 |
| 后台管理 | 无(密钥即实例管理员) | 超管后台(用户/套餐/审计) |
| 许可证 | 本仓库(见下文 License) | 商业授权,闭源 |
两者可随时切换:电脑端插件面板「连接模式」一键切换,互不影响。
👉 不想自建服务器 / 没有公网 IP? 直接使用官方云服务版(托管 relay,无公网、4G、异地也稳定,多设备 + 超管后台): https://n.risegao.cn:13443/app/ (免费版 + PRO ¥19/月 + Pro Max ¥49/月,新用户送 7 天 PRO)。 客户端仍是同一条命令安装
npx @mrrisega/dsh-remote,登录后选择「云服务模式」即可。
需要 Node.js ≥ 20(macOS / Linux / Windows 均可)。电脑端一条命令完成安装: 自动安装 bridge 与 dsh web 插件、写入配置、创建开机自启(macOS launchd / Linux systemd --user / Windows 任务计划程序):
npx @mrrisega/dsh-remote
安装完成后无需任何命令:打开 dsh web → 设置 → 「远程访问」,注册/登录手机号即可
(注册在手机端完成,登录后 bridge 自动启动;自建用户在同一面板切「自建服务」标签)。
原来的独立设置页(dsh-remote settings)已移除,避免与插件面板重复造成困惑。
自建模式(自己部署了 relay-router,无需账号体系):
npx @mrrisega/dsh-remote setup --server wss://<你的域名>:端口 --key <访问密钥>
其他命令:status(查看状态)、run(前台调试)、settings(仅显示登录指引)、
plugin(重装/卸载 dsh web 插件)。运行 npx @mrrisega/dsh-remote --help 查看完整说明。
版本与更新 / 卸载:dsh 官方插件市场目前不提供更新按钮,也不会改写用户补丁(因此市场 卸载会提示「仍通过 insert 引用 dsh-remote-web」而拒绝)。插件设置面板里已内置管理入口 (dsh web → 设置 → 「远程访问」→「🔄 版本与更新」卡片):显示当前版本、自动检测 npm 新版、 一键在线更新(后台补运行环境并重启 bridge,完成后重启 dsh web 生效)、以及彻底卸载 (移除补丁 include / 依赖 / bundle 与本地文件,之后市场卸载或直接重启均可完成卸载)。
源码安装(开发 / 自建服务器):git clone https://github.com/mrRisega/dsh-remote.git
并 npm install,见下文各组件说明。
传输与会话
端到端加密(E2EE,灰度开启中)
.dsh-config.json)会保存账号密码用于自动登录,等于该账号
内容的“解密权”,请妥善保护电脑;电脑被他人使用期间请退出登录。0600 在 Windows 上无效(Windows 用 ACL,不是 POSIX 权限位)——
早期版本只写了 mode: 0o600,实测该文件拿到的仍是用户目录的默认继承 ACL,
等于没有这层保护。0.6.7-beta.3 起安装器/插件/bridge 都会显式收紧:icacls 断开继承、
只授予当前用户。若收紧失败(无 icacls / 权限异常),安装日志会明确告警,不会假装成功。.dsh-remote 目录交给备份/同步盘/他人排查——
里面的 .dsh-config.json(明文账号密码)与 .harness-cookie.json(dsh web 会话 Cookie,
等于该会话的完整访问权)被复制走就等于把钥匙一起给了对方。发支持包前请先删除这两项。边界与建议(如实告知)
生产诊断发现「注册了但设备一直没连上」的用户没有任何账号数据、无法归因,因此插件内置了一条 匿名装机统计通道,只上报装机与连接是否成功:
npm_unreachable、npm_eacces、runtime_install_timeout)、插件版本号、
系统平台(darwin/linux/win32)、架构(arm64/x64)、node 主版本号,
以及一个本机随机 ID(crypto.randomUUID(),非硬件派生、重装即变、不可跨机器关联);machine_fp、原始 IP、精确地理位置;请求不带 Authorization(匿名、与账号解耦);export DSH_REMOTE_TELEMETRY=0 → 完全关闭(不生成随机 ID、不落任何文件、不发任何请求);
也可在中继/Nginx 侧直接丢弃 POST /api/telemetry/events;上一节讲的是「匿名装机统计」这条通道本身;这一节回答更常见的问题:你的数据落在哪里、我们到底统计什么。
开源部分采集 / 不采集
如何关闭
export DSH_REMOTE_TELEMETRY=0 # 完全关闭匿名装机统计:不生成随机 ID、不落文件、不发请求
也可在网络侧直接丢弃 POST /api/telemetry/events(中继 / Nginx / 防火墙),
关闭后不影响面板、bridge 与连接流程的任何功能。
自建模式(self-hosted)
自己部署 relay-router 时,数据只落到你自己的服务器:
.dsh-config.json 里配置的 api_url(即你的实例),不经过任何第三方服务;DSH_REMOTE_TELEMETRY=0。在有公网 HTTPS 入口的服务器上部署 relay-router(见 docs/self-hosting.md):
git clone https://github.com/mrRisega/dsh-remote.git && cd dsh-remote
npm install
bash deploy/install-open.sh # 生成 open.env(0600)并启动 router
或 Docker:DSH_LOCAL_JWT_SECRET=… DSH_LOCAL_ACCESS_KEYS=… docker compose up -d
nginx 反代:参考 deploy/nginx-13443-remote-router.conf
(/app/ 静态 PWA、/_bridge WebSocket 升级、其余路径转 router)。
手机打开 https://<你的域名>/app/,用访问密钥登录。
被控电脑执行上面的 npx … setup --server … --key …。
| 组件 | 位置 | 说明 |
|---|---|---|
| relay-router | packages/relay-router/ |
中继服务器:bridge 注册表、实时设备列表、HTTP/WS 透明代理 |
| bridge | clients/dsh-remote/ |
电脑端守护进程:连 router 注册,把转发帧代理到本地 dsh web;心跳自愈 |
| PWA | clients/dsh-web/native.html |
手机端:登录 / 注册 / 设备选择(单文件,零构建) |
| dsh web 插件 | packages/dsh-remote-web/ |
设置页「远程访问」面板:连接模式 / 账号 / bridge 启停 / 反馈 |
| 部署脚本 | deploy/ |
install-open.sh 自建引导、nginx 参考配置、Dockerfile / compose |
测试:npm test(router 契约 + 插件 + bridge 全部单测与回归)。
扫码加入 企微交流群:安装/使用答疑、问题反馈、版本更新都会在群里同步,欢迎来聊。
也可以在仓库提 Issue;安全相关问题请按 SECURITY.md 私下反馈。
本仓库使用 PolyForm Noncommercial 1.0.0(LICENSE): 个人、研究与非商业用途免费;商业用途(含内部自用与对外服务)需要商业授权, 见 COMMERCIAL-LICENSE.md。
说明:本仓库是源码公开、非商业许可的项目,不属于 OSI 意义上的“开源”; 云服务(多用户账号、超管后台)为闭源商业组件,不在本仓库内。
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。