""" Initialize Parlay SQLite database tables. Safe to run multiple times (CREATE TABLE IF NOT EXISTS). Usage: python -m scripts.init_db # or imported by main.py lifespan """ import asyncio import logging from pathlib import Path import aiosqlite logger = logging.getLogger(__name__) DB_PATH = "parlay.db" SCHEMA = """ CREATE TABLE IF NOT EXISTS sessions ( id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL UNIQUE, player_name TEXT NOT NULL, scenario_id TEXT NOT NULL, persona TEXT NOT NULL, started_at DATETIME DEFAULT CURRENT_TIMESTAMP, completed_at DATETIME, status TEXT DEFAULT 'active' ); CREATE INDEX IF NOT EXISTS idx_sessions_session_id ON sessions(session_id); CREATE TABLE IF NOT EXISTS leaderboard ( id INTEGER PRIMARY KEY AUTOINCREMENT, player_name TEXT NOT NULL, scenario_id TEXT NOT NULL, persona TEXT NOT NULL, total_reward REAL NOT NULL, deal_efficiency REAL NOT NULL DEFAULT 0.0, acts_completed INTEGER NOT NULL DEFAULT 1, deal_closed INTEGER NOT NULL DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX IF NOT EXISTS idx_leaderboard_scenario ON leaderboard(scenario_id, total_reward DESC); CREATE INDEX IF NOT EXISTS idx_leaderboard_global ON leaderboard(total_reward DESC); CREATE TABLE IF NOT EXISTS episodes ( id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL UNIQUE, player_name TEXT NOT NULL, scenario_id TEXT NOT NULL, persona TEXT NOT NULL, total_reward REAL, deal_efficiency REAL, acts_completed INTEGER, deal_closed INTEGER DEFAULT 0, turns INTEGER DEFAULT 0, drift_adapted INTEGER DEFAULT 0, bluffs_caught INTEGER DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, completed_at DATETIME ); CREATE TABLE IF NOT EXISTS telemetry ( id INTEGER PRIMARY KEY AUTOINCREMENT, event_type TEXT NOT NULL, session_id TEXT, payload TEXT, ts DATETIME DEFAULT CURRENT_TIMESTAMP ); """ async def init_db(db_path: str = DB_PATH) -> None: """ Create all required tables and indexes. Safe to run multiple times. Args: db_path: Path to the SQLite database file. """ async with aiosqlite.connect(db_path) as db: await db.executescript(SCHEMA) await db.commit() logger.info(f"Database initialized at {db_path}") if __name__ == "__main__": logging.basicConfig(level=logging.INFO) asyncio.run(init_db())