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) <noreply@anthropic.com>
This commit is contained in:
Kent Overstreet 2026-03-19 11:21:30 -04:00
parent 49f72cdac3
commit 0944ecc43f
2 changed files with 21 additions and 5 deletions

View file

@ -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<Arc<jobkit::ResourcePool>> = 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<Mutex<Option<chrono::NaiveDate>>> = Arc::new(Mutex::new(
jobkit::daemon::status::load::<DaemonStatus>(&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::<String>(), 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)

View file

@ -189,12 +189,12 @@ pub(crate) fn call_haiku(agent: &str, prompt: &str) -> Result<String, String> {
pub(crate) fn call_for_def(def: &super::defs::AgentDef, prompt: &str) -> Result<String, String> {
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)
}