1use super::{api, AppState, Config};
4use axum::{routing::get, Router};
5use cai_core::Result;
6use cai_storage::Storage;
7use std::net::SocketAddr;
8use tokio::net::TcpListener;
9use tracing::info;
10
11pub async fn run<S>(storage: std::sync::Arc<S>, config: Config) -> Result<()>
13where
14 S: Storage + Send + Sync + 'static,
15{
16 let state = AppState {
17 storage: storage as std::sync::Arc<dyn Storage + Send + Sync>,
18 };
19
20 let app = Router::new()
21 .route("/", get(super::handlers::dashboard_handler))
22 .nest("/api", api::router())
23 .with_state(state);
24
25 let addr = SocketAddr::from(([127, 0, 0, 1], config.port));
26 let listener = TcpListener::bind(addr).await?;
27
28 info!("CAI Web Dashboard listening on http://{}", addr);
29 info!("Open your browser to explore your AI coding history");
30
31 axum::serve(listener, app).await?;
32
33 Ok(())
34}