import { ElementType } from '../portfolio/types.js';
import { IElement, IElementMetadata } from '../types/elements/IElement.js';
export type ElementLifecycleEvent = 'element:load:start' | 'element:load:success' | 'element:load:error' | 'element:save:start' | 'element:save:success' | 'element:save:error' | 'element:delete:start' | 'element:delete:success' | 'element:delete:error' | 'element:activate' | 'element:deactivate' | 'element:cache:refresh' | 'element:cache:evict' | 'element:external-change' | 'element:lock-timeout';
export interface ElementEventPayload {
    correlationId: string;
    elementType: ElementType;
    elementId?: string;
    filePath?: string;
    metadata?: Partial<IElementMetadata>;
    generation?: number;
    error?: unknown;
    extra?: Record<string, unknown>;
}
export type ElementEventHandler = (payload: ElementEventPayload) => void | Promise<void>;
/**
 * Lightweight dispatcher for element lifecycle events.
 * Provides minimal EventEmitter wrapper with immutable payload semantics.
 */
export declare class ElementEventDispatcher {
    private readonly emitter;
    private static shared;
    /**
     * Subscribe to an event. Returns an unsubscribe function.
     */
    on(event: ElementLifecycleEvent, handler: ElementEventHandler): () => void;
    /**
     * Subscribe once.
     */
    once(event: ElementLifecycleEvent, handler: ElementEventHandler): () => void;
    /**
     * Emit synchronously (used for start/veto events).
     */
    emit(event: ElementLifecycleEvent, payload: ElementEventPayload): void;
    /**
     * Emit asynchronously to decouple observers.
     */
    emitAsync(event: ElementLifecycleEvent, payload: ElementEventPayload): void;
    /**
     * Utility helper to snapshot minimal metadata from element instances.
     */
    static snapshotMetadata(element?: IElement): Partial<IElementMetadata> | undefined;
    /**
     * Shared singleton dispatcher used when managers don't inject their own.
     */
    static getSharedDispatcher(): ElementEventDispatcher;
}
//# sourceMappingURL=ElementEventDispatcher.d.ts.map