magi-code 0.96.2

Repository-aware CLI coding agent for terminal work
Documentation
use crate::{
    output::tool_display::{
        pending_tool_status, pending_tool_summary_metadata, should_show_pending_tool,
        tool_summary_metadata,
    },
    providers::ToolCall,
    tools::ToolResult,
};

use crate::output::{
    ActivityStatus, ToolDisplaySummary, ToolStatus, redact_sensitive_text, tool_display_label,
};

fn unicode_mark(status: ToolStatus) -> &'static str {
    match status {
        ToolStatus::Running | ToolStatus::Writing => "⟳",
        ToolStatus::Success => "✓",
        ToolStatus::Failure => "✗",
    }
}

fn ascii_mark(status: ToolStatus) -> &'static str {
    match status {
        ToolStatus::Running => "RUNNING",
        ToolStatus::Writing => "WRITING",
        ToolStatus::Success => "OK",
        ToolStatus::Failure => "FAIL",
    }
}

pub(crate) fn pending_tool_display_summary(call: &ToolCall) -> Option<ToolDisplaySummary> {
    if !should_show_pending_tool(call) {
        return None;
    }
    let status = pending_tool_status(call);
    let metadata = pending_tool_summary_metadata(call)
        .into_iter()
        .map(|(key, value)| (key, redact_sensitive_text(&value)))
        .collect();
    Some(ToolDisplaySummary {
        tool_name: call.name.clone(),
        status,
        unicode_mark: unicode_mark(status),
        ascii_mark: ascii_mark(status),
        label: tool_display_label(call),
        metadata,
    })
}

pub(crate) fn tool_status_label(status: ToolStatus) -> &'static str {
    match status {
        ToolStatus::Running => "running",
        ToolStatus::Writing => "writing",
        ToolStatus::Success => "success",
        ToolStatus::Failure => "failure",
    }
}

pub(crate) fn pending_activity_status(call: &ToolCall) -> ActivityStatus {
    match pending_tool_status(call) {
        ToolStatus::Writing => ActivityStatus::Writing,
        _ => ActivityStatus::Running,
    }
}

pub(crate) fn tool_display_summary(call: &ToolCall, result: &ToolResult) -> ToolDisplaySummary {
    let tool_name = if result.tool_name.is_empty() {
        call.name.clone()
    } else {
        result.tool_name.clone()
    };
    let status = if result.success {
        ToolStatus::Success
    } else {
        ToolStatus::Failure
    };
    let label = tool_display_label(call);
    let metadata = tool_summary_metadata(call, result)
        .into_iter()
        .map(|(key, value)| (key, redact_sensitive_text(&value)))
        .collect();
    ToolDisplaySummary {
        tool_name,
        status,
        unicode_mark: unicode_mark(status),
        ascii_mark: ascii_mark(status),
        label,
        metadata,
    }
}