use thiserror::Error;
use terraphim_task_decomposition::TaskDecompositionError;
use crate::GenAgentError;
#[derive(Error, Debug)]
pub enum KgAgentError {
#[error("Task decomposition failed: {0}")]
DecompositionFailed(String),
#[error("Knowledge graph query failed: {0}")]
KnowledgeGraphError(String),
#[error("Agent coordination failed: {0}")]
CoordinationFailed(String),
#[error("Task execution failed: {0}")]
ExecutionFailed(String),
#[error("Domain specialization error: {0}")]
DomainError(String),
#[error("Task compatibility check failed: {0}")]
CompatibilityError(String),
#[error("Planning error: {0}")]
PlanningError(String),
#[error("Worker agent error: {0}")]
WorkerError(String),
#[error("Coordination agent error: {0}")]
CoordinationAgentError(String),
#[error("GenAgent error: {0}")]
GenAgentError(#[from] GenAgentError),
#[error("Task decomposition error: {0}")]
TaskDecompositionError(#[from] TaskDecompositionError),
#[error("System error: {0}")]
SystemError(String),
}
impl KgAgentError {
pub fn is_recoverable(&self) -> bool {
match self {
KgAgentError::DecompositionFailed(_) => true,
KgAgentError::KnowledgeGraphError(_) => true,
KgAgentError::CoordinationFailed(_) => true,
KgAgentError::ExecutionFailed(_) => false, KgAgentError::DomainError(_) => false,
KgAgentError::CompatibilityError(_) => false,
KgAgentError::PlanningError(_) => true,
KgAgentError::WorkerError(_) => true,
KgAgentError::CoordinationAgentError(_) => true,
KgAgentError::GenAgentError(_) => true, KgAgentError::TaskDecompositionError(_) => true,
KgAgentError::SystemError(_) => false,
}
}
pub fn category(&self) -> &'static str {
match self {
KgAgentError::DecompositionFailed(_) => "decomposition",
KgAgentError::KnowledgeGraphError(_) => "knowledge_graph",
KgAgentError::CoordinationFailed(_) => "coordination",
KgAgentError::ExecutionFailed(_) => "execution",
KgAgentError::DomainError(_) => "domain",
KgAgentError::CompatibilityError(_) => "compatibility",
KgAgentError::PlanningError(_) => "planning",
KgAgentError::WorkerError(_) => "worker",
KgAgentError::CoordinationAgentError(_) => "coordination_agent",
KgAgentError::GenAgentError(_) => "gen_agent",
KgAgentError::TaskDecompositionError(_) => "task_decomposition",
KgAgentError::SystemError(_) => "system",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_error_recoverability() {
assert!(KgAgentError::DecompositionFailed("test".to_string()).is_recoverable());
assert!(!KgAgentError::ExecutionFailed("test".to_string()).is_recoverable());
assert!(!KgAgentError::SystemError("test".to_string()).is_recoverable());
}
#[test]
fn test_error_categorization() {
assert_eq!(
KgAgentError::PlanningError("test".to_string()).category(),
"planning"
);
assert_eq!(
KgAgentError::WorkerError("test".to_string()).category(),
"worker"
);
assert_eq!(
KgAgentError::CoordinationFailed("test".to_string()).category(),
"coordination"
);
}
}