import { EventEmitter } from 'events'; import type { SessionDayStats, ProtocolStats, DailyStats, Protocol, RequestCompleteEvent, RequestLogEntry } from './stats-types'; export declare const sessionStats: { requestCount: number; totalPromptTokens: number; totalCompletionTokens: number; retries: number; errors: number; startTime: number; protocols: Record; byDate: Record; }; export declare function resetSessionStats(): void; export declare const dailyStats: DailyStats; export declare function isDailyStatsDirty(): boolean; export declare function setDailyStatsDirty(dirty: boolean): void; export declare function resetDailyStatsFields(date: string): void; export declare function formatDate(d: Date): string; export declare function todayStr(): string; export declare const statsEmitter: EventEmitter<[never]>; export declare function setRolloverFn(fn: (() => void) | null, force?: boolean): void; export declare function setSaveFn(fn: ((stats: DailyStats) => void) | null, force?: boolean): void; export declare function incrementProtocolStats(stats: { protocols: Record; }, protocol: string, delta: Partial): void; export declare function requestStarted(): void; export declare function requestFinished(): void; export declare function streamingStarted(): void; export declare function streamingFinished(): void; export declare function getActiveRequests(): number; export declare function getStreamingRequests(): number; export declare const LATENCY_WINDOW_SIZE = 1000; /** 环形缓冲区,避免 Array.shift() 的 O(n) 操作 */ export declare class RingBuffer { private capacity; private buffer; private head; private _size; private _version; constructor(capacity: number); push(item: T): void; toArray(): T[]; /** 原地查找并更新第一个满足谓词的条目,返回是否找到 */ updateFirst(predicate: (item: T) => boolean, updater: (item: T) => T): boolean; get length(): number; get version(): number; } export declare const latencyWindow: RingBuffer; export declare function getLatencyStats(): { avg: number; p95: number; }; export declare const LOG_BUFFER_SIZE = 100; export declare const requestLog: RingBuffer; export declare function getRequestLog(): ReadonlyArray; /** * 集中记录请求完成事件:更新 sessionStats/dailyStats + 协议统计 + 发射事件 * 替代各 handler 中分散的 sessionStats.xxx++ / dailyStats.xxx++ / incrementProtocolStats() 调用 */ export declare function recordRequestComplete(event: RequestCompleteEvent): void; /** * 记录请求开始事件:推入 pending 日志条目 + 发射事件 */ export declare function recordRequestStart(protocol: Protocol, model: string, requestId?: string, path?: string, ua?: string, stream?: boolean): void; /** * 检查日期是否翻转,若跨天则将旧数据持久化并重置 dailyStats 为新一天 * 在每次请求入口和定时刷盘时调用 */ export declare function rolloverDailyStats(logDir: string): void; export declare function initDailyStats(logDir: string): void; export declare function resetDailyStats(): void; export declare function formatStatsLine(label: string, stats: { requestCount: number; totalPromptTokens: number; totalCompletionTokens: number; errors?: number; }, labelWidth?: number): string; //# sourceMappingURL=stats-store.d.ts.map