limitdeck 0.1.7

A privacy-safe terminal dashboard for AI subscription limits
mod claude;
mod codex;
mod omp;

use std::collections::HashSet;

use crate::adapter::PlanAdapter;

pub use claude::ingest_stdin as ingest_claude_statusline;
pub use claude::ClaudeStatuslineAdapter;
pub use codex::CodexAppServerAdapter;
pub use omp::OmpCodexAdapter;

pub fn discover() -> Vec<Box<dyn PlanAdapter>> {
    let candidates: [Option<Box<dyn PlanAdapter>>; 3] = [
        ClaudeStatuslineAdapter::discover()
            .map(|adapter| Box::new(adapter) as Box<dyn PlanAdapter>),
        CodexAppServerAdapter::discover().map(|adapter| Box::new(adapter) as Box<dyn PlanAdapter>),
        OmpCodexAdapter::discover().map(|adapter| Box::new(adapter) as Box<dyn PlanAdapter>),
    ];
    let mut discovered = Vec::new();
    let mut ids = HashSet::new();
    for adapter in candidates.into_iter().flatten() {
        if ids.insert(adapter.identity().id) {
            discovered.push(adapter);
        }
    }
    discovered
}