给 DSH 加一个扫码同屏入口,手机扫二维码就能实时看到并操作电脑上的 DeepSeek Harness,局域网直连、公网走 cloudflared 隧道。
- 语言
- JavaScript
- License
- GPL-2.0
- 分支
- main
安装
$ dsh plugin --profile web add dsh-pocket在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程
对话式安装
帮我安装 DeepSeek Harness 插件 shaobeichen/dsh-pocket:先查看仓库 https://github.com/shaobeichen/dsh-pocket 确认安全性,然后执行安装命令并验证插件加载成功。
把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。
一句话定位
给电脑上的 DeepSeek Harness 加一个手机入口:手机扫码就能在浏览器里看到与电脑实时同步的同一个界面,可看输出、可发任务、可点审批。
核心能力
- 局域网扫码直连:插件启动后自动起代理,扫描设置页中的二维码即可在同一 WiFi 下访问电脑上的 DSH
- 公网扫码穿透(人在外面也能用):一键建立 cloudflared 隧道,生成随机公网 URL,4G 或任何网络都能连回电脑
- 双密码隔离保护:公网与局域网各有独立 8 位数字密码,公网密码每次开启自动换新、旧链接立即作废
- WebSocket 实时同屏:流式输出与事件通道透传,电脑端在输出内容时手机端同步滚动,可双向操作
- 移动端 UI 适配:窄屏自动改为抽屉布局,含状态栏安全区与会话全宽优化
- 流量压缩:大 JSON 响应自动以 gzip/brotli 流式压缩,长会话可从 17MB 压到 1MB 左右,手机加载更快
- 隧道自恢复:DSH 重启后 cloudflared 子进程会被回收,插件会在下次启动时按持久化标记自动重新拉起之前的公网隧道
- 一键更新/自重启:设置页可检测新版本并自动重启宿主进程(detached 交接,不撞端口)
技术实现
- 语言: JavaScript(ESM + 部分 CJS) / 含少量内联 HTML 注入脚本
- 关键依赖:
@deepseek-ai/cordis(宿主框架,peerDependencies)、qrcode(生成二维码 data URL)、cloudflared(运行时下载的二进制,公网隧道依赖) - 架构模式: 单包单插件,注入 DSH Host 后由
lib/index.js#apply启动一个 0.0.0.0 反向代理(默认 3081)把入站请求的 Host/Origin 改写为 loopback 转发到本机 DSH;同时通过ctx.connection.rpc.handle在/dsh-pocketloopback 通道注册设置页 RPC - 入口文件:
lib/index.js(Cordis apply)、bin/dsh-pocket.mjs(独立 CLI)、client/index.jsx(设置页签 React 入口)
适用场景
下班路上、出差途中或家里客厅到书房的场景:人不在电脑前但想看电脑上的 agent 跑到哪一步、想给电脑上的 agent 发新任务或审批某项操作。另一个用途是把电脑锁屏、让手机当唯一操控终端,省得远程桌面或 SSH 那一套配置。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| Node.js | >= 22 | package.json#engines 声明 |
| DeepSeek Harness(DSH) | 需与 @deepseek-ai/cordis ^4.0.1 配套的版本 | 仓库未在 package.json 中显式声明具体 DSH 版本号 |
| 平台 | macOS / Windows / Linux | 跨平台;Windows 首次开启公网时下载 cloudflared 较慢(单线程),可手动安装或挂代理 |
| 原生模块 | 无 | 全部依赖为纯 JS,公网隧道依赖的 cloudflared 是二进制,首次开启时按需下载到 $DSH_HOME/dsh-pocket/bin/ |
安装方式
dsh plugin --profile web add github:shaobeichen/dsh-pocket
配置项
本插件无需额外配置。插件启动后所有可调项(局域网密码开关、密码刷新、公网隧道开关、一键更新/重启)都在 DSH 设置页的「手机访问」页签中通过 UI 完成。内部会写入的文件:
$DSH_HOME/dsh-pocket/settings.json:局域网访问密码开关(默认开启,UI 可关)$DSH_HOME/dsh-pocket/token:公网访问密码(每次开启公网自动重写)$DSH_HOME/dsh-pocket/token-lan:局域网访问密码(设置页手动刷新)$DSH_HOME/dsh-pocket/tunnel-auto.json:公网隧道「开启中」标记,供 DSH 重启后自动恢复$DSH_HOME/dsh-pocket/cloudflared(.exe):首次开启公网时下载的 cloudflared 二进制缓存
常见问题
Q: 装好后从哪儿打开?
A: 重启 dsh web 后进入 DSH 的「设置」页面,左侧边栏会多出一项「手机访问」入口(与「通用设置」「模型」同级)。局域网二维码会立刻出现,无需任何配置。
Q: 局域网和公网模式有什么区别?
A: 局域网要求手机与电脑在同一 WiFi,访问走内网,延迟低、不耗流量;公网模式通过 cloudflared 隧道拿到一个随机 trycloudflare.com 子域,4G 或任意网络都能用,但 URL 与访问密码每次开启都会换。
Q: 访问密码是必须的吗?
A: 公网链接始终要 8 位数字密码(每次开启自动换新、旧链接立即作废)。局域网密码默认开启,可在设置页局域网区块一键关闭——关闭后同网段设备扫码即可直连(公网不受影响)。
Q: 装完/更新完为什么没生效?
A: 必须重启 dsh web 进程,正在运行的进程仍加载旧插件代码。设置页有「一键重启」按钮(桌面版环境除外),或在终端重启 dsh web 后再访问。
Q: 公网模式报 error 1033 怎么办?
A: 通常是本机代理/VPN(Clash、Surge、v2ray、sing-box 等 TUN/增强模式)掐断了 cloudflared 隧道。先只关代理的 TUN 模式,不行就彻底退出代理软件;仍然不行就给代理加直连规则放行 argotunnel.com / trycloudflare.com;网络实在不通时改用「手机热点 + 局域网模式」效果完全一致。
Q: 端口 3081 被占用怎么处理?
A: 旧 dsh-pocket 进程还占着端口时,插件会自动尝试下一个端口(最多连续 10 个)。仍冲突时需手动结束旧进程:macOS/Linux 用 lsof -ti :3081 | xargs kill -9,Windows 用 netstat -ano | findstr :3081 找 LISTENING 的 PID 后 taskkill /PID <PID> /F。
Q: 在 DSH Desktop 上能用吗?
A: 扫码同屏在桌面版正常工作,但一键更新和一键重启由 DSH Desktop 自己管理,本插件在这两项上主动禁用避免冲突。桌面端「advanced」模式暂不支持手机访问(页面会被覆盖一层提示),需在桌面端设置切回「compatibility」模式后重启。
Q: 升级到 1.x 版本怎么操作?
A: 使用 dsh plugin --profile web update dsh-pocket --latest -w(带 --latest 才能跨 ^0.x 范围升到 1.x),更新完成后记得重启 dsh web 让新代码生效。
上手难度
入门 — 装好重启 DSH 后,扫码即用;遇到代理/端口等异常时按 README 排障表逐项检查即可,没有需要理解的概念或配置项。
已知问题与限制
- DSH Desktop「advanced」模式暂不支持手机访问(桌面版 advanced 组合禁用了网页版 ui-layout,手机页拿到的是 compatibility patch 但无桌面 layout 服务),设置页会自动叠加一层提示引导用户切回 compatibility 模式
- 公网隧道依赖本机出站到 Cloudflare 边缘节点(
*.argotunnel.com、*.trycloudflare.com与 Cloudflare 边缘 IP),代理/VPN 的 TUN/增强模式常会掐断隧道连接(表现为 error 1033) - Linux 上若缓存目录里残留了 Homebrew bottle 格式的 cloudflared(ELF 解释器为
@@HOMEBREW_PREFIX@@占位符),启动时会直接报 ENOENT;插件会读 ELF 文件头检测并丢弃坏缓存、自动重新下载 - Web 推送通知(Web Push)已被移除:依赖 Google FCM 等境外服务,国内直连被墙,普通用户用不上
- 安装包未在
package.json#engines或peerDependencies中声明具体 DSH 宿主版本范围,仅声明需与@deepseek-ai/cordis ^4.0.1兼容
DSH Pocket
把 DeepSeek Harness 装进你的口袋:一个包、一个设置页,手机扫二维码就实时看到电脑上的同一个界面——人在外面也能用。
⭐ 顺手留颗 Star,作者能高兴一整天 · 行,给你一颗 Star
这是什么
你不在电脑前,也想用电脑上的 DeepSeek Harness。
- 下班路上,agent 在电脑上跑任务,你想掏出手机看看它干到哪了、结果如何
- 出门在外,突然想让电脑上的 agent 查点资料、写段代码,但没有远程桌面、没有 SSH
- 电脑在宿舍/办公室,你人在外面,想随时"操控你的 DeepSeek Harness"——发任务、看输出、点审批
DSH Pocket 就是干这个的:装上它,手机扫个码,就能实时看到并操控电脑上的 DeepSeek Harness 界面——人在外面也能用。
实际效果——手机上的界面就是电脑上的界面,实时同步:
✨ 特性
| 特性 | 说明 |
|---|---|
| 📶 局域网扫码 | 装好即用:设置 → 手机访问,打开就有局域网二维码,手机连同一 WiFi 扫码即开 |
| 🌐 公网扫码(人在外面) | 点「开启公网访问」→ cloudflared 隧道 → 出公网二维码,4G/任何网络都能访问 |
| 🔐 访问密码 | 公网链接需输入 8 位数字密码(每次开启公网自动换新,旧链接立即作废);局域网有独立 8 位数字密码(默认开启,设置页可一键关闭——关闭后局域网扫码直连) |
| ⚡ 实时同步 | 流式输出走 WebSocket 全透传——电脑上在输出,手机上同步在滚,可双向操作 |
| 📱 移动端适配 | 窄屏自动变抽屉布局(移植 dsh-web-mobile,MIT):侧栏抽屉、会话全宽、状态栏安全区、触控优化 |
| 🗜️ 传输压缩 | 大 JSON 响应自动 gzip/brotli(长会话 17MB → ~1MB,brotli 质量 6:快且省流量),手机加载更快、更省流量 |
| 🔁 隧道自动恢复 | DSH 重启后自动重新拉起之前开着的公网隧道,无需手动重开 |
| 🧩 零依赖安装 | 一个 npm 包、一个设置页,没有核心/适配器要分开装;无需账号、无需服务器 |
🚀 怎么用
入口在哪:安装完成并重启 dsh web 后,打开 设置,左侧边栏就能看到 「手机访问」 入口(和「通用设置」「模型」同级):
前提:电脑上已装好 DeepSeek Harness。如果终端提示 dsh: command not found(找不到 dsh 命令),先安装:
npm install -g @deepseek-ai/dsh # 全局安装;验证:dsh --version
# 不想全局装?每次命令前加 npx:npx @deepseek-ai/dsh <命令>
# 1. 装插件(一个包全都有)
dsh plugin --profile web add dsh-pocket -w
# 2. 重启 dsh web
npx @deepseek-ai/dsh web
局域网(同一 WiFi)
设置 → 手机访问 → 手机扫「📶 局域网」二维码 → 打开链接输入局域网密码(显示在设置页局域网区块,点「刷新」可换新)→ 打开的就是电脑上的 DSH,实时同步。
局域网密码默认开启(安全优先)。如果只有自己用、嫌每次输密码麻烦,可在设置页局域网区块把「局域网访问密码」切到关——之后局域网扫码直连、无需密码(仅同一局域网设备可访问;公网始终要密码,不受影响)。
公网(人在外面)
同一页点「开启公网访问」→ 等隧道建立(首次会下载 cloudflared,macOS/Linux 走清华镜像秒下)→ 手机扫「🌐 公网」二维码 → 打开链接输入 8 位访问密码(密码显示在设置页公网区块,每次开启公网变新)→ 人在外面(4G/公司网)也能访问。
更新到新版本:
dsh plugin --profile web update dsh-pocket --latest -w(跨大版本时--latest是必须的,^0.x范围不会自动升到 1.x)。
⚠️ 安全(必读)
- DSH 能执行你电脑上的代码。局域网二维码/URL 配上独立 8 位数字密码才是钥匙(密码默认开启,可关——关闭后局域网扫码直连,仅同一网络设备可访问),请勿把局域网二维码、URL 或密码发给别人
- 公网有 8 位数字密码保护:链接随机分配、每次开启换新密码、旧链接立即作废——泄露了也进不来,改密码/重开即可作废
- 公网 URL 由 cloudflared 随机分配,每次重启会变化(旧链接自动失效,相当于天然轮换)
- 局域网模式不暴露公网,只有同一网络内的设备能访问
- 适合个人自用;公网密码存本机
$DSH_HOME/dsh-pocket/token(每次开启公网自动换新),局域网密码存$DSH_HOME/dsh-pocket/token-lan(设置页手动刷新),开关状态存$DSH_HOME/dsh-pocket/settings.json
💻 DSH Desktop(桌面版)
- 桌面版里 dsh-pocket 的扫码同屏正常可用;更新/重启由桌面版管理(插件内这两项自动停用)
- ⚠️ 桌面端 advanced 模式暂不支持手机访问(该模式禁用网页布局、手机拿不到 layout 服务,会白屏)——请切回 compatibility 模式后重启;advanced 模式下手机打开会看到明确的提示层
🩹 常见问题(别踩的坑)
| 现象 | 原因与解决 |
|---|---|
dsh: command not found / 提示 DSH 未定义 | dsh CLI 没装:npm install -g @deepseek-ai/dsh,或命令前加 npx @deepseek-ai/dsh |
ERR_PNPM_ADDING_TO_ROOT | pnpm 9 对 workspace 根的限制:安装/更新命令末尾加 -w(--workspace-root) |
| 装完/更新了但界面没变化 | 必须重启 dsh web 才生效;运行中的进程仍加载旧代码 |
listen EADDRINUSE ... :3081 | 旧 dsh-pocket 进程还占着端口:macOS/Linux lsof -ti :3081 | xargs kill -9;Windows netstat -ano | findstr :3081(找 LISTENING 的 PID)→ taskkill /PID <PID> /F,后重试 |
| 版本停在 0.x 升不上去 | ^0.x 范围不允许升到 1.x:更新用 --latest(dsh plugin --profile web update dsh-pocket --latest -w) |
公网 error 1033 | 见下方「公网隧道常见问题」——多半是本机代理/VPN(Clash 等 TUN 模式)掐断了隧道 |
| 点「重启 dsh web」后页面提示进程在后台运行 | 自重启的新进程是 detached 后台进程(不挂终端),是页内更新的标准做法;停止它:macOS/Linux lsof -ti :3080 | xargs kill -9;Windows netstat -ano | findstr :3080 → taskkill /PID <PID> /F(日志在 $DSH_HOME 下 dsh-pocket-restart-*.log) |
⚠️ 公网隧道常见问题(必读)
现象:点「开启公网访问」后,手机上打开公网地址报 error 1033(Tunnel error)。
最常见原因:本机开着代理/VPN(Clash、Surge、v2ray、sing-box 等,尤其 TUN 模式)。
这类工具会接管全部流量,并常常把 cloudflared 的隧道边缘连接
(*.argotunnel.com、Cloudflare 边缘 IP)掐断,导致隧道注册成功但数据面连不上。
解决(从轻到重,按顺序试):
- 先只关闭代理的 TUN 模式,不用退出代理软件——多数情况这一步就够:
- Clash:设置里关掉「TUN 模式」开关(或右键菜单栏图标 → 取消勾选 TUN 模式)
- Surge:关「增强模式」;v2ray/sing-box:关「虚拟网卡/路由接管」
- 然后回设置页重新点「开启公网访问」
- 仍不行就彻底退出代理软件(不只是关界面:Clash 要右键菜单栏图标 → 退出;若装有
后台服务还要在服务管理器里停掉,
ps aux | grep clash确认进程消失),再重试 - 给代理加直连规则,放行隧道域名与 Cloudflare 边缘(Clash 规则示例):
- DOMAIN-SUFFIX,argotunnel.com,DIRECT - DOMAIN-SUFFIX,trycloudflare.com,DIRECT - IP-CIDR,198.41.192.0/24,DIRECT,no-resolve - 网络实在不通时,改用局域网模式:手机开热点 → 电脑连手机热点 → 扫局域网码, 效果完全一样(人在外面也能用)
其他可能:企业防火墙/校园网拦截出站;此时请让 IT 放行或改用热点。
首次开启时「下载 cloudflared」失败/卡住:
- macOS/Linux:优先走清华镜像(实测 ~3MB/s,几秒下完);失败自动回退官方 GitHub + 加速源。
- Windows:无清华镜像(Homebrew 不支持 Windows),走官方直连下载(约 50MB,单线程会慢,属正常,耐心等几分钟;也可挂代理加速)。
- 全部失败时设置页会给出提示。备选方案(任选其一):
- 手动装好命令行 cloudflared 后重试(装好后 dsh-pocket 直接用 PATH 里的,不再下载):
- macOS:
brew install cloudflared;Linux:sudo apt install cloudflared或官网下载 - Windows:
winget install cloudflared或官网下载 - 任何平台:
npm i -g cloudflared
- macOS:
- 挂代理(系统代理/Clash 等)后重新点「开启公网访问」
- 手动下载二进制放到
$DSH_HOME/dsh-pocket/bin/目录($DSH_HOME一般是~/.dsh,Windows 是%USERPROFILE%\.dsh;文件名用cloudflared(Windows 加.exe)或发布资产名均可,插件都认)
🗂 架构(单包)
| 文件 | 说明 |
|---|---|
lib/index.js | 插件入口:自动起代理 + 注册 RPC + 访问密码管理(公网 8 位每次开启变新;局域网独立 8 位可手动刷新/开关)+ 桌面端环境适配 |
lib/settings.mjs | 设置持久化:局域网密码开关(默认开启)存 $DSH_HOME/dsh-pocket/settings.json |
lib/service.mjs | 服务:代理生命周期(端口自适应)、公网隧道(自动恢复)、状态快照(含二维码) |
lib/proxy.mjs | 改头反向代理:Host/Origin → loopback,HTTP + WebSocket 透传 + polyfill 注入 + gzip/brotli 压缩 + 按 Host 区分的访问令牌认证(公网必验;局域网按开关) |
lib/tunnel.mjs | cloudflared:多镜像源下载(清华优先)/自适应多线程/启动/解析公网 URL(HTTP/2) |
lib/web-rpc.js | loopback RPC:status / tunnel.start / tunnel.stop / version / update / restart |
client/ | 设置页「手机访问」+ 移动端适配(dsh-web-mobile 移植) |
bin/dsh-pocket.mjs | CLI:局域网/公网模式,打印 URL + 二维码 |
🛠 开发
npm install
node client/build.mjs # 改 client/ 后重新打包
npm test # 代理 / 认证 / 压缩 / 隧道 / 服务 / RPC(43 测试)
🤝 致谢
- 移动端适配移植自 mexiaosqwq/dsh-web-mobile(MIT)
- 公网隧道基于 cloudflared
📄 License
GPL-2.0 —— 自由软件许可:可自由使用、修改、分发,但修改版必须同样以 GPL 开源并保留版权声明;商用同样适用。
说明:移动端适配部分移植自 dsh-web-mobile(MIT 许可,兼容 GPL),其版权声明保留在
client/mobile/LICENSE.dsh-web-mobile。
有问题?欢迎反馈:遇到 Bug、有想法、想提需求,请到 GitHub Issues 告诉我们 🙏
查看使用指南 →
该插件的安装步骤、关键要点、FAQ 与兼容性说明(基于已收录字段派生)。
收录徽章
[](https://deepseek-plugin.org/plugins/shaobeichen/dsh-pocket)把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。