engram-sdk 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 (69) hide show
  1. package/CONTRIBUTING.md +65 -0
  2. package/Dockerfile +21 -0
  3. package/EVAL-FRAMEWORK.md +70 -0
  4. package/EVAL.md +127 -0
  5. package/LICENSE +17 -0
  6. package/README.md +309 -0
  7. package/ROADMAP.md +113 -0
  8. package/deploy/fly.toml +26 -0
  9. package/dist/auto-ingest.d.ts +3 -0
  10. package/dist/auto-ingest.d.ts.map +1 -0
  11. package/dist/auto-ingest.js +334 -0
  12. package/dist/auto-ingest.js.map +1 -0
  13. package/dist/brief.d.ts +45 -0
  14. package/dist/brief.d.ts.map +1 -0
  15. package/dist/brief.js +183 -0
  16. package/dist/brief.js.map +1 -0
  17. package/dist/claude-watcher.d.ts +3 -0
  18. package/dist/claude-watcher.d.ts.map +1 -0
  19. package/dist/claude-watcher.js +385 -0
  20. package/dist/claude-watcher.js.map +1 -0
  21. package/dist/cli.d.ts +3 -0
  22. package/dist/cli.d.ts.map +1 -0
  23. package/dist/cli.js +764 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/embeddings.d.ts +42 -0
  26. package/dist/embeddings.d.ts.map +1 -0
  27. package/dist/embeddings.js +145 -0
  28. package/dist/embeddings.js.map +1 -0
  29. package/dist/eval.d.ts +2 -0
  30. package/dist/eval.d.ts.map +1 -0
  31. package/dist/eval.js +281 -0
  32. package/dist/eval.js.map +1 -0
  33. package/dist/extract.d.ts +11 -0
  34. package/dist/extract.d.ts.map +1 -0
  35. package/dist/extract.js +139 -0
  36. package/dist/extract.js.map +1 -0
  37. package/dist/hosted.d.ts +3 -0
  38. package/dist/hosted.d.ts.map +1 -0
  39. package/dist/hosted.js +144 -0
  40. package/dist/hosted.js.map +1 -0
  41. package/dist/index.d.ts +11 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +7 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/ingest.d.ts +28 -0
  46. package/dist/ingest.d.ts.map +1 -0
  47. package/dist/ingest.js +192 -0
  48. package/dist/ingest.js.map +1 -0
  49. package/dist/mcp.d.ts +3 -0
  50. package/dist/mcp.d.ts.map +1 -0
  51. package/dist/mcp.js +349 -0
  52. package/dist/mcp.js.map +1 -0
  53. package/dist/server.d.ts +17 -0
  54. package/dist/server.d.ts.map +1 -0
  55. package/dist/server.js +515 -0
  56. package/dist/server.js.map +1 -0
  57. package/dist/store.d.ts +87 -0
  58. package/dist/store.d.ts.map +1 -0
  59. package/dist/store.js +548 -0
  60. package/dist/store.js.map +1 -0
  61. package/dist/types.d.ts +204 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/dist/types.js +77 -0
  64. package/dist/types.js.map +1 -0
  65. package/dist/vault.d.ts +116 -0
  66. package/dist/vault.d.ts.map +1 -0
  67. package/dist/vault.js +1234 -0
  68. package/dist/vault.js.map +1 -0
  69. package/package.json +61 -0
package/dist/store.js ADDED
@@ -0,0 +1,548 @@
1
+ import Database from 'better-sqlite3';
2
+ import { v4 as uuid } from 'uuid';
3
+ import * as sqliteVec from 'sqlite-vec';
4
+ // ============================================================
5
+ // SQLite Storage Layer for Engram
6
+ // ============================================================
7
+ export class MemoryStore {
8
+ db;
9
+ vecEnabled = false;
10
+ embeddingDimensions = 0;
11
+ constructor(dbPath, embeddingDimensions) {
12
+ this.db = new Database(dbPath);
13
+ this.db.pragma('journal_mode = WAL');
14
+ this.db.pragma('foreign_keys = ON');
15
+ // Load sqlite-vec extension
16
+ if (embeddingDimensions && embeddingDimensions > 0) {
17
+ try {
18
+ sqliteVec.load(this.db);
19
+ this.vecEnabled = true;
20
+ this.embeddingDimensions = embeddingDimensions;
21
+ }
22
+ catch (err) {
23
+ console.warn('sqlite-vec extension not available, falling back to non-vector search:', err.message);
24
+ }
25
+ }
26
+ this.migrate();
27
+ }
28
+ // --------------------------------------------------------
29
+ // Schema Migration
30
+ // --------------------------------------------------------
31
+ migrate() {
32
+ this.db.exec(`
33
+ CREATE TABLE IF NOT EXISTS memories (
34
+ id TEXT PRIMARY KEY,
35
+ type TEXT NOT NULL CHECK(type IN ('episodic', 'semantic', 'procedural')),
36
+ content TEXT NOT NULL,
37
+ summary TEXT NOT NULL,
38
+
39
+ -- Provenance
40
+ source_type TEXT NOT NULL,
41
+ source_session_id TEXT,
42
+ source_agent_id TEXT,
43
+ source_evidence TEXT, -- JSON array of memory IDs
44
+ source_timestamp TEXT NOT NULL,
45
+
46
+ -- Temporal
47
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
48
+ last_accessed_at TEXT NOT NULL DEFAULT (datetime('now')),
49
+ last_modified_at TEXT NOT NULL DEFAULT (datetime('now')),
50
+ access_count INTEGER NOT NULL DEFAULT 0,
51
+ expires_at TEXT,
52
+
53
+ -- Weight & Trust
54
+ salience REAL NOT NULL DEFAULT 0.5,
55
+ confidence REAL NOT NULL DEFAULT 0.8,
56
+ stability REAL NOT NULL DEFAULT 1.0,
57
+
58
+ -- Semantic Anchors
59
+ entities TEXT NOT NULL DEFAULT '[]', -- JSON array
60
+ topics TEXT NOT NULL DEFAULT '[]', -- JSON array
61
+
62
+ -- Lifecycle
63
+ status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'pending', 'fulfilled', 'superseded', 'archived')),
64
+
65
+ -- Access Control
66
+ visibility TEXT NOT NULL DEFAULT 'owner_agents',
67
+
68
+ -- Embedding
69
+ embedding BLOB
70
+ );
71
+
72
+ CREATE TABLE IF NOT EXISTS edges (
73
+ id TEXT PRIMARY KEY,
74
+ source_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
75
+ target_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
76
+ type TEXT NOT NULL,
77
+ strength REAL NOT NULL DEFAULT 0.5,
78
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
79
+ );
80
+
81
+ CREATE TABLE IF NOT EXISTS entities (
82
+ id TEXT PRIMARY KEY,
83
+ name TEXT NOT NULL,
84
+ type TEXT NOT NULL DEFAULT 'concept',
85
+ aliases TEXT NOT NULL DEFAULT '[]', -- JSON array
86
+ properties TEXT NOT NULL DEFAULT '{}', -- JSON object
87
+ first_seen TEXT NOT NULL DEFAULT (datetime('now')),
88
+ last_seen TEXT NOT NULL DEFAULT (datetime('now')),
89
+ memory_count INTEGER NOT NULL DEFAULT 0,
90
+ importance REAL NOT NULL DEFAULT 0.5
91
+ );
92
+
93
+ -- Indices for fast retrieval
94
+ CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(type);
95
+ CREATE INDEX IF NOT EXISTS idx_memories_salience ON memories(salience DESC);
96
+ CREATE INDEX IF NOT EXISTS idx_memories_created ON memories(created_at DESC);
97
+ CREATE INDEX IF NOT EXISTS idx_memories_accessed ON memories(last_accessed_at DESC);
98
+ CREATE INDEX IF NOT EXISTS idx_memories_stability ON memories(stability);
99
+ CREATE INDEX IF NOT EXISTS idx_edges_source ON edges(source_id);
100
+ CREATE INDEX IF NOT EXISTS idx_edges_target ON edges(target_id);
101
+ CREATE INDEX IF NOT EXISTS idx_edges_type ON edges(type);
102
+ CREATE INDEX IF NOT EXISTS idx_entities_name ON entities(name);
103
+ `);
104
+ // Create vector virtual table if sqlite-vec is loaded
105
+ if (this.vecEnabled && this.embeddingDimensions > 0) {
106
+ this.db.exec(`
107
+ CREATE VIRTUAL TABLE IF NOT EXISTS vec_memories USING vec0(
108
+ memory_id TEXT PRIMARY KEY,
109
+ embedding float[${this.embeddingDimensions}]
110
+ );
111
+ `);
112
+ }
113
+ }
114
+ // --------------------------------------------------------
115
+ // Memory CRUD
116
+ // --------------------------------------------------------
117
+ createMemory(input) {
118
+ const now = new Date().toISOString();
119
+ const id = uuid();
120
+ const summary = input.summary ?? input.content.slice(0, 120) + (input.content.length > 120 ? '...' : '');
121
+ const memory = {
122
+ id,
123
+ type: input.type ?? 'episodic',
124
+ content: input.content,
125
+ summary,
126
+ source: {
127
+ type: input.source?.type ?? 'conversation',
128
+ sessionId: input.source?.sessionId,
129
+ agentId: input.source?.agentId,
130
+ evidence: input.source?.evidence,
131
+ timestamp: now,
132
+ },
133
+ createdAt: now,
134
+ lastAccessedAt: now,
135
+ lastModifiedAt: now,
136
+ accessCount: 0,
137
+ expiresAt: input.expiresAt,
138
+ salience: input.salience ?? 0.5,
139
+ confidence: input.confidence ?? 0.8,
140
+ stability: 1.0,
141
+ entities: input.entities ?? [],
142
+ topics: input.topics ?? [],
143
+ status: input.status ?? 'active',
144
+ visibility: input.visibility ?? 'owner_agents',
145
+ };
146
+ this.db.prepare(`
147
+ INSERT INTO memories (
148
+ id, type, content, summary,
149
+ source_type, source_session_id, source_agent_id, source_evidence, source_timestamp,
150
+ created_at, last_accessed_at, last_modified_at, access_count, expires_at,
151
+ salience, confidence, stability,
152
+ entities, topics, status, visibility
153
+ ) VALUES (
154
+ ?, ?, ?, ?,
155
+ ?, ?, ?, ?, ?,
156
+ ?, ?, ?, ?, ?,
157
+ ?, ?, ?,
158
+ ?, ?, ?, ?
159
+ )
160
+ `).run(memory.id, memory.type, memory.content, memory.summary, memory.source.type, memory.source.sessionId ?? null, memory.source.agentId ?? null, JSON.stringify(memory.source.evidence ?? []), memory.source.timestamp, memory.createdAt, memory.lastAccessedAt, memory.lastModifiedAt, memory.accessCount, memory.expiresAt ?? null, memory.salience, memory.confidence, memory.stability, JSON.stringify(memory.entities), JSON.stringify(memory.topics), memory.status, memory.visibility);
161
+ // Auto-discover/update entities
162
+ for (const entityName of memory.entities) {
163
+ this.upsertEntity(entityName, memory.type === 'episodic' ? 'unknown' : 'concept');
164
+ }
165
+ return memory;
166
+ }
167
+ getMemory(id) {
168
+ const row = this.db.prepare('SELECT * FROM memories WHERE id = ?').get(id);
169
+ if (!row)
170
+ return null;
171
+ // Update access stats
172
+ this.db.prepare(`
173
+ UPDATE memories
174
+ SET last_accessed_at = datetime('now'), access_count = access_count + 1, stability = MIN(stability * 1.05, 10.0)
175
+ WHERE id = ?
176
+ `).run(id);
177
+ return this.rowToMemory(row);
178
+ }
179
+ /** Read a memory without updating access stats (for graph traversal, activation spreading) */
180
+ getMemoryDirect(id) {
181
+ const row = this.db.prepare('SELECT * FROM memories WHERE id = ?').get(id);
182
+ if (!row)
183
+ return null;
184
+ return this.rowToMemory(row);
185
+ }
186
+ /** Get all memories by a list of IDs without updating access stats */
187
+ getMemoriesDirect(ids) {
188
+ if (ids.length === 0)
189
+ return [];
190
+ const placeholders = ids.map(() => '?').join(',');
191
+ const rows = this.db.prepare(`SELECT * FROM memories WHERE id IN (${placeholders})`).all(...ids);
192
+ return rows.map(r => this.rowToMemory(r));
193
+ }
194
+ updateMemory(id, updates) {
195
+ const sets = [];
196
+ const values = [];
197
+ if (updates.content !== undefined) {
198
+ sets.push('content = ?');
199
+ values.push(updates.content);
200
+ }
201
+ if (updates.summary !== undefined) {
202
+ sets.push('summary = ?');
203
+ values.push(updates.summary);
204
+ }
205
+ if (updates.salience !== undefined) {
206
+ sets.push('salience = ?');
207
+ values.push(updates.salience);
208
+ }
209
+ if (updates.confidence !== undefined) {
210
+ sets.push('confidence = ?');
211
+ values.push(updates.confidence);
212
+ }
213
+ if (updates.entities !== undefined) {
214
+ sets.push('entities = ?');
215
+ values.push(JSON.stringify(updates.entities));
216
+ }
217
+ if (updates.topics !== undefined) {
218
+ sets.push('topics = ?');
219
+ values.push(JSON.stringify(updates.topics));
220
+ }
221
+ if (sets.length === 0)
222
+ return;
223
+ sets.push("last_modified_at = datetime('now')");
224
+ values.push(id);
225
+ this.db.prepare(`UPDATE memories SET ${sets.join(', ')} WHERE id = ?`).run(...values);
226
+ }
227
+ /** Update a memory's status (active, pending, fulfilled, superseded, archived) */
228
+ updateStatus(id, status) {
229
+ this.db.prepare(`UPDATE memories SET status = ?, last_modified_at = datetime('now') WHERE id = ?`).run(status, id);
230
+ }
231
+ deleteMemory(id) {
232
+ this.db.prepare('DELETE FROM memories WHERE id = ?').run(id);
233
+ }
234
+ // --------------------------------------------------------
235
+ // Retrieval
236
+ // --------------------------------------------------------
237
+ /** Get recent memories, ordered by creation time */
238
+ getRecent(limit = 20) {
239
+ const rows = this.db.prepare('SELECT * FROM memories ORDER BY created_at DESC LIMIT ?').all(limit);
240
+ return rows.map(r => this.rowToMemory(r));
241
+ }
242
+ /** Get memories by entity */
243
+ getByEntity(entityName, limit = 20) {
244
+ const rows = this.db.prepare(`SELECT * FROM memories WHERE entities LIKE ? ORDER BY salience DESC, created_at DESC LIMIT ?`).all(`%"${entityName}"%`, limit);
245
+ return rows.map(r => this.rowToMemory(r));
246
+ }
247
+ /** Get memories by topic */
248
+ getByTopic(topic, limit = 20) {
249
+ const rows = this.db.prepare(`SELECT * FROM memories WHERE topics LIKE ? ORDER BY salience DESC, created_at DESC LIMIT ?`).all(`%"${topic}"%`, limit);
250
+ return rows.map(r => this.rowToMemory(r));
251
+ }
252
+ /** Get memories by status */
253
+ getByStatus(status, limit = 20) {
254
+ const rows = this.db.prepare('SELECT * FROM memories WHERE status = ? ORDER BY salience DESC, created_at DESC LIMIT ?').all(status, limit);
255
+ return rows.map(r => this.rowToMemory(r));
256
+ }
257
+ /** Get memories by type */
258
+ getByType(type, limit = 20) {
259
+ const rows = this.db.prepare('SELECT * FROM memories WHERE type = ? ORDER BY salience DESC, created_at DESC LIMIT ?').all(type, limit);
260
+ return rows.map(r => this.rowToMemory(r));
261
+ }
262
+ /** Full-text search on content */
263
+ search(query, limit = 20) {
264
+ const rows = this.db.prepare(`SELECT * FROM memories WHERE content LIKE ? ORDER BY salience DESC, created_at DESC LIMIT ?`).all(`%${query}%`, limit);
265
+ return rows.map(r => this.rowToMemory(r));
266
+ }
267
+ /** Get all memories (for consolidation) */
268
+ getEpisodicSince(since, limit = 500) {
269
+ const rows = this.db.prepare(`SELECT * FROM memories WHERE type = 'episodic' AND created_at >= ? ORDER BY created_at ASC LIMIT ?`).all(since, limit);
270
+ return rows.map(r => this.rowToMemory(r));
271
+ }
272
+ /** Get memories below stability threshold (candidates for archival) */
273
+ getDecayedMemories(threshold = 0.05) {
274
+ const rows = this.db.prepare('SELECT * FROM memories WHERE stability < ? AND type != \'procedural\' ORDER BY stability ASC').all(threshold);
275
+ return rows.map(r => this.rowToMemory(r));
276
+ }
277
+ /** Count memories by type */
278
+ getStats() {
279
+ const counts = this.db.prepare(`
280
+ SELECT
281
+ COUNT(*) as total,
282
+ SUM(CASE WHEN type = 'episodic' THEN 1 ELSE 0 END) as episodic,
283
+ SUM(CASE WHEN type = 'semantic' THEN 1 ELSE 0 END) as semantic,
284
+ SUM(CASE WHEN type = 'procedural' THEN 1 ELSE 0 END) as procedural
285
+ FROM memories
286
+ `).get();
287
+ const entityCount = this.db.prepare('SELECT COUNT(*) as count FROM entities').get();
288
+ return { ...counts, entities: entityCount.count };
289
+ }
290
+ // --------------------------------------------------------
291
+ // Edges
292
+ // --------------------------------------------------------
293
+ createEdge(sourceId, targetId, type, strength = 0.5) {
294
+ const id = uuid();
295
+ const now = new Date().toISOString();
296
+ this.db.prepare(`
297
+ INSERT INTO edges (id, source_id, target_id, type, strength, created_at)
298
+ VALUES (?, ?, ?, ?, ?, ?)
299
+ `).run(id, sourceId, targetId, type, strength, now);
300
+ return { id, sourceId, targetId, type: type, strength, createdAt: now };
301
+ }
302
+ getEdgesFrom(memoryId) {
303
+ const rows = this.db.prepare('SELECT * FROM edges WHERE source_id = ?').all(memoryId);
304
+ return rows.map(r => this.rowToEdge(r));
305
+ }
306
+ getEdgesTo(memoryId) {
307
+ const rows = this.db.prepare('SELECT * FROM edges WHERE target_id = ?').all(memoryId);
308
+ return rows.map(r => this.rowToEdge(r));
309
+ }
310
+ /** Get all edges connected to a memory (both directions) */
311
+ getEdgesBidirectional(memoryId) {
312
+ const rows = this.db.prepare('SELECT * FROM edges WHERE source_id = ? OR target_id = ?').all(memoryId, memoryId);
313
+ return rows.map(r => this.rowToEdge(r));
314
+ }
315
+ /** Batch: get all edges for a set of memory IDs (both directions) */
316
+ getEdgesForMemories(memoryIds) {
317
+ if (memoryIds.length === 0)
318
+ return [];
319
+ const placeholders = memoryIds.map(() => '?').join(',');
320
+ const rows = this.db.prepare(`SELECT * FROM edges WHERE source_id IN (${placeholders}) OR target_id IN (${placeholders})`).all(...memoryIds, ...memoryIds);
321
+ return rows.map(r => this.rowToEdge(r));
322
+ }
323
+ /** Get memories that share entities with the given memory */
324
+ getCoEntityMemories(memoryId, limit = 20) {
325
+ const source = this.getMemoryDirect(memoryId);
326
+ if (!source || source.entities.length === 0)
327
+ return [];
328
+ const results = new Map();
329
+ for (const entity of source.entities) {
330
+ const rows = this.db.prepare(`SELECT * FROM memories WHERE id != ? AND entities LIKE ? ORDER BY salience DESC LIMIT ?`).all(memoryId, `%"${entity}"%`, limit);
331
+ for (const row of rows) {
332
+ const mem = this.rowToMemory(row);
333
+ const existing = results.get(mem.id);
334
+ if (existing) {
335
+ existing.sharedEntities.push(entity);
336
+ }
337
+ else {
338
+ results.set(mem.id, { memory: mem, sharedEntities: [entity] });
339
+ }
340
+ }
341
+ }
342
+ return [...results.values()]
343
+ .sort((a, b) => b.sharedEntities.length - a.sharedEntities.length)
344
+ .slice(0, limit);
345
+ }
346
+ getNeighbors(memoryId, depth = 1) {
347
+ if (depth < 1)
348
+ return [];
349
+ const neighborIds = new Set();
350
+ const queue = [memoryId];
351
+ for (let d = 0; d < depth; d++) {
352
+ const nextQueue = [];
353
+ for (const id of queue) {
354
+ const edges = [...this.getEdgesFrom(id), ...this.getEdgesTo(id)];
355
+ for (const edge of edges) {
356
+ const neighborId = edge.sourceId === id ? edge.targetId : edge.sourceId;
357
+ if (!neighborIds.has(neighborId) && neighborId !== memoryId) {
358
+ neighborIds.add(neighborId);
359
+ nextQueue.push(neighborId);
360
+ }
361
+ }
362
+ }
363
+ queue.length = 0;
364
+ queue.push(...nextQueue);
365
+ }
366
+ return [...neighborIds]
367
+ .map(id => this.getMemory(id))
368
+ .filter((m) => m !== null);
369
+ }
370
+ // --------------------------------------------------------
371
+ // Entities
372
+ // --------------------------------------------------------
373
+ upsertEntity(name, type = 'concept') {
374
+ const existing = this.db.prepare('SELECT * FROM entities WHERE name = ? OR aliases LIKE ?').get(name, `%"${name}"%`);
375
+ if (existing) {
376
+ this.db.prepare(`
377
+ UPDATE entities
378
+ SET last_seen = datetime('now'), memory_count = memory_count + 1
379
+ WHERE id = ?
380
+ `).run(existing.id);
381
+ return this.rowToEntity(existing);
382
+ }
383
+ const id = uuid();
384
+ const now = new Date().toISOString();
385
+ this.db.prepare(`
386
+ INSERT INTO entities (id, name, type, aliases, properties, first_seen, last_seen, memory_count, importance)
387
+ VALUES (?, ?, ?, '[]', '{}', ?, ?, 1, 0.5)
388
+ `).run(id, name, type, now, now);
389
+ return { id, name, type, aliases: [], properties: {}, firstSeen: now, lastSeen: now, memoryCount: 1, importance: 0.5 };
390
+ }
391
+ getEntity(name) {
392
+ const row = this.db.prepare('SELECT * FROM entities WHERE name = ? OR aliases LIKE ?').get(name, `%"${name}"%`);
393
+ return row ? this.rowToEntity(row) : null;
394
+ }
395
+ getAllEntities() {
396
+ const rows = this.db.prepare('SELECT * FROM entities ORDER BY importance DESC, memory_count DESC').all();
397
+ return rows.map(r => this.rowToEntity(r));
398
+ }
399
+ // --------------------------------------------------------
400
+ // Vector Search
401
+ // --------------------------------------------------------
402
+ /** Store an embedding for a memory */
403
+ storeEmbedding(memoryId, embedding) {
404
+ if (!this.vecEnabled)
405
+ return;
406
+ // Convert to Float32Array buffer for sqlite-vec
407
+ const buf = new Float32Array(embedding).buffer;
408
+ // vec0 virtual tables don't support INSERT OR REPLACE
409
+ // Delete first, then insert
410
+ this.db.prepare('DELETE FROM vec_memories WHERE memory_id = ?').run(memoryId);
411
+ this.db.prepare(`
412
+ INSERT INTO vec_memories (memory_id, embedding)
413
+ VALUES (?, ?)
414
+ `).run(memoryId, Buffer.from(buf));
415
+ }
416
+ /** Find nearest neighbors by embedding vector */
417
+ searchByVector(embedding, limit = 20) {
418
+ if (!this.vecEnabled)
419
+ return [];
420
+ const buf = new Float32Array(embedding).buffer;
421
+ const rows = this.db.prepare(`
422
+ SELECT memory_id, distance
423
+ FROM vec_memories
424
+ WHERE embedding MATCH ?
425
+ ORDER BY distance
426
+ LIMIT ?
427
+ `).all(Buffer.from(buf), limit);
428
+ return rows.map(r => ({ memoryId: r.memory_id, distance: r.distance }));
429
+ }
430
+ /** Check if vector search is available */
431
+ hasVectorSearch() {
432
+ return this.vecEnabled;
433
+ }
434
+ /** Get the stored embedding for a memory (for dedup checks) */
435
+ getEmbedding(memoryId) {
436
+ if (!this.vecEnabled)
437
+ return null;
438
+ try {
439
+ const row = this.db.prepare('SELECT embedding FROM vec_memories WHERE memory_id = ?').get(memoryId);
440
+ if (!row)
441
+ return null;
442
+ return Array.from(new Float32Array(row.embedding.buffer, row.embedding.byteOffset, row.embedding.byteLength / 4));
443
+ }
444
+ catch {
445
+ return null;
446
+ }
447
+ }
448
+ /** Find memories with very high semantic similarity (for dedup) */
449
+ findSimilar(embedding, threshold = 0.12, limit = 3) {
450
+ if (!this.vecEnabled)
451
+ return [];
452
+ const results = this.searchByVector(embedding, limit);
453
+ // distance is cosine distance; similarity = 1 - distance
454
+ return results
455
+ .filter(r => r.distance <= threshold)
456
+ .map(r => ({ ...r, similarity: 1 - r.distance }));
457
+ }
458
+ // --------------------------------------------------------
459
+ // Decay
460
+ // --------------------------------------------------------
461
+ /** Apply time-based decay to all memories */
462
+ applyDecay(halfLifeHours = 168) {
463
+ const now = Date.now();
464
+ let decayed = 0;
465
+ const memories = this.db.prepare('SELECT id, last_accessed_at, stability FROM memories').all();
466
+ const update = this.db.prepare('UPDATE memories SET stability = ? WHERE id = ?');
467
+ const transaction = this.db.transaction(() => {
468
+ for (const mem of memories) {
469
+ const lastAccessed = new Date(mem.last_accessed_at).getTime();
470
+ const hoursSince = (now - lastAccessed) / (1000 * 60 * 60);
471
+ const decayRate = Math.log(2) / halfLifeHours;
472
+ const newStability = mem.stability * Math.exp(-decayRate * hoursSince);
473
+ if (Math.abs(newStability - mem.stability) > 0.001) {
474
+ update.run(Math.max(newStability, 0.001), mem.id);
475
+ decayed++;
476
+ }
477
+ }
478
+ });
479
+ transaction();
480
+ return decayed;
481
+ }
482
+ // --------------------------------------------------------
483
+ // Export / Import
484
+ // --------------------------------------------------------
485
+ exportAll() {
486
+ const memories = this.db.prepare('SELECT * FROM memories').all().map(r => this.rowToMemory(r));
487
+ const edges = this.db.prepare('SELECT * FROM edges').all().map(r => this.rowToEdge(r));
488
+ const entities = this.db.prepare('SELECT * FROM entities').all().map(r => this.rowToEntity(r));
489
+ return { memories, edges, entities };
490
+ }
491
+ // --------------------------------------------------------
492
+ // Internal helpers
493
+ // --------------------------------------------------------
494
+ rowToMemory(row) {
495
+ return {
496
+ id: row.id,
497
+ type: row.type,
498
+ content: row.content,
499
+ summary: row.summary,
500
+ source: {
501
+ type: row.source_type,
502
+ sessionId: row.source_session_id ?? undefined,
503
+ agentId: row.source_agent_id ?? undefined,
504
+ evidence: row.source_evidence ? JSON.parse(row.source_evidence) : undefined,
505
+ timestamp: row.source_timestamp,
506
+ },
507
+ createdAt: row.created_at,
508
+ lastAccessedAt: row.last_accessed_at,
509
+ lastModifiedAt: row.last_modified_at,
510
+ accessCount: row.access_count,
511
+ expiresAt: row.expires_at ?? undefined,
512
+ salience: row.salience,
513
+ confidence: row.confidence,
514
+ stability: row.stability,
515
+ entities: JSON.parse(row.entities),
516
+ topics: JSON.parse(row.topics),
517
+ status: row.status ?? 'active',
518
+ visibility: row.visibility,
519
+ };
520
+ }
521
+ rowToEdge(row) {
522
+ return {
523
+ id: row.id,
524
+ sourceId: row.source_id,
525
+ targetId: row.target_id,
526
+ type: row.type,
527
+ strength: row.strength,
528
+ createdAt: row.created_at,
529
+ };
530
+ }
531
+ rowToEntity(row) {
532
+ return {
533
+ id: row.id,
534
+ name: row.name,
535
+ type: row.type,
536
+ aliases: JSON.parse(row.aliases),
537
+ properties: JSON.parse(row.properties),
538
+ firstSeen: row.first_seen,
539
+ lastSeen: row.last_seen,
540
+ memoryCount: row.memory_count,
541
+ importance: row.importance,
542
+ };
543
+ }
544
+ close() {
545
+ this.db.close();
546
+ }
547
+ }
548
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,KAAK,SAAS,MAAM,YAAY,CAAC;AAGxC,+DAA+D;AAC/D,kCAAkC;AAClC,+DAA+D;AAE/D,MAAM,OAAO,WAAW;IACd,EAAE,CAAoB;IACtB,UAAU,GAAY,KAAK,CAAC;IAC5B,mBAAmB,GAAW,CAAC,CAAC;IAExC,YAAY,MAAc,EAAE,mBAA4B;QACtD,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAEpC,4BAA4B;QAC5B,IAAI,mBAAmB,IAAI,mBAAmB,GAAG,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC;gBACH,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,IAAI,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;YACjD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,wEAAwE,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;YACjH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,2DAA2D;IAC3D,mBAAmB;IACnB,2DAA2D;IAEnD,OAAO;QACb,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAuEZ,CAAC,CAAC;QAEH,sDAAsD;QACtD,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,mBAAmB,GAAG,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;4BAGS,IAAI,CAAC,mBAAmB;;OAE7C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,cAAc;IACd,2DAA2D;IAE3D,YAAY,CAAC,KAAqB;QAChC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;QAElB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEzG,MAAM,MAAM,GAAW;YACrB,EAAE;YACF,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,UAAU;YAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO;YACP,MAAM,EAAE;gBACN,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,cAAc;gBAC1C,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS;gBAClC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;gBAC9B,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ;gBAChC,SAAS,EAAE,GAAG;aACf;YACD,SAAS,EAAE,GAAG;YACd,cAAc,EAAE,GAAG;YACnB,cAAc,EAAE,GAAG;YACnB,WAAW,EAAE,CAAC;YACd,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,GAAG;YAC/B,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,GAAG;YACnC,SAAS,EAAE,GAAG;YACd,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;YAC9B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,QAAQ;YAChC,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,cAAc;SAC/C,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;KAcf,CAAC,CAAC,GAAG,CACJ,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EACtD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,EAClF,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,EACrE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,cAAc,EAC9D,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,EAC5C,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,EACpD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CACjG,CAAC;QAEF,gCAAgC;QAChC,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS,CAAC,EAAU;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,EAAE,CAA0B,CAAC;QACpG,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,sBAAsB;QACtB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAIf,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEX,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,8FAA8F;IAC9F,eAAe,CAAC,EAAU;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,EAAE,CAA0B,CAAC;QACpG,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,sEAAsE;IACtE,iBAAiB,CAAC,GAAa;QAC7B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAChC,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,uCAAuC,YAAY,GAAG,CACvD,CAAC,GAAG,CAAC,GAAG,GAAG,CAAgB,CAAC;QAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,YAAY,CAAC,EAAU,EAAE,OAAyG;QAChI,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAC9F,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAC9F,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QACjG,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAAC,CAAC;QACvG,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAC,CAAC;QACjH,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAAC,CAAC;QAE3G,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE9B,IAAI,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEhB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uBAAuB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IACxF,CAAC;IAED,kFAAkF;IAClF,YAAY,CAAC,EAAU,EAAE,MAAc;QACrC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iFAAiF,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrH,CAAC;IAED,YAAY,CAAC,EAAU;QACrB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,2DAA2D;IAC3D,YAAY;IACZ,2DAA2D;IAE3D,oDAAoD;IACpD,SAAS,CAAC,QAAgB,EAAE;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,yDAAyD,CAC1D,CAAC,GAAG,CAAC,KAAK,CAAgB,CAAC;QAC5B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,6BAA6B;IAC7B,WAAW,CAAC,UAAkB,EAAE,QAAgB,EAAE;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,8FAA8F,CAC/F,CAAC,GAAG,CAAC,KAAK,UAAU,IAAI,EAAE,KAAK,CAAgB,CAAC;QACjD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,4BAA4B;IAC5B,UAAU,CAAC,KAAa,EAAE,QAAgB,EAAE;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,4FAA4F,CAC7F,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,EAAE,KAAK,CAAgB,CAAC;QAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,6BAA6B;IAC7B,WAAW,CAAC,MAAc,EAAE,QAAgB,EAAE;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,yFAAyF,CAC1F,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAgB,CAAC;QACpC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,2BAA2B;IAC3B,SAAS,CAAC,IAAY,EAAE,QAAgB,EAAE;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,uFAAuF,CACxF,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAgB,CAAC;QAClC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,kCAAkC;IAClC,MAAM,CAAC,KAAa,EAAE,QAAgB,EAAE;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,6FAA6F,CAC9F,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,KAAK,CAAgB,CAAC;QAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,2CAA2C;IAC3C,gBAAgB,CAAC,KAAa,EAAE,QAAgB,GAAG;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,oGAAoG,CACrG,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAgB,CAAC;QACnC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,uEAAuE;IACvE,kBAAkB,CAAC,YAAoB,IAAI;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,8FAA8F,CAC/F,CAAC,GAAG,CAAC,SAAS,CAAgB,CAAC;QAChC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,6BAA6B;IAC7B,QAAQ;QACN,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;KAO9B,CAAC,CAAC,GAAG,EAA+E,CAAC;QAEtF,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,EAAuB,CAAC;QAEzG,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;IACpD,CAAC;IAED,2DAA2D;IAC3D,QAAQ;IACR,2DAA2D;IAE3D,UAAU,CAAC,QAAgB,EAAE,QAAgB,EAAE,IAA2B,EAAE,WAAmB,GAAG;QAChG,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAEpD,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAoB,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IAC1F,CAAC;IAED,YAAY,CAAC,QAAgB;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,yCAAyC,CAC1C,CAAC,GAAG,CAAC,QAAQ,CAAc,CAAC;QAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,UAAU,CAAC,QAAgB;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,yCAAyC,CAC1C,CAAC,GAAG,CAAC,QAAQ,CAAc,CAAC;QAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,4DAA4D;IAC5D,qBAAqB,CAAC,QAAgB;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,0DAA0D,CAC3D,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAc,CAAC;QACvC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,qEAAqE;IACrE,mBAAmB,CAAC,SAAmB;QACrC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,2CAA2C,YAAY,sBAAsB,YAAY,GAAG,CAC7F,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,SAAS,CAAc,CAAC;QAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,6DAA6D;IAC7D,mBAAmB,CAAC,QAAgB,EAAE,QAAgB,EAAE;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEvD,MAAM,OAAO,GAA8D,IAAI,GAAG,EAAE,CAAC;QACrF,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,yFAAyF,CAC1F,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,MAAM,IAAI,EAAE,KAAK,CAAgB,CAAC;YAEvD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACrC,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;aACzB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC;aACjE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,YAAY,CAAC,QAAgB,EAAE,QAAgB,CAAC;QAC9C,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QAEzB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;oBACxE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;wBAC5D,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;wBAC5B,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC;YACH,CAAC;YACD,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO,CAAC,GAAG,WAAW,CAAC;aACpB,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;aAC7B,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,2DAA2D;IAC3D,WAAW;IACX,2DAA2D;IAE3D,YAAY,CAAC,IAAY,EAAE,OAAe,SAAS;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC9B,yDAAyD,CAC1D,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAA0B,CAAC;QAEpD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;OAIf,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAEjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;IACzH,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB,yDAAyD,CAC1D,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAA0B,CAAC;QACpD,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC;IAED,cAAc;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,oEAAoE,CACrE,CAAC,GAAG,EAAiB,CAAC;QACvB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,2DAA2D;IAC3D,gBAAgB;IAChB,2DAA2D;IAE3D,sCAAsC;IACtC,cAAc,CAAC,QAAgB,EAAE,SAAmB;QAClD,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAE7B,gDAAgD;QAChD,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QAE/C,sDAAsD;QACtD,4BAA4B;QAC5B,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9E,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,iDAAiD;IACjD,cAAc,CAAC,SAAmB,EAAE,QAAgB,EAAE;QACpD,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QAEhC,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QAE/C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;KAM5B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,CAAmD,CAAC;QAElF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,0CAA0C;IAC1C,eAAe;QACb,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,+DAA+D;IAC/D,YAAY,CAAC,QAAgB;QAC3B,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAsC,CAAC;YACzI,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;QACpH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,WAAW,CAAC,SAAmB,EAAE,YAAoB,IAAI,EAAE,QAAgB,CAAC;QAC1E,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACtD,yDAAyD;QACzD,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC;aACpC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,2DAA2D;IAC3D,QAAQ;IACR,2DAA2D;IAE3D,6CAA6C;IAC7C,UAAU,CAAC,gBAAwB,GAAG;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,EAI1F,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC;QAEjF,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAC3C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC9D,MAAM,UAAU,GAAG,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;gBAC9C,MAAM,YAAY,GAAG,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;gBAEvE,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,KAAK,EAAE,CAAC;oBACnD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;oBAClD,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,WAAW,EAAE,CAAC;QACd,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,2DAA2D;IAC3D,kBAAkB;IAClB,2DAA2D;IAE3D,SAAS;QACP,MAAM,QAAQ,GAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,GAAG,EAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAChH,MAAM,KAAK,GAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,GAAG,EAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACtG,MAAM,QAAQ,GAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,GAAG,EAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAChH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACvC,CAAC;IAED,2DAA2D;IAC3D,mBAAmB;IACnB,2DAA2D;IAEnD,WAAW,CAAC,GAAc;QAChC,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAsB;YAChC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,MAAM,EAAE;gBACN,IAAI,EAAE,GAAG,CAAC,WAAuC;gBACjD,SAAS,EAAE,GAAG,CAAC,iBAAiB,IAAI,SAAS;gBAC7C,OAAO,EAAE,GAAG,CAAC,eAAe,IAAI,SAAS;gBACzC,QAAQ,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC3E,SAAS,EAAE,GAAG,CAAC,gBAAgB;aAChC;YACD,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,cAAc,EAAE,GAAG,CAAC,gBAAgB;YACpC,cAAc,EAAE,GAAG,CAAC,gBAAgB;YACpC,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,SAAS,EAAE,GAAG,CAAC,UAAU,IAAI,SAAS;YACtC,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;YAC9B,MAAM,EAAG,GAAW,CAAC,MAAM,IAAI,QAAQ;YACvC,UAAU,EAAE,GAAG,CAAC,UAAkC;SACnD,CAAC;IACJ,CAAC;IAEO,SAAS,CAAC,GAAY;QAC5B,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,IAAI,EAAE,GAAG,CAAC,IAAoB;YAC9B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,SAAS,EAAE,GAAG,CAAC,UAAU;SAC1B,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,GAAc;QAChC,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;YAChC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;YACtC,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,UAAU,EAAE,GAAG,CAAC,UAAU;SAC3B,CAAC;IACJ,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF"}