use crate::core::knowledge_relations::{KnowledgeEdge, KnowledgeRelationGraph};
use super::types::{ConsolidatedInsight, KnowledgeFact, ProjectKnowledge, ProjectPattern};
#[derive(Debug, Clone)]
pub struct KnowledgeSnapshot {
pub project_root: String,
pub project_hash: String,
pub facts: Vec<KnowledgeFact>,
pub patterns: Vec<ProjectPattern>,
pub insights: Vec<ConsolidatedInsight>,
pub relations: Vec<KnowledgeEdge>,
}
impl KnowledgeSnapshot {
pub fn collect(project_root: &str) -> Self {
let knowledge = ProjectKnowledge::load_or_create(project_root);
let relations = KnowledgeRelationGraph::load(&knowledge.project_hash)
.map(|g| g.edges)
.unwrap_or_default();
Self::from_project(&knowledge, relations)
}
pub fn from_project(knowledge: &ProjectKnowledge, relations: Vec<KnowledgeEdge>) -> Self {
Self {
project_root: knowledge.project_root.clone(),
project_hash: knowledge.project_hash.clone(),
facts: knowledge.facts.clone(),
patterns: knowledge.patterns.clone(),
insights: knowledge.history.clone(),
relations,
}
}
pub fn is_empty(&self) -> bool {
self.facts.is_empty() && self.patterns.is_empty() && self.insights.is_empty()
}
pub fn current_facts(&self) -> Vec<&KnowledgeFact> {
self.facts.iter().filter(|f| f.is_current()).collect()
}
}