@henrychong-ai/mcp-neo4j-knowledge-graph 1.0.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 (120) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +718 -0
  3. package/dist/KnowledgeGraphManager.d.ts +215 -0
  4. package/dist/KnowledgeGraphManager.js +910 -0
  5. package/dist/KnowledgeGraphManager.js.map +1 -0
  6. package/dist/callToolHandler.d.ts +5 -0
  7. package/dist/callToolHandler.js +26 -0
  8. package/dist/callToolHandler.js.map +1 -0
  9. package/dist/cli/neo4j-setup.d.ts +52 -0
  10. package/dist/cli/neo4j-setup.js +258 -0
  11. package/dist/cli/neo4j-setup.js.map +1 -0
  12. package/dist/config/paths.d.ts +13 -0
  13. package/dist/config/paths.js +41 -0
  14. package/dist/config/paths.js.map +1 -0
  15. package/dist/config/storage.d.ts +35 -0
  16. package/dist/config/storage.js +52 -0
  17. package/dist/config/storage.js.map +1 -0
  18. package/dist/embeddings/DefaultEmbeddingService.d.ts +64 -0
  19. package/dist/embeddings/DefaultEmbeddingService.js +139 -0
  20. package/dist/embeddings/DefaultEmbeddingService.js.map +1 -0
  21. package/dist/embeddings/EmbeddingJobManager.d.ts +212 -0
  22. package/dist/embeddings/EmbeddingJobManager.js +545 -0
  23. package/dist/embeddings/EmbeddingJobManager.js.map +1 -0
  24. package/dist/embeddings/EmbeddingService.d.ts +96 -0
  25. package/dist/embeddings/EmbeddingService.js +44 -0
  26. package/dist/embeddings/EmbeddingService.js.map +1 -0
  27. package/dist/embeddings/EmbeddingServiceFactory.d.ts +72 -0
  28. package/dist/embeddings/EmbeddingServiceFactory.js +147 -0
  29. package/dist/embeddings/EmbeddingServiceFactory.js.map +1 -0
  30. package/dist/embeddings/OpenAIEmbeddingService.d.ts +73 -0
  31. package/dist/embeddings/OpenAIEmbeddingService.js +195 -0
  32. package/dist/embeddings/OpenAIEmbeddingService.js.map +1 -0
  33. package/dist/embeddings/config.d.ts +83 -0
  34. package/dist/embeddings/config.js +65 -0
  35. package/dist/embeddings/config.js.map +1 -0
  36. package/dist/index.d.ts +4 -0
  37. package/dist/index.js +220 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/server/handlers/callToolHandler.d.ts +20 -0
  40. package/dist/server/handlers/callToolHandler.js +505 -0
  41. package/dist/server/handlers/callToolHandler.js.map +1 -0
  42. package/dist/server/handlers/listToolsHandler.d.ts +7 -0
  43. package/dist/server/handlers/listToolsHandler.js +511 -0
  44. package/dist/server/handlers/listToolsHandler.js.map +1 -0
  45. package/dist/server/handlers/toolHandlers/addObservations.d.ts +12 -0
  46. package/dist/server/handlers/toolHandlers/addObservations.js +99 -0
  47. package/dist/server/handlers/toolHandlers/addObservations.js.map +1 -0
  48. package/dist/server/handlers/toolHandlers/createEntities.d.ts +12 -0
  49. package/dist/server/handlers/toolHandlers/createEntities.js +20 -0
  50. package/dist/server/handlers/toolHandlers/createEntities.js.map +1 -0
  51. package/dist/server/handlers/toolHandlers/createRelations.d.ts +12 -0
  52. package/dist/server/handlers/toolHandlers/createRelations.js +20 -0
  53. package/dist/server/handlers/toolHandlers/createRelations.js.map +1 -0
  54. package/dist/server/handlers/toolHandlers/deleteEntities.d.ts +12 -0
  55. package/dist/server/handlers/toolHandlers/deleteEntities.js +20 -0
  56. package/dist/server/handlers/toolHandlers/deleteEntities.js.map +1 -0
  57. package/dist/server/handlers/toolHandlers/index.d.ts +8 -0
  58. package/dist/server/handlers/toolHandlers/index.js +9 -0
  59. package/dist/server/handlers/toolHandlers/index.js.map +1 -0
  60. package/dist/server/handlers/toolHandlers/readGraph.d.ts +12 -0
  61. package/dist/server/handlers/toolHandlers/readGraph.js +20 -0
  62. package/dist/server/handlers/toolHandlers/readGraph.js.map +1 -0
  63. package/dist/server/setup.d.ts +8 -0
  64. package/dist/server/setup.js +48 -0
  65. package/dist/server/setup.js.map +1 -0
  66. package/dist/storage/FileStorageProvider.d.ts +125 -0
  67. package/dist/storage/FileStorageProvider.js +322 -0
  68. package/dist/storage/FileStorageProvider.js.map +1 -0
  69. package/dist/storage/SearchResultCache.d.ts +102 -0
  70. package/dist/storage/SearchResultCache.js +258 -0
  71. package/dist/storage/SearchResultCache.js.map +1 -0
  72. package/dist/storage/StorageProvider.d.ts +171 -0
  73. package/dist/storage/StorageProvider.js +46 -0
  74. package/dist/storage/StorageProvider.js.map +1 -0
  75. package/dist/storage/StorageProviderFactory.d.ts +63 -0
  76. package/dist/storage/StorageProviderFactory.js +113 -0
  77. package/dist/storage/StorageProviderFactory.js.map +1 -0
  78. package/dist/storage/VectorStoreFactory.d.ts +43 -0
  79. package/dist/storage/VectorStoreFactory.js +41 -0
  80. package/dist/storage/VectorStoreFactory.js.map +1 -0
  81. package/dist/storage/neo4j/Neo4jConfig.d.ts +37 -0
  82. package/dist/storage/neo4j/Neo4jConfig.js +13 -0
  83. package/dist/storage/neo4j/Neo4jConfig.js.map +1 -0
  84. package/dist/storage/neo4j/Neo4jConnectionManager.d.ts +40 -0
  85. package/dist/storage/neo4j/Neo4jConnectionManager.js +58 -0
  86. package/dist/storage/neo4j/Neo4jConnectionManager.js.map +1 -0
  87. package/dist/storage/neo4j/Neo4jSchemaManager.d.ts +74 -0
  88. package/dist/storage/neo4j/Neo4jSchemaManager.js +224 -0
  89. package/dist/storage/neo4j/Neo4jSchemaManager.js.map +1 -0
  90. package/dist/storage/neo4j/Neo4jStorageProvider.d.ts +225 -0
  91. package/dist/storage/neo4j/Neo4jStorageProvider.js +1900 -0
  92. package/dist/storage/neo4j/Neo4jStorageProvider.js.map +1 -0
  93. package/dist/storage/neo4j/Neo4jVectorStore.d.ts +80 -0
  94. package/dist/storage/neo4j/Neo4jVectorStore.js +396 -0
  95. package/dist/storage/neo4j/Neo4jVectorStore.js.map +1 -0
  96. package/dist/types/entity-embedding.d.ts +156 -0
  97. package/dist/types/entity-embedding.js +2 -0
  98. package/dist/types/entity-embedding.js.map +1 -0
  99. package/dist/types/relation.d.ts +77 -0
  100. package/dist/types/relation.js +93 -0
  101. package/dist/types/relation.js.map +1 -0
  102. package/dist/types/temporalEntity.d.ts +55 -0
  103. package/dist/types/temporalEntity.js +66 -0
  104. package/dist/types/temporalEntity.js.map +1 -0
  105. package/dist/types/temporalRelation.d.ts +60 -0
  106. package/dist/types/temporalRelation.js +89 -0
  107. package/dist/types/temporalRelation.js.map +1 -0
  108. package/dist/types/vector-index.d.ts +48 -0
  109. package/dist/types/vector-index.js +2 -0
  110. package/dist/types/vector-index.js.map +1 -0
  111. package/dist/types/vector-store.d.ts +16 -0
  112. package/dist/types/vector-store.js +2 -0
  113. package/dist/types/vector-store.js.map +1 -0
  114. package/dist/utils/fs.d.ts +2 -0
  115. package/dist/utils/fs.js +3 -0
  116. package/dist/utils/fs.js.map +1 -0
  117. package/dist/utils/logger.d.ts +10 -0
  118. package/dist/utils/logger.js +35 -0
  119. package/dist/utils/logger.js.map +1 -0
  120. package/package.json +85 -0
@@ -0,0 +1,545 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ import { LRUCache } from 'lru-cache';
3
+ import crypto from 'crypto';
4
+ /**
5
+ * Default logger implementation
6
+ */
7
+ const nullLogger = {
8
+ debug: () => { },
9
+ info: () => { },
10
+ warn: () => { },
11
+ error: () => { },
12
+ };
13
+ /**
14
+ * Manages embedding jobs for semantic search
15
+ */
16
+ export class EmbeddingJobManager {
17
+ /**
18
+ * Creates a new embedding job manager
19
+ *
20
+ * @param storageProvider - Provider for entity storage
21
+ * @param embeddingService - Service to generate embeddings
22
+ * @param rateLimiterOptions - Optional configuration for rate limiting
23
+ * @param cacheOptions - Optional configuration for caching
24
+ * @param logger - Optional logger for operation logging
25
+ */
26
+ constructor(storageProvider, embeddingService, rateLimiterOptions, cacheOptions, logger) {
27
+ this.cacheOptions = { size: 1000, ttl: 3600000 };
28
+ this.storageProvider = storageProvider;
29
+ this.embeddingService = embeddingService;
30
+ this.logger = logger || nullLogger;
31
+ // Setup rate limiter with defaults
32
+ const defaultRateLimiter = {
33
+ tokensPerInterval: 60,
34
+ interval: 60 * 1000,
35
+ };
36
+ const rateOptions = rateLimiterOptions || defaultRateLimiter;
37
+ this.rateLimiter = {
38
+ tokens: rateOptions.tokensPerInterval,
39
+ lastRefill: Date.now(),
40
+ tokensPerInterval: rateOptions.tokensPerInterval,
41
+ interval: rateOptions.interval,
42
+ };
43
+ // Setup LRU cache
44
+ if (cacheOptions) {
45
+ // Support both API styles (tests use maxItems/ttlHours)
46
+ this.cacheOptions = {
47
+ size: cacheOptions.size || cacheOptions.maxItems || 1000,
48
+ ttl: cacheOptions.ttl ||
49
+ (cacheOptions.ttlHours ? Math.round(cacheOptions.ttlHours * 60 * 60 * 1000) : 3600000),
50
+ };
51
+ }
52
+ this.cache = new LRUCache({
53
+ max: this.cacheOptions.size,
54
+ ttl: Math.max(1, Math.round(this.cacheOptions.ttl)),
55
+ updateAgeOnGet: true,
56
+ allowStale: false,
57
+ // Use a ttlAutopurge option to ensure items are purged when TTL expires
58
+ ttlAutopurge: true,
59
+ });
60
+ // Initialize database schema
61
+ this._initializeDatabase();
62
+ this.logger.info('EmbeddingJobManager initialized', {
63
+ cacheSize: this.cacheOptions.size,
64
+ cacheTtl: this.cacheOptions.ttl,
65
+ rateLimit: `${this.rateLimiter.tokensPerInterval} per ${this.rateLimiter.interval}ms`,
66
+ });
67
+ }
68
+ /**
69
+ * Initialize the database schema for embedding jobs
70
+ *
71
+ * @private
72
+ */
73
+ _initializeDatabase() {
74
+ const createTableSql = `
75
+ CREATE TABLE IF NOT EXISTS embedding_jobs (
76
+ id TEXT PRIMARY KEY,
77
+ entity_name TEXT NOT NULL,
78
+ status TEXT NOT NULL,
79
+ priority INTEGER NOT NULL DEFAULT 1,
80
+ created_at INTEGER NOT NULL,
81
+ processed_at INTEGER,
82
+ error TEXT,
83
+ attempts INTEGER NOT NULL DEFAULT 0,
84
+ max_attempts INTEGER NOT NULL DEFAULT 3
85
+ )
86
+ `;
87
+ // Create an index for efficient job retrieval
88
+ const createIndexSql = `
89
+ CREATE INDEX IF NOT EXISTS idx_embedding_jobs_status_priority
90
+ ON embedding_jobs (status, priority DESC)
91
+ `;
92
+ try {
93
+ this.storageProvider.db.exec(createTableSql);
94
+ this.storageProvider.db.exec(createIndexSql);
95
+ this.logger.debug('Database schema initialized for embedding jobs');
96
+ }
97
+ catch (error) {
98
+ this.logger.error('Failed to initialize database schema', { error });
99
+ throw error;
100
+ }
101
+ }
102
+ /**
103
+ * Schedule an entity for embedding generation
104
+ *
105
+ * @param entityName - Name of the entity to generate embedding for
106
+ * @param priority - Optional priority (higher priority jobs are processed first)
107
+ * @returns Job ID
108
+ */
109
+ async scheduleEntityEmbedding(entityName, priority = 1) {
110
+ // Verify entity exists
111
+ const entity = await this.storageProvider.getEntity(entityName);
112
+ if (!entity) {
113
+ const error = `Entity ${entityName} not found`;
114
+ this.logger.error('Failed to schedule embedding', { entityName, error });
115
+ throw new Error(error);
116
+ }
117
+ // Create a job ID
118
+ const jobId = uuidv4();
119
+ // Insert a new job record
120
+ const stmt = this.storageProvider.db.prepare(`
121
+ INSERT INTO embedding_jobs (
122
+ id, entity_name, status, priority, created_at, attempts, max_attempts
123
+ ) VALUES (?, ?, ?, ?, ?, ?, ?)
124
+ `);
125
+ stmt.run(jobId, entityName, 'pending', priority, Date.now(), 0, 3);
126
+ this.logger.info('Scheduled embedding job', {
127
+ jobId,
128
+ entityName,
129
+ priority,
130
+ });
131
+ return jobId;
132
+ }
133
+ /**
134
+ * Process a batch of pending embedding jobs
135
+ *
136
+ * @param batchSize - Maximum number of jobs to process
137
+ * @returns Result statistics
138
+ */
139
+ async processJobs(batchSize = 10) {
140
+ this.logger.info('Starting job processing', { batchSize });
141
+ // Get pending jobs, ordered by priority (highest first)
142
+ const stmt = this.storageProvider.db.prepare(`
143
+ SELECT * FROM embedding_jobs
144
+ WHERE status = 'pending'
145
+ ORDER BY priority DESC, created_at ASC
146
+ LIMIT ?
147
+ `);
148
+ const jobs = stmt.all(batchSize);
149
+ this.logger.debug('Found pending jobs', { count: jobs.length });
150
+ // Initialize counters
151
+ const result = {
152
+ processed: 0,
153
+ successful: 0,
154
+ failed: 0,
155
+ };
156
+ // Process each job
157
+ for (const job of jobs) {
158
+ // Check rate limiter before processing
159
+ const rateLimitCheck = this._checkRateLimiter();
160
+ if (!rateLimitCheck.success) {
161
+ this.logger.warn('Rate limit reached, pausing job processing', {
162
+ remaining: jobs.length - result.processed,
163
+ });
164
+ break; // Stop processing jobs if rate limit is reached
165
+ }
166
+ this.logger.info('Processing embedding job', {
167
+ jobId: job.id,
168
+ entityName: job.entity_name,
169
+ attempt: job.attempts + 1,
170
+ maxAttempts: job.max_attempts,
171
+ });
172
+ // Update job status to processing
173
+ this._updateJobStatus(job.id, 'processing', job.attempts + 1);
174
+ try {
175
+ // Get the entity
176
+ const entity = await this.storageProvider.getEntity(job.entity_name);
177
+ if (!entity) {
178
+ throw new Error(`Entity ${job.entity_name} not found`);
179
+ }
180
+ // Log entity details for debugging
181
+ this.logger.debug('Retrieved entity for embedding', {
182
+ entityName: job.entity_name,
183
+ entityType: entity.entityType,
184
+ hasObservations: entity.observations ? 'yes' : 'no',
185
+ observationsType: entity.observations ? typeof entity.observations : 'undefined',
186
+ observationsLength: entity.observations && Array.isArray(entity.observations)
187
+ ? entity.observations.length
188
+ : 'n/a',
189
+ });
190
+ // Prepare text for embedding
191
+ const text = this._prepareEntityText(entity);
192
+ // Try to get from cache or generate new embedding
193
+ this.logger.debug('Generating embedding for entity', { entityName: job.entity_name });
194
+ const embedding = await this._getCachedEmbeddingOrGenerate(text);
195
+ // Get model info for embedding metadata
196
+ const modelInfo = this.embeddingService.getModelInfo();
197
+ // Store the embedding with the entity
198
+ this.logger.debug('Storing entity vector', {
199
+ entityName: job.entity_name,
200
+ vectorLength: embedding.length,
201
+ model: modelInfo.name,
202
+ });
203
+ await this.storageProvider.storeEntityVector(job.entity_name, {
204
+ vector: embedding,
205
+ model: modelInfo.name,
206
+ lastUpdated: Date.now(),
207
+ });
208
+ // Update job status to completed
209
+ this._updateJobStatus(job.id, 'completed');
210
+ this.logger.info('Successfully processed embedding job', {
211
+ jobId: job.id,
212
+ entityName: job.entity_name,
213
+ model: modelInfo.name,
214
+ dimensions: embedding.length,
215
+ });
216
+ result.successful++;
217
+ }
218
+ catch (error) {
219
+ // Handle failures
220
+ const errorMessage = error instanceof Error ? error.message : String(error);
221
+ const errorStack = error instanceof Error ? error.stack : undefined;
222
+ this.logger.error('Failed to process embedding job', {
223
+ jobId: job.id,
224
+ entityName: job.entity_name,
225
+ error: errorMessage,
226
+ errorStack,
227
+ attempt: job.attempts + 1,
228
+ maxAttempts: job.max_attempts,
229
+ });
230
+ // Determine if we should mark as failed or keep for retry
231
+ if (job.attempts + 1 >= job.max_attempts) {
232
+ this._updateJobStatus(job.id, 'failed', job.attempts + 1, errorMessage);
233
+ }
234
+ else {
235
+ this._updateJobStatus(job.id, 'pending', job.attempts + 1, errorMessage);
236
+ }
237
+ result.failed++;
238
+ }
239
+ result.processed++;
240
+ }
241
+ // Log job processing results
242
+ const queueStatus = await this.getQueueStatus();
243
+ this.logger.info('Job processing complete', {
244
+ processed: result.processed,
245
+ successful: result.successful,
246
+ failed: result.failed,
247
+ remaining: queueStatus.pending,
248
+ });
249
+ return result;
250
+ }
251
+ /**
252
+ * Get the current status of the job queue
253
+ *
254
+ * @returns Queue statistics
255
+ */
256
+ async getQueueStatus() {
257
+ const getCountForStatus = (status) => {
258
+ let sql = 'SELECT COUNT(*) as count FROM embedding_jobs';
259
+ const params = [];
260
+ if (status) {
261
+ sql += ' WHERE status = ?';
262
+ params.push(status);
263
+ }
264
+ const stmt = this.storageProvider.db.prepare(sql);
265
+ const result = stmt.get(...params);
266
+ return result?.count || 0;
267
+ };
268
+ const pending = getCountForStatus('pending');
269
+ const processing = getCountForStatus('processing');
270
+ const completed = getCountForStatus('completed');
271
+ const failed = getCountForStatus('failed');
272
+ const total = getCountForStatus();
273
+ const result = {
274
+ pending,
275
+ processing,
276
+ completed,
277
+ failed,
278
+ totalJobs: total,
279
+ };
280
+ this.logger.debug('Retrieved queue status', result);
281
+ return result;
282
+ }
283
+ /**
284
+ * Retry failed embedding jobs
285
+ *
286
+ * @returns Number of jobs reset for retry
287
+ */
288
+ async retryFailedJobs() {
289
+ const stmt = this.storageProvider.db.prepare(`
290
+ UPDATE embedding_jobs
291
+ SET status = 'pending', attempts = 0
292
+ WHERE status = 'failed'
293
+ `);
294
+ const result = stmt.run();
295
+ const resetCount = result.changes || 0;
296
+ this.logger.info('Reset failed jobs for retry', { count: resetCount });
297
+ return resetCount;
298
+ }
299
+ /**
300
+ * Clean up old completed jobs
301
+ *
302
+ * @param threshold - Age in milliseconds after which to delete completed jobs, defaults to 7 days
303
+ * @returns Number of jobs cleaned up
304
+ */
305
+ async cleanupJobs(threshold) {
306
+ const cleanupThreshold = threshold || 7 * 24 * 60 * 60 * 1000; // Default: 7 days
307
+ const cutoffTime = Date.now() - cleanupThreshold;
308
+ const stmt = this.storageProvider.db.prepare(`
309
+ DELETE FROM embedding_jobs
310
+ WHERE status = 'completed'
311
+ AND processed_at < ?
312
+ `);
313
+ const result = stmt.run(cutoffTime);
314
+ const deletedCount = result.changes || 0;
315
+ this.logger.info('Cleaned up old completed jobs', {
316
+ count: deletedCount,
317
+ threshold: cleanupThreshold,
318
+ olderThan: new Date(cutoffTime).toISOString(),
319
+ });
320
+ return deletedCount;
321
+ }
322
+ /**
323
+ * Update a job's status in the database
324
+ *
325
+ * @private
326
+ * @param jobId - ID of the job to update
327
+ * @param status - New status
328
+ * @param attempts - Optional attempts count update
329
+ * @param error - Optional error message
330
+ * @returns Database result
331
+ */
332
+ _updateJobStatus(jobId, status, attempts, error) {
333
+ let sql = `
334
+ UPDATE embedding_jobs
335
+ SET status = ?
336
+ `;
337
+ const params = [status];
338
+ // Add processed_at timestamp for completed/failed statuses
339
+ if (status === 'completed' || status === 'failed') {
340
+ sql += ', processed_at = ?';
341
+ params.push(Date.now());
342
+ }
343
+ // Update attempts if provided
344
+ if (attempts !== undefined) {
345
+ sql += ', attempts = ?';
346
+ params.push(attempts);
347
+ }
348
+ // Include error message if provided
349
+ if (error) {
350
+ sql += ', error = ?';
351
+ params.push(error);
352
+ }
353
+ sql += ' WHERE id = ?';
354
+ params.push(jobId);
355
+ const stmt = this.storageProvider.db.prepare(sql);
356
+ return stmt.run(...params);
357
+ }
358
+ /**
359
+ * Check rate limiter and consume a token if available
360
+ *
361
+ * @private
362
+ * @returns Object with success flag
363
+ */
364
+ _checkRateLimiter() {
365
+ // For testing purposes, make it public by removing 'private'
366
+ const now = Date.now();
367
+ const elapsed = now - this.rateLimiter.lastRefill;
368
+ // If enough time has passed, refill tokens
369
+ if (elapsed >= this.rateLimiter.interval) {
370
+ // Calculate how many full intervals have passed
371
+ const intervals = Math.floor(elapsed / this.rateLimiter.interval);
372
+ // Completely refill tokens (don't accumulate beyond max)
373
+ this.rateLimiter.tokens = this.rateLimiter.tokensPerInterval;
374
+ // Update last refill time, keeping track of remaining time
375
+ this.rateLimiter.lastRefill = now;
376
+ this.logger.debug('Refilled rate limiter tokens', {
377
+ current: this.rateLimiter.tokens,
378
+ max: this.rateLimiter.tokensPerInterval,
379
+ intervals,
380
+ });
381
+ }
382
+ // If we have tokens, consume one and return success
383
+ if (this.rateLimiter.tokens > 0) {
384
+ this.rateLimiter.tokens--;
385
+ this.logger.debug('Consumed rate limiter token', {
386
+ remaining: this.rateLimiter.tokens,
387
+ max: this.rateLimiter.tokensPerInterval,
388
+ });
389
+ return { success: true };
390
+ }
391
+ // No tokens available
392
+ this.logger.warn('Rate limit exceeded', {
393
+ availableTokens: 0,
394
+ maxTokens: this.rateLimiter.tokensPerInterval,
395
+ nextRefillIn: this.rateLimiter.interval - (now - this.rateLimiter.lastRefill),
396
+ });
397
+ return { success: false };
398
+ }
399
+ /**
400
+ * Get the current status of the rate limiter
401
+ *
402
+ * @returns Rate limiter status information
403
+ */
404
+ getRateLimiterStatus() {
405
+ const now = Date.now();
406
+ const elapsed = now - this.rateLimiter.lastRefill;
407
+ // If enough time has passed for a complete refill
408
+ if (elapsed >= this.rateLimiter.interval) {
409
+ return {
410
+ availableTokens: this.rateLimiter.tokensPerInterval,
411
+ maxTokens: this.rateLimiter.tokensPerInterval,
412
+ resetInMs: this.rateLimiter.interval,
413
+ };
414
+ }
415
+ // Otherwise return current state
416
+ return {
417
+ availableTokens: this.rateLimiter.tokens,
418
+ maxTokens: this.rateLimiter.tokensPerInterval,
419
+ resetInMs: this.rateLimiter.interval - elapsed,
420
+ };
421
+ }
422
+ /**
423
+ * Retrieve a cached embedding or generate a new one
424
+ *
425
+ * @param text - Text to generate embedding for
426
+ * @returns Embedding vector
427
+ */
428
+ async _getCachedEmbeddingOrGenerate(text) {
429
+ const cacheKey = this._generateCacheKey(text);
430
+ // Try to get from cache first
431
+ const cachedValue = this.cache.get(cacheKey);
432
+ if (cachedValue) {
433
+ this.logger.debug('Cache hit', {
434
+ textHash: cacheKey.substring(0, 8),
435
+ age: Date.now() - cachedValue.timestamp,
436
+ });
437
+ return cachedValue.embedding;
438
+ }
439
+ this.logger.debug('Cache miss', { textHash: cacheKey.substring(0, 8) });
440
+ try {
441
+ // Generate new embedding
442
+ const embedding = await this.embeddingService.generateEmbedding(text);
443
+ // Store in cache
444
+ this._cacheEmbedding(text, embedding);
445
+ return embedding;
446
+ }
447
+ catch (error) {
448
+ this.logger.error('Failed to generate embedding', {
449
+ error,
450
+ textLength: text.length,
451
+ });
452
+ throw error;
453
+ }
454
+ }
455
+ /**
456
+ * Store an embedding in the cache
457
+ *
458
+ * @private
459
+ * @param text - Original text
460
+ * @param embedding - Embedding vector
461
+ */
462
+ _cacheEmbedding(text, embedding) {
463
+ const cacheKey = this._generateCacheKey(text);
464
+ const modelInfo = this.embeddingService.getModelInfo();
465
+ this.cache.set(cacheKey, {
466
+ embedding,
467
+ timestamp: Date.now(),
468
+ model: modelInfo.name,
469
+ });
470
+ this.logger.debug('Cached embedding', {
471
+ textHash: cacheKey.substring(0, 8),
472
+ model: modelInfo.name,
473
+ dimensions: embedding.length,
474
+ });
475
+ }
476
+ /**
477
+ * Generate a deterministic cache key for text
478
+ *
479
+ * @private
480
+ * @param text - Text to hash
481
+ * @returns Cache key
482
+ */
483
+ _generateCacheKey(text) {
484
+ return crypto.createHash('md5').update(text).digest('hex');
485
+ }
486
+ /**
487
+ * Prepare text for embedding from an entity
488
+ *
489
+ * @private
490
+ * @param entity - Entity to prepare text from
491
+ * @returns Processed text ready for embedding
492
+ */
493
+ _prepareEntityText(entity) {
494
+ // Create a descriptive text from entity data
495
+ const lines = [`Name: ${entity.name}`, `Type: ${entity.entityType}`, 'Observations:'];
496
+ // Add observations, ensuring we handle both string arrays and other formats
497
+ if (entity.observations) {
498
+ // Handle case where observations might be stored as JSON string in some providers
499
+ let observationsArray = entity.observations;
500
+ // If observations is a string, try to parse it as JSON
501
+ if (typeof entity.observations === 'string') {
502
+ try {
503
+ observationsArray = JSON.parse(entity.observations);
504
+ }
505
+ catch {
506
+ // If parsing fails, treat it as a single observation
507
+ observationsArray = [entity.observations];
508
+ }
509
+ }
510
+ // Ensure it's an array at this point
511
+ if (!Array.isArray(observationsArray)) {
512
+ observationsArray = [String(observationsArray)];
513
+ }
514
+ // Add each observation to the text
515
+ if (observationsArray.length > 0) {
516
+ lines.push(...observationsArray.map((obs) => `- ${obs}`));
517
+ }
518
+ else {
519
+ lines.push(' (No observations)');
520
+ }
521
+ }
522
+ else {
523
+ lines.push(' (No observations)');
524
+ }
525
+ const text = lines.join('\n');
526
+ // Log the prepared text for debugging
527
+ this.logger.debug('Prepared entity text for embedding', {
528
+ entityName: entity.name,
529
+ entityType: entity.entityType,
530
+ observationCount: Array.isArray(entity.observations) ? entity.observations.length : 0,
531
+ textLength: text.length,
532
+ });
533
+ return text;
534
+ }
535
+ /**
536
+ * Get a cached embedding entry (used for testing)
537
+ *
538
+ * @param key - Cache key
539
+ * @returns Cached embedding or undefined
540
+ */
541
+ getCacheEntry(key) {
542
+ return this.cache.get(key);
543
+ }
544
+ }
545
+ //# sourceMappingURL=EmbeddingJobManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbeddingJobManager.js","sourceRoot":"","sources":["../../src/embeddings/EmbeddingJobManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Provider information for embedding services
3
+ */
4
+ export interface EmbeddingProviderInfo {
5
+ /**
6
+ * Name of the embedding provider
7
+ */
8
+ provider: string;
9
+ /**
10
+ * Name of the embedding model
11
+ */
12
+ model: string;
13
+ /**
14
+ * Number of dimensions in the embedding vectors
15
+ */
16
+ dimensions: number;
17
+ }
18
+ /**
19
+ * Model information for embedding models
20
+ */
21
+ export interface EmbeddingModelInfo {
22
+ /**
23
+ * Name of the embedding model
24
+ */
25
+ name: string;
26
+ /**
27
+ * Number of dimensions in the embedding vectors
28
+ */
29
+ dimensions: number;
30
+ /**
31
+ * Version of the model
32
+ */
33
+ version: string;
34
+ }
35
+ /**
36
+ * Interface for text embedding services
37
+ */
38
+ export interface IEmbeddingService {
39
+ /**
40
+ * Generate embedding vector for text
41
+ *
42
+ * @param text - Text to embed
43
+ * @returns Embedding vector
44
+ */
45
+ generateEmbedding(text: string): Promise<number[]>;
46
+ /**
47
+ * Generate embeddings for multiple texts
48
+ *
49
+ * @param texts - Array of texts to embed
50
+ * @returns Array of embedding vectors
51
+ */
52
+ generateEmbeddings(texts: string[]): Promise<number[][]>;
53
+ /**
54
+ * Get information about the embedding model
55
+ *
56
+ * @returns Model information
57
+ */
58
+ getModelInfo(): EmbeddingModelInfo;
59
+ /**
60
+ * Get information about the embedding provider
61
+ *
62
+ * @returns Provider information
63
+ */
64
+ getProviderInfo(): EmbeddingProviderInfo;
65
+ }
66
+ /**
67
+ * Abstract class for embedding services
68
+ */
69
+ export declare class EmbeddingService implements IEmbeddingService {
70
+ /**
71
+ * Generate embedding vector for text
72
+ *
73
+ * @param text - Text to embed
74
+ * @returns Embedding vector
75
+ */
76
+ generateEmbedding(_text: string): Promise<number[]>;
77
+ /**
78
+ * Generate embeddings for multiple texts
79
+ *
80
+ * @param texts - Array of texts to embed
81
+ * @returns Array of embedding vectors
82
+ */
83
+ generateEmbeddings(_texts: string[]): Promise<number[][]>;
84
+ /**
85
+ * Get information about the embedding model
86
+ *
87
+ * @returns Model information
88
+ */
89
+ getModelInfo(): EmbeddingModelInfo;
90
+ /**
91
+ * Get information about the embedding provider
92
+ *
93
+ * @returns Provider information
94
+ */
95
+ getProviderInfo(): EmbeddingProviderInfo;
96
+ }