openclaw-cortex-memory 0.1.0-Alpha.8 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +347 -299
  3. package/SIGNATURE.md +7 -0
  4. package/SKILL.md +96 -350
  5. package/dist/index.d.ts +93 -23
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1234 -1318
  8. package/dist/index.js.map +1 -1
  9. package/dist/openclaw.plugin.json +377 -18
  10. package/dist/src/dedup/three_stage_deduplicator.d.ts.map +1 -1
  11. package/dist/src/dedup/three_stage_deduplicator.js +13 -3
  12. package/dist/src/dedup/three_stage_deduplicator.js.map +1 -1
  13. package/dist/src/engine/memory_engine.d.ts +6 -1
  14. package/dist/src/engine/memory_engine.d.ts.map +1 -1
  15. package/dist/src/engine/ts_engine.d.ts +208 -0
  16. package/dist/src/engine/ts_engine.d.ts.map +1 -1
  17. package/dist/src/engine/ts_engine.js +1353 -84
  18. package/dist/src/engine/ts_engine.js.map +1 -1
  19. package/dist/src/engine/types.d.ts +27 -0
  20. package/dist/src/engine/types.d.ts.map +1 -1
  21. package/dist/src/graph/ontology.d.ts +87 -15
  22. package/dist/src/graph/ontology.d.ts.map +1 -1
  23. package/dist/src/graph/ontology.js +999 -12
  24. package/dist/src/graph/ontology.js.map +1 -1
  25. package/dist/src/net/http_post.d.ts +17 -0
  26. package/dist/src/net/http_post.d.ts.map +1 -0
  27. package/dist/src/net/http_post.js +56 -0
  28. package/dist/src/net/http_post.js.map +1 -0
  29. package/dist/src/quality/llm_output_validator.d.ts +65 -0
  30. package/dist/src/quality/llm_output_validator.d.ts.map +1 -0
  31. package/dist/src/quality/llm_output_validator.js +635 -0
  32. package/dist/src/quality/llm_output_validator.js.map +1 -0
  33. package/dist/src/reflect/reflector.d.ts.map +1 -1
  34. package/dist/src/reflect/reflector.js +296 -26
  35. package/dist/src/reflect/reflector.js.map +1 -1
  36. package/dist/src/rules/rule_store.d.ts.map +1 -1
  37. package/dist/src/rules/rule_store.js +75 -16
  38. package/dist/src/rules/rule_store.js.map +1 -1
  39. package/dist/src/session/session_end.d.ts +20 -42
  40. package/dist/src/session/session_end.d.ts.map +1 -1
  41. package/dist/src/session/session_end.js +31 -214
  42. package/dist/src/session/session_end.js.map +1 -1
  43. package/dist/src/store/archive_store.d.ts +52 -7
  44. package/dist/src/store/archive_store.d.ts.map +1 -1
  45. package/dist/src/store/archive_store.js +526 -96
  46. package/dist/src/store/archive_store.js.map +1 -1
  47. package/dist/src/store/embedding_utils.d.ts +32 -0
  48. package/dist/src/store/embedding_utils.d.ts.map +1 -0
  49. package/dist/src/store/embedding_utils.js +173 -0
  50. package/dist/src/store/embedding_utils.js.map +1 -0
  51. package/dist/src/store/graph_memory_store.d.ts +115 -0
  52. package/dist/src/store/graph_memory_store.d.ts.map +1 -0
  53. package/dist/src/store/graph_memory_store.js +1061 -0
  54. package/dist/src/store/graph_memory_store.js.map +1 -0
  55. package/dist/src/store/read_store.d.ts +95 -0
  56. package/dist/src/store/read_store.d.ts.map +1 -1
  57. package/dist/src/store/read_store.js +2108 -268
  58. package/dist/src/store/read_store.js.map +1 -1
  59. package/dist/src/store/vector_store.d.ts +15 -0
  60. package/dist/src/store/vector_store.d.ts.map +1 -1
  61. package/dist/src/store/vector_store.js +75 -1
  62. package/dist/src/store/vector_store.js.map +1 -1
  63. package/dist/src/store/write_store.d.ts +46 -0
  64. package/dist/src/store/write_store.d.ts.map +1 -1
  65. package/dist/src/store/write_store.js +399 -50
  66. package/dist/src/store/write_store.js.map +1 -1
  67. package/dist/src/sync/session_sync.d.ts +115 -2
  68. package/dist/src/sync/session_sync.d.ts.map +1 -1
  69. package/dist/src/sync/session_sync.js +2497 -44
  70. package/dist/src/sync/session_sync.js.map +1 -1
  71. package/dist/src/utils/runtime_env.d.ts +4 -0
  72. package/dist/src/utils/runtime_env.d.ts.map +1 -0
  73. package/dist/src/utils/runtime_env.js +51 -0
  74. package/dist/src/utils/runtime_env.js.map +1 -0
  75. package/dist/src/wiki/wiki_linter.d.ts +26 -0
  76. package/dist/src/wiki/wiki_linter.d.ts.map +1 -0
  77. package/dist/src/wiki/wiki_linter.js +339 -0
  78. package/dist/src/wiki/wiki_linter.js.map +1 -0
  79. package/dist/src/wiki/wiki_logger.d.ts +10 -0
  80. package/dist/src/wiki/wiki_logger.d.ts.map +1 -0
  81. package/dist/src/wiki/wiki_logger.js +78 -0
  82. package/dist/src/wiki/wiki_logger.js.map +1 -0
  83. package/dist/src/wiki/wiki_maintainer.d.ts +39 -0
  84. package/dist/src/wiki/wiki_maintainer.d.ts.map +1 -0
  85. package/dist/src/wiki/wiki_maintainer.js +38 -0
  86. package/dist/src/wiki/wiki_maintainer.js.map +1 -0
  87. package/dist/src/wiki/wiki_projector.d.ts +35 -0
  88. package/dist/src/wiki/wiki_projector.d.ts.map +1 -0
  89. package/dist/src/wiki/wiki_projector.js +1151 -0
  90. package/dist/src/wiki/wiki_projector.js.map +1 -0
  91. package/dist/src/wiki/wiki_queue.d.ts +29 -0
  92. package/dist/src/wiki/wiki_queue.d.ts.map +1 -0
  93. package/dist/src/wiki/wiki_queue.js +137 -0
  94. package/dist/src/wiki/wiki_queue.js.map +1 -0
  95. package/openclaw.plugin.json +377 -18
  96. package/package.json +52 -5
  97. package/schema/graph.schema.yaml +330 -0
  98. package/scripts/cli.js +80 -26
  99. package/scripts/repair-memory.js +321 -0
  100. package/scripts/uninstall.js +7 -1
  101. package/skills/cortex-memory/SKILL.md +83 -0
  102. package/skills/cortex-memory/references/agent-manual.md +127 -0
  103. package/skills/cortex-memory/references/configuration.md +109 -0
  104. package/skills/cortex-memory/references/publish-checklist.md +45 -0
  105. package/skills/cortex-memory/references/system-prompt-template.md +27 -0
  106. package/skills/cortex-memory/references/tools.md +191 -0
package/README.md CHANGED
@@ -1,299 +1,347 @@
1
- # OpenClaw Cortex Memory
2
-
3
- 面向 OpenClaw 的长期记忆插件,集成多路检索、事件归档、图谱关系、向量化与反衰减排序,支持历史增量导入、规则反思和可观测诊断,帮助 Agent 在跨会话中持续积累并稳定调用高价值记忆。
4
-
5
- 发布签名见 [SIGNATURE.md]
6
-
7
- ## 功能特性
8
-
9
- | 特性 | 说明 |
10
- |------|------|
11
- | 语义检索 | `search_memory` 支持 query + top_k |
12
- | 事件存储 | `store_event` 将摘要写入归档 |
13
- | 上下文注入 | `get_hot_context` / `get_auto_context` |
14
- | 增量同步 | `sync_memory` 按状态文件增量导入 |
15
- | 规则演进 | `reflect_memory` 更新 `CORTEX_RULES.md` |
16
- | 运行诊断 | `diagnostics` 检查本地存储状态 |
17
-
18
- ## 记忆库组成与特点
19
-
20
- ### 组成结构
21
-
22
- | 层级 | 核心文件/数据 | 作用 |
23
- |------|---------------|------|
24
- | 会话记忆层 | `sessions/active/sessions.jsonl` | 存储最近会话消息,支撑实时检索与上下文注入 |
25
- | 事件归档层 | `sessions/archive/sessions.jsonl` | 存储已沉淀事件(摘要、实体、结果),用于长期回顾 |
26
- | 实体关系层 | 基于归档事件中的 `entities` / `relations` 字段动态构图 | 支撑 `query_graph` 的实体共现与关系查询(派生图谱,不单独落盘) |
27
- | 向量检索层 | `vector/lancedb`(可用时)或 `vector/lancedb_events.jsonl`(回退) | 存储事件向量,用于语义检索与向量去重 |
28
- | 规则知识层 | `CORTEX_RULES.md` | 存储由反思生成的可复用规则,供后续任务复用 |
29
- | 运行状态层 | `.sync_state.json` / `.session_end_state.json` / `.rule_store_state.json` / `.dedup_index.json` / `graph/mutation_log.jsonl` | 记录增量同步、session_end 幂等、规则去重、三阶段去重索引、图谱变更审计日志 |
30
- | 说明与入口层 | `MEMORY.md` | 记忆库说明与使用约定入口 |
31
-
32
- ### 核心特点
33
-
34
- - 分层记忆:把“原始会话、结构化事件、抽象规则”拆分存储,便于分别检索与治理
35
- - 图谱派生:实体关系来自事件层的 `entities` / `relations`,查询时动态生成图结构
36
- - 图谱治理:写入前按 `schema/graph.schema.yaml` 做 event/relation 规范化与关系规则校验
37
- - 会话结束写入:message hook 默认仅缓存,会在 `session_end` 后批量抽取并落盘
38
- - 增量导入:通过状态文件只处理新增会话内容,避免全量重复扫描
39
- - 幂等去重:对 session_end 事件和规则写入做签名判重,减少重复沉淀
40
- - 三阶段去重:SimHash 预过滤 → MinHash 精比对 → 向量余弦相似度
41
- - 自动演进:可结合 `autoSync`、`autoReflect` 持续把会话经验转化为长期可复用记忆
42
- - 可观测可诊断:通过 `diagnostics` 与状态文件快速定位数据目录、同步与反思异常
43
-
44
- ## 安装
45
-
46
- ### 前置要求
47
-
48
- - Node.js 22+
49
- - OpenAI API Key(或其他兼容 API)
50
-
51
- ### 安装步骤
52
-
53
- 快速安装(推荐,显式来源):
54
-
55
- ```bash
56
- cd ~/openclaw
57
- pnpm openclaw plugins install clawhub:openclaw-cortex-memory
58
- pnpm openclaw plugins enable openclaw-cortex-memory
59
- ```
60
-
61
- npm 安装方式:
62
-
63
- ```bash
64
- cd ~/openclaw
65
- pnpm openclaw plugins install openclaw-cortex-memory@alpha
66
- pnpm openclaw plugins enable openclaw-cortex-memory
67
- ```
68
-
69
- 第三种安装方式(当 ClawHub/npm 解析受网络影响时):
70
-
71
- ```bash
72
- curl -L -o /tmp/cortex.tgz https://registry.npmjs.org/openclaw-cortex-memory/-/openclaw-cortex-memory-0.1.0-Alpha.8.tgz
73
- cd ~/openclaw
74
- pnpm openclaw plugins install /tmp/cortex.tgz
75
- pnpm openclaw plugins enable openclaw-cortex-memory
76
- rm -f /tmp/cortex.tgz
77
- ```
78
-
79
- 后续更新:
80
-
81
- ```bash
82
- cd ~/openclaw
83
- pnpm openclaw plugins uninstall openclaw-cortex-memory
84
- pnpm openclaw plugins install clawhub:openclaw-cortex-memory
85
- pnpm openclaw plugins enable openclaw-cortex-memory
86
- ```
87
-
88
- 说明:
89
- - 推荐显式安装来源,减少 ClawHub-first 时代的来源歧义。
90
- - 使用 `plugins install` 的安装记录方式,避免 `loaded without install/load-path provenance`。
91
- - 保持 `plugins.allow` 显式包含 `openclaw-cortex-memory`,避免运行时把插件判定为未绑定信任源。
92
- - `plugins install openclaw-cortex-memory` 在 ClawHub 解析阶段失败,可使用上述 tgz 方式直接安装。
93
-
94
-
95
- ### 本地开发模式(无安装记录)
96
-
97
- ```bash
98
- cd ~/.openclaw/extensions
99
- git clone https://github.com/deki18/openclaw-cortex-memory.git
100
- cd openclaw-cortex-memory
101
- npm install
102
- ```
103
-
104
- `npm install` 不会自动构建 `dist/`,源码模式请显式执行 `npm run build`,且这种方式默认不写 OpenClaw 安装记录。
105
-
106
- ## 配置
107
-
108
- `openclaw.json` 中添加:
109
-
110
- ```json
111
- {
112
- "plugins": {
113
- "allow": ["openclaw-cortex-memory"],
114
- "slots": { "memory": "openclaw-cortex-memory" },
115
- "entries": {
116
- "openclaw-cortex-memory": {
117
- "enabled": true,
118
- "config": {
119
- "engineMode": "ts",
120
- "dbPath": "<optional-memory-dir>",
121
- "autoSync": true,
122
- "autoReflect": false,
123
- "autoReflectIntervalMinutes": 30,
124
- "readFusion": {
125
- "enabled": true,
126
- "maxCandidates": 10,
127
- "authoritative": true
128
- },
129
- "memoryDecay": {
130
- "enabled": true,
131
- "minFloor": 0.15,
132
- "defaultHalfLifeDays": 90,
133
- "halfLifeByEventType": {
134
- "issue": 30,
135
- "fix": 30,
136
- "action_item": 30,
137
- "decision": 120,
138
- "preference": 240,
139
- "constraint": 240,
140
- "requirement": 240
141
- },
142
- "antiDecay": {
143
- "enabled": true,
144
- "maxBoost": 1.6,
145
- "hitWeight": 0.08,
146
- "recentWindowDays": 30
147
- }
148
- },
149
- "embedding": {
150
- "provider": "api",
151
- "model": "text-embedding-3-large",
152
- "apiKey": "${EMBEDDING_API_KEY}",
153
- "baseURL": "https://your-embedding-endpoint/v1",
154
- "dimensions": 3072
155
- },
156
- "llm": {
157
- "provider": "api",
158
- "model": "gpt-4",
159
- "apiKey": "${LLM_API_KEY}",
160
- "baseURL": "https://your-llm-endpoint/v1"
161
- },
162
- "reranker": {
163
- "provider": "api",
164
- "model": "BAAI/bge-reranker-v2-m3",
165
- "apiKey": "${RERANKER_API_KEY}",
166
- "baseURL": "https://your-reranker-endpoint/v1/rerank"
167
- }
168
- }
169
- }
170
- }
171
- }
172
- }
173
- ```
174
-
175
- ### 关键功能开关(建议显式配置)
176
-
177
- - `readFusion.enabled`:开启多路召回后 LLM 融合
178
- - `readFusion.authoritative`:开启后仅返回融合后的权威记忆包
179
- - `memoryDecay.enabled`:开启按 `event_type` 半衰期衰减
180
- - `memoryDecay.antiDecay.enabled`:开启命中频次反衰减,避免高价值老记忆被过度衰减
181
- - `autoReflect`:建议在验证稳定后再开启;默认 `false`
182
-
183
- ### 配置项说明
184
-
185
- | 配置项 | 必填 | 说明 |
186
- |--------|------|------|
187
- | `embedding.provider` | 是 | 建议使用 `api`(统一第三方接口模式) |
188
- | `embedding.model` | 是 | 嵌入模型名称 |
189
- | `embedding.dimensions` | 否 | 向量维度,需与模型匹配 |
190
- | `embedding.apiKey` | 是 | Embedding API Key(建议 `${EMBEDDING_API_KEY}`) |
191
- | `embedding.baseURL` | 是 | Embedding API 端点 |
192
- | `llm.provider` | 是 | 建议使用 `api` |
193
- | `llm.model` | 是 | LLM 模型名称 |
194
- | `llm.apiKey` | 是 | LLM API Key(建议 `${LLM_API_KEY}`) |
195
- | `llm.baseURL` | 是 | LLM API 端点 |
196
- | `reranker.provider` | 否 | 建议使用 `api` |
197
- | `reranker.model` | 是 | Reranker 模型名称 |
198
- | `reranker.apiKey` | 是 | Reranker API Key(建议 `${RERANKER_API_KEY}`) |
199
- | `reranker.baseURL` | 是 | Reranker API 端点 |
200
- | `engineMode` | 否 | 固定 `ts` |
201
- | `dbPath` | 否 | 数据目录,默认 `<plugin-dir>/data/memory` |
202
- | `autoSync` | 否 | 会话结束时自动同步历史记录,默认 `true` |
203
- | `autoReflect` | 否 | 自动触发记忆反思,默认 `false` |
204
- | `autoReflectIntervalMinutes` | 否 | 自动反思扫描间隔(分钟),默认 `30`,最小 `5` |
205
- | `readFusion.enabled` | 否 | 启用重排后 LLM 融合,默认 `true` |
206
- | `readFusion.maxCandidates` | 否 | 融合候选上限,默认 `10` |
207
- | `readFusion.authoritative` | 否 | 仅返回融合权威记忆包,默认 `true` |
208
- | `memoryDecay.enabled` | 否 | 启用按 `event_type` 的半衰期衰减,默认 `true` |
209
- | `memoryDecay.minFloor` | 否 | 衰减系数下限(0~1),默认 `0.15` |
210
- | `memoryDecay.defaultHalfLifeDays` | 否 | 未配置类型的默认半衰期(天),默认 `90` |
211
- | `memoryDecay.halfLifeByEventType` | 否 | 各 `event_type` 半衰期覆盖配置(天) |
212
- | `memoryDecay.antiDecay.enabled` | 否 | 启用命中频次反衰减,默认 `true` |
213
- | `memoryDecay.antiDecay.maxBoost` | 否 | 反衰减最大增益(>=1),默认 `1.6` |
214
- | `memoryDecay.antiDecay.hitWeight` | 否 | 命中次数增益系数,默认 `0.08` |
215
- | `memoryDecay.antiDecay.recentWindowDays` | 否 | 命中新鲜度窗口(天),默认 `30` |
216
-
217
- ### 启动
218
-
219
- ```bash
220
- pnpm openclaw config validate
221
- pnpm openclaw gateway restart
222
- ```
223
-
224
- ### 主 Agent 注入说明
225
-
226
- 首次接入后,建议把下面这段发给主 Agent,确保其按记忆工作流执行:
227
-
228
- ```text
229
- 你已接入 Cortex Memory。请遵循以下规则:
230
- 1) 当用户询问历史对话、偏好、项目上下文时,先调用 search_memory 再回答。
231
- 2) 需要当前会话热上下文时调用 get_hot_context。
232
- 3) 需要自动召回相关记忆时调用 get_auto_context。
233
- 4) 在一件重要事情结束并形成明确结果后,再调用 store_event 记录(不要在过程进行中频繁记录)。
234
- 5) 需要实体关联关系时调用 query_graph。
235
- 6) 当任务经历“失败→调整→最终成功”时,优先用 store_event 记录失败原因与成功方案,再调用 reflect_memory 沉淀可复用规则。
236
- 7) 需要导入历史会话时调用 sync_memory。
237
- 8) 出现配置校验失败、记忆读写异常、检索结果异常或数据目录问题时,优先调用 diagnostics。
238
- 9) 同一任务内不要反复调用 store_event 或 reflect_memory;仅在关键节点或任务收尾时触发一次。
239
- 10) 不要臆造历史事实;无法确认时必须先检索。
240
- ```
241
-
242
- ## 可用工具
243
-
244
- | 工具 | 说明 |
245
- |------|------|
246
- | `search_memory` | 语义搜索记忆库,支持 top_k 参数 |
247
- | `store_event` | 存储事件,可包含实体和关系 |
248
- | `query_graph` | 查询实体关系图谱,支持关系过滤、方向过滤与路径查询 |
249
- | `get_hot_context` | 获取热上下文(CORTEX_RULES.md + 近期会话) |
250
- | `get_auto_context` | 自动检索相关记忆 + 热上下文 |
251
- | `reflect_memory` | 触发记忆反思,将事件转化为规则 |
252
- | `sync_memory` | 同步 OpenClaw 历史会话(增量) |
253
- | `delete_memory` | 删除指定记忆 |
254
- | `diagnostics` | 系统诊断 |
255
-
256
- ## CLI 命令
257
-
258
- CLI 命令需在插件目录运行:
259
-
260
- ```bash
261
- npx cortex-memory status # 查看插件状态
262
- npx cortex-memory enable # 启用插件
263
- npx cortex-memory disable # 禁用插件(回退到内置记忆)
264
- npx cortex-memory uninstall # 卸载插件
265
- npx cortex-memory uninstall --keep-data # 卸载但保留数据
266
- npx cortex-memory help # 查看命令帮助
267
- ```
268
-
269
- ## 数据存储
270
-
271
- | 路径 | 说明 |
272
- |------|------|
273
- | `<dbPath>/MEMORY.md` | 记忆说明 |
274
- | `<dbPath>/CORTEX_RULES.md` | 规则文件 |
275
- | `<dbPath>/sessions/active/sessions.jsonl` | 活跃会话 |
276
- | `<dbPath>/sessions/archive/sessions.jsonl` | 归档事件 |
277
- | `<dbPath>/vector/lancedb` | LanceDB 向量表(可用时) |
278
- | `<dbPath>/vector/lancedb_events.jsonl` | 向量回退存储(LanceDB不可用时) |
279
- | `<dbPath>/.sync_state.json` | 同步增量状态 |
280
- | `<dbPath>/.session_end_state.json` | session_end 幂等状态 |
281
- | `<dbPath>/.rule_store_state.json` | 规则去重状态 |
282
- | `<dbPath>/.dedup_index.json` | 三阶段去重索引 |
283
- | `<dbPath>/.read_hit_stats.json` | 检索命中频次统计(用于反衰减增益) |
284
- | `<dbPath>/graph/mutation_log.jsonl` | 图谱写入审计日志(canonical_id/source_event_id/actor/timestamp) |
285
-
286
- ## 注意事项
287
-
288
- 1. **API Key 安全**:使用 `${EMBEDDING_API_KEY}`、`${LLM_API_KEY}`、`${RERANKER_API_KEY}` 等环境变量而非硬编码
289
- 2. **向量维度**:必须与嵌入模型匹配,如 `text-embedding-3-large` 为 3072
290
- 3. **重排序**:可选配置 `reranker` 以提升检索精度
291
- 4. **外部传输**:检索与反思会调用你配置的 embedding/llm/reranker endpoint,请使用可信服务并最小化密钥权限
292
- 5. **会话数据**:启用 `autoSync` 时会读取 OpenClaw 会话文件并写入本地记忆目录,生产环境建议先小范围验证
293
- 6. **单栈运行**:当前版本为纯 TS,无 Python 运行时依赖
294
- 7. **历史导入来源**:`sync_memory` 会同时导入 `<openclaw_base>/agents/main/sessions/*.jsonl` 与 `<openclaw_base>/workspace/memory/*.md`
295
- 8. **重复导入防护**:每日总结 `.md` 会按文件内容哈希标记在 `.sync_state.json`,未变化文件不会重复导入
296
-
297
- ## 许可证
298
-
299
- MIT License
1
+ # OpenClaw Cortex Memory
2
+
3
+ OpenClaw 长期记忆插件 - 专为 OpenClaw AI 助手设计的智能记忆系统
4
+
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
6
+ [![Node.js: 22+](https://img.shields.io/badge/Node.js-22+-green.svg)](https://nodejs.org/)
7
+ [![OpenClaw: Plugin](https://img.shields.io/badge/OpenClaw-Plugin-orange.svg)](https://github.com/openclaw)
8
+
9
+ 面向 OpenClaw 的长期记忆插件,集成多路检索、事件归档、图谱关系、向量化与反衰减排序,支持历史增量导入、规则反思和可观测诊断,可以将会话中零碎的记忆去噪整理、分层存储,支持对话中自动搜索回忆,吸收了LLM wiki的概念,帮助 Agent 在跨会话中持续积累并稳定调用高价值记忆。
10
+
11
+ ---
12
+
13
+ ## 核心能力
14
+
15
+ ### 1) 语义检索
16
+ - 多路召回:`keyword / BM25 / vector / graph` 混合检索
17
+ - 排序融合:加权打分 + RRF + 可选 reranker
18
+ - 结果融合:可选 `readFusion`,支持权威融合返回
19
+ - 调试输出:`search_memory` 返回 `timing_ms` 与 `debug`,可定位检索链路耗时、召回策略与 fusion 模式
20
+ - 检索控制:`fusion_mode` 可按次关闭/强制 fusion,`track_hits: false` 可用于诊断或评测,避免污染 anti-decay 命中统计
21
+ - 通道明细:`search_memory` 保留兼容字段 `semantic_results` / `keyword_results`,同时返回 `channel_results` 区分 `archive/graph/rules/vector/keyword` 等全局通道
22
+ - 图谱边界:`search_memory` 不把 Wiki markdown 当作候选记忆;图谱命中可返回 `wiki_ref` / `wiki_refs` / `evidence_ids` 作为展示和追溯链接,事实来源仍以 `graph/memory.jsonl` 为准
23
+ - 时序建模:`memoryDecay` + 命中反衰减(anti-decay)
24
+
25
+ ### 2) 事件存储
26
+ - 分层写入:`active`(会话)与 `archive`(结构化事件)
27
+ - 摘要优先:归档记录保留 `summary` `source_text`
28
+ - 向量分块:支持 summary/evidence 双通道向量记录
29
+ - 增量同步:按状态文件增量导入历史会话
30
+
31
+ ### 3) 图谱关系
32
+ - 图谱独立层:`graph/memory.jsonl` 独立于 archive 文本层
33
+ - 关系追溯:每条关系可追溯 `source_event_id`
34
+ - 关系查询:`query_graph` 支持方向、关系类型、路径搜索
35
+ - 冲突治理:单值事实冲突进入队列,支持人工 `accept/reject` 闭环
36
+ - 可视化导出:`export_graph_view` 输出状态化图谱快照(含来源证据)
37
+ - 质量门禁:全局 `graphQualityMode` 支持 `off/warn/strict`;历史导入可用 `syncPolicy.graphQualityMode` 单独收紧
38
+
39
+ ### 4) 规则演进
40
+ - 反思沉淀:`reflect_memory` 将事件抽象为规则
41
+ - 去重治理:规则与事件均有去重控制,避免污染
42
+ - 规则复用:规则写入 `CORTEX_RULES.md` 供后续任务复用
43
+
44
+ ### 5) 运维诊断
45
+ - `cortex_diagnostics`:模型连通、层级状态、字段对齐检查
46
+ - `backfill_embeddings`:支持 `incremental / vector_only / full`
47
+ - `lint_memory_wiki`:Wiki/图谱一致性、证据完整性与知识页质量巡检
48
+ - 完整状态文件:便于快速定位同步、回填、质量问题
49
+
50
+ ---
51
+
52
+ ## 已注册工具(与当前代码一致)
53
+
54
+ - `search_memory`
55
+ - `store_event`
56
+ - `query_graph`
57
+ - `export_graph_view`
58
+ - `lint_memory_wiki`
59
+ - `list_graph_conflicts`
60
+ - `resolve_graph_conflict`
61
+ - `get_hot_context`
62
+ - `get_auto_context`
63
+ - `reflect_memory`
64
+ - `sync_memory`
65
+ - `backfill_embeddings`
66
+ - `delete_memory`
67
+ - `cortex_diagnostics`(推荐)
68
+
69
+ ### 工具参数速览
70
+
71
+ | 工具 | 关键参数 |
72
+ |------|------|
73
+ | `search_memory` | `query`, `top_k`, `fusion_mode`, `track_hits` |
74
+ | `store_event` | `summary`, `entities`, `entity_types`, `outcome`, `relations` |
75
+ | `query_graph` | `entity`, `rel`, `dir`, `path_to`, `max_depth` |
76
+ | `export_graph_view` | `write_snapshot` |
77
+ | `lint_memory_wiki` | 无 |
78
+ | `list_graph_conflicts` | `status`, `limit` |
79
+ | `resolve_graph_conflict` | `conflict_id`, `action`, `note` |
80
+ | `get_hot_context` | `limit` |
81
+ | `get_auto_context` | `include_hot` |
82
+ | `reflect_memory` | 无 |
83
+ | `sync_memory` | |
84
+ | `backfill_embeddings` | `layer`, `batch_size`, `max_retries`, `retry_failed_only`, `rebuild_mode` |
85
+ | `cortex_diagnostics` | |
86
+ | `delete_memory` | `memory_id` |
87
+
88
+ ---
89
+
90
+ ## Agent 使用手册(系统提示词)
91
+
92
+ > 可直接粘贴到 Agent 的系统提示词中使用
93
+
94
+ **Cortex Memory 记忆插件使用规则(核心规则,不允许删除)**
95
+
96
+ 你已接入 Cortex Memory。必须遵循以下规则:
97
+
98
+ 1. 禁止臆造历史事实;凡涉及历史对话、用户偏好、项目既有决策,先检索再回答。
99
+ 2. 单个任务内避免频繁写入:`store_event` / `reflect_memory` 应按里程碑触发(通常每个完整任务 0-2 次)。
100
+ 3. 用户询问历史信息、偏好、项目上下文时:先调用 `search_memory`,再回答,触发词如“上次、之前、你记得、上个月、去年、上个星期、昨天、前天、我记得、你查一下”等。
101
+ 4. 需要当前会话热上下文时:调用 `get_hot_context`。
102
+ 5. 需要自动召回相关记忆时:调用 `get_auto_context`。
103
+ 6. 需要实体关系、依赖链路或路径关系时:调用 `query_graph`。
104
+ 7. 仅在“重要事项已结束且结论明确”后调用 `store_event` 记录结果;结论未定时先不写入。
105
+ 8. 当任务经历“失败 -> 调整 -> 成功”时:先用 `store_event` 记录失败原因与成功方案,再调用 `reflect_memory` 沉淀可复用规则。
106
+ 9. 需要导入历史会话时:调用 `sync_memory`。
107
+ 10. 当 `cortex_diagnostics` 显示 active/archive 有未向量化记录,或迁移后需重建向量层时:调用 `backfill_embeddings`(按需选择 `incremental` / `vector_only` / `full`)。
108
+ 11. 出现配置校验失败、记忆读写异常、检索结果异常或数据目录问题时:优先调用 `cortex_diagnostics`。
109
+ 12. 仅在用户明确要求删除记忆,且已确认 `memory_id` 时,才调用 `delete_memory`;禁止在未确认情况下自动删除。
110
+ 13. 工具调用失败时:读操作可重试一次;写操作(如 `store_event` / `reflect_memory` / `delete_memory` / `resolve_graph_conflict`)重试前先确认是否已成功落库,避免重复写入。
111
+ 14. 调用任意 Cortex Memory 工具前,先确认当前运行环境可见该工具;若工具不可见,必须立即报告“当前 lane 不可用”,不得虚构执行结果。
112
+ 15. `sync_memory` 与 `backfill_embeddings` 属于关键路径任务:执行前后应避免并发重复触发;若已有同任务进行中,复用当前结果或等待完成。
113
+ 16. 当用户明确请求 Cortex Memory 任务(如 `sync_memory` / `search_memory` / `store_event`)时,禁止切换到无关流程(如心跳巡检、日报、闲聊任务);若被系统任务打断,先完成用户请求再处理后台任务。
114
+ 17. `query_graph` 返回 `conflict_hint` 时,不得静默覆盖冲突事实;应先调用 `list_graph_conflicts`,并与用户确认后再 `resolve_graph_conflict`。
115
+ 18. 需要解释图谱状态分布或排查投影异常时,优先调用 `export_graph_view` 与 `lint_memory_wiki`。
116
+ 19. 记忆检索结果与模型推断必须分开表述:可明确标注“来自记忆检索/图谱”与“基于当前信息的推断”。
117
+ 20. 涉及隐私或用户明确要求“不要记忆”的内容,禁止调用 `store_event` / `reflect_memory` 写入长期记忆。
118
+
119
+ ---
120
+
121
+ ## 快速开始
122
+
123
+ ### 安装
124
+
125
+ ```bash
126
+ cd ~/openclaw
127
+ openclaw plugins install clawhub:openclaw-cortex-memory
128
+ openclaw plugins enable openclaw-cortex-memory
129
+ ```
130
+
131
+ 如果 `clawhub:` 安装出现 `fetch failed`,可改用 npm 包本地安装(推荐兜底):
132
+
133
+ ```bash
134
+ npm pack openclaw-cortex-memory@0.1.0
135
+ openclaw plugins install ./openclaw-cortex-memory-0.1.0.tgz
136
+ openclaw plugins enable openclaw-cortex-memory
137
+ rm ./openclaw-cortex-memory-0.1.0.tgz
138
+ ```
139
+
140
+ 完成安装后,请先按下方"最小配置"示例配置 `openclaw.json`,确认配置无误后再启动 gateway。
141
+
142
+ ### 更新
143
+
144
+ ```bash
145
+ rm -r ~/.openclaw/extensions/openclaw-cortex-memory
146
+ npm pack openclaw-cortex-memory@0.1.0
147
+ openclaw plugins install ./openclaw-cortex-memory-0.1.0.tgz
148
+ openclaw plugins enable openclaw-cortex-memory
149
+ rm ./openclaw-cortex-memory-0.1.0.tgz
150
+ openclaw plugins list --enabled
151
+ openclaw gateway restart
152
+ ```
153
+
154
+ ### 卸载
155
+
156
+ ```bash
157
+ cd ~/openclaw
158
+ openclaw plugins disable openclaw-cortex-memory
159
+ openclaw plugins uninstall openclaw-cortex-memory
160
+ ```
161
+
162
+ 如需卸载插件但保留记忆数据:
163
+
164
+ ```bash
165
+ cd ~/openclaw
166
+ openclaw plugins disable openclaw-cortex-memory
167
+ openclaw plugins uninstall openclaw-cortex-memory --keep-data
168
+ ```
169
+
170
+ ### 最小配置(推荐先跑起来)
171
+
172
+ ```json
173
+ {
174
+ "plugins": {
175
+ "allow": ["openclaw-cortex-memory"],
176
+ "slots": { "memory": "none" },
177
+ "entries": {
178
+ "memory-core": {
179
+ "enabled": false
180
+ },
181
+ "memory-lancedb": {
182
+ "enabled": false
183
+ },
184
+ "openclaw-cortex-memory": {
185
+ "enabled": true,
186
+ "config": {
187
+ "autoSync": true,
188
+ "autoReflect": false,
189
+ "graphQualityMode": "warn",
190
+ "readFusion": {
191
+ "enabled": true,
192
+ "authoritative": true
193
+ },
194
+ "memoryDecay": {
195
+ "enabled": true,
196
+ "antiDecay": {
197
+ "enabled": true
198
+ }
199
+ },
200
+ "embedding": {
201
+ "provider": "api",
202
+ "model": "text-embedding-3-small",
203
+ "apiKey": "${EMBEDDING_API_KEY}",
204
+ "baseURL": "https://your-embedding-endpoint/v1",
205
+ "dimensions": 1536
206
+ },
207
+ "llm": {
208
+ "provider": "api",
209
+ "model": "gpt-4",
210
+ "apiKey": "${LLM_API_KEY}",
211
+ "baseURL": "https://your-llm-endpoint/v1"
212
+ },
213
+ "reranker": {
214
+ "provider": "api",
215
+ "model": "BAAI/bge-reranker-v2-m3",
216
+ "apiKey": "${RERANKER_API_KEY}",
217
+ "baseURL": "https://your-reranker-endpoint/v1/rerank"
218
+ }
219
+ }
220
+ }
221
+ }
222
+ }
223
+ }
224
+ ```
225
+
226
+ 独占模式注意事项:
227
+
228
+ - `plugins.slots.memory` 不要设置为 `openclaw-cortex-memory`
229
+ - 建议将 `memory-core` 与 `memory-lancedb` 显式禁用(如上示例),避免多记忆后端并存冲突
230
+
231
+ ## 外部端点与凭证声明(审查说明)
232
+
233
+ 本插件是本地长期记忆系统,但以下能力依赖用户自配置的外部模型端点:
234
+
235
+ - `embedding`:向量化(`/embeddings`)
236
+ - `llm`:写入门控、规则反思、读融合(`/chat/completions`)
237
+ - `reranker`:候选重排序(`/rerank`)
238
+
239
+ 对应凭证要求:
240
+
241
+ - 环境变量(可选):`EMBEDDING_API_KEY`、`LLM_API_KEY`、`RERANKER_API_KEY`
242
+ - 插件配置(常用):`embedding.apiKey`、`llm.apiKey`、`reranker.apiKey`
243
+ - 端点配置:`embedding.baseURL`、`llm.baseURL`、`reranker.baseURL`
244
+
245
+ ### 网络发送的数据边界
246
+
247
+ - 会发送:用于模型推理的文本片段(如 query、候选摘要、转写片段、待向量化文本)
248
+ - 不会主动发送:本地配置文件原文、系统环境变量全集、插件状态文件全集
249
+ - 凭证使用方式:仅作为 `Authorization: Bearer` 请求头调用你配置的端点
250
+
251
+ ### 风险与建议
252
+
253
+ - 你应只配置可信模型网关,密钥权限最小化(建议专用 key)
254
+ - 生产环境建议启用网关审计与请求日志脱敏
255
+ - 如不希望联网推理,不要配置外部端点/密钥(相关能力将降级或跳过)
256
+
257
+ <details>
258
+ <summary>高级配置(默认已内置,不懂可以不改)</summary>
259
+
260
+ - `readFusion`:融合候选数、通道权重、通道 TopK、最小 lexical/semantic 命中、长度归一
261
+ - `memoryDecay`:最小衰减地板、默认半衰期、事件类型半衰期、anti-decay 参数
262
+ - `vectorChunking`:分块大小、重叠、evidence 最大分块数
263
+ - `writePolicy`:archive/active 质量阈值与文本长度限制
264
+ - `syncPolicy`:历史导入来源与导入期图谱质量门禁
265
+ - `readTuning`:打分权重、RRF 参数、recency 分桶、auto-context 轻量检索
266
+
267
+ `search_memory` 支持按次覆盖读取行为:
268
+
269
+ ```json
270
+ {
271
+ "query": "上次我们怎么处理记忆搜索延迟?",
272
+ "top_k": 5,
273
+ "fusion_mode": "candidates",
274
+ "track_hits": false
275
+ }
276
+ ```
277
+
278
+ - `fusion_mode: "auto"`:默认值,遵循 `readFusion.authoritative`
279
+ - `fusion_mode: "authoritative"`:返回融合后的权威结果
280
+ - `fusion_mode: "candidates"`:返回融合结果 + 候选明细,适合调试
281
+ - `fusion_mode: "off"`:关闭 LLM fusion,适合低延迟或诊断
282
+ - `track_hits: false`:不更新 anti-decay 命中统计,适合评测/排查
283
+
284
+ `search_memory` JSONL fallback 向量层会缓存文档、向量 norm 与 source-memory 分组;当 query embedding 可用时,会先按 cosine 预选 topN,再进入 BM25/RRF 混合排序,避免大库下把所有 fallback vector chunk 放进后续排序。中文 n-gram 用于召回扩展,但 BM25 文档 token 保留重复项以维持 term frequency 区分度。
285
+
286
+ `get_auto_context` 使用最近会话消息构造自动查询,并默认走无外部模型调用的 auto 检索路径;显式 `search_memory` 仍使用完整检索链路。消息 hook 仍有短保护窗口,但同一 session 的 on-message 自动检索会做 in-flight 去重,避免超时后后台搜索堆积。
287
+
288
+ </details>
289
+
290
+ ---
291
+
292
+ ## 数据目录
293
+
294
+ 默认情况下(未配置 `dbPath`),数据目录为 OpenClaw workspace 下:
295
+
296
+ - Linux/macOS: `~/.openclaw/workspace/memory/openclaw-cortex-memory`
297
+ - Windows: `%USERPROFILE%\\.openclaw\\workspace\\memory\\openclaw-cortex-memory`
298
+
299
+ 如果当前进程无法识别 OpenClaw 基础目录(例如离线脚本直接运行且无相关环境变量),会回退到项目目录:
300
+
301
+ - `<projectRoot>/data/memory`
302
+
303
+ 如果在插件配置里设置了 `dbPath`,则以下文件都会写到你指定的 `dbPath` 下:
304
+
305
+ - `<memoryRoot>/CORTEX_RULES.md`
306
+ - `<memoryRoot>/sessions/active/sessions.jsonl`
307
+ - `<memoryRoot>/sessions/archive/sessions.jsonl`
308
+ - `<memoryRoot>/graph/memory.jsonl`
309
+ - `<memoryRoot>/graph/memory.md`
310
+ - `<memoryRoot>/graph/mutation_log.jsonl`
311
+ - `<memoryRoot>/graph/mutation_log.md`
312
+ - `<memoryRoot>/graph/conflict_queue.jsonl`
313
+ - `<memoryRoot>/graph/superseded_relations.jsonl`
314
+ - `<memoryRoot>/wiki/index.md`
315
+ - `<memoryRoot>/wiki/log.md`
316
+ - `<memoryRoot>/wiki/entities/*.md`
317
+ - `<memoryRoot>/wiki/topics/*.md`
318
+ - `<memoryRoot>/wiki/timelines/*.md`
319
+ - `<memoryRoot>/wiki/graph/view.json`
320
+ - `<memoryRoot>/wiki/graph/timeline.jsonl`
321
+ - `<memoryRoot>/wiki/graph/network.mmd`
322
+ - `<memoryRoot>/wiki/graph/network.md`
323
+ - `<memoryRoot>/wiki/.projection_index.json`
324
+ - `<memoryRoot>/wiki/.rebuild_queue.jsonl`
325
+ - `<memoryRoot>/vector/lancedb`
326
+ - `<memoryRoot>/vector/lancedb_events.jsonl`
327
+ - `<memoryRoot>/.sync_state.json`
328
+ - `<memoryRoot>/.session_end_state.json`
329
+ - `<memoryRoot>/.rule_store_state.json`
330
+ - `<memoryRoot>/.dedup_index.json`
331
+ - `<memoryRoot>/.read_hit_stats.json`
332
+
333
+ Wiki 是图谱关系的物化投影,不是独立记忆库。Wiki 投影会为实体页生成 `Current Conclusion`、`Recent Changes`、`High Confidence Facts`、`Evidence Excerpts` 等知识页结构;为主题页生成状态分组;为时间线页生成 `Event Flow`,并在 archive 事件存在时带上 `cause/process/result`。`lint_memory_wiki` 会检查这些结构是否缺失、是否仍停留在旧式泛化 Summary、以及图谱证据是否不足。
334
+
335
+ ---
336
+
337
+ ## 常用命令
338
+
339
+ ```bash
340
+ npm run typecheck
341
+ npm run test:graph-quality
342
+ npm run test:graph-quality-zh
343
+ ```
344
+
345
+ ---
346
+
347
+ MIT License