use serde_json::Value;
use std::{collections::HashMap, sync::Arc};
use tokio::sync::{mpsc, oneshot, RwLock};
use crate::config::ServerConfig;
pub enum ServerMsg {
CallTool {
name: String,
params: Value,
input_responses: Option<std::collections::BTreeMap<String, Value>>,
request_state: Option<String>,
reply: oneshot::Sender<Result<Value, UpstreamCallError>>,
},
ReadResource {
uri: String,
input_responses: Option<std::collections::BTreeMap<String, Value>>,
request_state: Option<String>,
reply: oneshot::Sender<Result<Value, UpstreamCallError>>,
},
GetPrompt {
name: String,
arguments: Option<serde_json::Map<String, Value>>,
input_responses: Option<std::collections::BTreeMap<String, Value>>,
request_state: Option<String>,
reply: oneshot::Sender<Result<Value, UpstreamCallError>>,
},
}
#[derive(Debug, Clone)]
pub enum UpstreamCallError {
Upstream(String),
Timeout,
}
#[derive(Clone, Debug)]
pub struct CapabilityMeta {
pub server: String,
pub tool: String,
pub summary: String,
pub description: String,
pub input_schema: Value,
pub tags: Vec<String>,
pub examples: Vec<Value>,
}
#[derive(Clone, Debug)]
pub struct ResourceMeta {
pub server: String,
pub uri: String,
pub name: String,
pub description: Option<String>,
pub mime_type: Option<String>,
pub tags: Vec<String>,
}
#[derive(Clone, Debug)]
pub struct PromptMeta {
pub server: String,
pub name: String,
pub title: Option<String>,
pub description: Option<String>,
pub arguments: Vec<Value>,
pub tags: Vec<String>,
}
pub type SharedServers = Arc<RwLock<HashMap<String, mpsc::Sender<ServerMsg>>>>;
pub type SharedCapabilities = Arc<RwLock<HashMap<String, CapabilityMeta>>>;
pub type SharedResources = Arc<RwLock<HashMap<String, ResourceMeta>>>;
pub type SharedPrompts = Arc<RwLock<HashMap<String, PromptMeta>>>;
pub type SharedPolicy = Arc<RwLock<crate::daemon::policy::Policy>>;
pub type SharedCatalogVersion = Arc<RwLock<String>>;
pub type SharedServerConfigs = Arc<RwLock<HashMap<String, ServerConfig>>>;
pub type SharedServerStatuses = Arc<RwLock<HashMap<String, Value>>>;