use mnemos::core::{KnowledgeBase, KnowledgeBaseConfig};
use mnemos::grpc::KnowledgeServiceImpl;
use mnemos::grpc::knowledge_service_server::KnowledgeServiceServer;
use clap::Parser;
use std::sync::Arc;
use tokio::sync::RwLock;
use tonic::transport::Server;
use tracing::info;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
#[derive(Parser)]
#[command(name = "mnemos-server")]
#[command(author, version, about = "gRPC server for the knowledge base")]
struct Args {
#[arg(short, long, default_value = "0.0.0.0:50051")]
address: String,
#[arg(short, long, default_value = "./knowledge.db")]
storage: String,
#[arg(short, long, default_value = "384")]
dimensions: usize,
#[arg(long)]
no_learning: bool,
#[arg(short, long)]
verbose: bool,
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let args = Args::parse();
let filter = if args.verbose { "debug" } else { "info" };
tracing_subscriber::registry()
.with(
tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| filter.into()),
)
.with(tracing_subscriber::fmt::layer())
.init();
info!("Starting mnemos Server v{}", env!("CARGO_PKG_VERSION"));
let config = KnowledgeBaseConfig {
dimensions: args.dimensions,
storage_path: args.storage.clone(),
learning_enabled: !args.no_learning,
..Default::default()
};
let kb = KnowledgeBase::with_config(config).await?;
let kb = Arc::new(RwLock::new(kb));
let service = KnowledgeServiceImpl::from_shared(kb);
let addr = args.address.parse()?;
info!("Listening on {}", addr);
info!("Storage: {}", args.storage);
info!("Dimensions: {}", args.dimensions);
info!(
"Learning: {}",
if args.no_learning {
"disabled"
} else {
"enabled"
}
);
Server::builder()
.add_service(KnowledgeServiceServer::new(service))
.serve(addr)
.await?;
Ok(())
}