/** * adapter.ts — WatcherAdapter interface + factory para Multi-CLI support * * Cada CLI coding (Claude Code, Codex, OpenCode, etc.) tiene su propio * formato de trazas y ubicación de archivos. Este adapter pattern permite * que claudestat las soporte todas con una interfaz común. */ import type { CostUpdate } from '../db'; export interface ParsedEvent { sessionId: string; type: string; toolName?: string; toolInput?: string; ts: number; cwd?: string; } export interface WatcherAdapter { /** Nombre único del CLI (claude-code, codex, opencode, etc.) */ readonly name: string; /** Label legible mostrado en UI */ readonly label: string; /** Detecta si este CLI está instalado y tiene trazas disponibles */ detect(): boolean; /** Directorios/glob a observar con chokidar */ getWatchPaths(): string[]; /** Parsea una línea de traza en un ParsedEvent */ parseEvent(raw: string, filePath: string): ParsedEvent | null; /** Lee y calcula costos acumulados de un archivo de sesión */ getSessionCost(filePath: string): Promise; /** Nombre amigable para el badge de la CLI (ej: "CC", "Codex") */ get shortName(): string; } export interface PollSession { sessionId: string; cost: CostUpdate; cwd?: string; } /** Adapters que no usan archivos JSONL sino una DB o API propia */ export interface PollableAdapter extends WatcherAdapter { /** Devuelve sesiones actualizadas desde `since` (epoch ms) */ pollSessions(since: number): Promise; } export declare function isPollable(adapter: WatcherAdapter): adapter is PollableAdapter; export declare function registerAdapter(adapter: WatcherAdapter): void; export declare function getAdapter(name: string): WatcherAdapter | undefined; export declare function getAllAdapters(): WatcherAdapter[]; export declare function getActiveAdapters(): WatcherAdapter[]; export declare function getAdapterNames(): string[];