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,
},
}
#[derive(Debug, Clone)]
pub struct RagAnswer {
pub answer: String,
pub sources: Vec<RagSource>,
}
#[derive(Debug, Clone)]
pub struct RagSource {
pub path: kimun_core::nfs::VaultPath,
pub title: String,
}
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
}
)
}
}
#[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());
}
}