@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,271 @@
1
+ /**
2
+ * Service for managing entity graph data and relationships
3
+ */
4
+ export class EntityGraphService {
5
+ db;
6
+ constructor(db) {
7
+ this.db = db;
8
+ }
9
+ /**
10
+ * Get entity by name
11
+ */
12
+ getEntityByName(name) {
13
+ const row = this.db.prepare(`
14
+ SELECT id, name, type FROM entities WHERE name = ?
15
+ `).get(name);
16
+ return row;
17
+ }
18
+ /**
19
+ * Get all entities and their relations as graph data
20
+ */
21
+ getGraphData() {
22
+ // Get all entities as nodes
23
+ const entityRows = this.db.prepare(`
24
+ SELECT id, name, type FROM entities
25
+ `).all();
26
+ const nodes = entityRows.map(row => ({
27
+ id: row.id,
28
+ name: row.name,
29
+ type: row.type
30
+ }));
31
+ // Get all relations as edges
32
+ const relationRows = this.db.prepare(`
33
+ SELECT source_id, target_id, relation_type, weight FROM entity_relations
34
+ `).all();
35
+ const edges = relationRows.map(row => ({
36
+ source: row.source_id,
37
+ target: row.target_id,
38
+ type: row.relation_type,
39
+ weight: row.weight
40
+ }));
41
+ return { nodes, edges };
42
+ }
43
+ /**
44
+ * Get relations for a specific entity by name
45
+ */
46
+ getEntityRelations(entityName) {
47
+ // First get the entity by name
48
+ const entity = this.getEntityByName(entityName);
49
+ if (!entity) {
50
+ return [];
51
+ }
52
+ const rows = this.db.prepare(`
53
+ SELECT source_id, target_id, relation_type, weight
54
+ FROM entity_relations
55
+ WHERE source_id = ? OR target_id = ?
56
+ `).all(entity.id, entity.id);
57
+ return rows.map(row => ({
58
+ source: row.source_id,
59
+ target: row.target_id,
60
+ type: row.relation_type,
61
+ weight: row.weight
62
+ }));
63
+ }
64
+ /**
65
+ * Query entity graph - find path or subgraph between entities
66
+ */
67
+ queryEntityGraph(startEntityName, endEntityName, maxHops = 2) {
68
+ // Get start entity
69
+ const startEntity = this.getEntityByName(startEntityName);
70
+ if (!startEntity) {
71
+ return { nodes: [], edges: [], found: false };
72
+ }
73
+ // If no end entity, return subgraph around start entity
74
+ if (!endEntityName) {
75
+ const subgraph = this.getSubgraph(startEntity.id, maxHops);
76
+ return {
77
+ nodes: subgraph.nodes,
78
+ edges: subgraph.edges,
79
+ found: true
80
+ };
81
+ }
82
+ // Get end entity
83
+ const endEntity = this.getEntityByName(endEntityName);
84
+ if (!endEntity) {
85
+ return { nodes: [], edges: [], found: false };
86
+ }
87
+ // Find path using BFS
88
+ const path = this.findPath(startEntity.id, endEntity.id, maxHops);
89
+ if (!path) {
90
+ return { nodes: [], edges: [], found: false };
91
+ }
92
+ // Get nodes and edges for the path
93
+ const nodes = [];
94
+ const edges = [];
95
+ const nodeIds = new Set();
96
+ for (const entityId of path) {
97
+ const entityRow = this.db.prepare(`
98
+ SELECT id, name, type FROM entities WHERE id = ?
99
+ `).get(entityId);
100
+ if (entityRow) {
101
+ nodes.push({
102
+ id: entityRow.id,
103
+ name: entityRow.name,
104
+ type: entityRow.type
105
+ });
106
+ nodeIds.add(entityRow.id);
107
+ }
108
+ }
109
+ // Get edges between the path nodes
110
+ for (let i = 0; i < path.length - 1; i++) {
111
+ const edgeRows = this.db.prepare(`
112
+ SELECT source_id, target_id, relation_type, weight
113
+ FROM entity_relations
114
+ WHERE (source_id = ? AND target_id = ?) OR (source_id = ? AND target_id = ?)
115
+ `).all(path[i], path[i + 1], path[i + 1], path[i]);
116
+ for (const row of edgeRows) {
117
+ edges.push({
118
+ source: row.source_id,
119
+ target: row.target_id,
120
+ type: row.relation_type,
121
+ weight: row.weight
122
+ });
123
+ }
124
+ }
125
+ return {
126
+ path,
127
+ nodes,
128
+ edges,
129
+ found: true
130
+ };
131
+ }
132
+ /**
133
+ * Find shortest path between two entities using BFS
134
+ */
135
+ findPath(startId, endId, maxHops) {
136
+ if (startId === endId) {
137
+ return [startId];
138
+ }
139
+ const queue = [{ id: startId, path: [startId] }];
140
+ const visited = new Set([startId]);
141
+ while (queue.length > 0) {
142
+ const { id, path } = queue.shift();
143
+ if (path.length > maxHops) {
144
+ continue;
145
+ }
146
+ // Get connected entities
147
+ const connectedRows = this.db.prepare(`
148
+ SELECT source_id, target_id FROM entity_relations
149
+ WHERE source_id = ? OR target_id = ?
150
+ `).all(id, id);
151
+ for (const row of connectedRows) {
152
+ const connectedId = row.source_id === id ? row.target_id : row.source_id;
153
+ if (connectedId === endId) {
154
+ return [...path, connectedId];
155
+ }
156
+ if (!visited.has(connectedId)) {
157
+ visited.add(connectedId);
158
+ queue.push({ id: connectedId, path: [...path, connectedId] });
159
+ }
160
+ }
161
+ }
162
+ return null;
163
+ }
164
+ /**
165
+ * Get statistics about entity relations
166
+ */
167
+ getRelationStats() {
168
+ // Get total relations count
169
+ const totalResult = this.db.prepare(`
170
+ SELECT COUNT(*) as count FROM entity_relations
171
+ `).get();
172
+ const total_relations = totalResult.count;
173
+ // Get count by relation type
174
+ const typeRows = this.db.prepare(`
175
+ SELECT relation_type, COUNT(*) as count
176
+ FROM entity_relations
177
+ GROUP BY relation_type
178
+ `).all();
179
+ const relation_types = {};
180
+ for (const row of typeRows) {
181
+ relation_types[row.relation_type] = row.count;
182
+ }
183
+ // Get most connected entities
184
+ const connectedRows = this.db.prepare(`
185
+ SELECT e.id, e.name, COUNT(er.id) as connection_count
186
+ FROM entities e
187
+ LEFT JOIN (
188
+ SELECT source_id as entity_id, id FROM entity_relations
189
+ UNION ALL
190
+ SELECT target_id as entity_id, id FROM entity_relations
191
+ ) er ON e.id = er.entity_id
192
+ GROUP BY e.id, e.name
193
+ ORDER BY connection_count DESC
194
+ LIMIT 10
195
+ `).all();
196
+ const most_connected = connectedRows.map(row => ({
197
+ id: row.id,
198
+ name: row.name,
199
+ connection_count: row.connection_count
200
+ }));
201
+ return {
202
+ most_connected,
203
+ relation_types,
204
+ total_relations
205
+ };
206
+ }
207
+ /**
208
+ * Create a relation between two entities
209
+ */
210
+ createRelation(sourceId, targetId, type, weight = 1.0) {
211
+ const { v4: uuidv4 } = require('uuid');
212
+ const id = uuidv4();
213
+ const now = new Date();
214
+ this.db.prepare(`
215
+ INSERT INTO entity_relations (id, source_id, target_id, relation_type, weight, evidence_count, created_at)
216
+ VALUES (?, ?, ?, ?, ?, 1, ?)
217
+ `).run(id, sourceId, targetId, type, weight, now.toISOString());
218
+ return {
219
+ id,
220
+ sourceId,
221
+ targetId,
222
+ relationType: type,
223
+ weight,
224
+ evidenceCount: 1,
225
+ createdAt: now
226
+ };
227
+ }
228
+ /**
229
+ * Get subgraph around a specific entity (depth: number of hops)
230
+ */
231
+ getSubgraph(entityId, depth = 1) {
232
+ const visited = new Set();
233
+ const nodes = [];
234
+ const edges = [];
235
+ const collectNodes = (currentId, currentDepth) => {
236
+ if (currentDepth > depth || visited.has(currentId))
237
+ return;
238
+ visited.add(currentId);
239
+ // Get entity info
240
+ const entityRow = this.db.prepare(`
241
+ SELECT id, name, type FROM entities WHERE id = ?
242
+ `).get(currentId);
243
+ if (entityRow) {
244
+ nodes.push({
245
+ id: entityRow.id,
246
+ name: entityRow.name,
247
+ type: entityRow.type
248
+ });
249
+ }
250
+ // Get connected entities
251
+ const connectedRows = this.db.prepare(`
252
+ SELECT source_id, target_id, relation_type, weight
253
+ FROM entity_relations
254
+ WHERE source_id = ? OR target_id = ?
255
+ `).all(currentId, currentId);
256
+ for (const row of connectedRows) {
257
+ const connectedId = row.source_id === currentId ? row.target_id : row.source_id;
258
+ edges.push({
259
+ source: row.source_id,
260
+ target: row.target_id,
261
+ type: row.relation_type,
262
+ weight: row.weight
263
+ });
264
+ collectNodes(connectedId, currentDepth + 1);
265
+ }
266
+ };
267
+ collectNodes(entityId, 0);
268
+ return { nodes, edges };
269
+ }
270
+ }
271
+ //# sourceMappingURL=entityGraphService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entityGraphService.js","sourceRoot":"","sources":["../../src/services/entityGraphService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import Database from 'better-sqlite3';
2
+ import { type SearchOptions } from './retrieval.js';
3
+ import type { Memory, SaveMemoryInput, GetContextInput, TimeBucket, IntegratedSummary } from '../types.js';
4
+ export declare class MemoryService {
5
+ private db;
6
+ private memoryRepo;
7
+ private entityRepo;
8
+ private summarizer;
9
+ private extractor;
10
+ private dataDir;
11
+ constructor(db: Database.Database, dataDir?: string);
12
+ getLatestIntegratedSummary(): IntegratedSummary | null;
13
+ saveMemory(input: SaveMemoryInput): Promise<Memory>;
14
+ searchMemory(options: SearchOptions): Promise<Memory[]>;
15
+ getContext(input: GetContextInput): Promise<string>;
16
+ getSummary(period: 'day' | 'week' | 'month', date?: string): Promise<TimeBucket>;
17
+ private calculatePeriodRange;
18
+ private saveTimeBucket;
19
+ private saveContentToFile;
20
+ private readContentFromFile;
21
+ private processEntities;
22
+ private buildDateFilter;
23
+ private clampImportance;
24
+ private estimateTokens;
25
+ }
26
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/services/memory.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAOtC,OAAO,EAAuC,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAIzF,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAgB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEzH,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,OAAO,CAAS;gBAEZ,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAE,MAAqB;IASjE,0BAA0B,IAAI,iBAAiB,GAAG,IAAI;IAIhD,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAgDnD,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAqDvD,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IA+BnD,UAAU,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA6BtF,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,cAAc;YAgBR,iBAAiB;IAM/B,OAAO,CAAC,mBAAmB;YAQb,eAAe;IAgD7B,OAAO,CAAC,eAAe;IA8BvB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,cAAc;CAKvB"}
@@ -0,0 +1,281 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ import { readFileSync } from 'fs';
3
+ import { writeFile, mkdir } from 'fs/promises';
4
+ import { dirname, join } from 'path';
5
+ import { MemoryRepository } from '../db/repository.js';
6
+ import { EntityRepository } from '../db/entityRepository.js';
7
+ import { calculateWeight, DEFAULT_TIME_DECAY } from './retrieval.js';
8
+ import { SummarizerService } from './summarizer.js';
9
+ import { generateSummaryWithLLM } from '../config/llm.js';
10
+ import { MetadataExtractor } from './metadataExtractor.js';
11
+ export class MemoryService {
12
+ db;
13
+ memoryRepo;
14
+ entityRepo;
15
+ summarizer;
16
+ extractor;
17
+ dataDir;
18
+ constructor(db, dataDir = './memories') {
19
+ this.db = db;
20
+ this.memoryRepo = new MemoryRepository(db);
21
+ this.entityRepo = new EntityRepository(db);
22
+ this.summarizer = new SummarizerService(db);
23
+ this.extractor = new MetadataExtractor();
24
+ this.dataDir = dataDir;
25
+ }
26
+ getLatestIntegratedSummary() {
27
+ return this.memoryRepo.getLatestIntegratedSummary();
28
+ }
29
+ async saveMemory(input) {
30
+ const { content, metadata } = input;
31
+ // 生成文件路径
32
+ const date = new Date();
33
+ const datePath = `${date.getFullYear()}/${String(date.getMonth() + 1).padStart(2, '0')}/${String(date.getDate()).padStart(2, '0')}`;
34
+ const fileName = `${uuidv4()}.md`;
35
+ const contentPath = join(this.dataDir, datePath, fileName);
36
+ // 保存内容到文件
37
+ await this.saveContentToFile(contentPath, content);
38
+ // 获取已有的整体摘要
39
+ const existingSummary = this.getLatestIntegratedSummary();
40
+ // 调用 LLM 提取元数据(传入已有摘要)
41
+ const extracted = content.trim()
42
+ ? await this.extractor.extract(content, existingSummary || undefined)
43
+ : { tags: [], keywords: [], subjects: [], importance: 0.5, summary: '', integratedSummary: existingSummary || { active_areas: [], key_topics: [], recent_summary: '' } };
44
+ // 合并:LLM 提取的覆盖用户传入的
45
+ const mergedMetadata = {
46
+ tags: extracted.tags,
47
+ keywords: extracted.keywords,
48
+ subjects: extracted.subjects,
49
+ importance: extracted.importance,
50
+ summary: extracted.summary,
51
+ ...metadata
52
+ };
53
+ // 创建记忆记录
54
+ const clampedImportance = this.clampImportance(mergedMetadata.importance);
55
+ const memoryInput = {
56
+ contentPath,
57
+ summary: mergedMetadata.summary || undefined,
58
+ integratedSummary: extracted.integratedSummary,
59
+ importance: clampedImportance ?? 0.5,
60
+ tokenCount: this.estimateTokens(content)
61
+ };
62
+ const memory = this.memoryRepo.create(memoryInput);
63
+ // 处理实体关联
64
+ await this.processEntities(memory.id, mergedMetadata);
65
+ return memory;
66
+ }
67
+ async searchMemory(options) {
68
+ const { query, timeRange, tags, limit = 10 } = options;
69
+ // 构建时间过滤条件
70
+ const dateFilter = this.buildDateFilter(timeRange);
71
+ // 获取所有候选记忆
72
+ let memories = this.memoryRepo.findAll(100);
73
+ // 应用查询过滤(如果提供了查询字符串)
74
+ if (query && query.trim() !== '') {
75
+ const searchTerm = query.toLowerCase();
76
+ memories = memories.filter(m => {
77
+ const summaryMatch = m.summary?.toLowerCase().includes(searchTerm);
78
+ // 读取内容文件进行匹配
79
+ let contentMatch = false;
80
+ try {
81
+ const content = this.readContentFromFile(m.contentPath);
82
+ contentMatch = content.toLowerCase().includes(searchTerm);
83
+ }
84
+ catch {
85
+ // 如果读取失败,忽略内容匹配
86
+ }
87
+ return summaryMatch || contentMatch;
88
+ });
89
+ }
90
+ // 应用时间过滤
91
+ if (dateFilter) {
92
+ memories = memories.filter(m => {
93
+ const created = m.createdAt.toISOString().split('T')[0];
94
+ return created >= dateFilter.start && created <= dateFilter.end;
95
+ });
96
+ }
97
+ // 计算权重并排序
98
+ const weightedMemories = memories.map(memory => ({
99
+ memory,
100
+ weight: calculateWeight({
101
+ entityMatch: 0,
102
+ timeDecay: DEFAULT_TIME_DECAY,
103
+ memoryDate: memory.createdAt.toISOString().split('T')[0],
104
+ tagMatch: 0,
105
+ importance: memory.importance
106
+ })
107
+ }));
108
+ // 按权重排序
109
+ weightedMemories.sort((a, b) => b.weight - a.weight);
110
+ // 返回结果
111
+ return weightedMemories.slice(0, limit).map(w => w.memory);
112
+ }
113
+ async getContext(input) {
114
+ const { query, maxTokens = 8000 } = input;
115
+ const memories = await this.searchMemory({
116
+ query,
117
+ limit: 20,
118
+ maxTokens
119
+ });
120
+ // 累积内容直到达到 token 限制
121
+ let totalTokens = 0;
122
+ const contextParts = [];
123
+ for (const memory of memories) {
124
+ const content = this.readContentFromFile(memory.contentPath);
125
+ const tokens = this.estimateTokens(content);
126
+ if (totalTokens + tokens > maxTokens) {
127
+ break;
128
+ }
129
+ contextParts.push(content);
130
+ totalTokens += tokens;
131
+ // 更新访问计数
132
+ this.memoryRepo.updateLastAccessed(memory.id);
133
+ }
134
+ return contextParts.join('\n\n---\n\n');
135
+ }
136
+ async getSummary(period, date) {
137
+ const targetDate = date ? new Date(date) : new Date();
138
+ const { startDate, endDate } = this.calculatePeriodRange(period, targetDate);
139
+ // 聚合数据
140
+ const report = await this.summarizer.aggregateMemories(startDate, endDate);
141
+ // 生成 LLM 总结
142
+ try {
143
+ const reportString = this.summarizer.reportToString(report);
144
+ report.summary = await generateSummaryWithLLM(reportString);
145
+ }
146
+ catch (error) {
147
+ console.warn('Failed to generate LLM summary:', error);
148
+ report.summary = '总结生成失败,请配置有效的 LLM API Key。';
149
+ }
150
+ // 保存到 time_buckets 表
151
+ this.saveTimeBucket(startDate, report);
152
+ return {
153
+ date: startDate,
154
+ memoryCount: report.basic.totalMemories,
155
+ summary: report.summary,
156
+ summaryGeneratedAt: new Date(),
157
+ keyTopics: report.topics.keyTopics,
158
+ createdAt: new Date()
159
+ };
160
+ }
161
+ calculatePeriodRange(period, date) {
162
+ const endDate = date.toISOString().split('T')[0];
163
+ const startDate = new Date(date);
164
+ switch (period) {
165
+ case 'day':
166
+ // 返回当天
167
+ break;
168
+ case 'week':
169
+ startDate.setDate(startDate.getDate() - 7);
170
+ break;
171
+ case 'month':
172
+ startDate.setMonth(startDate.getMonth() - 1);
173
+ break;
174
+ }
175
+ return {
176
+ startDate: startDate.toISOString().split('T')[0],
177
+ endDate
178
+ };
179
+ }
180
+ saveTimeBucket(date, report) {
181
+ const stmt = this.db.prepare(`
182
+ INSERT OR REPLACE INTO time_buckets (date, memory_count, summary, summary_generated_at, key_topics, created_at)
183
+ VALUES (?, ?, ?, ?, ?, ?)
184
+ `);
185
+ stmt.run(date, report.basic.totalMemories, report.summary, new Date().toISOString(), JSON.stringify(report.topics.keyTopics), new Date().toISOString());
186
+ }
187
+ async saveContentToFile(path, content) {
188
+ const dir = dirname(path);
189
+ await mkdir(dir, { recursive: true });
190
+ await writeFile(path, content, 'utf-8');
191
+ }
192
+ readContentFromFile(path) {
193
+ try {
194
+ return readFileSync(path, 'utf-8');
195
+ }
196
+ catch {
197
+ return '';
198
+ }
199
+ }
200
+ async processEntities(memoryId, metadata) {
201
+ // 处理标签
202
+ if (metadata.tags) {
203
+ for (const tag of metadata.tags) {
204
+ const entity = this.entityRepo.findOrCreate({
205
+ name: tag,
206
+ type: 'tag',
207
+ level: tag.split('/').length - 1
208
+ });
209
+ this.db.prepare(`
210
+ INSERT OR IGNORE INTO memory_entities (memory_id, entity_id, relevance)
211
+ VALUES (?, ?, ?)
212
+ `).run(memoryId, entity.id, 1.0);
213
+ }
214
+ }
215
+ // 处理主题
216
+ if (metadata.subjects) {
217
+ for (const subject of metadata.subjects) {
218
+ const entity = this.entityRepo.findOrCreate({
219
+ name: subject,
220
+ type: 'subject'
221
+ });
222
+ this.db.prepare(`
223
+ INSERT OR IGNORE INTO memory_entities (memory_id, entity_id, relevance)
224
+ VALUES (?, ?, ?)
225
+ `).run(memoryId, entity.id, 0.8);
226
+ }
227
+ }
228
+ // 处理关键词
229
+ if (metadata.keywords) {
230
+ for (const keyword of metadata.keywords) {
231
+ const entity = this.entityRepo.findOrCreate({
232
+ name: keyword,
233
+ type: 'keyword'
234
+ });
235
+ this.db.prepare(`
236
+ INSERT OR IGNORE INTO memory_entities (memory_id, entity_id, relevance)
237
+ VALUES (?, ?, ?)
238
+ `).run(memoryId, entity.id, 0.6);
239
+ }
240
+ }
241
+ }
242
+ buildDateFilter(timeRange) {
243
+ if (!timeRange || timeRange === 'all')
244
+ return null;
245
+ const now = new Date();
246
+ const end = now.toISOString().split('T')[0];
247
+ let start;
248
+ switch (timeRange) {
249
+ case 'today':
250
+ start = end;
251
+ break;
252
+ case 'week':
253
+ now.setDate(now.getDate() - 7);
254
+ start = now.toISOString().split('T')[0];
255
+ break;
256
+ case 'month':
257
+ now.setMonth(now.getMonth() - 1);
258
+ start = now.toISOString().split('T')[0];
259
+ break;
260
+ case 'year':
261
+ now.setFullYear(now.getFullYear() - 1);
262
+ start = now.toISOString().split('T')[0];
263
+ break;
264
+ default:
265
+ return null;
266
+ }
267
+ return { start, end };
268
+ }
269
+ clampImportance(value) {
270
+ if (value === undefined) {
271
+ return undefined;
272
+ }
273
+ return Math.max(0, Math.min(1, value));
274
+ }
275
+ estimateTokens(text) {
276
+ const chineseChars = (text.match(/[\u4e00-\u9fa5]/g) || []).length;
277
+ const otherChars = text.length - chineseChars;
278
+ return Math.ceil(chineseChars / 1.5 + otherChars / 4);
279
+ }
280
+ }
281
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/services/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import Database from 'better-sqlite3';
2
+ import type { IntegratedSummary } from '../types.js';
3
+ export interface MemoryIndexOptions {
4
+ period: 'day' | 'week' | 'month';
5
+ date?: string;
6
+ includeTodos?: boolean;
7
+ includeRecent?: boolean;
8
+ recentLimit?: number;
9
+ }
10
+ export interface MemoryIndex {
11
+ period: {
12
+ start: string;
13
+ end: string;
14
+ };
15
+ activeAreas: {
16
+ tags: {
17
+ name: string;
18
+ count: number;
19
+ }[];
20
+ keywords: string[];
21
+ };
22
+ todos: {
23
+ id: string;
24
+ content: string;
25
+ period: string;
26
+ }[];
27
+ recentActivity: {
28
+ date: string;
29
+ summary: string;
30
+ }[];
31
+ integratedSummary?: IntegratedSummary;
32
+ }
33
+ export declare function getMemoryIndex(db: Database.Database, options: MemoryIndexOptions): Promise<MemoryIndex>;
34
+ //# sourceMappingURL=memoryIndex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryIndex.d.ts","sourceRoot":"","sources":["../../src/services/memoryIndex.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAItC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,WAAW,EAAE;QACX,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACxC,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzD,cAAc,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACpD,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAgC7G"}