@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,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
|
+
}
|