@yanhaidao/wecom 2.3.150 → 2.3.180
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 +238 -385
- package/SKILLS_CAL.md +895 -0
- package/SKILLS_DOC.md +2136 -0
- package/changelog/v2.3.16.md +11 -0
- package/changelog/v2.3.18.md +22 -0
- package/index.ts +39 -3
- package/package.json +2 -3
- package/src/agent/handler.event-filter.test.ts +11 -0
- package/src/agent/handler.ts +732 -643
- package/src/app/account-runtime.ts +46 -20
- package/src/app/index.ts +19 -1
- package/src/capability/calendar/SKILLS_CHECKLIST.md +251 -0
- package/src/capability/calendar/client.ts +815 -0
- package/src/capability/calendar/index.ts +3 -0
- package/src/capability/calendar/schema.ts +417 -0
- package/src/capability/calendar/tool.ts +417 -0
- package/src/capability/calendar/types.ts +309 -0
- package/src/capability/doc/client.ts +567 -62
- package/src/capability/doc/schema.ts +419 -318
- package/src/capability/doc/tool.ts +1510 -1178
- package/src/capability/doc/types.ts +130 -14
- package/src/capability/mcp/index.ts +10 -0
- package/src/capability/mcp/schema.ts +107 -0
- package/src/capability/mcp/tool.ts +170 -0
- package/src/capability/mcp/transport.ts +394 -0
- package/src/channel.ts +70 -28
- package/src/config/schema.ts +71 -102
- package/src/outbound.test.ts +91 -14
- package/src/outbound.ts +143 -30
- package/src/runtime/reply-orchestrator.test.ts +35 -2
- package/src/runtime/reply-orchestrator.ts +14 -2
- package/src/runtime/session-manager.ts +20 -6
- package/src/runtime/source-registry.ts +165 -0
- package/src/target.ts +7 -4
- package/src/transport/bot-ws/inbound.test.ts +46 -0
- package/src/transport/bot-ws/inbound.ts +23 -5
- package/src/transport/bot-ws/media.ts +269 -0
- package/src/transport/bot-ws/reply.test.ts +85 -17
- package/src/transport/bot-ws/reply.ts +109 -21
- package/src/transport/bot-ws/sdk-adapter.test.ts +64 -1
- package/src/transport/bot-ws/sdk-adapter.ts +88 -12
- package/.claude/settings.local.json +0 -11
- package/docs/update-content-fix.md +0 -135
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# OpenClaw WeCom 插件 v2.3.16 变更简报
|
|
2
|
+
|
|
3
|
+
> [!TIP]
|
|
4
|
+
> **企业微信 Bot-WS 混合消息附件解析修复版本**:`v2.3.16` 重点解决了在 WebSocket 模式下,企业微信机器人接收到的混合消息(如同时包含图片和文字)由于解析遗漏导致附件丢失、AI 只能看到带签名的临时链接文本而无法查看真正图片内容的问题。
|
|
5
|
+
|
|
6
|
+
## 2026-03-16(v2.3.16)
|
|
7
|
+
- 【混合消息媒体解析修复】🛠 **[重要修复]** 补齐了 Bot WebSocket 传输通道(`bot-ws`)下对 `mixed` 结构消息的附件提取逻辑。现在,当用户在企微发出一条包含图片/文件与文字的混合消息时,底层框架会自动遍历并提取各个媒体节点的 URL 和 AES Key,确保核心处理管线能进行正常下载与安全解密。
|
|
8
|
+
|
|
9
|
+
## 升级提示
|
|
10
|
+
- 执行 `openclaw plugins update wecom` 即可升级到 `v2.3.16`。
|
|
11
|
+
- 如果你之前在企微发出“带图的一段话”时,曾遇到 AI 回复说“这是一个腾讯 COS 的临时签名链接”,本次升级后,此问题将被修复,AI 将可以直接分析图片内容本身。
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# OpenClaw WeCom 插件 v2.3.18 变更简报
|
|
2
|
+
|
|
3
|
+
> [!TIP]
|
|
4
|
+
> **企业微信面向中小企业的新能力开放版本**:`v2.3.18` 重点完善了 `wecom` 插件在 Bot WebSocket 场景下的能力层。现在,面向 5 人及以下小企业,OpenClaw 已支持以用户个人身份在企业微信内使用文档读写、日程读写、会议读写、待办读写、通讯录查询等能力。同时,本次也补齐了 Bot WS 媒体发送、建立了 Bot 与 Agent 双平面路由,并修复了企业微信里容易卡在“正在思考...”不结束的问题。
|
|
5
|
+
|
|
6
|
+
## 2026-03-18(v2.3.18)
|
|
7
|
+
- 【中小企业能力开放】🚀 **[重大更新]** 面向 5 人及以下小企业,OpenClaw 在企业微信内正式开放以用户个人身份使用的协作能力入口。现在,大模型可以在具备相应授权的前提下,调用企业微信文档读写、日程读写、会议读写、待办读写以及通讯录查询等能力,把原本分散在多个协作入口中的企业操作集中到同一条智能对话链路中。
|
|
8
|
+
- 【新增 Bot WS MCP 工具层】新增 `wecom_mcp` 工具,将企业微信 Bot WS 能力以挂载式能力层接入 `wecom` 插件。现在 Bot 侧可以按业务类别动态获取 MCP 配置,并把企业微信开放的能力暴露给大模型调用。
|
|
9
|
+
- 【建立 Bot / Agent 双平面路由】新增基于会话来源的能力分流。Bot WS 会话优先使用 `wecom_mcp`;Agent 回调会话继续保留原生 `wecom_doc`、`wecom_calendar` 工具链,避免不同能力面互相干扰。
|
|
10
|
+
- 【多账号能力隔离加强】MCP 相关缓存和状态改为按 `accountId + category` 隔离。在多账号矩阵下,同一类能力不会再共用同一份 Bot 侧配置,减少串账号、串上下文、串连接状态的问题。
|
|
11
|
+
- 【补齐 Bot WS 命令与媒体链】扩展 Bot WS 运行时接口,除了主动文本发送外,现在还支持命令桥接、连接状态探测和媒体发送。Bot WebSocket 会话下的图片、文件回复不再必须依赖 Agent API 补送。
|
|
12
|
+
- 【新增媒体发送提示注入】在企业微信 Bot WS 会话里定向注入 `MEDIA:` 使用提示,帮助模型更稳定地触发图片和文件回复,同时避免把这类提示扩散到非 WeCom 或 Agent 会话。
|
|
13
|
+
- 【修复回复流不收口问题】**[重要修复]** 处理 Bot WS 回复时,带媒体的中间块不再错误中断文本发送。现在文本会先正常下发,媒体在结束阶段继续处理;如果上游没有显式 final,系统也会自动补一个收口帧,避免企业微信里长期停留在“正在思考...”。
|
|
14
|
+
- 【欢迎语路径提速】`enter_chat` 欢迎事件在配置静态欢迎语时改为直发,不再额外启动完整推理流程。首次进入会话时的响应更直接,链路也更短。
|
|
15
|
+
- 【运行时日志增强】新增更细的派发与投递日志,包括 `dispatch-start`、`dispatch-done`、`dispatch-fail`、`deliver-start`、`deliver-done`。现在排查问题时可以更快区分是模型处理慢、回复已被企微确认、MCP 类别未开通,还是本地媒体路径被限制拦截。
|
|
16
|
+
- 【能力边界提示更明确】当企业微信后台只开放部分能力时,插件会更明确地把限制反馈给用户和日志。例如只开通文档类能力时,待办、会议、日程类请求会直接提示当前账号尚未开放对应能力,而不是表现成模糊失败。
|
|
17
|
+
|
|
18
|
+
## 升级提示
|
|
19
|
+
- 执行 `openclaw plugins update wecom` 即可升级到 `v2.3.18`。
|
|
20
|
+
- 本次版本是企业微信能力面的重要开放版本,尤其适合希望在企业微信内直接完成文档、日程、会议、待办与通讯录协作的小型团队。
|
|
21
|
+
- 如果你之前在企业微信 Bot WS 会话里只看到反复“正在思考...”、最终不出结果,本次升级后应已修复。
|
|
22
|
+
- 如果你希望在企业微信里直接使用会议、待办、日程等 Bot 侧能力,请同时确认企业微信后台已经为当前 Bot 开通相应业务类别;插件侧已经具备调用链,但实际可用范围仍以企业微信侧授权为准。
|
package/index.ts
CHANGED
|
@@ -3,11 +3,28 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
|
|
5
5
|
import { emptyPluginConfigSchema } from "openclaw/plugin-sdk";
|
|
6
|
-
|
|
6
|
+
import { registerWecomCalendarTools } from "./src/capability/calendar/tool.js";
|
|
7
|
+
import { registerWecomDocTools } from "./src/capability/doc/tool.js";
|
|
8
|
+
import { createWeComMcpToolFactory } from "./src/capability/mcp/index.js";
|
|
9
|
+
import { wecomPlugin } from "./src/channel.js";
|
|
7
10
|
import { handleWecomWebhookRequest } from "./src/monitor.js";
|
|
8
11
|
import { setWecomRuntime } from "./src/runtime.js";
|
|
9
|
-
import {
|
|
10
|
-
|
|
12
|
+
import { isWecomBotWsSource } from "./src/runtime/source-registry.js";
|
|
13
|
+
|
|
14
|
+
const WECOM_BOT_WS_MEDIA_GUIDANCE = [
|
|
15
|
+
"【WeCom Bot WS 媒体发送】",
|
|
16
|
+
"当前会话支持企业微信 Bot WS 媒体发送。",
|
|
17
|
+
"当你需要发送图片、文件、视频或语音时,必须在回复中单独一行使用 MEDIA: 指令,后面跟本地文件路径。",
|
|
18
|
+
"格式:MEDIA: /文件的绝对路径",
|
|
19
|
+
"示例:",
|
|
20
|
+
" MEDIA: ~/.openclaw/output.png",
|
|
21
|
+
" MEDIA: ~/.openclaw/report.pdf",
|
|
22
|
+
"注意事项:",
|
|
23
|
+
"- MEDIA: 必须单独成行并以 MEDIA: 开头",
|
|
24
|
+
"- 建议优先使用本地可访问路径,而不是远程 URL",
|
|
25
|
+
"- 图片和视频超过 10MB、语音超过 2MB、文件超过 20MB 时可能会降级或发送失败",
|
|
26
|
+
"- 语音消息仅原生支持 AMR;其他音频格式会按文件发送",
|
|
27
|
+
].join("\n");
|
|
11
28
|
|
|
12
29
|
const plugin = {
|
|
13
30
|
id: "wecom",
|
|
@@ -37,6 +54,25 @@ const plugin = {
|
|
|
37
54
|
|
|
38
55
|
// Register WeCom Doc Tools
|
|
39
56
|
registerWecomDocTools(api);
|
|
57
|
+
registerWecomCalendarTools(api);
|
|
58
|
+
api.registerTool(createWeComMcpToolFactory(), { name: "wecom_mcp" });
|
|
59
|
+
|
|
60
|
+
api.on("before_prompt_build", (_event, ctx) => {
|
|
61
|
+
if (ctx.channelId !== "wecom") {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (
|
|
65
|
+
!isWecomBotWsSource({
|
|
66
|
+
sessionKey: ctx.sessionKey,
|
|
67
|
+
sessionId: ctx.sessionId,
|
|
68
|
+
})
|
|
69
|
+
) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
appendSystemContext: WECOM_BOT_WS_MEDIA_GUIDANCE,
|
|
74
|
+
};
|
|
75
|
+
});
|
|
40
76
|
},
|
|
41
77
|
};
|
|
42
78
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yanhaidao/wecom",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.180",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "OpenClaw 企业微信(WeCom)插件,默认 Bot WebSocket,支持加密媒体解密、Agent 主动发消息与多账号接入",
|
|
6
6
|
"repository": {
|
|
@@ -42,8 +42,7 @@
|
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@wecom/aibot-node-sdk": "^1.0.0",
|
|
44
44
|
"fast-xml-parser": "5.3.4",
|
|
45
|
-
"undici": "^7.20.0"
|
|
46
|
-
"zod": "^4.3.6"
|
|
45
|
+
"undici": "^7.20.0"
|
|
47
46
|
},
|
|
48
47
|
"peerDependencies": {
|
|
49
48
|
"openclaw": ">=2026.2.24"
|
|
@@ -49,6 +49,17 @@ describe("shouldProcessAgentInboundMessage", () => {
|
|
|
49
49
|
expect(missingSender.reason).toBe("missing_sender");
|
|
50
50
|
});
|
|
51
51
|
|
|
52
|
+
|
|
53
|
+
it("allows group chat messages when sender id is missing", () => {
|
|
54
|
+
const groupWithoutSender = shouldProcessAgentInboundMessage({
|
|
55
|
+
msgType: "file",
|
|
56
|
+
fromUser: " ",
|
|
57
|
+
chatId: "wrbchat_123",
|
|
58
|
+
});
|
|
59
|
+
expect(groupWithoutSender.shouldProcess).toBe(true);
|
|
60
|
+
expect(groupWithoutSender.reason).toBe("missing_sender_but_group_chat");
|
|
61
|
+
});
|
|
62
|
+
|
|
52
63
|
it("allows normal user text message processing", () => {
|
|
53
64
|
const normalMessage = shouldProcessAgentInboundMessage({
|
|
54
65
|
msgType: "text",
|