supercode-reduce 0.4.12

Optional lossless, reversible session reduction for Supercode
Documentation
use std::path::PathBuf;
use std::time::{SystemTime, UNIX_EPOCH};

use supercode_interchange::ChatMessage;
use supercode_reduce::{invert_messages, project_messages, ReductionLog, ReductionPolicy};

fn unique_temp_file(label: &str) -> PathBuf {
    let nonce = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .unwrap()
        .as_nanos();
    std::env::temp_dir().join(format!(
        "supercode-reduce-{label}-{}-{nonce}.json",
        std::process::id()
    ))
}

#[test]
fn reduction_log_and_canonical_sidecar_invert_after_disk_reload() {
    let original = vec![ChatMessage::tool_result(
        "call-1",
        "shell",
        "byte-exact-output\n".repeat(2_000),
    )];
    let policy = ReductionPolicy {
        tool_output_trigger_bytes: 128,
        tool_output_keep_bytes: 32,
        protect_last_n_tool_results: 0,
        ..ReductionPolicy::default()
    };

    let (reduced, log) = project_messages(&original, &policy, &ReductionLog::default());
    assert!(!log.reductions.is_empty());
    assert!(
        reduced[0].content.as_ref().unwrap().len() < original[0].content.as_ref().unwrap().len()
    );

    let sidecar_path = unique_temp_file("sidecar");
    let log_path = unique_temp_file("log");
    std::fs::write(&sidecar_path, serde_json::to_vec(&original).unwrap()).unwrap();
    std::fs::write(&log_path, serde_json::to_vec(&log).unwrap()).unwrap();

    let reloaded_sidecar: Vec<ChatMessage> =
        serde_json::from_slice(&std::fs::read(&sidecar_path).unwrap()).unwrap();
    let reloaded_log: ReductionLog =
        serde_json::from_slice(&std::fs::read(&log_path).unwrap()).unwrap();
    let restored = invert_messages(&reduced, &reloaded_log, &reloaded_sidecar).unwrap();

    assert_eq!(restored, original);
    std::fs::remove_file(sidecar_path).unwrap();
    std::fs::remove_file(log_path).unwrap();
}