feat(memory): lucid memory integration with optional backends (#285)

This commit is contained in:
Chummy 2026-02-17 00:31:50 +08:00 committed by GitHub
parent 04bf94443f
commit 53844f7207
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 1089 additions and 137 deletions

View file

@ -547,7 +547,7 @@ fn default_http_timeout_secs() -> u64 {
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryConfig {
/// "sqlite" | "markdown" | "none"
/// "sqlite" | "lucid" | "markdown" | "none" (`none` = explicit no-op memory)
pub backend: String,
/// Auto-save conversation context to memory
pub auto_save: bool,
@ -1618,7 +1618,6 @@ fn sync_directory(_path: &Path) -> Result<()> {
mod tests {
use super::*;
use std::path::PathBuf;
use std::sync::{Mutex, OnceLock};
use tempfile::TempDir;
// ── Defaults ─────────────────────────────────────────────
@ -2449,19 +2448,18 @@ default_temperature = 0.7
assert!(parsed.browser.allowed_domains.is_empty());
}
fn env_override_lock() -> std::sync::MutexGuard<'static, ()> {
static ENV_LOCK: OnceLock<Mutex<()>> = OnceLock::new();
ENV_LOCK
.get_or_init(|| Mutex::new(()))
// ── Environment variable overrides (Docker support) ─────────
fn env_override_test_guard() -> std::sync::MutexGuard<'static, ()> {
static ENV_OVERRIDE_TEST_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(());
ENV_OVERRIDE_TEST_LOCK
.lock()
.expect("env override test lock poisoned")
}
// ── Environment variable overrides (Docker support) ─────────
#[test]
fn env_override_api_key() {
let _guard = env_override_lock();
let _env_guard = env_override_test_guard();
let mut config = Config::default();
assert!(config.api_key.is_none());
@ -2474,7 +2472,7 @@ default_temperature = 0.7
#[test]
fn env_override_api_key_fallback() {
let _guard = env_override_lock();
let _env_guard = env_override_test_guard();
let mut config = Config::default();
std::env::remove_var("ZEROCLAW_API_KEY");
@ -2487,7 +2485,7 @@ default_temperature = 0.7
#[test]
fn env_override_provider() {
let _guard = env_override_lock();
let _env_guard = env_override_test_guard();
let mut config = Config::default();
std::env::set_var("ZEROCLAW_PROVIDER", "anthropic");
@ -2499,7 +2497,7 @@ default_temperature = 0.7
#[test]
fn env_override_provider_fallback() {
let _guard = env_override_lock();
let _env_guard = env_override_test_guard();
let mut config = Config::default();
std::env::remove_var("ZEROCLAW_PROVIDER");
@ -2512,7 +2510,7 @@ default_temperature = 0.7
#[test]
fn env_override_model() {
let _guard = env_override_lock();
let _env_guard = env_override_test_guard();
let mut config = Config::default();
std::env::set_var("ZEROCLAW_MODEL", "gpt-4o");
@ -2524,7 +2522,7 @@ default_temperature = 0.7
#[test]
fn env_override_workspace() {
let _guard = env_override_lock();
let _env_guard = env_override_test_guard();
let mut config = Config::default();
std::env::set_var("ZEROCLAW_WORKSPACE", "/custom/workspace");
@ -2536,7 +2534,7 @@ default_temperature = 0.7
#[test]
fn env_override_empty_values_ignored() {
let _guard = env_override_lock();
let _env_guard = env_override_test_guard();
let mut config = Config::default();
let original_provider = config.default_provider.clone();
@ -2549,7 +2547,7 @@ default_temperature = 0.7
#[test]
fn env_override_gateway_port() {
let _guard = env_override_lock();
let _env_guard = env_override_test_guard();
let mut config = Config::default();
assert_eq!(config.gateway.port, 3000);
@ -2562,7 +2560,7 @@ default_temperature = 0.7
#[test]
fn env_override_port_fallback() {
let _guard = env_override_lock();
let _env_guard = env_override_test_guard();
let mut config = Config::default();
std::env::remove_var("ZEROCLAW_GATEWAY_PORT");
@ -2575,7 +2573,7 @@ default_temperature = 0.7
#[test]
fn env_override_gateway_host() {
let _guard = env_override_lock();
let _env_guard = env_override_test_guard();
let mut config = Config::default();
assert_eq!(config.gateway.host, "127.0.0.1");
@ -2588,7 +2586,7 @@ default_temperature = 0.7
#[test]
fn env_override_host_fallback() {
let _guard = env_override_lock();
let _env_guard = env_override_test_guard();
let mut config = Config::default();
std::env::remove_var("ZEROCLAW_GATEWAY_HOST");
@ -2601,7 +2599,7 @@ default_temperature = 0.7
#[test]
fn env_override_temperature() {
let _guard = env_override_lock();
let _env_guard = env_override_test_guard();
let mut config = Config::default();
std::env::set_var("ZEROCLAW_TEMPERATURE", "0.5");
@ -2613,7 +2611,7 @@ default_temperature = 0.7
#[test]
fn env_override_temperature_out_of_range_ignored() {
let _guard = env_override_lock();
let _env_guard = env_override_test_guard();
// Clean up any leftover env vars from other tests
std::env::remove_var("ZEROCLAW_TEMPERATURE");
@ -2633,7 +2631,7 @@ default_temperature = 0.7
#[test]
fn env_override_invalid_port_ignored() {
let _guard = env_override_lock();
let _env_guard = env_override_test_guard();
let mut config = Config::default();
let original_port = config.gateway.port;