import { AnyFunction, CancelToken, DisposeCallback, MarkdownImage, ReadonlySubject, SceneCtrl } from "@iyio/common";
import { Observable } from "rxjs";
import { Conversation, ConversationOptions } from "./Conversation.js";
import { ConvoComponentRenderer } from "./convo-component-types.js";
import { ConvoDataStore, ConvoEditorMode, ConvoMessageRenderResult, ConvoMessageRenderer, ConvoPromptMedia, ConvoUiMessageAppendEvt } from "./convo-lang-ui-types.js";
import { BeforeCreateConversationExeCtx, ConvoAppend, ConvoCompletionChunk, ConvoEmbeddingsService, ConvoMessage, ConvoStartOfConversationCallback, ConvoTranscriptionService, ConvoTtsService, FlatConvoConversation, FlatConvoMessage } from "./convo-types.js";
import { ConvoViewTheme } from "./convo-view-theme.js";
import { ConvoDb } from "./db/convo-db-types.js";
import { ConvoQueuedTextToSpeech, TtsCtrl } from "./TtsCtrl.js";
export type ConversationUiCtrlTask = 'completing' | 'loading' | 'clearing' | 'disposed';
export interface InitConversationUiCtrlConvoOptions {
    appendTemplate: boolean;
}
export interface ConversationUiCtrlOptions {
    id?: string;
    /**
     * If true and an id is given the conversation will be auto loaded.
     */
    autoLoad?: boolean;
    template?: string;
    convo?: Conversation;
    convoOptions?: ConversationOptions;
    initConvo?: (convo: Conversation) => void;
    autoSave?: boolean;
    store?: null | 'localStorage' | ConvoDataStore;
    removeDanglingUserMessages?: boolean;
    enableSlashCommand?: boolean;
    sceneCtrl?: SceneCtrl;
    defaultVars?: Record<string, any>;
    externFunctions?: Record<string, (...args: any[]) => any>;
    imagePathConverter?: (img: MarkdownImage, className: string, msg: FlatConvoMessage) => string;
    imageRenderer?: (img: MarkdownImage, className: string, msg: FlatConvoMessage) => any;
    theme?: ConvoViewTheme;
    transcriptionService?: ConvoTranscriptionService;
    ttsService?: ConvoTtsService;
    embeddingsService?: ConvoEmbeddingsService;
    db?: ConvoDb;
}
export declare class ConversationUiCtrl {
    readonly id: string;
    readonly autoSave: boolean;
    private readonly store;
    readonly tts: TtsCtrl;
    readonly transcriptionService?: ConvoTranscriptionService;
    readonly ttsService?: ConvoTtsService;
    readonly embeddingsService?: ConvoEmbeddingsService;
    readonly db?: ConvoDb;
    private readonly convoOptions?;
    private readonly initConvoCallback?;
    private readonly _lastCompletion;
    get lastCompletionSubject(): ReadonlySubject<string | null>;
    get lastCompletion(): string | null;
    private readonly _onAppend;
    get onAppend(): Observable<ConvoAppend>;
    private readonly _onChunk;
    get onChunk(): Observable<ConvoCompletionChunk>;
    private readonly _streamingMessages;
    get streamingMessagesSubject(): ReadonlySubject<FlatConvoMessage[] | null>;
    get streamingMessages(): FlatConvoMessage[] | null;
    private readonly _enableStreaming;
    get enableStreamingSubject(): ReadonlySubject<boolean | null>;
    get enableStreaming(): boolean | null;
    set enableStreaming(value: boolean | null);
    private readonly tasks;
    private readonly _currentTask;
    get currentTaskSubject(): ReadonlySubject<ConversationUiCtrlTask | null>;
    get currentTask(): ConversationUiCtrlTask | null;
    private readonly _flat;
    get flatSubject(): ReadonlySubject<FlatConvoConversation | null>;
    get flat(): FlatConvoConversation | null;
    private readonly _template;
    get templateSubject(): ReadonlySubject<string | undefined>;
    get template(): string | undefined;
    set template(value: string | undefined);
    private readonly _removeDanglingUserMessages;
    get removeDanglingUserMessagesSubject(): ReadonlySubject<boolean>;
    get removeDanglingUserMessages(): boolean;
    set removeDanglingUserMessages(value: boolean);
    private readonly _convo;
    get convoSubject(): ReadonlySubject<Conversation | null>;
    get convo(): Conversation | null;
    private readonly _showSource;
    get showSourceSubject(): ReadonlySubject<boolean>;
    /**
     * If true the source convo-lang syntax should be displayed to the user
     */
    get showSource(): boolean;
    set showSource(value: boolean);
    private readonly _editorMode;
    get editorModeSubject(): ReadonlySubject<ConvoEditorMode>;
    get editorMode(): ConvoEditorMode;
    set editorMode(value: ConvoEditorMode);
    private readonly _showSystemMessages;
    get showSystemMessagesSubject(): ReadonlySubject<boolean>;
    /**
     * If true the system messages should be displayed to the user
     */
    get showSystemMessages(): boolean;
    set showSystemMessages(value: boolean);
    /**
     * If true function call results will be displayed to the user
     */
    private readonly _showResults;
    get showResultsSubject(): ReadonlySubject<boolean>;
    get showResults(): boolean;
    set showResults(value: boolean);
    private readonly _enabledInitMessage;
    get enabledInitMessageSubject(): ReadonlySubject<boolean>;
    get enabledInitMessage(): boolean;
    set enabledInitMessage(value: boolean);
    private readonly _showFunctions;
    get showFunctionsSubject(): ReadonlySubject<boolean>;
    /**
     * If true function calls should be displayed to the user
     */
    get showFunctions(): boolean;
    set showFunctions(value: boolean);
    private readonly _enableSlashCommands;
    get enableSlashCommandsSubject(): ReadonlySubject<boolean>;
    /**
     * If messages appended to the conversation using the appendUiMessage will be checked for messages
     * starting with a forward slash and be interpreted as a command.
     */
    get enableSlashCommands(): boolean;
    set enableSlashCommands(value: boolean);
    private readonly _themeOld;
    /** @deprecated */
    get themeOldSubject(): ReadonlySubject<Record<string, any>>;
    /** @deprecated */
    get themeOld(): Record<string, any>;
    /** @deprecated */
    set themeOld(value: Record<string, any>);
    private readonly _theme;
    get themeSubject(): ReadonlySubject<ConvoViewTheme | null>;
    get theme(): ConvoViewTheme | null;
    set theme(value: ConvoViewTheme | null);
    private readonly _mediaQueue;
    get mediaQueueSubject(): ReadonlySubject<readonly (ConvoPromptMedia)[]>;
    get mediaQueue(): readonly (ConvoPromptMedia)[];
    private readonly _collapsed;
    get collapsedSubject(): ReadonlySubject<boolean>;
    /**
     * Often used to indicate if the conversation is display in a collapsed state
     */
    get collapsed(): boolean;
    set collapsed(value: boolean);
    private readonly _onClear;
    get onClear(): Observable<void>;
    private readonly _onAppendUiMessage;
    get onAppendUiMessage(): Observable<ConvoUiMessageAppendEvt>;
    private readonly _expandOnUiMessage;
    get expandOnUiMessageSubject(): ReadonlySubject<boolean>;
    get expandOnUiMessage(): boolean;
    set expandOnUiMessage(value: boolean);
    readonly sceneCtrl?: SceneCtrl;
    private readonly _beforeCreateExeCtx;
    get beforeCreateExeCtxSubject(): ReadonlySubject<BeforeCreateConversationExeCtx | null | undefined>;
    get beforeCreateExeCtx(): BeforeCreateConversationExeCtx | null | undefined;
    set beforeCreateExeCtx(value: BeforeCreateConversationExeCtx | null | undefined);
    private readonly _defaultVars;
    get defaultVarsSubject(): ReadonlySubject<Record<string, any>>;
    get defaultVars(): Record<string, any>;
    set defaultVars(value: Record<string, any>);
    private readonly _externFunctions;
    get externFunctionsSubject(): ReadonlySubject<Record<string, AnyFunction>>;
    get externFunctions(): Record<string, AnyFunction>;
    set externFunctions(value: Record<string, AnyFunction>);
    private readonly _getStartOfConversation;
    get getStartOfConversationSubject(): ReadonlySubject<{
        cb: ConvoStartOfConversationCallback;
    } | null | undefined>;
    get getStartOfConversation(): {
        cb: ConvoStartOfConversationCallback;
    } | null | undefined;
    set getStartOfConversation(value: {
        cb: ConvoStartOfConversationCallback;
    } | null | undefined);
    private readonly _modelOverride;
    get modelOverrideSubject(): ReadonlySubject<string | null>;
    /**
     * Will force the given LLM model to be used
     */
    get modelOverride(): string | null;
    set modelOverride(value: string | null);
    readonly componentRenderers: Record<string, ConvoComponentRenderer>;
    imagePathConverter?: (img: MarkdownImage, className: string, msg: FlatConvoMessage) => string;
    imageRenderer?: (img: MarkdownImage, className: string, msg: FlatConvoMessage) => any;
    constructor({ id, autoLoad, convo, initConvo, convoOptions, template, autoSave, removeDanglingUserMessages, store, enableSlashCommand, sceneCtrl, defaultVars, externFunctions, imagePathConverter, imageRenderer, theme, transcriptionService, ttsService, embeddingsService, db, }?: ConversationUiCtrlOptions);
    private _isDisposed;
    get isDisposed(): boolean;
    dispose(): void;
    protected initConvo(convo: Conversation, options: InitConversationUiCtrlConvoOptions): void;
    private createConvo;
    loadAsync(): Promise<boolean>;
    clear(): boolean;
    private pushTask;
    private popTask;
    private convoCleanup;
    private setConvo;
    replace(convo: string): boolean;
    replaceAndCompleteAsync(convo: string): Promise<boolean>;
    isSlashCommand(message: string): boolean;
    appendDefineVars(vars: Record<string, any>): void | undefined;
    appendDefineVar(name: string, value: any): void | undefined;
    appendWithFunctionCallAsync(message: string, fn?: string): Promise<boolean | 'command'>;
    appendUiMessageAsync(message: string): Promise<boolean | 'command'>;
    private _appendUiMessageAsync;
    private triggerAppendUiMessageEvt;
    printHelp(): void;
    queueMediaAsync(media: string | ConvoPromptMedia | Blob | File | null | undefined): Promise<boolean>;
    queueMedia(media: string | ConvoPromptMedia): void;
    dequeueMedia(media: string | ConvoPromptMedia): boolean;
    private isAutoSaving;
    private autoSaveRequested;
    private queueAutoSave;
    private _autoSaveAsync;
    renderMessage(message: FlatConvoMessage, index: number): ConvoMessageRenderResult;
    readonly messageRenderers: ConvoMessageRenderer[];
    private readonly _readResponses;
    get readResponsesSubject(): ReadonlySubject<boolean>;
    get readResponses(): boolean;
    set readResponses(value: boolean);
    private requestResponseResponsesCount;
    requestResponseResponses(): DisposeCallback;
    readMessage(message: FlatConvoMessage | ConvoMessage | string | null | undefined, cancel?: CancelToken): ConvoQueuedTextToSpeech | null;
}
