use crate::engine::ExecutionContext;
use async_trait::async_trait;
use std::collections::HashMap;
#[async_trait]
pub trait Capability: Send + Sync {
fn name(&self) -> &str;
fn is_available(&self, context: &ExecutionContext) -> bool;
async fn execute(
&self,
context: &mut ExecutionContext,
parameters: &HashMap<String, serde_json::Value>,
) -> Result<CapabilityResult, CapabilityError>;
}
#[derive(Debug, Clone)]
pub struct CapabilityResult {
pub output: HashMap<String, serde_json::Value>,
pub success: bool,
}
#[derive(Debug, thiserror::Error)]
pub enum CapabilityError {
#[error("Capability execution failed: {0}")]
ExecutionFailed(String),
#[error("Capability not available: {0}")]
NotAvailable(String),
#[error("Invalid parameters: {0}")]
InvalidParameters(String),
}
pub trait CapabilityProvider: Send + Sync {
fn get_capabilities(&self) -> Vec<Box<dyn Capability>>;
}