@danielsimonjr/memory-mcp 0.48.0 → 9.8.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/LICENSE +22 -0
- package/README.md +2000 -194
- package/dist/__tests__/file-path.test.js +7 -11
- package/dist/__tests__/knowledge-graph.test.js +3 -8
- package/dist/core/EntityManager.d.ts +266 -0
- package/dist/core/EntityManager.d.ts.map +1 -0
- package/dist/core/EntityManager.js +85 -133
- package/dist/core/GraphEventEmitter.d.ts +202 -0
- package/dist/core/GraphEventEmitter.d.ts.map +1 -0
- package/dist/core/GraphEventEmitter.js +346 -0
- package/dist/core/GraphStorage.d.ts +395 -0
- package/dist/core/GraphStorage.d.ts.map +1 -0
- package/dist/core/GraphStorage.js +643 -31
- package/dist/core/GraphTraversal.d.ts +141 -0
- package/dist/core/GraphTraversal.d.ts.map +1 -0
- package/dist/core/GraphTraversal.js +573 -0
- package/dist/core/HierarchyManager.d.ts +111 -0
- package/dist/core/HierarchyManager.d.ts.map +1 -0
- package/dist/{features → core}/HierarchyManager.js +14 -9
- package/dist/core/ManagerContext.d.ts +72 -0
- package/dist/core/ManagerContext.d.ts.map +1 -0
- package/dist/core/ManagerContext.js +118 -0
- package/dist/core/ObservationManager.d.ts +85 -0
- package/dist/core/ObservationManager.d.ts.map +1 -0
- package/dist/core/ObservationManager.js +51 -57
- package/dist/core/RelationManager.d.ts +131 -0
- package/dist/core/RelationManager.d.ts.map +1 -0
- package/dist/core/RelationManager.js +31 -7
- package/dist/core/SQLiteStorage.d.ts +354 -0
- package/dist/core/SQLiteStorage.d.ts.map +1 -0
- package/dist/core/SQLiteStorage.js +917 -0
- package/dist/core/StorageFactory.d.ts +45 -0
- package/dist/core/StorageFactory.d.ts.map +1 -0
- package/dist/core/StorageFactory.js +64 -0
- package/dist/core/TransactionManager.d.ts +464 -0
- package/dist/core/TransactionManager.d.ts.map +1 -0
- package/dist/core/TransactionManager.js +490 -13
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +12 -2
- package/dist/features/AnalyticsManager.d.ts +44 -0
- package/dist/features/AnalyticsManager.d.ts.map +1 -0
- package/dist/features/AnalyticsManager.js +3 -2
- package/dist/features/ArchiveManager.d.ts +133 -0
- package/dist/features/ArchiveManager.d.ts.map +1 -0
- package/dist/features/ArchiveManager.js +221 -14
- package/dist/features/CompressionManager.d.ts +117 -0
- package/dist/features/CompressionManager.d.ts.map +1 -0
- package/dist/features/CompressionManager.js +189 -20
- package/dist/features/IOManager.d.ts +225 -0
- package/dist/features/IOManager.d.ts.map +1 -0
- package/dist/features/IOManager.js +1041 -0
- package/dist/features/StreamingExporter.d.ts +123 -0
- package/dist/features/StreamingExporter.d.ts.map +1 -0
- package/dist/features/StreamingExporter.js +203 -0
- package/dist/features/TagManager.d.ts +147 -0
- package/dist/features/TagManager.d.ts.map +1 -0
- package/dist/features/index.d.ts +12 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +5 -6
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -10
- package/dist/memory.jsonl +1 -26
- package/dist/search/BasicSearch.d.ts +51 -0
- package/dist/search/BasicSearch.d.ts.map +1 -0
- package/dist/search/BasicSearch.js +9 -3
- package/dist/search/BooleanSearch.d.ts +98 -0
- package/dist/search/BooleanSearch.d.ts.map +1 -0
- package/dist/search/BooleanSearch.js +156 -9
- package/dist/search/EmbeddingService.d.ts +178 -0
- package/dist/search/EmbeddingService.d.ts.map +1 -0
- package/dist/search/EmbeddingService.js +358 -0
- package/dist/search/FuzzySearch.d.ts +118 -0
- package/dist/search/FuzzySearch.d.ts.map +1 -0
- package/dist/search/FuzzySearch.js +241 -25
- package/dist/search/QueryCostEstimator.d.ts +111 -0
- package/dist/search/QueryCostEstimator.d.ts.map +1 -0
- package/dist/search/QueryCostEstimator.js +355 -0
- package/dist/search/RankedSearch.d.ts +71 -0
- package/dist/search/RankedSearch.d.ts.map +1 -0
- package/dist/search/RankedSearch.js +54 -6
- package/dist/search/SavedSearchManager.d.ts +79 -0
- package/dist/search/SavedSearchManager.d.ts.map +1 -0
- package/dist/search/SearchFilterChain.d.ts +120 -0
- package/dist/search/SearchFilterChain.d.ts.map +1 -0
- package/dist/search/SearchFilterChain.js +2 -4
- package/dist/search/SearchManager.d.ts +326 -0
- package/dist/search/SearchManager.d.ts.map +1 -0
- package/dist/search/SearchManager.js +148 -0
- package/dist/search/SearchSuggestions.d.ts +27 -0
- package/dist/search/SearchSuggestions.d.ts.map +1 -0
- package/dist/search/SearchSuggestions.js +1 -1
- package/dist/search/SemanticSearch.d.ts +149 -0
- package/dist/search/SemanticSearch.d.ts.map +1 -0
- package/dist/search/SemanticSearch.js +323 -0
- package/dist/search/TFIDFEventSync.d.ts +85 -0
- package/dist/search/TFIDFEventSync.d.ts.map +1 -0
- package/dist/search/TFIDFEventSync.js +133 -0
- package/dist/search/TFIDFIndexManager.d.ts +151 -0
- package/dist/search/TFIDFIndexManager.d.ts.map +1 -0
- package/dist/search/TFIDFIndexManager.js +232 -17
- package/dist/search/VectorStore.d.ts +235 -0
- package/dist/search/VectorStore.d.ts.map +1 -0
- package/dist/search/VectorStore.js +311 -0
- package/dist/search/index.d.ts +21 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +12 -0
- package/dist/server/MCPServer.d.ts +21 -0
- package/dist/server/MCPServer.d.ts.map +1 -0
- package/dist/server/MCPServer.js +4 -4
- package/dist/server/responseCompressor.d.ts +94 -0
- package/dist/server/responseCompressor.d.ts.map +1 -0
- package/dist/server/responseCompressor.js +127 -0
- package/dist/server/toolDefinitions.d.ts +27 -0
- package/dist/server/toolDefinitions.d.ts.map +1 -0
- package/dist/server/toolDefinitions.js +188 -17
- package/dist/server/toolHandlers.d.ts +41 -0
- package/dist/server/toolHandlers.d.ts.map +1 -0
- package/dist/server/toolHandlers.js +467 -75
- package/dist/types/index.d.ts +13 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +1 -1
- package/dist/types/types.d.ts +1654 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js +9 -0
- package/dist/utils/compressedCache.d.ts +192 -0
- package/dist/utils/compressedCache.d.ts.map +1 -0
- package/dist/utils/compressedCache.js +309 -0
- package/dist/utils/compressionUtil.d.ts +214 -0
- package/dist/utils/compressionUtil.d.ts.map +1 -0
- package/dist/utils/compressionUtil.js +247 -0
- package/dist/utils/constants.d.ts +245 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +124 -0
- package/dist/utils/entityUtils.d.ts +321 -0
- package/dist/utils/entityUtils.d.ts.map +1 -0
- package/dist/utils/entityUtils.js +434 -4
- package/dist/utils/errors.d.ts +95 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +24 -0
- package/dist/utils/formatters.d.ts +145 -0
- package/dist/utils/formatters.d.ts.map +1 -0
- package/dist/utils/{paginationUtils.js → formatters.js} +54 -3
- package/dist/utils/index.d.ts +23 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +69 -31
- package/dist/utils/indexes.d.ts +270 -0
- package/dist/utils/indexes.d.ts.map +1 -0
- package/dist/utils/indexes.js +526 -0
- package/dist/utils/logger.d.ts +24 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/operationUtils.d.ts +124 -0
- package/dist/utils/operationUtils.d.ts.map +1 -0
- package/dist/utils/operationUtils.js +175 -0
- package/dist/utils/parallelUtils.d.ts +72 -0
- package/dist/utils/parallelUtils.d.ts.map +1 -0
- package/dist/utils/parallelUtils.js +169 -0
- package/dist/utils/schemas.d.ts +374 -0
- package/dist/utils/schemas.d.ts.map +1 -0
- package/dist/utils/schemas.js +302 -2
- package/dist/utils/searchAlgorithms.d.ts +99 -0
- package/dist/utils/searchAlgorithms.d.ts.map +1 -0
- package/dist/utils/searchAlgorithms.js +167 -0
- package/dist/utils/searchCache.d.ts +108 -0
- package/dist/utils/searchCache.d.ts.map +1 -0
- package/dist/utils/taskScheduler.d.ts +290 -0
- package/dist/utils/taskScheduler.d.ts.map +1 -0
- package/dist/utils/taskScheduler.js +466 -0
- package/dist/workers/index.d.ts +12 -0
- package/dist/workers/index.d.ts.map +1 -0
- package/dist/workers/index.js +9 -0
- package/dist/workers/levenshteinWorker.d.ts +60 -0
- package/dist/workers/levenshteinWorker.d.ts.map +1 -0
- package/dist/workers/levenshteinWorker.js +98 -0
- package/package.json +17 -4
- package/dist/__tests__/edge-cases/edge-cases.test.js +0 -406
- package/dist/__tests__/integration/workflows.test.js +0 -449
- package/dist/__tests__/performance/benchmarks.test.js +0 -413
- package/dist/__tests__/unit/core/EntityManager.test.js +0 -334
- package/dist/__tests__/unit/core/GraphStorage.test.js +0 -205
- package/dist/__tests__/unit/core/RelationManager.test.js +0 -274
- package/dist/__tests__/unit/features/CompressionManager.test.js +0 -350
- package/dist/__tests__/unit/search/BasicSearch.test.js +0 -311
- package/dist/__tests__/unit/search/BooleanSearch.test.js +0 -432
- package/dist/__tests__/unit/search/FuzzySearch.test.js +0 -448
- package/dist/__tests__/unit/search/RankedSearch.test.js +0 -379
- package/dist/__tests__/unit/utils/levenshtein.test.js +0 -77
- package/dist/core/KnowledgeGraphManager.js +0 -423
- package/dist/features/BackupManager.js +0 -311
- package/dist/features/ExportManager.js +0 -305
- package/dist/features/ImportExportManager.js +0 -50
- package/dist/features/ImportManager.js +0 -328
- package/dist/memory-saved-searches.jsonl +0 -0
- package/dist/memory-tag-aliases.jsonl +0 -0
- package/dist/types/analytics.types.js +0 -6
- package/dist/types/entity.types.js +0 -7
- package/dist/types/import-export.types.js +0 -7
- package/dist/types/search.types.js +0 -7
- package/dist/types/tag.types.js +0 -6
- package/dist/utils/dateUtils.js +0 -89
- package/dist/utils/filterUtils.js +0 -155
- package/dist/utils/levenshtein.js +0 -62
- package/dist/utils/pathUtils.js +0 -115
- package/dist/utils/responseFormatter.js +0 -55
- package/dist/utils/tagUtils.js +0 -107
- package/dist/utils/tfidf.js +0 -90
- package/dist/utils/validationHelper.js +0 -99
- package/dist/utils/validationUtils.js +0 -109
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compressed Cache Utility
|
|
3
|
+
*
|
|
4
|
+
* Provides an LRU cache with automatic compression of old entries.
|
|
5
|
+
* Reduces memory footprint for large knowledge graphs (50k+ entities).
|
|
6
|
+
*
|
|
7
|
+
* Uses synchronous brotli compression/decompression for cache operations
|
|
8
|
+
* to avoid async complexity in hot paths.
|
|
9
|
+
*
|
|
10
|
+
* Phase 3 Sprint 5: Archive & Cache Compression
|
|
11
|
+
*
|
|
12
|
+
* @module utils/compressedCache
|
|
13
|
+
*/
|
|
14
|
+
import type { Entity } from '../types/index.js';
|
|
15
|
+
/**
|
|
16
|
+
* Options for CompressedCache configuration.
|
|
17
|
+
*/
|
|
18
|
+
export interface CompressedCacheOptions {
|
|
19
|
+
/**
|
|
20
|
+
* Maximum number of uncompressed (hot) entries to keep.
|
|
21
|
+
* Entries beyond this limit may be compressed.
|
|
22
|
+
* @default 1000
|
|
23
|
+
*/
|
|
24
|
+
maxUncompressed?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Time in milliseconds before an entry is eligible for compression.
|
|
27
|
+
* Entries accessed within this time window stay uncompressed.
|
|
28
|
+
* @default 300000 (5 minutes)
|
|
29
|
+
*/
|
|
30
|
+
compressionThresholdMs?: number;
|
|
31
|
+
/**
|
|
32
|
+
* Whether to enable automatic compression.
|
|
33
|
+
* If false, entries are never automatically compressed.
|
|
34
|
+
* @default true
|
|
35
|
+
*/
|
|
36
|
+
autoCompress?: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Statistics about the cache state.
|
|
40
|
+
*/
|
|
41
|
+
export interface CompressedCacheStats {
|
|
42
|
+
/** Total number of entries in the cache */
|
|
43
|
+
total: number;
|
|
44
|
+
/** Number of compressed entries */
|
|
45
|
+
compressed: number;
|
|
46
|
+
/** Number of uncompressed (hot) entries */
|
|
47
|
+
uncompressed: number;
|
|
48
|
+
/** Estimated memory saved by compression in bytes */
|
|
49
|
+
memorySaved: number;
|
|
50
|
+
/** Total original size of all entries in bytes */
|
|
51
|
+
totalOriginalSize: number;
|
|
52
|
+
/** Cache hit count since creation */
|
|
53
|
+
hits: number;
|
|
54
|
+
/** Cache miss count since creation */
|
|
55
|
+
misses: number;
|
|
56
|
+
/** Number of compressions performed */
|
|
57
|
+
compressions: number;
|
|
58
|
+
/** Number of decompressions performed */
|
|
59
|
+
decompressions: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* LRU cache with automatic compression of old entries.
|
|
63
|
+
*
|
|
64
|
+
* Reduces memory footprint by compressing infrequently accessed entries
|
|
65
|
+
* using brotli compression. Hot (recently accessed) entries stay
|
|
66
|
+
* uncompressed for fast access.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const cache = new CompressedCache({
|
|
71
|
+
* maxUncompressed: 500,
|
|
72
|
+
* compressionThresholdMs: 60000 // 1 minute
|
|
73
|
+
* });
|
|
74
|
+
*
|
|
75
|
+
* // Store entity
|
|
76
|
+
* cache.set('Alice', { name: 'Alice', entityType: 'person', observations: [] });
|
|
77
|
+
*
|
|
78
|
+
* // Retrieve entity (decompresses if needed)
|
|
79
|
+
* const entity = cache.get('Alice');
|
|
80
|
+
*
|
|
81
|
+
* // Check stats
|
|
82
|
+
* const stats = cache.getStats();
|
|
83
|
+
* console.log(`Memory saved: ${stats.memorySaved} bytes`);
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export declare class CompressedCache {
|
|
87
|
+
private _entryMap;
|
|
88
|
+
private readonly maxUncompressed;
|
|
89
|
+
private readonly compressionThresholdMs;
|
|
90
|
+
private readonly autoCompress;
|
|
91
|
+
private hits;
|
|
92
|
+
private misses;
|
|
93
|
+
private compressions;
|
|
94
|
+
private decompressions;
|
|
95
|
+
constructor(options?: CompressedCacheOptions);
|
|
96
|
+
/**
|
|
97
|
+
* Get an entity from the cache.
|
|
98
|
+
*
|
|
99
|
+
* If the entity is compressed, it will be decompressed on access.
|
|
100
|
+
* The entry is marked as recently accessed to prevent re-compression.
|
|
101
|
+
*
|
|
102
|
+
* @param name - Entity name to retrieve
|
|
103
|
+
* @returns The entity if found, undefined otherwise
|
|
104
|
+
*/
|
|
105
|
+
get(name: string): Entity | undefined;
|
|
106
|
+
/**
|
|
107
|
+
* Store an entity in the cache.
|
|
108
|
+
*
|
|
109
|
+
* Entries are stored uncompressed initially. Old entries may be
|
|
110
|
+
* compressed automatically based on cache settings.
|
|
111
|
+
*
|
|
112
|
+
* @param name - Entity name (key)
|
|
113
|
+
* @param entity - Entity to store
|
|
114
|
+
*/
|
|
115
|
+
set(name: string, entity: Entity): void;
|
|
116
|
+
/**
|
|
117
|
+
* Check if an entity exists in the cache.
|
|
118
|
+
*
|
|
119
|
+
* @param name - Entity name to check
|
|
120
|
+
* @returns True if entity exists in cache
|
|
121
|
+
*/
|
|
122
|
+
has(name: string): boolean;
|
|
123
|
+
/**
|
|
124
|
+
* Delete an entity from the cache.
|
|
125
|
+
*
|
|
126
|
+
* @param name - Entity name to delete
|
|
127
|
+
* @returns True if entity was deleted, false if not found
|
|
128
|
+
*/
|
|
129
|
+
delete(name: string): boolean;
|
|
130
|
+
/**
|
|
131
|
+
* Clear all entries from the cache.
|
|
132
|
+
*/
|
|
133
|
+
clear(): void;
|
|
134
|
+
/**
|
|
135
|
+
* Get the number of entries in the cache.
|
|
136
|
+
*/
|
|
137
|
+
get size(): number;
|
|
138
|
+
/**
|
|
139
|
+
* Get all entity names in the cache.
|
|
140
|
+
*/
|
|
141
|
+
keys(): IterableIterator<string>;
|
|
142
|
+
/**
|
|
143
|
+
* Get comprehensive cache statistics.
|
|
144
|
+
*
|
|
145
|
+
* @returns Statistics about cache state and performance
|
|
146
|
+
*/
|
|
147
|
+
getStats(): CompressedCacheStats;
|
|
148
|
+
/**
|
|
149
|
+
* Force compression of entries older than the threshold.
|
|
150
|
+
*
|
|
151
|
+
* Called automatically after set() when autoCompress is enabled.
|
|
152
|
+
* Can be called manually to trigger compression on demand.
|
|
153
|
+
*
|
|
154
|
+
* @returns Number of entries compressed
|
|
155
|
+
*/
|
|
156
|
+
compressOldEntries(): number;
|
|
157
|
+
/**
|
|
158
|
+
* Compress old entries if we're over the uncompressed limit.
|
|
159
|
+
*
|
|
160
|
+
* @param force - If true, compress regardless of limit
|
|
161
|
+
* @returns Number of entries compressed
|
|
162
|
+
*/
|
|
163
|
+
private maybeCompressOldEntries;
|
|
164
|
+
/**
|
|
165
|
+
* Decompress all entries in the cache.
|
|
166
|
+
*
|
|
167
|
+
* Useful when preparing for bulk operations or export.
|
|
168
|
+
*
|
|
169
|
+
* @returns Number of entries decompressed
|
|
170
|
+
*/
|
|
171
|
+
decompressAll(): number;
|
|
172
|
+
/**
|
|
173
|
+
* Get all entities from the cache (decompressing as needed).
|
|
174
|
+
*
|
|
175
|
+
* @returns Array of all entities in the cache
|
|
176
|
+
*/
|
|
177
|
+
getAllEntities(): Entity[];
|
|
178
|
+
/**
|
|
179
|
+
* Iterate over all entries with their compression status.
|
|
180
|
+
*
|
|
181
|
+
* Does not decompress entries - useful for inspection.
|
|
182
|
+
*
|
|
183
|
+
* @yields Entry information without decompressing
|
|
184
|
+
*/
|
|
185
|
+
entries(): IterableIterator<{
|
|
186
|
+
name: string;
|
|
187
|
+
compressed: boolean;
|
|
188
|
+
originalSize: number;
|
|
189
|
+
lastAccessed: number;
|
|
190
|
+
}>;
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=compressedCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compressedCache.d.ts","sourceRoot":"","sources":["../../src/utils/compressedCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAmBhD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;IAChD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IAGvC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,cAAc,CAAa;gBAEvB,OAAO,GAAE,sBAA2B;IAMhD;;;;;;;;OAQG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IA6BrC;;;;;;;;OAQG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAgBvC;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;;;;OAKG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI7B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC;IAIhC;;;;OAIG;IACH,QAAQ,IAAI,oBAAoB;IA+BhC;;;;;;;OAOG;IACH,kBAAkB,IAAI,MAAM;IAI5B;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IA2D/B;;;;;;OAMG;IACH,aAAa,IAAI,MAAM;IAsBvB;;;;OAIG;IACH,cAAc,IAAI,MAAM,EAAE;IAa1B;;;;;;OAMG;IACF,OAAO,IAAI,gBAAgB,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,OAAO,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CAUH"}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compressed Cache Utility
|
|
3
|
+
*
|
|
4
|
+
* Provides an LRU cache with automatic compression of old entries.
|
|
5
|
+
* Reduces memory footprint for large knowledge graphs (50k+ entities).
|
|
6
|
+
*
|
|
7
|
+
* Uses synchronous brotli compression/decompression for cache operations
|
|
8
|
+
* to avoid async complexity in hot paths.
|
|
9
|
+
*
|
|
10
|
+
* Phase 3 Sprint 5: Archive & Cache Compression
|
|
11
|
+
*
|
|
12
|
+
* @module utils/compressedCache
|
|
13
|
+
*/
|
|
14
|
+
import { brotliCompressSync, brotliDecompressSync, constants } from 'zlib';
|
|
15
|
+
import { COMPRESSION_CONFIG } from './constants.js';
|
|
16
|
+
/**
|
|
17
|
+
* LRU cache with automatic compression of old entries.
|
|
18
|
+
*
|
|
19
|
+
* Reduces memory footprint by compressing infrequently accessed entries
|
|
20
|
+
* using brotli compression. Hot (recently accessed) entries stay
|
|
21
|
+
* uncompressed for fast access.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const cache = new CompressedCache({
|
|
26
|
+
* maxUncompressed: 500,
|
|
27
|
+
* compressionThresholdMs: 60000 // 1 minute
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* // Store entity
|
|
31
|
+
* cache.set('Alice', { name: 'Alice', entityType: 'person', observations: [] });
|
|
32
|
+
*
|
|
33
|
+
* // Retrieve entity (decompresses if needed)
|
|
34
|
+
* const entity = cache.get('Alice');
|
|
35
|
+
*
|
|
36
|
+
* // Check stats
|
|
37
|
+
* const stats = cache.getStats();
|
|
38
|
+
* console.log(`Memory saved: ${stats.memorySaved} bytes`);
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export class CompressedCache {
|
|
42
|
+
_entryMap = new Map();
|
|
43
|
+
maxUncompressed;
|
|
44
|
+
compressionThresholdMs;
|
|
45
|
+
autoCompress;
|
|
46
|
+
// Statistics
|
|
47
|
+
hits = 0;
|
|
48
|
+
misses = 0;
|
|
49
|
+
compressions = 0;
|
|
50
|
+
decompressions = 0;
|
|
51
|
+
constructor(options = {}) {
|
|
52
|
+
this.maxUncompressed = options.maxUncompressed ?? 1000;
|
|
53
|
+
this.compressionThresholdMs = options.compressionThresholdMs ?? 5 * 60 * 1000;
|
|
54
|
+
this.autoCompress = options.autoCompress ?? true;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get an entity from the cache.
|
|
58
|
+
*
|
|
59
|
+
* If the entity is compressed, it will be decompressed on access.
|
|
60
|
+
* The entry is marked as recently accessed to prevent re-compression.
|
|
61
|
+
*
|
|
62
|
+
* @param name - Entity name to retrieve
|
|
63
|
+
* @returns The entity if found, undefined otherwise
|
|
64
|
+
*/
|
|
65
|
+
get(name) {
|
|
66
|
+
const entry = this._entryMap.get(name);
|
|
67
|
+
if (!entry) {
|
|
68
|
+
this.misses++;
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
this.hits++;
|
|
72
|
+
entry.lastAccessed = Date.now();
|
|
73
|
+
if (entry.compressed && entry.compressedData) {
|
|
74
|
+
// Decompress on access
|
|
75
|
+
try {
|
|
76
|
+
const decompressed = brotliDecompressSync(entry.compressedData);
|
|
77
|
+
entry.entity = JSON.parse(decompressed.toString('utf-8'));
|
|
78
|
+
entry.compressed = false;
|
|
79
|
+
entry.compressedData = undefined;
|
|
80
|
+
this.decompressions++;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Decompression failed - remove corrupt entry
|
|
84
|
+
this._entryMap.delete(name);
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return entry.entity ?? undefined;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Store an entity in the cache.
|
|
92
|
+
*
|
|
93
|
+
* Entries are stored uncompressed initially. Old entries may be
|
|
94
|
+
* compressed automatically based on cache settings.
|
|
95
|
+
*
|
|
96
|
+
* @param name - Entity name (key)
|
|
97
|
+
* @param entity - Entity to store
|
|
98
|
+
*/
|
|
99
|
+
set(name, entity) {
|
|
100
|
+
const jsonStr = JSON.stringify(entity);
|
|
101
|
+
const originalSize = Buffer.byteLength(jsonStr, 'utf-8');
|
|
102
|
+
this._entryMap.set(name, {
|
|
103
|
+
entity,
|
|
104
|
+
compressed: false,
|
|
105
|
+
originalSize,
|
|
106
|
+
lastAccessed: Date.now(),
|
|
107
|
+
});
|
|
108
|
+
if (this.autoCompress) {
|
|
109
|
+
this.maybeCompressOldEntries();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Check if an entity exists in the cache.
|
|
114
|
+
*
|
|
115
|
+
* @param name - Entity name to check
|
|
116
|
+
* @returns True if entity exists in cache
|
|
117
|
+
*/
|
|
118
|
+
has(name) {
|
|
119
|
+
return this._entryMap.has(name);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Delete an entity from the cache.
|
|
123
|
+
*
|
|
124
|
+
* @param name - Entity name to delete
|
|
125
|
+
* @returns True if entity was deleted, false if not found
|
|
126
|
+
*/
|
|
127
|
+
delete(name) {
|
|
128
|
+
return this._entryMap.delete(name);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Clear all entries from the cache.
|
|
132
|
+
*/
|
|
133
|
+
clear() {
|
|
134
|
+
this._entryMap.clear();
|
|
135
|
+
// Don't reset statistics - they track lifetime totals
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get the number of entries in the cache.
|
|
139
|
+
*/
|
|
140
|
+
get size() {
|
|
141
|
+
return this._entryMap.size;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get all entity names in the cache.
|
|
145
|
+
*/
|
|
146
|
+
keys() {
|
|
147
|
+
return this._entryMap.keys();
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get comprehensive cache statistics.
|
|
151
|
+
*
|
|
152
|
+
* @returns Statistics about cache state and performance
|
|
153
|
+
*/
|
|
154
|
+
getStats() {
|
|
155
|
+
let compressed = 0;
|
|
156
|
+
let uncompressed = 0;
|
|
157
|
+
let memorySaved = 0;
|
|
158
|
+
let totalOriginalSize = 0;
|
|
159
|
+
for (const entry of this._entryMap.values()) {
|
|
160
|
+
totalOriginalSize += entry.originalSize;
|
|
161
|
+
if (entry.compressed && entry.compressedData) {
|
|
162
|
+
compressed++;
|
|
163
|
+
// Memory saved = original size - compressed size
|
|
164
|
+
memorySaved += entry.originalSize - entry.compressedData.length;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
uncompressed++;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
total: this._entryMap.size,
|
|
172
|
+
compressed,
|
|
173
|
+
uncompressed,
|
|
174
|
+
memorySaved: Math.max(0, memorySaved),
|
|
175
|
+
totalOriginalSize,
|
|
176
|
+
hits: this.hits,
|
|
177
|
+
misses: this.misses,
|
|
178
|
+
compressions: this.compressions,
|
|
179
|
+
decompressions: this.decompressions,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Force compression of entries older than the threshold.
|
|
184
|
+
*
|
|
185
|
+
* Called automatically after set() when autoCompress is enabled.
|
|
186
|
+
* Can be called manually to trigger compression on demand.
|
|
187
|
+
*
|
|
188
|
+
* @returns Number of entries compressed
|
|
189
|
+
*/
|
|
190
|
+
compressOldEntries() {
|
|
191
|
+
return this.maybeCompressOldEntries(true);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Compress old entries if we're over the uncompressed limit.
|
|
195
|
+
*
|
|
196
|
+
* @param force - If true, compress regardless of limit
|
|
197
|
+
* @returns Number of entries compressed
|
|
198
|
+
*/
|
|
199
|
+
maybeCompressOldEntries(force = false) {
|
|
200
|
+
// Count uncompressed entries
|
|
201
|
+
let uncompressedCount = 0;
|
|
202
|
+
for (const entry of this._entryMap.values()) {
|
|
203
|
+
if (!entry.compressed) {
|
|
204
|
+
uncompressedCount++;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Only compress if over limit (unless forced)
|
|
208
|
+
if (!force && uncompressedCount <= this.maxUncompressed) {
|
|
209
|
+
return 0;
|
|
210
|
+
}
|
|
211
|
+
const now = Date.now();
|
|
212
|
+
let compressedCount = 0;
|
|
213
|
+
// Sort uncompressed entries by last accessed time (oldest first)
|
|
214
|
+
const sortedEntries = [...this._entryMap.entries()]
|
|
215
|
+
.filter(([, e]) => !e.compressed && e.entity !== null)
|
|
216
|
+
.sort((a, b) => a[1].lastAccessed - b[1].lastAccessed);
|
|
217
|
+
// Compress oldest entries until we're under the limit
|
|
218
|
+
for (const [, entry] of sortedEntries) {
|
|
219
|
+
// Stop if we've compressed enough
|
|
220
|
+
if (!force && (uncompressedCount - compressedCount) <= this.maxUncompressed) {
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
// Only compress if entry is old enough
|
|
224
|
+
if (now - entry.lastAccessed < this.compressionThresholdMs) {
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
// Compress the entry
|
|
228
|
+
if (entry.entity) {
|
|
229
|
+
try {
|
|
230
|
+
const jsonStr = JSON.stringify(entry.entity);
|
|
231
|
+
const compressed = brotliCompressSync(Buffer.from(jsonStr, 'utf-8'), {
|
|
232
|
+
params: {
|
|
233
|
+
[constants.BROTLI_PARAM_QUALITY]: COMPRESSION_CONFIG.BROTLI_QUALITY_CACHE,
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
entry.compressedData = compressed;
|
|
237
|
+
entry.compressed = true;
|
|
238
|
+
entry.entity = null; // Free memory
|
|
239
|
+
this.compressions++;
|
|
240
|
+
compressedCount++;
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
// Compression failed - leave entry uncompressed
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return compressedCount;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Decompress all entries in the cache.
|
|
252
|
+
*
|
|
253
|
+
* Useful when preparing for bulk operations or export.
|
|
254
|
+
*
|
|
255
|
+
* @returns Number of entries decompressed
|
|
256
|
+
*/
|
|
257
|
+
decompressAll() {
|
|
258
|
+
let decompressedCount = 0;
|
|
259
|
+
for (const [name, entry] of this._entryMap) {
|
|
260
|
+
if (entry.compressed && entry.compressedData) {
|
|
261
|
+
try {
|
|
262
|
+
const decompressed = brotliDecompressSync(entry.compressedData);
|
|
263
|
+
entry.entity = JSON.parse(decompressed.toString('utf-8'));
|
|
264
|
+
entry.compressed = false;
|
|
265
|
+
entry.compressedData = undefined;
|
|
266
|
+
this.decompressions++;
|
|
267
|
+
decompressedCount++;
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
// Decompression failed - remove corrupt entry
|
|
271
|
+
this._entryMap.delete(name);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return decompressedCount;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Get all entities from the cache (decompressing as needed).
|
|
279
|
+
*
|
|
280
|
+
* @returns Array of all entities in the cache
|
|
281
|
+
*/
|
|
282
|
+
getAllEntities() {
|
|
283
|
+
const entities = [];
|
|
284
|
+
for (const [name] of this._entryMap) {
|
|
285
|
+
const entity = this.get(name);
|
|
286
|
+
if (entity) {
|
|
287
|
+
entities.push(entity);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return entities;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Iterate over all entries with their compression status.
|
|
294
|
+
*
|
|
295
|
+
* Does not decompress entries - useful for inspection.
|
|
296
|
+
*
|
|
297
|
+
* @yields Entry information without decompressing
|
|
298
|
+
*/
|
|
299
|
+
*entries() {
|
|
300
|
+
for (const [name, entry] of this._entryMap) {
|
|
301
|
+
yield {
|
|
302
|
+
name,
|
|
303
|
+
compressed: entry.compressed,
|
|
304
|
+
originalSize: entry.originalSize,
|
|
305
|
+
lastAccessed: entry.lastAccessed,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|