use crate::segment::Segment;
use ainl_failure_learning::{format_failure_prevention_block, search_failures_for_agent, FailureRecallHit};
use ainl_memory::GraphMemory;
use std::cmp::min;
const MAX_QUERY_CHARS: usize = 240;
#[must_use]
pub fn memory_block_from_failure_hits(
segment_label: impl Into<String>,
block_title: &str,
hits: &[FailureRecallHit],
) -> Option<Segment> {
if hits.is_empty() {
return None;
}
let body = format_failure_prevention_block(block_title, hits);
if body.trim().is_empty() {
return None;
}
Some(Segment::memory_block(segment_label, body))
}
#[must_use]
pub fn memory_block_for_user_query(
memory: &GraphMemory,
agent_id: &str,
user_query: &str,
limit: usize,
) -> Option<Segment> {
let q = user_query.trim();
if q.is_empty() || agent_id.trim().is_empty() {
return None;
}
let cap = min(limit.max(1), 20);
let q_short: String = q.chars().take(MAX_QUERY_CHARS).collect();
let hits = search_failures_for_agent(memory, agent_id, &q_short, cap).ok()?;
memory_block_from_failure_hits("failure_recall_fts", "Failure recall (compose)", &hits)
}