/**
 * Module Registry
 *
 * Central registry for module discovery, validation, and management.
 * Implements singleton pattern for global access across the application.
 */
import type { ModuleMetadata, ModuleId, ValidationResult, ModuleCategory } from '../types/ModuleMetadata';
import { ModuleStatus } from '../types/ModuleMetadata';
export interface RegistryListener {
    onModuleRegistered?(module: ModuleMetadata): void;
    onModuleUnregistered?(module: ModuleMetadata): void;
    onModuleUpdated?(module: ModuleMetadata): void;
    onRegistryInitialized?(modules: ModuleMetadata[]): void;
    onRegistryError?(error: Error, moduleId?: string): void;
}
export interface RegistryOptions {
    enableCaching?: boolean;
    cacheTimeout?: number;
    validateOnRegister?: boolean;
    allowDuplicates?: boolean;
    autoInitialize?: boolean;
}
export declare class ModuleRegistry {
    private static instance;
    private modules;
    private registryListeners;
    private cache;
    private options;
    private initialized;
    private initializing;
    private eventEmitter;
    private constructor();
    /**
     * Event emitter methods - delegate to internal event emitter
     */
    on(event: string, listener: (...args: any[]) => void): this;
    once(event: string, listener: (...args: any[]) => void): this;
    off(event: string, listener: (...args: any[]) => void): this;
    emit(event: string, ...args: any[]): boolean;
    removeAllListeners(event?: string): this;
    listenerCount(event: string): number;
    listeners(event: string): ((...args: any[]) => void)[];
    /**
     * Get singleton instance of ModuleRegistry
     */
    static getInstance(options?: RegistryOptions): ModuleRegistry;
    /**
     * Reset singleton instance (mainly for testing)
     */
    static resetInstance(): void;
    /**
     * Initialize the registry with module discovery
     */
    initialize(): Promise<void>;
    /**
     * Register a module in the registry (with duplicate check)
     */
    registerModule(metadata: ModuleMetadata, source?: 'package' | 'config' | 'runtime' | 'discovery'): Promise<void>;
    /**
     * Register a module safely (won't throw if already registered)
     */
    registerModuleSafe(metadata: ModuleMetadata, source?: 'package' | 'config' | 'runtime' | 'discovery'): Promise<boolean>;
    /**
     * Unregister a module from the registry
     */
    unregisterModule(moduleId: ModuleId): boolean;
    /**
     * Update a module's metadata
     */
    updateModule(moduleId: ModuleId, updates: Partial<ModuleMetadata>): boolean;
    /**
     * Get a specific module by ID
     */
    getModule(moduleId: ModuleId): ModuleMetadata | undefined;
    /**
     * Get all registered modules
     */
    getAllModules(): ModuleMetadata[];
    /**
     * Get modules by category
     */
    getModulesByCategory(category: ModuleCategory): ModuleMetadata[];
    /**
     * Get modules by status
     */
    getModulesByStatus(status: ModuleStatus): ModuleMetadata[];
    /**
     * Get active modules only
     */
    getActiveModules(): ModuleMetadata[];
    /**
     * Get modules with specific permissions
     */
    getModulesWithPermissions(permissions: string[]): ModuleMetadata[];
    /**
     * Search modules by name, description, or tags
     */
    searchModules(query: string): ModuleMetadata[];
    /**
     * Check if a module is registered
     */
    hasModule(moduleId: ModuleId): boolean;
    /**
     * Get module count
     */
    getModuleCount(): number;
    /**
     * Validate module metadata
     */
    validateModule(metadata: ModuleMetadata): ValidationResult;
    /**
     * Add registry listener
     */
    addListener(listener: RegistryListener): void;
    /**
     * Remove registry listener
     */
    removeListener(listener: RegistryListener): void;
    /**
     * Clear all modules (mainly for testing)
     */
    clear(): void;
    /**
     * Get registry statistics
     */
    getStats(): {
        totalModules: number;
        categories: {
            [k: string]: number;
        };
        statuses: {
            [k: string]: number;
        };
        initialized: boolean;
        cacheEnabled: boolean;
    };
    /**
     * Notify all listeners of an event
     */
    private notifyListeners;
}
//# sourceMappingURL=ModuleRegistry.d.ts.map