flightrec 0.2.2

Git-like filesystem observability for AI agents
Documentation
use anyhow::Result;

use crate::{diff, storage};

pub fn run(diff_id: String, format: String) -> Result<()> {
    let event = storage::load_diff(&diff_id)?;
    match format.as_str() {
        "json" => println!("{}", serde_json::to_string_pretty(&event)?),
        _ => {
            println!("# Diff Report: {}", diff_id);
            println!("**From:** `{}`", event.from_snapshot_id);
            println!("**To:** `{}`", event.to_snapshot_id);
            println!("**At:** {}", event.created_at);
            println!("**Changes:** {}\n", event.changes.len());
            for c in &event.changes {
                let icon = match c.change_type {
                    diff::ChangeType::Added => "",
                    diff::ChangeType::Removed => "",
                    diff::ChangeType::Modified => "✏️ ",
                    diff::ChangeType::Renamed => "🔀",
                };
                print!("{} `{}`", icon, c.path);
                if let Some(ref rf) = c.renamed_from {
                    print!(" ← `{}`", rf);
                }
                if let Some(ref dt) = c.diff_text {
                    print!(" ({})", dt);
                }
                println!();
            }
            if let Some(ref summary) = event.summary {
                println!(
                    "\n## LLM Summary ({}  {}  {})",
                    summary.llm_provider, summary.model, summary.generated_at
                );
                println!("\n{}\n", summary.short);
                if !summary.actions.is_empty() {
                    println!("**Actions:**");
                    for action in &summary.actions {
                        println!("- {}", action);
                    }
                }
                if let Some(ref intent) = summary.intent_guess {
                    println!("\n**Intent:** {}", intent);
                }
            }
        }
    }
    Ok(())
}