@danielsimonjr/memory-mcp 9.9.0 → 10.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 (70) hide show
  1. package/dist/core/EntityManager.d.ts +2 -0
  2. package/dist/core/EntityManager.d.ts.map +1 -1
  3. package/dist/core/EntityManager.js +14 -9
  4. package/dist/core/RelationManager.d.ts.map +1 -1
  5. package/dist/core/RelationManager.js +5 -4
  6. package/dist/features/CompressionManager.d.ts +3 -1
  7. package/dist/features/CompressionManager.d.ts.map +1 -1
  8. package/dist/features/CompressionManager.js +14 -5
  9. package/dist/search/BM25Search.d.ts +148 -0
  10. package/dist/search/BM25Search.d.ts.map +1 -0
  11. package/dist/search/BM25Search.js +339 -0
  12. package/dist/search/EarlyTerminationManager.d.ts +140 -0
  13. package/dist/search/EarlyTerminationManager.d.ts.map +1 -0
  14. package/dist/search/EarlyTerminationManager.js +279 -0
  15. package/dist/search/EmbeddingCache.d.ts +175 -0
  16. package/dist/search/EmbeddingCache.d.ts.map +1 -0
  17. package/dist/search/EmbeddingCache.js +246 -0
  18. package/dist/search/EmbeddingService.d.ts +108 -9
  19. package/dist/search/EmbeddingService.d.ts.map +1 -1
  20. package/dist/search/EmbeddingService.js +187 -15
  21. package/dist/search/HybridScorer.d.ts +181 -0
  22. package/dist/search/HybridScorer.d.ts.map +1 -0
  23. package/dist/search/HybridScorer.js +257 -0
  24. package/dist/search/IncrementalIndexer.d.ts +201 -0
  25. package/dist/search/IncrementalIndexer.d.ts.map +1 -0
  26. package/dist/search/IncrementalIndexer.js +342 -0
  27. package/dist/search/OptimizedInvertedIndex.d.ts +163 -0
  28. package/dist/search/OptimizedInvertedIndex.d.ts.map +1 -0
  29. package/dist/search/OptimizedInvertedIndex.js +358 -0
  30. package/dist/search/ParallelSearchExecutor.d.ts +172 -0
  31. package/dist/search/ParallelSearchExecutor.d.ts.map +1 -0
  32. package/dist/search/ParallelSearchExecutor.js +309 -0
  33. package/dist/search/QuantizedVectorStore.d.ts +171 -0
  34. package/dist/search/QuantizedVectorStore.d.ts.map +1 -0
  35. package/dist/search/QuantizedVectorStore.js +307 -0
  36. package/dist/search/QueryCostEstimator.d.ts +135 -2
  37. package/dist/search/QueryCostEstimator.d.ts.map +1 -1
  38. package/dist/search/QueryCostEstimator.js +298 -1
  39. package/dist/search/QueryPlanCache.d.ts +220 -0
  40. package/dist/search/QueryPlanCache.d.ts.map +1 -0
  41. package/dist/search/QueryPlanCache.js +379 -0
  42. package/dist/search/ReflectionManager.d.ts +49 -0
  43. package/dist/search/ReflectionManager.d.ts.map +1 -1
  44. package/dist/search/ReflectionManager.js +113 -6
  45. package/dist/search/index.d.ts +12 -3
  46. package/dist/search/index.d.ts.map +1 -1
  47. package/dist/search/index.js +20 -2
  48. package/dist/types/index.d.ts +1 -1
  49. package/dist/types/index.d.ts.map +1 -1
  50. package/dist/types/types.d.ts +41 -2
  51. package/dist/types/types.d.ts.map +1 -1
  52. package/dist/utils/BatchProcessor.d.ts +271 -0
  53. package/dist/utils/BatchProcessor.d.ts.map +1 -0
  54. package/dist/utils/BatchProcessor.js +376 -0
  55. package/dist/utils/MemoryMonitor.d.ts +176 -0
  56. package/dist/utils/MemoryMonitor.d.ts.map +1 -0
  57. package/dist/utils/MemoryMonitor.js +305 -0
  58. package/dist/utils/WorkerPoolManager.d.ts +233 -0
  59. package/dist/utils/WorkerPoolManager.d.ts.map +1 -0
  60. package/dist/utils/WorkerPoolManager.js +420 -0
  61. package/dist/utils/compressedCache.d.ts +29 -0
  62. package/dist/utils/compressedCache.d.ts.map +1 -1
  63. package/dist/utils/compressedCache.js +39 -0
  64. package/dist/utils/entityUtils.d.ts +25 -0
  65. package/dist/utils/entityUtils.d.ts.map +1 -1
  66. package/dist/utils/entityUtils.js +33 -0
  67. package/dist/utils/index.d.ts +4 -1
  68. package/dist/utils/index.d.ts.map +1 -1
  69. package/dist/utils/index.js +8 -0
  70. package/package.json +1 -1
@@ -2,21 +2,57 @@
2
2
  * Embedding Service
3
3
  *
4
4
  * Phase 4 Sprint 10: Provides embedding abstractions for semantic search.
5
+ * Phase 12 Sprint 5: Added query/document prefixes, l2Normalize, mode parameter,
6
+ * and batch embedding with progress callback.
5
7
  * Supports multiple providers: OpenAI (cloud) and local (transformers.js).
6
8
  *
7
9
  * @module search/EmbeddingService
8
10
  */
9
11
  import { EMBEDDING_DEFAULTS, OPENAI_API_CONFIG, getEmbeddingConfig, } from '../utils/constants.js';
12
+ /**
13
+ * Phase 12 Sprint 5: Prefixes for query-optimized embedding encoding.
14
+ *
15
+ * These prefixes are used to distinguish between query and document embeddings,
16
+ * which can improve retrieval performance with asymmetric embedding models.
17
+ */
18
+ export const QUERY_PREFIX = 'query: ';
19
+ export const DOCUMENT_PREFIX = 'passage: ';
20
+ /**
21
+ * Phase 12 Sprint 5: L2 normalize a vector for cosine similarity.
22
+ *
23
+ * Normalizes a vector to unit length (magnitude 1), which is required
24
+ * for accurate cosine similarity calculations.
25
+ *
26
+ * @param vector - Input vector to normalize
27
+ * @returns L2 normalized vector
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const normalized = l2Normalize([3, 4]); // [0.6, 0.8]
32
+ * ```
33
+ */
34
+ export function l2Normalize(vector) {
35
+ let magnitude = 0;
36
+ for (const v of vector) {
37
+ magnitude += v * v;
38
+ }
39
+ magnitude = Math.sqrt(magnitude);
40
+ if (magnitude === 0 || magnitude === 1) {
41
+ return magnitude === 0 ? vector : vector.slice();
42
+ }
43
+ return vector.map(v => v / magnitude);
44
+ }
10
45
  /**
11
46
  * OpenAI Embedding Service
12
47
  *
13
48
  * Uses OpenAI's text-embedding-3-small model for generating embeddings.
14
49
  * Supports single and batch embedding with rate limit handling.
50
+ * Phase 12 Sprint 5: Added mode parameter and progress callback support.
15
51
  *
16
52
  * @example
17
53
  * ```typescript
18
54
  * const service = new OpenAIEmbeddingService('sk-...');
19
- * const embedding = await service.embed("Hello world");
55
+ * const embedding = await service.embed("Hello world", 'query');
20
56
  * console.log(`Generated ${embedding.length} dimensions`);
21
57
  * ```
22
58
  */
@@ -45,36 +81,86 @@ export class OpenAIEmbeddingService {
45
81
  async isReady() {
46
82
  return !!this.apiKey;
47
83
  }
84
+ /**
85
+ * Apply prefix to text based on embedding mode.
86
+ *
87
+ * @param text - Original text
88
+ * @param mode - Embedding mode ('query' or 'document')
89
+ * @returns Text with appropriate prefix
90
+ */
91
+ applyPrefix(text, mode = 'document') {
92
+ return mode === 'query' ? `${QUERY_PREFIX}${text}` : `${DOCUMENT_PREFIX}${text}`;
93
+ }
48
94
  /**
49
95
  * Generate embedding for a single text.
50
96
  *
51
97
  * @param text - Text to embed
98
+ * @param mode - Embedding mode ('query' or 'document', default: 'document')
52
99
  * @returns Embedding vector
53
100
  */
54
- async embed(text) {
55
- const results = await this.embedBatch([text]);
101
+ async embed(text, mode = 'document') {
102
+ const results = await this.embedBatch([text], mode);
56
103
  return results[0];
57
104
  }
58
105
  /**
59
106
  * Generate embeddings for multiple texts in batch.
60
107
  *
61
108
  * @param texts - Array of texts to embed
109
+ * @param mode - Embedding mode ('query' or 'document', default: 'document')
62
110
  * @returns Array of embedding vectors
63
111
  */
64
- async embedBatch(texts) {
112
+ async embedBatch(texts, mode = 'document') {
65
113
  if (texts.length === 0) {
66
114
  return [];
67
115
  }
116
+ // Apply prefix based on mode
117
+ const prefixedTexts = texts.map(text => this.applyPrefix(text, mode));
68
118
  // Split into batches if needed
69
119
  const maxBatchSize = EMBEDDING_DEFAULTS.OPENAI_MAX_BATCH_SIZE;
70
120
  const results = [];
71
- for (let i = 0; i < texts.length; i += maxBatchSize) {
72
- const batch = texts.slice(i, i + maxBatchSize);
121
+ for (let i = 0; i < prefixedTexts.length; i += maxBatchSize) {
122
+ const batch = prefixedTexts.slice(i, i + maxBatchSize);
73
123
  const batchResults = await this.embedBatchInternal(batch);
74
124
  results.push(...batchResults);
75
125
  }
76
126
  return results;
77
127
  }
128
+ /**
129
+ * Generate embeddings with progress callback support.
130
+ *
131
+ * Phase 12 Sprint 5: Added for tracking progress on large batch operations.
132
+ *
133
+ * @param texts - Array of texts to embed
134
+ * @param mode - Embedding mode ('query' or 'document', default: 'document')
135
+ * @param onProgress - Optional progress callback
136
+ * @returns Array of embedding vectors
137
+ */
138
+ async embedBatchWithProgress(texts, mode = 'document', onProgress) {
139
+ if (texts.length === 0) {
140
+ return [];
141
+ }
142
+ // Apply prefix based on mode
143
+ const prefixedTexts = texts.map(text => this.applyPrefix(text, mode));
144
+ // Split into batches if needed
145
+ const maxBatchSize = EMBEDDING_DEFAULTS.OPENAI_MAX_BATCH_SIZE;
146
+ const results = [];
147
+ const total = prefixedTexts.length;
148
+ for (let i = 0; i < prefixedTexts.length; i += maxBatchSize) {
149
+ const batch = prefixedTexts.slice(i, i + maxBatchSize);
150
+ const batchResults = await this.embedBatchInternal(batch);
151
+ results.push(...batchResults);
152
+ // Report progress
153
+ if (onProgress) {
154
+ const current = Math.min(i + maxBatchSize, total);
155
+ onProgress({
156
+ current,
157
+ total,
158
+ percentage: Math.round((current / total) * 100),
159
+ });
160
+ }
161
+ }
162
+ return results;
163
+ }
78
164
  /**
79
165
  * Internal batch embedding with retry logic.
80
166
  */
@@ -148,6 +234,7 @@ export class OpenAIEmbeddingService {
148
234
  *
149
235
  * Uses @xenova/transformers for local embedding generation.
150
236
  * No API calls needed - runs entirely offline after initial model download.
237
+ * Phase 12 Sprint 5: Added mode parameter and progress callback support.
151
238
  *
152
239
  * Note: Requires @xenova/transformers to be installed as an optional dependency.
153
240
  * If not available, initialization will fail gracefully.
@@ -156,7 +243,7 @@ export class OpenAIEmbeddingService {
156
243
  * ```typescript
157
244
  * const service = new LocalEmbeddingService();
158
245
  * await service.initialize();
159
- * const embedding = await service.embed("Hello world");
246
+ * const embedding = await service.embed("Hello world", 'query');
160
247
  * ```
161
248
  */
162
249
  export class LocalEmbeddingService {
@@ -219,16 +306,28 @@ export class LocalEmbeddingService {
219
306
  }
220
307
  return this.initialized;
221
308
  }
309
+ /**
310
+ * Apply prefix to text based on embedding mode.
311
+ *
312
+ * @param text - Original text
313
+ * @param mode - Embedding mode ('query' or 'document')
314
+ * @returns Text with appropriate prefix
315
+ */
316
+ applyPrefix(text, mode = 'document') {
317
+ return mode === 'query' ? `${QUERY_PREFIX}${text}` : `${DOCUMENT_PREFIX}${text}`;
318
+ }
222
319
  /**
223
320
  * Generate embedding for a single text.
224
321
  *
225
322
  * @param text - Text to embed
323
+ * @param mode - Embedding mode ('query' or 'document', default: 'document')
226
324
  * @returns Embedding vector
227
325
  */
228
- async embed(text) {
326
+ async embed(text, mode = 'document') {
229
327
  await this.ensureInitialized();
328
+ const prefixedText = this.applyPrefix(text, mode);
230
329
  const pipelineFn = this.pipeline;
231
- const output = await pipelineFn(text, { pooling: 'mean', normalize: true });
330
+ const output = await pipelineFn(prefixedText, { pooling: 'mean', normalize: true });
232
331
  return Array.from(output.data);
233
332
  }
234
333
  /**
@@ -236,14 +335,44 @@ export class LocalEmbeddingService {
236
335
  * Note: Local processing is done sequentially to avoid memory issues.
237
336
  *
238
337
  * @param texts - Array of texts to embed
338
+ * @param mode - Embedding mode ('query' or 'document', default: 'document')
239
339
  * @returns Array of embedding vectors
240
340
  */
241
- async embedBatch(texts) {
341
+ async embedBatch(texts, mode = 'document') {
242
342
  await this.ensureInitialized();
243
343
  const results = [];
244
344
  for (const text of texts) {
245
- const embedding = await this.embed(text);
345
+ const embedding = await this.embed(text, mode);
346
+ results.push(embedding);
347
+ }
348
+ return results;
349
+ }
350
+ /**
351
+ * Generate embeddings with progress callback support.
352
+ *
353
+ * Phase 12 Sprint 5: Added for tracking progress on large batch operations.
354
+ *
355
+ * @param texts - Array of texts to embed
356
+ * @param mode - Embedding mode ('query' or 'document', default: 'document')
357
+ * @param onProgress - Optional progress callback
358
+ * @returns Array of embedding vectors
359
+ */
360
+ async embedBatchWithProgress(texts, mode = 'document', onProgress) {
361
+ await this.ensureInitialized();
362
+ const results = [];
363
+ const total = texts.length;
364
+ for (let i = 0; i < texts.length; i++) {
365
+ const embedding = await this.embed(texts[i], mode);
246
366
  results.push(embedding);
367
+ // Report progress
368
+ if (onProgress) {
369
+ const current = i + 1;
370
+ onProgress({
371
+ current,
372
+ total,
373
+ percentage: Math.round((current / total) * 100),
374
+ });
375
+ }
247
376
  }
248
377
  return results;
249
378
  }
@@ -261,6 +390,7 @@ export class LocalEmbeddingService {
261
390
  *
262
391
  * Generates deterministic mock embeddings for testing purposes.
263
392
  * Useful for unit tests that don't need real embeddings.
393
+ * Phase 12 Sprint 5: Added mode parameter and progress callback support.
264
394
  */
265
395
  export class MockEmbeddingService {
266
396
  dimensions;
@@ -280,15 +410,28 @@ export class MockEmbeddingService {
280
410
  async isReady() {
281
411
  return true;
282
412
  }
413
+ /**
414
+ * Apply prefix to text based on embedding mode.
415
+ *
416
+ * @param text - Original text
417
+ * @param mode - Embedding mode ('query' or 'document')
418
+ * @returns Text with appropriate prefix
419
+ */
420
+ applyPrefix(text, mode = 'document') {
421
+ return mode === 'query' ? `${QUERY_PREFIX}${text}` : `${DOCUMENT_PREFIX}${text}`;
422
+ }
283
423
  /**
284
424
  * Generate a deterministic mock embedding for a text.
285
425
  *
286
426
  * @param text - Text to embed
427
+ * @param mode - Embedding mode ('query' or 'document', default: 'document')
287
428
  * @returns Mock embedding vector
288
429
  */
289
- async embed(text) {
430
+ async embed(text, mode = 'document') {
431
+ // Apply prefix based on mode (affects hash for different embeddings per mode)
432
+ const prefixedText = this.applyPrefix(text, mode);
290
433
  // Generate deterministic embedding based on text hash
291
- const hash = this.hashString(text);
434
+ const hash = this.hashString(prefixedText);
292
435
  const embedding = [];
293
436
  for (let i = 0; i < this.dimensions; i++) {
294
437
  // Use hash and index to generate deterministic values
@@ -302,10 +445,39 @@ export class MockEmbeddingService {
302
445
  * Generate mock embeddings for multiple texts.
303
446
  *
304
447
  * @param texts - Array of texts to embed
448
+ * @param mode - Embedding mode ('query' or 'document', default: 'document')
449
+ * @returns Array of mock embedding vectors
450
+ */
451
+ async embedBatch(texts, mode = 'document') {
452
+ return Promise.all(texts.map(text => this.embed(text, mode)));
453
+ }
454
+ /**
455
+ * Generate mock embeddings with progress callback support.
456
+ *
457
+ * Phase 12 Sprint 5: Added for tracking progress on large batch operations.
458
+ *
459
+ * @param texts - Array of texts to embed
460
+ * @param mode - Embedding mode ('query' or 'document', default: 'document')
461
+ * @param onProgress - Optional progress callback
305
462
  * @returns Array of mock embedding vectors
306
463
  */
307
- async embedBatch(texts) {
308
- return Promise.all(texts.map(text => this.embed(text)));
464
+ async embedBatchWithProgress(texts, mode = 'document', onProgress) {
465
+ const results = [];
466
+ const total = texts.length;
467
+ for (let i = 0; i < texts.length; i++) {
468
+ const embedding = await this.embed(texts[i], mode);
469
+ results.push(embedding);
470
+ // Report progress
471
+ if (onProgress) {
472
+ const current = i + 1;
473
+ onProgress({
474
+ current,
475
+ total,
476
+ percentage: Math.round((current / total) * 100),
477
+ });
478
+ }
479
+ }
480
+ return results;
309
481
  }
310
482
  /**
311
483
  * Simple string hash function.
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Hybrid Scorer
3
+ *
4
+ * Combines semantic, lexical, and symbolic search scores with
5
+ * min-max normalization and configurable weights.
6
+ *
7
+ * Phase 12 Sprint 3: Search Algorithm Optimization
8
+ *
9
+ * @module search/HybridScorer
10
+ */
11
+ import type { Entity } from '../types/index.js';
12
+ /**
13
+ * Result from semantic search layer.
14
+ */
15
+ export interface SemanticSearchResult {
16
+ /** Entity name */
17
+ entityName: string;
18
+ /** Similarity score (typically 0-1 for cosine similarity) */
19
+ similarity: number;
20
+ /** The matched entity (if resolved) */
21
+ entity?: Entity;
22
+ }
23
+ /**
24
+ * Result from lexical search layer (TF-IDF or BM25).
25
+ */
26
+ export interface LexicalSearchResult {
27
+ /** Entity name */
28
+ entityName: string;
29
+ /** Relevance score (unbounded, higher is better) */
30
+ score: number;
31
+ /** The matched entity (if resolved) */
32
+ entity?: Entity;
33
+ }
34
+ /**
35
+ * Result from symbolic search layer.
36
+ */
37
+ export interface SymbolicSearchResult {
38
+ /** Entity name */
39
+ entityName: string;
40
+ /** Match score (typically 0-1) */
41
+ score: number;
42
+ /** The matched entity (if resolved) */
43
+ entity?: Entity;
44
+ }
45
+ /**
46
+ * Combined result with scores from all layers.
47
+ */
48
+ export interface ScoredResult {
49
+ /** Entity name */
50
+ entityName: string;
51
+ /** The matched entity */
52
+ entity: Entity;
53
+ /** Individual layer scores (normalized 0-1) */
54
+ scores: {
55
+ semantic: number;
56
+ lexical: number;
57
+ symbolic: number;
58
+ combined: number;
59
+ };
60
+ /** Which layers contributed to this result */
61
+ matchedLayers: ('semantic' | 'lexical' | 'symbolic')[];
62
+ /** Original raw scores before normalization */
63
+ rawScores: {
64
+ semantic?: number;
65
+ lexical?: number;
66
+ symbolic?: number;
67
+ };
68
+ }
69
+ /**
70
+ * Configurable weights for hybrid scoring.
71
+ */
72
+ export interface HybridWeights {
73
+ /** Weight for semantic layer (default: 0.4) */
74
+ semantic: number;
75
+ /** Weight for lexical layer (default: 0.4) */
76
+ lexical: number;
77
+ /** Weight for symbolic layer (default: 0.2) */
78
+ symbolic: number;
79
+ }
80
+ /**
81
+ * Default weights for hybrid search.
82
+ */
83
+ export declare const DEFAULT_SCORER_WEIGHTS: HybridWeights;
84
+ /**
85
+ * Options for the HybridScorer.
86
+ */
87
+ export interface HybridScorerOptions {
88
+ /** Weights for each layer */
89
+ weights?: Partial<HybridWeights>;
90
+ /** Minimum score to include in results (default: 0) */
91
+ minScore?: number;
92
+ /** Whether to normalize weights to sum to 1 (default: true) */
93
+ normalizeWeights?: boolean;
94
+ }
95
+ /**
96
+ * HybridScorer combines multiple search signals using min-max normalization.
97
+ *
98
+ * Features:
99
+ * 1. Min-max normalization brings all scores to 0-1 range
100
+ * 2. Configurable weights for each layer
101
+ * 3. Handles missing layers gracefully (redistributes weights)
102
+ * 4. Tracks which layers contributed to each result
103
+ *
104
+ * @example
105
+ * ```typescript
106
+ * const scorer = new HybridScorer({
107
+ * weights: { semantic: 0.5, lexical: 0.3, symbolic: 0.2 }
108
+ * });
109
+ *
110
+ * const results = scorer.combine(
111
+ * semanticResults,
112
+ * lexicalResults,
113
+ * symbolicResults,
114
+ * entityMap
115
+ * );
116
+ * ```
117
+ */
118
+ export declare class HybridScorer {
119
+ private weights;
120
+ private minScore;
121
+ private normalizeWeights;
122
+ constructor(options?: HybridScorerOptions);
123
+ /**
124
+ * Get current weights configuration.
125
+ */
126
+ getWeights(): HybridWeights;
127
+ /**
128
+ * Update weights configuration.
129
+ */
130
+ setWeights(weights: Partial<HybridWeights>): void;
131
+ /**
132
+ * Perform min-max normalization on scores.
133
+ *
134
+ * Formula: normalized = (x - min) / (max - min)
135
+ *
136
+ * @param scores - Map of entity name to raw score
137
+ * @returns Map of entity name to normalized score (0-1)
138
+ */
139
+ minMaxNormalize(scores: Map<string, number>): Map<string, number>;
140
+ /**
141
+ * Combine results from all three search layers.
142
+ *
143
+ * @param semanticResults - Results from semantic search
144
+ * @param lexicalResults - Results from lexical search
145
+ * @param symbolicResults - Results from symbolic search
146
+ * @param entityMap - Map of entity names to Entity objects
147
+ * @returns Array of combined results sorted by score
148
+ */
149
+ combine(semanticResults: SemanticSearchResult[], lexicalResults: LexicalSearchResult[], symbolicResults: SymbolicSearchResult[], entityMap: Map<string, Entity>): ScoredResult[];
150
+ /**
151
+ * Get weights normalized to sum to 1, redistributing for missing layers.
152
+ *
153
+ * @param hasSemantic - Whether semantic results are available
154
+ * @param hasLexical - Whether lexical results are available
155
+ * @param hasSymbolic - Whether symbolic results are available
156
+ * @returns Normalized weights
157
+ */
158
+ getNormalizedWeights(hasSemantic: boolean, hasLexical: boolean, hasSymbolic: boolean): HybridWeights;
159
+ /**
160
+ * Combine scores from maps directly (alternative interface).
161
+ *
162
+ * @param semanticScores - Map of entity name to semantic score
163
+ * @param lexicalScores - Map of entity name to lexical score
164
+ * @param symbolicScores - Map of entity name to symbolic score
165
+ * @param entityMap - Map of entity names to Entity objects
166
+ * @returns Array of combined results sorted by score
167
+ */
168
+ combineFromMaps(semanticScores: Map<string, number>, lexicalScores: Map<string, number>, symbolicScores: Map<string, number>, entityMap: Map<string, Entity>): ScoredResult[];
169
+ /**
170
+ * Calculate combined score for a single entity.
171
+ *
172
+ * Useful for scoring individual results without full normalization.
173
+ *
174
+ * @param semanticScore - Normalized semantic score (0-1)
175
+ * @param lexicalScore - Normalized lexical score (0-1)
176
+ * @param symbolicScore - Normalized symbolic score (0-1)
177
+ * @returns Combined weighted score
178
+ */
179
+ calculateScore(semanticScore: number, lexicalScore: number, symbolicScore: number): number;
180
+ }
181
+ //# sourceMappingURL=HybridScorer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HybridScorer.d.ts","sourceRoot":"","sources":["../../src/search/HybridScorer.ts"],"names":[],"mappings":"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"}