import { Dispatch } from '@reduxjs/toolkit';
import type { CreateFilesStream, File as UploadedFile, UnstableGenerateAIMetadata, UploadFileInfo } from '../../../../shared/contracts/files';
interface UploadFilesArgs {
    formData: FormData;
    totalFiles: number;
    /**
     * How many files to upload in parallel — the `concurrentUploadRequests`
     * settings value. Defaults to 1 (sequential).
     */
    concurrency?: number;
    /** Whether AI metadata generation is enabled (EE AI available + `settings.aiMetadata`). */
    generateAiMetadata: boolean;
}
interface UploadFromUrlsArgs {
    urls: string[];
    folderId: number | null;
    generateAiMetadata: boolean;
}
/**
 * A single file plus the `fileInfo` it was queued with.
 * Retained in {@link uploadRegistry} so cancelled files can be retried without
 * the user re-selecting them. `File`/`AbortController` are non-serializable, so
 * they live here rather than in Redux.
 */
interface UploadEntry {
    file: File;
    fileInfo: UploadFileInfo;
}
/**
 * Aborts an upload by its uploadId.
 * Called from the UploadProgressDialog when the user clicks cancel or close.
 */
export declare const abortUpload: (uploadId: number) => void;
/**
 * Kicks off AI metadata generation for a freshly uploaded file.
 *
 * Deliberately fire-and-forget — the caller must NOT await it:
 *  - generation for file N overlaps the upload of file N+1;
 *  - a generation failure can never affect the upload result (the upload already
 *    succeeded), which is why the promise is fully swallowed here.
 *
 * Every uploaded file is sent, including non-images: the server already classifies
 * them (`ai-metadata.generateForFiles` returns `skipped` for anything whose mime
 * isn't `image/*`) and duplicating that rule here would let the two drift apart.
 * The upshot is that a non-image now reports "Metadata generation skipped" rather
 * than silently showing no metadata state at all.
 */
export declare const maybeGenerateMetadata: ({ file, index, uploadId, enabled, dispatch, }: {
    file: UploadedFile;
    index: number;
    uploadId: number;
    enabled: boolean;
    dispatch: Dispatch;
}) => void;
declare const uploadApi: import("@reduxjs/toolkit/query").Api<import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, import("@reduxjs/toolkit/dist/query/endpointDefinitions").UpdateDefinitions<{}, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", never> & {
    /**
     * Upload files to `/upload/unstable/upload-file`, one request per file,
     * through a worker pool of `concurrency` parallel requests (default 1 =
     * sequential). Real per-file byte progress comes from
     * `XHR.upload.onprogress`.
     */
    uploadFiles: import("@reduxjs/toolkit/query").MutationDefinition<UploadFilesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile[], "adminApi">;
    /**
     * Upload a single, already-prepared file WITHOUT opening the global
     * upload-progress dialog. For flows that create one asset programmatically
     * (e.g. crop → "Save as copy"), where the bulk-upload progress UI is
     * inappropriate. Same endpoint as `uploadFiles`, minus the progress/retry
     * machinery.
     */
    uploadFileSilently: import("@reduxjs/toolkit/query").MutationDefinition<UploadEntry, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile, "adminApi">;
    /**
     * Retry uploading cancelled files.
     * Maps cancelled rows back to their original entries and re-runs only those
     * through the same upload pool with a fresh AbortController.
     */
    retryCancelledFiles: import("@reduxjs/toolkit/query").MutationDefinition<void, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile[], "adminApi">;
    /**
     * Upload files from URLs.
     * Sends URLs to the server which fetches and uploads them (SSE flow, unchanged).
     */
    uploadFromUrls: import("@reduxjs/toolkit/query").MutationDefinition<UploadFromUrlsArgs, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", CreateFilesStream.Response, "adminApi">;
    /**
     * Generate AI metadata (alt text + caption) for the given assets.
     * Synchronous: resolves once every file has been processed and reports the
     * outcome per file, so non-images and individual failures don't fail the
     * whole batch. Existing alt text and captions are never overwritten.
     *
     * Lives here rather than in `assets.ts` because the upload flows dispatch it
     * directly via `initiate()` after each file completes, and `assets.ts` already
     * imports from this module — defining it there would be a circular import.
     * Re-exported from `assets.ts` for the components that consume the hook.
     */
    generateAiMetadata: import("@reduxjs/toolkit/query").MutationDefinition<{
        fileIds: number[];
    }, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UnstableGenerateAIMetadata.FileResult[], "adminApi">;
}, "adminApi", "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", typeof import("@reduxjs/toolkit/query").coreModuleName | typeof import("@reduxjs/toolkit/dist/query/react").reactHooksModuleName>;
export declare const useUploadFilesMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<UploadFilesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile[], "adminApi">>, useUploadFileSilentlyMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<UploadEntry, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile, "adminApi">>, useRetryCancelledFilesMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<void, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile[], "adminApi">>, useUploadFromUrlsMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<UploadFromUrlsArgs, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", CreateFilesStream.Response, "adminApi">>, useGenerateAiMetadataMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<{
    fileIds: number[];
}, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UnstableGenerateAIMetadata.FileResult[], "adminApi">>;
export { uploadApi };
