mentra 0.6.0

An agent runtime for tool-using LLM applications
Documentation
use crate::{
    ContentBlock,
    runtime::Agent,
    tool::{ToolCall, ToolContext, ToolResult, internal::content_block_to_tool_result},
};
use strum::VariantArray;

use super::{TaskIntrinsicTool, descriptor::task_intrinsic_descriptor};

pub(super) fn execute_mut(
    tool: TaskIntrinsicTool,
    ctx: ToolContext<'_>,
    input: serde_json::Value,
) -> ToolResult {
    let call = ToolCall {
        id: ctx.tool_call_id.clone(),
        name: task_intrinsic_descriptor(tool).provider.name,
        input,
    };
    let Some(result) = execute_intrinsic(ctx.agent, call) else {
        return Err("Task intrinsic is not available".to_string());
    };
    content_block_to_tool_result("Task intrinsic", result)
}

pub(super) fn execute_intrinsic(agent: &mut Agent, call: ToolCall) -> Option<ContentBlock> {
    let tool = TaskIntrinsicTool::VARIANTS
        .iter()
        .find(|tool| task_intrinsic_descriptor(**tool).provider.name == call.name)?;

    let output = agent.execute_task_mutation(tool, call.input);

    Some(match output {
        Ok(content) => match agent.refresh_tasks_from_disk() {
            Ok(()) => ContentBlock::ToolResult {
                tool_use_id: call.id,
                content: content.into(),
                is_error: false,
            },
            Err(error) => ContentBlock::ToolResult {
                tool_use_id: call.id,
                content: format!("Task refresh failed: {error}").into(),
                is_error: true,
            },
        },
        Err(content) => ContentBlock::ToolResult {
            tool_use_id: call.id,
            content: content.into(),
            is_error: true,
        },
    })
}