mod crate_sources_mcp;
mod eg;
mod research_agent;
mod state;
use anyhow::Result;
use sacp::component::Component;
use sacp::mcp_server::McpServiceRegistry;
use sacp::ProxyToConductor;
use state::ResearchState;
use std::sync::Arc;
pub async fn run() -> Result<()> {
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info")),
)
.init();
tracing::info!("Starting rust-crate-sources-proxy");
CrateSourcesProxy.serve(sacp_tokio::Stdio::new()).await?;
Ok(())
}
pub struct CrateSourcesProxy;
impl Component for CrateSourcesProxy {
async fn serve(self, client: impl Component) -> Result<(), sacp::Error> {
let state = Arc::new(ResearchState::new());
let mcp_registry = McpServiceRegistry::new().with_mcp_server(
"rust-crate-query",
research_agent::build_server(state.clone()),
)?;
ProxyToConductor::builder()
.name("rust-crate-sources-proxy")
.with_handler(mcp_registry)
.with_handler(research_agent::PermissionAutoApprover::new(state.clone()))
.serve(client)
.await
}
}