@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.
Files changed (209) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +2000 -194
  3. package/dist/__tests__/file-path.test.js +7 -11
  4. package/dist/__tests__/knowledge-graph.test.js +3 -8
  5. package/dist/core/EntityManager.d.ts +266 -0
  6. package/dist/core/EntityManager.d.ts.map +1 -0
  7. package/dist/core/EntityManager.js +85 -133
  8. package/dist/core/GraphEventEmitter.d.ts +202 -0
  9. package/dist/core/GraphEventEmitter.d.ts.map +1 -0
  10. package/dist/core/GraphEventEmitter.js +346 -0
  11. package/dist/core/GraphStorage.d.ts +395 -0
  12. package/dist/core/GraphStorage.d.ts.map +1 -0
  13. package/dist/core/GraphStorage.js +643 -31
  14. package/dist/core/GraphTraversal.d.ts +141 -0
  15. package/dist/core/GraphTraversal.d.ts.map +1 -0
  16. package/dist/core/GraphTraversal.js +573 -0
  17. package/dist/core/HierarchyManager.d.ts +111 -0
  18. package/dist/core/HierarchyManager.d.ts.map +1 -0
  19. package/dist/{features → core}/HierarchyManager.js +14 -9
  20. package/dist/core/ManagerContext.d.ts +72 -0
  21. package/dist/core/ManagerContext.d.ts.map +1 -0
  22. package/dist/core/ManagerContext.js +118 -0
  23. package/dist/core/ObservationManager.d.ts +85 -0
  24. package/dist/core/ObservationManager.d.ts.map +1 -0
  25. package/dist/core/ObservationManager.js +51 -57
  26. package/dist/core/RelationManager.d.ts +131 -0
  27. package/dist/core/RelationManager.d.ts.map +1 -0
  28. package/dist/core/RelationManager.js +31 -7
  29. package/dist/core/SQLiteStorage.d.ts +354 -0
  30. package/dist/core/SQLiteStorage.d.ts.map +1 -0
  31. package/dist/core/SQLiteStorage.js +917 -0
  32. package/dist/core/StorageFactory.d.ts +45 -0
  33. package/dist/core/StorageFactory.d.ts.map +1 -0
  34. package/dist/core/StorageFactory.js +64 -0
  35. package/dist/core/TransactionManager.d.ts +464 -0
  36. package/dist/core/TransactionManager.d.ts.map +1 -0
  37. package/dist/core/TransactionManager.js +490 -13
  38. package/dist/core/index.d.ts +17 -0
  39. package/dist/core/index.d.ts.map +1 -0
  40. package/dist/core/index.js +12 -2
  41. package/dist/features/AnalyticsManager.d.ts +44 -0
  42. package/dist/features/AnalyticsManager.d.ts.map +1 -0
  43. package/dist/features/AnalyticsManager.js +3 -2
  44. package/dist/features/ArchiveManager.d.ts +133 -0
  45. package/dist/features/ArchiveManager.d.ts.map +1 -0
  46. package/dist/features/ArchiveManager.js +221 -14
  47. package/dist/features/CompressionManager.d.ts +117 -0
  48. package/dist/features/CompressionManager.d.ts.map +1 -0
  49. package/dist/features/CompressionManager.js +189 -20
  50. package/dist/features/IOManager.d.ts +225 -0
  51. package/dist/features/IOManager.d.ts.map +1 -0
  52. package/dist/features/IOManager.js +1041 -0
  53. package/dist/features/StreamingExporter.d.ts +123 -0
  54. package/dist/features/StreamingExporter.d.ts.map +1 -0
  55. package/dist/features/StreamingExporter.js +203 -0
  56. package/dist/features/TagManager.d.ts +147 -0
  57. package/dist/features/TagManager.d.ts.map +1 -0
  58. package/dist/features/index.d.ts +12 -0
  59. package/dist/features/index.d.ts.map +1 -0
  60. package/dist/features/index.js +5 -6
  61. package/dist/index.d.ts +9 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +10 -10
  64. package/dist/memory.jsonl +1 -26
  65. package/dist/search/BasicSearch.d.ts +51 -0
  66. package/dist/search/BasicSearch.d.ts.map +1 -0
  67. package/dist/search/BasicSearch.js +9 -3
  68. package/dist/search/BooleanSearch.d.ts +98 -0
  69. package/dist/search/BooleanSearch.d.ts.map +1 -0
  70. package/dist/search/BooleanSearch.js +156 -9
  71. package/dist/search/EmbeddingService.d.ts +178 -0
  72. package/dist/search/EmbeddingService.d.ts.map +1 -0
  73. package/dist/search/EmbeddingService.js +358 -0
  74. package/dist/search/FuzzySearch.d.ts +118 -0
  75. package/dist/search/FuzzySearch.d.ts.map +1 -0
  76. package/dist/search/FuzzySearch.js +241 -25
  77. package/dist/search/QueryCostEstimator.d.ts +111 -0
  78. package/dist/search/QueryCostEstimator.d.ts.map +1 -0
  79. package/dist/search/QueryCostEstimator.js +355 -0
  80. package/dist/search/RankedSearch.d.ts +71 -0
  81. package/dist/search/RankedSearch.d.ts.map +1 -0
  82. package/dist/search/RankedSearch.js +54 -6
  83. package/dist/search/SavedSearchManager.d.ts +79 -0
  84. package/dist/search/SavedSearchManager.d.ts.map +1 -0
  85. package/dist/search/SearchFilterChain.d.ts +120 -0
  86. package/dist/search/SearchFilterChain.d.ts.map +1 -0
  87. package/dist/search/SearchFilterChain.js +2 -4
  88. package/dist/search/SearchManager.d.ts +326 -0
  89. package/dist/search/SearchManager.d.ts.map +1 -0
  90. package/dist/search/SearchManager.js +148 -0
  91. package/dist/search/SearchSuggestions.d.ts +27 -0
  92. package/dist/search/SearchSuggestions.d.ts.map +1 -0
  93. package/dist/search/SearchSuggestions.js +1 -1
  94. package/dist/search/SemanticSearch.d.ts +149 -0
  95. package/dist/search/SemanticSearch.d.ts.map +1 -0
  96. package/dist/search/SemanticSearch.js +323 -0
  97. package/dist/search/TFIDFEventSync.d.ts +85 -0
  98. package/dist/search/TFIDFEventSync.d.ts.map +1 -0
  99. package/dist/search/TFIDFEventSync.js +133 -0
  100. package/dist/search/TFIDFIndexManager.d.ts +151 -0
  101. package/dist/search/TFIDFIndexManager.d.ts.map +1 -0
  102. package/dist/search/TFIDFIndexManager.js +232 -17
  103. package/dist/search/VectorStore.d.ts +235 -0
  104. package/dist/search/VectorStore.d.ts.map +1 -0
  105. package/dist/search/VectorStore.js +311 -0
  106. package/dist/search/index.d.ts +21 -0
  107. package/dist/search/index.d.ts.map +1 -0
  108. package/dist/search/index.js +12 -0
  109. package/dist/server/MCPServer.d.ts +21 -0
  110. package/dist/server/MCPServer.d.ts.map +1 -0
  111. package/dist/server/MCPServer.js +4 -4
  112. package/dist/server/responseCompressor.d.ts +94 -0
  113. package/dist/server/responseCompressor.d.ts.map +1 -0
  114. package/dist/server/responseCompressor.js +127 -0
  115. package/dist/server/toolDefinitions.d.ts +27 -0
  116. package/dist/server/toolDefinitions.d.ts.map +1 -0
  117. package/dist/server/toolDefinitions.js +188 -17
  118. package/dist/server/toolHandlers.d.ts +41 -0
  119. package/dist/server/toolHandlers.d.ts.map +1 -0
  120. package/dist/server/toolHandlers.js +467 -75
  121. package/dist/types/index.d.ts +13 -0
  122. package/dist/types/index.d.ts.map +1 -0
  123. package/dist/types/index.js +1 -1
  124. package/dist/types/types.d.ts +1654 -0
  125. package/dist/types/types.d.ts.map +1 -0
  126. package/dist/types/types.js +9 -0
  127. package/dist/utils/compressedCache.d.ts +192 -0
  128. package/dist/utils/compressedCache.d.ts.map +1 -0
  129. package/dist/utils/compressedCache.js +309 -0
  130. package/dist/utils/compressionUtil.d.ts +214 -0
  131. package/dist/utils/compressionUtil.d.ts.map +1 -0
  132. package/dist/utils/compressionUtil.js +247 -0
  133. package/dist/utils/constants.d.ts +245 -0
  134. package/dist/utils/constants.d.ts.map +1 -0
  135. package/dist/utils/constants.js +124 -0
  136. package/dist/utils/entityUtils.d.ts +321 -0
  137. package/dist/utils/entityUtils.d.ts.map +1 -0
  138. package/dist/utils/entityUtils.js +434 -4
  139. package/dist/utils/errors.d.ts +95 -0
  140. package/dist/utils/errors.d.ts.map +1 -0
  141. package/dist/utils/errors.js +24 -0
  142. package/dist/utils/formatters.d.ts +145 -0
  143. package/dist/utils/formatters.d.ts.map +1 -0
  144. package/dist/utils/{paginationUtils.js → formatters.js} +54 -3
  145. package/dist/utils/index.d.ts +23 -0
  146. package/dist/utils/index.d.ts.map +1 -0
  147. package/dist/utils/index.js +69 -31
  148. package/dist/utils/indexes.d.ts +270 -0
  149. package/dist/utils/indexes.d.ts.map +1 -0
  150. package/dist/utils/indexes.js +526 -0
  151. package/dist/utils/logger.d.ts +24 -0
  152. package/dist/utils/logger.d.ts.map +1 -0
  153. package/dist/utils/operationUtils.d.ts +124 -0
  154. package/dist/utils/operationUtils.d.ts.map +1 -0
  155. package/dist/utils/operationUtils.js +175 -0
  156. package/dist/utils/parallelUtils.d.ts +72 -0
  157. package/dist/utils/parallelUtils.d.ts.map +1 -0
  158. package/dist/utils/parallelUtils.js +169 -0
  159. package/dist/utils/schemas.d.ts +374 -0
  160. package/dist/utils/schemas.d.ts.map +1 -0
  161. package/dist/utils/schemas.js +302 -2
  162. package/dist/utils/searchAlgorithms.d.ts +99 -0
  163. package/dist/utils/searchAlgorithms.d.ts.map +1 -0
  164. package/dist/utils/searchAlgorithms.js +167 -0
  165. package/dist/utils/searchCache.d.ts +108 -0
  166. package/dist/utils/searchCache.d.ts.map +1 -0
  167. package/dist/utils/taskScheduler.d.ts +290 -0
  168. package/dist/utils/taskScheduler.d.ts.map +1 -0
  169. package/dist/utils/taskScheduler.js +466 -0
  170. package/dist/workers/index.d.ts +12 -0
  171. package/dist/workers/index.d.ts.map +1 -0
  172. package/dist/workers/index.js +9 -0
  173. package/dist/workers/levenshteinWorker.d.ts +60 -0
  174. package/dist/workers/levenshteinWorker.d.ts.map +1 -0
  175. package/dist/workers/levenshteinWorker.js +98 -0
  176. package/package.json +17 -4
  177. package/dist/__tests__/edge-cases/edge-cases.test.js +0 -406
  178. package/dist/__tests__/integration/workflows.test.js +0 -449
  179. package/dist/__tests__/performance/benchmarks.test.js +0 -413
  180. package/dist/__tests__/unit/core/EntityManager.test.js +0 -334
  181. package/dist/__tests__/unit/core/GraphStorage.test.js +0 -205
  182. package/dist/__tests__/unit/core/RelationManager.test.js +0 -274
  183. package/dist/__tests__/unit/features/CompressionManager.test.js +0 -350
  184. package/dist/__tests__/unit/search/BasicSearch.test.js +0 -311
  185. package/dist/__tests__/unit/search/BooleanSearch.test.js +0 -432
  186. package/dist/__tests__/unit/search/FuzzySearch.test.js +0 -448
  187. package/dist/__tests__/unit/search/RankedSearch.test.js +0 -379
  188. package/dist/__tests__/unit/utils/levenshtein.test.js +0 -77
  189. package/dist/core/KnowledgeGraphManager.js +0 -423
  190. package/dist/features/BackupManager.js +0 -311
  191. package/dist/features/ExportManager.js +0 -305
  192. package/dist/features/ImportExportManager.js +0 -50
  193. package/dist/features/ImportManager.js +0 -328
  194. package/dist/memory-saved-searches.jsonl +0 -0
  195. package/dist/memory-tag-aliases.jsonl +0 -0
  196. package/dist/types/analytics.types.js +0 -6
  197. package/dist/types/entity.types.js +0 -7
  198. package/dist/types/import-export.types.js +0 -7
  199. package/dist/types/search.types.js +0 -7
  200. package/dist/types/tag.types.js +0 -6
  201. package/dist/utils/dateUtils.js +0 -89
  202. package/dist/utils/filterUtils.js +0 -155
  203. package/dist/utils/levenshtein.js +0 -62
  204. package/dist/utils/pathUtils.js +0 -115
  205. package/dist/utils/responseFormatter.js +0 -55
  206. package/dist/utils/tagUtils.js +0 -107
  207. package/dist/utils/tfidf.js +0 -90
  208. package/dist/utils/validationHelper.js +0 -99
  209. package/dist/utils/validationUtils.js +0 -109
@@ -0,0 +1,346 @@
1
+ /**
2
+ * Graph Event Emitter
3
+ *
4
+ * Phase 10 Sprint 2: Provides event-based notifications for graph changes.
5
+ * Enables loose coupling between graph operations and dependent systems
6
+ * like search indexes, analytics, and external integrations.
7
+ *
8
+ * @module core/GraphEventEmitter
9
+ */
10
+ /**
11
+ * Phase 10 Sprint 2: Event emitter for graph change notifications.
12
+ *
13
+ * Provides a type-safe event system for subscribing to and emitting
14
+ * graph change events. Supports wildcard listeners for all events.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const emitter = new GraphEventEmitter();
19
+ *
20
+ * // Listen to specific event types
21
+ * emitter.on('entity:created', (event) => {
22
+ * console.log(`Entity ${event.entity.name} created`);
23
+ * });
24
+ *
25
+ * // Listen to all events
26
+ * emitter.onAny((event) => {
27
+ * console.log(`Event: ${event.type}`);
28
+ * });
29
+ *
30
+ * // Emit an event
31
+ * emitter.emitEntityCreated(entity);
32
+ *
33
+ * // Remove listener
34
+ * const unsubscribe = emitter.on('entity:deleted', handler);
35
+ * unsubscribe();
36
+ * ```
37
+ */
38
+ export class GraphEventEmitter {
39
+ /**
40
+ * Map of event types to their registered listeners.
41
+ */
42
+ listeners = new Map();
43
+ /**
44
+ * Listeners that receive all events regardless of type.
45
+ */
46
+ wildcardListeners = new Set();
47
+ /**
48
+ * Whether to suppress errors from listeners (default: true).
49
+ * When true, listener errors are logged but don't stop event propagation.
50
+ */
51
+ suppressListenerErrors = true;
52
+ /**
53
+ * Create a new GraphEventEmitter instance.
54
+ *
55
+ * @param options - Optional configuration
56
+ */
57
+ constructor(options) {
58
+ if (options?.suppressListenerErrors !== undefined) {
59
+ this.suppressListenerErrors = options.suppressListenerErrors;
60
+ }
61
+ }
62
+ // ==================== Subscription Methods ====================
63
+ /**
64
+ * Subscribe to a specific event type.
65
+ *
66
+ * @template K - The event type key
67
+ * @param eventType - The event type to listen for
68
+ * @param listener - Callback function to invoke when event occurs
69
+ * @returns Unsubscribe function to remove the listener
70
+ *
71
+ * @example
72
+ * ```typescript
73
+ * const unsubscribe = emitter.on('entity:created', (event) => {
74
+ * console.log(`Created: ${event.entity.name}`);
75
+ * });
76
+ *
77
+ * // Later: unsubscribe();
78
+ * ```
79
+ */
80
+ on(eventType, listener) {
81
+ if (!this.listeners.has(eventType)) {
82
+ this.listeners.set(eventType, new Set());
83
+ }
84
+ this.listeners.get(eventType).add(listener);
85
+ // Return unsubscribe function
86
+ return () => {
87
+ this.off(eventType, listener);
88
+ };
89
+ }
90
+ /**
91
+ * Unsubscribe from a specific event type.
92
+ *
93
+ * @template K - The event type key
94
+ * @param eventType - The event type to unsubscribe from
95
+ * @param listener - The listener function to remove
96
+ */
97
+ off(eventType, listener) {
98
+ const listeners = this.listeners.get(eventType);
99
+ if (listeners) {
100
+ listeners.delete(listener);
101
+ }
102
+ }
103
+ /**
104
+ * Subscribe to all event types.
105
+ *
106
+ * @param listener - Callback function to invoke for any event
107
+ * @returns Unsubscribe function to remove the listener
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * emitter.onAny((event) => {
112
+ * console.log(`Event: ${event.type} at ${event.timestamp}`);
113
+ * });
114
+ * ```
115
+ */
116
+ onAny(listener) {
117
+ this.wildcardListeners.add(listener);
118
+ return () => {
119
+ this.offAny(listener);
120
+ };
121
+ }
122
+ /**
123
+ * Unsubscribe from all events.
124
+ *
125
+ * @param listener - The listener function to remove
126
+ */
127
+ offAny(listener) {
128
+ this.wildcardListeners.delete(listener);
129
+ }
130
+ /**
131
+ * Subscribe to an event type, but only receive the first occurrence.
132
+ *
133
+ * @template K - The event type key
134
+ * @param eventType - The event type to listen for once
135
+ * @param listener - Callback function to invoke once
136
+ * @returns Unsubscribe function to cancel before event occurs
137
+ */
138
+ once(eventType, listener) {
139
+ const wrappedListener = ((event) => {
140
+ this.off(eventType, wrappedListener);
141
+ listener(event);
142
+ });
143
+ return this.on(eventType, wrappedListener);
144
+ }
145
+ /**
146
+ * Remove all listeners for all event types.
147
+ */
148
+ removeAllListeners() {
149
+ this.listeners.clear();
150
+ this.wildcardListeners.clear();
151
+ }
152
+ /**
153
+ * Get the count of listeners for a specific event type.
154
+ *
155
+ * @param eventType - The event type to count listeners for
156
+ * @returns Number of listeners registered
157
+ */
158
+ listenerCount(eventType) {
159
+ if (eventType) {
160
+ return (this.listeners.get(eventType)?.size ?? 0) + this.wildcardListeners.size;
161
+ }
162
+ // Count all listeners
163
+ let count = this.wildcardListeners.size;
164
+ for (const listeners of this.listeners.values()) {
165
+ count += listeners.size;
166
+ }
167
+ return count;
168
+ }
169
+ // ==================== Emit Methods ====================
170
+ /**
171
+ * Emit an event to all registered listeners.
172
+ *
173
+ * @param event - The event to emit
174
+ */
175
+ emit(event) {
176
+ // Notify type-specific listeners
177
+ const typeListeners = this.listeners.get(event.type);
178
+ if (typeListeners) {
179
+ for (const listener of typeListeners) {
180
+ this.invokeListener(listener, event);
181
+ }
182
+ }
183
+ // Notify wildcard listeners
184
+ for (const listener of this.wildcardListeners) {
185
+ this.invokeListener(listener, event);
186
+ }
187
+ }
188
+ /**
189
+ * Emit an entity:created event.
190
+ *
191
+ * @param entity - The entity that was created
192
+ */
193
+ emitEntityCreated(entity) {
194
+ const event = {
195
+ type: 'entity:created',
196
+ timestamp: new Date().toISOString(),
197
+ entity,
198
+ };
199
+ this.emit(event);
200
+ }
201
+ /**
202
+ * Emit an entity:updated event.
203
+ *
204
+ * @param entityName - Name of the updated entity
205
+ * @param changes - The changes that were applied
206
+ * @param previousValues - Optional previous values before update
207
+ */
208
+ emitEntityUpdated(entityName, changes, previousValues) {
209
+ const event = {
210
+ type: 'entity:updated',
211
+ timestamp: new Date().toISOString(),
212
+ entityName,
213
+ changes,
214
+ previousValues,
215
+ };
216
+ this.emit(event);
217
+ }
218
+ /**
219
+ * Emit an entity:deleted event.
220
+ *
221
+ * @param entityName - Name of the deleted entity
222
+ * @param entity - Optional entity data before deletion
223
+ */
224
+ emitEntityDeleted(entityName, entity) {
225
+ const event = {
226
+ type: 'entity:deleted',
227
+ timestamp: new Date().toISOString(),
228
+ entityName,
229
+ entity,
230
+ };
231
+ this.emit(event);
232
+ }
233
+ /**
234
+ * Emit a relation:created event.
235
+ *
236
+ * @param relation - The relation that was created
237
+ */
238
+ emitRelationCreated(relation) {
239
+ const event = {
240
+ type: 'relation:created',
241
+ timestamp: new Date().toISOString(),
242
+ relation,
243
+ };
244
+ this.emit(event);
245
+ }
246
+ /**
247
+ * Emit a relation:deleted event.
248
+ *
249
+ * @param from - Source entity name
250
+ * @param to - Target entity name
251
+ * @param relationType - Type of the deleted relation
252
+ */
253
+ emitRelationDeleted(from, to, relationType) {
254
+ const event = {
255
+ type: 'relation:deleted',
256
+ timestamp: new Date().toISOString(),
257
+ from,
258
+ to,
259
+ relationType,
260
+ };
261
+ this.emit(event);
262
+ }
263
+ /**
264
+ * Emit an observation:added event.
265
+ *
266
+ * @param entityName - Name of the entity
267
+ * @param observations - Observations that were added
268
+ */
269
+ emitObservationAdded(entityName, observations) {
270
+ if (observations.length === 0)
271
+ return;
272
+ const event = {
273
+ type: 'observation:added',
274
+ timestamp: new Date().toISOString(),
275
+ entityName,
276
+ observations,
277
+ };
278
+ this.emit(event);
279
+ }
280
+ /**
281
+ * Emit an observation:deleted event.
282
+ *
283
+ * @param entityName - Name of the entity
284
+ * @param observations - Observations that were deleted
285
+ */
286
+ emitObservationDeleted(entityName, observations) {
287
+ if (observations.length === 0)
288
+ return;
289
+ const event = {
290
+ type: 'observation:deleted',
291
+ timestamp: new Date().toISOString(),
292
+ entityName,
293
+ observations,
294
+ };
295
+ this.emit(event);
296
+ }
297
+ /**
298
+ * Emit a graph:saved event.
299
+ *
300
+ * @param entityCount - Number of entities in the saved graph
301
+ * @param relationCount - Number of relations in the saved graph
302
+ */
303
+ emitGraphSaved(entityCount, relationCount) {
304
+ const event = {
305
+ type: 'graph:saved',
306
+ timestamp: new Date().toISOString(),
307
+ entityCount,
308
+ relationCount,
309
+ };
310
+ this.emit(event);
311
+ }
312
+ /**
313
+ * Emit a graph:loaded event.
314
+ *
315
+ * @param entityCount - Number of entities in the loaded graph
316
+ * @param relationCount - Number of relations in the loaded graph
317
+ */
318
+ emitGraphLoaded(entityCount, relationCount) {
319
+ const event = {
320
+ type: 'graph:loaded',
321
+ timestamp: new Date().toISOString(),
322
+ entityCount,
323
+ relationCount,
324
+ };
325
+ this.emit(event);
326
+ }
327
+ // ==================== Helper Methods ====================
328
+ /**
329
+ * Safely invoke a listener, optionally catching errors.
330
+ * @private
331
+ */
332
+ invokeListener(listener, event) {
333
+ if (this.suppressListenerErrors) {
334
+ try {
335
+ listener(event);
336
+ }
337
+ catch (error) {
338
+ // Log but don't propagate errors from listeners
339
+ console.error(`GraphEventEmitter: Listener error for ${event.type}:`, error);
340
+ }
341
+ }
342
+ else {
343
+ listener(event);
344
+ }
345
+ }
346
+ }