import { MessageModel, ChatMessageOwner, Message } from './MessageModel';
import { ThreadMessages } from './ThreadMessages';
import { ObservableReactValue } from '../utils/observers/ObservableReactValue';
import { MessageSentParams } from './MessageSentParams';
import { IdType } from '../types';
export type NewMessageResponse = {
    user: Message;
    assistant: Message;
};
export declare enum StreamResponseState {
    START = "start",
    TYPING_MESSAGE = "typingMessage",
    THINKING = "thinking",
    FINISH_MESSAGE = "finishMessage"
}
export type Thread<DM extends Message = any> = {
    id: IdType;
    title: string;
    date?: string;
    messages?: DM[];
} & {
    isNew?: boolean;
};
export declare class ThreadModel<DM extends Message = any, DD extends Thread<DM> = any> {
    readonly streamMessage: (params: MessageSentParams) => void | Promise<void>;
    readonly viewerUniqueKey: string;
    readonly messages: ThreadMessages<DM>;
    readonly observableTitle: ObservableReactValue<string>;
    readonly isTyping: ObservableReactValue<boolean>;
    readonly isLoadingAttachments: ObservableReactValue<IdType[]>;
    readonly isEmpty: ObservableReactValue<boolean>;
    readonly streamStatus: ObservableReactValue<string | undefined>;
    readonly tool: ObservableReactValue<string | undefined>;
    readonly helloMessage: MessageModel<{
        id: string;
        content: string;
        role: ChatMessageOwner.ASSISTANT;
        time: number;
    }>;
    /**
     * We can pass threads with empty history to improve performance
     * When opening such a thread, we need to call the getFullThread method to load the history
     */
    readonly isLoadingFullData: ObservableReactValue<boolean>;
    scrollY: number;
    readonly timestamp: ObservableReactValue<number>;
    private _data;
    constructor(data: DD, streamMessage: (params: MessageSentParams) => void | Promise<void>);
    get id(): IdType;
    set id(value: IdType);
    get time(): number;
    get title(): string;
    set title(value: string);
    get date(): string | undefined;
    get isNew(): boolean | undefined;
    get messagesArray(): MessageModel<DM>[];
    get data(): Thread<DM>;
    setFullData: (threadData: Thread & {
        messages: DM[];
    }) => void;
    static createEmptyData: <DD_1>() => DD_1;
    protected _createPair: (content: Message['content'], parentMessage: MessageModel<DM> | undefined) => {
        userMessage: MessageModel<DM>;
        assistantMessage: MessageModel<DM>;
    };
}
