@mocrane/wecom 2026.3.9 → 2026.3.12

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 (51) hide show
  1. package/README.md +25 -22
  2. package/clawdbot.plugin.json +1 -0
  3. package/index.ts +38 -1
  4. package/openclaw.plugin.json +1 -0
  5. package/package.json +7 -4
  6. package/skills/wecom-contact-lookup/SKILL.md +162 -0
  7. package/skills/wecom-doc/SKILL.md +363 -0
  8. package/skills/wecom-doc/references/doc-api.md +224 -0
  9. package/skills/wecom-doc-manager/SKILL.md +64 -0
  10. package/skills/wecom-doc-manager/references/api-create-doc.md +56 -0
  11. package/skills/wecom-doc-manager/references/api-edit-doc-content.md +68 -0
  12. package/skills/wecom-doc-manager/references/api-export-document.md +88 -0
  13. package/skills/wecom-edit-todo/SKILL.md +249 -0
  14. package/skills/wecom-get-todo-detail/SKILL.md +143 -0
  15. package/skills/wecom-get-todo-list/SKILL.md +127 -0
  16. package/skills/wecom-meeting-create/SKILL.md +158 -0
  17. package/skills/wecom-meeting-create/references/example-full.md +30 -0
  18. package/skills/wecom-meeting-create/references/example-reminder.md +46 -0
  19. package/skills/wecom-meeting-create/references/example-security.md +22 -0
  20. package/skills/wecom-meeting-manage/SKILL.md +136 -0
  21. package/skills/wecom-meeting-query/SKILL.md +330 -0
  22. package/skills/wecom-preflight/SKILL.md +141 -0
  23. package/skills/wecom-schedule/SKILL.md +159 -0
  24. package/skills/wecom-schedule/references/api-check-availability.md +56 -0
  25. package/skills/wecom-schedule/references/api-create-schedule.md +38 -0
  26. package/skills/wecom-schedule/references/api-get-schedule-detail.md +81 -0
  27. package/skills/wecom-schedule/references/api-update-schedule.md +30 -0
  28. package/skills/wecom-schedule/references/ref-reminders.md +24 -0
  29. package/skills/wecom-smartsheet-data/SKILL.md +71 -0
  30. package/skills/wecom-smartsheet-data/references/api-get-records.md +61 -0
  31. package/skills/wecom-smartsheet-data/references/cell-value-formats.md +120 -0
  32. package/skills/wecom-smartsheet-schema/SKILL.md +92 -0
  33. package/skills/wecom-smartsheet-schema/references/field-types.md +43 -0
  34. package/src/agent/handler.ts +105 -14
  35. package/src/channel.ts +7 -4
  36. package/src/compat/plugin-sdk-shim.ts +152 -0
  37. package/src/mcp/index.ts +7 -0
  38. package/src/mcp/schema.ts +108 -0
  39. package/src/mcp/tool.ts +247 -0
  40. package/src/mcp/transport.ts +583 -0
  41. package/src/mcp-config.ts +182 -0
  42. package/src/media/const.ts +24 -0
  43. package/src/media/index.ts +15 -0
  44. package/src/media/uploader.ts +240 -0
  45. package/src/monitor.ts +362 -40
  46. package/src/onboarding.ts +45 -6
  47. package/src/outbound.ts +116 -46
  48. package/src/timeout.ts +45 -0
  49. package/src/types/index.ts +1 -0
  50. package/src/types/message.ts +10 -1
  51. package/src/ws-adapter.ts +22 -0
package/README.md CHANGED
@@ -1,17 +1,10 @@
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
- <img src="https://img.shields.io/badge/Original%20Project-YanHaidao-orange?style=for-the-badge&logo=github" alt="Original Project" />
4
+ <a href="https://github.com/TencentCloud-Lighthouse/openclaw-wecom"><img src="https://img.shields.io/badge/GitHub-TencentCloud--Lighthouse%2Fwecom-blue?style=for-the-badge&logo=github" alt="GitHub Repo" /></a>
8
5
  <img src="https://img.shields.io/badge/License-ISC-blue?style=for-the-badge" alt="License" />
9
6
  </p>
10
7
 
11
- > [!WARNING]
12
- > **原创声明**:本项目涉及的“多账号隔离与矩阵路由架构”、“Bot+Agent双模融合架构”、“长任务超时接力逻辑”及“全自动媒体流转接”等核心设计均为作者 **YanHaidao** 独立思考与实践的原创成果。
13
- > 欢迎技术交流与合规引用,但**严禁任何不经授权的“功能像素级抄袭”或删除原作者署名的代码搬运行为**。
14
-
15
8
  <p align="center">
16
9
  <strong>🚀 企业级双模式 AI 助手接入方案</strong>
17
10
  </p>
@@ -29,7 +22,7 @@
29
22
  <a id="sec-1"></a>
30
23
  ## 💡 核心价值:为什么选择本插件?
31
24
 
32
- ### 独创架构:Bot + Agent 双模融合 (Original Design by YanHaidao)
25
+ ### 独创架构:Bot + Agent 双模融合
33
26
 
34
27
  传统的企微插件通常只能在 "只能聊天的机器人 (Bot)" 和 "只能推送的自建应用 (Agent)" 之间二选一。
35
28
  本插件采用 **双模并行架构**,同时压榨两种模式的极限能力:
@@ -37,7 +30,7 @@
37
30
  * **Bot 通道 (智能体)**:负责 **实时对话**。提供毫秒级流式响应(打字机效果),零延迟交互。
38
31
  * **Agent 通道 (自建应用)**:负责 **能力兜底**。当需要发送图片/文件、进行全员广播、或 Bot 对话超时(>6分钟)时,无缝切换到 Agent 通道接管。
39
32
 
40
- ### 🚀 企业级:多账号(Multi-account)矩阵隔离 (Original Design)
33
+ ### 🚀 企业级:多账号(Multi-account)矩阵隔离
41
34
 
42
35
  本插件支持 **无限扩展的账号矩阵**,这是本插件区别于普通插件的核心壁垒:
43
36
 
@@ -339,8 +332,8 @@ openclaw channels status
339
332
  7. 记录回调 Token 和 EncodingAESKey
340
333
 
341
334
  <div align="center">
342
- <img src="https://cdn.jsdelivr.net/npm/@mocrane/wecom@latest/assets/03.bot.page.png" width="45%" alt="Bot Config" />
343
- <img src="https://cdn.jsdelivr.net/npm/@mocrane/wecom@latest/assets/03.agent.page.png" width="45%" alt="Agent Config" />
335
+ <img src="https://raw.githubusercontent.com/TencentCloud-Lighthouse/openclaw-wecom/main/assets/03.bot.page.png" width="45%" alt="Bot Config" />
336
+ <img src="https://raw.githubusercontent.com/TencentCloud-Lighthouse/openclaw-wecom/main/assets/03.agent.page.png" width="45%" alt="Agent Config" />
344
337
  </div>
345
338
 
346
339
  ---
@@ -477,30 +470,40 @@ Agent 输出 `{"template_card": ...}` 时自动渲染为交互卡片:
477
470
 
478
471
  ## 七、📮 联系我
479
472
 
480
- 微信交流群(扫码入群):
481
-
482
- ![企业微信交流群](https://openclaw.cc/wechat-openclaw-cn-qr.jpg)
483
-
484
473
  维护者:mocrane
485
474
 
486
475
  ---
487
476
 
488
477
  <a id="sec-legal"></a>
489
478
 
490
- ## ⚖️ 授权与原创声明
479
+ ## ⚖️ 授权与致谢
491
480
 
492
- 本项目采用 **ISC License** 开源协议,并在此强调以下要求:
481
+ 本项目采用 **ISC License** 开源协议。
493
482
 
494
- 1. **保留署名**:根据 ISC 协议,您在任何分发、修改或使用本项目(或其部分逻辑)时,**必须**在显著位置完整保留本项目的版权声明(Copyright Notice)。
495
- 2. **尊重原创**:本项目包含的“Bot/Agent 自动化互补架构”、“长对话超时接力”、“WeCom 全媒体流自动化处理”等核心逻辑均为作者 **YanHaidao** 独立思考与实践的原创成果。
496
- 3. **维权申明**:对于恶意删除署名、像素级抄袭、混淆视听的恶意搬运行为,作者保留在社区公示及通过法律途径维权的权利。
483
+ - **开源协议**:您在分发、修改或使用本项目时,请遵循 ISC 协议的相关要求。
484
+ - **致谢**:本项目最初基于 **YanHaidao** 的企业微信插件 fork 而来,感谢其在早期版本中的工作与贡献。当前版本已由 **mocrane** 独立重构与维护。
497
485
 
498
486
  ---
499
487
 
500
488
  <a id="sec-10"></a>
501
489
  ## 八、📝 更新日志
502
490
 
503
- ### 2026.3.3(今日更新简报)
491
+ ### 2026.3.19
492
+
493
+ - 【多媒体发送】📎 **机器人富媒体发送**:Bot 支持向用户发送文件、图片、视频,补齐发送侧多模态能力。
494
+ - 【MCP 集成】🧩 **企业级 MCP 工具接入**:群聊与私聊中支持调用日程、待办、通讯录 MCP,实现对话式办公协作。
495
+
496
+ ### 2026.3.15
497
+
498
+ - 【文档能力】📄 **企微文档操作支持**:新增企业微信文档读写操作能力,可在对话中直接操作企微文档。
499
+ - 【交互体验】⌨️ **打字机效果**:支持逐字流式输出的打字机效果,提升对话交互体验。
500
+
501
+ ### 2026.3.8
502
+
503
+ - 【长连接】🔗 **Bot 长连接模式**:企微机器人支持长连接(WebSocket)模式,降低延迟、提升连接稳定性。
504
+ - 【主动触达】📤 **长连接模式主动发送**:长连接模式下 Bot 支持主动向用户发送消息,突破传统被动回复限制。
505
+
506
+ ### 2026.3.3
504
507
 
505
508
  - 【SDK适配】♻️ **插件 HTTP 注册升级**:入口改为 `registerHttpRoute`(`/plugins/wecom` + `match=prefix` + `auth=plugin`),适配 OpenClaw 新版插件接口。
506
509
  - 【兼容修复】🔁 **旧入口保持可达**:同步注册 `/wecom` 前缀路由,保障历史 Bot/Agent 回调地址继续可用。
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "id": "wecom",
3
3
  "channels": ["wecom"],
4
+ "skills": ["./skills"],
4
5
  "configSchema": {
5
6
  "type": "object",
6
7
  "additionalProperties": false,
package/index.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
2
- import { emptyPluginConfigSchema } from "openclaw/plugin-sdk";
2
+ import { emptyPluginConfigSchema } from "./src/compat/plugin-sdk-shim.js";
3
3
 
4
4
  import { handleWecomWebhookRequest } from "./src/monitor.js";
5
5
  import { setWecomRuntime } from "./src/runtime.js";
6
6
  import { wecomPlugin } from "./src/channel.js";
7
+ import { createWeComMcpTool } from "./src/mcp/index.js";
7
8
 
8
9
  const plugin = {
9
10
  id: "wecom",
@@ -17,6 +18,8 @@ const plugin = {
17
18
  * 1. 注入 Runtime 环境 (api.runtime)。
18
19
  * 2. 注册 WeCom 渠道插件 (ChannelPlugin)。
19
20
  * 3. 注册 Webhook HTTP 路由(推荐 /plugins/wecom/*,兼容 /wecom*)。
21
+ * 4. 注册 wecom_mcp 工具 (MCP Streamable HTTP 调用)。
22
+ * 5. 注入 MEDIA 指令提示词(仅 wecom 通道),指导 LLM 使用 MEDIA: 语法发送文件。
20
23
  */
21
24
  register(api: OpenClawPluginApi) {
22
25
  setWecomRuntime(api.runtime);
@@ -30,6 +33,40 @@ const plugin = {
30
33
  match: "prefix",
31
34
  });
32
35
  }
36
+
37
+ // 注册 wecom_mcp:通过 HTTP 直接调用企业微信 MCP Server
38
+ api.registerTool(createWeComMcpTool(), { name: "wecom_mcp" });
39
+
40
+ // 注入媒体发送指令和文件大小限制提示词(与官方 @wecom/wecom-openclaw-plugin 保持一致)。
41
+ // 仅 wecom 通道注入,避免污染其他通道(如 Telegram/Discord)的 system prompt。
42
+ // deliver 回调中保留兜底正则解析,作为双重保障。
43
+ api.on("before_prompt_build", (_event, ctx) => {
44
+ if (ctx.channelId !== "wecom") return;
45
+ return {
46
+ systemPrompt: [
47
+ "【发送文件/图片/视频/语音】",
48
+ "当你需要向用户发送文件、图片、视频或语音时,必须在回复中单独一行使用 MEDIA: 指令,后面跟文件的本地路径。",
49
+ "格式:MEDIA: /文件的绝对路径",
50
+ "文件优先存放到 ~/.openclaw 目录下,确保路径可访问。",
51
+ "示例:",
52
+ " MEDIA: ~/.openclaw/output.png",
53
+ " MEDIA: ~/.openclaw/report.pdf",
54
+ "系统会自动识别文件类型并发送给用户。",
55
+ "",
56
+ "注意事项:",
57
+ "- MEDIA: 必须在行首,后面紧跟文件路径(不是 URL)",
58
+ "- 如果路径中包含空格,可以用反引号包裹:MEDIA: `/path/to/my file.png`",
59
+ "- 每个文件单独一行 MEDIA: 指令",
60
+ "- 可以在 MEDIA: 指令前后附带文字说明",
61
+ "",
62
+ "【文件大小限制】",
63
+ "- 图片不超过 10MB,视频不超过 10MB,语音不超过 2MB(仅支持 AMR 格式),文件不超过 20MB",
64
+ "- 语音消息仅支持 AMR 格式(.amr),如需发送语音请确保文件为 AMR 格式",
65
+ "- 超过大小限制的图片/视频/语音会被自动转为文件格式发送",
66
+ "- 如果文件超过 20MB,将无法发送,请提前告知用户并尝试缩减文件大小",
67
+ ].join("\n"),
68
+ };
69
+ });
33
70
  },
34
71
  };
35
72
 
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "id": "wecom",
3
3
  "channels": ["wecom"],
4
+ "skills": ["./skills"],
4
5
  "configSchema": {
5
6
  "type": "object",
6
7
  "additionalProperties": false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mocrane/wecom",
3
- "version": "2026.3.9",
3
+ "version": "2026.3.12",
4
4
  "type": "module",
5
5
  "description": "OpenClaw WeCom (WeChat Work) intelligent bot channel plugin",
6
6
  "main": "index.ts",
@@ -9,6 +9,7 @@
9
9
  "src/",
10
10
  "assets/",
11
11
  "changelog/",
12
+ "skills/",
12
13
  "openclaw.plugin.json",
13
14
  "clawdbot.plugin.json",
14
15
  "README.md",
@@ -42,17 +43,19 @@
42
43
  }
43
44
  },
44
45
  "dependencies": {
45
- "@wecom/aibot-node-sdk": "^1.0.0",
46
+ "@wecom/aibot-node-sdk": "^1.0.2",
46
47
  "fast-xml-parser": "5.3.4",
48
+ "file-type": "^18.7.0",
47
49
  "undici": "^7.20.0",
48
50
  "zod": "^4.3.6"
49
51
  },
50
52
  "peerDependencies": {
51
- "openclaw": ">=2026.2.24"
53
+ "openclaw": "^2026.3.11"
52
54
  },
53
55
  "devDependencies": {
54
56
  "@types/node": "^25.2.0",
55
- "typescript": "^5.9.3"
57
+ "typescript": "^5.9.3",
58
+ "vitest": "^4.1.0"
56
59
  },
57
60
  "clawdbot": {
58
61
  "extensions": [
@@ -0,0 +1,162 @@
1
+ ---
2
+ name: wecom-contact-lookup
3
+ description: 通讯录成员查询技能,基于 MCP tool 协议封装的 `get_userlist` 接口,获取当前用户可见范围内的通讯录成员,支持按姓名/别名本地筛选匹配。返回 userid、姓名和别名。⚠️ 仅返回当前用户有权限查看的成员,非全量成员。
4
+ ---
5
+
6
+ # 通讯录成员查询技能
7
+
8
+ > `wecom_mcp` 是一个 MCP tool,所有操作通过调用该 tool 完成。
9
+
10
+ > ⚠️ **前置条件**:首次调用 `wecom_mcp` 前,必须按 `wecom-preflight` 技能执行前置条件检查,确保工具已加入白名单。
11
+
12
+ 通过 MCP tool 协议封装的 `get_userlist` 接口,获取当前用户可见范围内的通讯录成员,并在本地按姓名/别名进行筛选匹配。
13
+
14
+ ## 操作
15
+
16
+ ### 1. 获取全量通讯录成员
17
+
18
+ 获取当前用户可见范围内的所有企业成员信息:
19
+
20
+ **调用示例:**
21
+
22
+ 使用 `wecom_mcp` tool 调用 `wecom_mcp call contact get_userlist '{}'`
23
+
24
+ **返回格式:**
25
+
26
+ ```json
27
+ {
28
+ "errcode": 0,
29
+ "errmsg": "ok",
30
+ "userlist": [
31
+ {
32
+ "userid": "zhangsan",
33
+ "name": "张三",
34
+ "alias": "Sam"
35
+ },
36
+ {
37
+ "userid": "lisi",
38
+ "name": "李四",
39
+ "alias": ""
40
+ }
41
+ ]
42
+ }
43
+ ```
44
+
45
+ **返回字段说明:**
46
+
47
+ | 字段 | 类型 | 说明 |
48
+ |------|------|------|
49
+ | `errcode` | integer | 返回码,`0` 表示成功 |
50
+ | `errmsg` | string | 错误信息 |
51
+ | `userlist` | array | 用户列表 |
52
+ | `userlist[].userid` | string | 用户唯一 ID |
53
+ | `userlist[].name` | string | 用户姓名 |
54
+ | `userlist[].alias` | string | 用户别名,可能为空 |
55
+
56
+ ---
57
+
58
+ ### 2. 按姓名/别名搜索人员
59
+
60
+ `get_userlist` 返回全量成员后,在本地对结果进行筛选匹配:
61
+
62
+ - **精确匹配**:`name` 或 `alias` 与关键词完全一致,直接使用
63
+ - **模糊匹配**:`name` 或 `alias` 包含关键词,返回所有匹配结果
64
+ - **无结果**:告知用户未找到对应人员
65
+
66
+ **搜索示例:**
67
+
68
+ 用户问:"帮我找一下张三是谁?"
69
+
70
+ 1. 调用 `get_userlist` 获取全量成员
71
+ 2. 在 `userlist` 中筛选 `name` 或 `alias` 包含"张三"的成员
72
+ 3. 返回匹配结果
73
+
74
+ ---
75
+
76
+ ## 注意事项
77
+
78
+ - `get_userlist` 返回的是当前用户**可见范围内**的成员,需经过可见性规则过滤,不一定是全公司所有人员;返回字段仅包含 `userid`、`name`(姓名)和 `alias`(别名)
79
+ - ⚠️ **超过 10 人时接口将报错**:若 `userlist` 返回成员数量超过 10 人,视为异常,应立即停止处理并向用户说明:
80
+
81
+ > 当前通讯录可见成员数量超过了本技能支持的上限(10 人)。
82
+ > 本技能仅适用于可见范围较小的场景,无法在大范围通讯录中使用。
83
+ > 建议缩小可见范围后重试,或通过其他方式查询目标人员。
84
+
85
+ - `userid` 是用户的唯一标识,在需要传递用户 ID 给其他接口时使用此字段
86
+ - `alias` 字段可能为空字符串,搜索时需做空值判断
87
+ - 若搜索结果有多个同名人员,需将所有候选人展示给用户选择,不得自行决定
88
+ - 若 `errcode` 不为 `0`,说明接口调用失败,需告知用户错误信息(`errmsg`)
89
+
90
+ ---
91
+
92
+ ## 典型工作流
93
+
94
+ ### 工作流 1:查询人员信息
95
+
96
+ 用户问:"帮我查一下 Sam 是谁?"
97
+
98
+ 1. 使用 `wecom_mcp` tool 调用 `wecom_mcp call contact get_userlist '{}'` 获取全量成员列表
99
+
100
+ 2. 在结果中筛选 `alias` 为 `Sam` 或 `name` 包含 `Sam` 的成员
101
+ 3. 若找到唯一匹配,直接展示结果:
102
+
103
+ ```
104
+ 📇 找到成员:
105
+ - 姓名:张三
106
+ - 别名:Sam
107
+ - 用户ID:zhangsan
108
+ ```
109
+
110
+ 4. 若找到多个匹配,展示候选列表请用户确认:
111
+
112
+ ```
113
+ 🔍 找到多个匹配成员,请确认您要查询的是哪位:
114
+
115
+ 1. 张三(别名:Sam,ID:zhangsan)
116
+ 2. 张三丰(别名:Sam2,ID:zhangsan2)
117
+
118
+ 请问您要查询的是哪一位?
119
+ ```
120
+
121
+ ---
122
+
123
+ ### 工作流 2:为其他功能提供 userid 转换
124
+
125
+ 用户问:"帮我发消息给张三"
126
+
127
+ 1. 使用 `wecom_mcp` tool 调用 `wecom_mcp call contact get_userlist '{}'` 获取全量成员
128
+
129
+ 2. 筛选 `name` 为"张三"的成员,确认 `userid`
130
+ 3. 将 `userid` 传递给消息发送接口
131
+
132
+ ---
133
+
134
+ ### 工作流 3:批量查询多个人员
135
+
136
+ 用户问:"帮我查一下张三和李四分别是谁?"
137
+
138
+ 1. 使用 `wecom_mcp` tool 调用 `wecom_mcp call contact get_userlist '{}'` 获取全量成员列表
139
+
140
+ 2. 分别筛选"张三"和"李四"的匹配结果
141
+ 3. 汇总后一并展示
142
+
143
+ > 注意:只需调用一次 `get_userlist`,在本地对结果进行多次筛选,避免重复调用接口。
144
+
145
+ ---
146
+
147
+ ## 快速参考
148
+
149
+ ### 接口说明
150
+
151
+ | 接口 | 用途 | 输入 | 返回 |
152
+ |------|------|------|------|
153
+ | `get_userlist` | 获取可见范围内全量通讯录成员 | 无 | 用户列表(userid、name、alias) |
154
+
155
+ ### 本地筛选策略
156
+
157
+ | 场景 | 策略 |
158
+ |------|------|
159
+ | 精确匹配(name 或 alias 完全一致) | 直接使用,无需用户确认 |
160
+ | 模糊匹配(name 或 alias 包含关键词),唯一结果 | 直接使用,向用户展示结果 |
161
+ | 模糊匹配,多个结果 | 展示候选列表,请用户选择 |
162
+ | 无匹配结果 | 告知用户未找到对应人员 |