veo-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/contract/v1.ts","../src/utils/safe-env.ts","../src/utils/uuid.ts","../src/core/queue.ts","../src/core/session.ts","../src/core/storage.ts","../src/core/transport.ts","../src/core/client.ts","../src/plugins/plugin.ts","../src/plugins/autocapture/constants.ts","../src/plugins/autocapture/pii-guard.ts","../src/plugins/autocapture/selector-builder.ts","../src/plugins/autocapture/element-serializer.ts","../src/plugins/autocapture/throttle.ts","../src/plugins/autocapture/dom-listener.ts","../src/plugins/autocapture/index.ts","../src/plugins/guides/constants.ts","../src/plugins/guides/guide-frequency-cache.ts","../src/plugins/guides/guide-resolver-client.ts","../src/plugins/guides/guide-tracker-client.ts","../src/plugins/guides/guide-tracker-queue.ts","../src/plugins/guides/block-builder.ts","../src/plugins/guides/styles.ts","../src/plugins/guides/renderers/base-renderer.ts","../src/plugins/guides/renderers/banner-renderer.ts","../src/plugins/guides/wait-for-element.ts","../src/plugins/guides/renderers/custom-renderer.ts","../src/plugins/guides/renderers/modal-renderer.ts","../src/plugins/guides/renderers/tooltip-renderer.ts","../src/plugins/guides/walkthrough-block-builder.ts","../src/plugins/guides/renderers/walkthrough-renderer.ts","../src/plugins/guides/walkthrough-state.ts","../src/plugins/guides/guides-controller.ts","../src/plugins/guides/index.ts","../src/plugins/spa-router.ts","../src/index.ts"],"names":["END_USER_ID_KEY","classes","classPart","computePosition","offset","flip","shift"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Tipos del contrato HTTP entre el SDK y el backend.\n * Versión 1.\n *\n * IMPORTANTE: Si cambias algo aquí, debes actualizar también:\n * - veo-backend/src/modules/identity/dto/*.dto.ts\n * - veo-backend/src/modules/ingest/dto/*.dto.ts\n * - CONTRACT.md\n */\n\nexport const SDK_VERSION = '0.0.1';\nexport const MAX_BATCH_SIZE = 100;\nexport const DEFAULT_FLUSH_INTERVAL_MS = 5000;\nexport const DEFAULT_FLUSH_BATCH_SIZE = 20;\n\n/**\n * Tipos de eventos que el SDK envía.\n * Debe coincidir con el CHECK constraint de veo_user_actions.action_type.\n */\nexport type ActionType = 'pageview' | 'track' | 'identify' | 'guide';\n\n/**\n * Payload de un evento individual enviado al endpoint POST /v1/events.\n */\nexport interface ActionPayload {\n actionId: string; // UUID v7 generado en cliente\n endUserId: string;\n organizationId?: string;\n sessionId: string;\n actionType: ActionType;\n actionName?: string;\n occurredAt: string; // ISO 8601\n pageUrl?: string;\n pagePath?: string;\n pageTitle?: string;\n pageReferrer?: string;\n actionProperties?: Record<string, unknown>;\n}\n\n/**\n * Request del endpoint POST /v1/events.\n */\nexport interface IngestEventsRequest {\n events: ActionPayload[]; // máx 100\n}\n\n/**\n * Response del endpoint POST /v1/events.\n */\nexport interface IngestEventsResponse {\n accepted: number;\n deduped: number;\n}\n\n/**\n * Request del endpoint POST /v1/identify.\n */\nexport interface IdentifyRequest {\n endUser: {\n id: string;\n anonymousId?: string;\n traits?: Record<string, unknown>;\n };\n organization?: {\n id: string;\n attributes?: Record<string, unknown>;\n };\n}\n\n/**\n * Response del endpoint POST /v1/identify.\n */\nexport interface IdentifyResponse {\n endUserId: string;\n organizationId: string | null;\n workspaceId: string;\n}\n\n/**\n * Response de error estándar del backend.\n */\nexport interface ErrorResponse {\n error: string;\n details?: unknown;\n statusCode: number;\n}\n","/**\n * Helpers para detectar el entorno de ejecución (browser vs SSR/Node) y la\n * disponibilidad de APIs del navegador. El SDK debe poder importarse en Node\n * sin romperse, por eso todo acceso a globals del browser pasa por aquí.\n */\n\n/** ¿Existe el objeto global `window`? */\nexport function hasWindow(): boolean {\n return typeof window !== 'undefined';\n}\n\n/** ¿Existe el objeto global `document`? */\nexport function hasDocument(): boolean {\n return typeof document !== 'undefined';\n}\n\n/** ¿`localStorage` está disponible y es escribible? (puede fallar en modo incógnito) */\nexport function hasLocalStorage(): boolean {\n try {\n if (typeof localStorage === 'undefined') return false;\n const testKey = '__veo_test__';\n localStorage.setItem(testKey, '1');\n localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n}\n\n/** ¿`navigator.sendBeacon` está disponible? */\nexport function hasNavigatorSendBeacon(): boolean {\n return typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function';\n}\n","/**\n * Genera un UUID v7 (timestamp-based, ordenable cronológicamente).\n * Spec: RFC 9562.\n *\n * Formato: tttttttt-tttt-7xxx-yxxx-xxxxxxxxxxxx\n * - 48 bits de timestamp (ms desde epoch)\n * - 4 bits de versión (7)\n * - 2 bits de variante (10)\n * - 74 bits aleatorios\n */\nexport function uuidv7(): string {\n const timestamp = Date.now();\n const timeHex = timestamp.toString(16).padStart(12, '0');\n\n // 10 bytes aleatorios para los 74 bits de entropía (+ bits de versión/variante).\n const random = new Uint8Array(10);\n if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {\n crypto.getRandomValues(random);\n } else {\n // Fallback inseguro pero funcional (no debería ocurrir en browsers modernos).\n for (let i = 0; i < random.length; i++) {\n random[i] = Math.floor(Math.random() * 256);\n }\n }\n\n // Set version (7) en el primer nibble del 3er grupo.\n random[0] = ((random[0] ?? 0) & 0x0f) | 0x70;\n // Set variant (10) en los 2 bits altos del 4to grupo.\n random[2] = ((random[2] ?? 0) & 0x3f) | 0x80;\n\n const hex = Array.from(random, (b) => b.toString(16).padStart(2, '0')).join('');\n\n return [\n timeHex.slice(0, 8),\n timeHex.slice(8, 12),\n hex.slice(0, 4),\n hex.slice(4, 8),\n hex.slice(8, 20),\n ].join('-');\n}\n","import type { Transport } from './transport';\n\nexport interface QueueConfig {\n transport: Transport;\n flushIntervalMs: number;\n batchSize: number;\n maxRetries?: number;\n onError?: (error: Error) => void;\n}\n\nconst RETRY_MAX_DELAY_MS = 30000;\n\n/**\n * Buffer de eventos con envío en batch, flush por intervalo o por tamaño, y\n * reintentos con backoff exponencial ante fallos de red. Los eventos que fallan\n * se re-encolan al inicio para preservar el orden.\n */\nexport class Queue<T = unknown> {\n private buffer: T[] = [];\n private timer: ReturnType<typeof setInterval> | null = null;\n private flushing = false;\n private retryCount = 0;\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(private readonly config: QueueConfig) {\n this.startTimer();\n }\n\n /** Encola un evento; dispara flush si se alcanza `batchSize`. */\n add(item: T): void {\n this.buffer.push(item);\n if (this.buffer.length >= this.config.batchSize) {\n void this.flush();\n }\n }\n\n /** Flush manual vía `fetch`. Resuelve cuando termina (los retries son diferidos). */\n async flush(): Promise<void> {\n if (this.flushing || this.buffer.length === 0) return;\n\n this.flushing = true;\n const batch = this.buffer.splice(0, this.buffer.length);\n\n try {\n await this.config.transport.send('/v1/events', { events: batch });\n this.retryCount = 0;\n } catch (error) {\n // Re-encolar al INICIO para preservar el orden cronológico.\n this.buffer.unshift(...batch);\n this.scheduleRetry();\n this.config.onError?.(error as Error);\n } finally {\n this.flushing = false;\n }\n }\n\n /** Flush síncrono vía `sendBeacon`, para `pagehide`/`visibilitychange`. */\n flushBeacon(): void {\n if (this.buffer.length === 0) return;\n const batch = this.buffer.splice(0, this.buffer.length);\n const success = this.config.transport.sendBeacon('/v1/events', { events: batch });\n if (!success) {\n // La página se está cerrando; re-encolar es poco útil pero evita pérdida si no se cierra.\n this.buffer.unshift(...batch);\n }\n }\n\n /** Detiene timers internos. Llamar al destruir el cliente. */\n destroy(): void {\n if (this.timer) clearInterval(this.timer);\n if (this.retryTimer) clearTimeout(this.retryTimer);\n this.timer = null;\n this.retryTimer = null;\n }\n\n private startTimer(): void {\n this.timer = setInterval(() => {\n void this.flush();\n }, this.config.flushIntervalMs);\n }\n\n private scheduleRetry(): void {\n const maxRetries = this.config.maxRetries ?? 3;\n if (this.retryCount >= maxRetries) {\n this.retryCount = 0;\n return;\n }\n\n this.retryCount++;\n // Backoff exponencial: 1s, 2s, 4s, 8s... con tope de 30s.\n const delayMs = Math.min(1000 * 2 ** (this.retryCount - 1), RETRY_MAX_DELAY_MS);\n\n if (this.retryTimer) clearTimeout(this.retryTimer);\n this.retryTimer = setTimeout(() => {\n void this.flush();\n }, delayMs);\n }\n}\n","import { uuidv7 } from '../utils/uuid';\nimport type { StorageAdapter } from './storage';\n\nconst ANONYMOUS_ID_KEY = 'anonymous_user_id';\nconst END_USER_ID_KEY = 'end_user_id';\nconst SESSION_ID_KEY = 'session_id';\nconst SESSION_LAST_ACTIVE_KEY = 'session_last_active';\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutos\n\n/**\n * Gestiona la identidad triple del SDK:\n * - `anonymousId`: persiste indefinidamente (≥ 1 año).\n * - `endUserId`: presente tras `identify()`.\n * - `sessionId`: se renueva tras 30 min de inactividad.\n */\nexport class Session {\n private _anonymousId: string;\n private _sessionId: string;\n private _endUserId: string | null = null;\n\n constructor(private readonly storage: StorageAdapter) {\n this._anonymousId = this.loadOrCreateAnonymousId();\n this._sessionId = this.loadOrCreateSession();\n // Restaurar la identidad persistida: sin esto el SDK \"olvida\" al usuario\n // en cada recarga y los eventos posteriores caen al anonymous_id hasta\n // que la app vuelva a llamar identify(). Persistimos end_user_id en\n // setEndUserId(), así que también hay que rehidratarlo acá.\n this._endUserId = this.storage.get(END_USER_ID_KEY);\n }\n\n get anonymousId(): string {\n return this._anonymousId;\n }\n\n get sessionId(): string {\n return this._sessionId;\n }\n\n get endUserId(): string | null {\n return this._endUserId;\n }\n\n /** ID a usar como visitor en eventos (end_user_id si está identificado, si no anonymous). */\n get effectiveUserId(): string {\n return this._endUserId ?? this._anonymousId;\n }\n\n setEndUserId(id: string): void {\n this._endUserId = id;\n this.storage.set(END_USER_ID_KEY, id);\n }\n\n /** Renueva el timestamp de actividad. Si pasaron > 30 min, genera nueva sesión. */\n touch(): void {\n const lastActive = this.storage.get(SESSION_LAST_ACTIVE_KEY);\n const now = Date.now();\n\n if (lastActive && now - Number.parseInt(lastActive, 10) > SESSION_TIMEOUT_MS) {\n this._sessionId = uuidv7();\n this.storage.set(SESSION_ID_KEY, this._sessionId);\n }\n\n this.storage.set(SESSION_LAST_ACTIVE_KEY, String(now));\n }\n\n /** Limpia la identidad (reset) pero conserva el anonymous_id. */\n reset(): void {\n this._endUserId = null;\n this.storage.remove(END_USER_ID_KEY);\n // Regenerar sesión.\n this._sessionId = uuidv7();\n this.storage.set(SESSION_ID_KEY, this._sessionId);\n this.storage.set(SESSION_LAST_ACTIVE_KEY, String(Date.now()));\n }\n\n private loadOrCreateAnonymousId(): string {\n let id = this.storage.get(ANONYMOUS_ID_KEY);\n if (!id) {\n id = uuidv7();\n this.storage.set(ANONYMOUS_ID_KEY, id);\n }\n return id;\n }\n\n private loadOrCreateSession(): string {\n const existing = this.storage.get(SESSION_ID_KEY);\n const lastActive = this.storage.get(SESSION_LAST_ACTIVE_KEY);\n\n if (existing && lastActive) {\n const elapsed = Date.now() - Number.parseInt(lastActive, 10);\n if (elapsed < SESSION_TIMEOUT_MS) {\n return existing;\n }\n }\n\n const newId = uuidv7();\n this.storage.set(SESSION_ID_KEY, newId);\n this.storage.set(SESSION_LAST_ACTIVE_KEY, String(Date.now()));\n return newId;\n }\n}\n","import { hasDocument, hasLocalStorage } from '../utils/safe-env';\n\n/**\n * Contrato común de todos los backends de almacenamiento persistente.\n * Las claves se guardan internamente con el prefijo `veo:`.\n */\nexport interface StorageAdapter {\n get(key: string): string | null;\n set(key: string, value: string, options?: { ttlMs?: number }): void;\n remove(key: string): void;\n /** Borra únicamente las claves del SDK (prefijo `veo:`). */\n clear(): void;\n}\n\nconst STORAGE_PREFIX = 'veo:';\n/** TTL por defecto para cookies (1 año), satisface la persistencia del anonymous id. */\nconst ONE_YEAR_MS = 365 * 24 * 60 * 60 * 1000;\n\n/** Backend basado en `localStorage`. Persistencia indefinida (ignora `ttlMs`). */\nclass LocalStorageAdapter implements StorageAdapter {\n get(key: string): string | null {\n return localStorage.getItem(STORAGE_PREFIX + key);\n }\n\n set(key: string, value: string): void {\n try {\n localStorage.setItem(STORAGE_PREFIX + key, value);\n } catch {\n // Cuota llena o storage bloqueado: ignorar silenciosamente.\n }\n }\n\n remove(key: string): void {\n localStorage.removeItem(STORAGE_PREFIX + key);\n }\n\n clear(): void {\n const toRemove: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(STORAGE_PREFIX)) toRemove.push(key);\n }\n for (const key of toRemove) localStorage.removeItem(key);\n }\n}\n\n/** Lee y trocea `document.cookie`. Solo se invoca cuando hay `document`. */\nfunction readCookies(): string[] {\n const raw = document.cookie;\n return raw === '' ? [] : raw.split('; ');\n}\n\n/** Backend basado en cookies de primer nivel. Usa `ttlMs` (default 1 año). */\nclass CookieAdapter implements StorageAdapter {\n get(key: string): string | null {\n const name = `${STORAGE_PREFIX}${key}=`;\n for (const cookie of readCookies()) {\n if (cookie.startsWith(name)) {\n return decodeURIComponent(cookie.slice(name.length));\n }\n }\n return null;\n }\n\n set(key: string, value: string, options?: { ttlMs?: number }): void {\n const maxAgeSec = Math.floor((options?.ttlMs ?? ONE_YEAR_MS) / 1000);\n const secure =\n typeof location !== 'undefined' && location.protocol === 'https:' ? '; Secure' : '';\n // biome-ignore lint/suspicious/noDocumentCookie: necesitamos escritura síncrona y cero deps; la Cookie Store API es async y no universal.\n document.cookie = `${STORAGE_PREFIX}${key}=${encodeURIComponent(\n value,\n )}; Path=/; Max-Age=${maxAgeSec}; SameSite=Lax${secure}`;\n }\n\n remove(key: string): void {\n // biome-ignore lint/suspicious/noDocumentCookie: ver set(); expiramos la cookie con Max-Age=0.\n document.cookie = `${STORAGE_PREFIX}${key}=; Path=/; Max-Age=0; SameSite=Lax`;\n }\n\n clear(): void {\n for (const cookie of readCookies()) {\n const eq = cookie.indexOf('=');\n const name = eq === -1 ? cookie : cookie.slice(0, eq);\n if (name.startsWith(STORAGE_PREFIX)) {\n this.remove(name.slice(STORAGE_PREFIX.length));\n }\n }\n }\n}\n\n/** Backend en memoria. Fallback cuando no hay browser storage (SSR, incógnito). */\nclass MemoryAdapter implements StorageAdapter {\n private store = new Map<string, string>();\n\n get(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n remove(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n}\n\n/**\n * Crea el adapter de almacenamiento, respetando la preferencia del usuario y\n * cayendo a la mejor alternativa disponible si la preferida no existe.\n */\nexport function createStorage(\n preferred: 'localStorage' | 'cookie' | 'memory' = 'localStorage',\n): StorageAdapter {\n if (preferred === 'localStorage' && hasLocalStorage()) return new LocalStorageAdapter();\n if (preferred === 'cookie' && hasDocument()) return new CookieAdapter();\n if (preferred === 'memory') return new MemoryAdapter();\n\n // Cadena de fallback.\n if (hasLocalStorage()) return new LocalStorageAdapter();\n if (hasDocument()) return new CookieAdapter();\n return new MemoryAdapter();\n}\n","import { hasNavigatorSendBeacon } from '../utils/safe-env';\n\nexport interface TransportConfig {\n apiUrl: string;\n apiKey: string;\n sdkVersion: string;\n timeoutMs?: number;\n}\n\n/** Error de transporte con el código HTTP asociado (0 si fue un fallo de red). */\nexport class TransportError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n ) {\n super(message);\n this.name = 'TransportError';\n }\n}\n\n/**\n * Capa de red del SDK. Envía JSON al backend vía `fetch` (con timeout) y\n * ofrece `sendBeacon` para descargas fiables al cerrar la página.\n */\nexport class Transport {\n constructor(private readonly config: TransportConfig) {}\n\n /** Envío normal con `fetch`. Lanza `TransportError` si la respuesta no es OK. */\n async send<T = unknown>(path: string, body: unknown): Promise<T> {\n const url = `${this.config.apiUrl}${path}`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeoutMs ?? 10000);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Api-Key': this.config.apiKey,\n 'X-Sdk-Version': this.config.sdkVersion,\n },\n body: JSON.stringify(body),\n keepalive: true,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new TransportError(`HTTP ${response.status}`, response.status);\n }\n\n return (await response.json()) as T;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Envío con `navigator.sendBeacon`. Fire-and-forget, pensado para `pagehide`.\n * Como sendBeacon no admite headers, la API key viaja por query string.\n */\n sendBeacon(path: string, body: unknown): boolean {\n if (!hasNavigatorSendBeacon()) return false;\n\n const url = new URL(`${this.config.apiUrl}${path}`);\n url.searchParams.set('key', this.config.apiKey);\n url.searchParams.set('v', this.config.sdkVersion);\n\n const blob = new Blob([JSON.stringify(body)], { type: 'application/json' });\n return navigator.sendBeacon(url.toString(), blob);\n }\n}\n","import type { ActionPayload, ActionType, IdentifyRequest } from '../contract/v1';\nimport { DEFAULT_FLUSH_BATCH_SIZE, DEFAULT_FLUSH_INTERVAL_MS, SDK_VERSION } from '../contract/v1';\nimport type {\n VeoClient,\n VeoClientEventListener,\n VeoClientEventName,\n VeoClientEvents,\n VeoConfig,\n VeoOrganization,\n VeoPlugin,\n VeoVisitor,\n} from '../types';\nimport { hasDocument, hasWindow } from '../utils/safe-env';\nimport { uuidv7 } from '../utils/uuid';\nimport { Queue } from './queue';\nimport { Session } from './session';\nimport { createStorage, type StorageAdapter } from './storage';\nimport { Transport } from './transport';\n\nconst ORGANIZATION_ID_KEY = 'organization_id';\nconst END_USER_ID_KEY = 'end_user_id';\nconst IDENTIFY_SIG_KEY = 'identify_signature';\n\n/**\n * `JSON.stringify` con claves ordenadas (recursivo) para que la firma de\n * identidad sea estable sin importar el orden en que la app arme el objeto\n * de traits/attributes. Sin esto, `{a,b}` y `{b,a}` darían firmas distintas\n * y el identify se reenviaría sin que nada haya cambiado.\n */\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value) ?? 'null';\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`;\n const entries = Object.keys(value as Record<string, unknown>)\n .sort()\n .map((k) => `${JSON.stringify(k)}:${stableStringify((value as Record<string, unknown>)[k])}`);\n return `{${entries.join(',')}}`;\n}\n\n/** Campos opcionales que cada API pública aporta al construir el evento. */\ninterface EnqueueInput {\n actionType: ActionType;\n actionName?: string;\n pageUrl?: string;\n pagePath?: string;\n pageTitle?: string;\n pageReferrer?: string;\n actionProperties?: Record<string, unknown>;\n}\n\n/**\n * Cliente principal del SDK. Expone la API pública (`identify`, `track`,\n * `pageview`, `reset`, `flush`, `use`). Toda la API salvo `flush()` es síncrona:\n * los eventos se encolan y la llamada retorna de inmediato.\n */\nexport class Client implements VeoClient {\n private readonly transport: Transport;\n private readonly storage: StorageAdapter;\n private readonly session: Session;\n private readonly queue: Queue<ActionPayload>;\n private readonly plugins: VeoPlugin[] = [];\n private currentOrganizationId: string | null = null;\n private readonly listeners: {\n [E in VeoClientEventName]: Set<VeoClientEventListener<E>>;\n } = {\n pageview: new Set(),\n identify: new Set(),\n };\n\n constructor(private readonly config: VeoConfig) {\n if (!config.apiKey) throw new Error('apiKey is required');\n if (!config.apiUrl) throw new Error('apiUrl is required');\n\n this.storage = createStorage(config.storage ?? 'localStorage');\n this.session = new Session(this.storage);\n\n this.transport = new Transport({\n apiKey: config.apiKey,\n apiUrl: config.apiUrl.replace(/\\/$/, ''),\n sdkVersion: SDK_VERSION,\n });\n\n this.queue = new Queue<ActionPayload>({\n transport: this.transport,\n flushIntervalMs: config.flushInterval ?? DEFAULT_FLUSH_INTERVAL_MS,\n batchSize: config.flushBatchSize ?? DEFAULT_FLUSH_BATCH_SIZE,\n onError: (err) => {\n if (config.debug) console.error('[veo] flush error:', err);\n },\n });\n\n // Rehidratar identidad persistida.\n const persistedUserId = this.storage.get(END_USER_ID_KEY);\n if (persistedUserId) this.session.setEndUserId(persistedUserId);\n\n const persistedOrgId = this.storage.get(ORGANIZATION_ID_KEY);\n if (persistedOrgId) this.currentOrganizationId = persistedOrgId;\n\n this.setupUnloadHandlers();\n\n if (config.debug) {\n console.log('[veo] initialized', {\n anonymousId: this.session.anonymousId,\n sessionId: this.session.sessionId,\n endUserId: this.session.endUserId,\n });\n }\n }\n\n identify(payload: { visitor: VeoVisitor; organization?: VeoOrganization }): void {\n const { visitor, organization } = payload;\n\n // Idempotencia: si ya estamos identificados como este visitor y ni los\n // traits ni la organización cambiaron, no reenviamos. Esto evita el spam\n // de identify cuando la app lo llama en cada carga/navegación (un patrón\n // común y recomendado): el SDK absorbe la repetición en vez de generar un\n // evento `identify` y un POST /v1/identify por cada render.\n const signature = stableStringify({\n id: visitor.id,\n traits: visitor.traits ?? {},\n org: organization ? { id: organization.id, attributes: organization.attributes ?? {} } : null,\n });\n if (this.session.endUserId === visitor.id && this.storage.get(IDENTIFY_SIG_KEY) === signature) {\n if (this.config.debug) console.debug('[veo] identify: sin cambios, omitido');\n return;\n }\n\n // Capturar el anonymous previo ANTES de mutar la identidad, para el merge en backend.\n const previousAnonymousId =\n this.session.endUserId === null ? this.session.anonymousId : undefined;\n\n this.session.setEndUserId(visitor.id);\n if (organization) {\n this.currentOrganizationId = organization.id;\n this.storage.set(ORGANIZATION_ID_KEY, organization.id);\n }\n\n // 1. Upsert de traits/attributes en /v1/identify (fire-and-forget).\n const endUser: IdentifyRequest['endUser'] = {\n id: visitor.id,\n traits: visitor.traits ?? {},\n ...(previousAnonymousId !== undefined ? { anonymousId: previousAnonymousId } : {}),\n };\n const body: IdentifyRequest = {\n endUser,\n ...(organization\n ? { organization: { id: organization.id, attributes: organization.attributes ?? {} } }\n : {}),\n };\n void this.transport.send('/v1/identify', body).catch((err) => {\n if (this.config.debug) console.error('[veo] identify failed:', err);\n });\n\n // 2. Registrar el evento \"identify\" en el log de acciones.\n this.enqueue({\n actionType: 'identify',\n actionProperties: {\n traits: visitor.traits,\n organizationAttributes: organization?.attributes,\n },\n });\n\n this.storage.set(IDENTIFY_SIG_KEY, signature);\n\n this.emit('identify', { endUserId: visitor.id, sessionId: this.session.sessionId });\n }\n\n track(name: string, properties?: Record<string, unknown>): void {\n if (!name || typeof name !== 'string') {\n if (this.config.debug) console.error('[veo] track: name is required');\n return;\n }\n this.enqueue({\n actionType: 'track',\n actionName: name,\n ...(properties !== undefined ? { actionProperties: properties } : {}),\n });\n }\n\n pageview(path?: string): void {\n if (!hasDocument()) return;\n\n const url = window.location.href;\n const pagePath = path ?? window.location.pathname;\n\n this.enqueue({\n actionType: 'pageview',\n pageUrl: url,\n pagePath,\n pageTitle: document.title,\n pageReferrer: document.referrer,\n });\n\n this.emit('pageview', {\n url,\n path: pagePath,\n sessionId: this.session.sessionId,\n endUserId: this.session.endUserId,\n });\n }\n\n reset(): void {\n this.session.reset();\n this.currentOrganizationId = null;\n this.storage.remove(ORGANIZATION_ID_KEY);\n this.storage.remove(END_USER_ID_KEY);\n this.storage.remove(IDENTIFY_SIG_KEY);\n }\n\n flush(): Promise<void> {\n return this.queue.flush();\n }\n\n use(plugin: VeoPlugin): VeoClient {\n this.plugins.push(plugin);\n plugin.install(this);\n return this;\n }\n\n getEndUserId(): string | null {\n return this.session.endUserId;\n }\n\n getSessionId(): string {\n return this.session.sessionId;\n }\n\n /**\n * Suscribe `listener` a `event`. Devuelve una función para desuscribir.\n * Los errores en listeners se logean en debug mode pero NO se propagan\n * (un plugin no debe poder romper a otro).\n */\n on<E extends VeoClientEventName>(event: E, listener: VeoClientEventListener<E>): () => void {\n this.listeners[event].add(listener);\n return () => {\n this.listeners[event].delete(listener);\n };\n }\n\n private emit<E extends VeoClientEventName>(event: E, payload: VeoClientEvents[E]): void {\n for (const listener of this.listeners[event]) {\n try {\n listener(payload);\n } catch (err) {\n if (this.config.debug) console.error(`[veo] listener for '${event}' failed:`, err);\n }\n }\n }\n\n /**\n * Construye el evento completo y lo agrega a la queue. Omite los campos\n * opcionales no definidos (exigido por `exactOptionalPropertyTypes`).\n * @internal\n */\n private enqueue(input: EnqueueInput): void {\n this.session.touch();\n\n const organizationId = this.currentOrganizationId ?? undefined;\n const pageUrl = input.pageUrl ?? (hasWindow() ? window.location.href : undefined);\n const pagePath = input.pagePath ?? (hasWindow() ? window.location.pathname : undefined);\n const pageTitle = input.pageTitle ?? (hasDocument() ? document.title : undefined);\n const pageReferrer = input.pageReferrer ?? (hasDocument() ? document.referrer : undefined);\n\n const event: ActionPayload = {\n actionId: uuidv7(),\n endUserId: this.session.effectiveUserId,\n sessionId: this.session.sessionId,\n actionType: input.actionType,\n occurredAt: new Date().toISOString(),\n ...(organizationId !== undefined ? { organizationId } : {}),\n ...(input.actionName !== undefined ? { actionName: input.actionName } : {}),\n ...(pageUrl !== undefined ? { pageUrl } : {}),\n ...(pagePath !== undefined ? { pagePath } : {}),\n ...(pageTitle !== undefined ? { pageTitle } : {}),\n ...(pageReferrer !== undefined ? { pageReferrer } : {}),\n ...(input.actionProperties !== undefined ? { actionProperties: input.actionProperties } : {}),\n };\n\n this.queue.add(event);\n }\n\n private setupUnloadHandlers(): void {\n if (!hasWindow()) return;\n\n window.addEventListener('pagehide', () => this.queue.flushBeacon());\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.queue.flushBeacon();\n }\n });\n }\n}\n","import type { VeoPlugin } from '../types';\n\n/**\n * Helper de identidad para definir un plugin con inferencia de tipos.\n * No transforma nada; mejora la ergonomía y deja un punto de extensión futuro.\n */\nexport function definePlugin(plugin: VeoPlugin): VeoPlugin {\n return plugin;\n}\n","/** Configuración default de autocaptura. */\nexport const DEFAULT_AUTOCAPTURE_CONFIG = {\n enabled: true,\n captureClicks: true,\n captureSubmits: true,\n captureChanges: true,\n maskAllInputs: true,\n maskAllText: false,\n throttleMs: 100,\n maxTextLength: 200,\n captureElementMetadata: true,\n captureAncestors: 5,\n} as const;\n\n/** Máximo de niveles de ancestros que se permiten capturar. */\nexport const MAX_ANCESTORS = 10;\n\n/** Selectores que SIEMPRE se ignoran (incluso si el cliente no configura blockSelectors). */\nexport const ALWAYS_BLOCK_SELECTORS = [\n '[data-veo-ignore]',\n '.veo-ignore',\n // Inputs sensibles\n 'input[type=\"password\"]',\n 'input[type=\"email\"]',\n 'input[type=\"tel\"]',\n 'input[type=\"hidden\"]',\n // Datos de tarjeta\n '[autocomplete=\"cc-number\"]',\n '[autocomplete=\"cc-csc\"]',\n '[autocomplete=\"cc-exp\"]',\n '[autocomplete=\"cc-name\"]',\n // Otros campos sensibles típicos\n '[name*=\"password\" i]',\n '[name*=\"ssn\" i]',\n '[name*=\"credit\" i]',\n '[name*=\"card\" i]',\n '[id*=\"password\" i]',\n '[id*=\"ssn\" i]',\n];\n\n/** Atributos sensibles que NUNCA se capturan. */\nexport const SENSITIVE_ATTRIBUTES = ['value', 'data-credit-card', 'data-ssn', 'data-password'];\n\n/** Atributos útiles que SIEMPRE se intentan capturar si existen. */\nexport const PRIORITY_ATTRIBUTES = [\n 'id',\n 'name',\n 'type',\n 'role',\n 'href',\n 'data-action',\n 'data-veo-tag',\n 'data-testid',\n 'aria-label',\n 'aria-labelledby',\n];\n\n/** Regex para detectar clases generadas dinámicamente. Se descartan del selector. */\nexport const HASHED_CLASS_PATTERNS = [\n /^css-[a-z0-9]{4,}$/i, // emotion, styled-components nuevas\n /^_[a-z0-9]+_[a-z0-9]{4,}_\\d+$/, // CSS Modules con hash\n /^[a-z]{2,4}-[a-z0-9]{6,}$/i, // Tailwind JIT (a veces)\n /^[a-f0-9]{6,}$/i, // hashes hex puros\n /^sc-[a-z0-9]+$/i, // styled-components legacy\n];\n\n/** Eventos sintéticos/internos que ignoramos. */\nexport const IGNORED_EVENT_PROPERTIES = ['$autocapture', 'pageview'];\n","import { ALWAYS_BLOCK_SELECTORS, SENSITIVE_ATTRIBUTES } from './constants';\n\n/**\n * Verifica si un elemento o ALGUNO de sus ancestros está en la blacklist.\n * Recorre hacia arriba para que bloquear un contenedor bloquee su subárbol.\n */\nexport function isElementBlocked(element: Element, extraBlockSelectors: string[] = []): boolean {\n const allBlockers = [...ALWAYS_BLOCK_SELECTORS, ...extraBlockSelectors];\n let current: Element | null = element;\n\n while (current && current !== document.documentElement) {\n for (const selector of allBlockers) {\n try {\n if (current.matches(selector)) return true;\n } catch {\n // Selector inválido o no soportado por el motor: ignorar y seguir.\n }\n }\n current = current.parentElement;\n }\n\n return false;\n}\n\n/** Verifica si un atributo es sensible y debe omitirse. */\nexport function isSensitiveAttribute(attrName: string): boolean {\n const lower = attrName.toLowerCase();\n return SENSITIVE_ATTRIBUTES.includes(lower) || /password|secret|token|ssn|credit/i.test(attrName);\n}\n\n/** Obtiene el texto visible de un elemento, respetando privacidad. */\nexport function safeGetText(element: Element, maxLength: number, mask: boolean): string {\n if (mask) return '';\n\n // Nunca capturar texto de campos de entrada (puede contener lo que el usuario escribe).\n const tagName = element.tagName.toLowerCase();\n if (tagName === 'input' || tagName === 'textarea') return '';\n\n // `innerText` no existe en jsdom; el fallback a `textContent` lo cubre.\n const raw =\n (element instanceof HTMLElement ? element.innerText : '') || element.textContent || '';\n const trimmed = raw.trim().replace(/\\s+/g, ' ');\n\n return trimmed.length > maxLength ? `${trimmed.slice(0, maxLength)}…` : trimmed;\n}\n","import { HASHED_CLASS_PATTERNS } from './constants';\n\n/** Determina si una clase parece generada dinámicamente (hash de CSS-in-JS, etc.). */\nexport function isHashedClass(className: string): boolean {\n return HASHED_CLASS_PATTERNS.some((pattern) => pattern.test(className));\n}\n\n/** Filtra las clases de un elemento para quedarse solo con las \"humanas\" (estables). */\nexport function filterHumanClasses(element: Element): string[] {\n return Array.from(element.classList).filter((c) => !isHashedClass(c) && c.length < 64);\n}\n\n/**\n * Atributos estables y semánticos que identifican un elemento mejor que sus\n * clases utilitarias (que cambian con el styling). Orden = prioridad. Producen\n * selectores legibles tipo `button[aria-label=\"Abrir menú\"]` que el usuario\n * puede escribir/reconocer en el editor de segmentos.\n */\nconst STABLE_ATTRIBUTES = [\n 'data-testid',\n 'data-test',\n 'data-cy',\n 'name',\n 'aria-label',\n 'placeholder',\n 'alt',\n 'title',\n // `href` identifica muy bien a los links (`<a>`), un target frecuente de\n // autocapture; va después de los atributos semánticos pero antes de los\n // genéricos. Valores largos (URLs absolutas con query) se descartan por\n // MAX_ATTR_VALUE_LENGTH.\n 'href',\n 'role',\n 'type',\n] as const;\n\n/** Valores de atributo más largos que esto se descartan (no son buenos selectores). */\nconst MAX_ATTR_VALUE_LENGTH = 100;\n\n/** Escape básico de caracteres especiales en CSS (usa CSS.escape si está disponible). */\nfunction cssEscape(value: string): string {\n if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n return CSS.escape(value);\n }\n return value.replace(/[!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~]/g, '\\\\$&');\n}\n\n/**\n * Escape para un valor que va DENTRO de comillas en `[attr=\"...\"]`. A diferencia\n * de `cssEscape`, no escapa espacios ni acentos (las comillas ya los cubren):\n * solo `\\` y `\"`. Así el valor queda igual al texto real y el match por substring\n * del backend funciona con lo que el usuario escribe.\n */\nfunction escapeAttrValue(value: string): string {\n return value.replace(/[\\\\\"]/g, '\\\\$&');\n}\n\n/** Devuelve un selector por atributo estable si el elemento tiene alguno. */\nfunction stableAttributeSelector(element: Element, tag: string): string | null {\n for (const attr of STABLE_ATTRIBUTES) {\n const value = element.getAttribute(attr);\n if (value && value.length > 0 && value.length <= MAX_ATTR_VALUE_LENGTH) {\n return `${tag}[${attr}=\"${escapeAttrValue(value)}\"]`;\n }\n }\n return null;\n}\n\n/** Construye un selector simple y estable para UN elemento. */\nfunction buildElementSelector(element: Element): string {\n const tag = element.tagName.toLowerCase();\n\n // 1. `data-veo-tag`: el nombre semántico que da el cliente. Máxima prioridad.\n const veoTag = element.getAttribute('data-veo-tag');\n if (veoTag) {\n return `${tag}[data-veo-tag=\"${escapeAttrValue(veoTag)}\"]`;\n }\n\n // 2. `id`: único y estable. Lo combinamos con clases humanas (como antes).\n if (element.id) {\n const classes = filterHumanClasses(element);\n const classPart = classes.length > 0 ? `.${classes.map(cssEscape).join('.')}` : '';\n return `${tag}#${cssEscape(element.id)}${classPart}`;\n }\n\n // 3. Atributo estable (aria-label, name, type, role…): más robusto que clases.\n const attrSelector = stableAttributeSelector(element, tag);\n if (attrSelector) return attrSelector;\n\n // 4. Fallback: clases humanas.\n const classes = filterHumanClasses(element);\n const classPart = classes.length > 0 ? `.${classes.map(cssEscape).join('.')}` : '';\n return `${tag}${classPart}`;\n}\n\n/** Construye un selector CSS legible y razonablemente estable para el elemento. */\nexport function buildSelectorPath(element: Element, maxAncestors = 5): string {\n const parts: string[] = [];\n let current: Element | null = element;\n let depth = 0;\n\n while (current && current !== document.documentElement && depth <= maxAncestors) {\n parts.unshift(buildElementSelector(current));\n current = current.parentElement;\n depth++;\n }\n\n return parts.join(' > ');\n}\n","import { PRIORITY_ATTRIBUTES } from './constants';\nimport { isSensitiveAttribute, safeGetText } from './pii-guard';\nimport { buildSelectorPath, filterHumanClasses } from './selector-builder';\n\nexport interface SerializedElement {\n tag: string;\n id: string | null;\n classes: string[];\n text: string;\n attributes: Record<string, string>;\n position: { x: number; y: number; w: number; h: number };\n}\n\nexport interface SerializedAncestor {\n tag: string;\n id: string | null;\n classes: string[];\n veoTag: string | null;\n}\n\nexport interface AutocapturePayload {\n $event_type: 'click' | 'submit' | 'change';\n $element: SerializedElement;\n $ancestors: SerializedAncestor[];\n $selector_path: string;\n $page_url: string;\n $page_path: string;\n}\n\ninterface SerializeConfig {\n maxTextLength: number;\n maskAllText: boolean;\n captureElementMetadata: boolean;\n}\n\n/** Extrae los atributos relevantes del elemento, filtrando los sensibles. */\nfunction extractPriorityAttributes(element: Element): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const attrName of PRIORITY_ATTRIBUTES) {\n const value = element.getAttribute(attrName);\n if (value !== null && !isSensitiveAttribute(attrName) && value.length < 256) {\n result[attrName] = value;\n }\n }\n\n return result;\n}\n\n/** Serializa un elemento DOM a un objeto plano para enviar al backend. */\nexport function serializeElement(element: Element, config: SerializeConfig): SerializedElement {\n const rect = element.getBoundingClientRect();\n\n return {\n tag: element.tagName.toLowerCase(),\n id: element.id || null,\n classes: filterHumanClasses(element),\n text: safeGetText(element, config.maxTextLength, config.maskAllText),\n attributes: config.captureElementMetadata ? extractPriorityAttributes(element) : {},\n position: {\n x: Math.round(rect.left + window.scrollX),\n y: Math.round(rect.top + window.scrollY),\n w: Math.round(rect.width),\n h: Math.round(rect.height),\n },\n };\n}\n\n/** Captura los ancestros del elemento (para tagging contextual en el dashboard). */\nexport function serializeAncestors(element: Element, maxDepth: number): SerializedAncestor[] {\n const ancestors: SerializedAncestor[] = [];\n let current: Element | null = element.parentElement;\n let depth = 0;\n\n while (current && current !== document.documentElement && depth < maxDepth) {\n ancestors.push({\n tag: current.tagName.toLowerCase(),\n id: current.id || null,\n classes: filterHumanClasses(current),\n veoTag: current.getAttribute('data-veo-tag') || null,\n });\n current = current.parentElement;\n depth++;\n }\n\n return ancestors;\n}\n\n/** Construye el payload completo para el evento `$autocapture`. */\nexport function buildAutocapturePayload(\n eventType: 'click' | 'submit' | 'change',\n element: Element,\n config: SerializeConfig & { captureAncestors: number },\n): AutocapturePayload {\n return {\n $event_type: eventType,\n $element: serializeElement(element, config),\n $ancestors: serializeAncestors(element, config.captureAncestors),\n $selector_path: buildSelectorPath(element, config.captureAncestors),\n $page_url: window.location.href,\n $page_path: window.location.pathname,\n };\n}\n","/**\n * Throttle por elemento: evita duplicar eventos del mismo target dentro de una\n * ventana de N ms. Usa un WeakMap para no retener elementos en memoria.\n */\nexport class ElementThrottle {\n private lastFired = new WeakMap<Element, number>();\n\n constructor(private readonly windowMs: number) {}\n\n /** Devuelve true si el elemento puede emitir ahora (y registra el disparo). */\n shouldFire(element: Element): boolean {\n const now = Date.now();\n const last = this.lastFired.get(element) ?? 0;\n\n if (now - last < this.windowMs) return false;\n\n this.lastFired.set(element, now);\n return true;\n }\n}\n","import type { VeoAutocaptureConfig, VeoClient } from '../../types';\nimport { hasDocument } from '../../utils/safe-env';\nimport { DEFAULT_AUTOCAPTURE_CONFIG, MAX_ANCESTORS } from './constants';\nimport { buildAutocapturePayload } from './element-serializer';\nimport { isElementBlocked } from './pii-guard';\nimport { ElementThrottle } from './throttle';\n\ntype AutocaptureEvent = 'click' | 'submit' | 'change';\n\n/**\n * Instala listeners delegados en `document` y traduce las interacciones del\n * usuario en eventos `$autocapture`. Nunca lanza hacia la app del cliente:\n * cada handler está envuelto en try/catch.\n */\nexport class DomListener {\n private readonly throttle: ElementThrottle;\n private readonly config: Required<VeoAutocaptureConfig>;\n private cleanups: Array<() => void> = [];\n\n constructor(\n private readonly client: VeoClient,\n config: VeoAutocaptureConfig,\n ) {\n const d = DEFAULT_AUTOCAPTURE_CONFIG;\n // Resolver el config de forma explícita: el merge por spread reintroduce\n // `| undefined` y no satisface `Required<VeoAutocaptureConfig>`.\n this.config = {\n enabled: config.enabled ?? d.enabled,\n captureClicks: config.captureClicks ?? d.captureClicks,\n captureSubmits: config.captureSubmits ?? d.captureSubmits,\n captureChanges: config.captureChanges ?? d.captureChanges,\n maskAllInputs: config.maskAllInputs ?? d.maskAllInputs,\n maskAllText: config.maskAllText ?? d.maskAllText,\n blockSelectors: config.blockSelectors ?? [],\n throttleMs: config.throttleMs ?? d.throttleMs,\n maxTextLength: config.maxTextLength ?? d.maxTextLength,\n captureElementMetadata: config.captureElementMetadata ?? d.captureElementMetadata,\n captureAncestors: Math.min(config.captureAncestors ?? d.captureAncestors, MAX_ANCESTORS),\n };\n this.throttle = new ElementThrottle(this.config.throttleMs);\n }\n\n install(): void {\n if (!hasDocument() || !this.config.enabled) return;\n\n if (this.config.captureClicks) this.attach('click', (e) => this.handleClick(e));\n if (this.config.captureSubmits) this.attach('submit', (e) => this.handleSubmit(e), true);\n if (this.config.captureChanges) this.attach('change', (e) => this.handleChange(e), true);\n }\n\n destroy(): void {\n for (const cleanup of this.cleanups) cleanup();\n this.cleanups = [];\n }\n\n private attach(\n eventName: AutocaptureEvent,\n handler: (e: Event) => void,\n useCapture = false,\n ): void {\n const listener = (e: Event) => {\n // Solo eventos reales del usuario (los sintéticos tienen isTrusted=false).\n if (!e.isTrusted) return;\n try {\n handler(e);\n } catch {\n // Nunca romper la app del cliente; descartamos el evento silenciosamente.\n }\n };\n document.addEventListener(eventName, listener, useCapture);\n this.cleanups.push(() => document.removeEventListener(eventName, listener, useCapture));\n }\n\n private handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n // Subir hasta el elemento \"interesante\" (botón, link, [role], etc.).\n // Si NO hay ninguno (click en zona vacía/no interactiva, p. ej. <html>),\n // no emitimos: evita ruido y volumen innecesario de eventos.\n const meaningful = this.findMeaningfulAncestor(target);\n if (!meaningful) return;\n if (isElementBlocked(meaningful, this.config.blockSelectors)) return;\n if (!this.throttle.shouldFire(meaningful)) return;\n\n this.emit('click', meaningful);\n }\n\n private handleSubmit(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element) || target.tagName.toLowerCase() !== 'form') return;\n if (isElementBlocked(target, this.config.blockSelectors)) return;\n if (!this.throttle.shouldFire(target)) return;\n\n this.emit('submit', target);\n }\n\n private handleChange(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const tag = target.tagName.toLowerCase();\n if (tag !== 'select' && tag !== 'input' && tag !== 'textarea') return;\n\n // Para text inputs el change sería spam/PII; solo checkbox/radio (y selects).\n if (\n target instanceof HTMLInputElement &&\n target.type !== 'checkbox' &&\n target.type !== 'radio'\n ) {\n return;\n }\n if (isElementBlocked(target, this.config.blockSelectors)) return;\n if (!this.throttle.shouldFire(target)) return;\n\n this.emit('change', target);\n }\n\n /** Busca hacia arriba un ancestro \"interactivo\". Devuelve null si no hay ninguno. */\n private findMeaningfulAncestor(element: Element): Element | null {\n let current: Element | null = element;\n let depth = 0;\n\n while (current && current !== document.documentElement && depth < 5) {\n const tag = current.tagName.toLowerCase();\n const isInteractive =\n tag === 'button' ||\n tag === 'a' ||\n tag === 'input' ||\n tag === 'select' ||\n tag === 'textarea' ||\n current.hasAttribute('data-veo-tag') ||\n current.hasAttribute('role') ||\n current.hasAttribute('onclick') ||\n (current instanceof HTMLElement && current.style.cursor === 'pointer');\n\n if (isInteractive) return current;\n current = current.parentElement;\n depth++;\n }\n\n return null;\n }\n\n private emit(eventType: AutocaptureEvent, element: Element): void {\n const payload = buildAutocapturePayload(eventType, element, this.config);\n this.client.track('$autocapture', payload as unknown as Record<string, unknown>);\n }\n}\n","import type { VeoAutocaptureConfig, VeoPlugin } from '../../types';\nimport { definePlugin } from '../plugin';\nimport { DomListener } from './dom-listener';\n\n/**\n * Plugin de autocaptura de eventos del DOM.\n * Captura clicks, submits y changes automáticamente y los emite como\n * eventos `track('$autocapture', …)` por la Queue del cliente.\n */\nexport function autocapturePlugin(config: VeoAutocaptureConfig = {}): VeoPlugin {\n let listener: DomListener | null = null;\n\n return definePlugin({\n name: 'autocapture',\n install(client) {\n listener = new DomListener(client, config);\n listener.install();\n },\n destroy() {\n listener?.destroy();\n listener = null;\n },\n });\n}\n\nexport { DomListener } from './dom-listener';\nexport type { AutocapturePayload } from './element-serializer';\n","/** z-index muy alto para flotar sobre cualquier UI del cliente sin tapar dev tools. */\nexport const GUIDE_Z_INDEX = 2147483640;\n\n/** Tiempo máximo esperando que aparezca el elemento ancla de un tooltip. */\nexport const DEFAULT_ANCHOR_WAIT_MS = 5000;\n\n/** Protocolos permitidos en `imageUrl` y `style.ctaUrl`. */\nexport const SAFE_URL_PROTOCOLS: ReadonlyArray<string> = ['http:', 'https:'];\n\n/** Atributo data-* que marca un host de guía en el DOM (útil para tests). */\nexport const GUIDE_HOST_ATTR = 'data-veo-guide';\n\n/**\n * Prefijo del key de localStorage donde vive el cache de frequency.\n * Se completa con un identificador derivado del apiKey para evitar\n * contaminación cuando el mismo navegador corre varios workspaces.\n */\nexport const FREQUENCY_CACHE_KEY_PREFIX = 'veo:freq:';\n\n/** Tiempo entre flushes automáticos del tracker (ms). */\nexport const DEFAULT_TRACKER_FLUSH_INTERVAL_MS = 3000;\n\n/** Cuántas interactions se acumulan antes de un flush forzado. */\nexport const DEFAULT_TRACKER_BATCH_SIZE = 5;\n\n/** Reintentos por item antes de descartar (se aplica con backoff implícito por el timer). */\nexport const DEFAULT_TRACKER_MAX_RETRIES = 3;\n\n/** Límite de entradas en el cache local — protege contra bloat de localStorage. */\nexport const FREQUENCY_CACHE_MAX_ENTRIES = 500;\n\n/** TTL para entradas del cache. Tras esto se vuelven a re-evaluar contra el backend. */\nexport const FREQUENCY_CACHE_TTL_MS = 90 * 24 * 60 * 60 * 1000;\n\n/**\n * Prefijo del key de localStorage donde vive el estado del walkthrough\n * activo. Se completa con el mismo `namespaceFromApiKey` que el frequency\n * cache para que dos workspaces en el mismo navegador no se pisen.\n */\nexport const WALKTHROUGH_STATE_KEY_PREFIX = 'veo:walkthrough_state:';\n\n/**\n * Si pasan 30 min sin progreso (`advance`/`back`), el walkthrough se\n * considera abandonado. El estado se limpia de localStorage al detectarlo\n * y NO se envía `completed` al backend (porque no se completó).\n */\nexport const WALKTHROUGH_ABANDONMENT_TIMEOUT_MS = 30 * 60 * 1000;\n\n/**\n * Tiempo máximo esperando que aparezca el selector del step actual en el\n * DOM. Más restrictivo que `DEFAULT_ANCHOR_WAIT_MS` porque en walkthroughs\n * la página correcta debería estar ya cargada al resumir.\n */\nexport const WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS = 5000;\n","import {\n FREQUENCY_CACHE_KEY_PREFIX,\n FREQUENCY_CACHE_MAX_ENTRIES,\n FREQUENCY_CACHE_TTL_MS,\n} from './constants';\nimport type { DisplayFrequency, FrequencyCacheEntry, FrequencyStatus } from './types';\n\n/** Prioridad de status para no degradar shown→dismissed→… */\nconst STATUS_PRIORITY: Record<FrequencyStatus, number> = {\n shown: 1,\n dismissed: 2,\n completed: 2,\n};\n\n/**\n * Namespace short y estable derivado del apiKey. NO es cripto: solo evita\n * que dos apps que comparten el navegador pisen sus caches. El apiKey\n * público (`pk_*`) ya es workspace-único, así que usar sus últimos 16\n * caracteres alcanza para diferenciar.\n */\nexport function namespaceFromApiKey(apiKey: string): string {\n return apiKey.slice(-16) || 'default';\n}\n\n/**\n * Cache persistente de \"qué guías ya vio/cerró este usuario\". Vive en\n * `localStorage` con key namespaceada para evitar colisión entre\n * workspaces que corren en el mismo navegador.\n *\n * No es source of truth — el backend siempre manda. Esta cache solo\n * evita el flash visual de re-pintar una guía que el usuario ya cerró\n * antes de que el roundtrip al backend termine.\n */\nexport class GuideFrequencyCache {\n private readonly storageKey: string;\n private cache: Map<string, FrequencyCacheEntry>;\n\n constructor(namespace: string) {\n this.storageKey = `${FREQUENCY_CACHE_KEY_PREFIX}${namespace}`;\n this.cache = this.load();\n this.prune();\n }\n\n /**\n * Decide si una guía debe filtrarse localmente antes de pintarla.\n *\n * - `every_visit` / `always` → nunca filtra (siempre re-pinta).\n * - `once` → cualquier entry registrada filtra.\n * - `until_dismissed` → solo si `status === 'dismissed'`.\n */\n shouldFilter(guideId: string, displayFrequency: DisplayFrequency): boolean {\n if (displayFrequency === 'every_visit' || displayFrequency === 'always') return false;\n\n const entry = this.cache.get(guideId);\n if (!entry) return false;\n\n if (displayFrequency === 'once') return true;\n if (displayFrequency === 'until_dismissed') return entry.status === 'dismissed';\n return false;\n }\n\n /**\n * Registra/actualiza la entry de una guía. Nunca degrada un estado más\n * fuerte (no convierte `dismissed` en `shown` por un re-render). Persiste\n * cada llamada — escribir a localStorage es lo bastante barato.\n */\n record(guideId: string, status: FrequencyStatus): void {\n const existing = this.cache.get(guideId);\n if (existing && STATUS_PRIORITY[status] < STATUS_PRIORITY[existing.status]) {\n return;\n }\n this.cache.set(guideId, {\n guideId,\n status,\n lastInteractionAt: Date.now(),\n });\n this.persist();\n }\n\n /** Limpia el cache (botón \"reset\" del demo, tests). */\n clear(): void {\n this.cache.clear();\n this.persist();\n }\n\n /** Útil para debugging — devuelve un snapshot. */\n snapshot(): FrequencyCacheEntry[] {\n return Array.from(this.cache.values());\n }\n\n /**\n * Limpia entries expiradas por TTL y, si aún excede el límite, descarta\n * las más viejas hasta caber. Se ejecuta una vez en el constructor; no\n * vale la pena correrlo a cada lectura.\n */\n private prune(): void {\n const now = Date.now();\n let mutated = false;\n\n for (const [id, entry] of this.cache) {\n if (now - entry.lastInteractionAt > FREQUENCY_CACHE_TTL_MS) {\n this.cache.delete(id);\n mutated = true;\n }\n }\n\n if (this.cache.size > FREQUENCY_CACHE_MAX_ENTRIES) {\n const sorted = Array.from(this.cache.entries()).sort(\n (a, b) => a[1].lastInteractionAt - b[1].lastInteractionAt,\n );\n const excess = this.cache.size - FREQUENCY_CACHE_MAX_ENTRIES;\n for (let i = 0; i < excess; i++) {\n const tuple = sorted[i];\n if (tuple) this.cache.delete(tuple[0]);\n }\n mutated = true;\n }\n\n if (mutated) this.persist();\n }\n\n private load(): Map<string, FrequencyCacheEntry> {\n if (typeof localStorage === 'undefined') return new Map();\n try {\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) return new Map();\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) return new Map();\n const entries: Array<[string, FrequencyCacheEntry]> = [];\n for (const item of parsed) {\n if (\n item &&\n typeof item === 'object' &&\n typeof (item as FrequencyCacheEntry).guideId === 'string' &&\n typeof (item as FrequencyCacheEntry).lastInteractionAt === 'number' &&\n ['shown', 'dismissed', 'completed'].includes((item as FrequencyCacheEntry).status)\n ) {\n const e = item as FrequencyCacheEntry;\n entries.push([e.guideId, e]);\n }\n }\n return new Map(entries);\n } catch {\n return new Map();\n }\n }\n\n private persist(): void {\n if (typeof localStorage === 'undefined') return;\n try {\n const serialized = JSON.stringify(Array.from(this.cache.values()));\n localStorage.setItem(this.storageKey, serialized);\n } catch {\n // QuotaExceeded o similar — el cache es opcional, no rompemos la app.\n }\n }\n}\n","import type { ResolvedGuide, ResolveGuidesResponse } from './types';\n\n/**\n * Wrapper sobre `GET /v1/guides/resolve`. Nunca lanza: cualquier error de\n * red o de parsing devuelve un array vacío, para que el plugin no rompa\n * la app del cliente.\n *\n * Importante: el endpoint usa `?pageUrl=...` (no `?url=...`) — el backend\n * valida con class-validator `IsUrl({ require_protocol: true })`.\n */\nexport class GuideResolverClient {\n constructor(\n private readonly apiUrl: string,\n private readonly apiKey: string,\n private readonly debug = false,\n ) {}\n\n async resolve(endUserId: string, pageUrl: string): Promise<ResolvedGuide[]> {\n const params = new URLSearchParams({ endUserId, pageUrl });\n let response: Response;\n try {\n response = await fetch(`${this.apiUrl}/v1/guides/resolve?${params.toString()}`, {\n method: 'GET',\n headers: { 'X-Api-Key': this.apiKey },\n credentials: 'omit',\n });\n } catch (err) {\n if (this.debug) console.error('[veo] guides resolve fetch failed:', err);\n return [];\n }\n\n if (!response.ok) {\n if (this.debug) console.warn('[veo] guides resolve HTTP', response.status);\n return [];\n }\n\n try {\n const data = (await response.json()) as ResolveGuidesResponse;\n return Array.isArray(data.guides) ? data.guides : [];\n } catch (err) {\n if (this.debug) console.error('[veo] guides resolve parse failed:', err);\n return [];\n }\n }\n\n /**\n * Trae una guía específica por ID, sin pasar por la lógica de\n * activación. La usa el controller para resumir un walkthrough entre\n * páginas: el `resolve` no devuelve la guía si la URL actual no\n * matchea, pero el walkthrough activo debe poder consultarla igual.\n *\n * El endpoint backend (`GET /v1/guides/:guideId`) devuelve `GuideResponse`,\n * un superset de `ResolvedGuide` con campos de audit. Acá descartamos los\n * extra y nos quedamos con el shape que el resto del SDK ya consume.\n *\n * Devuelve `null` en cualquier error (404, red, parse) — el caller debe\n * tratarlo como \"guía ya no existe\" y cancelar el walkthrough limpiamente.\n */\n async fetchById(guideId: string): Promise<ResolvedGuide | null> {\n let response: Response;\n try {\n response = await fetch(`${this.apiUrl}/v1/guides/${encodeURIComponent(guideId)}`, {\n method: 'GET',\n headers: { 'X-Api-Key': this.apiKey },\n credentials: 'omit',\n });\n } catch (err) {\n if (this.debug) console.error('[veo] guides fetchById network failed:', err);\n return null;\n }\n\n if (!response.ok) {\n if (this.debug) console.warn('[veo] guides fetchById HTTP', response.status);\n return null;\n }\n\n try {\n const data = (await response.json()) as Partial<ResolvedGuide>;\n if (\n typeof data.guideId !== 'string' ||\n typeof data.guideName !== 'string' ||\n typeof data.guideType !== 'string' ||\n !Array.isArray(data.guideSteps) ||\n !data.activationRules ||\n typeof data.displayFrequency !== 'string' ||\n typeof data.displayPriority !== 'number'\n ) {\n if (this.debug) console.warn('[veo] guides fetchById: unexpected shape');\n return null;\n }\n return {\n guideId: data.guideId,\n guideName: data.guideName,\n guideType: data.guideType,\n guideSteps: data.guideSteps,\n activationRules: data.activationRules,\n displayFrequency: data.displayFrequency,\n displayPriority: data.displayPriority,\n };\n } catch (err) {\n if (this.debug) console.error('[veo] guides fetchById parse failed:', err);\n return null;\n }\n }\n}\n","import type { GuideInteractionPayload } from './types';\n\nexport interface InteractionRequest {\n guideId: string;\n payload: GuideInteractionPayload;\n}\n\n/**\n * Wire shape esperada por `POST /v1/guides/:id/interactions` en el backend.\n * Nuestro tipo interno (`GuideInteractionPayload`) usa `action`/`stepIndex`;\n * el backend exige `interactionType`/`stepPosition`. Esta función centraliza\n * la traducción.\n */\ninterface WireInteraction {\n endUserId: string;\n sessionId?: string;\n interactionType: GuideInteractionPayload['action'];\n stepPosition?: number;\n pageUrl?: string;\n pagePath?: string;\n}\n\nfunction toWire(payload: GuideInteractionPayload): WireInteraction {\n const wire: WireInteraction = {\n endUserId: payload.endUserId,\n interactionType: payload.action,\n };\n if (payload.sessionId) wire.sessionId = payload.sessionId;\n if (typeof payload.stepIndex === 'number') wire.stepPosition = payload.stepIndex;\n if (payload.pageUrl) wire.pageUrl = payload.pageUrl;\n if (payload.pagePath) wire.pagePath = payload.pagePath;\n return wire;\n}\n\n/**\n * Cliente HTTP puro para registrar interacciones de guías. No hace retry\n * ni queue — esa responsabilidad vive en `GuideTrackerQueue`.\n *\n * `send` lanza en error (queue puede reintentar). `sendBeacon` es síncrono,\n * \"best effort\", para el cierre de página: usa `navigator.sendBeacon` con\n * el apiKey como query param `?key=` (la única forma de autenticar con\n * sendBeacon, ya que no permite headers custom — el backend lo soporta\n * desde el ApiKeyGuard).\n */\nexport class GuideTrackerClient {\n constructor(\n private readonly apiUrl: string,\n private readonly apiKey: string,\n ) {}\n\n async send(request: InteractionRequest): Promise<void> {\n const url = this.buildUrl(request.guideId);\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'X-Api-Key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(toWire(request.payload)),\n credentials: 'omit',\n });\n\n if (!response.ok) {\n throw new Error(`guide interaction send failed: HTTP ${response.status}`);\n }\n }\n\n /**\n * Envío \"fire-and-forget\" en pagehide. Devuelve `false` si el navegador\n * no acepta el beacon (cola llena, no soportado) — en ese caso la queue\n * sabrá que perdió el envío.\n */\n sendBeacon(request: InteractionRequest): boolean {\n if (typeof navigator === 'undefined' || typeof navigator.sendBeacon !== 'function') {\n return false;\n }\n const url = `${this.buildUrl(request.guideId)}?key=${encodeURIComponent(this.apiKey)}`;\n const blob = new Blob([JSON.stringify(toWire(request.payload))], {\n type: 'application/json',\n });\n try {\n return navigator.sendBeacon(url, blob);\n } catch {\n return false;\n }\n }\n\n private buildUrl(guideId: string): string {\n return `${this.apiUrl}/v1/guides/${encodeURIComponent(guideId)}/interactions`;\n }\n}\n","import type { GuideTrackerClient, InteractionRequest } from './guide-tracker-client';\nimport type { QueuedInteraction } from './types';\n\nexport interface GuideTrackerQueueConfig {\n client: GuideTrackerClient;\n flushIntervalMs: number;\n batchSize: number;\n maxRetries: number;\n /**\n * Llamado cuando un item se descarta tras agotar `maxRetries`. El\n * plugin puede usarlo para `console.warn` en debug mode. Nunca debe\n * lanzar — si lo hace, se ignora silenciosamente.\n */\n onError?: (error: Error, item: QueuedInteraction) => void;\n}\n\n/**\n * Queue dedicada para `POST /v1/guides/:id/interactions`.\n *\n * Cada item es independiente (URL distinto por `guideId`), así que el\n * \"batch\" en realidad dispara N requests en paralelo. El `batchSize` es\n * el umbral para forzar un flush — no agrupa requests en uno solo.\n *\n * Retry:\n * - Si `send()` lanza, el item se devuelve al buffer con `attempts++`.\n * - El timer regular vuelve a intentar en el próximo tick.\n * - Al alcanzar `maxRetries`, se descarta llamando `onError`.\n *\n * En `pagehide`/`visibilitychange` (hidden) drena el buffer vía\n * `navigator.sendBeacon`. Best effort — no re-encola lo que el beacon\n * rechace porque la página ya se va.\n */\nexport class GuideTrackerQueue {\n private buffer: QueuedInteraction[] = [];\n private timer: ReturnType<typeof setInterval> | null = null;\n private flushing = false;\n private unloadCleanup: (() => void) | null = null;\n\n constructor(private readonly config: GuideTrackerQueueConfig) {\n this.startTimer();\n this.installUnloadHandler();\n }\n\n /** Tamaño actual del buffer (útil para debug/stats en el demo). */\n get size(): number {\n return this.buffer.length;\n }\n\n /**\n * Encola una interaction. Si el buffer alcanza `batchSize`, dispara\n * `flush()` inmediato.\n */\n enqueue(request: InteractionRequest): void {\n this.buffer.push({\n guideId: request.guideId,\n payload: request.payload,\n attempts: 0,\n enqueuedAt: Date.now(),\n });\n if (this.buffer.length >= this.config.batchSize) {\n void this.flush();\n }\n }\n\n /**\n * Envía todo el buffer en paralelo. Items que fallan vuelven al buffer\n * si todavía tienen reintentos disponibles. Idempotente con respecto a\n * flushes concurrentes (el segundo es un no-op).\n */\n async flush(): Promise<void> {\n if (this.flushing || this.buffer.length === 0) return;\n this.flushing = true;\n\n const batch = this.buffer.splice(0, this.buffer.length);\n const results = await Promise.allSettled(\n batch.map((item) =>\n this.config.client.send({ guideId: item.guideId, payload: item.payload }),\n ),\n );\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const item = batch[i];\n if (!result || !item) continue;\n if (result.status === 'fulfilled') continue;\n\n item.attempts += 1;\n if (item.attempts < this.config.maxRetries) {\n this.buffer.push(item);\n } else {\n this.safeOnError(result.reason, item);\n }\n }\n\n this.flushing = false;\n }\n\n /**\n * Drena el buffer vía `sendBeacon`. Síncrono, sin retry. Para pagehide.\n */\n flushBeacon(): void {\n if (this.buffer.length === 0) return;\n const batch = this.buffer.splice(0, this.buffer.length);\n for (const item of batch) {\n this.config.client.sendBeacon({ guideId: item.guideId, payload: item.payload });\n }\n }\n\n destroy(): void {\n if (this.timer) clearInterval(this.timer);\n this.timer = null;\n this.unloadCleanup?.();\n this.unloadCleanup = null;\n }\n\n private startTimer(): void {\n if (typeof window === 'undefined') return;\n this.timer = setInterval(() => {\n void this.flush();\n }, this.config.flushIntervalMs);\n }\n\n private installUnloadHandler(): void {\n if (typeof window === 'undefined') return;\n const onPagehide = (): void => this.flushBeacon();\n const onVisibility = (): void => {\n if (document.visibilityState === 'hidden') this.flushBeacon();\n };\n window.addEventListener('pagehide', onPagehide);\n window.addEventListener('visibilitychange', onVisibility);\n this.unloadCleanup = () => {\n window.removeEventListener('pagehide', onPagehide);\n window.removeEventListener('visibilitychange', onVisibility);\n };\n }\n\n private safeOnError(reason: unknown, item: QueuedInteraction): void {\n if (!this.config.onError) return;\n const error = reason instanceof Error ? reason : new Error(String(reason));\n try {\n this.config.onError(error, item);\n } catch {\n // Un onError roto no debe afectar al resto del flush.\n }\n }\n}\n","import { SAFE_URL_PROTOCOLS } from './constants';\nimport type { CtaAction, GuideStep } from './types';\n\ninterface StepCallbacks {\n onCtaClick: (action: CtaAction, url?: string) => void;\n onDismiss: () => void;\n}\n\n/**\n * Construye el subtree DOM de un step (título, contenido, imagen, CTA,\n * botón de cerrar) de forma segura.\n *\n * Reglas inmutables:\n * - **Nunca** usa `innerHTML` ni `insertAdjacentHTML`.\n * - Todo texto se asigna por `textContent` (escape HTML automático).\n * - URLs (`imageUrl`, `style.ctaUrl`) pasan por `isSafeUrl` — solo\n * `http(s):` permitido, rechaza `javascript:`, `data:`, etc.\n * - Campos opcionales ausentes simplemente no pintan su nodo. Si una\n * guía no trae `ctaText` no se pinta botón.\n *\n * El `doc` se inyecta para soportar tests con jsdom u otros documentos.\n */\nexport function buildStepContent(\n step: GuideStep,\n doc: Document,\n callbacks: StepCallbacks,\n): HTMLElement {\n const container = doc.createElement('div');\n container.className = 'veo-guide-content';\n\n // Imagen (opcional, validada).\n if (typeof step.imageUrl === 'string' && step.imageUrl && isSafeUrl(step.imageUrl)) {\n const img = doc.createElement('img');\n img.className = 'veo-guide-image';\n img.src = step.imageUrl;\n img.alt = typeof step.title === 'string' ? step.title : '';\n container.appendChild(img);\n }\n\n if (typeof step.title === 'string' && step.title) {\n const heading = doc.createElement('h2');\n heading.className = 'veo-guide-title';\n heading.textContent = step.title;\n container.appendChild(heading);\n }\n\n if (typeof step.content === 'string' && step.content) {\n const paragraph = doc.createElement('p');\n paragraph.className = 'veo-guide-text';\n paragraph.textContent = step.content;\n container.appendChild(paragraph);\n }\n\n const actions = doc.createElement('div');\n actions.className = 'veo-guide-actions';\n\n if (typeof step.ctaText === 'string' && step.ctaText) {\n const cta = doc.createElement('button');\n cta.type = 'button';\n cta.className = 'veo-guide-cta';\n cta.textContent = step.ctaText;\n cta.addEventListener('click', () => {\n const action: CtaAction = step.ctaAction ?? 'dismiss';\n const ctaUrl = readCtaUrl(step);\n callbacks.onCtaClick(action, ctaUrl);\n });\n actions.appendChild(cta);\n }\n\n container.appendChild(actions);\n\n // Botón \"✕\" siempre presente (esquina superior derecha).\n const closeBtn = doc.createElement('button');\n closeBtn.type = 'button';\n closeBtn.className = 'veo-guide-close';\n closeBtn.setAttribute('aria-label', 'Cerrar');\n closeBtn.textContent = '×';\n closeBtn.addEventListener('click', () => callbacks.onDismiss());\n container.appendChild(closeBtn);\n\n return container;\n}\n\n/**\n * Acepta solo `http:` y `https:`. Resuelve relativas contra la página\n * actual cuando hay `window`; en SSR (sin window) toma la URL como\n * absoluta. Rechaza cualquier protocolo no listado y URLs malformadas.\n */\nexport function isSafeUrl(url: string): boolean {\n if (typeof url !== 'string' || url.length === 0) return false;\n try {\n const base = typeof window !== 'undefined' ? window.location.href : 'http://localhost/';\n const parsed = new URL(url, base);\n return SAFE_URL_PROTOCOLS.includes(parsed.protocol);\n } catch {\n return false;\n }\n}\n\n/**\n * El backend no tiene aún un campo `ctaUrl` en el GuideStep — la URL\n * destino para `ctaAction === 'url'` se guarda como convención en\n * `style.ctaUrl`. Esta función la extrae validando que sea una URL\n * segura. Devuelve `undefined` si falta o no pasa el chequeo.\n */\nfunction readCtaUrl(step: GuideStep): string | undefined {\n const candidate = step.style?.ctaUrl;\n if (typeof candidate !== 'string') return undefined;\n return isSafeUrl(candidate) ? candidate : undefined;\n}\n","import { GUIDE_Z_INDEX } from './constants';\n\n/**\n * CSS inyectado en cada shadow DOM. Como `:host { all: initial }` rompe\n * con la herencia del host, todos los estilos viven aquí. Las variables\n * CSS (`--veo-*`) son los puntos de extensión para tematización futura.\n */\nexport const GUIDE_STYLES = `\n:host {\n --veo-primary: #4f46e5;\n --veo-text: #1f2937;\n --veo-text-secondary: #4b5563;\n --veo-bg: #ffffff;\n --veo-radius: 12px;\n --veo-shadow: 0 20px 60px rgba(0, 0, 0, 0.25);\n all: initial;\n}\n* { box-sizing: border-box; font-family: -apple-system, system-ui, \"Segoe UI\", Roboto, sans-serif; }\n\n.veo-modal-overlay {\n position: fixed; inset: 0;\n background: rgba(15, 15, 30, 0.45);\n display: flex; align-items: center; justify-content: center;\n z-index: ${GUIDE_Z_INDEX};\n animation: veo-fade-in 180ms ease-out;\n}\n.veo-modal-card {\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n padding: 24px 28px;\n max-width: 420px; width: 90%;\n position: relative;\n box-shadow: var(--veo-shadow);\n animation: veo-slide-up 220ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.veo-banner {\n position: fixed; left: 0; right: 0;\n background: var(--veo-bg);\n padding: 14px 20px;\n z-index: ${GUIDE_Z_INDEX};\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.12);\n animation: veo-slide-down 200ms ease-out;\n}\n.veo-banner-top { top: 0; }\n.veo-banner-bottom { bottom: 0; }\n\n.veo-tooltip {\n position: absolute;\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n padding: 14px 16px;\n max-width: 300px;\n z-index: ${GUIDE_Z_INDEX};\n box-shadow: 0 8px 30px rgba(0, 0, 0, 0.18);\n animation: veo-fade-in 150ms ease-out;\n}\n\n.veo-guide-content {\n position: relative;\n display: flex; flex-direction: column;\n}\n.veo-guide-image {\n display: block; width: 100%; max-height: 180px;\n object-fit: cover; border-radius: 8px;\n margin-bottom: 12px;\n}\n.veo-guide-title {\n font-size: 18px; font-weight: 600; line-height: 1.3;\n margin: 0 0 6px; color: var(--veo-text);\n}\n.veo-guide-text {\n font-size: 14px; line-height: 1.5;\n margin: 0 0 16px; color: var(--veo-text-secondary);\n}\n.veo-guide-actions {\n display: flex; gap: 8px; justify-content: flex-end;\n}\n.veo-guide-cta {\n background: var(--veo-primary); color: #fff; border: none;\n padding: 9px 18px; border-radius: 8px;\n font-size: 14px; font-weight: 500; cursor: pointer;\n transition: opacity 120ms ease;\n}\n.veo-guide-cta:hover { opacity: 0.9; }\n.veo-guide-cta:active { transform: translateY(1px); }\n.veo-guide-close {\n position: absolute; top: -6px; right: -6px;\n width: 24px; height: 24px;\n background: none; border: none;\n font-size: 22px; line-height: 1;\n cursor: pointer; color: #9ca3af; padding: 0;\n}\n.veo-guide-close:hover { color: var(--veo-text); }\n\n.veo-walkthrough {\n position: absolute;\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n padding: 16px;\n max-width: 340px;\n z-index: ${GUIDE_Z_INDEX};\n box-shadow: 0 8px 30px rgba(0, 0, 0, 0.2);\n animation: veo-fade-in 150ms ease-out;\n}\n.veo-walkthrough-counter {\n font-size: 11px; color: #9ca3af;\n margin-bottom: 8px; letter-spacing: 0.02em;\n}\n.veo-walkthrough-progress {\n display: flex; gap: 4px;\n margin-bottom: 12px;\n}\n.veo-walkthrough-progress-dot {\n width: 8px; height: 8px;\n border-radius: 50%;\n background: #e5e7eb;\n transition: background 200ms ease;\n}\n.veo-walkthrough-progress-dot.active { background: var(--veo-primary); }\n.veo-walkthrough-progress-dot.completed { background: var(--veo-primary); opacity: 0.5; }\n.veo-walkthrough-actions {\n display: flex; align-items: center;\n margin-top: 16px; gap: 8px;\n}\n.veo-walkthrough-actions-right {\n display: flex; gap: 8px;\n margin-left: auto;\n}\n.veo-walkthrough-btn-secondary {\n background: transparent; color: #6b7280;\n border: 1px solid #e5e7eb;\n padding: 8px 16px; border-radius: 8px;\n font-size: 13px; cursor: pointer;\n transition: background 120ms ease;\n}\n.veo-walkthrough-btn-secondary:hover { background: #f9fafb; }\n.veo-walkthrough-skip {\n background: transparent; color: #9ca3af;\n border: none; padding: 4px 8px;\n font-size: 12px; cursor: pointer;\n}\n.veo-walkthrough-skip:hover { color: var(--veo-text); }\n\n.veo-custom-floating {\n position: fixed;\n z-index: ${GUIDE_Z_INDEX};\n max-width: calc(100vw - 16px);\n max-height: calc(100vh - 16px);\n animation: veo-fade-in 160ms ease;\n}\n.veo-custom-anchored {\n position: fixed;\n top: 0; left: 0;\n z-index: ${GUIDE_Z_INDEX};\n max-width: calc(100vw - 16px);\n animation: veo-fade-in 160ms ease;\n}\n.veo-custom-frame {\n display: block;\n border: 0;\n width: 360px;\n background: transparent;\n color-scheme: normal;\n}\n\n@keyframes veo-fade-in { from { opacity: 0; } to { opacity: 1; } }\n@keyframes veo-slide-up {\n from { transform: translateY(10px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n}\n@keyframes veo-slide-down {\n from { transform: translateY(-10px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n}\n`;\n","import { GUIDE_HOST_ATTR } from '../constants';\nimport { GUIDE_STYLES } from '../styles';\nimport type { GuideRenderContext } from '../types';\n\n/**\n * Base de los renderers de guías. Encapsula:\n * - creación del host con Shadow DOM (aislamiento de estilos)\n * - inyección del CSS común\n * - limpieza del DOM y de listeners en `destroy()`\n *\n * Cada subclase implementa `render(context)`. La subclase puede registrar\n * cleanup adicional con `registerCleanup` para que se ejecute en destroy.\n *\n * Tipos genéricos:\n * - `TContext` (default `GuideRenderContext`): el shape que recibe la\n * subclase. WalkthroughRenderer usa uno propio con step + callbacks.\n * - `TResult` (default `void`): lo que `render` devuelve. El walkthrough\n * usa `boolean` para señalar éxito al controller cuando el ancla no\n * aparece. El resto sigue devolviendo `void`/`Promise<void>`.\n */\nexport abstract class BaseRenderer<TContext = GuideRenderContext, TResult = void> {\n protected host: HTMLElement | null = null;\n protected shadow: ShadowRoot | null = null;\n private cleanups: Array<() => void> = [];\n\n /**\n * Crea un `<div data-veo-guide>` adjunto a `document.body`, le adjunta\n * un ShadowRoot abierto e inyecta los estilos. Retorna el nodo raíz\n * donde la subclase puede insertar el contenido específico.\n */\n protected createHost(): { host: HTMLElement; shadow: ShadowRoot; root: HTMLElement } {\n const host = document.createElement('div');\n host.setAttribute(GUIDE_HOST_ATTR, '');\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = GUIDE_STYLES;\n shadow.appendChild(style);\n\n const root = document.createElement('div');\n shadow.appendChild(root);\n\n document.body.appendChild(host);\n\n this.host = host;\n this.shadow = shadow;\n return { host, shadow, root };\n }\n\n /**\n * Registra una función a ejecutar en `destroy()`. Útil para limpiar\n * listeners globales (scroll, resize) o intervalos.\n */\n protected registerCleanup(fn: () => void): void {\n this.cleanups.push(fn);\n }\n\n /** Remueve el host del DOM y corre todas las funciones de cleanup. */\n destroy(): void {\n for (const fn of this.cleanups) {\n try {\n fn();\n } catch {\n // No propagar: un cleanup roto no debe romper el resto.\n }\n }\n this.cleanups = [];\n\n if (this.host?.parentNode) {\n this.host.parentNode.removeChild(this.host);\n }\n this.host = null;\n this.shadow = null;\n }\n\n abstract render(context: TContext): TResult | Promise<TResult>;\n}\n","import { buildStepContent } from '../block-builder';\nimport type { GuideRenderContext } from '../types';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía tipo `banner`: barra fija arriba o abajo. La\n * posición se lee de `step.style.position` (`top` | `bottom`); default\n * es `top`. No tiene backdrop ni atrapa el foco.\n */\nexport class BannerRenderer extends BaseRenderer {\n render(context: GuideRenderContext): void {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n\n const { root } = this.createHost();\n const ownerDocument = root.ownerDocument ?? document;\n const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n\n const banner = ownerDocument.createElement('div');\n banner.className = `veo-banner veo-banner-${position}`;\n\n const dismiss = (action: 'dismissed' | 'cta_clicked', ctaUrl?: string) => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action,\n });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n\n const content = buildStepContent(step, ownerDocument, {\n onCtaClick: (action, url) => {\n dismiss('cta_clicked', action === 'url' ? url : undefined);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n banner.appendChild(content);\n root.appendChild(banner);\n\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'shown',\n });\n }\n}\n","import { DEFAULT_ANCHOR_WAIT_MS } from './constants';\n\n/**\n * Resuelve un selector CSS de forma robusta para SPAs: chequea inmediato\n * y, si no existe, observa el DOM con MutationObserver hasta `timeoutMs`.\n * Devuelve `null` si no apareció antes del timeout.\n *\n * Esta función nunca lanza. Si el selector es inválido devuelve `null`\n * silenciosamente — un selector roto en la DB no debe romper la app.\n */\nexport function waitForElement(\n selector: string,\n timeoutMs: number = DEFAULT_ANCHOR_WAIT_MS,\n): Promise<Element | null> {\n return new Promise((resolve) => {\n const safeQuery = (): Element | null => {\n try {\n return document.querySelector(selector);\n } catch {\n return null;\n }\n };\n\n const existing = safeQuery();\n if (existing) {\n resolve(existing);\n return;\n }\n\n let resolved = false;\n const finish = (el: Element | null) => {\n if (resolved) return;\n resolved = true;\n observer.disconnect();\n clearTimeout(timer);\n resolve(el);\n };\n\n const observer = new MutationObserver(() => {\n const el = safeQuery();\n if (el) finish(el);\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n\n const timer = setTimeout(() => finish(null), timeoutMs);\n });\n}\n","import { computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { uuidv7 } from '../../../utils/uuid';\nimport { isSafeUrl } from '../block-builder';\nimport type { CustomPlacement, GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\n\nconst DEFAULT_PLACEMENT: CustomPlacement = { mode: 'floating', position: 'bottom-right' };\nconst DEFAULT_OFFSET = 16;\nconst DEFAULT_WIDTH = 360;\n\ninterface VeoBridgeMessage {\n __veo?: unknown;\n type?: unknown;\n url?: unknown;\n name?: unknown;\n props?: unknown;\n height?: unknown;\n close?: unknown;\n}\n\n/**\n * Renderiza una guía `custom` montando el HTML/CSS/JS del cliente dentro de un\n * **iframe sandbox** (`allow-scripts`, SIN `allow-same-origin`): el código corre\n * como origen `null`, aislado del DOM/cookies/storage del app del host. No puede\n * romper la página ni robar datos.\n *\n * La comunicación con el SDK es por `postMessage` con un token random por render:\n * el iframe llama `window.veo.dismiss()/cta(url)/track(n,p)/navigate(url)` y este\n * renderer valida `source` + token antes de actuar. El alto se autoajusta (a menos\n * que `placement.height` sea fijo) vía mensajes `resize`.\n *\n * Ubicación: `floating` (esquina/centro del viewport) o `anchored` (Floating UI\n * contra un selector del host, como el tooltip).\n */\nexport class CustomRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step || typeof step.html !== 'string' || step.html.length === 0) return;\n\n const placement: CustomPlacement = step.placement ?? DEFAULT_PLACEMENT;\n\n let anchor: Element | null = null;\n if (placement.mode === 'anchored') {\n const selector =\n placement.selector ?? step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n anchor = await waitForElement(selector);\n if (!anchor) return; // sin ancla no mostramos (guía fantasma = peor UX)\n }\n\n const { root } = this.createHost();\n const doc = root.ownerDocument ?? document;\n\n const wrapper = doc.createElement('div');\n wrapper.className =\n placement.mode === 'anchored' ? 'veo-custom-anchored' : 'veo-custom-floating';\n\n const iframe = doc.createElement('iframe');\n iframe.className = 'veo-custom-frame';\n // allow-scripts SIN allow-same-origin → origen null, sin acceso al host.\n iframe.setAttribute('sandbox', 'allow-scripts');\n iframe.setAttribute('title', context.guide.guideName || 'Veo');\n\n iframe.style.width = toCssSize(placement.width ?? DEFAULT_WIDTH);\n const hasFixedHeight = placement.height !== undefined && placement.height !== null;\n if (hasFixedHeight) {\n iframe.style.height = toCssSize(placement.height as number | string);\n }\n\n const token = uuidv7();\n iframe.srcdoc = buildSrcdoc(step.html, step.css ?? '', step.js ?? '', token);\n\n wrapper.appendChild(iframe);\n root.appendChild(wrapper);\n\n if (placement.mode === 'floating') {\n applyFloatingPosition(wrapper, placement);\n } else if (anchor) {\n this.registerCleanup(await this.setupAnchoredPosition(anchor, wrapper, placement));\n }\n\n const close = (): void => context.onClose();\n\n const onMessage = (event: MessageEvent): void => {\n if (event.source !== iframe.contentWindow) return;\n const data = event.data as VeoBridgeMessage | null;\n if (!data || typeof data !== 'object' || data.__veo !== token) return;\n\n switch (data.type) {\n case 'dismiss':\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'dismissed',\n });\n close();\n break;\n case 'cta':\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'cta_clicked',\n });\n if (typeof data.url === 'string' && isSafeUrl(data.url)) {\n window.open(data.url, '_blank', 'noopener,noreferrer');\n }\n if (data.close !== false) close();\n break;\n case 'navigate':\n if (typeof data.url === 'string' && isSafeUrl(data.url)) {\n window.location.assign(data.url);\n }\n break;\n case 'track':\n if (typeof data.name === 'string' && context.onTrack) {\n context.onTrack(data.name, isRecord(data.props) ? data.props : undefined);\n }\n break;\n case 'resize':\n if (!hasFixedHeight && typeof data.height === 'number' && data.height > 0) {\n iframe.style.height = `${Math.ceil(data.height)}px`;\n }\n break;\n }\n };\n window.addEventListener('message', onMessage);\n this.registerCleanup(() => window.removeEventListener('message', onMessage));\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n\n private async setupAnchoredPosition(\n anchor: Element,\n wrapper: HTMLElement,\n placement: CustomPlacement,\n ): Promise<() => void> {\n const side = placement.side ?? 'bottom';\n const update = async (): Promise<void> => {\n const { x, y } = await computePosition(anchor, wrapper, {\n placement: side,\n strategy: 'fixed',\n middleware: [offset(placement.offsetY ?? 8), flip(), shift({ padding: 8 })],\n });\n wrapper.style.left = `${x}px`;\n wrapper.style.top = `${y}px`;\n };\n await update();\n\n const reposition = (): void => {\n void update();\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n return () => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n }\n}\n\nfunction toCssSize(value: number | string): string {\n return typeof value === 'number' ? `${value}px` : value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Fija el wrapper en una esquina/centro del viewport según `position`. */\nfunction applyFloatingPosition(wrapper: HTMLElement, placement: CustomPlacement): void {\n const position = placement.position ?? 'bottom-right';\n const ox = `${placement.offsetX ?? DEFAULT_OFFSET}px`;\n const oy = `${placement.offsetY ?? DEFAULT_OFFSET}px`;\n const s = wrapper.style;\n\n if (position === 'center') {\n s.top = '50%';\n s.left = '50%';\n s.transform = 'translate(-50%, -50%)';\n return;\n }\n\n const [vertical, horizontal] = position.split('-');\n if (vertical === 'top') s.top = oy;\n else s.bottom = oy;\n\n if (horizontal === 'left') {\n s.left = ox;\n } else if (horizontal === 'right') {\n s.right = ox;\n } else {\n s.left = '50%';\n s.transform = 'translateX(-50%)';\n }\n}\n\n/**\n * Arma el documento del iframe. El JS del cliente puede llamar a `window.veo`\n * (bridge inyectado). `</script>`/`</style>` dentro del código se neutralizan\n * para que no corten sus bloques.\n */\nfunction buildSrcdoc(html: string, css: string, js: string, token: string): string {\n const bridge =\n `(function(){var T=${JSON.stringify(token)};` +\n `function P(m){m.__veo=T;parent.postMessage(m,'*');}` +\n `window.veo={` +\n `dismiss:function(){P({type:'dismiss'});},` +\n `cta:function(u){P({type:'cta',url:u});},` +\n `track:function(n,p){P({type:'track',name:n,props:p||{}});},` +\n `navigate:function(u){P({type:'navigate',url:u});}};` +\n `function H(){P({type:'resize',height:Math.ceil(document.documentElement.scrollHeight)});}` +\n `window.addEventListener('load',H);` +\n `try{if(typeof ResizeObserver!=='undefined'){new ResizeObserver(H).observe(document.documentElement);}}catch(e){}` +\n `})();`;\n\n return (\n '<!DOCTYPE html><html><head><meta charset=\"utf-8\">' +\n '<style>html,body{margin:0;padding:0;background:transparent;}</style>' +\n `<style>${escapeClosing(css, 'style')}</style></head><body>${html}` +\n `<script>${bridge}</script>` +\n (js ? `<script>${escapeClosing(js, 'script')}</script>` : '') +\n '</body></html>'\n );\n}\n\nfunction escapeClosing(code: string, tag: 'script' | 'style'): string {\n const rx = tag === 'script' ? /<\\/script/gi : /<\\/style/gi;\n return code.replace(rx, `<\\\\/${tag}`);\n}\n","import { buildStepContent } from '../block-builder';\nimport type { GuideRenderContext } from '../types';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía de tipo `modal`: backdrop oscuro + tarjeta centrada.\n * Cierra al clickear el backdrop o presionar Escape.\n *\n * Consume el primer step (`guideSteps[0]`). Modal/banner/tooltip son\n * single-step por convención del backend; walkthroughs vendrán en el\n * siguiente sprint.\n */\nexport class ModalRenderer extends BaseRenderer {\n render(context: GuideRenderContext): void {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n\n const { root } = this.createHost();\n const ownerDocument = root.ownerDocument ?? document;\n\n const overlay = ownerDocument.createElement('div');\n overlay.className = 'veo-modal-overlay';\n\n const card = ownerDocument.createElement('div');\n card.className = 'veo-modal-card';\n\n const dismiss = (action: 'dismissed' | 'cta_clicked', ctaUrl?: string) => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action,\n });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n\n const content = buildStepContent(step, ownerDocument, {\n onCtaClick: (action, url) => {\n dismiss('cta_clicked', action === 'url' ? url : undefined);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n card.appendChild(content);\n overlay.appendChild(card);\n root.appendChild(overlay);\n\n overlay.addEventListener('click', (e) => {\n if (e.target === overlay) dismiss('dismissed');\n });\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') dismiss('dismissed');\n };\n document.addEventListener('keydown', onKey);\n this.registerCleanup(() => document.removeEventListener('keydown', onKey));\n\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'shown',\n });\n }\n}\n","import { computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { buildStepContent } from '../block-builder';\nimport type { GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía tipo `tooltip` anclada a un elemento del host.\n * Espera el ancla con MutationObserver (selector puede no existir aún\n * en SPAs), la posiciona con Floating UI y la re-posiciona en scroll\n * y resize.\n *\n * Si el ancla no aparece dentro del timeout, no muestra nada. Esto es\n * deliberado: las guías \"fantasma\" sin destino son peor UX que no\n * mostrar.\n */\nexport class TooltipRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { root } = this.createHost();\n const ownerDocument = root.ownerDocument ?? document;\n\n const tooltip = ownerDocument.createElement('div');\n tooltip.className = 'veo-tooltip';\n\n const dismiss = (action: 'dismissed' | 'cta_clicked', ctaUrl?: string) => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action,\n });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n\n const content = buildStepContent(step, ownerDocument, {\n onCtaClick: (action, url) => {\n dismiss('cta_clicked', action === 'url' ? url : undefined);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n tooltip.appendChild(content);\n root.appendChild(tooltip);\n\n const updatePosition = async (): Promise<void> => {\n const { x, y } = await computePosition(anchor, tooltip, {\n placement: 'bottom',\n middleware: [offset(8), flip(), shift({ padding: 8 })],\n });\n tooltip.style.left = `${x}px`;\n tooltip.style.top = `${y}px`;\n };\n\n await updatePosition();\n\n const reposition = (): void => {\n void updatePosition();\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n this.registerCleanup(() => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n });\n\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'shown',\n });\n }\n}\n","import { isSafeUrl } from './block-builder';\nimport type { GuideStep, WalkthroughCallbacks } from './types';\n\n/**\n * Construye el subtree DOM de un step de walkthrough con navegación\n * (counter, dots, contenido, botones atrás/siguiente/finalizar/omitir).\n *\n * Aplica las mismas reglas de seguridad que `buildStepContent`:\n * - `textContent` para todo string del backend (cero `innerHTML`).\n * - `imageUrl` validada con `isSafeUrl`.\n *\n * El botón primario cambia su label según el step:\n * - último step → \"Finalizar\" → llama `onComplete`\n * - otro → `step.ctaText` o \"Siguiente\" → llama `onNext`\n *\n * El botón \"Atrás\" solo se pinta a partir del segundo step. El botón\n * \"Omitir\" siempre se pinta — el usuario debe poder salir en cualquier\n * momento.\n */\nexport function buildWalkthroughStepContent(\n step: GuideStep,\n stepIndex: number,\n totalSteps: number,\n doc: Document,\n callbacks: WalkthroughCallbacks,\n): HTMLElement {\n const container = doc.createElement('div');\n container.className = 'veo-guide-content';\n\n const counter = doc.createElement('div');\n counter.className = 'veo-walkthrough-counter';\n counter.textContent = `Paso ${stepIndex + 1} de ${totalSteps}`;\n container.appendChild(counter);\n\n const progress = doc.createElement('div');\n progress.className = 'veo-walkthrough-progress';\n for (let i = 0; i < totalSteps; i++) {\n const dot = doc.createElement('span');\n dot.className = 'veo-walkthrough-progress-dot';\n if (i < stepIndex) dot.classList.add('completed');\n if (i === stepIndex) dot.classList.add('active');\n progress.appendChild(dot);\n }\n container.appendChild(progress);\n\n if (typeof step.imageUrl === 'string' && step.imageUrl && isSafeUrl(step.imageUrl)) {\n const img = doc.createElement('img');\n img.className = 'veo-guide-image';\n img.src = step.imageUrl;\n img.alt = typeof step.title === 'string' ? step.title : '';\n container.appendChild(img);\n }\n\n if (typeof step.title === 'string' && step.title) {\n const heading = doc.createElement('h2');\n heading.className = 'veo-guide-title';\n heading.textContent = step.title;\n container.appendChild(heading);\n }\n\n if (typeof step.content === 'string' && step.content) {\n const paragraph = doc.createElement('p');\n paragraph.className = 'veo-guide-text';\n paragraph.textContent = step.content;\n container.appendChild(paragraph);\n }\n\n const actions = doc.createElement('div');\n actions.className = 'veo-walkthrough-actions';\n\n const skipBtn = doc.createElement('button');\n skipBtn.type = 'button';\n skipBtn.className = 'veo-walkthrough-skip';\n skipBtn.textContent = 'Omitir';\n skipBtn.addEventListener('click', () => callbacks.onSkip());\n actions.appendChild(skipBtn);\n\n const rightGroup = doc.createElement('div');\n rightGroup.className = 'veo-walkthrough-actions-right';\n\n if (stepIndex > 0) {\n const backBtn = doc.createElement('button');\n backBtn.type = 'button';\n backBtn.className = 'veo-walkthrough-btn-secondary';\n backBtn.textContent = 'Atrás';\n backBtn.addEventListener('click', () => callbacks.onBack());\n rightGroup.appendChild(backBtn);\n }\n\n const isLastStep = stepIndex === totalSteps - 1;\n const primaryBtn = doc.createElement('button');\n primaryBtn.type = 'button';\n primaryBtn.className = 'veo-guide-cta';\n const defaultLabel = isLastStep ? 'Finalizar' : 'Siguiente';\n primaryBtn.textContent =\n typeof step.ctaText === 'string' && step.ctaText ? step.ctaText : defaultLabel;\n primaryBtn.addEventListener('click', () => {\n if (isLastStep) callbacks.onComplete();\n else callbacks.onNext();\n });\n rightGroup.appendChild(primaryBtn);\n\n actions.appendChild(rightGroup);\n container.appendChild(actions);\n\n return container;\n}\n","import { computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS } from '../constants';\nimport type { ResolvedGuide, WalkthroughCallbacks } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\n\nexport interface WalkthroughRenderContext {\n guide: ResolvedGuide;\n currentStepIndex: number;\n callbacks: WalkthroughCallbacks;\n}\n\n/**\n * Renderiza UN step de un walkthrough — variante de tooltip con\n * navegación. Se destruye y re-crea por step en lugar de actualizar el\n * DOM en sitio: como cada step puede anclarse a un selector distinto,\n * recomputar todo es más simple y barato que tracking diffs.\n *\n * `render` retorna `boolean` (a diferencia de los demás renderers) para\n * señalar al controller si el ancla apareció a tiempo. Si devuelve\n * `false`, el controller cancela el walkthrough limpiamente.\n */\nexport class WalkthroughRenderer extends BaseRenderer<WalkthroughRenderContext, boolean> {\n async render(context: WalkthroughRenderContext): Promise<boolean> {\n const step = context.guide.guideSteps[context.currentStepIndex];\n if (!step) return false;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return false;\n\n const anchor = await waitForElement(selector, WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS);\n if (!anchor) return false;\n\n const { root } = this.createHost();\n const ownerDocument = root.ownerDocument ?? document;\n\n const tooltip = ownerDocument.createElement('div');\n tooltip.className = 'veo-walkthrough';\n\n const content = buildWalkthroughStepContent(\n step,\n context.currentStepIndex,\n context.guide.guideSteps.length,\n ownerDocument,\n context.callbacks,\n );\n tooltip.appendChild(content);\n root.appendChild(tooltip);\n\n const updatePosition = async (): Promise<void> => {\n const { x, y } = await computePosition(anchor, tooltip, {\n placement: 'bottom',\n middleware: [offset(8), flip(), shift({ padding: 8 })],\n });\n tooltip.style.left = `${x}px`;\n tooltip.style.top = `${y}px`;\n };\n\n await updatePosition();\n\n const reposition = (): void => {\n void updatePosition();\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n this.registerCleanup(() => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n });\n\n return true;\n }\n}\n","import { WALKTHROUGH_ABANDONMENT_TIMEOUT_MS, WALKTHROUGH_STATE_KEY_PREFIX } from './constants';\nimport type { WalkthroughState } from './types';\n\n/**\n * Estado persistente del walkthrough activo. Solo permite UNO por\n * workspace (namespace de apiKey). Vive en `localStorage` para sobrevivir\n * recargas de página: el step actual + el guideId alcanzan para resumir\n * desde donde quedó el usuario.\n *\n * Si pasan más de `WALKTHROUGH_ABANDONMENT_TIMEOUT_MS` sin progreso, se\n * considera abandonado: la próxima llamada a `current()` lo limpia\n * silenciosamente. NO se reporta `dismissed` al backend en ese caso —\n * abandonarse no es un acto del usuario.\n */\nexport class WalkthroughStateManager {\n private readonly storageKey: string;\n private state: WalkthroughState | null = null;\n\n constructor(namespace: string) {\n this.storageKey = `${WALKTHROUGH_STATE_KEY_PREFIX}${namespace}`;\n this.state = this.load();\n if (this.state && this.isAbandoned(this.state)) {\n this.clear();\n }\n }\n\n /**\n * Estado del walkthrough activo. Devuelve `null` si no hay ninguno o si\n * el último progreso fue hace más del timeout (en ese caso también\n * limpia el storage como side-effect).\n */\n current(): WalkthroughState | null {\n if (!this.state) return null;\n if (this.isAbandoned(this.state)) {\n this.clear();\n return null;\n }\n return this.state;\n }\n\n /** Atajo legible para el controller. */\n hasActive(): boolean {\n return this.current() !== null;\n }\n\n /**\n * Inicia un nuevo walkthrough en step 0. Sobreescribe cualquier estado\n * previo — los callers (controller) son responsables de verificar\n * `hasActive()` antes si necesitan exclusividad.\n */\n start(guideId: string, totalSteps: number): WalkthroughState {\n const now = Date.now();\n this.state = {\n guideId,\n totalSteps,\n currentStepIndex: 0,\n startedAt: now,\n lastProgressAt: now,\n };\n this.persist();\n return this.state;\n }\n\n /**\n * Avanza al siguiente step. Si el step resultante excede `totalSteps`,\n * devuelve `null` y NO toca el estado — el controller debe interpretar\n * eso como \"ya estamos en el último, no hay próximo\" y disparar\n * `complete` vía el handler del botón \"Finalizar\".\n */\n advance(): WalkthroughState | null {\n if (!this.state) return null;\n\n const next = this.state.currentStepIndex + 1;\n if (next >= this.state.totalSteps) return null;\n\n this.state = {\n ...this.state,\n currentStepIndex: next,\n lastProgressAt: Date.now(),\n };\n this.persist();\n return this.state;\n }\n\n /**\n * Retrocede al step anterior. En step 0 no hace nada y devuelve el\n * estado tal cual (el botón \"Atrás\" no debería estar visible en el\n * primer step, pero por defensa el manager también lo guard-ea).\n */\n back(): WalkthroughState | null {\n if (!this.state) return null;\n if (this.state.currentStepIndex === 0) return this.state;\n\n this.state = {\n ...this.state,\n currentStepIndex: this.state.currentStepIndex - 1,\n lastProgressAt: Date.now(),\n };\n this.persist();\n return this.state;\n }\n\n /** Limpia el estado activo (skip, complete, abandono, guía borrada). */\n clear(): void {\n this.state = null;\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.removeItem(this.storageKey);\n } catch {\n // Storage bloqueado — no rompemos la app.\n }\n }\n\n private isAbandoned(state: WalkthroughState): boolean {\n return Date.now() - state.lastProgressAt > WALKTHROUGH_ABANDONMENT_TIMEOUT_MS;\n }\n\n private load(): WalkthroughState | null {\n if (typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== 'object') return null;\n const candidate = parsed as Partial<WalkthroughState>;\n if (\n typeof candidate.guideId !== 'string' ||\n typeof candidate.totalSteps !== 'number' ||\n typeof candidate.currentStepIndex !== 'number' ||\n typeof candidate.startedAt !== 'number' ||\n typeof candidate.lastProgressAt !== 'number'\n ) {\n return null;\n }\n return candidate as WalkthroughState;\n } catch {\n return null;\n }\n }\n\n private persist(): void {\n if (typeof localStorage === 'undefined' || !this.state) return;\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(this.state));\n } catch {\n // Quota exceeded — silently fail. El walkthrough en memoria sigue.\n }\n }\n}\n","import type { VeoClient } from '../../types';\nimport {\n DEFAULT_TRACKER_BATCH_SIZE,\n DEFAULT_TRACKER_FLUSH_INTERVAL_MS,\n DEFAULT_TRACKER_MAX_RETRIES,\n} from './constants';\nimport { GuideFrequencyCache, namespaceFromApiKey } from './guide-frequency-cache';\nimport { GuideResolverClient } from './guide-resolver-client';\nimport { GuideTrackerClient } from './guide-tracker-client';\nimport { GuideTrackerQueue } from './guide-tracker-queue';\nimport { BannerRenderer } from './renderers/banner-renderer';\nimport type { BaseRenderer } from './renderers/base-renderer';\nimport { CustomRenderer } from './renderers/custom-renderer';\nimport { ModalRenderer } from './renderers/modal-renderer';\nimport { TooltipRenderer } from './renderers/tooltip-renderer';\nimport { WalkthroughRenderer } from './renderers/walkthrough-renderer';\nimport type {\n FrequencyStatus,\n GuideInteractionAction,\n GuideInteractionEvent,\n GuideType,\n ResolvedGuide,\n WalkthroughCallbacks,\n} from './types';\nimport { WalkthroughStateManager } from './walkthrough-state';\n\nexport interface GuidesControllerConfig {\n apiUrl: string;\n apiKey: string;\n debug?: boolean;\n /** Override del resolver (tests). */\n resolver?: GuideResolverClient;\n /** Override del tracker queue (tests). */\n trackerQueue?: GuideTrackerQueue;\n /** Override del cache (tests). */\n frequencyCache?: GuideFrequencyCache;\n /** Override del walkthrough state manager (tests). */\n walkthroughState?: WalkthroughStateManager;\n}\n\n/** Mapeo `action → cache status`. Solo acciones terminales mutan el cache. */\nconst STATUS_BY_ACTION: Record<GuideInteractionAction, FrequencyStatus | null> = {\n shown: 'shown',\n dismissed: 'dismissed',\n cta_clicked: null,\n step_advanced: null,\n step_back: null,\n completed: 'completed',\n};\n\n/**\n * Orquesta el ciclo de vida de las guías:\n *\n * 1. `pageview`/`identify` → `checkGuides(url, sessionId)`.\n * 2. Si hay un walkthrough activo (estado persistido en localStorage),\n * tiene prioridad: se intenta resumir en la página actual antes de\n * consultar nuevas guías. Si el selector del step actual aparece,\n * se pinta; si no, se cancela el walkthrough limpiamente.\n * 3. Si no hay walkthrough activo, se consulta `/v1/guides/resolve` y\n * se procesa cada guía:\n * - `walkthrough` con varios steps → arranca un walkthrough\n * (uno a la vez; el resto se ignora si ya hay uno).\n * - single-step → modal/banner/tooltip como antes.\n * 4. Cada interaction actualiza el cache local Y se encola para\n * `POST /v1/guides/:id/interactions`.\n *\n * Dedupe: `dispatched` guarda `${guideId}:${action}` ya encolados en la\n * sesión actual del SDK. Las acciones por-step de walkthroughs no\n * usan dedupe — cada `step_advanced` puede repetirse y representa una\n * navegación distinta.\n */\nexport class GuidesController {\n private readonly resolver: GuideResolverClient;\n private readonly trackerQueue: GuideTrackerQueue;\n private readonly frequencyCache: GuideFrequencyCache;\n private readonly walkthroughState: WalkthroughStateManager;\n private readonly debug: boolean;\n private readonly activeRenderers = new Set<BaseRenderer>();\n private readonly dispatched = new Set<string>();\n private activeWalkthroughRenderer: WalkthroughRenderer | null = null;\n private activeWalkthroughGuide: ResolvedGuide | null = null;\n\n constructor(\n private readonly client: VeoClient,\n config: GuidesControllerConfig,\n ) {\n this.debug = config.debug === true;\n this.resolver =\n config.resolver ?? new GuideResolverClient(config.apiUrl, config.apiKey, this.debug);\n\n if (config.trackerQueue) {\n this.trackerQueue = config.trackerQueue;\n } else {\n const httpClient = new GuideTrackerClient(config.apiUrl, config.apiKey);\n this.trackerQueue = new GuideTrackerQueue({\n client: httpClient,\n flushIntervalMs: DEFAULT_TRACKER_FLUSH_INTERVAL_MS,\n batchSize: DEFAULT_TRACKER_BATCH_SIZE,\n maxRetries: DEFAULT_TRACKER_MAX_RETRIES,\n onError: (err, item) => {\n if (this.debug) {\n console.warn(\n `[veo] dropped guide interaction after retries: guideId=${item.guideId} action=${item.payload.action}`,\n err,\n );\n }\n },\n });\n }\n\n const namespace = namespaceFromApiKey(config.apiKey);\n this.frequencyCache = config.frequencyCache ?? new GuideFrequencyCache(namespace);\n this.walkthroughState = config.walkthroughState ?? new WalkthroughStateManager(namespace);\n }\n\n /** Cuántas interactions hay pendientes de envío. Útil para debug en demo. */\n get pendingInteractions(): number {\n return this.trackerQueue.size;\n }\n\n /** Limpia el cache local (botón \"reset\" del demo, tests). */\n clearFrequencyCache(): void {\n this.frequencyCache.clear();\n }\n\n /** Limpia el walkthrough activo (debug del demo). */\n clearWalkthroughState(): void {\n this.tearDownWalkthrough();\n }\n\n /** Punto de entrada principal. Llamado en cada pageview/identify. */\n async checkGuides(pageUrl: string, sessionId: string): Promise<void> {\n const endUserId = this.client.getEndUserId();\n if (!endUserId) {\n if (this.debug) console.log('[veo] guides: skipped, no endUserId yet');\n return;\n }\n\n if (await this.tryResumeWalkthrough(endUserId, sessionId, pageUrl)) {\n return;\n }\n\n let guides: ResolvedGuide[];\n try {\n guides = await this.resolver.resolve(endUserId, pageUrl);\n } catch (err) {\n if (this.debug) console.error('[veo] guides resolver threw:', err);\n return;\n }\n if (this.debug) console.log(`[veo] guides: ${guides.length} eligible at ${pageUrl}`);\n\n for (const guide of guides) {\n if (this.frequencyCache.shouldFilter(guide.guideId, guide.displayFrequency)) {\n if (this.debug) console.log(`[veo] guides: filtered locally guideId=${guide.guideId}`);\n continue;\n }\n\n if (guide.guideType === 'walkthrough' && guide.guideSteps.length > 1) {\n if (this.walkthroughState.hasActive()) {\n if (this.debug)\n console.log(`[veo] guides: walkthrough ${guide.guideId} skipped (another active)`);\n continue;\n }\n await this.startWalkthrough(guide, endUserId, sessionId, pageUrl);\n // No retornamos: las guías single-step pueden seguir mostrándose\n // en paralelo. Solo bloqueamos OTROS walkthroughs vía hasActive().\n continue;\n }\n\n this.runSingleStepRender(guide, sessionId, pageUrl);\n }\n }\n\n /** Cierra todas las guías activas, limpia cache de dispatch y para timers. */\n destroy(): void {\n for (const renderer of this.activeRenderers) {\n try {\n renderer.destroy();\n } catch (err) {\n if (this.debug) console.error('[veo] renderer destroy failed:', err);\n }\n }\n this.activeRenderers.clear();\n if (this.activeWalkthroughRenderer) {\n try {\n this.activeWalkthroughRenderer.destroy();\n } catch {\n // swallow — el cleanup no debe propagar\n }\n this.activeWalkthroughRenderer = null;\n this.activeWalkthroughGuide = null;\n }\n this.dispatched.clear();\n this.trackerQueue.destroy();\n }\n\n private runSingleStepRender(guide: ResolvedGuide, sessionId: string, pageUrl: string): void {\n const renderer = this.createSingleStepRenderer(guide.guideType);\n if (!renderer) return;\n\n const delayMs = guide.activationRules.delayMs ?? 0;\n window.setTimeout(\n () => this.mountSingleStepRenderer(guide, renderer, sessionId, pageUrl),\n delayMs,\n );\n }\n\n private mountSingleStepRenderer(\n guide: ResolvedGuide,\n renderer: BaseRenderer,\n sessionId: string,\n pageUrl: string,\n ): void {\n this.activeRenderers.add(renderer);\n\n const onClose = (): void => {\n renderer.destroy();\n this.activeRenderers.delete(renderer);\n };\n\n const onInteraction = (event: GuideInteractionEvent): void => {\n this.handleInteraction(guide, sessionId, pageUrl, event);\n };\n\n const onTrack = (eventName: string, properties?: Record<string, unknown>): void => {\n this.client.track(eventName, properties);\n };\n\n try {\n void renderer.render({ guide, onInteraction, onClose, onTrack });\n } catch (err) {\n if (this.debug) console.error('[veo] renderer.render threw:', err);\n this.activeRenderers.delete(renderer);\n }\n }\n\n /**\n * Si hay un walkthrough persistido, intenta pintar el step actual en\n * la página actual. Retorna `true` si lo intentó (sea éxito o cancel),\n * `false` si no había walkthrough activo.\n *\n * Cancela limpiamente (sin enviar `dismissed` falso) cuando:\n * - La guía fue eliminada en el backend (404 → `fetchById` devuelve null).\n * - La guía cambió de tipo y ya no es walkthrough.\n * - El selector del step actual no aparece dentro del timeout.\n */\n private async tryResumeWalkthrough(\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): Promise<boolean> {\n const state = this.walkthroughState.current();\n if (!state) return false;\n\n const guide = await this.resolver.fetchById(state.guideId);\n if (!guide || guide.guideType !== 'walkthrough') {\n if (this.debug)\n console.log(`[veo] guides: walkthrough ${state.guideId} no longer available, cleaning up`);\n this.tearDownWalkthrough();\n return true;\n }\n\n // El cache local podría tener una versión más vieja del total; usamos\n // siempre el del backend.\n const stepIndex = Math.min(state.currentStepIndex, guide.guideSteps.length - 1);\n await this.renderWalkthroughStep(guide, stepIndex, endUserId, sessionId, pageUrl);\n return true;\n }\n\n private async startWalkthrough(\n guide: ResolvedGuide,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): Promise<void> {\n this.walkthroughState.start(guide.guideId, guide.guideSteps.length);\n const rendered = await this.renderWalkthroughStep(guide, 0, endUserId, sessionId, pageUrl);\n if (!rendered) return; // teardown ya corrió, no reportamos shown.\n // Reportamos `shown` SOLO al arrancar (step 0). Steps siguientes\n // se cubren con `step_advanced`/`step_back`. Marcamos cache local\n // también para que `displayFrequency='once'` filtre en la próxima\n // pageview aunque la interaction aún esté en la queue.\n this.enqueueInteractionOnce(guide.guideId, endUserId, sessionId, pageUrl, 'shown', 0);\n this.frequencyCache.record(guide.guideId, 'shown');\n }\n\n /**\n * Pinta el step indicado. Reusa la guía (no fetcha): el caller debe\n * traerla. Retorna `true` si el render fue exitoso. En caso contrario\n * ya disparó el teardown — el caller no debe seguir reportando.\n */\n private async renderWalkthroughStep(\n guide: ResolvedGuide,\n stepIndex: number,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): Promise<boolean> {\n if (this.activeWalkthroughRenderer) {\n this.activeWalkthroughRenderer.destroy();\n this.activeWalkthroughRenderer = null;\n }\n\n const renderer = new WalkthroughRenderer();\n this.activeWalkthroughGuide = guide;\n\n const callbacks: WalkthroughCallbacks = {\n onNext: () => this.handleWalkthroughNext(endUserId, sessionId, pageUrl),\n onBack: () => this.handleWalkthroughBack(endUserId, sessionId, pageUrl),\n onSkip: () => this.handleWalkthroughSkip(endUserId, sessionId, pageUrl),\n onComplete: () => this.handleWalkthroughComplete(endUserId, sessionId, pageUrl),\n };\n\n let success = false;\n try {\n success = await renderer.render({ guide, currentStepIndex: stepIndex, callbacks });\n } catch (err) {\n if (this.debug) console.error('[veo] walkthrough renderer threw:', err);\n }\n\n if (!success) {\n if (this.debug)\n console.warn(\n `[veo] walkthrough ${guide.guideId} step ${stepIndex} could not render, cancelling`,\n );\n this.tearDownWalkthrough();\n return false;\n }\n\n this.activeWalkthroughRenderer = renderer;\n return true;\n }\n\n private handleWalkthroughNext(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n if (!guide) return;\n\n const newState = this.walkthroughState.advance();\n if (!newState) {\n // Ya estábamos en el último step. No debería pasar (el botón\n // dispara onComplete en ese caso), pero por defensa lo manejamos.\n this.handleWalkthroughComplete(endUserId, sessionId, pageUrl);\n return;\n }\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'step_advanced',\n newState.currentStepIndex,\n );\n void this.renderWalkthroughStep(\n guide,\n newState.currentStepIndex,\n endUserId,\n sessionId,\n pageUrl,\n );\n }\n\n private handleWalkthroughBack(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n if (!guide) return;\n\n const state = this.walkthroughState.current();\n if (!state || state.currentStepIndex === 0) return;\n\n const newState = this.walkthroughState.back();\n if (!newState) return;\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'step_back',\n newState.currentStepIndex,\n );\n void this.renderWalkthroughStep(\n guide,\n newState.currentStepIndex,\n endUserId,\n sessionId,\n pageUrl,\n );\n }\n\n private handleWalkthroughSkip(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n const state = this.walkthroughState.current();\n if (!guide || !state) return;\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'dismissed',\n state.currentStepIndex,\n );\n this.frequencyCache.record(guide.guideId, 'dismissed');\n this.tearDownWalkthrough();\n }\n\n private handleWalkthroughComplete(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n const state = this.walkthroughState.current();\n if (!guide || !state) return;\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'completed',\n state.currentStepIndex,\n );\n this.frequencyCache.record(guide.guideId, 'completed');\n this.tearDownWalkthrough();\n }\n\n private tearDownWalkthrough(): void {\n if (this.activeWalkthroughRenderer) {\n try {\n this.activeWalkthroughRenderer.destroy();\n } catch {\n // swallow\n }\n }\n this.activeWalkthroughRenderer = null;\n this.activeWalkthroughGuide = null;\n this.walkthroughState.clear();\n }\n\n /**\n * Tras cada interaction single-step:\n * 1. dedupe (no enviar 2× la misma `(guideId, action)` por sesión)\n * 2. actualizar el cache local si corresponde\n * 3. encolar el POST\n *\n * El endUserId se lee del client EN ESTE MOMENTO (no en el render),\n * por si el usuario se identificó después de que la guía apareció.\n */\n private handleInteraction(\n guide: ResolvedGuide,\n sessionId: string,\n pageUrl: string,\n event: GuideInteractionEvent,\n ): void {\n const dedupKey = `${guide.guideId}:${event.action}`;\n if (this.dispatched.has(dedupKey)) {\n if (this.debug) console.log(`[veo] guides: dedup hit ${dedupKey}`);\n return;\n }\n this.dispatched.add(dedupKey);\n\n const cacheStatus = STATUS_BY_ACTION[event.action];\n if (cacheStatus) this.frequencyCache.record(guide.guideId, cacheStatus);\n\n const endUserId = this.client.getEndUserId();\n if (!endUserId) {\n if (this.debug)\n console.warn('[veo] guides: interaction without endUserId — skipping enqueue');\n return;\n }\n\n this.trackerQueue.enqueue({\n guideId: guide.guideId,\n payload: {\n endUserId,\n sessionId,\n action: event.action,\n stepIndex: event.stepIndex,\n pageUrl,\n pagePath: extractPath(pageUrl),\n },\n });\n }\n\n /**\n * Encola una interacción de walkthrough SIN pasar por el dedup set.\n * Acciones como `step_advanced` se repiten naturalmente (cada next es\n * una navegación distinta) y deduplicarlas perdería datos.\n */\n private enqueueInteraction(\n guideId: string,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n action: GuideInteractionAction,\n stepIndex: number,\n ): void {\n this.trackerQueue.enqueue({\n guideId,\n payload: {\n endUserId,\n sessionId,\n action,\n stepIndex,\n pageUrl,\n pagePath: extractPath(pageUrl),\n },\n });\n }\n\n /**\n * Encola con dedup por sesión del SDK. Para `shown` del primer step:\n * no queremos re-emitirlo si el usuario navega entre dos páginas que\n * matchean el mismo step.\n */\n private enqueueInteractionOnce(\n guideId: string,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n action: GuideInteractionAction,\n stepIndex: number,\n ): void {\n const dedupKey = `${guideId}:${action}:${stepIndex}`;\n if (this.dispatched.has(dedupKey)) return;\n this.dispatched.add(dedupKey);\n this.enqueueInteraction(guideId, endUserId, sessionId, pageUrl, action, stepIndex);\n }\n\n private createSingleStepRenderer(type: GuideType): BaseRenderer | null {\n switch (type) {\n case 'modal':\n return new ModalRenderer();\n case 'banner':\n return new BannerRenderer();\n case 'tooltip':\n return new TooltipRenderer();\n case 'custom':\n return new CustomRenderer();\n case 'walkthrough':\n return null;\n }\n }\n}\n\nfunction extractPath(url: string): string {\n try {\n return new URL(url).pathname;\n } catch {\n return '/';\n }\n}\n","import type { VeoPlugin } from '../../types';\nimport { hasWindow } from '../../utils/safe-env';\nimport { definePlugin } from '../plugin';\nimport { GuidesController } from './guides-controller';\n\nexport interface GuidesPluginConfig {\n apiUrl: string;\n apiKey: string;\n debug?: boolean;\n}\n\n/** Resultado del install — expone el controller para debugging desde el demo. */\nexport interface GuidesPluginHandle {\n controller: GuidesController;\n}\n\n/**\n * Plugin que renderiza guías in-app (modal/banner/tooltip) consultando\n * `GET /v1/guides/resolve` y registra las interacciones en\n * `POST /v1/guides/:id/interactions` vía queue dedicada con retry y\n * sendBeacon en pagehide.\n *\n * Opt-in: `init({ ..., guides: true })`. El plugin escucha\n * `pageview` e `identify` del client; el payload del evento ya trae\n * `sessionId` y `endUserId` para que no necesitemos consultar al\n * client en cada disparo.\n *\n * Frequency híbrida: el backend filtra autoritariamente; el cache\n * local (`GuideFrequencyCache`) solo previene el flash visual cuando\n * la interaction aún no se persistió.\n */\nexport function guidesPlugin(config: GuidesPluginConfig): VeoPlugin {\n return definePlugin({\n name: 'guides',\n install(client) {\n if (!hasWindow()) return;\n const controller = new GuidesController(client, config);\n\n // Exponer el controller en window para que el demo y tests E2E\n // puedan inspeccionar el cache y la queue.\n (window as unknown as { __veoGuides?: GuidesPluginHandle }).__veoGuides = { controller };\n\n client.on('identify', ({ sessionId }) => {\n void controller.checkGuides(window.location.href, sessionId);\n });\n\n client.on('pageview', ({ url, sessionId }) => {\n void controller.checkGuides(url, sessionId);\n });\n },\n });\n}\n\nexport type { GuideInteractionEvent, GuideStep, ResolvedGuide } from './types';\n","import type { VeoPlugin } from '../types';\nimport { hasWindow } from '../utils/safe-env';\nimport { definePlugin } from './plugin';\n\n/**\n * Plugin que auto-emite `pageview` en cambios de ruta de una SPA.\n * Cubre `history.pushState`, `history.replaceState`, `popstate` y `hashchange`.\n */\nexport function spaRouterPlugin(): VeoPlugin {\n return definePlugin({\n name: 'spa-router',\n install(client) {\n if (!hasWindow()) return;\n\n // Pageview inicial.\n client.pageview();\n\n const fire = () => {\n // Diferir para que el router del host actualice location.pathname primero.\n queueMicrotask(() => client.pageview());\n };\n\n const origPushState = window.history.pushState;\n const origReplaceState = window.history.replaceState;\n\n window.history.pushState = function (\n this: History,\n ...args: Parameters<History['pushState']>\n ): void {\n origPushState.apply(this, args);\n fire();\n };\n\n window.history.replaceState = function (\n this: History,\n ...args: Parameters<History['replaceState']>\n ): void {\n origReplaceState.apply(this, args);\n fire();\n };\n\n window.addEventListener('popstate', fire);\n window.addEventListener('hashchange', fire);\n },\n });\n}\n","/**\n * @veo/sdk - SDK oficial de Veo para web.\n */\nimport { Client } from './core/client';\nimport { autocapturePlugin } from './plugins/autocapture';\nimport { guidesPlugin } from './plugins/guides';\nimport { spaRouterPlugin } from './plugins/spa-router';\nimport type { VeoClient, VeoConfig } from './types';\n\nexport { SDK_VERSION } from './contract/v1';\nexport { Client } from './core/client';\nexport { autocapturePlugin } from './plugins/autocapture';\nexport { guidesPlugin } from './plugins/guides';\nexport { definePlugin } from './plugins/plugin';\nexport { spaRouterPlugin } from './plugins/spa-router';\nexport type {\n VeoAutocaptureConfig,\n VeoClient,\n VeoConfig,\n VeoOrganization,\n VeoPlugin,\n VeoVisitor,\n} from './types';\n\n/**\n * Inicializa el SDK de Veo. Instala por defecto el plugin de SPA router\n * (auto-pageview) y, en browser, expone la instancia en `window.veo` drenando\n * la cola del snippet stub si existe.\n *\n * @example\n * ```ts\n * import { init } from '@veo/sdk';\n *\n * const veo = init({\n * apiKey: 'pk_xxx',\n * apiUrl: 'https://api.veo.io'\n * });\n *\n * veo.identify({ visitor: { id: 'user_123' } });\n * veo.track('button_clicked');\n * ```\n */\nexport function init(config: VeoConfig): VeoClient {\n const client = new Client(config);\n\n // Auto-instalar el plugin de SPA router.\n client.use(spaRouterPlugin());\n\n // Auto-instalar autocapture, salvo que esté explícitamente deshabilitado.\n if (config.autocapture !== false) {\n const autocaptureConfig = typeof config.autocapture === 'object' ? config.autocapture : {};\n client.use(autocapturePlugin(autocaptureConfig));\n }\n\n // Renderer de guías: opt-in. Reusa apiUrl/apiKey/debug del client.\n if (config.guides === true) {\n client.use(\n guidesPlugin({\n apiUrl: config.apiUrl,\n apiKey: config.apiKey,\n ...(config.debug !== undefined ? { debug: config.debug } : {}),\n }),\n );\n }\n\n // Asignar a window.veo y drenar la cola del snippet stub, si la hay.\n if (typeof window !== 'undefined') {\n const stub = (window as unknown as { veo?: { _q?: unknown[][] } }).veo;\n const pending = stub?._q ?? [];\n\n (window as unknown as { veo: VeoClient }).veo = client;\n\n for (const entry of pending) {\n const [method, args] = entry;\n if (method === 'init') continue; // ya inicializado\n const fn = (client as unknown as Record<string, (...a: unknown[]) => unknown>)[\n method as string\n ];\n if (typeof fn === 'function') {\n try {\n fn.apply(client, Array.from(args as ArrayLike<unknown>));\n } catch (err) {\n if (config.debug) console.error('[veo] drain error:', err);\n }\n }\n }\n }\n\n return client;\n}\n"]}