@samanhappy/mcphub 0.6.2 → 0.7.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 (50) hide show
  1. package/README.md +36 -18
  2. package/README.zh.md +35 -17
  3. package/dist/config/index.js +1 -0
  4. package/dist/config/index.js.map +1 -1
  5. package/dist/controllers/configController.js +28 -0
  6. package/dist/controllers/configController.js.map +1 -0
  7. package/dist/controllers/serverController.js +83 -2
  8. package/dist/controllers/serverController.js.map +1 -1
  9. package/dist/db/connection.js +279 -0
  10. package/dist/db/connection.js.map +1 -0
  11. package/dist/db/entities/VectorEmbedding.js +62 -0
  12. package/dist/db/entities/VectorEmbedding.js.map +1 -0
  13. package/dist/db/entities/index.js +6 -0
  14. package/dist/db/entities/index.js.map +1 -0
  15. package/dist/db/index.js +32 -0
  16. package/dist/db/index.js.map +1 -0
  17. package/dist/db/repositories/BaseRepository.js +58 -0
  18. package/dist/db/repositories/BaseRepository.js.map +1 -0
  19. package/dist/db/repositories/VectorEmbeddingRepository.js +173 -0
  20. package/dist/db/repositories/VectorEmbeddingRepository.js.map +1 -0
  21. package/dist/db/repositories/index.js +4 -0
  22. package/dist/db/repositories/index.js.map +1 -0
  23. package/dist/db/subscribers/VectorEmbeddingSubscriber.js +56 -0
  24. package/dist/db/subscribers/VectorEmbeddingSubscriber.js.map +1 -0
  25. package/dist/db/types/postgresVectorType.js +33 -0
  26. package/dist/db/types/postgresVectorType.js.map +1 -0
  27. package/dist/index.js +1 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/middlewares/index.js +18 -8
  30. package/dist/middlewares/index.js.map +1 -1
  31. package/dist/routes/index.js +13 -9
  32. package/dist/routes/index.js.map +1 -1
  33. package/dist/server.js +18 -9
  34. package/dist/server.js.map +1 -1
  35. package/dist/services/mcpService.js +185 -3
  36. package/dist/services/mcpService.js.map +1 -1
  37. package/dist/services/sseService.js +15 -8
  38. package/dist/services/sseService.js.map +1 -1
  39. package/dist/services/vectorSearchService.js +603 -0
  40. package/dist/services/vectorSearchService.js.map +1 -0
  41. package/frontend/dist/assets/favicon-DJnZjsC8.ico +0 -0
  42. package/frontend/dist/assets/index-D9p3VMBc.css +1 -0
  43. package/frontend/dist/assets/index-D_eNkDvW.js +148 -0
  44. package/frontend/dist/assets/index-D_eNkDvW.js.map +1 -0
  45. package/frontend/dist/index.html +3 -3
  46. package/package.json +15 -7
  47. package/frontend/dist/assets/favicon-DKeT5aEu.ico +0 -0
  48. package/frontend/dist/assets/index-B7KNaMJO.js +0 -148
  49. package/frontend/dist/assets/index-B7KNaMJO.js.map +0 -1
  50. package/frontend/dist/assets/index-DDs5RqXX.css +0 -1
@@ -0,0 +1,279 @@
1
+ import 'reflect-metadata'; // Ensure reflect-metadata is imported here too
2
+ import { DataSource } from 'typeorm';
3
+ import entities from './entities/index.js';
4
+ import { registerPostgresVectorType } from './types/postgresVectorType.js';
5
+ import { VectorEmbeddingSubscriber } from './subscribers/VectorEmbeddingSubscriber.js';
6
+ import { loadSettings } from '../config/index.js';
7
+ // Get database URL from smart routing config or fallback to environment variable
8
+ const getDatabaseUrl = () => {
9
+ try {
10
+ const settings = loadSettings();
11
+ const smartRouting = settings.systemConfig?.smartRouting;
12
+ // Use smart routing dbUrl if smart routing is enabled and dbUrl is configured
13
+ if (smartRouting?.enabled && smartRouting?.dbUrl) {
14
+ console.log('Using smart routing database URL');
15
+ return smartRouting.dbUrl;
16
+ }
17
+ }
18
+ catch (error) {
19
+ console.warn('Failed to load settings for smart routing database URL, falling back to environment variable:', error);
20
+ }
21
+ return '';
22
+ };
23
+ // Default database configuration
24
+ const defaultConfig = {
25
+ type: 'postgres',
26
+ url: getDatabaseUrl(),
27
+ synchronize: true,
28
+ entities: entities,
29
+ subscribers: [VectorEmbeddingSubscriber],
30
+ };
31
+ // AppDataSource is the TypeORM data source
32
+ let AppDataSource = new DataSource(defaultConfig);
33
+ // Function to create a new DataSource with updated configuration
34
+ export const updateDataSourceConfig = () => {
35
+ const newConfig = {
36
+ ...defaultConfig,
37
+ url: getDatabaseUrl(),
38
+ };
39
+ // If the configuration has changed, we need to create a new DataSource
40
+ const currentUrl = AppDataSource.options.url;
41
+ if (currentUrl !== newConfig.url) {
42
+ console.log('Database URL configuration changed, updating DataSource...');
43
+ AppDataSource = new DataSource(newConfig);
44
+ }
45
+ return AppDataSource;
46
+ };
47
+ // Get the current AppDataSource instance
48
+ export const getAppDataSource = () => {
49
+ return AppDataSource;
50
+ };
51
+ // Reconnect database with updated configuration
52
+ export const reconnectDatabase = async () => {
53
+ try {
54
+ // Close existing connection if it exists
55
+ if (AppDataSource.isInitialized) {
56
+ console.log('Closing existing database connection...');
57
+ await AppDataSource.destroy();
58
+ }
59
+ // Update configuration and reconnect
60
+ AppDataSource = updateDataSourceConfig();
61
+ return await initializeDatabase();
62
+ }
63
+ catch (error) {
64
+ console.error('Error during database reconnection:', error);
65
+ throw error;
66
+ }
67
+ };
68
+ // Initialize database connection
69
+ export const initializeDatabase = async () => {
70
+ try {
71
+ // Update configuration before initializing
72
+ AppDataSource = updateDataSourceConfig();
73
+ if (!AppDataSource.isInitialized) {
74
+ console.log('Initializing database connection...');
75
+ await AppDataSource.initialize();
76
+ // Register the vector type with TypeORM
77
+ registerPostgresVectorType(AppDataSource);
78
+ // Create pgvector extension if it doesn't exist
79
+ await AppDataSource.query('CREATE EXTENSION IF NOT EXISTS vector;').catch((err) => {
80
+ console.warn('Failed to create vector extension:', err.message);
81
+ console.warn('Vector functionality may not be available.');
82
+ });
83
+ // Set up vector column and index with a more direct approach
84
+ try {
85
+ // First, create the extension
86
+ await AppDataSource.query(`CREATE EXTENSION IF NOT EXISTS vector;`);
87
+ // Check if table exists first
88
+ const tableExists = await AppDataSource.query(`
89
+ SELECT EXISTS (
90
+ SELECT FROM information_schema.tables
91
+ WHERE table_schema = 'public'
92
+ AND table_name = 'vector_embeddings'
93
+ );
94
+ `);
95
+ if (tableExists[0].exists) {
96
+ // Add pgvector support via raw SQL commands
97
+ console.log('Configuring vector support for embeddings table...');
98
+ // Step 1: Drop any existing index on the column
99
+ try {
100
+ await AppDataSource.query(`DROP INDEX IF EXISTS idx_vector_embeddings_embedding;`);
101
+ }
102
+ catch (dropError) {
103
+ console.warn('Note: Could not drop existing index:', dropError.message);
104
+ }
105
+ // Step 2: Alter column type to vector (if it's not already)
106
+ try {
107
+ // Check column type first
108
+ const columnType = await AppDataSource.query(`
109
+ SELECT data_type FROM information_schema.columns
110
+ WHERE table_schema = 'public' AND table_name = 'vector_embeddings'
111
+ AND column_name = 'embedding';
112
+ `);
113
+ if (columnType.length > 0 && columnType[0].data_type !== 'vector') {
114
+ await AppDataSource.query(`
115
+ ALTER TABLE vector_embeddings
116
+ ALTER COLUMN embedding TYPE vector USING embedding::vector;
117
+ `);
118
+ console.log('Vector embedding column type updated successfully.');
119
+ }
120
+ }
121
+ catch (alterError) {
122
+ console.warn('Could not alter embedding column type:', alterError.message);
123
+ console.warn('Will try to recreate the table later.');
124
+ }
125
+ // Step 3: Try to create appropriate indices
126
+ try {
127
+ // First, let's check if there are any records to determine the dimensions
128
+ const records = await AppDataSource.query(`
129
+ SELECT dimensions FROM vector_embeddings LIMIT 1;
130
+ `);
131
+ let dimensions = 1536; // Default to common OpenAI embedding size
132
+ if (records && records.length > 0 && records[0].dimensions) {
133
+ dimensions = records[0].dimensions;
134
+ console.log(`Found vector dimension from existing data: ${dimensions}`);
135
+ }
136
+ else {
137
+ console.log(`Using default vector dimension: ${dimensions} (no existing data found)`);
138
+ }
139
+ // Set the vector dimensions explicitly only if table has data
140
+ if (records && records.length > 0) {
141
+ await AppDataSource.query(`
142
+ ALTER TABLE vector_embeddings
143
+ ALTER COLUMN embedding TYPE vector(${dimensions});
144
+ `);
145
+ // Now try to create the index
146
+ await AppDataSource.query(`
147
+ CREATE INDEX IF NOT EXISTS idx_vector_embeddings_embedding
148
+ ON vector_embeddings USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
149
+ `);
150
+ console.log('Created IVFFlat index for vector similarity search.');
151
+ }
152
+ else {
153
+ console.log('No existing vector data found, skipping index creation - will be handled by vector service.');
154
+ }
155
+ }
156
+ catch (indexError) {
157
+ console.warn('IVFFlat index creation failed:', indexError.message);
158
+ console.warn('Trying alternative index type...');
159
+ try {
160
+ // Try HNSW index instead
161
+ await AppDataSource.query(`
162
+ CREATE INDEX IF NOT EXISTS idx_vector_embeddings_embedding
163
+ ON vector_embeddings USING hnsw (embedding vector_cosine_ops);
164
+ `);
165
+ console.log('Created HNSW index for vector similarity search.');
166
+ }
167
+ catch (hnswError) {
168
+ // Final fallback to simpler index type
169
+ console.warn('HNSW index creation failed too. Using simple L2 distance index.');
170
+ try {
171
+ // Create a basic GIN index as last resort
172
+ await AppDataSource.query(`
173
+ CREATE INDEX IF NOT EXISTS idx_vector_embeddings_embedding
174
+ ON vector_embeddings USING gin (embedding);
175
+ `);
176
+ console.log('Created GIN index for basic vector lookups.');
177
+ }
178
+ catch (ginError) {
179
+ console.warn('All index creation attempts failed:', ginError.message);
180
+ console.warn('Vector search will be slower without an optimized index.');
181
+ }
182
+ }
183
+ }
184
+ }
185
+ else {
186
+ console.log('Vector embeddings table does not exist yet - will configure after schema sync.');
187
+ }
188
+ }
189
+ catch (error) {
190
+ console.warn('Could not set up vector column/index:', error.message);
191
+ console.warn('Will attempt again after schema synchronization.');
192
+ }
193
+ console.log('Database connection established successfully.');
194
+ // Run one final setup check after schema synchronization is done
195
+ if (defaultConfig.synchronize) {
196
+ setTimeout(async () => {
197
+ try {
198
+ console.log('Running final vector configuration check...');
199
+ // Try setup again with the same code from above
200
+ const tableExists = await AppDataSource.query(`
201
+ SELECT EXISTS (
202
+ SELECT FROM information_schema.tables
203
+ WHERE table_schema = 'public'
204
+ AND table_name = 'vector_embeddings'
205
+ );
206
+ `);
207
+ if (tableExists[0].exists) {
208
+ console.log('Vector embeddings table found, checking configuration...');
209
+ // Get the dimension size first
210
+ try {
211
+ // Try to get dimensions from an existing record
212
+ const records = await AppDataSource.query(`
213
+ SELECT dimensions FROM vector_embeddings LIMIT 1;
214
+ `);
215
+ // Only proceed if we have existing data, otherwise let vector service handle it
216
+ if (records && records.length > 0 && records[0].dimensions) {
217
+ const dimensions = records[0].dimensions;
218
+ console.log(`Found vector dimension from database: ${dimensions}`);
219
+ // Ensure column type is vector with explicit dimensions
220
+ await AppDataSource.query(`
221
+ ALTER TABLE vector_embeddings
222
+ ALTER COLUMN embedding TYPE vector(${dimensions});
223
+ `);
224
+ console.log('Vector embedding column type updated in final check.');
225
+ // One more attempt at creating the index with dimensions
226
+ try {
227
+ // Drop existing index if any
228
+ await AppDataSource.query(`
229
+ DROP INDEX IF EXISTS idx_vector_embeddings_embedding;
230
+ `);
231
+ // Create new index with proper dimensions
232
+ await AppDataSource.query(`
233
+ CREATE INDEX idx_vector_embeddings_embedding
234
+ ON vector_embeddings USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
235
+ `);
236
+ console.log('Created IVFFlat index in final check.');
237
+ }
238
+ catch (indexError) {
239
+ console.warn('Final index creation attempt did not succeed:', indexError.message);
240
+ console.warn('Using basic lookup without vector index.');
241
+ }
242
+ }
243
+ else {
244
+ console.log('No existing vector data found, vector dimensions will be configured by vector service.');
245
+ }
246
+ }
247
+ catch (setupError) {
248
+ console.warn('Vector setup in final check failed:', setupError.message);
249
+ }
250
+ }
251
+ }
252
+ catch (error) {
253
+ console.warn('Post-initialization vector setup failed:', error.message);
254
+ }
255
+ }, 3000); // Give synchronize some time to complete
256
+ }
257
+ }
258
+ return AppDataSource;
259
+ }
260
+ catch (error) {
261
+ console.error('Error during database initialization:', error);
262
+ throw error;
263
+ }
264
+ };
265
+ // Get database connection status
266
+ export const isDatabaseConnected = () => {
267
+ return AppDataSource.isInitialized;
268
+ };
269
+ // Close database connection
270
+ export const closeDatabase = async () => {
271
+ if (AppDataSource.isInitialized) {
272
+ await AppDataSource.destroy();
273
+ console.log('Database connection closed.');
274
+ }
275
+ };
276
+ // Export AppDataSource for backward compatibility
277
+ export { AppDataSource };
278
+ export default getAppDataSource;
279
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, } from 'typeorm';
11
+ let VectorEmbedding = class VectorEmbedding {
12
+ };
13
+ __decorate([
14
+ PrimaryGeneratedColumn('uuid'),
15
+ __metadata("design:type", String)
16
+ ], VectorEmbedding.prototype, "id", void 0);
17
+ __decorate([
18
+ Column({ type: 'varchar' }),
19
+ __metadata("design:type", String)
20
+ ], VectorEmbedding.prototype, "content_type", void 0);
21
+ __decorate([
22
+ Column({ type: 'varchar' }),
23
+ __metadata("design:type", String)
24
+ ], VectorEmbedding.prototype, "content_id", void 0);
25
+ __decorate([
26
+ Column('text'),
27
+ __metadata("design:type", String)
28
+ ], VectorEmbedding.prototype, "text_content", void 0);
29
+ __decorate([
30
+ Column('simple-json'),
31
+ __metadata("design:type", Object)
32
+ ], VectorEmbedding.prototype, "metadata", void 0);
33
+ __decorate([
34
+ Column({
35
+ type: 'float',
36
+ array: true,
37
+ nullable: true,
38
+ }),
39
+ __metadata("design:type", Array)
40
+ ], VectorEmbedding.prototype, "embedding", void 0);
41
+ __decorate([
42
+ Column({ type: 'int' }),
43
+ __metadata("design:type", Number)
44
+ ], VectorEmbedding.prototype, "dimensions", void 0);
45
+ __decorate([
46
+ Column({ type: 'varchar' }),
47
+ __metadata("design:type", String)
48
+ ], VectorEmbedding.prototype, "model", void 0);
49
+ __decorate([
50
+ CreateDateColumn({ name: 'created_at', type: 'timestamp' }),
51
+ __metadata("design:type", Date)
52
+ ], VectorEmbedding.prototype, "createdAt", void 0);
53
+ __decorate([
54
+ UpdateDateColumn({ name: 'updated_at', type: 'timestamp' }),
55
+ __metadata("design:type", Date)
56
+ ], VectorEmbedding.prototype, "updatedAt", void 0);
57
+ VectorEmbedding = __decorate([
58
+ Entity({ name: 'vector_embeddings' })
59
+ ], VectorEmbedding);
60
+ export { VectorEmbedding };
61
+ export default VectorEmbedding;
62
+ //# sourceMappingURL=VectorEmbedding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorEmbedding.js","sourceRoot":"","sources":["../../../src/db/entities/VectorEmbedding.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EACL,MAAM,EACN,sBAAsB,EACtB,MAAM,EACN,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAGV,IAAM,eAAe,GAArB,MAAM,eAAe;CAkC3B,CAAA;AAhCC;IADC,sBAAsB,CAAC,MAAM,CAAC;;2CACpB;AAGX;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;qDACP;AAGrB;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;mDACT;AAGnB;IADC,MAAM,CAAC,MAAM,CAAC;;qDACM;AAGrB;IADC,MAAM,CAAC,aAAa,CAAC;;iDACQ;AAO9B;IALC,MAAM,CAAC;QACN,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,IAAI;KACf,CAAC;;kDACkB;AAGpB;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;mDACL;AAGnB;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;8CACd;AAGd;IADC,gBAAgB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;8BACjD,IAAI;kDAAC;AAGhB;IADC,gBAAgB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;8BACjD,IAAI;kDAAC;AAjCL,eAAe;IAD3B,MAAM,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;GACzB,eAAe,CAkC3B;;AAED,eAAe,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { VectorEmbedding } from './VectorEmbedding.js';
2
+ // Export all entities
3
+ export default [VectorEmbedding];
4
+ // Export individual entities for direct use
5
+ export { VectorEmbedding };
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/entities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,sBAAsB;AACtB,eAAe,CAAC,eAAe,CAAC,CAAC;AAEjC,4CAA4C;AAC5C,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { initializeDatabase, closeDatabase, isDatabaseConnected } from './connection.js';
2
+ import * as repositories from './repositories/index.js';
3
+ /**
4
+ * Initialize the database module
5
+ */
6
+ export async function initializeDbModule() {
7
+ try {
8
+ // Connect to the database
9
+ await initializeDatabase();
10
+ return true;
11
+ }
12
+ catch (error) {
13
+ console.error('Failed to initialize database module:', error);
14
+ return false;
15
+ }
16
+ }
17
+ /**
18
+ * Get the repository factory for a database entity type
19
+ * @param entityType The type of entity to get a repository for
20
+ */
21
+ export function getRepositoryFactory(entityType) {
22
+ // Return the appropriate repository based on entity type
23
+ switch (entityType) {
24
+ case 'vectorEmbeddings':
25
+ return () => new repositories.VectorEmbeddingRepository();
26
+ default:
27
+ throw new Error(`Unknown entity type: ${entityType}`);
28
+ }
29
+ }
30
+ // Re-export everything from the database module
31
+ export { initializeDatabase, closeDatabase, isDatabaseConnected, repositories };
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACzF,OAAO,KAAK,YAAY,MAAM,yBAAyB,CAAC;AAExD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,CAAC;QACH,0BAA0B;QAC1B,MAAM,kBAAkB,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QAC9D,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAA8B;IACjE,yDAAyD;IACzD,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,kBAAkB;YACrB,OAAO,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,yBAAyB,EAAE,CAAC;QAC5D;YACE,MAAM,IAAI,KAAK,CAAC,wBAAwB,UAAU,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,gDAAgD;AAChD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { getAppDataSource } from '../connection.js';
2
+ /**
3
+ * Base repository class with common CRUD operations
4
+ */
5
+ export class BaseRepository {
6
+ constructor(entityClass) {
7
+ this.repository = getAppDataSource().getRepository(entityClass);
8
+ }
9
+ /**
10
+ * Get repository access
11
+ */
12
+ getRepository() {
13
+ return this.repository;
14
+ }
15
+ /**
16
+ * Find all entities
17
+ */
18
+ async findAll() {
19
+ return this.repository.find();
20
+ }
21
+ /**
22
+ * Find entity by ID
23
+ * @param id Entity ID
24
+ */
25
+ async findById(id) {
26
+ return this.repository.findOneBy({ id });
27
+ }
28
+ /**
29
+ * Save or update an entity
30
+ * @param entity Entity to save
31
+ */
32
+ async save(entity) {
33
+ return this.repository.save(entity);
34
+ }
35
+ /**
36
+ * Save multiple entities
37
+ * @param entities Array of entities to save
38
+ */
39
+ async saveMany(entities) {
40
+ return this.repository.save(entities);
41
+ }
42
+ /**
43
+ * Delete an entity by ID
44
+ * @param id Entity ID
45
+ */
46
+ async delete(id) {
47
+ const result = await this.repository.delete(id);
48
+ return result.affected !== null && result.affected !== undefined && result.affected > 0;
49
+ }
50
+ /**
51
+ * Count total entities
52
+ */
53
+ async count() {
54
+ return this.repository.count();
55
+ }
56
+ }
57
+ export default BaseRepository;
58
+ //# sourceMappingURL=BaseRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseRepository.js","sourceRoot":"","sources":["../../../src/db/repositories/BaseRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,cAAc;IAGzB,YAAY,WAA4B;QACtC,IAAI,CAAC,UAAU,GAAG,gBAAgB,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAmB;QAChC,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,EAAS,CAAC,CAAC;IAClD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,MAAkB;QAC3B,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAa,CAAC,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAsB;QACnC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAiB,CAAC,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,EAAmB;QAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChD,OAAO,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC1F,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;CACF;AAED,eAAe,cAAc,CAAC"}
@@ -0,0 +1,173 @@
1
+ import { VectorEmbedding } from '../entities/VectorEmbedding.js';
2
+ import BaseRepository from './BaseRepository.js';
3
+ import { getAppDataSource } from '../connection.js';
4
+ export class VectorEmbeddingRepository extends BaseRepository {
5
+ constructor() {
6
+ super(VectorEmbedding);
7
+ }
8
+ /**
9
+ * Find by content type and ID
10
+ * @param contentType Content type
11
+ * @param contentId Content ID
12
+ */
13
+ async findByContentIdentity(contentType, contentId) {
14
+ return this.repository.findOneBy({
15
+ content_type: contentType,
16
+ content_id: contentId,
17
+ });
18
+ }
19
+ /**
20
+ * Create or update an embedding for content
21
+ * @param contentType Content type
22
+ * @param contentId Content ID
23
+ * @param textContent Text content to embed
24
+ * @param embedding Vector embedding
25
+ * @param metadata Additional metadata
26
+ * @param model Model used to create the embedding
27
+ */
28
+ async saveEmbedding(contentType, contentId, textContent, embedding, metadata = {}, model = 'default') {
29
+ // Check if embedding exists
30
+ let vectorEmbedding = await this.findByContentIdentity(contentType, contentId);
31
+ if (!vectorEmbedding) {
32
+ vectorEmbedding = new VectorEmbedding();
33
+ vectorEmbedding.content_type = contentType;
34
+ vectorEmbedding.content_id = contentId;
35
+ }
36
+ // Update properties
37
+ vectorEmbedding.text_content = textContent;
38
+ vectorEmbedding.embedding = embedding;
39
+ vectorEmbedding.dimensions = embedding.length;
40
+ vectorEmbedding.metadata = metadata;
41
+ vectorEmbedding.model = model;
42
+ // For raw SQL operations where our subscriber might not be called
43
+ // Ensure the embedding is properly formatted for postgres
44
+ const rawEmbedding = this.formatEmbeddingForPgVector(embedding);
45
+ if (rawEmbedding) {
46
+ vectorEmbedding.embedding = rawEmbedding;
47
+ }
48
+ return this.save(vectorEmbedding);
49
+ }
50
+ /**
51
+ * Search for similar embeddings using cosine similarity
52
+ * @param embedding Vector embedding to search against
53
+ * @param limit Maximum number of results (default: 10)
54
+ * @param threshold Similarity threshold (default: 0.7)
55
+ * @param contentTypes Optional content types to filter by
56
+ */
57
+ async searchSimilar(embedding, limit = 10, threshold = 0.7, contentTypes) {
58
+ try {
59
+ // Try using vector similarity operator first
60
+ try {
61
+ // Build query with vector operators
62
+ let query = getAppDataSource()
63
+ .createQueryBuilder()
64
+ .select('vector_embedding.*')
65
+ .addSelect(`1 - (vector_embedding.embedding <=> :embedding) AS similarity`)
66
+ .from(VectorEmbedding, 'vector_embedding')
67
+ .where(`1 - (vector_embedding.embedding <=> :embedding) > :threshold`)
68
+ .orderBy('similarity', 'DESC')
69
+ .limit(limit)
70
+ .setParameter('embedding', Array.isArray(embedding) ? `[${embedding.join(',')}]` : embedding)
71
+ .setParameter('threshold', threshold);
72
+ // Add content type filter if provided
73
+ if (contentTypes && contentTypes.length > 0) {
74
+ query = query
75
+ .andWhere('vector_embedding.content_type IN (:...contentTypes)')
76
+ .setParameter('contentTypes', contentTypes);
77
+ }
78
+ // Execute query
79
+ const results = await query.getRawMany();
80
+ // Return results if successful
81
+ return results.map((row) => ({
82
+ embedding: this.mapRawToEntity(row),
83
+ similarity: parseFloat(row.similarity),
84
+ }));
85
+ }
86
+ catch (vectorError) {
87
+ console.warn('Vector similarity search failed, falling back to basic filtering:', vectorError);
88
+ // Fallback to just getting the records by content type
89
+ let query = this.repository.createQueryBuilder('vector_embedding');
90
+ // Add content type filter if provided
91
+ if (contentTypes && contentTypes.length > 0) {
92
+ query = query
93
+ .where('vector_embedding.content_type IN (:...contentTypes)')
94
+ .setParameter('contentTypes', contentTypes);
95
+ }
96
+ // Limit results
97
+ query = query.take(limit);
98
+ // Execute query
99
+ const results = await query.getMany();
100
+ // Return results with a placeholder similarity
101
+ return results.map((entity) => ({
102
+ embedding: entity,
103
+ similarity: 0.5, // Placeholder similarity
104
+ }));
105
+ }
106
+ }
107
+ catch (error) {
108
+ console.error('Error during vector search:', error);
109
+ return [];
110
+ }
111
+ }
112
+ /**
113
+ * Search by text using vector similarity
114
+ * @param text Text to search for
115
+ * @param getEmbeddingFunc Function to convert text to embedding
116
+ * @param limit Maximum number of results
117
+ * @param threshold Similarity threshold
118
+ * @param contentTypes Optional content types to filter by
119
+ */
120
+ async searchByText(text, getEmbeddingFunc, limit = 10, threshold = 0.7, contentTypes) {
121
+ try {
122
+ // Get embedding for the search text
123
+ const embedding = await getEmbeddingFunc(text);
124
+ // Search by embedding
125
+ return this.searchSimilar(embedding, limit, threshold, contentTypes);
126
+ }
127
+ catch (error) {
128
+ console.error('Error searching by text:', error);
129
+ return [];
130
+ }
131
+ }
132
+ /**
133
+ * Map raw database result to entity
134
+ * @param raw Raw database result
135
+ */
136
+ mapRawToEntity(raw) {
137
+ const entity = new VectorEmbedding();
138
+ entity.id = raw.id;
139
+ entity.content_type = raw.content_type;
140
+ entity.content_id = raw.content_id;
141
+ entity.text_content = raw.text_content;
142
+ entity.metadata = raw.metadata;
143
+ entity.embedding = raw.embedding;
144
+ entity.dimensions = raw.dimensions;
145
+ entity.model = raw.model;
146
+ entity.createdAt = raw.created_at;
147
+ entity.updatedAt = raw.updated_at;
148
+ return entity;
149
+ }
150
+ /**
151
+ * Format embedding array for pgvector
152
+ * @param embedding Array of embedding values
153
+ * @returns Properly formatted vector string for pgvector
154
+ */
155
+ formatEmbeddingForPgVector(embedding) {
156
+ if (!embedding)
157
+ return null;
158
+ // If it's already a string and starts with '[', assume it's formatted
159
+ if (typeof embedding === 'string') {
160
+ if (embedding.startsWith('[') && embedding.endsWith(']')) {
161
+ return embedding;
162
+ }
163
+ return `[${embedding}]`;
164
+ }
165
+ // Format array as proper pgvector string
166
+ if (Array.isArray(embedding)) {
167
+ return `[${embedding.join(',')}]`;
168
+ }
169
+ return null;
170
+ }
171
+ }
172
+ export default VectorEmbeddingRepository;
173
+ //# sourceMappingURL=VectorEmbeddingRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorEmbeddingRepository.js","sourceRoot":"","sources":["../../../src/db/repositories/VectorEmbeddingRepository.ts"],"names":[],"mappings":"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"}