mod client;
mod sync;
pub use client::{rag_client, rag_configured};
pub use sync::spawn_rag_sync;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RagStatus {
Disabled,
Offline,
Unauthorized,
NotConfigured,
Syncing {
llm_available: bool,
},
Online {
llm_available: bool,
},
}
impl RagStatus {
pub fn label(self) -> Option<&'static str> {
match self {
RagStatus::Disabled => None,
RagStatus::Offline => Some("rag: offline"),
RagStatus::Unauthorized => Some("rag: unauthorized"),
RagStatus::NotConfigured => Some("rag: not configured"),
RagStatus::Syncing { .. } => Some("rag: syncing"),
RagStatus::Online { .. } => Some("rag: online"),
}
}
pub fn llm_available(self) -> bool {
matches!(
self,
RagStatus::Online {
llm_available: true
} | RagStatus::Syncing {
llm_available: true
}
)
}
pub fn search_available(self) -> bool {
matches!(self, RagStatus::Online { .. } | RagStatus::Syncing { .. })
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn not_configured_status_labels_and_gates() {
assert_eq!(
RagStatus::NotConfigured.label(),
Some("rag: not configured")
);
assert!(!RagStatus::NotConfigured.llm_available());
}
#[test]
fn unauthorized_status_labels_and_gates() {
assert_eq!(RagStatus::Unauthorized.label(), Some("rag: unauthorized"));
assert!(!RagStatus::Unauthorized.llm_available());
}
#[test]
fn search_available_tracks_reachable_with_embedder() {
assert!(
RagStatus::Online {
llm_available: false
}
.search_available()
);
assert!(
RagStatus::Online {
llm_available: true
}
.search_available()
);
assert!(
RagStatus::Syncing {
llm_available: false
}
.search_available()
);
assert!(
RagStatus::Syncing {
llm_available: true
}
.search_available()
);
assert!(!RagStatus::Offline.search_available());
assert!(!RagStatus::Unauthorized.search_available());
assert!(!RagStatus::NotConfigured.search_available());
assert!(!RagStatus::Disabled.search_available());
}
#[test]
fn semantic_only_server_searches_but_does_not_answer() {
let semantic_only = RagStatus::Online {
llm_available: false,
};
assert!(semantic_only.search_available(), "SEM must show");
assert!(!semantic_only.llm_available(), "ASK must stay hidden");
}
}