openclaw-cortex-memory 0.1.0-Alpha.4 → 0.1.0-Alpha.6
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.
- package/README.md +84 -3
- package/SKILL.md +58 -3
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +118 -2
- package/dist/index.js.map +1 -1
- package/dist/openclaw.plugin.json +102 -2
- package/dist/src/dedup/three_stage_deduplicator.d.ts +25 -0
- package/dist/src/dedup/three_stage_deduplicator.d.ts.map +1 -0
- package/dist/src/dedup/three_stage_deduplicator.js +225 -0
- package/dist/src/dedup/three_stage_deduplicator.js.map +1 -0
- package/dist/src/engine/ts_engine.d.ts +36 -0
- package/dist/src/engine/ts_engine.d.ts.map +1 -1
- package/dist/src/engine/ts_engine.js +197 -32
- package/dist/src/engine/ts_engine.js.map +1 -1
- package/dist/src/engine/types.d.ts +4 -0
- package/dist/src/engine/types.d.ts.map +1 -1
- package/dist/src/graph/ontology.d.ts +53 -0
- package/dist/src/graph/ontology.d.ts.map +1 -0
- package/dist/src/graph/ontology.js +252 -0
- package/dist/src/graph/ontology.js.map +1 -0
- package/dist/src/session/session_end.d.ts +55 -0
- package/dist/src/session/session_end.d.ts.map +1 -1
- package/dist/src/session/session_end.js +237 -51
- package/dist/src/session/session_end.js.map +1 -1
- package/dist/src/store/archive_store.d.ts +89 -0
- package/dist/src/store/archive_store.d.ts.map +1 -0
- package/dist/src/store/archive_store.js +242 -0
- package/dist/src/store/archive_store.js.map +1 -0
- package/dist/src/store/read_store.d.ts +24 -0
- package/dist/src/store/read_store.d.ts.map +1 -1
- package/dist/src/store/read_store.js +636 -27
- package/dist/src/store/read_store.js.map +1 -1
- package/dist/src/store/vector_store.d.ts +30 -0
- package/dist/src/store/vector_store.d.ts.map +1 -0
- package/dist/src/store/vector_store.js +128 -0
- package/dist/src/store/vector_store.js.map +1 -0
- package/dist/src/sync/session_sync.d.ts +7 -0
- package/dist/src/sync/session_sync.d.ts.map +1 -1
- package/dist/src/sync/session_sync.js +109 -7
- package/dist/src/sync/session_sync.js.map +1 -1
- package/openclaw.plugin.json +102 -2
- package/package.json +7 -3
package/README.md
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
OpenClaw 长期记忆插件,提供跨会话检索、事件存储、规则反思、增量同步与运行诊断能力。
|
|
4
4
|
可作为 OpenClaw 的 memory slot 直接接入,支持从历史会话持续沉淀可复用记忆。
|
|
5
5
|
|
|
6
|
+
发布签名见 [SIGNATURE.md]
|
|
7
|
+
|
|
6
8
|
## 功能特性
|
|
7
9
|
|
|
8
10
|
| 特性 | 说明 |
|
|
@@ -14,6 +16,32 @@ OpenClaw 长期记忆插件,提供跨会话检索、事件存储、规则反
|
|
|
14
16
|
| 规则演进 | `reflect_memory` 更新 `CORTEX_RULES.md` |
|
|
15
17
|
| 运行诊断 | `diagnostics` 检查本地存储状态 |
|
|
16
18
|
|
|
19
|
+
## 记忆库组成与特点
|
|
20
|
+
|
|
21
|
+
### 组成结构
|
|
22
|
+
|
|
23
|
+
| 层级 | 核心文件/数据 | 作用 |
|
|
24
|
+
|------|---------------|------|
|
|
25
|
+
| 会话记忆层 | `sessions/active/sessions.jsonl` | 存储最近会话消息,支撑实时检索与上下文注入 |
|
|
26
|
+
| 事件归档层 | `sessions/archive/sessions.jsonl` | 存储已沉淀事件(摘要、实体、结果),用于长期回顾 |
|
|
27
|
+
| 实体关系层 | 基于归档事件中的 `entities` / `relations` 字段动态构图 | 支撑 `query_graph` 的实体共现与关系查询(派生图谱,不单独落盘) |
|
|
28
|
+
| 向量检索层 | `vector/lancedb`(可用时)或 `vector/lancedb_events.jsonl`(回退) | 存储事件向量,用于语义检索与向量去重 |
|
|
29
|
+
| 规则知识层 | `CORTEX_RULES.md` | 存储由反思生成的可复用规则,供后续任务复用 |
|
|
30
|
+
| 运行状态层 | `.sync_state.json` / `.session_end_state.json` / `.rule_store_state.json` / `.dedup_index.json` / `graph/mutation_log.jsonl` | 记录增量同步、session_end 幂等、规则去重、三阶段去重索引、图谱变更审计日志 |
|
|
31
|
+
| 说明与入口层 | `MEMORY.md` | 记忆库说明与使用约定入口 |
|
|
32
|
+
|
|
33
|
+
### 核心特点
|
|
34
|
+
|
|
35
|
+
- 分层记忆:把“原始会话、结构化事件、抽象规则”拆分存储,便于分别检索与治理
|
|
36
|
+
- 图谱派生:实体关系来自事件层的 `entities` / `relations`,查询时动态生成图结构
|
|
37
|
+
- 图谱治理:写入前按 `schema/graph.schema.yaml` 做 event/relation 规范化与关系规则校验
|
|
38
|
+
- 会话结束写入:message hook 默认仅缓存,会在 `session_end` 后批量抽取并落盘
|
|
39
|
+
- 增量导入:通过状态文件只处理新增会话内容,避免全量重复扫描
|
|
40
|
+
- 幂等去重:对 session_end 事件和规则写入做签名判重,减少重复沉淀
|
|
41
|
+
- 三阶段去重:SimHash 预过滤 → MinHash 精比对 → 向量余弦相似度
|
|
42
|
+
- 自动演进:可结合 `autoSync`、`autoReflect` 持续把会话经验转化为长期可复用记忆
|
|
43
|
+
- 可观测可诊断:通过 `diagnostics` 与状态文件快速定位数据目录、同步与反思异常
|
|
44
|
+
|
|
17
45
|
## 安装
|
|
18
46
|
|
|
19
47
|
### 前置要求
|
|
@@ -63,7 +91,7 @@ cd openclaw-cortex-memory
|
|
|
63
91
|
npm install
|
|
64
92
|
```
|
|
65
93
|
|
|
66
|
-
`npm install`
|
|
94
|
+
`npm install` 不会自动构建 `dist/`,源码模式请显式执行 `npm run build`,且这种方式默认不写 OpenClaw 安装记录。
|
|
67
95
|
|
|
68
96
|
## 配置
|
|
69
97
|
|
|
@@ -81,7 +109,33 @@ npm install
|
|
|
81
109
|
"engineMode": "ts",
|
|
82
110
|
"dbPath": "<optional-memory-dir>",
|
|
83
111
|
"autoSync": true,
|
|
84
|
-
"autoReflect":
|
|
112
|
+
"autoReflect": false,
|
|
113
|
+
"autoReflectIntervalMinutes": 30,
|
|
114
|
+
"readFusion": {
|
|
115
|
+
"enabled": true,
|
|
116
|
+
"maxCandidates": 10,
|
|
117
|
+
"authoritative": true
|
|
118
|
+
},
|
|
119
|
+
"memoryDecay": {
|
|
120
|
+
"enabled": true,
|
|
121
|
+
"minFloor": 0.15,
|
|
122
|
+
"defaultHalfLifeDays": 90,
|
|
123
|
+
"halfLifeByEventType": {
|
|
124
|
+
"issue": 30,
|
|
125
|
+
"fix": 30,
|
|
126
|
+
"action_item": 30,
|
|
127
|
+
"decision": 120,
|
|
128
|
+
"preference": 240,
|
|
129
|
+
"constraint": 240,
|
|
130
|
+
"requirement": 240
|
|
131
|
+
},
|
|
132
|
+
"antiDecay": {
|
|
133
|
+
"enabled": true,
|
|
134
|
+
"maxBoost": 1.6,
|
|
135
|
+
"hitWeight": 0.08,
|
|
136
|
+
"recentWindowDays": 30
|
|
137
|
+
}
|
|
138
|
+
},
|
|
85
139
|
"embedding": {
|
|
86
140
|
"provider": "api",
|
|
87
141
|
"model": "text-embedding-3-large",
|
|
@@ -108,6 +162,14 @@ npm install
|
|
|
108
162
|
}
|
|
109
163
|
```
|
|
110
164
|
|
|
165
|
+
### 关键功能开关(建议显式配置)
|
|
166
|
+
|
|
167
|
+
- `readFusion.enabled`:开启多路召回后 LLM 融合
|
|
168
|
+
- `readFusion.authoritative`:开启后仅返回融合后的权威记忆包
|
|
169
|
+
- `memoryDecay.enabled`:开启按 `event_type` 半衰期衰减
|
|
170
|
+
- `memoryDecay.antiDecay.enabled`:开启命中频次反衰减,避免高价值老记忆被过度衰减
|
|
171
|
+
- `autoReflect`:建议在验证稳定后再开启;默认 `false`
|
|
172
|
+
|
|
111
173
|
### 配置项说明
|
|
112
174
|
|
|
113
175
|
| 配置项 | 必填 | 说明 |
|
|
@@ -129,6 +191,18 @@ npm install
|
|
|
129
191
|
| `dbPath` | 否 | 数据目录,默认 `<plugin-dir>/data/memory` |
|
|
130
192
|
| `autoSync` | 否 | 会话结束时自动同步历史记录,默认 `true` |
|
|
131
193
|
| `autoReflect` | 否 | 自动触发记忆反思,默认 `false` |
|
|
194
|
+
| `autoReflectIntervalMinutes` | 否 | 自动反思扫描间隔(分钟),默认 `30`,最小 `5` |
|
|
195
|
+
| `readFusion.enabled` | 否 | 启用重排后 LLM 融合,默认 `true` |
|
|
196
|
+
| `readFusion.maxCandidates` | 否 | 融合候选上限,默认 `10` |
|
|
197
|
+
| `readFusion.authoritative` | 否 | 仅返回融合权威记忆包,默认 `true` |
|
|
198
|
+
| `memoryDecay.enabled` | 否 | 启用按 `event_type` 的半衰期衰减,默认 `true` |
|
|
199
|
+
| `memoryDecay.minFloor` | 否 | 衰减系数下限(0~1),默认 `0.15` |
|
|
200
|
+
| `memoryDecay.defaultHalfLifeDays` | 否 | 未配置类型的默认半衰期(天),默认 `90` |
|
|
201
|
+
| `memoryDecay.halfLifeByEventType` | 否 | 各 `event_type` 半衰期覆盖配置(天) |
|
|
202
|
+
| `memoryDecay.antiDecay.enabled` | 否 | 启用命中频次反衰减,默认 `true` |
|
|
203
|
+
| `memoryDecay.antiDecay.maxBoost` | 否 | 反衰减最大增益(>=1),默认 `1.6` |
|
|
204
|
+
| `memoryDecay.antiDecay.hitWeight` | 否 | 命中次数增益系数,默认 `0.08` |
|
|
205
|
+
| `memoryDecay.antiDecay.recentWindowDays` | 否 | 命中新鲜度窗口(天),默认 `30` |
|
|
132
206
|
|
|
133
207
|
### 启动
|
|
134
208
|
|
|
@@ -161,7 +235,7 @@ pnpm openclaw gateway restart
|
|
|
161
235
|
|------|------|
|
|
162
236
|
| `search_memory` | 语义搜索记忆库,支持 top_k 参数 |
|
|
163
237
|
| `store_event` | 存储事件,可包含实体和关系 |
|
|
164
|
-
| `query_graph` |
|
|
238
|
+
| `query_graph` | 查询实体关系图谱,支持关系过滤、方向过滤与路径查询 |
|
|
165
239
|
| `get_hot_context` | 获取热上下文(CORTEX_RULES.md + 近期会话) |
|
|
166
240
|
| `get_auto_context` | 自动检索相关记忆 + 热上下文 |
|
|
167
241
|
| `reflect_memory` | 触发记忆反思,将事件转化为规则 |
|
|
@@ -190,9 +264,14 @@ npx cortex-memory help # 查看命令帮助
|
|
|
190
264
|
| `<dbPath>/CORTEX_RULES.md` | 规则文件 |
|
|
191
265
|
| `<dbPath>/sessions/active/sessions.jsonl` | 活跃会话 |
|
|
192
266
|
| `<dbPath>/sessions/archive/sessions.jsonl` | 归档事件 |
|
|
267
|
+
| `<dbPath>/vector/lancedb` | LanceDB 向量表(可用时) |
|
|
268
|
+
| `<dbPath>/vector/lancedb_events.jsonl` | 向量回退存储(LanceDB不可用时) |
|
|
193
269
|
| `<dbPath>/.sync_state.json` | 同步增量状态 |
|
|
194
270
|
| `<dbPath>/.session_end_state.json` | session_end 幂等状态 |
|
|
195
271
|
| `<dbPath>/.rule_store_state.json` | 规则去重状态 |
|
|
272
|
+
| `<dbPath>/.dedup_index.json` | 三阶段去重索引 |
|
|
273
|
+
| `<dbPath>/.read_hit_stats.json` | 检索命中频次统计(用于反衰减增益) |
|
|
274
|
+
| `<dbPath>/graph/mutation_log.jsonl` | 图谱写入审计日志(canonical_id/source_event_id/actor/timestamp) |
|
|
196
275
|
|
|
197
276
|
## 注意事项
|
|
198
277
|
|
|
@@ -202,6 +281,8 @@ npx cortex-memory help # 查看命令帮助
|
|
|
202
281
|
4. **外部传输**:检索与反思会调用你配置的 embedding/llm/reranker endpoint,请使用可信服务并最小化密钥权限
|
|
203
282
|
5. **会话数据**:启用 `autoSync` 时会读取 OpenClaw 会话文件并写入本地记忆目录,生产环境建议先小范围验证
|
|
204
283
|
6. **单栈运行**:当前版本为纯 TS,无 Python 运行时依赖
|
|
284
|
+
7. **历史导入来源**:`sync_memory` 会同时导入 `<openclaw_base>/agents/main/sessions/*.jsonl` 与 `<openclaw_base>/workspace/memory/*.md`
|
|
285
|
+
8. **重复导入防护**:每日总结 `.md` 会按文件内容哈希标记在 `.sync_state.json`,未变化文件不会重复导入
|
|
205
286
|
|
|
206
287
|
## 许可证
|
|
207
288
|
|
package/SKILL.md
CHANGED
|
@@ -76,7 +76,7 @@ git clone https://github.com/deki18/openclaw-cortex-memory.git ~/openclaw-cortex
|
|
|
76
76
|
cd ~/openclaw-cortex-memory-src
|
|
77
77
|
npm install && npm run build && npm pack
|
|
78
78
|
cd ~/openclaw
|
|
79
|
-
pnpm openclaw plugins install ~/openclaw-cortex-memory-src/openclaw-cortex-memory-0.1.0-Alpha.
|
|
79
|
+
pnpm openclaw plugins install ~/openclaw-cortex-memory-src/openclaw-cortex-memory-0.1.0-Alpha.6.tgz
|
|
80
80
|
pnpm openclaw gateway restart
|
|
81
81
|
```
|
|
82
82
|
|
|
@@ -105,7 +105,33 @@ npm install
|
|
|
105
105
|
"engineMode": "ts",
|
|
106
106
|
"dbPath": "<optional-memory-dir>",
|
|
107
107
|
"autoSync": true,
|
|
108
|
-
"autoReflect":
|
|
108
|
+
"autoReflect": false,
|
|
109
|
+
"autoReflectIntervalMinutes": 30,
|
|
110
|
+
"readFusion": {
|
|
111
|
+
"enabled": true,
|
|
112
|
+
"maxCandidates": 10,
|
|
113
|
+
"authoritative": true
|
|
114
|
+
},
|
|
115
|
+
"memoryDecay": {
|
|
116
|
+
"enabled": true,
|
|
117
|
+
"minFloor": 0.15,
|
|
118
|
+
"defaultHalfLifeDays": 90,
|
|
119
|
+
"halfLifeByEventType": {
|
|
120
|
+
"issue": 30,
|
|
121
|
+
"fix": 30,
|
|
122
|
+
"action_item": 30,
|
|
123
|
+
"decision": 120,
|
|
124
|
+
"preference": 240,
|
|
125
|
+
"constraint": 240,
|
|
126
|
+
"requirement": 240
|
|
127
|
+
},
|
|
128
|
+
"antiDecay": {
|
|
129
|
+
"enabled": true,
|
|
130
|
+
"maxBoost": 1.6,
|
|
131
|
+
"hitWeight": 0.08,
|
|
132
|
+
"recentWindowDays": 30
|
|
133
|
+
}
|
|
134
|
+
},
|
|
109
135
|
"embedding": {
|
|
110
136
|
"provider": "api",
|
|
111
137
|
"model": "text-embedding-3-large",
|
|
@@ -132,6 +158,14 @@ npm install
|
|
|
132
158
|
}
|
|
133
159
|
```
|
|
134
160
|
|
|
161
|
+
关键功能开关(建议显式配置):
|
|
162
|
+
|
|
163
|
+
- `readFusion.enabled`:开启多路召回后的 LLM 融合
|
|
164
|
+
- `readFusion.authoritative`:仅返回融合后的权威记忆包
|
|
165
|
+
- `memoryDecay.enabled`:开启按事件类型的半衰期衰减
|
|
166
|
+
- `memoryDecay.antiDecay.enabled`:开启命中频次反衰减
|
|
167
|
+
- `autoReflect`:建议验证稳定后再开启(默认 false)
|
|
168
|
+
|
|
135
169
|
### 启动
|
|
136
170
|
|
|
137
171
|
```bash
|
|
@@ -183,12 +217,16 @@ openclaw gateway restart
|
|
|
183
217
|
|
|
184
218
|
### query_graph
|
|
185
219
|
|
|
186
|
-
|
|
220
|
+
查询归档事件中的实体关系(relations 优先,共现关系回退)。
|
|
187
221
|
|
|
188
222
|
**参数:**
|
|
189
223
|
| 参数 | 类型 | 必需 | 说明 |
|
|
190
224
|
|------|------|------|------|
|
|
191
225
|
| entity | string | 是 | 实体名称 |
|
|
226
|
+
| rel | string | 否 | 关系类型过滤(如 `depends_on`) |
|
|
227
|
+
| dir | string | 否 | 方向过滤:`incoming` / `outgoing` / `both` |
|
|
228
|
+
| path_to | string | 否 | 查询从 `entity` 到目标实体的路径 |
|
|
229
|
+
| max_depth | number | 否 | 路径最大深度(2~4) |
|
|
192
230
|
|
|
193
231
|
### get_hot_context
|
|
194
232
|
|
|
@@ -250,6 +288,18 @@ openclaw gateway restart
|
|
|
250
288
|
| engineMode | 否 | `ts` | 固定为 TS 引擎 |
|
|
251
289
|
| autoSync | 否 | true | 会话结束自动同步 |
|
|
252
290
|
| autoReflect | 否 | false | 自动触发反思 |
|
|
291
|
+
| autoReflectIntervalMinutes | 否 | 30 | 自动反思扫描间隔(分钟) |
|
|
292
|
+
| readFusion.enabled | 否 | true | 启用检索重排后的 LLM 融合 |
|
|
293
|
+
| readFusion.maxCandidates | 否 | 10 | 融合候选上限 |
|
|
294
|
+
| readFusion.authoritative | 否 | true | 仅返回融合权威记忆包 |
|
|
295
|
+
| memoryDecay.enabled | 否 | true | 启用按事件类型半衰期衰减 |
|
|
296
|
+
| memoryDecay.minFloor | 否 | 0.15 | 衰减系数下限 |
|
|
297
|
+
| memoryDecay.defaultHalfLifeDays | 否 | 90 | 未配置类型默认半衰期(天) |
|
|
298
|
+
| memoryDecay.halfLifeByEventType | 否 | - | 各事件类型半衰期覆盖配置 |
|
|
299
|
+
| memoryDecay.antiDecay.enabled | 否 | true | 启用命中频次反衰减 |
|
|
300
|
+
| memoryDecay.antiDecay.maxBoost | 否 | 1.6 | 反衰减最大增益 |
|
|
301
|
+
| memoryDecay.antiDecay.hitWeight | 否 | 0.08 | 命中次数增益系数 |
|
|
302
|
+
| memoryDecay.antiDecay.recentWindowDays | 否 | 30 | 命中新鲜度窗口(天) |
|
|
253
303
|
|
|
254
304
|
## 数据文件
|
|
255
305
|
|
|
@@ -259,9 +309,14 @@ openclaw gateway restart
|
|
|
259
309
|
| `<dbPath>/CORTEX_RULES.md` | 规则文件 |
|
|
260
310
|
| `<dbPath>/sessions/active/sessions.jsonl` | 活跃会话记忆 |
|
|
261
311
|
| `<dbPath>/sessions/archive/sessions.jsonl` | 归档事件 |
|
|
312
|
+
| `<dbPath>/vector/lancedb` | LanceDB 向量表(可用时) |
|
|
313
|
+
| `<dbPath>/vector/lancedb_events.jsonl` | 向量回退存储(LanceDB 不可用时) |
|
|
262
314
|
| `<dbPath>/.sync_state.json` | 同步增量状态 |
|
|
263
315
|
| `<dbPath>/.session_end_state.json` | session_end 幂等状态 |
|
|
264
316
|
| `<dbPath>/.rule_store_state.json` | 规则去重状态 |
|
|
317
|
+
| `<dbPath>/.dedup_index.json` | 三阶段去重索引 |
|
|
318
|
+
| `<dbPath>/.read_hit_stats.json` | 检索命中频次统计(反衰减) |
|
|
319
|
+
| `<dbPath>/graph/mutation_log.jsonl` | 图谱变更审计日志 |
|
|
265
320
|
|
|
266
321
|
## 错误处理
|
|
267
322
|
|
package/dist/index.d.ts
CHANGED
|
@@ -29,6 +29,24 @@ interface CortexMemoryConfig {
|
|
|
29
29
|
dbPath?: string;
|
|
30
30
|
autoSync?: boolean;
|
|
31
31
|
autoReflect?: boolean;
|
|
32
|
+
autoReflectIntervalMinutes?: number;
|
|
33
|
+
readFusion?: {
|
|
34
|
+
enabled?: boolean;
|
|
35
|
+
maxCandidates?: number;
|
|
36
|
+
authoritative?: boolean;
|
|
37
|
+
};
|
|
38
|
+
memoryDecay?: {
|
|
39
|
+
enabled?: boolean;
|
|
40
|
+
minFloor?: number;
|
|
41
|
+
defaultHalfLifeDays?: number;
|
|
42
|
+
halfLifeByEventType?: Record<string, number>;
|
|
43
|
+
antiDecay?: {
|
|
44
|
+
enabled?: boolean;
|
|
45
|
+
maxBoost?: number;
|
|
46
|
+
hitWeight?: number;
|
|
47
|
+
recentWindowDays?: number;
|
|
48
|
+
};
|
|
49
|
+
};
|
|
32
50
|
fallbackToBuiltin?: boolean;
|
|
33
51
|
apiUrl?: string;
|
|
34
52
|
engineMode?: EngineMode;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -46,10 +46,13 @@ const net = __importStar(require("net"));
|
|
|
46
46
|
const ts_engine_1 = require("./src/engine/ts_engine");
|
|
47
47
|
const read_store_1 = require("./src/store/read_store");
|
|
48
48
|
const write_store_1 = require("./src/store/write_store");
|
|
49
|
+
const archive_store_1 = require("./src/store/archive_store");
|
|
50
|
+
const vector_store_1 = require("./src/store/vector_store");
|
|
49
51
|
const session_sync_1 = require("./src/sync/session_sync");
|
|
50
52
|
const session_end_1 = require("./src/session/session_end");
|
|
51
53
|
const rule_store_1 = require("./src/rules/rule_store");
|
|
52
54
|
const reflector_1 = require("./src/reflect/reflector");
|
|
55
|
+
const three_stage_deduplicator_1 = require("./src/dedup/three_stage_deduplicator");
|
|
53
56
|
const ERROR_CODES = {
|
|
54
57
|
CONNECTION_REFUSED: {
|
|
55
58
|
code: "E001",
|
|
@@ -89,6 +92,40 @@ const MAX_OPENCLAW_VERSION = "2027.0.0";
|
|
|
89
92
|
const defaultConfig = {
|
|
90
93
|
autoSync: true,
|
|
91
94
|
autoReflect: false,
|
|
95
|
+
autoReflectIntervalMinutes: 30,
|
|
96
|
+
readFusion: {
|
|
97
|
+
enabled: true,
|
|
98
|
+
maxCandidates: 10,
|
|
99
|
+
authoritative: true,
|
|
100
|
+
},
|
|
101
|
+
memoryDecay: {
|
|
102
|
+
enabled: true,
|
|
103
|
+
minFloor: 0.15,
|
|
104
|
+
defaultHalfLifeDays: 90,
|
|
105
|
+
antiDecay: {
|
|
106
|
+
enabled: true,
|
|
107
|
+
maxBoost: 1.6,
|
|
108
|
+
hitWeight: 0.08,
|
|
109
|
+
recentWindowDays: 30,
|
|
110
|
+
},
|
|
111
|
+
halfLifeByEventType: {
|
|
112
|
+
issue: 30,
|
|
113
|
+
fix: 30,
|
|
114
|
+
action_item: 30,
|
|
115
|
+
blocker: 30,
|
|
116
|
+
plan: 60,
|
|
117
|
+
milestone: 60,
|
|
118
|
+
follow_up: 60,
|
|
119
|
+
decision: 120,
|
|
120
|
+
insight: 120,
|
|
121
|
+
retrospective: 120,
|
|
122
|
+
preference: 240,
|
|
123
|
+
constraint: 240,
|
|
124
|
+
requirement: 240,
|
|
125
|
+
dependency: 240,
|
|
126
|
+
assumption: 240,
|
|
127
|
+
},
|
|
128
|
+
},
|
|
92
129
|
enabled: true,
|
|
93
130
|
fallbackToBuiltin: true,
|
|
94
131
|
engineMode: "ts",
|
|
@@ -194,6 +231,9 @@ function resolveEngine() {
|
|
|
194
231
|
logger,
|
|
195
232
|
embedding: config.embedding,
|
|
196
233
|
reranker: config.reranker,
|
|
234
|
+
llm: config.llm,
|
|
235
|
+
fusion: config.readFusion,
|
|
236
|
+
memoryDecay: config.memoryDecay,
|
|
197
237
|
});
|
|
198
238
|
const writeStore = (0, write_store_1.createWriteStore)({
|
|
199
239
|
projectRoot,
|
|
@@ -201,6 +241,22 @@ function resolveEngine() {
|
|
|
201
241
|
logger,
|
|
202
242
|
embedding: config.embedding,
|
|
203
243
|
});
|
|
244
|
+
const vectorStore = (0, vector_store_1.createVectorStore)({
|
|
245
|
+
memoryRoot,
|
|
246
|
+
logger,
|
|
247
|
+
});
|
|
248
|
+
const deduplicator = (0, three_stage_deduplicator_1.createThreeStageDeduplicator)({
|
|
249
|
+
memoryRoot,
|
|
250
|
+
logger,
|
|
251
|
+
});
|
|
252
|
+
const archiveStore = (0, archive_store_1.createArchiveStore)({
|
|
253
|
+
projectRoot,
|
|
254
|
+
memoryRoot,
|
|
255
|
+
logger,
|
|
256
|
+
embedding: config.embedding,
|
|
257
|
+
deduplicator,
|
|
258
|
+
vectorStore,
|
|
259
|
+
});
|
|
204
260
|
const sessionSync = (0, session_sync_1.createSessionSync)({
|
|
205
261
|
projectRoot,
|
|
206
262
|
dbPath: config.dbPath,
|
|
@@ -212,6 +268,9 @@ function resolveEngine() {
|
|
|
212
268
|
dbPath: config.dbPath,
|
|
213
269
|
logger,
|
|
214
270
|
syncMemory: sessionSync.syncMemory,
|
|
271
|
+
syncDailySummaries: sessionSync.syncDailySummaries,
|
|
272
|
+
archiveStore,
|
|
273
|
+
llm: config.llm,
|
|
215
274
|
});
|
|
216
275
|
const ruleStore = (0, rule_store_1.createRuleStore)({
|
|
217
276
|
projectRoot,
|
|
@@ -228,10 +287,12 @@ function resolveEngine() {
|
|
|
228
287
|
memoryEngine = (0, ts_engine_1.createTsEngine)({
|
|
229
288
|
readStore,
|
|
230
289
|
writeStore,
|
|
290
|
+
archiveStore,
|
|
231
291
|
sessionSync,
|
|
232
292
|
sessionEnd,
|
|
233
293
|
reflector,
|
|
234
294
|
memoryRoot,
|
|
295
|
+
projectRoot,
|
|
235
296
|
getCachedAutoSearch: getSessionCachedAutoSearch,
|
|
236
297
|
resolveSessionId: (context, payload) => resolveSessionId(context, payload),
|
|
237
298
|
normalizeIncomingMessage,
|
|
@@ -523,6 +584,8 @@ function startAutoReflectScheduler() {
|
|
|
523
584
|
if (!config?.autoReflect || autoReflectInterval) {
|
|
524
585
|
return;
|
|
525
586
|
}
|
|
587
|
+
const intervalMinutes = Math.max(5, Math.floor(config.autoReflectIntervalMinutes ?? 30));
|
|
588
|
+
const intervalMs = intervalMinutes * 60 * 1000;
|
|
526
589
|
autoReflectInterval = setInterval(() => {
|
|
527
590
|
if (!isEnabled) {
|
|
528
591
|
return;
|
|
@@ -539,7 +602,7 @@ function startAutoReflectScheduler() {
|
|
|
539
602
|
if (marker === lastAutoReflectArchiveMarker) {
|
|
540
603
|
return;
|
|
541
604
|
}
|
|
542
|
-
if (now - lastAutoReflectRunAt <
|
|
605
|
+
if (now - lastAutoReflectRunAt < intervalMs) {
|
|
543
606
|
return;
|
|
544
607
|
}
|
|
545
608
|
resolveEngine().reflectMemory({}, schedulerContext)
|
|
@@ -554,7 +617,7 @@ function startAutoReflectScheduler() {
|
|
|
554
617
|
}
|
|
555
618
|
})
|
|
556
619
|
.catch(error => logger.warn(`Auto-reflect failed: ${String(error)}`));
|
|
557
|
-
},
|
|
620
|
+
}, intervalMs);
|
|
558
621
|
}
|
|
559
622
|
function stopAutoReflectScheduler() {
|
|
560
623
|
if (autoReflectInterval) {
|
|
@@ -582,6 +645,41 @@ function validateConfig(cfg) {
|
|
|
582
645
|
if (!cfg.reranker?.apiKey || !cfg.reranker?.baseURL) {
|
|
583
646
|
errors.push("reranker.apiKey and reranker.baseURL are required. Please configure third-party reranker endpoint credentials.");
|
|
584
647
|
}
|
|
648
|
+
if (typeof cfg.autoReflectIntervalMinutes === "number" && (!Number.isFinite(cfg.autoReflectIntervalMinutes) || cfg.autoReflectIntervalMinutes < 5)) {
|
|
649
|
+
errors.push("autoReflectIntervalMinutes must be a number >= 5.");
|
|
650
|
+
}
|
|
651
|
+
if (cfg.readFusion && typeof cfg.readFusion.maxCandidates === "number" && (!Number.isFinite(cfg.readFusion.maxCandidates) || cfg.readFusion.maxCandidates < 2)) {
|
|
652
|
+
errors.push("readFusion.maxCandidates must be a number >= 2.");
|
|
653
|
+
}
|
|
654
|
+
if (cfg.memoryDecay) {
|
|
655
|
+
if (typeof cfg.memoryDecay.minFloor === "number" && (!Number.isFinite(cfg.memoryDecay.minFloor) || cfg.memoryDecay.minFloor < 0 || cfg.memoryDecay.minFloor > 1)) {
|
|
656
|
+
errors.push("memoryDecay.minFloor must be within [0,1].");
|
|
657
|
+
}
|
|
658
|
+
if (typeof cfg.memoryDecay.defaultHalfLifeDays === "number" && (!Number.isFinite(cfg.memoryDecay.defaultHalfLifeDays) || cfg.memoryDecay.defaultHalfLifeDays <= 0)) {
|
|
659
|
+
errors.push("memoryDecay.defaultHalfLifeDays must be > 0.");
|
|
660
|
+
}
|
|
661
|
+
const mapping = cfg.memoryDecay.halfLifeByEventType;
|
|
662
|
+
if (mapping && typeof mapping === "object") {
|
|
663
|
+
for (const [key, value] of Object.entries(mapping)) {
|
|
664
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
|
|
665
|
+
errors.push(`memoryDecay.halfLifeByEventType.${key} must be > 0.`);
|
|
666
|
+
break;
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
const anti = cfg.memoryDecay.antiDecay;
|
|
671
|
+
if (anti) {
|
|
672
|
+
if (typeof anti.maxBoost === "number" && (!Number.isFinite(anti.maxBoost) || anti.maxBoost < 1)) {
|
|
673
|
+
errors.push("memoryDecay.antiDecay.maxBoost must be >= 1.");
|
|
674
|
+
}
|
|
675
|
+
if (typeof anti.hitWeight === "number" && (!Number.isFinite(anti.hitWeight) || anti.hitWeight < 0)) {
|
|
676
|
+
errors.push("memoryDecay.antiDecay.hitWeight must be >= 0.");
|
|
677
|
+
}
|
|
678
|
+
if (typeof anti.recentWindowDays === "number" && (!Number.isFinite(anti.recentWindowDays) || anti.recentWindowDays <= 0)) {
|
|
679
|
+
errors.push("memoryDecay.antiDecay.recentWindowDays must be > 0.");
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
}
|
|
585
683
|
return errors;
|
|
586
684
|
}
|
|
587
685
|
function getApiHostAndPort() {
|
|
@@ -1895,6 +1993,24 @@ function register(pluginApi, userConfig) {
|
|
|
1895
1993
|
dbPath: effectiveConfig.dbPath,
|
|
1896
1994
|
autoSync: effectiveConfig.autoSync ?? defaultConfig.autoSync,
|
|
1897
1995
|
autoReflect: effectiveConfig.autoReflect ?? defaultConfig.autoReflect,
|
|
1996
|
+
autoReflectIntervalMinutes: effectiveConfig.autoReflectIntervalMinutes ?? defaultConfig.autoReflectIntervalMinutes,
|
|
1997
|
+
readFusion: {
|
|
1998
|
+
enabled: effectiveConfig.readFusion?.enabled ?? defaultConfig.readFusion?.enabled,
|
|
1999
|
+
maxCandidates: effectiveConfig.readFusion?.maxCandidates ?? defaultConfig.readFusion?.maxCandidates,
|
|
2000
|
+
authoritative: effectiveConfig.readFusion?.authoritative ?? defaultConfig.readFusion?.authoritative,
|
|
2001
|
+
},
|
|
2002
|
+
memoryDecay: {
|
|
2003
|
+
enabled: effectiveConfig.memoryDecay?.enabled ?? defaultConfig.memoryDecay?.enabled,
|
|
2004
|
+
minFloor: effectiveConfig.memoryDecay?.minFloor ?? defaultConfig.memoryDecay?.minFloor,
|
|
2005
|
+
defaultHalfLifeDays: effectiveConfig.memoryDecay?.defaultHalfLifeDays ?? defaultConfig.memoryDecay?.defaultHalfLifeDays,
|
|
2006
|
+
halfLifeByEventType: effectiveConfig.memoryDecay?.halfLifeByEventType ?? defaultConfig.memoryDecay?.halfLifeByEventType,
|
|
2007
|
+
antiDecay: {
|
|
2008
|
+
enabled: effectiveConfig.memoryDecay?.antiDecay?.enabled ?? defaultConfig.memoryDecay?.antiDecay?.enabled,
|
|
2009
|
+
maxBoost: effectiveConfig.memoryDecay?.antiDecay?.maxBoost ?? defaultConfig.memoryDecay?.antiDecay?.maxBoost,
|
|
2010
|
+
hitWeight: effectiveConfig.memoryDecay?.antiDecay?.hitWeight ?? defaultConfig.memoryDecay?.antiDecay?.hitWeight,
|
|
2011
|
+
recentWindowDays: effectiveConfig.memoryDecay?.antiDecay?.recentWindowDays ?? defaultConfig.memoryDecay?.antiDecay?.recentWindowDays,
|
|
2012
|
+
},
|
|
2013
|
+
},
|
|
1898
2014
|
enabled: effectiveConfig.enabled ?? defaultConfig.enabled,
|
|
1899
2015
|
fallbackToBuiltin: effectiveConfig.fallbackToBuiltin ?? defaultConfig.fallbackToBuiltin,
|
|
1900
2016
|
apiUrl: effectiveConfig.apiUrl ?? "http://127.0.0.1:8765",
|