1use crate::routes::{
2 brain::brain_router,
3 events::events_router,
4 orchestrators::orchestrators_router,
5 sessions::sessions_router,
6 terminal::terminal_router,
7};
8use ninox_core::{embeddings::Embedder, events::Engine, BrainIndex};
9use axum::Router;
10use std::{net::SocketAddr, sync::Arc};
11use tower_http::cors::CorsLayer;
12
13pub async fn start(
14 engine: Arc<Engine>,
15 brain: Arc<BrainIndex>,
16 embedder: Option<Arc<dyn Embedder>>,
17 port: u16,
18) -> anyhow::Result<()> {
19 let addr = SocketAddr::from(([127, 0, 0, 1], port));
20 let app = Router::new()
21 .nest("/api/v1/sessions", sessions_router(engine.clone()))
22 .nest("/api/v1/sessions", terminal_router(engine.clone()))
23 .nest("/api/v1/orchestrators", orchestrators_router(engine.clone()))
24 .nest("/api/v1/events", events_router(engine.clone()))
25 .nest("/api/brain", brain_router(brain, embedder))
26 .layer(CorsLayer::permissive());
27 tracing::info!("ninox listening on {addr}");
28 axum::serve(tokio::net::TcpListener::bind(addr).await?, app).await?;
29 Ok(())
30}