UNPKG

il2cpp-dump-analyzer-mcp

Version:

Agentic RAG system for analyzing IL2CPP dump.cs files from Unity games

195 lines โ€ข 10.2 kB
#!/usr/bin/env node "use strict"; 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