"""Jinkendo Kairo — FastAPI application entry point.""" from __future__ import annotations import os import sys from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from db import check_db from version import APP_NAME, APP_VERSION, DB_SCHEMA_VERSION import steering # noqa: F401 — bootstrap hooks & methods if os.getenv("KAIRO_DB_READY") != "1": if os.getenv("SKIP_DB_MIGRATE", "").strip().lower() not in ("1", "true", "yes"): import run_migrations exit_code = run_migrations.main() if exit_code != 0: print(f"[FAIL] Migrationen fehlgeschlagen (Exit {exit_code})") sys.exit(exit_code) else: print("[SKIP_DB_MIGRATE] Migrationen übersprungen") if os.getenv("SKIP_SEEDS", "").strip().lower() not in ("1", "true", "yes"): import run_seeds exit_code = run_seeds.main() if exit_code != 0: print(f"[FAIL] Seeds fehlgeschlagen (Exit {exit_code})") sys.exit(exit_code) else: print("[SKIP_SEEDS] Data-Seeds übersprungen") allowed_origins = [ origin.strip() for origin in os.getenv("ALLOWED_ORIGINS", "http://localhost:3097").split(",") if origin.strip() ] app = FastAPI( title="Jinkendo Kairo", version=APP_VERSION, docs_url="/api/docs" if os.getenv("ENVIRONMENT", "development") != "production" else None, redoc_url=None, ) app.add_middleware( CORSMiddleware, allow_origins=allowed_origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) from routers import ( # noqa: E402 actions, actors, auth, backlog, blockers, config, decisions, evidence, features, initiatives, me, milestones, prompts, recurring, reviews, steering, workspace, ) app.include_router(auth.router) app.include_router(me.router) app.include_router(features.router) app.include_router(prompts.router) app.include_router(config.router) app.include_router(initiatives.router) app.include_router(actions.router) app.include_router(blockers.router) app.include_router(backlog.router) app.include_router(milestones.router) app.include_router(evidence.router) app.include_router(decisions.router) app.include_router(reviews.router) app.include_router(recurring.router) app.include_router(steering.router) app.include_router(actors.router) app.include_router(workspace.router) @app.get("/api/health") def api_health(): db_status = "ok" try: if not check_db(): db_status = "error" except Exception: db_status = "error" status = "ok" if db_status == "ok" else "degraded" return { "status": status, "app": APP_NAME, "db": db_status, "version": APP_VERSION, "schema": DB_SCHEMA_VERSION, } @app.get("/api/version") def api_version(): return { "app": APP_NAME, "version": APP_VERSION, "schema": DB_SCHEMA_VERSION, }