微信引用即上下文 —— 指导型装载与验证
目标:让 agent 按本文件的规格,修改用户本机已安装的微信渠道插件,使其具备"引用即上下文"(引用某条消息追问时,把被引用消息的原文注入模型上下文)。 本技能不含补丁文件、不安装任何插件包。
激活条件(必须先确认)
- 只有当用户明确要求为
openclaw-weixin渠道启用或修复引用追问时才执行本技能。 - 触发短语(需与渠道/插件语境同时出现):启用微信引用上下文 / 修复 openclaw-weixin 引用匹配。
- 命中后先复述将要做什么并取得用户确认;确认前不要读改任何文件(只读检查除外)。
不可协商的顺序(违反则中止)
① 只读定位 → ② 说明并取得明确同意 → ③ 备份并校验 → ④ 实现 → ⑤ 确定性构建 → ⑥ 重启 → ⑦ 验证 → ⑧ 报告与回滚
- ①之前不得写入;③完成并校验前不得进入 ④。
- 同意必须明确:列明目标路径、插件版本、将改文件、计划改动、将要持久化的数据、以及重启影响。
- 用户拒绝/含糊/撤回 → 中止,不做任何改动。
权限边界(硬性)
- 禁止在
sudo/ root / 管理员终端下执行写入、构建。 - 插件位于系统级位置时 → 停止,建议改到用户级位置(或由用户自行处理权限),不要提权修改。
目标行为(规格)
- 发送侧记录:每次发送成功后记录
{接收方, 服务端 message_id(精确字符串), 正文}。message_id从 sendMessage 原始响应文本正则提取精确字符串回填。
- 引用侧解析:引用时取入站
ref的msg_id,在记录中查找:- 优先精确 id 匹配;再 id 邻近(|差| ≤ 1000);未命中用正文子串兜底。
- 匹配必须限定在同一 账号 + 接收方 + 会话内;出现多个候选时拒绝自动选择(显式标记未解析)。
- 命中则注入被引用原文(建议
[引用: <原文>]);未命中显式标记,禁止按时间猜测。
- 持久化(含强制约束)
- 跨进程/重启可用(建议状态目录下的 SQLite,如
openclaw-weixin/quote-index.sqlite)。 - 强制:24 小时过期 + 每接收方上限(建议 80 条)事务性执行;过期/超限即删。
- 强制:数据库与目录仅属主可读写(POSIX
0600/0700;Windows 限制到当前用户 ACL);权限不安全则拒绝启动该索引。 - 最小化:只保留解析所需的最小内容;不把消息正文写进日志(探针只记方法、长度、非敏感 id)。
- 用户可控:提供查看/禁用/清除索引的方式;索引默认排除在普通备份之外,除非用户明确选择包含。
- 跨进程/重启可用(建议状态目录下的 SQLite,如
- 可观测探针:发送
[send-resp];命中[quote-hit] method=id ... textLen=…(不含正文)。
⚠️ 三个必须避开的实现坑
- 服务端 id 超过
Number.MAX_SAFE_INTEGER:禁止用 Number 比较(会四舍五入导致匹配失败);必须正则取字符串 + BigInt/字符串比较。 - 时间戳不可作主判据:服务器
create_time与本地时间偏差不稳定,只能粗筛。 - 内存 Map 会丢:必须落盘;持久化失败时保留进程内兜底,不重发已发送消息。
执行步骤
- 只读定位(不写):
openclaw plugins inspect openclaw-weixin --json→ 取rootDir/installPath与packageVersion;阅读src/api/api.ts、src/messaging/send.ts、src/messaging/inbound.ts、src/messaging/outbound-memory.ts。已有等效实现则只校验不改。 - 说明并取得明确同意(含将持久化的数据种类与保留策略)。
- 备份并校验:按相对路径复制到
<rootDir>/.clawbot-backup-<时间戳>/,校验可读完整;失败则中止。 - 实现规格(含"三个坑"与持久化的强制约束)。
- 确定性构建(仅当改动
.ts):优先npm ci --ignore-scripts(要求可审阅且一致的 lockfile);不要无约束npm install;无 lockfile/不一致/来源不可信 → 停止并询问;构建失败 → 用备份还原。 - 重启:
openclaw gateway restart,等 20-30 秒。 - 验证:发送侧
[send-resp];引用一条新 bot 回复 →[quote-hit] method=id ... textLen=…且回复贴合被引用内容;重启后再引用一次仍命中(验证持久化);确认索引文件权限仅属主。 - 报告:改动文件、备份目录、索引位置与保留策略、验证结果、精确回滚步骤(含清除索引)。
回滚与升级
- 回滚:用备份覆盖回去 + 删除索引文件,重启。
- 官方插件升级会覆盖改动:重新执行本技能(从第 1 步开始)。
隐私
- 不读取/外发密钥;不把消息正文写入日志;索引仅本机、仅属主可读、有强制过期与上限。
