vv-agent 0.7.0

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

use crate::model::ModelRef;
use crate::types::Metadata;

#[derive(Clone, Default)]
pub struct RunContext {
    pub run_id: String,
    pub agent_name: String,
    pub model: Option<ModelRef>,
    pub workspace: Option<PathBuf>,
    pub metadata: Metadata,
    pub app_state: Option<Arc<dyn std::any::Any + Send + Sync>>,
}

impl RunContext {
    pub fn app_state<T: Send + Sync + 'static>(&self) -> Option<&T> {
        self.app_state.as_ref()?.downcast_ref::<T>()
    }
}

#[derive(Clone)]
pub struct ToolCallContext {
    pub run: RunContext,
    pub tool_call_id: String,
    pub tool_name: String,
    pub raw_arguments: serde_json::Value,
    pub idempotency_key: Option<String>,
    pub metadata: Metadata,
    pub app_state: Option<Arc<dyn std::any::Any + Send + Sync>>,
    pub shared_state: Arc<Mutex<Metadata>>,
}

impl ToolCallContext {
    pub fn app_state<T: Send + Sync + 'static>(&self) -> Option<&T> {
        self.app_state.as_ref()?.downcast_ref::<T>()
    }

    pub fn shared_state_snapshot(&self) -> Metadata {
        self.shared_state
            .lock()
            .unwrap_or_else(std::sync::PoisonError::into_inner)
            .clone()
    }

    pub fn shared_state_value(&self, key: &str) -> Option<serde_json::Value> {
        self.shared_state
            .lock()
            .unwrap_or_else(std::sync::PoisonError::into_inner)
            .get(key)
            .cloned()
    }

    pub fn set_shared_state_value(
        &self,
        key: impl Into<String>,
        value: serde_json::Value,
    ) -> Option<serde_json::Value> {
        self.shared_state
            .lock()
            .unwrap_or_else(std::sync::PoisonError::into_inner)
            .insert(key.into(), value)
    }

    pub fn remove_shared_state_value(&self, key: &str) -> Option<serde_json::Value> {
        self.shared_state
            .lock()
            .unwrap_or_else(std::sync::PoisonError::into_inner)
            .remove(key)
    }
}