@siemens/ix-mcp-angular 3.2.0-v.1.10.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/AGENTS.md +86 -0
- package/LICENSE.md +20 -0
- package/README.md +391 -0
- package/config.json +51 -0
- package/database/vectors.db/documents.lance/_transactions/109-667922df-dcb8-4400-846a-fcca46a3cfd8.txn +0 -0
- package/database/vectors.db/documents.lance/_versions/111.manifest +0 -0
- package/database/vectors.db/documents.lance/data/1001001000111000111110002d01c8449a9aa9f7ce9a04125c.lance +0 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +310 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +35 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +33 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/db-handler.d.ts +50 -0
- package/dist/src/db-handler.d.ts.map +1 -0
- package/dist/src/db-handler.js +256 -0
- package/dist/src/db-handler.js.map +1 -0
- package/dist/src/embeddings.d.ts +77 -0
- package/dist/src/embeddings.d.ts.map +1 -0
- package/dist/src/embeddings.js +280 -0
- package/dist/src/embeddings.js.map +1 -0
- package/dist/src/index.d.ts +30 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +427 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/keys.d.ts +4 -0
- package/dist/src/keys.d.ts.map +1 -0
- package/dist/src/keys.js +24 -0
- package/dist/src/keys.js.map +1 -0
- package/dist/src/logger.d.ts +24 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +185 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/prompt.d.ts +19 -0
- package/dist/src/prompt.d.ts.map +1 -0
- package/dist/src/prompt.js +94 -0
- package/dist/src/prompt.js.map +1 -0
- package/dist/src/setup.d.ts +29 -0
- package/dist/src/setup.d.ts.map +1 -0
- package/dist/src/setup.js +851 -0
- package/dist/src/setup.js.map +1 -0
- package/dist/src/token.d.ts +22 -0
- package/dist/src/token.d.ts.map +1 -0
- package/dist/src/token.js +76 -0
- package/dist/src/token.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Siemens 2016 - 2025
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
import * as lancedb from '@lancedb/lancedb';
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
export class DatabaseHandler {
|
|
9
|
+
db;
|
|
10
|
+
table;
|
|
11
|
+
verbose;
|
|
12
|
+
dbPath;
|
|
13
|
+
tableName = 'documents';
|
|
14
|
+
constructor(dbPath, options) {
|
|
15
|
+
this.verbose = options?.verbose || false;
|
|
16
|
+
this.dbPath = dbPath;
|
|
17
|
+
// Ensure database directory exists
|
|
18
|
+
const dbDir = path.dirname(dbPath);
|
|
19
|
+
if (!fs.existsSync(dbDir)) {
|
|
20
|
+
fs.mkdirSync(dbDir, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async initialize() {
|
|
24
|
+
try {
|
|
25
|
+
this.db = await lancedb.connect(this.dbPath);
|
|
26
|
+
const tableNames = await this.db.tableNames();
|
|
27
|
+
if (tableNames.includes(this.tableName)) {
|
|
28
|
+
this.table = await this.db.openTable(this.tableName);
|
|
29
|
+
if (this.verbose) {
|
|
30
|
+
const count = await this.getDocumentCount();
|
|
31
|
+
console.log(`Database ready with ${count} documentation chunks`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
if (this.verbose) {
|
|
36
|
+
console.log('Database ready (no tables yet)');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
throw new Error(`Failed to initialize LanceDB database: ${error}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async getDocumentCount() {
|
|
45
|
+
if (!this.table) {
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const count = await this.table.countRows();
|
|
50
|
+
return count;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.warn('Error counting documents:', error);
|
|
54
|
+
return 0;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async getDocumentsByType(type) {
|
|
58
|
+
if (!this.table) {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const results = await this.table.query().where(`type = '${type}'`).toArray();
|
|
63
|
+
return results.map(row => this.normalizeRow(row));
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.warn(`Error getting documents by type ${type}:`, error);
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async getAllDocuments() {
|
|
71
|
+
if (!this.table) {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const results = await this.table.query().toArray();
|
|
76
|
+
return results.map(row => this.normalizeRow(row));
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.warn('Error getting all documents:', error);
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async insertDocument(chunk, embedding) {
|
|
84
|
+
if (!this.db) {
|
|
85
|
+
throw new Error('Database not initialized - call initialize() first');
|
|
86
|
+
}
|
|
87
|
+
const data = [
|
|
88
|
+
{
|
|
89
|
+
id: chunk.chunkId,
|
|
90
|
+
content: chunk.content,
|
|
91
|
+
vector: embedding,
|
|
92
|
+
chunk_index: chunk.chunkIndex,
|
|
93
|
+
type: chunk.type,
|
|
94
|
+
header_path: chunk.headerPath || '',
|
|
95
|
+
header_level: chunk.headerLevel || 0,
|
|
96
|
+
category: chunk.category || '',
|
|
97
|
+
terms: chunk.terms || '',
|
|
98
|
+
token_count: chunk.tokenCount
|
|
99
|
+
}
|
|
100
|
+
];
|
|
101
|
+
if (!this.table) {
|
|
102
|
+
this.table = await this.db.createTable(this.tableName, data);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
await this.table.add(data);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async insertDocumentsBatch(chunks, embeddings) {
|
|
109
|
+
if (!this.db) {
|
|
110
|
+
throw new Error('Database not initialized - call initialize() first');
|
|
111
|
+
}
|
|
112
|
+
if (chunks.length !== embeddings.length) {
|
|
113
|
+
throw new Error('Chunks and embeddings arrays must have the same length');
|
|
114
|
+
}
|
|
115
|
+
const data = chunks.map((chunk, i) => ({
|
|
116
|
+
id: chunk.chunkId,
|
|
117
|
+
content: chunk.content,
|
|
118
|
+
vector: embeddings[i],
|
|
119
|
+
chunk_index: chunk.chunkIndex,
|
|
120
|
+
type: chunk.type,
|
|
121
|
+
header_path: chunk.headerPath || '',
|
|
122
|
+
header_level: chunk.headerLevel || 0,
|
|
123
|
+
category: chunk.category || '',
|
|
124
|
+
terms: chunk.terms || '',
|
|
125
|
+
token_count: chunk.tokenCount
|
|
126
|
+
}));
|
|
127
|
+
if (!this.table) {
|
|
128
|
+
this.table = await this.db.createTable(this.tableName, data);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
await this.table.add(data);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async clearAllDocuments() {
|
|
135
|
+
if (!this.db || !this.table) {
|
|
136
|
+
return 0;
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
const count = await this.table.countRows();
|
|
140
|
+
await this.db.dropTable(this.tableName);
|
|
141
|
+
this.table = undefined;
|
|
142
|
+
return count;
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.warn('Error clearing existing data:', error);
|
|
146
|
+
return 0;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async clearDocumentsByType(type) {
|
|
150
|
+
if (!this.table) {
|
|
151
|
+
return 0;
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
const docs = await this.getDocumentsByType(type);
|
|
155
|
+
const count = docs.length;
|
|
156
|
+
if (count > 0) {
|
|
157
|
+
const deleteExpr = `type = '${type}'`;
|
|
158
|
+
await this.table.delete(deleteExpr);
|
|
159
|
+
}
|
|
160
|
+
return count;
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
console.warn(`Error clearing ${type} data:`, error);
|
|
164
|
+
return 0;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async vectorSearch(queryVector, limit, type) {
|
|
168
|
+
if (!this.table) {
|
|
169
|
+
return [];
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
let query = this.table.query().nearestTo(queryVector).limit(limit);
|
|
173
|
+
if (type) {
|
|
174
|
+
query = query.where(`type = '${type}'`);
|
|
175
|
+
}
|
|
176
|
+
const results = await query.toArray();
|
|
177
|
+
return results.map(row => this.normalizeRow(row));
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
console.warn('Error performing vector search:', error);
|
|
181
|
+
return [];
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
close() {
|
|
185
|
+
if (this.db && this.verbose) {
|
|
186
|
+
console.log('Database connection closed');
|
|
187
|
+
}
|
|
188
|
+
this.db = undefined;
|
|
189
|
+
this.table = undefined;
|
|
190
|
+
}
|
|
191
|
+
async getStats() {
|
|
192
|
+
if (!this.table) {
|
|
193
|
+
return {
|
|
194
|
+
totalDocuments: 0,
|
|
195
|
+
documentsByType: {}
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
try {
|
|
199
|
+
const total = await this.getDocumentCount();
|
|
200
|
+
const allDocs = await this.getAllDocuments();
|
|
201
|
+
const documentsByType = {};
|
|
202
|
+
for (const doc of allDocs) {
|
|
203
|
+
documentsByType[doc.type] = (documentsByType[doc.type] || 0) + 1;
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
totalDocuments: total,
|
|
207
|
+
documentsByType
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
console.warn('Error getting stats:', error);
|
|
212
|
+
return {
|
|
213
|
+
totalDocuments: 0,
|
|
214
|
+
documentsByType: {}
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
async cleanupOldVersions() {
|
|
219
|
+
if (!this.table) {
|
|
220
|
+
if (this.verbose) {
|
|
221
|
+
console.log('No table to cleanup');
|
|
222
|
+
}
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
try {
|
|
226
|
+
if (this.verbose) {
|
|
227
|
+
console.log('Cleaning up old table versions...');
|
|
228
|
+
}
|
|
229
|
+
await this.table.optimize({
|
|
230
|
+
cleanupOlderThan: new Date(),
|
|
231
|
+
deleteUnverified: false
|
|
232
|
+
});
|
|
233
|
+
if (this.verbose) {
|
|
234
|
+
console.log('Old versions cleaned up successfully');
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
console.warn('Error cleaning up old versions:', error);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
normalizeRow(row) {
|
|
242
|
+
return {
|
|
243
|
+
id: String(row.id || ''),
|
|
244
|
+
content: String(row.content || ''),
|
|
245
|
+
vector: Array.isArray(row.vector) ? row.vector : [],
|
|
246
|
+
chunk_index: typeof row.chunk_index === 'number' ? row.chunk_index : 0,
|
|
247
|
+
type: String(row.type || 'documentation'),
|
|
248
|
+
header_path: row.header_path ? String(row.header_path) : undefined,
|
|
249
|
+
header_level: typeof row.header_level === 'number' && row.header_level > 0 ? row.header_level : undefined,
|
|
250
|
+
category: row.category ? String(row.category) : undefined,
|
|
251
|
+
terms: row.terms ? String(row.terms) : undefined,
|
|
252
|
+
token_count: typeof row.token_count === 'number' ? row.token_count : 0
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=db-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-handler.js","sourceRoot":"","sources":["../../../src/mcp/db-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export declare class EmbeddingService {
|
|
2
|
+
private embeddingCache;
|
|
3
|
+
private persistentCachePath;
|
|
4
|
+
private persistentCache;
|
|
5
|
+
private verbose;
|
|
6
|
+
private debug;
|
|
7
|
+
constructor(options?: {
|
|
8
|
+
verbose?: boolean;
|
|
9
|
+
debug?: boolean;
|
|
10
|
+
persistentCachePath?: string;
|
|
11
|
+
});
|
|
12
|
+
/**
|
|
13
|
+
* Get embeddings for multiple texts in a single batch request
|
|
14
|
+
* @param texts Array of texts to get embeddings for
|
|
15
|
+
* @param retryCount Current retry attempt
|
|
16
|
+
* @returns Array of embedding vectors
|
|
17
|
+
*/
|
|
18
|
+
getEmbeddingsBatch(texts: string[], retryCount?: number): Promise<number[][]>;
|
|
19
|
+
/**
|
|
20
|
+
* Get embedding for a single text
|
|
21
|
+
* @param text The text to get embedding for
|
|
22
|
+
* @param retryCount Current retry attempt
|
|
23
|
+
* @returns The embedding vector
|
|
24
|
+
*/
|
|
25
|
+
getEmbedding(text: string, retryCount?: number): Promise<number[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Normalize a vector to unit length
|
|
28
|
+
* @param vector The vector to normalize
|
|
29
|
+
* @returns The normalized vector
|
|
30
|
+
*/
|
|
31
|
+
normalizeVector(vector: number[]): number[];
|
|
32
|
+
/**
|
|
33
|
+
* Clear the embedding cache
|
|
34
|
+
*/
|
|
35
|
+
clearEmbeddingCache(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Clear both in-memory and persistent caches
|
|
38
|
+
*/
|
|
39
|
+
clearAllCaches(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Get cached embedding for a text without generating a new one
|
|
42
|
+
* @param text Text to check in cache
|
|
43
|
+
* @returns Cached embedding or undefined if not in cache
|
|
44
|
+
*/
|
|
45
|
+
getCachedEmbedding(text: string): number[] | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Get cache size
|
|
48
|
+
* @returns Number of cached embeddings
|
|
49
|
+
*/
|
|
50
|
+
getCacheSize(): number;
|
|
51
|
+
/**
|
|
52
|
+
* Get total cache size including persistent cache
|
|
53
|
+
*/
|
|
54
|
+
getTotalCacheSize(): number;
|
|
55
|
+
/**
|
|
56
|
+
* Get cache statistics
|
|
57
|
+
*/
|
|
58
|
+
getCacheStats(): {
|
|
59
|
+
memorySize: number;
|
|
60
|
+
persistentSize: number;
|
|
61
|
+
totalSize: number;
|
|
62
|
+
cacheEnabled: boolean;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Load persistent cache from file
|
|
66
|
+
*/
|
|
67
|
+
private loadPersistentCache;
|
|
68
|
+
/**
|
|
69
|
+
* Save persistent cache to file
|
|
70
|
+
*/
|
|
71
|
+
private savePersistentCache;
|
|
72
|
+
/**
|
|
73
|
+
* Create a hash of the text content for cache validation
|
|
74
|
+
*/
|
|
75
|
+
private hashText;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=embeddings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../../src/mcp/embeddings.ts"],"names":[],"mappings":"AA0BA,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,mBAAmB,CAAiC;IAC5D,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,KAAK,CAAkB;gBAEnB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE;IAY1F;;;;;OAKG;IACG,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,UAAU,SAAI,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IA0I9E;;;;;OAKG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,SAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKnE;;;;OAIG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAK3C;;OAEG;IACH,mBAAmB,IAAI,IAAI;IAI3B;;OAEG;IACH,cAAc,IAAI,IAAI;IAQtB;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAoBtD;;;OAGG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACH,aAAa,IAAI;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,OAAO,CAAC;KACvB;IASD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA0B3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;OAEG;IACH,OAAO,CAAC,QAAQ;CAGjB"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Siemens 2016 - 2025
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
import fetch from 'node-fetch';
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import * as crypto from 'crypto';
|
|
9
|
+
import { getToken } from './token.js';
|
|
10
|
+
export class EmbeddingService {
|
|
11
|
+
embeddingCache = new Map();
|
|
12
|
+
persistentCachePath = undefined;
|
|
13
|
+
persistentCache = {};
|
|
14
|
+
verbose = false;
|
|
15
|
+
debug = false;
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.verbose = options?.verbose || false;
|
|
18
|
+
this.debug = options?.debug || false;
|
|
19
|
+
// Enable persistent caching when cache path is provided via options or environment
|
|
20
|
+
const envCachePath = process.env.EMBEDDING_CACHE_PATH;
|
|
21
|
+
if (options?.persistentCachePath || envCachePath) {
|
|
22
|
+
this.persistentCachePath = options?.persistentCachePath || envCachePath || undefined;
|
|
23
|
+
this.loadPersistentCache();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get embeddings for multiple texts in a single batch request
|
|
28
|
+
* @param texts Array of texts to get embeddings for
|
|
29
|
+
* @param retryCount Current retry attempt
|
|
30
|
+
* @returns Array of embedding vectors
|
|
31
|
+
*/
|
|
32
|
+
async getEmbeddingsBatch(texts, retryCount = 0) {
|
|
33
|
+
const maxRetries = 5;
|
|
34
|
+
const baseDelay = 5000; // 5 seconds
|
|
35
|
+
let memoryHits = 0;
|
|
36
|
+
let persistentHits = 0;
|
|
37
|
+
// Check in-memory cache first, then persistent cache
|
|
38
|
+
const results = texts.map(text => {
|
|
39
|
+
if (this.embeddingCache.has(text)) {
|
|
40
|
+
memoryHits++;
|
|
41
|
+
return this.embeddingCache.get(text) || undefined;
|
|
42
|
+
}
|
|
43
|
+
// Check persistent cache if available
|
|
44
|
+
if (this.persistentCachePath) {
|
|
45
|
+
const hash = this.hashText(text);
|
|
46
|
+
const cached = this.persistentCache[text];
|
|
47
|
+
if (cached && cached.hash === hash) {
|
|
48
|
+
persistentHits++;
|
|
49
|
+
// Move to in-memory cache for faster subsequent access
|
|
50
|
+
this.embeddingCache.set(text, cached.embedding);
|
|
51
|
+
return cached.embedding;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
});
|
|
56
|
+
// Find indices of texts that need embeddings
|
|
57
|
+
const uncachedIndices = [];
|
|
58
|
+
const uncachedTexts = [];
|
|
59
|
+
for (let i = 0; i < texts.length; i++) {
|
|
60
|
+
if (results[i] === undefined) {
|
|
61
|
+
uncachedIndices.push(i);
|
|
62
|
+
uncachedTexts.push(texts[i]);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// If all are cached, return cached results
|
|
66
|
+
if (uncachedTexts.length === 0) {
|
|
67
|
+
if (this.verbose || this.debug) {
|
|
68
|
+
console.log(`Cache hit: ${memoryHits} memory, ${persistentHits} persistent, no API call for ${texts.length} texts`);
|
|
69
|
+
}
|
|
70
|
+
return results;
|
|
71
|
+
}
|
|
72
|
+
if (this.verbose || this.debug) {
|
|
73
|
+
console.log(`Cache stats: ${memoryHits} memory hits, ${persistentHits} persistent hits, ${uncachedTexts.length} API call needed for ${texts.length} total texts`);
|
|
74
|
+
}
|
|
75
|
+
const token = await getToken();
|
|
76
|
+
try {
|
|
77
|
+
const response = await fetch('https://api.siemens.com/llm/v1/embeddings', {
|
|
78
|
+
method: 'POST',
|
|
79
|
+
headers: {
|
|
80
|
+
'Content-Type': 'application/json',
|
|
81
|
+
Authorization: `Bearer ${token}`
|
|
82
|
+
},
|
|
83
|
+
body: JSON.stringify({
|
|
84
|
+
model: 'bge-m3',
|
|
85
|
+
input: uncachedTexts
|
|
86
|
+
})
|
|
87
|
+
});
|
|
88
|
+
if (response.status === 429) {
|
|
89
|
+
// Rate limited - wait and retry
|
|
90
|
+
if (retryCount < maxRetries) {
|
|
91
|
+
const delay = baseDelay * Math.pow(2, retryCount) + Math.random() * 1000; // Exponential backoff with jitter
|
|
92
|
+
if (this.verbose || this.debug) {
|
|
93
|
+
console.log(`Rate limited. Waiting ${Math.round(delay)}ms before retry ${retryCount + 1}/${maxRetries}...`);
|
|
94
|
+
}
|
|
95
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
96
|
+
return this.getEmbeddingsBatch(texts, retryCount + 1);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
throw new Error(`Rate limit exceeded after ${maxRetries} retries`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (!response.ok) {
|
|
103
|
+
throw new Error(`Embedding API error: ${response.status} ${response.statusText}`);
|
|
104
|
+
}
|
|
105
|
+
const data = (await response.json());
|
|
106
|
+
// Process and cache new embeddings
|
|
107
|
+
for (let i = 0; i < uncachedTexts.length; i++) {
|
|
108
|
+
const embedding = data.data[i].embedding;
|
|
109
|
+
const normalizedEmbedding = this.normalizeVector(embedding);
|
|
110
|
+
// Cache the result in memory
|
|
111
|
+
this.embeddingCache.set(uncachedTexts[i], normalizedEmbedding);
|
|
112
|
+
// Cache in persistent storage if available
|
|
113
|
+
if (this.persistentCachePath) {
|
|
114
|
+
const hash = this.hashText(uncachedTexts[i]);
|
|
115
|
+
this.persistentCache[uncachedTexts[i]] = {
|
|
116
|
+
embedding: normalizedEmbedding,
|
|
117
|
+
hash,
|
|
118
|
+
timestamp: Date.now()
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
// Update results array
|
|
122
|
+
const originalIndex = uncachedIndices[i];
|
|
123
|
+
results[originalIndex] = normalizedEmbedding;
|
|
124
|
+
}
|
|
125
|
+
// Save persistent cache after successful batch
|
|
126
|
+
if (this.persistentCachePath && uncachedTexts.length > 0) {
|
|
127
|
+
this.savePersistentCache();
|
|
128
|
+
}
|
|
129
|
+
// Add small delay between successful requests to avoid hitting rate limits
|
|
130
|
+
if (retryCount === 0) {
|
|
131
|
+
await new Promise(resolve => setTimeout(resolve, 200));
|
|
132
|
+
}
|
|
133
|
+
return results;
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
if (error instanceof Error && error.message.includes('Rate limit') && retryCount < maxRetries) {
|
|
137
|
+
const delay = baseDelay * Math.pow(2, retryCount) + Math.random() * 1000;
|
|
138
|
+
if (this.verbose || this.debug) {
|
|
139
|
+
console.log(`Error occurred. Waiting ${Math.round(delay)}ms before retry ${retryCount + 1}/${maxRetries}...`);
|
|
140
|
+
}
|
|
141
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
142
|
+
return this.getEmbeddingsBatch(texts, retryCount + 1);
|
|
143
|
+
}
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get embedding for a single text
|
|
149
|
+
* @param text The text to get embedding for
|
|
150
|
+
* @param retryCount Current retry attempt
|
|
151
|
+
* @returns The embedding vector
|
|
152
|
+
*/
|
|
153
|
+
async getEmbedding(text, retryCount = 0) {
|
|
154
|
+
const results = await this.getEmbeddingsBatch([text], retryCount);
|
|
155
|
+
return results[0];
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Normalize a vector to unit length
|
|
159
|
+
* @param vector The vector to normalize
|
|
160
|
+
* @returns The normalized vector
|
|
161
|
+
*/
|
|
162
|
+
normalizeVector(vector) {
|
|
163
|
+
const magnitude = Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0));
|
|
164
|
+
return vector.map(val => val / magnitude);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Clear the embedding cache
|
|
168
|
+
*/
|
|
169
|
+
clearEmbeddingCache() {
|
|
170
|
+
this.embeddingCache.clear();
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Clear both in-memory and persistent caches
|
|
174
|
+
*/
|
|
175
|
+
clearAllCaches() {
|
|
176
|
+
this.embeddingCache.clear();
|
|
177
|
+
this.persistentCache = {};
|
|
178
|
+
if (this.persistentCachePath && fs.existsSync(this.persistentCachePath)) {
|
|
179
|
+
fs.unlinkSync(this.persistentCachePath);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get cached embedding for a text without generating a new one
|
|
184
|
+
* @param text Text to check in cache
|
|
185
|
+
* @returns Cached embedding or undefined if not in cache
|
|
186
|
+
*/
|
|
187
|
+
getCachedEmbedding(text) {
|
|
188
|
+
// Check in-memory cache first
|
|
189
|
+
if (this.embeddingCache.has(text)) {
|
|
190
|
+
return this.embeddingCache.get(text);
|
|
191
|
+
}
|
|
192
|
+
// Check persistent cache if available
|
|
193
|
+
if (this.persistentCachePath) {
|
|
194
|
+
const hash = this.hashText(text);
|
|
195
|
+
const cached = this.persistentCache[text];
|
|
196
|
+
if (cached && cached.hash === hash) {
|
|
197
|
+
// Move to in-memory cache for faster subsequent access
|
|
198
|
+
this.embeddingCache.set(text, cached.embedding);
|
|
199
|
+
return cached.embedding;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return undefined;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get cache size
|
|
206
|
+
* @returns Number of cached embeddings
|
|
207
|
+
*/
|
|
208
|
+
getCacheSize() {
|
|
209
|
+
return this.embeddingCache.size;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Get total cache size including persistent cache
|
|
213
|
+
*/
|
|
214
|
+
getTotalCacheSize() {
|
|
215
|
+
return this.embeddingCache.size + Object.keys(this.persistentCache).length;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get cache statistics
|
|
219
|
+
*/
|
|
220
|
+
getCacheStats() {
|
|
221
|
+
return {
|
|
222
|
+
memorySize: this.embeddingCache.size,
|
|
223
|
+
persistentSize: Object.keys(this.persistentCache).length,
|
|
224
|
+
totalSize: this.getTotalCacheSize(),
|
|
225
|
+
cacheEnabled: this.persistentCachePath !== undefined
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Load persistent cache from file
|
|
230
|
+
*/
|
|
231
|
+
loadPersistentCache() {
|
|
232
|
+
if (!this.persistentCachePath)
|
|
233
|
+
return;
|
|
234
|
+
try {
|
|
235
|
+
// Ensure cache directory exists
|
|
236
|
+
const cacheDir = path.dirname(this.persistentCachePath);
|
|
237
|
+
if (!fs.existsSync(cacheDir)) {
|
|
238
|
+
fs.mkdirSync(cacheDir, { recursive: true });
|
|
239
|
+
}
|
|
240
|
+
if (fs.existsSync(this.persistentCachePath)) {
|
|
241
|
+
const data = fs.readFileSync(this.persistentCachePath, 'utf8');
|
|
242
|
+
this.persistentCache = JSON.parse(data);
|
|
243
|
+
if (this.verbose || this.debug) {
|
|
244
|
+
console.log(`✓ Loaded ${Object.keys(this.persistentCache).length} cached embeddings from ${this.persistentCachePath}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
console.warn(`Failed to load persistent cache: ${error}`);
|
|
250
|
+
this.persistentCache = {};
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Save persistent cache to file
|
|
255
|
+
*/
|
|
256
|
+
savePersistentCache() {
|
|
257
|
+
if (!this.persistentCachePath)
|
|
258
|
+
return;
|
|
259
|
+
try {
|
|
260
|
+
const cacheDir = path.dirname(this.persistentCachePath);
|
|
261
|
+
if (!fs.existsSync(cacheDir)) {
|
|
262
|
+
fs.mkdirSync(cacheDir, { recursive: true });
|
|
263
|
+
}
|
|
264
|
+
fs.writeFileSync(this.persistentCachePath, JSON.stringify(this.persistentCache, null, 2));
|
|
265
|
+
if (this.verbose || this.debug) {
|
|
266
|
+
console.log(`✓ Saved ${Object.keys(this.persistentCache).length} cached embeddings to ${this.persistentCachePath}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
console.warn(`Failed to save persistent cache: ${error}`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Create a hash of the text content for cache validation
|
|
275
|
+
*/
|
|
276
|
+
hashText(text) {
|
|
277
|
+
return crypto.createHash('sha256').update(text).digest('hex');
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=embeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../../src/mcp/embeddings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server as HttpServer } from 'http';
|
|
3
|
+
declare class SDLMCPServer {
|
|
4
|
+
private server;
|
|
5
|
+
private db;
|
|
6
|
+
private initialized;
|
|
7
|
+
private embeddingService;
|
|
8
|
+
private verbose;
|
|
9
|
+
private debug;
|
|
10
|
+
private logger;
|
|
11
|
+
private httpServer?;
|
|
12
|
+
private inflightRequests;
|
|
13
|
+
constructor(options?: {
|
|
14
|
+
verbose?: boolean;
|
|
15
|
+
debug?: boolean;
|
|
16
|
+
overrideLogging?: boolean;
|
|
17
|
+
});
|
|
18
|
+
private initialize;
|
|
19
|
+
private setupToolHandlers;
|
|
20
|
+
private performSearch;
|
|
21
|
+
private formatSearchResults;
|
|
22
|
+
private log;
|
|
23
|
+
run(): Promise<void>;
|
|
24
|
+
private createHttpMcpServer;
|
|
25
|
+
runHttp(port?: number): Promise<HttpServer<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>>;
|
|
26
|
+
drainAndClose(timeoutMs?: number): Promise<void>;
|
|
27
|
+
close(): void;
|
|
28
|
+
}
|
|
29
|
+
export { SDLMCPServer };
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|