systemprompt-api 0.2.0

HTTP API server and gateway for systemprompt.io OS
Documentation
use axum::extract::State;
use axum::http::StatusCode;
use axum::response::{IntoResponse, Response};
use axum::{Extension, Json};
use serde_json::json;
use systemprompt_events::EventRouter;
use systemprompt_identifiers::UserId;
use systemprompt_runtime::AppContext;

use super::types::{A2ABroadcastRequest, AgUiBroadcastRequest};

pub async fn broadcast_a2a_event(
    Extension(req_ctx): Extension<systemprompt_models::RequestContext>,
    State(_app_context): State<AppContext>,
    Json(request): Json<A2ABroadcastRequest>,
) -> Response {
    let authenticated_user_id = &req_ctx.auth.user_id;
    let request_user_id = UserId::new(&request.user_id);
    let event_type = request.event.event_type();

    tracing::debug!(event_type = ?event_type, user_id = %request_user_id, auth_user_id = %authenticated_user_id, "Received event");

    if authenticated_user_id != &request_user_id {
        tracing::warn!(auth_user_id = %authenticated_user_id, request_user_id = %request_user_id, "User ID mismatch");
        return (
            StatusCode::FORBIDDEN,
            Json(json!({
                "error": "User ID mismatch",
                "message": "Authenticated user does not match the request user_id"
            })),
        )
            .into_response();
    }

    let (a2a_count, context_count) = EventRouter::route_a2a(&request_user_id, request.event).await;
    let count = a2a_count + context_count;

    tracing::debug!(event_type = ?event_type, count = %count, user_id = %request.user_id, "Event broadcasted to connections");

    (
        StatusCode::OK,
        Json(json!({
            "status": "broadcasted",
            "connection_count": count
        })),
    )
        .into_response()
}

pub async fn broadcast_agui_event(
    Extension(req_ctx): Extension<systemprompt_models::RequestContext>,
    State(_app_context): State<AppContext>,
    Json(request): Json<AgUiBroadcastRequest>,
) -> Response {
    let authenticated_user_id = &req_ctx.auth.user_id;
    let request_user_id = UserId::new(&request.user_id);
    let event_type = request.event.event_type();

    tracing::debug!(event_type = ?event_type, user_id = %request_user_id, auth_user_id = %authenticated_user_id, "Received event");

    if authenticated_user_id != &request_user_id {
        tracing::warn!(auth_user_id = %authenticated_user_id, request_user_id = %request_user_id, "User ID mismatch");
        return (
            StatusCode::FORBIDDEN,
            Json(json!({
                "error": "User ID mismatch",
                "message": "Authenticated user does not match the request user_id"
            })),
        )
            .into_response();
    }

    let (agui_count, context_count) =
        EventRouter::route_agui(&request_user_id, request.event).await;
    let count = agui_count + context_count;

    tracing::debug!(event_type = ?event_type, count = %count, user_id = %request.user_id, "Event broadcasted to connections");

    (
        StatusCode::OK,
        Json(json!({
            "status": "broadcasted",
            "connection_count": count
        })),
    )
        .into_response()
}