use std::sync::Arc;
use tokio::sync::RwLock;
use crate::a2a::core::bus::MessageBus;
use crate::a2a::core::push_notifications::PushNotificationStore;
use crate::a2a::core::task_facade::TaskFacade;
use crate::a2a::core::task_manager::TaskManager;
const BUS_CAPACITY: usize = 1024;
#[derive(Clone, Debug)]
pub struct AgentCardInfo {
pub name: String,
pub description: String,
pub version: String,
pub grpc_url: String,
pub http_url: String,
pub requires_auth: bool,
}
impl Default for AgentCardInfo {
fn default() -> Self {
Self {
name: "basemind".to_owned(),
description: "basemind agent context + A2A task server".to_owned(),
version: env!("CARGO_PKG_VERSION").to_owned(),
grpc_url: String::new(),
http_url: String::new(),
requires_auth: false,
}
}
}
#[derive(Clone)]
pub struct A2aState {
pub task_facade: Arc<TaskFacade>,
pub bus: Arc<MessageBus>,
pub push_notifications: Arc<RwLock<PushNotificationStore>>,
pub card: AgentCardInfo,
pub auth_token: Option<Arc<str>>,
}
impl A2aState {
pub fn new(card: AgentCardInfo) -> Self {
let bus = Arc::new(MessageBus::new(BUS_CAPACITY));
let task_manager = Arc::new(RwLock::new(TaskManager::new(Arc::clone(&bus))));
let task_facade = Arc::new(TaskFacade::new(task_manager));
let push_notifications = Arc::new(RwLock::new(PushNotificationStore::new()));
Self {
task_facade,
bus,
push_notifications,
card,
auth_token: None,
}
}
#[must_use]
pub fn with_auth_token(mut self, token: Option<Arc<str>>) -> Self {
self.card.requires_auth = token.is_some();
self.auth_token = token;
self
}
}
impl Default for A2aState {
fn default() -> Self {
Self::new(AgentCardInfo::default())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_state_builds_with_basemind_card() {
let state = A2aState::default();
assert_eq!(state.card.name, "basemind");
}
}