cellz 0.2.1

SQLite-per-session, event-sourced state server for AI agents
Documentation
//! HTTP router assembly for the cellz daemon and embeddable library.

use std::sync::Arc;

use axum::routing::{get, post};
use axum::{Json, Router};
use serde_json::{Value, json};
use tower_http::cors::CorsLayer;
use tower_http::trace::TraceLayer;

use crate::api::handlers::{
    AppState, append_event, append_events_batch, backup_cell, create_cell, create_checkpoint,
    evict_cell, export_cell, get_cell, get_events, get_messages, list_cells, list_kv,
    restore_checkpoint, set_kv,
};
use crate::api::ws::{sse_events_stream, ws_cell_handler};
use crate::cell::CellManager;

/// Build the Axum router that exposes the cellz HTTP, SSE, and WebSocket API.
pub fn create_router(manager: Arc<CellManager>) -> Router {
    let state = AppState { manager };

    Router::new()
        .route("/health", get(health_check))
        .route("/api/v1/cells", get(list_cells).post(create_cell))
        .route("/api/v1/cells/{id}", get(get_cell))
        .route(
            "/api/v1/cells/{id}/events",
            get(get_events).post(append_event),
        )
        .route("/api/v1/cells/{id}/events/batch", post(append_events_batch))
        .route("/api/v1/cells/{id}/export", get(export_cell))
        .route("/api/v1/cells/{id}/messages", get(get_messages))
        .route("/api/v1/cells/{id}/kv", get(list_kv).post(set_kv))
        .route("/api/v1/cells/{id}/checkpoints", post(create_checkpoint))
        .route("/api/v1/cells/{id}/restore", post(restore_checkpoint))
        .route("/api/v1/cells/{id}/backup", post(backup_cell))
        .route("/api/v1/cells/{id}/evict", post(evict_cell))
        .route("/api/v1/cells/{id}/stream", get(sse_events_stream))
        .route("/api/v1/cells/{id}/ws", get(ws_cell_handler))
        .layer(TraceLayer::new_for_http())
        .layer(CorsLayer::permissive())
        .with_state(state)
}

async fn health_check() -> Json<Value> {
    Json(json!({
        "status": "ok",
        "service": "cellz",
        "version": env!("CARGO_PKG_VERSION"),
    }))
}