systemprompt-api 0.14.6

Axum-based HTTP server and API gateway for systemprompt.io AI governance infrastructure. Exposes governed agents, MCP, A2A, and admin endpoints with rate limiting and RBAC.
Documentation
use systemprompt_identifiers::UserId;
use systemprompt_loader::ConfigLoader;
use systemprompt_models::bridge::manifest::UserInfo;
use systemprompt_models::services::ServicesConfig;
use systemprompt_oauth::repository::BridgeHostPrefsRepository;
use systemprompt_runtime::AppContext;
use systemprompt_users::UserRepository;

pub async fn load_user(ctx: &AppContext, user_id: &UserId) -> anyhow::Result<Option<UserInfo>> {
    let repo = UserRepository::new(ctx.db_pool())?;
    let Some(user) = repo.find_by_id(user_id).await? else {
        return Ok(None);
    };
    Ok(Some(UserInfo {
        id: user.id,
        name: user.name,
        email: user.email,
        display_name: user.display_name,
        roles: user.roles,
    }))
}

pub async fn load_revocations(ctx: &AppContext, user_id: &UserId) -> anyhow::Result<Vec<String>> {
    let repo = UserRepository::new(ctx.db_pool())?;
    let ids = repo.list_revoked_api_key_ids_for_user(user_id).await?;
    Ok(ids)
}

pub async fn load_enabled_hosts(ctx: &AppContext, user_id: &UserId) -> anyhow::Result<Vec<String>> {
    let repo = BridgeHostPrefsRepository::new(ctx.db_pool())?;
    Ok(repo.list_enabled(user_id).await?)
}

pub async fn upsert_host_pref(
    ctx: &AppContext,
    user_id: &UserId,
    host_id: &str,
    enabled: bool,
) -> anyhow::Result<()> {
    let repo = BridgeHostPrefsRepository::new(ctx.db_pool())?;
    repo.upsert(user_id, host_id, enabled).await?;
    Ok(())
}

pub async fn load_host_model_protocols(
    ctx: &AppContext,
    user_id: &UserId,
) -> anyhow::Result<Vec<(String, Vec<String>)>> {
    let repo = BridgeHostPrefsRepository::new(ctx.db_pool())?;
    Ok(repo.load_model_protocols(user_id).await?)
}

pub async fn set_host_model_protocols(
    ctx: &AppContext,
    user_id: &UserId,
    host_id: &str,
    protocols: Option<&[String]>,
) -> anyhow::Result<()> {
    let repo = BridgeHostPrefsRepository::new(ctx.db_pool())?;
    repo.set_model_protocols(user_id, host_id, protocols)
        .await?;
    Ok(())
}

pub fn load_services_config() -> anyhow::Result<ServicesConfig> {
    ConfigLoader::load().map_err(|e| anyhow::anyhow!("services config load: {e}"))
}