supercode-harness 0.4.6

The optional native Supercode agent and tool harness
Documentation
//! Load a real Claude Code or Codex session log and print the normalized,
//! provider-neutral conversation — no API key required.
//!
//! ```sh
//! cargo run -p supercode-harness --example inspect_session -- \
//!   ~/.codex/sessions/2026/05/04/rollout-*.jsonl
//! ```

use supercode_harness::session::Session;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let path = std::env::args()
        .nth(1)
        .ok_or("usage: inspect_session <session.jsonl>")?;
    let session = Session::load(&path)?;

    println!("source     : {:?}", session.meta.source);
    println!(
        "session_id : {}",
        session.meta.session_id.as_deref().unwrap_or("?")
    );
    println!(
        "model      : {}",
        session.meta.model.as_deref().unwrap_or("?")
    );
    println!("messages   : {}\n", session.messages.len());

    for (i, m) in session.messages.iter().enumerate() {
        let preview = m
            .content
            .as_deref()
            .map(|c| {
                c.lines()
                    .next()
                    .unwrap_or("")
                    .chars()
                    .take(80)
                    .collect::<String>()
            })
            .unwrap_or_default();
        let calls = m.tool_calls();
        let suffix = if calls.is_empty() {
            String::new()
        } else {
            format!("  [{} tool call(s)]", calls.len())
        };
        println!("{i:>3} {:<9} {preview}{suffix}", format!("{:?}", m.role));
    }
    Ok(())
}