import { type MaybeRefOrGetter } from 'vue';
import { XAgent } from '../use-x-agent';
import { type SSEOutput, XStreamOptions } from '../x-stream';
import { XRequestParams } from '../x-request';
import type { AnyObject } from '../_util/type';
import { type ConversationKey } from './conversationStore';
import type { AbstractChatProvider } from '../chat-providers/AbstractChatProvider';
export type SimpleType = string | number | boolean | object;
export type MessageStatus = 'local' | 'loading' | 'success' | 'error' | 'abort' | 'updating';
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>;
type TransformMessageFn<Message, Output> = (info: {
    originMessage?: Message;
    chunk: Output;
    chunks: Output[];
    status: MessageStatus;
    responseHeaders?: Headers;
}) => Message;
type RequestParams<Message> = Omit<XRequestParams, 'message'> & {
    message: Message;
} & AnyObject;
export interface XChatConfig<AgentMessage extends SimpleType = string, BubbleMessage extends SimpleType = AgentMessage, Input = AgentMessage, Output = AgentMessage> {
    agent?: XAgent<AgentMessage, Input, Output>;
    /**
     * Initial messages: sync list, sync factory, or async loader (aligned with @ant-design/x-sdk).
     */
    defaultMessages?: DefaultMessageInfo<AgentMessage>[] | ((info: {
        conversationKey?: ConversationKey;
    }) => DefaultMessageInfo<AgentMessage>[] | Promise<DefaultMessageInfo<AgentMessage>[]>);
    /**
     * Isolate message list by conversation key (multi-conversation enterprise chat).
     * Accepts string/symbol or a Ref/getter (e.g. useXConversations.activeConversationKey).
     */
    conversationKey?: MaybeRefOrGetter<ConversationKey>;
    /** Convert agent message to bubble usage message type */
    parser?: (message: AgentMessage) => BubbleMessage | BubbleMessage[];
    requestPlaceholder?: AgentMessage | RequestPlaceholderFn<AgentMessage>;
    requestFallback?: AgentMessage | RequestFallbackFn<AgentMessage>;
    transformMessage?: TransformMessageFn<AgentMessage, Output>;
    /**
     * Chat provider (AbstractChatProvider). When set, injects getMessages and
     * supplies transformMessage / transformParams unless overridden.
     */
    provider?: AbstractChatProvider<AgentMessage, Input, Output>;
    transformStream?: XStreamOptions<AgentMessage>['transformStream'];
    resolveAbortController?: (abortController: AbortController) => void;
}
export interface MessageInfo<Message extends SimpleType> {
    id: number | string;
    message: Message;
    status: MessageStatus;
    /** Arbitrary metadata (feedback, citations, etc.) */
    extraInfo?: AnyObject;
}
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 StandardRequestResult<Message extends SimpleType> = Omit<RequestResultObject<Message>, 'message' | 'status'> & {
    message: Message;
    status?: MessageStatus;
};
export default function useXChat<AgentMessage extends SimpleType = string, ParsedMessage extends SimpleType = AgentMessage, Input = RequestParams<AgentMessage>, Output = SSEOutput>(config: XChatConfig<AgentMessage, ParsedMessage, Input, Output>): {
    readonly onRequest: (requestParams: SimpleType | RequestParams<AgentMessage> | Input, opts?: {
        extraInfo?: AnyObject;
    }) => void;
    readonly onReload: (id: string | number, requestParams?: RequestParams<AgentMessage> | Input | SimpleType, opts?: {
        extraInfo?: AnyObject;
    }) => void;
    readonly abort: () => 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;
    readonly setMessage: (id: string | number, patch: Partial<MessageInfo<AgentMessage>> | ((origin: MessageInfo<AgentMessage>) => Partial<MessageInfo<AgentMessage>>)) => boolean;
    readonly removeMessage: (id: string | number) => boolean;
    readonly conversationKey: import("vue").Ref<ConversationKey, ConversationKey>;
    readonly isRequesting: import("vue").ComputedRef<boolean>;
    readonly isDefaultMessagesRequesting: import("vue").Ref<boolean, boolean>;
    readonly queueRequest: (conversationKey: ConversationKey, requestParams: RequestParams<AgentMessage> | Input | SimpleType, opts?: {
        extraInfo?: AnyObject;
    }) => void;
};
export {};
