把 DeepSeek Harness 装进你的口袋:电脑上跑 dsh web,手机扫码即同步访问(局域网 + 公网,实时同屏)Put DeepSeek Harness in your pocket: run dsh web on your computer and access it synchronously by scanning a QR code on your phone (LAN + public network, real‑time screen mirroring)
在 DeepSeek Harness 终端运行:
dsh plugin --profile web add shaobeichen/dsh-pocket
把 DeepSeek Harness 装进你的口袋:一个包、一个设置页,手机扫二维码就实时看到电脑上的同一个界面——人在外面也能用。
⭐ 顺手留颗 Star,作者能高兴一整天 · 行,给你一颗 Star
你不在电脑前,也想用电脑上的 DeepSeek Harness。
DSH Pocket 就是干这个的:装上它,手机扫个码,就能实时看到并操控电脑上的 DeepSeek Harness 界面——人在外面也能用。
实际效果——手机上的界面就是电脑上的界面,实时同步:
| 特性 | 说明 |
|---|---|
| 📶 局域网扫码 | 装好即用:设置 → 手机访问,打开就有局域网二维码,手机连同一 WiFi 扫码即开(自动识别本机局域网 IP,WSL 环境自动取 Windows 物理网卡 IP) |
| 🚪 局域网开关 | 设置页可一键关闭/开启局域网访问(切换时弹窗提醒):关闭后局域网二维码/链接立即失效,仅公网可用 |
| 🌐 公网扫码(人在外面) | 点「开启公网访问」→ cloudflared 隧道 → 出公网二维码,4G/任何网络都能访问 |
| 🏷️ 公网固定域名 | 可选「命名隧道」模式:填 Cloudflare Tunnel Token + 自己的域名,公网地址固定不变(重启不再变;见下方说明) |
| 🔐 访问密码 | 公网链接默认使用 8 位随机密码(每次开启公网自动换新;可自定义固定密码——自定义后不再换新);局域网有独立的默认 8 位随机密码(默认开启,设置页可一键关闭——关闭后局域网扫码直连) |
| 🔑 自定义密码 | 公网/局域网密码都可在设置页设成自己固定的 8–64 位密码(英文字母大小写或数字)(自定义后公网不再自动换新) |
| 🧘 会话保持 | 手机输一次密码后长期免输(登录状态绑定电脑上的 dsh web 进程:只要它不重启,手机不用再输;dsh web 重启/更新后需重新输入一次) |
| ⚡ 实时同步 | 流式输出走 WebSocket 全透传——电脑上在输出,手机上同步在滚,可双向操作;内置心跳保活(防路由器 NAT/省电机制静默断链,断线自动重连) |
| 📱 移动端适配 | 窄屏自动变抽屉布局(移植 dsh-web-mobile,MIT):侧栏抽屉、会话全宽、状态栏安全区、触控优化 |
| 🧭 可选右边栏 | 手机端显示原生右边栏入口;普通手机可在设置中关闭以保持紧凑,折叠屏展开后可更方便地同时使用终端底栏和右边栏 |
| 📁 文件浏览 | 移动端「文件浏览」入口需要宿主提供 explorer 面板(dsh-web-ui 组件);官方 DSH 未内置时入口自动隐藏,不会出现"点了没反应" |
| 🗜️ 传输压缩 | 大 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
设置 → 手机访问 → 手机扫「📶 局域网」二维码 → 打开链接输入局域网密码(显示在设置页局域网区块,点「刷新」可换新,或点「自定义」设成自己固定的 8–64 位密码——英文字母大小写或数字)→ 打开的就是电脑上的 DSH,实时同步。
「局域网访问」开关默认开:可一键关闭/开启(切换时弹窗提醒)——关闭后局域网二维码/链接立即失效(手机打不开),公网不受影响;想恢复时再点「开」即可。
局域网密码默认开启(安全优先)。如果只有自己用、嫌每次输密码麻烦,可在设置页局域网区块把「局域网访问密码」切到关——之后局域网扫码直连、无需密码(仅同一局域网设备可访问;公网始终要密码,不受影响)。
手机登录一次后长期免输:只要电脑上的 dsh web 不重启,再次打开手机不用再输入(dsh web 重启/更新后需重新输入一次)。
高级选项:自动识别在 Tailscale/VPN 等场景下可能选不到可达地址。可在「局域网地址」下拉框手动选择已检测到的 IP;一般不需要修改。
同一页点「开启公网访问」→ 每次都会先弹出安全免责声明,勾选「我已知情」后才能开启(公司/涉密网络请先确认合规)→ 等隧道建立(首次会下载 cloudflared,macOS/Linux 走清华镜像秒下)→ 手机扫「🌐 公网」二维码 → 打开链接输入访问密码(密码显示在设置页公网区块,默认是每次开启公网变新的 8 位随机密码,也可点「自定义」设成 8–64 位固定密码——英文字母大小写或数字,自定义后不再换新)→ 人在外面(4G/公司网)也能访问。
更新到新版本:
dsh plugin --profile web update dsh-pocket --latest -w(跨大版本时--latest是必须的,^0.x范围不会自动升到 1.x)。
默认「快速隧道」的公网地址每次重启都会变(前缀随机)。想要固定公网地址,可用 Cloudflare 命名隧道(需要 Cloudflare 账号 + 自己的域名):
pocket.example.com)的 Service 指向 http://127.0.0.1:3081注意:命名隧道模式下公网密码不自动轮换(地址固定,重启后密码不变),建议配合「自定义密码」主动管理;Tunnel Token 只存本机($DSH_HOME/dsh-pocket/settings.json,仅本机可读),设置页不回显。
$DSH_HOME/dsh-pocket/token(默认每次开启公网自动换新,自定义后不换),局域网密码存 $DSH_HOME/dsh-pocket/token-lan(设置页手动刷新),开关/自定义标记存 $DSH_HOME/dsh-pocket/settings.jsondsh-pocket)也有密码(issue #90 修复前这条路是无认证的):默认随机生成 8 位密码,打印在终端、并已内嵌进二维码(扫码体验不变),手动敲地址时需要填写,本机访问免密。--pin <值> 或 DSH_POCKET_PIN=<值> 自定义(至少 6 位);--no-auth 可关闭,不推荐——那等于把能执行代码的 DSH 裸暴露给任何能连上该端口的人| 现象 | 原因与解决 |
|---|---|
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,后重试 |
| 想换端口(issue #70) | 插件模式:在 $DSH_HOME/dsh-pocket/settings.json 写 "proxyPort": 3082 后重启 dsh web。CLI 模式:dsh-pocket --port 3082。端口被占会报 EADDRINUSE,杀掉旧进程或换一个端口 |
| 想给访客一个临时密码 | 暂不支持:issue #69 的「临时访问 PIN」功能已在 2.6.x 移除(撤销时会崩)。现在分享访问:把主密码或 ?token=<主密码> 链接发给对方,用完在设置页点「刷新」换掉即可 |
| Linux 服务器装不上 cloudflared(issue #45) | 远程 Linux 国内/企业网下所有 CDN 源(GitHub/ghproxy/gh.ddlc/gh-proxy)都连不上时:在服务器上手动装 cloudflared(如 apt install cloudflared、dnf install cloudflared、或下载 tgz 解压到任意目录),然后在 $DSH_HOME/dsh-pocket/settings.json 加 "cloudflaredPath": "/path/to/cloudflared",重启 dsh web 后插件直接调用它,不再走自动下载 |
| 版本停在 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)掐断,导致隧道注册成功但数据面连不上。
解决(从轻到重,按顺序试):
ps aux | grep clash 确认进程消失),再重试- DOMAIN-SUFFIX,argotunnel.com,DIRECT
- DOMAIN-SUFFIX,trycloudflare.com,DIRECT
- IP-CIDR,198.41.192.0/24,DIRECT,no-resolve
其他可能:企业防火墙/校园网拦截出站;此时请让 IT 放行或改用热点。
首次开启时「下载 cloudflared」失败/卡住:
brew install cloudflared;Linux:sudo apt install cloudflared 或官网下载winget install cloudflared 或官网下载npm i -g cloudflared$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 区分的访问令牌认证(公网必验;局域网按开关)+ 局域网关闭时拦截局域网 Host |
lib/tunnel.mjs |
cloudflared:多镜像源下载(清华优先)/自适应多线程/启动/解析公网 URL(HTTP/2) |
lib/web-rpc.js |
loopback RPC:status / tunnel.start / tunnel.stop / lan.setEnabled / version / update / restart |
client/ |
设置页「手机访问」+ 移动端适配(dsh-web-mobile 移植) |
bin/dsh-pocket.mjs |
CLI:局域网/公网模式,打印 URL + 二维码 |
npm install
node client/build.mjs # 改 client/ 后重新打包
npm test # 代理 / 认证 / 压缩 / 隧道 / 服务 / RPC / 设置(109 测试)
改完想在本机先试? 不用发版:把插件换成指向本地仓库的软链,重启 dsh web 就是本地代码。完整步骤(含怎么换回 npm 官方版本)见 LOCAL-DEV.md。
GPL-2.0 —— 自由软件许可:可自由使用、修改、分发,但修改版必须同样以 GPL 开源并保留版权声明;商用同样适用。
说明:移动端适配部分移植自 dsh-web-mobile(MIT 许可,兼容 GPL),其版权声明保留在
client/mobile/LICENSE.dsh-web-mobile。
有问题?欢迎反馈:遇到 Bug、有想法、想提需求,请到 GitHub Issues 告诉我们 🙏
登录后即可为该插件评分和评价。
还没有人评价这个插件,来抢个沙发吧!