在手机上继续电脑的会话,随时审批与查看结果
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/14 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add KKUCODES/deepseek-harness-mobile该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
dsh 原生插件 · security
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 18 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🟢 扫描:未发现敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。
写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 47 处,展示前 44 条)
- 写入剪贴板src/ordinary-clipboard.mjs:12
export async function writeClipboard(text) { - 发起网络请求src/remote-attachments.mjs:33
const request = this.model.client.request({ method: 'remote.attachment', sessionId, ...this.attachment }, value => { - 发起网络请求src/remote-changes.mjs:31
request = model.client.request({ method: 'remote.changes', sessionId, seq, ...(index === undefined ? {} : { index }) }, value => { - 发起网络请求src/remote-coding-tools.mjs:46
this.request = request = this.model.client.request({ method: 'remote.codingToolsRead' }); - 发起网络请求src/remote-desktop-apps.mjs:21
const request = model.client.request(operation), abort = () => request.cancel(); - 发起网络请求src/remote-desktop.mjs:14
const request = model.client.request(operation), abort = () => request.cancel(); - 发起网络请求src/remote-desktop.mjs:52
const request = model.client.request(operation), abort = () => request.cancel(); - 发起网络请求src/remote-desktop.mjs:75
const request = model.client.request(operation), abort = () => request.cancel(); - 发起网络请求src/remote-endpoint.mjs:67
request = this.model.client.request(operation); signal.addEventListener('abort', abort, { once: true }); - 发起网络请求src/remote-feedback-notifications.mjs:14
state.request = model.client.request({ method: 'remote.feedbackFollow', sessionId }, value => { - 发起网络请求src/remote-files.mjs:29
const initial = metadata(await this.request('stat', sessionId, path, null, signal)); - 发起网络请求src/remote-files.mjs:33
const page = await this.request('readBytes', sessionId, path, { offset, length: FILE_CHUNK_BYTES }, signal); - 发起网络请求src/remote-files.mjs:47
sameFile(initial, await this.request('stat', sessionId, path, null, signal)); - 发起网络请求src/remote-files.mjs:58
const initial = metadata(await this.request('stat', sessionId, path, null, signal)); - 发起网络请求src/remote-files.mjs:64
sameFile(expected, await this.request('stat', sessionId, path, null, signal)); - 发起网络请求src/remote-job-actions.mjs:21
const result = await model.client.request({ method: 'remote.jobStop', sessionId, jobId: job.id, - 发起网络请求src/remote-key.mjs:53
request = this.model.client.request({ method: 'remote.keyRead', ...(this.target ? { target: this.target } : {}) }); - 发起网络请求src/remote-live-job-output.mjs:86
task = this.model.client.request(this.operation()); - 发起网络请求src/remote-model-probe.mjs:30
const request = this.model.client.request(operation); - 发起网络请求src/remote-model-probe.mjs:40
const value = modelProbePreparedSchema.parse(await this.request(operation, fused)); - 发起网络请求src/remote-model-probe.mjs:54
return modelProbeResultSchema.parse(await this.request(operation, fused)); - 发起网络请求src/remote-model.mjs:395
const response = await this.transport.uploadHooks.fetch(`/api/session/uploadFileBinary?${query}`, { - 发起网络请求src/remote-office.mjs:18
request = model.client.request(operation, value => { - 发起网络请求src/remote-plugin-operations.mjs:45
const request = this.client.request(operation); - 发起网络请求src/remote-plugin-operations.mjs:85
try { await this.request({ method: 'remote.pluginOperationStart', generation, operationId, endpoint, payload }, signal); } - 发起网络请求src/remote-plugin-operations.mjs:117
const result = await this.request({ method: 'remote.pluginOperations' }, lifetime); - 发起网络请求src/remote-plugin-operations.mjs:140
read(generation, operationId, signal) { return this.request({ method: 'remote.pluginOperationRead', generation, operationId }, signal); } - 发起网络请求src/remote-preset-directory.mjs:35
const request = this.model.client.request({ method: 'remote.rpc', endpoint: 'settings/openAgentPresetDirectory', payload: { args: { agentPreset: id } - 发起网络请求src/remote-preset-management.mjs:50
request = this.model.client.request(operation); this.pending = request; - 发起网络请求src/remote-session-export.mjs:13
const request = model.client.request({ method: 'remote.sessionExport', sessionId, includeDescendants }, value => { - 发起网络请求src/remote-settings.mjs:43
async read(signal) { return this.request({ method: 'remote.settingsRead', ...(this.namespace ? { namespace: this.namespace } : {}) }, signal, false); - 发起网络请求src/remote-settings.mjs:59
return this.request(parsed.data, signal, true); - 发起网络请求src/remote-settings.mjs:71
request = this.model.client.request(operation); - 发起网络请求src/remote-settings.mjs:107
async read(signal) { return this.request(this.provider === undefined ? { method: 'remote.providerSettingsList' } - 发起网络请求src/remote-settings.mjs:139
const view = await this.request({ method: 'remote.providerCreationRead' }, signal, false); - 发起网络请求src/remote-settings.mjs:168
async read(signal) { return this.request({ method: 'remote.providerRemovalRead', provider: this.provider }, signal, false); } - 发起网络请求src/remote-subagents.mjs:39
subscription.request = model.client.request({ method: 'remote.subagentStateFollow' }, state => { - 发起网络请求src/remote-task-notifications.mjs:74
subscription.request = model.client.request({ method: 'remote.taskFollow' }, event => { - 发起网络请求src/remote-transport.mjs:43
fetch: (input, init) => this.fetch(input, init), - 发起网络请求src/remote-transport.mjs:68
const request = this.client.request({ method: 'remote.negotiate', version: 2 }); - 发起网络请求src/remote-transport.mjs:131
const request = this.client.request({ method: 'remote.rpc', endpoint, payload: hint?.payload ?? payload }); - 发起网络请求src/remote-transport.mjs:171
const request = this.client.request({ method: 'remote.stream', endpoint, payload: hint?.payload ?? payload }, value => { - 发起网络请求src/remote-transport.mjs:199
fetch(input, init) { - 发起网络请求src/remote-upload.mjs:35
request = client.request(operation, value => {
扫描于 2026/10/31(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/cordis-plugin-loader@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-modules@deepseek-ai/dsh-client-store@deepseek-ai/dsh-client-ui-dockkit@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-renderer@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-client-ui-theme给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 移动端(DSHM):DeepSeek Harness 的 Android 聊天与远程客户端。在手机上接着聊、跟进任务、处理审批。
README
由 DeepSeek 最新模型翻译生成DeepSeek Harness Mobile (DSHM)
DSHM 安卓客户端 · DSHM 电脑插件 · DSHM 中转服务
DSHM 是社区开发的 DeepSeek Harness(DSH) 安卓客户端。支持手机直连 DeepSeek 普通聊天,也能同步电脑上的 DSH 会话。离开电脑后,仍能继续发送消息、查看执行结果、切换模型和处理审批;任务由电脑执行。
下载 Android APK · 连接电脑 DSH · 使用指南 · 常见问题
DSHM:离开电脑后,继续推进电脑上的工作。
普通聊天与 Remote 界面
聊点日常接着做项目看清再确认
图片来源 · 点击截图看原图。
手机聊天与远程会话功能
| 能力 | 内容 |
| 普通聊天 | 手机直连 DeepSeek;流式回复、深度思考、附件、本地历史与备份。 |
| Remote | 打开已有工作区和会话,在已有工作区新建聊天;发送消息、切换模型、停止任务、回答提问与审批。 |
| 结果查看 | 工具、命令、文件与改动预览;保存或分享完整文件。 |
| 插件界面 | 显示兼容插件;默认等比例缩放,作者声明与用户开关可调整。
展开完整文档(README 剩余 1 节)
DeepSeek Harness Mobile (DSHM) DSHM 安卓客户端 · DSHM 电脑插件 · DSHM 中转服务 DSHM 是社区开发的 DeepSeek Harness(DSH) 安卓客户端。支持手机直连 DeepSeek 普通聊天,也能同步电脑上的 DSH 会话。离开电脑后,仍能继续发送消息、查看执行结果、切换模型和处理审批;任务由电脑执行。 下载 Android APK · 连接电脑 DSH · 使用指南 · 常见问题 DSHM:离开电脑后,继续推进电脑上的工作。 普通聊天与 Remote 界面 聊点日常接着做项目看清再确认 图片来源 · 点击截图看原图。 手机聊天与远程会话功能 | 能力 | 内容 | | 普通聊天 | 手机直连 DeepSeek;流式回复、深度思考、附件、本地历史与备份。 | | Remote | 打开已有工作区和会话,在已有工作区新建聊天;发送消息、切换模型、停止任务、回答提问与审批。 | | 结果查看 | 工具、命令、文件与改动预览;保存或分享完整文件。 | | 插件界面 | 显示兼容插件;默认等比例缩放,作者声明与用户开关可调整。 | flowchart LR Phone["DSHM 手机端查看 · 沟通 · 决策"] <--> Relay["中转服务连接与传输"] Relay <--> Computer["电脑端 DSH + DSHM 插件会话 · 项目 · 任务执行"] 下载 Android APK 与开始使用 APK 发行版本 · 构建与签名说明 · GitHub Actions 构建 公开开发预览提供已签名 APK,最低 Android 9。可直接从 Release 下载 .apk 安装,无需登录 GitHub;Actions 中的 dshm-signed-apk 下载需要登录。签名与更新说明见APK 构建与下载指南。 安装 App 后,配置自己的 DeepSeek Key 即可开始普通聊天。手机直连 DeepSeek,聊天历史保存在本地,无需电脑或中转服务。 连接电脑上的 DeepSeek Harness 1. 在电脑的官方 DSH 中安装DSHM 远程连接插件,连接中转服务。 2. 在手机 DSHM 中领取电脑生成的一次性配对链接。 3. 电脑核对设备指纹并批准后,手机打开已有工作区,继续会话或创建新聊天。 推荐自建中转,也可使用公共服务:http://118.31.20.47:18787。开放注册免注册密钥,手机仍需配对和批准。 公共服务使用 HTTP,传输未加密。敏感内容建议自建 HTTPS。普通聊天不经过中转。完整步骤见使用指南。 当前状态 开发预览,尚未进入应用商店。核心 Remote 已在 官方 DSH 0.2.1-alpha.2+插件 0.1.80-latest.0+配套 Android 上完成 Web + MuMu 本地验收;扩展范围见兼容结论。 - 首版仅 Android。真机、完整公网链路及其他版本、插件、模型仍需验证。 - 电脑和 DSH 保持运行,只安装独立插件,不修改 DSH 本体。 - 手机不创建电脑工作区、不输入命令、不转发电脑 localhost 网站。 - App 进程结束后不推送;重新打开尝试重连。 常见问题 Remote 与手机浏览器打开 DSH 有什么区别? Remote 使用随 App 打包的 DSHM 聊天界面,通过中转同步电脑会话与操作。手机能在自己的页面查看执行过程、文件改动和审批;电脑端 DSH 负责执行任务,手机与电脑共同参与同一个会话。 连接 Remote 需要在手机填写 DeepSeek Key 吗? 不需要填写手机普通聊天的 Key。Remote 使用电脑 DSH 配置的模型与凭据,手机需要配对并获得电脑批准。普通聊天则使用你在手机配置的 DeepSeek API Key,两种模式分别管理。 普通聊天与 Remote 的历史保存在哪里? 普通聊天历史和草稿保存在手机,可通过本地备份导出;Remote 对接电脑 DSH 保存的会话。两者分别管理,切换模式不会合并聊天历史。详细步骤见历史与备份。 有 iPhone 版吗? 目前只提供 Android 开发预览,最低 Android 9;尚未提供 iPhone 版本。 开发与文档 Kotlin + WebView,React 聊天界面复用 DSH 客户端组件,页面随 App 打包。GitHub Actions 自动准备固定 SDK 与只读官方源码;原本地开发入口仍使用相邻项目,见构建说明。 android/ Android 工程与原生桥 src/ 普通聊天、Remote 和共享界面 scripts/ 构建、检查和联调脚本 tests/ 测试与夹具 docs/ 使用、开发与技术文档 - 使用指南:普通聊天、配对与限制。 - 开发指南:环境、构建与测试。 - 构建与下载:自动签名、公开 APK、摘要与版本信息。 - 兼容结论:版本与支持范围。 - 知识库:架构、设计与验证资料。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
KKUCODES/deepseek-harness-mobile
在手机上继续电脑的会话,随时审批与查看结果
相关插件 · 安全 / 权限
智能体逆向工程morluto/rea
用智能体逆向工程任何东西,从应用行为到原生二进制。
★ 415,267已汉化DSH
73.3
智能体集群框架ruvnet/ruflo
面向 Claude Code 与 Codex 的智能体元基座meta-harness。
★ 80,414已汉化MCP
71.9
WorkBuddy 模型接入corrinehu/dsh-workbuddy-connect
2026 年 10 月 20 日起,WorkBuddy…
★ 1,604已汉化DSH
71.7
破甲一键通z91772524-ai/pojia-next
十五个 AI…
★ 967已汉化DSH
71.6
AI 代理虚拟终端strukto-ai/mirage
Mirage 是给 AI 智能体用的虚拟终端:一层 shell,统管数据、命令行和运行时。Unix…
★ 3,756已汉化DSH
70.8
Agent 操作层agentic-os-org/ANOLISA
ANOLISA(Agentic Nexus Operating Layer & Interface System Architecture)|智能体操作系统,带运行时、安全、可观测性,以及 Tokenless 响应压缩,降低 token 用量与成本。
★ 649已汉化DSH
70.7