systemprompt-agent 0.1.22

Core Agent protocol module for systemprompt.io
Documentation
use anyhow::{Result, anyhow};
use std::fmt;
use systemprompt_identifiers::{ContextId, TaskId};
use systemprompt_models::ai::tools::CallToolResult;
use systemprompt_traits::validation::Validate;

use super::artifact_transformer::McpToA2aTransformer;

#[derive(Debug)]
pub struct ProcessToolResultParams<'a> {
    pub tool_name: &'a str,
    pub tool_result: &'a CallToolResult,
    pub output_schema: Option<&'a serde_json::Value>,
    pub tool_arguments: Option<&'a serde_json::Value>,
    pub task_id: &'a TaskId,
    pub context_id: &'a ContextId,
    pub context: &'a systemprompt_models::RequestContext,
}

#[derive(Clone, Copy)]
pub struct ToolResultHandler;

impl fmt::Debug for ToolResultHandler {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_struct("ToolResultHandler").finish_non_exhaustive()
    }
}

impl Default for ToolResultHandler {
    fn default() -> Self {
        Self::new()
    }
}

impl ToolResultHandler {
    pub const fn new() -> Self {
        Self
    }

    pub fn process_tool_result(
        params: &ProcessToolResultParams<'_>,
    ) -> Result<crate::models::a2a::Artifact> {
        let ProcessToolResultParams {
            tool_name,
            tool_result,
            output_schema,
            tool_arguments,
            task_id,
            context_id,
            context,
        } = params;
        if !context.is_authenticated() || context.is_system() {
            return Err(anyhow!(
                "Invalid user - unauthenticated and system users cannot create artifacts"
            ));
        }

        tracing::info!(
            tool_name = %tool_name,
            task_id = %task_id,
            user_id = %context.user_id(),
            context_id = %context_id,
            "Transforming tool result to artifact"
        );

        let artifact =
            McpToA2aTransformer::transform(&super::artifact_transformer::TransformParams {
                tool_name,
                tool_result,
                output_schema: *output_schema,
                context_id: context_id.as_str(),
                task_id: task_id.as_str(),
                tool_arguments: *tool_arguments,
            })
            .map_err(|e| anyhow::anyhow!("Artifact transform failed: {}", e))?;

        artifact
            .metadata
            .validate()
            .map_err(|e| anyhow::anyhow!("Artifact metadata validation failed: {}", e))?;

        tracing::info!(
            artifact_id = %artifact.id,
            tool_name = %tool_name,
            user_id = %context.user_id(),
            task_id = %task_id,
            fingerprint = ?artifact.metadata.fingerprint,
            "Transformed tool result to artifact"
        );

        Ok(artifact)
    }
}