csusage-adapter-opencode 0.0.2

Coding agent CLI usage reports (ccusage fork with Claude Science support)
use csusage_adapter_common::{
    collect_files_with_extension, filter_loaded_entries_by_date, read_files_parallel,
};
use csusage_core::*;

mod loader;
mod parser;
mod paths;
mod report;

pub use loader::load_entries;
pub use report::{report_json, summarize_entries};

use crate::{
    Result, cli::AgentCommandArgs, print_json_or_jq, print_usage_table, sort_summaries, wants_json,
};

/// Reports whether an OpenCode install has usage data, independent of the
/// requested date window.
///
/// The aggregate report lists which agents it found, and the loader narrows to
/// `--since`/`--until` as it reads, so an out-of-range query cannot answer that
/// question from the loaded entries alone.
pub fn has_data() -> bool {
    paths::paths().is_ok_and(|paths| paths.iter().any(|path| loader::has_source(path)))
}

pub fn run(args: AgentCommandArgs) -> Result<()> {
    let kind = args.kind;
    let shared = args.shared;
    let mut entries = loader::load_entries(&shared, kind)?;
    filter_loaded_entries_by_date(&mut entries, &shared);
    if wants_json(&shared) {
        return print_json_or_jq(
            report_json(&entries, kind, &shared.order)?,
            shared.jq.as_deref(),
            shared.no_cost,
        );
    }
    let mut rows = summarize_entries(&entries, kind)?;
    sort_summaries(&mut rows, &shared.order, |row| summary_period(row));
    print_usage_table(
        "OpenCode Token Usage Report",
        first_column(kind),
        &rows,
        &shared,
        false,
        None,
    )?;
    Ok(())
}