#![allow(missing_docs)]
use serde::Deserialize;
#[derive(Debug, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum MemoryConfig {
InMemory,
Postgres {
database_url: String,
#[serde(default)]
embedding: Option<EmbeddingConfig>,
},
}
#[derive(Debug, Clone, Deserialize)]
pub struct EmbeddingConfig {
#[serde(default = "default_embedding_provider")]
pub provider: String,
#[serde(default = "default_embedding_model")]
pub model: String,
#[serde(default = "default_embedding_api_key_env")]
pub api_key_env: String,
pub base_url: Option<String>,
pub dimension: Option<usize>,
pub cache_dir: Option<String>,
}
fn default_embedding_provider() -> String {
"none".into()
}
fn default_embedding_model() -> String {
"text-embedding-3-small".into()
}
fn default_embedding_api_key_env() -> String {
"OPENAI_API_KEY".into()
}
#[derive(Debug, Deserialize)]
pub struct KnowledgeConfig {
#[serde(default = "default_chunk_size")]
pub chunk_size: usize,
#[serde(default = "default_chunk_overlap")]
pub chunk_overlap: usize,
#[serde(default)]
pub sources: Vec<KnowledgeSourceConfig>,
}
fn default_chunk_size() -> usize {
1000
}
fn default_chunk_overlap() -> usize {
200
}
#[derive(Debug, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum KnowledgeSourceConfig {
File { path: String },
Glob { pattern: String },
Url { url: String },
}
#[derive(Debug, Deserialize)]
pub struct WorkspaceConfig {
#[serde(default = "default_workspace_root")]
pub root: String,
#[serde(default)]
pub env_allowlist: Vec<String>,
#[serde(default)]
pub protected_paths: Vec<String>,
#[serde(default)]
pub sandbox: bool,
#[serde(default)]
pub sandbox_read_paths: Vec<String>,
}
fn default_workspace_root() -> String {
let home = std::env::var("HOME").unwrap_or_else(|_| "/tmp".into());
format!("{home}/.heartbit/workspaces")
}
#[derive(Debug, Deserialize)]
pub struct RestateConfig {
pub endpoint: String,
}
#[derive(Debug, Deserialize)]
pub struct TelemetryConfig {
pub otlp_endpoint: String,
#[serde(default = "default_service_name")]
pub service_name: String,
#[serde(default)]
pub observability_mode: Option<String>,
}
fn default_service_name() -> String {
"heartbit".into()
}
#[derive(Debug, Deserialize)]
pub struct LspConfig {
#[serde(default = "default_lsp_enabled")]
pub enabled: bool,
}
fn default_lsp_enabled() -> bool {
true
}