use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DatabaseConfig {
pub backend: crate::DatabaseBackend,
pub sqlite: SqliteConfig,
#[cfg(feature = "astra")]
pub astra: AstraConfig,
pub embeddings: EmbeddingConfig,
pub memory_pools: MemoryPoolConfig,
}
impl Default for DatabaseConfig {
fn default() -> Self {
Self {
backend: crate::DatabaseBackend::Sqlite,
sqlite: SqliteConfig::default(),
#[cfg(feature = "astra")]
astra: AstraConfig::default(),
embeddings: EmbeddingConfig::default(),
memory_pools: MemoryPoolConfig::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SqliteConfig {
pub path: PathBuf,
pub max_connections: u32,
pub wal_mode: bool,
pub pool_directory: PathBuf,
}
impl Default for SqliteConfig {
fn default() -> Self {
Self {
path: PathBuf::from("ubiquity.db"),
max_connections: 10,
wal_mode: true,
pool_directory: PathBuf::from(".ubiquity/pools"),
}
}
}
#[cfg(feature = "astra")]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AstraConfig {
pub endpoint: String,
pub token: String,
pub keyspace: String,
pub collections: AstraCollections,
pub streaming: AstraStreamingConfig,
}
#[cfg(feature = "astra")]
impl Default for AstraConfig {
fn default() -> Self {
Self {
endpoint: String::new(),
token: String::new(),
keyspace: "ubiquity".to_string(),
collections: AstraCollections::default(),
streaming: AstraStreamingConfig::default(),
}
}
}
#[cfg(feature = "astra")]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AstraCollections {
pub consciousness: String,
pub ripples: String,
pub tasks: String,
pub pool_prefix: String,
}
#[cfg(feature = "astra")]
impl Default for AstraCollections {
fn default() -> Self {
Self {
consciousness: "consciousness_states".to_string(),
ripples: "consciousness_ripples".to_string(),
tasks: "tasks".to_string(),
pool_prefix: "memory_pool_".to_string(),
}
}
}
#[cfg(feature = "astra")]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AstraStreamingConfig {
pub endpoint: String,
pub tenant: String,
pub namespace: String,
pub topic_prefix: String,
}
#[cfg(feature = "astra")]
impl Default for AstraStreamingConfig {
fn default() -> Self {
Self {
endpoint: String::new(),
tenant: String::new(),
namespace: "ubiquity".to_string(),
topic_prefix: "ubiquity_".to_string(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmbeddingConfig {
pub dimension: usize,
pub model: String,
pub provider: String,
pub cache_enabled: bool,
pub cache_size: usize,
}
impl Default for EmbeddingConfig {
fn default() -> Self {
Self {
dimension: 1536,
model: "text-embedding-3-small".to_string(),
provider: "openai".to_string(),
cache_enabled: true,
cache_size: 10000,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryPoolConfig {
pub pool_count: usize,
pub max_pool_size_mb: usize,
pub eviction_policy: EvictionPolicy,
pub compression: bool,
}
impl Default for MemoryPoolConfig {
fn default() -> Self {
Self {
pool_count: 7,
max_pool_size_mb: 100,
eviction_policy: EvictionPolicy::Lru,
compression: true,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum EvictionPolicy {
Lru,
Lfu,
Ttl,
None,
}