import { MastraError } from '../../error/index.js';
import type { TargetType } from '../../storage/types.js';
import type { ItemWithScores } from './types.js';
export type ExperimentJsonValue = null | boolean | number | string | ExperimentJsonValue[] | {
    [key: string]: ExperimentJsonValue;
};
export interface ExperimentEventBase {
    version: 1;
    experimentId: string;
    sequence: number;
    timestamp: string;
    target: {
        type: TargetType | 'task';
        id: string;
    };
}
export interface ExperimentRunStartedEvent extends ExperimentEventBase {
    type: 'experiment.run.started';
    status: 'running';
    datasetId: string | null;
    datasetVersion: number | null;
    totalItems: number;
}
export interface ExperimentItemCompletedEvent extends ExperimentEventBase {
    type: 'experiment.item.completed';
    itemIndex: number;
    itemId: string;
    itemVersion: number;
    status: 'succeeded' | 'failed';
    input: ExperimentJsonValue;
    output: ExperimentJsonValue;
    groundTruth: ExperimentJsonValue;
    error: ExperimentJsonValue;
    persistenceError: ExperimentJsonValue;
    scores: ExperimentJsonValue;
    toolMockReport: ExperimentJsonValue;
    retryCount: number;
    startedAt: string;
    completedAt: string;
    traceId: string | null;
}
export interface ExperimentRunFinishedEvent extends ExperimentEventBase {
    type: 'experiment.run.finished';
    status: 'completed' | 'failed';
    outcome: 'completed' | 'failed' | 'cancelled';
    error: ExperimentJsonValue;
    totalItems: number;
    succeededCount: number;
    failedCount: number;
    skippedCount: number;
    persistenceFailures: number;
    completedWithErrors: boolean;
    startedAt: string;
    completedAt: string;
}
export type ExperimentEvent = ExperimentRunStartedEvent | ExperimentItemCompletedEvent | ExperimentRunFinishedEvent;
export type ExperimentEventObserver = (event: ExperimentEvent) => void | Promise<void>;
type EventInput = ExperimentEvent extends infer Event ? Event extends ExperimentEvent ? Omit<Event, 'version' | 'sequence' | 'timestamp'> : never : never;
export declare class ExperimentEventDispatcher {
    #private;
    readonly abortController: AbortController;
    get failure(): MastraError | undefined;
    constructor(experimentId: string, observer: ExperimentEventObserver);
    emit(input: EventInput): Promise<void>;
}
export declare function toExperimentJsonValue(value: unknown, seen?: WeakSet<object>): ExperimentJsonValue;
export declare function createItemCompletedEvent(base: Pick<ExperimentEventBase, 'experimentId' | 'target'>, itemIndex: number, result: ItemWithScores, traceId: string | null): EventInput;
export {};
//# sourceMappingURL=events.d.ts.map