微信 20s 连发防抖 —— 指导型装载与验证
目标:让 agent 按本文件的规格,修改用户本机已安装的微信渠道插件,使其具备 20s 连发防抖。 本技能不含补丁文件、不安装任何插件包。
激活条件(必须先确认)
- 只有当用户明确要求为
openclaw-weixin渠道启用或修复防抖时才执行本技能。 - 触发短语(需与渠道/插件语境同时出现):启用微信防抖 / 防抖没生效 / openclaw-weixin 防抖。
- 命中触发短语后,先复述将要做什么并取得用户确认,确认前不要读改任何文件(只读检查除外)。
不可协商的顺序(违反则中止)
① 只读定位 → ② 说明并取得明确同意 → ③ 备份并校验 → ④ 实现 → ⑤ 确定性构建 → ⑥ 重启 → ⑦ 验证 → ⑧ 报告与回滚
- ①之前不得写入任何文件;③完成并校验前不得进入 ④。
- 同意必须是明确的肯定答复:需列明目标路径、插件版本、将改动的文件、计划改动、以及重启影响。
- 若用户拒绝、答复含糊或撤回同意 → 中止,不做任何改动。
权限边界(硬性)
- 禁止在
sudo/ root / 管理员终端下运行本技能的写入、构建动作。 - 若插件位于系统级位置(macOS/Linux:
/usr/local/lib/node_modules、/usr/lib/node_modules等;Windows:%ProgramFiles%\nodejs等)→ 停止,建议用户把插件改到用户级位置(或由用户自行处理权限),不要用提权方式修改。 openclaw命令始终以当前普通用户运行。
目标行为(规格)
对同一发送者的纯文本消息:
- 首条进入缓冲,启动 20 秒静默窗口(取
messages.inbound.byChannel["openclaw-weixin"],默认 20000ms)。 - 每来一条可合并文字 → 取消并重启计时器(尾窗;不是固定窗口)。距最后一条满 20 秒后合并为一条,走原处理管线(一轮回复)。
- 单条文字同样等满 20 秒。
- 提前提交:缓冲达 8 条或正文达 6000 字符。
- 不合并(立即处理):图片、语音、文件、视频、斜杠命令。
- 发送/处理经串行队列,保持顺序。
- 缓冲键 = 账号 + 发送者;窗口设 0 关闭。
执行步骤
- 只读定位(不写)
openclaw plugins inspect openclaw-weixin --json→ 取rootDir/installPath与packageVersion。- 阅读
src/monitor/monitor.ts(运行态dist/src/monitor/monitor.js)确认现有实现;已有等效防抖则只校验,不改(幂等)。
- 说明并取得明确同意
- 列出:目标路径、版本、将改文件、计划改动(尾窗 + 上限 + 媒体直通 + 串行)、重启影响。等待肯定答复。
- 备份并校验
- 把每个将改文件按相对路径复制到
<rootDir>/.clawbot-backup-<时间戳>/,保留目录结构;校验备份可读且完整;校验失败 → 中止。
- 把每个将改文件按相对路径复制到
- 实现规格
- 纯文本分支前加缓冲
{msgs, chars, timer, generation},按 账号+发送者 建键。 - 新文字:
clearTimeout→generation++→setTimeout(flush, windowMs);回调校验 generation。 flush:按序拼接为一条走原管线;上限到达立即 flush;媒体/语音/文件/斜杠命令不缓冲。
- 纯文本分支前加缓冲
- 确定性构建(仅当改动
.ts)- 优先
npm ci --ignore-scripts(要求存在可审阅的 lockfile 且与清单一致);不要用无约束的npm install。 - 无 lockfile、lockfile 与清单不一致、或依赖来源不可信 → 停止并询问用户,不要自行安装。
- 构建后确认
dist/*.js与源同步;构建失败 → 用第 3 步备份还原并报告。
- 优先
- 重启:
openclaw gateway restart,等 20-30 秒。 - 验证:日志出现
debounce: buffered text ... windowMs=20000;连发多条(间隔 <20 秒)只收到一轮且提交时间随最后一条后移;单条等满 20 秒;媒体/斜杠命令立即响应。 - 报告:改动文件清单、备份目录、验证结果、精确回滚步骤。
回滚与升级
- 回滚:用备份覆盖回去(或重装官方同版本)后重启。
- 官方插件升级会覆盖改动:重新执行本技能(从第 1 步开始)。
隐私
- 不读取、不外发任何密钥与聊天内容;不新增日志中的消息正文。
