pub mod fold;
pub mod handlers;
pub mod persist;
pub mod tunable;
mod event;
mod pack;
pub(crate) use pack::sync_balanced_recall_record;
pub use pack::{BrainPack, ENTITY_CACHE_CAPACITY};
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;