UNPKG

@stdbl/wao

Version:

Optimize web pages for LLM agent interaction and understanding

1 lines 37.8 kB
{"version":3,"sources":["../src/utils.ts","../src/core.ts"],"sourcesContent":["// utils.ts - Helper functions (pure functions)\nexport const logMessage = (message: string): void => {\n console.log(`LLM Optimization Library: ${message}`);\n};\n\nexport const createDOMComment = (message: string): Comment => {\n return document.createComment(message);\n};\n","// core.ts - Web Augmentation Optimizer (WAO)\nimport type {\n ElementDescription,\n PageState,\n InteractionMapping,\n PageStructure,\n DataFlow,\n AccessibilityInfo,\n} from './types';\nimport { createDOMComment, logMessage } from './utils';\n\n// Core state for the library\nconst pageState: PageState = {\n originalDOM: document.body, // Initial state\n optimizedElements: [],\n interactionMappings: [],\n isActive: false,\n pageStructure: undefined,\n dataFlows: [],\n accessibility: {\n ariaLabels: {},\n tabOrder: [],\n colorContrast: {},\n },\n};\n\n// CSS Styles for optimized elements\nconst injectStyles = (): void => {\n const styleElement = document.createElement('style');\n styleElement.id = 'wao-styles';\n styleElement.textContent = `\n .wao-optimized-element {\n border: 2px solid #3498db;\n padding: 8px;\n margin: 4px;\n background-color: #f8f9fa;\n border-radius: 4px;\n position: relative;\n display: block;\n }\n \n .wao-description {\n font-family: monospace;\n margin-bottom: 6px;\n color: #2c3e50;\n display: block;\n }\n \n .wao-tag {\n background-color: #3498db;\n color: white;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 12px;\n font-family: monospace;\n position: absolute;\n top: -10px;\n right: 5px;\n }\n \n .wao-interaction {\n margin-top: 6px;\n font-style: italic;\n color: #e74c3c;\n font-size: 12px;\n border-top: 1px dashed #ccc;\n padding-top: 4px;\n }\n \n .wao-toggle {\n position: fixed;\n bottom: 20px;\n right: 20px;\n z-index: 10000;\n padding: 8px 16px;\n background-color: #3498db;\n color: white;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-weight: bold;\n box-shadow: 0 2px 5px rgba(0,0,0,0.2);\n }\n \n .wao-role {\n position: absolute;\n top: -10px;\n left: 5px;\n background-color: #27ae60;\n color: white;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 12px;\n font-family: monospace;\n }\n \n .wao-importance-primary {\n border-color: #e74c3c !important;\n border-width: 3px !important;\n }\n \n .wao-importance-secondary {\n border-color: #f39c12 !important;\n }\n \n .wao-importance-tertiary {\n border-color: #95a5a6 !important;\n border-style: dashed !important;\n }\n \n .wao-data-flow {\n position: relative;\n border: 1px dashed #9b59b6;\n margin: 10px 0;\n padding: 8px;\n background-color: rgba(155, 89, 182, 0.1);\n }\n \n .wao-data-flow::before {\n content: attr(data-description);\n font-size: 12px;\n color: #9b59b6;\n position: absolute;\n top: -10px;\n left: 10px;\n background: white;\n padding: 0 5px;\n }\n \n .wao-page-structure {\n position: fixed;\n top: 20px;\n right: 20px;\n background: rgba(52, 152, 219, 0.9);\n color: white;\n padding: 10px;\n border-radius: 4px;\n font-family: monospace;\n font-size: 12px;\n z-index: 10000;\n max-width: 300px;\n max-height: 300px;\n overflow: auto;\n }\n \n body[data-wao-active=\"true\"] {\n filter: grayscale(0.3);\n background-color: #f0f0f0 !important;\n }\n \n .wao-accessibility-issue {\n outline: 3px solid #c0392b !important;\n position: relative;\n }\n \n .wao-accessibility-issue::after {\n content: \"⚠️\";\n position: absolute;\n top: 0;\n right: 0;\n background: #c0392b;\n color: white;\n padding: 2px;\n }\n `;\n document.head.appendChild(styleElement);\n};\n\n// Inject activation instructions for the LLM Agent\nconst injectActivationInstructions = (): void => {\n const comment = createDOMComment(`\n LLM Agent Instructions:\n - To activate this optimization library, set 'data-wao-active=\"true\"' on the body element\n - For visual descriptions, call 'window.WAO.describeElementVisually(selector, description, elementType)'\n - To map interactions, call 'window.WAO.defineInteraction(selector, interactionType, methodName)'\n - To describe page structure, call 'window.WAO.describePage(pageInfo)'\n - To analyze page semantics, call 'window.WAO.extractSemanticStructure()'\n - To describe data flows, call 'window.WAO.describeDataFlow(flow)'\n - To analyze accessibility, call 'window.WAO.analyzeAccessibility()'\n - To highlight element roles, call 'window.WAO.highlightElementRole(selector, role)'\n - To deactivate, call 'window.WAO.deactivateOptimizer()'\n `);\n document.body.prepend(comment);\n\n // Also inject a data attribute observer\n const observer = new MutationObserver(mutations => {\n mutations.forEach(mutation => {\n if (mutation.attributeName === 'data-wao-active') {\n const bodyElement = document.body;\n const isActive = bodyElement.getAttribute('data-wao-active') === 'true';\n\n if (isActive && !pageState.isActive) {\n activateOptimizer(bodyElement);\n } else if (!isActive && pageState.isActive) {\n deactivateOptimizer();\n }\n }\n });\n });\n\n observer.observe(document.body, { attributes: true });\n};\n\n// Check if the optimizer is activated\nexport const isActivated = (): boolean => {\n return pageState.isActive;\n};\n\n// Activate the optimizer\nconst activateOptimizer = (domElement: HTMLElement): void => {\n if (!isActivated()) {\n pageState.originalDOM = domElement.cloneNode(true) as HTMLElement;\n pageState.isActive = true;\n document.body.setAttribute('data-wao-active', 'true');\n injectStyles();\n addToggle();\n setupEventListeners();\n logMessage('Optimizer activated');\n } else {\n logMessage('Optimizer already active');\n }\n};\n\n// Deactivate and restore original DOM\nconst deactivateOptimizer = (): void => {\n if (pageState.isActive) {\n // Don't replace the whole body to avoid losing the script\n // Instead, revert individual optimized elements\n pageState.optimizedElements.forEach(revertElementVisuals);\n\n // Remove any added styles and toggles\n const styleElement = document.getElementById('wao-styles');\n if (styleElement) styleElement.remove();\n\n const toggleButton = document.querySelector('.wao-toggle');\n if (toggleButton) toggleButton.remove();\n\n // Cleanup\n document.body.removeAttribute('data-wao-active');\n removeEventListeners();\n pageState.optimizedElements = [];\n pageState.interactionMappings = [];\n pageState.isActive = false;\n logMessage('Optimizer deactivated');\n } else {\n logMessage('Optimizer is not active');\n }\n};\n\n// Define an interaction for an element\nconst defineInteraction = (\n elementSelector: string,\n interactionType: 'click' | 'hover' | 'focus',\n methodName: string,\n expectedOutcome?: string,\n): void => {\n if (!isActivated()) return;\n\n const mapping: InteractionMapping = {\n elementSelector,\n interactionType,\n methodName,\n expectedOutcome,\n };\n\n pageState.interactionMappings.push(mapping);\n\n // Find any already optimized elements and add interaction information\n const element = document.querySelector(elementSelector);\n if (element) {\n const optimizedElement = element.closest('.wao-optimized-element');\n if (optimizedElement) {\n let interactionElement = optimizedElement.querySelector('.wao-interaction');\n if (!interactionElement) {\n interactionElement = document.createElement('div');\n interactionElement.className = 'wao-interaction';\n optimizedElement.appendChild(interactionElement);\n }\n\n const interactionText = `${interactionType} → ${methodName}`;\n interactionElement.textContent +=\n interactionText + (expectedOutcome ? ` (${expectedOutcome})` : '') + ' ';\n }\n }\n};\n\n// Handle interaction events\nconst handleInteraction = (event: Event): void => {\n const target = event.target as HTMLElement;\n\n pageState.interactionMappings.forEach(mapping => {\n const matchedElement = target.closest(mapping.elementSelector);\n if (matchedElement && mapping.interactionType === event.type) {\n logMessage(`Interaction triggered: ${mapping.methodName} on ${mapping.elementSelector}`);\n\n // Here you would execute the actual method\n // Safely attempt to call the method if it exists on window\n const method = window[mapping.methodName as keyof typeof window];\n if (typeof method === 'function') {\n try {\n method(matchedElement);\n } catch (error) {\n logMessage(`Error executing method ${mapping.methodName}: ${error}`);\n }\n }\n }\n });\n};\n\n// Add toggle button to UI\nconst addToggle = (): void => {\n // Remove existing button if present\n const existingButton = document.querySelector('.wao-toggle');\n if (existingButton) existingButton.remove();\n\n const toggleButton = document.createElement('button');\n toggleButton.className = 'wao-toggle';\n toggleButton.textContent = pageState.isActive\n ? 'Deactivate Optimization'\n : 'Activate Optimization';\n\n toggleButton.addEventListener('click', () => {\n if (pageState.isActive) {\n deactivateOptimizer();\n } else {\n activateOptimizer(document.body);\n }\n toggleButton.textContent = pageState.isActive\n ? 'Deactivate Optimization'\n : 'Activate Optimization';\n });\n\n document.body.appendChild(toggleButton);\n};\n\n// Setup event listeners\nconst setupEventListeners = (): void => {\n document.addEventListener('click', handleInteraction);\n document.addEventListener('mouseover', handleInteraction); // Use mouseover for hover\n document.addEventListener('focus', handleInteraction, true); // Capture phase for focus\n};\n\n// Remove event listeners\nconst removeEventListeners = (): void => {\n document.removeEventListener('click', handleInteraction);\n document.removeEventListener('mouseover', handleInteraction);\n document.removeEventListener('focus', handleInteraction, true);\n};\n\n// Visually describe an element\nconst describeElementVisually = (\n selector: string,\n description: string,\n elementType: string,\n options?: {\n role?: string;\n importance?: 'primary' | 'secondary' | 'tertiary';\n dataContext?: string;\n },\n): void => {\n if (!isActivated()) return;\n\n const element = document.querySelector(selector);\n if (!element) {\n logMessage(`Element not found: ${selector}`);\n return;\n }\n\n // Check if already optimized\n if (element.closest('.wao-optimized-element')) {\n logMessage(`Element already optimized: ${selector}`);\n return;\n }\n\n // Create the wrapper\n const wrapper = document.createElement('div');\n wrapper.className = 'wao-optimized-element';\n wrapper.setAttribute('data-original-selector', selector);\n\n // Add importance class if specified\n if (options?.importance) {\n wrapper.classList.add(`wao-importance-${options.importance}`);\n }\n\n // Create description\n const descriptionElement = document.createElement('div');\n descriptionElement.className = 'wao-description';\n descriptionElement.textContent = description;\n\n // Add data context if specified\n if (options?.dataContext) {\n const dataContextEl = document.createElement('div');\n dataContextEl.style.fontSize = '12px';\n dataContextEl.style.fontStyle = 'italic';\n dataContextEl.textContent = `Data: ${options.dataContext}`;\n descriptionElement.appendChild(dataContextEl);\n }\n\n // Create tag\n const tagElement = document.createElement('span');\n tagElement.className = 'wao-tag';\n tagElement.textContent = `<${elementType}>`;\n\n // Create role tag if specified\n if (options?.role) {\n const roleElement = document.createElement('span');\n roleElement.className = 'wao-role';\n roleElement.textContent = options.role;\n wrapper.appendChild(roleElement);\n }\n\n // Assemble the wrapper\n wrapper.appendChild(tagElement);\n wrapper.appendChild(descriptionElement);\n\n // Replace the original element with our wrapper\n element.parentNode?.replaceChild(wrapper, element);\n\n // Store the optimization for potential revert\n pageState.optimizedElements.push({\n selector,\n description,\n originalHTML: element.outerHTML,\n role: options?.role,\n importance: options?.importance,\n dataContext: options?.dataContext,\n });\n};\n\n// Revert visual optimization\nconst revertElementVisuals = (elementDescription: ElementDescription): void => {\n const optimizedElement = document.querySelector(\n `.wao-optimized-element[data-original-selector=\"${elementDescription.selector}\"]`,\n );\n\n if (optimizedElement) {\n // Create a temporary container to convert HTML string to Element\n const tempContainer = document.createElement('div');\n if (elementDescription.originalHTML) {\n tempContainer.innerHTML = elementDescription.originalHTML;\n const originalElement = tempContainer.firstElementChild;\n\n if (originalElement) {\n optimizedElement.parentNode?.replaceChild(originalElement, optimizedElement);\n }\n }\n }\n};\n\n// New function: Describe overall page structure\nconst describePage = (pageInfo: Partial<PageStructure>): void => {\n if (!isActivated()) return;\n\n // Store page structure\n pageState.pageStructure = {\n ...pageState.pageStructure,\n ...pageInfo,\n } as PageStructure;\n\n // Create or update page structure visualization\n let structureEl = document.querySelector('.wao-page-structure');\n\n if (!structureEl) {\n structureEl = document.createElement('div');\n structureEl.className = 'wao-page-structure';\n document.body.appendChild(structureEl);\n }\n\n // Build HTML content for page structure\n let structureHTML = '<h3>Page Structure</h3>';\n\n if (pageInfo.title) {\n structureHTML += `<div><strong>Title:</strong> ${pageInfo.title}</div>`;\n }\n\n if (pageInfo.mainContent) {\n structureHTML += `<div><strong>Main:</strong> ${pageInfo.mainContent}</div>`;\n\n // Highlight main content\n const mainEl = document.querySelector(pageInfo.mainContent);\n if (mainEl && !mainEl.classList.contains('wao-optimized-element')) {\n mainEl.setAttribute('data-wao-role', 'main-content');\n mainEl.setAttribute('style', 'border: 2px dashed #3498db !important; padding: 8px;');\n }\n }\n\n if (pageInfo.navigation) {\n structureHTML += `<div><strong>Navigation:</strong></div><ul>`;\n const navItems = Array.isArray(pageInfo.navigation)\n ? pageInfo.navigation\n : [pageInfo.navigation];\n\n navItems.forEach((nav: string) => {\n structureHTML += `<li>${nav}</li>`;\n\n // Highlight navigation\n const navEl = document.querySelector(nav);\n if (navEl && !navEl.classList.contains('wao-optimized-element')) {\n navEl.setAttribute('data-wao-role', 'navigation');\n navEl.setAttribute('style', 'border: 2px dashed #2ecc71 !important; padding: 4px;');\n }\n });\n structureHTML += `</ul>`;\n }\n\n if (pageInfo.sidebar) {\n structureHTML += `<div><strong>Sidebars:</strong></div><ul>`;\n const sidebarItems = Array.isArray(pageInfo.sidebar) ? pageInfo.sidebar : [pageInfo.sidebar];\n\n sidebarItems.forEach((side: string) => {\n structureHTML += `<li>${side}</li>`;\n\n // Highlight sidebar\n const sideEl = document.querySelector(side);\n if (sideEl && !sideEl.classList.contains('wao-optimized-element')) {\n sideEl.setAttribute('data-wao-role', 'sidebar');\n sideEl.setAttribute('style', 'border: 2px dashed #f39c12 !important; padding: 4px;');\n }\n });\n structureHTML += `</ul>`;\n }\n\n if (pageInfo.footer) {\n structureHTML += `<div><strong>Footer:</strong> ${pageInfo.footer}</div>`;\n\n // Highlight footer\n const footerEl = document.querySelector(pageInfo.footer);\n if (footerEl && !footerEl.classList.contains('wao-optimized-element')) {\n footerEl.setAttribute('data-wao-role', 'footer');\n footerEl.setAttribute('style', 'border: 2px dashed #9b59b6 !important; padding: 4px;');\n }\n }\n\n structureEl.innerHTML = structureHTML;\n};\n\n// New function: Describe data flows between elements\nconst describeDataFlow = (flow: DataFlow): void => {\n if (!isActivated()) return;\n\n // Store the data flow\n if (!pageState.dataFlows) {\n pageState.dataFlows = [];\n }\n\n pageState.dataFlows.push(flow);\n\n // Visualize the data flow\n const sourceEl = document.querySelector(flow.source);\n const destEl = document.querySelector(flow.destination);\n\n if (sourceEl && destEl) {\n // Create flow container\n const flowContainer = document.createElement('div');\n flowContainer.className = 'wao-data-flow';\n flowContainer.setAttribute('data-description', flow.description ?? '');\n flowContainer.innerHTML = `\n <div><strong>From:</strong> ${flow.source} (${flow.dataType})</div>\n <div style=\"text-align: center;\">↓</div>\n <div><strong>To:</strong> ${flow.destination}</div>\n `;\n\n // Insert after destination element\n destEl.parentNode?.insertBefore(flowContainer, destEl.nextSibling);\n }\n};\n\n// New function: Analyze page for accessibility issues\nconst analyzeAccessibility = (): void => {\n if (!isActivated()) return;\n\n const accessibilityInfo: AccessibilityInfo = {\n ariaLabels: {},\n tabOrder: [],\n colorContrast: {},\n };\n\n // Find all interactive elements\n const interactiveElements = document.querySelectorAll(\n 'button, a, input, select, textarea, [role=\"button\"], [tabindex]',\n );\n\n // Analyze each element\n interactiveElements.forEach(element => {\n const elemNode = element as HTMLElement;\n const selector = getUniqueSelector(elemNode);\n\n // Check for ARIA labels\n const ariaLabel = elemNode.getAttribute('aria-label');\n const ariaLabelledBy = elemNode.getAttribute('aria-labelledby');\n\n if (!ariaLabel && !ariaLabelledBy && elemNode.tagName !== 'INPUT') {\n // Mark as accessibility issue\n elemNode.classList.add('wao-accessibility-issue');\n\n // Store issue\n accessibilityInfo.colorContrast[selector] = 'Missing ARIA label';\n }\n\n // Store existing labels\n if (ariaLabel) {\n accessibilityInfo.ariaLabels[selector] = ariaLabel;\n }\n\n // Build tab order\n if (\n elemNode.tabIndex >= 0 ||\n elemNode.tagName === 'A' ||\n elemNode.tagName === 'BUTTON' ||\n elemNode.tagName === 'INPUT' ||\n elemNode.tagName === 'SELECT' ||\n elemNode.tagName === 'TEXTAREA'\n ) {\n accessibilityInfo.tabOrder.push(selector);\n }\n });\n\n // Store accessibility info\n pageState.accessibility = accessibilityInfo;\n\n // Create accessibility report\n let accessibilityEl = document.querySelector('.wao-accessibility-report');\n\n if (!accessibilityEl) {\n accessibilityEl = document.createElement('div');\n accessibilityEl.className = 'wao-accessibility-report';\n accessibilityEl.setAttribute(\n 'style',\n `\n position: fixed;\n left: 20px;\n top: 20px;\n background: rgba(44, 62, 80, 0.9);\n color: white;\n padding: 15px;\n border-radius: 4px;\n font-family: monospace;\n z-index: 10000;\n max-width: 300px;\n max-height: 300px;\n overflow: auto;\n `,\n );\n document.body.appendChild(accessibilityEl);\n }\n\n // Build HTML content for accessibility report\n let reportHTML = '<h3>Accessibility Report</h3>';\n\n // Tab order\n reportHTML += `<div><strong>Tab Order (${accessibilityInfo.tabOrder.length} elements):</strong></div><ol>`;\n accessibilityInfo.tabOrder.slice(0, 10).forEach(selector => {\n reportHTML += `<li>${selector}</li>`;\n });\n\n if (accessibilityInfo.tabOrder.length > 10) {\n reportHTML += `<li>... and ${accessibilityInfo.tabOrder.length - 10} more</li>`;\n }\n\n reportHTML += `</ol>`;\n\n // Issues\n const issueCount = Object.keys(accessibilityInfo.colorContrast).length;\n reportHTML += `<div><strong>Issues (${issueCount}):</strong></div>`;\n\n if (issueCount > 0) {\n reportHTML += `<ul>`;\n Object.entries(accessibilityInfo.colorContrast)\n .slice(0, 5)\n .forEach(([selector, issue]) => {\n reportHTML += `<li>${selector}: ${issue}</li>`;\n });\n\n if (issueCount > 5) {\n reportHTML += `<li>... and ${issueCount - 5} more</li>`;\n }\n\n reportHTML += `</ul>`;\n }\n\n accessibilityEl.innerHTML = reportHTML;\n};\n\n// New function: Extract semantic structure automatically\nconst extractSemanticStructure = (): void => {\n if (!isActivated()) return;\n\n const pageInfo: Partial<PageStructure> = {\n title: document.title,\n navigation: [],\n sidebar: [],\n };\n\n // Detect main content\n const mainContent =\n document.querySelector('main') ||\n document.querySelector('[role=\"main\"]') ||\n document.querySelector('#main');\n\n if (mainContent) {\n pageInfo.mainContent = getUniqueSelector(mainContent as HTMLElement);\n }\n\n // Detect navigation\n const navElements = document.querySelectorAll(\n 'nav, [role=\"navigation\"], header ul, .nav, .navbar',\n );\n navElements.forEach(nav => {\n if (Array.isArray(pageInfo.navigation)) {\n pageInfo.navigation.push(getUniqueSelector(nav as HTMLElement));\n }\n });\n\n // Detect footer\n const footer =\n document.querySelector('footer') ||\n document.querySelector('.footer') ||\n document.querySelector('#footer');\n if (footer) {\n pageInfo.footer = getUniqueSelector(footer as HTMLElement);\n }\n\n // Detect sidebars\n const sidebars = document.querySelectorAll('aside, .sidebar, [role=\"complementary\"]');\n sidebars.forEach(sidebar => {\n if (Array.isArray(pageInfo.sidebar)) {\n pageInfo.sidebar.push(getUniqueSelector(sidebar as HTMLElement));\n }\n });\n\n // Apply the structure\n describePage(pageInfo);\n\n // Also process headings for hierarchy\n const headings = document.querySelectorAll('h1, h2, h3, h4, h5, h6');\n headings.forEach(heading => {\n const level = parseInt(heading.tagName.charAt(1));\n const text = heading.textContent || '';\n const selector = getUniqueSelector(heading as HTMLElement);\n\n describeElementVisually(selector, `Heading: ${text}`, heading.tagName.toLowerCase(), {\n role: 'heading-level-' + level,\n importance: level <= 2 ? 'primary' : level <= 4 ? 'secondary' : 'tertiary',\n });\n });\n};\n\n// New function: Highlight element with its semantic role\nconst highlightElementRole = (selector: string, role: string): void => {\n if (!isActivated()) return;\n\n const element = document.querySelector(selector);\n if (!element) {\n logMessage(`Element not found: ${selector}`);\n return;\n }\n\n // If already optimized, add role to existing element\n const optimizedElement = element.closest('.wao-optimized-element');\n if (optimizedElement) {\n let roleElement = optimizedElement.querySelector('.wao-role');\n\n if (!roleElement) {\n roleElement = document.createElement('span');\n roleElement.className = 'wao-role';\n optimizedElement.appendChild(roleElement);\n }\n\n (roleElement as HTMLElement).textContent = role;\n return;\n }\n\n // Otherwise, create a minimal wrapper with just the role\n const wrapper = document.createElement('div');\n wrapper.className = 'wao-optimized-element';\n wrapper.setAttribute('data-original-selector', selector);\n\n const roleElement = document.createElement('span');\n roleElement.className = 'wao-role';\n roleElement.textContent = role;\n\n // Clone the original element as a child of the wrapper\n const clonedElement = element.cloneNode(true);\n\n wrapper.appendChild(roleElement);\n wrapper.appendChild(clonedElement);\n\n // Replace original with wrapper\n element.parentNode?.replaceChild(wrapper, element);\n\n // Store for reversion\n pageState.optimizedElements.push({\n selector,\n description: `Element with role: ${role}`,\n originalHTML: element.outerHTML,\n role,\n });\n};\n\n// Helper function: Generate a unique CSS selector for an element\nconst getUniqueSelector = (element: HTMLElement): string => {\n if (element.id) {\n return `#${element.id}`;\n }\n\n // Try using classes\n if (element.className && typeof element.className === 'string') {\n const classes = element.className.trim().split(/\\s+/);\n if (classes.length > 0) {\n const selector = `.${classes.join('.')}`;\n if (document.querySelectorAll(selector).length === 1) {\n return selector;\n }\n }\n }\n\n // Fallback to tag name and position\n const sameTagElements = Array.from(document.querySelectorAll(element.tagName));\n const index = sameTagElements.indexOf(element);\n return `${element.tagName.toLowerCase()}:nth-of-type(${index + 1})`;\n};\n\n// Initialize the library\nconst initialize = (): void => {\n injectActivationInstructions();\n\n // Check if the body already has the activation attribute\n if (document.body.getAttribute('data-wao-active') === 'true') {\n activateOptimizer(document.body);\n }\n\n // Expose API globally\n window.WAO = {\n activateOptimizer,\n deactivateOptimizer,\n describeElementVisually,\n defineInteraction,\n isActivated,\n describePage,\n describeDataFlow,\n analyzeAccessibility,\n extractSemanticStructure,\n highlightElementRole,\n };\n};\n\n// Run initialization\ninitialize();\n\n// Export public API\nexport {\n activateOptimizer,\n deactivateOptimizer,\n describeElementVisually,\n defineInteraction,\n revertElementVisuals,\n describePage,\n describeDataFlow,\n analyzeAccessibility,\n extractSemanticStructure,\n highlightElementRole,\n};\n"],"mappings":"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","names":["logMessage","message","createDOMComment","pageState","injectStyles","styleElement","injectActivationInstructions","comment","createDOMComment","mutations","mutation","bodyElement","isActive","activateOptimizer","deactivateOptimizer","isActivated","domElement","logMessage","addToggle","setupEventListeners","revertElementVisuals","toggleButton","removeEventListeners","defineInteraction","elementSelector","interactionType","methodName","expectedOutcome","mapping","element","optimizedElement","interactionElement","interactionText","handleInteraction","event","target","matchedElement","method","error","existingButton","describeElementVisually","selector","description","elementType","options","wrapper","descriptionElement","dataContextEl","tagElement","roleElement","elementDescription","tempContainer","originalElement","describePage","pageInfo","structureEl","structureHTML","mainEl","nav","navEl","side","sideEl","footerEl","describeDataFlow","flow","sourceEl","destEl","flowContainer","analyzeAccessibility","accessibilityInfo","elemNode","getUniqueSelector","ariaLabel","ariaLabelledBy","accessibilityEl","reportHTML","issueCount","issue","extractSemanticStructure","mainContent","footer","sidebar","heading","level","text","highlightElementRole","role","clonedElement","classes","index","initialize"]}