/** * 模块: Session Bridge — 跨 reset 把上次会话尾段的 user/assistant 对话拉回来当 prependContext * * 触发场景(issue #1 5/2 早晨 zhaobo 失忆事故复盘): * - 5/1 23:13:26 openclaw runtime 把 wecom:direct:zhaobo 的活跃 session 硬 reset * (.jsonl 改名 .jsonl.reset.,新 session 起空白上下文) * - enhance 已有的 before_reset hook 当时未触发(动作不是 reset 事件而是 hard wipe), * lifecycle 抢救 = 0,session-recap 又只读 chapters/todos/decisions 这些结构化元数据 * - 用户次日感知到"openclaw 忘了昨天下午聊的内容" * * 本模块的策略: * - 不依赖 hook 抢救(避免上面那种"reset 没发 before_reset"的盲区) * - before_prompt_build 时主动扫 sessions/ 找 .jsonl.reset.* 文件 * - 用 chat_id (case-insensitive) 匹配同一会话伙伴 — 比 sessionKey 更鲁棒 * (sessionKey 大小写归一化跟原始 wecom userid 大小写偶尔不一致) * - 拉末 N 条 message 拼成 prependContext 注入 * * 红线: * - 完全只读,不动龙虾任何状态(红线 #1) * - 只读自己 + 龙虾 sessions/ 目录(红线 #2) * - 不在插件代码里嵌 cli 命令(红线 #4 #5) * - prependContext 只追加,绝不覆盖原 system prompt * - 进程内 6h dedup 防止反复注入污染同一 session */ import type { OpenClawPluginApi } from "openclaw/plugin-sdk"; export interface SessionBridgeConfig { enabled?: boolean; /** prior 文件 mtime 距今需 ≥ 多少分钟才桥接(防止活跃流被自己重复注入),默认 75 */ bridgeIdleMinutes?: number; /** 检索 prior session 文件的最大年龄(小时),默认 72(v6.1.9 起从 48 → 72,跨周末 OK) */ priorMaxAgeHours?: number; /** 桥接的末 N 条 message,默认 20(v6.1.9 起从 8 → 20,跨夜大半天会话覆盖) */ tailMessages?: number; /** 桥接文本字符上限(含模板),默认 12000(v6.1.9 起从 4000 → 12000,3x 容量) */ maxChars?: number; /** 当前 session jsonl ≥ 多少字节就视为非 fresh、不再桥接,默认 200KB */ freshSessionMaxBytes?: number; /** 调试日志 */ debug?: boolean; } export declare function registerSessionBridge(api: OpenClawPluginApi, config?: SessionBridgeConfig): void;