magi-code 0.77.1

Repository-aware CLI coding agent for terminal work
Documentation
use super::canonical_json;
use crate::providers::ProviderConversationItem;

pub(crate) fn conversation_cache_material(
    provider: &str,
    model: &str,
    system_prompt: &str,
    conversation_items: &[ProviderConversationItem],
) -> String {
    let mut data = String::new();
    push_material_field(&mut data, "provider", provider);
    push_material_field(&mut data, "model", model);
    push_material_field(&mut data, "system_prompt", system_prompt);
    for item in conversation_items {
        match item {
            ProviderConversationItem::Message(message) => {
                push_material_field(&mut data, "item", "message");
                push_material_field(&mut data, "role", message.role.as_api_str());
                push_material_field(&mut data, "content", &message.content);
            }
            ProviderConversationItem::ResponseItem(value) => {
                push_material_field(&mut data, "item", "response_item");
                push_material_field(&mut data, "value", &canonical_json(value));
            }
            ProviderConversationItem::ToolResult(result) => {
                push_material_field(&mut data, "item", "tool_result");
                push_material_field(&mut data, "call_id", &result.call_id);
                push_material_field(&mut data, "tool_name", &result.tool_name);
                push_material_field(&mut data, "success", &result.success.to_string());
                push_material_field(&mut data, "output", &result.output);
            }
            ProviderConversationItem::LegacyReplayNote {
                event_type,
                content,
            } => {
                push_material_field(&mut data, "item", "legacy_replay_note");
                push_material_field(&mut data, "event_type", event_type);
                push_material_field(&mut data, "content", content);
            }
        }
    }
    data
}

fn push_material_field(data: &mut String, key: &str, value: &str) {
    data.push_str(key);
    data.push('=');
    data.push_str(&value.len().to_string());
    data.push(':');
    data.push_str(value);
    data.push('\n');
}