@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/MENU_EVENT_PLAN.md
DELETED
|
@@ -1,440 +0,0 @@
|
|
|
1
|
-
# WeCom 菜单事件可配置回调功能规划(PLAN)
|
|
2
|
-
|
|
3
|
-
## 1. 背景与目标
|
|
4
|
-
|
|
5
|
-
当前插件对 Agent 入站 `event` 使用固定白名单,未覆盖企业微信“菜单事件”全量场景(如 `click`、`view`、`scancode_push`、`location_select` 等)。
|
|
6
|
-
|
|
7
|
-
目标是把“是否放行 event、放行哪些 eventType、由谁处理”从代码硬编码改为可配置:
|
|
8
|
-
|
|
9
|
-
1. 支持在 OpenClaw 配置中声明是否启用 `event` 处理。
|
|
10
|
-
2. 在 `event` 内支持按 `eventType` 白名单(例如只放行 `click`、`scancode_push`)。
|
|
11
|
-
3. 每个事件可绑定处理器(内置 handler / 外部 TS/JS / 外部 Python)。
|
|
12
|
-
4. 默认安全:不配置即保持现有行为兼容,不自动放通新增事件。
|
|
13
|
-
|
|
14
|
-
## 2. 需求范围
|
|
15
|
-
|
|
16
|
-
### 2.1 本期(MVP)
|
|
17
|
-
|
|
18
|
-
1. 菜单点击类事件可配置放通:
|
|
19
|
-
- `click`
|
|
20
|
-
- `view`
|
|
21
|
-
- `view_miniprogram`
|
|
22
|
-
- `scancode_push`
|
|
23
|
-
- `scancode_waitmsg`
|
|
24
|
-
- `pic_sysphoto`
|
|
25
|
-
- `pic_photo_or_album`
|
|
26
|
-
- `pic_weixin`
|
|
27
|
-
- `location_select`
|
|
28
|
-
2. 配置驱动白名单:`eventEnabled` + `eventType`。
|
|
29
|
-
3. 事件分发器:按匹配规则将事件交给指定处理器。
|
|
30
|
-
4. 脚本处理器能力:
|
|
31
|
-
- Node 脚本(TS/JS,先支持 JS,TS 通过 tsx/ts-node 作为可选)
|
|
32
|
-
- Python 脚本
|
|
33
|
-
5. 统一执行输入输出协议(JSON stdin/stdout),并把接收到的 event 参数透传给外部脚本。
|
|
34
|
-
6. 最小可观测能力:审计日志、超时、退出码、错误摘要。
|
|
35
|
-
|
|
36
|
-
### 2.2 后续增强(非 MVP)
|
|
37
|
-
|
|
38
|
-
1. 脚本热更新和缓存。
|
|
39
|
-
2. 并发/速率限制(按事件类型或账号维度)。
|
|
40
|
-
3. 幂等增强(事件去重键可配置)。
|
|
41
|
-
4. 回调重试策略(指数退避 + 死信)。
|
|
42
|
-
5. handler 沙箱隔离(容器/受限用户执行)。
|
|
43
|
-
|
|
44
|
-
## 3. 设计原则
|
|
45
|
-
|
|
46
|
-
1. 兼容优先:未新增配置时,行为与当前版本一致。
|
|
47
|
-
2. 显式放通:只处理配置明确允许的类型。
|
|
48
|
-
3. 最小权限:外部脚本执行能力默认关闭或仅允许受信目录。
|
|
49
|
-
4. 可追踪:每次分发都可在日志中定位“为什么放通/为什么拒绝/由谁处理”。
|
|
50
|
-
5. 可替换:处理器接口稳定,后续可新增 webhook/queue 等执行后端。
|
|
51
|
-
|
|
52
|
-
## 3.1 事件格式盘点(基于文档 90240)
|
|
53
|
-
|
|
54
|
-
按文档事件目录统计,建议全部纳入“可配置支持范围”,默认采用 deny by default(不放通)。
|
|
55
|
-
|
|
56
|
-
### A. 一级事件格式数量
|
|
57
|
-
|
|
58
|
-
共 17 类一级事件格式:
|
|
59
|
-
|
|
60
|
-
1. 成员关注及取消关注事件
|
|
61
|
-
2. 进入应用
|
|
62
|
-
3. 上报地理位置
|
|
63
|
-
4. 异步任务完成事件推送
|
|
64
|
-
5. 通讯录变更事件
|
|
65
|
-
6. 菜单事件
|
|
66
|
-
7. 审批状态通知事件
|
|
67
|
-
8. 企业互联共享应用事件回调
|
|
68
|
-
9. 上下游共享应用事件回调
|
|
69
|
-
10. 模板卡片事件推送
|
|
70
|
-
11. 通用模板卡片右上角菜单事件推送
|
|
71
|
-
12. 长期未使用应用停用预警事件
|
|
72
|
-
13. 长期未使用应用临时停用事件
|
|
73
|
-
14. 长期未使用应用重新启用事件
|
|
74
|
-
15. 应用低活跃预警事件
|
|
75
|
-
16. 低活跃应用事件
|
|
76
|
-
17. 低活跃应用活跃恢复事件
|
|
77
|
-
|
|
78
|
-
### B. Event 字段可枚举值数量
|
|
79
|
-
|
|
80
|
-
共 26 个 Event 值(建议全部支持配置):
|
|
81
|
-
|
|
82
|
-
1. subscribe
|
|
83
|
-
2. unsubscribe
|
|
84
|
-
3. enter_agent
|
|
85
|
-
4. LOCATION
|
|
86
|
-
5. batch_job_result
|
|
87
|
-
6. change_contact
|
|
88
|
-
7. click
|
|
89
|
-
8. view
|
|
90
|
-
9. view_miniprogram
|
|
91
|
-
10. scancode_push
|
|
92
|
-
11. scancode_waitmsg
|
|
93
|
-
12. pic_sysphoto
|
|
94
|
-
13. pic_photo_or_album
|
|
95
|
-
14. pic_weixin
|
|
96
|
-
15. location_select
|
|
97
|
-
16. open_approval_change
|
|
98
|
-
17. share_agent_change
|
|
99
|
-
18. share_chain_change
|
|
100
|
-
19. template_card_event
|
|
101
|
-
20. template_card_menu_event
|
|
102
|
-
21. inactive_alert
|
|
103
|
-
22. close_inactive_agent
|
|
104
|
-
23. reopen_inactive_agent
|
|
105
|
-
24. low_active_alert
|
|
106
|
-
25. low_active
|
|
107
|
-
26. active_restored
|
|
108
|
-
|
|
109
|
-
### C. 含 ChangeType 的展开数量
|
|
110
|
-
|
|
111
|
-
如果把 `change_contact` 按 `ChangeType` 展开,建议按“二级事件”管理,共 7 种:
|
|
112
|
-
|
|
113
|
-
1. create_user
|
|
114
|
-
2. update_user
|
|
115
|
-
3. delete_user
|
|
116
|
-
4. create_party
|
|
117
|
-
5. update_party
|
|
118
|
-
6. delete_party
|
|
119
|
-
7. update_tag
|
|
120
|
-
|
|
121
|
-
因此,配置层可支持的“可路由事件项”建议按 32 项预算:
|
|
122
|
-
|
|
123
|
-
1. 26 个 Event 值
|
|
124
|
-
2. 其中 change_contact 再细分 7 个 ChangeType(路由维度)
|
|
125
|
-
|
|
126
|
-
### D. 配置建议(用于实现)
|
|
127
|
-
|
|
128
|
-
1. 第一层:`eventEnabled`(开关,先解决“支持 event”)。
|
|
129
|
-
2. 第二层:`eventType`(即 Event,用于主白名单和主路由)。
|
|
130
|
-
3. 第三层:`changeType` 或 `eventKey`。
|
|
131
|
-
- `changeType`:仅当 `eventType=change_contact` 时启用。
|
|
132
|
-
- `eventKey`:菜单事件精细路由,支持精确值/前缀/正则。
|
|
133
|
-
4. `messageType` 级别白名单作为后续扩展,不纳入本期 MVP 必选项。
|
|
134
|
-
|
|
135
|
-
## 4. 配置模型草案
|
|
136
|
-
|
|
137
|
-
建议在 `channels.wecom.accounts.<accountId>.agent` 下新增:
|
|
138
|
-
|
|
139
|
-
```yaml
|
|
140
|
-
channels:
|
|
141
|
-
wecom:
|
|
142
|
-
accounts:
|
|
143
|
-
default:
|
|
144
|
-
agent:
|
|
145
|
-
# 1) event 入站白名单配置(MVP)
|
|
146
|
-
inboundPolicy:
|
|
147
|
-
eventEnabled: true
|
|
148
|
-
eventPolicy:
|
|
149
|
-
mode: allowlist
|
|
150
|
-
allowedEventTypes:
|
|
151
|
-
- subscribe
|
|
152
|
-
- enter_agent
|
|
153
|
-
- click
|
|
154
|
-
- view
|
|
155
|
-
- view_miniprogram
|
|
156
|
-
- scancode_push
|
|
157
|
-
- scancode_waitmsg
|
|
158
|
-
- pic_sysphoto
|
|
159
|
-
- pic_photo_or_album
|
|
160
|
-
- pic_weixin
|
|
161
|
-
- location_select
|
|
162
|
-
|
|
163
|
-
# 2) 事件分发配置
|
|
164
|
-
eventRouting:
|
|
165
|
-
unmatchedAction: ignore # ignore | forwardToAgent
|
|
166
|
-
routes:
|
|
167
|
-
- when:
|
|
168
|
-
eventType: click
|
|
169
|
-
eventKey: "MENU_HELP"
|
|
170
|
-
handler:
|
|
171
|
-
type: node_script
|
|
172
|
-
entry: "./scripts/wecom/menu-click-help.js"
|
|
173
|
-
timeoutMs: 5000
|
|
174
|
-
- when:
|
|
175
|
-
eventType: scancode_push
|
|
176
|
-
handler:
|
|
177
|
-
type: python_script
|
|
178
|
-
entry: "./scripts/wecom/scancode_handler.py"
|
|
179
|
-
timeoutMs: 8000
|
|
180
|
-
|
|
181
|
-
# 3) 脚本执行安全设置
|
|
182
|
-
scriptRuntime:
|
|
183
|
-
enabled: true
|
|
184
|
-
allowPaths:
|
|
185
|
-
- "./scripts/wecom"
|
|
186
|
-
maxStdoutBytes: 262144
|
|
187
|
-
maxStderrBytes: 131072
|
|
188
|
-
defaultTimeoutMs: 5000
|
|
189
|
-
pythonCommand: "python3"
|
|
190
|
-
nodeCommand: "node"
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
## 5. 分发与执行架构
|
|
194
|
-
|
|
195
|
-
### 5.1 处理链路
|
|
196
|
-
|
|
197
|
-
1. 接收并解析 XML(现有能力)。
|
|
198
|
-
2. 生成标准入站上下文 `InboundEventContext`。
|
|
199
|
-
3. 先走 `inboundPolicy` 判定:
|
|
200
|
-
- 非 `event` 消息保持现状(按现有逻辑处理)。
|
|
201
|
-
- `eventEnabled=false` => 拒绝 event。
|
|
202
|
-
- `eventType` 不允许 => 拒绝。
|
|
203
|
-
4. 命中后进入 `eventRouting`:
|
|
204
|
-
- 按 routes 顺序匹配(首个命中即执行)。
|
|
205
|
-
- 未命中走 `unmatchedAction`。
|
|
206
|
-
5. 执行 handler:
|
|
207
|
-
- `builtin`:调用内置函数。
|
|
208
|
-
- `node_script`:子进程执行 Node 脚本。
|
|
209
|
-
- `python_script`:子进程执行 Python 脚本。
|
|
210
|
-
6. 汇总 handler 结果,决定:
|
|
211
|
-
- 是否回复用户。
|
|
212
|
-
- 是否继续默认消息流水线。
|
|
213
|
-
- 是否仅记录审计并结束。
|
|
214
|
-
|
|
215
|
-
### 5.2 统一处理器返回协议(建议)
|
|
216
|
-
|
|
217
|
-
外部脚本输入(stdin)必须包含完整事件参数,至少包括标准字段 + 原始字段:
|
|
218
|
-
|
|
219
|
-
```json
|
|
220
|
-
{
|
|
221
|
-
"version": "1.0",
|
|
222
|
-
"channel": "wecom",
|
|
223
|
-
"accountId": "default",
|
|
224
|
-
"receivedAt": 1760000000000,
|
|
225
|
-
"message": {
|
|
226
|
-
"msgType": "event",
|
|
227
|
-
"eventType": "click",
|
|
228
|
-
"eventKey": "MENU_HELP",
|
|
229
|
-
"changeType": null,
|
|
230
|
-
"fromUser": "zhangsan",
|
|
231
|
-
"toUser": "wwxxxx",
|
|
232
|
-
"chatId": null,
|
|
233
|
-
"agentId": 1000002,
|
|
234
|
-
"createTime": 1760000000,
|
|
235
|
-
"msgId": null,
|
|
236
|
-
"raw": {
|
|
237
|
-
"ToUserName": "wwxxxx",
|
|
238
|
-
"FromUserName": "zhangsan",
|
|
239
|
-
"MsgType": "event",
|
|
240
|
-
"Event": "click",
|
|
241
|
-
"EventKey": "MENU_HELP",
|
|
242
|
-
"AgentID": "1000002"
|
|
243
|
-
}
|
|
244
|
-
},
|
|
245
|
-
"route": {
|
|
246
|
-
"matchedRuleId": "menu_help_click",
|
|
247
|
-
"handlerType": "node_script"
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
说明:
|
|
253
|
-
|
|
254
|
-
1. `message.raw` 为原始 XML 解析结果(扁平对象),用于外部脚本读取任意参数。
|
|
255
|
-
2. `message` 顶层为标准化字段,降低脚本解析成本。
|
|
256
|
-
3. 对菜单事件扩展字段(如 `ScanCodeInfo`、`SendPicsInfo`、`SendLocationInfo`)需原样放入 `message.raw`。
|
|
257
|
-
4. 后续新增事件字段无需改协议版本,直接在 `message.raw` 增量透传。
|
|
258
|
-
|
|
259
|
-
外部脚本从 stdout 返回 JSON:
|
|
260
|
-
|
|
261
|
-
```json
|
|
262
|
-
{
|
|
263
|
-
"ok": true,
|
|
264
|
-
"action": "reply_text",
|
|
265
|
-
"reply": {
|
|
266
|
-
"text": "已收到菜单点击: MENU_HELP"
|
|
267
|
-
},
|
|
268
|
-
"chainToAgent": false,
|
|
269
|
-
"audit": {
|
|
270
|
-
"tags": ["menu", "click"]
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
字段建议:
|
|
276
|
-
|
|
277
|
-
1. `ok`: boolean,处理是否成功。
|
|
278
|
-
2. `action`: `none | reply_text | reply_markdown | call_internal`。
|
|
279
|
-
3. `reply`: 回复负载。
|
|
280
|
-
4. `chainToAgent`: 是否继续走默认 AI 会话。
|
|
281
|
-
5. `audit`: 附加审计标签。
|
|
282
|
-
6. `error`: 失败时错误消息。
|
|
283
|
-
|
|
284
|
-
### 5.3 参数透传要求(强约束)
|
|
285
|
-
|
|
286
|
-
1. 所有外部 handler(Node/Python)都必须收到完整 event 参数,不允许只传 `eventType/eventKey`。
|
|
287
|
-
2. 参数透传应包含:基础字段、事件字段、扩展子结构、原始解析对象。
|
|
288
|
-
3. 当字段缺失时保留 `null` 或空对象,不要静默删除键,避免脚本分支判断失效。
|
|
289
|
-
4. 当入站不是 `event` 时,仍保持统一 envelope 结构,便于未来复用。
|
|
290
|
-
|
|
291
|
-
## 6. 代码改造建议
|
|
292
|
-
|
|
293
|
-
### 6.1 配置与类型
|
|
294
|
-
|
|
295
|
-
1. 扩展配置类型:
|
|
296
|
-
- `src/types/config.ts`
|
|
297
|
-
- `src/config/schema.ts`
|
|
298
|
-
2. 增加默认值与兼容合并逻辑:
|
|
299
|
-
- `src/config/runtime-config.ts`
|
|
300
|
-
|
|
301
|
-
### 6.2 入站过滤改造
|
|
302
|
-
|
|
303
|
-
1. 将当前 `shouldProcessAgentInboundMessage` 的硬编码白名单改为:
|
|
304
|
-
- 先判断 `inboundPolicy.eventEnabled`
|
|
305
|
-
- 对 `event` 再读 `eventPolicy.allowedEventTypes`
|
|
306
|
-
2. 保留现有关键保护逻辑:
|
|
307
|
-
- `sys` 发送者保护
|
|
308
|
-
- 缺失 sender 保护
|
|
309
|
-
- 已有去重保护
|
|
310
|
-
|
|
311
|
-
### 6.3 新增事件分发器
|
|
312
|
-
|
|
313
|
-
建议新增模块:
|
|
314
|
-
|
|
315
|
-
1. `src/agent/event-router.ts`
|
|
316
|
-
- 路由匹配
|
|
317
|
-
- handler 选择
|
|
318
|
-
2. `src/agent/handler-runner.ts`
|
|
319
|
-
- builtin / node / python 统一执行
|
|
320
|
-
- 超时、stdout/stderr 限流
|
|
321
|
-
- stdin 注入标准 envelope(含完整 event 参数)
|
|
322
|
-
3. `src/agent/handler-protocol.ts`
|
|
323
|
-
- 输入输出协议定义
|
|
324
|
-
|
|
325
|
-
### 6.4 在主处理流程接入
|
|
326
|
-
|
|
327
|
-
在 `src/agent/handler.ts` 的 `event` 分支:
|
|
328
|
-
|
|
329
|
-
1. 在放通后优先调用事件分发器。
|
|
330
|
-
2. 分发器返回 `handled=true` 且 `chainToAgent=false` 时,终止默认 AI 流程。
|
|
331
|
-
3. 需要默认流程时继续原有 `processAgentMessage`。
|
|
332
|
-
|
|
333
|
-
## 7. 安全与风险控制
|
|
334
|
-
|
|
335
|
-
1. 默认关闭脚本执行,需显式 `scriptRuntime.enabled=true`。
|
|
336
|
-
2. 仅允许执行 `allowPaths` 下脚本,防止任意路径执行。
|
|
337
|
-
3. 进程级超时,超时强制 kill。
|
|
338
|
-
4. 限制 stdout/stderr 最大字节,防止日志/内存膨胀。
|
|
339
|
-
5. 子进程不继承敏感环境变量(可配置白名单透传)。
|
|
340
|
-
6. 记录审计:账号、eventType、eventKey、handler、耗时、退出码。
|
|
341
|
-
|
|
342
|
-
## 8. 测试计划
|
|
343
|
-
|
|
344
|
-
### 8.1 单元测试
|
|
345
|
-
|
|
346
|
-
1. `inboundPolicy` 判定测试:
|
|
347
|
-
- eventEnabled/eventType allow/deny 组合。
|
|
348
|
-
2. `eventRouting` 匹配测试:
|
|
349
|
-
- eventType + changeType/eventKey 优先级。
|
|
350
|
-
3. handler runner 测试:
|
|
351
|
-
- 正常输出
|
|
352
|
-
- 非法 JSON
|
|
353
|
-
- 超时
|
|
354
|
-
- 非 0 退出码
|
|
355
|
-
- stdin 中包含完整 event 参数与 raw 字段
|
|
356
|
-
|
|
357
|
-
### 8.2 集成测试
|
|
358
|
-
|
|
359
|
-
1. 构造 `click`、`view`、`scancode_push` XML 回调,验证完整链路。
|
|
360
|
-
2. 验证 `unmatchedAction` 两种模式。
|
|
361
|
-
3. 验证配置缺失时与当前版本行为一致。
|
|
362
|
-
4. 验证外部脚本可读取 `ScanCodeInfo/SendPicsInfo/SendLocationInfo` 等扩展参数。
|
|
363
|
-
|
|
364
|
-
### 8.3 回归测试
|
|
365
|
-
|
|
366
|
-
1. `subscribe` / `enter_agent` 现有行为不回归。
|
|
367
|
-
2. 文档/日程等现有 `doc_*`、`wedoc_*`、`smartsheet_*` 事件不回归。
|
|
368
|
-
|
|
369
|
-
## 9. 里程碑与交付
|
|
370
|
-
|
|
371
|
-
### M1:配置化放通(1~2 天)
|
|
372
|
-
|
|
373
|
-
1. 完成配置 schema/type 扩展。
|
|
374
|
-
2. `shouldProcessAgentInboundMessage` 改为 `eventEnabled + eventType` 配置驱动。
|
|
375
|
-
3. 增加单元测试。
|
|
376
|
-
|
|
377
|
-
### M2:事件分发器(2~3 天)
|
|
378
|
-
|
|
379
|
-
1. 实现 route 匹配和 builtin handler。
|
|
380
|
-
2. 接入主处理流程。
|
|
381
|
-
3. 增加集成测试。
|
|
382
|
-
|
|
383
|
-
### M3:外部脚本执行(2~3 天)
|
|
384
|
-
|
|
385
|
-
1. Node/Python runner。
|
|
386
|
-
2. 超时和输出限制。
|
|
387
|
-
3. 审计字段补齐。
|
|
388
|
-
|
|
389
|
-
### M4:文档与示例(1 天)
|
|
390
|
-
|
|
391
|
-
1. README 增加配置示例与安全建议。
|
|
392
|
-
2. 增加 `scripts/wecom` 示例脚本。
|
|
393
|
-
|
|
394
|
-
#### M4 已落地内容(2026-04-10)
|
|
395
|
-
|
|
396
|
-
1. 已在 README 增加 Agent 事件路由章节,包含:
|
|
397
|
-
- 三层配置示例(`eventEnabled -> eventType -> changeType/eventKey`)
|
|
398
|
-
- Node/Python handler 配置样例
|
|
399
|
-
- stdin/stdout 协议说明
|
|
400
|
-
- 安全建议
|
|
401
|
-
2. 已新增可运行示例脚本:
|
|
402
|
-
- `scripts/wecom/menu-click-help.js`
|
|
403
|
-
- `scripts/wecom/menu-click-help.py`
|
|
404
|
-
- `scripts/wecom/README.md`
|
|
405
|
-
3. 现状说明:
|
|
406
|
-
- M1 已完成:event 配置化放通
|
|
407
|
-
- M2 已完成:事件路由与 builtin handler
|
|
408
|
-
- M3 已完成:Node/Python runner + 超时/输出限制 + 审计
|
|
409
|
-
- M4 已完成:文档和示例交付
|
|
410
|
-
|
|
411
|
-
## 10. 首批内置 handler 建议
|
|
412
|
-
|
|
413
|
-
1. `menu_click_echo`:回显 `eventType` + `eventKey`,用于联调。
|
|
414
|
-
2. `menu_click_route_to_prompt`:将菜单键映射成固定提示词进入默认 pipeline。
|
|
415
|
-
3. `menu_click_call_script`:作为脚本执行桥接器。
|
|
416
|
-
|
|
417
|
-
## 11. 兼容性策略
|
|
418
|
-
|
|
419
|
-
1. 旧配置无 `inboundPolicy` 时,使用“兼容默认白名单”(与当前一致)。
|
|
420
|
-
2. 新配置启用后,按配置优先生效。
|
|
421
|
-
3. 对未识别配置字段仅告警不崩溃。
|
|
422
|
-
|
|
423
|
-
## 11.1 为什么先不做 messageType 白名单
|
|
424
|
-
|
|
425
|
-
1. 当前痛点集中在 `event` 被整体过滤,最小改动是先引入 `eventEnabled`。
|
|
426
|
-
2. 现有 `text/image/file/...` 已在当前链路可处理,本期不需要额外开关干预。
|
|
427
|
-
3. 先做 event 维度可显著降低配置复杂度与回归风险。
|
|
428
|
-
4. 后续若出现“非 event 类型也需要细粒度开关”的需求,再增补 messageType 白名单。
|
|
429
|
-
|
|
430
|
-
## 12. 开放问题(需确认)
|
|
431
|
-
|
|
432
|
-
1. 菜单事件 `view/view_miniprogram` 是否默认只审计不触发回复?
|
|
433
|
-
2. 脚本 handler 是否允许访问网络,是否需要开关控制?
|
|
434
|
-
3. 是否需要在每个 route 上支持 `retryPolicy`?
|
|
435
|
-
4. 是否需要支持 webhook handler(HTTP 回调)作为第三类外部处理器?
|
|
436
|
-
|
|
437
|
-
---
|
|
438
|
-
|
|
439
|
-
该规划优先保证“可配置放通 + 可扩展处理 + 安全默认值”。
|
|
440
|
-
如果确认此方案,可按 M1 开始先落地配置化白名单,再逐步引入路由与脚本执行能力。
|