@mixpeek/prebid 1.0.0 → 1.0.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"mixpeekContextAdapter.js","mappings":"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","sources":["webpack://MixpeekContextAdapter/webpack/universalModuleDefinition","webpack://MixpeekContextAdapter/webpack/bootstrap","webpack://MixpeekContextAdapter/webpack/runtime/define property getters","webpack://MixpeekContextAdapter/webpack/runtime/hasOwnProperty shorthand","webpack://MixpeekContextAdapter/webpack/runtime/make namespace object","webpack://MixpeekContextAdapter/./src/config/constants.js","webpack://MixpeekContextAdapter/./src/utils/logger.js","webpack://MixpeekContextAdapter/./src/utils/helpers.js","webpack://MixpeekContextAdapter/./src/cache/cacheManager.js","webpack://MixpeekContextAdapter/./src/api/mixpeekClient.js","webpack://MixpeekContextAdapter/./src/extractors/pageExtractor.js","webpack://MixpeekContextAdapter/./src/extractors/videoExtractor.js","webpack://MixpeekContextAdapter/./src/extractors/imageExtractor.js","webpack://MixpeekContextAdapter/./src/utils/iabMapping.js","webpack://MixpeekContextAdapter/./src/utils/previousAdTracker.js","webpack://MixpeekContextAdapter/./src/modules/mixpeekContextAdapter.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"MixpeekContextAdapter\"] = factory();\n\telse\n\t\troot[\"MixpeekContextAdapter\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * Mixpeek Context Adapter - Constants\n * @module config/constants\n */\n\nexport const MIXPEEK_MODULE_NAME = 'mixpeek'\nexport const MIXPEEK_VERSION = '1.0.0'\n\n// API Configuration\n// Use MIXPEEK_API_ENDPOINT environment variable or default to production\nexport const DEFAULT_API_ENDPOINT = typeof process !== 'undefined' && process.env && process.env.MIXPEEK_API_ENDPOINT\n ? process.env.MIXPEEK_API_ENDPOINT\n : (typeof window !== 'undefined' && window.MIXPEEK_API_ENDPOINT\n ? window.MIXPEEK_API_ENDPOINT\n : 'https://api.mixpeek.com')\n\n// Alternative endpoints\nexport const API_ENDPOINTS = {\n PRODUCTION: 'https://api.mixpeek.com',\n DEVELOPMENT: 'https://server-xb24.onrender.com',\n LOCAL: 'http://localhost:8000'\n}\n\nexport const DEFAULT_TIMEOUT = 250 // milliseconds\nexport const DEFAULT_CACHE_TTL = 300 // seconds\nexport const DEFAULT_RETRY_ATTEMPTS = 2\nexport const DEFAULT_BATCH_SIZE = 1\n\n// API Endpoints\nexport const ENDPOINTS = {\n COLLECTIONS: '/v1/collections',\n DOCUMENTS: '/v1/collections/{collectionId}/documents',\n FEATURES: '/v1/collections/{collectionId}/documents/{documentId}/features',\n FEATURE_EXTRACTORS: '/v1/collections/features/extractors',\n RETRIEVERS: '/v1/retrievers/debug-inference'\n}\n\n// Content Modes\nexport const CONTENT_MODES = {\n AUTO: 'auto',\n PAGE: 'page',\n VIDEO: 'video',\n IMAGE: 'image'\n}\n\n// Feature Extractors\nexport const FEATURE_EXTRACTORS = {\n TAXONOMY: 'taxonomy',\n BRAND_SAFETY: 'brand-safety',\n KEYWORDS: 'keywords',\n SENTIMENT: 'sentiment',\n CLUSTERING: 'clustering',\n EMBEDDING: 'embedding'\n}\n\n// Targeting Key Prefixes\nexport const TARGETING_KEYS = {\n TAXONOMY: 'hb_mixpeek_taxonomy',\n CATEGORY: 'hb_mixpeek_category',\n NODE: 'hb_mixpeek_node',\n PATH: 'hb_mixpeek_path',\n SCORE: 'hb_mixpeek_score',\n SAFETY: 'hb_mixpeek_safety',\n KEYWORDS: 'hb_mixpeek_keywords',\n EMBED: 'hb_mixpeek_embed',\n SENTIMENT: 'hb_mixpeek_sentiment',\n // Previous ad context\n PREV_AD_CREATIVE_ID: 'hb_mixpeek_prev_creative',\n PREV_AD_BIDDER: 'hb_mixpeek_prev_bidder',\n PREV_AD_ADUNIT: 'hb_mixpeek_prev_adunit',\n PREV_AD_CAT: 'hb_mixpeek_prev_cat'\n}\n\n// Error Codes\nexport const ERROR_CODES = {\n INVALID_CONFIG: 'INVALID_CONFIG',\n API_TIMEOUT: 'API_TIMEOUT',\n API_ERROR: 'API_ERROR',\n NETWORK_ERROR: 'NETWORK_ERROR',\n INVALID_RESPONSE: 'INVALID_RESPONSE',\n MISSING_CONTENT: 'MISSING_CONTENT',\n CACHE_ERROR: 'CACHE_ERROR'\n}\n\n// Cache Configuration\nexport const CACHE_KEYS = {\n PREFIX: 'mixpeek_ctx_',\n VERSION: 'v1'\n}\n\n// Performance Thresholds\nexport const PERFORMANCE = {\n MAX_LATENCY: 250, // ms\n WARN_LATENCY: 100, // ms\n MAX_CONTENT_SIZE: 50000 // characters\n}\n\n// Default Feature Extractor Configurations\nexport const DEFAULT_EXTRACTORS = [\n {\n type: FEATURE_EXTRACTORS.TAXONOMY,\n enabled: true\n }\n]\n\n// Event Names\nexport const EVENTS = {\n CONTEXT_READY: 'mixpeekContextReady',\n CONTEXT_ERROR: 'mixpeekContextError',\n CONTEXT_CACHED: 'mixpeekContextCached',\n API_REQUEST: 'mixpeekApiRequest',\n API_RESPONSE: 'mixpeekApiResponse'\n}\n\n// HTTP Headers\nexport const HEADERS = {\n AUTHORIZATION: 'Authorization',\n NAMESPACE: 'X-Namespace',\n CONTENT_TYPE: 'Content-Type',\n USER_AGENT: 'User-Agent'\n}\n\n// User Agent\nexport const USER_AGENT = `Mixpeek-Prebid-Adapter/${MIXPEEK_VERSION}`\n\n","/**\n * Mixpeek Context Adapter - Logger Utility\n * @module utils/logger\n */\n\nimport { MIXPEEK_MODULE_NAME } from '../config/constants.js'\n\nclass Logger {\n constructor() {\n this.debug = false\n this.prefix = `[${MIXPEEK_MODULE_NAME}]`\n }\n\n setDebug(enabled) {\n this.debug = enabled\n }\n\n info(...args) {\n if (this.debug) {\n console.log(this.prefix, ...args)\n }\n }\n\n warn(...args) {\n console.warn(this.prefix, ...args)\n }\n\n error(...args) {\n console.error(this.prefix, ...args)\n }\n\n group(label) {\n if (this.debug && console.group) {\n console.group(`${this.prefix} ${label}`)\n }\n }\n\n groupEnd() {\n if (this.debug && console.groupEnd) {\n console.groupEnd()\n }\n }\n\n time(label) {\n if (this.debug && console.time) {\n console.time(`${this.prefix} ${label}`)\n }\n }\n\n timeEnd(label) {\n if (this.debug && console.timeEnd) {\n console.timeEnd(`${this.prefix} ${label}`)\n }\n }\n\n table(data) {\n if (this.debug && console.table) {\n console.table(data)\n }\n }\n}\n\nexport default new Logger()\n\n","/**\n * Mixpeek Context Adapter - Helper Utilities\n * @module utils/helpers\n */\n\nimport { ERROR_CODES, PERFORMANCE } from '../config/constants.js'\nimport logger from './logger.js'\n\n/**\n * Generate a unique identifier\n * @returns {string} UUID v4\n */\nexport function generateUUID() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0\n const v = c === 'x' ? r : (r & 0x3 | 0x8)\n return v.toString(16)\n })\n}\n\n/**\n * Generate a hash from a string\n * @param {string} str - String to hash\n * @returns {string} Hash\n */\nexport function hashString(str) {\n let hash = 0\n if (str.length === 0) return hash.toString()\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash // Convert to 32bit integer\n }\n return Math.abs(hash).toString(36)\n}\n\n/**\n * Check if a value is a valid object\n * @param {*} value - Value to check\n * @returns {boolean}\n */\nexport function isObject(value) {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\n/**\n * Deep merge two objects\n * @param {object} target - Target object\n * @param {object} source - Source object\n * @returns {object} Merged object\n */\nexport function deepMerge(target, source) {\n const output = Object.assign({}, target)\n if (isObject(target) && isObject(source)) {\n Object.keys(source).forEach(key => {\n if (isObject(source[key])) {\n if (!(key in target)) {\n Object.assign(output, { [key]: source[key] })\n } else {\n output[key] = deepMerge(target[key], source[key])\n }\n } else {\n Object.assign(output, { [key]: source[key] })\n }\n })\n }\n return output\n}\n\n/**\n * Validate configuration\n * @param {object} config - Configuration object\n * @returns {object} Validation result\n */\nexport function validateConfig(config) {\n const errors = []\n\n if (!config.apiKey || typeof config.apiKey !== 'string') {\n errors.push('apiKey is required and must be a string')\n }\n\n if (!config.collectionId || typeof config.collectionId !== 'string') {\n errors.push('collectionId is required and must be a string')\n }\n\n if (config.timeout && (typeof config.timeout !== 'number' || config.timeout < 0)) {\n errors.push('timeout must be a positive number')\n }\n\n if (config.cacheTTL && (typeof config.cacheTTL !== 'number' || config.cacheTTL < 0)) {\n errors.push('cacheTTL must be a positive number')\n }\n\n if (errors.length > 0) {\n return {\n valid: false,\n errors,\n code: ERROR_CODES.INVALID_CONFIG\n }\n }\n\n return { valid: true }\n}\n\n/**\n * Truncate text to max length\n * @param {string} text - Text to truncate\n * @param {number} maxLength - Maximum length\n * @returns {string} Truncated text\n */\nexport function truncateText(text, maxLength = PERFORMANCE.MAX_CONTENT_SIZE) {\n if (!text || text.length <= maxLength) return text\n logger.warn(`Content truncated from ${text.length} to ${maxLength} characters`)\n return text.substring(0, maxLength)\n}\n\n/**\n * Extract domain from URL\n * @param {string} url - URL to extract domain from\n * @returns {string} Domain\n */\nexport function extractDomain(url) {\n try {\n const urlObj = new URL(url)\n return urlObj.hostname\n } catch (e) {\n return ''\n }\n}\n\n/**\n * Sanitize text content\n * @param {string} text - Text to sanitize\n * @returns {string} Sanitized text\n */\nexport function sanitizeText(text) {\n if (!text) return ''\n return text\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .replace(/[\\r\\n\\t]/g, ' ') // Remove newlines and tabs\n .trim()\n}\n\n/**\n * Check if running in browser environment\n * @returns {boolean}\n */\nexport function isBrowser() {\n return typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\n/**\n * Parse JSON safely\n * @param {string} json - JSON string\n * @param {*} fallback - Fallback value\n * @returns {*} Parsed JSON or fallback\n */\nexport function safeJSONParse(json, fallback = null) {\n try {\n return JSON.parse(json)\n } catch (e) {\n logger.warn('Failed to parse JSON:', e)\n return fallback\n }\n}\n\n/**\n * Retry a function with exponential backoff\n * @param {Function} fn - Function to retry\n * @param {number} maxAttempts - Maximum number of attempts\n * @param {number} delay - Initial delay in ms\n * @returns {Promise} Result of function\n */\nexport async function retryWithBackoff(fn, maxAttempts = 3, delay = 100) {\n let lastError\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn()\n } catch (error) {\n lastError = error\n if (attempt < maxAttempts) {\n const backoffDelay = delay * Math.pow(2, attempt - 1)\n logger.warn(`Attempt ${attempt} failed, retrying in ${backoffDelay}ms...`)\n await new Promise(resolve => setTimeout(resolve, backoffDelay))\n }\n }\n }\n throw lastError\n}\n\n/**\n * Create a timeout promise\n * @param {number} ms - Timeout in milliseconds\n * @returns {Promise} Timeout promise\n */\nexport function timeout(ms) {\n return new Promise((_, reject) => {\n setTimeout(() => reject(new Error('Timeout')), ms)\n })\n}\n\n/**\n * Race a promise against a timeout\n * @param {Promise} promise - Promise to race\n * @param {number} ms - Timeout in milliseconds\n * @returns {Promise} Result or timeout error\n */\nexport function withTimeout(promise, ms) {\n return Promise.race([promise, timeout(ms)])\n}\n\n/**\n * Format taxonomy path\n * @param {array} path - Taxonomy path array\n * @returns {string} Formatted path\n */\nexport function formatTaxonomyPath(path) {\n if (!Array.isArray(path) || path.length === 0) return ''\n return path.join('/')\n}\n\n/**\n * Extract keywords from text\n * @param {string} text - Text to extract keywords from\n * @param {number} maxKeywords - Maximum number of keywords\n * @returns {array} Array of keywords\n */\nexport function extractKeywords(text, maxKeywords = 10) {\n if (!text) return []\n \n // Simple keyword extraction (in production, use NLP libraries)\n const words = text.toLowerCase()\n .replace(/[^a-z0-9\\s]/g, ' ')\n .split(/\\s+/)\n .filter(word => word.length > 3)\n \n // Get unique words\n const uniqueWords = [...new Set(words)]\n \n // Return top N keywords\n return uniqueWords.slice(0, maxKeywords)\n}\n\n/**\n * Get current timestamp\n * @returns {number} Timestamp in seconds\n */\nexport function getTimestamp() {\n return Math.floor(Date.now() / 1000)\n}\n\n/**\n * Check if value is expired\n * @param {number} timestamp - Timestamp in seconds\n * @param {number} ttl - TTL in seconds\n * @returns {boolean} True if expired\n */\nexport function isExpired(timestamp, ttl) {\n return getTimestamp() - timestamp > ttl\n}\n\n","/**\n * Mixpeek Context Adapter - Cache Manager\n * @module cache/cacheManager\n */\n\nimport { CACHE_KEYS, DEFAULT_CACHE_TTL } from '../config/constants.js'\nimport { getTimestamp, isExpired, safeJSONParse } from '../utils/helpers.js'\nimport logger from '../utils/logger.js'\n\nclass CacheManager {\n constructor() {\n this.memoryCache = new Map()\n this.useLocalStorage = this._checkLocalStorageAvailable()\n this.ttl = DEFAULT_CACHE_TTL\n }\n\n /**\n * Check if localStorage is available\n * @private\n * @returns {boolean}\n */\n _checkLocalStorageAvailable() {\n try {\n const test = '__mixpeek_test__'\n localStorage.setItem(test, test)\n localStorage.removeItem(test)\n return true\n } catch (e) {\n logger.warn('localStorage not available, using memory cache only')\n return false\n }\n }\n\n /**\n * Generate cache key\n * @private\n * @param {string} key - Key\n * @returns {string} Cache key\n */\n _getCacheKey(key) {\n return `${CACHE_KEYS.PREFIX}${CACHE_KEYS.VERSION}_${key}`\n }\n\n /**\n * Set TTL\n * @param {number} ttl - TTL in seconds\n */\n setTTL(ttl) {\n this.ttl = ttl\n }\n\n /**\n * Get item from cache\n * @param {string} key - Cache key\n * @returns {object|null} Cached value or null\n */\n get(key) {\n const cacheKey = this._getCacheKey(key)\n \n // Try memory cache first\n if (this.memoryCache.has(cacheKey)) {\n const item = this.memoryCache.get(cacheKey)\n if (!isExpired(item.timestamp, this.ttl)) {\n logger.info('Cache hit (memory):', key)\n return item.data\n } else {\n logger.info('Cache expired (memory):', key)\n this.memoryCache.delete(cacheKey)\n }\n }\n\n // Try localStorage\n if (this.useLocalStorage) {\n try {\n const item = localStorage.getItem(cacheKey)\n if (item) {\n const parsed = safeJSONParse(item)\n if (parsed && !isExpired(parsed.timestamp, this.ttl)) {\n logger.info('Cache hit (localStorage):', key)\n // Promote to memory cache\n this.memoryCache.set(cacheKey, parsed)\n return parsed.data\n } else {\n logger.info('Cache expired (localStorage):', key)\n localStorage.removeItem(cacheKey)\n }\n }\n } catch (e) {\n logger.warn('Error reading from localStorage:', e)\n }\n }\n\n logger.info('Cache miss:', key)\n return null\n }\n\n /**\n * Set item in cache\n * @param {string} key - Cache key\n * @param {*} data - Data to cache\n * @returns {boolean} Success\n */\n set(key, data) {\n const cacheKey = this._getCacheKey(key)\n const item = {\n data,\n timestamp: getTimestamp()\n }\n\n try {\n // Store in memory cache\n this.memoryCache.set(cacheKey, item)\n\n // Store in localStorage\n if (this.useLocalStorage) {\n localStorage.setItem(cacheKey, JSON.stringify(item))\n }\n\n logger.info('Cached:', key)\n return true\n } catch (e) {\n logger.warn('Error setting cache:', e)\n return false\n }\n }\n\n /**\n * Remove item from cache\n * @param {string} key - Cache key\n * @returns {boolean} Success\n */\n remove(key) {\n const cacheKey = this._getCacheKey(key)\n \n try {\n this.memoryCache.delete(cacheKey)\n if (this.useLocalStorage) {\n localStorage.removeItem(cacheKey)\n }\n logger.info('Cache removed:', key)\n return true\n } catch (e) {\n logger.warn('Error removing cache:', e)\n return false\n }\n }\n\n /**\n * Clear all cache\n * @returns {boolean} Success\n */\n clear() {\n try {\n this.memoryCache.clear()\n \n if (this.useLocalStorage) {\n const keys = Object.keys(localStorage)\n keys.forEach(key => {\n if (key.startsWith(CACHE_KEYS.PREFIX)) {\n localStorage.removeItem(key)\n }\n })\n }\n \n logger.info('Cache cleared')\n return true\n } catch (e) {\n logger.warn('Error clearing cache:', e)\n return false\n }\n }\n\n /**\n * Get cache stats\n * @returns {object} Cache statistics\n */\n getStats() {\n let localStorageSize = 0\n let localStorageCount = 0\n\n if (this.useLocalStorage) {\n try {\n const keys = Object.keys(localStorage)\n keys.forEach(key => {\n if (key.startsWith(CACHE_KEYS.PREFIX)) {\n localStorageCount++\n localStorageSize += localStorage.getItem(key).length\n }\n })\n } catch (e) {\n logger.warn('Error getting cache stats:', e)\n }\n }\n\n return {\n memoryCount: this.memoryCache.size,\n localStorageCount,\n localStorageSize,\n ttl: this.ttl\n }\n }\n\n /**\n * Prune expired items\n * @returns {number} Number of items pruned\n */\n prune() {\n let pruned = 0\n\n // Prune memory cache\n for (const [key, item] of this.memoryCache.entries()) {\n if (isExpired(item.timestamp, this.ttl)) {\n this.memoryCache.delete(key)\n pruned++\n }\n }\n\n // Prune localStorage\n if (this.useLocalStorage) {\n try {\n const keys = Object.keys(localStorage)\n keys.forEach(key => {\n if (key.startsWith(CACHE_KEYS.PREFIX)) {\n const item = safeJSONParse(localStorage.getItem(key))\n if (item && isExpired(item.timestamp, this.ttl)) {\n localStorage.removeItem(key)\n pruned++\n }\n }\n })\n } catch (e) {\n logger.warn('Error pruning cache:', e)\n }\n }\n\n if (pruned > 0) {\n logger.info(`Pruned ${pruned} expired cache items`)\n }\n\n return pruned\n }\n}\n\nexport default new CacheManager()\n\n","/**\n * Mixpeek Context Adapter - API Client\n * @module api/mixpeekClient\n */\n\nimport {\n DEFAULT_API_ENDPOINT,\n DEFAULT_TIMEOUT,\n DEFAULT_RETRY_ATTEMPTS,\n ENDPOINTS,\n HEADERS,\n USER_AGENT,\n ERROR_CODES\n} from '../config/constants.js'\nimport { withTimeout, retryWithBackoff, generateUUID } from '../utils/helpers.js'\nimport logger from '../utils/logger.js'\n\nclass MixpeekClient {\n constructor(config = {}) {\n this.apiKey = config.apiKey || ''\n this.endpoint = config.endpoint || DEFAULT_API_ENDPOINT\n this.namespace = config.namespace || null\n this.timeout = config.timeout || DEFAULT_TIMEOUT\n this.retryAttempts = config.retryAttempts || DEFAULT_RETRY_ATTEMPTS\n }\n\n /**\n * Configure the client\n * @param {object} config - Configuration object\n */\n configure(config) {\n Object.assign(this, config)\n }\n\n /**\n * Build headers for API request\n * @private\n * @returns {object} Headers object\n */\n _buildHeaders() {\n const headers = {\n [HEADERS.CONTENT_TYPE]: 'application/json',\n [HEADERS.AUTHORIZATION]: `Bearer ${this.apiKey}`,\n [HEADERS.USER_AGENT]: USER_AGENT\n }\n\n if (this.namespace) {\n headers[HEADERS.NAMESPACE] = this.namespace\n }\n\n return headers\n }\n\n /**\n * Make API request\n * @private\n * @param {string} path - API path\n * @param {object} options - Fetch options\n * @returns {Promise} Response data\n */\n async _request(path, options = {}) {\n const url = `${this.endpoint}${path}`\n const headers = this._buildHeaders()\n\n const fetchOptions = {\n ...options,\n headers: {\n ...headers,\n ...options.headers\n }\n }\n\n logger.info(`API Request: ${options.method || 'GET'} ${url}`)\n logger.time(`API Request: ${path}`)\n\n try {\n const response = await withTimeout(\n fetch(url, fetchOptions),\n this.timeout\n )\n\n logger.timeEnd(`API Request: ${path}`)\n\n if (!response.ok) {\n const error = await this._handleErrorResponse(response)\n throw error\n }\n\n const data = await response.json()\n logger.info('API Response:', { status: response.status, path })\n return data\n } catch (error) {\n logger.timeEnd(`API Request: ${path}`)\n \n if (error.message === 'Timeout') {\n throw {\n code: ERROR_CODES.API_TIMEOUT,\n message: `Request timeout after ${this.timeout}ms`,\n path\n }\n }\n\n throw error\n }\n }\n\n /**\n * Handle error response\n * @private\n * @param {Response} response - Fetch response\n * @returns {object} Error object\n */\n async _handleErrorResponse(response) {\n let errorMessage = `API error: ${response.status} ${response.statusText}`\n \n try {\n const errorData = await response.json()\n errorMessage = errorData.message || errorData.error || errorMessage\n } catch (e) {\n // Response body is not JSON\n }\n\n return {\n code: ERROR_CODES.API_ERROR,\n message: errorMessage,\n status: response.status\n }\n }\n\n /**\n * Create a document in a collection\n * @param {string} collectionId - Collection ID\n * @param {object} payload - Document payload\n * @returns {Promise} Document data\n */\n async createDocument(collectionId, payload) {\n const path = ENDPOINTS.DOCUMENTS.replace('{collectionId}', collectionId)\n \n const requestPayload = {\n object_id: payload.objectId || generateUUID(),\n metadata: payload.metadata || {},\n features: payload.features || []\n }\n\n return retryWithBackoff(\n () => this._request(path, {\n method: 'POST',\n body: JSON.stringify(requestPayload)\n }),\n this.retryAttempts\n )\n }\n\n /**\n * Get document by ID\n * @param {string} collectionId - Collection ID\n * @param {string} documentId - Document ID\n * @returns {Promise} Document data\n */\n async getDocument(collectionId, documentId) {\n const path = `${ENDPOINTS.DOCUMENTS.replace('{collectionId}', collectionId)}/${documentId}`\n return this._request(path, { method: 'GET' })\n }\n\n /**\n * Process content with feature extractors\n * @param {string} collectionId - Collection ID\n * @param {object} content - Content to process\n * @param {array} featureExtractors - Feature extractors to use\n * @returns {Promise} Enriched document\n */\n async processContent(collectionId, content, featureExtractors = []) {\n logger.group('Processing content with Mixpeek')\n logger.info('Collection:', collectionId)\n logger.info('Feature Extractors:', featureExtractors)\n\n try {\n // Build features array from extractors\n const features = featureExtractors.map(extractor => {\n const feature = {\n feature_extractor_id: typeof extractor === 'string' ? extractor : extractor.feature_extractor_id\n }\n\n // Add payload if provided\n if (typeof extractor === 'object' && extractor.payload) {\n feature.payload = extractor.payload\n } else {\n // Build payload from content\n feature.payload = this._buildFeaturePayload(content)\n }\n\n return feature\n })\n\n // Create document with features\n const document = await this.createDocument(collectionId, {\n objectId: this._generateContentId(content),\n metadata: {\n url: content.url,\n title: content.title,\n timestamp: Date.now()\n },\n features\n })\n\n logger.info('Document created:', document.document_id)\n logger.groupEnd()\n\n return document\n } catch (error) {\n logger.error('Error processing content:', error)\n logger.groupEnd()\n throw error\n }\n }\n\n /**\n * Build feature payload from content\n * @private\n * @param {object} content - Content object\n * @returns {object} Feature payload\n */\n _buildFeaturePayload(content) {\n const payload = {}\n\n // Add text content\n if (content.text) {\n payload.text = content.text\n }\n\n // Add URL\n if (content.url) {\n payload.url = content.url\n }\n\n // Add video URL\n if (content.src && content.duration !== undefined) {\n // This is video content\n payload.video_url = content.src\n payload.title = content.title\n payload.description = content.description\n }\n\n // Add image URL\n if (content.src && content.width && content.height && !content.duration) {\n // This is image content\n payload.image_url = content.src\n payload.alt_text = content.alt\n }\n\n // Add metadata\n if (content.metadata) {\n payload.metadata = content.metadata\n }\n\n return payload\n }\n\n /**\n * Generate content ID for caching\n * @private\n * @param {object} content - Content object\n * @returns {string} Content ID\n */\n _generateContentId(content) {\n if (content.url) {\n return `url_${content.url.split('?')[0]}` // Remove query params\n }\n if (content.src) {\n return `src_${content.src.split('?')[0]}`\n }\n return generateUUID()\n }\n\n /**\n * List available feature extractors\n * @returns {Promise} Feature extractors list\n */\n async listFeatureExtractors() {\n return this._request(ENDPOINTS.FEATURE_EXTRACTORS, { method: 'GET' })\n }\n\n /**\n * Get feature extractor details\n * @param {string} extractorId - Feature extractor ID\n * @returns {Promise} Feature extractor details\n */\n async getFeatureExtractor(extractorId) {\n const path = ENDPOINTS.FEATURE_EXTRACTORS + `/${extractorId}`\n return this._request(path, { method: 'GET' })\n }\n\n /**\n * Health check\n * @returns {Promise} Health status\n */\n async healthCheck() {\n return this._request('/v1/health', { method: 'GET' })\n }\n}\n\nexport default MixpeekClient\n\n","/**\n * Mixpeek Context Adapter - Page Content Extractor\n * @module extractors/pageExtractor\n */\n\nimport { PERFORMANCE } from '../config/constants.js'\nimport { sanitizeText, truncateText, extractDomain } from '../utils/helpers.js'\nimport logger from '../utils/logger.js'\n\n/**\n * Extract content from the current page\n * @returns {object} Extracted page content\n */\nexport function extractPageContent() {\n logger.time('extractPageContent')\n\n try {\n const content = {\n url: window.location.href,\n domain: extractDomain(window.location.href),\n title: document.title,\n description: extractMetaDescription(),\n text: extractBodyText(),\n keywords: extractMetaKeywords(),\n ogTags: extractOpenGraphTags(),\n structuredData: extractStructuredData(),\n language: document.documentElement.lang || 'en'\n }\n\n logger.timeEnd('extractPageContent')\n logger.info('Extracted page content:', {\n url: content.url,\n textLength: content.text.length,\n keywords: content.keywords.length\n })\n\n return content\n } catch (error) {\n logger.error('Error extracting page content:', error)\n logger.timeEnd('extractPageContent')\n return null\n }\n}\n\n/**\n * Extract meta description\n * @private\n * @returns {string} Meta description\n */\nfunction extractMetaDescription() {\n const metaDesc = document.querySelector('meta[name=\"description\"]') ||\n document.querySelector('meta[property=\"og:description\"]')\n return metaDesc ? sanitizeText(metaDesc.content) : ''\n}\n\n/**\n * Extract meta keywords\n * @private\n * @returns {array} Keywords array\n */\nfunction extractMetaKeywords() {\n const metaKeywords = document.querySelector('meta[name=\"keywords\"]')\n if (metaKeywords) {\n return metaKeywords.content.split(',').map(k => k.trim()).filter(Boolean)\n }\n return []\n}\n\n/**\n * Extract body text content\n * @private\n * @returns {string} Body text\n */\nfunction extractBodyText() {\n // Remove script, style, and other non-content elements\n const clone = document.body.cloneNode(true)\n const elementsToRemove = clone.querySelectorAll('script, style, iframe, nav, footer, aside, .ad, .advertisement')\n elementsToRemove.forEach(el => el.remove())\n\n // Get text content\n const text = clone.textContent || clone.innerText || ''\n \n // Sanitize and truncate\n return truncateText(sanitizeText(text), PERFORMANCE.MAX_CONTENT_SIZE)\n}\n\n/**\n * Extract Open Graph tags\n * @private\n * @returns {object} Open Graph data\n */\nfunction extractOpenGraphTags() {\n const ogTags = {}\n const metaTags = document.querySelectorAll('meta[property^=\"og:\"]')\n \n metaTags.forEach(tag => {\n const property = tag.getAttribute('property').replace('og:', '')\n ogTags[property] = tag.content\n })\n\n return ogTags\n}\n\n/**\n * Extract structured data (JSON-LD)\n * @private\n * @returns {array} Structured data objects\n */\nfunction extractStructuredData() {\n const structuredData = []\n const scripts = document.querySelectorAll('script[type=\"application/ld+json\"]')\n \n scripts.forEach(script => {\n try {\n const data = JSON.parse(script.textContent)\n structuredData.push(data)\n } catch (e) {\n logger.warn('Failed to parse structured data:', e)\n }\n })\n\n return structuredData\n}\n\n/**\n * Extract article-specific content\n * @returns {object|null} Article content\n */\nexport function extractArticleContent() {\n try {\n const article = document.querySelector('article') || \n document.querySelector('[role=\"article\"]') ||\n document.querySelector('.article') ||\n document.querySelector('.post')\n\n if (!article) return null\n\n return {\n headline: extractHeadline(article),\n author: extractAuthor(article),\n datePublished: extractPublishDate(article),\n content: sanitizeText(article.textContent || article.innerText || '')\n }\n } catch (error) {\n logger.warn('Error extracting article content:', error)\n return null\n }\n}\n\n/**\n * Extract headline\n * @private\n * @param {Element} article - Article element\n * @returns {string} Headline\n */\nfunction extractHeadline(article) {\n const h1 = article.querySelector('h1')\n const headline = article.querySelector('[itemprop=\"headline\"]')\n return sanitizeText((h1 || headline)?.textContent || '')\n}\n\n/**\n * Extract author\n * @private\n * @param {Element} article - Article element\n * @returns {string} Author\n */\nfunction extractAuthor(article) {\n const author = article.querySelector('[itemprop=\"author\"]') ||\n article.querySelector('[rel=\"author\"]') ||\n article.querySelector('.author')\n return sanitizeText(author?.textContent || '')\n}\n\n/**\n * Extract publish date\n * @private\n * @param {Element} article - Article element\n * @returns {string} Publish date\n */\nfunction extractPublishDate(article) {\n const dateEl = article.querySelector('[itemprop=\"datePublished\"]') ||\n article.querySelector('time[datetime]')\n return dateEl?.getAttribute('datetime') || dateEl?.textContent || ''\n}\n\n/**\n * Check if current page is an article\n * @returns {boolean}\n */\nexport function isArticlePage() {\n return document.querySelector('article') !== null ||\n document.querySelector('[itemtype*=\"Article\"]') !== null ||\n document.querySelector('meta[property=\"og:type\"][content=\"article\"]') !== null\n}\n\n","/**\n * Mixpeek Context Adapter - Video Content Extractor\n * @module extractors/videoExtractor\n */\n\nimport { sanitizeText } from '../utils/helpers.js'\nimport logger from '../utils/logger.js'\n\n/**\n * Extract video content from the page\n * @param {string} selector - CSS selector for video element\n * @returns {object|null} Extracted video content\n */\nexport function extractVideoContent(selector = 'video') {\n logger.time('extractVideoContent')\n\n try {\n const videos = findVideoElements(selector)\n \n if (videos.length === 0) {\n logger.info('No video elements found')\n logger.timeEnd('extractVideoContent')\n return null\n }\n\n // Use the first (typically largest/main) video\n const video = videos[0]\n const content = {\n src: getVideoSource(video),\n poster: video.poster || '',\n title: extractVideoTitle(video),\n description: extractVideoDescription(video),\n duration: video.duration || 0,\n currentTime: video.currentTime || 0,\n dimensions: {\n width: video.videoWidth || video.width || 0,\n height: video.videoHeight || video.height || 0\n },\n metadata: extractVideoMetadata(video)\n }\n\n logger.timeEnd('extractVideoContent')\n logger.info('Extracted video content:', {\n src: content.src,\n title: content.title,\n duration: content.duration\n })\n\n return content\n } catch (error) {\n logger.error('Error extracting video content:', error)\n logger.timeEnd('extractVideoContent')\n return null\n }\n}\n\n/**\n * Find video elements on the page\n * @private\n * @param {string} selector - CSS selector\n * @returns {array} Array of video elements\n */\nfunction findVideoElements(selector) {\n const videos = Array.from(document.querySelectorAll(selector))\n \n // Sort by size (largest first)\n return videos.sort((a, b) => {\n const aSize = (a.videoWidth || a.width || 0) * (a.videoHeight || a.height || 0)\n const bSize = (b.videoWidth || b.width || 0) * (b.videoHeight || b.height || 0)\n return bSize - aSize\n })\n}\n\n/**\n * Get video source URL\n * @private\n * @param {HTMLVideoElement} video - Video element\n * @returns {string} Video source URL\n */\nfunction getVideoSource(video) {\n // Check src attribute\n if (video.src) return video.src\n\n // Check source elements\n const source = video.querySelector('source')\n if (source && source.src) return source.src\n\n // Check currentSrc\n if (video.currentSrc) return video.currentSrc\n\n return ''\n}\n\n/**\n * Extract video title\n * @private\n * @param {HTMLVideoElement} video - Video element\n * @returns {string} Video title\n */\nfunction extractVideoTitle(video) {\n // Check data attributes\n const title = video.getAttribute('data-title') ||\n video.getAttribute('title') ||\n video.getAttribute('aria-label')\n \n if (title) return sanitizeText(title)\n\n // Check parent container\n const container = video.closest('[data-video-title]')\n if (container) {\n return sanitizeText(container.getAttribute('data-video-title'))\n }\n\n // Check nearby heading\n const heading = video.previousElementSibling?.querySelector('h1, h2, h3') ||\n video.parentElement?.querySelector('h1, h2, h3')\n if (heading) {\n return sanitizeText(heading.textContent)\n }\n\n return ''\n}\n\n/**\n * Extract video description\n * @private\n * @param {HTMLVideoElement} video - Video element\n * @returns {string} Video description\n */\nfunction extractVideoDescription(video) {\n const desc = video.getAttribute('data-description') ||\n video.getAttribute('aria-description')\n \n if (desc) return sanitizeText(desc)\n\n // Check parent container\n const container = video.closest('[data-video-description]')\n if (container) {\n return sanitizeText(container.getAttribute('data-video-description'))\n }\n\n return ''\n}\n\n/**\n * Extract video metadata\n * @private\n * @param {HTMLVideoElement} video - Video element\n * @returns {object} Video metadata\n */\nfunction extractVideoMetadata(video) {\n const metadata = {}\n \n // Extract all data attributes\n Array.from(video.attributes).forEach(attr => {\n if (attr.name.startsWith('data-')) {\n const key = attr.name.replace('data-', '').replace(/-/g, '_')\n metadata[key] = attr.value\n }\n })\n\n return metadata\n}\n\n/**\n * Capture video frame as base64 image\n * @param {HTMLVideoElement} video - Video element\n * @param {number} quality - JPEG quality (0-1)\n * @returns {string|null} Base64 encoded image\n */\nexport function captureVideoFrame(video, quality = 0.8) {\n try {\n const canvas = document.createElement('canvas')\n canvas.width = video.videoWidth || video.width || 640\n canvas.height = video.videoHeight || video.height || 360\n \n const ctx = canvas.getContext('2d')\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height)\n \n return canvas.toDataURL('image/jpeg', quality)\n } catch (error) {\n logger.warn('Error capturing video frame:', error)\n return null\n }\n}\n\n/**\n * Extract video player information (YouTube, Vimeo, etc.)\n * @returns {object|null} Video player info\n */\nexport function extractVideoPlayerInfo() {\n // YouTube\n const ytPlayer = document.querySelector('iframe[src*=\"youtube.com\"]')\n if (ytPlayer) {\n const src = ytPlayer.src\n const videoIdMatch = src.match(/embed\\/([^?]+)/)\n return {\n platform: 'youtube',\n videoId: videoIdMatch ? videoIdMatch[1] : '',\n src\n }\n }\n\n // Vimeo\n const vimeoPlayer = document.querySelector('iframe[src*=\"vimeo.com\"]')\n if (vimeoPlayer) {\n const src = vimeoPlayer.src\n const videoIdMatch = src.match(/video\\/(\\d+)/)\n return {\n platform: 'vimeo',\n videoId: videoIdMatch ? videoIdMatch[1] : '',\n src\n }\n }\n\n return null\n}\n\n/**\n * Check if page has video content\n * @returns {boolean}\n */\nexport function hasVideo() {\n return document.querySelector('video') !== null ||\n document.querySelector('iframe[src*=\"youtube.com\"]') !== null ||\n document.querySelector('iframe[src*=\"vimeo.com\"]') !== null\n}\n\n","/**\n * Mixpeek Context Adapter - Image Content Extractor\n * @module extractors/imageExtractor\n */\n\nimport { sanitizeText } from '../utils/helpers.js'\nimport logger from '../utils/logger.js'\n\n/**\n * Extract primary images from the page\n * @param {number} maxImages - Maximum number of images to extract\n * @returns {array} Array of image objects\n */\nexport function extractImages(maxImages = 5) {\n logger.time('extractImages')\n\n try {\n const images = findPrimaryImages()\n const extracted = images.slice(0, maxImages).map(img => ({\n src: img.src,\n alt: sanitizeText(img.alt || ''),\n title: sanitizeText(img.title || ''),\n width: img.naturalWidth || img.width || 0,\n height: img.naturalHeight || img.height || 0,\n aspectRatio: calculateAspectRatio(img)\n }))\n\n logger.timeEnd('extractImages')\n logger.info(`Extracted ${extracted.length} images`)\n\n return extracted\n } catch (error) {\n logger.error('Error extracting images:', error)\n logger.timeEnd('extractImages')\n return []\n }\n}\n\n/**\n * Find primary/hero images on the page\n * @private\n * @returns {array} Array of image elements\n */\nfunction findPrimaryImages() {\n const images = Array.from(document.querySelectorAll('img'))\n \n return images\n .filter(img => {\n // Filter out small images (likely icons/thumbnails)\n const width = img.naturalWidth || img.width || 0\n const height = img.naturalHeight || img.height || 0\n return width >= 200 && height >= 200\n })\n .filter(img => {\n // Filter out hidden images\n const style = window.getComputedStyle(img)\n return style.display !== 'none' && style.visibility !== 'hidden'\n })\n .filter(img => {\n // Filter out ad images\n const isAd = img.closest('.ad, .advertisement, [id*=\"ad-\"], [class*=\"ad-\"]')\n return !isAd\n })\n .sort((a, b) => {\n // Sort by size (largest first)\n const aSize = (a.naturalWidth || a.width || 0) * (a.naturalHeight || a.height || 0)\n const bSize = (b.naturalWidth || b.width || 0) * (b.naturalHeight || b.height || 0)\n return bSize - aSize\n })\n}\n\n/**\n * Calculate aspect ratio\n * @private\n * @param {HTMLImageElement} img - Image element\n * @returns {number} Aspect ratio\n */\nfunction calculateAspectRatio(img) {\n const width = img.naturalWidth || img.width || 0\n const height = img.naturalHeight || img.height || 0\n return height > 0 ? width / height : 0\n}\n\n/**\n * Extract Open Graph image\n * @returns {object|null} OG image data\n */\nexport function extractOGImage() {\n const ogImage = document.querySelector('meta[property=\"og:image\"]')\n if (ogImage) {\n return {\n src: ogImage.content,\n alt: document.querySelector('meta[property=\"og:image:alt\"]')?.content || '',\n width: parseInt(document.querySelector('meta[property=\"og:image:width\"]')?.content || '0'),\n height: parseInt(document.querySelector('meta[property=\"og:image:height\"]')?.content || '0')\n }\n }\n return null\n}\n\n/**\n * Extract featured/hero image\n * @returns {object|null} Featured image data\n */\nexport function extractFeaturedImage() {\n // Check for common featured image patterns\n const selectors = [\n '[class*=\"featured-image\"]',\n '[class*=\"hero-image\"]',\n '[class*=\"header-image\"]',\n 'article img:first-of-type',\n '.post-thumbnail img'\n ]\n\n for (const selector of selectors) {\n const img = document.querySelector(selector)\n if (img) {\n return {\n src: img.src,\n alt: sanitizeText(img.alt || ''),\n width: img.naturalWidth || img.width || 0,\n height: img.naturalHeight || img.height || 0\n }\n }\n }\n\n return null\n}\n\n/**\n * Check if page has significant image content\n * @returns {boolean}\n */\nexport function hasImages() {\n const images = document.querySelectorAll('img')\n return Array.from(images).some(img => {\n const width = img.naturalWidth || img.width || 0\n const height = img.naturalHeight || img.height || 0\n return width >= 200 && height >= 200\n })\n}\n\n","/**\n * IAB Content Taxonomy Mapping\n * @module utils/iabMapping\n * \n * Maps Mixpeek taxonomy to IAB Content Taxonomy v3.0 codes\n * Reference: https://iabtechlab.com/standards/content-taxonomy/\n * \n * ✅ VERIFIED: Mixpeek Response Format (from OpenAPI spec)\n * \n * Mixpeek returns TaxonomyAssignment objects in enrichments.taxonomies:\n * ```javascript\n * {\n * \"taxonomy_id\": \"tax_products\",\n * \"node_id\": \"node_electronics_phones\", // ← Custom Mixpeek node ID\n * \"path\": [\"products\", \"electronics\", \"phones\"],\n * \"label\": \"Mobile Phones\", // Human-readable label\n * \"score\": 0.87\n * }\n * ```\n * \n * This means we're in **Scenario B**: Mixpeek uses custom node_ids like\n * \"node_electronics_phones\" that need to be mapped to IAB codes like \"IAB19-20\".\n * \n * Three mapping strategies (in order of priority):\n * \n * 1. **Check if already IAB** (safety check)\n * - If node_id or label contains IAB code pattern, use it directly\n * \n * 2. **Map by node_id** (primary method) ⭐\n * - Map Mixpeek node_id → IAB code using MIXPEEK_NODE_TO_IAB\n * - Most reliable when properly configured\n * - Requires discovering actual node_ids from your taxonomy\n * \n * 3. **Map by label** (fallback)\n * - Map human-readable labels to IAB codes\n * - Less precise but provides coverage\n * \n * To populate the mapping with YOUR taxonomy's node_ids:\n * ```bash\n * # Run the verification script to discover node_ids\n * MIXPEEK_API_KEY=your_key COLLECTION_ID=your_collection \\\n * node scripts/verify-mixpeek-taxonomy.js\n * \n * # This will show you the actual node_id values like:\n * # node_id: \"node_electronics_phones\" → Map to: IAB19-20\n * # node_id: \"node_sports_football\" → Map to: IAB17-3\n * ```\n */\n\n/**\n * IAB Taxonomy version identifier\n * IAB Tech Lab Content Taxonomy v3.0 = 6\n */\nexport const IAB_TAXONOMY_VERSION = 6\n\n/**\n * Map Mixpeek node_ids to IAB codes\n * \n * ✅ CONFIRMED: Mixpeek uses custom node_ids (from OpenAPI spec)\n * Example from spec: \"node_electronics_phones\" → should map to \"IAB19-20\"\n * \n * ⚠️ TODO: Populate with YOUR taxonomy's actual node_ids\n * The placeholders below use common patterns, but you need to run the\n * verification script to get the exact node_ids from YOUR Mixpeek taxonomy.\n * \n * Format: 'mixpeek_node_id': 'IAB_CODE'\n * \n * To discover YOUR node_ids:\n * 1. Run: node scripts/verify-mixpeek-taxonomy.js\n * 2. Note the node_id values returned\n * 3. Map each to the appropriate IAB code\n * \n * Example mapping (update with your actual node_ids):\n * 'node_tech_ai': 'IAB19-11', // Tech > AI\n * 'node_electronics_phones': 'IAB19-20', // Mobile/Phones\n * 'node_sports_football': 'IAB17-3', // Sports > Football\n */\nexport const MIXPEEK_NODE_TO_IAB = {\n // Technology & Computing (IAB19)\n // Replace these with actual node_ids from YOUR Mixpeek taxonomy\n 'node_technology': 'IAB19',\n 'node_tech_computing': 'IAB19',\n 'node_tech_ai': 'IAB19-11',\n 'node_tech_artificial_intelligence': 'IAB19-11',\n 'node_tech_machine_learning': 'IAB19-11',\n 'node_tech_software': 'IAB19-18',\n 'node_tech_hardware': 'IAB19-19',\n 'node_tech_mobile': 'IAB19-20',\n 'node_electronics_phones': 'IAB19-20', // From OpenAPI example\n 'node_tech_internet': 'IAB19-21',\n \n // Sports (IAB17)\n 'sports': 'IAB17',\n 'sports_football': 'IAB17-3',\n 'sports_soccer': 'IAB17-44',\n 'sports_basketball': 'IAB17-4',\n 'sports_baseball': 'IAB17-5',\n 'sports_tennis': 'IAB17-37',\n \n // News (IAB12)\n 'news': 'IAB12',\n 'news_politics': 'IAB12-2',\n 'news_business': 'IAB12-3',\n 'news_technology': 'IAB12-6',\n \n // Business & Finance (IAB13)\n 'business': 'IAB13',\n 'business_finance': 'IAB13-7',\n 'business_investing': 'IAB13-5',\n \n // Entertainment (IAB9)\n 'entertainment': 'IAB9',\n 'entertainment_movies': 'IAB9-7',\n 'entertainment_tv': 'IAB9-23',\n 'entertainment_music': 'IAB9-8',\n \n // Health & Fitness (IAB7)\n 'health': 'IAB7',\n 'health_fitness': 'IAB7-18',\n 'health_nutrition': 'IAB7-30',\n \n // Travel (IAB20)\n 'travel': 'IAB20',\n 'travel_hotels': 'IAB20-12',\n \n // Food & Drink (IAB8)\n 'food': 'IAB8',\n 'food_cooking': 'IAB8-5',\n 'food_restaurants': 'IAB8-9',\n \n // Automotive (IAB2)\n 'automotive': 'IAB2',\n 'automotive_cars': 'IAB2',\n \n // Real Estate (IAB21)\n 'real_estate': 'IAB21',\n \n // Education (IAB5)\n 'education': 'IAB5',\n \n // Fashion & Style (IAB18)\n 'fashion': 'IAB18',\n 'fashion_beauty': 'IAB18-1',\n \n // Home & Garden (IAB10)\n 'home': 'IAB10',\n 'home_garden': 'IAB10-3',\n \n // Science (IAB15)\n 'science': 'IAB15',\n \n // Arts (IAB1)\n 'arts': 'IAB1',\n 'arts_design': 'IAB1-4'\n}\n\n/**\n * Fallback label-based mapping (Scenario C)\n * Used when node_id mapping fails\n */\nexport const LABEL_TO_IAB = {\n // Technology patterns\n 'technology': 'IAB19',\n 'tech': 'IAB19',\n 'ai': 'IAB19-11',\n 'artificial intelligence': 'IAB19-11',\n 'machine learning': 'IAB19-11',\n 'software': 'IAB19-18',\n 'hardware': 'IAB19-19',\n 'mobile': 'IAB19-20',\n 'computing': 'IAB19',\n \n // Sports patterns\n 'sports': 'IAB17',\n 'football': 'IAB17-3',\n 'soccer': 'IAB17-44',\n 'basketball': 'IAB17-4',\n 'baseball': 'IAB17-5',\n \n // News patterns\n 'news': 'IAB12',\n 'politics': 'IAB12-2',\n \n // Business patterns\n 'business': 'IAB13',\n 'finance': 'IAB13-7',\n 'investing': 'IAB13-5',\n \n // Entertainment patterns\n 'entertainment': 'IAB9',\n 'movies': 'IAB9-7',\n 'television': 'IAB9-23',\n 'music': 'IAB9-8',\n 'gaming': 'IAB9-30',\n \n // Health patterns\n 'health': 'IAB7',\n 'fitness': 'IAB7-18',\n 'wellness': 'IAB7',\n 'nutrition': 'IAB7-30',\n \n // Other categories\n 'travel': 'IAB20',\n 'food': 'IAB8',\n 'automotive': 'IAB2',\n 'cars': 'IAB2',\n 'real estate': 'IAB21',\n 'education': 'IAB5',\n 'fashion': 'IAB18',\n 'home': 'IAB10',\n 'science': 'IAB15',\n 'arts': 'IAB1'\n}\n\n/**\n * Check if a string is already a valid IAB category code\n * @param {string} value - Potential IAB code\n * @returns {boolean} True if valid IAB code format\n */\nexport function isValidIABCode(value) {\n if (!value || typeof value !== 'string') return false\n return /^IAB\\d+(-\\d+)?$/.test(value)\n}\n\n/**\n * Extract IAB code from a string if present\n * @param {string} value - String that might contain IAB code\n * @returns {string|null} IAB code if found, null otherwise\n */\nexport function extractIABCode(value) {\n if (!value || typeof value !== 'string') return null\n const match = value.match(/IAB\\d+(-\\d+)?/)\n return match ? match[0] : null\n}\n\n/**\n * Map Mixpeek taxonomy to IAB code using multiple strategies\n * @param {object} taxonomy - Mixpeek taxonomy object with {label, node_id, path, score}\n * @returns {string|null} IAB category code or null if not found\n */\nexport function getIABFromTaxonomy(taxonomy) {\n if (!taxonomy) return null\n \n // Strategy 1: Check if label is already an IAB code (Scenario A)\n if (taxonomy.label) {\n if (isValidIABCode(taxonomy.label)) {\n return taxonomy.label\n }\n \n // Check if label contains IAB code\n const iabInLabel = extractIABCode(taxonomy.label)\n if (iabInLabel) {\n return iabInLabel\n }\n }\n \n // Strategy 2: Check if node_id is an IAB code (Scenario A)\n if (taxonomy.nodeId || taxonomy.node_id) {\n const nodeId = taxonomy.nodeId || taxonomy.node_id\n \n if (isValidIABCode(nodeId)) {\n return nodeId\n }\n \n // Check if node_id contains IAB code\n const iabInNode = extractIABCode(nodeId)\n if (iabInNode) {\n return iabInNode\n }\n }\n \n // Strategy 3: Map by Mixpeek node_id (Scenario B)\n if (taxonomy.nodeId || taxonomy.node_id) {\n const nodeId = (taxonomy.nodeId || taxonomy.node_id).toLowerCase()\n \n // Direct match\n if (MIXPEEK_NODE_TO_IAB[nodeId]) {\n return MIXPEEK_NODE_TO_IAB[nodeId]\n }\n \n // Try without underscores/hyphens\n const normalizedNode = nodeId.replace(/[_-]/g, '')\n for (const [key, value] of Object.entries(MIXPEEK_NODE_TO_IAB)) {\n if (key.replace(/[_-]/g, '') === normalizedNode) {\n return value\n }\n }\n }\n \n // Strategy 4: Map by label text (Scenario C - fallback)\n if (taxonomy.label) {\n const label = taxonomy.label.toLowerCase()\n \n // Direct match\n if (LABEL_TO_IAB[label]) {\n return LABEL_TO_IAB[label]\n }\n \n // Try partial matches\n for (const [key, value] of Object.entries(LABEL_TO_IAB)) {\n if (label.includes(key)) {\n return value\n }\n }\n }\n \n // Strategy 5: Try path if available\n if (taxonomy.path) {\n const pathString = Array.isArray(taxonomy.path) \n ? taxonomy.path.join(' ').toLowerCase()\n : taxonomy.path.toLowerCase()\n \n for (const [key, value] of Object.entries(LABEL_TO_IAB)) {\n if (pathString.includes(key)) {\n return value\n }\n }\n }\n \n return null\n}\n\n/**\n * Map multiple taxonomies to IAB codes\n * @param {Array<object>} taxonomies - Array of taxonomy objects\n * @returns {Array<string>} Array of IAB codes (duplicates removed)\n */\nexport function mapTaxonomiesToIAB(taxonomies) {\n if (!Array.isArray(taxonomies)) return []\n \n const iabCodes = taxonomies\n .map(tax => getIABFromTaxonomy(tax))\n .filter(code => code !== null)\n \n // Remove duplicates\n return [...new Set(iabCodes)]\n}\n\n/**\n * Map categories to IAB codes (deprecated - use getIABFromTaxonomy)\n * @deprecated Use getIABFromTaxonomy for taxonomy objects\n * @param {Array<string>} categories - Array of category strings\n * @returns {Array<string>} Array of IAB codes\n */\nexport function mapCategoriesToIAB(categories) {\n if (!Array.isArray(categories)) return []\n \n const iabCodes = categories\n .map(cat => {\n const normalized = cat.toLowerCase()\n return LABEL_TO_IAB[normalized] || null\n })\n .filter(code => code !== null)\n \n return [...new Set(iabCodes)]\n}\n\nexport default {\n IAB_TAXONOMY_VERSION,\n MIXPEEK_NODE_TO_IAB,\n LABEL_TO_IAB,\n isValidIABCode,\n extractIABCode,\n getIABFromTaxonomy,\n mapTaxonomiesToIAB,\n mapCategoriesToIAB\n}\n","/**\n * Previous Ad Tracker\n * Stores minimal information about the most recently served ad\n * using in-memory storage with optional localStorage persistence.\n */\n\nimport { isBrowser, safeJSONParse } from './helpers.js'\nimport logger from './logger.js'\n\nconst STORAGE_KEY = 'mixpeek_prev_ad_v1'\n\nclass PreviousAdTracker {\n constructor() {\n this.lastAd = null\n this.storageAvailable = this._checkLocalStorage()\n this._loadFromStorage()\n }\n\n _checkLocalStorage() {\n if (!isBrowser()) return false\n try {\n const k = '__mixpeek_prev_test__'\n localStorage.setItem(k, '1')\n localStorage.removeItem(k)\n return true\n } catch (e) {\n return false\n }\n }\n\n _loadFromStorage() {\n if (!this.storageAvailable) return\n try {\n const raw = localStorage.getItem(STORAGE_KEY)\n if (raw) {\n const parsed = safeJSONParse(raw)\n if (parsed && typeof parsed === 'object') {\n this.lastAd = parsed\n }\n }\n } catch (e) {\n logger.warn('Failed to load previous ad from storage:', e)\n }\n }\n\n _persist() {\n if (!this.storageAvailable) return\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(this.lastAd))\n } catch (e) {\n logger.warn('Failed to persist previous ad:', e)\n }\n }\n\n /**\n * Record the last served ad from a Prebid bidResponse\n * @param {object} bidResponse\n */\n record(bidResponse) {\n if (!bidResponse || typeof bidResponse !== 'object') return\n const info = {\n creativeId: bidResponse.creativeId || bidResponse.creative_id || null,\n bidder: bidResponse.bidder || bidResponse.bidderCode || null,\n adUnitCode: bidResponse.adUnitCode || null,\n cpm: typeof bidResponse.cpm === 'number' ? bidResponse.cpm : null,\n currency: bidResponse.currency || null,\n categories: Array.isArray(bidResponse.meta?.adServerCatId) ? bidResponse.meta.adServerCatId : (bidResponse.meta?.primaryCat ? [bidResponse.meta.primaryCat] : []),\n timestamp: Date.now()\n }\n this.lastAd = info\n this._persist()\n }\n\n /**\n * Get last ad info\n * @returns {object|null}\n */\n getLast() {\n return this.lastAd\n }\n\n /**\n * Clear last ad\n */\n clear() {\n this.lastAd = null\n if (this.storageAvailable) {\n try { localStorage.removeItem(STORAGE_KEY) } catch (e) {}\n }\n }\n}\n\nexport default new PreviousAdTracker()\n\n\n","/**\n * Mixpeek Context Adapter for Prebid.js\n * @module modules/mixpeekContextAdapter\n * @version 1.0.0\n * \n * This module enriches Prebid.js bid requests with contextual data from Mixpeek's\n * multimodal AI engine. It extracts page, video, or image content and classifies\n * it using Mixpeek's API to provide IAB taxonomy, brand safety scores, and other\n * contextual signals for privacy-safe ad targeting.\n */\n\nimport {\n MIXPEEK_MODULE_NAME,\n CONTENT_MODES,\n TARGETING_KEYS,\n EVENTS,\n DEFAULT_CACHE_TTL,\n DEFAULT_TIMEOUT,\n DEFAULT_RETRY_ATTEMPTS,\n PERFORMANCE,\n FEATURE_EXTRACTORS\n} from '../config/constants.js'\nimport { validateConfig, deepMerge, hashString, isBrowser } from '../utils/helpers.js'\nimport logger from '../utils/logger.js'\nimport cacheManager from '../cache/cacheManager.js'\nimport MixpeekClient from '../api/mixpeekClient.js'\nimport { extractPageContent, extractArticleContent, isArticlePage } from '../extractors/pageExtractor.js'\nimport { extractVideoContent, hasVideo, extractVideoPlayerInfo } from '../extractors/videoExtractor.js'\nimport { extractImages, extractOGImage, hasImages } from '../extractors/imageExtractor.js'\nimport { getIABFromTaxonomy, mapCategoriesToIAB, IAB_TAXONOMY_VERSION } from '../utils/iabMapping.js'\nimport previousAdTracker from '../utils/previousAdTracker.js'\n\nclass MixpeekContextAdapter {\n constructor() {\n this.config = {}\n this.client = null\n this.initialized = false\n this.processing = false\n this.contextData = null\n this.events = {}\n this.healthCheckPerformed = false\n }\n\n /**\n * Initialize the adapter with configuration\n * @param {object} config - Configuration object\n * @returns {Promise<boolean>} Success\n */\n async init(config) {\n logger.info('Initializing Mixpeek Context Adapter')\n logger.group('Configuration')\n\n // Validate configuration\n const validation = validateConfig(config)\n if (!validation.valid) {\n logger.error('Invalid configuration:', validation.errors)\n logger.groupEnd()\n return false\n }\n\n // Set default configuration\n this.config = deepMerge({\n endpoint: 'https://api.mixpeek.com',\n timeout: DEFAULT_TIMEOUT,\n cacheTTL: DEFAULT_CACHE_TTL,\n retryAttempts: DEFAULT_RETRY_ATTEMPTS,\n mode: CONTENT_MODES.AUTO,\n enableCache: true,\n debug: false,\n healthCheck: 'lazy', // 'eager', 'lazy', or false\n featureExtractors: [FEATURE_EXTRACTORS.TAXONOMY],\n batchSize: 1\n }, config)\n\n // Set debug mode\n logger.setDebug(this.config.debug)\n\n // Initialize API client\n this.client = new MixpeekClient({\n apiKey: this.config.apiKey,\n endpoint: this.config.endpoint,\n namespace: this.config.namespace,\n timeout: this.config.timeout,\n retryAttempts: this.config.retryAttempts\n })\n\n // Configure cache\n if (this.config.enableCache) {\n cacheManager.setTTL(this.config.cacheTTL)\n }\n\n logger.table({\n 'API Endpoint': this.config.endpoint,\n 'Collection ID': this.config.collectionId,\n 'Namespace': this.config.namespace || 'default',\n 'Mode': this.config.mode,\n 'Timeout': `${this.config.timeout}ms`,\n 'Cache TTL': `${this.config.cacheTTL}s`,\n 'Feature Extractors': this.config.featureExtractors.join(', '),\n 'Health Check': this.config.healthCheck\n })\n\n logger.groupEnd()\n\n // Perform health check if configured\n if (this.config.healthCheck === 'eager') {\n logger.info('Performing health check...')\n const healthResult = await this._performHealthCheck()\n \n if (!healthResult.healthy) {\n logger.warn('Health check failed, but continuing initialization')\n logger.warn('API may be unavailable:', healthResult.error)\n } else {\n logger.info('Health check passed:', healthResult.message)\n }\n } else if (this.config.healthCheck === 'lazy') {\n logger.info('Health check will be performed on first request')\n }\n\n this.initialized = true\n logger.info('Mixpeek Context Adapter initialized successfully')\n return true\n }\n\n /**\n * Perform health check (internal)\n * @private\n * @returns {Promise<object>} Health check result\n */\n async _performHealthCheck() {\n try {\n const startTime = performance.now()\n const health = await this.client.healthCheck()\n const duration = performance.now() - startTime\n\n return {\n healthy: true,\n status: health.status || 'ok',\n version: health.version,\n latency: Math.round(duration),\n message: `API responding in ${Math.round(duration)}ms`\n }\n } catch (error) {\n return {\n healthy: false,\n error: error.message,\n message: 'API health check failed'\n }\n }\n }\n\n /**\n * Enrich ad units with contextual data\n * @param {array} adUnits - Prebid ad units\n * @returns {Promise<array>} Enriched ad units\n */\n async enrichAdUnits(adUnits) {\n if (!this.initialized) {\n logger.warn('Adapter not initialized')\n return adUnits\n }\n\n if (this.processing) {\n logger.warn('Already processing context')\n return adUnits\n }\n\n this.processing = true\n const startTime = performance.now()\n\n try {\n // Get contextual data\n const context = await this.getContext()\n \n if (!context) {\n logger.warn('No context data available')\n return adUnits\n }\n\n // Store context\n this.contextData = context\n\n // Inject targeting keys into ad units\n const enrichedAdUnits = this._injectTargetingKeys(adUnits, context)\n\n const duration = performance.now() - startTime\n logger.info(`Context enrichment completed in ${duration.toFixed(2)}ms`)\n\n // Check performance threshold\n if (duration > PERFORMANCE.WARN_LATENCY) {\n logger.warn(`Enrichment took ${duration.toFixed(2)}ms (threshold: ${PERFORMANCE.WARN_LATENCY}ms)`)\n }\n\n // Emit success event\n this._emitEvent(EVENTS.CONTEXT_READY, context)\n\n return enrichedAdUnits\n } catch (error) {\n logger.error('Error enriching ad units:', error)\n \n // Emit error event\n this._emitEvent(EVENTS.CONTEXT_ERROR, error)\n\n // Return original ad units (graceful degradation)\n return adUnits\n } finally {\n this.processing = false\n }\n }\n\n /**\n * Get contextual data from cache or API\n * @returns {Promise<object>} Context data\n */\n async getContext() {\n logger.time('getContext')\n\n try {\n // Perform lazy health check on first request\n if (this.config.healthCheck === 'lazy' && !this.healthCheckPerformed) {\n logger.info('Performing lazy health check...')\n const healthResult = await this._performHealthCheck()\n this.healthCheckPerformed = true\n \n if (!healthResult.healthy) {\n logger.warn('Health check failed:', healthResult.error)\n logger.warn('Proceeding anyway, errors will be handled gracefully')\n } else {\n logger.info('Health check passed:', healthResult.message)\n }\n }\n\n // Detect content mode\n const mode = this._detectContentMode()\n logger.info('Content mode:', mode)\n\n // Extract content based on mode\n const content = await this._extractContent(mode)\n \n if (!content) {\n logger.warn('No content extracted')\n logger.timeEnd('getContext')\n return null\n }\n\n // Generate cache key\n const cacheKey = this._generateCacheKey(content, mode)\n\n // Check cache\n if (this.config.enableCache) {\n const cached = cacheManager.get(cacheKey)\n if (cached) {\n logger.info('Using cached context')\n logger.timeEnd('getContext')\n this._emitEvent(EVENTS.CONTEXT_CACHED, cached)\n return cached\n }\n }\n\n // Process content with Mixpeek API\n logger.info('Processing content with Mixpeek API')\n this._emitEvent(EVENTS.API_REQUEST, { content, mode })\n\n const document = await this.client.processContent(\n this.config.collectionId,\n content,\n this.config.featureExtractors\n )\n\n this._emitEvent(EVENTS.API_RESPONSE, document)\n\n // Parse context from document\n const context = this._parseContext(document, content, mode)\n\n // Cache the result\n if (this.config.enableCache) {\n cacheManager.set(cacheKey, context)\n }\n\n logger.timeEnd('getContext')\n return context\n } catch (error) {\n logger.error('Error getting context:', error)\n logger.timeEnd('getContext')\n throw error\n }\n }\n\n /**\n * Detect content mode (page, video, image, or auto)\n * @private\n * @returns {string} Content mode\n */\n _detectContentMode() {\n if (this.config.mode !== CONTENT_MODES.AUTO) {\n return this.config.mode\n }\n\n // Auto-detect based on page content\n if (hasVideo()) {\n return CONTENT_MODES.VIDEO\n }\n\n if (isArticlePage() || hasImages()) {\n return CONTENT_MODES.PAGE\n }\n\n return CONTENT_MODES.PAGE // Default to page\n }\n\n /**\n * Extract content based on mode\n * @private\n * @param {string} mode - Content mode\n * @returns {Promise<object>} Extracted content\n */\n async _extractContent(mode) {\n if (!isBrowser()) {\n logger.warn('Not in browser environment')\n return null\n }\n\n logger.info(`Extracting ${mode} content`)\n\n switch (mode) {\n case CONTENT_MODES.VIDEO:\n return this._extractVideoContent()\n\n case CONTENT_MODES.IMAGE:\n return this._extractImageContent()\n\n case CONTENT_MODES.PAGE:\n default:\n return this._extractPageContent()\n }\n }\n\n /**\n * Extract page content\n * @private\n * @returns {object} Page content\n */\n _extractPageContent() {\n const pageContent = extractPageContent()\n \n if (!pageContent) return null\n\n // If it's an article, extract article-specific content\n if (isArticlePage()) {\n const articleContent = extractArticleContent()\n if (articleContent) {\n return {\n ...pageContent,\n article: articleContent\n }\n }\n }\n\n // Extract featured image\n const ogImage = extractOGImage()\n if (ogImage) {\n pageContent.featuredImage = ogImage\n }\n\n return pageContent\n }\n\n /**\n * Extract video content\n * @private\n * @returns {object} Video content\n */\n _extractVideoContent() {\n const videoSelector = this.config.videoSelector || 'video'\n const videoContent = extractVideoContent(videoSelector)\n \n if (!videoContent) {\n // Check for embedded video players\n const playerInfo = extractVideoPlayerInfo()\n if (playerInfo) {\n return {\n ...playerInfo,\n type: 'embedded'\n }\n }\n return null\n }\n\n return {\n ...videoContent,\n type: 'native'\n }\n }\n\n /**\n * Extract image content\n * @private\n * @returns {object} Image content\n */\n _extractImageContent() {\n const images = extractImages(this.config.maxImages || 5)\n \n if (images.length === 0) return null\n\n return {\n images,\n primaryImage: images[0],\n count: images.length\n }\n }\n\n /**\n * Generate cache key for content\n * @private\n * @param {object} content - Content object\n * @param {string} mode - Content mode\n * @returns {string} Cache key\n */\n _generateCacheKey(content, mode) {\n let keyString = mode\n\n if (content.url) {\n keyString += `_${content.url}`\n } else if (content.src) {\n keyString += `_${content.src}`\n } else if (content.images) {\n keyString += `_${content.images[0]?.src || ''}`\n }\n\n // Add feature extractors to key\n keyString += `_${this.config.featureExtractors.sort().join('_')}`\n\n return hashString(keyString)\n }\n\n /**\n * Parse context from Mixpeek document response\n * @private\n * @param {object} document - Mixpeek document\n * @param {object} content - Original content\n * @param {string} mode - Content mode\n * @returns {object} Parsed context\n */\n _parseContext(document, content, mode) {\n const context = {\n documentId: document.document_id,\n mode,\n content: {\n url: content.url || content.src || '',\n title: content.title || '',\n type: mode\n }\n }\n\n // Extract taxonomies\n if (document.enrichments && document.enrichments.taxonomies) {\n const taxonomies = document.enrichments.taxonomies\n \n if (taxonomies.length > 0) {\n const primaryTaxonomy = taxonomies[0]\n context.taxonomy = {\n label: primaryTaxonomy.label,\n nodeId: primaryTaxonomy.node_id,\n path: primaryTaxonomy.path,\n score: primaryTaxonomy.score,\n all: taxonomies\n }\n }\n }\n\n // Extract other enrichments\n if (document.enrichments) {\n // Brand safety\n if (document.enrichments.brand_safety) {\n context.brandSafety = document.enrichments.brand_safety\n }\n\n // Keywords\n if (document.enrichments.keywords) {\n context.keywords = document.enrichments.keywords\n }\n\n // Sentiment\n if (document.enrichments.sentiment) {\n context.sentiment = document.enrichments.sentiment\n }\n\n // Embeddings\n if (document.enrichments.embeddings) {\n context.embeddingId = document.enrichments.embeddings[0]?.id || null\n }\n }\n\n return context\n }\n\n /**\n * Inject targeting keys into ad units\n * @private\n * @param {array} adUnits - Ad units\n * @param {object} context - Context data\n * @returns {array} Enriched ad units\n */\n _injectTargetingKeys(adUnits, context) {\n const targetingKeys = this._buildTargetingKeys(context)\n \n logger.info('Targeting keys:', targetingKeys)\n\n return adUnits.map(adUnit => {\n // Add to first-party data (ortb2Imp)\n if (!adUnit.ortb2Imp) {\n adUnit.ortb2Imp = {}\n }\n if (!adUnit.ortb2Imp.ext) {\n adUnit.ortb2Imp.ext = {}\n }\n if (!adUnit.ortb2Imp.ext.data) {\n adUnit.ortb2Imp.ext.data = {}\n }\n\n // Merge targeting keys\n Object.assign(adUnit.ortb2Imp.ext.data, targetingKeys)\n\n // Also add to legacy targeting\n if (!adUnit.bids) {\n adUnit.bids = []\n }\n\n adUnit.bids = adUnit.bids.map(bid => {\n if (!bid.params) {\n bid.params = {}\n }\n if (!bid.params.keywords) {\n bid.params.keywords = {}\n }\n\n Object.assign(bid.params.keywords, targetingKeys)\n return bid\n })\n\n return adUnit\n })\n }\n\n /**\n * Build targeting keys from context\n * @private\n * @param {object} context - Context data\n * @returns {object} Targeting keys\n */\n _buildTargetingKeys(context) {\n const keys = {}\n\n // Taxonomy\n if (context.taxonomy) {\n keys[TARGETING_KEYS.CATEGORY] = context.taxonomy.label\n keys[TARGETING_KEYS.NODE] = context.taxonomy.nodeId\n keys[TARGETING_KEYS.PATH] = Array.isArray(context.taxonomy.path) \n ? context.taxonomy.path.join('/')\n : context.taxonomy.path\n keys[TARGETING_KEYS.SCORE] = context.taxonomy.score.toFixed(2)\n\n // Extract IAB taxonomy code if available\n const iabMatch = context.taxonomy.label.match(/IAB\\d+-\\d+/)\n if (iabMatch) {\n keys[TARGETING_KEYS.TAXONOMY] = iabMatch[0]\n }\n }\n\n // Brand safety\n if (context.brandSafety) {\n keys[TARGETING_KEYS.SAFETY] = typeof context.brandSafety === 'number'\n ? context.brandSafety.toFixed(2)\n : context.brandSafety.score?.toFixed(2) || '0'\n }\n\n // Keywords\n if (context.keywords) {\n keys[TARGETING_KEYS.KEYWORDS] = Array.isArray(context.keywords)\n ? context.keywords.slice(0, 10).join(',')\n : context.keywords\n }\n\n // Sentiment\n if (context.sentiment) {\n keys[TARGETING_KEYS.SENTIMENT] = typeof context.sentiment === 'string'\n ? context.sentiment\n : context.sentiment.label || 'neutral'\n }\n\n // Embedding ID\n if (context.embeddingId) {\n keys[TARGETING_KEYS.EMBED] = context.embeddingId\n }\n\n // Previous ad targeting (non-PII, adjacency awareness)\n const lastAd = previousAdTracker.getLast()\n if (lastAd) {\n if (lastAd.creativeId) {\n keys[TARGETING_KEYS.PREV_AD_CREATIVE_ID] = String(lastAd.creativeId)\n }\n if (lastAd.bidder) {\n keys[TARGETING_KEYS.PREV_AD_BIDDER] = String(lastAd.bidder)\n }\n if (lastAd.adUnitCode) {\n keys[TARGETING_KEYS.PREV_AD_ADUNIT] = String(lastAd.adUnitCode)\n }\n if (Array.isArray(lastAd.categories) && lastAd.categories.length > 0) {\n keys[TARGETING_KEYS.PREV_AD_CAT] = lastAd.categories.slice(0, 5).join(',')\n }\n }\n\n return keys\n }\n\n /**\n * Format context data for OpenRTB 2.6 site.content\n * @param {object} context - Context data\n * @returns {object|null} ortb2 formatted site.content object\n */\n formatForOrtb2SiteContent(context) {\n if (!context) return null\n\n const contentData = {}\n\n // IAB Content Categories\n if (context.taxonomy) {\n const iabCode = getIABFromTaxonomy(context.taxonomy)\n if (iabCode) {\n contentData.cat = [iabCode]\n contentData.cattax = IAB_TAXONOMY_VERSION\n }\n \n // Genre (human-readable category)\n if (context.taxonomy.label) {\n contentData.genre = context.taxonomy.label\n }\n }\n\n // Keywords\n if (context.keywords) {\n contentData.keywords = Array.isArray(context.keywords)\n ? context.keywords.join(',')\n : context.keywords\n }\n\n // Language detection (from page or default)\n if (isBrowser() && document.documentElement.lang) {\n contentData.language = document.documentElement.lang\n }\n\n // Page metadata\n if (isBrowser()) {\n if (document.title) {\n contentData.title = document.title\n }\n if (window.location.href) {\n contentData.url = window.location.href\n }\n }\n\n // Content-specific metadata from context\n if (context.content) {\n if (context.content.url && !contentData.url) {\n contentData.url = context.content.url\n }\n if (context.content.title && !contentData.title) {\n contentData.title = context.content.title\n }\n }\n\n // Extension data (Mixpeek-specific)\n contentData.ext = {\n data: {\n mixpeek: {\n documentId: context.documentId,\n mode: context.mode,\n score: context.taxonomy?.score,\n brandSafety: context.brandSafety,\n sentiment: context.sentiment,\n embeddingId: context.embeddingId\n }\n }\n }\n\n return contentData\n }\n\n /**\n * Format context data for ortb2Fragments (used by RTD modules)\n * @param {object} context - Context data\n * @returns {object|null} ortb2Fragments object\n */\n formatForOrtb2Fragments(context) {\n if (!context) return null\n\n const contentData = this.formatForOrtb2SiteContent(context)\n if (!contentData) return null\n\n return {\n global: {\n site: {\n content: contentData\n }\n }\n }\n }\n\n /**\n * Format context as first-party data segments (alternative format)\n * @param {object} context - Context data\n * @returns {Array} Array of data segments\n */\n formatAsDataSegments(context) {\n if (!context || !context.taxonomy) return []\n\n const segments = []\n\n // Primary taxonomy segment\n const iabCode = getIABFromTaxonomy(context.taxonomy)\n if (iabCode) {\n segments.push({\n id: iabCode,\n name: context.taxonomy.label,\n value: context.taxonomy.score.toString()\n })\n }\n\n // Additional taxonomies if available\n if (context.taxonomy.all && Array.isArray(context.taxonomy.all)) {\n context.taxonomy.all.slice(1, 5).forEach(tax => {\n const code = getIABFromTaxonomy(tax)\n if (code) {\n segments.push({\n id: code,\n name: tax.label,\n value: tax.score.toString()\n })\n }\n })\n }\n\n return segments\n }\n\n /**\n * Register event listener\n * @param {string} event - Event name\n * @param {Function} callback - Callback function\n */\n on(event, callback) {\n if (!this.events[event]) {\n this.events[event] = []\n }\n this.events[event].push(callback)\n }\n\n /**\n * Emit event\n * @private\n * @param {string} event - Event name\n * @param {*} data - Event data\n */\n _emitEvent(event, data) {\n if (this.events[event]) {\n this.events[event].forEach(callback => {\n try {\n callback(data)\n } catch (error) {\n logger.error(`Error in event callback for ${event}:`, error)\n }\n })\n }\n\n // Also emit to window for Prebid integration\n if (isBrowser() && window.pbjs) {\n window.pbjs.emit(event, data)\n }\n }\n\n /**\n * Get current context data\n * @returns {object|null} Context data\n */\n getContextData() {\n return this.contextData\n }\n\n /**\n * Clear cache\n */\n clearCache() {\n cacheManager.clear()\n logger.info('Cache cleared')\n }\n\n /**\n * Get cache statistics\n * @returns {object} Cache stats\n */\n getCacheStats() {\n return cacheManager.getStats()\n }\n\n /**\n * Health check\n * @returns {Promise<object>} Health status\n */\n async healthCheck() {\n if (!this.client) {\n return { status: 'error', message: 'Client not initialized' }\n }\n\n try {\n const health = await this.client.healthCheck()\n return { status: 'ok', ...health }\n } catch (error) {\n return { status: 'error', message: error.message }\n }\n }\n}\n\n// Create singleton instance\nconst adapter = new MixpeekContextAdapter()\n\n// Export adapter instance\nexport default adapter\n\n// Browser global\nif (isBrowser()) {\n window.MixpeekContextAdapter = adapter\n}\n\n"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","DEFAULT_API_ENDPOINT","process","env","MIXPEEK_API_ENDPOINT","window","ENDPOINTS","COLLECTIONS","DOCUMENTS","FEATURES","FEATURE_EXTRACTORS","RETRIEVERS","CONTENT_MODES","CACHE_KEYS","USER_AGENT","concat","Logger","_classCallCheck","debug","prefix","enabled","_console","_len","arguments","length","args","Array","_key","console","log","apply","_console2","_len2","_key2","warn","_console3","_len3","_key3","error","label","group","groupEnd","time","timeEnd","data","table","e","t","r","n","iterator","i","c","Generator","u","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","l","TypeError","done","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","_invoke","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_typeof","constructor","generateUUID","replace","Math","random","toString","isObject","isArray","deepMerge","target","source","output","assign","keys","forEach","toPrimitive","String","_toPrimitive","_toPropertyKey","validateConfig","config","errors","apiKey","push","collectionId","timeout","cacheTTL","valid","code","extractDomain","url","URL","hostname","sanitizeText","text","trim","isBrowser","document","safeJSONParse","json","fallback","undefined","JSON","parse","logger","retryWithBackoff","_x","_retryWithBackoff","_callee","fn","maxAttempts","delay","lastError","_loop","_ret","attempt","_args2","_context2","backoffDelay","_t","_t2","_context","pow","setTimeout","_regeneratorValues","_next","_throw","ms","_","reject","Error","withTimeout","promise","race","getTimestamp","floor","Date","now","isExpired","timestamp","ttl","CacheManager","memoryCache","Map","useLocalStorage","_checkLocalStorageAvailable","test","localStorage","setItem","removeItem","cacheKey","_getCacheKey","has","item","info","getItem","parsed","set","stringify","clear","startsWith","localStorageSize","localStorageCount","memoryCount","size","_step","_this","pruned","_iterator","_createForOfIteratorHelper","entries","s","_step$value","_slicedToArray","err","ownKeys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","_objectSpread","_defineProperty","getOwnPropertyDescriptors","defineProperties","_asyncToGenerator","_defineProperties","MixpeekClient","endpoint","namespace","retryAttempts","headers","_request2","path","options","fetchOptions","response","_args","_buildHeaders","method","fetch","ok","_handleErrorResponse","status","message","_handleErrorResponse2","_callee2","errorMessage","errorData","statusText","_x2","_createDocument","_callee3","payload","requestPayload","_context3","object_id","objectId","metadata","features","_request","body","_x3","_x4","_getDocument","_callee4","documentId","_context4","_x5","_x6","_processContent","_callee5","content","featureExtractors","_t3","_this2","_args5","_context5","map","extractor","feature","feature_extractor_id","_buildFeaturePayload","createDocument","_generateContentId","title","document_id","_x7","_x8","src","duration","video_url","description","width","height","image_url","alt_text","alt","split","_listFeatureExtractors","_callee6","_context6","_getFeatureExtractor","_callee7","extractorId","_context7","_x9","_healthCheck","_callee8","_context8","extractHeadline","article","_ref","h1","querySelector","headline","textContent","extractAuthor","author","extractPublishDate","dateEl","getAttribute","isArticlePage","getVideoSource","video","currentSrc","extractVideoTitle","_video$previousElemen","_video$parentElement","container","closest","heading","previousElementSibling","parentElement","extractVideoDescription","desc","extractVideoMetadata","from","attributes","attr","name","calculateAspectRatio","img","naturalWidth","naturalHeight","MIXPEEK_NODE_TO_IAB","LABEL_TO_IAB","isValidIABCode","extractIABCode","match","getIABFromTaxonomy","taxonomy","iabInLabel","nodeId","node_id","iabInNode","toLowerCase","normalizedNode","_i","_Object$entries","_Object$entries$_i","_i2","_Object$entries2","_Object$entries2$_i","includes","pathString","join","_i3","_Object$entries3","_Object$entries3$_i","STORAGE_KEY","PreviousAdTracker","lastAd","storageAvailable","_checkLocalStorage","_loadFromStorage","k","raw","bidResponse","_bidResponse$meta","_bidResponse$meta2","creativeId","creative_id","bidder","bidderCode","adUnitCode","cpm","currency","categories","meta","adServerCatId","primaryCat","_persist","adapter","MixpeekContextAdapter","client","initialized","processing","contextData","events","healthCheckPerformed","_init","validation","healthResult","mode","enableCache","healthCheck","batchSize","setDebug","cacheManager","setTTL","_performHealthCheck","healthy","_performHealthCheck2","startTime","health","performance","version","latency","round","_enrichAdUnits","adUnits","context","enrichedAdUnits","getContext","_injectTargetingKeys","toFixed","_emitEvent","_getContext","cached","_document","_detectContentMode","_extractContent","_generateCacheKey","processContent","_parseContext","images","querySelectorAll","some","_extractContent2","_t4","_extractVideoContent","_extractImageContent","_extractPageContent","pageContent","location","href","domain","metaDesc","clone","cloneNode","el","remove","maxLength","substring","truncateText","innerText","keywords","metaKeywords","Boolean","ogTags","tag","property","structuredData","script","language","documentElement","lang","textLength","extractPageContent","articleContent","datePublished","extractArticleContent","ogImage","_document$querySelect","_document$querySelect2","_document$querySelect3","parseInt","extractOGImage","featuredImage","videoContent","selector","videos","sort","b","aSize","videoWidth","videoHeight","findVideoElements","poster","currentTime","dimensions","extractVideoContent","videoSelector","playerInfo","ytPlayer","videoIdMatch","platform","videoId","vimeoPlayer","extractVideoPlayerInfo","type","maxImages","extracted","style","getComputedStyle","display","visibility","slice","aspectRatio","extractImages","primaryImage","count","keyString","_content$images$","str","hash","charCodeAt","abs","hashString","_document$enrichments","enrichments","taxonomies","primaryTaxonomy","score","all","brand_safety","brandSafety","sentiment","embeddings","embeddingId","id","targetingKeys","_buildTargetingKeys","adUnit","ortb2Imp","ext","bids","bid","params","_context$brandSafety$","iabMatch","previousAdTracker","getLast","_context$taxonomy","contentData","iabCode","cat","cattax","genre","mixpeek","formatForOrtb2SiteContent","global","site","segments","tax","event","callback","pbjs","emit","getStats","_t5"],"sourceRoot":""}
1
+ {"version":3,"file":"mixpeekContextAdapter.js","mappings":"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","sources":["webpack://MixpeekContextAdapter/webpack/universalModuleDefinition","webpack://MixpeekContextAdapter/webpack/bootstrap","webpack://MixpeekContextAdapter/webpack/runtime/define property getters","webpack://MixpeekContextAdapter/webpack/runtime/hasOwnProperty shorthand","webpack://MixpeekContextAdapter/webpack/runtime/make namespace object","webpack://MixpeekContextAdapter/./src/config/constants.js","webpack://MixpeekContextAdapter/./src/utils/logger.js","webpack://MixpeekContextAdapter/./src/utils/helpers.js","webpack://MixpeekContextAdapter/./src/cache/cacheManager.js","webpack://MixpeekContextAdapter/./src/api/mixpeekClient.js","webpack://MixpeekContextAdapter/./src/extractors/pageExtractor.js","webpack://MixpeekContextAdapter/./src/extractors/videoExtractor.js","webpack://MixpeekContextAdapter/./src/extractors/imageExtractor.js","webpack://MixpeekContextAdapter/./src/utils/iabMapping.js","webpack://MixpeekContextAdapter/./src/utils/previousAdTracker.js","webpack://MixpeekContextAdapter/./src/modules/mixpeekContextAdapter.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"MixpeekContextAdapter\"] = factory();\n\telse\n\t\troot[\"MixpeekContextAdapter\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * Mixpeek Context Adapter - Constants\n * @module config/constants\n */\n\nexport const MIXPEEK_MODULE_NAME = 'mixpeek'\nexport const MIXPEEK_VERSION = '1.0.0'\n\n// API Configuration\n// Use MIXPEEK_API_ENDPOINT environment variable or default to production\nexport const DEFAULT_API_ENDPOINT = typeof process !== 'undefined' && process.env && process.env.MIXPEEK_API_ENDPOINT\n ? process.env.MIXPEEK_API_ENDPOINT\n : (typeof window !== 'undefined' && window.MIXPEEK_API_ENDPOINT\n ? window.MIXPEEK_API_ENDPOINT\n : 'https://api.mixpeek.com')\n\n// Alternative endpoints\nexport const API_ENDPOINTS = {\n PRODUCTION: 'https://api.mixpeek.com',\n DEVELOPMENT: 'https://api.mixpeek.com',\n LOCAL: 'http://localhost:8000'\n}\n\nexport const DEFAULT_TIMEOUT = 250 // milliseconds\nexport const DEFAULT_CACHE_TTL = 300 // seconds\nexport const DEFAULT_RETRY_ATTEMPTS = 2\nexport const DEFAULT_BATCH_SIZE = 1\n\n// API Endpoints\nexport const ENDPOINTS = {\n COLLECTIONS: '/v1/collections',\n DOCUMENTS: '/v1/collections/{collectionId}/documents',\n FEATURES: '/v1/collections/{collectionId}/documents/{documentId}/features',\n FEATURE_EXTRACTORS: '/v1/collections/features/extractors',\n RETRIEVERS: '/v1/retrievers/debug-inference'\n}\n\n// Content Modes\nexport const CONTENT_MODES = {\n AUTO: 'auto',\n PAGE: 'page',\n VIDEO: 'video',\n IMAGE: 'image'\n}\n\n// Feature Extractors (actual Mixpeek API extractors)\nexport const FEATURE_EXTRACTORS = {\n // Actual Mixpeek extractors\n TEXT: 'text_extractor_v1',\n SENTIMENT: 'sentiment_classifier_v1',\n IMAGE: 'image_extractor_v1',\n MULTIMODAL: 'multimodal_extractor_v1',\n // Legacy aliases for backwards compatibility\n TAXONOMY: 'text_extractor_v1',\n BRAND_SAFETY: 'sentiment_classifier_v1',\n KEYWORDS: 'text_extractor_v1',\n CLUSTERING: 'text_extractor_v1',\n EMBEDDING: 'text_extractor_v1'\n}\n\n// Targeting Key Prefixes\nexport const TARGETING_KEYS = {\n TAXONOMY: 'hb_mixpeek_taxonomy',\n CATEGORY: 'hb_mixpeek_category',\n NODE: 'hb_mixpeek_node',\n PATH: 'hb_mixpeek_path',\n SCORE: 'hb_mixpeek_score',\n SAFETY: 'hb_mixpeek_safety',\n KEYWORDS: 'hb_mixpeek_keywords',\n EMBED: 'hb_mixpeek_embed',\n SENTIMENT: 'hb_mixpeek_sentiment',\n // Previous ad context\n PREV_AD_CREATIVE_ID: 'hb_mixpeek_prev_creative',\n PREV_AD_BIDDER: 'hb_mixpeek_prev_bidder',\n PREV_AD_ADUNIT: 'hb_mixpeek_prev_adunit',\n PREV_AD_CAT: 'hb_mixpeek_prev_cat'\n}\n\n// Error Codes\nexport const ERROR_CODES = {\n INVALID_CONFIG: 'INVALID_CONFIG',\n API_TIMEOUT: 'API_TIMEOUT',\n API_ERROR: 'API_ERROR',\n NETWORK_ERROR: 'NETWORK_ERROR',\n INVALID_RESPONSE: 'INVALID_RESPONSE',\n MISSING_CONTENT: 'MISSING_CONTENT',\n CACHE_ERROR: 'CACHE_ERROR'\n}\n\n// Cache Configuration\nexport const CACHE_KEYS = {\n PREFIX: 'mixpeek_ctx_',\n VERSION: 'v1'\n}\n\n// Performance Thresholds\nexport const PERFORMANCE = {\n MAX_LATENCY: 250, // ms\n WARN_LATENCY: 100, // ms\n MAX_CONTENT_SIZE: 50000 // characters\n}\n\n// Default Feature Extractor Configurations\nexport const DEFAULT_EXTRACTORS = [\n {\n type: FEATURE_EXTRACTORS.TAXONOMY,\n enabled: true\n }\n]\n\n// Event Names\nexport const EVENTS = {\n CONTEXT_READY: 'mixpeekContextReady',\n CONTEXT_ERROR: 'mixpeekContextError',\n CONTEXT_CACHED: 'mixpeekContextCached',\n API_REQUEST: 'mixpeekApiRequest',\n API_RESPONSE: 'mixpeekApiResponse'\n}\n\n// HTTP Headers\nexport const HEADERS = {\n AUTHORIZATION: 'Authorization',\n NAMESPACE: 'X-Namespace',\n CONTENT_TYPE: 'Content-Type',\n USER_AGENT: 'User-Agent'\n}\n\n// User Agent\nexport const USER_AGENT = `Mixpeek-Prebid-Adapter/${MIXPEEK_VERSION}`\n\n","/**\n * Mixpeek Context Adapter - Logger Utility\n * @module utils/logger\n */\n\nimport { MIXPEEK_MODULE_NAME } from '../config/constants.js'\n\nclass Logger {\n constructor() {\n this.debug = false\n this.prefix = `[${MIXPEEK_MODULE_NAME}]`\n }\n\n setDebug(enabled) {\n this.debug = enabled\n }\n\n info(...args) {\n if (this.debug) {\n console.log(this.prefix, ...args)\n }\n }\n\n warn(...args) {\n console.warn(this.prefix, ...args)\n }\n\n error(...args) {\n console.error(this.prefix, ...args)\n }\n\n group(label) {\n if (this.debug && console.group) {\n console.group(`${this.prefix} ${label}`)\n }\n }\n\n groupEnd() {\n if (this.debug && console.groupEnd) {\n console.groupEnd()\n }\n }\n\n time(label) {\n if (this.debug && console.time) {\n console.time(`${this.prefix} ${label}`)\n }\n }\n\n timeEnd(label) {\n if (this.debug && console.timeEnd) {\n console.timeEnd(`${this.prefix} ${label}`)\n }\n }\n\n table(data) {\n if (this.debug && console.table) {\n console.table(data)\n }\n }\n}\n\nexport default new Logger()\n\n","/**\n * Mixpeek Context Adapter - Helper Utilities\n * @module utils/helpers\n */\n\nimport { ERROR_CODES, PERFORMANCE } from '../config/constants.js'\nimport logger from './logger.js'\n\n/**\n * Generate a unique identifier\n * @returns {string} UUID v4\n */\nexport function generateUUID() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0\n const v = c === 'x' ? r : (r & 0x3 | 0x8)\n return v.toString(16)\n })\n}\n\n/**\n * Generate a hash from a string\n * @param {string} str - String to hash\n * @returns {string} Hash\n */\nexport function hashString(str) {\n let hash = 0\n if (str.length === 0) return hash.toString()\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash // Convert to 32bit integer\n }\n return Math.abs(hash).toString(36)\n}\n\n/**\n * Check if a value is a valid object\n * @param {*} value - Value to check\n * @returns {boolean}\n */\nexport function isObject(value) {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\n/**\n * Deep merge two objects\n * @param {object} target - Target object\n * @param {object} source - Source object\n * @returns {object} Merged object\n */\nexport function deepMerge(target, source) {\n const output = Object.assign({}, target)\n if (isObject(target) && isObject(source)) {\n Object.keys(source).forEach(key => {\n if (isObject(source[key])) {\n if (!(key in target)) {\n Object.assign(output, { [key]: source[key] })\n } else {\n output[key] = deepMerge(target[key], source[key])\n }\n } else {\n Object.assign(output, { [key]: source[key] })\n }\n })\n }\n return output\n}\n\n/**\n * Validate configuration\n * @param {object} config - Configuration object\n * @returns {object} Validation result\n */\nexport function validateConfig(config) {\n const errors = []\n\n if (!config.apiKey || typeof config.apiKey !== 'string') {\n errors.push('apiKey is required and must be a string')\n }\n\n if (!config.collectionId || typeof config.collectionId !== 'string') {\n errors.push('collectionId is required and must be a string')\n }\n\n if (config.timeout && (typeof config.timeout !== 'number' || config.timeout < 0)) {\n errors.push('timeout must be a positive number')\n }\n\n if (config.cacheTTL && (typeof config.cacheTTL !== 'number' || config.cacheTTL < 0)) {\n errors.push('cacheTTL must be a positive number')\n }\n\n if (errors.length > 0) {\n return {\n valid: false,\n errors,\n code: ERROR_CODES.INVALID_CONFIG\n }\n }\n\n return { valid: true }\n}\n\n/**\n * Truncate text to max length\n * @param {string} text - Text to truncate\n * @param {number} maxLength - Maximum length\n * @returns {string} Truncated text\n */\nexport function truncateText(text, maxLength = PERFORMANCE.MAX_CONTENT_SIZE) {\n if (!text || text.length <= maxLength) return text\n logger.warn(`Content truncated from ${text.length} to ${maxLength} characters`)\n return text.substring(0, maxLength)\n}\n\n/**\n * Extract domain from URL\n * @param {string} url - URL to extract domain from\n * @returns {string} Domain\n */\nexport function extractDomain(url) {\n try {\n const urlObj = new URL(url)\n return urlObj.hostname\n } catch (e) {\n return ''\n }\n}\n\n/**\n * Sanitize text content\n * @param {string} text - Text to sanitize\n * @returns {string} Sanitized text\n */\nexport function sanitizeText(text) {\n if (!text) return ''\n return text\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .replace(/[\\r\\n\\t]/g, ' ') // Remove newlines and tabs\n .trim()\n}\n\n/**\n * Check if running in browser environment\n * @returns {boolean}\n */\nexport function isBrowser() {\n return typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\n/**\n * Parse JSON safely\n * @param {string} json - JSON string\n * @param {*} fallback - Fallback value\n * @returns {*} Parsed JSON or fallback\n */\nexport function safeJSONParse(json, fallback = null) {\n try {\n return JSON.parse(json)\n } catch (e) {\n logger.warn('Failed to parse JSON:', e)\n return fallback\n }\n}\n\n/**\n * Retry a function with exponential backoff\n * @param {Function} fn - Function to retry\n * @param {number} maxAttempts - Maximum number of attempts\n * @param {number} delay - Initial delay in ms\n * @returns {Promise} Result of function\n */\nexport async function retryWithBackoff(fn, maxAttempts = 3, delay = 100) {\n let lastError\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn()\n } catch (error) {\n lastError = error\n if (attempt < maxAttempts) {\n const backoffDelay = delay * Math.pow(2, attempt - 1)\n logger.warn(`Attempt ${attempt} failed, retrying in ${backoffDelay}ms...`)\n await new Promise(resolve => setTimeout(resolve, backoffDelay))\n }\n }\n }\n throw lastError\n}\n\n/**\n * Create a timeout promise\n * @param {number} ms - Timeout in milliseconds\n * @returns {Promise} Timeout promise\n */\nexport function timeout(ms) {\n return new Promise((_, reject) => {\n setTimeout(() => reject(new Error('Timeout')), ms)\n })\n}\n\n/**\n * Race a promise against a timeout\n * @param {Promise} promise - Promise to race\n * @param {number} ms - Timeout in milliseconds\n * @returns {Promise} Result or timeout error\n */\nexport function withTimeout(promise, ms) {\n return Promise.race([promise, timeout(ms)])\n}\n\n/**\n * Format taxonomy path\n * @param {array} path - Taxonomy path array\n * @returns {string} Formatted path\n */\nexport function formatTaxonomyPath(path) {\n if (!Array.isArray(path) || path.length === 0) return ''\n return path.join('/')\n}\n\n/**\n * Extract keywords from text\n * @param {string} text - Text to extract keywords from\n * @param {number} maxKeywords - Maximum number of keywords\n * @returns {array} Array of keywords\n */\nexport function extractKeywords(text, maxKeywords = 10) {\n if (!text) return []\n \n // Simple keyword extraction (in production, use NLP libraries)\n const words = text.toLowerCase()\n .replace(/[^a-z0-9\\s]/g, ' ')\n .split(/\\s+/)\n .filter(word => word.length > 3)\n \n // Get unique words\n const uniqueWords = [...new Set(words)]\n \n // Return top N keywords\n return uniqueWords.slice(0, maxKeywords)\n}\n\n/**\n * Get current timestamp\n * @returns {number} Timestamp in seconds\n */\nexport function getTimestamp() {\n return Math.floor(Date.now() / 1000)\n}\n\n/**\n * Check if value is expired\n * @param {number} timestamp - Timestamp in seconds\n * @param {number} ttl - TTL in seconds\n * @returns {boolean} True if expired\n */\nexport function isExpired(timestamp, ttl) {\n return getTimestamp() - timestamp > ttl\n}\n\n","/**\n * Mixpeek Context Adapter - Cache Manager\n * @module cache/cacheManager\n */\n\nimport { CACHE_KEYS, DEFAULT_CACHE_TTL } from '../config/constants.js'\nimport { getTimestamp, isExpired, safeJSONParse } from '../utils/helpers.js'\nimport logger from '../utils/logger.js'\n\nclass CacheManager {\n constructor() {\n this.memoryCache = new Map()\n this.useLocalStorage = this._checkLocalStorageAvailable()\n this.ttl = DEFAULT_CACHE_TTL\n }\n\n /**\n * Check if localStorage is available\n * @private\n * @returns {boolean}\n */\n _checkLocalStorageAvailable() {\n try {\n const test = '__mixpeek_test__'\n localStorage.setItem(test, test)\n localStorage.removeItem(test)\n return true\n } catch (e) {\n logger.warn('localStorage not available, using memory cache only')\n return false\n }\n }\n\n /**\n * Generate cache key\n * @private\n * @param {string} key - Key\n * @returns {string} Cache key\n */\n _getCacheKey(key) {\n return `${CACHE_KEYS.PREFIX}${CACHE_KEYS.VERSION}_${key}`\n }\n\n /**\n * Set TTL\n * @param {number} ttl - TTL in seconds\n */\n setTTL(ttl) {\n this.ttl = ttl\n }\n\n /**\n * Get item from cache\n * @param {string} key - Cache key\n * @returns {object|null} Cached value or null\n */\n get(key) {\n const cacheKey = this._getCacheKey(key)\n \n // Try memory cache first\n if (this.memoryCache.has(cacheKey)) {\n const item = this.memoryCache.get(cacheKey)\n if (!isExpired(item.timestamp, this.ttl)) {\n logger.info('Cache hit (memory):', key)\n return item.data\n } else {\n logger.info('Cache expired (memory):', key)\n this.memoryCache.delete(cacheKey)\n }\n }\n\n // Try localStorage\n if (this.useLocalStorage) {\n try {\n const item = localStorage.getItem(cacheKey)\n if (item) {\n const parsed = safeJSONParse(item)\n if (parsed && !isExpired(parsed.timestamp, this.ttl)) {\n logger.info('Cache hit (localStorage):', key)\n // Promote to memory cache\n this.memoryCache.set(cacheKey, parsed)\n return parsed.data\n } else {\n logger.info('Cache expired (localStorage):', key)\n localStorage.removeItem(cacheKey)\n }\n }\n } catch (e) {\n logger.warn('Error reading from localStorage:', e)\n }\n }\n\n logger.info('Cache miss:', key)\n return null\n }\n\n /**\n * Set item in cache\n * @param {string} key - Cache key\n * @param {*} data - Data to cache\n * @returns {boolean} Success\n */\n set(key, data) {\n const cacheKey = this._getCacheKey(key)\n const item = {\n data,\n timestamp: getTimestamp()\n }\n\n try {\n // Store in memory cache\n this.memoryCache.set(cacheKey, item)\n\n // Store in localStorage\n if (this.useLocalStorage) {\n localStorage.setItem(cacheKey, JSON.stringify(item))\n }\n\n logger.info('Cached:', key)\n return true\n } catch (e) {\n logger.warn('Error setting cache:', e)\n return false\n }\n }\n\n /**\n * Remove item from cache\n * @param {string} key - Cache key\n * @returns {boolean} Success\n */\n remove(key) {\n const cacheKey = this._getCacheKey(key)\n \n try {\n this.memoryCache.delete(cacheKey)\n if (this.useLocalStorage) {\n localStorage.removeItem(cacheKey)\n }\n logger.info('Cache removed:', key)\n return true\n } catch (e) {\n logger.warn('Error removing cache:', e)\n return false\n }\n }\n\n /**\n * Clear all cache\n * @returns {boolean} Success\n */\n clear() {\n try {\n this.memoryCache.clear()\n \n if (this.useLocalStorage) {\n const keys = Object.keys(localStorage)\n keys.forEach(key => {\n if (key.startsWith(CACHE_KEYS.PREFIX)) {\n localStorage.removeItem(key)\n }\n })\n }\n \n logger.info('Cache cleared')\n return true\n } catch (e) {\n logger.warn('Error clearing cache:', e)\n return false\n }\n }\n\n /**\n * Get cache stats\n * @returns {object} Cache statistics\n */\n getStats() {\n let localStorageSize = 0\n let localStorageCount = 0\n\n if (this.useLocalStorage) {\n try {\n const keys = Object.keys(localStorage)\n keys.forEach(key => {\n if (key.startsWith(CACHE_KEYS.PREFIX)) {\n localStorageCount++\n localStorageSize += localStorage.getItem(key).length\n }\n })\n } catch (e) {\n logger.warn('Error getting cache stats:', e)\n }\n }\n\n return {\n memoryCount: this.memoryCache.size,\n localStorageCount,\n localStorageSize,\n ttl: this.ttl\n }\n }\n\n /**\n * Prune expired items\n * @returns {number} Number of items pruned\n */\n prune() {\n let pruned = 0\n\n // Prune memory cache\n for (const [key, item] of this.memoryCache.entries()) {\n if (isExpired(item.timestamp, this.ttl)) {\n this.memoryCache.delete(key)\n pruned++\n }\n }\n\n // Prune localStorage\n if (this.useLocalStorage) {\n try {\n const keys = Object.keys(localStorage)\n keys.forEach(key => {\n if (key.startsWith(CACHE_KEYS.PREFIX)) {\n const item = safeJSONParse(localStorage.getItem(key))\n if (item && isExpired(item.timestamp, this.ttl)) {\n localStorage.removeItem(key)\n pruned++\n }\n }\n })\n } catch (e) {\n logger.warn('Error pruning cache:', e)\n }\n }\n\n if (pruned > 0) {\n logger.info(`Pruned ${pruned} expired cache items`)\n }\n\n return pruned\n }\n}\n\nexport default new CacheManager()\n\n","/**\n * Mixpeek Context Adapter - API Client\n * @module api/mixpeekClient\n */\n\nimport {\n DEFAULT_API_ENDPOINT,\n DEFAULT_TIMEOUT,\n DEFAULT_RETRY_ATTEMPTS,\n ENDPOINTS,\n HEADERS,\n USER_AGENT,\n ERROR_CODES\n} from '../config/constants.js'\nimport { withTimeout, retryWithBackoff, generateUUID } from '../utils/helpers.js'\nimport logger from '../utils/logger.js'\n\nclass MixpeekClient {\n constructor(config = {}) {\n this.apiKey = config.apiKey || ''\n this.endpoint = config.endpoint || DEFAULT_API_ENDPOINT\n this.namespace = config.namespace || null\n this.timeout = config.timeout || DEFAULT_TIMEOUT\n this.retryAttempts = config.retryAttempts || DEFAULT_RETRY_ATTEMPTS\n }\n\n /**\n * Configure the client\n * @param {object} config - Configuration object\n */\n configure(config) {\n Object.assign(this, config)\n }\n\n /**\n * Build headers for API request\n * @private\n * @param {boolean} requireNamespace - Whether namespace header is required\n * @returns {object} Headers object\n */\n _buildHeaders(requireNamespace = true) {\n const headers = {\n [HEADERS.CONTENT_TYPE]: 'application/json',\n [HEADERS.AUTHORIZATION]: `Bearer ${this.apiKey}`,\n [HEADERS.USER_AGENT]: USER_AGENT\n }\n\n // Add namespace header (required for most endpoints)\n if (this.namespace && requireNamespace) {\n headers[HEADERS.NAMESPACE] = this.namespace\n }\n\n return headers\n }\n\n /**\n * Make API request\n * @private\n * @param {string} path - API path\n * @param {object} options - Fetch options\n * @returns {Promise} Response data\n */\n async _request(path, options = {}) {\n const url = `${this.endpoint}${path}`\n const headers = this._buildHeaders()\n\n const fetchOptions = {\n ...options,\n headers: {\n ...headers,\n ...options.headers\n }\n }\n\n logger.info(`API Request: ${options.method || 'GET'} ${url}`)\n logger.time(`API Request: ${path}`)\n\n try {\n const response = await withTimeout(\n fetch(url, fetchOptions),\n this.timeout\n )\n\n logger.timeEnd(`API Request: ${path}`)\n\n if (!response.ok) {\n const error = await this._handleErrorResponse(response)\n throw error\n }\n\n const data = await response.json()\n logger.info('API Response:', { status: response.status, path })\n return data\n } catch (error) {\n logger.timeEnd(`API Request: ${path}`)\n \n if (error.message === 'Timeout') {\n throw {\n code: ERROR_CODES.API_TIMEOUT,\n message: `Request timeout after ${this.timeout}ms`,\n path\n }\n }\n\n throw error\n }\n }\n\n /**\n * Handle error response\n * @private\n * @param {Response} response - Fetch response\n * @returns {object} Error object\n */\n async _handleErrorResponse(response) {\n let errorMessage = `API error: ${response.status} ${response.statusText}`\n \n try {\n const errorData = await response.json()\n errorMessage = errorData.message || errorData.error || errorMessage\n } catch (e) {\n // Response body is not JSON\n }\n\n return {\n code: ERROR_CODES.API_ERROR,\n message: errorMessage,\n status: response.status\n }\n }\n\n /**\n * Create a document in a collection\n * @param {string} collectionId - Collection ID\n * @param {object} payload - Document payload\n * @returns {Promise} Document data\n */\n async createDocument(collectionId, payload) {\n const path = ENDPOINTS.DOCUMENTS.replace('{collectionId}', collectionId)\n\n // Build request payload according to Mixpeek API spec\n const requestPayload = {\n collection_id: collectionId,\n ...payload.metadata\n }\n\n // Add content field if provided\n if (payload.content) {\n requestPayload.content = payload.content\n }\n\n return retryWithBackoff(\n () => this._request(path, {\n method: 'POST',\n body: JSON.stringify(requestPayload)\n }),\n this.retryAttempts\n )\n }\n\n /**\n * Get document by ID\n * @param {string} collectionId - Collection ID\n * @param {string} documentId - Document ID\n * @returns {Promise} Document data\n */\n async getDocument(collectionId, documentId) {\n const path = `${ENDPOINTS.DOCUMENTS.replace('{collectionId}', collectionId)}/${documentId}`\n return this._request(path, { method: 'GET' })\n }\n\n /**\n * Process content with feature extractors\n * @param {string} collectionId - Collection ID\n * @param {object} content - Content to process\n * @param {array} featureExtractors - Feature extractors to use (optional, for future use)\n * @returns {Promise} Enriched document with context data\n */\n async processContent(collectionId, content, featureExtractors = []) {\n logger.group('Processing content with Mixpeek')\n logger.info('Collection:', collectionId)\n logger.info('Content URL:', content.url)\n\n try {\n // Create document in collection\n const document = await this.createDocument(collectionId, {\n content: content.text || content.description || '',\n metadata: {\n url: content.url,\n title: content.title,\n timestamp: Date.now()\n }\n })\n\n logger.info('Document created:', document.document_id)\n\n // Build enrichments from content analysis (client-side fallback)\n // In future versions, this will use Mixpeek's taxonomy and classification APIs\n const enrichments = this._buildLocalEnrichments(content)\n\n logger.groupEnd()\n\n return {\n document_id: document.document_id,\n collection_id: document.collection_id,\n enrichments\n }\n } catch (error) {\n logger.error('Error processing content:', error)\n logger.groupEnd()\n\n // Return fallback enrichments on API error (graceful degradation)\n return {\n document_id: null,\n collection_id: collectionId,\n enrichments: this._buildLocalEnrichments(content)\n }\n }\n }\n\n /**\n * Build local enrichments from content (client-side analysis)\n * This provides basic contextual data when API processing is unavailable\n * @private\n * @param {object} content - Content object\n * @returns {object} Enrichments object\n */\n _buildLocalEnrichments(content) {\n const enrichments = {}\n\n // Extract keywords from content\n if (content.text) {\n enrichments.keywords = this._extractKeywords(content.text)\n }\n\n // Analyze sentiment (basic)\n if (content.text) {\n enrichments.sentiment = this._analyzeSentiment(content.text)\n }\n\n // Generate content hash as embedding ID\n enrichments.embeddings = [{\n id: `emb_${this._generateContentId(content)}`\n }]\n\n return enrichments\n }\n\n /**\n * Extract keywords from text (simple implementation)\n * @private\n * @param {string} text - Text content\n * @returns {array} Array of keywords\n */\n _extractKeywords(text) {\n if (!text) return []\n\n // Simple keyword extraction: common important words\n const stopWords = new Set(['the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could', 'should', 'may', 'might', 'must', 'shall', 'can', 'need', 'dare', 'ought', 'used', 'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from', 'as', 'into', 'through', 'during', 'before', 'after', 'above', 'below', 'between', 'under', 'again', 'further', 'then', 'once', 'here', 'there', 'when', 'where', 'why', 'how', 'all', 'each', 'few', 'more', 'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 's', 't', 'just', 'don', 'now', 'and', 'but', 'or', 'if', 'this', 'that', 'these', 'those', 'it', 'its'])\n\n const words = text.toLowerCase()\n .replace(/[^\\w\\s]/g, ' ')\n .split(/\\s+/)\n .filter(word => word.length > 3 && !stopWords.has(word))\n\n // Count word frequency\n const wordCount = {}\n words.forEach(word => {\n wordCount[word] = (wordCount[word] || 0) + 1\n })\n\n // Return top 10 keywords by frequency\n return Object.entries(wordCount)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([word]) => word)\n }\n\n /**\n * Basic sentiment analysis\n * @private\n * @param {string} text - Text content\n * @returns {object} Sentiment result\n */\n _analyzeSentiment(text) {\n if (!text) return { label: 'neutral', score: 0.5 }\n\n const positiveWords = ['good', 'great', 'excellent', 'amazing', 'wonderful', 'fantastic', 'best', 'love', 'happy', 'positive', 'success', 'win', 'awesome', 'brilliant', 'perfect', 'beautiful', 'enjoy', 'exciting']\n const negativeWords = ['bad', 'terrible', 'awful', 'horrible', 'worst', 'hate', 'sad', 'negative', 'fail', 'loss', 'poor', 'ugly', 'boring', 'disappointing', 'wrong', 'problem', 'issue', 'error']\n\n const lowerText = text.toLowerCase()\n let positiveCount = 0\n let negativeCount = 0\n\n positiveWords.forEach(word => {\n const regex = new RegExp(`\\\\b${word}\\\\b`, 'gi')\n const matches = lowerText.match(regex)\n if (matches) positiveCount += matches.length\n })\n\n negativeWords.forEach(word => {\n const regex = new RegExp(`\\\\b${word}\\\\b`, 'gi')\n const matches = lowerText.match(regex)\n if (matches) negativeCount += matches.length\n })\n\n const total = positiveCount + negativeCount\n if (total === 0) return { label: 'neutral', score: 0.5 }\n\n const score = positiveCount / total\n let label = 'neutral'\n if (score > 0.6) label = 'positive'\n else if (score < 0.4) label = 'negative'\n\n return { label, score }\n }\n\n /**\n * Build feature payload from content\n * @private\n * @param {object} content - Content object\n * @returns {object} Feature payload\n */\n _buildFeaturePayload(content) {\n const payload = {}\n\n // Add text content\n if (content.text) {\n payload.text = content.text\n }\n\n // Add URL\n if (content.url) {\n payload.url = content.url\n }\n\n // Add video URL\n if (content.src && content.duration !== undefined) {\n // This is video content\n payload.video_url = content.src\n payload.title = content.title\n payload.description = content.description\n }\n\n // Add image URL\n if (content.src && content.width && content.height && !content.duration) {\n // This is image content\n payload.image_url = content.src\n payload.alt_text = content.alt\n }\n\n // Add metadata\n if (content.metadata) {\n payload.metadata = content.metadata\n }\n\n return payload\n }\n\n /**\n * Generate content ID for caching\n * @private\n * @param {object} content - Content object\n * @returns {string} Content ID\n */\n _generateContentId(content) {\n if (content.url) {\n return `url_${content.url.split('?')[0]}` // Remove query params\n }\n if (content.src) {\n return `src_${content.src.split('?')[0]}`\n }\n return generateUUID()\n }\n\n /**\n * List available feature extractors\n * @returns {Promise} Feature extractors list\n */\n async listFeatureExtractors() {\n return this._request(ENDPOINTS.FEATURE_EXTRACTORS, { method: 'GET' })\n }\n\n /**\n * Get feature extractor details\n * @param {string} extractorId - Feature extractor ID\n * @returns {Promise} Feature extractor details\n */\n async getFeatureExtractor(extractorId) {\n const path = ENDPOINTS.FEATURE_EXTRACTORS + `/${extractorId}`\n return this._request(path, { method: 'GET' })\n }\n\n /**\n * Health check\n * @returns {Promise} Health status\n */\n async healthCheck() {\n return this._request('/v1/health', { method: 'GET' })\n }\n}\n\nexport default MixpeekClient\n\n","/**\n * Mixpeek Context Adapter - Page Content Extractor\n * @module extractors/pageExtractor\n */\n\nimport { PERFORMANCE } from '../config/constants.js'\nimport { sanitizeText, truncateText, extractDomain } from '../utils/helpers.js'\nimport logger from '../utils/logger.js'\n\n/**\n * Extract content from the current page\n * @returns {object} Extracted page content\n */\nexport function extractPageContent() {\n logger.time('extractPageContent')\n\n try {\n const content = {\n url: window.location.href,\n domain: extractDomain(window.location.href),\n title: document.title,\n description: extractMetaDescription(),\n text: extractBodyText(),\n keywords: extractMetaKeywords(),\n ogTags: extractOpenGraphTags(),\n structuredData: extractStructuredData(),\n language: document.documentElement.lang || 'en'\n }\n\n logger.timeEnd('extractPageContent')\n logger.info('Extracted page content:', {\n url: content.url,\n textLength: content.text.length,\n keywords: content.keywords.length\n })\n\n return content\n } catch (error) {\n logger.error('Error extracting page content:', error)\n logger.timeEnd('extractPageContent')\n return null\n }\n}\n\n/**\n * Extract meta description\n * @private\n * @returns {string} Meta description\n */\nfunction extractMetaDescription() {\n const metaDesc = document.querySelector('meta[name=\"description\"]') ||\n document.querySelector('meta[property=\"og:description\"]')\n return metaDesc ? sanitizeText(metaDesc.content) : ''\n}\n\n/**\n * Extract meta keywords\n * @private\n * @returns {array} Keywords array\n */\nfunction extractMetaKeywords() {\n const metaKeywords = document.querySelector('meta[name=\"keywords\"]')\n if (metaKeywords) {\n return metaKeywords.content.split(',').map(k => k.trim()).filter(Boolean)\n }\n return []\n}\n\n/**\n * Extract body text content\n * @private\n * @returns {string} Body text\n */\nfunction extractBodyText() {\n // Remove script, style, and other non-content elements\n const clone = document.body.cloneNode(true)\n const elementsToRemove = clone.querySelectorAll('script, style, iframe, nav, footer, aside, .ad, .advertisement')\n elementsToRemove.forEach(el => el.remove())\n\n // Get text content\n const text = clone.textContent || clone.innerText || ''\n \n // Sanitize and truncate\n return truncateText(sanitizeText(text), PERFORMANCE.MAX_CONTENT_SIZE)\n}\n\n/**\n * Extract Open Graph tags\n * @private\n * @returns {object} Open Graph data\n */\nfunction extractOpenGraphTags() {\n const ogTags = {}\n const metaTags = document.querySelectorAll('meta[property^=\"og:\"]')\n \n metaTags.forEach(tag => {\n const property = tag.getAttribute('property').replace('og:', '')\n ogTags[property] = tag.content\n })\n\n return ogTags\n}\n\n/**\n * Extract structured data (JSON-LD)\n * @private\n * @returns {array} Structured data objects\n */\nfunction extractStructuredData() {\n const structuredData = []\n const scripts = document.querySelectorAll('script[type=\"application/ld+json\"]')\n \n scripts.forEach(script => {\n try {\n const data = JSON.parse(script.textContent)\n structuredData.push(data)\n } catch (e) {\n logger.warn('Failed to parse structured data:', e)\n }\n })\n\n return structuredData\n}\n\n/**\n * Extract article-specific content\n * @returns {object|null} Article content\n */\nexport function extractArticleContent() {\n try {\n const article = document.querySelector('article') || \n document.querySelector('[role=\"article\"]') ||\n document.querySelector('.article') ||\n document.querySelector('.post')\n\n if (!article) return null\n\n return {\n headline: extractHeadline(article),\n author: extractAuthor(article),\n datePublished: extractPublishDate(article),\n content: sanitizeText(article.textContent || article.innerText || '')\n }\n } catch (error) {\n logger.warn('Error extracting article content:', error)\n return null\n }\n}\n\n/**\n * Extract headline\n * @private\n * @param {Element} article - Article element\n * @returns {string} Headline\n */\nfunction extractHeadline(article) {\n const h1 = article.querySelector('h1')\n const headline = article.querySelector('[itemprop=\"headline\"]')\n return sanitizeText((h1 || headline)?.textContent || '')\n}\n\n/**\n * Extract author\n * @private\n * @param {Element} article - Article element\n * @returns {string} Author\n */\nfunction extractAuthor(article) {\n const author = article.querySelector('[itemprop=\"author\"]') ||\n article.querySelector('[rel=\"author\"]') ||\n article.querySelector('.author')\n return sanitizeText(author?.textContent || '')\n}\n\n/**\n * Extract publish date\n * @private\n * @param {Element} article - Article element\n * @returns {string} Publish date\n */\nfunction extractPublishDate(article) {\n const dateEl = article.querySelector('[itemprop=\"datePublished\"]') ||\n article.querySelector('time[datetime]')\n return dateEl?.getAttribute('datetime') || dateEl?.textContent || ''\n}\n\n/**\n * Check if current page is an article\n * @returns {boolean}\n */\nexport function isArticlePage() {\n return document.querySelector('article') !== null ||\n document.querySelector('[itemtype*=\"Article\"]') !== null ||\n document.querySelector('meta[property=\"og:type\"][content=\"article\"]') !== null\n}\n\n","/**\n * Mixpeek Context Adapter - Video Content Extractor\n * @module extractors/videoExtractor\n */\n\nimport { sanitizeText } from '../utils/helpers.js'\nimport logger from '../utils/logger.js'\n\n/**\n * Extract video content from the page\n * @param {string} selector - CSS selector for video element\n * @returns {object|null} Extracted video content\n */\nexport function extractVideoContent(selector = 'video') {\n logger.time('extractVideoContent')\n\n try {\n const videos = findVideoElements(selector)\n \n if (videos.length === 0) {\n logger.info('No video elements found')\n logger.timeEnd('extractVideoContent')\n return null\n }\n\n // Use the first (typically largest/main) video\n const video = videos[0]\n const content = {\n src: getVideoSource(video),\n poster: video.poster || '',\n title: extractVideoTitle(video),\n description: extractVideoDescription(video),\n duration: video.duration || 0,\n currentTime: video.currentTime || 0,\n dimensions: {\n width: video.videoWidth || video.width || 0,\n height: video.videoHeight || video.height || 0\n },\n metadata: extractVideoMetadata(video)\n }\n\n logger.timeEnd('extractVideoContent')\n logger.info('Extracted video content:', {\n src: content.src,\n title: content.title,\n duration: content.duration\n })\n\n return content\n } catch (error) {\n logger.error('Error extracting video content:', error)\n logger.timeEnd('extractVideoContent')\n return null\n }\n}\n\n/**\n * Find video elements on the page\n * @private\n * @param {string} selector - CSS selector\n * @returns {array} Array of video elements\n */\nfunction findVideoElements(selector) {\n const videos = Array.from(document.querySelectorAll(selector))\n \n // Sort by size (largest first)\n return videos.sort((a, b) => {\n const aSize = (a.videoWidth || a.width || 0) * (a.videoHeight || a.height || 0)\n const bSize = (b.videoWidth || b.width || 0) * (b.videoHeight || b.height || 0)\n return bSize - aSize\n })\n}\n\n/**\n * Get video source URL\n * @private\n * @param {HTMLVideoElement} video - Video element\n * @returns {string} Video source URL\n */\nfunction getVideoSource(video) {\n // Check src attribute\n if (video.src) return video.src\n\n // Check source elements\n const source = video.querySelector('source')\n if (source && source.src) return source.src\n\n // Check currentSrc\n if (video.currentSrc) return video.currentSrc\n\n return ''\n}\n\n/**\n * Extract video title\n * @private\n * @param {HTMLVideoElement} video - Video element\n * @returns {string} Video title\n */\nfunction extractVideoTitle(video) {\n // Check data attributes\n const title = video.getAttribute('data-title') ||\n video.getAttribute('title') ||\n video.getAttribute('aria-label')\n \n if (title) return sanitizeText(title)\n\n // Check parent container\n const container = video.closest('[data-video-title]')\n if (container) {\n return sanitizeText(container.getAttribute('data-video-title'))\n }\n\n // Check nearby heading\n const heading = video.previousElementSibling?.querySelector('h1, h2, h3') ||\n video.parentElement?.querySelector('h1, h2, h3')\n if (heading) {\n return sanitizeText(heading.textContent)\n }\n\n return ''\n}\n\n/**\n * Extract video description\n * @private\n * @param {HTMLVideoElement} video - Video element\n * @returns {string} Video description\n */\nfunction extractVideoDescription(video) {\n const desc = video.getAttribute('data-description') ||\n video.getAttribute('aria-description')\n \n if (desc) return sanitizeText(desc)\n\n // Check parent container\n const container = video.closest('[data-video-description]')\n if (container) {\n return sanitizeText(container.getAttribute('data-video-description'))\n }\n\n return ''\n}\n\n/**\n * Extract video metadata\n * @private\n * @param {HTMLVideoElement} video - Video element\n * @returns {object} Video metadata\n */\nfunction extractVideoMetadata(video) {\n const metadata = {}\n \n // Extract all data attributes\n Array.from(video.attributes).forEach(attr => {\n if (attr.name.startsWith('data-')) {\n const key = attr.name.replace('data-', '').replace(/-/g, '_')\n metadata[key] = attr.value\n }\n })\n\n return metadata\n}\n\n/**\n * Capture video frame as base64 image\n * @param {HTMLVideoElement} video - Video element\n * @param {number} quality - JPEG quality (0-1)\n * @returns {string|null} Base64 encoded image\n */\nexport function captureVideoFrame(video, quality = 0.8) {\n try {\n const canvas = document.createElement('canvas')\n canvas.width = video.videoWidth || video.width || 640\n canvas.height = video.videoHeight || video.height || 360\n \n const ctx = canvas.getContext('2d')\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height)\n \n return canvas.toDataURL('image/jpeg', quality)\n } catch (error) {\n logger.warn('Error capturing video frame:', error)\n return null\n }\n}\n\n/**\n * Extract video player information (YouTube, Vimeo, etc.)\n * @returns {object|null} Video player info\n */\nexport function extractVideoPlayerInfo() {\n // YouTube\n const ytPlayer = document.querySelector('iframe[src*=\"youtube.com\"]')\n if (ytPlayer) {\n const src = ytPlayer.src\n const videoIdMatch = src.match(/embed\\/([^?]+)/)\n return {\n platform: 'youtube',\n videoId: videoIdMatch ? videoIdMatch[1] : '',\n src\n }\n }\n\n // Vimeo\n const vimeoPlayer = document.querySelector('iframe[src*=\"vimeo.com\"]')\n if (vimeoPlayer) {\n const src = vimeoPlayer.src\n const videoIdMatch = src.match(/video\\/(\\d+)/)\n return {\n platform: 'vimeo',\n videoId: videoIdMatch ? videoIdMatch[1] : '',\n src\n }\n }\n\n return null\n}\n\n/**\n * Check if page has video content\n * @returns {boolean}\n */\nexport function hasVideo() {\n return document.querySelector('video') !== null ||\n document.querySelector('iframe[src*=\"youtube.com\"]') !== null ||\n document.querySelector('iframe[src*=\"vimeo.com\"]') !== null\n}\n\n","/**\n * Mixpeek Context Adapter - Image Content Extractor\n * @module extractors/imageExtractor\n */\n\nimport { sanitizeText } from '../utils/helpers.js'\nimport logger from '../utils/logger.js'\n\n/**\n * Extract primary images from the page\n * @param {number} maxImages - Maximum number of images to extract\n * @returns {array} Array of image objects\n */\nexport function extractImages(maxImages = 5) {\n logger.time('extractImages')\n\n try {\n const images = findPrimaryImages()\n const extracted = images.slice(0, maxImages).map(img => ({\n src: img.src,\n alt: sanitizeText(img.alt || ''),\n title: sanitizeText(img.title || ''),\n width: img.naturalWidth || img.width || 0,\n height: img.naturalHeight || img.height || 0,\n aspectRatio: calculateAspectRatio(img)\n }))\n\n logger.timeEnd('extractImages')\n logger.info(`Extracted ${extracted.length} images`)\n\n return extracted\n } catch (error) {\n logger.error('Error extracting images:', error)\n logger.timeEnd('extractImages')\n return []\n }\n}\n\n/**\n * Find primary/hero images on the page\n * @private\n * @returns {array} Array of image elements\n */\nfunction findPrimaryImages() {\n const images = Array.from(document.querySelectorAll('img'))\n \n return images\n .filter(img => {\n // Filter out small images (likely icons/thumbnails)\n const width = img.naturalWidth || img.width || 0\n const height = img.naturalHeight || img.height || 0\n return width >= 200 && height >= 200\n })\n .filter(img => {\n // Filter out hidden images\n const style = window.getComputedStyle(img)\n return style.display !== 'none' && style.visibility !== 'hidden'\n })\n .filter(img => {\n // Filter out ad images\n const isAd = img.closest('.ad, .advertisement, [id*=\"ad-\"], [class*=\"ad-\"]')\n return !isAd\n })\n .sort((a, b) => {\n // Sort by size (largest first)\n const aSize = (a.naturalWidth || a.width || 0) * (a.naturalHeight || a.height || 0)\n const bSize = (b.naturalWidth || b.width || 0) * (b.naturalHeight || b.height || 0)\n return bSize - aSize\n })\n}\n\n/**\n * Calculate aspect ratio\n * @private\n * @param {HTMLImageElement} img - Image element\n * @returns {number} Aspect ratio\n */\nfunction calculateAspectRatio(img) {\n const width = img.naturalWidth || img.width || 0\n const height = img.naturalHeight || img.height || 0\n return height > 0 ? width / height : 0\n}\n\n/**\n * Extract Open Graph image\n * @returns {object|null} OG image data\n */\nexport function extractOGImage() {\n const ogImage = document.querySelector('meta[property=\"og:image\"]')\n if (ogImage) {\n return {\n src: ogImage.content,\n alt: document.querySelector('meta[property=\"og:image:alt\"]')?.content || '',\n width: parseInt(document.querySelector('meta[property=\"og:image:width\"]')?.content || '0'),\n height: parseInt(document.querySelector('meta[property=\"og:image:height\"]')?.content || '0')\n }\n }\n return null\n}\n\n/**\n * Extract featured/hero image\n * @returns {object|null} Featured image data\n */\nexport function extractFeaturedImage() {\n // Check for common featured image patterns\n const selectors = [\n '[class*=\"featured-image\"]',\n '[class*=\"hero-image\"]',\n '[class*=\"header-image\"]',\n 'article img:first-of-type',\n '.post-thumbnail img'\n ]\n\n for (const selector of selectors) {\n const img = document.querySelector(selector)\n if (img) {\n return {\n src: img.src,\n alt: sanitizeText(img.alt || ''),\n width: img.naturalWidth || img.width || 0,\n height: img.naturalHeight || img.height || 0\n }\n }\n }\n\n return null\n}\n\n/**\n * Check if page has significant image content\n * @returns {boolean}\n */\nexport function hasImages() {\n const images = document.querySelectorAll('img')\n return Array.from(images).some(img => {\n const width = img.naturalWidth || img.width || 0\n const height = img.naturalHeight || img.height || 0\n return width >= 200 && height >= 200\n })\n}\n\n","/**\n * IAB Content Taxonomy Mapping\n * @module utils/iabMapping\n * \n * Maps Mixpeek taxonomy to IAB Content Taxonomy v3.0 codes\n * Reference: https://iabtechlab.com/standards/content-taxonomy/\n * \n * ✅ VERIFIED: Mixpeek Response Format (from OpenAPI spec)\n * \n * Mixpeek returns TaxonomyAssignment objects in enrichments.taxonomies:\n * ```javascript\n * {\n * \"taxonomy_id\": \"tax_products\",\n * \"node_id\": \"node_electronics_phones\", // ← Custom Mixpeek node ID\n * \"path\": [\"products\", \"electronics\", \"phones\"],\n * \"label\": \"Mobile Phones\", // Human-readable label\n * \"score\": 0.87\n * }\n * ```\n * \n * This means we're in **Scenario B**: Mixpeek uses custom node_ids like\n * \"node_electronics_phones\" that need to be mapped to IAB codes like \"IAB19-20\".\n * \n * Three mapping strategies (in order of priority):\n * \n * 1. **Check if already IAB** (safety check)\n * - If node_id or label contains IAB code pattern, use it directly\n * \n * 2. **Map by node_id** (primary method) ⭐\n * - Map Mixpeek node_id → IAB code using MIXPEEK_NODE_TO_IAB\n * - Most reliable when properly configured\n * - Requires discovering actual node_ids from your taxonomy\n * \n * 3. **Map by label** (fallback)\n * - Map human-readable labels to IAB codes\n * - Less precise but provides coverage\n * \n * To populate the mapping with YOUR taxonomy's node_ids:\n * ```bash\n * # Run the verification script to discover node_ids\n * MIXPEEK_API_KEY=your_key COLLECTION_ID=your_collection \\\n * node scripts/verify-mixpeek-taxonomy.js\n * \n * # This will show you the actual node_id values like:\n * # node_id: \"node_electronics_phones\" → Map to: IAB19-20\n * # node_id: \"node_sports_football\" → Map to: IAB17-3\n * ```\n */\n\n/**\n * IAB Taxonomy version identifier\n * IAB Tech Lab Content Taxonomy v3.0 = 6\n */\nexport const IAB_TAXONOMY_VERSION = 6\n\n/**\n * Map Mixpeek node_ids to IAB codes\n * \n * ✅ CONFIRMED: Mixpeek uses custom node_ids (from OpenAPI spec)\n * Example from spec: \"node_electronics_phones\" → should map to \"IAB19-20\"\n * \n * ⚠️ TODO: Populate with YOUR taxonomy's actual node_ids\n * The placeholders below use common patterns, but you need to run the\n * verification script to get the exact node_ids from YOUR Mixpeek taxonomy.\n * \n * Format: 'mixpeek_node_id': 'IAB_CODE'\n * \n * To discover YOUR node_ids:\n * 1. Run: node scripts/verify-mixpeek-taxonomy.js\n * 2. Note the node_id values returned\n * 3. Map each to the appropriate IAB code\n * \n * Example mapping (update with your actual node_ids):\n * 'node_tech_ai': 'IAB19-11', // Tech > AI\n * 'node_electronics_phones': 'IAB19-20', // Mobile/Phones\n * 'node_sports_football': 'IAB17-3', // Sports > Football\n */\nexport const MIXPEEK_NODE_TO_IAB = {\n // Technology & Computing (IAB19)\n // Replace these with actual node_ids from YOUR Mixpeek taxonomy\n 'node_technology': 'IAB19',\n 'node_tech_computing': 'IAB19',\n 'node_tech_ai': 'IAB19-11',\n 'node_tech_artificial_intelligence': 'IAB19-11',\n 'node_tech_machine_learning': 'IAB19-11',\n 'node_tech_software': 'IAB19-18',\n 'node_tech_hardware': 'IAB19-19',\n 'node_tech_mobile': 'IAB19-20',\n 'node_electronics_phones': 'IAB19-20', // From OpenAPI example\n 'node_tech_internet': 'IAB19-21',\n \n // Sports (IAB17)\n 'sports': 'IAB17',\n 'sports_football': 'IAB17-3',\n 'sports_soccer': 'IAB17-44',\n 'sports_basketball': 'IAB17-4',\n 'sports_baseball': 'IAB17-5',\n 'sports_tennis': 'IAB17-37',\n \n // News (IAB12)\n 'news': 'IAB12',\n 'news_politics': 'IAB12-2',\n 'news_business': 'IAB12-3',\n 'news_technology': 'IAB12-6',\n \n // Business & Finance (IAB13)\n 'business': 'IAB13',\n 'business_finance': 'IAB13-7',\n 'business_investing': 'IAB13-5',\n \n // Entertainment (IAB9)\n 'entertainment': 'IAB9',\n 'entertainment_movies': 'IAB9-7',\n 'entertainment_tv': 'IAB9-23',\n 'entertainment_music': 'IAB9-8',\n \n // Health & Fitness (IAB7)\n 'health': 'IAB7',\n 'health_fitness': 'IAB7-18',\n 'health_nutrition': 'IAB7-30',\n \n // Travel (IAB20)\n 'travel': 'IAB20',\n 'travel_hotels': 'IAB20-12',\n \n // Food & Drink (IAB8)\n 'food': 'IAB8',\n 'food_cooking': 'IAB8-5',\n 'food_restaurants': 'IAB8-9',\n \n // Automotive (IAB2)\n 'automotive': 'IAB2',\n 'automotive_cars': 'IAB2',\n \n // Real Estate (IAB21)\n 'real_estate': 'IAB21',\n \n // Education (IAB5)\n 'education': 'IAB5',\n \n // Fashion & Style (IAB18)\n 'fashion': 'IAB18',\n 'fashion_beauty': 'IAB18-1',\n \n // Home & Garden (IAB10)\n 'home': 'IAB10',\n 'home_garden': 'IAB10-3',\n \n // Science (IAB15)\n 'science': 'IAB15',\n \n // Arts (IAB1)\n 'arts': 'IAB1',\n 'arts_design': 'IAB1-4'\n}\n\n/**\n * Fallback label-based mapping (Scenario C)\n * Used when node_id mapping fails\n */\nexport const LABEL_TO_IAB = {\n // Technology patterns\n 'technology': 'IAB19',\n 'tech': 'IAB19',\n 'ai': 'IAB19-11',\n 'artificial intelligence': 'IAB19-11',\n 'machine learning': 'IAB19-11',\n 'software': 'IAB19-18',\n 'hardware': 'IAB19-19',\n 'mobile': 'IAB19-20',\n 'computing': 'IAB19',\n \n // Sports patterns\n 'sports': 'IAB17',\n 'football': 'IAB17-3',\n 'soccer': 'IAB17-44',\n 'basketball': 'IAB17-4',\n 'baseball': 'IAB17-5',\n \n // News patterns\n 'news': 'IAB12',\n 'politics': 'IAB12-2',\n \n // Business patterns\n 'business': 'IAB13',\n 'finance': 'IAB13-7',\n 'investing': 'IAB13-5',\n \n // Entertainment patterns\n 'entertainment': 'IAB9',\n 'movies': 'IAB9-7',\n 'television': 'IAB9-23',\n 'music': 'IAB9-8',\n 'gaming': 'IAB9-30',\n \n // Health patterns\n 'health': 'IAB7',\n 'fitness': 'IAB7-18',\n 'wellness': 'IAB7',\n 'nutrition': 'IAB7-30',\n \n // Other categories\n 'travel': 'IAB20',\n 'food': 'IAB8',\n 'automotive': 'IAB2',\n 'cars': 'IAB2',\n 'real estate': 'IAB21',\n 'education': 'IAB5',\n 'fashion': 'IAB18',\n 'home': 'IAB10',\n 'science': 'IAB15',\n 'arts': 'IAB1'\n}\n\n/**\n * Check if a string is already a valid IAB category code\n * @param {string} value - Potential IAB code\n * @returns {boolean} True if valid IAB code format\n */\nexport function isValidIABCode(value) {\n if (!value || typeof value !== 'string') return false\n return /^IAB\\d+(-\\d+)?$/.test(value)\n}\n\n/**\n * Extract IAB code from a string if present\n * @param {string} value - String that might contain IAB code\n * @returns {string|null} IAB code if found, null otherwise\n */\nexport function extractIABCode(value) {\n if (!value || typeof value !== 'string') return null\n const match = value.match(/IAB\\d+(-\\d+)?/)\n return match ? match[0] : null\n}\n\n/**\n * Map Mixpeek taxonomy to IAB code using multiple strategies\n * @param {object} taxonomy - Mixpeek taxonomy object with {label, node_id, path, score}\n * @returns {string|null} IAB category code or null if not found\n */\nexport function getIABFromTaxonomy(taxonomy) {\n if (!taxonomy) return null\n \n // Strategy 1: Check if label is already an IAB code (Scenario A)\n if (taxonomy.label) {\n if (isValidIABCode(taxonomy.label)) {\n return taxonomy.label\n }\n \n // Check if label contains IAB code\n const iabInLabel = extractIABCode(taxonomy.label)\n if (iabInLabel) {\n return iabInLabel\n }\n }\n \n // Strategy 2: Check if node_id is an IAB code (Scenario A)\n if (taxonomy.nodeId || taxonomy.node_id) {\n const nodeId = taxonomy.nodeId || taxonomy.node_id\n \n if (isValidIABCode(nodeId)) {\n return nodeId\n }\n \n // Check if node_id contains IAB code\n const iabInNode = extractIABCode(nodeId)\n if (iabInNode) {\n return iabInNode\n }\n }\n \n // Strategy 3: Map by Mixpeek node_id (Scenario B)\n if (taxonomy.nodeId || taxonomy.node_id) {\n const nodeId = (taxonomy.nodeId || taxonomy.node_id).toLowerCase()\n \n // Direct match\n if (MIXPEEK_NODE_TO_IAB[nodeId]) {\n return MIXPEEK_NODE_TO_IAB[nodeId]\n }\n \n // Try without underscores/hyphens\n const normalizedNode = nodeId.replace(/[_-]/g, '')\n for (const [key, value] of Object.entries(MIXPEEK_NODE_TO_IAB)) {\n if (key.replace(/[_-]/g, '') === normalizedNode) {\n return value\n }\n }\n }\n \n // Strategy 4: Map by label text (Scenario C - fallback)\n if (taxonomy.label) {\n const label = taxonomy.label.toLowerCase()\n \n // Direct match\n if (LABEL_TO_IAB[label]) {\n return LABEL_TO_IAB[label]\n }\n \n // Try partial matches\n for (const [key, value] of Object.entries(LABEL_TO_IAB)) {\n if (label.includes(key)) {\n return value\n }\n }\n }\n \n // Strategy 5: Try path if available\n if (taxonomy.path) {\n const pathString = Array.isArray(taxonomy.path) \n ? taxonomy.path.join(' ').toLowerCase()\n : taxonomy.path.toLowerCase()\n \n for (const [key, value] of Object.entries(LABEL_TO_IAB)) {\n if (pathString.includes(key)) {\n return value\n }\n }\n }\n \n return null\n}\n\n/**\n * Map multiple taxonomies to IAB codes\n * @param {Array<object>} taxonomies - Array of taxonomy objects\n * @returns {Array<string>} Array of IAB codes (duplicates removed)\n */\nexport function mapTaxonomiesToIAB(taxonomies) {\n if (!Array.isArray(taxonomies)) return []\n \n const iabCodes = taxonomies\n .map(tax => getIABFromTaxonomy(tax))\n .filter(code => code !== null)\n \n // Remove duplicates\n return [...new Set(iabCodes)]\n}\n\n/**\n * Map categories to IAB codes (deprecated - use getIABFromTaxonomy)\n * @deprecated Use getIABFromTaxonomy for taxonomy objects\n * @param {Array<string>} categories - Array of category strings\n * @returns {Array<string>} Array of IAB codes\n */\nexport function mapCategoriesToIAB(categories) {\n if (!Array.isArray(categories)) return []\n \n const iabCodes = categories\n .map(cat => {\n const normalized = cat.toLowerCase()\n return LABEL_TO_IAB[normalized] || null\n })\n .filter(code => code !== null)\n \n return [...new Set(iabCodes)]\n}\n\nexport default {\n IAB_TAXONOMY_VERSION,\n MIXPEEK_NODE_TO_IAB,\n LABEL_TO_IAB,\n isValidIABCode,\n extractIABCode,\n getIABFromTaxonomy,\n mapTaxonomiesToIAB,\n mapCategoriesToIAB\n}\n","/**\n * Previous Ad Tracker\n * Stores minimal information about the most recently served ad\n * using in-memory storage with optional localStorage persistence.\n */\n\nimport { isBrowser, safeJSONParse } from './helpers.js'\nimport logger from './logger.js'\n\nconst STORAGE_KEY = 'mixpeek_prev_ad_v1'\n\nclass PreviousAdTracker {\n constructor() {\n this.lastAd = null\n this.storageAvailable = this._checkLocalStorage()\n this._loadFromStorage()\n }\n\n _checkLocalStorage() {\n if (!isBrowser()) return false\n try {\n const k = '__mixpeek_prev_test__'\n localStorage.setItem(k, '1')\n localStorage.removeItem(k)\n return true\n } catch (e) {\n return false\n }\n }\n\n _loadFromStorage() {\n if (!this.storageAvailable) return\n try {\n const raw = localStorage.getItem(STORAGE_KEY)\n if (raw) {\n const parsed = safeJSONParse(raw)\n if (parsed && typeof parsed === 'object') {\n this.lastAd = parsed\n }\n }\n } catch (e) {\n logger.warn('Failed to load previous ad from storage:', e)\n }\n }\n\n _persist() {\n if (!this.storageAvailable) return\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(this.lastAd))\n } catch (e) {\n logger.warn('Failed to persist previous ad:', e)\n }\n }\n\n /**\n * Record the last served ad from a Prebid bidResponse\n * @param {object} bidResponse\n */\n record(bidResponse) {\n if (!bidResponse || typeof bidResponse !== 'object') return\n const info = {\n creativeId: bidResponse.creativeId || bidResponse.creative_id || null,\n bidder: bidResponse.bidder || bidResponse.bidderCode || null,\n adUnitCode: bidResponse.adUnitCode || null,\n cpm: typeof bidResponse.cpm === 'number' ? bidResponse.cpm : null,\n currency: bidResponse.currency || null,\n categories: Array.isArray(bidResponse.meta?.adServerCatId) ? bidResponse.meta.adServerCatId : (bidResponse.meta?.primaryCat ? [bidResponse.meta.primaryCat] : []),\n timestamp: Date.now()\n }\n this.lastAd = info\n this._persist()\n }\n\n /**\n * Get last ad info\n * @returns {object|null}\n */\n getLast() {\n return this.lastAd\n }\n\n /**\n * Clear last ad\n */\n clear() {\n this.lastAd = null\n if (this.storageAvailable) {\n try { localStorage.removeItem(STORAGE_KEY) } catch (e) {}\n }\n }\n}\n\nexport default new PreviousAdTracker()\n\n\n","/**\n * Mixpeek Context Adapter for Prebid.js\n * @module modules/mixpeekContextAdapter\n * @version 1.0.0\n * \n * This module enriches Prebid.js bid requests with contextual data from Mixpeek's\n * multimodal AI engine. It extracts page, video, or image content and classifies\n * it using Mixpeek's API to provide IAB taxonomy, brand safety scores, and other\n * contextual signals for privacy-safe ad targeting.\n */\n\nimport {\n MIXPEEK_MODULE_NAME,\n CONTENT_MODES,\n TARGETING_KEYS,\n EVENTS,\n DEFAULT_CACHE_TTL,\n DEFAULT_TIMEOUT,\n DEFAULT_RETRY_ATTEMPTS,\n PERFORMANCE,\n FEATURE_EXTRACTORS\n} from '../config/constants.js'\nimport { validateConfig, deepMerge, hashString, isBrowser } from '../utils/helpers.js'\nimport logger from '../utils/logger.js'\nimport cacheManager from '../cache/cacheManager.js'\nimport MixpeekClient from '../api/mixpeekClient.js'\nimport { extractPageContent, extractArticleContent, isArticlePage } from '../extractors/pageExtractor.js'\nimport { extractVideoContent, hasVideo, extractVideoPlayerInfo } from '../extractors/videoExtractor.js'\nimport { extractImages, extractOGImage, hasImages } from '../extractors/imageExtractor.js'\nimport { getIABFromTaxonomy, mapCategoriesToIAB, IAB_TAXONOMY_VERSION } from '../utils/iabMapping.js'\nimport previousAdTracker from '../utils/previousAdTracker.js'\n\nclass MixpeekContextAdapter {\n constructor() {\n this.config = {}\n this.client = null\n this.initialized = false\n this.processing = false\n this.contextData = null\n this.events = {}\n this.healthCheckPerformed = false\n }\n\n /**\n * Initialize the adapter with configuration\n * @param {object} config - Configuration object\n * @returns {Promise<boolean>} Success\n */\n async init(config) {\n logger.info('Initializing Mixpeek Context Adapter')\n logger.group('Configuration')\n\n // Validate configuration\n const validation = validateConfig(config)\n if (!validation.valid) {\n logger.error('Invalid configuration:', validation.errors)\n logger.groupEnd()\n return false\n }\n\n // Set default configuration\n this.config = deepMerge({\n endpoint: 'https://api.mixpeek.com',\n timeout: DEFAULT_TIMEOUT,\n cacheTTL: DEFAULT_CACHE_TTL,\n retryAttempts: DEFAULT_RETRY_ATTEMPTS,\n mode: CONTENT_MODES.AUTO,\n enableCache: true,\n debug: false,\n healthCheck: 'lazy', // 'eager', 'lazy', or false\n featureExtractors: [FEATURE_EXTRACTORS.TAXONOMY],\n batchSize: 1\n }, config)\n\n // Set debug mode\n logger.setDebug(this.config.debug)\n\n // Initialize API client\n this.client = new MixpeekClient({\n apiKey: this.config.apiKey,\n endpoint: this.config.endpoint,\n namespace: this.config.namespace,\n timeout: this.config.timeout,\n retryAttempts: this.config.retryAttempts\n })\n\n // Configure cache\n if (this.config.enableCache) {\n cacheManager.setTTL(this.config.cacheTTL)\n }\n\n logger.table({\n 'API Endpoint': this.config.endpoint,\n 'Collection ID': this.config.collectionId,\n 'Namespace': this.config.namespace || 'default',\n 'Mode': this.config.mode,\n 'Timeout': `${this.config.timeout}ms`,\n 'Cache TTL': `${this.config.cacheTTL}s`,\n 'Feature Extractors': this.config.featureExtractors.join(', '),\n 'Health Check': this.config.healthCheck\n })\n\n logger.groupEnd()\n\n // Perform health check if configured\n if (this.config.healthCheck === 'eager') {\n logger.info('Performing health check...')\n const healthResult = await this._performHealthCheck()\n \n if (!healthResult.healthy) {\n logger.warn('Health check failed, but continuing initialization')\n logger.warn('API may be unavailable:', healthResult.error)\n } else {\n logger.info('Health check passed:', healthResult.message)\n }\n } else if (this.config.healthCheck === 'lazy') {\n logger.info('Health check will be performed on first request')\n }\n\n this.initialized = true\n logger.info('Mixpeek Context Adapter initialized successfully')\n return true\n }\n\n /**\n * Perform health check (internal)\n * @private\n * @returns {Promise<object>} Health check result\n */\n async _performHealthCheck() {\n try {\n const startTime = performance.now()\n const health = await this.client.healthCheck()\n const duration = performance.now() - startTime\n\n return {\n healthy: true,\n status: health.status || 'ok',\n version: health.version,\n latency: Math.round(duration),\n message: `API responding in ${Math.round(duration)}ms`\n }\n } catch (error) {\n return {\n healthy: false,\n error: error.message,\n message: 'API health check failed'\n }\n }\n }\n\n /**\n * Enrich ad units with contextual data\n * @param {array} adUnits - Prebid ad units\n * @returns {Promise<array>} Enriched ad units\n */\n async enrichAdUnits(adUnits) {\n if (!this.initialized) {\n logger.warn('Adapter not initialized')\n return adUnits\n }\n\n if (this.processing) {\n logger.warn('Already processing context')\n return adUnits\n }\n\n this.processing = true\n const startTime = performance.now()\n\n try {\n // Get contextual data\n const context = await this.getContext()\n \n if (!context) {\n logger.warn('No context data available')\n return adUnits\n }\n\n // Store context\n this.contextData = context\n\n // Inject targeting keys into ad units\n const enrichedAdUnits = this._injectTargetingKeys(adUnits, context)\n\n const duration = performance.now() - startTime\n logger.info(`Context enrichment completed in ${duration.toFixed(2)}ms`)\n\n // Check performance threshold\n if (duration > PERFORMANCE.WARN_LATENCY) {\n logger.warn(`Enrichment took ${duration.toFixed(2)}ms (threshold: ${PERFORMANCE.WARN_LATENCY}ms)`)\n }\n\n // Emit success event\n this._emitEvent(EVENTS.CONTEXT_READY, context)\n\n return enrichedAdUnits\n } catch (error) {\n logger.error('Error enriching ad units:', error)\n \n // Emit error event\n this._emitEvent(EVENTS.CONTEXT_ERROR, error)\n\n // Return original ad units (graceful degradation)\n return adUnits\n } finally {\n this.processing = false\n }\n }\n\n /**\n * Get contextual data from cache or API\n * @returns {Promise<object>} Context data\n */\n async getContext() {\n logger.time('getContext')\n\n try {\n // Perform lazy health check on first request\n if (this.config.healthCheck === 'lazy' && !this.healthCheckPerformed) {\n logger.info('Performing lazy health check...')\n const healthResult = await this._performHealthCheck()\n this.healthCheckPerformed = true\n \n if (!healthResult.healthy) {\n logger.warn('Health check failed:', healthResult.error)\n logger.warn('Proceeding anyway, errors will be handled gracefully')\n } else {\n logger.info('Health check passed:', healthResult.message)\n }\n }\n\n // Detect content mode\n const mode = this._detectContentMode()\n logger.info('Content mode:', mode)\n\n // Extract content based on mode\n const content = await this._extractContent(mode)\n \n if (!content) {\n logger.warn('No content extracted')\n logger.timeEnd('getContext')\n return null\n }\n\n // Generate cache key\n const cacheKey = this._generateCacheKey(content, mode)\n\n // Check cache\n if (this.config.enableCache) {\n const cached = cacheManager.get(cacheKey)\n if (cached) {\n logger.info('Using cached context')\n logger.timeEnd('getContext')\n this._emitEvent(EVENTS.CONTEXT_CACHED, cached)\n return cached\n }\n }\n\n // Process content with Mixpeek API\n logger.info('Processing content with Mixpeek API')\n this._emitEvent(EVENTS.API_REQUEST, { content, mode })\n\n const document = await this.client.processContent(\n this.config.collectionId,\n content,\n this.config.featureExtractors\n )\n\n this._emitEvent(EVENTS.API_RESPONSE, document)\n\n // Parse context from document\n const context = this._parseContext(document, content, mode)\n\n // Cache the result\n if (this.config.enableCache) {\n cacheManager.set(cacheKey, context)\n }\n\n logger.timeEnd('getContext')\n return context\n } catch (error) {\n logger.error('Error getting context:', error)\n logger.timeEnd('getContext')\n throw error\n }\n }\n\n /**\n * Detect content mode (page, video, image, or auto)\n * @private\n * @returns {string} Content mode\n */\n _detectContentMode() {\n if (this.config.mode !== CONTENT_MODES.AUTO) {\n return this.config.mode\n }\n\n // Auto-detect based on page content\n if (hasVideo()) {\n return CONTENT_MODES.VIDEO\n }\n\n if (isArticlePage() || hasImages()) {\n return CONTENT_MODES.PAGE\n }\n\n return CONTENT_MODES.PAGE // Default to page\n }\n\n /**\n * Extract content based on mode\n * @private\n * @param {string} mode - Content mode\n * @returns {Promise<object>} Extracted content\n */\n async _extractContent(mode) {\n if (!isBrowser()) {\n logger.warn('Not in browser environment')\n return null\n }\n\n logger.info(`Extracting ${mode} content`)\n\n switch (mode) {\n case CONTENT_MODES.VIDEO:\n return this._extractVideoContent()\n\n case CONTENT_MODES.IMAGE:\n return this._extractImageContent()\n\n case CONTENT_MODES.PAGE:\n default:\n return this._extractPageContent()\n }\n }\n\n /**\n * Extract page content\n * @private\n * @returns {object} Page content\n */\n _extractPageContent() {\n const pageContent = extractPageContent()\n \n if (!pageContent) return null\n\n // If it's an article, extract article-specific content\n if (isArticlePage()) {\n const articleContent = extractArticleContent()\n if (articleContent) {\n return {\n ...pageContent,\n article: articleContent\n }\n }\n }\n\n // Extract featured image\n const ogImage = extractOGImage()\n if (ogImage) {\n pageContent.featuredImage = ogImage\n }\n\n return pageContent\n }\n\n /**\n * Extract video content\n * @private\n * @returns {object} Video content\n */\n _extractVideoContent() {\n const videoSelector = this.config.videoSelector || 'video'\n const videoContent = extractVideoContent(videoSelector)\n \n if (!videoContent) {\n // Check for embedded video players\n const playerInfo = extractVideoPlayerInfo()\n if (playerInfo) {\n return {\n ...playerInfo,\n type: 'embedded'\n }\n }\n return null\n }\n\n return {\n ...videoContent,\n type: 'native'\n }\n }\n\n /**\n * Extract image content\n * @private\n * @returns {object} Image content\n */\n _extractImageContent() {\n const images = extractImages(this.config.maxImages || 5)\n \n if (images.length === 0) return null\n\n return {\n images,\n primaryImage: images[0],\n count: images.length\n }\n }\n\n /**\n * Generate cache key for content\n * @private\n * @param {object} content - Content object\n * @param {string} mode - Content mode\n * @returns {string} Cache key\n */\n _generateCacheKey(content, mode) {\n let keyString = mode\n\n if (content.url) {\n keyString += `_${content.url}`\n } else if (content.src) {\n keyString += `_${content.src}`\n } else if (content.images) {\n keyString += `_${content.images[0]?.src || ''}`\n }\n\n // Add feature extractors to key\n keyString += `_${this.config.featureExtractors.sort().join('_')}`\n\n return hashString(keyString)\n }\n\n /**\n * Parse context from Mixpeek document response\n * @private\n * @param {object} document - Mixpeek document\n * @param {object} content - Original content\n * @param {string} mode - Content mode\n * @returns {object} Parsed context\n */\n _parseContext(document, content, mode) {\n const context = {\n documentId: document.document_id,\n mode,\n content: {\n url: content.url || content.src || '',\n title: content.title || '',\n type: mode\n }\n }\n\n // Extract taxonomies (if available from Mixpeek classification)\n if (document.enrichments && document.enrichments.taxonomies) {\n const taxonomies = document.enrichments.taxonomies\n\n if (taxonomies.length > 0) {\n const primaryTaxonomy = taxonomies[0]\n context.taxonomy = {\n label: primaryTaxonomy.label,\n nodeId: primaryTaxonomy.node_id,\n path: primaryTaxonomy.path,\n score: primaryTaxonomy.score,\n all: taxonomies\n }\n }\n }\n\n // Extract other enrichments\n if (document.enrichments) {\n // Brand safety (use sentiment as proxy for now)\n if (document.enrichments.brand_safety) {\n context.brandSafety = document.enrichments.brand_safety\n } else if (document.enrichments.sentiment) {\n // Use positive sentiment as a proxy for brand safety\n const sentimentScore = typeof document.enrichments.sentiment === 'object'\n ? document.enrichments.sentiment.score\n : 0.5\n context.brandSafety = {\n score: sentimentScore > 0.5 ? 0.8 + (sentimentScore - 0.5) * 0.4 : 0.5 + sentimentScore * 0.6,\n level: sentimentScore > 0.6 ? 'safe' : sentimentScore < 0.4 ? 'caution' : 'neutral'\n }\n }\n\n // Keywords\n if (document.enrichments.keywords) {\n context.keywords = document.enrichments.keywords\n }\n\n // Sentiment\n if (document.enrichments.sentiment) {\n context.sentiment = document.enrichments.sentiment\n }\n\n // Embeddings\n if (document.enrichments.embeddings) {\n context.embeddingId = document.enrichments.embeddings[0]?.id || null\n }\n }\n\n // Build a taxonomy-like structure from keywords if no taxonomy available\n if (!context.taxonomy && context.keywords && context.keywords.length > 0) {\n context.taxonomy = {\n label: this._inferCategoryFromKeywords(context.keywords),\n nodeId: `kw_${context.keywords[0]}`,\n path: ['Content', this._inferCategoryFromKeywords(context.keywords)],\n score: 0.7 // Moderate confidence for keyword-based classification\n }\n }\n\n return context\n }\n\n /**\n * Infer a category from keywords (simple heuristic)\n * @private\n * @param {array} keywords - Extracted keywords\n * @returns {string} Inferred category\n */\n _inferCategoryFromKeywords(keywords) {\n const categoryKeywords = {\n 'Technology': ['technology', 'software', 'computer', 'digital', 'tech', 'programming', 'code', 'developer', 'app', 'mobile', 'phone', 'smartphone'],\n 'Business': ['business', 'company', 'market', 'finance', 'investment', 'stock', 'economy', 'corporate', 'startup', 'entrepreneur'],\n 'Sports': ['sports', 'game', 'team', 'player', 'football', 'basketball', 'soccer', 'baseball', 'tennis', 'golf', 'match'],\n 'Entertainment': ['movie', 'film', 'music', 'celebrity', 'actor', 'singer', 'show', 'concert', 'entertainment', 'tv', 'television'],\n 'Health': ['health', 'medical', 'doctor', 'hospital', 'medicine', 'disease', 'fitness', 'wellness', 'diet', 'nutrition'],\n 'News': ['news', 'breaking', 'report', 'politics', 'government', 'election', 'policy', 'world', 'international'],\n 'Science': ['science', 'research', 'study', 'experiment', 'discovery', 'scientist', 'physics', 'chemistry', 'biology'],\n 'Automotive': ['car', 'vehicle', 'auto', 'automotive', 'driving', 'electric', 'engine', 'motor', 'truck'],\n 'Travel': ['travel', 'vacation', 'hotel', 'flight', 'destination', 'tourism', 'trip', 'adventure'],\n 'Food': ['food', 'recipe', 'cooking', 'restaurant', 'cuisine', 'chef', 'meal', 'dinner', 'lunch']\n }\n\n const lowerKeywords = keywords.map(k => k.toLowerCase())\n\n for (const [category, catKeywords] of Object.entries(categoryKeywords)) {\n for (const keyword of lowerKeywords) {\n if (catKeywords.includes(keyword)) {\n return category\n }\n }\n }\n\n return 'General'\n }\n\n /**\n * Inject targeting keys into ad units\n * @private\n * @param {array} adUnits - Ad units\n * @param {object} context - Context data\n * @returns {array} Enriched ad units\n */\n _injectTargetingKeys(adUnits, context) {\n const targetingKeys = this._buildTargetingKeys(context)\n \n logger.info('Targeting keys:', targetingKeys)\n\n return adUnits.map(adUnit => {\n // Add to first-party data (ortb2Imp)\n if (!adUnit.ortb2Imp) {\n adUnit.ortb2Imp = {}\n }\n if (!adUnit.ortb2Imp.ext) {\n adUnit.ortb2Imp.ext = {}\n }\n if (!adUnit.ortb2Imp.ext.data) {\n adUnit.ortb2Imp.ext.data = {}\n }\n\n // Merge targeting keys\n Object.assign(adUnit.ortb2Imp.ext.data, targetingKeys)\n\n // Also add to legacy targeting\n if (!adUnit.bids) {\n adUnit.bids = []\n }\n\n adUnit.bids = adUnit.bids.map(bid => {\n if (!bid.params) {\n bid.params = {}\n }\n if (!bid.params.keywords) {\n bid.params.keywords = {}\n }\n\n Object.assign(bid.params.keywords, targetingKeys)\n return bid\n })\n\n return adUnit\n })\n }\n\n /**\n * Build targeting keys from context\n * @private\n * @param {object} context - Context data\n * @returns {object} Targeting keys\n */\n _buildTargetingKeys(context) {\n const keys = {}\n\n // Taxonomy\n if (context.taxonomy) {\n keys[TARGETING_KEYS.CATEGORY] = context.taxonomy.label\n keys[TARGETING_KEYS.NODE] = context.taxonomy.nodeId\n keys[TARGETING_KEYS.PATH] = Array.isArray(context.taxonomy.path) \n ? context.taxonomy.path.join('/')\n : context.taxonomy.path\n keys[TARGETING_KEYS.SCORE] = context.taxonomy.score.toFixed(2)\n\n // Extract IAB taxonomy code if available\n const iabMatch = context.taxonomy.label.match(/IAB\\d+-\\d+/)\n if (iabMatch) {\n keys[TARGETING_KEYS.TAXONOMY] = iabMatch[0]\n }\n }\n\n // Brand safety\n if (context.brandSafety) {\n keys[TARGETING_KEYS.SAFETY] = typeof context.brandSafety === 'number'\n ? context.brandSafety.toFixed(2)\n : context.brandSafety.score?.toFixed(2) || '0'\n }\n\n // Keywords\n if (context.keywords) {\n keys[TARGETING_KEYS.KEYWORDS] = Array.isArray(context.keywords)\n ? context.keywords.slice(0, 10).join(',')\n : context.keywords\n }\n\n // Sentiment\n if (context.sentiment) {\n keys[TARGETING_KEYS.SENTIMENT] = typeof context.sentiment === 'string'\n ? context.sentiment\n : context.sentiment.label || 'neutral'\n }\n\n // Embedding ID\n if (context.embeddingId) {\n keys[TARGETING_KEYS.EMBED] = context.embeddingId\n }\n\n // Previous ad targeting (non-PII, adjacency awareness)\n const lastAd = previousAdTracker.getLast()\n if (lastAd) {\n if (lastAd.creativeId) {\n keys[TARGETING_KEYS.PREV_AD_CREATIVE_ID] = String(lastAd.creativeId)\n }\n if (lastAd.bidder) {\n keys[TARGETING_KEYS.PREV_AD_BIDDER] = String(lastAd.bidder)\n }\n if (lastAd.adUnitCode) {\n keys[TARGETING_KEYS.PREV_AD_ADUNIT] = String(lastAd.adUnitCode)\n }\n if (Array.isArray(lastAd.categories) && lastAd.categories.length > 0) {\n keys[TARGETING_KEYS.PREV_AD_CAT] = lastAd.categories.slice(0, 5).join(',')\n }\n }\n\n return keys\n }\n\n /**\n * Format context data for OpenRTB 2.6 site.content\n * @param {object} context - Context data\n * @returns {object|null} ortb2 formatted site.content object\n */\n formatForOrtb2SiteContent(context) {\n if (!context) return null\n\n const contentData = {}\n\n // IAB Content Categories\n if (context.taxonomy) {\n const iabCode = getIABFromTaxonomy(context.taxonomy)\n if (iabCode) {\n contentData.cat = [iabCode]\n contentData.cattax = IAB_TAXONOMY_VERSION\n }\n \n // Genre (human-readable category)\n if (context.taxonomy.label) {\n contentData.genre = context.taxonomy.label\n }\n }\n\n // Keywords\n if (context.keywords) {\n contentData.keywords = Array.isArray(context.keywords)\n ? context.keywords.join(',')\n : context.keywords\n }\n\n // Language detection (from page or default)\n if (isBrowser() && document.documentElement.lang) {\n contentData.language = document.documentElement.lang\n }\n\n // Page metadata\n if (isBrowser()) {\n if (document.title) {\n contentData.title = document.title\n }\n if (window.location.href) {\n contentData.url = window.location.href\n }\n }\n\n // Content-specific metadata from context\n if (context.content) {\n if (context.content.url && !contentData.url) {\n contentData.url = context.content.url\n }\n if (context.content.title && !contentData.title) {\n contentData.title = context.content.title\n }\n }\n\n // Extension data (Mixpeek-specific)\n contentData.ext = {\n data: {\n mixpeek: {\n documentId: context.documentId,\n mode: context.mode,\n score: context.taxonomy?.score,\n brandSafety: context.brandSafety,\n sentiment: context.sentiment,\n embeddingId: context.embeddingId\n }\n }\n }\n\n return contentData\n }\n\n /**\n * Format context data for ortb2Fragments (used by RTD modules)\n * @param {object} context - Context data\n * @returns {object|null} ortb2Fragments object\n */\n formatForOrtb2Fragments(context) {\n if (!context) return null\n\n const contentData = this.formatForOrtb2SiteContent(context)\n if (!contentData) return null\n\n return {\n global: {\n site: {\n content: contentData\n }\n }\n }\n }\n\n /**\n * Format context as first-party data segments (alternative format)\n * @param {object} context - Context data\n * @returns {Array} Array of data segments\n */\n formatAsDataSegments(context) {\n if (!context || !context.taxonomy) return []\n\n const segments = []\n\n // Primary taxonomy segment\n const iabCode = getIABFromTaxonomy(context.taxonomy)\n if (iabCode) {\n segments.push({\n id: iabCode,\n name: context.taxonomy.label,\n value: context.taxonomy.score.toString()\n })\n }\n\n // Additional taxonomies if available\n if (context.taxonomy.all && Array.isArray(context.taxonomy.all)) {\n context.taxonomy.all.slice(1, 5).forEach(tax => {\n const code = getIABFromTaxonomy(tax)\n if (code) {\n segments.push({\n id: code,\n name: tax.label,\n value: tax.score.toString()\n })\n }\n })\n }\n\n return segments\n }\n\n /**\n * Register event listener\n * @param {string} event - Event name\n * @param {Function} callback - Callback function\n */\n on(event, callback) {\n if (!this.events[event]) {\n this.events[event] = []\n }\n this.events[event].push(callback)\n }\n\n /**\n * Emit event\n * @private\n * @param {string} event - Event name\n * @param {*} data - Event data\n */\n _emitEvent(event, data) {\n if (this.events[event]) {\n this.events[event].forEach(callback => {\n try {\n callback(data)\n } catch (error) {\n logger.error(`Error in event callback for ${event}:`, error)\n }\n })\n }\n\n // Also emit to window for Prebid integration\n if (isBrowser() && window.pbjs) {\n window.pbjs.emit(event, data)\n }\n }\n\n /**\n * Get current context data\n * @returns {object|null} Context data\n */\n getContextData() {\n return this.contextData\n }\n\n /**\n * Clear cache\n */\n clearCache() {\n cacheManager.clear()\n logger.info('Cache cleared')\n }\n\n /**\n * Get cache statistics\n * @returns {object} Cache stats\n */\n getCacheStats() {\n return cacheManager.getStats()\n }\n\n /**\n * Health check\n * @returns {Promise<object>} Health status\n */\n async healthCheck() {\n if (!this.client) {\n return { status: 'error', message: 'Client not initialized' }\n }\n\n try {\n const health = await this.client.healthCheck()\n return { status: 'ok', ...health }\n } catch (error) {\n return { status: 'error', message: error.message }\n }\n }\n}\n\n// Create singleton instance\nconst adapter = new MixpeekContextAdapter()\n\n// Export adapter instance\nexport default adapter\n\n// Browser global\nif (isBrowser()) {\n window.MixpeekContextAdapter = adapter\n}\n\n"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","DEFAULT_API_ENDPOINT","process","env","MIXPEEK_API_ENDPOINT","window","ENDPOINTS","COLLECTIONS","DOCUMENTS","FEATURES","FEATURE_EXTRACTORS","RETRIEVERS","CONTENT_MODES","CACHE_KEYS","USER_AGENT","concat","Logger","_classCallCheck","debug","prefix","enabled","_console","_len","arguments","length","args","Array","_key","console","log","apply","_console2","_len2","_key2","warn","_console3","_len3","_key3","error","label","group","groupEnd","time","timeEnd","data","table","e","t","r","n","iterator","i","c","Generator","u","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","l","TypeError","done","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","_invoke","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_typeof","constructor","isObject","isArray","deepMerge","target","source","output","assign","keys","forEach","toPrimitive","String","_toPrimitive","_toPropertyKey","validateConfig","config","errors","apiKey","push","collectionId","timeout","cacheTTL","valid","code","extractDomain","url","URL","hostname","sanitizeText","text","replace","trim","isBrowser","document","safeJSONParse","json","fallback","undefined","JSON","parse","logger","retryWithBackoff","_x","_retryWithBackoff","_callee","fn","maxAttempts","delay","lastError","_loop","_ret","attempt","_args2","_context2","backoffDelay","_t","_t2","_context","Math","pow","setTimeout","_regeneratorValues","_next","_throw","ms","_","reject","Error","withTimeout","promise","race","getTimestamp","floor","Date","now","isExpired","timestamp","ttl","CacheManager","memoryCache","Map","useLocalStorage","_checkLocalStorageAvailable","test","localStorage","setItem","removeItem","cacheKey","_getCacheKey","has","item","info","getItem","parsed","set","stringify","clear","startsWith","localStorageSize","localStorageCount","memoryCount","size","_step","_this","pruned","_iterator","_createForOfIteratorHelper","entries","s","_step$value","_slicedToArray","err","ownKeys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","_objectSpread","_defineProperty","getOwnPropertyDescriptors","defineProperties","_asyncToGenerator","_defineProperties","MixpeekClient","endpoint","namespace","retryAttempts","requireNamespace","headers","_request2","path","options","fetchOptions","response","_args","_buildHeaders","method","fetch","ok","_handleErrorResponse","status","message","_handleErrorResponse2","_callee2","errorMessage","errorData","statusText","_x2","_createDocument","_callee3","payload","requestPayload","_context3","collection_id","metadata","content","_request","body","_x3","_x4","_getDocument","_callee4","documentId","_context4","_x5","_x6","_processContent","_callee5","enrichments","_t3","_context5","createDocument","description","title","document_id","_buildLocalEnrichments","_x7","_x8","keywords","_extractKeywords","sentiment","_analyzeSentiment","embeddings","id","_generateContentId","stopWords","Set","words","toLowerCase","split","word","wordCount","sort","b","slice","map","_ref","score","lowerText","positiveCount","negativeCount","regex","RegExp","matches","match","total","src","duration","video_url","width","height","image_url","alt_text","alt","random","toString","_listFeatureExtractors","_callee6","_context6","_getFeatureExtractor","_callee7","extractorId","_context7","_x9","_healthCheck","_callee8","_context8","extractHeadline","article","h1","querySelector","headline","textContent","extractAuthor","author","extractPublishDate","dateEl","getAttribute","isArticlePage","getVideoSource","video","currentSrc","extractVideoTitle","_video$previousElemen","_video$parentElement","container","closest","heading","previousElementSibling","parentElement","extractVideoDescription","desc","extractVideoMetadata","from","attributes","attr","name","calculateAspectRatio","img","naturalWidth","naturalHeight","MIXPEEK_NODE_TO_IAB","LABEL_TO_IAB","isValidIABCode","extractIABCode","getIABFromTaxonomy","taxonomy","iabInLabel","nodeId","node_id","iabInNode","normalizedNode","_i","_Object$entries","_Object$entries$_i","_i2","_Object$entries2","_Object$entries2$_i","includes","pathString","join","_i3","_Object$entries3","_Object$entries3$_i","STORAGE_KEY","PreviousAdTracker","lastAd","storageAvailable","_checkLocalStorage","_loadFromStorage","k","raw","bidResponse","_bidResponse$meta","_bidResponse$meta2","creativeId","creative_id","bidder","bidderCode","adUnitCode","cpm","currency","categories","meta","adServerCatId","primaryCat","_persist","adapter","MixpeekContextAdapter","client","initialized","processing","contextData","events","healthCheckPerformed","_init","validation","healthResult","mode","enableCache","healthCheck","featureExtractors","batchSize","setDebug","cacheManager","setTTL","_performHealthCheck","healthy","_performHealthCheck2","startTime","health","performance","version","latency","round","_enrichAdUnits","adUnits","context","enrichedAdUnits","getContext","_injectTargetingKeys","toFixed","_emitEvent","_getContext","cached","_document","_detectContentMode","_extractContent","_generateCacheKey","processContent","_parseContext","images","querySelectorAll","some","_extractContent2","_t4","_extractVideoContent","_extractImageContent","_extractPageContent","pageContent","location","href","domain","metaDesc","clone","cloneNode","el","remove","maxLength","substring","truncateText","innerText","metaKeywords","Boolean","ogTags","tag","property","structuredData","script","language","documentElement","lang","textLength","extractPageContent","articleContent","datePublished","extractArticleContent","ogImage","_document$querySelect","_document$querySelect2","_document$querySelect3","parseInt","extractOGImage","featuredImage","videoContent","selector","videos","aSize","videoWidth","videoHeight","findVideoElements","poster","currentTime","dimensions","extractVideoContent","videoSelector","playerInfo","ytPlayer","videoIdMatch","platform","videoId","vimeoPlayer","extractVideoPlayerInfo","type","maxImages","extracted","style","getComputedStyle","display","visibility","aspectRatio","extractImages","primaryImage","count","keyString","_content$images$","str","hash","charCodeAt","abs","hashString","taxonomies","primaryTaxonomy","all","brand_safety","brandSafety","sentimentScore","level","_document$enrichments","embeddingId","_inferCategoryFromKeywords","lowerKeywords","category","catKeywords","keyword","targetingKeys","_buildTargetingKeys","adUnit","ortb2Imp","ext","bids","bid","params","_context$brandSafety$","iabMatch","previousAdTracker","getLast","_context$taxonomy","contentData","iabCode","cat","cattax","genre","mixpeek","formatForOrtb2SiteContent","global","site","segments","tax","event","callback","pbjs","emit","getStats","_t5"],"sourceRoot":""}