fss-link 1.0.51 → 1.0.53
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 +42 -2
- package/dist/package.json +1 -1
- package/dist/src/config/auth.js +5 -8
- package/dist/src/config/auth.js.map +1 -1
- package/dist/src/config/config.d.ts +1 -0
- package/dist/src/config/config.js +5 -0
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/database-utils.d.ts +185 -0
- package/dist/src/config/database-utils.js +295 -0
- package/dist/src/config/database-utils.js.map +1 -0
- package/dist/src/config/database.d.ts +197 -1
- package/dist/src/config/database.js +499 -160
- package/dist/src/config/database.js.map +1 -1
- package/dist/src/config/databaseHealthMonitor.d.ts +86 -0
- package/dist/src/config/databaseHealthMonitor.js +180 -0
- package/dist/src/config/databaseHealthMonitor.js.map +1 -0
- package/dist/src/config/databaseMetrics.d.ts +147 -0
- package/dist/src/config/databaseMetrics.js +369 -0
- package/dist/src/config/databaseMetrics.js.map +1 -0
- package/dist/src/config/databaseMigrations.js +40 -2
- package/dist/src/config/databaseMigrations.js.map +1 -1
- package/dist/src/config/databaseSchemaValidator.d.ts +114 -0
- package/dist/src/config/databaseSchemaValidator.js +499 -0
- package/dist/src/config/databaseSchemaValidator.js.map +1 -0
- package/dist/src/config/providerPersistence.d.ts +7 -0
- package/dist/src/config/providerPersistence.js +14 -7
- package/dist/src/config/providerPersistence.js.map +1 -1
- package/dist/src/gemini.js +35 -2
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/ui/utils/updateCheck.js +1 -1
- package/dist/src/ui/utils/updateCheck.js.map +1 -1
- package/dist/src/utils/installationInfo.js +16 -0
- package/dist/src/utils/installationInfo.js.map +1 -1
- package/dist/src/utils/installationInfo.test.js +6 -6
- package/dist/src/utils/installationInfo.test.js.map +1 -1
- package/dist/src/validateNonInterActiveAuth.js +18 -4
- package/dist/src/validateNonInterActiveAuth.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Comprehensive Database Metrics Collector
|
|
8
|
+
* Aggregates performance data from all database components
|
|
9
|
+
*/
|
|
10
|
+
export class DatabaseMetricsCollector {
|
|
11
|
+
historicalMetrics = [];
|
|
12
|
+
maxHistorySize = 1000;
|
|
13
|
+
thresholds = {
|
|
14
|
+
slowQueryThreshold: 100, // 100ms
|
|
15
|
+
cacheHitRateThreshold: 80, // 80%
|
|
16
|
+
connectionUtilizationThreshold: 90, // 90%
|
|
17
|
+
diskUsageWarning: 100 * 1024 * 1024, // 100MB
|
|
18
|
+
backupAgeWarning: 24 // 24 hours
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Collect comprehensive metrics from all database components
|
|
22
|
+
*/
|
|
23
|
+
async collectMetrics(db, queryOptimizer, connectionPool, backupManager) {
|
|
24
|
+
const startTime = Date.now();
|
|
25
|
+
try {
|
|
26
|
+
// Collect metrics from different components in parallel
|
|
27
|
+
const [queryMetrics, cacheStats, poolStats, dbStats, usageStats, backupStats] = await Promise.all([
|
|
28
|
+
this.collectQueryMetrics(queryOptimizer),
|
|
29
|
+
this.collectCacheMetrics(queryOptimizer),
|
|
30
|
+
this.collectConnectionPoolMetrics(connectionPool),
|
|
31
|
+
this.collectDatabaseStats(db, queryOptimizer),
|
|
32
|
+
this.collectUsageStats(db),
|
|
33
|
+
this.collectBackupStats(backupManager)
|
|
34
|
+
]);
|
|
35
|
+
// Merge backup stats into usage stats
|
|
36
|
+
usageStats.totalBackups = backupStats.totalBackups;
|
|
37
|
+
usageStats.lastBackupAge = backupStats.lastBackupAge;
|
|
38
|
+
// Calculate health scores
|
|
39
|
+
const health = this.calculateHealthScores(queryMetrics, cacheStats, poolStats, usageStats);
|
|
40
|
+
const metrics = {
|
|
41
|
+
queryPerformance: queryMetrics,
|
|
42
|
+
cachePerformance: cacheStats,
|
|
43
|
+
connectionPool: poolStats,
|
|
44
|
+
database: dbStats,
|
|
45
|
+
usage: usageStats,
|
|
46
|
+
health,
|
|
47
|
+
collectedAt: new Date(),
|
|
48
|
+
collectionDuration: Date.now() - startTime
|
|
49
|
+
};
|
|
50
|
+
// Store in history
|
|
51
|
+
this.addToHistory(metrics);
|
|
52
|
+
return metrics;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.warn('Failed to collect database metrics:', error);
|
|
56
|
+
// Return minimal metrics on error
|
|
57
|
+
return this.getEmptyMetrics();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Collect query performance metrics
|
|
62
|
+
*/
|
|
63
|
+
async collectQueryMetrics(queryOptimizer) {
|
|
64
|
+
try {
|
|
65
|
+
const allMetrics = queryOptimizer.getQueryMetrics();
|
|
66
|
+
const slowQueries = queryOptimizer.getSlowQueries(this.thresholds.slowQueryThreshold);
|
|
67
|
+
const totalQueries = allMetrics.reduce((sum, m) => sum + m.executionCount, 0);
|
|
68
|
+
const totalTime = allMetrics.reduce((sum, m) => sum + m.totalTime, 0);
|
|
69
|
+
const averageQueryTime = totalQueries > 0 ? totalTime / totalQueries : 0;
|
|
70
|
+
return {
|
|
71
|
+
totalQueries,
|
|
72
|
+
averageQueryTime,
|
|
73
|
+
slowQueries: slowQueries.length,
|
|
74
|
+
fastQueries: Math.max(0, allMetrics.length - slowQueries.length),
|
|
75
|
+
failedQueries: 0 // TODO: Track failed queries in QueryOptimizer
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.warn('Failed to collect query metrics:', error);
|
|
80
|
+
return {
|
|
81
|
+
totalQueries: 0,
|
|
82
|
+
averageQueryTime: 0,
|
|
83
|
+
slowQueries: 0,
|
|
84
|
+
fastQueries: 0,
|
|
85
|
+
failedQueries: 0
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Collect cache performance metrics
|
|
91
|
+
*/
|
|
92
|
+
async collectCacheMetrics(queryOptimizer) {
|
|
93
|
+
try {
|
|
94
|
+
const cacheStats = queryOptimizer.getCacheStats();
|
|
95
|
+
return {
|
|
96
|
+
hitRate: cacheStats.hitRate * 100, // Convert to percentage
|
|
97
|
+
missRate: (1 - cacheStats.hitRate) * 100,
|
|
98
|
+
cacheSize: cacheStats.size,
|
|
99
|
+
maxCacheSize: cacheStats.maxSize,
|
|
100
|
+
evictionCount: 0 // TODO: Track evictions in QueryOptimizer
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.warn('Failed to collect cache metrics:', error);
|
|
105
|
+
return {
|
|
106
|
+
hitRate: 0,
|
|
107
|
+
missRate: 100,
|
|
108
|
+
cacheSize: 0,
|
|
109
|
+
maxCacheSize: 0,
|
|
110
|
+
evictionCount: 0
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Collect connection pool metrics
|
|
116
|
+
*/
|
|
117
|
+
async collectConnectionPoolMetrics(connectionPool) {
|
|
118
|
+
try {
|
|
119
|
+
const poolStats = connectionPool.getStats();
|
|
120
|
+
const utilization = poolStats.maxConnections > 0
|
|
121
|
+
? (poolStats.activeConnections / poolStats.maxConnections) * 100
|
|
122
|
+
: 0;
|
|
123
|
+
return {
|
|
124
|
+
totalConnections: poolStats.totalConnections,
|
|
125
|
+
activeConnections: poolStats.activeConnections,
|
|
126
|
+
availableConnections: poolStats.availableConnections,
|
|
127
|
+
pendingRequests: poolStats.pendingRequests,
|
|
128
|
+
maxConnections: poolStats.maxConnections,
|
|
129
|
+
connectionUtilization: utilization
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.warn('Failed to collect connection pool metrics:', error);
|
|
134
|
+
return {
|
|
135
|
+
totalConnections: 0,
|
|
136
|
+
activeConnections: 0,
|
|
137
|
+
availableConnections: 0,
|
|
138
|
+
pendingRequests: 0,
|
|
139
|
+
maxConnections: 0,
|
|
140
|
+
connectionUtilization: 0
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Collect database statistics
|
|
146
|
+
*/
|
|
147
|
+
async collectDatabaseStats(db, queryOptimizer) {
|
|
148
|
+
try {
|
|
149
|
+
const dbStats = await queryOptimizer.getDatabaseStats(db);
|
|
150
|
+
const totalSize = dbStats.pageCount * dbStats.pageSize;
|
|
151
|
+
// Count indexes
|
|
152
|
+
const indexResult = db.exec(`
|
|
153
|
+
SELECT COUNT(*) as count FROM sqlite_master
|
|
154
|
+
WHERE type='index' AND name NOT LIKE 'sqlite_%'
|
|
155
|
+
`);
|
|
156
|
+
const indexCount = indexResult[0]?.values[0]?.[0] || 0;
|
|
157
|
+
return {
|
|
158
|
+
pageCount: dbStats.pageCount,
|
|
159
|
+
pageSize: dbStats.pageSize,
|
|
160
|
+
totalSize,
|
|
161
|
+
freelistCount: dbStats.freelistCount,
|
|
162
|
+
schemaVersion: dbStats.schemaVersion,
|
|
163
|
+
tableCount: dbStats.tables.length,
|
|
164
|
+
indexCount
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
console.warn('Failed to collect database stats:', error);
|
|
169
|
+
return {
|
|
170
|
+
pageCount: 0,
|
|
171
|
+
pageSize: 0,
|
|
172
|
+
totalSize: 0,
|
|
173
|
+
freelistCount: 0,
|
|
174
|
+
schemaVersion: 0,
|
|
175
|
+
tableCount: 0,
|
|
176
|
+
indexCount: 0
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Collect usage statistics
|
|
182
|
+
*/
|
|
183
|
+
async collectUsageStats(db) {
|
|
184
|
+
try {
|
|
185
|
+
// Get model counts
|
|
186
|
+
const modelResult = db.exec('SELECT COUNT(*) as count FROM model_configs');
|
|
187
|
+
const totalModelConfigs = modelResult[0]?.values[0]?.[0] || 0;
|
|
188
|
+
const activeResult = db.exec('SELECT COUNT(*) as count FROM model_configs WHERE is_active = 1');
|
|
189
|
+
const activeModels = activeResult[0]?.values[0]?.[0] || 0;
|
|
190
|
+
const favoriteResult = db.exec('SELECT COUNT(*) as count FROM model_configs WHERE is_favorite = 1');
|
|
191
|
+
const favoriteModels = favoriteResult[0]?.values[0]?.[0] || 0;
|
|
192
|
+
return {
|
|
193
|
+
totalModelConfigs,
|
|
194
|
+
activeModels,
|
|
195
|
+
favoriteModels,
|
|
196
|
+
totalBackups: 0, // TODO: Get from backup manager
|
|
197
|
+
lastBackupAge: 0, // TODO: Calculate from backup manager
|
|
198
|
+
diskUsage: 0 // TODO: Calculate actual disk usage
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
console.warn('Failed to collect usage stats:', error);
|
|
203
|
+
return {
|
|
204
|
+
totalModelConfigs: 0,
|
|
205
|
+
activeModels: 0,
|
|
206
|
+
favoriteModels: 0,
|
|
207
|
+
totalBackups: 0,
|
|
208
|
+
lastBackupAge: 0,
|
|
209
|
+
diskUsage: 0
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Collect backup statistics
|
|
215
|
+
*/
|
|
216
|
+
async collectBackupStats(backupManager) {
|
|
217
|
+
try {
|
|
218
|
+
const backups = await backupManager.listBackups();
|
|
219
|
+
const totalBackups = backups.length;
|
|
220
|
+
let lastBackupAge = 0;
|
|
221
|
+
if (backups.length > 0) {
|
|
222
|
+
const latestBackup = backups[0]; // Assuming sorted by date
|
|
223
|
+
const backupDate = new Date(latestBackup.timestamp);
|
|
224
|
+
lastBackupAge = (Date.now() - backupDate.getTime()) / (1000 * 60 * 60); // hours
|
|
225
|
+
}
|
|
226
|
+
return { totalBackups, lastBackupAge };
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
console.warn('Failed to collect backup stats:', error);
|
|
230
|
+
return { totalBackups: 0, lastBackupAge: 0 };
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Calculate health scores based on metrics
|
|
235
|
+
*/
|
|
236
|
+
calculateHealthScores(queryMetrics, cacheMetrics, poolMetrics, usageMetrics) {
|
|
237
|
+
// Performance score (0-100)
|
|
238
|
+
const queryScore = queryMetrics.averageQueryTime < this.thresholds.slowQueryThreshold ? 100 :
|
|
239
|
+
Math.max(0, 100 - (queryMetrics.averageQueryTime - this.thresholds.slowQueryThreshold));
|
|
240
|
+
const cacheScore = cacheMetrics.hitRate; // Already in percentage
|
|
241
|
+
const poolScore = poolMetrics.connectionUtilization < this.thresholds.connectionUtilizationThreshold ? 100 :
|
|
242
|
+
Math.max(0, 100 - (poolMetrics.connectionUtilization - this.thresholds.connectionUtilizationThreshold));
|
|
243
|
+
const performanceScore = Math.round((queryScore + cacheScore + poolScore) / 3);
|
|
244
|
+
// Reliability score (0-100)
|
|
245
|
+
const failureRate = queryMetrics.totalQueries > 0 ?
|
|
246
|
+
(queryMetrics.failedQueries / queryMetrics.totalQueries) * 100 : 0;
|
|
247
|
+
const reliabilityScore = Math.max(0, 100 - failureRate);
|
|
248
|
+
// Overall score
|
|
249
|
+
const overallScore = Math.round((performanceScore + reliabilityScore) / 2);
|
|
250
|
+
// Maintenance needed check
|
|
251
|
+
const maintenanceNeeded = queryMetrics.averageQueryTime > this.thresholds.slowQueryThreshold ||
|
|
252
|
+
cacheMetrics.hitRate < this.thresholds.cacheHitRateThreshold ||
|
|
253
|
+
poolMetrics.connectionUtilization > this.thresholds.connectionUtilizationThreshold ||
|
|
254
|
+
usageMetrics.diskUsage > this.thresholds.diskUsageWarning;
|
|
255
|
+
return {
|
|
256
|
+
overallScore,
|
|
257
|
+
performanceScore,
|
|
258
|
+
reliabilityScore,
|
|
259
|
+
maintenanceNeeded,
|
|
260
|
+
lastOptimization: null, // TODO: Track optimization history
|
|
261
|
+
lastVacuum: null // TODO: Track vacuum history
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Add metrics to historical collection
|
|
266
|
+
*/
|
|
267
|
+
addToHistory(metrics) {
|
|
268
|
+
this.historicalMetrics.push({
|
|
269
|
+
timestamp: new Date(),
|
|
270
|
+
metrics
|
|
271
|
+
});
|
|
272
|
+
// Trim history if too large
|
|
273
|
+
if (this.historicalMetrics.length > this.maxHistorySize) {
|
|
274
|
+
this.historicalMetrics = this.historicalMetrics.slice(-this.maxHistorySize);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Get historical metrics for trend analysis
|
|
279
|
+
*/
|
|
280
|
+
getHistoricalMetrics(hours = 24) {
|
|
281
|
+
const cutoff = new Date(Date.now() - hours * 60 * 60 * 1000);
|
|
282
|
+
return this.historicalMetrics.filter(h => h.timestamp >= cutoff);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Get performance trends
|
|
286
|
+
*/
|
|
287
|
+
getPerformanceTrends(hours = 24) {
|
|
288
|
+
const recent = this.getHistoricalMetrics(hours);
|
|
289
|
+
if (recent.length < 2) {
|
|
290
|
+
return { queryTimeTraend: 0, cacheHitTrend: 0, overallHealthTrend: 0 };
|
|
291
|
+
}
|
|
292
|
+
const oldest = recent[0].metrics;
|
|
293
|
+
const newest = recent[recent.length - 1].metrics;
|
|
294
|
+
return {
|
|
295
|
+
queryTimeTraend: newest.queryPerformance.averageQueryTime - oldest.queryPerformance.averageQueryTime,
|
|
296
|
+
cacheHitTrend: newest.cachePerformance.hitRate - oldest.cachePerformance.hitRate,
|
|
297
|
+
overallHealthTrend: newest.health.overallScore - oldest.health.overallScore
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Return empty metrics structure for error cases
|
|
302
|
+
*/
|
|
303
|
+
getEmptyMetrics() {
|
|
304
|
+
return {
|
|
305
|
+
queryPerformance: {
|
|
306
|
+
totalQueries: 0,
|
|
307
|
+
averageQueryTime: 0,
|
|
308
|
+
slowQueries: 0,
|
|
309
|
+
fastQueries: 0,
|
|
310
|
+
failedQueries: 0
|
|
311
|
+
},
|
|
312
|
+
cachePerformance: {
|
|
313
|
+
hitRate: 0,
|
|
314
|
+
missRate: 100,
|
|
315
|
+
cacheSize: 0,
|
|
316
|
+
maxCacheSize: 0,
|
|
317
|
+
evictionCount: 0
|
|
318
|
+
},
|
|
319
|
+
connectionPool: {
|
|
320
|
+
totalConnections: 0,
|
|
321
|
+
activeConnections: 0,
|
|
322
|
+
availableConnections: 0,
|
|
323
|
+
pendingRequests: 0,
|
|
324
|
+
maxConnections: 0,
|
|
325
|
+
connectionUtilization: 0
|
|
326
|
+
},
|
|
327
|
+
database: {
|
|
328
|
+
pageCount: 0,
|
|
329
|
+
pageSize: 0,
|
|
330
|
+
totalSize: 0,
|
|
331
|
+
freelistCount: 0,
|
|
332
|
+
schemaVersion: 0,
|
|
333
|
+
tableCount: 0,
|
|
334
|
+
indexCount: 0
|
|
335
|
+
},
|
|
336
|
+
usage: {
|
|
337
|
+
totalModelConfigs: 0,
|
|
338
|
+
activeModels: 0,
|
|
339
|
+
favoriteModels: 0,
|
|
340
|
+
totalBackups: 0,
|
|
341
|
+
lastBackupAge: 0,
|
|
342
|
+
diskUsage: 0
|
|
343
|
+
},
|
|
344
|
+
health: {
|
|
345
|
+
overallScore: 0,
|
|
346
|
+
performanceScore: 0,
|
|
347
|
+
reliabilityScore: 0,
|
|
348
|
+
maintenanceNeeded: true,
|
|
349
|
+
lastOptimization: null,
|
|
350
|
+
lastVacuum: null
|
|
351
|
+
},
|
|
352
|
+
collectedAt: new Date(),
|
|
353
|
+
collectionDuration: 0
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Set custom thresholds for health scoring
|
|
358
|
+
*/
|
|
359
|
+
setThresholds(thresholds) {
|
|
360
|
+
this.thresholds = { ...this.thresholds, ...thresholds };
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Clear historical metrics
|
|
364
|
+
*/
|
|
365
|
+
clearHistory() {
|
|
366
|
+
this.historicalMetrics = [];
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
//# sourceMappingURL=databaseMetrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"databaseMetrics.js","sourceRoot":"","sources":["../../../src/config/databaseMetrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -65,6 +65,7 @@ export class MigrationManager {
|
|
|
65
65
|
UNIQUE(provider_id, setting_key)
|
|
66
66
|
)
|
|
67
67
|
`);
|
|
68
|
+
console.log('Creating provider_usage_stats table...');
|
|
68
69
|
db.exec(`
|
|
69
70
|
CREATE TABLE IF NOT EXISTS provider_usage_stats (
|
|
70
71
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
@@ -74,6 +75,7 @@ export class MigrationManager {
|
|
|
74
75
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
75
76
|
)
|
|
76
77
|
`);
|
|
78
|
+
console.log('provider_usage_stats table created successfully');
|
|
77
79
|
},
|
|
78
80
|
down: (db) => {
|
|
79
81
|
db.exec('DROP TABLE IF EXISTS provider_usage_stats');
|
|
@@ -159,6 +161,31 @@ export class MigrationManager {
|
|
|
159
161
|
db.exec('DROP TABLE IF EXISTS schema_info');
|
|
160
162
|
}
|
|
161
163
|
});
|
|
164
|
+
// Migration 5: Add missing source column to model_configs
|
|
165
|
+
this.migrations.push({
|
|
166
|
+
version: 5,
|
|
167
|
+
name: 'add_source_column',
|
|
168
|
+
up: (db) => {
|
|
169
|
+
// Check if source column already exists
|
|
170
|
+
const tableInfo = db.exec(`PRAGMA table_info(model_configs)`);
|
|
171
|
+
const hasSourceColumn = tableInfo.some(result => result.values && result.values.some(row => row[1] === 'source'));
|
|
172
|
+
if (!hasSourceColumn) {
|
|
173
|
+
console.log('Adding missing source column to model_configs table...');
|
|
174
|
+
db.exec(`
|
|
175
|
+
ALTER TABLE model_configs
|
|
176
|
+
ADD COLUMN source TEXT DEFAULT 'db'
|
|
177
|
+
`);
|
|
178
|
+
console.log('Source column added successfully');
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
console.log('Source column already exists, skipping');
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
down: (db) => {
|
|
185
|
+
// SQLite doesn't support DROP COLUMN easily, so we leave it
|
|
186
|
+
console.log('Rollback: Source column left in place (SQLite limitation)');
|
|
187
|
+
}
|
|
188
|
+
});
|
|
162
189
|
}
|
|
163
190
|
/**
|
|
164
191
|
* Get current schema version from database
|
|
@@ -177,8 +204,19 @@ export class MigrationManager {
|
|
|
177
204
|
WHERE type='table' AND name='model_configs'
|
|
178
205
|
`);
|
|
179
206
|
if (modelConfigsResult.length > 0) {
|
|
180
|
-
// Legacy database exists,
|
|
181
|
-
|
|
207
|
+
// Legacy database exists, but we need to check if it has migration 1 tables
|
|
208
|
+
const providerUsageStatsResult = db.exec(`
|
|
209
|
+
SELECT name FROM sqlite_master
|
|
210
|
+
WHERE type='table' AND name='provider_usage_stats'
|
|
211
|
+
`);
|
|
212
|
+
if (providerUsageStatsResult.length > 0) {
|
|
213
|
+
// Has migration 1 tables, assume version 1
|
|
214
|
+
return 1;
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
// Legacy database without migration 1 tables, needs full migration
|
|
218
|
+
return 0;
|
|
219
|
+
}
|
|
182
220
|
}
|
|
183
221
|
// Fresh database
|
|
184
222
|
return 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"databaseMigrations.js","sourceRoot":"","sources":["../../../src/config/databaseMigrations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IACnB,UAAU,GAAgB,EAAE,CAAC;IAErC;QACE,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,kBAAkB;QACxB,uCAAuC;QACvC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,gBAAgB;YACtB,EAAE,EAAE,CAAC,EAAY,EAAE,EAAE;gBACnB,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;SAeP,CAAC,CAAC;gBAEH,EAAE,CAAC,IAAI,CAAC;;;;;;SAMP,CAAC,CAAC;gBAEH,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;SAUP,CAAC,CAAC;gBAEH,EAAE,CAAC,IAAI,CAAC;;;;;;;;;SASP,CAAC,CAAC;gBAEH,EAAE,CAAC,IAAI,CAAC;;;;;;;;SAQP,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"databaseMigrations.js","sourceRoot":"","sources":["../../../src/config/databaseMigrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { Database } from 'sql.js';
|
|
7
|
+
/**
|
|
8
|
+
* Schema validation result
|
|
9
|
+
*/
|
|
10
|
+
export interface SchemaValidationResult {
|
|
11
|
+
isValid: boolean;
|
|
12
|
+
errors: SchemaValidationError[];
|
|
13
|
+
warnings: SchemaValidationWarning[];
|
|
14
|
+
summary: {
|
|
15
|
+
totalTables: number;
|
|
16
|
+
totalIndexes: number;
|
|
17
|
+
missingTables: number;
|
|
18
|
+
missingIndexes: number;
|
|
19
|
+
extraTables: number;
|
|
20
|
+
extraIndexes: number;
|
|
21
|
+
schemaVersion: number;
|
|
22
|
+
expectedVersion: number;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Schema validation error
|
|
27
|
+
*/
|
|
28
|
+
export interface SchemaValidationError {
|
|
29
|
+
type: 'missing_table' | 'missing_column' | 'missing_index' | 'wrong_type' | 'constraint_violation' | 'version_mismatch';
|
|
30
|
+
table?: string;
|
|
31
|
+
column?: string;
|
|
32
|
+
index?: string;
|
|
33
|
+
expected: string;
|
|
34
|
+
actual: string;
|
|
35
|
+
severity: 'error' | 'warning';
|
|
36
|
+
message: string;
|
|
37
|
+
recommendation?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Schema validation warning
|
|
41
|
+
*/
|
|
42
|
+
export interface SchemaValidationWarning {
|
|
43
|
+
type: 'extra_table' | 'extra_column' | 'extra_index' | 'deprecated_feature' | 'performance_issue';
|
|
44
|
+
table?: string;
|
|
45
|
+
column?: string;
|
|
46
|
+
index?: string;
|
|
47
|
+
message: string;
|
|
48
|
+
recommendation?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Database Schema Validator
|
|
52
|
+
* Validates database schema against expected structure
|
|
53
|
+
*/
|
|
54
|
+
export declare class DatabaseSchemaValidator {
|
|
55
|
+
private expectedSchemas;
|
|
56
|
+
private expectedVersion;
|
|
57
|
+
constructor();
|
|
58
|
+
/**
|
|
59
|
+
* Initialize expected database schemas
|
|
60
|
+
*/
|
|
61
|
+
private initializeExpectedSchemas;
|
|
62
|
+
/**
|
|
63
|
+
* Validate complete database schema
|
|
64
|
+
*/
|
|
65
|
+
validateSchema(db: Database): Promise<SchemaValidationResult>;
|
|
66
|
+
/**
|
|
67
|
+
* Validate a specific table
|
|
68
|
+
*/
|
|
69
|
+
private validateTable;
|
|
70
|
+
/**
|
|
71
|
+
* Get current schema version
|
|
72
|
+
*/
|
|
73
|
+
private getCurrentSchemaVersion;
|
|
74
|
+
/**
|
|
75
|
+
* Get actual tables in database
|
|
76
|
+
*/
|
|
77
|
+
private getActualTables;
|
|
78
|
+
/**
|
|
79
|
+
* Get actual indexes in database
|
|
80
|
+
*/
|
|
81
|
+
private getActualIndexes;
|
|
82
|
+
/**
|
|
83
|
+
* Get table column information
|
|
84
|
+
*/
|
|
85
|
+
private getTableInfo;
|
|
86
|
+
/**
|
|
87
|
+
* Check if column types are compatible
|
|
88
|
+
*/
|
|
89
|
+
private isTypeCompatible;
|
|
90
|
+
/**
|
|
91
|
+
* Validate specific table by name
|
|
92
|
+
*/
|
|
93
|
+
validateTableSchema(db: Database, tableName: string): Promise<{
|
|
94
|
+
isValid: boolean;
|
|
95
|
+
errors: SchemaValidationError[];
|
|
96
|
+
warnings: SchemaValidationWarning[];
|
|
97
|
+
}>;
|
|
98
|
+
/**
|
|
99
|
+
* Get schema validation report as formatted text
|
|
100
|
+
*/
|
|
101
|
+
formatValidationReport(result: SchemaValidationResult): string;
|
|
102
|
+
/**
|
|
103
|
+
* Check if database needs migration
|
|
104
|
+
*/
|
|
105
|
+
needsMigration(db: Database): Promise<boolean>;
|
|
106
|
+
/**
|
|
107
|
+
* Get missing tables
|
|
108
|
+
*/
|
|
109
|
+
getMissingTables(db: Database): Promise<string[]>;
|
|
110
|
+
/**
|
|
111
|
+
* Get missing indexes
|
|
112
|
+
*/
|
|
113
|
+
getMissingIndexes(db: Database): Promise<string[]>;
|
|
114
|
+
}
|