/** * Operational telemetry — emits anonymized, bucketed events to the * Servicialo registry so the network can aggregate market-level benchmarks * without exposing raw prices, durations, or identities. * * Schema reference: * https://servicialo.com/schema/telemetry/operational-event.schema.json */ export type LeadTimeBucket = 'same_day' | '1-2_days' | '3-7_days' | '1-2_weeks' | '2-4_weeks' | '1+_months'; export type SlotHourBucket = '00-06' | '06-09' | '09-12' | '12-15' | '15-18' | '18-21' | '21-24'; export type DurationBucket = 'under_15min' | '15-30min' | '30-60min' | '60-90min' | '90-120min' | 'over_120min'; export type PriceBand = '0-10k' | '10-25k' | '25-50k' | '50-100k' | '100-250k' | '250-500k' | '500k-1M' | '1M+'; export type TimeToCollectBucket = 'immediate' | 'within_24h' | '1-7_days' | '1-4_weeks' | 'over_1_month' | 'uncollected'; export type TimeToResolveBucket = 'under_24h' | '1-3_days' | '3-7_days' | '1-2_weeks' | 'over_2_weeks' | 'unresolved'; export declare function bucketLeadTime(bookedAt: Date, startsAt: Date): LeadTimeBucket; export declare function bucketSlotHour(startsAt: Date): SlotHourBucket; export declare function bucketDurationMinutes(minutes: number): DurationBucket; /** * Bucket price assuming CLP-equivalent. Emitters convert via daily FX before bucketing. */ export declare function bucketPriceCLP(amount: number): PriceBand; export declare function bucketTimeToCollect(completedAt: Date, settledAt: Date): TimeToCollectBucket; export declare function bucketTimeToResolve(openedAt: Date, resolvedAt: Date | null): TimeToResolveBucket; /** * ISO weekday: Monday=1 … Sunday=7. JS Date.getDay() returns Sunday=0, * which is incompatible with ISO 8601. */ export declare function isoWeekday(date: Date): number; /** * Stable, irreversible per-contributor fingerprint. Same org_slug → same * fingerprint across all events, so the registry can apply k-anonymity * (≥5 distinct fingerprints per segment) without learning the slug. */ export declare function computeOrgFingerprint(orgSlug: string): string; export interface OperationalEvent { protocol_version: string; node_version?: string; event_type: 'booking_created' | 'service_completed' | 'dispute_opened' | 'payment_settled'; vertical: string; region: string; occurred_at: string; org_fingerprint?: string; payload: Record; } interface EmitterContext { protocolVersion: string; nodeVersion: string; vertical: string; region: string; orgSlug?: string; } /** * Read emitter context from env vars. Called once at MCP server startup. */ export declare function loadEmitterContext(nodeVersion: string): EmitterContext; export declare function buildBookingCreatedEvent(ctx: EmitterContext, args: { startsAt: string; bookedAt?: string; channel?: 'agent' | 'human'; }): OperationalEvent; export declare function buildServiceCompletedEvent(ctx: EmitterContext, args: { completedAt?: string; durationMinutes: number; outcome: 'completed' | 'no_show_client' | 'no_show_provider' | 'partial' | 'canceled_late'; evidenceCompleteness?: 'complete' | 'partial' | 'missing'; }): OperationalEvent; export declare function buildDisputeOpenedEvent(ctx: EmitterContext, args: { openedAt?: string; openedBy: 'client' | 'provider' | 'organization'; reasonCategory: 'quality' | 'no_show' | 'billing' | 'scope' | 'evidence_missing' | 'other'; }): OperationalEvent; export declare function buildPaymentSettledEvent(ctx: EmitterContext, args: { settledAt?: string; completedAt: string; amountCLP: number; currency: string; paymentMethod: 'cash' | 'transfer' | 'card_credit' | 'card_debit' | 'insurance' | 'voucher' | 'subscription' | 'other'; }): OperationalEvent; /** * Fire-and-forget POST to the registry. Never throws, never blocks the caller * past TELEMETRY_TIMEOUT_MS. */ export declare function emitOperational(event: OperationalEvent): void; export {}; //# sourceMappingURL=operational.d.ts.map