use actix_web::{web, HttpResponse, Responder};
use crate::app_state::AppState;
pub async fn handler(state: web::Data<AppState>, path: web::Path<String>) -> impl Responder {
let session_id = path.into_inner();
let runner_active = {
let runners = state.agent_runners.read().await;
runners
.get(&session_id)
.is_some_and(|r| r.completed_at.is_none())
};
let mut session = if runner_active {
match state.storage.load_session(&session_id).await {
Ok(Some(s)) => Some(s),
Ok(None) => {
let sessions = state.sessions.read().await;
sessions.get(&session_id).cloned()
}
Err(e) => {
tracing::warn!(
"[{}] Disk read failed during active execution, falling back to memory: {}",
session_id,
e
);
let sessions = state.sessions.read().await;
sessions.get(&session_id).cloned()
}
}
} else {
let sessions = state.sessions.read().await;
sessions.get(&session_id).cloned()
};
if session.is_none() {
match state.storage.load_session(&session_id).await {
Ok(Some(s)) => session = Some(s),
Ok(None) => {
return HttpResponse::NotFound().json(serde_json::json!({
"error": "Session not found",
"session_id": session_id
}));
}
Err(e) => {
return HttpResponse::InternalServerError().json(serde_json::json!({
"error": format!("Failed to load session: {e}"),
"session_id": session_id
}));
}
}
}
let Some(session) = session else {
return HttpResponse::InternalServerError().json(serde_json::json!({
"error": "Session load unexpectedly returned no data",
"session_id": session_id
}));
};
HttpResponse::Ok().json(serde_json::json!({
"session_id": session_id,
"messages": session.messages,
"compression_events": session.compression_events
}))
}