/** * 模块: 龙虾原生 Memory Surfacer (v5.7.10) * * 作用: 解决"第二天失忆"——新 session 启动时主动 surface L1 .md memory 文件锚点, * 让 Claude 不再依赖"主动想起去 Read 哪个文件"。MEMORY.md 索引会被龙虾自动注入, * 但 200 行外的子文件 / 跟当前 cwd 无字面匹配的子文件,默认不会激活。本模块按 * cwd / git remote 评分把相关文件锚点提前 surface 到 prompt。 * * 非侵入式保证: * - 完全只读 ~/.claude/projects/-/memory/*.md, 不写任何文件 / 数据库 * - 不复制 MEMORY.md (已被龙虾自动注入索引), 不复制子文件正文 (只 surface 锚点) * - 通过 before_prompt_build prependContext 追加, 不覆盖龙虾原生 system prompt * - 单 (agentId, sessionKey) 仅注入一次, 避免污染 prompt cache * * 跟其他模块的边界: * - session-recap: idle > 75min 时注入 chapter/todo/decision 摘要 (本模块互补,开局即注入文件锚点) * - memory-integrator: 把 enhance SQLite 喂给 L1 corpus 搜索 (本模块只动 .md 文件,不动 SQLite) * - kb-corpus: 把 ~/.openclaw/kb/shared/wiki/*.md 挂给 corpus (本模块只动 ~/.claude/projects 下的 .md) * * 红线: * - 不引入 child_process (企业扫描器会拦截; 用 .git/config 文件读取代替 git remote) * - 不发起任何网络请求 */ import type { OpenClawPluginApi } from "openclaw/plugin-sdk"; export interface NativeMemorySurfacerConfig { enabled?: boolean; /** 显式指定 memory 目录;不指定则按 cwd 推断 (fallback 到 home memory) */ memoryDir?: string; /** 单次注入最多展示的文件数,默认 12(v6.1.9 起从 5 → 12,让更多 .md 进 surface) */ maxFiles?: number; /** 单文件 description 截断长度,默认 80 */ descriptionMaxChars?: number; /** 评分阈值 (0-1),低于此分数的文件不进入 surface,默认 0.05(v6.1.9 起从 0.15 → 0.05,REFERENCE/USER 类也能 surface) */ threshold?: number; /** v6.1.9: cwd 匹配额外加权(默认 0.2,让项目目录相关 .md 优先) */ cwdRelevanceBoost?: number; /** v6.1.9: 近 7 天文件额外加权(默认 0.1,让最近编辑的 .md 优先) */ ageRecencyBoost?: number; debug?: boolean; } export declare function registerNativeMemorySurfacer(api: OpenClawPluginApi, config?: NativeMemorySurfacerConfig): void;