vv-agent 0.4.7

VectorVein agent runtime, SDK, CLI, tools, and workspace backends
Documentation
use std::collections::BTreeMap;
use std::sync::{Arc, Mutex};

use serde_json::Value;

use crate::runtime::sub_agent_sessions::SubAgentSessionListener;
use crate::runtime::{RuntimeEventHandler, RuntimeLogHandler};
use crate::types::AgentStatus;

pub(super) fn emit_sub_agent_session_event(
    listeners: &Arc<Mutex<BTreeMap<u64, SubAgentSessionListener>>>,
    event: &str,
    payload: &BTreeMap<String, Value>,
) {
    let listeners = listeners
        .lock()
        .expect("sub-agent session listeners poisoned")
        .values()
        .cloned()
        .collect::<Vec<_>>();
    for listener in listeners {
        listener(event, payload);
    }
}

pub(super) fn enrich_sub_agent_payload(
    payload: &BTreeMap<String, Value>,
    task_id: &str,
    session_id: &str,
    sub_agent_name: &str,
) -> BTreeMap<String, Value> {
    let mut enriched = payload.clone();
    enriched
        .entry("task_id".to_string())
        .or_insert_with(|| Value::String(task_id.to_string()));
    enriched
        .entry("session_id".to_string())
        .or_insert_with(|| Value::String(session_id.to_string()));
    enriched
        .entry("sub_agent_name".to_string())
        .or_insert_with(|| Value::String(sub_agent_name.to_string()));
    enriched
}

pub(super) fn emit_parent_sub_agent_event(
    parent_log_handler: &Option<RuntimeLogHandler>,
    parent_event_handler: &Option<RuntimeEventHandler>,
    event: &str,
    payload: BTreeMap<String, Value>,
) {
    if let Some(handler) = parent_log_handler {
        if let Ok(mut handler) = handler.lock() {
            handler(event, &payload);
        }
    }
    if let Some(handler) = parent_event_handler {
        handler(event, &payload);
    }
}

pub(super) fn agent_status_value(status: AgentStatus) -> &'static str {
    match status {
        AgentStatus::Pending => "pending",
        AgentStatus::Running => "running",
        AgentStatus::WaitUser => "wait_user",
        AgentStatus::Completed => "completed",
        AgentStatus::Failed => "failed",
        AgentStatus::MaxCycles => "max_cycles",
    }
}