@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.
- package/.claude/settings.local.json +68 -0
- package/README.md +323 -0
- package/dist/config/llm.d.ts +13 -0
- package/dist/config/llm.d.ts.map +1 -0
- package/dist/config/llm.js +96 -0
- package/dist/config/llm.js.map +1 -0
- package/dist/config/plugin.d.ts +15 -0
- package/dist/config/plugin.d.ts.map +1 -0
- package/dist/config/plugin.js +32 -0
- package/dist/config/plugin.js.map +1 -0
- package/dist/db/entityRepository.d.ts +21 -0
- package/dist/db/entityRepository.d.ts.map +1 -0
- package/dist/db/entityRepository.js +55 -0
- package/dist/db/entityRepository.js.map +1 -0
- package/dist/db/repository.d.ts +22 -0
- package/dist/db/repository.d.ts.map +1 -0
- package/dist/db/repository.js +77 -0
- package/dist/db/repository.js.map +1 -0
- package/dist/db/schema.d.ts +5 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +112 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/todoRepository.d.ts +26 -0
- package/dist/db/todoRepository.d.ts.map +1 -0
- package/dist/db/todoRepository.js +54 -0
- package/dist/db/todoRepository.js.map +1 -0
- package/dist/hooks/bootstrap.d.ts +3 -0
- package/dist/hooks/bootstrap.d.ts.map +1 -0
- package/dist/hooks/bootstrap.js +28 -0
- package/dist/hooks/bootstrap.js.map +1 -0
- package/dist/hooks/message.d.ts +18 -0
- package/dist/hooks/message.d.ts.map +1 -0
- package/dist/hooks/message.js +52 -0
- package/dist/hooks/message.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/tools.d.ts +26 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +360 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/plugin.d.ts +18 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +62 -0
- package/dist/plugin.js.map +1 -0
- package/dist/services/entityGraphService.d.ts +87 -0
- package/dist/services/entityGraphService.d.ts.map +1 -0
- package/dist/services/entityGraphService.js +271 -0
- package/dist/services/entityGraphService.js.map +1 -0
- package/dist/services/memory.d.ts +26 -0
- package/dist/services/memory.d.ts.map +1 -0
- package/dist/services/memory.js +281 -0
- package/dist/services/memory.js.map +1 -0
- package/dist/services/memoryIndex.d.ts +34 -0
- package/dist/services/memoryIndex.d.ts.map +1 -0
- package/dist/services/memoryIndex.js +100 -0
- package/dist/services/memoryIndex.js.map +1 -0
- package/dist/services/metadataExtractor.d.ts +16 -0
- package/dist/services/metadataExtractor.d.ts.map +1 -0
- package/dist/services/metadataExtractor.js +75 -0
- package/dist/services/metadataExtractor.js.map +1 -0
- package/dist/services/retrieval.d.ts +24 -0
- package/dist/services/retrieval.d.ts.map +1 -0
- package/dist/services/retrieval.js +40 -0
- package/dist/services/retrieval.js.map +1 -0
- package/dist/services/scheduler.d.ts +122 -0
- package/dist/services/scheduler.d.ts.map +1 -0
- package/dist/services/scheduler.js +434 -0
- package/dist/services/scheduler.js.map +1 -0
- package/dist/services/summarizer.d.ts +43 -0
- package/dist/services/summarizer.d.ts.map +1 -0
- package/dist/services/summarizer.js +252 -0
- package/dist/services/summarizer.js.map +1 -0
- package/dist/services/tagService.d.ts +64 -0
- package/dist/services/tagService.d.ts.map +1 -0
- package/dist/services/tagService.js +281 -0
- package/dist/services/tagService.js.map +1 -0
- package/dist/tools/memory.d.ts +3 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +114 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/types.d.ts +128 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/docs/plans/2026-03-02-claw-memory-design.md +445 -0
- package/docs/plans/2026-03-02-incremental-summary-design.md +157 -0
- package/docs/plans/2026-03-02-incremental-summary-implementation.md +468 -0
- package/docs/plans/2026-03-02-memory-index-design.md +163 -0
- package/docs/plans/2026-03-02-memory-index-implementation.md +836 -0
- package/docs/plans/2026-03-02-mvp-implementation.md +1703 -0
- package/docs/plans/2026-03-02-testing-implementation.md +395 -0
- package/docs/plans/2026-03-02-testing-plan.md +93 -0
- package/docs/plans/2026-03-03-claw-memory-openclaw-plugin-design.md +285 -0
- package/docs/plans/2026-03-03-claw-memory-plugin-implementation.md +642 -0
- package/docs/plans/2026-03-03-entity-graph-design.md +121 -0
- package/docs/plans/2026-03-03-entity-graph-implementation.md +687 -0
- package/docs/plans/2026-03-03-llm-generic-config-design.md +43 -0
- package/docs/plans/2026-03-03-llm-generic-config-implementation.md +186 -0
- package/docs/plans/2026-03-03-memory-e2e-stress-test-design.md +110 -0
- package/docs/plans/2026-03-03-memory-e2e-stress-test-implementation.md +464 -0
- package/docs/plans/2026-03-03-minimax-llm-fix.md +156 -0
- package/docs/plans/2026-03-03-scheduler-design.md +165 -0
- package/docs/plans/2026-03-03-scheduler-implementation.md +777 -0
- package/docs/plans/2026-03-03-tags-visualization-design.md +73 -0
- package/docs/plans/2026-03-03-tags-visualization-implementation.md +539 -0
- package/openclaw.plugin.json +11 -0
- package/package.json +41 -0
- package/src/config/llm.ts +129 -0
- package/src/config/plugin.ts +47 -0
- package/src/db/entityRepository.ts +80 -0
- package/src/db/repository.ts +106 -0
- package/src/db/schema.ts +121 -0
- package/src/db/todoRepository.ts +76 -0
- package/src/hooks/bootstrap.ts +36 -0
- package/src/hooks/message.ts +84 -0
- package/src/index.ts +50 -0
- package/src/plugin.ts +85 -0
- package/src/services/entityGraphService.ts +367 -0
- package/src/services/memory.ts +338 -0
- package/src/services/memoryIndex.ts +140 -0
- package/src/services/metadataExtractor.ts +89 -0
- package/src/services/retrieval.ts +71 -0
- package/src/services/scheduler.ts +529 -0
- package/src/services/summarizer.ts +318 -0
- package/src/services/tagService.ts +335 -0
- package/src/tools/memory.ts +137 -0
- package/src/types.ts +139 -0
- package/tsconfig.json +20 -0
- 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"}
|