import { ExperimentsStorage } from '@mastra/core/storage'; import type { Experiment, ExperimentResult, ExperimentReviewCounts, ExperimentTenancyFilters, CreateExperimentInput, UpdateExperimentInput, AddExperimentResultInput, UpdateExperimentResultInput, UpsertExperimentResultInput, ListExperimentsInput, ListExperimentsOutput, ListExperimentResultsInput, ListExperimentResultsOutput, CreateIndexOptions, PruneOptions, PruneResult, RetentionTablesDescriptor, TableRetentionPolicy } from '@mastra/core/storage'; import type { PgDomainConfig } from '../../db/index.js'; export declare class ExperimentsPG extends ExperimentsStorage { #private; static readonly MANAGED_TABLES: readonly ["mastra_experiments", "mastra_experiment_results"]; /** * Experiments prune as whole units: an aged experiment and its result rows go * together, mirroring `deleteExperiment`. Anchored on `completedAt` (not the * `completedAtZ` mirror, which carries a `DEFAULT NOW()` this domain never * overrides — it holds insert time even for running rows). `completedAt` is * written as a UTC ISO string and stays NULL while running, so * `completedAt < cutoff` is false for in-flight experiments. */ static readonly retentionTables: RetentionTablesDescriptor; constructor(config: PgDomainConfig); static getExportDDL(schemaName?: string): string[]; init(): Promise; /** * Lazily ensures a btree index exists on each configured policy's retention * anchor column so age-based `prune()` deletes stay fast on large tables. * Called from the prune path (not init) so only deployments that configure * retention pay the index's write/disk overhead. Best-effort: failures are * logged and pruning proceeds (correct, just slower). * Created even with `skipDefaultIndexes` — retention is an explicit opt-in, * so its supporting index is not part of the default index set. */ private ensureRetentionIndexes; /** * Delete experiments whose `completedAt` is older than the policy's `maxAge`. * * Each batch selects up to `batchSize` aged experiments and deletes their * `experiment_results` rows and the experiment rows in one transaction — * mirroring `deleteExperiment` — so hitting `maxBatches`/`maxRows` or the * abort signal between batches never leaves a run hollow (parent kept, * results gone). NULL `completedAt` (still running) is excluded by the * `< cutoff` predicate. Bounds count whole experiments, not rows. */ prune(policies: Record, options?: PruneOptions): Promise; getDefaultIndexDefinitions(): CreateIndexOptions[]; createDefaultIndexes(): Promise; createCustomIndexes(): Promise; private transformExperimentRow; private transformExperimentResultRow; createExperiment(input: CreateExperimentInput): Promise; updateExperiment(input: UpdateExperimentInput): Promise; getExperimentById(args: { id: string; filters?: ExperimentTenancyFilters; }): Promise; listExperiments(args: ListExperimentsInput): Promise; deleteExperiment({ id, filters }: { id: string; filters?: ExperimentTenancyFilters; }): Promise; addExperimentResult(input: AddExperimentResultInput): Promise; upsertExperimentResult(input: UpsertExperimentResultInput): Promise; updateExperimentResult(input: UpdateExperimentResultInput): Promise; getExperimentResultById(args: { id: string; filters?: ExperimentTenancyFilters; }): Promise; listExperimentResults(args: ListExperimentResultsInput): Promise; deleteExperimentResults({ experimentId, filters, }: { experimentId: string; filters?: ExperimentTenancyFilters; }): Promise; getReviewSummary(): Promise; dangerouslyClearAll(): Promise; } //# sourceMappingURL=index.d.ts.map