import { Context, Dict } from 'koishi';
import { ImageData } from './types';
declare module 'koishi' {
    interface Context {
        runtime?: {
            currentTokenIndex: number;
            tokenUsage?: Record<number, boolean>;
            tokenPool?: string[];
            poolIndex?: number;
            lastPoolRefreshTime?: number;
            _forcedTokenIndex?: number;
            _redraw?: boolean;
            _timeStamp?: number;
            _taskIndex?: number;
            _taskId?: number;
        };
    }
}
export declare function project(object: {}, mapping: {}): {};
export interface Size {
    width: number;
    height: number;
}
export declare function getImageSize(buffer: ArrayBuffer): Size;
/**
 * 图片内存缓存，以 URL 为 key 缓存已下载的 ImageData。
 * - 默认 TTL 为 5 分钟（300000ms），每次读取时自动刷新
 * - 最大内存上限默认 200MB，超过时自动淘汰最久未使用的条目（LRU）
 * - TTL 到期后自动从内存中移除
 * - 利用 Map 的插入顺序特性实现 LRU：访问时删除并重新插入到末尾
 */
declare class ImageCache {
    private cache;
    private ttl;
    private maxBytes;
    private currentBytes;
    /**
     * @param ttlMs   缓存过期时间（毫秒），默认 5 分钟
     * @param maxMB   最大缓存内存（MB），默认 200MB
     */
    constructor(ttlMs?: number, maxMB?: number);
    /** 从缓存中获取图片，命中时刷新 TTL 并更新 LRU 顺序 */
    get(url: string): ImageData | undefined;
    /** 将图片存入缓存，超过内存上限时淘汰最久未使用的条目 */
    set(url: string, data: ImageData): void;
    /** 内部方法：移除指定条目并释放内存计数 */
    private _evict;
    /** 清除所有缓存条目 */
    clear(): void;
    /** 当前缓存条目数 */
    get size(): number;
    /** 当前缓存占用内存（字节） */
    get memoryUsage(): number;
    /** 当前缓存占用内存（MB，保留两位小数） */
    get memoryUsageMB(): number;
}
/** 全局图片缓存实例（TTL 5分钟，上限 200MB） */
export declare const imageCache: ImageCache;
export declare function download(ctx: Context, url: string, headers?: {}): Promise<ImageData>;
export declare function calcAccessKey(email: string, password: string): Promise<string>;
export declare function calcEncryptionKey(email: string, password: string): Promise<string>;
export declare class NetworkError extends Error {
    params: {};
    constructor(message: string, params?: {});
    static catch: (mapping: Dict<string>) => (e: any) => never;
}
export declare function initTokenPool(ctx: Context): Promise<string[]>;
export declare function login(ctx: Context, email: string, password: string): Promise<string>;
export declare function closestMultiple(num: number, mult?: number): number;
export interface Size {
    width: number;
    height: number;
    /** Indicate whether this resolution is pre-defined or customized */
    custom?: boolean;
}
export declare function resizeInput(size: Size): Size;
export declare function forceDataPrefix(url: string, mime?: string): string;
/**
 * 将位置字符串（如 "A1" 到 "E5"）转换为坐标
 * 横向: A(-0.4) → B(-0.2) → C(0) → D(+0.2) → E(+0.4)
 * 纵向: 1(-0.4) → 2(-0.2) → 3(0) → 4(+0.2) → 5(+0.4)
 * @param position 位置字符串，默认为 "C3" (中心点)
 * @returns 坐标对象 { x, y }，值域为 [0.1, 0.9]
 */
export declare function convertPosition(position?: string): {
    x: number;
    y: number;
};
/**
 * 检查模型是否支持 Characters 功能
 * @param model 模型名称
 * @returns 是否支持 Characters
 */
export declare function modelSupportsCharacters(model: string): boolean;
/**
 * 解析用户友好的 characters 文本格式
 * 格式：prompt@position --uc:negative;prompt2@position2
 *
 * 示例：
 * - "1girl, red hair@B3;1boy, blue eyes@D3"
 * - "1girl@B3 --uc:frown;1boy@D3"
 * - "princess, dress@C2 --uc:messy;knight@C4"
 * - 支持中文分号："1girl@B3；1boy@D3"
 *
 * @param input 用户输入的字符串
 * @returns Character 数组
 */
export declare function parseCharacters(input: string): Array<{
    prompt: string;
    uc?: string;
    position?: string;
}>;
export declare function createContextWithRuntime(ctx: Context, runtime: any): Context;
/**
 * 将尺寸对齐到64的倍数（NovelAI API要求）
 */
export declare function alignTo64(size: number): number;
/**
 * NovelAI 最大总像素数限制（不包括该值本身）
 * 经测试：28*64 x 28*64 = 1792x1792 = 3,211,264 不能生成
 *         27*64 x 28*64 = 1728x1792 = 3,096,576 可以生成
 */
export declare const NAI_MAX_PIXELS = 3211264;
/**
 * 将宽高限制在 NovelAI 最大像素限制范围内
 * 如果总像素数 >= NAI_MAX_PIXELS，等比缩小并对齐到64的倍数
 * @param width 原始宽度（已对齐64）
 * @param height 原始高度（已对齐64）
 * @returns 缩小后的尺寸和是否发生了缩小
 */
export declare function clampToNAILimit(width: number, height: number): {
    width: number;
    height: number;
    clamped: boolean;
};
/**
 * 将图片调暗并对齐尺寸(用于局部重绘的交互式流程)
 * @param imageData 原始图片数据
 * @param factor 调暗系数(0-1,默认0.5)
 * @param targetWidth 可选的目标宽度（用户通过 -r 指定时传入）
 * @param targetHeight 可选的目标高度（用户通过 -r 指定时传入）
 * @returns 调暗后的图片Data URL和对齐后的尺寸
 */
export declare function darkenImage(imageData: ImageData, factor?: number, targetWidth?: number, targetHeight?: number): Promise<{
    dataUrl: string;
    alignedWidth: number;
    alignedHeight: number;
    originalBuffer: Buffer;
}>;
/**
 * 针对 NovelAI V4 优化的 Mask 处理算法
 * 逻辑复刻自 Auto-NovelAI-Refactor 的 process_white_regions
 * 1. 二值化
 * 2. 8x8 网格对齐 (Latent Alignment)
 * 3. 区域膨胀 (Block Dilation) 确保覆盖边缘
 *
 * @param imageData 用户涂白的图片数据
 * @param targetWidth 目标宽度（对齐到64的倍数）
 * @param targetHeight 目标高度（对齐到64的倍数）
 * @returns 处理后的遮罩base64(不含data:前缀)
 */
export declare function extractMaskWithAntiArtifact(imageData: ImageData, targetWidth: number, targetHeight: number): Promise<string>;
/**
 * 从用户涂白的图片中提取遮罩并进行膨胀处理（旧版，保留兼容）
 * @deprecated 推荐使用 extractMaskWithAntiArtifact
 */
export declare function extractAndDilateMask(imageData: ImageData, threshold?: number, minPenSize?: number): Promise<string>;
/**
 * 检查模型是否支持 Character Reference Image 功能
 * 仅 v4.5 模型支持此功能
 * @param model 模型名称
 * @returns 是否支持角色参考
 */
export declare function modelSupportsCharacterReference(model: string): boolean;
/**
 * 将角色参考图片调整到 NovelAI 要求的尺寸
 * 参考 Auto-NovelAI-Refactor 的 process_image_by_orientation 函数
 * - 横图：1536×1024
 * - 竖图：1024×1536
 * - 方图：1472×1472
 *
 * @param imageData 原始图片数据
 * @returns 处理后的图片 base64（不含 data: 前缀）和尺寸信息
 */
export declare function processCharacterReferenceImage(imageData: ImageData): Promise<{
    base64: string;
    width: number;
    height: number;
}>;
export {};
