import { ReadonlySubject } from "@iyio/common";
import { Observable } from "rxjs";
import { ConversationOptions } from "./Conversation";
import { ConvoEdge, ConvoEdgePattern, ConvoGraphBeforeNextCallback, ConvoGraphMonitorEvent, ConvoGraphStore, ConvoNode, ConvoNodeExeState, ConvoTraverser, ConvoTraverserGroup, StartConvoTraversalOptions } from "./convo-graph-types";
import { ConvoTokenUsage } from "./convo-types";
export interface ConvoGraphCtrlOptions {
    store?: ConvoGraphStore;
    convoOptions?: ConversationOptions;
    maxConcurrentStepExe?: number;
    logEventsToConsole?: boolean;
    beforeNext?: ConvoGraphBeforeNextCallback;
}
export declare class ConvoGraphCtrl {
    readonly store: ConvoGraphStore;
    private readonly _tokenUsage;
    get tokenUsageSubject(): ReadonlySubject<ConvoTokenUsage>;
    get tokenUsage(): ConvoTokenUsage;
    private readonly _onMonitorEvent;
    get onMonitorEvent(): Observable<ConvoGraphMonitorEvent>;
    private get hasListeners();
    private triggerEvent;
    private readonly logEventsToConsole;
    private readonly beforeNext?;
    private readonly defaultConvoOptions;
    private getConvoOptionsAsync;
    addTokenUsage(usage: ConvoTokenUsage): void;
    readonly maxConcurrentStepExe: number;
    private readonly stepLock;
    constructor({ store, convoOptions, maxConcurrentStepExe, logEventsToConsole, beforeNext, }: ConvoGraphCtrlOptions);
    private readonly disposables;
    private _isDisposed;
    get isDisposed(): boolean;
    dispose(): void;
    startRunAsync(options: StartConvoTraversalOptions): Promise<ConvoTraverserGroup>;
    startTraversalAsync({ createTvOptions, edge, edgePattern, payload, state, saveToStore, cancel, traversers: traversersOpt, }: StartConvoTraversalOptions): Promise<ConvoTraverserGroup>;
    private createTvAsync;
    private _createTvAsync;
    /**
     * Moves the traverser to the "to" side of the edge and updates the traversers execution state.
     * If the target node of the edge can not be found the traverser's execution state will be
     * set to failed.
     */
    private traverseEdgeAsync;
    saveTraverserAsync(tv: ConvoTraverser): Promise<void>;
    runGroupAsync(group: ConvoTraverserGroup): Promise<void>;
    runAsync(tv: ConvoTraverser, group?: ConvoTraverserGroup): Promise<ConvoNodeExeState>;
    /**
     * Executes the current node the traverser in on then traverses to the next node or stops if
     * no matching edges are found.
     */
    nextAsync(tv: ConvoTraverser, group?: ConvoTraverserGroup): Promise<ConvoNodeExeState>;
    getNodeMetadataAsync(node: ConvoNode): Promise<import("./convo-graph-types").ConvoMetadataAndTypeMap>;
    private _nextAsync;
    /**
     * Returns all edges that match the given pattern
     */
    getEdgesAsync({ from, fromType, fromFn, input, workflow, }: ConvoEdgePattern): Promise<ConvoEdge[]>;
    private getSharedSourceAsync;
    private transformInputAsync;
    private executeStepAsync;
    private callTargetAsync;
}
