🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

手机遥控台 Loki520865/dsh-remote

DeepSeek Harness
Loki52086579 天前有提交已提供中文文档扫描:高危

用手机远程指挥电脑上的 AI 干活并实时看结果

27.6/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/17 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Loki520865/dsh-remote
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]!
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
数据截至 2026/10/08·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 79 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

⚠︎ 实装验证未通过(unknown · 2026/10/8) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0
🔴 扫描:高危尚无人工评估

静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。

命令参数由运行时变量拼接读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 63 处,展示前 53 条)
  • 读取本地文件
    desktop-companion/src/config.ts:32
    if (!existsSync(file)) return undefined
  • 读取本地文件
    desktop-companion/src/config.ts:34
    const parsed = loadYaml(readFileSync(file, 'utf8'))
  • 读取密钥环境变量
    desktop-companion/src/config.ts:52
    const apiKey = process.env.DEEPSEEK_API_KEY
  • 发起网络请求
    desktop-companion/src/harness.ts:83
    return harness.client.request(method, params, timeoutMs) as Promise<T>
  • 读取本地文件
    desktop-companion/src/jsonrpc-server.ts:261
    raw = await readFile(cachePath, 'utf8')
  • 写入本地文件
    desktop-companion/src/jsonrpc-server.ts:281
    await writeFile(tmpPath, JSON.stringify(cache, null, 2), 'utf8')
  • 写入本地文件
    desktop-companion/src/jsonrpc-server.ts:282
    await rename(tmpPath, cachePath)
  • 读取本地文件
    desktop-companion/src/jsonrpc-server.ts:802
    const baseReal = await realpath(base)
  • 读取本地文件
    desktop-companion/src/jsonrpc-server.ts:808
    real = await realpath(probe)
  • 读取本地文件
    desktop-companion/src/jsonrpc-server.ts:830
    const items = await readdir(dir, { withFileTypes: true })
  • 读取本地文件
    desktop-companion/src/jsonrpc-server.ts:836
    const info = await stat(resolve(dir, item.name))
  • 读取本地文件
    desktop-companion/src/jsonrpc-server.ts:861
    const buffer = await readFile(target)
  • 写入本地文件
    desktop-companion/src/jsonrpc-server.ts:878
    await writeFile(target, content, 'utf8')
  • 执行外部命令来自配置/变量
    desktop-companion/src/jsonrpc-server.ts:970
    const child = spawn(command, { cwd: base, shell: true, windowsHide: true })
  • 写入本地文件
    desktop-companion/src/jsonrpc-server.ts:1108
    await writeFile(imgPath, Buffer.from(base64, 'base64'))
  • 执行外部命令固定命令
    desktop-companion/src/jsonrpc-server.ts:1110
    const result = spawnSync(
  • 删除本地文件递归
    desktop-companion/src/jsonrpc-server.ts:1130
    await rm(dir, { recursive: true, force: true })
  • 删除本地文件递归
    desktop-companion/src/jsonrpc-server.ts:1240
    await rm(target, { recursive: true, force: true })
  • 写入本地文件
    desktop-companion/src/jsonrpc-server.ts:1256
    await chmod(full, 0o666)
  • 删除本地文件
    desktop-companion/src/jsonrpc-server.ts:1260
    await rm(full, { force: true })
  • 删除本地文件递归
    desktop-companion/src/jsonrpc-server.ts:1264
    await rm(target, { recursive: true, force: true })
  • 读取本地文件
    desktop-companion/src/login.ts:36
    return JSON.parse(readFileSync(boundDeviceFile(), 'utf8')) as { email?: string; device_id?: string; token?: string }
  • 写入本地文件
    desktop-companion/src/login.ts:43
    writeFileSync(boundDeviceFile(), JSON.stringify(obj, null, 2))
  • 读取本地文件
    desktop-companion/src/login.ts:52
    if (existsSync(file)) {
  • 读取本地文件
    desktop-companion/src/login.ts:53
    const parsed = loadYaml(readFileSync(file, 'utf8'))
  • 写入本地文件
    desktop-companion/src/login.ts:58
    mkdirSync(home, { recursive: true })
  • 写入本地文件
    desktop-companion/src/login.ts:59
    writeFileSync(file, dump(obj))
  • 发起网络请求
    desktop-companion/src/login.ts:78
    res = await fetch(server + '/api/login', {
  • 读取本地文件
    desktop-companion/src/panel.ts:53
    this.html = readFileSync(options.htmlFile ?? join(here, '..', 'panel', 'index.html'), 'utf8')
  • 读取本地文件
    desktop-companion/src/session-repair.ts:142
    const entries = await readdir(root, { withFileTypes: true })
  • 读取本地文件
    desktop-companion/src/session-repair.ts:152
    await stat(candidate)
  • 读取本地文件
    desktop-companion/src/session-repair.ts:169
    buffer = await readFile(path)
  • 写入本地文件
    desktop-companion/src/session-repair.ts:223
    await copyFile(path, backup)
  • 写入本地文件
    desktop-companion/src/session-repair.ts:225
    await writeFile(tmp, rebuilt)
  • 写入本地文件
    desktop-companion/src/session-repair.ts:226
    await rename(tmp, path)
  • 读取本地文件
    desktop-companion/src/tunnel-run.ts:20
    const raw = readFileSync(join(homedir(), '.harness-desktop.json'), 'utf8')
  • 读取本地文件
    desktop-companion/src/tunnel-run.ts:30
    const raw = readFileSync(join(homedir(), '.harness-desktop.json'), 'utf8')
  • 执行外部命令运行时拼接
    desktop-companion/src/tunnel-run.ts:41
    exec(`start "" "http://localhost:${port}"`, (error) => {
  • 读取密钥环境变量
    desktop-companion/src/tunnel-run.ts:57
    const token = boundToken() ?? process.env.DEVICE_TOKEN ?? ''
  • 发起网络请求
    desktop-companion/src/tunnel.ts:284
    const result = await this.companion.request('session/create', cwd ? { cwd } : {}, 15000)
  • 发起网络请求
    desktop-companion/src/tunnel.ts:304
    await this.companion.request('task/cancel', { sessionId }, 10000)
  • 发起网络请求
    desktop-companion/src/tunnel.ts:323
    const result = await this.companion.request('user/answer', { requestId, answers: msg.answers }, 10000)
  • 发起网络请求
    desktop-companion/src/tunnel.ts:356
    const result = await this.companion.request(method, {
  • 发起网络请求
    desktop-companion/src/tunnel.ts:396
    const result = await this.companion.request('model/list', undefined, 10000)
  • 发起网络请求
    desktop-companion/src/tunnel.ts:409
    const result = await this.companion.request('model/set', {
  • 读取本地文件
    server/src/auth.ts:99
    if (!existsSync(this.file)) return
  • 读取本地文件
    server/src/auth.ts:100
    const raw = JSON.parse(readFileSync(this.file, 'utf8')) as Record<string, UserRecord>
  • 写入本地文件
    server/src/auth.ts:116
    writeFileSync(tmp, JSON.stringify(obj, null, 2))
  • 写入本地文件
    server/src/auth.ts:117
    renameSync(tmp, this.file)
  • 读取本地文件
    server/src/config.ts:65
    if (!existsSync(file)) return { ...DEFAULTS }
  • 读取本地文件
    server/src/config.ts:66
    const raw = JSON.parse(readFileSync(file, 'utf8')) as Partial<AppConfig>
  • 读取本地文件
    server/src/index.ts:133
    if (existsSync(vf)) Object.assign(v, JSON.parse(readFileSync(vf, 'utf8')))
  • 读取本地文件
    server/src/index.ts:133
    if (existsSync(vf)) Object.assign(v, JSON.parse(readFileSync(vf, 'utf8')))
扫描于 2026/11/3(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 手机远程控制电脑
  • 指挥AI执行任务
  • 实时查看结果

在手机上远程控制 PC 上的 DeepSeek Harness,自托管。

README

由 DeepSeek 最新模型翻译生成
Harness Remote 用手机控制你 PC 上的 DeepSeek Harness —— 完全自托管,端到端私密。 English: Harness Remote 是 DeepSeek Harness(桌面 AI 智能体)的自托管远程控制系统。从你的 Android 手机发送指令 → PC 上的 AI 执行工作(运行命令、读写文件、调用工具)→ 结果实时流式回传到你的手机。所有流量都经过你自己的中继服务器;没有任何第三方能看到你的数据。 中文简介: 用手机遥控电脑上的 DeepSeek Harness 桌面 AI —— 手机发指令,电脑端 AI 干活,结果实时回传。端到端自部署,数据全程走你自己的服务器。
展开完整文档(README 剩余 1 节)
Harness Remote

用手机控制你 PC 上的 DeepSeek Harness —— 完全自托管,端到端私密。

English: Harness Remote 是 DeepSeek Harness(桌面 AI 智能体)的自托管远程控制系统。从你的 Android 手机发送指令 → PC 上的 AI 执行工作(运行命令、读写文件、调用工具)→ 结果实时流式回传到你的手机。所有流量都经过你自己的中继服务器;没有任何第三方能看到你的数据。

中文简介: 用手机遥控电脑上的 DeepSeek Harness 桌面 AI —— 手机发指令,电脑端 AI 干活,结果实时回传。端到端自部署,数据全程走你自己的服务器。

License: MIT
Version
Platform
Android
Server

✨ 功能亮点 / Features

- 📱 用手机远程控制你的 PC AI:对话、思考过程、工具调用实时同步到手机 / chats, reasoning and tool calls stream to your phone in real time
- 🖥 远程终端:手机上直接执行电脑命令(高危命令二次确认,不怕手滑)/ run commands on your PC from your phone with a high-risk command confirmation
- 🔀 模型切换:DeepSeek Chat / Reasoner 一键切换(新会话生效)/ switch between DeepSeek Chat and Reasoner
- 🌿 会话分叉:从任意历史会话 fork 出新会话继续,多线任务互不干扰 / fork any past session to continue work on a new thread
- 📈 追踪时间线:查看单条会话的完整事件时间线(思考 / 工具 / 消息 / 耗时)/ full event timeline of a session, incl. tool durations
- 🖼 离线 OCR:手机选图 → 电脑本地识别 → 文本直接插入输入框(Windows 10+,离线免费)/ pick an image on your phone, OCR it on your PC, insert text into the input box
- 🔐 端到端自托管:数据不出你的服务器,账号体系(邀请码 + 邮箱验证 + 密码)自带 / data never leaves your own server, with invite-code + email-verification account system

架构

flowchart LR
A[📱 手机 AppAndroid · 纯 Java] -- wss --> B[🌐 中继服务器Node.js + WebSocket]
B -- wss --> C[💻 桌面伴侣desktop-companion]
C --> D[🧠 DeepSeek Harnessdsh-sdk 本地进程]
D --> E[🛠 工具 · Shell · 文件系统]
C -. 本地面板 localhost:8717 .-> F[👤 配置 API Key]

三部分都要自部署:

| 组件 | 目录 | 技术栈 |
| 中继服务器 | server/ | Node.js + ws,轻量转发(device.online / chat.send / event) |
| 桌面伴侣 | desktop-companion/ | Node.js + @deepseek-ai/dsh-sdk-client,驱动本机 Harness |
| 手机 App | mobile-app/ | 纯 Android 原生 Java,无第三方依赖,直接 Build APK |

快速开始

1. 部署中继服务器(需一台公网服务器,建议 HTTPS/WSS)

cd server
npm install
在 server/ 目录创建 config.json(敏感配置不提交到仓库): { "auth_required": true, "private_enabled": false,
"invite_codes": ["你的邀请码"],
"smtp": { "host": "smtp.qq.com", "port": 465, "user": "你的邮箱", "pass": "SMTP授权码", "mode": "smtp" },
"users_file": "users.json",
"code_ttl_sec": 300,
"code_cooldown_sec": 60
}
npm run dev # 开发(tsx)
生产:先用 tsc 编译,再 node dist/index.js(或用 pm2 守护)对外暴露 8787 端口,建议用 Nginx/Caddy 反代成 wss://你的域名/relay(/relay/app 与 /relay/device 两条路径分别给 App 和桌面端)。

2. 电脑端:桌面伴侣

cd desktop-companion
npm install
setx RELAY_URL wss://你的服务器域名/relay/device # Windows;Linux/Mac 用 export
node --run start # 或双击 start-companion.bat

首次运行在手机 App 注册账号后,可打开本地面板 http://localhost:8717 用同一账号登录并填写 DeepSeek API Key(自动写入 ~/.dsh/.credentials.yaml)。

电脑端需要先装好 DeepSeek Harness 本体(npm 依赖已包含其 SDK,按本包 package.json 安装即可),确保本机可运行 dsh agent。

3. 手机端:Build APK

cd mobile-app
gradle assembleRelease # 或直接用 Android Studio 打开构建

安装后打开设置页,把「服务器地址」填成 wss://你的服务器域名/relay/app,保存后点顶部「连接」,用注册的账号登录即可。

目录结构

├── desktop-companion/ # 桌面伴侣(Node) │ ├── src/ # tunnel(转发) / harness(驱动SDK) / jsonrpc-server(扩展op) / panel(本地面板) │ │ └── scripts/ocr.ps1 # Windows WinRT OCR │ ├── runtime/cordis.yml # Harness runtime 插件配置 │ └── panel/index.html # 本地面板页 ├── mobile-app/ # Android App(纯 Java,零第三方依赖) │ └── app/src/main/java/com/harness/assistant/ ├── server/ # 中继服务器(Node + ws) │ └── src/ # index(WS+HTTP) / auth / smtp / config └── docs/ # 架构与协议说明(见下)

技术栈

| 层 | 技术 | 亮点 |
| 手机端 | Android 原生 Java | 零第三方依赖,离线可用,直接 Build APK |
| 中继层 | Node.js + ws | 轻量透明转发,一个服务器可挂多台电脑 |
| 电脑端 | @deepseek-ai/dsh-sdk-client | 直接驱动官方 Harness SDK,协议扩展即插即用 |
| 扩展协议 | JSON-RPC over WebSocket | terminal.exec / session.fork / ocr.image 等 6 个扩展 op |

协议扩展(v0.7.0)

桌面伴侣在 dsh JSON-RPC 协议上扩展了以下 op,App 与桌面端间经服务器透明转发:

| op | 说明 |
| model.list / model.set | 查询/切换模型 |
| terminal.exec | 远程终端(一次性执行 + 完整输出,高危命令拦截) |
| session.fork | 会话分支 |
| session.trace | 会话轨迹(事件时间线) |
| ocr.image | 图片 OCR(base64 → 本地识别) |

安全说明

- 服务器地址、SMTP 授权码、邀请码等敏感配置不内置在代码中,全部由部署者通过环境变量 / config.json 提供
- 手机 App 首次连接需手动填写服务器地址
- 远程终端对高危命令(rm -rf / del / 格式化等)默认拦截,需在手机上二次确认
- 生产环境务必使用 WSS + HTTPS,并修改所有默认密钥

License

MIT

Star ⭐ 支持

如果这个项目对你有帮助,欢迎点个 Star —— 你的支持是我持续更新的动力!

致谢

- DeepSeek Harness —— 桌面 AI 本体与 SDK
- 参考了 dshmk.com 生态中同类远程控制方案的设计
预览分享卡片长什么样 ↓Loki520865/dsh-remote
分享 · DeepSeek Harness Hub
Loki520865/dsh-remote

用手机远程指挥电脑上的 AI 干活并实时看结果

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部