from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from src.api.auth import router as auth_router from src.api.git_repositories import router as git_repositories_router from src.api.projects import router as projects_router from src.api.ssh_keys import router as ssh_keys_router from src.api.tool_types import router as tool_types_router from src.api.user_config import router as user_config_router from src.api.users import router as users_router from src.database import SessionLocal from src.models.tool_type import ToolType from sqlalchemy import select app = FastAPI(title="Headquarter API") async def seed_builtin_tool_types(): async with SessionLocal() as session: builtin_types = [ { "name": "code-server", "display_name": "VS Code Server", "description": "VS Code running in the browser via code-server", "compose_template": """version: "3.8" services: code-server: image: lscr.io/linuxserver/code-server:latest container_name: {{TOOL_NAME}} environment: - PUID=1000 - PGID=1000 - TZ=Europe/London volumes: - {{REPO_PATH}}:/config/workspace ports: - "8443:8443" restart: unless-stopped""", "required_variables": ["REPO_PATH", "TOOL_NAME"], }, { "name": "jupyter-notebook", "display_name": "Jupyter Notebook", "description": "Jupyter Lab for interactive development", "compose_template": """version: "3.8" services: jupyter: image: jupyter/scipy-notebook:latest container_name: {{TOOL_NAME}} environment: - JUPYTER_ENABLE_LAB=yes volumes: - {{REPO_PATH}}:/home/jovyan/work ports: - "8888:8888" restart: unless-stopped""", "required_variables": ["REPO_PATH", "TOOL_NAME"], }, ] for tool_data in builtin_types: existing = await session.scalar(select(ToolType).where(ToolType.name == tool_data["name"])) if not existing: tool_type = ToolType( name=tool_data["name"], display_name=tool_data["display_name"], description=tool_data["description"], compose_template=tool_data["compose_template"], required_variables=tool_data["required_variables"], is_builtin=True, ) session.add(tool_type) await session.commit() @app.on_event("startup") async def on_startup(): await seed_builtin_tool_types() app.include_router(auth_router) app.include_router(projects_router) app.include_router(users_router) app.include_router(ssh_keys_router) app.include_router(git_repositories_router) app.include_router(user_config_router) app.include_router(tool_types_router) app.mount("/uploads", StaticFiles(directory="uploads"), name="uploads")