il2cpp-dump-analyzer-mcp
Version:
Agentic RAG system for analyzing IL2CPP dump.cs files from Unity games
195 lines โข 10.2 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const yargs_1 = __importDefault(require("yargs"));
const helpers_1 = require("yargs/helpers");
const dotenv_1 = __importDefault(require("dotenv"));
const connection_manager_1 = require("./connection-manager");
const enhanced_vector_store_1 = require("./enhanced-vector-store");
const xenova_embeddings_1 = require("../embeddings/xenova-embeddings");
// Load environment variables
dotenv_1.default.config();
/**
* Database CLI tool for managing the IL2CPP dump analyzer database
*/
async function main() {
await (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
.scriptName('db-cli')
.usage('$0 <command> [options]')
.command('health', 'Check database health and connection status', {}, async () => {
try {
console.log('๐ Checking database health...\n');
const connectionManager = connection_manager_1.SupabaseConnectionManager.getInstance(process.env.SUPABASE_URL, process.env.SUPABASE_KEY);
const embeddings = new xenova_embeddings_1.XenovaEmbeddings();
const vectorStore = new enhanced_vector_store_1.EnhancedSupabaseVectorStore(embeddings);
const health = await vectorStore.getHealthStatus();
console.log('๐ Health Status:');
console.log(` Overall Health: ${health.isHealthy ? 'โ
Healthy' : 'โ Unhealthy'}`);
console.log(` Last Health Check: ${health.connectionStats.lastHealthCheck || 'Never'}`);
console.log('\n๐ Connection Statistics:');
console.log(` Total Connections: ${health.connectionStats.stats.totalConnections}`);
console.log(` Active Connections: ${health.connectionStats.stats.activeConnections}`);
console.log(` Total Acquired: ${health.connectionStats.stats.totalAcquired}`);
console.log(` Total Released: ${health.connectionStats.stats.totalReleased}`);
console.log('\nโก Performance Statistics:');
console.log(` Total Operations: ${health.performanceStats.totalOperations}`);
console.log(` Success Rate: ${((1 - health.performanceStats.errorRate) * 100).toFixed(2)}%`);
console.log(` Average Duration: ${health.performanceStats.averageDuration.toFixed(2)}ms`);
console.log(` P95 Duration: ${health.performanceStats.p95Duration.toFixed(2)}ms`);
console.log('\n๐พ Cache Statistics:');
console.log(` Cache Size: ${health.cacheStats.size}/${health.cacheStats.maxSize}`);
console.log(` Hit Rate: ${(health.cacheStats.hitRate * 100).toFixed(2)}%`);
console.log('\n๐ Circuit Breaker:');
console.log(` State: ${health.circuitBreakerStats.state}`);
console.log(` Failures: ${health.circuitBreakerStats.failures}`);
await vectorStore.cleanup();
}
catch (error) {
console.error('โ Health check failed:', error);
process.exit(1);
}
})
.command('stats', 'Show database statistics and table information', {}, async () => {
try {
console.log('๐ Fetching database statistics...\n');
const connectionManager = connection_manager_1.SupabaseConnectionManager.getInstance(process.env.SUPABASE_URL, process.env.SUPABASE_KEY);
const client = connectionManager.getClient();
// Get database statistics
const { data: stats, error } = await client.rpc('get_database_stats');
if (error) {
throw error;
}
console.log('๐ Table Statistics:');
console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ');
console.log('โ Table Name โ Row Count โ Table Size โ Index Size โ Total Size โ');
console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโผโโโโโโโโโโโโโโผโโโโโโโโโโโโโโผโโโโโโโโโโโโโโค');
for (const row of stats || []) {
console.log(`โ ${row.table_name.padEnd(23)} โ ${String(row.row_count).padEnd(11)} โ ${row.table_size.padEnd(11)} โ ${row.index_size.padEnd(11)} โ ${row.total_size.padEnd(11)} โ`);
}
console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโดโโโโโโโโโโโโโโดโโโโโโโโโโโโโโดโโโโโโโโโโโโโโ');
connectionManager.releaseClient();
}
catch (error) {
console.error('โ Failed to fetch statistics:', error);
process.exit(1);
}
})
.command('cleanup', 'Clean up old performance logs and optimize database', {
days: {
alias: 'd',
type: 'number',
default: 30,
description: 'Number of days of logs to keep'
}
}, async (args) => {
try {
console.log(`๐งน Cleaning up performance logs older than ${args.days} days...\n`);
const connectionManager = connection_manager_1.SupabaseConnectionManager.getInstance(process.env.SUPABASE_URL, process.env.SUPABASE_KEY);
const client = connectionManager.getClient();
// Clean up old performance logs
const { data: deletedCount, error } = await client.rpc('cleanup_old_performance_logs', {
days_to_keep: args.days
});
if (error) {
throw error;
}
console.log(`โ
Cleaned up ${deletedCount} old performance log entries`);
// Clear vector store cache
const embeddings = new xenova_embeddings_1.XenovaEmbeddings();
const vectorStore = new enhanced_vector_store_1.EnhancedSupabaseVectorStore(embeddings);
vectorStore.clearCache();
console.log('โ
Cleared vector store cache');
connectionManager.releaseClient();
await vectorStore.cleanup();
}
catch (error) {
console.error('โ Cleanup failed:', error);
process.exit(1);
}
})
.command('test-connection', 'Test database connection and basic operations', {}, async () => {
try {
console.log('๐ Testing database connection...\n');
const connectionManager = connection_manager_1.SupabaseConnectionManager.getInstance(process.env.SUPABASE_URL, process.env.SUPABASE_KEY);
const client = connectionManager.getClient();
// Test basic query
console.log('1. Testing basic table access...');
const { data: testData, error: testError } = await client
.from('il2cpp_documents')
.select('id')
.limit(1);
if (testError) {
throw new Error(`Table access failed: ${testError.message}`);
}
console.log(' โ
Table access successful');
// Test vector search function
console.log('2. Testing vector search function...');
const testEmbedding = Array(384).fill(0.1);
const { data: searchData, error: searchError } = await client.rpc('match_documents', {
query_embedding: testEmbedding,
match_threshold: 0.0,
match_count: 1
});
if (searchError) {
throw new Error(`Vector search failed: ${searchError.message}`);
}
console.log(' โ
Vector search function working');
// Test performance logging
console.log('3. Testing performance logging...');
const { error: logError } = await client.rpc('log_query_performance', {
operation_name: 'test_connection',
duration_ms: 100,
success: true
});
if (logError) {
throw new Error(`Performance logging failed: ${logError.message}`);
}
console.log(' โ
Performance logging working');
console.log('\n๐ All database tests passed successfully!');
connectionManager.releaseClient();
}
catch (error) {
console.error('โ Connection test failed:', error);
process.exit(1);
}
})
.command('export-metrics', 'Export performance metrics to a file', {
output: {
alias: 'o',
type: 'string',
default: 'db-metrics.json',
description: 'Output file path'
}
}, async (args) => {
try {
console.log('๐ค Exporting performance metrics...\n');
const embeddings = new xenova_embeddings_1.XenovaEmbeddings();
const vectorStore = new enhanced_vector_store_1.EnhancedSupabaseVectorStore(embeddings);
const metrics = vectorStore.exportMetrics();
const fs = await import('fs');
fs.writeFileSync(args.output, metrics);
console.log(`โ
Metrics exported to ${args.output}`);
await vectorStore.cleanup();
}
catch (error) {
console.error('โ Export failed:', error);
process.exit(1);
}
})
.demandCommand(1, 'You need to specify a command')
.help()
.alias('help', 'h')
.version('1.0.0')
.parse();
}
// Run the CLI
if (require.main === module) {
main().catch(error => {
console.error('โ CLI error:', error);
process.exit(1);
});
}
//# sourceMappingURL=db-cli.js.map