diff --git a/Cargo.lock b/Cargo.lock index 303118e8..73ba5baf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3792,7 +3792,7 @@ dependencies = [ [[package]] name = "openfang-api" -version = "0.3.44" +version = "0.3.46" dependencies = [ "async-trait", "axum", @@ -3829,7 +3829,7 @@ dependencies = [ [[package]] name = "openfang-channels" -version = "0.3.44" +version = "0.3.46" dependencies = [ "async-trait", "axum", @@ -3861,7 +3861,7 @@ dependencies = [ [[package]] name = "openfang-cli" -version = "0.3.44" +version = "0.3.46" dependencies = [ "clap", "clap_complete", @@ -3888,7 +3888,7 @@ dependencies = [ [[package]] name = "openfang-desktop" -version = "0.3.44" +version = "0.3.46" dependencies = [ "axum", "open", @@ -3914,7 +3914,7 @@ dependencies = [ [[package]] name = "openfang-extensions" -version = "0.3.44" +version = "0.3.46" dependencies = [ "aes-gcm", "argon2", @@ -3942,7 +3942,7 @@ dependencies = [ [[package]] name = "openfang-hands" -version = "0.3.44" +version = "0.3.46" dependencies = [ "chrono", "dashmap", @@ -3959,7 +3959,7 @@ dependencies = [ [[package]] name = "openfang-kernel" -version = "0.3.44" +version = "0.3.46" dependencies = [ "async-trait", "chrono", @@ -3996,7 +3996,7 @@ dependencies = [ [[package]] name = "openfang-memory" -version = "0.3.44" +version = "0.3.46" dependencies = [ "async-trait", "chrono", @@ -4015,7 +4015,7 @@ dependencies = [ [[package]] name = "openfang-migrate" -version = "0.3.44" +version = "0.3.46" dependencies = [ "chrono", "dirs 6.0.0", @@ -4034,7 +4034,7 @@ dependencies = [ [[package]] name = "openfang-runtime" -version = "0.3.44" +version = "0.3.46" dependencies = [ "anyhow", "async-trait", @@ -4068,7 +4068,7 @@ dependencies = [ [[package]] name = "openfang-skills" -version = "0.3.44" +version = "0.3.46" dependencies = [ "chrono", "hex", @@ -4091,7 +4091,7 @@ dependencies = [ [[package]] name = "openfang-types" -version = "0.3.44" +version = "0.3.46" dependencies = [ "async-trait", "chrono", @@ -4110,7 +4110,7 @@ dependencies = [ [[package]] name = "openfang-wire" -version = "0.3.44" +version = "0.3.46" dependencies = [ "async-trait", "chrono", @@ -8773,7 +8773,7 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xtask" -version = "0.3.44" +version = "0.3.46" [[package]] name = "yoke" diff --git a/Cargo.toml b/Cargo.toml index b84e92b1..e20dedf1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ members = [ ] [workspace.package] -version = "0.3.45" +version = "0.3.46" edition = "2021" license = "Apache-2.0 OR MIT" repository = "https://github.com/RightNow-AI/openfang" diff --git a/crates/openfang-api/src/channel_bridge.rs b/crates/openfang-api/src/channel_bridge.rs index bf95f398..42b8587c 100644 --- a/crates/openfang-api/src/channel_bridge.rs +++ b/crates/openfang-api/src/channel_bridge.rs @@ -56,6 +56,8 @@ use std::sync::Arc; use std::time::{Duration, Instant}; use tracing::{error, info, warn}; +use openfang_runtime::str_utils::safe_truncate_str; + /// Wraps `OpenFangKernel` to implement `ChannelBridgeHandle`. pub struct KernelBridgeAdapter { kernel: Arc, @@ -378,7 +380,8 @@ impl ChannelBridgeHandle for KernelBridgeAdapter { .map(|e| e.name.clone()) .unwrap_or_else(|| t.agent_id.to_string()); let status = if t.enabled { "on" } else { "off" }; - let id_short = &t.id.0.to_string()[..8]; + let id_str = t.id.0.to_string(); + let id_short = safe_truncate_str(&id_str, 8); msg.push_str(&format!( " [{}] {} -> {} ({:?}) fires:{} [{}]\n", id_short, @@ -417,7 +420,8 @@ impl ChannelBridgeHandle for KernelBridgeAdapter { .kernel .triggers .register(agent.id, pattern, prompt.to_string(), 0); - let id_short = &trigger_id.0.to_string()[..8]; + let id_str = trigger_id.0.to_string(); + let id_short = safe_truncate_str(&id_str, 8); format!("Trigger created [{id_short}] for agent '{agent_name}'.") } @@ -432,7 +436,8 @@ impl ChannelBridgeHandle for KernelBridgeAdapter { 1 => { let t = matched[0]; if self.kernel.triggers.remove(t.id) { - format!("Trigger [{}] removed.", &t.id.0.to_string()[..8]) + let id_str = t.id.0.to_string(); + format!("Trigger [{}] removed.", safe_truncate_str(&id_str, 8)) } else { "Failed to remove trigger.".to_string() } @@ -455,7 +460,8 @@ impl ChannelBridgeHandle for KernelBridgeAdapter { .map(|e| e.name.clone()) .unwrap_or_else(|| job.agent_id.to_string()); let status = if job.enabled { "on" } else { "off" }; - let id_short = &job.id.0.to_string()[..8]; + let id_str = job.id.0.to_string(); + let id_short = safe_truncate_str(&id_str, 8); let sched = match &job.schedule { openfang_types::scheduler::CronSchedule::Cron { expr, .. } => expr.clone(), openfang_types::scheduler::CronSchedule::Every { every_secs } => { @@ -515,7 +521,8 @@ impl ChannelBridgeHandle for KernelBridgeAdapter { match self.kernel.cron_scheduler.add_job(job, false) { Ok(id) => { - let id_short = &id.0.to_string()[..8]; + let id_str = id.0.to_string(); + let id_short = safe_truncate_str(&id_str, 8); format!("Job [{id_short}] created: '{cron_expr}' -> {agent_name}: \"{message}\"") } Err(e) => format!("Failed to create job: {e}"), @@ -537,7 +544,8 @@ impl ChannelBridgeHandle for KernelBridgeAdapter { let j = matched[0]; match self.kernel.cron_scheduler.remove_job(j.id) { Ok(_) => { - format!("Job [{}] '{}' removed.", &j.id.0.to_string()[..8], j.name) + let id_str = j.id.0.to_string(); + format!("Job [{}] '{}' removed.", safe_truncate_str(&id_str, 8), j.name) } Err(e) => format!("Failed to remove job: {e}"), } @@ -569,7 +577,8 @@ impl ChannelBridgeHandle for KernelBridgeAdapter { }; match self.kernel.send_message(j.agent_id, &message).await { Ok(result) => { - let id_short = &j.id.0.to_string()[..8]; + let id_str = j.id.0.to_string(); + let id_short = safe_truncate_str(&id_str, 8); format!("Job [{id_short}] ran:\n{}", result.response) } Err(e) => format!("Failed to run job: {e}"), @@ -589,7 +598,8 @@ impl ChannelBridgeHandle for KernelBridgeAdapter { } let mut msg = format!("Pending approvals ({}):\n", pending.len()); for req in &pending { - let id_short = &req.id.to_string()[..8]; + let id_str = req.id.to_string(); + let id_short = safe_truncate_str(&id_str, 8); let age_secs = (chrono::Utc::now() - req.requested_at).num_seconds(); let age = if age_secs >= 60 { format!("{}m", age_secs / 60) @@ -630,10 +640,11 @@ impl ChannelBridgeHandle for KernelBridgeAdapter { ) { Ok(_) => { let verb = if approve { "Approved" } else { "Rejected" }; + let id_str = req.id.to_string(); format!( "{} [{}] {} — {}", verb, - &req.id.to_string()[..8], + safe_truncate_str(&id_str, 8), req.tool_name, req.agent_id ) diff --git a/crates/openfang-api/static/index_body.html b/crates/openfang-api/static/index_body.html index a57e8e87..e2d6fb90 100644 --- a/crates/openfang-api/static/index_body.html +++ b/crates/openfang-api/static/index_body.html @@ -736,7 +736,7 @@