"""Path allowlist for the UI backend (control plane) component.

The backend exposes management/admin endpoints consumed by the UI: keys, users,
teams, orgs, customers, budgets, tags, workflows, model management, spend &
analytics, settings (router/cache/cost-tracking/fallbacks), SSO/onboarding,
audit logs, debug, enterprise admin, and UI bootstrap helpers (logo, favicon,
.well-known config).

Anything LLM data-plane is dropped — those run on the gateway component.
"""

BACKEND_PATH_PREFIXES: tuple[str, ...] = (
    # Identity / access
    "/key/",
    "/v2/key/",
    "/user/",
    "/v2/user/",
    "/team/",
    "/v2/team/",
    "/organization/",
    "/v2/organization/",
    "/customer/",
    "/end_user/",
    "/sso/",
    "/login",
    "/v2/login",
    "/v3/login",
    "/logout",
    "/token",
    "/onboarding/",
    "/audit",
    "/oauth/",
    "/invitation/",
    "/jwt/",
    # Models & routing config
    "/model/",
    "/v1/model/info",
    "/v1/model/deprecations",
    "/v2/model/",
    "/model_group",
    "/model_access_group/",
    "/model_hub/",
    "/v1/access_group",
    "/access_group/",
    "/router/",
    "/router_settings",
    "/adaptive_router/",
    "/auto_router/",
    "/fallback",
    "/fallbacks",
    "/cache_settings",
    "/coordination_redis/",
    "/cost_tracking",
    "/cost/",
    "/credentials",
    "/credential",
    "/provider/budgets",
    # Tools / agents (registry & policy admin)
    "/v1/tool/",
    "/v1/agents",
    # Guardrails admin
    "/v2/guardrails/",
    # MCP server admin + BYOK OAuth flow (UI-initiated) + dynamic per-server endpoints
    "/v1/mcp/",
    "/test/",
    "/{mcp_server_name}/",
    # Budgets / tags / workflows / memory mgmt
    "/budget/",
    "/tag/",
    "/workflow/",
    "/v1/workflows/",
    "/project/",
    "/memory/",
    "/mcp/",
    # Control plane (see the List Endpoints + Tables standard). Every resource
    # eventually moves under this prefix, so allowlist it once rather than
    # per-resource.
    "/management/v1/",
    # Spend / analytics
    "/spend/",
    "/analytics/",
    "/global/",
    "/user_agent",
    "/usage/",
    "/daily/",
    # Deployment-wide gateway request counts. Scoped to the analytics read rather
    # than all of /gateway/, which stays free for data-plane routes.
    "/gateway/daily/",
    # CloudZero cost-export admin (init / settings / export / dry-run / delete)
    "/cloudzero/",
    # Caching admin
    "/cache/",
    "/caching/",
    # Callbacks / hooks
    "/active/callbacks",
    "/callbacks",
    "/team_callback",
    # Rust data-plane gateway → proxy control-plane API (logging today, auth later)
    "/v1/rust_control_plane/",
    # Alerting / email / IP allowlist
    "/alerting/",
    "/email/",
    "/add/allowed_ip",
    "/delete/allowed_ip",
    "/get/",
    # Enterprise admin
    "/enterprise/",
    # Debug / config / profiling
    "/debug/",
    "/config/",
    "/memory-usage-in-mem-cache",
    "/otel-spans",
    "/lazy/",
    "/in_product_nudges",
    # Admin reload / schedule
    "/reload/",
    "/schedule/",
    "/settings",
    "/update/",
    "/upload/",
    # Dev / admin utilities
    "/utils/",
    # UI bootstrap helpers (assets the dashboard fetches)
    "/get_logo_url",
    "/get_image",
    "/get_favicon",
    "/.well-known/",
    "/litellm/.well-known/",
    "/ui_discovery/",
    "/ui-config",
    "/sso_settings",
    "/public/",
    "/robots.txt",
    # Health (k8s probes)
    "/health",
    # Plugin system
    "/api/plugins",
    "/plugin-proxy/",
)

BACKEND_EXACT_PATHS: frozenset[str] = frozenset(
    {
        "/",
        "/routes",
        "/openapi.json",
        "/docs",
        "/docs/oauth2-redirect",
        "/redoc",
        "/fallback/login",
        "/mcp",  # bare spelling of the aggregate MCP endpoint; /mcp/ prefix covers the rest
    }
)

BACKEND_MOUNT_PATHS: frozenset[str] = frozenset(
    {
        "/swagger",  # API documentation static assets belong to the backend
        "/mcp",  # lazily-mounted MCP sub-app serves on the backend component
    }
)
