use std::sync::Arc;
#[cfg(feature = "a2a")]
use crate::backend::ExecutionBackendFactory;
use crate::plugins::Plugin;
use awaken_runtime_contract::contract::executor::LlmExecutor;
use awaken_runtime_contract::contract::tool::Tool;
use crate::registry::model_capabilities::ModelCapabilityPatch;
use awaken_runtime_contract::registry_spec::{AgentSpec, ModelPoolSpec, ModelSpec};
pub trait ToolRegistry: Send + Sync {
fn get_tool(&self, id: &str) -> Option<Arc<dyn Tool>>;
fn tool_ids(&self) -> Vec<String>;
}
pub trait ModelRegistry: Send + Sync {
fn get_model(&self, id: &str) -> Option<ModelSpec>;
fn model_ids(&self) -> Vec<String>;
fn get_pool(&self, _id: &str) -> Option<ModelPoolSpec> {
None
}
fn pool_ids(&self) -> Vec<String> {
Vec::new()
}
}
pub trait ProviderRegistry: Send + Sync {
fn get_provider(&self, id: &str) -> Option<Arc<dyn LlmExecutor>>;
fn provider_ids(&self) -> Vec<String>;
fn provider_signature(&self, _id: &str) -> Option<String> {
None
}
fn provider_capability_source(&self, _id: &str) -> Option<String> {
None
}
fn provider_model_capability(
&self,
_provider_id: &str,
_upstream_model: &str,
) -> Option<ModelCapabilityPatch> {
None
}
}
pub trait AgentSpecRegistry: Send + Sync {
fn get_agent(&self, id: &str) -> Option<AgentSpec>;
fn agent_ids(&self) -> Vec<String>;
}
pub trait PluginSource: Send + Sync {
fn get_plugin(&self, id: &str) -> Option<Arc<dyn Plugin>>;
fn plugin_ids(&self) -> Vec<String>;
}
#[cfg(feature = "a2a")]
pub trait BackendRegistry: Send + Sync {
fn get_backend_factory(&self, backend: &str) -> Option<Arc<dyn ExecutionBackendFactory>>;
fn backend_ids(&self) -> Vec<String>;
}
#[derive(Clone)]
pub struct RegistrySet {
pub agents: Arc<dyn AgentSpecRegistry>,
pub tools: Arc<dyn ToolRegistry>,
pub models: Arc<dyn ModelRegistry>,
pub providers: Arc<dyn ProviderRegistry>,
pub plugins: Arc<dyn PluginSource>,
#[cfg(feature = "a2a")]
pub backends: Arc<dyn BackendRegistry>,
}