/** * Identity Manager * * Orchestrates user identification, property updates, and alias creation. * All state lives in UserManager; this layer owns validation, dedup, * event capture, and lifecycle events. */ import type { EventPayload, IdentityUpdate } from "../types"; /** * Minimal interface for the VTilt host. * Avoids circular dependency while giving IdentityManager access to * capture, user state reads, batched writes, session reset, and events. */ export interface IdentityHost { capture(name: string, payload: EventPayload): void; userManager: { getDistinctId(): string | null; getAnonymousId(): string; getDeviceId(): string; getUserState(): "anonymous" | "identified"; getUserIdentity(): Record; getUserProperties(): Record; applyUpdate(update: IdentityUpdate): void; reset(resetDeviceId?: boolean): void; }; sessionManager: { resetSessionId(): void; }; _emitter?: { emit(event: string, payload?: unknown): void; }; } export declare class IdentityManager { private _host; private _lastIdentifyHash; private _lastSetPropertiesHash; constructor(host: IdentityHost); /** * Identify a user. * * - Anonymous → identified: sends $identify (merge), persists after capture. * - Already identified, different user: sends $identify (re-identify). * - Same user, new properties only: delegates to setUserProperties. * - Identical consecutive calls are deduplicated (React re-render safety). */ identify(newDistinctId?: string, userPropertiesToSet?: Record, userPropertiesToSetOnce?: Record): void; /** * Set user properties without changing identity. * Dedup mirrors identify: identical consecutive calls are skipped. */ setUserProperties(userPropertiesToSet?: Record, userPropertiesToSetOnce?: Record): void; /** * Reset identity (logout). * Clears user data, generates new anonymous ID, resets session. */ resetUser(resetDeviceId?: boolean): void; /** * Create an alias linking two distinct IDs. * If alias matches current identity, falls back to identify(). */ alias(alias: string, original?: string): void; getUserIdentity(): Record; getDeviceId(): string; getUserState(): "anonymous" | "identified"; getDistinctId(): string; getAnonymousId(): string; }