import { ArtAgent } from '../useArtAgent';
export type SimpleType = string | number | boolean | object;
export type MessageStatus = 'local' | 'loading' | 'success' | 'error';
type RequestPlaceholderFn<Message extends SimpleType> = (message: Message, info: {
    messages: Message[];
}) => Message;
type RequestFallbackFn<Message extends SimpleType> = (message: Message, info: {
    error: Error;
    messages: Message[];
}) => Message | Promise<Message>;
export interface ArtChatConfig<AgentMessage extends SimpleType = string, BubbleMessage extends SimpleType = AgentMessage> {
    agent?: ArtAgent<AgentMessage>;
    defaultMessages?: DefaultMessageInfo<AgentMessage>[];
    /** Convert agent message to bubble usage message type */
    parser?: (message: AgentMessage) => BubbleMessage | BubbleMessage[];
    requestPlaceholder?: AgentMessage | RequestPlaceholderFn<AgentMessage>;
    requestFallback?: AgentMessage | RequestFallbackFn<AgentMessage>;
}
export interface MessageInfo<Message extends SimpleType> {
    id: number | string;
    message: Message;
    status: MessageStatus;
}
export type DefaultMessageInfo<Message extends SimpleType> = Pick<MessageInfo<Message>, 'message'> & Partial<Omit<MessageInfo<Message>, 'message'>>;
export type RequestResultObject<Message> = {
    message: Message | Message[];
    status: MessageStatus;
};
export type RequestResult<Message extends SimpleType> = Message | Message[] | RequestResultObject<Message> | RequestResultObject<Message>[];
export type StandardRequestResult<Message extends SimpleType> = Omit<RequestResultObject<Message>, 'message' | 'status'> & {
    message: Message;
    status?: MessageStatus;
};
export default function useArtChat<AgentMessage extends SimpleType = string, ParsedMessage extends SimpleType = AgentMessage>(config: ArtChatConfig<AgentMessage, ParsedMessage>): {
    readonly onRequest: (value: AgentMessage) => void;
    readonly messages: import('vue').Ref<MessageInfo<AgentMessage>[], MessageInfo<AgentMessage>[]>;
    readonly parsedMessages: import('vue').ComputedRef<MessageInfo<ParsedMessage>[]>;
    readonly setMessages: (updater: MessageInfo<AgentMessage>[] | ((prev: MessageInfo<AgentMessage>[]) => MessageInfo<AgentMessage>[])) => void;
};
export {};
