@yun-zero/claw-memory 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 (131) hide show
  1. package/.claude/settings.local.json +68 -0
  2. package/README.md +323 -0
  3. package/dist/config/llm.d.ts +13 -0
  4. package/dist/config/llm.d.ts.map +1 -0
  5. package/dist/config/llm.js +96 -0
  6. package/dist/config/llm.js.map +1 -0
  7. package/dist/config/plugin.d.ts +15 -0
  8. package/dist/config/plugin.d.ts.map +1 -0
  9. package/dist/config/plugin.js +32 -0
  10. package/dist/config/plugin.js.map +1 -0
  11. package/dist/db/entityRepository.d.ts +21 -0
  12. package/dist/db/entityRepository.d.ts.map +1 -0
  13. package/dist/db/entityRepository.js +55 -0
  14. package/dist/db/entityRepository.js.map +1 -0
  15. package/dist/db/repository.d.ts +22 -0
  16. package/dist/db/repository.d.ts.map +1 -0
  17. package/dist/db/repository.js +77 -0
  18. package/dist/db/repository.js.map +1 -0
  19. package/dist/db/schema.d.ts +5 -0
  20. package/dist/db/schema.d.ts.map +1 -0
  21. package/dist/db/schema.js +112 -0
  22. package/dist/db/schema.js.map +1 -0
  23. package/dist/db/todoRepository.d.ts +26 -0
  24. package/dist/db/todoRepository.d.ts.map +1 -0
  25. package/dist/db/todoRepository.js +54 -0
  26. package/dist/db/todoRepository.js.map +1 -0
  27. package/dist/hooks/bootstrap.d.ts +3 -0
  28. package/dist/hooks/bootstrap.d.ts.map +1 -0
  29. package/dist/hooks/bootstrap.js +28 -0
  30. package/dist/hooks/bootstrap.js.map +1 -0
  31. package/dist/hooks/message.d.ts +18 -0
  32. package/dist/hooks/message.d.ts.map +1 -0
  33. package/dist/hooks/message.js +52 -0
  34. package/dist/hooks/message.js.map +1 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +46 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/mcp/tools.d.ts +26 -0
  40. package/dist/mcp/tools.d.ts.map +1 -0
  41. package/dist/mcp/tools.js +360 -0
  42. package/dist/mcp/tools.js.map +1 -0
  43. package/dist/plugin.d.ts +18 -0
  44. package/dist/plugin.d.ts.map +1 -0
  45. package/dist/plugin.js +62 -0
  46. package/dist/plugin.js.map +1 -0
  47. package/dist/services/entityGraphService.d.ts +87 -0
  48. package/dist/services/entityGraphService.d.ts.map +1 -0
  49. package/dist/services/entityGraphService.js +271 -0
  50. package/dist/services/entityGraphService.js.map +1 -0
  51. package/dist/services/memory.d.ts +26 -0
  52. package/dist/services/memory.d.ts.map +1 -0
  53. package/dist/services/memory.js +281 -0
  54. package/dist/services/memory.js.map +1 -0
  55. package/dist/services/memoryIndex.d.ts +34 -0
  56. package/dist/services/memoryIndex.d.ts.map +1 -0
  57. package/dist/services/memoryIndex.js +100 -0
  58. package/dist/services/memoryIndex.js.map +1 -0
  59. package/dist/services/metadataExtractor.d.ts +16 -0
  60. package/dist/services/metadataExtractor.d.ts.map +1 -0
  61. package/dist/services/metadataExtractor.js +75 -0
  62. package/dist/services/metadataExtractor.js.map +1 -0
  63. package/dist/services/retrieval.d.ts +24 -0
  64. package/dist/services/retrieval.d.ts.map +1 -0
  65. package/dist/services/retrieval.js +40 -0
  66. package/dist/services/retrieval.js.map +1 -0
  67. package/dist/services/scheduler.d.ts +122 -0
  68. package/dist/services/scheduler.d.ts.map +1 -0
  69. package/dist/services/scheduler.js +434 -0
  70. package/dist/services/scheduler.js.map +1 -0
  71. package/dist/services/summarizer.d.ts +43 -0
  72. package/dist/services/summarizer.d.ts.map +1 -0
  73. package/dist/services/summarizer.js +252 -0
  74. package/dist/services/summarizer.js.map +1 -0
  75. package/dist/services/tagService.d.ts +64 -0
  76. package/dist/services/tagService.d.ts.map +1 -0
  77. package/dist/services/tagService.js +281 -0
  78. package/dist/services/tagService.js.map +1 -0
  79. package/dist/tools/memory.d.ts +3 -0
  80. package/dist/tools/memory.d.ts.map +1 -0
  81. package/dist/tools/memory.js +114 -0
  82. package/dist/tools/memory.js.map +1 -0
  83. package/dist/types.d.ts +128 -0
  84. package/dist/types.d.ts.map +1 -0
  85. package/dist/types.js +6 -0
  86. package/dist/types.js.map +1 -0
  87. package/docs/plans/2026-03-02-claw-memory-design.md +445 -0
  88. package/docs/plans/2026-03-02-incremental-summary-design.md +157 -0
  89. package/docs/plans/2026-03-02-incremental-summary-implementation.md +468 -0
  90. package/docs/plans/2026-03-02-memory-index-design.md +163 -0
  91. package/docs/plans/2026-03-02-memory-index-implementation.md +836 -0
  92. package/docs/plans/2026-03-02-mvp-implementation.md +1703 -0
  93. package/docs/plans/2026-03-02-testing-implementation.md +395 -0
  94. package/docs/plans/2026-03-02-testing-plan.md +93 -0
  95. package/docs/plans/2026-03-03-claw-memory-openclaw-plugin-design.md +285 -0
  96. package/docs/plans/2026-03-03-claw-memory-plugin-implementation.md +642 -0
  97. package/docs/plans/2026-03-03-entity-graph-design.md +121 -0
  98. package/docs/plans/2026-03-03-entity-graph-implementation.md +687 -0
  99. package/docs/plans/2026-03-03-llm-generic-config-design.md +43 -0
  100. package/docs/plans/2026-03-03-llm-generic-config-implementation.md +186 -0
  101. package/docs/plans/2026-03-03-memory-e2e-stress-test-design.md +110 -0
  102. package/docs/plans/2026-03-03-memory-e2e-stress-test-implementation.md +464 -0
  103. package/docs/plans/2026-03-03-minimax-llm-fix.md +156 -0
  104. package/docs/plans/2026-03-03-scheduler-design.md +165 -0
  105. package/docs/plans/2026-03-03-scheduler-implementation.md +777 -0
  106. package/docs/plans/2026-03-03-tags-visualization-design.md +73 -0
  107. package/docs/plans/2026-03-03-tags-visualization-implementation.md +539 -0
  108. package/openclaw.plugin.json +11 -0
  109. package/package.json +41 -0
  110. package/src/config/llm.ts +129 -0
  111. package/src/config/plugin.ts +47 -0
  112. package/src/db/entityRepository.ts +80 -0
  113. package/src/db/repository.ts +106 -0
  114. package/src/db/schema.ts +121 -0
  115. package/src/db/todoRepository.ts +76 -0
  116. package/src/hooks/bootstrap.ts +36 -0
  117. package/src/hooks/message.ts +84 -0
  118. package/src/index.ts +50 -0
  119. package/src/plugin.ts +85 -0
  120. package/src/services/entityGraphService.ts +367 -0
  121. package/src/services/memory.ts +338 -0
  122. package/src/services/memoryIndex.ts +140 -0
  123. package/src/services/metadataExtractor.ts +89 -0
  124. package/src/services/retrieval.ts +71 -0
  125. package/src/services/scheduler.ts +529 -0
  126. package/src/services/summarizer.ts +318 -0
  127. package/src/services/tagService.ts +335 -0
  128. package/src/tools/memory.ts +137 -0
  129. package/src/types.ts +139 -0
  130. package/tsconfig.json +20 -0
  131. package/vitest.config.ts +16 -0
@@ -0,0 +1,445 @@
1
+ # Claw-Memory 记忆系统设计文档
2
+
3
+ > 创建日期: 2026-03-02
4
+ > 状态: 已批准
5
+ > 作者: OpenClaw Community
6
+
7
+ ## 1. 项目概述
8
+
9
+ ### 1.1 定位
10
+
11
+ 为 OpenClaw 和 Claude Code 提供轻量级、持久化的 AI 记忆系统。
12
+
13
+ ### 1.2 核心目标
14
+
15
+ 1. **存储**:保存 OpenClaw 会话记忆(原始对话 + 结构化知识)
16
+ 2. **关联**:以图的形式关联记忆的关键词、标签、主体
17
+ 3. **检索**:按相关性、时间、标签等多维度检索
18
+ 4. **服务**:通过 MCP 协议供 OpenClaw 和 Claude Code 调用
19
+
20
+ ### 1.3 设计原则
21
+
22
+ - **轻量级**:SQLite + 本地文件,无额外服务依赖
23
+ - **职责分离**:OpenClaw 负责提取,Memory 负责存储检索
24
+ - **增量维护**:每日定时总结、去重、关联(模拟人类睡眠整理)
25
+
26
+ ---
27
+
28
+ ## 2. 系统架构
29
+
30
+ ```
31
+ ┌─────────────────────────────────────────────────────────────────┐
32
+ │ OpenClaw / Claude Code │
33
+ └───────────────────────────────┬─────────────────────────────────┘
34
+ │ MCP Protocol
35
+
36
+ ┌─────────────────────────────────────────────────────────────────┐
37
+ │ Claw-Memory MCP Server │
38
+ ├─────────────────────────────────────────────────────────────────┤
39
+ │ Tools: │
40
+ │ ├── save_memory 保存会话记忆 │
41
+ │ ├── search_memory 检索相关记忆 │
42
+ │ ├── get_context 获取上下文(按权重加载) │
43
+ │ ├── get_summary 获取时间周期总结 │
44
+ │ └── manage_entities 管理实体/标签 │
45
+ └───────────────────────────────┬─────────────────────────────────┘
46
+
47
+ ┌───────────────────────┼───────────────────────┐
48
+ ▼ ▼ ▼
49
+ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐
50
+ │ SQLite │ │ 本地文件 │ │ 定时任务 │
51
+ │ (元数据) │ │ (对话内容) │ │ (总结/去重) │
52
+ └───────────────┘ └───────────────┘ └───────────────┘
53
+ ```
54
+
55
+ ---
56
+
57
+ ## 3. 数据模型
58
+
59
+ ### 3.1 ER 图
60
+
61
+ ```
62
+ ┌─────────────┐ ┌───────────────────┐ ┌─────────────┐
63
+ │ memories │ │ memory_entities │ │ entities │
64
+ ├─────────────┤ ├───────────────────┤ ├─────────────┤
65
+ │ id (PK) │────<│ memory_id (FK) │>────│ id (PK) │
66
+ │ content_path│ │ entity_id (FK) │ │ name │
67
+ │ summary │ │ relevance │ │ type │
68
+ │ created_at │ │ source │ │ parent_id │
69
+ │ importance │ └───────────────────┘ │ level │
70
+ │ token_count │ │ embedding │
71
+ └─────────────┘ └──────┬──────┘
72
+
73
+ ┌──────────────────────────────────────────────┘
74
+
75
+
76
+ ┌───────────────────┐
77
+ │ entity_relations │
78
+ ├───────────────────┤
79
+ │ source_id (FK) │
80
+ │ target_id (FK) │
81
+ │ relation_type │
82
+ │ weight │
83
+ └───────────────────┘
84
+
85
+ ┌─────────────────┐
86
+ │ time_buckets │
87
+ ├─────────────────┤
88
+ │ date (PK) │
89
+ │ memory_count │
90
+ │ summary │
91
+ │ key_topics │
92
+ └─────────────────┘
93
+ ```
94
+
95
+ ### 3.2 表结构
96
+
97
+ ```sql
98
+ -- 1. 记忆表
99
+ CREATE TABLE memories (
100
+ id TEXT PRIMARY KEY,
101
+ content_path TEXT NOT NULL,
102
+ summary TEXT,
103
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
104
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
105
+ token_count INTEGER DEFAULT 0,
106
+ importance REAL DEFAULT 0.5,
107
+ access_count INTEGER DEFAULT 0,
108
+ last_accessed_at TIMESTAMP,
109
+ is_archived BOOLEAN DEFAULT FALSE,
110
+ is_duplicate BOOLEAN DEFAULT FALSE,
111
+ duplicate_of TEXT
112
+ );
113
+
114
+ -- 2. 统一实体表(支持层级)
115
+ CREATE TABLE entities (
116
+ id TEXT PRIMARY KEY,
117
+ name TEXT NOT NULL,
118
+ type TEXT NOT NULL, -- keyword/tag/subject/person/project
119
+ parent_id TEXT,
120
+ level INTEGER DEFAULT 0,
121
+ embedding BLOB,
122
+ metadata JSON,
123
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
124
+ FOREIGN KEY (parent_id) REFERENCES entities(id)
125
+ );
126
+
127
+ -- 3. 记忆-实体关联表
128
+ CREATE TABLE memory_entities (
129
+ memory_id TEXT NOT NULL,
130
+ entity_id TEXT NOT NULL,
131
+ relevance REAL DEFAULT 1.0,
132
+ source TEXT DEFAULT 'auto',
133
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
134
+ PRIMARY KEY (memory_id, entity_id),
135
+ FOREIGN KEY (memory_id) REFERENCES memories(id),
136
+ FOREIGN KEY (entity_id) REFERENCES entities(id)
137
+ );
138
+
139
+ -- 4. 实体关系图
140
+ CREATE TABLE entity_relations (
141
+ id TEXT PRIMARY KEY,
142
+ source_id TEXT NOT NULL,
143
+ target_id TEXT NOT NULL,
144
+ relation_type TEXT NOT NULL, -- related/parent/similar/co_occur
145
+ weight REAL DEFAULT 1.0,
146
+ evidence_count INTEGER DEFAULT 1,
147
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
148
+ FOREIGN KEY (source_id) REFERENCES entities(id),
149
+ FOREIGN KEY (target_id) REFERENCES entities(id),
150
+ UNIQUE(source_id, target_id, relation_type)
151
+ );
152
+
153
+ -- 5. 时间桶
154
+ CREATE TABLE time_buckets (
155
+ date DATE PRIMARY KEY,
156
+ memory_count INTEGER DEFAULT 0,
157
+ summary TEXT,
158
+ summary_generated_at TIMESTAMP,
159
+ key_topics JSON,
160
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
161
+ );
162
+
163
+ -- 索引
164
+ CREATE INDEX idx_memories_created ON memories(created_at);
165
+ CREATE INDEX idx_memories_importance ON memories(importance);
166
+ CREATE INDEX idx_entities_name ON entities(name);
167
+ CREATE INDEX idx_entities_type ON entities(type);
168
+ CREATE INDEX idx_entities_parent ON entities(parent_id);
169
+ CREATE INDEX idx_memory_entities_entity ON memory_entities(entity_id);
170
+ CREATE INDEX idx_entity_relations_source ON entity_relations(source_id);
171
+ CREATE INDEX idx_entity_relations_target ON entity_relations(target_id);
172
+ ```
173
+
174
+ ---
175
+
176
+ ## 4. 检索算法
177
+
178
+ ### 4.1 权重计算公式
179
+
180
+ ```
181
+ 总分 = 实体匹配 × 0.4 + 时间衰减 × 0.3 + 标签层级 × 0.2 + 重要性 × 0.1
182
+ ```
183
+
184
+ ### 4.2 各维度计算
185
+
186
+ | 维度 | 范围 | 计算规则 |
187
+ |-----|------|---------|
188
+ | 实体匹配 | 0-40 | 匹配实体数 × 10,上限 40;通过关系图扩展匹配可加分 |
189
+ | 时间衰减 | 0-30 | 今天 30,本周 20,本月 10,本年 5,更早 0 |
190
+ | 标签层级 | 0-20 | 完全匹配 +10,父级匹配 +7,子级匹配 +5,兄弟节点 +3 |
191
+ | 重要性 | 0-10 | 基础重要性 × 5 + 访问频率加成 + 最近访问加成 |
192
+
193
+ ### 4.3 检索流程
194
+
195
+ 1. 提取查询实体
196
+ 2. 构建时间过滤条件
197
+ 3. 获取候选记忆
198
+ 4. 计算综合权重
199
+ 5. 按权重排序
200
+ 6. 限制 Token 数量返回
201
+
202
+ ---
203
+
204
+ ## 5. 定时任务(睡眠整理)
205
+
206
+ ### 5.1 睡眠周期
207
+
208
+ ```
209
+ 记忆写入(白天)
210
+
211
+
212
+ ┌────────────────┐
213
+ │ 工作时间 │ ← 不进行整理,只存储
214
+ │ 09:00-23:00 │
215
+ └───────┬────────┘
216
+
217
+ ▼ 凌晨2点
218
+ ┌────────────────┐
219
+ │ 睡眠第一阶段 │ ← 每日总结
220
+ │ 整理记忆 │
221
+ │ 02:00 │
222
+ └───────┬────────┘
223
+
224
+ ▼ 凌晨3点
225
+ ┌────────────────┐
226
+ │ 睡眠第二阶段 │ ← 去重清理
227
+ │ 消除重复 │
228
+ │ 03:00 │
229
+ └───────┬────────┘
230
+
231
+ ▼ 凌晨4点
232
+ ┌────────────────┐
233
+ │ 睡眠第三阶段 │ ← 关系构建
234
+ │ 建立关联 │
235
+ │ 04:00 │
236
+ └───────┬────────┘
237
+
238
+ ▼ 周一/月初
239
+ ┌────────────────┐
240
+ │ 深度整理 │ ← 周/月总结
241
+ └────────────────┘
242
+ ```
243
+
244
+ ### 5.2 默认配置
245
+
246
+ ```yaml
247
+ scheduler:
248
+ sleep_time:
249
+ daily_summary: {hour: 2, minute: 0}
250
+ deduplication: {hour: 3, minute: 0}
251
+ relation_update: {hour: 4, minute: 0}
252
+ weekly_summary: {day_of_week: "mon", hour: 3, minute: 30}
253
+ monthly_summary: {day: 1, hour: 4, minute: 30}
254
+ ```
255
+
256
+ ---
257
+
258
+ ## 6. OpenClaw Hook 集成
259
+
260
+ ### 6.1 触发时机
261
+
262
+ 会话结束时自动触发,通过 OpenClaw hooks 机制。
263
+
264
+ ### 6.2 提取 Prompt
265
+
266
+ ```
267
+ 你是记忆提取助手。请分析以下对话,提取结构化信息。
268
+
269
+ ## 对话内容
270
+ {content}
271
+
272
+ ## 提取要求
273
+
274
+ 请返回 JSON 格式:
275
+ {
276
+ "summary": "一句话总结(50字以内)",
277
+ "importance": 0.0-1.0,
278
+ "tags": ["层级标签,如 技术/前端/React"],
279
+ "subjects": ["讨论的主要话题"],
280
+ "keywords": ["关键技术词"],
281
+ "entities": [{"name": "实体名", "type": "person|project|concept|tool|other"}],
282
+ "action_items": ["待办事项"],
283
+ "decisions": ["做出的决定"]
284
+ }
285
+
286
+ ## 标签层级参考
287
+ - 技术/前端|后端|数据库|运维|AI
288
+ - 项目/{项目名}
289
+ - 任务/开发|调试|设计|研究|规划
290
+ - 通用/日常|想法|计划
291
+ ```
292
+
293
+ ---
294
+
295
+ ## 7. 文件存储
296
+
297
+ ### 7.1 目录结构
298
+
299
+ ```
300
+ memories/
301
+ ├── 2026/
302
+ │ └── 03/
303
+ │ └── 02/
304
+ │ ├── abc123.md
305
+ │ └── def456.md
306
+ └── memory.db
307
+ ```
308
+
309
+ ### 7.2 文件格式
310
+
311
+ ```markdown
312
+ # Memory: abc123
313
+
314
+ **Created**: 2026-03-02 14:30:00
315
+ **Summary**: 讨论了 React Hooks 的最佳实践
316
+ **Importance**: 0.8
317
+
318
+ ## Tags
319
+ - 技术/前端/React
320
+ - 任务/开发
321
+
322
+ ## Entities
323
+ - React Hooks (concept)
324
+ - useState (keyword)
325
+
326
+ ## Content
327
+
328
+ [用户]: 请解释一下 React Hooks 的使用方式
329
+
330
+ [助手]: React Hooks 是 React 16.8 引入的新特性...
331
+
332
+ ---
333
+
334
+ ## Action Items
335
+ - [ ] 整理 React Hooks 最佳实践文档
336
+ ```
337
+
338
+ ---
339
+
340
+ ## 8. MCP API
341
+
342
+ ### 8.1 Tools
343
+
344
+ | 工具 | 描述 |
345
+ |-----|------|
346
+ | `save_memory` | 保存会话记忆 |
347
+ | `search_memory` | 多维度检索记忆 |
348
+ | `get_context` | 获取加权上下文 |
349
+ | `get_summary` | 获取时间周期总结 |
350
+ | `list_memories` | 列出指定条件的记忆 |
351
+ | `delete_memory` | 删除指定记忆 |
352
+ | `manage_entities` | 管理实体/标签的 CRUD |
353
+
354
+ ### 8.2 示例调用
355
+
356
+ ```python
357
+ # 保存记忆
358
+ await mcp.call_tool("save_memory", {
359
+ "content": "会话内容...",
360
+ "metadata": {
361
+ "tags": ["技术/前端/React"],
362
+ "subjects": ["React Hooks"],
363
+ "importance": 0.8
364
+ }
365
+ })
366
+
367
+ # 检索记忆
368
+ await mcp.call_tool("search_memory", {
369
+ "query": "React Hooks 怎么用",
370
+ "time_range": "month",
371
+ "limit": 10,
372
+ "max_tokens": 4000
373
+ })
374
+ ```
375
+
376
+ ---
377
+
378
+ ## 9. 技术栈
379
+
380
+ - **语言**: TypeScript (Node.js 18+)
381
+ - **数据库**: better-sqlite3 (SQLite Node.js 绑定)
382
+ - **MCP 框架**: @modelcontextprotocol/sdk
383
+ - **CLI**: Commander.js
384
+ - **类型**: TypeScript 5.x with strict mode
385
+ - **测试**: Vitest (TDD)
386
+ - **可选嵌入**: OpenAI text-embedding-3-small (Phase 4)
387
+
388
+ ---
389
+
390
+ ## 10. 项目结构 (TypeScript)
391
+
392
+ ```
393
+ claw-memory/
394
+ ├── src/
395
+ │ ├── index.ts # CLI 入口
396
+ │ ├── db/
397
+ │ │ ├── schema.ts # SQLite 表结构 + 初始化
398
+ │ │ └── repository.ts # 数据访问层 (Repository)
399
+ │ ├── services/
400
+ │ │ ├── memory.ts # 记忆服务
401
+ │ │ └── retrieval.ts # 检索服务 (权重计算)
402
+ │ ├── mcp/
403
+ │ │ └── tools.ts # MCP 工具定义
404
+ │ └── types.ts # 类型定义
405
+ ├── tests/
406
+ │ ├── db/
407
+ │ ├── services/
408
+ │ └── mcp/
409
+ ├── package.json
410
+ ├── tsconfig.json
411
+ └── README.md
412
+ ```
413
+
414
+ ---
415
+
416
+ ## 11. 实现路线图
417
+
418
+ ### Phase 1: MVP (当前阶段)
419
+ - [ ] 项目初始化 (package.json, tsconfig)
420
+ - [ ] SQLite 数据模型 (schema.ts, repository.ts)
421
+ - [ ] MCP 服务基础框架 (tools.ts, index.ts)
422
+ - [ ] 记忆存储/检索核心功能
423
+
424
+ ### Phase 2: 增强
425
+ - [ ] 层级标签管理
426
+ - [ ] 实体关系图
427
+ - [ ] 定时总结/去重
428
+
429
+ ### Phase 3: 集成
430
+ - [ ] OpenClaw hook 集成
431
+ - [ ] Claude Code MCP 配置
432
+
433
+ ### Phase 4: 优化
434
+ - [ ] 语义搜索(可选)
435
+ - [ ] 性能优化
436
+ - [ ] 导入/导出功能
437
+
438
+ ---
439
+
440
+ ## 附录:参考项目
441
+
442
+ - [Letta/MemGPT](https://github.com/letta-ai/letta) - 记忆管理架构
443
+ - [LightRAG](https://github.com/HKUDS/LightRAG) - 图结构检索
444
+ - [MemOS](https://github.com/MemTensor/MemOS) - 记忆操作系统
445
+ - [MCP Memory Service](https://github.com/doobidoo/mcp-memory-service) - MCP 记忆服务
@@ -0,0 +1,157 @@
1
+ # 增量更新整体记忆摘要设计
2
+
3
+ **日期**: 2026-03-02
4
+
5
+ ## 背景
6
+
7
+ 当前 `get_memory_index` 每次调用时都需要 LLM 实时计算整体摘要,导致:
8
+ 1. 每次查询都消耗 LLM tokens
9
+ 2. 实时计算效率低
10
+ 3. 无法体现"累积"效应
11
+
12
+ ## 目标
13
+
14
+ 在会话结束时,一次 LLM 调用同时完成:
15
+ 1. 提取当前会话的 tags、keywords、summary
16
+ 2. 整合整体摘要(包含历史累积信息)
17
+
18
+ 后续查询直接返回缓存的摘要,无需 LLM 调用。
19
+
20
+ ---
21
+
22
+ ## 功能设计
23
+
24
+ ### 1. 数据模型
25
+
26
+ ```sql
27
+ -- memories 表新增字段
28
+ ALTER TABLE memories ADD COLUMN integrated_summary JSON;
29
+ ```
30
+
31
+ ```typescript
32
+ interface IntegratedSummary {
33
+ active_areas: string[]; // ["技术/AI (10)", "金融/投资 (3)"]
34
+ key_topics: string[]; // ["React", "OpenClaw", "股票"]
35
+ recent_summary: string; // "本周主要讨论了AI技术和金融投资..."
36
+ }
37
+ ```
38
+
39
+ ### 2. LLM Prompt 设计
40
+
41
+ ```typescript
42
+ const EXTRACTION_PROMPT = `请从以下对话内容中提取结构化元数据,并整合已有的整体摘要:
43
+
44
+ 当前对话内容:
45
+ {content}
46
+
47
+ 已有整体摘要(请在此基础上增量更新):
48
+ {existing_summary}
49
+
50
+ 请以 JSON 格式返回:
51
+ {
52
+ "tags": ["一级分类/二级分类"],
53
+ "keywords": ["关键词1", "关键词2"],
54
+ "subjects": ["主题1"],
55
+ "importance": 0.0-1.0,
56
+ "summary": "当前对话的一句话摘要",
57
+ "integrated_summary": {
58
+ "active_areas": ["领域名 (出现次数)"],
59
+ "key_topics": ["主题1", "主题2"],
60
+ "recent_summary": "整体摘要自然语言描述"
61
+ }
62
+ }
63
+
64
+ 注意:
65
+ - tags 使用层级结构
66
+ - integrated_summary 需整合历史信息,在已有基础上增加新领域
67
+ - 只返回 JSON,不要其他内容`;
68
+ ```
69
+
70
+ ### 3. 流程设计
71
+
72
+ ```
73
+ session_end → saveMemory(content)
74
+
75
+ ├─→ 读取最新的 integrated_summary(从最新的 memory)
76
+
77
+ ├─→ 构建 LLM prompt(传入已有摘要)
78
+
79
+ ├─→ LLM 一次调用返回:
80
+ │ - 当前会话元数据
81
+ │ - 整合后的整体摘要
82
+
83
+ └─→ 存储到 memory 记录
84
+ - tags, keywords, summary(当前会话)
85
+ - integrated_summary(整体摘要)
86
+
87
+ get_memory_index()
88
+
89
+ └─→ 直接返回缓存的 integrated_summary(无需 LLM)
90
+ ```
91
+
92
+ ### 4. 边界情况
93
+
94
+ - **首次保存**:无历史摘要时,LLM 生成初始摘要
95
+ - **LLM 失败**:使用 fallback,integrated_summary 为空
96
+ - **摘要过期**:可选择定期重新生成(如每周)
97
+
98
+ ---
99
+
100
+ ## MCP 工具变更
101
+
102
+ ### get_memory_index
103
+
104
+ ```typescript
105
+ // 新增返回字段
106
+ interface MemoryIndex {
107
+ // ... 现有字段
108
+ integrated_summary?: IntegratedSummary; // 新增:缓存的整体摘要
109
+ summary_freshness?: 'fresh' | 'stale'; // 摘要新鲜度
110
+ }
111
+ ```
112
+
113
+ ---
114
+
115
+ ## OpenClaw Hook 集成
116
+
117
+ ```yaml
118
+ # session_start 时获取摘要
119
+ hooks:
120
+ session_start:
121
+ - name: memory_summary
122
+ tool: get_memory_index
123
+ inject_as: prepend_context
124
+
125
+ # 生成的上下文示例
126
+ """
127
+ ## 你的记忆概览
128
+
129
+ 【活跃领域】
130
+ - 技术/AI (10), 金融/投资 (3), 生活/旅行 (2)
131
+
132
+ 【关键词】
133
+ React, OpenClaw, 股票, 基金
134
+
135
+ 【近期动态】
136
+ 本周主要讨论了AI技术(OpenClaw、Claude Code)和金融投资...
137
+ """
138
+ ```
139
+
140
+ ---
141
+
142
+ ## 实现计划
143
+
144
+ ### Phase 1: 数据库变更
145
+ 1. 修改 memories 表,添加 integrated_summary 字段
146
+
147
+ ### Phase 2: LLM Prompt 更新
148
+ 1. 更新 MetadataExtractor 的 prompt,支持传入已有摘要
149
+ 2. 修改 extract 方法,接收 existing_summary 参数
150
+
151
+ ### Phase 3: 存储逻辑
152
+ 1. 修改 MemoryService.saveMemory,传递已有摘要给 LLM
153
+ 2. 存储整合后的 integrated_summary
154
+
155
+ ### Phase 4: 查询优化
156
+ 1. 修改 get_memory_index,优先返回缓存的摘要
157
+ 2. 添加摘要新鲜度标记