@yamo/memory-mesh 2.3.2 → 3.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 (102) hide show
  1. package/bin/memory_mesh.js +1 -1
  2. package/lib/llm/client.d.ts +111 -0
  3. package/lib/llm/client.js +299 -357
  4. package/lib/llm/client.ts +413 -0
  5. package/lib/llm/index.d.ts +17 -0
  6. package/lib/llm/index.js +15 -8
  7. package/lib/llm/index.ts +19 -0
  8. package/lib/memory/adapters/client.d.ts +183 -0
  9. package/lib/memory/adapters/client.js +518 -0
  10. package/lib/memory/adapters/client.ts +678 -0
  11. package/lib/memory/adapters/config.d.ts +137 -0
  12. package/lib/memory/adapters/config.js +189 -0
  13. package/lib/memory/adapters/config.ts +259 -0
  14. package/lib/memory/adapters/errors.d.ts +76 -0
  15. package/lib/memory/adapters/errors.js +128 -0
  16. package/lib/memory/adapters/errors.ts +166 -0
  17. package/lib/memory/context-manager.d.ts +44 -0
  18. package/lib/memory/context-manager.js +344 -0
  19. package/lib/memory/context-manager.ts +432 -0
  20. package/lib/memory/embeddings/factory.d.ts +59 -0
  21. package/lib/memory/embeddings/factory.js +148 -0
  22. package/lib/{embeddings/factory.js → memory/embeddings/factory.ts} +69 -28
  23. package/lib/memory/embeddings/index.d.ts +2 -0
  24. package/lib/memory/embeddings/index.js +2 -0
  25. package/lib/memory/embeddings/index.ts +2 -0
  26. package/lib/memory/embeddings/service.d.ts +164 -0
  27. package/lib/memory/embeddings/service.js +515 -0
  28. package/lib/{embeddings/service.js → memory/embeddings/service.ts} +223 -156
  29. package/lib/memory/index.d.ts +9 -0
  30. package/lib/memory/index.js +9 -1
  31. package/lib/memory/index.ts +20 -0
  32. package/lib/memory/memory-mesh.d.ts +274 -0
  33. package/lib/memory/memory-mesh.js +1469 -678
  34. package/lib/memory/memory-mesh.ts +1803 -0
  35. package/lib/memory/memory-translator.d.ts +19 -0
  36. package/lib/memory/memory-translator.js +125 -0
  37. package/lib/memory/memory-translator.ts +158 -0
  38. package/lib/memory/schema.d.ts +111 -0
  39. package/lib/memory/schema.js +183 -0
  40. package/lib/memory/schema.ts +267 -0
  41. package/lib/memory/scorer.d.ts +26 -0
  42. package/lib/memory/scorer.js +77 -0
  43. package/lib/memory/scorer.ts +95 -0
  44. package/lib/memory/search/index.d.ts +1 -0
  45. package/lib/memory/search/index.js +1 -0
  46. package/lib/memory/search/index.ts +1 -0
  47. package/lib/memory/search/keyword-search.d.ts +62 -0
  48. package/lib/memory/search/keyword-search.js +135 -0
  49. package/lib/{search/keyword-search.js → memory/search/keyword-search.ts} +66 -36
  50. package/lib/scrubber/config/defaults.d.ts +53 -0
  51. package/lib/scrubber/config/defaults.js +49 -57
  52. package/lib/scrubber/config/defaults.ts +117 -0
  53. package/lib/scrubber/index.d.ts +6 -0
  54. package/lib/scrubber/index.js +3 -23
  55. package/lib/scrubber/index.ts +7 -0
  56. package/lib/scrubber/scrubber.d.ts +61 -0
  57. package/lib/scrubber/scrubber.js +99 -121
  58. package/lib/scrubber/scrubber.ts +168 -0
  59. package/lib/scrubber/stages/chunker.d.ts +13 -0
  60. package/lib/scrubber/stages/metadata-annotator.d.ts +18 -0
  61. package/lib/scrubber/stages/normalizer.d.ts +13 -0
  62. package/lib/scrubber/stages/semantic-filter.d.ts +13 -0
  63. package/lib/scrubber/stages/structural-cleaner.d.ts +13 -0
  64. package/lib/scrubber/stages/validator.d.ts +18 -0
  65. package/lib/scrubber/telemetry.d.ts +36 -0
  66. package/lib/scrubber/telemetry.js +53 -58
  67. package/lib/scrubber/telemetry.ts +99 -0
  68. package/lib/utils/logger.d.ts +29 -0
  69. package/lib/utils/logger.js +64 -0
  70. package/lib/utils/logger.ts +85 -0
  71. package/lib/utils/skill-metadata.d.ts +32 -0
  72. package/lib/utils/skill-metadata.js +132 -0
  73. package/lib/utils/skill-metadata.ts +147 -0
  74. package/lib/yamo/emitter.d.ts +73 -0
  75. package/lib/yamo/emitter.js +78 -143
  76. package/lib/yamo/emitter.ts +249 -0
  77. package/lib/yamo/schema.d.ts +58 -0
  78. package/lib/yamo/schema.js +81 -108
  79. package/lib/yamo/schema.ts +165 -0
  80. package/package.json +11 -8
  81. package/index.d.ts +0 -111
  82. package/lib/embeddings/index.js +0 -2
  83. package/lib/index.js +0 -6
  84. package/lib/lancedb/client.js +0 -633
  85. package/lib/lancedb/config.js +0 -215
  86. package/lib/lancedb/errors.js +0 -144
  87. package/lib/lancedb/index.js +0 -4
  88. package/lib/lancedb/schema.js +0 -217
  89. package/lib/scrubber/errors/scrubber-error.js +0 -43
  90. package/lib/scrubber/stages/chunker.js +0 -103
  91. package/lib/scrubber/stages/metadata-annotator.js +0 -74
  92. package/lib/scrubber/stages/normalizer.js +0 -59
  93. package/lib/scrubber/stages/semantic-filter.js +0 -61
  94. package/lib/scrubber/stages/structural-cleaner.js +0 -82
  95. package/lib/scrubber/stages/validator.js +0 -66
  96. package/lib/scrubber/utils/hash.js +0 -39
  97. package/lib/scrubber/utils/html-parser.js +0 -45
  98. package/lib/scrubber/utils/pattern-matcher.js +0 -63
  99. package/lib/scrubber/utils/token-counter.js +0 -31
  100. package/lib/search/index.js +0 -1
  101. package/lib/utils/index.js +0 -1
  102. package/lib/yamo/index.js +0 -15
@@ -3,11 +3,31 @@
3
3
  * Manages primary and fallback embedding services
4
4
  */
5
5
 
6
- import EmbeddingService from "./service.js";
7
- import { ConfigurationError, EmbeddingError } from "../lancedb/errors.js";
6
+ import EmbeddingService, { ServiceConfig, ServiceStats } from "./service.js";
7
+ import { ConfigurationError, EmbeddingError } from "../adapters/errors.js";
8
+ import { createLogger } from "../../utils/logger.js";
9
+
10
+ const logger = createLogger("embedding-factory");
11
+
12
+ export interface FactoryStats {
13
+ configured: boolean;
14
+ primary: ServiceStats | null;
15
+ fallbacks: ServiceStats[];
16
+ }
17
+
18
+ export interface InitResult {
19
+ success: boolean;
20
+ primary: string | null;
21
+ fallbacks: string[];
22
+ }
8
23
 
9
24
  class EmbeddingFactory {
10
- constructor(ServiceClass = EmbeddingService) {
25
+ primaryService: EmbeddingService | null;
26
+ fallbackServices: EmbeddingService[];
27
+ configured: boolean;
28
+ ServiceClass: typeof EmbeddingService;
29
+
30
+ constructor(ServiceClass: typeof EmbeddingService = EmbeddingService) {
11
31
  this.primaryService = null;
12
32
  this.fallbackServices = [];
13
33
  this.configured = false;
@@ -19,14 +39,18 @@ class EmbeddingFactory {
19
39
  * @param {Array} configs - Array of { modelType, modelName, priority, apiKey }
20
40
  * @returns {Object} Success status
21
41
  */
22
- configure(configs) {
42
+ configure(configs: ServiceConfig[]): { success: boolean } {
23
43
  // Sort by priority (lower = higher priority)
24
- configs.sort((a, b) => a.priority - b.priority);
44
+ configs.sort((a, b) => (a.priority || 0) - (b.priority || 0));
25
45
 
26
- this.primaryService = new this.ServiceClass(configs[0]);
46
+ if (configs.length > 0) {
47
+ this.primaryService = new this.ServiceClass(configs[0]);
48
+ }
27
49
 
28
50
  if (configs.length > 1) {
29
- this.fallbackServices = configs.slice(1).map(c => new this.ServiceClass(c));
51
+ this.fallbackServices = configs
52
+ .slice(1)
53
+ .map((c) => new this.ServiceClass(c));
30
54
  }
31
55
 
32
56
  this.configured = true;
@@ -37,9 +61,11 @@ class EmbeddingFactory {
37
61
  * Initialize all configured services
38
62
  * @returns {Promise<Object>} Initialization status
39
63
  */
40
- async init() {
64
+ async init(): Promise<InitResult> {
41
65
  if (!this.configured) {
42
- throw new ConfigurationError('EmbeddingFactory not configured. Call configure() first.');
66
+ throw new ConfigurationError(
67
+ "EmbeddingFactory not configured. Call configure() first.",
68
+ );
43
69
  }
44
70
 
45
71
  // Initialize primary service
@@ -51,7 +77,7 @@ class EmbeddingFactory {
51
77
  return {
52
78
  success: true,
53
79
  primary: this.primaryService ? this.primaryService.modelName : null,
54
- fallbacks: this.fallbackServices.map(s => s.modelName)
80
+ fallbacks: this.fallbackServices.map((s) => s.modelName),
55
81
  };
56
82
  }
57
83
 
@@ -61,9 +87,9 @@ class EmbeddingFactory {
61
87
  * @param {Object} options - Options
62
88
  * @returns {Promise<number[]>} Embedding vector
63
89
  */
64
- async embed(text, options = {}) {
90
+ async embed(text: string, options: any = {}): Promise<number[]> {
65
91
  if (!this.configured || !this.primaryService) {
66
- throw new ConfigurationError('EmbeddingFactory not configured');
92
+ throw new ConfigurationError("EmbeddingFactory not configured");
67
93
  }
68
94
 
69
95
  // Try primary service
@@ -73,8 +99,12 @@ class EmbeddingFactory {
73
99
  }
74
100
  return await this.primaryService.embed(text, options);
75
101
  } catch (error) {
76
- const errorMessage = error instanceof Error ? error.message : String(error);
77
- console.warn(`[EmbeddingFactory] Primary service failed: ${errorMessage}`);
102
+ const errorMessage =
103
+ error instanceof Error ? error.message : String(error);
104
+ logger.warn(
105
+ { err: error, primaryService: this.primaryService?.modelName },
106
+ "Primary service failed",
107
+ );
78
108
 
79
109
  // Try fallback services in order
80
110
  for (const fallback of this.fallbackServices) {
@@ -82,17 +112,22 @@ class EmbeddingFactory {
82
112
  if (!fallback.initialized) {
83
113
  await fallback.init();
84
114
  }
85
- console.log(`[EmbeddingFactory] Using fallback: ${fallback.modelName}`);
115
+ logger.info(
116
+ { fallbackModel: fallback.modelName },
117
+ "Using fallback service",
118
+ );
86
119
  return await fallback.embed(text, options);
87
120
  } catch (fallbackError) {
88
- const fallbackErrorMessage = fallbackError instanceof Error ? fallbackError.message : String(fallbackError);
89
- console.warn(`[EmbeddingFactory] Fallback ${fallback.modelName} failed: ${fallbackErrorMessage}`);
121
+ logger.warn(
122
+ { err: fallbackError, fallbackModel: fallback.modelName },
123
+ "Fallback service failed",
124
+ );
90
125
  }
91
126
  }
92
127
 
93
- throw new EmbeddingError('All embedding services failed', {
128
+ throw new EmbeddingError("All embedding services failed", {
94
129
  primaryError: errorMessage,
95
- fallbackCount: this.fallbackServices.length
130
+ fallbackCount: this.fallbackServices.length,
96
131
  });
97
132
  }
98
133
  }
@@ -103,9 +138,9 @@ class EmbeddingFactory {
103
138
  * @param {Object} options - Options
104
139
  * @returns {Promise<number[][]>} Array of embedding vectors
105
140
  */
106
- async embedBatch(texts, options = {}) {
141
+ async embedBatch(texts: string[], options: any = {}): Promise<number[][]> {
107
142
  if (!this.configured || !this.primaryService) {
108
- throw new ConfigurationError('EmbeddingFactory not configured');
143
+ throw new ConfigurationError("EmbeddingFactory not configured");
109
144
  }
110
145
 
111
146
  // Try primary service
@@ -115,10 +150,16 @@ class EmbeddingFactory {
115
150
  }
116
151
  return await this.primaryService.embedBatch(texts, options);
117
152
  } catch (error) {
118
- const errorMessage = error instanceof Error ? error.message : String(error);
119
- console.warn(`[EmbeddingFactory] Primary batch failed: ${errorMessage}`);
153
+ logger.warn(
154
+ {
155
+ err: error,
156
+ primaryService: this.primaryService?.modelName,
157
+ batchSize: texts.length,
158
+ },
159
+ "Primary batch embedding failed, falling back to individual embeddings",
160
+ );
120
161
  // Fallback to individual embedding with fallback services
121
- const results = [];
162
+ const results: number[][] = [];
122
163
  for (const text of texts) {
123
164
  results.push(await this.embed(text, options));
124
165
  }
@@ -130,11 +171,11 @@ class EmbeddingFactory {
130
171
  * Get factory statistics
131
172
  * @returns {Object} Statistics
132
173
  */
133
- getStats() {
174
+ getStats(): FactoryStats {
134
175
  const stats = {
135
176
  configured: this.configured,
136
177
  primary: this.primaryService?.getStats() || null,
137
- fallbacks: this.fallbackServices.map(s => s.getStats())
178
+ fallbacks: this.fallbackServices.map((s) => s.getStats()),
138
179
  };
139
180
  return stats;
140
181
  }
@@ -142,9 +183,9 @@ class EmbeddingFactory {
142
183
  /**
143
184
  * Clear all caches
144
185
  */
145
- clearCache() {
186
+ clearCache(): void {
146
187
  this.primaryService?.clearCache();
147
- this.fallbackServices.forEach(s => s.clearCache());
188
+ this.fallbackServices.forEach((s) => s.clearCache());
148
189
  }
149
190
  }
150
191
 
@@ -0,0 +1,2 @@
1
+ export { default as EmbeddingService } from "./service.js";
2
+ export { default as EmbeddingFactory } from "./factory.js";
@@ -0,0 +1,2 @@
1
+ export { default as EmbeddingService } from "./service.js";
2
+ export { default as EmbeddingFactory } from "./factory.js";
@@ -0,0 +1,2 @@
1
+ export { default as EmbeddingService } from "./service.js";
2
+ export { default as EmbeddingFactory } from "./factory.js";
@@ -0,0 +1,164 @@
1
+ /**
2
+ * EmbeddingService - Multi-provider embedding generation service
3
+ *
4
+ * Supports:
5
+ * - Local models: Xenova/Transformers.js (ONNX runtime)
6
+ * - Ollama: Local Ollama embeddings API
7
+ * - API models: OpenAI, Cohere
8
+ *
9
+ * Implements TDD for Phase 3, Task 3.1 - Embedding Service Architecture
10
+ */
11
+ /**
12
+ * Service configuration interface
13
+ */
14
+ export interface ServiceConfig {
15
+ modelType?: "local" | "ollama" | "openai" | "cohere";
16
+ modelName?: string;
17
+ baseUrl?: string;
18
+ dimension?: number;
19
+ batchSize?: number;
20
+ normalize?: boolean;
21
+ cacheMaxSize?: number;
22
+ apiKey?: string;
23
+ priority?: number;
24
+ }
25
+ export interface ServiceStats {
26
+ modelType: string;
27
+ modelName: string;
28
+ dimension: number;
29
+ initialized: boolean;
30
+ totalEmbeddings: number;
31
+ cacheHits: number;
32
+ cacheMisses: number;
33
+ cacheSize: number;
34
+ cacheMaxSize: number;
35
+ cacheHitRate: number;
36
+ batchCount: number;
37
+ batchSize: number;
38
+ normalize: boolean;
39
+ }
40
+ /**
41
+ * EmbeddingService provides a unified interface for generating text embeddings
42
+ * using multiple backend providers (local ONNX models or cloud APIs).
43
+ */
44
+ export declare class EmbeddingService {
45
+ modelType: string;
46
+ modelName: string;
47
+ baseUrl: string;
48
+ dimension: number;
49
+ batchSize: number;
50
+ normalize: boolean;
51
+ apiKey?: string;
52
+ model: any;
53
+ cache: Map<string, number[]>;
54
+ cacheMaxSize: number;
55
+ initialized: boolean;
56
+ stats: {
57
+ totalEmbeddings: number;
58
+ cacheHits: number;
59
+ cacheMisses: number;
60
+ batchCount: number;
61
+ };
62
+ /**
63
+ * Create a new EmbeddingService instance
64
+ * @param {Object} [config={}] - Configuration options
65
+ */
66
+ constructor(config?: ServiceConfig);
67
+ /**
68
+ * Initialize the embedding model
69
+ * Loads the model based on modelType (local, ollama, openai, cohere)
70
+ */
71
+ init(): Promise<void>;
72
+ /**
73
+ * Generate embedding for a single text
74
+ * @param {string} text - Text to embed
75
+ * @param {Object} options - Options for embedding generation
76
+ * @returns {Promise<number[]>} Embedding vector
77
+ */
78
+ embed(text: string, _options?: any): Promise<number[]>;
79
+ /**
80
+ * Generate embeddings for a batch of texts
81
+ * @param {string[]} texts - Array of texts to embed
82
+ * @param {Object} options - Options for embedding generation
83
+ * @returns {Promise<number[][]>} Array of embedding vectors
84
+ */
85
+ embedBatch(texts: string[], _options?: any): Promise<number[][]>;
86
+ /**
87
+ * Initialize local ONNX model using Xenova/Transformers.js
88
+ * @private
89
+ */
90
+ _initLocalModel(): Promise<void>;
91
+ /**
92
+ * Initialize Ollama client
93
+ * Ollama runs locally and doesn't require authentication
94
+ * @private
95
+ */
96
+ _initOllama(): void;
97
+ /**
98
+ * Initialize OpenAI client
99
+ * @private
100
+ */
101
+ _initOpenAI(): Promise<void>;
102
+ /**
103
+ * Initialize Cohere client
104
+ * @private
105
+ */
106
+ _initCohere(): Promise<void>;
107
+ /**
108
+ * Generate embedding using local ONNX model
109
+ * @param {string} text - Text to embed
110
+ * @returns {Promise<number[]>} Embedding vector
111
+ * @private
112
+ */
113
+ _embedLocal(text: string): Promise<number[]>;
114
+ /**
115
+ * Generate embedding using Ollama API
116
+ * @param {string} text - Text to embed
117
+ * @returns {Promise<number[]>} Embedding vector
118
+ * @private
119
+ */
120
+ _embedOllama(text: string): Promise<number[]>;
121
+ /**
122
+ * Generate embedding using OpenAI API
123
+ * @param {string} text - Text to embed
124
+ * @returns {Promise<number[]>} Embedding vector
125
+ * @private
126
+ */
127
+ _embedOpenAI(text: string): Promise<number[]>;
128
+ /**
129
+ * Generate embedding using Cohere API
130
+ * @param {string} text - Text to embed
131
+ * @returns {Promise<number[]>} Embedding vector
132
+ * @private
133
+ */
134
+ _embedCohere(text: string): Promise<number[]>;
135
+ /**
136
+ * Normalize vector to unit length
137
+ * @param {number[]} vector - Vector to normalize
138
+ * @returns {number[]} Normalized vector
139
+ * @private
140
+ */
141
+ _normalize(vector: number[]): number[];
142
+ /**
143
+ * Generate cache key from text
144
+ * @param {string} text - Text to generate key from
145
+ * @returns {string} Cache key
146
+ * @private
147
+ */
148
+ _getCacheKey(text: string): string;
149
+ _setCache(key: string, value: number[]): void;
150
+ /**
151
+ * Get service statistics
152
+ * @returns {Object} Statistics object
153
+ */
154
+ getStats(): ServiceStats;
155
+ /**
156
+ * Clear the embedding cache
157
+ */
158
+ clearCache(): void;
159
+ /**
160
+ * Reset statistics
161
+ */
162
+ resetStats(): void;
163
+ }
164
+ export default EmbeddingService;