use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OsPipeConfig {
pub data_dir: PathBuf,
pub capture: CaptureConfig,
pub storage: StorageConfig,
pub search: SearchConfig,
pub safety: SafetyConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CaptureConfig {
pub fps: f32,
pub audio_chunk_secs: u32,
pub excluded_apps: Vec<String>,
pub skip_private_windows: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StorageConfig {
pub embedding_dim: usize,
pub hnsw_m: usize,
pub hnsw_ef_construction: usize,
pub hnsw_ef_search: usize,
pub dedup_threshold: f32,
pub quantization_tiers: Vec<QuantizationTier>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuantizationTier {
pub age_hours: u64,
pub method: QuantizationMethod,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum QuantizationMethod {
None,
Scalar,
Product,
Binary,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchConfig {
pub default_k: usize,
pub hybrid_weight: f32,
pub mmr_lambda: f32,
pub rerank_enabled: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SafetyConfig {
pub pii_detection: bool,
pub credit_card_redaction: bool,
pub ssn_redaction: bool,
pub custom_patterns: Vec<String>,
}
impl Default for OsPipeConfig {
fn default() -> Self {
Self {
data_dir: PathBuf::from("~/.ospipe"),
capture: CaptureConfig::default(),
storage: StorageConfig::default(),
search: SearchConfig::default(),
safety: SafetyConfig::default(),
}
}
}
impl Default for CaptureConfig {
fn default() -> Self {
Self {
fps: 1.0,
audio_chunk_secs: 30,
excluded_apps: vec![
"1Password".to_string(),
"Keychain Access".to_string(),
],
skip_private_windows: true,
}
}
}
impl Default for StorageConfig {
fn default() -> Self {
Self {
embedding_dim: 384,
hnsw_m: 32,
hnsw_ef_construction: 200,
hnsw_ef_search: 100,
dedup_threshold: 0.95,
quantization_tiers: vec![
QuantizationTier {
age_hours: 0,
method: QuantizationMethod::None,
},
QuantizationTier {
age_hours: 24,
method: QuantizationMethod::Scalar,
},
QuantizationTier {
age_hours: 168, method: QuantizationMethod::Product,
},
QuantizationTier {
age_hours: 720, method: QuantizationMethod::Binary,
},
],
}
}
}
impl Default for SearchConfig {
fn default() -> Self {
Self {
default_k: 10,
hybrid_weight: 0.7,
mmr_lambda: 0.5,
rerank_enabled: false,
}
}
}
impl Default for SafetyConfig {
fn default() -> Self {
Self {
pii_detection: true,
credit_card_redaction: true,
ssn_redaction: true,
custom_patterns: Vec::new(),
}
}
}