mentra 0.5.0

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

use crate::tool::ToolExecutionCategory;

use super::schema::{FileOperation, FilesInput};

pub(crate) fn parse_files_input(input: &Value) -> Result<FilesInput, String> {
    serde_json::from_value::<FilesInput>(input.clone())
        .map_err(|error| format!("Invalid files input: {error}"))
}

pub(crate) fn ensure_files_have_operations(input: &FilesInput) -> Result<(), String> {
    if input.operations.is_empty() {
        Err("At least one file operation is required".to_string())
    } else {
        Ok(())
    }
}

pub(crate) fn file_execution_category(input: &Value) -> ToolExecutionCategory {
    let Ok(input) = parse_files_input(input) else {
        return ToolExecutionCategory::ExclusiveLocalMutation;
    };

    if input.operations.iter().all(FileOperation::is_read_only) {
        ToolExecutionCategory::ReadOnlyParallel
    } else {
        ToolExecutionCategory::ExclusiveLocalMutation
    }
}