"""Brain of Reese — application entrypoint. Boots logging + conditional debugpy, then creates the FastAPI app: API routes first (so they win over the catch-all), and the static frontend mounted last. No CDN: everything the browser needs is served by this process from local files (see PLAN §UI/UX — No External Dependencies). """ from __future__ import annotations import logging from pathlib import Path from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from app.api.chat import router as chat_router from app.api.docs import router as docs_router from app.api.health import router as health_router from app.api.steering import router as steering_router from app.api.suggestions import router as suggestions_router from app.config import get_settings from app.core.debugging import configure_debugging from app.core.logging import configure_logging configure_logging() configure_debugging() settings = get_settings() logger = logging.getLogger("app") def create_app() -> FastAPI: app = FastAPI(title=settings.app_name, version=settings.app_version) # API routes first so they take precedence over the catch-all static mount. app.include_router(health_router, prefix="/api") app.include_router(suggestions_router, prefix="/api") app.include_router(docs_router, prefix="/api") app.include_router(chat_router, prefix="/api") app.include_router(steering_router, prefix="/api") static_dir = Path(settings.static_dir).resolve() if static_dir.is_dir(): app.mount("/", StaticFiles(directory=static_dir, html=True), name="static") else: logger.warning("static dir %s not found — serving API only", static_dir) return app app = create_app()