magi-code 0.64.0

Repository-aware CLI coding agent for terminal work
Documentation
use serde::{Deserialize, Serialize};
use serde_json::Value;

#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
pub struct ToolResultDisplay {
    #[serde(default, skip_serializing, skip_deserializing)]
    pub edit_diff: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ToolResult {
    pub tool_name: String,
    pub success: bool,
    pub content: String,
    pub metadata: Value,
    #[serde(default, skip_serializing, skip_deserializing)]
    pub display: ToolResultDisplay,
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn display_diff_never_enters_serialized_or_hydrated_tool_result() {
        let result = ToolResult {
            tool_name: "hash_edit".to_string(),
            success: true,
            content: "raw result".to_string(),
            metadata: serde_json::json!({"files_changed": 1}),
            display: ToolResultDisplay {
                edit_diff: Some("SECRET DISPLAY DIFF".to_string()),
            },
        };

        let serialized = serde_json::to_string(&result).unwrap();
        assert!(!serialized.contains("display"), "{serialized}");
        assert!(!serialized.contains("SECRET DISPLAY DIFF"), "{serialized}");
        let hydrated: ToolResult = serde_json::from_str(&serialized).unwrap();
        assert_eq!(hydrated.content, "raw result");
        assert_eq!(hydrated.display, ToolResultDisplay::default());
    }
}