cloakpipe_proxy/
server.rs1use crate::{handlers, tree_handlers, state::AppState};
4use axum::{routing::{get, post}, Router};
5use std::sync::Arc;
6use tower_http::cors::CorsLayer;
7use tower_http::trace::TraceLayer;
8
9pub fn build_router(state: Arc<AppState>) -> Router {
11 Router::new()
12 .route("/health", get(handlers::health))
13 .route("/v1/chat/completions", post(handlers::proxy_chat_completions))
14 .route("/v1/embeddings", post(handlers::proxy_embeddings))
15 .route("/tree/index", post(tree_handlers::tree_index_text))
17 .route("/tree/index/file", post(tree_handlers::tree_index_file))
18 .route("/tree/list", get(tree_handlers::tree_list))
19 .route("/tree/query", post(tree_handlers::tree_query))
20 .route("/tree/{id}", get(tree_handlers::tree_get).delete(tree_handlers::tree_delete))
21 .route("/tree/{id}/search", post(tree_handlers::tree_search))
22 .route("/sessions", get(handlers::sessions_list).delete(handlers::sessions_flush_all))
24 .route("/sessions/{id}", get(handlers::session_inspect).delete(handlers::session_flush))
25 .layer(CorsLayer::permissive())
26 .layer(TraceLayer::new_for_http())
27 .with_state(state)
28}
29
30pub async fn start(state: AppState) -> anyhow::Result<()> {
32 let listen_addr = state.config.proxy.listen.clone();
33 let state = Arc::new(state);
34
35 let app = build_router(state);
36
37 tracing::info!("CloakPipe proxy listening on {}", listen_addr);
38
39 let listener = tokio::net::TcpListener::bind(&listen_addr).await?;
40 axum::serve(listener, app).await?;
41
42 Ok(())
43}