import { Room, ConnectionState } from 'livekit-client';
import { VoxketEventEmitter } from './event-emitter';
import { PluginManager } from '../plugins/plugin-system';
import { RenderUIOptions } from './ui-renderer';
import { LiveAvatarManager, LiveAvatarClientConfig } from './liveavatar-manager';
import { VoxketConfig, SessionConfig, VoxketSession, VoxketEvents, SessionState, SessionMetrics, AgentInfo, ParticipantInfo, ChatMessage, TranscriptionSegment, ModalityValue, VoxketError } from '../types/core';
import { VoxketInteractiveView, ViewPresentationMode, InteractiveUIState, RpcEvents } from '../types/rpc';
export interface VoxketClientConfig extends VoxketConfig {
    agentId?: string;
    participantName?: string;
    modalities?: ModalityValue[];
    participantMetadata?: Record<string, any>;
    /** LiveAvatar FULL mode configuration — when provided, video modality uses LiveAvatar */
    liveAvatarConfig?: LiveAvatarClientConfig;
    /**
     * Existing Voxket session ID to join instead of creating a new one.
     * When set, fetchConnectionDetails() calls the join endpoint instead of create.
     */
    sessionId?: string;
    onConnected?: () => void;
    onDisconnected?: (reason?: string) => void;
    onError?: (error: VoxketError) => void;
    onMessageReceived?: (message: ChatMessage) => void;
    onTranscriptionReceived?: (transcription: TranscriptionSegment) => void;
    onSessionStateChanged?: (state: SessionState) => void;
    onSessionStart?: (sessionId: string) => void;
    onSessionEnd?: (metrics: any) => void;
    onUserJoined?: (userId: string) => void;
    onUserLeft?: (userId: string) => void;
}
/**
 * VoxketClient
 *
 * Main client class that orchestrates all Voxket functionality.
 * Uses specialized managers for different concerns:
 * - ChatManager: Chat messages and attachments
 * - MediaManager: Camera, microphone, screen share
 * - ConnectionManager: Room connection and participants
 * - StreamHandlerManager: Text/byte stream handlers
 * - UIRenderer: React UI rendering
 * - AgentManager: Agent state and info
 * - RpcManager: RPC method handling
 * - PluginManager: Plugin system
 */
export declare class VoxketClient extends VoxketEventEmitter<VoxketEvents & RpcEvents> {
    private config;
    private pluginManager;
    private rpcManager;
    private chatManager;
    private mediaManager;
    private connectionManager;
    private streamHandlerManager;
    private uiRenderer;
    private agentManager;
    private liveAvatarManager;
    private currentSession;
    constructor(config: VoxketClientConfig);
    /**
     * Setup event listeners for various events
     */
    private setupEventListeners;
    /**
     * Setup RPC event forwarding from RpcManager
     */
    private setupRpcEventForwarding;
    addConsentLog(consentType: string, consentVersion: string, agentId: string, modalities: ModalityValue[]): Promise<any>;
    connect(agentId?: string, participantName?: string, modalities?: ModalityValue[], participantMetadata?: Record<string, any>): Promise<{
        serverUrl: string;
        participantToken: string;
        voxketSessionId: string;
        agentInfo?: AgentInfo;
    }>;
    disconnect(): Promise<void>;
    createSession(config: SessionConfig): Promise<VoxketSession>;
    startSession(agentId?: string, options?: {
        participantName?: string;
        modalities?: ModalityValue[];
        metadata?: Record<string, any>;
        participantMetadata?: Record<string, any>;
    }): Promise<VoxketSession>;
    endSession(): Promise<SessionMetrics | null>;
    getCurrentSession(): VoxketSession | null;
    getSessionMetrics(): SessionMetrics | null;
    sendMessage(message: string, metadata?: Record<string, any>): Promise<void>;
    sendChatMessage(message: string, metadata?: Record<string, any>): Promise<void>;
    sendAttachments(files: File[], metadata?: Record<string, any>): Promise<void>;
    sendAttachment(file: File, metadata?: Record<string, any>): Promise<void>;
    getChatMessages(): ChatMessage[];
    addChatMessage(message: ChatMessage): void;
    updateChatMessage(updatedMessage: ChatMessage): void;
    clearChatMessages(): void;
    toggleMicrophone(enabled?: boolean): Promise<void>;
    setMicrophoneEnabled(enabled: boolean): Promise<void>;
    toggleCamera(enabled?: boolean): Promise<void>;
    setCameraEnabled(enabled: boolean): Promise<void>;
    enableCamera(): Promise<void>;
    disableCamera(): Promise<void>;
    switchCamera(): Promise<void>;
    getCurrentCameraFacingMode(): 'user' | 'environment';
    startScreenShare(): Promise<void>;
    stopScreenShare(): Promise<void>;
    getAudioInputDevices(): Promise<MediaDeviceInfo[]>;
    getVideoInputDevices(): Promise<MediaDeviceInfo[]>;
    setAudioInputDevice(deviceId: string): Promise<void>;
    setVideoInputDevice(deviceId: string): Promise<void>;
    get isMicrophoneEnabled(): boolean;
    get isCameraEnabled(): boolean;
    get isScreenShareEnabled(): boolean;
    getMicrophoneTrack(): import('livekit-client').LocalTrack<import("livekit-client").Track.Kind> | null | undefined;
    getCameraTrack(): import('livekit-client').LocalTrack<import("livekit-client").Track.Kind> | null | undefined;
    getScreenShareTrack(): import('livekit-client').LocalTrack<import("livekit-client").Track.Kind> | null | undefined;
    getAgentAudioTrack(): {
        source: import("livekit-client").Track.Source;
        participant: import('livekit-client').RemoteParticipant;
        publication: import('livekit-client').RemoteTrackPublication;
    } | null;
    getAgentVideoTrack(): {
        source: import("livekit-client").Track.Source;
        participant: import('livekit-client').RemoteParticipant;
        publication: import('livekit-client').RemoteTrackPublication;
    } | null;
    getVideoTrackRefs(): {
        source: import("livekit-client").Track.Source;
        participant: any;
        publication: any;
    }[];
    getCameraTrackRefs(): {
        source: import("livekit-client").Track.Source;
        participant: any;
        publication: any;
    }[];
    getScreenShareTrackRefs(): {
        source: import("livekit-client").Track.Source;
        participant: any;
        publication: any;
    }[];
    getPublishPermissions(): {
        camera: boolean;
        microphone: boolean;
        screenShare: boolean;
        data: boolean;
    };
    canPublishSource(source: 'camera' | 'microphone' | 'screenShare'): boolean;
    getLocalParticipant(): import('livekit-client').LocalParticipant | null;
    getRemoteParticipants(): import('livekit-client').RemoteParticipant[];
    getParticipants(): ParticipantInfo[];
    getRoom(): Room | null;
    getConnectionState(): ConnectionState;
    get connected(): boolean;
    getCurrentAgentInfo(): AgentInfo | null;
    getIsAgentConnected(): boolean;
    getAgentState(): 'idle' | 'thinking' | 'speaking';
    renderUI(options?: RenderUIOptions): void;
    removeUI(target?: string | HTMLElement): void;
    removeAllUI(): void;
    registerFrontendRPC(methodName: string, component: VoxketInteractiveView, presentationMode?: ViewPresentationMode): Promise<void>;
    getCurrentInteraction(): InteractiveUIState | null;
    dismissCurrentInteraction(): void;
    getRegisteredRpcMethods(): string[];
    unregisterRpcMethod(methodName: string): void;
    /**
     * Get the LiveAvatarManager instance
     */
    getLiveAvatarManager(): LiveAvatarManager;
    /**
     * Set LiveAvatar config on an existing client instance.
     * Useful when a pre-created VoxketClient is passed to the widget
     * and liveAvatarConfig needs to be applied after construction.
     */
    setLiveAvatarConfig(config: LiveAvatarClientConfig): void;
    /**
     * Check if the current session is using LiveAvatar
     */
    isLiveAvatarSession(): boolean;
    /**
     * Attach the LiveAvatar video/audio stream to an HTML media element
     */
    attachLiveAvatar(element: HTMLMediaElement): void;
    /**
     * Send a message to the LiveAvatar (triggers LLM response)
     */
    sendLiveAvatarMessage(message: string): void;
    /**
     * Make the LiveAvatar repeat specific text (TTS only)
     */
    repeatLiveAvatar(text: string): void;
    /**
     * Interrupt the LiveAvatar's current speech
     */
    interruptLiveAvatar(): void;
    registerPlugin(plugin: any): void;
    getPluginManager(): PluginManager;
    registerEventListener<K extends keyof (VoxketEvents & RpcEvents)>(eventName: K, callback: (data: any) => void): () => void;
    registerEventEmitter(topic: string, handler: (data: string) => void): void;
    getRegisteredEventEmitters(): string[];
    hasEventEmitter(topic: string): boolean;
    updateConfig(updates: Partial<VoxketClientConfig>): void;
    setParticipantMetadata(metadata: Record<string, any>): void;
    getParticipantMetadata(): Record<string, any> | undefined;
    startRecording(): Promise<void>;
    stopRecording(): Promise<void>;
}
