mentra 0.6.0

An agent runtime for tool-using LLM applications
Documentation
use serde_json::Value;

use crate::ContentBlock;

use super::{
    RuntimeToolDescriptor, ToolApprovalCategory, ToolCapability, ToolDurability,
    ToolExecutionCategory, ToolResult, ToolSideEffectLevel,
};

pub(crate) struct RuntimeDescriptorParts {
    pub(crate) name: String,
    pub(crate) description: String,
    pub(crate) input_schema: Value,
    pub(crate) capabilities: Vec<ToolCapability>,
    pub(crate) side_effect_level: ToolSideEffectLevel,
    pub(crate) durability: ToolDurability,
    pub(crate) execution_category: ToolExecutionCategory,
    pub(crate) approval_category: ToolApprovalCategory,
}

pub(crate) fn build_runtime_descriptor(parts: RuntimeDescriptorParts) -> RuntimeToolDescriptor {
    RuntimeToolDescriptor::builder(parts.name)
        .description(parts.description)
        .input_schema(parts.input_schema)
        .capabilities(parts.capabilities)
        .side_effect_level(parts.side_effect_level)
        .durability(parts.durability)
        .execution_category(parts.execution_category)
        .approval_category(parts.approval_category)
        .build()
}

pub(crate) fn content_block_to_tool_result(surface: &str, block: ContentBlock) -> ToolResult {
    match block {
        ContentBlock::ToolResult {
            content, is_error, ..
        } => {
            if is_error {
                Err(content.to_display_string())
            } else {
                Ok(content.to_display_string())
            }
        }
        _ => Err(format!("{surface} returned an unexpected content block")),
    }
}