pub mod fold;
pub mod fold_gate;
pub mod handlers;
pub mod persist;
pub mod serve_ledger;
pub mod tunable;
mod event;
mod pack;
pub(crate) use pack::sync_balanced_recall_record;
pub use pack::{BrainPack, ENTITY_CACHE_CAPACITY};
use std::collections::HashMap;
use khive_brain_core::{SectionPosteriorState, SectionType};
pub(crate) fn ensure_section_state_seeded<'a>(
section_states: &'a mut HashMap<String, SectionPosteriorState>,
profile_id: &str,
) -> &'a mut SectionPosteriorState {
let section_state = section_states.entry(profile_id.to_owned()).or_default();
let defaults = SectionPosteriorState::default_priors();
for st in SectionType::all() {
if let Some(prior) = defaults.get(st) {
section_state
.posteriors
.entry(*st)
.or_insert_with(|| prior.clone());
section_state
.priors
.entry(*st)
.or_insert_with(|| prior.clone());
}
}
section_state
}
pub(crate) fn validate_section_signals(
ss: &serde_json::Value,
) -> Result<(), khive_runtime::RuntimeError> {
let obj = ss.as_object().ok_or_else(|| {
khive_runtime::RuntimeError::InvalidInput(
"section_signals must be a JSON object mapping section names to signal strings".into(),
)
})?;
if obj.is_empty() {
return Err(khive_runtime::RuntimeError::InvalidInput(
"section_signals must not be empty; omit the field entirely to submit feedback \
without section evidence"
.into(),
));
}
let valid_signals = ["useful", "not_useful", "wrong"];
let valid_sections = khive_brain_core::SectionType::NAMES;
for (key, val) in obj {
if !valid_sections.contains(&key.as_str()) {
return Err(khive_runtime::RuntimeError::InvalidInput(format!(
"section_signals: unknown section {key:?}; valid: {}",
valid_sections.join(", ")
)));
}
let sig = val.as_str().ok_or_else(|| {
khive_runtime::RuntimeError::InvalidInput(format!(
"section_signals: signal for section {key:?} must be one of: useful | not_useful | wrong"
))
})?;
if !valid_signals.contains(&sig) {
return Err(khive_runtime::RuntimeError::InvalidInput(format!(
"section_signals: invalid signal {sig:?} for section {key:?}; \
valid: {}",
valid_signals.join(" | ")
)));
}
}
Ok(())
}
#[cfg(test)]
mod tests;