export interface AttributionInput { /** UTM `medium` — the surface (e.g. 'statusline', 'enrollment', 'exhaustion'). */ medium: string; /** UTM `campaign` — the message kind ('disclosure' | 'promotional' | 'educational'). */ campaign: string; /** UTM `content` — the specific message id ('promo-meta-llm-routing' etc.). */ content: string; /** Static UTM `source` — always 'ruflo' but overridable for tests. */ source?: string; /** Injectable for deterministic tests. Defaults to the live clock. */ now?: Date; } /** * Return `url` with UTM parameters appended, and — when telemetry consent is * granted — a `fid` query parameter carrying the pseudonymous funnel ID. * Preserves any query parameters the base URL already carried. */ export declare function attributionUrl(url: string, input: AttributionInput): string; /** * Wrap the target URL in a server-side click-redirect so the analytics * function fires a `promo_open` event + records coarse geo before 302ing to * the real destination. * * Only applied to promotional messages (they have a real URL destination). * Disclosure/educational rows call attributionUrl directly. * * The click endpoint URL structure is: * https://funnel.ruv.io/v1/click/{messageId}?to= * * The server validates `to` against its own host allowlist, records the * event, and 302s. If the click endpoint is unreachable at OSC 8 time, * the browser falls back to the terminal's normal error page — but since * this is a rare failure path and impressions are already recorded, the * loss is bounded. */ export declare function clickTrackedUrl(messageId: string, targetUrl: string, input: AttributionInput): string; //# sourceMappingURL=attribution.d.ts.map