import type { Logger } from '@o3r/logger';
import { Observable } from 'rxjs';
import { EngineDebugger } from './debug/engine.debug';
import { RulesEngineOptions } from './engine.interface';
import type { Fact, Facts } from './fact/index';
import { Operator, UnaryOperator } from './operator/index';
import { ActionBlock, Ruleset } from './structure';
/** Rules engine */
export declare class RulesEngine {
    /** Map of registered fact stream, this map is mutated by the ruleset executors */
    private readonly factMap;
    /** Subject containing the rulesets and the results stream*/
    private readonly rulesetMapSubject;
    /** Map of available operators */
    operators: Record<string, Operator<unknown, unknown>>;
    /** List of events for the current state of the rules engine */
    readonly events$: Observable<ActionBlock[]>;
    /** Delay before fact stream defaulting value */
    factDefaultDelay?: number;
    /**
     * Instance of engine debug object; Undefined if debugMode is not active
     */
    readonly engineDebug?: EngineDebugger;
    /** Name of the rules engine instance */
    readonly rulesEngineInstanceName: string;
    /**
     * Performance reporter to use for performance measurements.
     * @default window.performance on browser only, undefined on node
     */
    readonly performance: import("./engine.interface").CrossPlatformPerformance | undefined;
    /**
     * Log the engine errors
     */
    readonly logger?: Logger;
    /**
     * Flag to check if the run is in debug mode or not
     */
    get debugMode(): boolean;
    /**
     * Rules engine
     * @param options rules engine options
     */
    constructor(options?: RulesEngineOptions);
    /**
     * Attach debug events to actions stream if debug engine is activated
     */
    private handleActionsStreamOutput;
    /**
     * Create the actions stream event based on provided active rulesets ids; Handle debug too
     * @param ruleSets
     */
    private prepareActionsStream;
    /**
     * Create or retrieve a fact stream
     * The fact stream created will be registered in the engine
     * @param id ID of the fact to retrieve
     * @param factValue$ Value stream for the fact
     */
    retrieveOrCreateFactStream<T = Facts>(id: string, factValue$?: Observable<T>): Observable<T | undefined>;
    /**
     * Retrieve the promise of the latest value of a fact.
     * Return undefined if the fact is not defined.
     * @param id ID of the fact to retrieve
     */
    retrieveFactValue<T = unknown>(id: string): Promise<T | undefined> | undefined;
    /**
     * Update or insert fact in rules engine
     * @param facts fact list to add / update
     */
    upsertFacts<T = unknown>(facts: Fact<T> | Fact<T>[]): void;
    /**
     * Update or insert rule in rules engine
     * @param rulesets
     */
    upsertRulesets(rulesets: Ruleset[]): void;
    /**
     * Update or insert operator in rules engine
     * @param operators operator list to add / update
     */
    upsertOperators(operators: (Operator<any, any> | UnaryOperator<any>)[]): void;
    /**
     * Operator to apply on a stream of rulesets ids
     * Returns a stream of actions outputted by the rules engine, corresponding to the rulesetsIds
     */
    getEventStream<T extends ActionBlock = ActionBlock>(): (rulesetsIds$: Observable<string[] | undefined>) => Observable<T[]>;
    /** Get the list of registered facts names */
    getRegisteredFactsNames(): string[];
}
//# sourceMappingURL=engine.d.ts.map