@samanhappy/mcphub 0.6.1 → 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.
- package/README.md +40 -18
- package/README.zh.md +40 -17
- package/dist/config/index.js +3 -1
- package/dist/config/index.js.map +1 -1
- package/dist/controllers/configController.js +28 -0
- package/dist/controllers/configController.js.map +1 -0
- package/dist/controllers/serverController.js +83 -2
- package/dist/controllers/serverController.js.map +1 -1
- package/dist/db/connection.js +279 -0
- package/dist/db/connection.js.map +1 -0
- package/dist/db/entities/VectorEmbedding.js +62 -0
- package/dist/db/entities/VectorEmbedding.js.map +1 -0
- package/dist/db/entities/index.js +6 -0
- package/dist/db/entities/index.js.map +1 -0
- package/dist/db/index.js +32 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/repositories/BaseRepository.js +58 -0
- package/dist/db/repositories/BaseRepository.js.map +1 -0
- package/dist/db/repositories/VectorEmbeddingRepository.js +173 -0
- package/dist/db/repositories/VectorEmbeddingRepository.js.map +1 -0
- package/dist/db/repositories/index.js +4 -0
- package/dist/db/repositories/index.js.map +1 -0
- package/dist/db/subscribers/VectorEmbeddingSubscriber.js +56 -0
- package/dist/db/subscribers/VectorEmbeddingSubscriber.js.map +1 -0
- package/dist/db/types/postgresVectorType.js +33 -0
- package/dist/db/types/postgresVectorType.js.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/middlewares/index.js +18 -8
- package/dist/middlewares/index.js.map +1 -1
- package/dist/routes/index.js +13 -9
- package/dist/routes/index.js.map +1 -1
- package/dist/server.js +20 -11
- package/dist/server.js.map +1 -1
- package/dist/services/logService.js +54 -50
- package/dist/services/logService.js.map +1 -1
- package/dist/services/mcpService.js +209 -10
- package/dist/services/mcpService.js.map +1 -1
- package/dist/services/sseService.js +17 -10
- package/dist/services/sseService.js.map +1 -1
- package/dist/services/vectorSearchService.js +603 -0
- package/dist/services/vectorSearchService.js.map +1 -0
- package/dist/utils/version.js +23 -0
- package/dist/utils/version.js.map +1 -0
- package/frontend/dist/assets/favicon-DJnZjsC8.ico +0 -0
- package/frontend/dist/assets/index-D9p3VMBc.css +1 -0
- package/frontend/dist/assets/index-D_eNkDvW.js +148 -0
- package/frontend/dist/assets/index-D_eNkDvW.js.map +1 -0
- package/frontend/dist/index.html +3 -3
- package/package.json +15 -7
- package/frontend/dist/assets/favicon-DKeT5aEu.ico +0 -0
- package/frontend/dist/assets/index-2ChivQin.js +0 -148
- package/frontend/dist/assets/index-2ChivQin.js.map +0 -1
- package/frontend/dist/assets/index-DlUYoMya.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 @@
|
|
|
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"}
|
package/dist/db/index.js
ADDED
|
@@ -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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"}
|