use std::path::PathBuf;
use crate::capsule::{Capsule, CompositeCapsule};
use crate::error::CapsuleResult;
use crate::manifest::CapsuleManifest;
use astrid_mcp::SecureMcpClient;
pub struct CapsuleLoader {
mcp_client: SecureMcpClient,
}
impl CapsuleLoader {
#[must_use]
pub fn new(mcp_client: SecureMcpClient) -> Self {
Self { mcp_client }
}
pub fn create_capsule(
&self,
manifest: CapsuleManifest,
capsule_dir: PathBuf,
) -> CapsuleResult<Box<dyn Capsule>> {
let mut composite = CompositeCapsule::new(manifest.clone())?;
if !manifest.components.is_empty() {
composite.add_engine(Box::new(crate::engine::WasmEngine::new(
manifest.clone(),
capsule_dir.clone(),
)));
}
for server in &manifest.mcp_servers {
if server.server_type.as_deref() == Some("stdio") {
composite.add_engine(Box::new(crate::engine::McpHostEngine::new(
manifest.clone(),
server.clone(),
capsule_dir.clone(),
self.mcp_client.clone(),
)));
}
}
composite.add_engine(Box::new(crate::engine::StaticEngine::new(
manifest.clone(),
capsule_dir.clone(),
)));
composite.set_source_dir(capsule_dir);
Ok(Box::new(composite))
}
}