@wenbin_wb/dsh-bridge 2.11.3 → 2.12.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.
Files changed (43) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.en.md +25 -25
  3. package/README.md +25 -25
  4. package/client/client.js +49 -2
  5. package/client/index.js +54 -4
  6. package/lib/bridge-rpc-constants.js +2 -0
  7. package/lib/bridge-rpc.js +33 -2
  8. package/lib/index.js +192 -11
  9. package/lib/platform/conversation-bridge.js +21 -6
  10. package/lib/platform/dsh-storage.js +64 -10
  11. package/package.json +4 -5
  12. package/docs/CODE_REVIEW.md +0 -220
  13. package/docs/banner.jpg +0 -0
  14. package/docs/cloudflare-fixed-domain.md +0 -158
  15. package/docs/custom-tunnel.md +0 -220
  16. package/docs/feishu-usage.md +0 -116
  17. package/docs/qq-usage.md +0 -387
  18. package/docs/release-process.md +0 -45
  19. package/docs/screenshots/admin-lock-screen.jpg +0 -0
  20. package/docs/screenshots/feishu-bot-config.jpg +0 -0
  21. package/docs/screenshots/feishu-chat.jpg +0 -0
  22. package/docs/screenshots/lan-access.jpg +0 -0
  23. package/docs/screenshots/mobile-chat.jpg +0 -0
  24. package/docs/screenshots/mobile-drawer.jpg +0 -0
  25. package/docs/screenshots/mobile-remote-settings.jpg +0 -0
  26. package/docs/screenshots/mobile-settings-im.jpg +0 -0
  27. package/docs/screenshots/mobile-settings-lan.jpg +0 -0
  28. package/docs/screenshots/mobile-settings-security.jpg +0 -0
  29. package/docs/screenshots/mobile-settings-tunnel.jpg +0 -0
  30. package/docs/screenshots/mobile-workspace-picker.jpg +0 -0
  31. package/docs/screenshots/qq-bot-config.jpg +0 -0
  32. package/docs/screenshots/qq-chat.jpg +0 -0
  33. package/docs/screenshots/qq-group.jpg +0 -0
  34. package/docs/screenshots/qr-scan.jpg +0 -0
  35. package/docs/screenshots/remote-auth-login.jpg +0 -0
  36. package/docs/screenshots/remote-web-mobile.jpg +0 -0
  37. package/docs/screenshots/security-auth-config.jpg +0 -0
  38. package/docs/screenshots/telegram-bot-config.jpg +0 -0
  39. package/docs/screenshots/tunnel-access.jpg +0 -0
  40. package/docs/screenshots/wechat-bot-config.jpg +0 -0
  41. package/docs/screenshots/wechat-chat.jpg +0 -0
  42. package/docs/telegram-usage.md +0 -93
  43. package/docs/wechat-usage.md +0 -104
@@ -1,116 +0,0 @@
1
- # 飞书 (Feishu / Lark) 机器人接入指南
2
-
3
- > 通过飞书官方开放平台 **WebSocket 长连接(免公网 IP)** 模式,将本地 DeepSeek Harness 接入飞书,支持单聊、群聊、表格命令与原生交互卡片权限审批。
4
-
5
- ---
6
-
7
- ## 🌟 核心优势
8
-
9
- - **100% 免公网 IP**:基于飞书官方最新 WebSocket 长连接协议,无需配置公网服务器、无需域名、无需内网穿透工具。
10
- - **免验签与加密配置**:长连接由飞书官方 SDK 在建立通道时完成认证,无需开发者手动处理 HTTP 回调验签。
11
- - **飞书原生交互卡片**:Agent 触发敏感工具审批时,飞书端下发带点击按钮的交互卡片,手机/电脑端单手一键点击即可完成批准或拒绝。
12
- - **多工作区与会话持久化**:支持 `/sessions` 表格查看历史会话、`/use <序号>` 极速切换、`/workspaces` 工作区调度。
13
-
14
- ---
15
-
16
- ## 🛠️ 第一步:创建飞书企业自建应用
17
-
18
- 1. 登录 [飞书开放平台开发者后台](https://open.feishu.cn/app);
19
- 2. 点击右上角 **「创建企业自建应用」**,填写应用名称(如 `DeepSeek Harness`)与应用描述,上传机器人头像;
20
- 3. 创建完成后,在左侧导航栏点击 **「凭证与基础信息」**,即可查看到:
21
- - **App ID**(格式如 `cli_a1b2c3d4...`)
22
- - **App Secret**(点击复制密钥)
23
-
24
- ---
25
-
26
- ## 🤖 第二步:添加机器人能力
27
-
28
- 1. 在应用详情页左侧导航栏,点击 **「添加应用能力」**;
29
- 2. 找到 **「机器人」**,点击 **「添加」** 开启机器人能力。
30
-
31
- ---
32
-
33
- ## 🔐 第三步:开通必要权限
34
-
35
- 在左侧导航栏点击 **「权限管理」**,搜索并开通以下权限:
36
-
37
- | 权限名称 | 权限 Key | 权限说明 |
38
- | :--- | :--- | :--- |
39
- | **获取与发送单聊/群聊消息** | `im:message` | 基础消息收发权限 |
40
- | **以应用的身份发消息** | `im:message:send_as_bot` | 允许机器人向用户/群回复消息 |
41
- | **获取群组中所有消息** | `im:message.group_msg` | 允许机器人在群聊中被 `@` 时接收消息 |
42
- | **获取用户 user ID** | `contact:user.id:readonly` | (可选) 获取用户信息 |
43
-
44
- ---
45
-
46
- ## ⚡ 第四步:开启 WebSocket 长连接事件订阅
47
-
48
- 1. 在左侧导航栏点击 **「事件与回调」**;
49
- 2. 在 **「事件配置」** 页面,将事件接收方式切换为 **「使用长连接接收事件」**(WebSocket 模式);
50
- 3. 点击 **「添加事件」**,勾选并添加:
51
- - **`im.message.receive_v1`**(接收消息)
52
- - **`card.action.trigger`**(消息卡片回传交互 / 审批按钮点击)
53
- 4. 保存配置。
54
-
55
- ---
56
-
57
- ## 🚀 第五步:版本发布
58
-
59
- 1. 在左侧导航栏点击 **「版本管理与发布」**;
60
- 2. 点击 **「创建版本」**,填写版本号(如 `1.0.0`),设置应用可用范围(如「所有员工」或「仅自己」);
61
- 3. 点击 **「申请发布」**(自建应用通常由企业管理员直接免审或一键通过)。
62
-
63
- ---
64
-
65
- ## 📱 第六步:在 DSH 客户端中连接
66
-
67
- 1. 打开 DeepSeek Harness,进入「设置」➔「远程访问」➔「IM 机器人」➔ 选择 **「飞书」**;
68
- 2. 在表单中填入刚才复制的 **App ID** 和 **App Secret**;
69
- 3. 点击 **「保存并连接」**;
70
- 4. 状态显示为绿色 **「已连接」** 即表示长连接成功建立!
71
-
72
- ![飞书机器人配置](screenshots/feishu-bot-config.jpg)
73
-
74
- ---
75
-
76
- ## 💬 常用操作与指令
77
-
78
- 在飞书与机器人单聊或在群里 `@机器人` 即可开始对话:
79
-
80
- ### 1. 会话与工作区管理
81
- | 指令 | 说明 | 示例 |
82
- | :--- | :--- | :--- |
83
- | `/sessions` | 查看所有历史会话表格 | `/sessions` 或 `/list` |
84
- | `/use <编号>` | 切换到指定编号会话 | `/use 1` 或 `/resume 1` |
85
- | `/new <提示词>` | 在当前工作区创建新会话并开始 | `/new 帮我写个脚本` |
86
- | `/new <词> @N` | 在指定工作区新建会话 | `/new 帮我写个脚本 @1` |
87
- | `/rename <新标题>` | 重命名当前活动会话 | `/rename 优化登录交互` |
88
- | `/workspaces` | 查看所有已注册的工作区列表 | `/workspaces` |
89
- | `/addworkspace <路径>` | 注册添加新的电脑工作区目录 | `/addworkspace D:\projects\app` |
90
- | `/status` | 查看 Agent 运行状态看板 | `/status` |
91
- | `/stop` | 中断停止当前正在执行的任务 | `/stop` |
92
- | `/end` | 结束当前会话回到空闲状态 | `/end` |
93
-
94
- ### 2. 权限审批交互
95
- 当 Agent 尝试执行需授权的操作(如终端命令、写敏感文件)时,飞书端会自动推送 **原生交互卡片**:
96
- - 点击卡片上的 **「✓ 批准执行」** 或 **「✕ 拒绝执行」** 按钮即可一键处理;
97
- - 亦可直接回复文字 `/yes` (或 `1`) / `/no` (或 `2`)。
98
-
99
- ![飞书对话与卡片审批](screenshots/feishu-chat.jpg)
100
-
101
- ---
102
-
103
- ## ❓ 常见问题 (FAQ)
104
-
105
- ### Q1: 点击卡片上的「批准」/「拒绝」按钮提示无权限或无反应?
106
- 请依次核对以下三项飞书开放平台配置:
107
- 1. **是否订阅了卡片交互事件**:在开放平台后台 **「事件与回调」➔「事件配置」** 中,必须添加 **`card.action.trigger`**(消息卡片回传交互)事件。若只添加了接收消息事件,卡片点击不会下发回调。
108
- 2. **是否发布了新版本生效**:飞书平台的所有权限与事件变更,**必须在「版本管理与发布」中「创建版本」并申请发布通过后才会生效**。
109
- 3. **应用可用范围**:在「版本管理与发布」中,确认应用可用范围包含了您当前的飞书账号(建议设为「所有员工」或将自己加入可用成员)。
110
- 4. **快速应急处理**:如果卡片按钮暂时受网络或配置影响,可直接在聊天中回复文字 **`/yes`**(或 `1`)批准,回复 **`/no`**(或 `2`)拒绝。
111
-
112
- ### Q2: 机器人无法在群聊中回复消息?
113
- 1. 确保在「权限管理」中开通了 **`im:message.group_msg`**(获取群组中所有消息)权限;
114
- 2. 确保在「版本管理与发布」中发布了包含该权限的新版本;
115
- 3. 将机器人拉入群聊后,需要 **`@机器人`** 唤醒并发送指令。
116
-
package/docs/qq-usage.md DELETED
@@ -1,387 +0,0 @@
1
- # QQ Bot 使用指南
2
-
3
- 本文档介绍如何接入 QQ Bot OpenAPI v2,实现私聊、群聊、流式输出、按钮交互、消息引用和富媒体消息。
4
-
5
- ## ✨ v2.1.1 新特性
6
-
7
- - **🚀 流式消息输出**:长文本自动分段推送(200字符/段),实时看到 AI 输出
8
- - **💬 消息引用交互**:直接回复机器人消息即可继续对话,无需输入命令
9
- - **🔘 按钮快捷操作**:无活动会话时自动显示快捷按钮(新建会话/列表/帮助)
10
- - **⚡ 互动事件支持**:按钮点击自动映射到对应命令
11
-
12
- ## 前置准备
13
-
14
- ### 1. 创建 QQ 机器人
15
-
16
- 访问 [QQ 开放平台](https://q.qq.com/) 创建机器人应用:
17
-
18
- 1. 登录并进入"机器人管理"
19
- 2. 点击"创建机器人",填写基本信息
20
- 3. 创建完成后获取 **AppID** 和 **ClientSecret**(开发设置 → 开发信息)
21
- 4. 配置机器人权限:
22
- - 私域机器人:可接收私聊和群聊消息
23
- - 需要开通"发送消息"、"接收消息"等基础权限
24
-
25
- ### 2. 配置事件订阅
26
-
27
- QQ Bot 使用 WebSocket 接收事件,需要配置 Intents(事件订阅):
28
-
29
- - **C2C_MESSAGE_CREATE**(私聊消息):`1 << 25`
30
- - **GROUP_AT_MESSAGE_CREATE**(群聊 @提及):`1 << 25`(与私聊同属 `GROUP_AND_C2C_EVENT`)
31
- - **INTERACTION_CREATE**(互动事件):`1 << 26`
32
-
33
- > dsh-bridge 默认已开启以上三个 intents,支持私聊、群聊和按钮交互,无需额外配置。
34
-
35
- ## 快速开始
36
-
37
- ### 1. 启动 dsh-bridge
38
-
39
- ```bash
40
- # 安装最新版本
41
- npm install -g @wenbin_wb/dsh-bridge@latest
42
-
43
- # 启动服务
44
- dsh web
45
- ```
46
-
47
- 访问 `http://127.0.0.1:3080`,在平台选择器中选择"QQ"。
48
-
49
- ### 2. 配置 QQ Bot 凭证
50
-
51
- 在"未配置"区域填写:
52
-
53
- - **AppID**:QQ 开放平台应用的 AppID
54
- - **ClientSecret**:应用的 ClientSecret(密钥不会回传浏览器,留空表示沿用已保存密钥)
55
-
56
- 点击"保存并连接",系统会自动:
57
- 1. 保存凭证到 `$DSH_HOME/dsh-bridge/config.json`
58
- 2. 获取 Access Token(自动刷新,TTL 7200s)
59
- 3. 连接 WebSocket Gateway
60
- 4. 开始接收消息事件
61
-
62
- ### 3. 配置白名单
63
-
64
- 保存凭证后,在"高级设置"中添加允许的用户/群组 ID:
65
-
66
- - **私聊**:用户的 `user_openid`(形如 `11112222333344445555AAAAAAAAAAAA`)
67
- - **群聊**:群组的 `group_openid`(形如 `1A2B3C4D5E6F7890ABCDEFABCDEFABCD`)
68
-
69
- > **如何获取 OpenID**:
70
- > 1. 先不设置白名单,用户/群组发送消息后查看日志
71
- > 2. 日志中会显示"未在白名单中,已忽略",复制其中的 OpenID
72
- > 3. 将 OpenID 添加到白名单并保存
73
-
74
- ### 4. 开始对话
75
-
76
- #### 私聊场景
77
-
78
- 1. 在 QQ 中搜索并添加你的机器人为好友
79
- 2. 发送任意消息,机器人会回复带按钮的欢迎提示:
80
- - 🆕 **新建会话**:创建新的 AI 对话
81
- - 📋 **会话列表**:查看所有可用会话
82
- - ❓ **帮助**:显示命令帮助
83
- 3. 点击「新建会话」按钮开始对话
84
- 4. 或者直接回复机器人的任何消息,自动创建新会话并继续对话
85
-
86
- #### 群聊场景
87
-
88
- 1. 将机器人拉入 QQ 群
89
- 2. 在群内 @机器人 并发送消息(例如:`@机器人 你好`)
90
- 3. 机器人会响应并提供快捷按钮
91
- 4. 后续可以:
92
- - 点击按钮快捷操作
93
- - 回复机器人的消息继续对话
94
- - @机器人 发送新消息
95
-
96
- ### 5. 流式输出与输入状态
97
-
98
- #### 流式输出(单聊全回复流式 Markdown)
99
-
100
- **单聊中所有 AI 回复统一走流式接口**,手机端实时看到消息逐段增长,且 Markdown 正常渲染:
101
-
102
- - **流式**:使用官方 `/stream_messages`(下划线)接口 + `replace` 覆盖模式(官方推荐),每片是全量前缀,服务端逐片覆盖 → 一条消息逐渐变长
103
- - **Markdown**:流式内容用 `content_type: markdown`,手机端正常渲染粗体/代码块/列表等,不再显示原始语法
104
- - **分段**:按段落边界切分,短消息自动拆两片保证"生成中→生成结束"过渡;每片带递增 `msg_seq` 避免去重
105
- - **安全转换**:QQ 不支持的表格自动降级为纯文本,`![图片]()` 转成链接,代码块内容原样保留
106
- - **回退**:流式失败时补发完整内容 replace 收尾,再失败降级「主动 Markdown」,确保消息必达
107
- - **群聊**:官方不支持群消息流式,群聊回复直接发送 Markdown
108
-
109
- #### 输入状态指示
110
-
111
- AI 生成过程中,QQ 会显示机器人的"正在输入"状态:
112
-
113
- - **实现方式**:普通消息接口 `msg_type: 6` + `input_notify`
114
- - **参数**:`input_notify: { input_type: 1, input_second: 8 }`(最长 60 秒)
115
- - **自动管理**:收到用户消息后、发送回复前自动显示"正在输入"
116
- - **API 文档**:[发送单聊消息](https://bot.q.qq.com/wiki/develop/api-v2/autogen/api/v2_users_user_openid_messages.post.html)
117
-
118
- ### 6. 指令面板与自定义菜单(v2.2.0)
119
-
120
- 连接成功后,dsh-bridge 会自动为你的机器人配置:
121
-
122
- > **⚠️ 重要提示**(2026-08-20 确认):
123
- > - **自定义菜单、指令面板、消息按钮是 2026-08-12 刚上线的新功能**([官方变更记录](https://bot.qq.com/wiki/develop/api-v2/changelog.html))
124
- > - **需要最新版 QQ 客户端**才能显示(手机版 QQ 优先支持新功能,桌面版可能延后)
125
- > - 若 API 配置成功(`PUT /v2/menu` 返回 version、`GET /v2/panels` 有 records)但客户端不显示,是**正常现象**——更新 QQ 到最新版再试
126
- > - 功能可能在**灰度期**,未全量开放;无权限时纯文字命令(`/new` `/sessions` `/help`)仍完全可用
127
-
128
- #### 指令面板(单聊 + 群聊常驻)
129
-
130
- 在单聊窗口和群聊中常驻显示命令面板,点击即可填入命令:
131
-
132
- | 面板项 | 说明 |
133
- |--------|------|
134
- | `/new` | 新建对话 |
135
- | `/list` | 查看会话列表 |
136
- | `/resume` | 恢复会话 |
137
- | `/sessions` | 切换会话 |
138
- | `/help` | 命令帮助 |
139
-
140
- 面板按 `c2c`(单聊)和 `group`(群聊)两个场景各创建一个全局面板,幂等创建(不会重复)。
141
-
142
- #### 自定义菜单(单聊底部)
143
-
144
- 单聊窗口底部常驻菜单,点击自动填入命令:
145
-
146
- - **新建** → 自动填入 `/new`
147
- - **列表** → 自动填入 `/list`
148
- - **帮助** → 自动填入 `/help`
149
-
150
- > 相关 API 文档:
151
- > - [自定义菜单与指令面板](https://bot.q.qq.com/wiki/develop/api-v2/server-inter/menu-panel/)
152
- > - [创建指令面板](https://bot.q.qq.com/wiki/develop/api-v2/autogen/api/v2_panels.post.html)
153
- > - [修改全局自定义菜单](https://bot.q.qq.com/wiki/develop/api-v2/autogen/api/v2_menu.put.html)
154
-
155
- ## 功能特性
156
-
157
- ### 交互方式
158
-
159
- #### 1. 快捷按钮(推荐)
160
-
161
- 当没有活动会话时,机器人会自动发送带按钮的提示:
162
-
163
- - **🆕 新建会话**:点击后立即创建新的 AI 对话
164
- - **📋 会话列表**:查看所有可用会话及其编号
165
- - **❓ 帮助**:显示所有可用命令
166
-
167
- 按钮点击会触发 `INTERACTION_CREATE` 事件,自动映射到对应命令。
168
-
169
- #### 2. 消息引用(最便捷)
170
-
171
- 直接回复机器人的任何消息,自动关联到对应会话:
172
-
173
- 1. 机器人发送回复
174
- 2. 你使用 QQ 的"引用回复"功能回复该消息
175
- 3. 如果没有活动会话,自动创建新会话
176
- 4. 你的消息会发送到 AI,无需输入 `/new` 等命令
177
-
178
- > **提示**:这是最自然的交互方式,就像正常聊天一样。
179
-
180
- #### 3. 文本命令(兼容性)
181
-
182
- 所有操作都支持传统文本命令:
183
-
184
- - `/new <提示词>` - 新建会话并开始
185
- - `/sessions`(或 `/list`)- 列出所有会话(按工作区分组)
186
- - `/use N`(或 `/resume N`)- 切换到/恢复会话 N
187
- - `/rename <新标题>` - 重命名当前活动会话
188
- - `/end` - 结束当前会话(清除活动会话并触发快捷按钮)
189
- - `/stop` - 停止当前任务
190
- - `/status` - 查看状态与会话摘要
191
- - `/workspaces` - 列出可用工作区
192
- - `/addworkspace <路径>` - 注册添加新的电脑工作区目录
193
- - `/help` - 显示帮助
194
-
195
- ### 支持的消息类型
196
-
197
- | 类型 | 方法 | 说明 |
198
- |------|------|------|
199
- | 文本消息 | `sendText(scope, text)` | 纯文本消息 |
200
- | 流式消息 | `sendStream(scope, text, opts)` | 长文本自动分段推送(200字符/段) |
201
- | Markdown | `sendMarkdown(scope, markdown, keyboard)` | 支持 Markdown 格式 + 可选按钮 |
202
- | 按钮键盘 | `sendKeyboard(scope, text, keyboard)` | 文本 + 按钮组(行内按钮) |
203
- | 富媒体 | `sendMedia(scope, type, buffer, filename)` | 图片/视频/音频/文件上传 |
204
-
205
- ### 流式消息示例
206
-
207
- ```javascript
208
- // 发送长文本,自动分段推送
209
- await gateway.sendStream(
210
- 'u_11112222333344445555AAAAAAAAAAAA', // user_openid
211
- '这是一段很长的 AI 回复内容...',
212
- { msgId: 'parent_msg_id' } // 可选:关联到某条消息
213
- )
214
- // 自动分段为 200 字符/段,每段间隔 100ms
215
- ```
216
-
217
- ### Markdown 示例
218
-
219
- ```javascript
220
- await gateway.sendMarkdown(
221
- 'u_11112222333344445555AAAAAAAAAAAA', // user_openid
222
- '# 标题\n**粗体** *斜体* `代码`\n[链接](https://example.com)',
223
- {
224
- content: {
225
- rows: [
226
- {
227
- buttons: [
228
- { id: '1', render_data: { label: '选项 A', style: 1 }, action: { type: 2, data: '/cmd_a' } },
229
- { id: '2', render_data: { label: '选项 B', style: 0 }, action: { type: 2, data: '/cmd_b' } }
230
- ]
231
- }
232
- ]
233
- }
234
- }
235
- )
236
- ```
237
-
238
- ### 按钮交互
239
-
240
- 按钮类型(`action.type`):
241
- - `0` — 跳转按钮(`action.data` 为 URL)
242
- - `1` — 回调按钮(触发 `INTERACTION_CREATE` 事件)✅ dsh-bridge 快捷按钮使用此类型
243
- - `2` — 指令按钮(用户点击后自动发送 `action.data` 作为消息)
244
-
245
- 按钮样式(`render_data.style`):
246
- - `0` — 灰色线框(次要操作)
247
- - `1` — 蓝色线框(主要操作)
248
-
249
- > **按钮结构(v2.2.4 对齐官方)**:`keyboard.content.rows`(含 `content` 包裹层),按钮必填 `render_data.style` / `action.data` / `action.unsupport_tips`。快捷按钮基于 `msg_type=2`(Markdown)挂载。
250
-
251
- > **v2.2.4 互动事件处理**:仅消息按钮(type=11)与快捷菜单(type=12)需要调用 `PUT /interactions/{id}` 回应;其他类型(消息反馈/清空会话/授权等)无需回应。点击快捷按钮会自动映射到对应命令(如 `/new`、`/list`、`/help`)。
252
-
253
- ### 富媒体上传
254
-
255
- ```javascript
256
- // 发送图片
257
- const imageBuffer = fs.readFileSync('image.png')
258
- await gateway.sendMedia(
259
- 'g_1A2B3C4D5E6F7890ABCDEFABCDEFABCD', // group_openid
260
- 'image', // image | video | audio | file
261
- imageBuffer,
262
- 'screenshot.png'
263
- )
264
- ```
265
-
266
- 支持的媒体类型:
267
- - `image` — 图片(PNG/JPG/GIF,< 10MB)
268
- - `video` — 视频(MP4,< 50MB)
269
- - `audio` — 音频(MP3/WAV,< 10MB)
270
- - `file` — 文件(任意类型,< 20MB)
271
-
272
- ## 高级配置
273
-
274
- ### 会话管理
275
-
276
- 在 UI 的"高级设置"中配置:
277
-
278
- - **摘要间隔**(`digestIntervalSec`,默认 300s):多久向 Agent 发送一次历史消息摘要
279
- - ✅ **微信**:生效
280
- - ✅ **QQ**:生效
281
- - **审批超时**(`approvalTimeoutSec`,默认 600s):等待用户审批的最长时间
282
- - ✅ **微信**:生效
283
- - ✅ **QQ**:生效
284
- - **每条最大字数**(`maxMessageChars`,默认 2000):单条流式消息最大字符数,超出会拆成多条
285
- - ✅ **微信**:生效(超出拆分为多条普通文本消息,间隔 `sendChunkDelayMs`)
286
- - ✅ **QQ**:生效(v2.2.2+ 修复,超出拆分为多片流式消息,每片按此配置切分)
287
- - **分块延迟**(`sendChunkDelayMs`,默认 1500ms):多条消息之间的延迟,避免刷屏
288
- - ✅ **微信**:生效(拆分的多条普通文本消息间隔)
289
- - ✅ **QQ**:生效(v2.2.2+ 修复,流式消息多片间隔)
290
-
291
- ### Token 自动刷新
292
-
293
- Access Token 有效期为 7200 秒(2 小时),dsh-bridge 会在过期前 5 分钟自动刷新,无需手动处理。
294
-
295
- ### 消息去重
296
-
297
- WebSocket 可能收到重复消息(如网络抖动、重连),Gateway 使用 `msg_id` 去重(TTL 300s),确保同一消息不会被处理多次。
298
-
299
- ### 断线重连
300
-
301
- Gateway 实现指数退避重连策略:
302
- - 初始延迟:1s
303
- - 最大延迟:60s
304
- - 每次失败后延迟翻倍(1s → 2s → 4s → 8s → ...)
305
- - 心跳超时(40s 未收到 `HEARTBEAT_ACK`)自动重连
306
-
307
- ## 故障排查
308
-
309
- ### 1. 连接失败
310
-
311
- **症状**:UI 显示"未配置"或"已停止"
312
-
313
- **排查**:
314
- 1. 检查 AppID 和 ClientSecret 是否正确
315
- 2. 查看浏览器控制台 Network 面板,检查 `platformLogin` 请求是否返回错误
316
- 3. 检查 DSH 终端日志,搜索"QQ"关键词
317
-
318
- ### 2. 收不到消息
319
-
320
- **症状**:用户发送消息后机器人无响应
321
-
322
- **排查**:
323
- 1. 确认用户/群组 OpenID 已添加到白名单
324
- 2. 群聊消息需要 @机器人 才会触发
325
- 3. 检查机器人权限是否开通"接收消息"
326
- 4. 查看 DSH 终端日志,确认是否收到 `C2C_MESSAGE_CREATE` 或 `GROUP_AT_MESSAGE_CREATE` 事件
327
-
328
- ### 3. 发送消息失败
329
-
330
- **症状**:DSH Agent 回复后,QQ 不显示消息
331
-
332
- **排查**:
333
- 1. 检查机器人权限是否开通"发送消息"
334
- 2. 查看终端日志中的 API 请求错误(状态码、错误信息)
335
- 3. 确认消息内容符合 QQ 限制(文本 < 4096 字符,媒体文件大小限制)
336
-
337
- ### 4. Token 过期
338
-
339
- **症状**:运行一段时间后突然无法发送消息
340
-
341
- **排查**:
342
- 1. 正常情况下 Token 会自动刷新,如果频繁过期可能是 ClientSecret 错误
343
- 2. 检查终端日志中的"刷新 Access Token"记录
344
- 3. 手动重新保存凭证触发立即刷新
345
-
346
- ## 参考资料
347
-
348
- - [QQ Bot API v2 官方文档](https://bot.q.qq.com/wiki/develop/api-v2/)
349
- - [获取访问凭证](https://bot.q.qq.com/wiki/develop/api-v2/dev-prepare/access-token.html)
350
- - [WebSocket 事件](https://bot.q.qq.com/wiki/develop/api-v2/dev-prepare/event-emit/websocket.html)
351
- - [消息收发](https://bot.q.qq.com/wiki/develop/api-v2/server-inter/message/overview.html)
352
- - [流式消息](https://bot.q.qq.com/wiki/develop/api-v2/server-inter/message/send-receive/passive.html#%E6%B6%88%E6%81%AF%E6%B5%81%E5%BC%8F%E6%8E%A8%E9%80%81)
353
- - [Markdown 消息](https://bot.q.qq.com/wiki/develop/api-v2/server-inter/message/type/markdown.html)
354
- - [消息按钮](https://bot.q.qq.com/wiki/develop/api-v2/server-inter/message/trans/msg-btn.html)
355
- - [富媒体消息](https://bot.q.qq.com/wiki/develop/api-v2/server-inter/message/send-receive/rich-media.html)
356
-
357
- ## 版本历史
358
-
359
- ### v2.2.0
360
- - 🔧 API 域名统一为 `api.bot.qq.com`(官方 2026-08-10 变更)
361
- - 🔧 修复流式消息:路径 `stream_messages`(下划线)、参数对齐官方、改用 `append` 追加模式
362
- - 🔧 输入状态改用 `msg_type: 6` + `input_notify`
363
- - 🔧 键盘消息改用 `msg_type: 0` + `content` + `keyboard`
364
- - 🔧 修复被动回复 msg_id(用用户消息事件 ID)
365
- - 🔧 修复群聊 scope 传递 bug
366
- - ✨ 新增指令面板全套 API,连接后自动创建单聊/群聊命令面板
367
- - ✨ 新增自定义菜单 API,自动配置单聊底部菜单
368
-
369
- ### v2.1.1
370
- - ✨ 流式消息输出:长文本自动分段推送
371
- - ✨ 消息引用:检测 `message_reference`,用户回复消息时自动创建会话
372
- - ✨ 按钮交互:无活动会话时发送快捷按钮(新建会话/列表/帮助)
373
- - ✨ 事件增强:启用 `INTERACTION_CREATE` intent,支持按钮点击映射到命令
374
-
375
- ### v2.1.0
376
- - 🎉 初始版本:QQ Bot OpenAPI v2 完整实现
377
- - ✨ 私聊、群聊、Markdown、按钮、富媒体
378
- - ✨ 平台抽象层集成
379
- - ✨ Web UI 自动适配
380
-
381
- ## 示例项目
382
-
383
- 完整示例代码见仓库:
384
- - Gateway 实现:`lib/qq/gateway.js`
385
- - Platform 适配器:`lib/qq/index.js`
386
- - ConversationBridge 适配:`lib/qq/node.js`
387
- - 单元测试:`test/qq-service.test.mjs`
@@ -1,45 +0,0 @@
1
- # 发布流程规则(RELEASE PROCESS)
2
-
3
- > 本文件是**发布操作的红线规则**,任何一次对外发布(npm / GitHub Release)都必须遵守。
4
-
5
- ## 铁律:发布前必须人工确认
6
-
7
- **任何版本(正式版 / 补丁版)在推 tag、npm publish、创建 GitHub Release 之前,必须先向仓库所有者(wenbin-wb)确认,得到明确同意后才可执行。**
8
-
9
- 原因(2026-09-01 教训):v2.10.0 发布时未先确认就自行完成了 合并 → 打 tag → 推送 → npm publish 全流程,随后发现发布说明措辞需要修订,而 npm 不允许覆盖已发布版本,只能再补 v2.10.1 修正,造成不必要的版本噪音。
10
-
11
- ### 确认清单(发布前发给所有者)
12
-
13
- 1. **版本号**:下一个版本号(如 `v2.10.1`)是否认可?
14
- 2. **发布说明(releaseNotes / CHANGELOG)**:内容是否准确?是否只包含用户可感知的变更(新功能、真实修复),不包含开发过程细节?
15
- 3. **发布范围**:npm 发布 + GitHub Release + tag,是否全部执行?
16
-
17
- 得到「可以发布」的明确回复后,才允许执行发布动作。
18
-
19
- ## 发布流程
20
-
21
- 1. **改版本**:`package.json` 的 `version` + `releaseNotes`
22
- 2. **写 CHANGELOG**:`CHANGELOG.md` 顶部新增对应版本条目
23
- 3. **构建与测试**:
24
- - `npm run build:client`(**必须**:客户端产物要与源码同步,`npm test` 有一项断言会校验产物内嵌的 CSS 与源码逐字一致)
25
- - `npm test` + `npm run lint`
26
- - `npm run verify:mobile-ui`(**发布前必做**:跑真实 GUI 的移动端行为验收,8 个套件。需要 dsh web 正在运行;Chrome 路径可用 `PUPPETEER_EXECUTABLE_PATH` 指定。它不在 CI 里跑,因为 CI 没有宿主)
27
- - `npm run build:banner`(**仅当 `docs/screenshots/` 素材有变、需要重出 README banner 时执行**;输入没变时应跳过,否则只会产生 JPEG 重编码噪声。注意该脚本默认 Chrome 路径是写死的 Windows 路径,需用 `PUPPETEER_EXECUTABLE_PATH` 覆盖)
28
- - `npm run build:lark`(**仅在需要重建飞书 vendor bundle 时执行**。它用当前 esbuild 重新打包 `lib/feishu/lark-bundled.mjs`,产物会随 esbuild 版本漂移;**不要放进 `prepack`**,否则每次 `npm publish` 都会让线上 tarball 里的 vendor 文件与 tag 里的不一致)
29
- 4. **提交**:合并到 `main`(fast-forward),提交信息 `release: vX.Y.Z — ...`
30
- 5. **打 tag**:`git tag vX.Y.Z && git push origin vX.Y.Z`(触发 GitHub Actions 自动创建 Release)
31
- 6. **npm 发布**:`npm publish`(prepack 自动构建产物)
32
- 7. **验证**:npm 线上版本 + GitHub Release body 是否正确
33
-
34
- ## 发布说明写作规范
35
-
36
- - ✅ 只写**用户可感知**的变更:新功能、真实修复(用户报告的问题)
37
- - ❌ 不写开发过程中自己引入又修复的内部 bug
38
- - ❌ 不罗列内部重构/清理细节(一句话概括即可)
39
- - ✅ 修复类条目建议**合并成一条概括**,不逐条展开技术实现
40
-
41
- ## 注意事项
42
-
43
- - npm **不允许覆盖已发布版本**(403)。发布后发现说明要改,只能 bump 补丁版本——所以发布前确认说明尤其重要。
44
- - `release.yml` workflow 只创建 GitHub Release,npm 发布是手动步骤,不要漏。
45
- - 发布后如发现问题,走补丁版本(`vX.Y.Z+1`),不要尝试覆盖。
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file