use jamjet_a2a_proto::A2aAdapter;
use jamjet_agents::AgentRegistry;
use jamjet_audit::{AuditBackend, AuditEnricher};
use jamjet_mcp::McpAdapter;
use jamjet_protocols::{anp::AnpAdapter, ProtocolRegistry};
use jamjet_state::backend::StateBackend;
use jamjet_state::TenantId;
use std::sync::Arc;
pub type BackendForFn = Arc<dyn Fn(&TenantId) -> Arc<dyn StateBackend> + Send + Sync>;
#[derive(Clone)]
pub struct AppState {
pub backend: Arc<dyn StateBackend>,
pub backend_for_fn: BackendForFn,
pub agents: Arc<dyn AgentRegistry>,
pub audit: Arc<dyn AuditBackend>,
pub enricher: Arc<AuditEnricher>,
pub protocols: ProtocolRegistry,
pub cron_store: Option<std::sync::Arc<jamjet_timers::CronStore>>,
}
impl AppState {
pub fn backend_for(&self, tenant_id: &TenantId) -> Arc<dyn StateBackend> {
(self.backend_for_fn)(tenant_id)
}
}
pub fn default_protocol_registry() -> ProtocolRegistry {
let mut reg = ProtocolRegistry::new();
reg.register(
"mcp",
Arc::new(McpAdapter::new()),
vec!["http://", "https://"],
);
reg.register(
"a2a",
Arc::new(A2aAdapter::new()),
vec![] as Vec<String>,
);
reg.register("anp", Arc::new(AnpAdapter::new()), vec!["did:"]);
reg
}