""" Atomizer Dashboard - FastAPI Backend Real-time optimization monitoring and control """ from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import FileResponse from pathlib import Path import sys # Add parent directory to path to import optimization_engine sys.path.append(str(Path(__file__).parent.parent.parent.parent)) from api.routes import optimization, claude, terminal, insights, context, files, nx, claude_code, spec from api.websocket import optimization_stream # Lifespan handler for session manager @asynccontextmanager async def lifespan(app: FastAPI): """Manage application lifespan - start/stop session manager""" # Startup from api.routes.claude import get_session_manager manager = get_session_manager() await manager.start() print("Session manager started") yield # Shutdown await manager.stop() print("Session manager stopped") # Create FastAPI app app = FastAPI( title="Atomizer Dashboard API", description="Real-time optimization monitoring and control", version="2.0.0", lifespan=lifespan, ) # Configure CORS for local development app.add_middleware( CORSMiddleware, allow_origins=["*"], # Allow all origins for local development allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Include routers app.include_router(optimization.router, prefix="/api/optimization", tags=["optimization"]) app.include_router(optimization_stream.router, prefix="/api/ws", tags=["websocket"]) app.include_router(claude.router, prefix="/api/claude", tags=["claude"]) app.include_router(terminal.router, prefix="/api/terminal", tags=["terminal"]) app.include_router(insights.router, prefix="/api/insights", tags=["insights"]) app.include_router(context.router, prefix="/api/context", tags=["context"]) app.include_router(files.router, prefix="/api/files", tags=["files"]) app.include_router(nx.router, prefix="/api/nx", tags=["nx"]) app.include_router(claude_code.router, prefix="/api", tags=["claude-code"]) app.include_router(spec.router, prefix="/api", tags=["spec"]) app.include_router(spec.validate_router, prefix="/api", tags=["spec"]) @app.get("/") async def root(): """Serve the enhanced dashboard HTML""" dashboard_path = Path(__file__).parent.parent.parent / "dashboard-enhanced.html" return FileResponse(dashboard_path) @app.get("/health") async def health_check(): """Health check endpoint with database status""" try: from api.services.conversation_store import ConversationStore store = ConversationStore() # Test database by creating/getting a health check session store.get_session("health_check") db_status = "connected" except Exception as e: db_status = f"error: {str(e)}" return { "status": "healthy" if db_status == "connected" else "degraded", "database": db_status, } if __name__ == "__main__": import uvicorn uvicorn.run( "main:app", host="0.0.0.0", port=8000, reload=True, log_level="info" )