use std::fmt;
use std::sync::Arc;
use systemprompt_models::brain::{BrainFact, FactCandidate, KindDecl, SubjectKey};
use super::errors::BrainConsolidateError;
use super::traits::BrainModelClient;
pub struct ConsolidationInput {
pub kind: KindDecl,
pub subject: SubjectKey,
pub facts: Vec<BrainFact>,
pub model: Arc<dyn BrainModelClient>,
pub budget_tokens: u64,
}
impl fmt::Debug for ConsolidationInput {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("ConsolidationInput")
.field("kind", &self.kind.kind)
.field("subject", &self.subject)
.field("facts", &self.facts.len())
.field("budget_tokens", &self.budget_tokens)
.finish_non_exhaustive()
}
}
#[async_trait::async_trait]
pub trait FactConsolidator: Send + Sync {
fn name(&self) -> &'static str;
fn handles(&self, kind: &KindDecl) -> bool;
async fn consolidate(
&self,
input: &ConsolidationInput,
) -> Result<Vec<FactCandidate>, BrainConsolidateError>;
}