use ainl_memory::{AinlMemoryNode, AinlNodeType, GraphMemory};
use uuid::Uuid;
#[derive(Debug, Clone, PartialEq)]
pub struct FailureRecallHit {
pub id: Uuid,
pub source: String,
pub message: String,
pub tool_name: Option<String>,
pub source_namespace: Option<String>,
pub source_tool: Option<String>,
pub score: f32,
}
fn hit_from_node(node: AinlMemoryNode) -> Option<FailureRecallHit> {
let AinlNodeType::Failure { failure } = node.node_type else {
return None;
};
Some(FailureRecallHit {
id: node.id,
source: failure.source,
message: failure.message,
tool_name: failure.tool_name,
source_namespace: failure.source_namespace,
source_tool: failure.source_tool,
score: 1.0,
})
}
pub fn search_failures_for_agent(
memory: &GraphMemory,
agent_id: &str,
query: &str,
limit: usize,
) -> Result<Vec<FailureRecallHit>, String> {
let nodes = memory.search_failures_for_agent(agent_id, query, limit)?;
Ok(nodes.into_iter().filter_map(hit_from_node).collect())
}