@qzsy/dsh-bridge 0.0.0-stage → 2.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1107 -0
- package/LICENSE +21 -0
- package/README.en.md +488 -0
- package/README.md +509 -2
- package/client/build.mjs +43 -0
- package/client/client.js +9864 -0
- package/client/host-families.js +442 -0
- package/client/index.js +6883 -0
- package/client/locales.mjs +242 -0
- package/client/mobile-styles.js +1299 -0
- package/client/mobile-yield.js +219 -0
- package/client/panel-locales.mjs +777 -0
- package/client/picker-yield.js +77 -0
- package/client/resource-url-compat.js +90 -0
- package/client/settings-nav-icon.js +105 -0
- package/client/theme-tokens.js +49 -0
- package/client/tunnel-guard.js +46 -0
- package/client/unlock-manager.js +144 -0
- package/cordis.patch.yml +4 -0
- package/lib/auth/dsh-native-cookie.js +148 -0
- package/lib/auth/login-template.js +516 -0
- package/lib/auth/manager.js +596 -0
- package/lib/bridge-rpc-constants.js +66 -0
- package/lib/bridge-rpc.js +722 -0
- package/lib/cloudflared-manager.mjs +1277 -0
- package/lib/cloudflared-network-args.js +99 -0
- package/lib/cloudflared-process-scan.js +153 -0
- package/lib/compat.js +172 -0
- package/lib/connection-compat.js +115 -0
- package/lib/feishu/comment.js +50 -0
- package/lib/feishu/gateway.js +644 -0
- package/lib/feishu/index.js +432 -0
- package/lib/feishu/lark-bundled.mjs +131929 -0
- package/lib/feishu/markdown.js +148 -0
- package/lib/feishu/node.js +1152 -0
- package/lib/feishu/slash-commands.js +255 -0
- package/lib/index.js +3554 -0
- package/lib/platform/account-ops.js +248 -0
- package/lib/platform/activity.js +169 -0
- package/lib/platform/ask-user.js +293 -0
- package/lib/platform/base.js +147 -0
- package/lib/platform/changes-digest.js +93 -0
- package/lib/platform/commands.js +267 -0
- package/lib/platform/config-restore.js +78 -0
- package/lib/platform/conversation-bridge.js +1544 -0
- package/lib/platform/dsh-storage.js +222 -0
- package/lib/platform/index.js +10 -0
- package/lib/platform/instances.js +458 -0
- package/lib/platform/manager.js +130 -0
- package/lib/platform/message-split.js +229 -0
- package/lib/platform/session-catalog.js +405 -0
- package/lib/platform/session-config.js +52 -0
- package/lib/platform/stream-slices.js +21 -0
- package/lib/qq/gateway.js +1107 -0
- package/lib/qq/index.js +561 -0
- package/lib/qq/node.js +1153 -0
- package/lib/qq/qqbot-bundled.mjs +8273 -0
- package/lib/restart-helper.mjs +133 -0
- package/lib/saas/device-auth.mjs +366 -0
- package/lib/saas/tunnel-client.mjs +695 -0
- package/lib/security/log-sanitize.js +50 -0
- package/lib/security/path-validator.js +195 -0
- package/lib/security/rate-limiter.js +93 -0
- package/lib/session-strip.js +100 -0
- package/lib/sse-keepalive.js +115 -0
- package/lib/telegram/gateway.js +643 -0
- package/lib/telegram/index.js +255 -0
- package/lib/telegram/node.js +410 -0
- package/lib/tunnel-client.mjs +537 -0
- package/lib/wechat/gateway.js +1000 -0
- package/lib/wechat/index.js +282 -0
- package/lib/wechat/media.js +302 -0
- package/lib/wechat/node.js +360 -0
- package/llms.txt +36 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +135 -4
package/README.md
CHANGED
|
@@ -1,3 +1,510 @@
|
|
|
1
|
-
#
|
|
1
|
+
# dsh-bridge · DSH 远程连接 / 远程控制插件
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/banner.webp" alt="dsh-bridge banner" width="100%" />
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<a href="https://www.npmjs.com/package/@wenbin_wb/dsh-bridge"><img src="https://img.shields.io/npm/v/@wenbin_wb/dsh-bridge.svg?style=flat-square&color=38bdf8&logo=npm" alt="npm version" /></a>
|
|
9
|
+
<a href="https://www.npmjs.com/package/@wenbin_wb/dsh-bridge"><img src="https://img.shields.io/npm/dt/@wenbin_wb/dsh-bridge.svg?style=flat-square&color=fbbf24&logo=npm" alt="npm downloads" /></a>
|
|
10
|
+
<a href="https://github.com/wenbin-wb/dsh-bridge/releases"><img src="https://img.shields.io/github/v/release/wenbin-wb/dsh-bridge?style=flat-square&color=10b981&logo=github" alt="GitHub release" /></a>
|
|
11
|
+
<a href="https://github.com/wenbin-wb/dsh-bridge/stargazers"><img src="https://img.shields.io/github/stars/wenbin-wb/dsh-bridge?style=flat-square&color=f43f5e&logo=github" alt="GitHub stars" /></a>
|
|
12
|
+
<a href="https://nodejs.org/"><img src="https://img.shields.io/badge/Node.js-%E2%89%A522.19%20%7C%20%E2%89%A524-339933?style=flat-square&logo=node.js" alt="Node.js version" /></a>
|
|
13
|
+
<a href="LICENSE"><img src="https://img.shields.io/npm/l/@wenbin_wb/dsh-bridge?style=flat-square&color=a855f7" alt="license" /></a>
|
|
14
|
+
</p>
|
|
15
|
+
|
|
16
|
+
<p align="center">
|
|
17
|
+
<img src="https://img.shields.io/badge/Security-Access%20Auth%20%2B%20PBKDF2-6366f1?style=flat-square&logo=security" alt="Security" />
|
|
18
|
+
<img src="https://img.shields.io/badge/WeChat-ClawBot%20%7C%20iLink-07C160?style=flat-square&logo=wechat" alt="WeChat" />
|
|
19
|
+
<img src="https://img.shields.io/badge/QQ%20Bot-Official%20SDK-12B7F5?style=flat-square&logo=tencentqq" alt="QQ" />
|
|
20
|
+
<img src="https://img.shields.io/badge/Feishu-Channel%20SDK-00D6B9?style=flat-square&logo=lark" alt="Feishu" />
|
|
21
|
+
<img src="https://img.shields.io/badge/Telegram-Bot%20API-24A1DE?style=flat-square&logo=telegram" alt="Telegram" />
|
|
22
|
+
<img src="https://img.shields.io/badge/Cloudflare-Tunnel-F38020?style=flat-square&logo=cloudflare" alt="Cloudflare" />
|
|
23
|
+
<a href="https://dpharness.com/plugin/wenbin-wb/dsh-bridge" target="_blank" rel="noopener noreferrer"><img src="https://dpharness.com/badge/install/wenbin-wb/dsh-bridge.svg" alt="DSH Hub 实装验证" /></a>
|
|
24
|
+
</p>
|
|
25
|
+
|
|
26
|
+
<p align="center">
|
|
27
|
+
<b>简体中文</b> | <a href="README.en.md">English</a>
|
|
28
|
+
</p>
|
|
29
|
+
|
|
30
|
+
> **DeepSeek Harness 多通道远程访问与全域安全门禁插件(DSH 远程连接 / 远程控制 / 远程链接插件,remote control)**
|
|
31
|
+
>
|
|
32
|
+
> 手机扫个码,人不在电脑前也能继续用 DeepSeek Harness。无论躺在沙发上、出差通勤、还是跨网协作——都不用守着电脑,也不用自己搭公网服务器,扫码即可在手机、平板或任意设备上接着干。
|
|
33
|
+
>
|
|
34
|
+
> 将您本地运行的 DeepSeek Harness 无缝延伸至手机网页、PWA 原生全屏应用、公网安全隧道、以及 **微信 / QQ / 飞书 / Telegram** 机器人矩阵。随时随地调度 AI 编写代码、执行任务、审批操作与管理工作区。
|
|
35
|
+
>
|
|
36
|
+
> 📖 远程连接着陆页:[docs/remote-connection.md](docs/remote-connection.md) | 🤖 给 AI 看的摘要:[llms.txt](llms.txt)
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 目录
|
|
41
|
+
|
|
42
|
+
- [✨ 功能特性](#-功能特性)
|
|
43
|
+
- [📦 环境要求与安装](#-环境要求与安装)
|
|
44
|
+
- [🚀 核心功能与使用指南](#-核心功能与使用指南)
|
|
45
|
+
- [1. 🛜 局域网访问与多网卡智能切换](#1-🛜-局域网访问与多网卡智能切换)
|
|
46
|
+
- [2. 🌐 公网隧道(Cloudflare 临时/固定域名 & 自建隧道)](#2-🌐-公网隧道cloudflare-临时固定域名--自建隧道)
|
|
47
|
+
- [3. 📱 移动端交互与 PWA 独立全屏 App](#3-📱-移动端交互与-pwa-独立全屏-app)
|
|
48
|
+
- [4. 🗂️ 远程工作区网页选择器](#4-🗂️-远程工作区网页选择器)
|
|
49
|
+
- [5. 🔐 全域安全认证与防篡改门禁](#5-🔐-全域安全认证与防篡改门禁)
|
|
50
|
+
- [6. 🤖 全能 IM 机器人矩阵(微信 / QQ / 飞书 / Telegram)](#6-🤖-全能-im-机器人矩阵微信--qq--飞书--telegram)
|
|
51
|
+
- [7. 📊 运维监控看板与一键平滑重启](#7-📊-运维监控看板与一键平滑重启)
|
|
52
|
+
- [💬 常见问题 (FAQ)](#-常见问题-faq)
|
|
53
|
+
- [🛠️ 开发与贡献](#️-开发与贡献)
|
|
54
|
+
- [⭐ Star History](#-star-history)
|
|
55
|
+
- [📄 开源协议](#-开源协议)
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## ✨ 功能特性
|
|
60
|
+
|
|
61
|
+
- **🛜 局域网多网卡智能识别与切换**:自动探测物理 Wi-Fi、以太网与虚拟网卡(WSL/VMware/Docker),支持在控制台可视化一键切换并记忆持久化,彻底解决多网卡 IP 不互通问题;
|
|
62
|
+
- **🌐 双模 Cloudflare 公网隧道**:免登录一键获取随机临时域名,或填入 Cloudflare Token 绑定固定域名并随 DSH 开机自启;支持 macOS 下 Gatekeeper 隔离自愈与全局探测;代理层为事件流(SSE)内置空闲保活,远端实时通道不再被链路掐断;
|
|
63
|
+
- **📡 隧道可观测性**:每 60s 实测公网入口端到端可达性(DNS / TLS / 边缘 / 回源,`/ready` 假绿一眼识别,疑似 DNS 污染自动标注解析 IP);面板展示实际 cloudflared 路径 · 版本 · 来源;检测到与你使用同一 Tunnel Token 的其他 cloudflared 时黄条告警;
|
|
64
|
+
- **📱 原生级移动端交互与 PWA 全屏应用**:动态居中会话标题、复用 DSH 原生侧边栏抽屉与 `[|` 收起图标、防重叠自适应工具栏,支持手机浏览器「添加到主屏幕」作为独立原生 App 运行;
|
|
65
|
+
- **🌏 界面跟随 DSH 主体语言(中文 / English)**:设置面板五大分类、全部卡片、锁屏与解锁、远程目录选择弹窗、命令与升级提示等文案均随 `<html lang>` 自动切换中英;访客登录页(认证发生在 DSH 语言之前)按浏览器 `Accept-Language` 选择中英;无需单独的语言开关;
|
|
66
|
+
- **🗂️ 远程工作区网页选择器**:手机端点击添加工作区唤出树形目录抽屉浏览器,电脑本机点击自动分流调用系统原生选择窗口;支持 IM 指令 `/addworkspace` 远程注册;
|
|
67
|
+
- **🔐 全域安全认证与双防线门禁**:专属二维码 256-bit Token 免密直通、外部访问密码门禁、独立后台管理员防篡改锁;内置物理机(`127.0.0.1`)最高特权与终端一秒救急重置(`reset-auth`);
|
|
68
|
+
- **🤖 全能 IM 机器人矩阵(微信 / QQ / 飞书 / Telegram)**:支持多工作区会话调度、跨重启会话持久化、Markdown 打字机流式输出、Card 2.0 原生一键点击审批与文件双向直传;**飞书**底层为官方 Channel SDK,接入只需手机扫码一键创建应用;各平台均支持**本轮改动摘要**(每轮播报改了哪些文件,`/diff` 可导出 `.patch` 补丁)与**实时插话模式**(Agent 忙碌时新消息注入到当前轮次的下一步,默认关闭,设置页可开);
|
|
69
|
+
- **📊 运维看板与平滑升级**:系统 CPU / 内存 / Uptime 实时看板、网络连通性一键诊断、全局配置 JSON 导出恢复、npmmirror 极速版本检查与平滑重启。
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 📦 环境要求与安装
|
|
74
|
+
|
|
75
|
+
### 环境要求
|
|
76
|
+
|
|
77
|
+
1. **Node.js ≥ 22**(DSH 要求 `^22.19.0` 或 `≥ 24.0.0`)
|
|
78
|
+
2. **dsh CLI 可用**(能在终端直接运行 `dsh` 命令)
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# 检查 Node 版本
|
|
82
|
+
node -v # 应显示 v22.19+ 或 v24+
|
|
83
|
+
|
|
84
|
+
# 检查 dsh 是否可用
|
|
85
|
+
dsh --version
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### DSH 版本兼容性
|
|
89
|
+
|
|
90
|
+
本插件**同时兼容新旧 DSH**,无需按 DSH 版本挑选插件版本:
|
|
91
|
+
|
|
92
|
+
| DSH 版本 | 状态 |
|
|
93
|
+
| --- | --- |
|
|
94
|
+
| `0.1.0` ~ `0.1.1` | ✅ 支持(回环专用 RPC 通道加固) |
|
|
95
|
+
| `0.1.2` ~ `0.1.4` | ✅ 支持 |
|
|
96
|
+
| `0.1.5-alpha.1` ~ `0.1.5-rc.2` | ✅ 支持(v2.10.9 起) |
|
|
97
|
+
| `0.1.6` ~ `0.1.7` | ✅ 支持(v2.12.x 适配 0.1.7 存储格式与 grid 布局变更;0.1.6 旧存储布局有向后兼容回归用例) |
|
|
98
|
+
| `0.2.0-rc.2`(Web,profile `web`) | ✅ 支持(v2.12.4 起宿主 CSS-module 类名改为运行时解析,全部移动端 UI 验收在该版本通过) |
|
|
99
|
+
| 桌面版内置宿主 `0.2.0-rc.2`(profile `desktop`) | ✅ 支持(v2.12.4 修复桌面宿主上移动端设置页样式整片失效;**已实机验证**) |
|
|
100
|
+
|
|
101
|
+
> **关于 DSH 原生鉴权**:DSH 从 `0.1.2` 起为 `dsh web` 内置了浏览器鉴权——启动时会打印带一次性 token 的地址(`http://127.0.0.1:3080/?token=…`),换取一枚绑定回环地址的会话 cookie,此后 `/`、`/api` 及各插件 RPC 通道都要求该 cookie。
|
|
102
|
+
>
|
|
103
|
+
> 这与本插件的**访问密码门禁是两层互补的防护**,不冲突也不重复:原生鉴权保护的是"本机回环上的 DSH 进程",本插件的门禁保护的是"经局域网 / 公网隧道进入的远程访问"。本插件的反向代理会在转发时自动注入合法的回环会话 cookie,因此手机 / 隧道访问**无需**手动处理 DSH 的 `?token=`,按本页说明正常使用即可。
|
|
104
|
+
|
|
105
|
+
### 安装插件
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# 方式一:从 npm 安装最新版(推荐)
|
|
109
|
+
dsh plugin --profile web add @wenbin_wb/dsh-bridge
|
|
110
|
+
|
|
111
|
+
# 方式二:免全局权限的 npx 方式
|
|
112
|
+
npx --yes @deepseek-ai/dsh plugin --profile web add @wenbin_wb/dsh-bridge
|
|
113
|
+
|
|
114
|
+
# 方式三:从源码安装
|
|
115
|
+
git clone https://github.com/wenbin-wb/dsh-bridge.git
|
|
116
|
+
dsh plugin --profile web add ./dsh-bridge
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 升级至最新版
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# 方式一:在设置页「远程访问」底部点击「🚀 一键升级到最新版并重启」(推荐,全自动)
|
|
123
|
+
|
|
124
|
+
# 方式二:终端强制覆盖安装最新版
|
|
125
|
+
dsh plugin --profile web add @wenbin_wb/dsh-bridge@latest
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
> 💡 **提示(pnpm 11 用户)**:如果升级后仍显示旧版,是由于 pnpm 11 的 `minimumReleaseAge` 机制限制。在 Web 控制台点击「一键升级」即可自动跳过限制安装最新版。
|
|
129
|
+
|
|
130
|
+
### DSH Desktop 桌面版安装
|
|
131
|
+
|
|
132
|
+
桌面版(Electron 应用)运行在独立的 `desktop` profile 上,**与 Web 端是两套插件安装**,需单独安装:
|
|
133
|
+
|
|
134
|
+
* **方式一 · 图形界面(推荐)**:打开 **设置 → 插件 → 「+ 添加插件」** → 输入包名 `@wenbin_wb/dsh-bridge` → 国内网络可在「安装源」切换 **中国大陆镜像源** → 点击 **「安装」** → 完成后在左侧「已安装」列表确认插件已启用 → 通过**应用菜单重启 DeepSeek Harness** 后生效。
|
|
135
|
+
* **方式二 · 命令行**:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
dsh plugin --profile desktop add @wenbin_wb/dsh-bridge
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
<p align="center">
|
|
142
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/desktop-plugin-install.webp" width="700" alt="DSH Desktop 桌面版添加插件(① 输入包名 ② 选择镜像源 ③ 点击安装 ④ 确认已启用)" />
|
|
143
|
+
</p>
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 🚀 核心功能与使用指南
|
|
148
|
+
|
|
149
|
+
启动 DeepSeek Harness 后,在设置面板找到 **「远程访问」** 即可开启全部功能:
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
### 1. 🛜 局域网访问与多网卡智能切换
|
|
154
|
+
|
|
155
|
+
插件启动后**自动随服务开启**局域网代理,无需手动配置。
|
|
156
|
+
|
|
157
|
+
<p align="center">
|
|
158
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/lan-access.webp" width="600" alt="局域网扫码访问控制台" />
|
|
159
|
+
</p>
|
|
160
|
+
|
|
161
|
+
* **零配置极速扫码**:同一 Wi-Fi 下打开手机相机扫码即可直达移动端 Web 界面;
|
|
162
|
+
* **多网卡智能切换**:当主机存在多张网卡(如物理 Wi-Fi、以太网、WSL 虚拟网卡、VMware、Docker 等)时,控制台自动展示 **「🛜 局域网网卡 / IP 选择」** 下拉框;智能评分高亮推荐物理网卡,点选后二维码与访问 URL 秒级重新生成并**自动持久化保存**。
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
### 2. 🌐 公网隧道(Cloudflare 临时/固定域名 & 自建隧道)
|
|
167
|
+
|
|
168
|
+
无需公网 IP 与路由器端口映射,随时随地从外网访问电脑上的 DeepSeek Harness:
|
|
169
|
+
|
|
170
|
+
<p align="center">
|
|
171
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/tunnel-access.webp" width="600" alt="公网隧道配置控制台" />
|
|
172
|
+
</p>
|
|
173
|
+
|
|
174
|
+
- **模式 1:极速免登录临时隧道(默认)**
|
|
175
|
+
1. 直接点击「Cloudflare 隧道」卡片中的「开启」按钮;
|
|
176
|
+
2. 系统全自动准备 `cloudflared` 二进制(macOS 自动剥离 Gatekeeper 隔离属性与自愈校验);
|
|
177
|
+
3. 几秒内自动生成公网 URL 和二维码,点「重置链接」可随时换新。
|
|
178
|
+
|
|
179
|
+
- **模式 2:Cloudflare Token 固定域名(永久不变 · 免费)**
|
|
180
|
+
1. 在 [Cloudflare Zero Trust 控制台](https://one.dash.cloudflare.com/) 免费创建 Tunnel 并绑定域名(如 `dsh.yourdomain.com`)——**[📖 从零申请/配置完整教程](docs/cloudflare-fixed-domain.md)**(注册账号 → 接入域名 → 建隧道 → 取 Token → 绑定子域名 → 填回面板);
|
|
181
|
+
2. 展开卡片底部的 **「⚙️ 高级配置:固定域名 (Cloudflare Token)」**,填入自定义域名与 Tunnel Token 并保存;
|
|
182
|
+
3. 勾选 **「随 DSH 启动自动开启」**,每次 DSH 重启即可自动恢复隧道,**URL 永久固定不变**!
|
|
183
|
+
4. (可选)同一表单内可调整**网络参数**:协议(QUIC / HTTP/2)、边缘 IP(4 / 6 / 自动)、区域(美国 / 全球)——取值来自 Cloudflare 官方白名单,默认保持 cloudflared 默认行为;改动需重新开启隧道生效,当前二进制不支持的参数会自动跳过并告警;
|
|
184
|
+
|
|
185
|
+
- **模式 3:自建 WebSocket 隧道**
|
|
186
|
+
* 支持连接个人 VPS 隧道中转服务器([查看自建隧道部署教程](docs/custom-tunnel.md)),具备数据端到端 gzip 压缩与 SSE 响应优化。
|
|
187
|
+
|
|
188
|
+
- **📡 运行状态一眼看全**:卡片内 `数据面` 行 = 最近一次公网端到端探测(每 60s,含实际解析 IP,失败自动区分"回源失败"与"疑似 DNS 污染/伪造证书");`cloudflared` 行 = 实际使用的二进制路径 · 版本 · 来源(系统安装不参与版本钉死);若检测到另一个使用相同 Tunnel Token 的 cloudflared,会黄条提示"隧道状态可能只反映一半"。
|
|
189
|
+
|
|
190
|
+
> **自建隧道安全须知**:隧道服务端(`scripts/install-tunnel-server.sh`)只对「隧道客户端控制通道」校验 `TOKEN`;公网访客对隧道域名的 HTTP/WebSocket 转发**不再做独立认证**,安全完全依赖插件本地的「访问认证」(`x-dsh-internal-tunnel` 标识使隧道流量无法享受本机回环保留)。请务必在插件设置中开启「安全认证」并设置访问密码/二维码 Token(尤其 `scope=all` 或公网使用时);未设置任何密码时,任何知道隧道地址的访客都能直接访问您的 DSH。
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
### 3. 📱 移动端交互与 PWA 独立全屏 App
|
|
195
|
+
|
|
196
|
+
针对手机屏幕与触控操作进行深度优化,无需额外配置即可获得原生 App 级流畅体验:
|
|
197
|
+
|
|
198
|
+
- **极简顶栏布局**:保留左侧菜单抽屉与右侧快速新建会话,顶部动态居中显示当前会话标题;
|
|
199
|
+
- **原生侧边栏抽屉**:完整复用 DSH 原生历史记录与工作区分类,顶部集成原生 `[|` 收起图标,支持边缘滑动与手势开合;
|
|
200
|
+
- **PWA 原生全屏支持**:在手机浏览器菜单点击「添加到主屏幕」即可作为 100% 独立原生全屏 App 运行(无浏览器地址栏与底栏);
|
|
201
|
+
- **自适应防重叠排版**:底部工具栏根据屏幕宽度弹性自适应,彻底消除权限预设与模型选择器重叠碰撞。
|
|
202
|
+
|
|
203
|
+
#### 移动端对话与工作区管理体验
|
|
204
|
+
|
|
205
|
+
<p align="center">
|
|
206
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/remote-web-mobile.webp" width="23%" alt="移动端新会话主页" />
|
|
207
|
+
|
|
208
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/mobile-chat.webp" width="23%" alt="移动端已有对话交互" />
|
|
209
|
+
|
|
210
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/mobile-drawer.webp" width="23%" alt="移动端原生抽屉侧边栏" />
|
|
211
|
+
|
|
212
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/mobile-workspace-picker.webp" width="23%" alt="移动端远程工作区选择器" />
|
|
213
|
+
</p>
|
|
214
|
+
|
|
215
|
+
#### 远程访问与移动端设置中心
|
|
216
|
+
|
|
217
|
+
<p align="center">
|
|
218
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/mobile-settings-lan.webp" width="23%" alt="局域网访问控制台" />
|
|
219
|
+
|
|
220
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/mobile-settings-tunnel.webp" width="23%" alt="公网隧道配置" />
|
|
221
|
+
|
|
222
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/mobile-settings-im.webp" width="23%" alt="IM 机器人矩阵" />
|
|
223
|
+
|
|
224
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/mobile-settings-security.webp" width="23%" alt="全局访问安全认证" />
|
|
225
|
+
</p>
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
### 4. 🗂️ 远程工作区网页选择器
|
|
230
|
+
|
|
231
|
+
针对手机端或远程浏览器无法唤起本地电脑文件弹窗的痛点,内置响应式网页树形目录浏览器:
|
|
232
|
+
|
|
233
|
+
<p align="center">
|
|
234
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/mobile-workspace-picker.webp" width="380" alt="移动端远程工作区网页选择器" />
|
|
235
|
+
</p>
|
|
236
|
+
|
|
237
|
+
* **智能分流**:电脑本机访问(`127.0.0.1`)点击添加工作区直接呼出系统原生文件弹窗;手机或远程访问时自动弹出响应式底部目录抽屉;
|
|
238
|
+
* **极速直达**:支持 Windows 驱动器盘符(C盘、D盘)以及系统常用目录(桌面、文稿、下载、Projects)一键直达,支持层级深入浏览与手动输入校验。
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
### 5. 🔐 全域安全认证与防篡改门禁
|
|
243
|
+
|
|
244
|
+
打开设置页「远程访问」→「**安全认证**」Tab 即可一键启用全方位安全守护:
|
|
245
|
+
|
|
246
|
+
<p align="center">
|
|
247
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/security-auth-config.webp" width="600" alt="安全认证配置面板" />
|
|
248
|
+
</p>
|
|
249
|
+
|
|
250
|
+
#### 1. 🛡️ 第一道防线:外部访问门禁(保护谁能进 Web 界面)
|
|
251
|
+
- **多通道分流生效**:
|
|
252
|
+
- `全部通道开启防护`:局域网与所有公网隧道均需认证;
|
|
253
|
+
- `仅公网隧道开启防护 (推荐)`:局域网同一 Wi-Fi 内保持免密,暴露至公网的隧道强制开启认证门禁;
|
|
254
|
+
- `仅局域网开启防护`:仅对局域网进行门禁拦截。
|
|
255
|
+
- **三种灵活验证模式**:
|
|
256
|
+
- 🟢 **扫码免密 + 密码认证 (默认推荐)**:控制台生成的二维码已自动注入 256-bit 专属安全 Token,手机扫码即可免密秒进;直接在浏览器手动输入 IP 或公网域名的访客,需输入您设置的访客访问密码;
|
|
257
|
+
- 🔑 **仅密码 / PIN 码**:所有外部设备一律要求输入访问密码;
|
|
258
|
+
- 🎫 **仅专属 Token 免密**:仅允许通过控制台生成的二维码或带 Token 的专属链接进入。
|
|
259
|
+
- **一键轮换凭据**:点击「🔄 重置安全 Token」即可使之前分享的旧二维码和链接立即全部失效。
|
|
260
|
+
|
|
261
|
+
<details>
|
|
262
|
+
<summary>📱 点击展开外部访问安全认证登录页截图</summary>
|
|
263
|
+
<br/>
|
|
264
|
+
<p align="center">
|
|
265
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/remote-auth-login.webp" width="500" alt="外部访问安全认证登录页" />
|
|
266
|
+
</p>
|
|
267
|
+
</details>
|
|
268
|
+
|
|
269
|
+
#### 2. 🔒 第二道防线:管理后台防篡改(保护谁能改插件设置)
|
|
270
|
+
- **独立管理员密码**:访客访问密码与管理控制密码彻底分离,即使将访问密码告诉外部朋友,对方也无法查看或篡改您的插件设置;
|
|
271
|
+
- **三种后台权限策略**:
|
|
272
|
+
- 🔑 **需密码解锁 (默认推荐)**:远程设备进入控制台时全屏锁定,输入管理密码后解锁临时会话;
|
|
273
|
+
- 🛡️ **仅限电脑本机管理 (最高安全)**:远程设备一律禁止查看与修改任何网络、机器人配置与 Token,仅允许在电脑本机(`127.0.0.1`)操作;
|
|
274
|
+
- 🌐 **宽松模式**:允许通过访客认证的远程设备直接管理。
|
|
275
|
+
|
|
276
|
+
<details>
|
|
277
|
+
<summary>🖥️ 点击展开远程设备管理控制台防篡改锁定截图</summary>
|
|
278
|
+
<br/>
|
|
279
|
+
<p align="center">
|
|
280
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/admin-lock-screen.webp" width="500" alt="管理控制台防篡改锁定" />
|
|
281
|
+
</p>
|
|
282
|
+
</details>
|
|
283
|
+
|
|
284
|
+
#### 3. 🛟 三重容灾保命体系(永不自锁)
|
|
285
|
+
- **物理机免密直通**:运行 DSH 的宿主电脑(`127.0.0.1` / `localhost`)享有全局最高物理特权,**永不要求输入访问密码,设置面板永不会被锁定**;
|
|
286
|
+
- **服务器一键救急指令**:无头 Linux 服务器或极端忘记密码时,在宿主电脑终端执行单行命令:
|
|
287
|
+
```bash
|
|
288
|
+
touch ~/.dsh/dsh-bridge/reset-auth
|
|
289
|
+
```
|
|
290
|
+
插件将在**下次插件启动时**检测到该标记,自动清空密码与安全策略并删除标记,恢复初始免密状态(重启 DSH 或重载插件后生效);
|
|
291
|
+
- **全界面忘记密码指引**:访客登录页与锁屏页均提供 `❓ 忘记密码?` 救助展开卡片。
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
### 6. 🤖 全能 IM 机器人矩阵(微信 / QQ / 飞书 / Telegram)
|
|
296
|
+
|
|
297
|
+
无需打开浏览器,直接在常用聊天软件中与本地 Agent 对话、下达任务、接收进度与审批操作:
|
|
298
|
+
|
|
299
|
+
* **🔀 同平台多账号**:微信 / QQ / 飞书 / Telegram 均可在一台机器上并行挂**多个同平台机器人**(例如两个飞书自建应用「小鲸」「小秤」),凭证、人设、工作区、白名单与会话归属各自隔离;设置页「+ 添加账号」即可新增,单平台最多 10 个。详见 [同平台多账号指南](docs/multi-account.md)。
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
#### 🟢 微信 Bot(ClawBot / iLink)
|
|
304
|
+
|
|
305
|
+
基于腾讯官方开放的微信 ClawBot 插件功能(底层 iLink Bot API),扫码登录微信个人号后即可对话与审批,全程走腾讯官方服务器,无需公网与隧道。
|
|
306
|
+
|
|
307
|
+
<p align="center">
|
|
308
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/wechat-bot-config.webp" width="600" alt="微信 Bot 配置" />
|
|
309
|
+
</p>
|
|
310
|
+
|
|
311
|
+
<details>
|
|
312
|
+
<summary>📱 点击展开手机微信对话与审批截图</summary>
|
|
313
|
+
<br/>
|
|
314
|
+
<p align="center">
|
|
315
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/wechat-chat.webp" width="380" alt="微信对话示例" />
|
|
316
|
+
</p>
|
|
317
|
+
</details>
|
|
318
|
+
|
|
319
|
+
* **使用步骤**:设置页「远程访问」→「IM 机器人」→ 选中「微信」→ 点「扫码登录」并扫码确认 → 向该微信 Bot 发送第一条消息即**自动完成白名单授权**。完整文档见 [微信使用说明](docs/wechat-usage.md)。
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
#### 🐧 QQ Bot(官方 QQ 机器人 SDK)
|
|
324
|
+
|
|
325
|
+
接入 QQ 官方机器人,支持单聊与群聊(群聊需 @机器人),支持 C2C 流式输出、Markdown 渲染、审批/问答按钮键盘与富媒体文件直传。
|
|
326
|
+
|
|
327
|
+
底层已**全面接入腾讯官方 SDK**:协议层 [`@tencent-connect/qqbot-nodejs`](https://github.com/tencent-connect/qqbot-nodejs)(MIT)已**预打包进插件产物**,长连接/RESUME/重连、事件归一化、引用解析、去重限流、富媒体分片上传、`stream_messages` 流式全部由官方实现,本插件只做会话桥与业务映射。
|
|
328
|
+
|
|
329
|
+
> **扫码绑定为可选能力**:它依赖 [`@tencent-connect/qqbot-connector`](https://www.npmjs.com/package/@tencent-connect/qqbot-connector)(该包声明为 UNLICENSED,**不能随插件分发**)。插件已把它列为 optionalDependency,`npm i` 时通常会自动装上;若你的环境未装成功,面板会给出提示,**手动填写 AppID / AppSecret 同样可用**(协议层不受影响)。
|
|
330
|
+
|
|
331
|
+
<p align="center">
|
|
332
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/qq-bot-config.webp" width="600" alt="QQ Bot 配置" />
|
|
333
|
+
</p>
|
|
334
|
+
|
|
335
|
+
<details>
|
|
336
|
+
<summary>📱 点击展开手机 QQ 单聊与群聊对话截图</summary>
|
|
337
|
+
<br/>
|
|
338
|
+
<p align="center">
|
|
339
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/qq-chat.webp" width="48%" alt="QQ 单聊对话" />
|
|
340
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/qq-group.webp" width="48%" alt="QQ 群聊对话" />
|
|
341
|
+
</p>
|
|
342
|
+
</details>
|
|
343
|
+
|
|
344
|
+
* **使用步骤**:推荐在设置页点 **「📱 扫码绑定机器人」** 用手机 QQ 扫码,凭证由开放平台官方接口自动回传;也可在 [QQ 开放平台](https://q.qq.com) 创建机器人后手动填 AppID / AppSecret → 保存并连接 → 添加机器人好友发送首条消息(或群聊首次 @机器人)自动加白名单。完整文档见 [QQ Bot 使用说明](docs/qq-usage.md)。
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
#### 🐦 飞书 Bot(推荐 · 官方 Channel SDK)
|
|
349
|
+
|
|
350
|
+
底层已**全面接入飞书官方 Channel SDK**:长连接与自动重连、事件验签解密与归一化、消息渲染与分片、流式打字机卡片、媒体上传下载全部由官方实现(本插件不再自维护协议栈)。
|
|
351
|
+
接入门槛也降下来了——**不用进开发者后台逐项配置**:设置面板里**手机扫码即可一键创建应用**,权限、事件订阅与卡片回调自动预置;仍保留手动填写已有应用凭证的方式。长连接模式 **100% 免公网 IP / 免域名 / 免配置 Webhook**。
|
|
352
|
+
|
|
353
|
+
<p align="center">
|
|
354
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/feishu-bot-config.webp" width="600" alt="飞书扫码一键创建应用" />
|
|
355
|
+
</p>
|
|
356
|
+
|
|
357
|
+
<details>
|
|
358
|
+
<summary>📱 点击展开手机飞书对话与卡片审批截图</summary>
|
|
359
|
+
<br/>
|
|
360
|
+
<p align="center">
|
|
361
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/feishu-chat.webp" width="380" alt="飞书对话与卡片审批示例" />
|
|
362
|
+
</p>
|
|
363
|
+
</details>
|
|
364
|
+
|
|
365
|
+
* **🚀 扫码一键创建应用(推荐)**:设置面板点 **「📱 扫码一键创建应用」** → 手机飞书扫码确认,权限 / 事件订阅 / 卡片回调自动预置并连接,**全程无需进开发者后台**;扫码创建的应用按租户自动识别飞书 / Lark 域名。
|
|
366
|
+
* **⌨️ 原生斜杠指令面板**:连接后自动向飞书注册 `/help` `/new` `/sessions` `/use` `/status` `/diff` `/ask` 等 12 条指令,输入 `/` 即可从面板一键调用(需 PC 飞书 ≥ 7.70 / 移动端 ≥ 7.71;低版本直接手打指令同样可用)。
|
|
367
|
+
* **📄 云文档评论 @机器人**:在飞书文档/表格的评论里 @机器人 提问,回答直接回到该评论线程(同一线程追问免 @;评论为纯文本交互,无流式/卡片)。
|
|
368
|
+
* **🙋 回答 Agent 的提问**:Agent 需要你做个决定时(`ask_user_question` / 计划审批)会主动发到会话——选项卡片可直接点选(推荐项带 ⭐),也可文字回复(`/ask 1`、`/ask 1,3` 多选、`/ask =自由输入`、`/ask 1; 2=1` 多问分别作答);只在**本轮由该 IM 发起**时接管,绝不抢走 Web 端的提问。
|
|
369
|
+
* **👀 实时活动状态**:Agent 干活时卡片顶部显示它当前在做什么(`⌨️ 正在运行命令(npm test)`、`📝 正在编辑文件(…)`、`🤖 正在协调子智能体` 等,与 Web 端「思考 / 运行命令」同一套口径),用引用块+斜体与正文区分;卡片原地更新不刷屏,轮次结束自动消失(飞书 / Telegram);**默认关闭**,可在设置页勾选开启。
|
|
370
|
+
* **🛡 审批卡片原地更新**:点击批准/拒绝后卡片当场变结果态(显示决议者与发起人、超时/取消同样标出),不再补发重复文字。
|
|
371
|
+
* **使用步骤(已有应用)**:在 [飞书开放平台](https://open.feishu.cn/app) 创建企业自建应用并开启长连接接收事件 → 填入 App ID 与 App Secret 并连接。完整文档见 [飞书接入指南](docs/feishu-usage.md)。
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
#### ✈️ Telegram Bot(官方 Bot API + 代理支持)
|
|
376
|
+
|
|
377
|
+
接入 Telegram 官方 Bot API,单聊/群聊实时交互。采用官方 Long Polling(长轮询)机制,内置**零依赖 HTTP/HTTPS CONNECT 代理隧道**。
|
|
378
|
+
|
|
379
|
+
<p align="center">
|
|
380
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/telegram-bot-config.webp" width="600" alt="Telegram Bot 配置" />
|
|
381
|
+
</p>
|
|
382
|
+
|
|
383
|
+
* **使用步骤**:向 [@BotFather](https://t.me/BotFather) 发送 `/newbot` 创建机器人获取 **Bot Token** → 填入 Token(国内可填代理如 `http://127.0.0.1:7890`)并保存 → 发送第一条消息自动完成授权。完整文档见 [Telegram 使用说明](docs/telegram-usage.md)。
|
|
384
|
+
|
|
385
|
+
---
|
|
386
|
+
|
|
387
|
+
#### 统一 IM 交互指令表
|
|
388
|
+
|
|
389
|
+
| 指令 | 说明 |
|
|
390
|
+
| :--- | :--- |
|
|
391
|
+
| *(普通文本)* | 驱动当前活动 Agent 思考与编码 |
|
|
392
|
+
| `/sessions`(或 `/list`) | 列出所有历史会话(按工作区分组排版) |
|
|
393
|
+
| `/use N`(或 `/resume N`) | 切换到指定序号的会话 |
|
|
394
|
+
| `/rename <新标题>` | 重命名当前活动会话 |
|
|
395
|
+
| `/workspaces` | 列出已在 DSH 注册的所有工作区目录 |
|
|
396
|
+
| `/addworkspace <路径>` | 远程向电脑注册添加新的项目文件夹 |
|
|
397
|
+
| `/new <提示词>` | 在当前工作区创建并开始新会话 |
|
|
398
|
+
| `/new <提示词> @N` | 在指定工作区序号下直接新建会话 |
|
|
399
|
+
| `/stop` | 立即中断当前正在运行的任务 |
|
|
400
|
+
| `/end` | 结束并挂起当前会话上下文 |
|
|
401
|
+
| `/yes` / `/no` (或 `1`/`2`) | 响应敏感操作权限审批(或直接点击卡片按钮) |
|
|
402
|
+
| `/status` | 查看 Agent 状态与系统摘要看板 |
|
|
403
|
+
| `/help` | 查看完整的指令与快捷帮助 |
|
|
404
|
+
|
|
405
|
+
---
|
|
406
|
+
|
|
407
|
+
### 7. 📊 运维监控看板与一键平滑重启
|
|
408
|
+
|
|
409
|
+
打开控制台 **「运维监控」** Tab,实时掌控系统状态与一键维护:
|
|
410
|
+
|
|
411
|
+
<p align="center">
|
|
412
|
+
<img src="https://raw.githubusercontent.com/wenbin-wb/dsh-bridge/main/docs/screenshots/mobile-remote-settings.webp" width="380" alt="运维监控看板与系统状态" />
|
|
413
|
+
</p>
|
|
414
|
+
|
|
415
|
+
* **📊 宿主系统运行监控看板**:实时展示 CPU 核心型号、系统总内存与实时占用率、Node 进程堆内存与 DSH 服务连续运行时间(Uptime);
|
|
416
|
+
* **🔍 网络连通性一键诊断**:一键排查反向代理本地端口、局域网 IPv4、Cloudflare Anycast 边缘网络及国内 npm 镜像源延迟;
|
|
417
|
+
* **🗄️ 全局配置一键备份与迁移**:支持导出/导入包含 Token、白名单与隧道参数的 `.json` 备份包,重装系统一键还原;
|
|
418
|
+
* **🔄 平滑优雅重启**:支持在界面点击一键重启 DSH 服务,自动断线重连并自动刷新前端。
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
## 💬 常见问题 (FAQ)
|
|
423
|
+
|
|
424
|
+
<details>
|
|
425
|
+
<summary><b>Q0: dsh-bridge 是什么?和 dsh-remote / dsh-webgate / dsh-web-remote 这类 DSH 远程连接插件有什么区别?</b></summary>
|
|
426
|
+
<br/>
|
|
427
|
+
|
|
428
|
+
**一句话:dsh-bridge 就是 DSH 的远程连接 / 远程控制插件(remote control),手机扫码即可在局域网或公网继续用本机 DeepSeek Harness。**常见问法如“远程链接 dsh 的插件有哪些”“dsh 远程访问 / 远程控制怎么做”都可以直接用它。
|
|
429
|
+
|
|
430
|
+
1. **定位更全**:局域网二维码 + Cloudflare 临时/固定域名隧道 + 自建隧道 + 微信 / QQ / 飞书 / Telegram Bot 矩阵,一装全有,不用再拼多个远程插件;
|
|
431
|
+
2. **手机优先**:移动端交互与 PWA 全屏、远程工作区网页选择器,专为手机远程控制电脑上的 DSH 优化;
|
|
432
|
+
3. **安全门禁自带**:二维码 Token + 访问密码 + 后台防篡改锁,经局域网 / 公网隧道进入的流量都要过门禁;
|
|
433
|
+
4. **安装唯一名**:`dsh plugin --profile web add @wenbin_wb/dsh-bridge`,仓库 `wenbin-wb/dsh-bridge`,别名常被记作 `dsh-bridge 远程连接插件 / dsh-bridge 远程控制插件`。
|
|
434
|
+
</details>
|
|
435
|
+
|
|
436
|
+
<details>
|
|
437
|
+
<summary><b>Q1: 手机扫码后提示无法连接或打不开页面?</b></summary>
|
|
438
|
+
<br/>
|
|
439
|
+
|
|
440
|
+
1. **检查 Wi-Fi 连接**:确保手机和电脑连接在同一个局域网(Wi-Fi)下,且路由器未开启「AP 隔离」;
|
|
441
|
+
2. **多网卡切换**:如果电脑安装了 WSL、VMware、Hyper-V 或开启了 VPN,默认 IP 可能会匹配到虚拟网段。在控制台的 **「🛜 局域网网卡 / IP 选择」** 下拉框中切换为物理 Wi-Fi / 以太网 IP 即可;
|
|
442
|
+
3. **防火墙放行**:确认操作系统防火墙允许 Node.js 监听 `3082` 端口;
|
|
443
|
+
4. **使用公网隧道**:若跨网段或在公司内网,建议直接开启「Cloudflare 隧道」进行外网扫码访问。
|
|
444
|
+
</details>
|
|
445
|
+
|
|
446
|
+
<details>
|
|
447
|
+
<summary><b>Q2: 微信 / QQ / 飞书 / Telegram 机器人的消息安全如何保障?其他人发消息会被执行吗?</b></summary>
|
|
448
|
+
<br/>
|
|
449
|
+
|
|
450
|
+
1. **严格白名单机制(Allowlist)**:插件内置基于发件人 ID 的严格白名单。只有白名单内的授权用户消息才会驱动 Agent 执行;
|
|
451
|
+
2. **初次自动授权**:扫码或配置完成后,管理员向 Bot 发送第一条消息即自动完成白名单绑定;
|
|
452
|
+
3. **陌生消息静默阻断**:所有非白名单人员或群聊内非授权成员的消息均会被底层直接丢弃(Never fed to LLM),绝不消耗 Token 也不会触发任何本地指令。
|
|
453
|
+
</details>
|
|
454
|
+
|
|
455
|
+
<details>
|
|
456
|
+
<summary><b>Q3: Cloudflare 隧道临时域名与固定域名(Token 模式)有什么区别?</b></summary>
|
|
457
|
+
<br/>
|
|
458
|
+
|
|
459
|
+
1. **临时免登录模式(默认)**:无需 Cloudflare 账号,一键开启即刻生成 `https://*.trycloudflare.com` 随机临时网址,适合外出时临时连接;
|
|
460
|
+
2. **固定域名模式(Token 模式)**:在 Cloudflare Zero Trust 控制台创建 Named Tunnel 并填入 Token,可绑定您自己的专属固定域名(如 `dsh.yourdomain.com`)。开启「随 DSH 启动自动开启」后,重启电脑或服务域名永久固定不变。
|
|
461
|
+
</details>
|
|
462
|
+
|
|
463
|
+
<details>
|
|
464
|
+
<summary><b>Q4: 插件升级或重启 DSH 服务后,已有配置和聊天会话会丢失吗?</b></summary>
|
|
465
|
+
<br/>
|
|
466
|
+
|
|
467
|
+
1. **配置永久持久化**:所有 IM 凭证、授权白名单、公网隧道选项与安全密码均保存在系统主目录(`~/.dsh-bridge/`),升级与重启完全无损;
|
|
468
|
+
2. **会话无感恢复**:会话历史由 DSH 核心引擎持久化管理,重启后在聊天软件中发送消息或使用 `/resume` 命令即可自动恢复上下文;
|
|
469
|
+
3. **一键备份迁移**:支持在「运维监控」Tab 内一键导出全局配置 `.json` 文件,方便跨设备迁移。
|
|
470
|
+
</details>
|
|
471
|
+
|
|
472
|
+
---
|
|
473
|
+
|
|
474
|
+
## 🛠️ 开发与贡献
|
|
475
|
+
|
|
476
|
+
欢迎提交 Issue 与 Pull Request 共同完善插件!
|
|
477
|
+
|
|
478
|
+
```bash
|
|
479
|
+
# 1. 克隆代码仓库
|
|
480
|
+
git clone https://github.com/wenbin-wb/dsh-bridge.git
|
|
481
|
+
cd dsh-bridge
|
|
482
|
+
|
|
483
|
+
# 2. 安装依赖并启动构建
|
|
484
|
+
npm install
|
|
485
|
+
npm run build:client
|
|
486
|
+
|
|
487
|
+
# 3. 运行全量单元测试
|
|
488
|
+
npm test
|
|
489
|
+
|
|
490
|
+
# 4. 安装到本地 DSH Web Profile 进行联调
|
|
491
|
+
dsh plugin --profile web add .
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
---
|
|
495
|
+
|
|
496
|
+
## ⭐ Star History
|
|
497
|
+
|
|
498
|
+
<a href="https://www.star-history.com/?repos=wenbin-wb%2Fdsh-bridge&type=date&legend=top-left">
|
|
499
|
+
<picture>
|
|
500
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=wenbin-wb/dsh-bridge&type=date&theme=dark&legend=top-left" />
|
|
501
|
+
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/chart?repos=wenbin-wb/dsh-bridge&type=date&legend=top-left" />
|
|
502
|
+
<img alt="Star History Chart" src="https://api.star-history.com/chart?repos=wenbin-wb/dsh-bridge&type=date&legend=top-left" />
|
|
503
|
+
</picture>
|
|
504
|
+
</a>
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
508
|
+
## 📄 开源协议
|
|
509
|
+
|
|
510
|
+
本项目基于 [MIT 许可证](LICENSE) 开源发布。
|
package/client/build.mjs
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// dsh-bridge 客户端打包:client/index.js → client/client.js
|
|
2
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { readFileSync } from 'node:fs';
|
|
4
|
+
import { dirname, resolve } from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { build } from 'esbuild';
|
|
7
|
+
|
|
8
|
+
const sourceDir = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const packageRoot = resolve(sourceDir, '..');
|
|
10
|
+
const outputPath = resolve(packageRoot, 'client/client.js');
|
|
11
|
+
// loaderId 必须与 package.json 的 name 一致(DSH 用它来验证 bundle 注册)
|
|
12
|
+
const loaderId = JSON.parse(readFileSync(resolve(packageRoot, 'package.json'), 'utf8')).name;
|
|
13
|
+
|
|
14
|
+
const result = await build({
|
|
15
|
+
entryPoints: [resolve(sourceDir, 'index.js')],
|
|
16
|
+
bundle: true,
|
|
17
|
+
format: 'cjs',
|
|
18
|
+
platform: 'browser',
|
|
19
|
+
target: ['chrome100'],
|
|
20
|
+
external: ['react', 'react/jsx-runtime'],
|
|
21
|
+
write: false,
|
|
22
|
+
minify: process.env.NODE_ENV === 'production',
|
|
23
|
+
legalComments: 'none',
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const bundled = result.outputFiles?.[0]?.text;
|
|
27
|
+
if (!bundled) throw new Error('esbuild did not produce a client bundle');
|
|
28
|
+
|
|
29
|
+
const wrapped = `window.__ModuleLoader__.load({
|
|
30
|
+
id: ${JSON.stringify(loaderId)},
|
|
31
|
+
factory: (require) => {
|
|
32
|
+
var module = { exports: {} };
|
|
33
|
+
var exports = module.exports;
|
|
34
|
+
var React = require("react");
|
|
35
|
+
${bundled}
|
|
36
|
+
return module.exports;
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
`;
|
|
40
|
+
|
|
41
|
+
await mkdir(dirname(outputPath), { recursive: true });
|
|
42
|
+
await writeFile(outputPath, wrapped, 'utf8');
|
|
43
|
+
console.log(`Wrote ${outputPath}`);
|