opencode-stats 1.3.5

A terminal dashboard for OpenCode usage statistics inspired by the /stats command in Claude Code
use crate::analytics::weekly::WeeklyUsage;
use crate::db::models::TokenUsage;
use crate::utils::pricing::PriceSummary;
use crate::utils::time::month_start;
use chrono::NaiveDate;

#[derive(Clone, Debug)]
pub struct MonthlyUsage {
    pub tokens: TokenUsage,
    pub interactions: usize,
    pub cost: PriceSummary,
}

pub fn aggregate_monthly(weekly: &[WeeklyUsage]) -> Vec<MonthlyUsage> {
    let mut grouped = std::collections::BTreeMap::<NaiveDate, MonthlyUsage>::new();
    for week in weekly {
        let bucket = month_start(week.start_date);
        let entry = grouped.entry(bucket).or_insert_with(|| MonthlyUsage {
            tokens: TokenUsage::default(),
            interactions: 0,
            cost: PriceSummary::default(),
        });
        entry.tokens.add_assign(&week.tokens);
        entry.interactions += week.interactions;
        entry.cost.merge(&week.cost);
    }

    grouped.into_values().collect()
}