@yanhaidao/wecom 2.3.3 → 2.3.9

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 (111) hide show
  1. package/.github/workflows/release.yml +69 -1
  2. package/README.md +213 -337
  3. package/assets/03.bot.page.png +0 -0
  4. package/changelog/v2.3.4.md +20 -0
  5. package/changelog/v2.3.9.md +22 -0
  6. package/compat-single-account.md +32 -2
  7. package/index.test.ts +34 -0
  8. package/index.ts +15 -7
  9. package/package.json +8 -7
  10. package/src/agent/api-client.upload.test.ts +1 -2
  11. package/src/agent/handler.ts +82 -9
  12. package/src/agent/index.ts +1 -1
  13. package/src/app/account-runtime.ts +245 -0
  14. package/src/app/bootstrap.ts +29 -0
  15. package/src/app/index.ts +31 -0
  16. package/src/capability/agent/delivery-service.ts +79 -0
  17. package/src/capability/agent/fallback-policy.ts +13 -0
  18. package/src/capability/agent/index.ts +3 -0
  19. package/src/capability/agent/ingress-service.ts +38 -0
  20. package/src/capability/bot/dispatch-config.ts +47 -0
  21. package/src/capability/bot/fallback-delivery.ts +178 -0
  22. package/src/capability/bot/index.ts +1 -0
  23. package/src/capability/bot/local-path-delivery.ts +215 -0
  24. package/src/capability/bot/service.ts +56 -0
  25. package/src/capability/bot/stream-delivery.ts +379 -0
  26. package/src/capability/bot/stream-finalizer.ts +120 -0
  27. package/src/capability/bot/stream-orchestrator.ts +352 -0
  28. package/src/capability/bot/types.ts +8 -0
  29. package/src/capability/index.ts +2 -0
  30. package/src/channel.lifecycle.test.ts +9 -6
  31. package/src/channel.meta.test.ts +12 -0
  32. package/src/channel.ts +48 -21
  33. package/src/config/accounts.ts +223 -283
  34. package/src/config/derived-paths.test.ts +111 -0
  35. package/src/config/derived-paths.ts +41 -0
  36. package/src/config/index.ts +10 -12
  37. package/src/config/runtime-config.ts +46 -0
  38. package/src/config/schema.ts +59 -102
  39. package/src/domain/models.ts +7 -0
  40. package/src/domain/policies.ts +36 -0
  41. package/src/dynamic-agent.ts +6 -0
  42. package/src/gateway-monitor.ts +43 -93
  43. package/src/http.ts +23 -2
  44. package/src/monitor/limits.ts +7 -0
  45. package/src/monitor/state.ts +28 -508
  46. package/src/monitor.active.test.ts +3 -3
  47. package/src/monitor.integration.test.ts +0 -1
  48. package/src/monitor.ts +64 -2603
  49. package/src/monitor.webhook.test.ts +127 -42
  50. package/src/observability/audit-log.ts +48 -0
  51. package/src/observability/legacy-operational-event-store.ts +36 -0
  52. package/src/observability/raw-envelope-log.ts +28 -0
  53. package/src/observability/status-registry.ts +13 -0
  54. package/src/observability/transport-session-view.ts +14 -0
  55. package/src/onboarding.test.ts +219 -0
  56. package/src/onboarding.ts +88 -71
  57. package/src/outbound.test.ts +5 -5
  58. package/src/outbound.ts +18 -66
  59. package/src/runtime/dispatcher.ts +52 -0
  60. package/src/runtime/index.ts +4 -0
  61. package/src/runtime/outbound-intent.ts +4 -0
  62. package/src/runtime/reply-orchestrator.test.ts +38 -0
  63. package/src/runtime/reply-orchestrator.ts +55 -0
  64. package/src/runtime/routing-bridge.ts +19 -0
  65. package/src/runtime/session-manager.ts +76 -0
  66. package/src/runtime.ts +7 -14
  67. package/src/shared/command-auth.ts +1 -17
  68. package/src/shared/media-service.ts +36 -0
  69. package/src/shared/media-types.ts +5 -0
  70. package/src/store/active-reply-store.ts +42 -0
  71. package/src/store/interfaces.ts +11 -0
  72. package/src/store/memory-store.ts +43 -0
  73. package/src/store/stream-batch-store.ts +350 -0
  74. package/src/target.ts +28 -0
  75. package/src/transport/agent-api/client.ts +44 -0
  76. package/src/transport/agent-api/core.ts +367 -0
  77. package/src/transport/agent-api/delivery.ts +41 -0
  78. package/src/transport/agent-api/media-upload.ts +11 -0
  79. package/src/transport/agent-api/reply.ts +39 -0
  80. package/src/transport/agent-callback/http-handler.ts +47 -0
  81. package/src/transport/agent-callback/inbound.ts +5 -0
  82. package/src/transport/agent-callback/reply.ts +13 -0
  83. package/src/transport/agent-callback/request-handler.ts +244 -0
  84. package/src/transport/agent-callback/session.ts +23 -0
  85. package/src/transport/bot-webhook/active-reply.ts +36 -0
  86. package/src/transport/bot-webhook/http-handler.ts +48 -0
  87. package/src/transport/bot-webhook/inbound-normalizer.ts +371 -0
  88. package/src/transport/bot-webhook/inbound.ts +5 -0
  89. package/src/transport/bot-webhook/message-shape.ts +89 -0
  90. package/src/transport/bot-webhook/protocol.ts +148 -0
  91. package/src/transport/bot-webhook/reply.ts +15 -0
  92. package/src/transport/bot-webhook/request-handler.ts +394 -0
  93. package/src/transport/bot-webhook/session.ts +23 -0
  94. package/src/transport/bot-ws/inbound.ts +109 -0
  95. package/src/transport/bot-ws/reply.ts +48 -0
  96. package/src/transport/bot-ws/sdk-adapter.ts +180 -0
  97. package/src/transport/bot-ws/session.ts +28 -0
  98. package/src/transport/http/common.ts +109 -0
  99. package/src/transport/http/registry.ts +92 -0
  100. package/src/transport/http/request-handler.ts +84 -0
  101. package/src/transport/index.ts +14 -0
  102. package/src/types/account.ts +56 -91
  103. package/src/types/config.ts +59 -112
  104. package/src/types/constants.ts +20 -35
  105. package/src/types/events.ts +21 -0
  106. package/src/types/index.ts +14 -38
  107. package/src/types/legacy-stream.ts +50 -0
  108. package/src/types/runtime-context.ts +28 -0
  109. package/src/types/runtime.ts +161 -0
  110. package/src/agent/api-client.ts +0 -383
  111. package/src/monitor/types.ts +0 -136
package/README.md CHANGED
@@ -1,8 +1,5 @@
1
1
  # OpenClaw 企业微信(WeCom)Channel 插件
2
2
 
3
- > [!WARNING]
4
- > **OpenClaw 3.1+ 升级必读**:升级到 OpenClaw `3.1` 及以上版本的用户务必同步升级本插件,并将企业微信回调 URL 更新为 OpenClaw 推荐路径:`/plugins/wecom/bot/{accountId}` 与 `/plugins/wecom/agent/{accountId}`(旧 `/wecom/*` 仍兼容但不再维护)。
5
-
6
3
  <p align="center">
7
4
  <img src="https://img.shields.io/badge/Original%20Project-YanHaidao-orange?style=for-the-badge&logo=github" alt="Original Project" />
8
5
  <img src="https://img.shields.io/badge/License-ISC-blue?style=for-the-badge" alt="License" />
@@ -13,7 +10,7 @@
13
10
  > 欢迎技术交流与合规引用,但**严禁任何不经授权的“功能像素级抄袭”或删除原作者署名的代码搬运行为**。
14
11
 
15
12
  <p align="center">
16
- <strong>🚀 企业级双模式 AI 助手接入方案</strong>
13
+ <strong>🚀 企业级多模式 AI 助手接入方案(统一运行时架构)</strong>
17
14
  </p>
18
15
 
19
16
  <p align="center">
@@ -21,7 +18,10 @@
21
18
  <a href="#sec-2">📊 模式对比</a> •
22
19
  <a href="#sec-3">一、快速开始</a> •
23
20
  <a href="#sec-4">二、配置说明</a> •
24
- <a href="#sec-9">七、联系我</a>
21
+ <a href="#sec-5">三、企业微信接入</a>
22
+ <a href="#sec-6">四、高级功能</a> •
23
+ <a href="#sec-7">五、详细行为说明</a> •
24
+ <a href="#sec-9">六、社区与维护</a>
25
25
  </p>
26
26
 
27
27
  ---
@@ -29,7 +29,18 @@
29
29
  <a id="sec-1"></a>
30
30
  ## 💡 核心价值:为什么选择本插件?
31
31
 
32
- ### 独创架构:Bot + Agent 双模融合 (Original Design by YanHaidao)
32
+ ### 🎉 重大特性一览
33
+ 1. **无需域名,极低门槛**:全面支持基于 WebSocket 的长连接(Bot WS)模式接入企业微信机器人,**彻底打通无公网 IP、无备案域名的内网服务器**与企微的实时对话桥梁!
34
+ 2. **主动发消息,能力全覆盖**:基于 Agent 模式,全面支持**主动触达**,轻松实现早报定时任务、服务器异常报警、自动每日总结。
35
+
36
+ ### 🔧 全新统一运行时架构 (Unified Runtime)
37
+ 插件现已采用全新解耦架构:
38
+ - **`Bot` / `Agent`** 是能力层 (Capability)。
39
+ - **`WS` / `Webhook` / `Callback` / `API`** 是传输层 (Transport)。
40
+ - 同一账号下,Bot 可以在长连接(WS)和主动回调(Webhook)之间通过 `primaryTransport` 自由无缝切换。
41
+ - HTTP Callback 路径一律由系统基于 `accountId` 全自动派生,告别繁乱的手工 URL 配置。
42
+
43
+ ### 🎭 独创架构:Bot + Agent 双模融合 (Original Design by YanHaidao)
33
44
 
34
45
  传统的企微插件通常只能在 "只能聊天的机器人 (Bot)" 和 "只能推送的自建应用 (Agent)" 之间二选一。
35
46
  本插件采用 **双模并行架构**,同时压榨两种模式的极限能力:
@@ -41,7 +52,8 @@
41
52
 
42
53
  本插件支持 **无限扩展的账号矩阵**,这是本插件区别于普通插件的核心壁垒:
43
54
 
44
- * **完全隔离 (Isolation)**:不同 `accountId` 之间的会话、动态 Agent、上下文完全隔离,互不串扰。
55
+ * **千人千面 (Dynamic Agents)**:内置自动会话隔离机制,百人同时私聊或群聊自动分摊至专属独立助理,告别上下文串扰。
56
+ * **完全隔离 (Isolation)**:不同 `accountId` 之间的会话、动态 Agent、上下文完全物理隔离,互不串扰。
45
57
  * **矩阵绑定 (Binding)**:支持一个 OpenClaw 实例同时挂载多个企业/多个应用,通过 `bindings` 灵活分发流量。
46
58
  * **智能路由 (Routing)**:基于入站 `accountId` 自动分拣回复路径,Bot 无法回复时仅回退到**同账号组内**的 Agent,实现闭环的高可用。
47
59
 
@@ -71,19 +83,21 @@
71
83
 
72
84
  | 能力维度 | 🤖 Bot 模式 | 🧩 Agent 模式 | ✨ **本插件 (双模)** |
73
85
  |:---|:---|:---|:---|
86
+ | **部署网络要求** | ✅ **无需公网IP/域名 (WS)** | ❌ 必须公网IP/域名回调 | **✅ 全环境适用** |
74
87
  | **接收消息 (单聊)** | ✅ 文本/图片/语音/文件 | ✅ 文本/图片/语音/视频/位置/链接 | **✅ 全能互补** (覆盖所有类型) |
75
- | **接收消息 (群聊)** | ✅ 文本/引用 | ❌ 不支持 (无回调) | **✅ 文本/引用** |
76
- | **发送消息** | ❌ 仅支持文本/图片/Markdown | ✅ **全格式支持** (文本/图片/视频/文件等) | **✅ 智能路由** (自动切换) |
77
- | **流式响应** | ✅ **支持** (打字机效果) | ❌ 不支持 | **✅ 完美支持** |
78
- | **主动推送** | 仅被动回复 | **支持** (指定用户/部门/标签) | **✅ 完整 API** |
88
+ | **接收消息 (群聊)** | ✅ 文本/引用 | ❌ 不支持 (群聊无回调) | **✅ 文本/引用** |
89
+ | **回复消息类型** | ❌ 仅文本/图片/Markdown | ✅ **全模态** (文本/图片/视频/文件等) | **✅ 智能路由** (自动判定切换) |
90
+ | **交互卡片 (A2UI)**| ❌ 不支持 | ✅ **支持** (Button/Select等) | **✅ 支持** |
91
+ | **AI 流式响应** | **支持** (丝滑打字机) | 不支持 (全部生成完一次发送) | **✅ 完美支持** |
92
+ | **主动触达 (Cron)**| ❌ 仅被动回复/有限推送 | ✅ **全量推送** (指定人/部门/标签) | **✅ 企业级触达** |
79
93
 
80
94
  ---
81
95
 
82
96
  <a id="sec-3"></a>
83
97
  ## 一、🚀 快速开始
84
98
 
85
- > 默认推荐:**多账号 + 多 Agent(matrix)**。
86
- > 建议 OpenClaw 使用 **2026.2.24+** 版本以获得完整生命周期与多账号行为修复。
99
+ > 推荐统一使用**多账号矩阵模型**。
100
+ > 即使只有一个账号,也建议写在 `channels.wecom.accounts.default` 节点下。
87
101
 
88
102
  ### 1.1 安装插件
89
103
 
@@ -92,226 +106,173 @@ openclaw plugins install @yanhaidao/wecom
92
106
  openclaw plugins enable wecom
93
107
  ```
94
108
 
95
- 也可以通过命令行向导快速配置:
96
-
97
- ```bash
98
- openclaw config --section channels
99
- ```
100
-
101
- ### 1.2 推荐配置:多账号 + 多 Agent(默认)
102
-
103
- 直接用命令写入多 `accountId` 配置(会写入 `~/.openclaw/openclaw.json`):
104
-
105
- ```bash
106
- # 1) 打开 WeCom 通道并设置默认账号
107
- openclaw config set channels.wecom.enabled true
108
- openclaw config set channels.wecom.defaultAccount ops
109
-
110
- # 2) 新增 ops 账号(Bot + Agent)
111
- openclaw config set channels.wecom.accounts.ops '{
112
- "enabled": true,
113
- "name": "运维机器人",
114
- "bot": {
115
- "aibotid": "BOT_OPS",
116
- "token": "BOT_TOKEN_OPS",
117
- "encodingAESKey": "BOT_AES_OPS",
118
- "receiveId": ""
119
- },
120
- "agent": {
121
- "corpId": "CORP_ID",
122
- "corpSecret": "AGENT_SECRET_OPS",
123
- "agentId": 1000001,
124
- "token": "AGENT_TOKEN_OPS",
125
- "encodingAESKey": "AGENT_AES_OPS"
126
- }
127
- }'
128
-
129
- # 3) 新增 sales 账号(Bot + Agent)
130
- openclaw config set channels.wecom.accounts.sales '{
131
- "enabled": true,
132
- "name": "销售机器人",
133
- "bot": {
134
- "aibotid": "BOT_SALES",
135
- "token": "BOT_TOKEN_SALES",
136
- "encodingAESKey": "BOT_AES_SALES",
137
- "receiveId": ""
138
- },
139
- "agent": {
140
- "corpId": "CORP_ID",
141
- "corpSecret": "AGENT_SECRET_SALES",
142
- "agentId": 1000002,
143
- "token": "AGENT_TOKEN_SALES",
144
- "encodingAESKey": "AGENT_AES_SALES"
145
- }
146
- }'
147
-
148
- # 4) 绑定到不同 OpenClaw agent(按你的实际 agentId 修改)
149
- openclaw config set bindings '[{"agentId":"ops-agent","match":{"channel":"wecom","accountId":"ops"}},{"agentId":"sales-agent","match":{"channel":"wecom","accountId":"sales"}}]'
150
-
151
- # 5) 验证配置
152
- openclaw config get channels.wecom
153
- openclaw channels status
154
- ```
155
-
156
- Webhook 回调建议按账号分别配置:
157
- - Bot(推荐):`/plugins/wecom/bot/{accountId}`
158
- - Agent(推荐):`/plugins/wecom/agent/{accountId}`
159
-
160
- > 提示:如果你已有 `bindings`,请先备份并按需合并,避免覆盖其它通道绑定。
161
-
162
- ### 1.3 高级网络配置(公网出口代理)
163
- 如果您的服务器使用 **动态 IP** (如家庭宽带、内网穿透) 或 **无公网 IP**,企业微信 API 会因 IP 变动报错 `60020 not allow to access from your ip`。
164
- 此时需配置一个**固定 IP 的正向代理** (如 Squid),让插件通过该代理访问企微 API。
165
-
166
- ```bash
167
- openclaw config set channels.wecom.network.egressProxyUrl "http://proxy.company.local:3128"
168
- ```
109
+ ### 1.2 互动向导式配置 (推荐)
169
110
 
170
- ### 1.4 验证
111
+ 如果你不想手写 JSON 配置文件,可以通过互动式向导完成通道挂载:
171
112
 
113
+ 1. 确保已通过 npm 安装该插件:`openclaw plugins install @yanhaidao/wecom`并且启用了 `openclaw plugins enable wecom`
114
+ 2. 在终端中,输入以下命令,添加渠道:
172
115
  ```bash
173
- openclaw config set gateway.bind lan
174
- openclaw gateway restart
175
- openclaw channels status
116
+ openclaw channels add
176
117
  ```
118
+ 3. 在「Select channel」步骤的下拉列表中,找到并选择:**企业微信 (WeCom)**
119
+ 4. 按照屏幕终端提示,依次填入企业微信机器人 `Bot ID` 及 `Secret` 等必填项即可。
177
120
 
178
- ---
179
-
180
- <a id="sec-4"></a>
181
-
182
- ## 二、⚙️ 配置说明
121
+ 向导完成后,后台服务将自动装载你的配置并尝试建立长连接通信。
183
122
 
184
- ### 2.1 推荐配置结构(多账号 + Agent)
123
+ ### 1.3 推荐配置结构(Bot + Agent 组合版)
185
124
 
186
- 一个 `accountId` 就是一组独立通道:
187
- - 一组 `bot`(群聊/流式主通道)
188
- - 一组 `agent`(文件/超时/主动消息兜底)
189
- - 一组路由绑定(只进同组 Agent,不跨账号)
125
+ 这是生产环境最推荐的形态(进阶纯手工配置),兼顾了快速流式体验与 Agent 强大的兜底分发能力。如果您是给企业配置多名矩阵助理,或需要启动 Agent 兜底能力和定时推送能力,请进入 OpenClaw 的配置文件直接写入 JSON。以下是生产环境最推荐的综合形态:
190
126
 
191
127
  ```jsonc
192
128
  {
193
129
  "channels": {
194
130
  "wecom": {
195
- "enabled": true, // 通道总开关
196
- "defaultAccount": "ops", // 未显式指定 accountId 时使用
197
-
198
- // 通道级全局配置(当前不是 per-account)
199
- "media": {
200
- "tempDir": "/tmp/openclaw-wecom-media",
201
- "retentionHours": 24,
202
- "cleanupOnStart": true,
203
- "maxBytes": 26214400
204
- },
205
- "network": {
206
- "timeoutMs": 15000,
207
- "retries": 2,
208
- "retryDelayMs": 500,
209
- "egressProxyUrl": "http://proxy.company.local:3128"
210
- },
211
- "dynamicAgents": {
212
- "enabled": true,
213
- "dmCreateAgent": true,
214
- "groupEnabled": false,
215
- "adminUsers": ["zhangsan"]
216
- },
217
-
131
+ "enabled": true,
132
+ "defaultAccount": "default",
218
133
  "accounts": {
219
- "ops": {
134
+ "default": {
220
135
  "enabled": true,
221
- "name": "运维机器人",
136
+ "name": "默认企微账号",
222
137
  "bot": {
223
- "aibotid": "BOT_OPS",
224
- "token": "BOT_TOKEN_OPS",
225
- "encodingAESKey": "BOT_AES_OPS",
226
- "botIds": ["BOT_OPS", "BOT_OPS_BAK"],
227
- "receiveId": "",
138
+ "primaryTransport": "ws", // 指定 Bot 主通讯协议:ws 或 webhook
228
139
  "streamPlaceholderContent": "正在思考...",
229
- "welcomeText": "你好,我是运维助手",
140
+ "welcomeText": "你好,我已接入 OpenClaw。",
230
141
  "dm": {
231
- "policy": "allowlist",
232
- "allowFrom": ["zhangsan", "lisi"]
142
+ "policy": "pairing",
143
+ "allowFrom": []
144
+ },
145
+ "ws": { // Bot WS 配置
146
+ "botId": "BOT_ID",
147
+ "secret": "BOT_SECRET"
148
+ },
149
+ "webhook": { // Bot Webhook 配置 (按需)
150
+ "token": "BOT_TOKEN",
151
+ "encodingAESKey": "BOT_AES_KEY",
152
+ "receiveId": "BOT_RECEIVE_ID"
233
153
  }
234
154
  },
235
155
  "agent": {
236
156
  "corpId": "CORP_ID",
237
- "corpSecret": "AGENT_SECRET_OPS",
157
+ "corpSecret": "CORP_SECRET",
238
158
  "agentId": 1000001,
239
- "token": "AGENT_TOKEN_OPS",
240
- "encodingAESKey": "AGENT_AES_OPS",
241
- "welcomeText": "欢迎联系运维助手",
159
+ "token": "AGENT_TOKEN",
160
+ "encodingAESKey": "AGENT_AES_KEY",
161
+ "welcomeText": "你好,这里是 Agent 通道。",
242
162
  "dm": {
243
163
  "policy": "open",
244
- "allowFrom": ["*"]
245
- }
246
- }
247
- },
248
- "sales": {
249
- "enabled": true,
250
- "name": "销售机器人",
251
- "bot": {
252
- "aibotid": "BOT_SALES",
253
- "token": "BOT_TOKEN_SALES",
254
- "encodingAESKey": "BOT_AES_SALES",
255
- "receiveId": "",
256
- "streamPlaceholderContent": "正在整理销售建议...",
257
- "welcomeText": "你好,我是销售助手",
258
- "dm": {
259
- "policy": "pairing"
260
- }
261
- },
262
- "agent": {
263
- "corpId": "CORP_ID",
264
- "corpSecret": "AGENT_SECRET_SALES",
265
- "agentId": 1000002,
266
- "token": "AGENT_TOKEN_SALES",
267
- "encodingAESKey": "AGENT_AES_SALES",
268
- "welcomeText": "欢迎咨询销售问题",
269
- "dm": {
270
- "policy": "pairing"
164
+ "allowFrom": []
271
165
  }
272
166
  }
273
167
  }
168
+ },
169
+ "media": {
170
+ "tempDir": "/tmp/openclaw-wecom-media",
171
+ "retentionHours": 24,
172
+ "cleanupOnStart": true,
173
+ "maxBytes": 26214400
174
+ },
175
+ "network": {
176
+ "egressProxyUrl": "http://127.0.0.1:3128"
177
+ },
178
+ "routing": {
179
+ "failClosedOnDefaultRoute": true
180
+ },
181
+ "dynamicAgents": {
182
+ "enabled": true,
183
+ "dmCreateAgent": true,
184
+ "groupEnabled": true,
185
+ "adminUsers": ["zhangsan"]
274
186
  }
275
187
  }
276
- },
277
- "bindings": [
278
- { "agentId": "ops-agent", "match": { "channel": "wecom", "accountId": "ops" } },
279
- { "agentId": "sales-agent", "match": { "channel": "wecom", "accountId": "sales" } }
280
- ]
188
+ }
281
189
  }
282
190
  ```
283
191
 
284
- ### 2.2 路由第一性原则
192
+ ### 1.3 高级网络配置(公网出口代理)
193
+ 如果您的服务器使用 **动态 IP** (如家庭宽带、内网穿透) 或 **无公网 IP**,首先使用Bot模式的ws接入方式。
285
194
 
286
- - `accountId` 是会话隔离边界:不同账号不共享会话、不共享动态 Agent。
287
- - Bot 无法交付时,只回退到**同组** Agent,不跨账号兜底。
288
- - 只有在未显式指定 `accountId` 时,才使用 `defaultAccount`。
195
+ 企业微信 API 会因 IP 变动报错 `60020 not allow to access from your ip`。
196
+ 此时需配置一个**固定 IP 的正向代理** (如 Squid),让插件通过该代理访问企微 API。
289
197
 
290
- ### 2.3 Webhook 路径(必须使用账号路径)
198
+ ```bash
199
+ openclaw config set channels.wecom.network.egressProxyUrl "http://proxy.company.local:3128"
200
+ ```
291
201
 
292
- | 模式 | 路径 | 说明 |
293
- |:---|:---|:---|
294
- | Bot(推荐,多账号) | `/plugins/wecom/bot/{accountId}` | 指定账号回调(例如 `/plugins/wecom/bot/default`) |
295
- | Agent(推荐,多账号) | `/plugins/wecom/agent/{accountId}` | 指定账号回调(例如 `/plugins/wecom/agent/default`) |
202
+ ### 1.4 验证启动与观测
296
203
 
297
- ### 2.4 从单账号迁移到多账号(4 步)
204
+ 使用最新的自检命令以检查通道装载、端口绑定与运行情况:
205
+ ```bash
206
+ openclaw channels status --deep
207
+ ```
208
+
209
+ 建议重点看这几个核心状态指标是否健康:
210
+ - `primaryTransport` / `transport` / `health`
211
+
212
+ ---
213
+
214
+ <a id="sec-4"></a>
215
+
216
+ ## 二、⚙️ 三模配置模式详解
217
+
218
+ 新版已分离 `Transport` 传输层,以下是独立运转模式的基本构成(你可以随意组合它们入同一个 account):
219
+
220
+ ### 2.1 仅 Bot WS 模式
221
+ 最简的流式交互版(无兜底分发功能)。
222
+ 关键约束:`bot.primaryTransport = "ws"` 必须包含 `bot.ws` 参数。
223
+
224
+ ```jsonc
225
+ {
226
+ "accounts": {
227
+ "default": {
228
+ "bot": {
229
+ "primaryTransport": "ws",
230
+ "ws": { "botId": "BOT_ID", "secret": "BOT_SECRET" }
231
+ }
232
+ }
233
+ }
234
+ }
235
+ ```
236
+
237
+ ### 2.2 仅 Bot Webhook 模式
238
+ 针对某些无法建立高可靠 WS 网关的环境,退化使用 URL 回调。
239
+ 关键约束:`bot.primaryTransport = "webhook"` 必须包含 `bot.webhook` 参数。
240
+
241
+ ```jsonc
242
+ {
243
+ "accounts": {
244
+ "default": {
245
+ "bot": {
246
+ "primaryTransport": "webhook",
247
+ "webhook": { "token": "BOT_TOKEN", "encodingAESKey": "BOT_AES_KEY" }
248
+ }
249
+ }
250
+ }
251
+ }
252
+ ```
253
+
254
+ ### 2.3 自动分流与会话隔离 (dynamicAgents)
298
255
 
299
- 1. 把原来的 `channels.wecom.bot` / `channels.wecom.agent` 拆到 `channels.wecom.accounts.default.bot/agent`。
300
- 2. 按业务继续新增 `channels.wecom.accounts.<accountId>`(例如 `ops`、`sales`)。
301
- 3. 为每个账号增加 `bindings[].match.accountId`,映射到对应 OpenClaw agent。
302
- 4. 企业微信后台把回调 URL 改成账号路径:`/plugins/wecom/bot/{accountId}`、`/plugins/wecom/agent/{accountId}`,然后执行 `openclaw channels status` 验证。
256
+ 这属于插件的**全局网络与行为组**。
303
257
 
304
- ### 2.5 DM 策略
258
+ | 字段 | 类型 | 说明 |
259
+ |---|---|---|
260
+ | `enabled` | `boolean` | 是否启用动态 Agent |
261
+ | `dmCreateAgent` | `boolean` | 私聊是否自动建 Agent |
262
+ | `groupEnabled` | `boolean` | 群聊是否允许动态 Agent |
263
+ | `adminUsers` | `string[]` | 管理员白名单 |
305
264
 
306
- - **不配置 `dm.allowFrom`** → 所有人可用(默认)
307
- - **配置 `dm.allowFrom: ["user1", "user2"]`** → 白名单模式,仅列表内用户可私聊
265
+ #### 场景说明(解决真实企业痛点)
266
+ 企业场景下,当多名同事或多个群组同时与系统交互时,系统默认只会连接同一个全局 AI Agent。这会导致**会话上下文串扰(张三发的问题,李四接着问,上下文混乱)**。
308
267
 
309
- ### 2.6 常用指令
268
+ 开启 `dynamicAgents` 后,可以解决此痛点,实现**“千人千面、万群万脑”**的并发隔离机制:
269
+ - **`enabled` (总开关)**:一旦打开,系统会自动为每个会话的来源进行分流,并动态生成专属的底层 Agent 实例(如 `wecom-default-dm-张三`),无需人工配置。
270
+ - **`dmCreateAgent` (私聊自动建号)**:实现员工私人助理模式。每个人私聊发消息,系统都会临时绑定独立记忆的专属助理,避免为全公司几百人挨个去后台扫码建号配置。
271
+ - **`groupEnabled` (群聊自动分群)**:实现各个群聊主题封闭。A 群的讨论话题绝不会串扰到 B 群。
272
+ - **`adminUsers` (管理员特权后门)**:填入管理员的微信 ID。遇到这几个人发消息时,系统**不会**去进动态 Agent 隔离区,而是直通后端的主控制台 Agent,以便执行全网管理指令。
310
273
 
311
- | 指令 | 说明 | 示例 |
312
- |:---|:---|:---|
313
- | `/new` | 🆕 开启新会话 (重置上下文) | `/new` 或 `/new GPT-4` |
314
- | `/reset` | 🔄 重置会话 (同 /new) | `/reset` |
274
+ > **🌟 多账号矩阵下的全局生效与物理隔离**
275
+ > `dynamicAgents` 属于通道级的全局开关,开启后会对配置的所有账号(`accounts`)生效。为了维持账号的绝对隔离,生成的隔离 Agent ID 内置了 Account 维度(例如:`wecom-ops-dm-张三` vs `wecom-sales-dm-张三`),保证跨企业应用依旧安全隔绝。
315
276
 
316
277
  ---
317
278
 
@@ -319,24 +280,21 @@ openclaw channels status
319
280
 
320
281
  ## 三、🏢 企业微信接入指南
321
282
 
322
- ### 3.1 Bot 模式(智能机器人)
283
+ 新版系统已将 Callback 回调处理实现了**全自动的账号分流路径派生**,开发者不要在配置里手工定义 `ReceiveID` 的硬编码路由覆盖,请在企业微信管理后台直接指向对应路径。
323
284
 
324
- 1. 登录 [企业微信管理后台](https://work.weixin.qq.com/wework_admin/frame#/manageTools)
325
- 2. 进入「安全与管理」→「管理工具」→「智能机器人」
326
- 3. 创建机器人,选择 **API 模式**
327
- 4. 填写回调 URL:`https://your-domain.com/plugins/wecom/bot/{accountId}`(例如默认账号:`https://your-domain.com/plugins/wecom/bot/default`)
328
- 5. 记录 Token 和 EncodingAESKey
285
+ ### 3.1 明确各类模式的目标路径
329
286
 
330
- ### 3.2 Agent 模式(自建应用)
287
+ | 类型 | 默认账号 | 非默认账号 (如 ops) |
288
+ |---|---|---|
289
+ | **Bot Webhook** | `/plugins/wecom/bot/default` | `/plugins/wecom/bot/ops` |
290
+ | **Agent Callback** | `/plugins/wecom/agent/default`| `/plugins/wecom/agent/ops` |
331
291
 
332
- 1. 登录 [企业微信管理后台](https://work.weixin.qq.com/wework_admin/frame#/apps)
333
- 2. 进入「应用管理」→「自建」→ 创建应用
334
- 3. 获取 AgentId、CorpId、Secret
335
- 4. **重要:** 进入「企业可信IP」→「配置」→ 添加你服务器的 IP 地址
336
- - 如果你使用内网穿透/动态 IP,建议配置 `channels.wecom.network.egressProxyUrl` 走固定出口代理,否则可能出现:`60020 not allow to access from your ip`
337
- 5. 在应用详情中设置「接收消息 - 设置API接收」
338
- 6. 填写回调 URL:`https://your-domain.com/plugins/wecom/agent/{accountId}`(例如默认账号:`https://your-domain.com/plugins/wecom/agent/default`)
339
- 7. 记录回调 Token 和 EncodingAESKey
292
+ *(注:系统通过智能中间件,若只配了 default 且你访问 `/plugins/wecom/bot` 无后缀,也会尝试自动漂移至 default,但**极不建议**,必须写标准账号名后缀以规避未来扩展冲突。)*
293
+
294
+ ### 3.2 下发路由至企业微信后台
295
+ 1. 登录企业微信管理后台
296
+ 2. 机器人填入回调 URL:`https://your-domain.com/plugins/wecom/bot/{accountId}`
297
+ 3. 自建应用填入回调 URL:`https://your-domain.com/plugins/wecom/agent/{accountId}` (不要忘记加可信IP)。
340
298
 
341
299
  <div align="center">
342
300
  <img src="https://cdn.jsdelivr.net/npm/@yanhaidao/wecom@latest/assets/03.bot.page.png" width="45%" alt="Bot Config" />
@@ -358,8 +316,6 @@ Agent 输出 `{"template_card": ...}` 时自动渲染为交互卡片:
358
316
  - ✅ 自动去重:基于 `msgid` 避免重复处理
359
317
  - ⚠️ 群聊降级:自动转为文本描述
360
318
 
361
-
362
-
363
319
  ### 4.2 ⏰ Cronjob 企业级定时推送
364
320
 
365
321
  本插件深度集成了 OpenClaw 的 Cronjob 调度能力,配合 Agent 强大的广播 API,轻松实现企业级通知服务。
@@ -391,29 +347,27 @@ Agent 输出 `{"template_card": ...}` 时自动渲染为交互卡片:
391
347
  "to": "party:1", // 一键发送给根部门所有人!
392
348
  "text": "🌞 早安!请查收[今日行业简报](https://example.com/daily)。"
393
349
  }
394
- },
395
- {
396
- "cron": "0 18 * * 5",
397
- "action": "reply.send",
398
- "params": {
399
- "channel": "wecom",
400
- "to": "tag:Ops", // 仅发送给运维组
401
- "text": "🔒 周五封网提醒:请检查服务器状态。"
402
- }
403
350
  }
404
351
  ]
405
352
  }
406
353
  ```
407
354
 
408
-
355
+ ### 4.3 🤖 动态 Agent 扩容引擎
356
+ 在《二、配置说明》中讲解的 `dynamicAgents`,除了在运行时把会话隔离,它还在内存里做了一套高吞吐状态写入:
357
+ 系统会自动以异步、排队、防冲突的队列,将被激活的动态专用助理自动追加写入底层核心系统配置文件 `openclaw.json` (或相应 yaml) 的 `agents.list` 数组中,这就意味着:这套扩容体系是对上层管理员完全**透明且免运维**的,机器人活了,号也就落盘注册好了。
409
358
 
410
359
  ---
411
360
 
412
361
  <a id="sec-7"></a>
413
362
 
414
- ## 五、📖 详细行为说明 (Behavior Detail)
363
+ ## 五、📖 详细行为说明 & 运行约束
415
364
 
416
- ### 5.1 企业微信群聊交付规则
365
+ ### 5.1 运行约束原则
366
+ - **协议单工限制**:同一账号下,Bot 只能选择一个主传输协议 `primaryTransport` (`ws` 或 `webhook`) 运作。
367
+ - **帧边界不可打破**:Bot WS 是基于官方微信内部通信协议的扩展,它必须携带并原路奉还对应的 `req_id`。标准化的事件不会替代原始数据帧,业务流始终可访问该原始微信底层框架。
368
+ - **媒体沙盒边界**:不论是 `Webhook`,还是 `WS`,涉及企微媒体加解密的处理绝不再跨界干预业务执行层。由内部服务自动在 Transport / Media Service 网关边界卸载 `aeskey` 解密并转换为统一 OpenClaw 媒体类抛出。
369
+
370
+ ### 5.2 企业微信群聊交付规则
417
371
 
418
372
  * **默认 (Bot 回复)**:群聊里 @Bot,默认由 Bot 在群内直接回复(优先文本/图片/Markdown)。
419
373
  * **例外 (文件兜底)**:如果回复内容包含**非图片文件**(如 PDF/Word/表格/压缩包等),由于企微 Bot 接口不支持,插件会自动:
@@ -421,19 +375,23 @@ Agent 输出 `{"template_card": ...}` 时自动渲染为交互卡片:
421
375
  2. 无缝切换到 **自建应用 (Agent)** 通道,将文件私信发送给触发者。
422
376
  * **提示**:若未配置 Agent,Bot 会明确提示“需要管理员配置自建应用通道”。
423
377
 
424
- ### 5.2 长任务可靠性保障
378
+ ### 5.3 长任务可靠性保障
425
379
 
426
380
  * **超时熔断**:企业微信限制 Bot 流式回复窗口约为 6 分钟。
427
- * **自动接力**:当对话时长接近此阈值时,Monitor 会自动截断 Bot 流,提示 "剩余内容将私信发送",并立即启动 Agent 通道私信发送完整结果。这彻底解决了长思考任务(如深度推理、代码生成)因超时导致用户收不到结果的问题。
428
-
429
- ### 5.3 主动发送安全机制
381
+ * **自动接力**:当对话时长接近此阈值时,Monitor 会自动截断 Bot 流,提示 "剩余内容将私信发送",并立即启动 Agent 通道私信发送完整结果。
430
382
 
431
- * **群发保护**:Agent 主动发送接口不再尝试向普通群 `chatid` (wr/wc...) 发消息(该路径常因权限与归属产生的隐蔽错误)。
432
- * **引导提示**:系统会明确拦截并通过日志提示中文错误:"请使用 Bot 群内交付或改为私信目标(userid/部门/标签)",帮助管理员快速排查配置。
383
+ ### 5.4 命令行排障抓包指南
433
384
 
434
- ### 5.4 管理员友好
385
+ 利用自带命令直接追溯到新版本的微架构心跳:
386
+ ```bash
387
+ openclaw channels status --deep
388
+ ```
435
389
 
436
- * 所有兜底逻辑(Fallback)触发时,如果因配置缺失导致失败,Bot 都会给出清晰的**中文提示**,而不是沉默或报代码错误,极大降低了排查难度。
390
+ 如果出故障,除了系统根日志外,新版强化了命名空间隔离的抓包日志锚点,你可以直接在日志中过滤检索:
391
+ - `[wecom-runtime]`:插件整体初始化装配线、出入站分检
392
+ - `[wecom-ws]`:专门看 Bot WS 链路是否频繁掉线被踢、握手授权是否有效。
393
+ - `[wecom-http]`:监控与企微云端所有 HTTP 通信(如 Token 刷新、向企微主动抛消息等网络损耗/限流情况)。
394
+ - `[wecom-agent-delivery]`:看自建应用的被动反向代投情况以及群发选型问题。
437
395
 
438
396
  ---
439
397
 
@@ -441,130 +399,48 @@ Agent 输出 `{"template_card": ...}` 时自动渲染为交互卡片:
441
399
 
442
400
  ## 六、🙋 社区问答 (FAQ)
443
401
 
444
- 针对社区反馈的高频问题,我们已在 v2.2.4 版本中全部解决:
445
-
446
- **Q1: 同时使用 Bot 和 Agent 会导致消息重复吗?**
447
-
448
- > **A:** 不会。本插件采用“Bot 优先”策略。用户在哪个通道发消息,就从哪个通道回。只有在 Bot 无法处理(如发文件)时才会智能切换到 Agent 通道作为补充。
449
-
450
- **Q2: 使用内网穿透时,企业微信报错 60020 (IP 不白名单) 怎么办?**
402
+ 针对社区反馈的高频问题,解答如下:
451
403
 
452
- > **A:** 新增了 `config.network.egressProxyUrl` 配置。您可以配置一个拥有固定公网 IP 的代理服务器(如 Squid),让插件通过该代理与企微 API 通信,从而绕过动态 IP 限制。
404
+ **Q1: 能不能同时配置 `bot.ws` `bot.webhook`?**
405
+ > **A:** 完全可以,且强烈推荐一起预置填写。但真正被框架加载用于**接管实时会话流量**的,永远遵循 `bot.primaryTransport` 这个单选项切换开关。
453
406
 
454
- **Q3: 原生 Bot 模式支持图片,为什么 Agent 模式不行?**
407
+ **Q2: 为什么不要手写 callback path?**
408
+ > **A:** 因为由于重构后的引擎能承载大量的企业企微号同时并发挂载,所以必须抛弃写死的映射表。运行时已强制执行 `{accountId}` 前置命名空间策略路由分配。强行手写旧路由会被中间件劫并产生警告抛出。
455
409
 
456
- > **A:** Agent 模式之前确实存在此短板。但在 v2.2.4 中,我们完整实现了 Agent 端的 XML 媒体解析与 `media_id` 下载逻辑,现在 Agent 模式也能完美看图、听语音了。
410
+ **Q3: 为什么 `plugins list` 出现重复 `wecom` 报错?**
411
+ > **A:** 一定是因为你既使用了 `npm i @yanhaidao/wecom`,又尝试 clone 代码本地挂载了 `openclaw plugins install -l ./extensions/wecom` 产生了 npm/file 包竞态冲突导致。请进入配置目录显露出的隐藏子目录彻底清除只留其一即可。
457
412
 
458
- **Q4: 群里 @机器人 发送文件失败?**
413
+ **Q4: 使用内网穿透时,企业微信报错 60020 (IP 不白名单) 怎么办?**
414
+ > **A:** 请启用配置中的 `config.network.egressProxyUrl` 项。利用具有独立静态外网IP的二级跳板代理(比如 Squid),来穿透这层官方强制保护盾。
459
415
 
460
- > **A:** 因为企业微信 Bot 接口本身不支持发送非图片文件。我们的解决方案是:自动检测到文件发送需求后,改为通过 Agent 私信该用户发送文件,并在群里给出 "文件已私信发给您" 的提示。
416
+ **Q5: 为什么发视频给 Bot 没反应?**
417
+ > **A:** 官方 Bot 接口**不支持接收视频**。如果您需要处理视频内容,必须配置 Agent 小微应用,由于 Agent 下行具备富媒体流承接功能,本插件会自动从底层拦截将其解码并传输给底层大模型看。
461
418
 
462
- **Q5: 为什么在 Agent 模式下发送文件(如 PDF、Word)给机器人没有反应?**
419
+ ---
463
420
 
464
- > **A:** 这是由于企业微信官方接口限制。自建应用(Agent)的消息回调接口仅支持:文本、图片、语音、视频、位置和链接信息。**不支持**通用文件(File)类型的回调,因此插件无法感知您发送的文件。
421
+ <a id="sec-9"></a>
465
422
 
466
- **Q6: Cronjob 定时任务怎么发给群?**
423
+ ## 七、📮 联系我 与 版本协议
467
424
 
468
- > **A:** Cronjob 必须走 Agent 通道(Bot 无法主动发消息)。您只需在配置中指定 `to: "party:1"` (部门) 或 `to: "group:wr123..."` (外部群),即可实现定时推送到群。
425
+ ### v2.3.9 更新日志(2026-03-09)
469
426
 
470
- **Q7: 为什么发视频给 Bot 没反应?**
427
+ 本次版本重点收敛为“默认更易用、排障更直接、回调更稳定”:
471
428
 
472
- > **A:** 官方 Bot 接口**不支持接收视频**。如果您需要处理视频内容,请配置并使用 Agent 模式(Agent 支持接收视频)。
429
+ - **默认 Bot WebSocket 引导**:onboarding 默认写入 `bot.ws`,新用户无需域名即可完成机器人接入。
430
+ - **中文化配置体验**:企业微信插件自管账号创建与私聊策略提示,尽量避免流程中重复出现英文术语。
431
+ - **Bot WS 流式输出修复**:长连接模式支持块级流式交付,不再只保留最终结果。
432
+ - **Webhook / Agent 回调稳定性增强**:统一 HTTP 分发链路,并补齐默认账号显式路径,便于 Bot 与 Agent 回调稳定命中。
433
+ - **Agent 排障日志增强**:补充原始 callback、解密摘要、发送请求与响应日志,更容易定位“能接收但不能回复”的问题。
434
+ - **配置收敛**:移除 `bot.enabled` / `agent.enabled` 冗余字段,减少误导。
473
435
 
474
- ---
475
-
476
- <a id="sec-9"></a>
477
-
478
- ## 七、📮 联系我
436
+ 详细版本记录见 `changelog/v2.3.9.md`。
479
437
 
480
438
  微信交流群(扫码入群):
481
439
 
482
- ![企业微信交流群](https://openclaw.cc/wechat-openclaw-cn-qr.jpg)
440
+ ![企业微信交流群](https://openclaw.cc/wechat-github.jpg)
483
441
 
484
442
  维护者:YanHaidao(VX:YanHaidao)
485
443
 
486
- ---
487
-
488
- <a id="sec-legal"></a>
489
-
490
- ## ⚖️ 授权与原创声明
491
-
492
444
  本项目采用 **ISC License** 开源协议,并在此强调以下要求:
493
-
494
- 1. **保留署名**:根据 ISC 协议,您在任何分发、修改或使用本项目(或其部分逻辑)时,**必须**在显著位置完整保留本项目的版权声明(Copyright Notice)。
495
- 2. **尊重原创**:本项目包含的“Bot/Agent 自动化互补架构”、“长对话超时接力”、“WeCom 全媒体流自动化处理”等核心逻辑均为作者 **YanHaidao** 独立思考与实践的原创成果。
496
- 3. **维权申明**:对于恶意删除署名、像素级抄袭、混淆视听的恶意搬运行为,作者保留在社区公示及通过法律途径维权的权利。
497
-
498
- ---
499
-
500
- <a id="sec-10"></a>
501
- ## 八、📝 更新日志
502
-
503
- ### 2026.3.3(今日更新简报)
504
-
505
- - 【兼容性修复】🧩 **OpenClaw 3.1 路由抢占问题修复**:推荐回调地址升级为 `/plugins/wecom/bot/{accountId}`、`/plugins/wecom/agent/{accountId}`,规避根路径 Control UI fallback 抢占 webhook。
506
- - 【引导收敛】🧭 **Onboarding 仅支持账号化配置**:配置向导统一写入 `channels.wecom.accounts.<accountId>`,不再引导单账号旧结构。
507
- - 【兼容策略】🔁 **旧路径兼容保留**:`/wecom/*` 历史回调路径保留兼容能力,但不再作为维护主路径。
508
- - 【分流稳定性】🧭 **路由识别增强**:monitor 按插件命名空间账号路径识别,确保 Bot/Agent 分支稳定命中。
509
- - 【链路一致性】🔒 **Bot 回复不再误走 Agent**:修复 Bot 上下文通道标识,避免 `routeReply` 误触发到 outbound 主动发送链路。
510
- - 【验证结果】✅ WeCom 插件测试通过:`10` files / `41` tests。
511
-
512
- ### 2026.3.2(版本更新简报)
513
-
514
- - 【交付收口】🔄 修复 Bot 会话“正在搜索相关内容”不结束的问题,并在可用时推送最终流帧结束状态。
515
- - 【媒体兜底】📎 统一非图片文件、媒体失败和超时场景为“Bot 提示 + Agent 私信兜底”闭环,确保结果可达。
516
- - 【类型兼容】🧠 扩展 `txt/docx/xlsx/pptx/csv/zip` 等常见文件类型识别,并保留 `application/octet-stream` 自动重试。
517
- - 【工具治理】🛡 修复 Bot 会话 `message` 工具禁用策略,避免绕过 Bot 交付链路导致会话错位。
518
-
519
- ### 2026.2.28
520
-
521
- - 【重磅更新】🎯 **多账号/多智能体可用性增强**:支持按 `accountId` 做组内隔离(Bot + Agent + 路由绑定同组生效),动态 Agent 与会话键增加 `accountId` 维度,避免跨账号串会话。
522
- - 【稳定性】🔁 **生命周期兼容修复**:适配新版 OpenClaw Gateway 生命周期,`startAccount` 改为长生命周期运行,修复“几秒一次重启 + health-monitor 二次重启”的循环问题。
523
- - 【准确性】🔐 **XML 字段保真修复**:Agent XML 解析关闭自动数值化,保留 `FromUserName` 前导 `0`,并避免 `MsgId`(64 位)精度风险,确保会话与回复目标不被误改。
524
- - 【准确性】🧹 **误回复修复**:Bot/Agent 入站都增加事件过滤,`event`、`sys`、缺失发送者(以及群聊缺失 `chatid`)不再进入 AI 会话,避免“一个消息触发多人误回复”。
525
- - 【可控性】🧱 **配置安全护栏**:新增多账号冲突检测,自动拦截重复 `bot.token`、重复 `bot.aibotid`、重复 `agent(corpId+agentId)` 的配置并给出明确错误提示。
526
- - 【可控性】🛠 **账号管理修复**:`deleteAccount` 改为仅删除目标账号,不再误删整个 `channels.wecom`。
527
- - 【易用性】📘 **文档默认路径调整**:README 快速开始与配置说明改为优先展示“多账号 + 多 Agent”矩阵配置;单账号模式保留为兼容方案。
528
- - 【质量保障】✅ **回归保护**:新增账号解析、冲突检测、动态路由隔离、生命周期与入站过滤测试。
529
-
530
- ### 2026.2.7
531
-
532
- - ✨ **动态 Agent 路由**:新增按用户/群组隔离的动态路由功能,支持为每个对话主体自动分配独立的 Agent 实例(如 `wecom-dm-xxx`)。
533
- - 🛠 **自动注册机制**:动态生成的 Agent 会自动异步注册到 `agents.list` 配置中,实现多租户 Agent 的无感扩容与管理。
534
- - 🛡 **权限与兼容性**:支持 `adminUsers` 白名单绕过机制以使用主 Agent;功能默认关闭,确保对现有配置完全兼容。
535
- - ⚙️ **精细化配置**:新增 `channels.wecom.dynamicAgents` 配置项,可独立控制私聊和群聊的动态路由行为。
536
- - 🙏 **特别致谢**:感谢 [WhyMeta](https://github.com/WhyMeta) 开发者对动态路由实施方案的贡献。
537
-
538
- ### 2026.2.5
539
-
540
- - 🛠 **体验优化**:WeCom 媒体(图片/语音/视频/文件)处理的默认大小上限提升到 25MB,减少大文件因超限导致的“下载/保存失败”。
541
- - 📌 **可配置提示**:若仍遇到 Media exceeds ... limit,日志/回复会提示通过 channels.wecom.media.maxBytes 调整上限,并给出可直接执行的 openclaw config set 示例命令。
542
-
543
- ### 2026.2.4
544
-
545
- - 🚀 **架构升级**:实施 "Bot 优先 + Agent 兜底" 策略,兼顾流式体验与长任务稳定性(6分钟切换)。
546
- - ✨ **全模态支持**:Agent 模式完整支持接收图片/语音/视频(文件仅支持发送)。
547
- - ✨ **Cronjob 增强**:支持向部门 (`party:ID`) 和标签 (`tag:ID`) 广播消息。
548
- - 🛠 **Monitor 重构**:统一的消息防抖与流状态管理,提升并发稳定性。
549
- - 🛠 **体验优化**:修复企微重试导致的重复回复(Bot/Agent 均做 `msgid` 去重);优化 Bot 连续多条消息的排队/合并回执,避免“重复同一答案”或“消息失败提示”。
550
- - 🐞 **修复**:Outbound ID 解析逻辑及 API 客户端参数缺失问题。
551
-
552
- ### 2026.2.3
553
-
554
- - 🎉 **重大更新**:新增 Agent 模式(自建应用)支持
555
- - ✨ 双模式并行:Bot + Agent 可同时运行
556
- - ✨ **多模态支持**:Agent 模式支持图片/语音/文件/视频的接收与自动下载
557
- - ✨ AccessToken 自动管理:缓存 + 智能刷新
558
- - ✨ Agent 主动推送:脱离回调限制
559
- - ✨ XML 加解密:完整 Agent 回调支持
560
- - 📁 代码重构:模块化解耦设计
561
-
562
- ### 2026.1.31
563
-
564
- - 文档:补充入模与测试截图说明
565
- - 新增文件支持
566
- - 新增卡片支持
567
-
568
- ### 2026.1.30
569
-
570
- - 项目更名:Clawdbot → OpenClaw
445
+ 1. **保留署名**:在任何分发、修改或使用本项目时,**必须**完整保留本项目的版权声明。
446
+ 2. **尊重原创**:本项目包含的“架构”“长对话超时接力”等均为作者 **YanHaidao** 核心成果,拒绝任何去署名的“纯搬运”剽窃。