import type { ChatContext } from '../llm/chat_context.js';
import { type ModelUsage } from '../metrics/model_usage.js';
import type { AgentSessionOptions, ResolvedRecordingOptions, VoiceOptions } from './agent_session.js';
import type { AgentEvent } from './events.js';
type ReportOptions = AgentSessionOptions & Partial<VoiceOptions> & {
    recordingOptions: ResolvedRecordingOptions;
};
export interface SessionReport {
    jobId: string;
    roomId: string;
    room: string;
    options: ReportOptions;
    events: AgentEvent[];
    chatHistory: ChatContext;
    enableRecording: boolean;
    /** Timestamp when the session started (milliseconds) */
    startedAt: number;
    /** Timestamp when the session report was created (milliseconds), typically at the end of the session */
    timestamp: number;
    /** Path to the audio recording file (if recording was enabled) */
    audioRecordingPath?: string;
    /** Timestamp when the audio recording started (milliseconds) */
    audioRecordingStartedAt?: number;
    /** Duration of the session in milliseconds */
    duration?: number;
    /** Usage summaries for the session, one per model/provider combination */
    modelUsage?: ModelUsage[];
}
export interface SessionReportOptions {
    jobId: string;
    roomId: string;
    room: string;
    options: ReportOptions;
    events: AgentEvent[];
    chatHistory: ChatContext;
    enableRecording?: boolean;
    /** Timestamp when the session started (milliseconds) */
    startedAt?: number;
    /** Timestamp when the session report was created (milliseconds) */
    timestamp?: number;
    /** Path to the audio recording file (if recording was enabled) */
    audioRecordingPath?: string;
    /** Timestamp when the audio recording started (milliseconds) */
    audioRecordingStartedAt?: number;
    /** Usage summaries for the session, one per model/provider combination */
    modelUsage?: ModelUsage[];
}
export declare function createSessionReport(opts: SessionReportOptions): SessionReport;
/**
 * Recursively convert object keys to snake_case so the emitted wire format matches the
 * Python framework (whose pydantic models serialize with snake_case field names, no alias).
 * Objects exposing `toJSON()` (chat items, content) emit the framework's native camelCase shape,
 * so their output is recursed into here rather than trusted. Arrays are mapped; primitives pass
 * through; `extra` dicts are emitted verbatim (Python keeps `extra` as a free-form dict, so its
 * provider-supplied keys must not be converted).
 *
 * @internal Exported so other Python-facing serialization boundaries (e.g. the `lk.pii.chat_ctx`
 * span attribute) can emit the same snake_case wire shape as the session report.
 */
export declare function toSnakeCaseDeep(value: unknown): unknown;
export declare function sessionReportToJSON(report: SessionReport): Record<string, unknown>;
export {};
//# sourceMappingURL=report.d.ts.map