pub mod common;
pub mod embeddings;
pub mod engine;
pub mod handlers;
pub mod path_utils;
pub mod preprocessing;
pub mod query;
pub mod rag;
pub mod search;
pub mod security;
pub mod storage;
#[cfg(test)]
mod tests;
pub mod tools;
#[cfg(feature = "cli")]
pub mod progress;
#[cfg(feature = "cli")]
pub mod tui;
use anyhow::Result;
use tracing::Level;
pub use embeddings::{
EmbeddingClient, EmbeddingConfig, MLXBridge, MlxConfig, ProviderConfig, RerankerConfig,
TokenConfig, estimate_tokens, safe_chunk_size, truncate_to_token_limit, validate_batch_tokens,
validate_chunk_tokens,
};
pub use handlers::{MCPServer, create_server};
pub use preprocessing::{Message, PreprocessingConfig, PreprocessingStats, Preprocessor};
pub use query::{
LoctreeSuggestion, QueryIntent, QueryRouter, RecommendedSearchMode, RoutingDecision,
SearchModeRecommendation, TemporalHints, detect_intent,
};
pub use rag::{
ContextPrefixConfig, EnrichedChunk, IndexResult, OnionSlice, OnionSliceConfig, RAGPipeline,
SearchOptions, SearchResult, SliceLayer, SliceMode, compute_content_hash,
create_enriched_chunks, create_onion_slices,
};
pub use search::{
BM25Config, BM25Index, HybridConfig, HybridSearchResult, HybridSearcher, SearchMode,
StemLanguage,
};
pub use security::{NamespaceAccessManager, NamespaceSecurityConfig};
pub use storage::{ChromaDocument, StorageManager};
pub use engine::{BatchResult, MemexConfig, MemexEngine, MetaFilter, StoreItem};
pub use tools::{
ToolDefinition, ToolResult, memory_delete, memory_delete_by_filter, memory_get, memory_search,
memory_store, memory_store_batch, tool_definitions,
};
#[cfg(feature = "cli")]
pub use progress::IndexProgressTracker;
#[cfg(feature = "cli")]
pub use tui::{HostDetection, HostKind, WizardConfig, detect_hosts, run_wizard};
#[derive(Debug, Clone)]
pub struct ServerConfig {
pub features: Vec<String>,
pub cache_mb: usize,
pub db_path: String,
pub max_request_bytes: usize,
pub log_level: Level,
pub allowed_paths: Vec<String>,
pub security: NamespaceSecurityConfig,
pub embeddings: EmbeddingConfig,
pub hybrid: HybridConfig,
}
impl Default for ServerConfig {
fn default() -> Self {
Self {
features: vec![
"filesystem".to_string(),
"memory".to_string(),
"search".to_string(),
],
cache_mb: 4096,
db_path: "~/.rmcp-servers/rmcp-memex/lancedb".to_string(),
max_request_bytes: 5 * 1024 * 1024,
log_level: Level::INFO,
allowed_paths: vec![],
security: NamespaceSecurityConfig::default(),
embeddings: EmbeddingConfig::default(),
hybrid: HybridConfig::default(),
}
}
}
impl ServerConfig {
pub fn for_memory_only() -> Self {
Self {
features: vec!["memory".to_string(), "search".to_string()],
..Self::default()
}
}
pub fn for_full_rag() -> Self {
Self::default()
}
pub fn with_db_path(mut self, db_path: impl Into<String>) -> Self {
self.db_path = db_path.into();
self
}
pub fn with_features(mut self, features: Vec<String>) -> Self {
self.features = features;
self
}
}
pub async fn run_stdio_server(config: ServerConfig) -> Result<()> {
let server = create_server(config).await?;
server.run_stdio().await
}
#[cfg(test)]
mod lib_tests {
use super::*;
#[test]
fn default_config_has_expected_values() {
let cfg = ServerConfig::default();
assert!(cfg.features.contains(&"filesystem".to_string()));
assert_eq!(cfg.cache_mb, 4096);
assert_eq!(cfg.db_path, "~/.rmcp-servers/rmcp-memex/lancedb");
assert_eq!(cfg.max_request_bytes, 5 * 1024 * 1024);
}
}