import type { Actor, Channel } from '../types';
import type { TelemetryAnomalyMonitor } from './anomaly';
import type { TelemetryEventDef, TelemetryRegistry, TelemetrySpec } from './spec';
export interface TelemetryEventContext {
    tenantId?: string;
    organizationId?: string | null;
    userId?: string | null;
    sessionId?: string | null;
    actor?: Actor;
    channel?: Channel;
    metadata?: Record<string, unknown>;
}
export interface TelemetryDispatch {
    id: string;
    name: string;
    version: string;
    occurredAt: string;
    properties: Record<string, unknown>;
    privacy: TelemetryEventDef['privacy'];
    context: TelemetryEventContext;
    tags?: string[];
    spec: TelemetrySpec;
    definition: TelemetryEventDef;
}
export interface RuntimeTelemetryProvider {
    id: string;
    send(event: TelemetryDispatch): Promise<void>;
}
export interface TelemetryTrackerOptions {
    registry: TelemetryRegistry;
    providers?: RuntimeTelemetryProvider[];
    anomalyMonitor?: TelemetryAnomalyMonitor;
    random?: () => number;
    clock?: () => Date;
}
export declare class TelemetryTracker {
    private readonly providers;
    private readonly registry;
    private readonly anomalyMonitor?;
    private readonly random;
    private readonly clock;
    constructor(options: TelemetryTrackerOptions);
    registerProvider(provider: RuntimeTelemetryProvider): void;
    unregisterProvider(providerId: string): void;
    track(name: string, version: string, properties: Record<string, unknown>, context?: TelemetryEventContext): Promise<boolean>;
    private shouldSample;
    private redactProperties;
}
