import { BlockNoteEditor } from "@blocknote/core";
import { StreamTool } from "../../streamTool/streamTool.js";
import { AddBlocksToolCall } from "./base-tools/createAddBlocksTool.js";
import { UpdateBlockToolCall } from "./base-tools/createUpdateBlockTool.js";
import { DeleteBlockToolCall } from "./base-tools/delete.js";
import { DocumentStateBuilder } from "./DocumentStateBuilder.js";
export type AddTool<T> = StreamTool<AddBlocksToolCall<T>>;
export type UpdateTool<T> = StreamTool<UpdateBlockToolCall<T>>;
export type DeleteTool = StreamTool<DeleteBlockToolCall>;
export type StreamToolsConfig = {
    add?: boolean;
    update?: boolean;
    delete?: boolean;
};
export type StreamToolsResult<TT, T extends StreamToolsConfig> = [
    ...(T extends {
        update: true;
    } ? [UpdateTool<TT>] : []),
    ...(T extends {
        add: true;
    } ? [AddTool<TT>] : []),
    ...(T extends {
        delete: true;
    } ? [DeleteTool] : [])
];
export type StreamToolsProvider<TT, T extends StreamToolsConfig = {
    add: true;
    update: true;
    delete: true;
}> = {
    getStreamTools: (editor: BlockNoteEditor<any, any, any>, selectionInfo?: {
        from: number;
        to: number;
    } | boolean, onBlockUpdate?: (blockId: string) => void) => StreamToolsResult<TT, T>;
};
export declare const aiDocumentFormats: {
    _experimental_json: {
        getStreamToolsProvider: <T extends StreamToolsConfig = {
            add: true;
            update: true;
            delete: true;
        }>(opts?: {
            withDelays?: boolean;
            defaultStreamTools?: T;
        }) => StreamToolsProvider<string, T>;
        tools: {
            add: (editor: BlockNoteEditor<any, any, any>, options: {
                idsSuffixed: boolean;
                withDelays: boolean;
                onBlockUpdate?: ((blockId: string) => void) | undefined;
            }) => StreamTool<AddBlocksToolCall<import("@blocknote/core").PartialBlock<any, any, any>>>;
            update: (editor: BlockNoteEditor<any, any, any>, options: {
                idsSuffixed: boolean;
                withDelays: boolean;
                updateSelection?: {
                    from: number;
                    to: number;
                } | undefined;
                onBlockUpdate?: ((blockId: string) => void) | undefined;
            }) => StreamTool<UpdateBlockToolCall<import("@blocknote/core").PartialBlock<any, any, any>>>;
            delete: (editor: BlockNoteEditor<any, any, any>, options: {
                idsSuffixed: boolean;
                withDelays: boolean;
                onBlockUpdate?: (blockId: string) => void;
            }) => StreamTool<DeleteBlockToolCall>;
        };
        systemPrompt: string;
        defaultDocumentStateBuilder: DocumentStateBuilder<{
            id: undefined;
            children: undefined;
            type: any;
            props: import("@blocknote/core").Props<any>;
            content: (import("@blocknote/core").StyledText<any> | import("@blocknote/core").Link<any> | import("@blocknote/core").CustomInlineContentFromConfig<any, any>)[] | import("@blocknote/core").TableContent<any, any> | undefined;
        }>;
    };
    _experimental_markdown: {
        getStreamToolsProvider: <T extends StreamToolsConfig = {
            add: true;
            update: true;
            delete: true;
        }>(opts?: {
            withDelays?: boolean;
            defaultStreamTools?: T;
        }) => StreamToolsProvider<string, T>;
        systemPrompt: string;
        tools: {
            add: (editor: BlockNoteEditor<any, any, any>, options: {
                idsSuffixed: boolean;
                withDelays: boolean;
                onBlockUpdate?: ((blockId: string) => void) | undefined;
            }) => StreamTool<AddBlocksToolCall<string>>;
            update: (editor: BlockNoteEditor<any, any, any>, options: {
                idsSuffixed: boolean;
                withDelays: boolean;
                updateSelection?: {
                    from: number;
                    to: number;
                } | undefined;
                onBlockUpdate?: ((blockId: string) => void) | undefined;
            }) => StreamTool<UpdateBlockToolCall<string>>;
            delete: (editor: BlockNoteEditor<any, any, any>, options: {
                idsSuffixed: boolean;
                withDelays: boolean;
                onBlockUpdate?: (blockId: string) => void;
            }) => StreamTool<DeleteBlockToolCall>;
        };
        defaultDocumentStateBuilder: DocumentStateBuilder<string>;
    };
    html: {
        getStreamToolsProvider: <T extends StreamToolsConfig = {
            add: true;
            update: true;
            delete: true;
        }>(opts?: {
            withDelays?: boolean;
            defaultStreamTools?: T;
        }) => StreamToolsProvider<string, T>;
        systemPrompt: string;
        tools: {
            add: (editor: BlockNoteEditor<any, any, any>, options: {
                idsSuffixed: boolean;
                withDelays: boolean;
                onBlockUpdate?: ((blockId: string) => void) | undefined;
            }) => StreamTool<AddBlocksToolCall<string>>;
            update: (editor: BlockNoteEditor<any, any, any>, options: {
                idsSuffixed: boolean;
                withDelays: boolean;
                updateSelection?: {
                    from: number;
                    to: number;
                } | undefined;
                onBlockUpdate?: ((blockId: string) => void) | undefined;
            }) => StreamTool<UpdateBlockToolCall<string>>;
            delete: (editor: BlockNoteEditor<any, any, any>, options: {
                idsSuffixed: boolean;
                withDelays: boolean;
                onBlockUpdate?: (blockId: string) => void;
            }) => StreamTool<DeleteBlockToolCall>;
        };
        defaultDocumentStateBuilder: DocumentStateBuilder<string>;
    };
};
