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
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;