use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KnowledgeEntry {
pub id: String,
pub source_type: String,
pub source_id: String,
pub content: String,
pub org_id: Option<String>,
pub agent_id: Option<String>,
pub project_id: Option<String>,
#[serde(default = "default_visibility")]
pub visibility: String,
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchResult {
pub entry: KnowledgeEntry,
pub score: f64,
}
#[derive(Debug, Deserialize)]
pub struct WriteRequest {
pub content: String,
pub source_type: String,
pub source_id: String,
#[serde(default)]
pub org_id: Option<String>,
#[serde(default)]
pub agent_id: Option<String>,
#[serde(default)]
pub project_id: Option<String>,
#[serde(default = "default_visibility")]
pub visibility: String,
}
fn default_visibility() -> String {
"org".into()
}
#[derive(Debug, Deserialize)]
pub struct SearchRequest {
pub query: String,
#[serde(default = "default_limit")]
pub limit: usize,
#[serde(default)]
pub org_id: Option<String>,
#[serde(default)]
pub source_type: Option<String>,
#[serde(default)]
pub project_id: Option<String>,
#[serde(default = "default_min_score")]
pub min_score: f64,
#[serde(default)]
pub federated: bool,
}
fn default_limit() -> usize {
5
}
fn default_min_score() -> f64 {
0.3
}
#[derive(Debug, Serialize)]
pub struct StoreStats {
pub total_entries: i64,
pub total_by_source: Vec<(String, i64)>,
pub embedding_dimensions: usize,
}