pub mod auth;
pub mod hot_config;
pub mod output_filter;
pub mod prometheus;
pub mod prompt_guard;
#[cfg(feature = "majra")]
pub mod rate_limit;
pub mod routes;
pub mod sse;
pub mod ssrf;
pub mod state;
pub use auth::AuthConfig;
pub use state::{AppState, SharedState};
use axum::Router;
use axum::extract::DefaultBodyLimit;
use axum::middleware;
use axum::routing::{get, post};
use auth::auth_middleware;
const MAX_BODY_BYTES: usize = 10 * 1024 * 1024;
const MAX_CONCURRENT_REQUESTS: usize = 100;
pub fn router(state: SharedState) -> Router {
let auth_config = state.auth.clone();
let api_v1 = Router::new()
.route("/crews", post(routes::crews::create_crew))
.route("/crews/{id}", get(routes::crews::get_crew))
.route("/crews/{id}/cancel", post(routes::crews::cancel_crew))
.route("/crews/{id}/stream", get(routes::sse::crew_stream))
.route("/a2a/receive", post(routes::a2a::receive))
.route("/a2a/status", post(routes::a2a::status))
.route(
"/agents/definitions",
get(routes::agents::list_definitions).post(routes::agents::create_definition),
)
.route("/tools", get(routes::tools::list_tools))
.route(
"/tools/{name}",
axum::routing::delete(routes::tools::remove_tool),
)
.route(
"/approvals",
get(routes::approval::list_pending).post(routes::approval::submit_approval),
)
.route("/presets", get(routes::definitions::list_presets))
.route("/dashboard/crews", get(routes::dashboard::crew_history))
.route(
"/dashboard/agents",
get(routes::dashboard::agent_performance),
)
.with_state(state.clone());
let protected = Router::new()
.route("/mcp", post(routes::mcp::mcp_handler))
.nest("/api/v1", api_v1)
.layer(middleware::from_fn(move |req, next| {
let cfg = auth_config.clone();
async move { auth_middleware(cfg, req, next).await }
}))
.with_state(state.clone());
Router::new()
.route("/health", get(routes::health::health))
.route("/ready", get(routes::health::ready))
.route("/metrics", get(routes::health::metrics))
.merge(protected)
.layer(DefaultBodyLimit::max(MAX_BODY_BYTES))
.layer(tower::limit::ConcurrencyLimitLayer::new(
MAX_CONCURRENT_REQUESTS,
))
.with_state(state)
}