supercode-core 0.2.1

A lightweight, fully-customizable AI coding agent SDK in Rust. Talks to any model via OpenRouter or any OpenAI-compatible endpoint.
Documentation
use std::path::{Path, PathBuf};

use supercode::audit::{audit_dir, Corpus, Coverage};
use supercode::{Role, Session};

fn fixture(name: &str) -> PathBuf {
    Path::new(env!("CARGO_MANIFEST_DIR"))
        .join("tests/fixtures/grok_audit")
        .join(name)
}

#[test]
fn grok_user_audit_matches_the_loaders_replay_boundary() {
    let report = audit_dir(&fixture("."), Corpus::Grok, None);

    assert_eq!(report.files, 1, "ACP updates are not transcript records");
    assert_eq!(report.parse_errors, 0);

    assert_eq!(report.records["user"].0, Coverage::Normalized);
    assert_eq!(report.records["user"].1.count, 3);
    assert_eq!(report.records["user/system_event"].0, Coverage::Normalized);
    assert_eq!(
        report.records["user/injected_context:user_info"].0,
        Coverage::Dropped
    );
    assert_eq!(
        report.records["user/injected_context:system-reminder"].0,
        Coverage::Dropped
    );
    assert_eq!(report.records["user/empty"].0, Coverage::Dropped);
    assert_eq!(report.records["user/empty_query"].0, Coverage::Dropped);

    // Content inherits the record's replay outcome. These were the original
    // false positives: their text blocks used to say `Normalized` even
    // though the loader discarded the containing generated-context turn.
    assert_eq!(
        report.records["user/injected_context:user_info/content/text"].0,
        Coverage::Dropped
    );
    assert_eq!(
        report.records["user/injected_context:system-reminder/content"].0,
        Coverage::Dropped
    );
    assert_eq!(report.records["user/content/text"].0, Coverage::Normalized);
    assert_eq!(report.records["user/content"].0, Coverage::Normalized);
    assert_eq!(
        report.records["user/content/<no-type>"].0,
        Coverage::Normalized
    );

    let text = std::fs::read_to_string(fixture("chat_history.jsonl")).unwrap();
    let loaded = Session::from_grok_str(&text).unwrap();
    assert_eq!(loaded.messages.len(), 4);
    assert_eq!(
        loaded
            .messages
            .iter()
            .filter(|message| message.role == Role::User)
            .count(),
        3
    );
    assert_eq!(
        loaded
            .messages
            .iter()
            .filter(|message| message.role == Role::System)
            .count(),
        1
    );
}

#[test]
fn malformed_or_unknown_user_content_is_not_overclaimed() {
    let root = std::env::temp_dir().join(format!(
        "supercode-grok-audit-unknown-{}",
        std::process::id()
    ));
    std::fs::create_dir_all(&root).unwrap();
    std::fs::write(
        root.join("chat_history.jsonl"),
        concat!(
            r#"{"type":"user","content":[{"type":"image","data":"opaque"}]}"#,
            "\n",
            r#"{"type":"user"}"#,
            "\n",
        ),
    )
    .unwrap();

    let report = audit_dir(&root, Corpus::Grok, None);
    // Neither record produces a replayable human turn. The unknown image is
    // under an empty/dropped record, so it is raw-only rather than falsely
    // advertised as a normalized content block.
    assert_eq!(report.records["user/empty"].0, Coverage::Dropped);
    assert_eq!(report.records["user/empty"].1.count, 2);
    assert_eq!(
        report.records["user/empty/content/image"].0,
        Coverage::Dropped
    );
    assert_eq!(
        report.records["user/empty/content:<missing>"].0,
        Coverage::Dropped
    );

    std::fs::remove_dir_all(root).ok();
}