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,
}
}