codex-helper-core 0.15.0

Core library for codex-helper.
Documentation
use axum::http::StatusCode;

mod capabilities;
mod session_mutations;
mod session_observability;

pub(super) use self::capabilities::{api_capabilities, api_operator_summary, api_v1_snapshot};
pub(super) use self::session_mutations::{
    apply_session_profile, get_global_station_override, set_default_profile,
    set_global_station_override,
};
pub(super) use self::session_observability::{
    get_session_identity_card, list_active_requests, list_recent_finished,
    list_session_identity_cards, list_session_stats,
};

#[derive(serde::Deserialize)]
pub(in crate::proxy) struct SessionProfileApplyRequest {
    session_id: String,
    profile_name: Option<String>,
}

#[derive(serde::Deserialize)]
pub(in crate::proxy) struct DefaultProfileRequest {
    profile_name: Option<String>,
}

#[derive(serde::Deserialize)]
pub(in crate::proxy) struct GlobalStationOverrideRequest {
    #[serde(default)]
    station_name: Option<String>,
}

#[derive(serde::Deserialize)]
pub(in crate::proxy) struct RecentQuery {
    limit: Option<usize>,
}

#[derive(serde::Deserialize)]
pub(in crate::proxy) struct SnapshotQuery {
    recent_limit: Option<usize>,
    stats_days: Option<usize>,
}

pub(super) fn require_session_id(session_id: &str) -> Result<(), (StatusCode, String)> {
    if session_id.trim().is_empty() {
        return Err((
            StatusCode::BAD_REQUEST,
            "session_id is required".to_string(),
        ));
    }
    Ok(())
}

pub(super) fn host_local_session_history_available() -> bool {
    let sessions_dir = crate::config::codex_sessions_dir();
    std::fs::metadata(sessions_dir)
        .map(|metadata| metadata.is_dir())
        .unwrap_or(false)
}