dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
在 DSH 界面里加一个开关,经由内嵌的 loopback 反向代理与 Cloudflare 快速隧道把当前会话开放给手机浏览器,并把每次的新隧道地址推送到微信。
在 DSH 界面里拨一个开关,手机浏览器就能接着当前会话用 —— 同一个进程、同一个会话,两端消息实时同步。
┌─────────┐ 临时隧道 ┌──────────────┐ ┌─────────────┐
│ 手机 │ ─────────────▶ │ 本地代理 │ ──────▶ │ DSH 本体 │
│ 浏览器 │ trycloudflare │ (插件内起) │ loopback│ (你正在用)│
└─────────┘ └──────────────┘ └─────────────┘
想从外面访问家里的 DSH,通常卡在三件事上:
0.0.0.0 —— DSH 出于安全只允许 127.0.0.1 / 0.0.0.0,而后者会把「能执行任意命令的界面」暴露给整个局域网。/api 的 Host 信任栅栏 —— 只放行 loopback 或配置里声明过的域名,而隧道域名每次都是随机的,无法预先声明。本插件的做法:在本地起一个只监听 127.0.0.1 的微型反向代理,把转发给 DSH 的 Host 改写成 loopback(栅栏于是放行),剥掉 Origin / Sec-Fetch-*(避免被判为跨站),并原样透传 WebSocket 升级。DSH 始终只监听本机,不开任何入站端口。
开关长在鲸鱼娘插件上(如果装了 dsh-whale-widget):
dsh plugin add dsh-phone-access
装好后重启 DSH,开关即出现。
点 ☰ 菜单里「手机访问」那行的 ⚙:
┌──────────────────────────────────┐
│ 手机访问 · 推送设置 │
│ 推送方式 [Server酱(微信服务号)▾] │
│ 密钥 [••••••••••••••••••••] │
│ 已配置:SCT4••••••••lMZ │
│ 每日上限 [8 ] │
│ [ 测试 ] [ 保存 ] │
│ [ 清除已存密钥 ] │
└──────────────────────────────────┘
$DSH_HOME/remote-access/config.json,权限 0600。在 profile 的 cordis.patch.yml 里覆盖。这里的值优先于界面里存的:
- id: phone-access
config:
cloudflaredPath: '' # 已安装的 cloudflared 路径。留空则查 PATH / 常见位置,都没有才下载
proxyPort: 19389 # 本地代理端口;被占用会自动顺延
rebuildMinutes: 130 # 主动更换隧道的间隔(分钟)
autoStart: false # 载入即开启;出于安全默认 false
pushKind: serverchan # serverchan | wxpusher | pushplus | webhook
pushKey: '' # 对应渠道的密钥
pushCapPerDay: 8 # 每日推送上限,避免触发推送服务的风控
微信没有个人消息接口,只能经推送服务中转:
| pushKind | 说明 | 是否需实名 |
|---|---|---|
serverchan | Server酱,消息进微信服务号,微信扫码即得 SendKey | 否 |
wxpusher | WxPusher,扫码取 SPT | 否 |
pushplus | pushplus,消息进微信 | 是 |
webhook | 企业微信群机器人 Webhook 地址 | 否 |
用的是 Cloudflare Quick Tunnel(cloudflared tunnel --url …):
xxx-yyy-zzz.trycloudflare.com。cloudflared 二进制首次使用时自动从 Cloudflare 官方 Release 下载(约 50MB),不涉及你的任何账号。/assets/* 不带任何缓存头(无 Cache-Control / ETag / Last-Modified),而文件名里已含构建哈希。经隧道访问时,代理为它们补上一年强缓存 —— 否则手机每次打开都要重下约 1.4MB。图片/字体给一天缓存。请务必理解这个插件做了什么:
127.0.0.1。插件不改 DSH 的绑定,也不动防火墙;对外只有那一条隧道。401。$DSH_HOME/.credentials.yaml,永不打包、永不上传;隧道域名变了会重新签发。派生出来的会话 cookie 通过 /__auth 下发并跳回首页。如果你不接受「机器上存在一条通往你 DSH 的公网链路」,请不要启用它。
0.2.0-rc.x(用到 webserver/index-inject 与 webServer.register)。fetch)。cloudflared 按平台自动选择资源。| 文件 | 作用 |
|---|---|
lib/index.js | 插件主体:隧道管理、内嵌反向代理、微信推送、HTTP 路由 |
ui/ui.js | 界面集成:鲸鱼娘光晕/转圈/菜单行,回退图标 |
HTTP 接口(均需会话 cookie):
GET /remote-access/state 当前状态
POST /remote-access/toggle { on: boolean }
GET /remote-access/ui.js 界面脚本
GET /remote-access/push-config 推送配置(**只回掩码,不回密钥原文**)
POST /remote-access/push-config { kind, key, cap } 或 { clear: true }
POST /remote-access/push-test 用表单里尚未保存的值发一条测试
几点实现上的坑,写下来省得别人再踩:
webserver/index-inject 的行里,kind: 'script' 的 text 会被当作内联 JS 代码包进 <script>…</script>。直接传 <script src=…> 会变成嵌套 script,浏览器按内联脚本解析直接语法错误、什么都不会执行。正确做法是传一段内联 JS,由它去 document.createElement('script')(并兼顾 document.body 尚未就绪)。/api/remote.mux)。代理必须处理 upgrade 并双向管道,否则界面永远停在「重新连接中」。COOKIE_PREFIX 是 dsh-auth-,不是 dsh-。名字错了签名再对也验不过。transform: rotate() 让元素转圈,那会覆盖它自身的 transform。用 CSS 的 rotate 属性,两者可叠加。MIT