import { ILibraryServerData } from 'mira-app-core/storage/sqlite';
import { MiraWebsocketServer } from './WebSocketServer';
import { PluginRouteDefinition } from './ServerPlugin';
import type { Request, Response } from 'express';
import type { MetadataRule } from './services/MetadataService';
export interface PluginConfig {
    name: string;
    enabled: boolean;
    path: string;
    version?: string;
    description?: string;
    author?: string;
    main?: string;
    icon?: string | null;
    title?: string;
    category?: string;
    tags?: string[];
    registry?: string;
    installedAt?: string;
}
export interface ServerWebPluginManifest {
    pluginName: string;
    pluginId: string;
    version: string;
    index: string;
    serverPluginName: string;
    [key: string]: any;
}
export interface HttpHookContext {
    libraryId: string;
    clientId?: string;
    method: string;
    path: string;
    req: Request;
    res: Response;
    fields?: Record<string, any>;
}
export type HttpHookHandler = (context: HttpHookContext) => boolean | void | Promise<boolean | void>;
export interface HttpHookDefinition {
    method?: string;
    path: string | RegExp;
    handler: HttpHookHandler;
}
export interface ServerFileFormatHandler {
    id: string;
    extensions?: string[];
    mimeTypes?: string[];
    thumbnailExtensions?: string[];
    process?: (filePath: string, context?: Record<string, any>) => any | Promise<any>;
    thumbnail?: (srcPath: string, destPath: string) => Promise<void>;
    metadata?: MetadataRule['parse'];
    getExtraFileList?: (filePath: string, context?: Record<string, any>) => string[] | Promise<string[]>;
    getExtraFile?: (filePath: string, fileName: string, context?: Record<string, any>) => string | Promise<string>;
    viewers?: ServerPreviewViewerDefinition[];
}
export interface ServerPreviewViewerContext {
    libraryId: string;
    fileId: string;
    file: Record<string, any>;
    filePath: string;
    fileUrl: string;
    getExtraFileUrl: (fileName: string) => string;
}
export interface ServerPreviewViewerDefinition {
    viewerId: string;
    title: string;
    entry: string;
    icon?: string;
    priority?: number;
    extensions?: string[];
    mimeTypes?: string[];
    getQuery?: (context: ServerPreviewViewerContext) => Record<string, unknown> | Promise<Record<string, unknown>>;
}
export interface ResolvedPreviewViewer {
    viewerId: string;
    pluginId: string;
    pluginName: string;
    serverPluginName: string;
    title: string;
    iframeUrl: string;
    priority: number;
    icon?: string;
}
export declare class ServerPluginManager {
    pluginsDir: string;
    server: MiraWebsocketServer;
    private dbService;
    private pluginsConfigPath;
    private loadedPlugins;
    private miraClient;
    private httpHooks;
    private fileFormatHandlers;
    fields: Record<string, any>[];
    constructor({ server, dbService, pluginsDir }: {
        server: MiraWebsocketServer;
        dbService: ILibraryServerData;
        pluginsDir?: string;
    });
    getPluginDir(pluginName: string): string;
    getPluginDistDir(pluginName: string): string;
    getPluginWebDir(pluginName: string): string;
    getLoadedWebPlugins(): ServerWebPluginManifest[];
    private getPluginConfig;
    loadPlugins(reload?: boolean): Promise<void>;
    loadPlugin(pluginConfig: PluginConfig, reload?: boolean): Promise<void>;
    registerFields(fields: Record<string, any>[]): void;
    registerField(field: Record<string, any>): void;
    registerHttpHook(hook: HttpHookDefinition): void;
    registerFileFormat(pluginName: string, handler: ServerFileFormatHandler): () => void;
    unregisterFileFormat(pluginName: string, id: string): boolean;
    getFileFormatHandlers(): ServerFileFormatHandler[];
    getPreviewViewers(context: ServerPreviewViewerContext): Promise<ResolvedPreviewViewer[]>;
    processFile(filePath: string, context?: Record<string, any>): Promise<any>;
    getExtraFileList(filePath: string, context?: Record<string, any>): Promise<string[] | undefined>;
    getExtraFile(filePath: string, fileName: string, context?: Record<string, any>): Promise<string | undefined>;
    private getFileFormatHandler;
    runHttpHooks(context: HttpHookContext): Promise<boolean>;
    private matchesHttpHook;
    getPlugin<T>(name: string): T | undefined;
    isPluginLoaded(name: string): boolean;
    unloadPlugin(name: string): boolean;
    reloadPlugin(name: string): Promise<boolean>;
    /**
     * 从插件目录的 package.json + icon 文件提取展示 meta
     */
    private extractPluginMeta;
    getPluginsList(): any[];
    addPlugin(config: PluginConfig): Promise<void>;
    /**
     * 重新从 package.json 同步所有插件的展示 meta 到 plugins.json (供「检查更新」调用)
     */
    syncPluginsMeta(): number;
    /**
     * 获取所有已加载插件的路由定�?
     */
    getAllPluginRoutes(): PluginRouteDefinition[];
    /**
     * 获取指定插件的路由定�?
     */
    getPluginRoutes(pluginName: string): PluginRouteDefinition[];
    /**
     * 手动注册插件实例（用于测试或特殊用途）
     */
    registerPluginInstance(pluginName: string, pluginInstance: any): void;
}
//# sourceMappingURL=ServerPluginManager.d.ts.map