相对 v3.3.0 的变更摘要。
- 修复模型用
message工具导致企微「不响应」: 模型在 WS 入站 turn 内调用 OpenClawmessage工具(action="send"、无 target)时,OpenClaw 核心会自动把回复改走aibot_send_msg主动消息推送通道,绕过 ws-monitor 的state.accumulatedText累积,最终final_reply_sent.textLength为 0、企微思考卡留空、activeDaily配额(默认 10/天)被快速消耗、用户体感"openclaw 不响应"。修复对齐官方@wecom/wecom-openclaw-plugin@2026.5.14webhook/helpers.js:buildCfgForDispatch的做法:dispatch 前临时把tools.deny和tools.sandbox.tools.deny都加上"message",强制模型只能用 inline visible text 回复。
- cross-chat outbound 临时下线: 由于
message工具在 WS 入站 dispatch 期间被 deny,模型通过message(action="send", channel="wecom", target=…)向其他用户/群发主动消息的能力暂时不可用。outbound-sender-protocol.js中的[[sender:xxx]]头部协议代码保留,预计在后续版本里把 cross-chat 路由重做到 inline visible text 路径(检测 visible text 首行的[[sender:xxx]]头并通过agent-api.js#agentSendText投递)。如果你的业务依赖此特性,请暂缓升级。 buildReplyMediaGuidance/buildBodyForAgent中引导模型用message工具做 cross-chat 的 system prompt 段落被删除,替换为「messagetool is disabled on this channel; reply with visible text directly」的明示提示。
- 新增
wecom/cfg-for-dispatch.js,导出buildCfgForDispatch(config),照搬官方实现的 deny 部分;暂不应用blockStreamingChunk/blockStreamingCoalesce阈值调整,避免与现有 throttle 冲突。 wecom/ws-monitor.jsdispatch 注入点cfg: config改为cfg: buildCfgForDispatch(config)。- 仅修改 WS 入站路径;
callback-inbound.jswebhook 路径暂不动(官方 v2026.5.14 已在 webhook 路径 deny;本仓库目前未观察到 webhook 路径的同类问题)。 - peerDependency 保持
^2026.3.23-2不变;与 OpenClaw 2026.5.20 / 2026.5.22 的dispatchReplyWithBufferedBlockDispatcher、runtimeProfileAlsoAllow语义、plugin-sdk/{status-helpers,core,setup,media-runtime}子路径均逐项核对一致。
- 新增
tests/cfg-for-dispatch.test.js:覆盖空 config、existing deny 合并、其他字段不变、不可变性 4 个用例。 - 调整
tests/reply-media-directive.test.js:3 个原 cross-chat /[[sender:]]头部断言改为断言新的 message-tool-disabled 文案。 - 本地全量测试
318 pass / 0 fail。
- 远端
ali-airsync +openclaw gateway restart后openclaw plugins doctor无新增 issue。 - 端到端 smoke:
wecom-dm-lirui让模型在 sandbox 里bash创建文件并复盘,finalAssistantVisibleText非空、winnerProvider=openai-codex、fallbackUsed=false、trajectory 中 0 个tool.call name="message"。 - 生产观察约 4 小时:21 条
final_reply_sent全部textLength > 0,0 次Active send quota is exhausted警告(修复前为 28/28 条textLength=0+ 多次 quota 告警)。
相对 v3.2.0 的变更摘要。
- 图文 reply 支持 markdown_v2 + 远程图片直挂: 将模型 reply 里的远程图片以企业微信
msg_item直接附加到 passive markdown 回复,避免重复链接展开 - OpenClaw 2026.5.20 兼容性验证: 验证插件在最新 OpenClaw 上的 SDK subpath 导入 (
plugin-sdk/{status-helpers,core,setup,media-runtime})、contracts.tools声明、hook 注册全部仍生效;peerDependency 范围保持^2026.3.23-2不变
- 空 turn 不再下发「处理完成。」兜底文案: 模型 0 输出时(既无 visible text 也无 reasoning 也无 media),插件改为静默关流,企业微信侧
⏳ 处理中…占位会被正常清除,而不是显示无意义的「处理完成。」消息 - passive reply 远程图片去重 / planning 延迟: 修复同一条回复里既有可见 markdown 链接又被识别为媒体导致重复发送的问题;推迟 media planning 到 reply finalize 阶段以保留原始 markdown 结构
- OSS 隐私清理: 移除测试 fixture 中的真实 WeCom userid / chatid 与脚本/文档中的内部 SSH 主机名占位,全部替换为通用占位 (
alice/bob、your-host等)
相对 v3.1.0 的变更摘要。
- Workspace 模板额外文件: 新增
channels.wecom.workspaceTemplateExtraFiles,支持在默认引导文件之外复制相对路径脚本/配置目录,并跳过.git、node_modules、.env*和路径穿越项 - 文件+文本入站聚合: WS 入站对纯附件消息增加短窗口等待,可与同一用户紧邻文本合并为一次处理;
mixed消息同步支持提取文件附件
- 入站文件下载失败显式回复: 加密附件下载失败时不再 fallback 到普通 HTTP 读取,也不再把空/乱码上下文交给模型猜测;会重试后直接提示用户重发附件
- 等待模型响应不再堆叠: 思考占位只刷新当前秒数,避免
等待模型响应 1s/2s/...在企微卡片中持续堆叠 - 思考流诊断增强:
sendThinkingMessage=true但未收到 OpenClaw reasoning stream 时记录 sessionreasoningLevel,便于排查是否被显式设为off
相对 v3.0.1 的变更摘要。
- 官方 WeCom MCP 2026.4.23 对齐:
wecom_mcp协商版本升级到官方2026.4.23,SDK 升级到@wecom/aibot-node-sdk@1.0.6 - MCP 上下文透传: 工具工厂透传可信
requesterUserId、agentAccountId、原始大小写chatId/chatType,文档授权错误时可通过aibot_send_biz_msg发送授权卡片 - MCP 拦截器增强: 支持 SmartPage
page_filepath读取、SmartPage 导出内容落本地文件、get_msg_mediabase64 媒体落本地文件、业务错误码触发缓存清理 - MCP 多账号 fallback: 默认账号非长连接机器人时,自动选择第一个配置了
botId/secret的账号获取 MCP 配置 - doc-only skills 部署收敛: 移除当前企业未开通的 contact/todo/meeting/schedule/msg/send-media skills,保留 doc、smart sheet 和 preflight 相关 skills
- 远程安装脚本: 新增
scripts/install-plugin.sh,同步插件代码与共享 skills、远端执行npm ci --omit=dev、保持root:rootownership 并重启校验 gateway
- README 增加企业微信 MCP 文档与智能表格说明,明确
forbidden for current apikey属于企业微信后端权限拒绝,需要企业微信侧授权 - 更新 MCP 远程探测脚本默认版本与远端插件路径,避免继续使用旧
plugin_version=1.0.12
- 扩展
tests/mcp-tool.test.js,覆盖官方协商版本、请求人 header、文档授权卡片、SmartPage 文件读取/导出、本地 session chat 信息容量控制、多账号 MCP fallback - 本地全量测试通过:
287 pass / 0 fail
相对 v3.0.0 的变更摘要。
- WeCom
/workspace/...宿主路径解析对齐新版 OpenClaw:ws-monitor和动态 agent workspace template 的路径计算改为优先读取agents.defaults.workspace/agents.list[].workspace,非默认 agent 不再错误回退到~/.openclaw/workspace-<agentId>,修复新版多 agent workspace 根目录迁移后FILE:/workspace/.../MEDIA:/workspace/...文件发送失败的问题 - 回复文件发送引导强化: WeCom reply guidance 明确要求把
MEDIA:/FILE:指令放在<final>标签内,并补充 browser 媒体必须先stage_browser_media再回复,减少模型回错宿主路径或把指令写到标签外导致的静默丢失
- 扩展
tests/reply-media-directive.test.js,覆盖agents.defaults.workspace作为非默认 agent workspace 基座时的/workspace/...解析 - 扩展
tests/workspace-template.test.js,覆盖 dynamic agent workspace 路径计算与 template seed 对新版 workspace 根目录的兼容
相对 v2.4.1 的变更摘要。
- 仅支持 OpenClaw
2026.3.23-2+:peerDependencies.openclaw收紧为^2026.3.23-2,并切换到新版 SDK 导出路径(plugin-sdk/status-helpers、plugin-sdk/core、plugin-sdk/media-runtime) - 不再兼容旧版 core 媒体/状态目录分支: 移除旧
plugin-sdk媒体加载 fallback 和CLAWDBOT_STATE_DIR兼容读取,运行环境统一按新版 OpenClaw 约定处理
- 跨会话 WeCom 主动消息 sender 协议: 为
message.send/message.sendAttachment注入[[sender:...]]隐式头,并在 WS、Webhook、Agent API 出站时转成可见发送人前缀,避免子 Agent 主动触达其他会话时丢失发送者身份 - 中文名目标寻址增强:
resolveWecomTarget()支持将纯中文姓名转拼音 userId,并结合~/.openclaw/agents下已存在的动态 DM Agent 自动补全或纠正目标 userId - 动态 Agent 子会话投递钩子接入新版事件系统:
subagent_delivery_target/subagent_spawned/subagent_ended改为通过api.on(...)注册,兼容新版 OpenClaw 生命周期 - 新增
stage_browser_media工具: 将浏览器工具产出的~/.openclaw/media/browser/*文件复制到当前 workspace,并返回可直接用于最终回复的/workspace/...指令,绕开 core block reply 对宿主机浏览器路径的 sandbox 拦截
- WS 主动发送统一走 Markdown 载荷:
sendWsMessage()统一发送 markdown body,减少结构化文本在主动消息中的降级 - 账号启动保存 channel runtime:
startAccount()显式缓存ctx.channelRuntime,为新版 core 的 channel 运行时能力留出兼容入口 - 新版状态摘要工具适配: 账户状态摘要 helper 改从新版 SDK 子路径导入,避免
2026.3.23-2上的运行时导出不匹配 - 浏览器媒体回复引导修正: WeCom reply guidance 和 README 明确要求先用
stage_browser_media把浏览器宿主机路径转进/workspace/...,避免模型直接回传media/browser绝对路径导致 block reply 媒体丢失
- 新增
tests/outbound-sender-hook.test.js、tests/outbound-sender-protocol.test.js覆盖 sender 协议 hook 与协议转换 - 扩展
tests/target.test.js、tests/reply-media-directive.test.js、tests/ws.e2e.test.js,覆盖中文名寻址、内联 WeCom 规则和 WS 主动发送行为 - 新增
tests/browser-media-tool.test.js覆盖浏览器媒体 staging 与安全校验
相对 v2.3.0 的变更摘要。
- MCP 按需架构重构: 移除
mcp-config.js持久化模块,改为通过 WS 客户端按需获取 MCP 配置并内存缓存,消除文件系统路径依赖(#132, #141) - MCP
msgcategory 支持:wecom_mcp新增消息类 MCP 调用(群聊/单聊消息查询),配套wecom-msg和wecom-send-mediaskill - MCP 企业规模限制说明: tool description 和错误消息中明确标注企微官方策略——>10 人企业仅支持
doccategory,<=10 人小团队支持全部 category - 回调入站媒体下载兼容:
downloadCallbackMedia改用core.mediaruntime,兼容新版 OpenClaw 媒体存储接口 - image_studio 回复规范: WS 回复引导中增加 image_studio 成功后不重复输出图片 URL 的约束
- Callback-only 账户启动修复 (#137):
startAccount跳过无 WS 凭据的 callback-only 账户的 WS monitor,防止 gateway restart 循环崩溃 - 动态 Agent 配置写入安全检查 (#136):
ensureDynamicAgentListed写入前验证内存配置含channels段,防止不完整快照覆盖用户配置文件 replyFormat: "text"全路径生效 (#139):sendViaAgent传递format参数,sendViaWebhook根据配置选择webhookSendText/webhookSendMarkdown,个人微信端不再显示"暂不支持此消息类型"- MCP unsupported category 错误增强 (#140): 返回企业规模限制说明 + 更明确的停止重试指令,减少 LLM 无效探索
- 删除
wecom/mcp-config.js、scripts/wecom-mcp-probe.js、tests/mcp-config.test.js - 新增
scripts/wecom-mcp-remote-call.js远程 MCP 调用探测脚本 - 新增
tests/callback-media.test.js回调媒体下载测试 .gitignore增加.claude/目录
相对 v2.2.1 的变更摘要。
- 欢迎语外链文件
welcomeMessagesFile: 支持从 OpenClaw 状态目录下的 JSON 加载欢迎语列表(顶层数组、{ "messages": [...] }、或每条为行数组),按 mtime+size 缓存,改文件无需重启 gateway;welcomeMessage仍优先生效 - 可选
image_studio工具: 通过plugins.entries.wecom的qwenImageTools配置启用,对接通义/万相生图与编辑(wecom/plugin-config.js+openclaw.plugin.jsonschema) - 子 Agent 投递前公告(WS):
subagent announce delivery hooks,便于在 WS 机器人模式下在子 Agent 回复前向用户展示状态(#133)
- 动态 Agent 继承主 Agent 配置: 会话 key 含 channel,并以账户
agentId为继承基准(#125) - 被动回复本地媒体与空群 @: 修正媒体根路径与空 mention 场景(#120)
- 部门 ID 误判: 避免将正文中的电话号码误识别为部门 ID(#124)
- 新增运维脚本:
scripts/set-reasoning-stream-remote.js、scripts/wecom-mcp-remote-probe.js .gitignore增加本地welcome-messages.json;删除过时迁移文档docs/official-1010-migration-plan.md- 默认内置欢迎语补充图片编辑与语音对话说明(未配置外链文件时的回退文案)
- 自建应用 Agent 回调入站通道: 支持企微自建应用"接收消息"HTTP 回调模式作为独立入站渠道。在
agent.callback配置token、encodingAESKey、path即可启用;路由自动注册,与 WS 通道并行运行 - Agent API 回复支持 Markdown:
agentSendText新增format参数("text"|"markdown"),回调入站回复默认为"markdown";可通过agent.replyFormat配置项覆盖 - 入站/出站信息日志: WS 入站
[WS:account] ← inbound、CB 入站[CB:account] ← inbound、CB 出站[CB:account] → outbound三条 INFO 日志,便于在 gateway 日志中追踪消息流
- 群聊正文中的
@标识误删: 移除 WeCom 群消息进入 Agent 前对所有@...token 的二次清洗,避免将callerUri="...@H323"、calleeUri="...@CONFNO"这类正文内容误判为 mention 并截断
- 新增群聊回归测试,覆盖
@H323/@CONFNO在入站上下文中的保留行为 - 新增
extractGroupMessageContent()单测,验证 mention 去除与正文@token 保留可同时成立
- 动态 Agent 配置持久化:
ensureDynamicAgentListed改为直接写入已变更的内存配置(与logoutAccount一致),修复因loadConfig()在 gateway 运行时返回相同内存快照导致写入被跳过的问题,新动态 Agent 现在会正确持久化到磁盘配置文件 - Main Agent 心跳丢失: 初始化
agents.list时为 main 条目添加heartbeat: {},防止动态 Agent 注册后 main 的心跳调度被意外排除(hasExplicitHeartbeatAgents逻辑)
- SDK 100 条队列限制: 企微
@wecom/aibot-node-sdk对每个reqId的回复队列上限为 100 条(maxReplyQueueSize=100),超出后直接 reject。官方插件未做任何节流处理,完全依赖 core 的 buffered dispatcher 自然控制频率。本插件因额外支持 reasoning stream,中间消息量更大,保留了MAX_INTERMEDIATE_STREAM_MESSAGES=85上限 + 800ms 时间节流双重防护
- Bindings 路由: 支持通过 OpenClaw
bindings配置将不同 WeCom 账户绑定到不同 Agent,显式 binding 优先于动态 Agent 路由 (#85) - deliveryMode: "direct": 对齐上游标准,声明直接投递模式
- emptyPluginConfigSchema(): plugin-level configSchema 改用上游推荐的 safeParse 格式
- Agent API 长文本截断: 新增
splitTextByByteLimit()按 WeCom 2048 字节限制自动分段,优先在换行处断开 (#84) - XML body 误发检测: Bot webhook 收到 XML 请求时返回 400 并提示使用 Agent 回调地址 (#83)
- 消除顶层副作用:
setInterval从模块顶层移入register()函数
- 删除 e2e 测试资源(远程测试通过后清理)
- 更新 README:新增 Bindings 路由文档,更新项目结构
- Fix message truncation during tool calls (#73): Move
mainResponseDoneflag from deliver callback to afterdispatchDone, preventing the 30s idle timeout from closing the stream while LLM is still executing tools
- Thinking mode support: Parse
<think>/<thinking>/<thought>tags from LLM output and display reasoning in WeCom's collapsiblethinking_contentfield - Passive reply thinking UI: First sync response shows thinking mode UI immediately via
thinking_contentfield - Markdown fallback: response_url fallback now sends
msgtype: "markdown"instead oftextfor richer formatting
- Stream routing: Fix concurrent message race by checking
ctxStream.finishedbefore reusing async-context stream; fall back to latest recoverable stream - Agent inbound whitelist: Filter non-message event types (subscribe/unsubscribe etc.) to prevent them from triggering LLM replies
- MEDIA regex: Match only line-start
^MEDIA:directives to align with upstream OpenClaw behavior - Grace timer: Reduce post-dispatch grace timer from 3000ms to 200ms for faster stream finalization
- Remove auto-detect /workspace/ paths: Remove overly aggressive workspace path auto-detection in outbound delivery; rely on upstream MEDIA directives and payload.mediaUrls instead
- Add table of contents navigation to README
- Add streaming capabilities documentation (Markdown, thinking mode, images)
- Add
think-parser.jsto project structure
- fix: guard /workspace path traversal in outbound delivery
- fix: admin bypass option and wecom routing fixes
- fix: adapt to OpenClaw 3.2 registerHttpRoute API
- fix: wecom compatibility and agent media delivery
- feat: 媒体类型自动识别 & 流恢复增强
- fix: 智能解密媒体文件,防止 Bot 模式文件损坏
- feat: 多账号支持(Multi-Bot)