@syntropysoft/syntropyfront 0.1.0-alpha.1

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,"file":"index.js","sources":["../src/core/BreadcrumbStore.js","../src/utils/RobustSerializer.js","../src/core/Agent.js","../src/core/ContextCollector.js","../src/interceptors/Interceptors.js","../src/config/presets.js","../src/index.js","../src/core/ProxyObjectTracker.js","../src/core/InterceptorRegistry.js","../src/core/WorkerManager.js"],"sourcesContent":["/**\n * BreadcrumbStore - Almacén de huellas del usuario\n * Mantiene un historial de las últimas acciones del usuario\n */\nexport class BreadcrumbStore {\n constructor(maxBreadcrumbs = 25) {\n this.maxBreadcrumbs = maxBreadcrumbs;\n this.breadcrumbs = [];\n this.agent = null;\n }\n\n /**\n * Configura el agent para envío automático\n * @param {Object} agent - Instancia del agent\n */\n setAgent(agent) {\n this.agent = agent;\n }\n\n /**\n * Configura el tamaño máximo de breadcrumbs\n * @param {number} maxBreadcrumbs - Nuevo tamaño máximo\n */\n setMaxBreadcrumbs(maxBreadcrumbs) {\n this.maxBreadcrumbs = maxBreadcrumbs;\n \n // Si el nuevo tamaño es menor, eliminar breadcrumbs excedentes\n if (this.breadcrumbs.length > this.maxBreadcrumbs) {\n this.breadcrumbs = this.breadcrumbs.slice(-this.maxBreadcrumbs);\n }\n }\n\n /**\n * Obtiene el tamaño máximo actual\n * @returns {number} Tamaño máximo de breadcrumbs\n */\n getMaxBreadcrumbs() {\n return this.maxBreadcrumbs;\n }\n\n /**\n * Añade un breadcrumb a la lista\n * @param {Object} crumb - El breadcrumb a añadir\n * @param {string} crumb.category - Categoría del evento (ui, network, error, etc.)\n * @param {string} crumb.message - Mensaje descriptivo\n * @param {Object} [crumb.data] - Datos adicionales opcionales\n */\n add(crumb) {\n const breadcrumb = {\n ...crumb,\n timestamp: new Date().toISOString(),\n };\n\n if (this.breadcrumbs.length >= this.maxBreadcrumbs) {\n this.breadcrumbs.shift(); // Elimina el más antiguo\n }\n \n this.breadcrumbs.push(breadcrumb);\n \n // Callback opcional para logging\n if (this.onBreadcrumbAdded) {\n this.onBreadcrumbAdded(breadcrumb);\n }\n \n // Enviar al agent si está configurado\n if (this.agent) {\n this.agent.sendBreadcrumbs([breadcrumb]);\n }\n }\n\n /**\n * Devuelve todos los breadcrumbs\n * @returns {Array} Copia de todos los breadcrumbs\n */\n getAll() {\n return [...this.breadcrumbs];\n }\n\n /**\n * Limpia todos los breadcrumbs\n */\n clear() {\n this.breadcrumbs = [];\n }\n\n /**\n * Obtiene breadcrumbs por categoría\n * @param {string} category - Categoría a filtrar\n * @returns {Array} Breadcrumbs de la categoría especificada\n */\n getByCategory(category) {\n return this.breadcrumbs.filter(b => b.category === category);\n }\n}\n\n// Instancia singleton\nexport const breadcrumbStore = new BreadcrumbStore(); ","/**\n * RobustSerializer - Serializador robusto que maneja referencias circulares\n * Implementa una solución similar a flatted pero sin dependencias externas\n */\nexport class RobustSerializer {\n constructor() {\n this.seen = new WeakSet();\n this.circularRefs = new Map();\n this.refCounter = 0;\n }\n\n /**\n * Serializa un objeto de forma segura, manejando referencias circulares\n * @param {any} obj - Objeto a serializar\n * @returns {string} JSON string seguro\n */\n serialize(obj) {\n try {\n // Reset state\n this.seen = new WeakSet();\n this.circularRefs = new Map();\n this.refCounter = 0;\n\n // Serializar con manejo de referencias circulares\n const safeObj = this.makeSerializable(obj);\n \n // Convertir a JSON\n return JSON.stringify(safeObj);\n } catch (error) {\n console.error('SyntropyFront: Error en serialización robusta:', error);\n \n // Fallback: intentar serialización básica con información de error\n return JSON.stringify({\n __serializationError: true,\n error: error.message,\n originalType: typeof obj,\n isObject: obj !== null && typeof obj === 'object',\n timestamp: new Date().toISOString()\n });\n }\n }\n\n /**\n * Hace un objeto serializable, manejando referencias circulares\n * @param {any} obj - Objeto a procesar\n * @param {string} path - Ruta actual en el objeto\n * @returns {any} Objeto serializable\n */\n makeSerializable(obj, path = '') {\n // Casos primitivos\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean') {\n return obj;\n }\n\n // Casos especiales\n if (obj instanceof Date) {\n return {\n __type: 'Date',\n value: obj.toISOString()\n };\n }\n\n if (obj instanceof Error) {\n return {\n __type: 'Error',\n name: obj.name,\n message: obj.message,\n stack: obj.stack,\n cause: obj.cause ? this.makeSerializable(obj.cause, `${path}.cause`) : undefined\n };\n }\n\n if (obj instanceof RegExp) {\n return {\n __type: 'RegExp',\n source: obj.source,\n flags: obj.flags\n };\n }\n\n // Arrays\n if (Array.isArray(obj)) {\n // Verificar referencia circular\n if (this.seen.has(obj)) {\n const refId = this.circularRefs.get(obj);\n return {\n __circular: true,\n refId: refId\n };\n }\n\n this.seen.add(obj);\n const refId = `ref_${++this.refCounter}`;\n this.circularRefs.set(obj, refId);\n\n return obj.map((item, index) => \n this.makeSerializable(item, `${path}[${index}]`)\n );\n }\n\n // Objetos\n if (typeof obj === 'object') {\n // Verificar referencia circular\n if (this.seen.has(obj)) {\n const refId = this.circularRefs.get(obj);\n return {\n __circular: true,\n refId: refId\n };\n }\n\n this.seen.add(obj);\n const refId = `ref_${++this.refCounter}`;\n this.circularRefs.set(obj, refId);\n\n const result = {};\n\n // Procesar propiedades del objeto\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n try {\n const value = obj[key];\n const safeValue = this.makeSerializable(value, `${path}.${key}`);\n result[key] = safeValue;\n } catch (error) {\n // Si falla la serialización de una propiedad, la omitimos\n result[key] = {\n __serializationError: true,\n error: error.message,\n propertyName: key\n };\n }\n }\n }\n\n // Procesar símbolos si están disponibles\n if (Object.getOwnPropertySymbols) {\n const symbols = Object.getOwnPropertySymbols(obj);\n for (const symbol of symbols) {\n try {\n const value = obj[symbol];\n const safeValue = this.makeSerializable(value, `${path}[Symbol(${symbol.description})]`);\n result[`__symbol_${symbol.description || 'anonymous'}`] = safeValue;\n } catch (error) {\n result[`__symbol_${symbol.description || 'anonymous'}`] = {\n __serializationError: true,\n error: error.message,\n symbolName: symbol.description || 'anonymous'\n };\n }\n }\n }\n\n return result;\n }\n\n // Funciones y otros tipos\n if (typeof obj === 'function') {\n return {\n __type: 'Function',\n name: obj.name || 'anonymous',\n length: obj.length,\n toString: obj.toString().substring(0, 200) + '...'\n };\n }\n\n // Fallback para otros tipos\n return {\n __type: 'Unknown',\n constructor: obj.constructor ? obj.constructor.name : 'Unknown',\n toString: String(obj).substring(0, 200) + '...'\n };\n }\n\n /**\n * Deserializa un objeto serializado con referencias circulares\n * @param {string} jsonString - JSON string a deserializar\n * @returns {any} Objeto deserializado\n */\n deserialize(jsonString) {\n try {\n const parsed = JSON.parse(jsonString);\n return this.restoreCircularRefs(parsed);\n } catch (error) {\n console.error('SyntropyFront: Error en deserialización:', error);\n return null;\n }\n }\n\n /**\n * Restaura referencias circulares en un objeto deserializado\n * @param {any} obj - Objeto a restaurar\n * @param {Map} refs - Mapa de referencias\n * @returns {any} Objeto con referencias restauradas\n */\n restoreCircularRefs(obj, refs = new Map()) {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean') {\n return obj;\n }\n\n // Restaurar tipos especiales\n if (obj.__type === 'Date') {\n return new Date(obj.value);\n }\n\n if (obj.__type === 'Error') {\n const error = new Error(obj.message);\n error.name = obj.name;\n error.stack = obj.stack;\n if (obj.cause) {\n error.cause = this.restoreCircularRefs(obj.cause, refs);\n }\n return error;\n }\n\n if (obj.__type === 'RegExp') {\n return new RegExp(obj.source, obj.flags);\n }\n\n if (obj.__type === 'Function') {\n // No podemos restaurar funciones completamente, devolvemos info\n return `[Function: ${obj.name}]`;\n }\n\n // Arrays\n if (Array.isArray(obj)) {\n const result = [];\n refs.set(obj, result);\n\n for (let i = 0; i < obj.length; i++) {\n if (obj[i] && obj[i].__circular) {\n const refId = obj[i].refId;\n if (refs.has(refId)) {\n result[i] = refs.get(refId);\n } else {\n result[i] = null; // Referencia no encontrada\n }\n } else {\n result[i] = this.restoreCircularRefs(obj[i], refs);\n }\n }\n\n return result;\n }\n\n // Objetos\n if (typeof obj === 'object') {\n const result = {};\n refs.set(obj, result);\n\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n if (key.startsWith('__')) {\n // Propiedades especiales\n continue;\n }\n\n const value = obj[key];\n if (value && value.__circular) {\n const refId = value.refId;\n if (refs.has(refId)) {\n result[key] = refs.get(refId);\n } else {\n result[key] = null; // Referencia no encontrada\n }\n } else {\n result[key] = this.restoreCircularRefs(value, refs);\n }\n }\n }\n\n return result;\n }\n\n return obj;\n }\n\n /**\n * Serializa de forma segura para logging (versión simplificada)\n * @param {any} obj - Objeto a serializar\n * @returns {string} JSON string seguro para logs\n */\n serializeForLogging(obj) {\n try {\n return this.serialize(obj);\n } catch (error) {\n return JSON.stringify({\n __logError: true,\n message: 'Error serializando para logging',\n originalError: error.message,\n timestamp: new Date().toISOString()\n });\n }\n }\n}\n\n// Instancia singleton\nexport const robustSerializer = new RobustSerializer(); ","import { robustSerializer } from '../utils/RobustSerializer.js';\n\n/**\n * Agent - Envía datos de trazabilidad al backend\n * Implementa reintentos con backoff exponencial y buffer persistente\n */\nexport class Agent {\n constructor() {\n this.endpoint = null;\n this.headers = {\n 'Content-Type': 'application/json'\n };\n this.batchSize = 10;\n this.batchTimeout = null; // Por defecto = solo errores\n this.queue = [];\n this.batchTimer = null;\n this.isEnabled = false;\n this.sendBreadcrumbs = false; // Por defecto = solo errores\n this.encrypt = null; // Callback de encriptación opcional\n \n // Sistema de reintentos\n this.retryQueue = []; // Cola de reintentos\n this.retryTimer = null;\n this.maxRetries = 5;\n this.baseDelay = 1000; // 1 segundo\n this.maxDelay = 30000; // 30 segundos\n \n // Buffer persistente\n this.usePersistentBuffer = false;\n this.dbName = 'SyntropyFrontBuffer';\n this.dbVersion = 1;\n this.storeName = 'failedItems';\n \n // Inicializar buffer persistente si está disponible\n this.initPersistentBuffer();\n }\n\n /**\n * Inicializa el buffer persistente (IndexedDB)\n */\n async initPersistentBuffer() {\n try {\n if (!window.indexedDB) {\n console.warn('SyntropyFront: IndexedDB no disponible, usando solo memoria');\n return;\n }\n\n const request = indexedDB.open(this.dbName, this.dbVersion);\n \n request.onerror = () => {\n console.warn('SyntropyFront: Error abriendo IndexedDB, usando solo memoria');\n };\n\n request.onupgradeneeded = (event) => {\n const db = event.target.result;\n if (!db.objectStoreNames.contains(this.storeName)) {\n db.createObjectStore(this.storeName, { keyPath: 'id', autoIncrement: true });\n }\n };\n\n request.onsuccess = () => {\n this.db = request.result;\n this.usePersistentBuffer = true;\n console.log('SyntropyFront: Buffer persistente inicializado');\n \n // Intentar enviar items fallidos al inicializar\n this.retryFailedItems();\n };\n } catch (error) {\n console.warn('SyntropyFront: Error inicializando buffer persistente:', error);\n }\n }\n\n /**\n * Guarda items fallidos en el buffer persistente\n */\n async saveToPersistentBuffer(items) {\n if (!this.usePersistentBuffer || !this.db) return;\n\n try {\n const transaction = this.db.transaction([this.storeName], 'readwrite');\n const store = transaction.objectStore(this.storeName);\n \n // ✅ SERIALIZACIÓN ROBUSTA: Serializar items antes de guardar\n let serializedItems;\n try {\n serializedItems = robustSerializer.serialize(items);\n } catch (error) {\n console.error('SyntropyFront: Error serializando items para buffer:', error);\n serializedItems = JSON.stringify({\n __serializationError: true,\n error: error.message,\n timestamp: new Date().toISOString(),\n fallbackData: 'Items no serializables'\n });\n }\n \n const item = {\n items: serializedItems, // Guardar como string serializado\n timestamp: new Date().toISOString(),\n retryCount: 0\n };\n \n await store.add(item);\n console.log('SyntropyFront: Items guardados en buffer persistente');\n } catch (error) {\n console.error('SyntropyFront: Error guardando en buffer persistente:', error);\n }\n }\n\n /**\n * Obtiene items fallidos del buffer persistente\n */\n async getFromPersistentBuffer() {\n if (!this.usePersistentBuffer || !this.db) return [];\n\n try {\n const transaction = this.db.transaction([this.storeName], 'readonly');\n const store = transaction.objectStore(this.storeName);\n const request = store.getAll();\n \n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n } catch (error) {\n console.error('SyntropyFront: Error obteniendo del buffer persistente:', error);\n return [];\n }\n }\n\n /**\n * Remueve items del buffer persistente\n */\n async removeFromPersistentBuffer(id) {\n if (!this.usePersistentBuffer || !this.db) return;\n\n try {\n const transaction = this.db.transaction([this.storeName], 'readwrite');\n const store = transaction.objectStore(this.storeName);\n await store.delete(id);\n } catch (error) {\n console.error('SyntropyFront: Error removiendo del buffer persistente:', error);\n }\n }\n\n /**\n * Intenta enviar items fallidos del buffer persistente\n */\n async retryFailedItems() {\n if (!this.usePersistentBuffer) return;\n\n const failedItems = await this.getFromPersistentBuffer();\n \n for (const item of failedItems) {\n if (item.retryCount < this.maxRetries) {\n // ✅ DESERIALIZACIÓN ROBUSTA: Deserializar items del buffer\n let deserializedItems;\n try {\n if (typeof item.items === 'string') {\n deserializedItems = robustSerializer.deserialize(item.items);\n } else {\n deserializedItems = item.items; // Ya deserializado\n }\n } catch (error) {\n console.error('SyntropyFront: Error deserializando items del buffer:', error);\n // Saltar este item y removerlo del buffer\n await this.removeFromPersistentBuffer(item.id);\n continue;\n }\n \n this.addToRetryQueue(deserializedItems, item.retryCount + 1, item.id);\n } else {\n console.warn('SyntropyFront: Item excedió máximo de reintentos, removiendo del buffer');\n await this.removeFromPersistentBuffer(item.id);\n }\n }\n }\n\n /**\n * Configura el agent\n * @param {Object} config - Configuración del agent\n * @param {string} config.endpoint - URL del endpoint para enviar datos\n * @param {Object} [config.headers] - Headers adicionales\n * @param {number} [config.batchSize] - Tamaño del batch\n * @param {number} [config.batchTimeout] - Timeout del batch en ms (si existe = modo completo)\n * @param {Function} [config.encrypt] - Callback para encriptar datos antes de enviar\n * @param {boolean} [config.usePersistentBuffer] - Usar buffer persistente (default: true)\n * @param {number} [config.maxRetries] - Máximo número de reintentos (default: 5)\n */\n configure(config) {\n this.endpoint = config.endpoint;\n this.headers = { ...this.headers, ...config.headers };\n this.batchSize = config.batchSize || this.batchSize;\n this.batchTimeout = config.batchTimeout; // Si existe = modo completo\n this.isEnabled = !!config.endpoint;\n this.encrypt = config.encrypt || null; // Callback de encriptación\n this.usePersistentBuffer = config.usePersistentBuffer !== false; // Por defecto: true\n this.maxRetries = config.maxRetries || this.maxRetries;\n \n // Lógica simple: si hay batchTimeout = enviar breadcrumbs, sino = solo errores\n this.sendBreadcrumbs = !!config.batchTimeout;\n }\n\n /**\n * Envía un error al backend\n * @param {Object} errorPayload - Payload del error\n * @param {Object} context - Contexto adicional (opcional)\n */\n sendError(errorPayload, context = null) {\n if (!this.isEnabled) {\n console.warn('SyntropyFront Agent: No configurado, error no enviado');\n return;\n }\n\n // Agregar contexto si está disponible\n const payloadWithContext = context ? {\n ...errorPayload,\n context: context\n } : errorPayload;\n\n // Aplicar encriptación si está configurada\n const dataToSend = this.encrypt ? this.encrypt(payloadWithContext) : payloadWithContext;\n\n this.addToQueue({\n type: 'error',\n data: dataToSend,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Envía breadcrumbs al backend\n * @param {Array} breadcrumbs - Lista de breadcrumbs\n */\n sendBreadcrumbs(breadcrumbs) {\n // Solo enviar breadcrumbs si está habilitado (batchTimeout configurado)\n if (!this.isEnabled || !this.sendBreadcrumbs || !breadcrumbs.length) {\n return;\n }\n\n // Aplicar encriptación si está configurada\n const dataToSend = this.encrypt ? this.encrypt(breadcrumbs) : breadcrumbs;\n\n this.addToQueue({\n type: 'breadcrumbs',\n data: dataToSend,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Añade un item a la cola de envío\n * @param {Object} item - Item a añadir\n */\n addToQueue(item) {\n this.queue.push(item);\n\n // Enviar inmediatamente si alcanza el tamaño del batch\n if (this.queue.length >= this.batchSize) {\n this.flush();\n } else if (this.batchTimeout && !this.batchTimer) {\n // Solo programar timeout si batchTimeout está configurado\n this.batchTimer = setTimeout(() => {\n this.flush();\n }, this.batchTimeout);\n }\n }\n\n /**\n * Añade items a la cola de reintentos\n * @param {Array} items - Items a reintentar\n * @param {number} retryCount - Número de reintento\n * @param {number} persistentId - ID en buffer persistente (opcional)\n */\n addToRetryQueue(items, retryCount = 1, persistentId = null) {\n const delay = Math.min(this.baseDelay * Math.pow(2, retryCount - 1), this.maxDelay);\n \n this.retryQueue.push({\n items,\n retryCount,\n persistentId,\n nextRetry: Date.now() + delay\n });\n\n this.scheduleRetry();\n }\n\n /**\n * Programa el próximo reintento\n */\n scheduleRetry() {\n if (this.retryTimer) return;\n\n const nextItem = this.retryQueue.find(item => item.nextRetry <= Date.now());\n if (!nextItem) return;\n\n this.retryTimer = setTimeout(() => {\n this.processRetryQueue();\n }, Math.max(0, nextItem.nextRetry - Date.now()));\n }\n\n /**\n * Procesa la cola de reintentos\n */\n async processRetryQueue() {\n this.retryTimer = null;\n\n const now = Date.now();\n const itemsToRetry = this.retryQueue.filter(item => item.nextRetry <= now);\n \n for (const item of itemsToRetry) {\n try {\n await this.sendToBackend(item.items);\n \n // ✅ Éxito: remover de cola de reintentos\n this.retryQueue = this.retryQueue.filter(q => q !== item);\n \n // Remover del buffer persistente si existe\n if (item.persistentId) {\n await this.removeFromPersistentBuffer(item.persistentId);\n }\n \n console.log(`SyntropyFront: Reintento exitoso después de ${item.retryCount} intentos`);\n } catch (error) {\n console.warn(`SyntropyFront: Reintento ${item.retryCount} falló:`, error);\n \n if (item.retryCount >= this.maxRetries) {\n // ❌ Máximo de reintentos alcanzado\n this.retryQueue = this.retryQueue.filter(q => q !== item);\n console.error('SyntropyFront: Item excedió máximo de reintentos, datos perdidos');\n } else {\n // Programar próximo reintento\n item.retryCount++;\n item.nextRetry = Date.now() + Math.min(\n this.baseDelay * Math.pow(2, item.retryCount - 1), \n this.maxDelay\n );\n }\n }\n }\n\n // Programar próximo reintento si quedan items\n if (this.retryQueue.length > 0) {\n this.scheduleRetry();\n }\n }\n\n /**\n * Envía todos los items en cola\n */\n async flush() {\n if (this.queue.length === 0) return;\n\n const itemsToSend = [...this.queue];\n this.queue = [];\n\n if (this.batchTimer) {\n clearTimeout(this.batchTimer);\n this.batchTimer = null;\n }\n\n try {\n await this.sendToBackend(itemsToSend);\n console.log('SyntropyFront: Datos enviados exitosamente');\n } catch (error) {\n console.error('SyntropyFront Agent: Error enviando datos:', error);\n \n // ✅ REINTENTOS: Agregar a cola de reintentos\n this.addToRetryQueue(itemsToSend);\n \n // ✅ BUFFER PERSISTENTE: Guardar en IndexedDB\n if (this.usePersistentBuffer) {\n await this.saveToPersistentBuffer(itemsToSend);\n }\n }\n }\n\n /**\n * Envía datos al backend\n * @param {Array} items - Items a enviar\n */\n async sendToBackend(items) {\n const payload = {\n timestamp: new Date().toISOString(),\n items: items\n };\n\n // ✅ SERIALIZACIÓN ROBUSTA: Usar serializador que maneja referencias circulares\n let serializedPayload;\n try {\n serializedPayload = robustSerializer.serialize(payload);\n } catch (error) {\n console.error('SyntropyFront: Error en serialización del payload:', error);\n \n // Fallback: intentar serialización básica con información de error\n serializedPayload = JSON.stringify({\n __serializationError: true,\n error: error.message,\n timestamp: new Date().toISOString(),\n itemsCount: items.length,\n fallbackData: 'Serialización falló, datos no enviados'\n });\n }\n\n const response = await fetch(this.endpoint, {\n method: 'POST',\n headers: this.headers,\n body: serializedPayload\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /**\n * Fuerza el envío inmediato de todos los datos pendientes\n */\n async forceFlush() {\n await this.flush();\n \n // También intentar enviar items en cola de reintentos\n if (this.retryQueue.length > 0) {\n console.log('SyntropyFront: Intentando enviar items en cola de reintentos...');\n await this.processRetryQueue();\n }\n }\n\n /**\n * Obtiene estadísticas del agent\n * @returns {Object} Estadísticas\n */\n getStats() {\n return {\n queueLength: this.queue.length,\n retryQueueLength: this.retryQueue.length,\n isEnabled: this.isEnabled,\n usePersistentBuffer: this.usePersistentBuffer,\n maxRetries: this.maxRetries\n };\n }\n\n /**\n * Desactiva el agent\n */\n disable() {\n this.isEnabled = false;\n this.queue = [];\n this.retryQueue = [];\n \n if (this.batchTimer) {\n clearTimeout(this.batchTimer);\n this.batchTimer = null;\n }\n \n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n this.retryTimer = null;\n }\n }\n}\n\n// Instancia singleton\nexport const agent = new Agent(); ","/**\n * ContextCollector - Recolector dinámico de contexto\n * Sistema elegante para recolectar datos según lo que pida el usuario\n * Por defecto: Sets curados y seguros\n * Configuración específica: El usuario elige exactamente qué quiere\n */\nexport class ContextCollector {\n constructor() {\n // Sets curados por defecto (seguros y útiles)\n this.defaultContexts = {\n device: {\n userAgent: () => navigator.userAgent,\n language: () => navigator.language,\n screen: () => ({\n width: window.screen.width,\n height: window.screen.height\n }),\n timezone: () => Intl.DateTimeFormat().resolvedOptions().timeZone\n },\n window: {\n url: () => window.location.href,\n viewport: () => ({\n width: window.innerWidth,\n height: window.innerHeight\n }),\n title: () => document.title\n },\n session: {\n sessionId: () => this.generateSessionId(),\n pageLoadTime: () => performance.now()\n },\n ui: {\n visibility: () => document.visibilityState,\n activeElement: () => document.activeElement ? {\n tagName: document.activeElement.tagName\n } : null\n },\n network: {\n online: () => navigator.onLine,\n connection: () => navigator.connection ? {\n effectiveType: navigator.connection.effectiveType\n } : null\n }\n };\n\n // Mapeo completo de todos los campos disponibles\n this.allFields = {\n device: {\n userAgent: () => navigator.userAgent,\n language: () => navigator.language,\n languages: () => navigator.languages,\n screen: () => ({\n width: window.screen.width,\n height: window.screen.height,\n availWidth: window.screen.availWidth,\n availHeight: window.screen.availHeight,\n colorDepth: window.screen.colorDepth,\n pixelDepth: window.screen.pixelDepth\n }),\n timezone: () => Intl.DateTimeFormat().resolvedOptions().timeZone,\n cookieEnabled: () => navigator.cookieEnabled,\n doNotTrack: () => navigator.doNotTrack\n },\n window: {\n url: () => window.location.href,\n pathname: () => window.location.pathname,\n search: () => window.location.search,\n hash: () => window.location.hash,\n referrer: () => document.referrer,\n title: () => document.title,\n viewport: () => ({\n width: window.innerWidth,\n height: window.innerHeight\n })\n },\n storage: {\n localStorage: () => {\n const keys = Object.keys(localStorage);\n return {\n keys: keys.length,\n size: JSON.stringify(localStorage).length,\n keyNames: keys // Solo nombres, no valores\n };\n },\n sessionStorage: () => {\n const keys = Object.keys(sessionStorage);\n return {\n keys: keys.length,\n size: JSON.stringify(sessionStorage).length,\n keyNames: keys // Solo nombres, no valores\n };\n }\n },\n network: {\n online: () => navigator.onLine,\n connection: () => navigator.connection ? {\n effectiveType: navigator.connection.effectiveType,\n downlink: navigator.connection.downlink,\n rtt: navigator.connection.rtt\n } : null\n },\n ui: {\n focused: () => document.hasFocus(),\n visibility: () => document.visibilityState,\n activeElement: () => document.activeElement ? {\n tagName: document.activeElement.tagName,\n id: document.activeElement.id,\n className: document.activeElement.className\n } : null\n },\n performance: {\n memory: () => window.performance && window.performance.memory ? {\n used: Math.round(window.performance.memory.usedJSHeapSize / 1048576),\n total: Math.round(window.performance.memory.totalJSHeapSize / 1048576),\n limit: Math.round(window.performance.memory.jsHeapSizeLimit / 1048576)\n } : null,\n timing: () => window.performance ? {\n navigationStart: window.performance.timing.navigationStart,\n loadEventEnd: window.performance.timing.loadEventEnd\n } : null\n },\n session: {\n sessionId: () => this.generateSessionId(),\n startTime: () => new Date().toISOString(),\n pageLoadTime: () => performance.now()\n }\n };\n }\n\n /**\n * Recolecta contexto según la configuración\n * @param {Object} contextConfig - Configuración de contexto\n * @returns {Object} Contexto recolectado\n */\n collect(contextConfig = {}) {\n const context = {};\n\n Object.entries(contextConfig).forEach(([contextType, config]) => {\n try {\n if (config === true) {\n // Usar set curado por defecto\n context[contextType] = this.collectDefaultContext(contextType);\n } else if (Array.isArray(config)) {\n // Configuración específica: array de campos\n context[contextType] = this.collectSpecificFields(contextType, config);\n } else if (config === false) {\n // Explícitamente deshabilitado\n // No hacer nada\n } else {\n console.warn(`SyntropyFront: Configuración de contexto inválida para ${contextType}:`, config);\n }\n } catch (error) {\n console.warn(`SyntropyFront: Error recolectando contexto ${contextType}:`, error);\n context[contextType] = { error: 'Failed to collect' };\n }\n });\n\n return context;\n }\n\n /**\n * Recolecta el set curado por defecto\n * @param {string} contextType - Tipo de contexto\n * @returns {Object} Contexto por defecto\n */\n collectDefaultContext(contextType) {\n const defaultContext = this.defaultContexts[contextType];\n if (!defaultContext) {\n console.warn(`SyntropyFront: No hay set por defecto para ${contextType}`);\n return {};\n }\n\n const result = {};\n Object.entries(defaultContext).forEach(([field, getter]) => {\n try {\n result[field] = getter();\n } catch (error) {\n console.warn(`SyntropyFront: Error recolectando campo ${field} de ${contextType}:`, error);\n result[field] = null;\n }\n });\n\n return result;\n }\n\n /**\n * Recolecta campos específicos\n * @param {string} contextType - Tipo de contexto\n * @param {Array} fields - Campos específicos a recolectar\n * @returns {Object} Contexto específico\n */\n collectSpecificFields(contextType, fields) {\n const allFields = this.allFields[contextType];\n if (!allFields) {\n console.warn(`SyntropyFront: Tipo de contexto desconocido: ${contextType}`);\n return {};\n }\n\n const result = {};\n fields.forEach(field => {\n try {\n if (allFields[field]) {\n result[field] = allFields[field]();\n } else {\n console.warn(`SyntropyFront: Campo ${field} no disponible en ${contextType}`);\n }\n } catch (error) {\n console.warn(`SyntropyFront: Error recolectando campo ${field} de ${contextType}:`, error);\n result[field] = null;\n }\n });\n\n return result;\n }\n\n /**\n * Genera un ID de sesión simple\n */\n generateSessionId() {\n if (!this._sessionId) {\n this._sessionId = 'session_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);\n }\n return this._sessionId;\n }\n\n /**\n * Obtiene la lista de tipos de contexto disponibles\n * @returns {Array} Tipos disponibles\n */\n getAvailableTypes() {\n return Object.keys(this.allFields);\n }\n\n /**\n * Obtiene la lista de campos disponibles para un tipo de contexto\n * @param {string} contextType - Tipo de contexto\n * @returns {Array} Campos disponibles\n */\n getAvailableFields(contextType) {\n const fields = this.allFields[contextType];\n return fields ? Object.keys(fields) : [];\n }\n\n /**\n * Obtiene información sobre los sets por defecto\n * @returns {Object} Información de sets por defecto\n */\n getDefaultContextsInfo() {\n const info = {};\n Object.entries(this.defaultContexts).forEach(([type, fields]) => {\n info[type] = Object.keys(fields);\n });\n return info;\n }\n}\n\n// Instancia singleton\nexport const contextCollector = new ContextCollector(); ","import { breadcrumbStore } from '../core/BreadcrumbStore.js';\nimport { agent } from '../core/Agent.js';\nimport { contextCollector } from '../core/ContextCollector.js';\n\n/**\n * Interceptors - Observadores que capturan eventos automáticamente\n * Implementa Chaining Pattern para coexistir con otros APMs\n */\nexport class Interceptors {\n constructor() {\n this.isInitialized = false;\n this.config = {\n captureClicks: true,\n captureFetch: true,\n captureErrors: true,\n captureUnhandledRejections: true\n };\n this.contextTypes = [];\n \n // Referencias originales para restaurar en destroy()\n this.originalHandlers = {\n fetch: null,\n onerror: null,\n onunhandledrejection: null\n };\n \n // Event listeners para limpiar\n this.eventListeners = new Map();\n }\n\n /**\n * Configura los interceptores\n * @param {Object} config - Configuración de interceptores\n */\n configure(config) {\n this.config = { ...this.config, ...config };\n this.contextTypes = config.context || [];\n }\n\n /**\n * Inicializa todos los interceptores\n */\n init() {\n if (this.isInitialized) {\n console.warn('SyntropyFront: Interceptors ya están inicializados');\n return;\n }\n\n if (this.config.captureClicks) {\n this.setupClickInterceptor();\n }\n\n if (this.config.captureFetch) {\n this.setupFetchInterceptor();\n }\n\n if (this.config.captureErrors || this.config.captureUnhandledRejections) {\n this.setupErrorInterceptors();\n }\n\n this.isInitialized = true;\n console.log('SyntropyFront: Interceptors inicializados con Chaining Pattern');\n }\n\n /**\n * Intercepta clics de usuario\n */\n setupClickInterceptor() {\n const clickHandler = (event) => {\n const el = event.target;\n if (!el) return;\n \n // Genera un selector CSS simple para identificar el elemento\n let selector = el.tagName.toLowerCase();\n if (el.id) {\n selector += `#${el.id}`;\n } else if (el.className && typeof el.className === 'string') {\n selector += `.${el.className.split(' ').filter(Boolean).join('.')}`;\n }\n\n breadcrumbStore.add({\n category: 'ui',\n message: `Usuario hizo click en '${selector}'`,\n data: {\n selector,\n tagName: el.tagName,\n id: el.id,\n className: el.className\n }\n });\n };\n\n // Guardar referencia para limpiar después\n this.eventListeners.set('click', clickHandler);\n document.addEventListener('click', clickHandler, true);\n }\n\n /**\n * Intercepta llamadas de red (fetch) con Chaining\n */\n setupFetchInterceptor() {\n // Guardar referencia original\n this.originalHandlers.fetch = window.fetch;\n \n // Crear nuevo handler que encadena con el original\n const syntropyFetchHandler = (...args) => {\n const url = args[0] instanceof Request ? args[0].url : args[0];\n const method = args[0] instanceof Request ? args[0].method : (args[1]?.method || 'GET');\n \n breadcrumbStore.add({\n category: 'network',\n message: `Request: ${method} ${url}`,\n data: {\n url,\n method,\n timestamp: Date.now()\n }\n });\n\n // ✅ CHAINING: Llamar al handler original\n return this.originalHandlers.fetch.apply(window, args);\n };\n\n // Sobrescribir con el nuevo handler\n window.fetch = syntropyFetchHandler;\n }\n\n /**\n * Intercepta errores globales con Chaining\n */\n setupErrorInterceptors() {\n if (this.config.captureErrors) {\n // Guardar referencia original\n this.originalHandlers.onerror = window.onerror;\n \n // Crear nuevo handler que encadena con el original\n const syntropyErrorHandler = (message, source, lineno, colno, error) => {\n const errorPayload = {\n type: 'uncaught_exception',\n error: { \n message, \n source, \n lineno, \n colno, \n stack: error?.stack \n },\n breadcrumbs: breadcrumbStore.getAll(),\n timestamp: new Date().toISOString()\n };\n\n this.handleError(errorPayload);\n \n // ✅ CHAINING: Llamar al handler original si existe\n if (this.originalHandlers.onerror) {\n try {\n return this.originalHandlers.onerror(message, source, lineno, colno, error);\n } catch (originalError) {\n console.warn('SyntropyFront: Error en handler original:', originalError);\n return false;\n }\n }\n \n return false; // No prevenir el error por defecto\n };\n\n // Sobrescribir con el nuevo handler\n window.onerror = syntropyErrorHandler;\n }\n\n if (this.config.captureUnhandledRejections) {\n // Guardar referencia original\n this.originalHandlers.onunhandledrejection = window.onunhandledrejection;\n \n // Crear nuevo handler que encadena con el original\n const syntropyRejectionHandler = (event) => {\n const errorPayload = {\n type: 'unhandled_rejection',\n error: {\n message: event.reason?.message || 'Rechazo de promesa sin mensaje',\n stack: event.reason?.stack,\n },\n breadcrumbs: breadcrumbStore.getAll(),\n timestamp: new Date().toISOString()\n };\n\n this.handleError(errorPayload);\n \n // ✅ CHAINING: Llamar al handler original si existe\n if (this.originalHandlers.onunhandledrejection) {\n try {\n this.originalHandlers.onunhandledrejection(event);\n } catch (originalError) {\n console.warn('SyntropyFront: Error en handler original de rejection:', originalError);\n }\n }\n };\n\n // Sobrescribir con el nuevo handler\n window.onunhandledrejection = syntropyRejectionHandler;\n }\n }\n\n /**\n * Maneja los errores capturados\n * @param {Object} errorPayload - Payload del error\n */\n handleError(errorPayload) {\n // Recolectar contexto si está configurado\n const context = this.contextTypes.length > 0 ? contextCollector.collect(this.contextTypes) : null;\n \n // Enviar al agent si está configurado\n agent.sendError(errorPayload, context);\n \n // Callback para manejo personalizado de errores\n if (this.onError) {\n this.onError(errorPayload);\n } else {\n // Comportamiento por defecto: log a consola\n console.error('SyntropyFront - Error detectado:', errorPayload);\n }\n }\n\n /**\n * Desactiva todos los interceptores y restaura handlers originales\n */\n destroy() {\n if (!this.isInitialized) return;\n\n console.log('SyntropyFront: Limpiando interceptores...');\n\n // ✅ RESTAURAR: Handlers originales\n if (this.originalHandlers.fetch) {\n window.fetch = this.originalHandlers.fetch;\n console.log('SyntropyFront: fetch original restaurado');\n }\n\n if (this.originalHandlers.onerror) {\n window.onerror = this.originalHandlers.onerror;\n console.log('SyntropyFront: onerror original restaurado');\n }\n\n if (this.originalHandlers.onunhandledrejection) {\n window.onunhandledrejection = this.originalHandlers.onunhandledrejection;\n console.log('SyntropyFront: onunhandledrejection original restaurado');\n }\n\n // ✅ LIMPIAR: Event listeners\n this.eventListeners.forEach((handler, eventType) => {\n document.removeEventListener(eventType, handler, true);\n console.log(`SyntropyFront: Event listener ${eventType} removido`);\n });\n\n // Limpiar referencias\n this.originalHandlers = {\n fetch: null,\n onerror: null,\n onunhandledrejection: null\n };\n this.eventListeners.clear();\n this.isInitialized = false;\n\n console.log('SyntropyFront: Interceptors destruidos y handlers restaurados');\n }\n\n /**\n * Obtiene información sobre los handlers originales\n * @returns {Object} Información de handlers\n */\n getHandlerInfo() {\n return {\n isInitialized: this.isInitialized,\n hasOriginalFetch: !!this.originalHandlers.fetch,\n hasOriginalOnError: !!this.originalHandlers.onerror,\n hasOriginalOnUnhandledRejection: !!this.originalHandlers.onunhandledrejection,\n eventListenersCount: this.eventListeners.size\n };\n }\n}\n\n// Instancia singleton\nexport const interceptors = new Interceptors(); ","/**\n * Presets de configuración para SyntropyFront\n * Recetas pre-configuradas para diferentes casos de uso\n * \n * @author SyntropyFront Team\n * @version 1.0.0\n */\n\n/**\n * Preset 'safe' - Modo solo emergencias\n * Ideal para: Producción, aplicaciones críticas, GDPR estricto\n */\nexport const SAFE_PRESET = {\n name: 'safe',\n description: 'Modo solo emergencias - Mínimo impacto, máxima privacidad',\n \n // Configuración del agent\n agent: {\n batchTimeout: null, // Solo errores\n batchSize: 5,\n encrypt: null // Sin encriptación por defecto\n },\n \n // Breadcrumbs limitados\n maxBreadcrumbs: 10,\n \n // Contexto mínimo\n context: {\n device: true, // Solo información básica del dispositivo\n window: false, // No URL ni viewport\n session: true, // Solo sessionId\n ui: false, // No información de UI\n network: false // No información de red\n },\n \n // Sin tracking de objetos\n customObjects: {},\n proxyTracking: false,\n \n // Interceptores básicos\n captureClicks: false,\n captureFetch: false,\n captureErrors: true,\n captureUnhandledRejections: true,\n \n // Worker opcional\n useWorker: false,\n \n // Callbacks\n onError: null,\n onBreadcrumbAdded: null\n};\n\n/**\n * Preset 'balanced' - Modo equilibrado\n * Ideal para: Desarrollo, testing, aplicaciones generales\n */\nexport const BALANCED_PRESET = {\n name: 'balanced',\n description: 'Modo equilibrado - Balance entre información y performance',\n \n // Configuración del agent\n agent: {\n batchTimeout: 10000, // Envío cada 10 segundos\n batchSize: 20,\n encrypt: null\n },\n \n // Breadcrumbs moderados\n maxBreadcrumbs: 50,\n \n // Contexto curado\n context: {\n device: true, // Información completa del dispositivo\n window: true, // URL y viewport\n session: true, // Información de sesión\n ui: true, // Estado básico de UI\n network: true // Estado de conectividad\n },\n \n // Tracking de objetos moderado\n customObjects: {},\n proxyTracking: {\n enabled: true,\n maxStates: 10,\n trackNested: true,\n trackArrays: false\n },\n \n // Interceptores completos\n captureClicks: true,\n captureFetch: true,\n captureErrors: true,\n captureUnhandledRejections: true,\n \n // Worker habilitado\n useWorker: true,\n \n // Callbacks\n onError: null,\n onBreadcrumbAdded: null\n};\n\n/**\n * Preset 'debug' - Modo debug completo\n * Ideal para: Desarrollo, debugging, análisis profundo\n */\nexport const DEBUG_PRESET = {\n name: 'debug',\n description: 'Modo debug completo - Máxima información para desarrollo',\n \n // Configuración del agent\n agent: {\n batchTimeout: 5000, // Envío cada 5 segundos\n batchSize: 50,\n encrypt: null\n },\n \n // Breadcrumbs completos\n maxBreadcrumbs: 100,\n \n // Contexto completo\n context: {\n device: true, // Todo del dispositivo\n window: true, // Todo de la ventana\n session: true, // Todo de la sesión\n ui: true, // Todo de la UI\n network: true // Todo de la red\n },\n \n // Tracking de objetos completo\n customObjects: {},\n proxyTracking: {\n enabled: true,\n maxStates: 20,\n trackNested: true,\n trackArrays: true,\n trackFunctions: true\n },\n \n // Todos los interceptores\n captureClicks: true,\n captureFetch: true,\n captureErrors: true,\n captureUnhandledRejections: true,\n \n // Worker habilitado\n useWorker: true,\n \n // Callbacks para debugging\n onError: (error) => {\n console.error('SyntropyFront Error:', error);\n },\n onBreadcrumbAdded: (breadcrumb) => {\n console.log('SyntropyFront Breadcrumb:', breadcrumb);\n }\n};\n\n/**\n * Preset 'performance' - Modo optimizado para performance\n * Ideal para: Aplicaciones de alta performance, gaming, real-time\n */\nexport const PERFORMANCE_PRESET = {\n name: 'performance',\n description: 'Modo performance - Máxima velocidad, información mínima',\n \n // Configuración del agent\n agent: {\n batchTimeout: null, // Solo errores críticos\n batchSize: 3,\n encrypt: null\n },\n \n // Breadcrumbs mínimos\n maxBreadcrumbs: 5,\n \n // Contexto mínimo\n context: {\n device: false, // Sin información de dispositivo\n window: false, // Sin información de ventana\n session: true, // Solo sessionId\n ui: false, // Sin información de UI\n network: false // Sin información de red\n },\n \n // Sin tracking de objetos\n customObjects: {},\n proxyTracking: false,\n \n // Solo errores críticos\n captureClicks: false,\n captureFetch: false,\n captureErrors: true,\n captureUnhandledRejections: true,\n \n // Sin worker para máxima velocidad\n useWorker: false,\n \n // Sin callbacks\n onError: null,\n onBreadcrumbAdded: null\n};\n\n/**\n * Mapa de presets disponibles\n */\nexport const PRESETS = {\n safe: SAFE_PRESET,\n balanced: BALANCED_PRESET,\n debug: DEBUG_PRESET,\n performance: PERFORMANCE_PRESET\n};\n\n/**\n * Obtiene un preset por nombre\n */\nexport function getPreset(name) {\n const preset = PRESETS[name];\n if (!preset) {\n throw new Error(`Preset '${name}' no encontrado. Presets disponibles: ${Object.keys(PRESETS).join(', ')}`);\n }\n return preset;\n}\n\n/**\n * Lista todos los presets disponibles\n */\nexport function getAvailablePresets() {\n return Object.keys(PRESETS).map(name => ({\n name,\n ...PRESETS[name]\n }));\n}\n\n/**\n * Valida si un preset existe\n */\nexport function isValidPreset(name) {\n return name in PRESETS;\n}\n\n/**\n * Obtiene información de un preset\n */\nexport function getPresetInfo(name) {\n const preset = getPreset(name);\n return {\n name: preset.name,\n description: preset.description,\n features: {\n breadcrumbs: preset.maxBreadcrumbs,\n context: Object.keys(preset.context).filter(key => preset.context[key]).length,\n worker: preset.useWorker,\n proxyTracking: preset.proxyTracking?.enabled || false,\n agentMode: preset.agent.batchTimeout ? 'completo' : 'solo emergencias'\n }\n };\n} ","import { breadcrumbStore } from './core/BreadcrumbStore.js';\nimport { interceptors } from './interceptors/Interceptors.js';\nimport { agent } from './core/Agent.js';\nimport { contextCollector } from './core/ContextCollector.js';\nimport { getPreset, getAvailablePresets, getPresetInfo } from './config/presets.js';\n\n/**\n * SyntropyFront - Sistema de trazabilidad para frontend\n * API principal para inicializar y configurar el sistema\n */\nexport class SyntropyFront {\n constructor() {\n this.isInitialized = false;\n this.currentPreset = null;\n \n // Lazy-loaded modules\n this.proxyObjectTracker = null;\n this.interceptorRegistry = null;\n this.workerManager = null;\n \n // Configuración por defecto (balanced preset)\n this.config = {\n preset: 'balanced', // Preset por defecto\n maxBreadcrumbs: 50,\n captureClicks: true,\n captureFetch: true,\n captureErrors: true,\n captureUnhandledRejections: true,\n onError: null,\n onBreadcrumbAdded: null,\n // Configuración del agent\n agent: {\n endpoint: null,\n headers: {},\n batchSize: 20,\n batchTimeout: 10000, // 10 segundos por defecto\n encrypt: null // Callback de encriptación opcional\n },\n // Configuración de contexto (nueva arquitectura granular)\n context: {\n device: true, // Set curado por defecto\n window: true, // Set curado por defecto\n session: true, // Set curado por defecto\n ui: true, // Set curado por defecto\n network: true // Set curado por defecto\n },\n // Configuración de proxy tracking\n proxyTracking: {\n enabled: true,\n maxStates: 10,\n trackNested: true,\n trackArrays: false\n },\n // Worker habilitado por defecto\n useWorker: true\n };\n }\n\n /**\n * Inicializa el sistema de trazabilidad\n * @param {Object} options - Opciones de configuración\n */\n async init(options = {}) {\n if (this.isInitialized) {\n console.warn('SyntropyFront ya está inicializado');\n return;\n }\n\n // Manejar preset si se especifica\n if (options.preset) {\n try {\n const preset = getPreset(options.preset);\n this.currentPreset = options.preset;\n \n // Aplicar configuración del preset\n this.config = { ...this.config, ...preset };\n \n console.log(`🎯 SyntropyFront: Aplicando preset '${options.preset}' - ${preset.description}`);\n } catch (error) {\n console.error(`❌ SyntropyFront: Error aplicando preset '${options.preset}':`, error.message);\n throw error;\n }\n }\n\n // Aplicar configuración personalizada (sobrescribe preset)\n this.config = { ...this.config, ...options };\n\n // Configurar agent primero\n if (this.config.agent.endpoint) {\n agent.configure(this.config.agent);\n }\n\n // Configurar worker manager\n if (this.config.useWorker !== false) {\n await this.workerManager.init({\n maxBreadcrumbs: this.config.maxBreadcrumbs,\n agent: this.config.agent\n });\n }\n\n // Configurar breadcrumb store\n breadcrumbStore.setMaxBreadcrumbs(this.config.maxBreadcrumbs);\n breadcrumbStore.onBreadcrumbAdded = this.config.onBreadcrumbAdded;\n breadcrumbStore.setAgent(agent);\n\n // Configurar contexto (nueva arquitectura granular)\n this.contextConfig = this.config.context || {\n device: true,\n window: true,\n session: true,\n ui: true,\n network: true\n };\n\n\n\n // Lazy load modules based on configuration\n await this.loadModules();\n\n // Configurar proxy object tracker (si está habilitado)\n if (this.config.proxyTracking?.enabled && this.proxyObjectTracker) {\n this.proxyObjectTracker.configure(this.config.proxyTracking);\n }\n\n // Configurar interceptores\n interceptors.configure({\n captureClicks: this.config.captureClicks,\n captureFetch: this.config.captureFetch,\n captureErrors: this.config.captureErrors,\n captureUnhandledRejections: this.config.captureUnhandledRejections\n });\n\n interceptors.onError = this.config.onError;\n\n // Inicializar interceptores\n interceptors.init();\n\n // Inicializar interceptores personalizados (si están habilitados)\n if (this.interceptorRegistry) {\n this.interceptorRegistry.init({\n breadcrumbStore,\n agent,\n contextCollector\n });\n }\n\n this.isInitialized = true;\n console.log('SyntropyFront inicializado correctamente');\n }\n\n /**\n * Carga módulos dinámicamente basado en la configuración\n */\n async loadModules() {\n const loadPromises = [];\n\n // Cargar ProxyObjectTracker si está habilitado\n if (this.config.proxyTracking?.enabled) {\n loadPromises.push(\n import('./core/ProxyObjectTracker.js')\n .then(module => {\n this.proxyObjectTracker = module.proxyObjectTracker;\n console.log('🔄 ProxyObjectTracker cargado dinámicamente');\n })\n .catch(error => {\n console.warn('⚠️ Error cargando ProxyObjectTracker:', error);\n })\n );\n }\n\n // Cargar InterceptorRegistry si hay interceptores personalizados\n if (this.config.useInterceptors !== false) {\n loadPromises.push(\n import('./core/InterceptorRegistry.js')\n .then(module => {\n this.interceptorRegistry = module.interceptorRegistry;\n console.log('🔄 InterceptorRegistry cargado dinámicamente');\n })\n .catch(error => {\n console.warn('⚠️ Error cargando InterceptorRegistry:', error);\n })\n );\n }\n\n // Cargar WorkerManager si está habilitado\n if (this.config.useWorker !== false) {\n loadPromises.push(\n import('./core/WorkerManager.js')\n .then(module => {\n this.workerManager = new module.default();\n console.log('🔄 WorkerManager cargado dinámicamente');\n })\n .catch(error => {\n console.warn('⚠️ Error cargando WorkerManager:', error);\n })\n );\n }\n\n // Esperar a que todos los módulos se carguen\n await Promise.all(loadPromises);\n }\n\n /**\n * Añade un breadcrumb manualmente\n * @param {string} category - Categoría del evento\n * @param {string} message - Mensaje descriptivo\n * @param {Object} data - Datos adicionales\n */\n addBreadcrumb(category, message, data = {}) {\n breadcrumbStore.add({ category, message, data });\n }\n\n /**\n * Obtiene todos los breadcrumbs\n * @returns {Array} Lista de breadcrumbs\n */\n getBreadcrumbs() {\n return breadcrumbStore.getAll();\n }\n\n /**\n * Obtiene breadcrumbs por categoría\n * @param {string} category - Categoría a filtrar\n * @returns {Array} Breadcrumbs de la categoría\n */\n getBreadcrumbsByCategory(category) {\n return breadcrumbStore.getByCategory(category);\n }\n\n /**\n * Limpia todos los breadcrumbs\n */\n clearBreadcrumbs() {\n breadcrumbStore.clear();\n }\n\n /**\n * Desactiva el sistema de trazabilidad\n */\n destroy() {\n if (!this.isInitialized) return;\n\n interceptors.destroy();\n \n if (this.interceptorRegistry) {\n this.interceptorRegistry.destroy();\n }\n \n breadcrumbStore.clear();\n agent.disable();\n \n if (this.workerManager) {\n this.workerManager.destroy();\n }\n \n this.isInitialized = false;\n console.log('SyntropyFront desactivado');\n }\n\n /**\n * Configura el tamaño máximo de breadcrumbs\n * @param {number} maxBreadcrumbs - Nuevo tamaño máximo\n */\n setMaxBreadcrumbs(maxBreadcrumbs) {\n breadcrumbStore.setMaxBreadcrumbs(maxBreadcrumbs);\n }\n\n /**\n * Obtiene el tamaño máximo actual de breadcrumbs\n * @returns {number} Tamaño máximo\n */\n getMaxBreadcrumbs() {\n return breadcrumbStore.getMaxBreadcrumbs();\n }\n\n /**\n * Fuerza el envío de datos pendientes al backend\n */\n async flush() {\n await agent.forceFlush();\n }\n\n /**\n * Obtiene el contexto actual según la configuración\n * @returns {Object} Contexto recolectado\n */\n getContext() {\n const context = contextCollector.collect(this.contextConfig);\n \n // Agregar objetos personalizados\n const customObjects = customObjectCollector.collectCustomObjects();\n if (Object.keys(customObjects).length > 0) {\n context.customObjects = customObjects;\n }\n \n return context;\n }\n\n /**\n * Obtiene todos los tipos de contexto disponibles\n * @returns {Array} Tipos disponibles\n */\n getAvailableContextTypes() {\n return contextCollector.getAvailableTypes();\n }\n\n /**\n * Obtiene los campos disponibles para un tipo de contexto\n * @param {string} contextType - Tipo de contexto\n * @returns {Array} Campos disponibles\n */\n getAvailableContextFields(contextType) {\n return contextCollector.getAvailableFields(contextType);\n }\n\n /**\n * Obtiene información sobre los sets por defecto\n * @returns {Object} Información de sets por defecto\n */\n getDefaultContextsInfo() {\n return contextCollector.getDefaultContextsInfo();\n }\n\n /**\n * Configura el contexto a recolectar\n * @param {Object} contextConfig - Configuración de contexto\n */\n setContext(contextConfig) {\n if (typeof contextConfig !== 'object') {\n console.warn('SyntropyFront: contextConfig debe ser un objeto');\n return;\n }\n\n this.contextConfig = contextConfig;\n console.log('SyntropyFront: Configuración de contexto actualizada:', contextConfig);\n }\n\n /**\n * Configura los tipos de contexto a recolectar (método legacy)\n * @param {Array} contextTypes - Tipos de contexto\n */\n setContextTypes(contextTypes) {\n if (!Array.isArray(contextTypes)) {\n console.warn('SyntropyFront: contextTypes debe ser un array');\n return;\n }\n\n // Convertir array a configuración por defecto\n const contextConfig = {};\n contextTypes.forEach(type => {\n contextConfig[type] = true; // Usar set por defecto\n });\n\n this.setContext(contextConfig);\n }\n\n // ===== DEPRECATED: CUSTOM OBJECT METHODS =====\n // Estos métodos están deprecados. Usa ProxyObjectTracker en su lugar.\n \n /**\n * @deprecated Usa addProxyObject() en su lugar\n */\n addCustomObject(name, source, maxStates = 10) {\n console.warn('SyntropyFront: addCustomObject() está deprecado. Usa addProxyObject() en su lugar.');\n throw new Error('addCustomObject() está deprecado. Usa addProxyObject() en su lugar.');\n }\n\n /**\n * @deprecated Usa removeProxyObject() en su lugar\n */\n removeCustomObject(name) {\n console.warn('SyntropyFront: removeCustomObject() está deprecado. Usa removeProxyObject() en su lugar.');\n throw new Error('removeCustomObject() está deprecado. Usa removeProxyObject() en su lugar.');\n }\n\n /**\n * @deprecated Usa getProxyObjectState() en su lugar\n */\n getCustomObjectValue(name) {\n console.warn('SyntropyFront: getCustomObjectValue() está deprecado. Usa getProxyObjectState() en su lugar.');\n throw new Error('getCustomObjectValue() está deprecado. Usa getProxyObjectState() en su lugar.');\n }\n\n /**\n * @deprecated Usa getProxyObjectHistory() en su lugar\n */\n getCustomObjectHistory(name) {\n console.warn('SyntropyFront: getCustomObjectHistory() está deprecado. Usa getProxyObjectHistory() en su lugar.');\n throw new Error('getCustomObjectHistory() está deprecado. Usa getProxyObjectHistory() en su lugar.');\n }\n\n /**\n * @deprecated Usa getProxyTrackedObjects() en su lugar\n */\n getCustomObjectNames() {\n console.warn('SyntropyFront: getCustomObjectNames() está deprecado. Usa getProxyTrackedObjects() en su lugar.');\n throw new Error('getCustomObjectNames() está deprecado. Usa getProxyTrackedObjects() en su lugar.');\n }\n\n /**\n * Inyecta un interceptor personalizado\n * @param {string} name - Nombre del interceptor\n * @param {Object} interceptor - Objeto interceptor con métodos init/destroy\n * @returns {SyntropyFront} Instancia para chaining\n */\n inject(name, interceptor) {\n if (!this.interceptorRegistry) {\n console.warn('SyntropyFront: InterceptorRegistry no está cargado. Asegúrate de que useInterceptors no esté en false.');\n return this;\n }\n this.interceptorRegistry.register(name, interceptor);\n return this; // Para chaining\n }\n\n /**\n * Remueve un interceptor personalizado\n * @param {string} name - Nombre del interceptor\n */\n removeInterceptor(name) {\n if (!this.interceptorRegistry) {\n console.warn('SyntropyFront: InterceptorRegistry no está cargado.');\n return;\n }\n this.interceptorRegistry.unregister(name);\n }\n\n /**\n * Obtiene la lista de interceptores registrados\n * @returns {Array} Lista de nombres de interceptores\n */\n getRegisteredInterceptors() {\n if (!this.interceptorRegistry) {\n return [];\n }\n return this.interceptorRegistry.getRegisteredInterceptors();\n }\n\n /**\n * Obtiene información de un interceptor específico\n * @param {string} name - Nombre del interceptor\n * @returns {Object|null} Información del interceptor\n */\n getInterceptorInfo(name) {\n if (!this.interceptorRegistry) {\n return null;\n }\n return this.interceptorRegistry.getInterceptorInfo(name);\n }\n\n /**\n * Verifica si está inicializado\n * @returns {boolean} Estado de inicialización\n */\n isActive() {\n return this.isInitialized;\n }\n\n // ===== PROXY OBJECT TRACKER METHODS =====\n\n /**\n * Agrega un objeto para tracking reactivo con Proxy\n * @param {string} objectPath - Ruta/nombre del objeto\n * @param {Object} targetObject - Objeto a trackear\n * @param {Object} options - Opciones de tracking\n * @returns {Object} Proxy del objeto original\n */\n addProxyObject(objectPath, targetObject, options = {}) {\n if (!this.proxyObjectTracker) {\n console.warn('SyntropyFront: ProxyObjectTracker no está cargado. Asegúrate de que proxyTracking.enabled esté en true.');\n return targetObject;\n }\n return this.proxyObjectTracker.addObject(objectPath, targetObject, options);\n }\n\n /**\n * Obtiene el historial de estados de un objeto trackeado\n * @param {string} objectPath - Ruta del objeto\n * @returns {Array} Historial de estados\n */\n getProxyObjectHistory(objectPath) {\n if (!this.proxyObjectTracker) {\n return [];\n }\n return this.proxyObjectTracker.getObjectHistory(objectPath);\n }\n\n /**\n * Obtiene el estado actual de un objeto trackeado\n * @param {string} objectPath - Ruta del objeto\n * @returns {Object|null} Estado actual\n */\n getProxyObjectState(objectPath) {\n if (!this.proxyObjectTracker) {\n return null;\n }\n return this.proxyObjectTracker.getCurrentState(objectPath);\n }\n\n /**\n * Obtiene todos los objetos trackeados con Proxy\n * @returns {Array} Lista de objetos trackeados\n */\n getProxyTrackedObjects() {\n if (!this.proxyObjectTracker) {\n return [];\n }\n return this.proxyObjectTracker.getTrackedObjects();\n }\n\n /**\n * Remueve un objeto del tracking con Proxy\n * @param {string} objectPath - Ruta del objeto\n * @returns {Object|null} Objeto original (sin proxy)\n */\n removeProxyObject(objectPath) {\n if (!this.proxyObjectTracker) {\n return null;\n }\n return this.proxyObjectTracker.removeObject(objectPath);\n }\n\n /**\n * Limpia todos los objetos trackeados con Proxy\n */\n clearProxyObjects() {\n if (!this.proxyObjectTracker) {\n return;\n }\n this.proxyObjectTracker.clear();\n }\n\n /**\n * Obtiene estadísticas del ProxyObjectTracker\n * @returns {Object} Estadísticas\n */\n getProxyTrackerStats() {\n if (!this.proxyObjectTracker) {\n return { enabled: false, trackedObjects: 0 };\n }\n return this.proxyObjectTracker.getStats();\n }\n\n // Worker Manager Methods\n async addBreadcrumbToWorker(type, message, data = {}) {\n if (!this.workerManager) {\n console.warn('SyntropyFront: WorkerManager no está cargado. Asegúrate de que useWorker no esté en false.');\n return this.addBreadcrumb(type, message, data);\n }\n if (this.workerManager.isWorkerAvailable()) {\n return await this.workerManager.addBreadcrumb(type, message, data);\n } else {\n // Fallback al método normal\n return this.addBreadcrumb(type, message, data);\n }\n }\n\n async getBreadcrumbsFromWorker() {\n if (!this.workerManager) {\n return this.getBreadcrumbs();\n }\n if (this.workerManager.isWorkerAvailable()) {\n return await this.workerManager.getBreadcrumbs();\n } else {\n return this.getBreadcrumbs();\n }\n }\n\n async clearBreadcrumbsFromWorker() {\n if (!this.workerManager) {\n return this.clearBreadcrumbs();\n }\n if (this.workerManager.isWorkerAvailable()) {\n return await this.workerManager.clearBreadcrumbs();\n } else {\n return this.clearBreadcrumbs();\n }\n }\n\n async sendErrorToWorker(error, context = {}) {\n if (!this.workerManager) {\n console.warn('SyntropyFront: WorkerManager no está cargado. Asegúrate de que useWorker no esté en false.');\n return this.sendError(error, context);\n }\n if (this.workerManager.isWorkerAvailable()) {\n return await this.workerManager.sendError(error, context);\n } else {\n // Fallback al método normal\n return this.sendError(error, context);\n }\n }\n\n async pingWorker() {\n if (!this.workerManager) {\n return { success: false, message: 'Worker no cargado' };\n }\n if (this.workerManager.isWorkerAvailable()) {\n return await this.workerManager.ping();\n } else {\n return { success: false, message: 'Worker no disponible' };\n }\n }\n\n getWorkerStatus() {\n if (!this.workerManager) {\n return { isAvailable: false, isInitialized: false, pendingRequests: 0 };\n }\n return this.workerManager.getStatus();\n }\n\n isWorkerAvailable() {\n if (!this.workerManager) {\n return false;\n }\n return this.workerManager.isWorkerAvailable();\n }\n\n // Preset Methods\n getCurrentPreset() {\n return this.currentPreset;\n }\n\n getPresetInfo(presetName = null) {\n const name = presetName || this.currentPreset;\n if (!name) {\n return null;\n }\n return getPresetInfo(name);\n }\n\n getAvailablePresets() {\n return getAvailablePresets();\n }\n\n async changePreset(presetName, options = {}) {\n if (this.isInitialized) {\n console.warn('SyntropyFront: No se puede cambiar preset después de la inicialización');\n return false;\n }\n\n try {\n const preset = getPreset(presetName);\n this.currentPreset = presetName;\n \n // Aplicar preset\n this.config = { ...this.config, ...preset };\n \n // Aplicar opciones adicionales\n this.config = { ...this.config, ...options };\n \n console.log(`🎯 SyntropyFront: Preset cambiado a '${presetName}' - ${preset.description}`);\n return true;\n } catch (error) {\n console.error(`❌ SyntropyFront: Error cambiando preset a '${presetName}':`, error.message);\n return false;\n }\n }\n\n getConfiguration() {\n return {\n currentPreset: this.currentPreset,\n config: this.config,\n isInitialized: this.isInitialized\n };\n }\n}\n\n// Instancia singleton principal\nconst syntropyFront = new SyntropyFront();\n\n// Exportar la instancia como default\nexport default syntropyFront;\n\n// Exportar componentes individuales para uso avanzado\nexport { breadcrumbStore, interceptors, agent }; ","/**\n * ProxyObjectTracker - Tracking reactivo de objetos usando Proxy\n * Captura cambios en tiempo real sin necesidad de polling\n */\nexport class ProxyObjectTracker {\n constructor() {\n this.trackedObjects = new Map(); // Map<objectPath, ProxyInfo>\n this.maxStates = 10; // Estados máximos por objeto\n this.isEnabled = true;\n this.onChangeCallback = null; // Callback cuando cambia un objeto\n }\n\n /**\n * Configura el tracker\n * @param {Object} config - Configuración\n * @param {number} [config.maxStates] - Máximo número de estados por objeto\n * @param {Function} [config.onChange] - Callback cuando cambia un objeto\n */\n configure(config = {}) {\n this.maxStates = config.maxStates || this.maxStates;\n this.onChangeCallback = config.onChange || null;\n this.isEnabled = config.enabled !== false;\n }\n\n /**\n * Agrega un objeto para tracking reactivo\n * @param {string} objectPath - Ruta/nombre del objeto\n * @param {Object} targetObject - Objeto a trackear\n * @param {Object} options - Opciones de tracking\n * @returns {Object} Proxy del objeto original\n */\n addObject(objectPath, targetObject, options = {}) {\n if (!this.isEnabled) {\n console.warn('SyntropyFront: ProxyObjectTracker deshabilitado');\n return targetObject;\n }\n\n if (!targetObject || typeof targetObject !== 'object') {\n console.warn(`SyntropyFront: Objeto inválido para tracking: ${objectPath}`);\n return targetObject;\n }\n\n // Verificar si ya está siendo trackeado\n if (this.trackedObjects.has(objectPath)) {\n console.warn(`SyntropyFront: Objeto ya está siendo trackeado: ${objectPath}`);\n return this.trackedObjects.get(objectPath).proxy;\n }\n\n try {\n // Crear estado inicial\n const initialState = {\n value: this.deepClone(targetObject),\n timestamp: new Date().toISOString(),\n changeType: 'initial'\n };\n\n // Crear info del objeto trackeado\n const proxyInfo = {\n objectPath,\n originalObject: targetObject,\n states: [initialState],\n proxy: null,\n options: {\n trackNested: options.trackNested !== false,\n trackArrays: options.trackArrays !== false,\n trackFunctions: options.trackFunctions !== false,\n maxDepth: options.maxDepth || 5\n }\n };\n\n // Crear Proxy\n const proxy = this.createProxy(targetObject, proxyInfo);\n proxyInfo.proxy = proxy;\n\n // Guardar en el mapa\n this.trackedObjects.set(objectPath, proxyInfo);\n\n console.log(`SyntropyFront: Objeto agregado para tracking reactivo: ${objectPath}`);\n return proxy;\n\n } catch (error) {\n console.error(`SyntropyFront: Error creando proxy para ${objectPath}:`, error);\n return targetObject;\n }\n }\n\n /**\n * Crea un Proxy que intercepta cambios\n * @param {Object} target - Objeto objetivo\n * @param {Object} proxyInfo - Información del proxy\n * @param {number} depth - Profundidad actual\n * @returns {Proxy} Proxy del objeto\n */\n createProxy(target, proxyInfo, depth = 0) {\n const { objectPath, options } = proxyInfo;\n\n return new Proxy(target, {\n get: (obj, prop) => {\n const value = obj[prop];\n\n // Si es un objeto/array y queremos trackear anidados\n if (options.trackNested && \n depth < options.maxDepth && \n value && \n typeof value === 'object' && \n !(value instanceof Date) && \n !(value instanceof RegExp) &&\n !(value instanceof Error)) {\n \n // Crear proxy para objetos anidados\n if (Array.isArray(value) && options.trackArrays) {\n return this.createArrayProxy(value, proxyInfo, depth + 1);\n } else if (!Array.isArray(value)) {\n return this.createProxy(value, proxyInfo, depth + 1);\n }\n }\n\n return value;\n },\n\n set: (obj, prop, value) => {\n const oldValue = obj[prop];\n \n // Solo registrar si realmente cambió\n if (!this.isEqual(oldValue, value)) {\n // Guardar estado anterior antes del cambio\n this.saveState(proxyInfo, 'property_change', {\n property: prop,\n oldValue: this.deepClone(oldValue),\n newValue: this.deepClone(value),\n path: `${objectPath}.${prop}`\n });\n\n // Aplicar el cambio\n obj[prop] = value;\n\n // Notificar cambio\n this.notifyChange(proxyInfo, prop, oldValue, value);\n }\n\n return true;\n },\n\n deleteProperty: (obj, prop) => {\n const oldValue = obj[prop];\n \n // Guardar estado antes de eliminar\n this.saveState(proxyInfo, 'property_deleted', {\n property: prop,\n oldValue: this.deepClone(oldValue),\n path: `${objectPath}.${prop}`\n });\n\n // Eliminar la propiedad\n const result = delete obj[prop];\n\n // Notificar cambio\n this.notifyChange(proxyInfo, prop, oldValue, undefined);\n\n return result;\n }\n });\n }\n\n /**\n * Crea un Proxy especial para arrays\n * @param {Array} target - Array objetivo\n * @param {Object} proxyInfo - Información del proxy\n * @param {number} depth - Profundidad actual\n * @returns {Proxy} Proxy del array\n */\n createArrayProxy(target, proxyInfo, depth = 0) {\n const { objectPath, options } = proxyInfo;\n\n return new Proxy(target, {\n get: (obj, prop) => {\n const value = obj[prop];\n\n // Si es un método de array que modifica\n if (typeof value === 'function' && this.isArrayMutator(prop)) {\n return (...args) => {\n // Guardar estado antes de la mutación\n this.saveState(proxyInfo, 'array_mutation', {\n method: prop,\n arguments: args,\n oldArray: this.deepClone(obj),\n path: objectPath\n });\n\n // Ejecutar el método\n const result = value.apply(obj, args);\n\n // Notificar cambio\n this.notifyChange(proxyInfo, prop, null, obj);\n\n return result;\n };\n }\n\n // Si es un elemento del array y es un objeto\n if (options.trackNested && \n depth < options.maxDepth && \n value && \n typeof value === 'object' && \n !Array.isArray(value) &&\n !(value instanceof Date) && \n !(value instanceof RegExp) &&\n !(value instanceof Error)) {\n \n return this.createProxy(value, proxyInfo, depth + 1);\n }\n\n return value;\n },\n\n set: (obj, prop, value) => {\n const oldValue = obj[prop];\n \n // Solo registrar si realmente cambió\n if (!this.isEqual(oldValue, value)) {\n // Guardar estado anterior\n this.saveState(proxyInfo, 'array_element_change', {\n index: prop,\n oldValue: this.deepClone(oldValue),\n newValue: this.deepClone(value),\n path: `${objectPath}[${prop}]`\n });\n\n // Aplicar el cambio\n obj[prop] = value;\n\n // Notificar cambio\n this.notifyChange(proxyInfo, prop, oldValue, value);\n }\n\n return true;\n }\n });\n }\n\n /**\n * Verifica si un método de array es mutador\n * @param {string} method - Nombre del método\n * @returns {boolean} True si es mutador\n */\n isArrayMutator(method) {\n const mutators = [\n 'push', 'pop', 'shift', 'unshift', 'splice', \n 'reverse', 'sort', 'fill', 'copyWithin'\n ];\n return mutators.includes(method);\n }\n\n /**\n * Guarda un estado en el historial\n * @param {Object} proxyInfo - Información del proxy\n * @param {string} changeType - Tipo de cambio\n * @param {Object} changeData - Datos del cambio\n */\n saveState(proxyInfo, changeType, changeData = {}) {\n const state = {\n value: this.deepClone(proxyInfo.originalObject),\n timestamp: new Date().toISOString(),\n changeType,\n changeData\n };\n\n // Agregar al historial\n proxyInfo.states.push(state);\n\n // Mantener solo los últimos maxStates\n if (proxyInfo.states.length > this.maxStates) {\n proxyInfo.states.shift();\n }\n }\n\n /**\n * Notifica un cambio\n * @param {Object} proxyInfo - Información del proxy\n * @param {string} property - Propiedad que cambió\n * @param {any} oldValue - Valor anterior\n * @param {any} newValue - Valor nuevo\n */\n notifyChange(proxyInfo, property, oldValue, newValue) {\n if (this.onChangeCallback) {\n try {\n this.onChangeCallback({\n objectPath: proxyInfo.objectPath,\n property,\n oldValue,\n newValue,\n timestamp: new Date().toISOString(),\n states: proxyInfo.states.length\n });\n } catch (error) {\n console.error('SyntropyFront: Error en callback de cambio:', error);\n }\n }\n }\n\n /**\n * Obtiene el historial de estados de un objeto\n * @param {string} objectPath - Ruta del objeto\n * @returns {Array} Historial de estados\n */\n getObjectHistory(objectPath) {\n const proxyInfo = this.trackedObjects.get(objectPath);\n if (!proxyInfo) {\n console.warn(`SyntropyFront: Objeto no encontrado: ${objectPath}`);\n return [];\n }\n\n return [...proxyInfo.states];\n }\n\n /**\n * Obtiene el estado actual de un objeto\n * @param {string} objectPath - Ruta del objeto\n * @returns {Object|null} Estado actual\n */\n getCurrentState(objectPath) {\n const proxyInfo = this.trackedObjects.get(objectPath);\n if (!proxyInfo) {\n return null;\n }\n\n return {\n value: this.deepClone(proxyInfo.originalObject),\n timestamp: new Date().toISOString(),\n statesCount: proxyInfo.states.length\n };\n }\n\n /**\n * Obtiene todos los objetos trackeados\n * @returns {Array} Lista de objetos trackeados\n */\n getTrackedObjects() {\n return Array.from(this.trackedObjects.keys());\n }\n\n /**\n * Remueve un objeto del tracking\n * @param {string} objectPath - Ruta del objeto\n * @returns {Object|null} Objeto original (sin proxy)\n */\n removeObject(objectPath) {\n const proxyInfo = this.trackedObjects.get(objectPath);\n if (!proxyInfo) {\n return null;\n }\n\n this.trackedObjects.delete(objectPath);\n console.log(`SyntropyFront: Objeto removido del tracking: ${objectPath}`);\n \n return proxyInfo.originalObject;\n }\n\n /**\n * Limpia todos los objetos trackeados\n */\n clear() {\n this.trackedObjects.clear();\n console.log('SyntropyFront: Todos los objetos removidos del tracking');\n }\n\n /**\n * Obtiene estadísticas del tracker\n * @returns {Object} Estadísticas\n */\n getStats() {\n const stats = {\n trackedObjects: this.trackedObjects.size,\n totalStates: 0,\n isEnabled: this.isEnabled,\n maxStates: this.maxStates\n };\n\n for (const proxyInfo of this.trackedObjects.values()) {\n stats.totalStates += proxyInfo.states.length;\n }\n\n return stats;\n }\n\n /**\n * Clona profundamente un objeto\n * @param {any} obj - Objeto a clonar\n * @returns {any} Objeto clonado\n */\n deepClone(obj) {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj !== 'object') {\n return obj;\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime());\n }\n\n if (obj instanceof RegExp) {\n return new RegExp(obj.source, obj.flags);\n }\n\n if (obj instanceof Error) {\n const error = new Error(obj.message);\n error.name = obj.name;\n error.stack = obj.stack;\n if (obj.cause) {\n error.cause = this.deepClone(obj.cause);\n }\n return error;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => this.deepClone(item));\n }\n\n const cloned = {};\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n cloned[key] = this.deepClone(obj[key]);\n }\n }\n\n return cloned;\n }\n\n /**\n * Compara dos valores para verificar si son iguales\n * @param {any} a - Primer valor\n * @param {any} b - Segundo valor\n * @returns {boolean} True si son iguales\n */\n isEqual(a, b) {\n if (a === b) return true;\n if (a === null || b === null) return a === b;\n if (typeof a !== typeof b) return false;\n if (typeof a !== 'object') return a === b;\n\n // Para objetos, comparación superficial\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n \n if (keysA.length !== keysB.length) return false;\n \n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (a[key] !== b[key]) return false;\n }\n \n return true;\n }\n}\n\n// Instancia singleton\nexport const proxyObjectTracker = new ProxyObjectTracker(); ","/**\n * InterceptorRegistry - Registro de interceptores personalizados\n * Permite al usuario inyectar sus propios interceptores sin modificar el código base\n * Usa una Facade para exponer solo métodos seguros a los interceptores\n */\nexport class InterceptorRegistry {\n constructor() {\n this.customInterceptors = new Map();\n this.isInitialized = false;\n }\n\n /**\n * Crea una API segura para los interceptores\n * Solo expone métodos públicos y seguros\n * @param {Object} config - Configuración con instancias internas\n * @returns {Object} API segura para interceptores\n */\n createInterceptorApi(config) {\n const { breadcrumbStore, agent, contextCollector } = config;\n \n return {\n // Métodos para breadcrumbs\n addBreadcrumb: (category, message, data = {}) => {\n breadcrumbStore.add({ category, message, data, timestamp: new Date().toISOString() });\n },\n \n // Métodos para enviar datos\n sendError: (errorPayload, context = null) => {\n agent.sendError(errorPayload, context);\n },\n \n sendBreadcrumbs: (breadcrumbs) => {\n agent.sendBreadcrumbs(breadcrumbs);\n },\n \n // Métodos para contexto\n getContext: (contextConfig = {}) => {\n return contextCollector.collect(contextConfig);\n },\n \n // Métodos de utilidad\n getTimestamp: () => new Date().toISOString(),\n \n // Información de la API (solo lectura)\n apiVersion: '1.0.0',\n availableMethods: [\n 'addBreadcrumb',\n 'sendError', \n 'sendBreadcrumbs',\n 'getContext',\n 'getTimestamp'\n ]\n };\n }\n\n /**\n * Registra un interceptor personalizado\n * @param {string} name - Nombre del interceptor\n * @param {Object} interceptor - Objeto interceptor con métodos init/destroy\n */\n register(name, interceptor) {\n if (!interceptor || typeof interceptor.init !== 'function') {\n throw new Error(`Interceptor ${name} debe tener un método init()`);\n }\n\n this.customInterceptors.set(name, {\n name,\n interceptor,\n enabled: true\n });\n\n console.log(`SyntropyFront: Interceptor personalizado registrado: ${name}`);\n }\n\n /**\n * Remueve un interceptor personalizado\n * @param {string} name - Nombre del interceptor\n */\n unregister(name) {\n const registered = this.customInterceptors.get(name);\n if (registered) {\n // Destruir el interceptor si está inicializado\n if (this.isInitialized && registered.interceptor.destroy) {\n try {\n registered.interceptor.destroy();\n } catch (error) {\n console.warn(`SyntropyFront: Error destruyendo interceptor ${name}:`, error);\n }\n }\n \n this.customInterceptors.delete(name);\n console.log(`SyntropyFront: Interceptor personalizado removido: ${name}`);\n }\n }\n\n /**\n * Inicializa todos los interceptores personalizados\n * @param {Object} config - Configuración con instancias internas\n */\n init(config = {}) {\n if (this.isInitialized) {\n console.warn('SyntropyFront: InterceptorRegistry ya está inicializado');\n return;\n }\n\n // Crear API segura para interceptores\n const interceptorApi = this.createInterceptorApi(config);\n\n for (const [name, registered] of this.customInterceptors) {\n if (registered.enabled) {\n try {\n // ✅ SEGURO: Pasar solo la API, no el config crudo\n registered.interceptor.init(interceptorApi);\n console.log(`SyntropyFront: Interceptor ${name} inicializado`);\n } catch (error) {\n console.error(`SyntropyFront: Error inicializando interceptor ${name}:`, error);\n }\n }\n }\n\n this.isInitialized = true;\n }\n\n /**\n * Destruye todos los interceptores personalizados\n */\n destroy() {\n if (!this.isInitialized) return;\n\n for (const [name, registered] of this.customInterceptors) {\n if (registered.interceptor.destroy) {\n try {\n registered.interceptor.destroy();\n console.log(`SyntropyFront: Interceptor ${name} destruido`);\n } catch (error) {\n console.warn(`SyntropyFront: Error destruyendo interceptor ${name}:`, error);\n }\n }\n }\n\n this.isInitialized = false;\n }\n\n /**\n * Habilita/deshabilita un interceptor personalizado\n * @param {string} name - Nombre del interceptor\n * @param {boolean} enabled - Si está habilitado\n */\n setEnabled(name, enabled) {\n const registered = this.customInterceptors.get(name);\n if (registered) {\n registered.enabled = enabled;\n \n if (this.isInitialized) {\n if (enabled && registered.interceptor.init) {\n try {\n // Crear API segura para el interceptor\n const interceptorApi = this.createInterceptorApi({\n breadcrumbStore: this.breadcrumbStore,\n agent: this.agent,\n contextCollector: this.contextCollector\n });\n registered.interceptor.init(interceptorApi);\n console.log(`SyntropyFront: Interceptor ${name} habilitado`);\n } catch (error) {\n console.error(`SyntropyFront: Error habilitando interceptor ${name}:`, error);\n }\n } else if (!enabled && registered.interceptor.destroy) {\n try {\n registered.interceptor.destroy();\n console.log(`SyntropyFront: Interceptor ${name} deshabilitado`);\n } catch (error) {\n console.warn(`SyntropyFront: Error deshabilitando interceptor ${name}:`, error);\n }\n }\n }\n }\n }\n\n /**\n * Obtiene la lista de interceptores registrados\n * @returns {Array} Lista de nombres de interceptores\n */\n getRegisteredInterceptors() {\n return Array.from(this.customInterceptors.keys());\n }\n\n /**\n * Obtiene información de un interceptor específico\n * @param {string} name - Nombre del interceptor\n * @returns {Object|null} Información del interceptor\n */\n getInterceptorInfo(name) {\n const registered = this.customInterceptors.get(name);\n if (registered) {\n return {\n name: registered.name,\n enabled: registered.enabled,\n hasInit: typeof registered.interceptor.init === 'function',\n hasDestroy: typeof registered.interceptor.destroy === 'function'\n };\n }\n return null;\n }\n\n /**\n * Obtiene la documentación de la API para interceptores\n * @returns {Object} Documentación de la API\n */\n getApiDocumentation() {\n return {\n version: '1.0.0',\n methods: {\n addBreadcrumb: {\n description: 'Agrega un breadcrumb al historial',\n signature: 'addBreadcrumb(category, message, data?)',\n example: 'api.addBreadcrumb(\"ui\", \"Usuario hizo click\", { element: \"button\" })'\n },\n sendError: {\n description: 'Envía un error al backend',\n signature: 'sendError(errorPayload, context?)',\n example: 'api.sendError({ message: \"Error crítico\" }, { device: true })'\n },\n sendBreadcrumbs: {\n description: 'Envía breadcrumbs al backend',\n signature: 'sendBreadcrumbs(breadcrumbs)',\n example: 'api.sendBreadcrumbs([{ category: \"ui\", message: \"Click\" }])'\n },\n getContext: {\n description: 'Obtiene contexto del navegador',\n signature: 'getContext(contextConfig?)',\n example: 'api.getContext({ device: true, window: [\"url\"] })'\n },\n getTimestamp: {\n description: 'Obtiene timestamp actual en formato ISO',\n signature: 'getTimestamp()',\n example: 'const now = api.getTimestamp()'\n }\n }\n };\n }\n\n /**\n * Limpia todos los interceptores registrados\n */\n clear() {\n this.destroy();\n this.customInterceptors.clear();\n }\n}\n\n// Instancia singleton\nexport const interceptorRegistry = new InterceptorRegistry(); ","/**\n * WorkerManager - Maneja comunicación con SyntropyWorker\n * Proporciona API para interactuar con el worker desde el main thread\n * \n * @author SyntropyFront Team\n * @version 1.0.0\n */\n\nclass WorkerManager {\n constructor() {\n this.worker = null;\n this.pendingRequests = new Map();\n this.requestId = 0;\n this.isInitialized = false;\n this.config = {};\n \n // Setup worker communication\n this.setupWorker();\n }\n\n /**\n * Inicializa el worker\n */\n setupWorker() {\n try {\n // Crear worker\n this.worker = new Worker('./src/workers/SyntropyWorker.js');\n \n // Setup message handling\n this.worker.addEventListener('message', (event) => {\n this.handleWorkerMessage(event.data);\n });\n \n // Setup error handling\n this.worker.addEventListener('error', (error) => {\n console.error('SyntropyWorker error:', error);\n this.handleWorkerError(error);\n });\n \n console.log('🔄 WorkerManager: Worker inicializado');\n } catch (error) {\n console.error('WorkerManager: Error inicializando worker:', error);\n this.handleWorkerUnavailable();\n }\n }\n\n /**\n * Inicializa el worker con configuración\n */\n async init(config) {\n try {\n this.config = config;\n \n const response = await this.sendMessage('INIT', config);\n \n if (response.success) {\n this.isInitialized = true;\n console.log('✅ WorkerManager: Worker inicializado correctamente');\n return true;\n } else {\n throw new Error(response.error || 'Error inicializando worker');\n }\n } catch (error) {\n console.error('WorkerManager: Error en init:', error);\n return false;\n }\n }\n\n /**\n * Envía mensaje al worker y espera respuesta\n */\n sendMessage(type, payload = {}) {\n return new Promise((resolve, reject) => {\n if (!this.worker) {\n reject(new Error('Worker no disponible'));\n return;\n }\n\n const id = this.generateRequestId();\n \n // Guardar callback para la respuesta\n this.pendingRequests.set(id, { resolve, reject });\n \n // Enviar mensaje al worker\n this.worker.postMessage({\n type,\n payload,\n id\n });\n \n // Timeout para evitar requests colgados\n setTimeout(() => {\n if (this.pendingRequests.has(id)) {\n this.pendingRequests.delete(id);\n reject(new Error(`Timeout en request: ${type}`));\n }\n }, 5000); // 5 segundos timeout\n });\n }\n\n /**\n * Maneja mensajes del worker\n */\n handleWorkerMessage(data) {\n const { id, success, error, ...response } = data;\n \n const request = this.pendingRequests.get(id);\n if (request) {\n this.pendingRequests.delete(id);\n \n if (success) {\n request.resolve(response);\n } else {\n request.reject(new Error(error || 'Error en worker'));\n }\n } else {\n console.warn('WorkerManager: Respuesta sin request pendiente:', id);\n }\n }\n\n /**\n * Maneja errores del worker\n */\n handleWorkerError(error) {\n console.error('WorkerManager: Error del worker:', error);\n \n // Limpiar requests pendientes\n this.pendingRequests.forEach((request) => {\n request.reject(new Error('Worker error'));\n });\n this.pendingRequests.clear();\n \n // Fallback a modo sin worker\n this.handleWorkerUnavailable();\n }\n\n /**\n * Maneja cuando el worker no está disponible\n */\n handleWorkerUnavailable() {\n console.warn('WorkerManager: Worker no disponible, usando fallback');\n \n // Aquí podríamos implementar fallback al modo main thread\n // Por ahora solo loggeamos\n }\n\n /**\n * Agrega breadcrumb al worker\n */\n async addBreadcrumb(type, message, data = {}) {\n try {\n const response = await this.sendMessage('ADD_BREADCRUMB', {\n type,\n message,\n data\n });\n \n return response;\n } catch (error) {\n console.error('WorkerManager: Error agregando breadcrumb:', error);\n throw error;\n }\n }\n\n /**\n * Obtiene breadcrumbs del worker\n */\n async getBreadcrumbs() {\n try {\n const response = await this.sendMessage('GET_BREADCRUMBS');\n return response.breadcrumbs || [];\n } catch (error) {\n console.error('WorkerManager: Error obteniendo breadcrumbs:', error);\n return [];\n }\n }\n\n /**\n * Limpia breadcrumbs del worker\n */\n async clearBreadcrumbs() {\n try {\n const response = await this.sendMessage('CLEAR_BREADCRUMBS');\n return response;\n } catch (error) {\n console.error('WorkerManager: Error limpiando breadcrumbs:', error);\n throw error;\n }\n }\n\n /**\n * Envía error al worker\n */\n async sendError(error, context = {}) {\n try {\n const response = await this.sendMessage('SEND_ERROR', {\n error,\n context\n });\n \n return response;\n } catch (error) {\n console.error('WorkerManager: Error enviando error:', error);\n throw error;\n }\n }\n\n /**\n * Actualiza contexto del worker\n */\n async updateContext(context) {\n try {\n const response = await this.sendMessage('UPDATE_CONTEXT', context);\n return response;\n } catch (error) {\n console.error('WorkerManager: Error actualizando contexto:', error);\n throw error;\n }\n }\n\n /**\n * Ping al worker para verificar conectividad\n */\n async ping() {\n try {\n const response = await this.sendMessage('PING');\n return response;\n } catch (error) {\n console.error('WorkerManager: Error en ping:', error);\n throw error;\n }\n }\n\n /**\n * Obtiene estadísticas del worker\n */\n async getWorkerStats() {\n try {\n const response = await this.sendMessage('GET_STATS');\n return response;\n } catch (error) {\n console.error('WorkerManager: Error obteniendo stats:', error);\n return null;\n }\n }\n\n /**\n * Destruye el worker\n */\n destroy() {\n if (this.worker) {\n // Limpiar requests pendientes\n this.pendingRequests.forEach((request) => {\n request.reject(new Error('Worker destroyed'));\n });\n this.pendingRequests.clear();\n \n // Terminar worker\n this.worker.terminate();\n this.worker = null;\n \n console.log('🔄 WorkerManager: Worker destruido');\n }\n }\n\n /**\n * Genera ID único para requests\n */\n generateRequestId() {\n return `req_${++this.requestId}_${Date.now()}`;\n }\n\n /**\n * Verifica si el worker está disponible\n */\n isWorkerAvailable() {\n return this.worker !== null && this.isInitialized;\n }\n\n /**\n * Obtiene estado del worker\n */\n getStatus() {\n return {\n isAvailable: this.isWorkerAvailable(),\n isInitialized: this.isInitialized,\n pendingRequests: this.pendingRequests.size,\n config: this.config\n };\n }\n}\n\nexport default WorkerManager; "],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var SyntropyFront=function(e){"use strict";const t=new class{constructor(e=25){this.maxBreadcrumbs=e,this.breadcrumbs=[],this.agent=null}setAgent(e){this.agent=e}setMaxBreadcrumbs(e){this.maxBreadcrumbs=e,this.breadcrumbs.length>this.maxBreadcrumbs&&(this.breadcrumbs=this.breadcrumbs.slice(-this.maxBreadcrumbs))}getMaxBreadcrumbs(){return this.maxBreadcrumbs}add(e){const t={...e,timestamp:(new Date).toISOString()};this.breadcrumbs.length>=this.maxBreadcrumbs&&this.breadcrumbs.shift(),this.breadcrumbs.push(t),this.onBreadcrumbAdded&&this.onBreadcrumbAdded(t),this.agent&&this.agent.sendBreadcrumbs([t])}getAll(){return[...this.breadcrumbs]}clear(){this.breadcrumbs=[]}getByCategory(e){return this.breadcrumbs.filter(t=>t.category===e)}};const r=new class{constructor(){this.seen=new WeakSet,this.circularRefs=new Map,this.refCounter=0}serialize(e){try{this.seen=new WeakSet,this.circularRefs=new Map,this.refCounter=0;const t=this.makeSerializable(e);return JSON.stringify(t)}catch(t){return console.error("SyntropyFront: Error en serialización robusta:",t),JSON.stringify({__serializationError:!0,error:t.message,originalType:typeof e,isObject:null!==e&&"object"==typeof e,timestamp:(new Date).toISOString()})}}makeSerializable(e,t=""){if(null==e)return e;if("string"==typeof e||"number"==typeof e||"boolean"==typeof e)return e;if(e instanceof Date)return{__type:"Date",value:e.toISOString()};if(e instanceof Error)return{__type:"Error",name:e.name,message:e.message,stack:e.stack,cause:e.cause?this.makeSerializable(e.cause,`${t}.cause`):void 0};if(e instanceof RegExp)return{__type:"RegExp",source:e.source,flags:e.flags};if(Array.isArray(e)){if(this.seen.has(e)){return{__circular:!0,refId:this.circularRefs.get(e)}}this.seen.add(e);const r="ref_"+ ++this.refCounter;return this.circularRefs.set(e,r),e.map((e,r)=>this.makeSerializable(e,`${t}[${r}]`))}if("object"==typeof e){if(this.seen.has(e)){return{__circular:!0,refId:this.circularRefs.get(e)}}this.seen.add(e);const r="ref_"+ ++this.refCounter;this.circularRefs.set(e,r);const n={};for(const r in e)if(e.hasOwnProperty(r))try{const o=e[r],s=this.makeSerializable(o,`${t}.${r}`);n[r]=s}catch(e){n[r]={__serializationError:!0,error:e.message,propertyName:r}}if(Object.getOwnPropertySymbols){const r=Object.getOwnPropertySymbols(e);for(const o of r)try{const r=e[o],s=this.makeSerializable(r,`${t}[Symbol(${o.description})]`);n[`__symbol_${o.description||"anonymous"}`]=s}catch(e){n[`__symbol_${o.description||"anonymous"}`]={__serializationError:!0,error:e.message,symbolName:o.description||"anonymous"}}}return n}return"function"==typeof e?{__type:"Function",name:e.name||"anonymous",length:e.length,toString:e.toString().substring(0,200)+"..."}:{__type:"Unknown",constructor:e.constructor?e.constructor.name:"Unknown",toString:String(e).substring(0,200)+"..."}}deserialize(e){try{const t=JSON.parse(e);return this.restoreCircularRefs(t)}catch(e){return console.error("SyntropyFront: Error en deserialización:",e),null}}restoreCircularRefs(e,t=new Map){if(null==e)return e;if("string"==typeof e||"number"==typeof e||"boolean"==typeof e)return e;if("Date"===e.__type)return new Date(e.value);if("Error"===e.__type){const r=new Error(e.message);return r.name=e.name,r.stack=e.stack,e.cause&&(r.cause=this.restoreCircularRefs(e.cause,t)),r}if("RegExp"===e.__type)return new RegExp(e.source,e.flags);if("Function"===e.__type)return`[Function: ${e.name}]`;if(Array.isArray(e)){const r=[];t.set(e,r);for(let n=0;n<e.length;n++)if(e[n]&&e[n].__circular){const o=e[n].refId;t.has(o)?r[n]=t.get(o):r[n]=null}else r[n]=this.restoreCircularRefs(e[n],t);return r}if("object"==typeof e){const r={};t.set(e,r);for(const n in e)if(e.hasOwnProperty(n)){if(n.startsWith("__"))continue;const o=e[n];if(o&&o.__circular){const e=o.refId;t.has(e)?r[n]=t.get(e):r[n]=null}else r[n]=this.restoreCircularRefs(o,t)}return r}return e}serializeForLogging(e){try{return this.serialize(e)}catch(e){return JSON.stringify({__logError:!0,message:"Error serializando para logging",originalError:e.message,timestamp:(new Date).toISOString()})}}};const n=new class{constructor(){this.endpoint=null,this.headers={"Content-Type":"application/json"},this.batchSize=10,this.batchTimeout=null,this.queue=[],this.batchTimer=null,this.isEnabled=!1,this.sendBreadcrumbs=!1,this.encrypt=null,this.retryQueue=[],this.retryTimer=null,this.maxRetries=5,this.baseDelay=1e3,this.maxDelay=3e4,this.usePersistentBuffer=!1,this.dbName="SyntropyFrontBuffer",this.dbVersion=1,this.storeName="failedItems",this.initPersistentBuffer()}async initPersistentBuffer(){try{if(!window.indexedDB)return void console.warn("SyntropyFront: IndexedDB no disponible, usando solo memoria");const e=indexedDB.open(this.dbName,this.dbVersion);e.onerror=()=>{console.warn("SyntropyFront: Error abriendo IndexedDB, usando solo memoria")},e.onupgradeneeded=e=>{const t=e.target.result;t.objectStoreNames.contains(this.storeName)||t.createObjectStore(this.storeName,{keyPath:"id",autoIncrement:!0})},e.onsuccess=()=>{this.db=e.result,this.usePersistentBuffer=!0,console.log("SyntropyFront: Buffer persistente inicializado"),this.retryFailedItems()}}catch(e){console.warn("SyntropyFront: Error inicializando buffer persistente:",e)}}async saveToPersistentBuffer(e){if(this.usePersistentBuffer&&this.db)try{const t=this.db.transaction([this.storeName],"readwrite").objectStore(this.storeName);let n;try{n=r.serialize(e)}catch(e){console.error("SyntropyFront: Error serializando items para buffer:",e),n=JSON.stringify({__serializationError:!0,error:e.message,timestamp:(new Date).toISOString(),fallbackData:"Items no serializables"})}const o={items:n,timestamp:(new Date).toISOString(),retryCount:0};await t.add(o),console.log("SyntropyFront: Items guardados en buffer persistente")}catch(e){console.error("SyntropyFront: Error guardando en buffer persistente:",e)}}async getFromPersistentBuffer(){if(!this.usePersistentBuffer||!this.db)return[];try{const e=this.db.transaction([this.storeName],"readonly"),t=e.objectStore(this.storeName).getAll();return new Promise((e,r)=>{t.onsuccess=()=>e(t.result),t.onerror=()=>r(t.error)})}catch(e){return console.error("SyntropyFront: Error obteniendo del buffer persistente:",e),[]}}async removeFromPersistentBuffer(e){if(this.usePersistentBuffer&&this.db)try{const t=this.db.transaction([this.storeName],"readwrite").objectStore(this.storeName);await t.delete(e)}catch(e){console.error("SyntropyFront: Error removiendo del buffer persistente:",e)}}async retryFailedItems(){if(!this.usePersistentBuffer)return;const e=await this.getFromPersistentBuffer();for(const t of e)if(t.retryCount<this.maxRetries){let e;try{e="string"==typeof t.items?r.deserialize(t.items):t.items}catch(e){console.error("SyntropyFront: Error deserializando items del buffer:",e),await this.removeFromPersistentBuffer(t.id);continue}this.addToRetryQueue(e,t.retryCount+1,t.id)}else console.warn("SyntropyFront: Item excedió máximo de reintentos, removiendo del buffer"),await this.removeFromPersistentBuffer(t.id)}configure(e){this.endpoint=e.endpoint,this.headers={...this.headers,...e.headers},this.batchSize=e.batchSize||this.batchSize,this.batchTimeout=e.batchTimeout,this.isEnabled=!!e.endpoint,this.encrypt=e.encrypt||null,this.usePersistentBuffer=!1!==e.usePersistentBuffer,this.maxRetries=e.maxRetries||this.maxRetries,this.sendBreadcrumbs=!!e.batchTimeout}sendError(e,t=null){if(!this.isEnabled)return void console.warn("SyntropyFront Agent: No configurado, error no enviado");const r=t?{...e,context:t}:e,n=this.encrypt?this.encrypt(r):r;this.addToQueue({type:"error",data:n,timestamp:(new Date).toISOString()})}sendBreadcrumbs(e){if(!this.isEnabled||!this.sendBreadcrumbs||!e.length)return;const t=this.encrypt?this.encrypt(e):e;this.addToQueue({type:"breadcrumbs",data:t,timestamp:(new Date).toISOString()})}addToQueue(e){this.queue.push(e),this.queue.length>=this.batchSize?this.flush():this.batchTimeout&&!this.batchTimer&&(this.batchTimer=setTimeout(()=>{this.flush()},this.batchTimeout))}addToRetryQueue(e,t=1,r=null){const n=Math.min(this.baseDelay*Math.pow(2,t-1),this.maxDelay);this.retryQueue.push({items:e,retryCount:t,persistentId:r,nextRetry:Date.now()+n}),this.scheduleRetry()}scheduleRetry(){if(this.retryTimer)return;const e=this.retryQueue.find(e=>e.nextRetry<=Date.now());e&&(this.retryTimer=setTimeout(()=>{this.processRetryQueue()},Math.max(0,e.nextRetry-Date.now())))}async processRetryQueue(){this.retryTimer=null;const e=Date.now(),t=this.retryQueue.filter(t=>t.nextRetry<=e);for(const e of t)try{await this.sendToBackend(e.items),this.retryQueue=this.retryQueue.filter(t=>t!==e),e.persistentId&&await this.removeFromPersistentBuffer(e.persistentId),console.log(`SyntropyFront: Reintento exitoso después de ${e.retryCount} intentos`)}catch(t){console.warn(`SyntropyFront: Reintento ${e.retryCount} falló:`,t),e.retryCount>=this.maxRetries?(this.retryQueue=this.retryQueue.filter(t=>t!==e),console.error("SyntropyFront: Item excedió máximo de reintentos, datos perdidos")):(e.retryCount++,e.nextRetry=Date.now()+Math.min(this.baseDelay*Math.pow(2,e.retryCount-1),this.maxDelay))}this.retryQueue.length>0&&this.scheduleRetry()}async flush(){if(0===this.queue.length)return;const e=[...this.queue];this.queue=[],this.batchTimer&&(clearTimeout(this.batchTimer),this.batchTimer=null);try{await this.sendToBackend(e),console.log("SyntropyFront: Datos enviados exitosamente")}catch(t){console.error("SyntropyFront Agent: Error enviando datos:",t),this.addToRetryQueue(e),this.usePersistentBuffer&&await this.saveToPersistentBuffer(e)}}async sendToBackend(e){const t={timestamp:(new Date).toISOString(),items:e};let n;try{n=r.serialize(t)}catch(t){console.error("SyntropyFront: Error en serialización del payload:",t),n=JSON.stringify({__serializationError:!0,error:t.message,timestamp:(new Date).toISOString(),itemsCount:e.length,fallbackData:"Serialización falló, datos no enviados"})}const o=await fetch(this.endpoint,{method:"POST",headers:this.headers,body:n});if(!o.ok)throw new Error(`HTTP ${o.status}: ${o.statusText}`);return o.json()}async forceFlush(){await this.flush(),this.retryQueue.length>0&&(console.log("SyntropyFront: Intentando enviar items en cola de reintentos..."),await this.processRetryQueue())}getStats(){return{queueLength:this.queue.length,retryQueueLength:this.retryQueue.length,isEnabled:this.isEnabled,usePersistentBuffer:this.usePersistentBuffer,maxRetries:this.maxRetries}}disable(){this.isEnabled=!1,this.queue=[],this.retryQueue=[],this.batchTimer&&(clearTimeout(this.batchTimer),this.batchTimer=null),this.retryTimer&&(clearTimeout(this.retryTimer),this.retryTimer=null)}};const o=new class{constructor(){this.defaultContexts={device:{userAgent:()=>navigator.userAgent,language:()=>navigator.language,screen:()=>({width:window.screen.width,height:window.screen.height}),timezone:()=>Intl.DateTimeFormat().resolvedOptions().timeZone},window:{url:()=>window.location.href,viewport:()=>({width:window.innerWidth,height:window.innerHeight}),title:()=>document.title},session:{sessionId:()=>this.generateSessionId(),pageLoadTime:()=>performance.now()},ui:{visibility:()=>document.visibilityState,activeElement:()=>document.activeElement?{tagName:document.activeElement.tagName}:null},network:{online:()=>navigator.onLine,connection:()=>navigator.connection?{effectiveType:navigator.connection.effectiveType}:null}},this.allFields={device:{userAgent:()=>navigator.userAgent,language:()=>navigator.language,languages:()=>navigator.languages,screen:()=>({width:window.screen.width,height:window.screen.height,availWidth:window.screen.availWidth,availHeight:window.screen.availHeight,colorDepth:window.screen.colorDepth,pixelDepth:window.screen.pixelDepth}),timezone:()=>Intl.DateTimeFormat().resolvedOptions().timeZone,cookieEnabled:()=>navigator.cookieEnabled,doNotTrack:()=>navigator.doNotTrack},window:{url:()=>window.location.href,pathname:()=>window.location.pathname,search:()=>window.location.search,hash:()=>window.location.hash,referrer:()=>document.referrer,title:()=>document.title,viewport:()=>({width:window.innerWidth,height:window.innerHeight})},storage:{localStorage:()=>{const e=Object.keys(localStorage);return{keys:e.length,size:JSON.stringify(localStorage).length,keyNames:e}},sessionStorage:()=>{const e=Object.keys(sessionStorage);return{keys:e.length,size:JSON.stringify(sessionStorage).length,keyNames:e}}},network:{online:()=>navigator.onLine,connection:()=>navigator.connection?{effectiveType:navigator.connection.effectiveType,downlink:navigator.connection.downlink,rtt:navigator.connection.rtt}:null},ui:{focused:()=>document.hasFocus(),visibility:()=>document.visibilityState,activeElement:()=>document.activeElement?{tagName:document.activeElement.tagName,id:document.activeElement.id,className:document.activeElement.className}:null},performance:{memory:()=>window.performance&&window.performance.memory?{used:Math.round(window.performance.memory.usedJSHeapSize/1048576),total:Math.round(window.performance.memory.totalJSHeapSize/1048576),limit:Math.round(window.performance.memory.jsHeapSizeLimit/1048576)}:null,timing:()=>window.performance?{navigationStart:window.performance.timing.navigationStart,loadEventEnd:window.performance.timing.loadEventEnd}:null},session:{sessionId:()=>this.generateSessionId(),startTime:()=>(new Date).toISOString(),pageLoadTime:()=>performance.now()}}}collect(e={}){const t={};return Object.entries(e).forEach(([e,r])=>{try{!0===r?t[e]=this.collectDefaultContext(e):Array.isArray(r)?t[e]=this.collectSpecificFields(e,r):!1===r||console.warn(`SyntropyFront: Configuración de contexto inválida para ${e}:`,r)}catch(r){console.warn(`SyntropyFront: Error recolectando contexto ${e}:`,r),t[e]={error:"Failed to collect"}}}),t}collectDefaultContext(e){const t=this.defaultContexts[e];if(!t)return console.warn(`SyntropyFront: No hay set por defecto para ${e}`),{};const r={};return Object.entries(t).forEach(([t,n])=>{try{r[t]=n()}catch(n){console.warn(`SyntropyFront: Error recolectando campo ${t} de ${e}:`,n),r[t]=null}}),r}collectSpecificFields(e,t){const r=this.allFields[e];if(!r)return console.warn(`SyntropyFront: Tipo de contexto desconocido: ${e}`),{};const n={};return t.forEach(t=>{try{r[t]?n[t]=r[t]():console.warn(`SyntropyFront: Campo ${t} no disponible en ${e}`)}catch(r){console.warn(`SyntropyFront: Error recolectando campo ${t} de ${e}:`,r),n[t]=null}}),n}generateSessionId(){return this._sessionId||(this._sessionId="session_"+Date.now()+"_"+Math.random().toString(36).substr(2,9)),this._sessionId}getAvailableTypes(){return Object.keys(this.allFields)}getAvailableFields(e){const t=this.allFields[e];return t?Object.keys(t):[]}getDefaultContextsInfo(){const e={};return Object.entries(this.defaultContexts).forEach(([t,r])=>{e[t]=Object.keys(r)}),e}};const s=new class{constructor(){this.isInitialized=!1,this.config={captureClicks:!0,captureFetch:!0,captureErrors:!0,captureUnhandledRejections:!0},this.contextTypes=[],this.originalHandlers={fetch:null,onerror:null,onunhandledrejection:null},this.eventListeners=new Map}configure(e){this.config={...this.config,...e},this.contextTypes=e.context||[]}init(){this.isInitialized?console.warn("SyntropyFront: Interceptors ya están inicializados"):(this.config.captureClicks&&this.setupClickInterceptor(),this.config.captureFetch&&this.setupFetchInterceptor(),(this.config.captureErrors||this.config.captureUnhandledRejections)&&this.setupErrorInterceptors(),this.isInitialized=!0,console.log("SyntropyFront: Interceptors inicializados con Chaining Pattern"))}setupClickInterceptor(){const e=e=>{const r=e.target;if(!r)return;let n=r.tagName.toLowerCase();r.id?n+=`#${r.id}`:r.className&&"string"==typeof r.className&&(n+=`.${r.className.split(" ").filter(Boolean).join(".")}`),t.add({category:"ui",message:`Usuario hizo click en '${n}'`,data:{selector:n,tagName:r.tagName,id:r.id,className:r.className}})};this.eventListeners.set("click",e),document.addEventListener("click",e,!0)}setupFetchInterceptor(){this.originalHandlers.fetch=window.fetch;window.fetch=(...e)=>{const r=e[0]instanceof Request?e[0].url:e[0],n=e[0]instanceof Request?e[0].method:e[1]?.method||"GET";return t.add({category:"network",message:`Request: ${n} ${r}`,data:{url:r,method:n,timestamp:Date.now()}}),this.originalHandlers.fetch.apply(window,e)}}setupErrorInterceptors(){if(this.config.captureErrors){this.originalHandlers.onerror=window.onerror;const e=(e,r,n,o,s)=>{const i={type:"uncaught_exception",error:{message:e,source:r,lineno:n,colno:o,stack:s?.stack},breadcrumbs:t.getAll(),timestamp:(new Date).toISOString()};if(this.handleError(i),this.originalHandlers.onerror)try{return this.originalHandlers.onerror(e,r,n,o,s)}catch(e){return console.warn("SyntropyFront: Error en handler original:",e),!1}return!1};window.onerror=e}if(this.config.captureUnhandledRejections){this.originalHandlers.onunhandledrejection=window.onunhandledrejection;const e=e=>{const r={type:"unhandled_rejection",error:{message:e.reason?.message||"Rechazo de promesa sin mensaje",stack:e.reason?.stack},breadcrumbs:t.getAll(),timestamp:(new Date).toISOString()};if(this.handleError(r),this.originalHandlers.onunhandledrejection)try{this.originalHandlers.onunhandledrejection(e)}catch(e){console.warn("SyntropyFront: Error en handler original de rejection:",e)}};window.onunhandledrejection=e}}handleError(e){const t=this.contextTypes.length>0?o.collect(this.contextTypes):null;n.sendError(e,t),this.onError?this.onError(e):console.error("SyntropyFront - Error detectado:",e)}destroy(){this.isInitialized&&(console.log("SyntropyFront: Limpiando interceptores..."),this.originalHandlers.fetch&&(window.fetch=this.originalHandlers.fetch,console.log("SyntropyFront: fetch original restaurado")),this.originalHandlers.onerror&&(window.onerror=this.originalHandlers.onerror,console.log("SyntropyFront: onerror original restaurado")),this.originalHandlers.onunhandledrejection&&(window.onunhandledrejection=this.originalHandlers.onunhandledrejection,console.log("SyntropyFront: onunhandledrejection original restaurado")),this.eventListeners.forEach((e,t)=>{document.removeEventListener(t,e,!0),console.log(`SyntropyFront: Event listener ${t} removido`)}),this.originalHandlers={fetch:null,onerror:null,onunhandledrejection:null},this.eventListeners.clear(),this.isInitialized=!1,console.log("SyntropyFront: Interceptors destruidos y handlers restaurados"))}getHandlerInfo(){return{isInitialized:this.isInitialized,hasOriginalFetch:!!this.originalHandlers.fetch,hasOriginalOnError:!!this.originalHandlers.onerror,hasOriginalOnUnhandledRejection:!!this.originalHandlers.onunhandledrejection,eventListenersCount:this.eventListeners.size}}},i={safe:{name:"safe",description:"Modo solo emergencias - Mínimo impacto, máxima privacidad",agent:{batchTimeout:null,batchSize:5,encrypt:null},maxBreadcrumbs:10,context:{device:!0,window:!1,session:!0,ui:!1,network:!1},customObjects:{},proxyTracking:!1,captureClicks:!1,captureFetch:!1,captureErrors:!0,captureUnhandledRejections:!0,useWorker:!1,onError:null,onBreadcrumbAdded:null},balanced:{name:"balanced",description:"Modo equilibrado - Balance entre información y performance",agent:{batchTimeout:1e4,batchSize:20,encrypt:null},maxBreadcrumbs:50,context:{device:!0,window:!0,session:!0,ui:!0,network:!0},customObjects:{},proxyTracking:{enabled:!0,maxStates:10,trackNested:!0,trackArrays:!1},captureClicks:!0,captureFetch:!0,captureErrors:!0,captureUnhandledRejections:!0,useWorker:!0,onError:null,onBreadcrumbAdded:null},debug:{name:"debug",description:"Modo debug completo - Máxima información para desarrollo",agent:{batchTimeout:5e3,batchSize:50,encrypt:null},maxBreadcrumbs:100,context:{device:!0,window:!0,session:!0,ui:!0,network:!0},customObjects:{},proxyTracking:{enabled:!0,maxStates:20,trackNested:!0,trackArrays:!0,trackFunctions:!0},captureClicks:!0,captureFetch:!0,captureErrors:!0,captureUnhandledRejections:!0,useWorker:!0,onError:e=>{console.error("SyntropyFront Error:",e)},onBreadcrumbAdded:e=>{console.log("SyntropyFront Breadcrumb:",e)}},performance:{name:"performance",description:"Modo performance - Máxima velocidad, información mínima",agent:{batchTimeout:null,batchSize:3,encrypt:null},maxBreadcrumbs:5,context:{device:!1,window:!1,session:!0,ui:!1,network:!1},customObjects:{},proxyTracking:!1,captureClicks:!1,captureFetch:!1,captureErrors:!0,captureUnhandledRejections:!0,useWorker:!1,onError:null,onBreadcrumbAdded:null}};function a(e){const t=i[e];if(!t)throw new Error(`Preset '${e}' no encontrado. Presets disponibles: ${Object.keys(i).join(", ")}`);return t}class c{constructor(){this.isInitialized=!1,this.currentPreset=null,this.proxyObjectTracker=null,this.interceptorRegistry=null,this.workerManager=null,this.config={preset:"balanced",maxBreadcrumbs:50,captureClicks:!0,captureFetch:!0,captureErrors:!0,captureUnhandledRejections:!0,onError:null,onBreadcrumbAdded:null,agent:{endpoint:null,headers:{},batchSize:20,batchTimeout:1e4,encrypt:null},context:{device:!0,window:!0,session:!0,ui:!0,network:!0},proxyTracking:{enabled:!0,maxStates:10,trackNested:!0,trackArrays:!1},useWorker:!0}}async init(e={}){if(this.isInitialized)console.warn("SyntropyFront ya está inicializado");else{if(e.preset)try{const t=a(e.preset);this.currentPreset=e.preset,this.config={...this.config,...t},console.log(`🎯 SyntropyFront: Aplicando preset '${e.preset}' - ${t.description}`)}catch(t){throw console.error(`❌ SyntropyFront: Error aplicando preset '${e.preset}':`,t.message),t}this.config={...this.config,...e},this.config.agent.endpoint&&n.configure(this.config.agent),!1!==this.config.useWorker&&await this.workerManager.init({maxBreadcrumbs:this.config.maxBreadcrumbs,agent:this.config.agent}),t.setMaxBreadcrumbs(this.config.maxBreadcrumbs),t.onBreadcrumbAdded=this.config.onBreadcrumbAdded,t.setAgent(n),this.contextConfig=this.config.context||{device:!0,window:!0,session:!0,ui:!0,network:!0},await this.loadModules(),this.config.proxyTracking?.enabled&&this.proxyObjectTracker&&this.proxyObjectTracker.configure(this.config.proxyTracking),s.configure({captureClicks:this.config.captureClicks,captureFetch:this.config.captureFetch,captureErrors:this.config.captureErrors,captureUnhandledRejections:this.config.captureUnhandledRejections}),s.onError=this.config.onError,s.init(),this.interceptorRegistry&&this.interceptorRegistry.init({breadcrumbStore:t,agent:n,contextCollector:o}),this.isInitialized=!0,console.log("SyntropyFront inicializado correctamente")}}async loadModules(){const e=[];this.config.proxyTracking?.enabled&&e.push(Promise.resolve().then(function(){return h}).then(e=>{this.proxyObjectTracker=e.proxyObjectTracker,console.log("🔄 ProxyObjectTracker cargado dinámicamente")}).catch(e=>{console.warn("⚠️ Error cargando ProxyObjectTracker:",e)})),!1!==this.config.useInterceptors&&e.push(Promise.resolve().then(function(){return p}).then(e=>{this.interceptorRegistry=e.interceptorRegistry,console.log("🔄 InterceptorRegistry cargado dinámicamente")}).catch(e=>{console.warn("⚠️ Error cargando InterceptorRegistry:",e)})),!1!==this.config.useWorker&&e.push(Promise.resolve().then(function(){return m}).then(e=>{this.workerManager=new e.default,console.log("🔄 WorkerManager cargado dinámicamente")}).catch(e=>{console.warn("⚠️ Error cargando WorkerManager:",e)})),await Promise.all(e)}addBreadcrumb(e,r,n={}){t.add({category:e,message:r,data:n})}getBreadcrumbs(){return t.getAll()}getBreadcrumbsByCategory(e){return t.getByCategory(e)}clearBreadcrumbs(){t.clear()}destroy(){this.isInitialized&&(s.destroy(),this.interceptorRegistry&&this.interceptorRegistry.destroy(),t.clear(),n.disable(),this.workerManager&&this.workerManager.destroy(),this.isInitialized=!1,console.log("SyntropyFront desactivado"))}setMaxBreadcrumbs(e){t.setMaxBreadcrumbs(e)}getMaxBreadcrumbs(){return t.getMaxBreadcrumbs()}async flush(){await n.forceFlush()}getContext(){const e=o.collect(this.contextConfig),t=customObjectCollector.collectCustomObjects();return Object.keys(t).length>0&&(e.customObjects=t),e}getAvailableContextTypes(){return o.getAvailableTypes()}getAvailableContextFields(e){return o.getAvailableFields(e)}getDefaultContextsInfo(){return o.getDefaultContextsInfo()}setContext(e){"object"==typeof e?(this.contextConfig=e,console.log("SyntropyFront: Configuración de contexto actualizada:",e)):console.warn("SyntropyFront: contextConfig debe ser un objeto")}setContextTypes(e){if(!Array.isArray(e))return void console.warn("SyntropyFront: contextTypes debe ser un array");const t={};e.forEach(e=>{t[e]=!0}),this.setContext(t)}addCustomObject(e,t,r=10){throw console.warn("SyntropyFront: addCustomObject() está deprecado. Usa addProxyObject() en su lugar."),new Error("addCustomObject() está deprecado. Usa addProxyObject() en su lugar.")}removeCustomObject(e){throw console.warn("SyntropyFront: removeCustomObject() está deprecado. Usa removeProxyObject() en su lugar."),new Error("removeCustomObject() está deprecado. Usa removeProxyObject() en su lugar.")}getCustomObjectValue(e){throw console.warn("SyntropyFront: getCustomObjectValue() está deprecado. Usa getProxyObjectState() en su lugar."),new Error("getCustomObjectValue() está deprecado. Usa getProxyObjectState() en su lugar.")}getCustomObjectHistory(e){throw console.warn("SyntropyFront: getCustomObjectHistory() está deprecado. Usa getProxyObjectHistory() en su lugar."),new Error("getCustomObjectHistory() está deprecado. Usa getProxyObjectHistory() en su lugar.")}getCustomObjectNames(){throw console.warn("SyntropyFront: getCustomObjectNames() está deprecado. Usa getProxyTrackedObjects() en su lugar."),new Error("getCustomObjectNames() está deprecado. Usa getProxyTrackedObjects() en su lugar.")}inject(e,t){return this.interceptorRegistry?(this.interceptorRegistry.register(e,t),this):(console.warn("SyntropyFront: InterceptorRegistry no está cargado. Asegúrate de que useInterceptors no esté en false."),this)}removeInterceptor(e){this.interceptorRegistry?this.interceptorRegistry.unregister(e):console.warn("SyntropyFront: InterceptorRegistry no está cargado.")}getRegisteredInterceptors(){return this.interceptorRegistry?this.interceptorRegistry.getRegisteredInterceptors():[]}getInterceptorInfo(e){return this.interceptorRegistry?this.interceptorRegistry.getInterceptorInfo(e):null}isActive(){return this.isInitialized}addProxyObject(e,t,r={}){return this.proxyObjectTracker?this.proxyObjectTracker.addObject(e,t,r):(console.warn("SyntropyFront: ProxyObjectTracker no está cargado. Asegúrate de que proxyTracking.enabled esté en true."),t)}getProxyObjectHistory(e){return this.proxyObjectTracker?this.proxyObjectTracker.getObjectHistory(e):[]}getProxyObjectState(e){return this.proxyObjectTracker?this.proxyObjectTracker.getCurrentState(e):null}getProxyTrackedObjects(){return this.proxyObjectTracker?this.proxyObjectTracker.getTrackedObjects():[]}removeProxyObject(e){return this.proxyObjectTracker?this.proxyObjectTracker.removeObject(e):null}clearProxyObjects(){this.proxyObjectTracker&&this.proxyObjectTracker.clear()}getProxyTrackerStats(){return this.proxyObjectTracker?this.proxyObjectTracker.getStats():{enabled:!1,trackedObjects:0}}async addBreadcrumbToWorker(e,t,r={}){return this.workerManager?this.workerManager.isWorkerAvailable()?await this.workerManager.addBreadcrumb(e,t,r):this.addBreadcrumb(e,t,r):(console.warn("SyntropyFront: WorkerManager no está cargado. Asegúrate de que useWorker no esté en false."),this.addBreadcrumb(e,t,r))}async getBreadcrumbsFromWorker(){return this.workerManager&&this.workerManager.isWorkerAvailable()?await this.workerManager.getBreadcrumbs():this.getBreadcrumbs()}async clearBreadcrumbsFromWorker(){return this.workerManager&&this.workerManager.isWorkerAvailable()?await this.workerManager.clearBreadcrumbs():this.clearBreadcrumbs()}async sendErrorToWorker(e,t={}){return this.workerManager?this.workerManager.isWorkerAvailable()?await this.workerManager.sendError(e,t):this.sendError(e,t):(console.warn("SyntropyFront: WorkerManager no está cargado. Asegúrate de que useWorker no esté en false."),this.sendError(e,t))}async pingWorker(){return this.workerManager?this.workerManager.isWorkerAvailable()?await this.workerManager.ping():{success:!1,message:"Worker no disponible"}:{success:!1,message:"Worker no cargado"}}getWorkerStatus(){return this.workerManager?this.workerManager.getStatus():{isAvailable:!1,isInitialized:!1,pendingRequests:0}}isWorkerAvailable(){return!!this.workerManager&&this.workerManager.isWorkerAvailable()}getCurrentPreset(){return this.currentPreset}getPresetInfo(e=null){const t=e||this.currentPreset;return t?function(e){const t=a(e);return{name:t.name,description:t.description,features:{breadcrumbs:t.maxBreadcrumbs,context:Object.keys(t.context).filter(e=>t.context[e]).length,worker:t.useWorker,proxyTracking:t.proxyTracking?.enabled||!1,agentMode:t.agent.batchTimeout?"completo":"solo emergencias"}}}(t):null}getAvailablePresets(){return Object.keys(i).map(e=>({name:e,...i[e]}))}async changePreset(e,t={}){if(this.isInitialized)return console.warn("SyntropyFront: No se puede cambiar preset después de la inicialización"),!1;try{const r=a(e);return this.currentPreset=e,this.config={...this.config,...r},this.config={...this.config,...t},console.log(`🎯 SyntropyFront: Preset cambiado a '${e}' - ${r.description}`),!0}catch(t){return console.error(`❌ SyntropyFront: Error cambiando preset a '${e}':`,t.message),!1}}getConfiguration(){return{currentPreset:this.currentPreset,config:this.config,isInitialized:this.isInitialized}}}const l=new c;class d{constructor(){this.trackedObjects=new Map,this.maxStates=10,this.isEnabled=!0,this.onChangeCallback=null}configure(e={}){this.maxStates=e.maxStates||this.maxStates,this.onChangeCallback=e.onChange||null,this.isEnabled=!1!==e.enabled}addObject(e,t,r={}){if(!this.isEnabled)return console.warn("SyntropyFront: ProxyObjectTracker deshabilitado"),t;if(!t||"object"!=typeof t)return console.warn(`SyntropyFront: Objeto inválido para tracking: ${e}`),t;if(this.trackedObjects.has(e))return console.warn(`SyntropyFront: Objeto ya está siendo trackeado: ${e}`),this.trackedObjects.get(e).proxy;try{const n={objectPath:e,originalObject:t,states:[{value:this.deepClone(t),timestamp:(new Date).toISOString(),changeType:"initial"}],proxy:null,options:{trackNested:!1!==r.trackNested,trackArrays:!1!==r.trackArrays,trackFunctions:!1!==r.trackFunctions,maxDepth:r.maxDepth||5}},o=this.createProxy(t,n);return n.proxy=o,this.trackedObjects.set(e,n),console.log(`SyntropyFront: Objeto agregado para tracking reactivo: ${e}`),o}catch(r){return console.error(`SyntropyFront: Error creando proxy para ${e}:`,r),t}}createProxy(e,t,r=0){const{objectPath:n,options:o}=t;return new Proxy(e,{get:(e,n)=>{const s=e[n];if(o.trackNested&&r<o.maxDepth&&s&&"object"==typeof s&&!(s instanceof Date)&&!(s instanceof RegExp)&&!(s instanceof Error)){if(Array.isArray(s)&&o.trackArrays)return this.createArrayProxy(s,t,r+1);if(!Array.isArray(s))return this.createProxy(s,t,r+1)}return s},set:(e,r,o)=>{const s=e[r];return this.isEqual(s,o)||(this.saveState(t,"property_change",{property:r,oldValue:this.deepClone(s),newValue:this.deepClone(o),path:`${n}.${r}`}),e[r]=o,this.notifyChange(t,r,s,o)),!0},deleteProperty:(e,r)=>{const o=e[r];this.saveState(t,"property_deleted",{property:r,oldValue:this.deepClone(o),path:`${n}.${r}`});const s=delete e[r];return this.notifyChange(t,r,o,void 0),s}})}createArrayProxy(e,t,r=0){const{objectPath:n,options:o}=t;return new Proxy(e,{get:(e,s)=>{const i=e[s];return"function"==typeof i&&this.isArrayMutator(s)?(...r)=>{this.saveState(t,"array_mutation",{method:s,arguments:r,oldArray:this.deepClone(e),path:n});const o=i.apply(e,r);return this.notifyChange(t,s,null,e),o}:!(o.trackNested&&r<o.maxDepth&&i&&"object"==typeof i)||Array.isArray(i)||i instanceof Date||i instanceof RegExp||i instanceof Error?i:this.createProxy(i,t,r+1)},set:(e,r,o)=>{const s=e[r];return this.isEqual(s,o)||(this.saveState(t,"array_element_change",{index:r,oldValue:this.deepClone(s),newValue:this.deepClone(o),path:`${n}[${r}]`}),e[r]=o,this.notifyChange(t,r,s,o)),!0}})}isArrayMutator(e){return["push","pop","shift","unshift","splice","reverse","sort","fill","copyWithin"].includes(e)}saveState(e,t,r={}){const n={value:this.deepClone(e.originalObject),timestamp:(new Date).toISOString(),changeType:t,changeData:r};e.states.push(n),e.states.length>this.maxStates&&e.states.shift()}notifyChange(e,t,r,n){if(this.onChangeCallback)try{this.onChangeCallback({objectPath:e.objectPath,property:t,oldValue:r,newValue:n,timestamp:(new Date).toISOString(),states:e.states.length})}catch(e){console.error("SyntropyFront: Error en callback de cambio:",e)}}getObjectHistory(e){const t=this.trackedObjects.get(e);return t?[...t.states]:(console.warn(`SyntropyFront: Objeto no encontrado: ${e}`),[])}getCurrentState(e){const t=this.trackedObjects.get(e);return t?{value:this.deepClone(t.originalObject),timestamp:(new Date).toISOString(),statesCount:t.states.length}:null}getTrackedObjects(){return Array.from(this.trackedObjects.keys())}removeObject(e){const t=this.trackedObjects.get(e);return t?(this.trackedObjects.delete(e),console.log(`SyntropyFront: Objeto removido del tracking: ${e}`),t.originalObject):null}clear(){this.trackedObjects.clear(),console.log("SyntropyFront: Todos los objetos removidos del tracking")}getStats(){const e={trackedObjects:this.trackedObjects.size,totalStates:0,isEnabled:this.isEnabled,maxStates:this.maxStates};for(const t of this.trackedObjects.values())e.totalStates+=t.states.length;return e}deepClone(e){if(null==e)return e;if("object"!=typeof e)return e;if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e.source,e.flags);if(e instanceof Error){const t=new Error(e.message);return t.name=e.name,t.stack=e.stack,e.cause&&(t.cause=this.deepClone(e.cause)),t}if(Array.isArray(e))return e.map(e=>this.deepClone(e));const t={};for(const r in e)e.hasOwnProperty(r)&&(t[r]=this.deepClone(e[r]));return t}isEqual(e,t){if(e===t)return!0;if(null===e||null===t)return e===t;if(typeof e!=typeof t)return!1;if("object"!=typeof e)return e===t;const r=Object.keys(e),n=Object.keys(t);if(r.length!==n.length)return!1;for(const o of r){if(!n.includes(o))return!1;if(e[o]!==t[o])return!1}return!0}}const u=new d;var h=Object.freeze({__proto__:null,ProxyObjectTracker:d,proxyObjectTracker:u});class g{constructor(){this.customInterceptors=new Map,this.isInitialized=!1}createInterceptorApi(e){const{breadcrumbStore:t,agent:r,contextCollector:n}=e;return{addBreadcrumb:(e,r,n={})=>{t.add({category:e,message:r,data:n,timestamp:(new Date).toISOString()})},sendError:(e,t=null)=>{r.sendError(e,t)},sendBreadcrumbs:e=>{r.sendBreadcrumbs(e)},getContext:(e={})=>n.collect(e),getTimestamp:()=>(new Date).toISOString(),apiVersion:"1.0.0",availableMethods:["addBreadcrumb","sendError","sendBreadcrumbs","getContext","getTimestamp"]}}register(e,t){if(!t||"function"!=typeof t.init)throw new Error(`Interceptor ${e} debe tener un método init()`);this.customInterceptors.set(e,{name:e,interceptor:t,enabled:!0}),console.log(`SyntropyFront: Interceptor personalizado registrado: ${e}`)}unregister(e){const t=this.customInterceptors.get(e);if(t){if(this.isInitialized&&t.interceptor.destroy)try{t.interceptor.destroy()}catch(t){console.warn(`SyntropyFront: Error destruyendo interceptor ${e}:`,t)}this.customInterceptors.delete(e),console.log(`SyntropyFront: Interceptor personalizado removido: ${e}`)}}init(e={}){if(this.isInitialized)return void console.warn("SyntropyFront: InterceptorRegistry ya está inicializado");const t=this.createInterceptorApi(e);for(const[e,r]of this.customInterceptors)if(r.enabled)try{r.interceptor.init(t),console.log(`SyntropyFront: Interceptor ${e} inicializado`)}catch(t){console.error(`SyntropyFront: Error inicializando interceptor ${e}:`,t)}this.isInitialized=!0}destroy(){if(this.isInitialized){for(const[e,t]of this.customInterceptors)if(t.interceptor.destroy)try{t.interceptor.destroy(),console.log(`SyntropyFront: Interceptor ${e} destruido`)}catch(t){console.warn(`SyntropyFront: Error destruyendo interceptor ${e}:`,t)}this.isInitialized=!1}}setEnabled(e,t){const r=this.customInterceptors.get(e);if(r&&(r.enabled=t,this.isInitialized))if(t&&r.interceptor.init)try{const t=this.createInterceptorApi({breadcrumbStore:this.breadcrumbStore,agent:this.agent,contextCollector:this.contextCollector});r.interceptor.init(t),console.log(`SyntropyFront: Interceptor ${e} habilitado`)}catch(t){console.error(`SyntropyFront: Error habilitando interceptor ${e}:`,t)}else if(!t&&r.interceptor.destroy)try{r.interceptor.destroy(),console.log(`SyntropyFront: Interceptor ${e} deshabilitado`)}catch(t){console.warn(`SyntropyFront: Error deshabilitando interceptor ${e}:`,t)}}getRegisteredInterceptors(){return Array.from(this.customInterceptors.keys())}getInterceptorInfo(e){const t=this.customInterceptors.get(e);return t?{name:t.name,enabled:t.enabled,hasInit:"function"==typeof t.interceptor.init,hasDestroy:"function"==typeof t.interceptor.destroy}:null}getApiDocumentation(){return{version:"1.0.0",methods:{addBreadcrumb:{description:"Agrega un breadcrumb al historial",signature:"addBreadcrumb(category, message, data?)",example:'api.addBreadcrumb("ui", "Usuario hizo click", { element: "button" })'},sendError:{description:"Envía un error al backend",signature:"sendError(errorPayload, context?)",example:'api.sendError({ message: "Error crítico" }, { device: true })'},sendBreadcrumbs:{description:"Envía breadcrumbs al backend",signature:"sendBreadcrumbs(breadcrumbs)",example:'api.sendBreadcrumbs([{ category: "ui", message: "Click" }])'},getContext:{description:"Obtiene contexto del navegador",signature:"getContext(contextConfig?)",example:'api.getContext({ device: true, window: ["url"] })'},getTimestamp:{description:"Obtiene timestamp actual en formato ISO",signature:"getTimestamp()",example:"const now = api.getTimestamp()"}}}}clear(){this.destroy(),this.customInterceptors.clear()}}const y=new g;var p=Object.freeze({__proto__:null,InterceptorRegistry:g,interceptorRegistry:y});var m=Object.freeze({__proto__:null,default:class{constructor(){this.worker=null,this.pendingRequests=new Map,this.requestId=0,this.isInitialized=!1,this.config={},this.setupWorker()}setupWorker(){try{this.worker=new Worker("./src/workers/SyntropyWorker.js"),this.worker.addEventListener("message",e=>{this.handleWorkerMessage(e.data)}),this.worker.addEventListener("error",e=>{console.error("SyntropyWorker error:",e),this.handleWorkerError(e)}),console.log("🔄 WorkerManager: Worker inicializado")}catch(e){console.error("WorkerManager: Error inicializando worker:",e),this.handleWorkerUnavailable()}}async init(e){try{this.config=e;const t=await this.sendMessage("INIT",e);if(t.success)return this.isInitialized=!0,console.log("✅ WorkerManager: Worker inicializado correctamente"),!0;throw new Error(t.error||"Error inicializando worker")}catch(e){return console.error("WorkerManager: Error en init:",e),!1}}sendMessage(e,t={}){return new Promise((r,n)=>{if(!this.worker)return void n(new Error("Worker no disponible"));const o=this.generateRequestId();this.pendingRequests.set(o,{resolve:r,reject:n}),this.worker.postMessage({type:e,payload:t,id:o}),setTimeout(()=>{this.pendingRequests.has(o)&&(this.pendingRequests.delete(o),n(new Error(`Timeout en request: ${e}`)))},5e3)})}handleWorkerMessage(e){const{id:t,success:r,error:n,...o}=e,s=this.pendingRequests.get(t);s?(this.pendingRequests.delete(t),r?s.resolve(o):s.reject(new Error(n||"Error en worker"))):console.warn("WorkerManager: Respuesta sin request pendiente:",t)}handleWorkerError(e){console.error("WorkerManager: Error del worker:",e),this.pendingRequests.forEach(e=>{e.reject(new Error("Worker error"))}),this.pendingRequests.clear(),this.handleWorkerUnavailable()}handleWorkerUnavailable(){console.warn("WorkerManager: Worker no disponible, usando fallback")}async addBreadcrumb(e,t,r={}){try{return await this.sendMessage("ADD_BREADCRUMB",{type:e,message:t,data:r})}catch(e){throw console.error("WorkerManager: Error agregando breadcrumb:",e),e}}async getBreadcrumbs(){try{return(await this.sendMessage("GET_BREADCRUMBS")).breadcrumbs||[]}catch(e){return console.error("WorkerManager: Error obteniendo breadcrumbs:",e),[]}}async clearBreadcrumbs(){try{return await this.sendMessage("CLEAR_BREADCRUMBS")}catch(e){throw console.error("WorkerManager: Error limpiando breadcrumbs:",e),e}}async sendError(e,t={}){try{return await this.sendMessage("SEND_ERROR",{error:e,context:t})}catch(e){throw console.error("WorkerManager: Error enviando error:",e),e}}async updateContext(e){try{return await this.sendMessage("UPDATE_CONTEXT",e)}catch(e){throw console.error("WorkerManager: Error actualizando contexto:",e),e}}async ping(){try{return await this.sendMessage("PING")}catch(e){throw console.error("WorkerManager: Error en ping:",e),e}}async getWorkerStats(){try{return await this.sendMessage("GET_STATS")}catch(e){return console.error("WorkerManager: Error obteniendo stats:",e),null}}destroy(){this.worker&&(this.pendingRequests.forEach(e=>{e.reject(new Error("Worker destroyed"))}),this.pendingRequests.clear(),this.worker.terminate(),this.worker=null,console.log("🔄 WorkerManager: Worker destruido"))}generateRequestId(){return`req_${++this.requestId}_${Date.now()}`}isWorkerAvailable(){return null!==this.worker&&this.isInitialized}getStatus(){return{isAvailable:this.isWorkerAvailable(),isInitialized:this.isInitialized,pendingRequests:this.pendingRequests.size,config:this.config}}}});return e.SyntropyFront=c,e.agent=n,e.breadcrumbStore=t,e.default=l,e.interceptors=s,Object.defineProperty(e,"__esModule",{value:!0}),e}({});
2
+ //# sourceMappingURL=index.min.js.map