@yanhaidao/wecom 2.3.180 → 2.3.260

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 (39) hide show
  1. package/.github/workflows/release.yml +23 -4
  2. package/README.md +87 -2
  3. package/SKILLS_DOC.md +272 -120
  4. package/changelog/v2.3.19.md +73 -0
  5. package/changelog/v2.3.26.md +21 -0
  6. package/package.json +2 -2
  7. package/src/agent/handler.ts +5 -3
  8. package/src/app/account-runtime.ts +5 -1
  9. package/src/app/index.ts +117 -0
  10. package/src/capability/bot/stream-orchestrator.ts +1 -1
  11. package/src/capability/doc/client.ts +228 -9
  12. package/src/capability/doc/tool.ts +14 -7
  13. package/src/channel.ts +1 -1
  14. package/src/config/index.ts +7 -1
  15. package/src/config/media.test.ts +113 -0
  16. package/src/config/media.ts +130 -5
  17. package/src/config/schema.ts +3 -0
  18. package/src/context-store.ts +264 -0
  19. package/src/onboarding.ts +1 -1
  20. package/src/outbound.test.ts +565 -5
  21. package/src/outbound.ts +94 -7
  22. package/src/runtime/dispatcher.ts +24 -5
  23. package/src/runtime/routing-bridge.test.ts +115 -0
  24. package/src/runtime/routing-bridge.ts +26 -1
  25. package/src/runtime/session-manager.test.ts +135 -0
  26. package/src/runtime/session-manager.ts +40 -8
  27. package/src/runtime/source-registry.ts +79 -0
  28. package/src/runtime.ts +3 -0
  29. package/src/target.ts +20 -8
  30. package/src/transport/bot-webhook/inbound-normalizer.ts +4 -4
  31. package/src/transport/bot-ws/media.test.ts +44 -0
  32. package/src/transport/bot-ws/media.ts +7 -4
  33. package/src/transport/bot-ws/reply.test.ts +131 -1
  34. package/src/transport/bot-ws/reply.ts +15 -3
  35. package/src/transport/bot-ws/sdk-adapter.ts +2 -1
  36. package/src/transport/http/registry.ts +1 -1
  37. package/src/types/config.ts +3 -0
  38. package/src/types/runtime.ts +1 -0
  39. package/src/wecom_msg_adapter/markdown_adapter.ts +331 -0
@@ -96,14 +96,33 @@ jobs:
96
96
  id: notes
97
97
  run: |
98
98
  set -euo pipefail
99
- CHANGELOG_FILE="changelog/v${{ steps.meta.outputs.version }}.md"
100
- if [ -f "${CHANGELOG_FILE}" ]; then
99
+ VERSION="${{ steps.meta.outputs.version }}"
100
+ CHANGELOG_DIR="changelog"
101
+ CHANGELOG_FILE=""
102
+ CANDIDATES=("v${VERSION}.md")
103
+
104
+ IFS='.' read -r major minor patch <<< "${VERSION}"
105
+ if [[ -n "${major:-}" && -n "${minor:-}" && -n "${patch:-}" && "${patch}" =~ ^[0-9]+$ && ${#patch} -gt 2 ]]; then
106
+ trimmed_patch="${patch%?}"
107
+ CANDIDATES+=("v${major}.${minor}.${trimmed_patch}.md")
108
+ fi
109
+
110
+ echo "Release notes candidates:"
111
+ for candidate in "${CANDIDATES[@]}"; do
112
+ path="${CHANGELOG_DIR}/${candidate}"
113
+ echo " - ${path}"
114
+ if [[ -z "${CHANGELOG_FILE}" && -f "${path}" ]]; then
115
+ CHANGELOG_FILE="${path}"
116
+ fi
117
+ done
118
+
119
+ if [[ -n "${CHANGELOG_FILE}" ]]; then
101
120
  echo "Using changelog file: ${CHANGELOG_FILE}"
102
121
  cp "${CHANGELOG_FILE}" /tmp/release-body.md
103
122
  else
104
- echo "Changelog file missing: ${CHANGELOG_FILE}; using fallback notes."
123
+ echo "No matching changelog file found; using fallback notes."
105
124
  {
106
- echo "# @yanhaidao/wecom v${{ steps.meta.outputs.version }}"
125
+ echo "# @yanhaidao/wecom v${VERSION}"
107
126
  echo
108
127
  if [ "${{ steps.npm_check.outputs.exists }}" = "true" ]; then
109
128
  echo "- npm publish skipped: version already exists."
package/README.md CHANGED
@@ -161,7 +161,18 @@
161
161
  ## 📋 最近更新 (Changelog摘要)
162
162
 
163
163
  > 项目保持高频迭代,全面对齐甚至超越企业真实业务诉求。
164
- > **为保持精简,以下仅展示近期 3 次重大架构演进,完整历史版本(含全部 `v2.2.x`)请前往 [changelog/ 目录](./changelog/) 查阅。**
164
+ > **为保持精简,以下仅展示近期 5 次重要更新,完整历史版本(含全部 `v2.2.x`)请前往 [changelog/ 目录](./changelog/) 查阅。**
165
+
166
+ #### 📌 v2.3.26(2026-03-26)
167
+ - **[重要修复] 升级 OpenClaw 后不再乱报错** 🔧 修复了新版 OpenClaw 下 `wecom` 插件容易出现的 `is not a function` 一类启动/运行错误。
168
+ - **[回复更稳] Agent 和 Bot WS 不再乱串** ↔️ 现在是谁收到消息,就尽量由谁来回复,不再容易出现“在 Agent 里说话,结果 Bot WS 回你”的情况。
169
+ - **[体验修复] Bot WS 发图后不再多冒一条 `Done...`** 🖼 之前常见表现是:`正在思考` -> 图片 -> 又多一条完成提示。现在最终收尾会尽量接回原来的回复链路。
170
+ - **[占位符修复] 不会一直卡在“正在思考...”** ⏳ 如果图片或文本已经发出去了,占位符会更自然地结束,不会继续无意义地刷屏。
171
+
172
+ #### 📌 v2.3.19(2026-03-19)
173
+ - **[重要修复] Bot WS 现在也真正走 `dynamicAgents`** 🧭 之前同样开启动态路由时,不同消息链路的行为并不完全一致:Webhook / Agent 能按用户、群聊隔离,Bot WebSocket 却可能重新落回主 Agent。现在 WS 运行时也执行同样的动态路由逻辑,会话隔离终于统一了。
174
+ - **[配置统一] 媒体大小开始优先跟随 OpenClaw 标准 `mediaMaxMb`** 📦 之前 WeCom 插件更偏向读取自己的 `media.maxBytes`,用户改了 OpenClaw 主配置却可能感觉“改了没生效”。现在插件优先支持 `channels.wecom.mediaMaxMb`,并支持 `channels.wecom.accounts.<accountId>.mediaMaxMb` 做账号级覆盖;旧配置仍兼容,但只作为兜底。
175
+ - **[体验修复] 常见本地目录文件现在更符合直觉地可发送** 🖼 过去本地媒体白名单更偏向 OpenClaw 自己目录,导致像 `Downloads`、`Desktop`、`Pictures` 里的图片明明存在,却常被拦下。现在插件默认额外放行这些常见用户目录,同时保留 `channels.wecom.media.localRoots` 继续追加共享盘、挂载盘和业务目录。
165
176
 
166
177
  #### 📌 v2.3.18(2026-03-18)
167
178
  - **[重大升级] 双平面能力融合(Bot WS + MCP 强化)** 🚀 独家引入挂载式的 MCP 能力层。在保留原生 Agent 强力工具的同时,将官方新开放的企业微信能力暴露给大模型。现在,大模型可凭用户身份读写待办、日程、查通讯录。
@@ -250,8 +261,13 @@ openclaw plugins enable wecom
250
261
  }
251
262
  }
252
263
  },
264
+ "mediaMaxMb": 50, // 优先使用 OpenClaw 标准媒体上限配置
253
265
  "media": {
254
- "tempDir": "/tmp/openclaw-wecom-media"
266
+ "tempDir": "/tmp/openclaw-wecom-media",
267
+ "localRoots": [
268
+ "/srv/company-share",
269
+ "/data/reports"
270
+ ]
255
271
  },
256
272
  "network": { // 内网或受限网络环境可通过代理出网
257
273
  "egressProxyUrl": "http://127.0.0.1:3128"
@@ -267,6 +283,15 @@ openclaw plugins enable wecom
267
283
  }
268
284
  ```
269
285
 
286
+ 其中:
287
+
288
+ - 插件现在默认额外放行常见用户目录:`~/Desktop`、`~/Documents`、`~/Downloads`、`~/Movies`、`~/Pictures`。
289
+ - `channels.wecom.mediaMaxMb` 是首选的媒体大小上限配置,`channels.wecom.accounts.<id>.mediaMaxMb` 可以做账号级覆盖。
290
+ - `channels.wecom.media.localRoots` 用于继续追加你自己的全局目录,例如共享盘、挂载盘或业务导出目录。
291
+ - 旧的 `channels.wecom.media.maxBytes` 仍然兼容,但仅作为向后兼容兜底;新配置建议统一改成 `mediaMaxMb`。
292
+ - 这些目录会和 OpenClaw 默认允许的媒体目录一起生效,不会覆盖默认白名单。
293
+ - 也就是说,像 `~/Downloads/01.png` 这类本机文件现在默认就可以直接发到企微,不需要再单独配置。
294
+
270
295
  > **注意:** 历史配置里的 `agent.corpSecret` 引擎依然能够向后兼容拾起,但后续的新项目推荐采用标准的 `agentSecret` 作为对齐键。
271
296
 
272
297
  ### 1.4 dynamicAgents 详细说明:为什么生产环境建议开启
@@ -295,6 +320,66 @@ openclaw plugins enable wecom
295
320
  需要注意的是,`dynamicAgents` 解决的是“路由隔离”和“会话隔离”,不是权限系统本身。
296
321
  也就是说,它能显著减少上下文串线,但账号是否允许私聊、谁能触发命令、某个账号绑定到哪个主 Agent,仍然要结合 `dm.policy`、`bindings` 和企业微信授权配置一起看。
297
322
 
323
+ ### 1.5 `localRoots` 详细说明:为什么“文件明明存在”,系统却仍然不发
324
+
325
+ `localRoots` 只决定一件事:**这个本地路径允不允许被当作可发送媒体读取。**
326
+
327
+ | 现象 | 实际含义 |
328
+ |---|---|
329
+ | 文件存在,但发送失败 | 不代表系统允许读取它 |
330
+ | 日志出现 `Local media path is not under an allowed directory` | 路径不在白名单里 |
331
+ | 远程 `https://...` 媒体可以发 | 远程 URL 不走 `localRoots` |
332
+
333
+ 默认已经额外放行这些目录:
334
+
335
+ | 默认允许目录 | 用途 |
336
+ |---|---|
337
+ | `~/Desktop` | 桌面文件、临时截图 |
338
+ | `~/Documents` | 文档导出目录 |
339
+ | `~/Downloads` | 下载图片、下载文件 |
340
+ | `~/Movies` | 视频文件 |
341
+ | `~/Pictures` | 图片、相册导出 |
342
+
343
+ 另外也保留 OpenClaw 自己的 `tmp / state / workspace` 相关目录。
344
+
345
+ 如果文件不在默认目录里,再补 `localRoots`:
346
+
347
+ ```json
348
+ {
349
+ "channels": {
350
+ "wecom": {
351
+ "media": {
352
+ "localRoots": [
353
+ "/srv/company-share",
354
+ "/data/reports",
355
+ "/mnt/nas/public"
356
+ ]
357
+ }
358
+ }
359
+ }
360
+ }
361
+ ```
362
+
363
+ 配置规则:
364
+
365
+ | 规则 | 说明 |
366
+ |---|---|
367
+ | `localRoots` 是追加 | 不会覆盖默认目录 |
368
+ | 建议写绝对路径 | 团队环境更稳定、更清楚 |
369
+ | 只加业务需要的目录 | 不要为了省事把范围放太大 |
370
+ | 不建议放整个大盘或整个用户目录 | 会把本地文件读取边界放得过宽 |
371
+
372
+ 排障判断:
373
+
374
+ | 问题类型 | 看什么 |
375
+ |---|---|
376
+ | 本地路径是否允许读取 | `localRoots` |
377
+ | 媒体能处理多大 | `channels.wecom.mediaMaxMb` |
378
+ | 企业微信最终能不能收 | 企业微信自身媒体限制 |
379
+ | 远程媒体能不能发 | URL 可访问性,不看 `localRoots` |
380
+
381
+ 一句话:`localRoots` 管“能不能读这个本地路径”,`mediaMaxMb` 管“最多读多大”。
382
+
298
383
  ---
299
384
 
300
385
  ## 二、🏢 企业微信后台回调挂载指南 (针对使用了 Webhook 或 Agent Callback 的重度用户)