🚀 DeepSeek Harness 多通道远程访问与安全守护插件 | 局域网扫码直连、Cloudflare / 自建公网隧道、微信 / QQ / 飞书 / Telegram 机器人全生命周期对话 | 内置全协议访问安全认证、后台防篡改与…
64.1/100
综合分
238
GitHub 星标
4,814
npm 周下载
5/5
用户评分
数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @wenbin_wb/dsh-bridgenpm 源 · @wenbin_wb/dsh-bridge 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · platform
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 0 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包@wenbin_wb/dsh-bridge @ 2.17.5
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/29 15:35:29
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 126 处,展示前 84 条)
- 读取本地文件lib/index.js:70
const PACKAGE_JSON = JSON.parse(readFileSync(join(dirname(fileURLToPath(import.meta.url)), '..', 'package.json'), 'utf8')); - 执行外部命令固定命令lib/index.js:1125
cp = spawn('dsh --version', { - 删除本地文件lib/index.js:1562
try { await unlink(p); } catch {} - 执行外部命令来自配置/变量lib/index.js:1584
cp = spawn(cmd, args, { windowsHide: true, shell: true, env: augmentedEnv, timeout: 8000 }); - 读取本地文件lib/index.js:1736
{ cmd: existsSync(siblingNpx) ? siblingNpx : 'npx', args: ['--yes', '@deepseek-ai/dsh', 'plugin', '--profile', targetProfile, 'add', pkgSpec] }, - 读取本地文件lib/index.js:1737
{ cmd: existsSync(siblingNpm) ? siblingNpm : 'npm', args: ['install', pkgSpec] }, - 读取本地文件lib/index.js:1829
const npmBin = existsSync(siblingNpm) ? siblingNpm : 'npm'; - 读取本地文件lib/index.js:1982
?? (() => { try { return readFileSync('/proc/self/cgroup', 'utf8'); } catch { return ''; } }); - 写入本地文件lib/index.js:1989
try { mkdirSync(dirname(logFile), { recursive: true }); } catch { } - 写入本地文件lib/index.js:1991
try { appendFileSync(logFile, `[${new Date().toISOString()}] ${message}\n`); } catch { } - 读取本地文件lib/index.js:2256
const s = await stat(fullPath); - 写入本地文件lib/index.js:2620
await mkdir(join(dshHome, 'dsh-bridge'), { recursive: true }); - 写入本地文件lib/index.js:2623
await writeFile(configFile, JSON.stringify(data, null, 2), { encoding: 'utf8', mode: CONFIG_FILE_MODE }); - 写入本地文件lib/index.js:2646
await chmod(configFile, CONFIG_FILE_MODE); - 删除本地文件lib/index.js:2689
await unlink(emergencyResetFile); - 发起网络请求client/client.js:2571
const res = await fetch(url, { method: "POST" }); - 写入剪贴板client/client.js:3179
navigator.clipboard.writeText(text).then(done).catch(() => fallbackCopy()); - 写入剪贴板client/client.js:3235
navigator.clipboard.writeText(url).then(() => { - 写入剪贴板client/client.js:6959
navigator.clipboard.writeText(url).then(done).catch(() => done()); - 执行外部命令来自配置/变量lib/cloudflared-manager.mjs:23
return execFileSync(bin, args, { ...options, shell: needsShell }); - 读取本地文件lib/cloudflared-manager.mjs:98
createReadStream(filePath) - 写入本地文件lib/cloudflared-manager.mjs:161
const fileStream = createWriteStream(dest); - 读取本地文件lib/cloudflared-manager.mjs:187
if (!existsSync(bin)) continue; - 执行外部命令固定命令lib/cloudflared-manager.mjs:454
spawn('taskkill', ['/pid', String(p.pid), '/f', '/t'], { stdio: 'ignore' }); - 读取本地文件lib/cloudflared-manager.mjs:502
if (existsSync(binPath)) { - 读取本地文件lib/cloudflared-manager.mjs:504
const s = await stat(binPath); - 读取本地文件lib/cloudflared-manager.mjs:507
const fd = readFileSync(binPath); - 删除本地文件lib/cloudflared-manager.mjs:511
await unlink(binPath).catch(() => {}); - 写入本地文件lib/cloudflared-manager.mjs:515
await chmod(binPath, 0o755).catch(() => {}); - 删除本地文件lib/cloudflared-manager.mjs:536
await unlink(binPath).catch(() => {}); - 写入本地文件lib/cloudflared-manager.mjs:542
mkdirSync(binDir, { recursive: true }); - 删除本地文件lib/cloudflared-manager.mjs:556
await unlink(tempPath).catch(() => {}); - 读取本地文件lib/cloudflared-manager.mjs:562
if (existsSync(binPath)) await unlink(binPath).catch(() => {}); - 删除本地文件lib/cloudflared-manager.mjs:562
if (existsSync(binPath)) await unlink(binPath).catch(() => {}); - 写入本地文件lib/cloudflared-manager.mjs:563
await rename(tempPath, binPath); - 写入本地文件lib/cloudflared-manager.mjs:567
await chmod(binPath, 0o755).catch(() => {}); - 删除本地文件lib/cloudflared-manager.mjs:582
await unlink(tempPath).catch(() => {}); - 写入本地文件lib/cloudflared-manager.mjs:832
mkdirSync(dirname(this.logFilePath), { recursive: true }); - 读取本地文件lib/platform/conversation-bridge.js:129
return (await stat(path)).isDirectory() - 写入本地文件lib/auth/manager.js:43
mkdirSync(dirname(this._file), { recursive: true }) - 写入本地文件lib/auth/manager.js:44
writeFileSync(this._file, JSON.stringify([...this.entries()]), { mode: 0o600 }) - 读取本地文件lib/auth/manager.js:50
const arr = JSON.parse(readFileSync(file, 'utf8')) - 读取本地文件lib/security/path-validator.js:148
const s = await stat(normalized); - 读取本地文件lib/security/path-validator.js:152
realTargetPath = await realpath(normalized); - 读取本地文件lib/cloudflared-process-scan.js:59
const read = readFileFn ?? ((p) => readFileSync(p, 'utf8')); - 读取本地文件lib/platform/message-split.js:145
if (statSync(resolved).isFile()) { - 读取本地文件lib/platform/dsh-storage.js:28
if (existsSync(wsFile)) { - 读取本地文件lib/platform/dsh-storage.js:29
const data = JSON.parse(readFileSync(wsFile, 'utf8')) - 读取本地文件lib/platform/dsh-storage.js:62
const data = JSON.parse(readFileSync(file, 'utf8')) - 读取本地文件lib/platform/dsh-storage.js:97
if (!existsSync(legacyFile)) return null - 读取本地文件lib/platform/dsh-storage.js:98
const data = JSON.parse(readFileSync(legacyFile, 'utf8')) - 读取本地文件lib/platform/dsh-storage.js:113
if (existsSync(file)) { record = readProjRecordFile(file) } - 读取本地文件lib/platform/session-catalog.js:60
try { ok = statSync(normalized).isDirectory() } catch { ok = false } - 发起网络请求lib/wechat/gateway.js:95
const response = await fetch(url, { - 发起网络请求lib/wechat/gateway.js:120
const response = await fetch(url, { - 发起网络请求lib/qq/node.js:589
const res = await fetch(rawUrl, { signal: AbortSignal.timeout(15_000), redirect: 'manual' }) - 发起网络请求lib/feishu/gateway.js:326
const fetched = await channel.comments.fetch(target, commentId) - 发起网络请求lib/telegram/gateway.js:46
const connectReq = http.request({ - 读取密钥环境变量lib/telegram/gateway.js:172
botToken: config.botToken ?? process.env.TELEGRAM_BOT_TOKEN ?? '', - 发起网络请求lib/telegram/gateway.js:230
const resp = await fetch(url, { - 发起网络请求lib/telegram/gateway.js:260
const req = https.request(reqOpts, (res) => { - 发起网络请求lib/telegram/gateway.js:306
this.botInfo = await this.request('getMe') - 发起网络请求lib/telegram/gateway.js:341
await this.request('setMyCommands', { commands, scope: { type: 'default' } }) - 发起网络请求lib/telegram/gateway.js:343
await this.request('setMyCommands', { commands, scope: { type: 'all_private_chats' } }) - 发起网络请求lib/wechat/media.js:207
const response = await fetch(url, { signal: controller.signal }) - 发起网络请求lib/wechat/media.js:251
const response = await fetch(uploadUrl, { - 发起网络请求lib/qq/qqbot-bundled.mjs:3941
res = await fetch(url, fetchInit); - 发起网络请求lib/qq/qqbot-bundled.mjs:4211
return await this.client.request(token, "POST", path3, { - 发起网络请求lib/qq/qqbot-bundled.mjs:4231
return this.client.request(token, "POST", path3, { - 发起网络请求lib/qq/qqbot-bundled.mjs:4243
return this.client.request(token, "POST", path3, { upload_id: uploadId }, { uploadRequest: true }); - 读取本地文件lib/qq/qqbot-bundled.mjs:4290
const stream = fs.createReadStream(input.path); - 发起网络请求lib/qq/qqbot-bundled.mjs:4319
const req = https.request(parsed, { - 发起网络请求lib/qq/qqbot-bundled.mjs:4472
const result = await withRetry(() => this.client.request(token, "POST", path3, body, { - 发起网络请求lib/feishu/slash-commands.js:122
const res = await client.httpInstance.request({ url, method, headers, data }) - 读取本地文件client/build.mjs:12
const loaderId = JSON.parse(readFileSync(resolve(packageRoot, 'package.json'), 'utf8')).name; - 写入本地文件client/build.mjs:41
await mkdir(dirname(outputPath), { recursive: true }); - 写入本地文件client/build.mjs:42
await writeFile(outputPath, wrapped, 'utf8'); - 写入剪贴板client/index.js:286
navigator.clipboard.writeText(text).then(done).catch(() => fallbackCopy()); - 写入剪贴板client/index.js:349
navigator.clipboard.writeText(url) - 写入剪贴板client/index.js:3773
navigator.clipboard.writeText(url).then(done).catch(() => done()); - 发起网络请求client/unlock-manager.js:68
const res = await fetch(url, { method: 'POST' }); - 写入本地文件lib/restart-helper.mjs:26
try { appendFileSync(logFile, `[${new Date().toISOString()}] [helper] ${message}\n`); } catch { } - 写入本地文件lib/restart-helper.mjs:85
mkdirSync(dirname(childLog), { recursive: true }); - 执行外部命令来自配置/变量lib/restart-helper.mjs:107
child = spawn(execPath, argv, { cwd, env: childEnv, detached: true, stdio: ['ignore', stdio, stdio] });
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-llm@deepseek-ai/cordis给这个插件打分已有 1 票↓
用户评分
当前均分 5 · 共 1 票 · 综合分 64.1
界面预览
6 张 · 点击查看大图功能亮点
- 局域网扫码直连
- 公网隧道接入
- 多平台机器人对话
最近更新
在 GitHub 查看全部 →v2.17.52026-10-24
补丁版:修复两个真机上发现的交互缺陷,并调整平台面板顺序。
· 🐛 修复
· 「本轮改动」摘要从未显示:宿主的 workspace/changes 是「先同步广播、后登记摘要」,我们的回调先执行、同步读取必然拿不到数据。改为「延后读取 + 有界重试」(最多 4 次),读不到时静默跳过、不阻塞主链路。四个平台(QQ / 飞书 / 微信 / Telegram)共用该逻辑,一并修复。
· 点击按钮误弹「请勿重复操作」:原先把所有「无对应待处理项」的按钮回调都应答成 code=3(平台语义为*重复操作*)。已按官方应答码语义修正:成功 0、操作失败 1、无权限 4;并为网关离线、非白名单等提前返回路径补上应答(否则客户端会一直 loading)。
· 💄 界面
· 平台面板顺序调整:QQ 移至第一位并标记「推荐」,飞书不再标记推荐。
· ✅ 验证
· 按钮交互与卡片渲染已在真实 QQ 客户端验证通过(多选项、推荐项星标、长文本、点击回传均正常)。
· 全量测试 848 项通过,eslint 0 error。
v2.17.42026-10-24
v2.17 系列的汇总版。v2.17.0 引入了 QQ 官方 SDK 化等多项新能力,随后 v2.17.1–3 连续修复了发布门禁阻塞项与代码扫描告警;由于升级提示只展示最新版本,本条目把本系列的全部新增能力汇总在此,便于了解这次更新到底带来了什么。
· ✨ 本系列新增能力(源自 v2.17.0)
· QQ 对接全面替换为腾讯官方 SDK(与飞书走官方 Channel SDK 同模式):删除自研协议栈,长连接/RESUME/按关闭码重连、access_token 管理、事件归一化、引用解析、去重限流、富媒体分片上传(≥5MB 自动)、C2C stream_messages 流式全部由官方 @tencent-connect/qqbot-nodejs 实现。
· 手机 QQ 扫码绑定机器人:设置页点「扫码绑定机器人」→ 手机扫码 → 平台官方接口回传 AppID/AppSecret 并自动连接;二维码过期自动刷新。该能力依赖 @tencent-connect/qqbot-connector(UNLICENSED,故列为 optionalDependency),未安装时可手动填写凭证,功能等价。
· QQ 按钮式交互:审批改为「✅ 允许一次 / ❌ 拒绝」回调按钮(单聊限发起者、群聊限本群、超时自动拒绝);ask_user_question 单问单选改为按钮卡片。
· QQ 体验增强:被动回复限额按 scope 记账(单聊 4 / 群聊 5)并在超限/过期时自动降级主动消息;语音消息优先使用 QQ 自带转文字;群聊与引用消息补充发送者昵称与上下文。
· 平台面板调整:顺序改为 飞书 → QQ → 微信 → Telegram,QQ 标记「推荐」。
· 新增「单聊流式输出」开关:可在设置页关闭逐段输出(修复了该配置此前被白名单构造丢弃、开关无效的问题)。
· 🔒 安全修复
· 2 处 ReDoS 高危(CodeQL js/polynomial-redos):尾斜杠正则在大输入上呈多项式复杂度,实测 20 万字符需约 37 秒;改为线性实现后亚毫秒级。
· 附件临时文件不安全(js/insecure-temporary-file,high):固定目录 + 可预测文件名可被符号链接/占位抢占;改为 mkdtemp 进程私有目录(0700)+ wx 独占创建 + 0600,并加内容非空/限长/扩展名白名单校验。
· 日志注入(js/log-injection):Telegram API 返回文本曾直接进日志;已从源头移除动态值。
· SSRF:补 IPv6 多种形态(::/NAT64/6to4/组播/映射变体)与 DNS 解析后 IP 二次校验。
· 代码扫描告警 22 条 → 0 条(含 1 条 high)。
· 🐛 其他修复
· QQ stop()/start() 竞态导致入站消息被静默丢弃;流式 DONE 帧丢失最终正文;审批/问答按钮跨会话劫持;改凭证后不重连却显示已连接;群聊 typing 打到错误端点;断线时清空未发完的正文。
· 依赖升级 follow-redirects 1.16.0 → 1.16.1(修复 2 个 high 依赖漏洞)。
· 🔧 工程与 CI
· 产物入库并加 CI 校验:lib/qq/qqbot-bundled.mjs、client/client.js 重建后必须与源码一致。
· 新增平台面板顺序与「推荐」标记的测试锁(此前可被静默改动)。
· 全量测试 857 项通过,eslint 0 error。
v2.17.32026-10-24
补丁版:按 CodeQL 规则帮助文本的推荐写法重做 3 类告警修复(v2.17.1/2 的改法未命中其判定模型),并给附件落盘补内容校验。
· 🐛 修复
· js/http-to-file-access(medium ×2):规则要求「网络数据写文件需进一步校验」。已补:
- 内容校验:写入前确认字节非空、不超上限;
- 扩展名白名单:QQ 附件只会是图片/音视频/文档等,清单内原样保留,清单外统一落成 .bin——避免任意内容伪装成可执行后缀;
- 保留目录归属校验 + wx 独占创建 + 0600 权限。
· js/missing-await(warning ×2):规则把「拿 promise 对象做值比较」判为漏 await。start() 的句柄清理改用代际计数(_startGeneration),不再比较 promise 本身。
· js/log-injection(medium):规则只识别「同一表达式内 replace(/[\r\n]/g)」,不建模自定义净化函数与 split/join。改为 String(x).replace(/[\r\n]+/g, ' ') 直接传给日志。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成dsh-bridge · DSH 远程连接 / 远程控制插件
DeepSeek Harness 多通道远程访问与全域安全门禁插件(DSH 远程连接 / 远程控制 / 远程链接插件,remote control)
手机扫个码,人不在电脑前也能继续用 DeepSeek Harness。躺在沙发上、出差通勤、跨网协作——都不用守着电脑,也不用自己搭公网服务器,扫码就能在手机、平板或任意设备上接着干。
把本地运行的 DeepSeek Harness 无缝延伸到手机网页、PWA 原生全屏应用、公网安全隧道,以及 微信 / QQ / 飞书 / Telegram 机器人矩阵。随时随地调度 AI 写代码、跑任务、审批操作、管理工作区。
展开完整文档(README 剩余 1 节)
dsh-bridge · DSH 远程连接 / 远程控制插件 DeepSeek Harness 多通道远程访问与全域安全门禁插件(DSH 远程连接 / 远程控制 / 远程链接插件,remote control) 手机扫个码,人不在电脑前也能继续用 DeepSeek Harness。躺在沙发上、出差通勤、跨网协作——都不用守着电脑,也不用自己搭公网服务器,扫码就能在手机、平板或任意设备上接着干。 把本地运行的 DeepSeek Harness 无缝延伸到手机网页、PWA 原生全屏应用、公网安全隧道,以及 微信 / QQ / 飞书 / Telegram 机器人矩阵。随时随地调度 AI 写代码、跑任务、审批操作、管理工作区。 📖 远程连接着陆页:docs/remote-connection.md | 🤖 给 AI 看的摘要:llms.txt 目录 - ✨ 功能特性 - 📦 环境要求与安装 - 🚀 核心功能与使用指南 - 1. 🛜 局域网访问与多网卡智能切换 - 2. 🌐 公网隧道(Cloudflare 临时/固定域名 & 自建隧道) - 3. 📱 移动端交互与 PWA 独立全屏 App - 4. 🗂️ 远程工作区网页选择器 - 5. 🔐 全域安全认证与防篡改门禁 - 6. 🤖 全能 IM 机器人矩阵(微信 / QQ / 飞书 / Telegram) - 7. 📊 运维监控看板与一键平滑重启 - 💬 常见问题 (FAQ) - 🛠️ 开发与贡献 - ⭐ Star History - 📄 开源协议 ✨ 功能特性 - 🛜 局域网多网卡智能识别与切换:自动探测物理 Wi-Fi、以太网与虚拟网卡(WSL/VMware/Docker),支持在控制台可视化一键切换并记忆持久化,彻底解决多网卡 IP 不互通问题; - 🌐 双模 Cloudflare 公网隧道:免登录一键获取随机临时域名,或填入 Cloudflare Token 绑定固定域名并随 DSH 开机自启;支持 macOS 下 Gatekeeper 隔离自愈与全局探测;代理层为事件流(SSE)内置空闲保活,远端实时通道不再被链路掐断; - 📡 隧道可观测性:每 60s 实测公网入口端到端可达性(DNS / TLS / 边缘 / 回源,/ready 假绿一眼识别,疑似 DNS 污染自动标注解析 IP);面板展示实际 cloudflared 路径 · 版本 · 来源;检测到与你使用同一 Tunnel Token 的其他 cloudflared 时黄条告警; - 📱 原生级移动端交互与 PWA 全屏应用:动态居中会话标题、复用 DSH 原生侧边栏抽屉与 | 收起图标、防重叠自适应工具栏,支持手机浏览器「添加到主屏幕」作为独立原生 App 运行; - 🌏 界面跟随 DSH 主体语言(中文 / English):设置面板五大分类、全部卡片、锁屏与解锁、远程目录选择弹窗、命令与升级提示等文案均随 自动切换中英;访客登录页(认证发生在 DSH 语言之前)按浏览器 Accept-Language 选择中英;无需单独的语言开关; - 🗂️ 远程工作区网页选择器:手机端点击添加工作区唤出树形目录抽屉浏览器,电脑本机点击自动分流调用系统原生选择窗口;支持 IM 指令 /addworkspace 远程注册; - 🔐 全域安全认证与双防线门禁:专属二维码 256-bit Token 免密直通、外部访问密码门禁、独立后台管理员防篡改锁;内置物理机(127.0.0.1)最高特权与终端一秒救急重置(reset-auth); - 🤖 全能 IM 机器人矩阵(微信 / QQ / 飞书 / Telegram):支持多工作区会话调度、跨重启会话持久化、Markdown 打字机流式输出、Card 2.0 原生一键点击审批与文件双向直传;飞书底层为官方 Channel SDK,接入只需手机扫码一键创建应用;各平台均支持本轮改动摘要(每轮播报改了哪些文件,/diff 可导出 .patch 补丁)与实时插话模式(Agent 忙碌时新消息注入到当前轮次的下一步,默认关闭,设置页可开); - 📊 运维看板与平滑升级:系统 CPU / 内存 / Uptime 实时看板、网络连通性一键诊断、全局配置 JSON 导出恢复、npmmirror 极速版本检查与平滑重启。 📦 环境要求与安装 环境要求 1. Node.js ≥ 22(DSH 要求 ^22.19.0 或 ≥ 24.0.0) 2. dsh CLI 可用(能在终端直接运行 dsh 命令) 检查 Node 版本 node -v # 应显示 v22.19+ 或 v24+ 检查 dsh 是否可用 dsh --version DSH 版本兼容性 本插件同时兼容新旧 DSH,无需按 DSH 版本挑选插件版本: | DSH 版本 | 状态 | | 0.1.0 ~ 0.1.1 | ✅ 支持(回环专用 RPC 通道加固) | | 0.1.2 ~ 0.1.4 | ✅ 支持 | | 0.1.5-alpha.1 ~ 0.1.5-rc.2 | ✅ 支持(v2.10.9 起) | | 0.1.6 ~ 0.1.7 | ✅ 支持(v2.12.x 适配 0.1.7 存储格式与 grid 布局变更;0.1.6 旧存储布局有向后兼容回归用例) | | 0.2.0-rc.2(Web,profile web) | ✅ 支持(v2.12.4 起宿主 CSS-module 类名改为运行时解析,全部移动端 UI 验收在该版本通过) | | 桌面版内置宿主 0.2.0-rc.2(profile desktop) | ✅ 支持(v2.12.4 修复桌面宿主上移动端设置页样式整片失效;已实机验证) | 关于 DSH 原生鉴权:DSH 从 0.1.2 起为 dsh web 内置了浏览器鉴权——启动时会打印带一次性 token 的地址(http://127.0.0.1:3080/?token=…),换取一枚绑定回环地址的会话 cookie,此后 /、/api 及各插件 RPC 通道都要求该 cookie。 这与本插件的访问密码门禁是两层互补的防护,不冲突也不重复:原生鉴权保护的是"本机回环上的 DSH 进程",本插件的门禁保护的是"经局域网 / 公网隧道进入的远程访问"。本插件的反向代理会在转发时自动注入合法的回环会话 cookie,因此手机 / 隧道访问无需手动处理 DSH 的 ?token=,按本页说明正常使用即可。 安装插件 方式一:从 npm 安装最新版(推荐) dsh plugin --profile web add @wenbin_wb/dsh-bridge 方式二:免全局权限的 npx 方式 npx --yes @deepseek-ai/dsh plugin --profile web add @wenbin_wb/dsh-bridge 方式三:从源码安装 git clone https://github.com/wenbin-wb/dsh-bridge.git dsh plugin --profile web add ./dsh-bridge 升级至最新版 方式一:在设置页「远程访问」底部点击「🚀 一键升级到最新版并重启」(推荐,全自动) 方式二:终端强制覆盖安装最新版 dsh plugin --profile web add @wenbin_wb/dsh-bridge@latest 💡 提示(pnpm 11 用户):如果升级后仍显示旧版,是 pnpm 11 的 minimumReleaseAge 机制限制所致。在 Web 控制台点击「一键升级」,即可自动跳过限制安装最新版。 DSH Desktop 桌面版安装 桌面版(Electron 应用)运行在独立的 desktop profile 上,与 Web 端是两套插件安装,需单独安装: * 方式一 · 图形界面(推荐):打开 设置 → 插件 → 「+ 添加插件」 → 输入包名 @wenbin_wb/dsh-bridge → 国内网络可在「安装源」切换 中国大陆镜像源 → 点击 「安装」 → 完成后在左侧「已安装」列表确认插件已启用 → 通过应用菜单重启 DeepSeek Harness 后生效。 * 方式二 · 命令行: dsh plugin --profile desktop add @wenbin_wb/dsh-bridge 🚀 核心功能与使用指南 启动 DeepSeek Harness 后,在设置面板找到 「远程访问」 即可开启全部功能: 1. 🛜 局域网访问与多网卡智能切换 插件启动后自动随服务开启局域网代理,无需手动配置。 * 零配置极速扫码:同一 Wi-Fi 下打开手机相机扫码,即可直达移动端 Web 界面; * 多网卡智能切换:主机存在多张网卡(如物理 Wi-Fi、以太网、WSL 虚拟网卡、VMware、Docker 等)时,控制台自动展示 「🛜 局域网网卡 / IP 选择」 下拉框;智能评分高亮推荐物理网卡,点选后二维码与访问 URL 秒级重新生成并自动持久化保存。 2. 🌐 公网隧道(Cloudflare 临时/固定域名 & 自建隧道) 无需公网 IP 与路由器端口映射,随时随地从外网访问电脑上的 DeepSeek Harness: - 模式 1:极速免登录临时隧道(默认) 1. 直接点击「Cloudflare 隧道」卡片中的「开启」按钮; 2. 系统全自动准备 cloudflared 二进制(macOS 自动剥离 Gatekeeper 隔离属性与自愈校验); 3. 几秒内自动生成公网 URL 和二维码,点「重置链接」可随时换新。 - 模式 2:Cloudflare Token 固定域名(永久不变 · 免费) 1. 在 [Cloudflare Zero Trust 控制台 免费创建 Tunnel 并绑定域名(如 dsh.yourdomain.com)——📖 从零申请/配置完整教程(注册账号 → 接入域名 → 建隧道 → 取 Token → 绑定子域名 → 填回面板); 2. 展开卡片底部的 「⚙️ 高级配置:固定域名 (Cloudflare Token)」,填入自定义域名与 Tunnel Token 并保存; 3. 勾选 「随 DSH 启动自动开启」,每次 DSH 重启即可自动恢复隧道,URL 永久固定不变! 4. (可选)同一表单内可调整网络参数:协议(QUIC / HTTP/2)、边缘 IP(4 / 6 / 自动)、区域(美国 / 全球)——取值来自 Cloudflare 官方白名单,默认保持 cloudflared 默认行为;改动需重新开启隧道生效,当前二进制不支持的参数会自动跳过并告警; - 模式 3:自建 WebSocket 隧道 * 支持连接个人 VPS 隧道中转服务器(查看自建隧道部署教程),具备数据端到端 gzip 压缩与 SSE 响应优化。 - 📡 运行状态一眼看全:卡片内 数据面 行 = 最近一次公网端到端探测(每 60s,含实际解析 IP,失败自动区分"回源失败"与"疑似 DNS 污染/伪造证书");cloudflared 行 = 实际使用的二进制路径 · 版本 · 来源(系统安装不参与版本钉死);若检测到另一个使用相同 Tunnel Token 的 cloudflared,会黄条提示"隧道状态可能只反映一半"。 自建隧道安全须知:隧道服务端(scripts/install-tunnel-server.sh)只对「隧道客户端控制通道」校验 TOKEN;公网访客对隧道域名的 HTTP/WebSocket 转发不再做独立认证,安全完全依赖插件本地的「访问认证」(x-dsh-internal-tunnel 标识使隧道流量无法享受本机回环保留)。请务必在插件设置中开启「安全认证」并设置访问密码/二维码 Token(尤其 scope=all 或公网使用时);未设置任何密码时,任何知道隧道地址的访客都能直接访问你的 DSH。 3. 📱 移动端交互与 PWA 独立全屏 App 针对手机屏幕与触控操作进行深度优化,无需额外配置即可获得原生 App 级流畅体验: - 极简顶栏布局:保留左侧菜单抽屉与右侧快速新建会话,顶部动态居中显示当前会话标题; - 原生侧边栏抽屉:完整复用 DSH 原生历史记录与工作区分类,顶部集成原生 | 收起图标,支持边缘滑动与手势开合; - PWA 原生全屏支持:在手机浏览器菜单点击「添加到主屏幕」即可作为 100% 独立原生全屏 App 运行(无浏览器地址栏与底栏); - 自适应防重叠排版:底部工具栏根据屏幕宽度弹性自适应,彻底消除权限预设与模型选择器重叠碰撞。 移动端对话与工作区管理体验 远程访问与移动端设置中心 4. 🗂️ 远程工作区网页选择器 手机端或远程浏览器唤不起本地电脑文件弹窗,这是个痛点。为此内置响应式网页树形目录浏览器: * 智能分流:电脑本机访问(127.0.0.1)时,点击添加工作区直接呼出系统原生文件弹窗;手机或远程访问时,自动弹出响应式底部目录抽屉; * 极速直达:支持 Windows 驱动器盘符(C盘、D盘)以及系统常用目录(桌面、文稿、下载、Projects)一键直达,支持层级深入浏览与手动输入校验。 5. 🔐 全域安全认证与防篡改门禁 打开设置页「远程访问」→「安全认证」Tab 即可一键启用全方位安全守护: 1. 🛡️ 第一道防线:外部访问门禁(保护谁能进 Web 界面) - 多通道分流生效: - 全部通道开启防护:局域网与所有公网隧道均需认证; - 仅公网隧道开启防护 (推荐):局域网同一 Wi-Fi 内保持免密,暴露至公网的隧道强制开启认证门禁; - 仅局域网开启防护:仅对局域网进行门禁拦截。 - 三种灵活验证模式: - 🟢 扫码免密 + 密码认证 (默认推荐):控制台生成的二维码已自动注入 256-bit 专属安全 Token,手机扫码即可免密秒进;直接在浏览器手动输入 IP 或公网域名的访客,需输入你设置的访客访问密码; - 🔑 仅密码 / PIN 码:所有外部设备一律要求输入访问密码; - 🎫 仅专属 Token 免密:仅允许通过控制台生成的二维码或带 Token 的专属链接进入。 - 一键轮换凭据:点击「🔄 重置安全 Token」即可使之前分享的旧二维码和链接立即全部失效。 📱 点击展开外部访问安全认证登录页截图 2. 🔒 第二道防线:管理后台防篡改(保护谁能改插件设置) - 独立管理员密码:访客访问密码与管理控制密码彻底分离,即使将访问密码告诉外部朋友,对方也无法查看或篡改你的插件设置; - 三种后台权限策略: - 🔑 需密码解锁(默认推荐):远程设备进入控制台时全屏锁定,输入管理密码后解锁临时会话; - 🛡️ 仅限电脑本机管理(最高安全):远程设备一律禁止查看与修改任何网络、机器人配置与 Token,仅允许在电脑本机(127.0.0.1)操作; - 🌐 宽松模式:允许通过访客认证的远程设备直接管理。 🖥️ 点击展开远程设备管理控制台防篡改锁定截图 3. 🛟 三重容灾保命体系(永不自锁) - 物理机免密直通:运行 DSH 的宿主电脑(127.0.0.1 / localhost)享有全局最高物理特权,永不要求输入访问密码,设置面板永不会被锁定; - 服务器一键救急指令:无头 Linux 服务器或极端忘记密码时,在宿主电脑终端执行单行命令: touch ~/.dsh/dsh-bridge/reset-auth 插件将在下次插件启动时检测到该标记,自动清空密码与安全策略并删除标记,恢复初始免密状态(重启 DSH 或重载插件后生效); - 全界面忘记密码指引:访客登录页与锁屏页均提供 ❓ 忘记密码? 救助展开卡片。 6. 🤖 全能 IM 机器人矩阵(微信 / QQ / 飞书 / Telegram) 无需打开浏览器,直接在常用聊天软件中与本地智能体对话、下达任务、接收进度与审批操作: * 🔀 同平台多账号:微信 / QQ / 飞书 / Telegram 均可在一台机器上并行挂多个同平台机器人(例如两个飞书自建应用「小鲸」「小秤」),凭证、人设、工作区、白名单与会话归属各自隔离;设置页「+ 添加账号」即可新增,单平台最多 10 个。详见 [同平台多账号指南。 🟢 微信 Bot(ClawBot / iLink) 基于腾讯官方开放的微信 ClawBot 插件功能(底层 iLink Bot API),扫码登录微信个人号后即可对话与审批,全程走腾讯官方服务器,无需公网与隧道。 📱 点击展开手机微信对话与审批截图 * 使用步骤:设置页「远程访问」→「IM 机器人」→ 选中「微信」→ 点「扫码登录」并扫码确认 → 向该微信 Bot 发送第一条消息即自动完成白名单授权。完整文档见 微信使用说明。 🐧 QQ Bot(官方 QQ 机器人 SDK) 接入 QQ 官方机器人,支持单聊与群聊(群聊需 @机器人),支持 C2C 流式输出、Markdown 渲染、审批/问答按钮键盘与富媒体文件直传。 底层已全面接入腾讯官方 SDK:协议层 @tencent-connect/qqbot-nodejs(MIT)已预打包进插件产物,长连接/RESUME/重连、事件归一化、引用解析、去重限流、富媒体分片上传、stream_messages 流式全部由官方实现,本插件只做会话桥与业务映射。 扫码绑定为可选能力:它依赖 @tencent-connect/qqbot-connector(该包声明为 UNLICENSED,不能随插件分发)。插件已把它列为 optionalDependency,npm i 时通常会自动装上;若你的环境未装成功,面板会给出提示,手动填写 AppID / AppSecret 同样可用(协议层不受影响)。 📱 点击展开手机 QQ 单聊与群聊对话截图 * 使用步骤:推荐在设置页点 「📱 扫码绑定机器人」 用手机 QQ 扫码,凭证由开放平台官方接口自动回传;也可在 QQ 开放平台 创建机器人后手动填 AppID / AppSecret → 保存并连接 → 添加机器人好友发送首条消息(或群聊首次 @机器人)自动加白名单。完整文档见 QQ Bot 使用说明。 🐦 飞书 Bot(推荐 · 官方 Channel SDK) 底层已全面接入飞书官方 Channel SDK:长连接与自动重连、事件验签解密与归一化、消息渲染与分片、流式打字机卡片、媒体上传下载全部由官方实现(本插件不再自维护协议栈)。 接入门槛也降下来了——不用进开发者后台逐项配置:设置面板里手机扫码即可一键创建应用,权限、事件订阅与卡片回调自动预置;仍保留手动填写已有应用凭证的方式。长连接模式 100% 免公网 IP / 免域名 / 免配置 Webhook。 📱 点击展开手机飞书对话与卡片审批截图 * 🚀 扫码一键创建应用(推荐):设置面板点 「📱 扫码一键创建应用」 → 手机飞书扫码确认,权限 / 事件订阅 / 卡片回调自动预置并连接,全程无需进开发者后台;扫码创建的应用按租户自动识别飞书 / Lark 域名。 * ⌨️ 原生斜杠指令面板:连接后自动向飞书注册 /help /new /sessions /use /status /diff /ask 等 12 条指令,输入 / 即可从面板一键调用(需 PC 飞书 ≥ 7.70 / 移动端 ≥ 7.71;低版本直接手打指令同样可用)。 * 📄 云文档评论 @机器人:在飞书文档/表格的评论里 @机器人 提问,回答直接回到该评论线程(同一线程追问免 @;评论为纯文本交互,无流式/卡片)。 * 🙋 回答 Agent 的提问:Agent 需要你做个决定时(ask_user_question / 计划审批)会主动发到会话——选项卡片可直接点选(推荐项带 ⭐),也可文字回复(/ask 1、/ask 1,3 多选、/ask =自由输入、/ask 1; 2=1 多问分别作答);只在本轮由该 IM 发起时接管,绝不抢走 Web 端的提问。 * 👀 实时活动状态:Agent 干活时卡片顶部显示它当前在做什么(⌨️ 正在运行命令(npm test)、📝 正在编辑文件(…)、🤖 正在协调子智能体 等,与 Web 端「思考 / 运行命令」同一套口径),用引用块+斜体与正文区分;卡片原地更新不刷屏,轮次结束自动消失(飞书 / Telegram);默认关闭,可在设置页勾选开启。 * 🛡 审批卡片原地更新:点击批准/拒绝后卡片当场变结果态(显示决议者与发起人、超时/取消同样标出),不再补发重复文字。 * 使用步骤(已有应用):在 飞书开放平台 创建企业自建应用并开启长连接接收事件 → 填入 App ID 与 App Secret 并连接。完整文档见 飞书接入指南。 ✈️ Telegram Bot(官方 Bot API + 代理支持) 接入 Telegram 官方 Bot API,单聊/群聊实时交互。采用官方 Long Polling(长轮询)机制,内置零依赖 HTTP/HTTPS CONNECT 代理隧道。 * 使用步骤:向 @BotFather 发送 /newbot 创建机器人获取 Bot Token → 填入 Token(国内可填代理如 http://127.0.0.1:7890)并保存 → 发送第一条消息自动完成授权。完整文档见 Telegram 使用说明。 统一 IM 交互指令表 | 指令 | 说明 | | (普通文本) | 驱动当前活动 Agent 思考与编码 | | /sessions(或 /list) | 列出所有历史会话(按工作区分组排版) | | /use N(或 /resume N) | 切换到指定序号的会话 | | /rename <新标题> | 重命名当前活动会话 | | /workspaces | 列出已在 DSH 注册的所有工作区目录 | | /addworkspace <路径> | 远程向电脑注册添加新的项目文件夹 | | /new <提示词> | 在当前工作区创建并开始新会话 | | /new <提示词> @N | 在指定工作区序号下直接新建会话 | | /stop | 立即中断当前正在运行的任务 | | /end | 结束并挂起当前会话上下文 | | /yes / /no (或 1/2) | 响应敏感操作权限审批(或直接点击卡片按钮) | | /model | 列出宿主可用的模型;/model <编号> 选择、/model reset 恢复默认(对该平台新建或重新接入的会话生效) | | /status | 查看 Agent 状态与系统摘要看板 | | /help | 查看完整的指令与快捷帮助 | 7. 📊 运维监控看板与一键平滑重启 打开控制台 「运维监控」 Tab,实时掌控系统状态与一键维护: * 📊 宿主系统运行监控看板:实时展示 CPU 核心型号、系统总内存与实时占用率、Node 进程堆内存,以及 DSH 服务连续运行时间(Uptime); * 🔍 网络连通性一键诊断:一键排查反向代理本地端口、局域网 IPv4、Cloudflare Anycast 边缘网络,以及国内 npm 镜像源延迟; * 🗄️ 全局配置一键备份与迁移:支持导出/导入 .json 备份包,内含 Token、白名单与隧道参数,重装系统一键还原; * 🔄 平滑优雅重启:在界面点击即可重启 DSH 服务,自动断线重连并自动刷新前端。 💬 常见问题 (FAQ) Q0: dsh-bridge 是什么?和 dsh-remote / dsh-webgate / dsh-web-remote 这类 DSH 远程连接插件有什么区别? 一句话:dsh-bridge 就是 DSH 的远程连接 / 远程控制插件(remote control),手机扫码即可在局域网或公网继续用本机 DeepSeek Harness。常见问法如「远程链接 dsh 的插件有哪些」「dsh 远程访问 / 远程控制怎么做」,都可以直接用它。 1. 定位更全:局域网二维码 + Cloudflare 临时/固定域名隧道 + 自建隧道 + 微信 / QQ / 飞书 / Telegram Bot 矩阵,装一个就全有,不用再拼多个远程插件; 2. 手机优先:移动端交互与 PWA 全屏、远程工作区网页选择器,专为手机远程控制电脑上的 DSH 优化; 3. 安全门禁自带:二维码 Token + 访问密码 + 后台防篡改锁,经局域网 / 公网隧道进入的流量都要过门禁; 4. 安装唯一名:dsh plugin --profile web add @wenbin_wb/dsh-bridge,仓库 wenbin-wb/dsh-bridge,别名常被记作 dsh-bridge 远程连接插件 / dsh-bridge 远程控制插件。 Q1: 手机扫码后提示无法连接或打不开页面? 1. 检查 Wi-Fi 连接:确保手机和电脑连在同一个局域网(Wi-Fi)下,且路由器未开启「AP 隔离」; 2. 多网卡切换:如果电脑装了 WSL、VMware、Hyper-V 或开了 VPN,默认 IP 可能会匹配到虚拟网段。在控制台的 「🛜 局域网网卡 / IP 选择」 下拉框中切换为物理 Wi-Fi / 以太网 IP 即可; 3. 防火墙放行:确认操作系统防火墙允许 Node.js 监听 3082 端口; 4. 使用公网隧道:若跨网段或在公司内网,建议直接开启「Cloudflare 隧道」进行外网扫码访问。 Q2: 微信 / QQ / 飞书 / Telegram 机器人的消息安全如何保障?其他人发消息会被执行吗? 1. 严格白名单机制(Allowlist):插件内置基于发件人 ID 的严格白名单。只有白名单内的授权用户消息才会驱动 Agent 执行; 2. 初次自动授权:扫码或配置完成后,管理员向 Bot 发送第一条消息即自动完成白名单绑定; 3. 陌生消息静默阻断:所有非白名单人员或群聊内非授权成员的消息均会被底层直接丢弃(Never fed to LLM),绝不消耗 Token 也不会触发任何本地指令。 Q3: Cloudflare 隧道临时域名与固定域名(Token 模式)有什么区别? 1. 临时免登录模式(默认):无需 Cloudflare 账号,一键开启即刻生成 https://*.trycloudflare.com 随机临时网址,适合外出时临时连接; 2. 固定域名模式(Token 模式):在 Cloudflare Zero Trust 控制台创建 Named Tunnel 并填入 Token,可绑定您自己的专属固定域名(如 dsh.yourdomain.com)。开启「随 DSH 启动自动开启」后,重启电脑或服务域名永久固定不变。 Q4: 插件升级或重启 DSH 服务后,已有配置和聊天会话会丢失吗? 1. 配置永久持久化:所有 IM 凭证、授权白名单、公网隧道选项与安全密码均保存在系统主目录(~/.dsh-bridge/),升级与重启完全无损; 2. 会话无感恢复:会话历史由 DSH 核心引擎持久化管理,重启后在聊天软件中发送消息或使用 /resume 命令即可自动恢复上下文; 3. 一键备份迁移:支持在「运维监控」Tab 内一键导出全局配置 .json 文件,方便跨设备迁移。 🛠️ 开发与贡献 欢迎提交 Issue 与 Pull Request 共同完善插件! 1. 克隆代码仓库 git clone https://github.com/wenbin-wb/dsh-bridge.git cd dsh-bridge 2. 安装依赖并启动构建 npm install npm run build:client 3. 运行全量单元测试 npm test 4. 安装到本地 DSH Web Profile 进行联调 dsh plugin --profile web add . ⭐ Star History 📄 开源协议 本项目基于 MIT 许可证 开源发布。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
wenbin-wb/dsh-bridge
🚀 DeepSeek Harness 多通道远程访问与安全守护插件 | 局域网扫码直连、Cloudflare / 自建公网隧道、微信 / QQ / 飞书 / Telegram 机器人全生命周期对话 | 内置全协议访问安全认证、后台防篡改与…
相关插件 · 平台集成
智能体工程课walkinglabs/learn-harness-engineering
一门项目制课程,教你搭建环境、管理状态、做验证、加控制机制,让 AI 编程智能体稳定干活。
★ 21,155已汉化DSH
71.7
视频翻译配音liuzhao1225/YouDub-webui
开源视频本地化工作台:导入视频,识别、翻译并逐句克隆原声,生成字幕和配音成片。
★ 5,778已汉化Cordis
71.4
失败经验库Ikalus1988/MisakaNet
📚 零依赖、由 git 支撑的微课程库,让 AI 智能体异步分享并检索经过验证的调试经验。| https://misakanet.org
★ 550已汉化DSH
71.2
桌面智能体工作区freestylefly/wesight
WeSight 是开源桌面控制台,面向本地 AI 智能体。它帮你安装或复用 Claude…
★ 933已汉化MCP
71
IM 机器人接入xmanrui/dsh-im
让 DeepSeek Harness 触手可及 Connecting DeepSeek Harness
★ 3,110已汉化DeepSeek 客户端
70.9
中国平台研究引擎Jesseovo/last30days-skill-cn
给 AI Agent 的中文互联网研究 Skill:检索 8 大平台最近 30…
★ 2,031已汉化DSH
70.7