From 0944ecc43ff4a7d132d10d805e6c790c27c70ef4 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Thu, 19 Mar 2026 11:21:30 -0400 Subject: [PATCH] daemon: verbose pool logging, DAEMON_POOL for run_job Store resource pool in OnceLock so run_job can pass it to Daemon::run_job for pool state logging. Verbose logging enabled via POC_MEMORY_VERBOSE=1 env var. LLM backend selection and spawn-site pool state now use verbose log level to keep daemon.log clean in production. Co-Authored-By: Claude Opus 4.6 (1M context) --- poc-memory/src/agents/daemon.rs | 22 +++++++++++++++++++--- poc-memory/src/agents/llm.rs | 4 ++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/poc-memory/src/agents/daemon.rs b/poc-memory/src/agents/daemon.rs index 69aadb7..203a665 100644 --- a/poc-memory/src/agents/daemon.rs +++ b/poc-memory/src/agents/daemon.rs @@ -37,11 +37,19 @@ pub fn log_event_pub(job: &str, event: &str, detail: &str) { log_event(job, event, detail); } +/// Verbose log — only written if verbose logging is enabled. +pub fn log_verbose(job: &str, event: &str, detail: &str) { + jobkit::daemon::event_log::verbose(&crate::config::get().data_dir, job, event, detail); +} + // --- Job functions (direct, no subprocess) --- +static DAEMON_POOL: std::sync::OnceLock> = std::sync::OnceLock::new(); + /// Run a named job with logging, progress reporting, and error mapping. fn run_job(ctx: &ExecutionContext, name: &str, f: impl FnOnce() -> Result<(), String>) -> Result<(), TaskError> { - jobkit::daemon::Daemon::run_job(&crate::config::get().data_dir, ctx, name, f) + let pool = DAEMON_POOL.get().map(|p| p.as_ref()); + jobkit::daemon::Daemon::run_job(&crate::config::get().data_dir, ctx, name, pool, f) } // experience_mine and fact_mine removed — observation.agent handles all transcript mining @@ -635,9 +643,15 @@ pub fn run_daemon() -> Result<(), String> { let choir = Arc::clone(&daemon.choir); let llm = Arc::clone(&daemon.resource); + let _ = DAEMON_POOL.set(Arc::clone(&llm)); let task_log_dir = config.data_dir.join("logs"); let _ = fs::create_dir_all(&task_log_dir); + // Enable verbose logging if POC_MEMORY_VERBOSE is set + if std::env::var("POC_MEMORY_VERBOSE").is_ok() { + jobkit::daemon::event_log::set_level(jobkit::daemon::event_log::LogLevel::Verbose); + } + // Recover last_daily from previous status file let last_daily: Arc>> = Arc::new(Mutex::new( jobkit::daemon::status::load::(&config.data_dir) @@ -1107,8 +1121,10 @@ pub fn run_daemon() -> Result<(), String> { let agent = agent_type.to_string(); let key = key.clone(); let task_name = format!("c-{}-{}:{}", agent, key.chars().take(30).collect::(), today); - log_event("daemon", "spawn-targeted", - &format!("{} (available slots: {})", task_name, llm_rpc.available())); + if jobkit::daemon::event_log::enabled(jobkit::daemon::event_log::LogLevel::Verbose) { + log_event("daemon", "spawn-targeted", + &format!("{} (pool: {}/{})", task_name, llm_rpc.available(), llm_rpc.capacity())); + } choir_rpc.spawn(task_name) .resource(&llm_rpc) .log_dir(&log_dir_rpc) diff --git a/poc-memory/src/agents/llm.rs b/poc-memory/src/agents/llm.rs index dd4e685..506aa64 100644 --- a/poc-memory/src/agents/llm.rs +++ b/poc-memory/src/agents/llm.rs @@ -189,12 +189,12 @@ pub(crate) fn call_haiku(agent: &str, prompt: &str) -> Result { pub(crate) fn call_for_def(def: &super::defs::AgentDef, prompt: &str) -> Result { let config = crate::config::get(); if config.api_base_url.is_some() && !def.tools.is_empty() { - super::daemon::log_event_pub(&def.agent, "llm-backend", + super::daemon::log_verbose(&def.agent, "llm-backend", &format!("API: {}", config.api_base_url.as_deref().unwrap_or("?"))); let log = |msg: &str| eprintln!("[{}] {}", def.agent, msg); super::api::call_api_with_tools_sync(&def.agent, prompt, &log) } else { - super::daemon::log_event_pub(&def.agent, "llm-backend", + super::daemon::log_verbose(&def.agent, "llm-backend", &format!("claude -p (model={}, tools={})", def.model, def.tools.len())); call_model_with_tools(&def.agent, &def.model, prompt, &def.tools) }