@yamo/memory-mesh 2.3.1 → 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.
- package/bin/memory_mesh.js +1 -1
- package/lib/llm/client.d.ts +111 -0
- package/lib/llm/client.js +299 -357
- package/lib/llm/client.ts +413 -0
- package/lib/llm/index.d.ts +17 -0
- package/lib/llm/index.js +15 -8
- package/lib/llm/index.ts +19 -0
- package/lib/memory/adapters/client.d.ts +183 -0
- package/lib/memory/adapters/client.js +518 -0
- package/lib/memory/adapters/client.ts +678 -0
- package/lib/memory/adapters/config.d.ts +137 -0
- package/lib/memory/adapters/config.js +189 -0
- package/lib/memory/adapters/config.ts +259 -0
- package/lib/memory/adapters/errors.d.ts +76 -0
- package/lib/memory/adapters/errors.js +128 -0
- package/lib/memory/adapters/errors.ts +166 -0
- package/lib/memory/context-manager.d.ts +44 -0
- package/lib/memory/context-manager.js +344 -0
- package/lib/memory/context-manager.ts +432 -0
- package/lib/memory/embeddings/factory.d.ts +59 -0
- package/lib/memory/embeddings/factory.js +148 -0
- package/lib/{embeddings/factory.js → memory/embeddings/factory.ts} +69 -28
- package/lib/memory/embeddings/index.d.ts +2 -0
- package/lib/memory/embeddings/index.js +2 -0
- package/lib/memory/embeddings/index.ts +2 -0
- package/lib/memory/embeddings/service.d.ts +164 -0
- package/lib/memory/embeddings/service.js +515 -0
- package/lib/{embeddings/service.js → memory/embeddings/service.ts} +223 -156
- package/lib/memory/index.d.ts +9 -0
- package/lib/memory/index.js +9 -1
- package/lib/memory/index.ts +20 -0
- package/lib/memory/memory-mesh.d.ts +274 -0
- package/lib/memory/memory-mesh.js +1445 -1189
- package/lib/memory/memory-mesh.ts +1803 -0
- package/lib/memory/memory-translator.d.ts +19 -0
- package/lib/memory/memory-translator.js +125 -0
- package/lib/memory/memory-translator.ts +158 -0
- package/lib/memory/schema.d.ts +111 -0
- package/lib/memory/schema.js +183 -0
- package/lib/memory/schema.ts +267 -0
- package/lib/memory/scorer.d.ts +26 -0
- package/lib/memory/scorer.js +77 -0
- package/lib/memory/scorer.ts +95 -0
- package/lib/memory/search/index.d.ts +1 -0
- package/lib/memory/search/index.js +1 -0
- package/lib/memory/search/index.ts +1 -0
- package/lib/memory/search/keyword-search.d.ts +62 -0
- package/lib/memory/search/keyword-search.js +135 -0
- package/lib/{search/keyword-search.js → memory/search/keyword-search.ts} +66 -36
- package/lib/scrubber/config/defaults.d.ts +53 -0
- package/lib/scrubber/config/defaults.js +49 -57
- package/lib/scrubber/config/defaults.ts +117 -0
- package/lib/scrubber/index.d.ts +6 -0
- package/lib/scrubber/index.js +3 -23
- package/lib/scrubber/index.ts +7 -0
- package/lib/scrubber/scrubber.d.ts +61 -0
- package/lib/scrubber/scrubber.js +99 -121
- package/lib/scrubber/scrubber.ts +168 -0
- package/lib/scrubber/stages/chunker.d.ts +13 -0
- package/lib/scrubber/stages/metadata-annotator.d.ts +18 -0
- package/lib/scrubber/stages/normalizer.d.ts +13 -0
- package/lib/scrubber/stages/semantic-filter.d.ts +13 -0
- package/lib/scrubber/stages/structural-cleaner.d.ts +13 -0
- package/lib/scrubber/stages/validator.d.ts +18 -0
- package/lib/scrubber/telemetry.d.ts +36 -0
- package/lib/scrubber/telemetry.js +53 -58
- package/lib/scrubber/telemetry.ts +99 -0
- package/lib/utils/logger.d.ts +29 -0
- package/lib/utils/logger.js +64 -0
- package/lib/utils/logger.ts +85 -0
- package/lib/utils/skill-metadata.d.ts +32 -0
- package/lib/utils/skill-metadata.js +132 -0
- package/lib/utils/skill-metadata.ts +147 -0
- package/lib/yamo/emitter.d.ts +73 -0
- package/lib/yamo/emitter.js +78 -143
- package/lib/yamo/emitter.ts +249 -0
- package/lib/yamo/schema.d.ts +58 -0
- package/lib/yamo/schema.js +81 -108
- package/lib/yamo/schema.ts +165 -0
- package/package.json +11 -8
- package/index.d.ts +0 -111
- package/lib/embeddings/index.js +0 -2
- package/lib/index.js +0 -6
- package/lib/lancedb/client.js +0 -633
- package/lib/lancedb/config.js +0 -215
- package/lib/lancedb/errors.js +0 -144
- package/lib/lancedb/index.js +0 -4
- package/lib/lancedb/schema.js +0 -197
- package/lib/scrubber/errors/scrubber-error.js +0 -43
- package/lib/scrubber/stages/chunker.js +0 -103
- package/lib/scrubber/stages/metadata-annotator.js +0 -74
- package/lib/scrubber/stages/normalizer.js +0 -59
- package/lib/scrubber/stages/semantic-filter.js +0 -61
- package/lib/scrubber/stages/structural-cleaner.js +0 -82
- package/lib/scrubber/stages/validator.js +0 -66
- package/lib/scrubber/utils/hash.js +0 -39
- package/lib/scrubber/utils/html-parser.js +0 -45
- package/lib/scrubber/utils/pattern-matcher.js +0 -63
- package/lib/scrubber/utils/token-counter.js +0 -31
- package/lib/search/index.js +0 -1
- package/lib/utils/index.js +0 -1
- 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 "../
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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(
|
|
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(
|
|
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 =
|
|
77
|
-
|
|
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
|
-
|
|
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
|
-
|
|
89
|
-
|
|
121
|
+
logger.warn(
|
|
122
|
+
{ err: fallbackError, fallbackModel: fallback.modelName },
|
|
123
|
+
"Fallback service failed",
|
|
124
|
+
);
|
|
90
125
|
}
|
|
91
126
|
}
|
|
92
127
|
|
|
93
|
-
throw new EmbeddingError(
|
|
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(
|
|
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
|
-
|
|
119
|
-
|
|
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,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;
|