@yanhaidao/wecom 2.4.120 → 2.5.110
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/README.md +4 -5
- package/dist/index.js +68 -0
- package/dist/src/accounts.js +20 -0
- package/dist/src/agent/handler.js +895 -0
- package/dist/src/agent/index.js +5 -0
- package/dist/src/app/account-runtime.js +216 -0
- package/dist/src/app/bootstrap.js +19 -0
- package/dist/src/app/index.js +118 -0
- package/dist/src/capability/agent/delivery-service.js +63 -0
- package/dist/src/capability/agent/fallback-policy.js +6 -0
- package/dist/src/capability/agent/ingress-service.js +33 -0
- package/dist/src/capability/agent/upstream-delivery-service.js +71 -0
- package/dist/src/capability/bot/dispatch-config.js +45 -0
- package/dist/src/capability/bot/fallback-delivery.js +147 -0
- package/dist/src/capability/bot/local-path-delivery.js +178 -0
- package/dist/src/capability/bot/sandbox-media.js +138 -0
- package/dist/src/capability/bot/service.js +49 -0
- package/dist/src/capability/bot/stream-delivery.js +321 -0
- package/dist/src/capability/bot/stream-finalizer.js +81 -0
- package/dist/src/capability/bot/stream-orchestrator.js +318 -0
- package/dist/src/capability/bot/types.js +1 -0
- package/{src/capability/calendar/client.ts → dist/src/capability/calendar/client.js} +118 -241
- package/{src/capability/calendar/schema.ts → dist/src/capability/calendar/schema.js} +0 -38
- package/dist/src/capability/calendar/tool.js +365 -0
- package/dist/src/capability/calendar/types.js +12 -0
- package/{src/capability/doc/client.ts → dist/src/capability/doc/client.js} +370 -605
- package/{src/capability/doc/schema.ts → dist/src/capability/doc/schema.js} +345 -394
- package/dist/src/capability/doc/tool.js +1556 -0
- package/dist/src/capability/doc/types.js +113 -0
- package/dist/src/capability/mcp/index.js +3 -0
- package/dist/src/capability/mcp/schema.js +102 -0
- package/dist/src/capability/mcp/tool.js +146 -0
- package/dist/src/capability/mcp/transport.js +293 -0
- package/dist/src/channel.js +224 -0
- package/dist/src/config/accounts.js +236 -0
- package/dist/src/config/derived-paths.js +31 -0
- package/dist/src/config/index.js +7 -0
- package/dist/src/config/media.js +110 -0
- package/dist/src/config/network.js +32 -0
- package/dist/src/config/routing.js +20 -0
- package/dist/src/config/runtime-config.js +25 -0
- package/dist/src/config/schema.js +4 -0
- package/{src/config-schema.ts → dist/src/config-schema.js} +1 -1
- package/dist/src/context-store.js +219 -0
- package/{src/crypto/aes.ts → dist/src/crypto/aes.js} +11 -28
- package/dist/src/crypto/index.js +9 -0
- package/{src/crypto/signature.ts → dist/src/crypto/signature.js} +3 -18
- package/{src/crypto/xml.ts → dist/src/crypto/xml.js} +3 -11
- package/dist/src/crypto.js +145 -0
- package/dist/src/domain/models.js +1 -0
- package/dist/src/domain/policies.js +32 -0
- package/{src/dynamic-agent.ts → dist/src/dynamic-agent.js} +36 -73
- package/dist/src/gateway-monitor.js +139 -0
- package/dist/src/http.js +114 -0
- package/{src/media.ts → dist/src/media.js} +21 -40
- package/dist/src/monitor/limits.js +7 -0
- package/dist/src/monitor/state.js +28 -0
- package/dist/src/monitor.js +84 -0
- package/dist/src/observability/audit-log.js +30 -0
- package/dist/src/observability/legacy-operational-event-store.js +22 -0
- package/dist/src/observability/raw-envelope-log.js +24 -0
- package/dist/src/observability/status-registry.js +9 -0
- package/dist/src/observability/transport-session-view.js +14 -0
- package/dist/src/onboarding.js +546 -0
- package/dist/src/outbound.js +557 -0
- package/dist/src/runtime/dispatcher.js +57 -0
- package/{src/runtime/index.ts → dist/src/runtime/index.js} +0 -1
- package/dist/src/runtime/outbound-intent.js +1 -0
- package/dist/src/runtime/reply-orchestrator.js +38 -0
- package/dist/src/runtime/routing-bridge.js +26 -0
- package/dist/src/runtime/session-manager.js +112 -0
- package/dist/src/runtime/source-registry.js +174 -0
- package/dist/src/runtime.js +1 -0
- package/dist/src/shared/command-auth.js +57 -0
- package/{src/shared/index.ts → dist/src/shared/index.js} +0 -1
- package/dist/src/shared/media-asset.js +65 -0
- package/dist/src/shared/media-service.js +59 -0
- package/dist/src/shared/media-types.js +1 -0
- package/{src/shared/xml-parser.ts → dist/src/shared/xml-parser.js} +72 -63
- package/dist/src/store/active-reply-store.js +41 -0
- package/dist/src/store/interfaces.js +1 -0
- package/dist/src/store/memory-store.js +33 -0
- package/dist/src/store/stream-batch-store.js +319 -0
- package/{src/target.ts → dist/src/target.js} +15 -48
- package/dist/src/transport/agent-api/client.js +168 -0
- package/dist/src/transport/agent-api/core.js +337 -0
- package/dist/src/transport/agent-api/delivery.js +28 -0
- package/dist/src/transport/agent-api/media-upload.js +4 -0
- package/dist/src/transport/agent-api/reply.js +24 -0
- package/dist/src/transport/agent-api/upstream-delivery.js +30 -0
- package/dist/src/transport/agent-api/upstream-media-upload.js +46 -0
- package/dist/src/transport/agent-api/upstream-reply.js +26 -0
- package/dist/src/transport/agent-callback/http-handler.js +30 -0
- package/dist/src/transport/agent-callback/inbound.js +4 -0
- package/dist/src/transport/agent-callback/reply.js +8 -0
- package/dist/src/transport/agent-callback/request-handler.js +189 -0
- package/dist/src/transport/agent-callback/session.js +15 -0
- package/dist/src/transport/bot-webhook/active-reply.js +27 -0
- package/dist/src/transport/bot-webhook/http-handler.js +31 -0
- package/dist/src/transport/bot-webhook/inbound-normalizer.js +496 -0
- package/dist/src/transport/bot-webhook/inbound.js +4 -0
- package/dist/src/transport/bot-webhook/message-shape.js +98 -0
- package/dist/src/transport/bot-webhook/protocol.js +124 -0
- package/dist/src/transport/bot-webhook/reply.js +9 -0
- package/dist/src/transport/bot-webhook/request-handler.js +285 -0
- package/dist/src/transport/bot-webhook/session.js +15 -0
- package/dist/src/transport/bot-ws/inbound.js +147 -0
- package/dist/src/transport/bot-ws/media.js +236 -0
- package/dist/src/transport/bot-ws/reply.js +310 -0
- package/dist/src/transport/bot-ws/sdk-adapter.js +257 -0
- package/dist/src/transport/bot-ws/session.js +15 -0
- package/dist/src/transport/http/common.js +78 -0
- package/dist/src/transport/http/registry.js +71 -0
- package/dist/src/transport/http/request-handler.js +51 -0
- package/{src/transport/index.ts → dist/src/transport/index.js} +2 -10
- package/dist/src/types/account.js +1 -0
- package/dist/src/types/config.js +1 -0
- package/dist/src/types/constants.js +28 -0
- package/dist/src/types/events.js +1 -0
- package/dist/src/types/index.js +1 -0
- package/dist/src/types/legacy-stream.js +1 -0
- package/dist/src/types/message.js +5 -0
- package/dist/src/types/runtime-context.js +1 -0
- package/dist/src/types/runtime.js +1 -0
- package/dist/src/types.js +1 -0
- package/dist/src/upstream/index.js +111 -0
- package/dist/src/wecom_msg_adapter/markdown_adapter.js +280 -0
- package/openclaw.plugin.json +15 -0
- package/package.json +18 -1
- package/.github/workflows/release.yml +0 -143
- package/GOVERNANCE.md +0 -26
- package/MENU_EVENT_CONF.md +0 -500
- package/MENU_EVENT_PLAN.md +0 -440
- package/SKILLS_CAL.md +0 -895
- package/SKILLS_DOC.md +0 -2288
- package/UPSTREAM_CONFIG.md +0 -170
- package/UPSTREAM_PLAN.md +0 -175
- package/assets/01.bot-add.png +0 -0
- package/assets/01.bot-setp2.png +0 -0
- package/assets/01.image.jpg +0 -0
- package/assets/02.agent.add.png +0 -0
- package/assets/02.agent.api-set.png +0 -0
- package/assets/02.image.jpg +0 -0
- package/assets/03.agent.page.png +0 -0
- package/assets/03.bot.page.png +0 -0
- package/assets/link-me.jpg +0 -0
- package/assets/register.png +0 -0
- package/changelog/v2.2.28.md +0 -70
- package/changelog/v2.3.10.md +0 -17
- package/changelog/v2.3.11.md +0 -19
- package/changelog/v2.3.12.md +0 -25
- package/changelog/v2.3.13.md +0 -19
- package/changelog/v2.3.14.md +0 -48
- package/changelog/v2.3.15.md +0 -15
- package/changelog/v2.3.16.md +0 -11
- package/changelog/v2.3.18.md +0 -22
- package/changelog/v2.3.19.md +0 -73
- package/changelog/v2.3.2.md +0 -28
- package/changelog/v2.3.26.md +0 -21
- package/changelog/v2.3.27.md +0 -33
- package/changelog/v2.3.4.md +0 -20
- package/changelog/v2.3.9.md +0 -22
- package/changelog/v2.4.12.md +0 -37
- package/compat-single-account.md +0 -148
- package/index.test.ts +0 -38
- package/scripts/test-proxy.ts +0 -70
- package/scripts/wecom/README.md +0 -123
- package/scripts/wecom/menu-click-help.js +0 -59
- package/scripts/wecom/menu-click-help.py +0 -55
- package/src/accounts.ts +0 -34
- package/src/agent/api-client.upload.test.ts +0 -109
- package/src/agent/event-router.test.ts +0 -421
- package/src/agent/event-router.ts +0 -272
- package/src/agent/handler.event-filter.test.ts +0 -135
- package/src/agent/handler.ts +0 -1250
- package/src/agent/index.ts +0 -12
- package/src/agent/script-runner.ts +0 -186
- package/src/agent/test-fixtures/invalid-json-script.mjs +0 -1
- package/src/agent/test-fixtures/reply-event-script.mjs +0 -29
- package/src/agent/test-fixtures/reply-event-script.py +0 -17
- package/src/app/account-runtime.ts +0 -276
- package/src/app/bootstrap.ts +0 -29
- package/src/app/index.ts +0 -192
- package/src/capability/agent/delivery-service.ts +0 -87
- package/src/capability/agent/fallback-policy.ts +0 -13
- package/src/capability/agent/ingress-service.ts +0 -38
- package/src/capability/agent/upstream-delivery-service.ts +0 -96
- package/src/capability/bot/dispatch-config.ts +0 -47
- package/src/capability/bot/fallback-delivery.ts +0 -178
- package/src/capability/bot/local-path-delivery.ts +0 -215
- package/src/capability/bot/sandbox-media.test.ts +0 -221
- package/src/capability/bot/sandbox-media.ts +0 -176
- package/src/capability/bot/service.ts +0 -56
- package/src/capability/bot/stream-delivery.ts +0 -379
- package/src/capability/bot/stream-finalizer.ts +0 -120
- package/src/capability/bot/stream-orchestrator.ts +0 -371
- package/src/capability/bot/types.ts +0 -8
- package/src/capability/calendar/SKILLS_CHECKLIST.md +0 -251
- package/src/capability/calendar/tool.ts +0 -417
- package/src/capability/calendar/types.ts +0 -309
- package/src/capability/doc/tool.ts +0 -1629
- package/src/capability/doc/types.ts +0 -792
- package/src/capability/mcp/index.ts +0 -10
- package/src/capability/mcp/schema.ts +0 -107
- package/src/capability/mcp/tool.ts +0 -174
- package/src/capability/mcp/transport.ts +0 -394
- package/src/channel.config.test.ts +0 -180
- package/src/channel.lifecycle.test.ts +0 -255
- package/src/channel.meta.test.ts +0 -26
- package/src/channel.ts +0 -256
- package/src/config/accounts.resolve.test.ts +0 -75
- package/src/config/accounts.ts +0 -312
- package/src/config/derived-paths.test.ts +0 -111
- package/src/config/derived-paths.ts +0 -41
- package/src/config/index.ts +0 -22
- package/src/config/media.test.ts +0 -113
- package/src/config/media.ts +0 -139
- package/src/config/network.ts +0 -20
- package/src/config/routing.test.ts +0 -88
- package/src/config/routing.ts +0 -26
- package/src/config/runtime-config.ts +0 -46
- package/src/config/schema.ts +0 -144
- package/src/context-store.ts +0 -297
- package/src/crypto/index.ts +0 -24
- package/src/crypto.test.ts +0 -32
- package/src/crypto.ts +0 -176
- package/src/domain/models.ts +0 -7
- package/src/domain/policies.ts +0 -36
- package/src/dynamic-agent.account-scope.test.ts +0 -17
- package/src/gateway-monitor.ts +0 -181
- package/src/http.ts +0 -137
- package/src/media.test.ts +0 -82
- package/src/monitor/limits.ts +0 -7
- package/src/monitor/state.queue.test.ts +0 -185
- package/src/monitor/state.ts +0 -34
- package/src/monitor.active.test.ts +0 -245
- package/src/monitor.inbound-filter.test.ts +0 -63
- package/src/monitor.integration.test.ts +0 -208
- package/src/monitor.ts +0 -121
- package/src/monitor.webhook.test.ts +0 -774
- package/src/observability/audit-log.ts +0 -48
- package/src/observability/legacy-operational-event-store.ts +0 -36
- package/src/observability/raw-envelope-log.ts +0 -28
- package/src/observability/status-registry.ts +0 -13
- package/src/observability/transport-session-view.ts +0 -14
- package/src/onboarding.test.ts +0 -336
- package/src/onboarding.ts +0 -704
- package/src/outbound.test.ts +0 -1271
- package/src/outbound.ts +0 -746
- package/src/runtime/dispatcher.ts +0 -71
- package/src/runtime/outbound-intent.ts +0 -4
- package/src/runtime/reply-orchestrator.test.ts +0 -71
- package/src/runtime/reply-orchestrator.ts +0 -67
- package/src/runtime/routing-bridge.test.ts +0 -115
- package/src/runtime/routing-bridge.ts +0 -44
- package/src/runtime/session-manager.test.ts +0 -174
- package/src/runtime/session-manager.ts +0 -139
- package/src/runtime/source-registry.ts +0 -249
- package/src/runtime.ts +0 -14
- package/src/shared/command-auth.ts +0 -87
- package/src/shared/media-asset.ts +0 -78
- package/src/shared/media-service.test.ts +0 -111
- package/src/shared/media-service.ts +0 -84
- package/src/shared/media-types.ts +0 -5
- package/src/shared/xml-parser.test.ts +0 -50
- package/src/store/active-reply-store.ts +0 -42
- package/src/store/interfaces.ts +0 -11
- package/src/store/memory-store.ts +0 -43
- package/src/store/stream-batch-store.ts +0 -350
- package/src/transport/agent-api/client.ts +0 -277
- package/src/transport/agent-api/core.ts +0 -463
- package/src/transport/agent-api/delivery.ts +0 -41
- package/src/transport/agent-api/media-upload.ts +0 -11
- package/src/transport/agent-api/reply.ts +0 -39
- package/src/transport/agent-api/upstream-delivery.ts +0 -45
- package/src/transport/agent-api/upstream-media-upload.ts +0 -70
- package/src/transport/agent-api/upstream-reply.ts +0 -43
- package/src/transport/agent-callback/http-handler.ts +0 -47
- package/src/transport/agent-callback/inbound.ts +0 -5
- package/src/transport/agent-callback/reply.ts +0 -13
- package/src/transport/agent-callback/request-handler.ts +0 -244
- package/src/transport/agent-callback/session.ts +0 -23
- package/src/transport/bot-webhook/active-reply.ts +0 -39
- package/src/transport/bot-webhook/http-handler.ts +0 -48
- package/src/transport/bot-webhook/inbound-normalizer.ts +0 -371
- package/src/transport/bot-webhook/inbound.ts +0 -5
- package/src/transport/bot-webhook/message-shape.ts +0 -89
- package/src/transport/bot-webhook/protocol.ts +0 -148
- package/src/transport/bot-webhook/reply.ts +0 -15
- package/src/transport/bot-webhook/request-handler.ts +0 -394
- package/src/transport/bot-webhook/session.ts +0 -23
- package/src/transport/bot-ws/inbound.test.ts +0 -96
- package/src/transport/bot-ws/inbound.ts +0 -116
- package/src/transport/bot-ws/media.test.ts +0 -44
- package/src/transport/bot-ws/media.ts +0 -321
- package/src/transport/bot-ws/reply.test.ts +0 -450
- package/src/transport/bot-ws/reply.ts +0 -365
- package/src/transport/bot-ws/sdk-adapter.test.ts +0 -187
- package/src/transport/bot-ws/sdk-adapter.ts +0 -314
- package/src/transport/bot-ws/session.ts +0 -28
- package/src/transport/http/common.ts +0 -109
- package/src/transport/http/registry.ts +0 -92
- package/src/transport/http/request-handler.ts +0 -84
- package/src/types/account.ts +0 -72
- package/src/types/config.ts +0 -166
- package/src/types/constants.ts +0 -31
- package/src/types/events.ts +0 -21
- package/src/types/global.d.ts +0 -9
- package/src/types/index.ts +0 -17
- package/src/types/legacy-stream.ts +0 -50
- package/src/types/message.ts +0 -187
- package/src/types/runtime-context.ts +0 -28
- package/src/types/runtime.ts +0 -165
- package/src/types.ts +0 -41
- package/src/upstream/index.ts +0 -150
- package/src/upstream.test.ts +0 -84
- package/src/wecom_msg_adapter/markdown_adapter.ts +0 -331
- package/tsconfig.json +0 -22
- package/vitest.config.ts +0 -26
- /package/{src/capability/agent/index.ts → dist/src/capability/agent/index.js} +0 -0
- /package/{src/capability/bot/index.ts → dist/src/capability/bot/index.js} +0 -0
- /package/{src/capability/calendar/index.ts → dist/src/capability/calendar/index.js} +0 -0
- /package/{src/capability/index.ts → dist/src/capability/index.js} +0 -0
package/changelog/v2.3.19.md
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
# OpenClaw WeCom 插件 v2.3.19 变更简报
|
|
2
|
-
|
|
3
|
-
> [!TIP]
|
|
4
|
-
> `v2.3.19` 主要修了四件和真实使用强相关的问题:第一,本机图片/文件终于能更自然地发出去,不再默认只认 OpenClaw 自己目录里的文件;第二,走 Bot WebSocket 时,`dynamicAgents` 也会真正生效,不会再出现“同样开了动态路由,但 WS 会话还是串到主 Agent”这种割裂行为;第三,媒体大小上限开始统一跟随 OpenClaw 标准配置 `mediaMaxMb`,不再是 WeCom 插件自己一套、OpenClaw 主配置又是一套;第四,Bot WS 对话里的图片/文件现在会尽量留在当前 Bot WS 对话里发送,不再静默切到 Agent 私聊链路。
|
|
5
|
-
|
|
6
|
-
## 2026-03-19(v2.3.19)
|
|
7
|
-
- 【修复 WS 不走 dynamicAgents】**[重要修复]** 之前 `dynamicAgents` 只在旧消息链路上生效,新的 Bot WebSocket 统一运行时没有把这层路由覆盖带进去。结果就是,同样一份配置,在 Webhook 或 Agent 路径上能按“每个用户 / 每个群”隔离会话,但走 WS 时却可能重新落回主 Agent。现在 WS 运行时也会执行同样的动态路由逻辑,单聊、群聊的隔离行为终于统一了。
|
|
8
|
-
- 【修正 Bot WS 对话里的媒体回落策略】**[重要修复]** 如果当前消息本来就在 Bot WS 对话流里,图片/文件发送现在会优先并固定留在同一个 Bot WS 会话内处理。一旦已经尝试过 WS 发送,就不再静默回落到 Agent 私聊链路,避免用户明明在一个 Bot 对话里操作,结果媒体却从另一个 Agent 会话发出来。这个调整只针对 Bot WS,对 Bot Webhook 模式没有影响。
|
|
9
|
-
- 【统一媒体大小配置到 OpenClaw 标准】之前 WeCom 插件内部主要认自己的 `channels.wecom.media.maxBytes`,而不是 OpenClaw 通用的 `mediaMaxMb`。这会带来一个很直接的问题:你明明已经在 OpenClaw 里把媒体大小放宽了,WeCom 这边却还像没看见一样。现在插件会优先读取 `channels.wecom.mediaMaxMb`,并支持 `channels.wecom.accounts.<accountId>.mediaMaxMb` 做账号级覆盖;旧的 `channels.wecom.media.maxBytes` 仍然保留兼容,但只作为历史配置兜底。
|
|
10
|
-
- 【补齐 Bot WS 媒体发送链路的大小透传】Bot WS 在读取本地文件、下载远程媒体并上传到企业微信前,现在会真正带上解析后的 `mediaMaxMb` 上限,而不是继续走内部固定值。换句话说,媒体大小限制终于从“写在配置里”和“运行时真的执行”两边对齐了。
|
|
11
|
-
- 【放宽本地文件默认可发送目录】之前本地媒体白名单更偏向 OpenClaw 自己的状态目录,所以像 `~/Downloads/01.png` 这种很自然的用户文件路径,虽然文件确实存在,也会被当成“不允许发送”。现在插件默认额外放行常见用户目录:`~/Desktop`、`~/Documents`、`~/Downloads`、`~/Movies`、`~/Pictures`。对普通用户来说,这意味着“桌面、下载、图片目录里的文件”现在默认就更符合直觉地可发送了。
|
|
12
|
-
- 【支持继续追加自定义本地媒体目录】除了默认目录外,现在仍然可以通过 `channels.wecom.media.localRoots` 继续追加共享盘、挂载盘、业务导出目录等自定义路径。这里的设计原则很简单:默认给出大多数人会用到的目录,但不假设所有企业的数据都在同一个地方。
|
|
13
|
-
- 【文案与排障提示同步更新】当媒体太大或解密失败时,提示语现在会直接指向 `channels.wecom.mediaMaxMb` 这套推荐配置,避免用户继续被旧的 `media.maxBytes` 误导。
|
|
14
|
-
|
|
15
|
-
## 这次改动背后的最小理解模型
|
|
16
|
-
|
|
17
|
-
把这次版本理解成四句话就够了:
|
|
18
|
-
|
|
19
|
-
1. **会话该隔离的,要真的隔离。**
|
|
20
|
-
你开了 `dynamicAgents`,系统就应该不管走 Webhook、Agent Callback 还是 Bot WS,都稳定地把“不同用户 / 不同群”落到不同会话上,而不是不同链路表现不一致。
|
|
21
|
-
|
|
22
|
-
2. **从哪个对话开始,就该尽量在哪个对话里发回去。**
|
|
23
|
-
如果用户是在 Bot WS 对话里让系统发图,那么结果也应该优先回到这个 Bot WS 对话,而不是悄悄切到 Agent 私聊。否则用户看到的“会话边界”和系统内部实际走的链路会分裂。
|
|
24
|
-
|
|
25
|
-
3. **配置写在哪里,运行时就该认哪里。**
|
|
26
|
-
OpenClaw 既然已经把媒体大小的标准字段定成 `mediaMaxMb`,WeCom 插件就不该再偷偷主要走自己那套 `media.maxBytes`。统一之后,用户只需要记住一套规则。
|
|
27
|
-
|
|
28
|
-
4. **用户的文件,默认应该在用户常用目录里。**
|
|
29
|
-
大多数人发文件,不会先把图拷进 `.openclaw/media`,而是直接从下载目录、桌面、图片目录发。默认路径如果违背这个常识,系统虽然“安全”,但体验是不成立的。
|
|
30
|
-
|
|
31
|
-
## 推荐配置
|
|
32
|
-
|
|
33
|
-
```json
|
|
34
|
-
{
|
|
35
|
-
"channels": {
|
|
36
|
-
"wecom": {
|
|
37
|
-
"mediaMaxMb": 50,
|
|
38
|
-
"media": {
|
|
39
|
-
"tempDir": "/tmp/openclaw-wecom-media",
|
|
40
|
-
"localRoots": [
|
|
41
|
-
"/srv/company-share",
|
|
42
|
-
"/data/reports"
|
|
43
|
-
]
|
|
44
|
-
},
|
|
45
|
-
"dynamicAgents": {
|
|
46
|
-
"enabled": true,
|
|
47
|
-
"dmCreateAgent": true,
|
|
48
|
-
"groupEnabled": true,
|
|
49
|
-
"adminUsers": ["your-admin-userid"]
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
## 升级后你应该感受到的变化
|
|
57
|
-
|
|
58
|
-
- 从 `Downloads`、`Desktop` 这类常见目录直接发图、发文件,更容易一次成功。
|
|
59
|
-
- 同样开启 `dynamicAgents` 的前提下,Bot WS 会话也会像其他链路一样稳定隔离,不再更容易串上下文。
|
|
60
|
-
- 如果当前就是 Bot WS 对话流,发图、发文件会优先留在这个对话里处理,不会再更容易“跳”到 Agent 私聊。
|
|
61
|
-
- 调整 `mediaMaxMb` 后,WeCom 插件的上传 / 解密 / 读取链路会真正跟着变化,而不是“配置改了,行为没改”。
|
|
62
|
-
|
|
63
|
-
## 仍然需要知道的边界
|
|
64
|
-
|
|
65
|
-
- `mediaMaxMb` 控制的是 OpenClaw 这边愿意读取和处理多大的媒体,不代表企业微信协议本身没有限制。
|
|
66
|
-
- 企业微信自身的媒体限制仍然存在,例如图片 / 视频超过 10MB、语音超过 2MB、文件超过 20MB 时,最终行为仍受企业微信接口约束。
|
|
67
|
-
- 旧配置 `channels.wecom.media.maxBytes` 目前还兼容,但新配置建议统一迁移到 `channels.wecom.mediaMaxMb`。
|
|
68
|
-
|
|
69
|
-
## 升级提示
|
|
70
|
-
|
|
71
|
-
- 执行 `openclaw plugins update wecom` 即可升级到 `v2.3.19`。
|
|
72
|
-
- 如果你之前遇到“WS 开了 dynamicAgents 但还是串到主 Agent”“明明在 Bot WS 对话里发图,结果却从 Agent 私聊发出来”,或“明明改了媒体大小配置却没有生效”,这一版就是针对这些问题的直接修复。
|
|
73
|
-
- 如果你的文件仍然不在默认目录内,例如 NAS、共享盘或业务导出盘,请继续在 `channels.wecom.media.localRoots` 中追加对应路径。
|
package/changelog/v2.3.2.md
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# OpenClaw WeCom 插件 v2.3.2 变更简报
|
|
2
|
-
|
|
3
|
-
> [!WARNING]
|
|
4
|
-
> **OpenClaw 3.1+ 升级必读**:升级到 OpenClaw `3.1` 及以上版本的用户务必同步升级本插件,并将企业微信回调 URL 更新为 OpenClaw 推荐路径:`/plugins/wecom/bot/{accountId}` 与 `/plugins/wecom/agent/{accountId}`(旧 `/wecom/*` 仍兼容但不再维护)。
|
|
5
|
-
|
|
6
|
-
## 2026-03-03(今日)
|
|
7
|
-
- 【路由兼容】🧩 修复 OpenClaw 3.1 下 Control UI fallback 可能抢占 `/wecom/*` webhook 的路由冲突问题。
|
|
8
|
-
- 【引导收敛】🧭 将 WeCom onboarding 统一为账号化配置写入 `channels.wecom.accounts.<accountId>`,不再引导单账号旧结构。
|
|
9
|
-
- 【回调路径】🔁 将 WeCom 回调路径的推荐方案统一为 `/plugins/wecom/bot/{accountId}` 与 `/plugins/wecom/agent/{accountId}`。
|
|
10
|
-
- 【兼容策略】🔁 保留 `/wecom/*` 历史回调路径兼容能力,但不再维护旧路径分支。
|
|
11
|
-
- 【分流稳定】🧭 将 monitor 分流升级为按插件命名空间账号路径识别,确保 Bot/Agent 稳定命中。
|
|
12
|
-
- 【链路一致】🔒 将 Bot 上下文 `Surface` 对齐为 `wecom`,避免核心误判后错误走到 Agent outbound。
|
|
13
|
-
- 【账号必填】🧱 在 matrix 模式下对无 accountId 的基础路径返回 `wecom_matrix_path_required`,强制使用账号化回调路径。
|
|
14
|
-
- 【文档同步】📘 将回调地址文档与 onboarding 提示统一为 `/plugins/wecom/*/{accountId}` 唯一推荐路径。
|
|
15
|
-
|
|
16
|
-
## 2026-03-02(v2.3.2 主体)
|
|
17
|
-
- 【交付收口】🔄 修复 Bot 结果回写后“正在搜索相关内容”不收口的问题,并在可用时推送最终流帧结束思考态。
|
|
18
|
-
- 【媒体兜底】📎 统一非图片文件、媒体失败和超时场景为“Bot 提示 + Agent 私信兜底”闭环,保证结果可达。
|
|
19
|
-
- 【工具治理】🛡 修复 WeCom Bot 会话中 `message` 工具禁用位置,避免模型绕过 Bot 交付链路直接主动发送。
|
|
20
|
-
- 【类型兼容】🧠 扩展本地与远端文件 MIME 识别覆盖 `txt/docx/xlsx/pptx/csv/zip` 等常见类型,并保留 `octet-stream` 重试兜底。
|
|
21
|
-
- 【判定增强】🔍 将入站文件类型推断升级为“文件头特征 + 响应头 + 文件名后缀”多层判定,提升无后缀和异常 URL 的识别准确率。
|
|
22
|
-
|
|
23
|
-
## 验证结果
|
|
24
|
-
- WeCom 插件测试通过 `10` 个测试文件共 `41` 条用例,覆盖 webhook 生命周期、路径分流、媒体兜底与回归场景。
|
|
25
|
-
|
|
26
|
-
## 升级提示
|
|
27
|
-
- 推荐在企业微信后台使用 `https://<your-domain>/plugins/wecom/bot/{accountId}` 与 `https://<your-domain>/plugins/wecom/agent/{accountId}` 作为回调地址。
|
|
28
|
-
- 旧地址 `/wecom/bot/{accountId}` 与 `/wecom/agent/{accountId}` 仍兼容但不再维护,建议尽快迁移到 `/plugins/wecom/*/{accountId}`。
|
package/changelog/v2.3.26.md
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
# OpenClaw WeCom 插件 v2.3.26 变更简报
|
|
2
|
-
|
|
3
|
-
> [!TIP]
|
|
4
|
-
> 这一版主要就是把最近最烦人的几类问题修顺了:升级后不再乱报错,Agent 和 Bot WS 不再乱串回复,Bot WS 发图片后不再多冒一条 `Done...`,占位符也不会一直卡着不收。
|
|
5
|
-
|
|
6
|
-
## 2026-03-26(v2.3.26)
|
|
7
|
-
- 修复了 OpenClaw 升级后 `wecom` 插件报 `is not a function` 的问题。之前是 SDK 导入路径没跟着新版调整,这一版已经统一修好。
|
|
8
|
-
- 修复了 Agent 和 Bot WS 串回复的问题。现在是谁收到消息,就尽量由谁来回复,不再出现“在 Agent 里说话,结果 Bot WS 回你”这种情况。
|
|
9
|
-
- 修复了 Bot WS 会话里发图片后的收尾问题。之前常见表现是:`正在思考` -> 图片 -> 又多一条 `Done!...`。现在最终文字会尽量接回原来的回复链路,不再额外多发一条完成提示。
|
|
10
|
-
- 修复了 `message` 工具和 Bot WS 占位符不同步的问题。现在如果图片或文本已经发出去了,占位符不会还在那里一直刷“正在思考...”。
|
|
11
|
-
- 顺手加强了“全局安装的 OpenClaw + 本地 wecom 插件源码”这种混合运行方式下的稳定性,开发时不容易再出现一边生效、一边不生效的割裂情况。
|
|
12
|
-
|
|
13
|
-
## 升级后你会感受到
|
|
14
|
-
- 升级 OpenClaw 后,`wecom` 插件不再因为导入问题直接报错。
|
|
15
|
-
- Agent 和 Bot WS 同时开着时,回复会更稳地留在正确的对话里。
|
|
16
|
-
- Bot WS 发图、发文件后,回复看起来更像一条完整对话,不会再碎成好几段。
|
|
17
|
-
- 占位符会更自然地结束,不会一直停在“正在思考...”。
|
|
18
|
-
|
|
19
|
-
## 升级提示
|
|
20
|
-
- 执行 `openclaw plugins update wecom` 即可升级到 `v2.3.26`。
|
|
21
|
-
- 如果你是“全局 `openclaw` + 本地 `extensions/wecom` 源码”在跑,升级后记得完整重启 gateway。
|
package/changelog/v2.3.27.md
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# OpenClaw WeCom 插件 v2.3.27 变更简报
|
|
2
|
-
|
|
3
|
-
> [!TIP]
|
|
4
|
-
> `v2.3.27` 是一个以“升级兼容”和“接入恢复”为主的修复版本。重点解决三类真实会挡住使用的问题:第一,`channel add` 里 `wecom` 又能正常被识别和添加了;第二,修复了部分用户在配置或选择渠道时遇到的 `ReferenceError: installedCatalogById is not defined`;第三,把这轮 OpenClaw 升级后 `wecom` 插件里几处已经失效的 SDK 旧入口统一迁到了当前可用的公共接口,避免出现“有的地方能跑、有的地方一升级就炸”的割裂状态。
|
|
5
|
-
|
|
6
|
-
## 2026-03-27(v2.3.27)
|
|
7
|
-
- 【恢复 `channel add` 接入】**[重要修复]** 之前在 OpenClaw 的渠道添加流程里,`wecom` 虽然已经安装,但仍可能被显示成 “does not support guided setup yet”,导致用户无法直接从 `channel add` 走完接入。现在插件已经切到 OpenClaw 当前识别的 `setupWizard` 接口,`wecom` 会重新出现在正常的 guided setup 流程中。
|
|
8
|
-
- 【修复 `installedCatalogById is not defined`】**[重要修复]** 某些用户在渠道选择或安装判断阶段会直接撞到 `ReferenceError: installedCatalogById is not defined`,表现上像是“选了渠道就报错”或“添加流程突然失效”。这次已经把对应的渠道目录访问逻辑改稳,不再依赖容易失效的解构引用。
|
|
9
|
-
- 【迁移失效的插件 SDK 入口】OpenClaw 升级后,`wecom` 插件里原来直接从 `openclaw/plugin-sdk` 根入口拿的一些类型和能力,已经不再按旧方式导出。`v2.3.27` 已经把这几处高风险点迁到当前公开可用的子路径,重点覆盖了工具上下文、outbound 适配器和媒体发送相关接口。
|
|
10
|
-
- 【修复 `wecom_mcp` 工具返回协议】随着 OpenClaw 新版工具结果协议收紧,`wecom_mcp` 这类插件工具如果还按旧格式返回,就会在注册或执行阶段出现类型或运行时不匹配。现在该工具返回结果已经补齐新版要求的 `details` 字段,和当前工具调用协议保持一致。
|
|
11
|
-
- 【修复 Bot WS 媒体发送对旧导出的依赖】之前 Bot WebSocket 媒体发送链路依赖了一个在当前发布版 OpenClaw 中已经不可直接使用的媒体加载导出,升级后容易出现“代码看起来没问题,但媒体链路单独报错”的情况。现在媒体读取改为基于当前仍然公开可用的远程抓取、本地路径校验和 MIME 识别能力自行组装,兼容当前版本的 OpenClaw 发布面。
|
|
12
|
-
- 【补齐严格类型下的 WS 回复头处理】随着依赖和 SDK 类型变严格,Bot WS 主动回复和命令回复链路里对 `req_id` 头部的处理更容易暴露问题。这一版顺手把回复头的兜底生成与返回值收窄一起补齐,减少升级后只在某些路径上报类型错误或运行时异常的概率。
|
|
13
|
-
|
|
14
|
-
## 升级后你会直接感受到
|
|
15
|
-
|
|
16
|
-
- 在 OpenClaw 里重新执行 `channel add` 时,`wecom` 不会再被误判成“不支持 guided setup”。
|
|
17
|
-
- 遇到 `ReferenceError: installedCatalogById is not defined` 的用户,渠道添加和选择流程会恢复正常。
|
|
18
|
-
- OpenClaw 升级后,`wecom` 插件不再那么依赖旧版 SDK 的根入口导出,单独安装或混合运行时更稳。
|
|
19
|
-
- Bot WS 的媒体发送链路不再因为旧导出失效而单独掉链子。
|
|
20
|
-
|
|
21
|
-
## 这次版本背后的最小理解模型
|
|
22
|
-
|
|
23
|
-
把这次更新理解成三句话就够了:
|
|
24
|
-
|
|
25
|
-
1. OpenClaw 的渠道接入面已经变了,`wecom` 不能再继续挂在旧的 onboarding 接口上。
|
|
26
|
-
2. 插件如果直接依赖 `openclaw/plugin-sdk` 根入口里那些历史上“顺手可用”的符号,升级后迟早会踩到导出面收缩的问题。
|
|
27
|
-
3. 真正稳定的兼容修复,不只是把一个 import 改过去,而是把接入流程、工具返回协议、outbound 类型和媒体链路一起对齐到当前公开接口。
|
|
28
|
-
|
|
29
|
-
## 升级提示
|
|
30
|
-
|
|
31
|
-
- 执行 `openclaw plugins update wecom` 即可升级到 `v2.3.27`。
|
|
32
|
-
- 如果你刚升级 OpenClaw 后发现 `wecom` 在 `channel add` 里突然不能配置,或者用户侧开始报 `installedCatalogById is not defined`,这一版就是对应修复。
|
|
33
|
-
- 如果你是“全局安装的 OpenClaw + 本地 `wecom` 源码插件”混合运行,升级后建议完整重启一次 gateway,确保新的 setup 和 outbound 逻辑都已生效。
|
package/changelog/v2.3.4.md
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# OpenClaw WeCom 插件 v2.3.4 变更简报
|
|
2
|
-
|
|
3
|
-
> [!WARNING]
|
|
4
|
-
> **可用性热修复版本**:`v2.3.4` 重点修复 OpenClaw 3.1+ 下 WeCom webhook 路由兼容与可达性问题,保障历史配置可继续使用。
|
|
5
|
-
|
|
6
|
-
## 2026-03-03(v2.3.4 热修复)
|
|
7
|
-
- 【SDK适配】♻️ 插件入口从 `registerHttpHandler` 迁移为 `registerHttpRoute`(`/plugins/wecom` + `match=prefix` + `auth=plugin`),兼容 OpenClaw 新版插件 HTTP 注册模型。
|
|
8
|
-
- 【兼容修复】🔁 补回旧路径入口注册:新增 `/wecom` 前缀路由注册,确保历史 Bot/Agent webhook 继续可达。
|
|
9
|
-
- 【模式兼容】🧭 保持 legacy 单账号配置可运行,并明确 matrix 模式必须使用带 `accountId` 的回调路径。
|
|
10
|
-
|
|
11
|
-
## 影响说明
|
|
12
|
-
- WeCom Bot/Agent 业务链路保持兼容;核心变化为插件 HTTP 注册 API 的升级适配与旧路径可达性恢复。
|
|
13
|
-
|
|
14
|
-
## 兼容矩阵(单账号/多账号)
|
|
15
|
-
| 场景 | 配置形态 | 回调地址 | 兼容状态 | 说明 |
|
|
16
|
-
|---|---|---|---|---|
|
|
17
|
-
| 历史单账号(legacy) | `channels.wecom.bot/agent` | Bot: `/wecom`(默认)或 `/wecom/bot`;Agent: `/wecom/agent` | ✅ 兼容保留 | 适用于存量部署,不作为新引导方案。 |
|
|
18
|
-
| 多账号(matrix)错误用法 | `channels.wecom.accounts.*` | `/wecom/bot`、`/wecom/agent`(无 accountId) | ❌ 不可用 | 会返回 `wecom_matrix_path_required`。 |
|
|
19
|
-
| 多账号(matrix)兼容路径 | `channels.wecom.accounts.*` | `/wecom/bot/{accountId}`、`/wecom/agent/{accountId}` | ✅ 兼容保留 | 历史路径可用,但不再维护。 |
|
|
20
|
-
| 多账号(matrix)推荐路径 | `channels.wecom.accounts.*` | `/plugins/wecom/bot/{accountId}`、`/plugins/wecom/agent/{accountId}` | ✅ 推荐 | 当前主维护路径。 |
|
package/changelog/v2.3.9.md
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# OpenClaw WeCom 插件 v2.3.9 变更简报
|
|
2
|
-
|
|
3
|
-
> [!TIP]
|
|
4
|
-
> **易用性与可观测性版本**:`v2.3.9` 重点优化默认 Bot WebSocket 接入体验、中文 onboarding、Bot/Agent 回调稳定性与排障日志。
|
|
5
|
-
|
|
6
|
-
## 2026-03-09(v2.3.9)
|
|
7
|
-
- 【默认接入】🚀 Bot onboarding 默认收敛为 `WebSocket` 模式,直接引导填写 `bot.ws.botId` 与 `bot.ws.secret`,新用户无需域名即可接入。
|
|
8
|
-
- 【主动消息】📣 在引导文案中明确 Bot WS 支持主动发消息,适合定时任务、异常提醒、工作流通知等企业场景。
|
|
9
|
-
- 【中文体验】🈶 企业微信插件自管账号创建与私聊策略配置流程,减少重复英文提示与术语负担。
|
|
10
|
-
- 【流式修复】🌊 修复 Bot WS 仅输出最终结果的问题,恢复块级流式交付能力。
|
|
11
|
-
- 【路由稳定】🧭 统一 HTTP 分发链路,并补齐默认账号的显式 Bot/Agent 回调路径别名,降低回调命中偏差。
|
|
12
|
-
- 【排障增强】🔎 增加 Agent callback 原始请求、解密摘要、发送请求与响应日志,便于定位“能接收但不能回复”的问题。
|
|
13
|
-
- 【配置清理】🧹 移除 `bot.enabled` / `agent.enabled` 冗余字段,README 与配置模型保持一致。
|
|
14
|
-
|
|
15
|
-
## 验证结果
|
|
16
|
-
- `bunx vitest run extensions/wecom/src/onboarding.test.ts extensions/wecom/src/channel.meta.test.ts`
|
|
17
|
-
- `pnpm build`
|
|
18
|
-
|
|
19
|
-
## 升级提示
|
|
20
|
-
- 默认推荐继续使用 `Bot WebSocket` 模式;如需公网回调,可手动补充 `bot.webhook`。
|
|
21
|
-
- 推荐回调路径使用 `/plugins/wecom/bot/{accountId}` 与 `/plugins/wecom/agent/{accountId}`。
|
|
22
|
-
- `package.json` 与插件元数据已同步更新为 `WeCom (企业微信)`,便于在 OpenClaw 渠道列表中直接识别。
|
package/changelog/v2.4.12.md
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# OpenClaw WeCom 插件 v2.4.12 变更简报
|
|
2
|
-
|
|
3
|
-
> [!TIP]
|
|
4
|
-
> `v2.4.12` 是一个“新增能力 + 接入修稳”并行推进的版本。最直接的三个变化是:第一,企业微信自建应用现在可以把菜单点击这类 `event` 事件按规则路由到本地脚本处理;第二,Agent 通道现在补齐了上下游企业用户的识别与回传链路;第三,Webhook 入站附件在进入会话工作区时,不会再被固定 `5MB` 的旧限制误伤,媒体落盘和后续会话使用更符合当前配置。
|
|
5
|
-
|
|
6
|
-
## 2026-04-12(v2.4.12)
|
|
7
|
-
- 【新增优化】**自建应用菜单事件支持路由到本地脚本**。现在企业微信自建应用收到 `click` 等 `event` 事件后,可以根据 `eventType`、`eventKey`、`changeType` 等条件命中规则,再交给本地 `Node.js` 或 `Python` 脚本处理。也就是说,菜单项终于不只是“点了有事件”,而是可以直接接你自己的自动化逻辑。
|
|
8
|
-
- 【新增优化】**脚本可直接回复,也可继续链到默认 Agent**。本地脚本既可以直接返回一段文本给用户,也可以通过 `chainToAgent` 控制是否继续进入默认 AI 流程。适合做“菜单先走本地轻逻辑,复杂问题再交给 Agent”的组合式处理。
|
|
9
|
-
- 【接入增强】**事件路由规则已进入正式配置面**。这一版把事件路由、脚本运行时白名单、超时和输出大小等配置都纳入了插件配置结构里,便于在多账号场景下做显式治理,而不是靠零散脚本硬接。
|
|
10
|
-
- 【新增能力】**支持上下游企业通过 Agent 渠道互通**。如果你的自建应用已经共享给上下游企业,现在插件可以根据回调里的下游 `CorpID` 识别上下游用户,并结合 `agent.upstreamCorps` 把回复准确发回对应企业,而不是错误地回到主企业通道。
|
|
11
|
-
- 【体验补齐】**上下游企业链路下的图片和语音发送一起补稳了**。这意味着上下游企业用户不再只是“文本能通、媒体掉链”,图片和语音等常见媒体回复也能跟着同一条 Agent 链路走通。
|
|
12
|
-
- 【体验修复】**Webhook 入站文件进入工作区时,不再被固定 5MB 限制误拦**。之前某些从企业微信发进来的附件,明明账号配置已经放宽了大小限制,但在进入会话工作区前还是会被旧的固定阈值挡住。现在这条链路已经改成按当前 WeCom 配置解析后的大小限制执行。
|
|
13
|
-
- 【稳定性增强】**工作区媒体暂存更适合后续 Agent 使用**。入站媒体进入工作区后的路径、命名冲突处理和沙箱会话下的落点都补得更完整,后续让 Agent 读取附件、基于文件继续处理时更稳。
|
|
14
|
-
|
|
15
|
-
## 升级后你会直接感受到
|
|
16
|
-
|
|
17
|
-
- 企业微信自建应用菜单现在可以真正接本地自动化脚本,不需要所有按钮都先兜一圈 AI。
|
|
18
|
-
- 你可以把“帮助”“状态查询”“同步”“触发内部流程”这类菜单动作做成确定性的本地处理,再按需决定是否继续交给 Agent。
|
|
19
|
-
- 如果你的应用已经共享给上下游企业,下游企业用户现在可以沿着 Agent 通道正常收发消息,不再更容易出现“识别到了消息,但回复回不去”。
|
|
20
|
-
- 上下游企业场景下的图片、语音等媒体回复会比之前稳得多,不再只剩文本链路勉强可用。
|
|
21
|
-
- 从企业微信发进来的文件,尤其是大于 5MB 但仍在你实际配置范围内的附件,不会再在进入工作区前被莫名其妙拦下。
|
|
22
|
-
- 后续基于这些入站文件继续做 Agent 分析、摘要或处理时,整体链路会更顺。
|
|
23
|
-
|
|
24
|
-
## 这次版本背后的最小理解模型
|
|
25
|
-
|
|
26
|
-
把这次更新理解成三句话就够了:
|
|
27
|
-
|
|
28
|
-
1. `wecom` 现在不只是“收消息 -> 丢给 AI”,而是多了一层可编排的事件路由,你可以先让菜单事件命中本地脚本。
|
|
29
|
-
2. 企业微信上下游企业用户,已经可以通过 `agent.upstreamCorps` 接到正确的 Agent 回传链路,不再默认只按主企业处理。
|
|
30
|
-
3. 企业微信入站附件进入会话工作区的链路,已经从“固定阈值拦截”改成“跟随当前配置”,真实可用性明显更高。
|
|
31
|
-
|
|
32
|
-
## 升级提示
|
|
33
|
-
|
|
34
|
-
- 执行 `openclaw plugins update wecom` 即可升级到 `v2.4.12`。
|
|
35
|
-
- 如果你准备启用菜单事件脚本,请同时检查 `scriptRuntime.allowPaths`,确保脚本目录已加入允许列表。
|
|
36
|
-
- 如果你准备启用上下游企业回复,请补齐 `channels.wecom.accounts.<accountId>.agent.upstreamCorps`,并确认企业微信后台已完成应用共享。
|
|
37
|
-
- 如果你之前遇到“Webhook 收到了文件,但进不了工作区”或“大文件总在落盘前被拦”的情况,这一版就是对应修复。
|
package/compat-single-account.md
DELETED
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
# 附录 A:WeCom 单账号兼容模式配置指南
|
|
2
|
-
|
|
3
|
-
> 本文档用于历史部署或小规模场景。
|
|
4
|
-
> 新项目默认推荐多账号矩阵配置(`accounts + bindings.match.accountId`)。
|
|
5
|
-
|
|
6
|
-
## A.1 适用场景
|
|
7
|
-
|
|
8
|
-
- 已在线运行单账号配置,短期内不希望迁移。
|
|
9
|
-
- 只有一个 Bot / Agent,不需要账号隔离。
|
|
10
|
-
- 本地 PoC 或临时验证链路。
|
|
11
|
-
|
|
12
|
-
## A.2 快速配置
|
|
13
|
-
|
|
14
|
-
### A.2.1 仅 Bot(单智能体)
|
|
15
|
-
|
|
16
|
-
```bash
|
|
17
|
-
openclaw config set channels.wecom.enabled true
|
|
18
|
-
openclaw config set channels.wecom.bot.token "YOUR_BOT_TOKEN"
|
|
19
|
-
openclaw config set channels.wecom.bot.encodingAESKey "YOUR_BOT_AES_KEY"
|
|
20
|
-
openclaw config set channels.wecom.bot.receiveId ""
|
|
21
|
-
openclaw config set channels.wecom.bot.primaryTransport "webhook"
|
|
22
|
-
openclaw config set channels.wecom.bot.streamPlaceholderContent "正在思考..."
|
|
23
|
-
openclaw config set channels.wecom.bot.welcomeText "你好!我是 AI 助手"
|
|
24
|
-
|
|
25
|
-
# DM 门禁(推荐显式设置 policy)
|
|
26
|
-
openclaw config set channels.wecom.bot.dm.policy "open"
|
|
27
|
-
openclaw config set channels.wecom.bot.dm.allowFrom '["*"]'
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
### A.2.2 增加 Agent 兜底(可选)
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
openclaw config set channels.wecom.agent.corpId "YOUR_CORP_ID"
|
|
34
|
-
openclaw config set channels.wecom.agent.agentSecret "YOUR_AGENT_SECRET"
|
|
35
|
-
openclaw config set channels.wecom.agent.agentId 1000001
|
|
36
|
-
openclaw config set channels.wecom.agent.token "YOUR_CALLBACK_TOKEN"
|
|
37
|
-
openclaw config set channels.wecom.agent.encodingAESKey "YOUR_CALLBACK_AES_KEY"
|
|
38
|
-
openclaw config set channels.wecom.agent.welcomeText "欢迎使用智能助手"
|
|
39
|
-
openclaw config set channels.wecom.agent.dm.policy "open"
|
|
40
|
-
openclaw config set channels.wecom.agent.dm.allowFrom '["*"]'
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
### A.2.3 验证
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
openclaw gateway restart
|
|
47
|
-
openclaw channels status
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
## A.3 完整单账号配置结构
|
|
51
|
-
|
|
52
|
-
```jsonc
|
|
53
|
-
{
|
|
54
|
-
"channels": {
|
|
55
|
-
"wecom": {
|
|
56
|
-
"enabled": true,
|
|
57
|
-
|
|
58
|
-
"bot": {
|
|
59
|
-
"aibotid": "BOT_ID_OPTIONAL",
|
|
60
|
-
"token": "YOUR_BOT_TOKEN",
|
|
61
|
-
"encodingAESKey": "YOUR_BOT_AES_KEY",
|
|
62
|
-
"botIds": ["BOT_ID_OPTIONAL"],
|
|
63
|
-
"receiveId": "",
|
|
64
|
-
"streamPlaceholderContent": "正在思考...",
|
|
65
|
-
"welcomeText": "你好!我是 AI 助手",
|
|
66
|
-
"dm": {
|
|
67
|
-
"policy": "open",
|
|
68
|
-
"allowFrom": ["*"]
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
|
-
|
|
72
|
-
"agent": {
|
|
73
|
-
"corpId": "YOUR_CORP_ID",
|
|
74
|
-
"agentSecret": "YOUR_AGENT_SECRET",
|
|
75
|
-
"agentId": 1000001,
|
|
76
|
-
"token": "YOUR_CALLBACK_TOKEN",
|
|
77
|
-
"encodingAESKey": "YOUR_CALLBACK_AES_KEY",
|
|
78
|
-
"welcomeText": "欢迎使用智能助手",
|
|
79
|
-
"dm": {
|
|
80
|
-
"policy": "open",
|
|
81
|
-
"allowFrom": ["*"]
|
|
82
|
-
}
|
|
83
|
-
},
|
|
84
|
-
|
|
85
|
-
"media": {
|
|
86
|
-
"tempDir": "/tmp/openclaw-wecom-media",
|
|
87
|
-
"retentionHours": 24,
|
|
88
|
-
"cleanupOnStart": true,
|
|
89
|
-
"maxBytes": 26214400
|
|
90
|
-
},
|
|
91
|
-
|
|
92
|
-
"network": {
|
|
93
|
-
"timeoutMs": 15000,
|
|
94
|
-
"retries": 2,
|
|
95
|
-
"retryDelayMs": 500,
|
|
96
|
-
"egressProxyUrl": "http://proxy.company.local:3128"
|
|
97
|
-
},
|
|
98
|
-
|
|
99
|
-
"dynamicAgents": {
|
|
100
|
-
"enabled": false,
|
|
101
|
-
"dmCreateAgent": false,
|
|
102
|
-
"groupEnabled": false,
|
|
103
|
-
"adminUsers": []
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
## A.4 Webhook 路径
|
|
111
|
-
|
|
112
|
-
- Bot Webhook: `/plugins/wecom/bot`(推荐),兼容 `/wecom/bot`、`/wecom`
|
|
113
|
-
- Agent Callback: `/plugins/wecom/agent`(推荐),兼容 `/wecom/agent`
|
|
114
|
-
|
|
115
|
-
说明:
|
|
116
|
-
|
|
117
|
-
- 路径由系统派生,不建议额外维护自定义 path。
|
|
118
|
-
- 如果 Bot 主 transport 改成 `ws`,则 Bot 不再依赖 HTTP callback,但 Agent Callback 仍可保留。
|
|
119
|
-
|
|
120
|
-
## A.4.1 Bot WS 单账号示例
|
|
121
|
-
|
|
122
|
-
```bash
|
|
123
|
-
openclaw config set channels.wecom.bot.primaryTransport "ws"
|
|
124
|
-
openclaw config set channels.wecom.bot.ws.botId "YOUR_BOT_ID"
|
|
125
|
-
openclaw config set channels.wecom.bot.ws.secret "YOUR_BOT_SECRET"
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
运维检查:
|
|
129
|
-
|
|
130
|
-
```bash
|
|
131
|
-
openclaw channels status --deep
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
重点看:
|
|
135
|
-
|
|
136
|
-
- `primaryTransport`
|
|
137
|
-
- `transport`
|
|
138
|
-
- `health`
|
|
139
|
-
- `ownerId`
|
|
140
|
-
- `lastError`
|
|
141
|
-
- `lastInboundAt`
|
|
142
|
-
- `lastOutboundAt`
|
|
143
|
-
|
|
144
|
-
## A.5 迁移建议
|
|
145
|
-
|
|
146
|
-
如果后续需要多 Bot / 多 Agent 隔离,建议迁移到多账号矩阵模式:
|
|
147
|
-
- 在 `channels.wecom.accounts.<accountId>` 下拆分配置
|
|
148
|
-
- 通过 `bindings[].match.accountId` 映射到对应 OpenClaw agent
|
package/index.test.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
|
|
2
|
-
import { describe, expect, it, vi } from "vitest";
|
|
3
|
-
import plugin from "./index.js";
|
|
4
|
-
|
|
5
|
-
describe("wecom plugin register", () => {
|
|
6
|
-
it("registers both recommended and legacy webhook route prefixes", () => {
|
|
7
|
-
const registerChannel = vi.fn();
|
|
8
|
-
const registerHttpRoute = vi.fn();
|
|
9
|
-
const registerTool = vi.fn();
|
|
10
|
-
const on = vi.fn();
|
|
11
|
-
const api = {
|
|
12
|
-
runtime: {},
|
|
13
|
-
registerChannel,
|
|
14
|
-
registerHttpRoute,
|
|
15
|
-
registerTool,
|
|
16
|
-
on,
|
|
17
|
-
} as unknown as OpenClawPluginApi;
|
|
18
|
-
|
|
19
|
-
plugin.register(api);
|
|
20
|
-
|
|
21
|
-
expect(registerChannel).toHaveBeenCalledTimes(1);
|
|
22
|
-
expect(registerHttpRoute).toHaveBeenCalledTimes(2);
|
|
23
|
-
expect(registerHttpRoute).toHaveBeenCalledWith(
|
|
24
|
-
expect.objectContaining({
|
|
25
|
-
path: "/plugins/wecom",
|
|
26
|
-
auth: "plugin",
|
|
27
|
-
match: "prefix",
|
|
28
|
-
}),
|
|
29
|
-
);
|
|
30
|
-
expect(registerHttpRoute).toHaveBeenCalledWith(
|
|
31
|
-
expect.objectContaining({
|
|
32
|
-
path: "/wecom",
|
|
33
|
-
auth: "plugin",
|
|
34
|
-
match: "prefix",
|
|
35
|
-
}),
|
|
36
|
-
);
|
|
37
|
-
});
|
|
38
|
-
});
|
package/scripts/test-proxy.ts
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { wecomFetch } from "../src/http.js";
|
|
2
|
-
|
|
3
|
-
const args = process.argv.slice(2);
|
|
4
|
-
let proxyUrl = "";
|
|
5
|
-
|
|
6
|
-
if (args.includes("--host")) {
|
|
7
|
-
const hostIndex = args.indexOf("--host");
|
|
8
|
-
const portIndex = args.indexOf("--port");
|
|
9
|
-
const userIndex = args.indexOf("--user");
|
|
10
|
-
const passIndex = args.indexOf("--pass");
|
|
11
|
-
|
|
12
|
-
if (hostIndex === -1 || portIndex === -1) {
|
|
13
|
-
console.error("Error: --host and --port are required when using specific params.");
|
|
14
|
-
process.exit(1);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const host = args[hostIndex + 1];
|
|
18
|
-
const port = args[portIndex + 1];
|
|
19
|
-
const user = userIndex !== -1 ? args[userIndex + 1] : "";
|
|
20
|
-
const pass = passIndex !== -1 ? args[passIndex + 1] : "";
|
|
21
|
-
|
|
22
|
-
if (user && pass) {
|
|
23
|
-
// Safe encoding
|
|
24
|
-
proxyUrl = `http://${encodeURIComponent(user)}:${encodeURIComponent(pass)}@${host}:${port}`;
|
|
25
|
-
} else {
|
|
26
|
-
proxyUrl = `http://${host}:${port}`;
|
|
27
|
-
}
|
|
28
|
-
} else {
|
|
29
|
-
proxyUrl = args[0] || process.env.PROXY_URL || "";
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
if (!proxyUrl) {
|
|
33
|
-
console.error("Usage: npx tsx extensions/wecom/scripts/test-proxy.ts <proxy_url>");
|
|
34
|
-
console.error(" OR: npx tsx extensions/wecom/scripts/test-proxy.ts --host <ip> --port <port> --user <u?> --pass <p?>");
|
|
35
|
-
process.exit(1);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
console.log(`Testing proxy: ${proxyUrl.replace(/:([^:@]+)@/, ":***@")}`); // Mask password in log
|
|
39
|
-
|
|
40
|
-
async function run() {
|
|
41
|
-
try {
|
|
42
|
-
// 1. Test IP echo to verify traffic goes through proxy
|
|
43
|
-
console.log("1. Checking IP via httpbin.org...");
|
|
44
|
-
const ipRes = await wecomFetch("https://httpbin.org/ip", {}, { proxyUrl, timeoutMs: 10000 });
|
|
45
|
-
if (!ipRes.ok) {
|
|
46
|
-
throw new Error(`IP check failed: ${ipRes.status} ${ipRes.statusText}`);
|
|
47
|
-
}
|
|
48
|
-
const ipJson = await ipRes.json();
|
|
49
|
-
console.log(" Result:", ipJson);
|
|
50
|
-
|
|
51
|
-
// 2. Test WeCom API connectivity
|
|
52
|
-
console.log("2. Checking WeCom connectivity...");
|
|
53
|
-
const wecomRes = await wecomFetch("https://qyapi.weixin.qq.com/cgi-bin/gettoken", {}, { proxyUrl, timeoutMs: 10000 });
|
|
54
|
-
const wecomJson = await wecomRes.json();
|
|
55
|
-
console.log(" Result:", wecomJson);
|
|
56
|
-
console.log("✅ Proxy works!");
|
|
57
|
-
|
|
58
|
-
} catch (err) {
|
|
59
|
-
// Extract cause for better debugging
|
|
60
|
-
const cause = (err as any).cause;
|
|
61
|
-
if (cause) {
|
|
62
|
-
console.error("❌ Proxy test failed (Cause):", cause);
|
|
63
|
-
} else {
|
|
64
|
-
console.error("❌ Proxy test failed:", err);
|
|
65
|
-
}
|
|
66
|
-
process.exit(1);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
run();
|
package/scripts/wecom/README.md
DELETED
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
# WeCom 事件脚本示例
|
|
2
|
-
|
|
3
|
-
本目录提供可直接运行的 WeCom Agent 事件路由脚本示例。
|
|
4
|
-
|
|
5
|
-
## 文件说明
|
|
6
|
-
|
|
7
|
-
- `menu-click-help.js`:Node.js 菜单点击事件示例。
|
|
8
|
-
- `menu-click-help.py`:Python 菜单点击事件示例。
|
|
9
|
-
|
|
10
|
-
## 输入协议
|
|
11
|
-
|
|
12
|
-
脚本从 `stdin` 接收一份 JSON envelope。当前结构如下:
|
|
13
|
-
|
|
14
|
-
```json
|
|
15
|
-
{
|
|
16
|
-
"version": "1.0",
|
|
17
|
-
"channel": "wecom",
|
|
18
|
-
"accountId": "default",
|
|
19
|
-
"receivedAt": 1760000000000,
|
|
20
|
-
"message": {
|
|
21
|
-
"msgType": "event",
|
|
22
|
-
"eventType": "click",
|
|
23
|
-
"eventKey": "MENU_HELP",
|
|
24
|
-
"changeType": null,
|
|
25
|
-
"fromUser": "zhangsan",
|
|
26
|
-
"toUser": "wwxxxx",
|
|
27
|
-
"chatId": null,
|
|
28
|
-
"agentId": 1000001,
|
|
29
|
-
"createTime": 1760000000,
|
|
30
|
-
"msgId": "1234567890",
|
|
31
|
-
"raw": {
|
|
32
|
-
"ToUserName": "wwxxxx",
|
|
33
|
-
"FromUserName": "zhangsan",
|
|
34
|
-
"MsgType": "event",
|
|
35
|
-
"Event": "click",
|
|
36
|
-
"EventKey": "MENU_HELP",
|
|
37
|
-
"AgentID": "1000001"
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
"route": {
|
|
41
|
-
"matchedRuleId": "menu_help_click",
|
|
42
|
-
"handlerType": "node_script"
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### 输入字段说明
|
|
48
|
-
|
|
49
|
-
- `version`:协议版本,当前固定为 `1.0`。
|
|
50
|
-
- `channel`:渠道标识,当前固定为 `wecom`。
|
|
51
|
-
- `accountId`:命中的企微账号 ID。
|
|
52
|
-
- `receivedAt`:路由层接收事件时的毫秒时间戳。
|
|
53
|
-
- `message.msgType`:消息类型,事件场景一般是 `event`。
|
|
54
|
-
- `message.eventType`:事件类型(例如 `click`、`change_contact`)。
|
|
55
|
-
- `message.eventKey`:事件键,可能为空。
|
|
56
|
-
- `message.changeType`:二级事件类型,仅部分事件存在(例如 `change_contact`)。
|
|
57
|
-
- `message.fromUser`:发送者 UserId。
|
|
58
|
-
- `message.toUser`:接收方 corpId。
|
|
59
|
-
- `message.chatId`:群聊 ID,单聊可能为 `null`。
|
|
60
|
-
- `message.agentId`:应用 AgentID。
|
|
61
|
-
- `message.createTime`:企微事件时间戳(秒)。
|
|
62
|
-
- `message.msgId`:消息 ID,某些事件可能为 `null`。
|
|
63
|
-
- `message.raw`:完整原始对象(XML 解析结果),新增字段会优先在这里透传。
|
|
64
|
-
- `route.matchedRuleId`:命中的路由规则 ID。
|
|
65
|
-
- `route.handlerType`:当前执行器类型(`node_script` 或 `python_script`)。
|
|
66
|
-
|
|
67
|
-
## 输出协议
|
|
68
|
-
|
|
69
|
-
脚本需要向 `stdout` 输出一份 JSON。当前支持的关键字段:
|
|
70
|
-
|
|
71
|
-
- `ok`:可选,布尔值,表示脚本是否成功处理。
|
|
72
|
-
- `action`:可选,当前支持 `none` 或 `reply_text`。
|
|
73
|
-
- `reply.text`:当 `action=reply_text` 时使用,作为回复内容。
|
|
74
|
-
- `chainToAgent`:可选,脚本侧动态决定是否继续进入默认 Agent(AI)流程;最终结果还会与 handler 配置里的 `chainToAgent` 做合并,只要任一方为 `true` 就会继续。
|
|
75
|
-
- `audit.tags`:可选,审计标签数组。
|
|
76
|
-
- `error`:可选,错误信息。
|
|
77
|
-
|
|
78
|
-
### 示例 1:直接回复并终止默认流程
|
|
79
|
-
|
|
80
|
-
```json
|
|
81
|
-
{
|
|
82
|
-
"ok": true,
|
|
83
|
-
"action": "reply_text",
|
|
84
|
-
"reply": { "text": "已收到 MENU_HELP" },
|
|
85
|
-
"chainToAgent": false
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### 示例 2:不回复,继续默认流程
|
|
90
|
-
|
|
91
|
-
```json
|
|
92
|
-
{
|
|
93
|
-
"ok": true,
|
|
94
|
-
"action": "none",
|
|
95
|
-
"chainToAgent": true
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### `chainToAgent` 补充说明
|
|
100
|
-
|
|
101
|
-
- 这里的 `chainToAgent` 只代表脚本返回的动态结果,不是唯一决策来源。
|
|
102
|
-
- 如果路由 handler 中也配置了 `"chainToAgent": true`,那么即使脚本返回 `false`,最终仍会继续进入默认 Agent 流程。
|
|
103
|
-
- 如果要让脚本完全决定是否继续,handler 里不要写 `chainToAgent`。
|
|
104
|
-
|
|
105
|
-
### 示例 3:失败回包(可选)
|
|
106
|
-
|
|
107
|
-
```json
|
|
108
|
-
{
|
|
109
|
-
"ok": false,
|
|
110
|
-
"action": "reply_text",
|
|
111
|
-
"reply": { "text": "处理失败,请稍后重试" },
|
|
112
|
-
"chainToAgent": false,
|
|
113
|
-
"error": "invalid params"
|
|
114
|
-
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
## 注意事项
|
|
118
|
-
|
|
119
|
-
- 输出必须是严格 JSON。
|
|
120
|
-
- 不要在 `stdout` 混入调试日志;调试信息请写到 `stderr`。
|
|
121
|
-
- 非 0 退出码或非法 JSON 会被视为 handler 执行失败。
|
|
122
|
-
- 脚本路径必须落在 `scriptRuntime.allowPaths` 允许目录内。
|
|
123
|
-
- 脚本应尽量快速返回,避免触发超时(由 `timeoutMs/defaultTimeoutMs` 控制)。
|