spb/vquant Public MIT
VibeQuant — AI-powered institutional-grade financial intelligence platform.
TypeScript 84.3%
Python 11.7%
JavaScript 1.6%
CSS 1.5%
HTML 0.7%
1/*2 * =============================================================================3 * VibeQuant (vquant) — AI-Powered Financial Intelligence Platform4 * -----------------------------------------------------------------------------5 * File: server/migrate-analytics.ts6 *7 * Author: Simon-Pierre Boucher8 * Contact: contact@spboucher.ai9 * Website: https://www.spboucher.ai10 * Demo: https://www.vquant.ai11 * License: MIT (see LICENSE)12 *13 * Copyright © 2026 Simon-Pierre Boucher. All rights reserved.14 * =============================================================================15 */1617import Database from 'better-sqlite3';18import path from 'path';1920const dbPath = path.join(process.cwd(), 'local.db');21const db = new Database(dbPath);2223console.log('🔄 Adding analytics tables to database...');2425try {26 // Create active_users table27 db.exec(`28 CREATE TABLE IF NOT EXISTS active_users (29 id TEXT PRIMARY KEY,30 session_id TEXT NOT NULL UNIQUE,31 user_id TEXT,32 status TEXT NOT NULL DEFAULT 'idle',33 current_query TEXT,34 last_heartbeat INTEGER NOT NULL,35 user_agent TEXT,36 ip_address TEXT,37 created_at INTEGER NOT NULL,38 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE39 );40 `);41 console.log('✅ Created active_users table');4243 // Create analytics_metrics table44 db.exec(`45 CREATE TABLE IF NOT EXISTS analytics_metrics (46 id TEXT PRIMARY KEY,47 timestamp INTEGER NOT NULL,48 total_requests INTEGER DEFAULT 0,49 successful_requests INTEGER DEFAULT 0,50 failed_requests INTEGER DEFAULT 0,51 active_users INTEGER DEFAULT 0,52 unique_visitors INTEGER DEFAULT 0,53 average_response_time REAL DEFAULT 0,54 peak_response_time REAL DEFAULT 0,55 tokens_generated INTEGER DEFAULT 0,56 estimated_cost REAL DEFAULT 0,57 tool_calls_count INTEGER DEFAULT 0,58 python_executions INTEGER DEFAULT 0,59 search_queries INTEGER DEFAULT 0,60 error_count INTEGER DEFAULT 0,61 error_rate REAL DEFAULT 0,62 period_type TEXT NOT NULL DEFAULT 'minute'63 );64 `);65 console.log('✅ Created analytics_metrics table');6667 // Create request_logs table68 db.exec(`69 CREATE TABLE IF NOT EXISTS request_logs (70 id TEXT PRIMARY KEY,71 session_id TEXT NOT NULL,72 user_id TEXT,73 query TEXT NOT NULL,74 response_time REAL,75 input_tokens INTEGER DEFAULT 0,76 output_tokens INTEGER DEFAULT 0,77 total_cost REAL DEFAULT 0,78 tools_called TEXT,79 status TEXT NOT NULL,80 error_message TEXT,81 timestamp INTEGER NOT NULL,82 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE83 );84 `);85 console.log('✅ Created request_logs table');8687 // Create indexes for better performance88 db.exec(`89 CREATE INDEX IF NOT EXISTS idx_active_users_session ON active_users(session_id);90 CREATE INDEX IF NOT EXISTS idx_active_users_heartbeat ON active_users(last_heartbeat);91 CREATE INDEX IF NOT EXISTS idx_analytics_timestamp ON analytics_metrics(timestamp);92 CREATE INDEX IF NOT EXISTS idx_analytics_period ON analytics_metrics(period_type);93 CREATE INDEX IF NOT EXISTS idx_request_logs_timestamp ON request_logs(timestamp);94 CREATE INDEX IF NOT EXISTS idx_request_logs_status ON request_logs(status);95 `);96 console.log('✅ Created indexes');9798 console.log('\n🎉 Analytics tables migration completed successfully!');99} catch (error) {100 console.error('❌ Migration failed:', error);101 process.exit(1);102} finally {103 db.close();104}105