playwright-genie 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/entry.js", "../src/llm/client.js", "../src/llm/prompt.js", "../src/llm/parser.js", "../src/cache/disk-cache.js", "../src/cache/memory-cache.js", "../src/page-structure.js", "../src/resolver.js", "../src/actions.js", "../src/smart-locator.js", "../src/llm-locator.js"],
4
- "sourcesContent": ["export { createSmartLocator, clearCache, clearAllCaches } from './smart-locator.js';\nexport { SmartAction } from './actions.js';\nexport { resolveLocator, getLocator, resolveLocatorsBatch } from './resolver.js';\nexport { getPageStructure } from './page-structure.js';\nexport { chatCompletion, getConfig } from './llm/client.js';\nexport { findLocator, findAllMatches } from './llm-locator.js';", "import 'dotenv/config';\nimport OpenAI from 'openai';\n\nconst DEBUG = process.env.LLM_LOCATOR_DEBUG === 'true';\n\nconst LLM_API_KEY = process.env.LLM_API_KEY || process.env.ROUTELLM_API_KEY || process.env.OPENAI_API_KEY || process.env.ANTHROPIC_API_KEY;\nconst LLM_BASE_URL = process.env.LLM_BASE_URL || process.env.ROUTELLM_BASE_URL || 'https://api.openai.com/v1';\nconst LLM_MODEL = process.env.LLM_MODEL || process.env.ROUTELLM_MODEL || 'gpt-4o-mini';\n\nif (!LLM_API_KEY) {\n throw new Error(\n 'No LLM API key found. Set one of: LLM_API_KEY, ROUTELLM_API_KEY, OPENAI_API_KEY, or ANTHROPIC_API_KEY'\n );\n}\n\nconst client = new OpenAI({\n baseURL: LLM_BASE_URL,\n apiKey: LLM_API_KEY\n});\n\nasync function chatCompletion(messages, options = {}) {\n const {\n model = LLM_MODEL,\n temperature = 0,\n maxTokens = 1024\n } = options;\n\n if (DEBUG) {\n console.log(`[LLM Client] model=${model} base=${LLM_BASE_URL} msgs=${messages.length}`);\n }\n\n const completion = await client.chat.completions.create({\n model,\n temperature,\n max_tokens: maxTokens,\n messages\n });\n\n return completion.choices[0].message.content.trim();\n}\n\nfunction getConfig() {\n return {\n apiKey: LLM_API_KEY ? '***' + LLM_API_KEY.slice(-4) : null,\n baseUrl: LLM_BASE_URL,\n model: LLM_MODEL\n };\n}\n\nexport { chatCompletion, getConfig, LLM_MODEL };", "\nconst SYSTEM_PROMPT = `You are an expert at generating Playwright locators from page structure.\nYou receive a (possibly trimmed) accessibility tree in YAML and special DOM elements.\n\nCRITICAL RULES:\n1. ONLY use exact text/names that EXIST in the provided structure. NEVER invent or echo the user's query as locator text.\n2. The user's query is a DESCRIPTION of the element, NOT the element's text. You must FIND the matching element in the tree.\n Example: Query \"Admin Tab\" \u2192 find the link/tab named \"Admin\" in the tree \u2192 getByRole('link', { name: /Admin/i })\n Example: Query \"login button\" \u2192 find button named \"Login\" in the tree \u2192 getByRole('button', { name: /Login/i })\n3. YAML format: \"- link \\\\\"Sign in\\\\\"\" means a link element with accessible name \"Sign in\"\n \"- textbox \\\\\"Username\\\\\"\" means a textbox with accessible name \"Username\"\n4. Prefer getByRole with name regex: { name: /text/i } for robustness.\n5. Words like \"tab\", \"button\", \"link\", \"field\", \"textbox\", \"input\" in the query describe the ELEMENT TYPE, not the text content.\n\nACTION-AWARE RULES:\n- If action is \"fill\", \"type\", \"clear\", \"press\": The target MUST be an editable element (textbox, searchbox, combobox, input). Use getByRole('textbox', ...) or getByPlaceholder or getByLabel. NEVER target a label or static text.\n- If action is \"click\", \"dblclick\", \"tap\", \"focus\", \"hover\": Target the interactive element (link, button, tab, menuitem, etc).\n- If action is \"check\", \"uncheck\": Target a checkbox or radio element.\n- If action is \"select\": Target a combobox or listbox element.\n- If action is \"getText\" or null: Target any matching element.\n\nPRIORITY: getByTestId > getByRole > getByLabel > getByPlaceholder > getByAltText > getByTitle > getByText > locator(CSS)\nFor iframes: page.frameLocator('sel').getByRole(...)\nFor positional: .first() / .nth(n) / .last()\n\nReturn ONLY valid JSON.`;\n\nfunction buildMessages(payloadStr, query, action) {\n const actionHint = action\n ? `\\nAction: \"${action}\" (the locator MUST target an element appropriate for this action)`\n : '';\n\n return [\n { role: 'system', content: SYSTEM_PROMPT },\n {\n role: 'user',\n content: `Page:\\n${payloadStr}\\n\\nFind element described as: \"${query}\"${actionHint}\\n\\nIMPORTANT: Match the query to an ACTUAL element in the tree above. Do NOT use the query text as locator text.\\n\\nJSON: { \"strategy\":\"\u2026\", \"locatorString\":\"page.getBy\u2026()\", \"isInFrame\":false, \"frameSelector\":null, \"confidence\":0.95, \"reasoning\":\"\u2026\" }`\n }\n ];\n}\n\nfunction buildBatchMessages(payloadStr, queries) {\n const queriesList = queries.map((q, i) => `${i + 1}. \"${q}\"`).join('\\n');\n\n return [\n { role: 'system', content: SYSTEM_PROMPT },\n {\n role: 'user',\n content: `Page:\\n${payloadStr}\\n\\nFind locators for ALL (match each query to ACTUAL elements in the tree, do NOT echo query text):\\n${queriesList}\\n\\nReturn JSON array:\\n[{ \"query\":\"\u2026\", \"strategy\":\"\u2026\", \"locatorString\":\"page.getBy\u2026()\", \"isInFrame\":false, \"frameSelector\":null, \"confidence\":0.95, \"reasoning\":\"\u2026\" }]`\n }\n ];\n}\n\nexport { SYSTEM_PROMPT, buildMessages, buildBatchMessages };", "function parseJsonResponse(raw) {\n let text = raw.trim();\n if (text.startsWith('```')) {\n text = text.replace(/```json?\\n?/g, '').replace(/```\\n?$/g, '');\n }\n return JSON.parse(text);\n}\n\nfunction createPlaywrightLocator(page, locatorString, isInFrame, frameSelector) {\n let code = locatorString.replace(/^page\\./, '');\n let context = page;\n if (isInFrame && frameSelector) {\n context = page.frameLocator(frameSelector);\n code = code.replace(/^frameLocator\\([^)]+\\)\\./, '');\n }\n return evalLocator(context, code);\n}\n\nfunction parseInlineOptions(str) {\n if (!str) return {};\n const opts = {};\n const nameRegex = str.match(/name:\\s*\\/([^/]+)\\/([gimsuy]*)/);\n const nameStr = str.match(/name:\\s*'([^']+)'/);\n const exact = str.match(/exact:\\s*(true|false)/);\n if (nameRegex) opts.name = new RegExp(nameRegex[1], nameRegex[2] || undefined);\n else if (nameStr) opts.name = nameStr[1];\n if (exact) opts.exact = exact[1] === 'true';\n return opts;\n}\n\nfunction parseTextArg(quoted, regexBody, regexFlags) {\n if (quoted) return quoted;\n if (regexBody) return new RegExp(regexBody, regexFlags || undefined);\n return null;\n}\n\nfunction parseFilterOptions(str) {\n if (!str) return {};\n const opts = {};\n const hasText = str.match(/hasText:\\s*(?:'([^']+)'|\\/([^/]+)\\/([gimsuy]*))/);\n const hasNotText = str.match(/hasNotText:\\s*(?:'([^']+)'|\\/([^/]+)\\/([gimsuy]*))/);\n if (hasText) opts.hasText = hasText[1] || new RegExp(hasText[2], hasText[3] || undefined);\n if (hasNotText) opts.hasNotText = hasNotText[1] || new RegExp(hasNotText[2], hasNotText[3] || undefined);\n return opts;\n}\n\nfunction evalLocator(context, code) {\n const patterns = [\n {\n regex: /getByRole\\('([^']+)'(?:,\\s*({[^}]+}))?\\)(.*)/,\n handler: (m) => {\n const opts = parseInlineOptions(m[2]);\n return applyChain(context.getByRole(m[1], opts), m[3]);\n }\n },\n {\n regex: /getByTestId\\('([^']+)'\\)(.*)/,\n handler: (m) => applyChain(context.getByTestId(m[1]), m[2])\n },\n {\n regex: /getByLabel\\((?:'([^']+)'|\\/([^/]+)\\/([gimsuy]*))(?:,\\s*({[^}]+}))?\\)(.*)/,\n handler: (m) => {\n const t = parseTextArg(m[1], m[2], m[3]);\n const opts = parseInlineOptions(m[4]);\n return applyChain(context.getByLabel(t, opts), m[5]);\n }\n },\n {\n regex: /getByPlaceholder\\((?:'([^']+)'|\\/([^/]+)\\/([gimsuy]*))(?:,\\s*({[^}]+}))?\\)(.*)/,\n handler: (m) => {\n const t = parseTextArg(m[1], m[2], m[3]);\n const opts = parseInlineOptions(m[4]);\n return applyChain(context.getByPlaceholder(t, opts), m[5]);\n }\n },\n {\n regex: /getByText\\((?:'([^']+)'|\\/([^/]+)\\/([gimsuy]*))(?:,\\s*({[^}]+}))?\\)(.*)/,\n handler: (m) => {\n const t = parseTextArg(m[1], m[2], m[3]);\n const opts = parseInlineOptions(m[4]);\n return applyChain(context.getByText(t, opts), m[5]);\n }\n },\n {\n regex: /getByAltText\\((?:'([^']+)'|\\/([^/]+)\\/([gimsuy]*))(?:,\\s*({[^}]+}))?\\)(.*)/,\n handler: (m) => {\n const t = parseTextArg(m[1], m[2], m[3]);\n const opts = parseInlineOptions(m[4]);\n return applyChain(context.getByAltText(t, opts), m[5]);\n }\n },\n {\n regex: /getByTitle\\((?:'([^']+)'|\\/([^/]+)\\/([gimsuy]*))(?:,\\s*({[^}]+}))?\\)(.*)/,\n handler: (m) => {\n const t = parseTextArg(m[1], m[2], m[3]);\n const opts = parseInlineOptions(m[4]);\n return applyChain(context.getByTitle(t, opts), m[5]);\n }\n },\n {\n regex: /locator\\('([^']+)'\\)(.*)/,\n handler: (m) => applyChain(context.locator(m[1]), m[2])\n }\n ];\n\n for (const p of patterns) {\n const match = code.match(p.regex);\n if (match) return p.handler(match);\n }\n throw new Error(`Unsupported locator pattern: ${code}`);\n}\n\nfunction applyChain(loc, chain) {\n if (!chain?.trim()) return loc;\n if (chain.includes('.first()')) { loc = loc.first(); chain = chain.replace('.first()', ''); }\n if (chain.includes('.last()')) { loc = loc.last(); chain = chain.replace('.last()', ''); }\n const n = chain.match(/\\.nth\\((\\d+)\\)/);\n if (n) loc = loc.nth(parseInt(n[1]));\n const f = chain.match(/\\.filter\\(({[^}]+})\\)/);\n if (f) loc = loc.filter(parseFilterOptions(f[1]));\n return loc;\n}\n\nasync function validateLocator(locator, timeoutMs = 3000) {\n try {\n await locator.waitFor({ state: 'attached', timeout: timeoutMs });\n return true;\n } catch {\n return false;\n }\n}\n\nexport { parseJsonResponse, createPlaywrightLocator, evalLocator, applyChain, validateLocator };", "import fs from 'fs';\nimport path from 'path';\n\nconst DEBUG = process.env.LLM_LOCATOR_DEBUG === 'true';\nconst CACHE_FILE = process.env.LOCATOR_CACHE_FILE || '.locator-cache.json';\n\nlet diskCache = null;\n\nfunction loadDiskCache() {\n if (diskCache !== null) return diskCache;\n const filePath = path.resolve(CACHE_FILE);\n try {\n if (fs.existsSync(filePath)) {\n diskCache = JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n if (DEBUG) console.log(`[Disk Cache] Loaded ${Object.keys(diskCache).length} entries from ${CACHE_FILE}`);\n } else {\n diskCache = {};\n }\n } catch (e) {\n console.warn(`[Disk Cache] Failed to read ${CACHE_FILE}:`, e.message);\n diskCache = {};\n }\n return diskCache;\n}\n\nfunction saveDiskCache() {\n const filePath = path.resolve(CACHE_FILE);\n try {\n fs.writeFileSync(filePath, JSON.stringify(diskCache, null, 2), 'utf-8');\n } catch (e) {\n console.warn(`[Disk Cache] Failed to write ${CACHE_FILE}:`, e.message);\n }\n}\n\nfunction makeCacheKey(urlOrPage, query, action) {\n let urlPath;\n if (typeof urlOrPage === 'string') {\n try { urlPath = new URL(urlOrPage).pathname; } catch { urlPath = urlOrPage; }\n } else {\n try { urlPath = new URL(urlOrPage.url()).pathname; } catch { urlPath = urlOrPage.url(); }\n }\n return `${urlPath}::${(action || 'any').toLowerCase()}::${query.toLowerCase().trim()}`;\n}\n\nfunction getDiskEntry(url, query, action) {\n const cache = loadDiskCache();\n return cache[makeCacheKey(url, query, action)] || null;\n}\n\nfunction setDiskEntry(url, query, action, entry) {\n const cache = loadDiskCache();\n cache[makeCacheKey(url, query, action)] = {\n locatorString: entry.locatorString,\n strategy: entry.strategy,\n isInFrame: entry.isInFrame || false,\n frameSelector: entry.frameSelector || null,\n confidence: entry.confidence,\n reasoning: entry.reasoning,\n createdAt: new Date().toISOString(),\n hitCount: 0\n };\n saveDiskCache();\n}\n\nfunction invalidateDiskEntry(url, query, action) {\n const cache = loadDiskCache();\n const key = makeCacheKey(url, query, action);\n if (cache[key]) {\n delete cache[key];\n saveDiskCache();\n return true;\n }\n return false;\n}\n\nfunction bumpHitCount(url, query, action) {\n const cache = loadDiskCache();\n const key = makeCacheKey(url, query, action);\n if (cache[key]) {\n cache[key].hitCount = (cache[key].hitCount || 0) + 1;\n cache[key].lastUsed = new Date().toISOString();\n saveDiskCache();\n }\n}\n\nfunction clearDiskCache() {\n diskCache = {};\n saveDiskCache();\n}\n\nexport {\n loadDiskCache, getDiskEntry, setDiskEntry,\n invalidateDiskEntry, bumpHitCount, clearDiskCache, makeCacheKey\n};", "const memCache = new Map();\nlet structureCache = { url: null, timestamp: 0, data: null };\nconst STRUCTURE_TTL = 8000;\n\nfunction getMemKey(url, query, action) {\n return `${url}::${(action || 'any').toLowerCase()}::${query.toLowerCase().trim()}`;\n}\n\nfunction getMemEntry(url, query, action) {\n return memCache.get(getMemKey(url, query, action)) || null;\n}\n\nfunction setMemEntry(url, query, action, entry) {\n memCache.set(getMemKey(url, query, action), entry);\n}\n\nfunction deleteMemEntry(url, query, action) {\n memCache.delete(getMemKey(url, query, action));\n}\n\nfunction getStructureCache() {\n return structureCache;\n}\n\nfunction setStructureCache(url, data) {\n structureCache = { url, timestamp: Date.now(), data };\n}\n\nfunction isStructureCacheValid(url) {\n return (\n structureCache.url === url &&\n (Date.now() - structureCache.timestamp) < STRUCTURE_TTL &&\n structureCache.data\n );\n}\n\nfunction clearStructureCache() {\n structureCache = { url: null, timestamp: 0, data: null };\n}\n\nfunction clearMemoryCache() {\n memCache.clear();\n clearStructureCache();\n}\n\nexport {\n getMemKey, getMemEntry, setMemEntry, deleteMemEntry,\n getStructureCache, setStructureCache, isStructureCacheValid, clearStructureCache,\n clearMemoryCache, STRUCTURE_TTL\n};", "import { isStructureCacheValid, getStructureCache, setStructureCache } from './cache/memory-cache.js';\n\nconst DEBUG = process.env.LLM_LOCATOR_DEBUG === 'true';\n\nasync function getPageStructure(page, forceRefresh = false) {\n const url = page.url();\n\n if (!forceRefresh && isStructureCacheValid(url)) {\n if (DEBUG) console.log('[Page Structure] Using cached');\n return getStructureCache().data;\n }\n\n const structure = { mainFrame: await getFrameStructure(page), frames: [] };\n\n for (const frame of page.frames()) {\n if (frame === page.mainFrame()) continue;\n try {\n const frameElement = await frame.frameElement();\n const frameInfo = await page.evaluate((el) => ({\n id: el.id || null,\n name: el.name || null,\n selector: el.id ? `#${el.id}` :\n el.name ? `iframe[name=\"${el.name}\"]` :\n el.title ? `iframe[title=\"${el.title}\"]` : 'iframe'\n }), frameElement);\n structure.frames.push({ ...frameInfo, content: await getFrameStructure(frame) });\n } catch (e) { /* detached */ }\n }\n\n setStructureCache(url, structure);\n return structure;\n}\n\nasync function getFrameStructure(pageOrFrame) {\n let ariaTree = null;\n let specialElements = [];\n\n const [ariaResult, domResult] = await Promise.allSettled([\n pageOrFrame.locator('body').ariaSnapshot({ timeout: 5000 }),\n pageOrFrame.evaluate(() => {\n const els = [];\n for (const el of document.querySelectorAll(\n '[data-testid], [data-test-id], [data-test], [data-qa], [data-cy], ' +\n '[placeholder], [alt], [aria-label]'\n )) {\n const e = {\n tag: el.tagName.toLowerCase(),\n testId: el.getAttribute('data-testid') || el.getAttribute('data-test-id') ||\n el.getAttribute('data-test') || el.getAttribute('data-qa') ||\n el.getAttribute('data-cy') || null,\n placeholder: el.getAttribute('placeholder') || null,\n alt: el.getAttribute('alt') || null,\n ariaLabel: el.getAttribute('aria-label') || null\n };\n if (e.testId || e.placeholder || e.alt || e.ariaLabel) els.push(e);\n }\n return els;\n })\n ]);\n\n if (ariaResult.status === 'fulfilled') ariaTree = ariaResult.value;\n else {\n try {\n if (typeof pageOrFrame.mainFrame === 'function') {\n const snap = await pageOrFrame.accessibility.snapshot();\n if (snap) ariaTree = JSON.stringify(simplifyAriaTree(snap));\n }\n } catch (e) { /* */ }\n }\n\n if (domResult.status === 'fulfilled') specialElements = domResult.value;\n return { ariaTree, specialElements };\n}\n\nfunction simplifyAriaTree(node, depth = 0) {\n if (!node || depth > 8) return null;\n const s = {};\n if (node.role) s.role = node.role;\n if (node.name) s.name = node.name;\n if (node.children?.length) {\n s.children = node.children.map(c => simplifyAriaTree(c, depth + 1)).filter(Boolean);\n }\n return s;\n}\n\nfunction trimSnapshotForQuery(ariaYaml, query, maxLines = 150) {\n if (!ariaYaml || typeof ariaYaml !== 'string') return ariaYaml;\n\n const lines = ariaYaml.split('\\n');\n if (lines.length <= maxLines) return ariaYaml;\n\n const queryTokens = query.toLowerCase().replace(/[^a-z0-9\\s]/g, '').split(/\\s+/).filter(Boolean);\n\n const scoredLines = lines.map((line, idx) => {\n const lower = line.toLowerCase();\n let score = 0;\n for (const token of queryTokens) {\n if (lower.includes(token)) score += 10;\n }\n if (/button|link|textbox|searchbox|combobox|checkbox|tab\\b/.test(lower)) score += 3;\n if (/heading|navigation|banner|main|form/.test(lower)) score += 2;\n return { line, idx, score };\n });\n\n const relevant = new Set();\n\n for (const { idx, score } of scoredLines) {\n if (score > 0) {\n const contextStart = Math.max(0, idx - 3);\n const contextEnd = Math.min(lines.length - 1, idx + 2);\n for (let i = contextStart; i <= contextEnd; i++) relevant.add(i);\n }\n }\n\n for (let i = 0; i < Math.min(15, lines.length); i++) relevant.add(i);\n\n if (relevant.size < maxLines) {\n const interactive = scoredLines\n .filter(s => s.score >= 3 && !relevant.has(s.idx))\n .sort((a, b) => b.score - a.score);\n for (const { idx } of interactive) {\n if (relevant.size >= maxLines) break;\n relevant.add(idx);\n if (idx > 0) relevant.add(idx - 1);\n }\n }\n\n const sorted = [...relevant].sort((a, b) => a - b);\n const result = [];\n let lastIdx = -1;\n for (const idx of sorted) {\n if (lastIdx !== -1 && idx - lastIdx > 1) result.push(' ...');\n result.push(lines[idx]);\n lastIdx = idx;\n }\n\n return result.join('\\n');\n}\n\nexport { getPageStructure, getFrameStructure, trimSnapshotForQuery };", "import { chatCompletion } from './llm/client.js';\nimport { buildMessages, buildBatchMessages } from './llm/prompt.js';\nimport { parseJsonResponse, createPlaywrightLocator, validateLocator } from './llm/parser.js';\nimport { getDiskEntry, setDiskEntry, invalidateDiskEntry, bumpHitCount } from './cache/disk-cache.js';\nimport { getMemEntry, setMemEntry, deleteMemEntry, clearStructureCache } from './cache/memory-cache.js';\nimport { getPageStructure, trimSnapshotForQuery } from './page-structure.js';\n\nconst DEBUG = process.env.LLM_LOCATOR_DEBUG === 'true';\n\nfunction buildPayload(pageStructure, query) {\n const trimmedAria = trimSnapshotForQuery(pageStructure.mainFrame.ariaTree, query);\n\n const payload = {\n ariaTree: trimmedAria,\n specialElements: pageStructure.mainFrame.specialElements,\n frames: pageStructure.frames.length > 0 ? pageStructure.frames.map(f => ({\n selector: f.selector,\n ariaTree: trimSnapshotForQuery(f.content?.ariaTree, query, 50),\n specialElements: f.content?.specialElements || []\n })) : undefined\n };\n\n let payloadStr = JSON.stringify(payload, null, 2);\n if (payloadStr.length > 15000) payloadStr = payloadStr.substring(0, 15000) + '\\n...(truncated)';\n return payloadStr;\n}\n\nasync function queryLLM(pageStructure, query, options = {}) {\n const { action = null } = options;\n const payloadStr = buildPayload(pageStructure, query);\n\n if (DEBUG) console.log('[Resolver] Payload size:', payloadStr.length, 'chars');\n\n const messages = buildMessages(payloadStr, query, action);\n const raw = await chatCompletion(messages, options);\n return parseJsonResponse(raw);\n}\n\nasync function resolveLocator(page, query, options = {}) {\n const shouldDebug = DEBUG || options.debug;\n const action = options.action || null;\n const url = page.url();\n\n const memHit = getMemEntry(url, query, action);\n if (memHit) {\n if (shouldDebug) console.log(`[Memory Cache Hit] \"${query}\" \u2192 ${memHit.locatorString}`);\n return memHit;\n }\n\n const diskHit = getDiskEntry(url, query, action);\n if (diskHit) {\n if (shouldDebug) console.log(`[Disk Cache Hit] \"${query}\" \u2192 ${diskHit.locatorString} (hits: ${diskHit.hitCount || 0})`);\n const result = {\n found: true,\n strategy: diskHit.strategy,\n locatorString: diskHit.locatorString,\n isInFrame: diskHit.isInFrame || false,\n frameSelector: diskHit.frameSelector || null,\n confidence: diskHit.confidence,\n reasoning: diskHit.reasoning,\n source: 'disk'\n };\n setMemEntry(url, query, action, result);\n return result;\n }\n\n if (shouldDebug) console.log(`[LLM] Querying: \"${query}\" (action: ${action || 'any'})`);\n const t0 = Date.now();\n\n const pageStructure = await getPageStructure(page);\n\n try {\n const parsed = await queryLLM(pageStructure, query, options);\n\n const result = {\n found: parsed.confidence > 0.5,\n strategy: parsed.strategy,\n locatorString: parsed.locatorString,\n isInFrame: parsed.isInFrame || false,\n frameSelector: parsed.frameSelector || null,\n confidence: parsed.confidence,\n reasoning: parsed.reasoning,\n fallbackLocators: parsed.fallbackLocators || [],\n source: 'llm'\n };\n\n if (shouldDebug) console.log(`[LLM] \"${query}\" \u2192 ${result.locatorString} (${Date.now() - t0}ms)`);\n\n if (result.found) {\n setMemEntry(url, query, action, result);\n setDiskEntry(url, query, action, result);\n }\n\n return result;\n } catch (error) {\n console.error('LLM locator error:', error.message);\n return { found: false, confidence: 0, error: error.message, source: 'llm' };\n }\n}\n\nasync function getLocator(page, query, options = {}) {\n const shouldDebug = DEBUG || options.debug;\n const action = options.action || null;\n const url = page.url();\n\n const result = await resolveLocator(page, query, options);\n if (!result.found) throw new Error(`Could not find element: ${query}. ${result.error || ''}`);\n\n const locator = createPlaywrightLocator(page, result.locatorString, result.isInFrame, result.frameSelector);\n\n if (result.source === 'disk') {\n const valid = await validateLocator(locator);\n if (valid) {\n bumpHitCount(url, query, action);\n return { locator, result };\n }\n\n if (shouldDebug) console.log(`[Stale Cache] \"${query}\" \u2192 ${result.locatorString} no longer valid, re-querying LLM...`);\n invalidateDiskEntry(url, query, action);\n deleteMemEntry(url, query, action);\n clearStructureCache();\n\n const freshResult = await resolveLocator(page, query, options);\n if (!freshResult.found) throw new Error(`Could not find element after retry: ${query}. ${freshResult.error || ''}`);\n\n const freshLocator = createPlaywrightLocator(page, freshResult.locatorString, freshResult.isInFrame, freshResult.frameSelector);\n return { locator: freshLocator, result: freshResult };\n }\n\n return { locator, result };\n}\n\nasync function resolveLocatorsBatch(page, queries, options = {}) {\n const shouldDebug = DEBUG || options.debug;\n const url = page.url();\n const results = new Map();\n const uncached = [];\n\n for (const q of queries) {\n const memHit = getMemEntry(url, q, null);\n if (memHit) { results.set(q, memHit); continue; }\n const diskHit = getDiskEntry(url, q, null);\n if (diskHit) {\n const r = {\n found: true, strategy: diskHit.strategy, locatorString: diskHit.locatorString,\n isInFrame: diskHit.isInFrame || false, frameSelector: diskHit.frameSelector || null,\n confidence: diskHit.confidence, reasoning: diskHit.reasoning, source: 'disk'\n };\n setMemEntry(url, q, null, r);\n results.set(q, r);\n } else {\n uncached.push(q);\n }\n }\n\n if (uncached.length === 0) return results;\n\n if (shouldDebug) console.log(`[Batch] Resolving ${uncached.length} queries in 1 call`);\n const t0 = Date.now();\n\n const pageStructure = await getPageStructure(page);\n let payloadStr = buildPayload(pageStructure, uncached.join(' '));\n if (payloadStr.length > 20000) payloadStr = payloadStr.substring(0, 20000) + '\\n...(truncated)';\n\n try {\n const messages = buildBatchMessages(payloadStr, uncached);\n const raw = await chatCompletion(messages, options);\n const parsed = parseJsonResponse(raw);\n\n if (shouldDebug) console.log(`[Batch] ${parsed.length} results in ${Date.now() - t0}ms`);\n\n for (let i = 0; i < uncached.length && i < parsed.length; i++) {\n const p = parsed[i];\n const result = {\n found: p.confidence > 0.5,\n strategy: p.strategy,\n locatorString: p.locatorString,\n isInFrame: p.isInFrame || false,\n frameSelector: p.frameSelector || null,\n confidence: p.confidence,\n reasoning: p.reasoning,\n source: 'llm'\n };\n results.set(uncached[i], result);\n if (result.found) {\n setMemEntry(url, uncached[i], null, result);\n setDiskEntry(url, uncached[i], null, result);\n }\n }\n } catch (error) {\n console.error('Batch LLM error:', error.message);\n for (const q of uncached) {\n if (!results.has(q)) results.set(q, { found: false, confidence: 0, error: error.message });\n }\n }\n\n return results;\n}\n\nexport { resolveLocator, getLocator, resolveLocatorsBatch };", "const DEBUG = process.env.LLM_LOCATOR_DEBUG === 'true';\n\nclass SmartAction {\n #locator;\n #result;\n #query;\n\n constructor(locator, result, query) {\n this.#locator = locator;\n this.#result = result;\n this.#query = query;\n }\n\n get rawLocator() { return this.#locator; }\n get result() { return this.#result; }\n get query() { return this.#query; }\n\n async click(options) { return this.#locator.click(options); }\n async dblclick(options) { return this.#locator.dblclick(options); }\n async tap(options) { return this.#locator.tap(options); }\n async hover(options) { return this.#locator.hover(options); }\n async focus() { return this.#locator.focus(); }\n async blur() { return this.#locator.blur(); }\n\n async fill(value, options) { return this.#locator.fill(value, options); }\n async type(text, options) { return this.#locator.type(text, options); }\n async press(key, options) { return this.#locator.press(key, options); }\n async pressSequentially(text, options) { return this.#locator.pressSequentially(text, options); }\n async clear(options) { return this.#locator.clear(options); }\n async setInputFiles(files, options) { return this.#locator.setInputFiles(files, options); }\n async selectOption(values, options) { return this.#locator.selectOption(values, options); }\n async selectText(options) { return this.#locator.selectText(options); }\n\n async check(options) { return this.#locator.check(options); }\n async uncheck(options) { return this.#locator.uncheck(options); }\n async setChecked(checked, options) { return this.#locator.setChecked(checked, options); }\n\n async scrollIntoViewIfNeeded(options) { return this.#locator.scrollIntoViewIfNeeded(options); }\n async screenshot(options) { return this.#locator.screenshot(options); }\n\n async dragTo(target, options) {\n const dest = target instanceof SmartAction ? target.rawLocator : target;\n return this.#locator.dragTo(dest, options);\n }\n\n async waitFor(options) { return this.#locator.waitFor(options); }\n async waitForVisible(timeout = 30000) { return this.#locator.waitFor({ state: 'visible', timeout }); }\n async waitForHidden(timeout = 30000) { return this.#locator.waitFor({ state: 'hidden', timeout }); }\n async waitForAttached(timeout = 30000) { return this.#locator.waitFor({ state: 'attached', timeout }); }\n async waitForDetached(timeout = 30000) { return this.#locator.waitFor({ state: 'detached', timeout }); }\n\n async isVisible() { return this.#locator.isVisible(); }\n async isHidden() { return this.#locator.isHidden(); }\n async isEnabled() { return this.#locator.isEnabled(); }\n async isDisabled() { return this.#locator.isDisabled(); }\n async isChecked() { return this.#locator.isChecked(); }\n async isEditable() { return this.#locator.isEditable(); }\n\n async textContent() { return this.#locator.textContent(); }\n async innerText() { return this.#locator.innerText(); }\n async innerHTML() { return this.#locator.innerHTML(); }\n async inputValue(options) { return this.#locator.inputValue(options); }\n async getAttribute(name) { return this.#locator.getAttribute(name); }\n async boundingBox() { return this.#locator.boundingBox(); }\n async count() { return this.#locator.count(); }\n async allTextContents() { return this.#locator.allTextContents(); }\n async allInnerTexts() { return this.#locator.allInnerTexts(); }\n async all() { return this.#locator.all(); }\n\n async evaluate(pageFunction, arg) { return this.#locator.evaluate(pageFunction, arg); }\n async evaluateAll(pageFunction, arg) { return this.#locator.evaluateAll(pageFunction, arg); }\n async evaluateHandle(pageFunction, arg) { return this.#locator.evaluateHandle(pageFunction, arg); }\n\n first() { return this.#locator.first(); }\n last() { return this.#locator.last(); }\n nth(index) { return this.#locator.nth(index); }\n filter(options) { return this.#locator.filter(options); }\n getByRole(role, options) { return this.#locator.getByRole(role, options); }\n getByText(text, options) { return this.#locator.getByText(text, options); }\n getByLabel(text, options) { return this.#locator.getByLabel(text, options); }\n getByPlaceholder(text, options) { return this.#locator.getByPlaceholder(text, options); }\n getByTestId(testId) { return this.#locator.getByTestId(testId); }\n locator(selectorOrLocator, options) { return this.#locator.locator(selectorOrLocator, options); }\n\n async highlight() { return this.#locator.highlight(); }\n\n async exists() { return (await this.#locator.count()) > 0; }\n\n async getValue() {\n try { return await this.#locator.inputValue(); }\n catch { return await this.#locator.textContent(); }\n }\n\n async getClasses() {\n const cls = await this.#locator.getAttribute('class');\n return cls ? cls.split(/\\s+/).filter(Boolean) : [];\n }\n\n async hasClass(className) {\n return (await this.getClasses()).includes(className);\n }\n\n async getCssProperty(property) {\n return this.#locator.evaluate(\n (el, prop) => window.getComputedStyle(el).getPropertyValue(prop),\n property\n );\n }\n\n toString() {\n return `SmartAction(\"${this.#query}\" \u2192 ${this.#result?.locatorString || 'unknown'})`;\n }\n}\n\nexport { SmartAction };", "import { getLocator, resolveLocatorsBatch } from './resolver.js';\nimport { clearMemoryCache } from './cache/memory-cache.js';\nimport { clearDiskCache } from './cache/disk-cache.js';\nimport { SmartAction } from './actions.js';\n\nfunction clearCache() {\n clearMemoryCache();\n}\n\nfunction clearAllCaches() {\n clearMemoryCache();\n clearDiskCache();\n}\n\nfunction createSmartLocator(page, options = {}) {\n const { verbose = false } = options;\n\n async function resolve(query, action) {\n const { locator, result } = await getLocator(page, query, { ...options, action });\n if (verbose) console.log(`[Smart Locator] ${action || 'locate'}(\"${query}\") \u2192 ${result.locatorString} (${result.source})`);\n return new SmartAction(locator, result, query);\n }\n\n return {\n async prefetch(...queries) {\n const t0 = Date.now();\n const results = await resolveLocatorsBatch(page, queries, options);\n if (verbose) console.log(`[Smart Locator] Prefetched ${results.size} locators in ${Date.now() - t0}ms`);\n return results;\n },\n\n async locate(query, action) {\n return resolve(query, action || null);\n },\n\n async click(query, clickOptions) {\n const el = await resolve(query, 'click');\n await el.click(clickOptions);\n return el;\n },\n\n async dblclick(query, clickOptions) {\n const el = await resolve(query, 'click');\n await el.dblclick(clickOptions);\n return el;\n },\n\n async fill(query, value, fillOptions) {\n const el = await resolve(query, 'fill');\n await el.fill(value, fillOptions);\n return el;\n },\n\n async type(query, text, typeOptions) {\n const el = await resolve(query, 'fill');\n await el.type(text, typeOptions);\n return el;\n },\n\n async pressSequentially(query, text, pressOptions) {\n const el = await resolve(query, 'fill');\n await el.pressSequentially(text, pressOptions);\n return el;\n },\n\n async clear(query) {\n const el = await resolve(query, 'fill');\n await el.clear();\n return el;\n },\n\n async press(query, key, pressOptions) {\n const el = await resolve(query, 'fill');\n await el.press(key, pressOptions);\n return el;\n },\n\n async check(query, checkOptions) {\n const el = await resolve(query, 'check');\n await el.check(checkOptions);\n return el;\n },\n\n async uncheck(query, uncheckOptions) {\n const el = await resolve(query, 'uncheck');\n await el.uncheck(uncheckOptions);\n return el;\n },\n\n async setChecked(query, checked, checkOptions) {\n const el = await resolve(query, checked ? 'check' : 'uncheck');\n await el.setChecked(checked, checkOptions);\n return el;\n },\n\n async select(query, values, selectOptions) {\n const el = await resolve(query, 'select');\n await el.selectOption(values, selectOptions);\n return el;\n },\n\n async hover(query, hoverOptions) {\n const el = await resolve(query, 'hover');\n await el.hover(hoverOptions);\n return el;\n },\n\n async focus(query) {\n const el = await resolve(query, 'click');\n await el.focus();\n return el;\n },\n\n async tap(query, tapOptions) {\n const el = await resolve(query, 'click');\n await el.tap(tapOptions);\n return el;\n },\n\n async setInputFiles(query, files, fileOptions) {\n const el = await resolve(query, 'fill');\n await el.setInputFiles(files, fileOptions);\n return el;\n },\n\n async dragTo(srcQuery, destQuery, dragOptions) {\n const src = await resolve(srcQuery, 'click');\n const dest = await resolve(destQuery, 'click');\n await src.dragTo(dest, dragOptions);\n return { source: src, target: dest };\n },\n\n async selectText(query) {\n const el = await resolve(query, 'click');\n await el.selectText();\n return el;\n },\n\n async scrollIntoView(query) {\n const el = await resolve(query, null);\n await el.scrollIntoViewIfNeeded();\n return el;\n },\n\n async screenshot(query, screenshotOptions) {\n const el = await resolve(query, null);\n return el.screenshot(screenshotOptions);\n },\n\n async highlight(query) {\n const el = await resolve(query, null);\n await el.highlight();\n return el;\n },\n\n async waitFor(query, waitOptions) {\n const el = await resolve(query, null);\n await el.waitFor(waitOptions);\n return el;\n },\n\n async waitForVisible(query, timeout) {\n const el = await resolve(query, null);\n await el.waitForVisible(timeout);\n return el;\n },\n\n async waitForHidden(query, timeout) {\n const el = await resolve(query, null);\n await el.waitForHidden(timeout);\n return el;\n },\n\n async waitForAttached(query, timeout) {\n const el = await resolve(query, null);\n await el.waitForAttached(timeout);\n return el;\n },\n\n async waitForDetached(query, timeout) {\n const el = await resolve(query, null);\n await el.waitForDetached(timeout);\n return el;\n },\n\n async isVisible(query) {\n try { const el = await resolve(query, null); return await el.isVisible(); }\n catch { return false; }\n },\n\n async isHidden(query) {\n try { const el = await resolve(query, null); return await el.isHidden(); }\n catch { return true; }\n },\n\n async isEnabled(query) {\n try { const el = await resolve(query, null); return await el.isEnabled(); }\n catch { return false; }\n },\n\n async isDisabled(query) {\n try { const el = await resolve(query, null); return await el.isDisabled(); }\n catch { return true; }\n },\n\n async isChecked(query) {\n try { const el = await resolve(query, null); return await el.isChecked(); }\n catch { return false; }\n },\n\n async isEditable(query) {\n try { const el = await resolve(query, null); return await el.isEditable(); }\n catch { return false; }\n },\n\n async exists(query) {\n try { const el = await resolve(query, null); return await el.exists(); }\n catch { return false; }\n },\n\n async getText(query) {\n const el = await resolve(query, 'getText');\n return el.textContent();\n },\n\n async getInnerText(query) {\n const el = await resolve(query, 'getText');\n return el.innerText();\n },\n\n async getInnerHTML(query) {\n const el = await resolve(query, 'getText');\n return el.innerHTML();\n },\n\n async getInputValue(query) {\n const el = await resolve(query, 'fill');\n return el.inputValue();\n },\n\n async getAttribute(query, attr) {\n const el = await resolve(query, null);\n return el.getAttribute(attr);\n },\n\n async getBoundingBox(query) {\n const el = await resolve(query, null);\n return el.boundingBox();\n },\n\n async count(query) {\n const el = await resolve(query, null);\n return el.count();\n },\n\n clearCache() { clearCache(); },\n clearAllCaches() { clearAllCaches(); }\n };\n}\n\nexport { createSmartLocator, clearCache, clearAllCaches };", "export { getLocator, resolveLocator } from './resolver.js';\nexport { createSmartLocator, clearCache, clearAllCaches } from './smart-locator.js';\nexport { getPageStructure } from './page-structure.js';\nexport { loadDiskCache, invalidateDiskEntry } from './cache/disk-cache.js';\nexport { chatCompletion, getConfig } from './llm/client.js';\nexport { SmartAction } from './actions.js';\nimport { getLocator } from './resolver.js';\n\nasync function findLocator(page, query, options = {}) {\n try {\n const { result } = await getLocator(page, query, options);\n return {\n found: true, strategy: result.strategy, locatorString: result.locatorString,\n locatorType: result.strategy, confidence: result.confidence,\n fullLocatorString: result.locatorString, reasoning: result.reasoning,\n isInFrame: result.isInFrame, frameSelector: result.frameSelector,\n fallbackLocators: result.fallbackLocators || [], element: { strategy: result.strategy }\n };\n } catch (e) {\n return { found: false, locatorString: null, confidence: 0, error: e.message };\n }\n}\n\nasync function findAllMatches(page, query, options = {}) {\n try {\n const { result } = await getLocator(page, query, options);\n return result.found ? [result] : [];\n } catch { return []; }\n}\n\nexport { findLocator, findAllMatches };"],
5
- "mappings": "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",
6
- "names": ["OpenAI", "DEBUG", "path", "fs", "DEBUG", "DEBUG", "DEBUG"]
3
+ "sources": ["../src/llm/parser.js", "../src/entry.js", "../src/llm/client.js", "../src/llm/prompt.js", "../src/resolver.js", "../src/cache/disk-cache.js", "../src/cache/memory-cache.js", "../src/page-structure.js", "../src/actions.js", "../src/smart-locator.js", "../src/llm-locator.js"],
4
+ "sourcesContent": ["function parseJsonResponse(raw) {\n let text = raw.trim();\n if (text.startsWith('```')) {\n text = text.replace(/```json?\\n?/g, '').replace(/```\\n?$/g, '');\n }\n return JSON.parse(text);\n}\n\nfunction createPlaywrightLocator(page, locatorString, isInFrame, frameSelector) {\n let code = locatorString.replace(/^page\\./, '');\n let context = page;\n if (isInFrame && frameSelector) {\n context = page.frameLocator(frameSelector);\n code = code.replace(/^frameLocator\\([^)]+\\)\\./, '');\n }\n return evalLocator(context, code);\n}\n\nfunction parseInlineOptions(str) {\n if (!str) return {};\n const opts = {};\n let nameMatch = null;\n const nameIdx = str.indexOf('name:');\n if (nameIdx !== -1) {\n const after = str.substring(nameIdx + 5).trim();\n if (after.startsWith('/')) {\n const lastSlash = after.lastIndexOf('/');\n if (lastSlash > 0) {\n const body = after.substring(1, lastSlash);\n const flags = after.substring(lastSlash + 1).match(/^[gimsuy]*/)[0];\n try {\n opts.name = new RegExp(body, flags || undefined);\n } catch {\n opts.name = body;\n }\n }\n } else if (after.startsWith(\"'\")) {\n const end = after.indexOf(\"'\", 1);\n if (end > 0) opts.name = after.substring(1, end);\n }\n }\n const exact = str.match(/exact:\\s*(true|false)/);\n if (exact) opts.exact = exact[1] === 'true';\n return opts;\n}\n\nfunction parseTextArg(quoted, regexBody, regexFlags) {\n if (quoted) return quoted;\n if (regexBody) {\n try {\n return new RegExp(regexBody, regexFlags || undefined);\n } catch {\n return regexBody;\n }\n }\n return null;\n}\n\nfunction parseFilterOptions(str) {\n if (!str) return {};\n const opts = {};\n const hasText = str.match(/hasText:\\s*(?:'([^']+)'|\\/([^/]+)\\/([gimsuy]*))/);\n const hasNotText = str.match(/hasNotText:\\s*(?:'([^']+)'|\\/([^/]+)\\/([gimsuy]*))/);\n if (hasText) opts.hasText = hasText[1] || new RegExp(hasText[2], hasText[3] || undefined);\n if (hasNotText) opts.hasNotText = hasNotText[1] || new RegExp(hasNotText[2], hasNotText[3] || undefined);\n return opts;\n}\n\nfunction evalLocator(context, code) {\n const patterns = [\n {\n regex: /getByRole\\('([^']+)'(?:,\\s*(\\{.*\\}))?\\)(.*)/,\n handler: (m) => {\n const opts = parseInlineOptions(m[2]);\n return applyChain(context.getByRole(m[1], opts), m[3]);\n }\n },\n {\n regex: /getByTestId\\('([^']+)'\\)(.*)/,\n handler: (m) => applyChain(context.getByTestId(m[1]), m[2])\n },\n {\n regex: /getByLabel\\((?:'([^']+)'|\\/([^/]+)\\/([gimsuy]*))(?:,\\s*({[^}]+}))?\\)(.*)/,\n handler: (m) => {\n const t = parseTextArg(m[1], m[2], m[3]);\n const opts = parseInlineOptions(m[4]);\n return applyChain(context.getByLabel(t, opts), m[5]);\n }\n },\n {\n regex: /getByPlaceholder\\((?:'([^']+)'|\\/([^/]+)\\/([gimsuy]*))(?:,\\s*({[^}]+}))?\\)(.*)/,\n handler: (m) => {\n const t = parseTextArg(m[1], m[2], m[3]);\n const opts = parseInlineOptions(m[4]);\n return applyChain(context.getByPlaceholder(t, opts), m[5]);\n }\n },\n {\n regex: /getByText\\((?:'([^']+)'|\\/([^/]+)\\/([gimsuy]*))(?:,\\s*({[^}]+}))?\\)(.*)/,\n handler: (m) => {\n const t = parseTextArg(m[1], m[2], m[3]);\n const opts = parseInlineOptions(m[4]);\n return applyChain(context.getByText(t, opts), m[5]);\n }\n },\n {\n regex: /getByAltText\\((?:'([^']+)'|\\/([^/]+)\\/([gimsuy]*))(?:,\\s*({[^}]+}))?\\)(.*)/,\n handler: (m) => {\n const t = parseTextArg(m[1], m[2], m[3]);\n const opts = parseInlineOptions(m[4]);\n return applyChain(context.getByAltText(t, opts), m[5]);\n }\n },\n {\n regex: /getByTitle\\((?:'([^']+)'|\\/([^/]+)\\/([gimsuy]*))(?:,\\s*({[^}]+}))?\\)(.*)/,\n handler: (m) => {\n const t = parseTextArg(m[1], m[2], m[3]);\n const opts = parseInlineOptions(m[4]);\n return applyChain(context.getByTitle(t, opts), m[5]);\n }\n },\n {\n regex: /locator\\('xpath=([^']+)'\\)(.*)/,\n handler: (m) => applyChain(context.locator(`xpath=${m[1]}`), m[2])\n },\n {\n regex: /locator\\(\"xpath=([^\"]+)\"\\)(.*)/,\n handler: (m) => applyChain(context.locator(`xpath=${m[1]}`), m[2])\n },\n {\n regex: /locator\\('([^']+)'\\)(.*)/,\n handler: (m) => applyChain(context.locator(m[1]), m[2])\n },\n {\n regex: /locator\\(\"([^\"]+)\"\\)(.*)/,\n handler: (m) => applyChain(context.locator(m[1]), m[2])\n }\n ];\n\n for (const p of patterns) {\n const match = code.match(p.regex);\n if (match) return p.handler(match);\n }\n throw new Error(`Unsupported locator pattern: ${code}`);\n}\n\nfunction applyChain(loc, chain) {\n if (!chain?.trim()) return loc;\n if (chain.includes('.first()')) { loc = loc.first(); chain = chain.replace('.first()', ''); }\n if (chain.includes('.last()')) { loc = loc.last(); chain = chain.replace('.last()', ''); }\n const n = chain.match(/\\.nth\\((\\d+)\\)/);\n if (n) loc = loc.nth(parseInt(n[1]));\n const f = chain.match(/\\.filter\\(({[^}]+})\\)/);\n if (f) loc = loc.filter(parseFilterOptions(f[1]));\n return loc;\n}\n\nasync function validateLocator(locator, timeoutMs = 3000) {\n try {\n await locator.waitFor({ state: 'attached', timeout: timeoutMs });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function validateWithFallback(page, primary, fallbacks, isInFrame, frameSelector) {\n const primaryLocator = createPlaywrightLocator(page, primary, isInFrame, frameSelector);\n const valid = await validateLocator(primaryLocator);\n if (valid) return { locator: primaryLocator, locatorString: primary };\n\n if (fallbacks && fallbacks.length > 0) {\n for (const fb of fallbacks) {\n try {\n const fbLocator = createPlaywrightLocator(page, fb, isInFrame, frameSelector);\n const fbValid = await validateLocator(fbLocator, 2000);\n if (fbValid) return { locator: fbLocator, locatorString: fb };\n } catch { /* skip invalid fallback */ }\n }\n }\n\n return null;\n}\n\nexport { parseJsonResponse, createPlaywrightLocator, evalLocator, applyChain, validateLocator, validateWithFallback };", "export { createSmartLocator, clearCache, clearAllCaches } from './smart-locator.js';\nexport { SmartAction } from './actions.js';\nexport { resolveLocator, getLocator, resolveLocatorsBatch } from './resolver.js';\nexport { getPageStructure } from './page-structure.js';\nexport { chatCompletion, getConfig } from './llm/client.js';\nexport { findLocator, findAllMatches } from './llm-locator.js';", "import 'dotenv/config';\nimport OpenAI from 'openai';\n\nconst DEBUG = process.env.LLM_LOCATOR_DEBUG === 'true';\n\nconst LLM_API_KEY = process.env.LLM_API_KEY || process.env.ROUTELLM_API_KEY || process.env.OPENAI_API_KEY || process.env.ANTHROPIC_API_KEY;\nconst LLM_BASE_URL = process.env.LLM_BASE_URL || process.env.ROUTELLM_BASE_URL || 'https://api.openai.com/v1';\nconst LLM_MODEL = process.env.LLM_MODEL || process.env.ROUTELLM_MODEL || 'gpt-4o-mini';\n\nif (!LLM_API_KEY) {\n throw new Error(\n 'No LLM API key found. Set one of: LLM_API_KEY, ROUTELLM_API_KEY, OPENAI_API_KEY, or ANTHROPIC_API_KEY'\n );\n}\n\nconst client = new OpenAI({\n baseURL: LLM_BASE_URL,\n apiKey: LLM_API_KEY\n});\n\nasync function chatCompletion(messages, options = {}) {\n const {\n model = LLM_MODEL,\n temperature = 0,\n maxTokens = 256\n } = options;\n\n if (DEBUG) {\n console.log(`[LLM Client] model=${model} base=${LLM_BASE_URL} msgs=${messages.length}`);\n }\n\n const params = {\n model,\n temperature,\n max_tokens: maxTokens,\n messages\n };\n\n if (model.includes('gpt-') || model.includes('o1') || model.includes('o3') || model.includes('o4')) {\n params.response_format = { type: 'json_object' };\n }\n\n const completion = await client.chat.completions.create(params);\n\n return completion.choices[0].message.content.trim();\n}\n\nfunction getConfig() {\n return {\n apiKey: LLM_API_KEY ? '***' + LLM_API_KEY.slice(-4) : null,\n baseUrl: LLM_BASE_URL,\n model: LLM_MODEL\n };\n}\n\nexport { chatCompletion, getConfig, LLM_MODEL };", "const SYSTEM_PROMPT = `You are an expert at generating Playwright locators from page structure.\nYou receive a (possibly trimmed) accessibility tree in YAML, special DOM elements, and interactive DOM elements.\n\nCRITICAL RULES:\n1. ONLY use exact text/names that EXIST in the provided structure. NEVER invent or echo the user's query as locator text.\n2. The user's query is a DESCRIPTION of the element, NOT the element's text. You must FIND the matching element in the tree.\n Example: Query \"Admin Tab\" \u2192 find the link/tab named \"Admin\" in the tree \u2192 getByRole('link', { name: /Admin/i })\n Example: Query \"login button\" \u2192 find button named \"Login\" in the tree \u2192 getByRole('button', { name: /Login/i })\n3. YAML format: \"- link \\\\\"Sign in\\\\\"\" means a link element with accessible name \"Sign in\"\n \"- textbox \\\\\"Username\\\\\"\" means a textbox with accessible name \"Username\"\n4. Prefer getByRole with name regex: { name: /text/i } for robustness.\n5. Words like \"tab\", \"button\", \"link\", \"field\", \"textbox\", \"input\" in the query describe the ELEMENT TYPE, not the text content.\n6. NEVER invent accessible names. If an element appears in the aria tree WITHOUT a quoted name\n (e.g., \"textbox\", \"button\", \"checkbox\", \"combobox\", \"link\" with no \"Name\" after it),\n it has NO accessible name. Do NOT guess a name from nearby text, labels, cells, or headings.\n Instead, find that element in interactiveElements by matching tag/type/position, then use its\n id, htmlName, testId, or selector to build a CSS locator:\n - page.locator('#escapedId')\n - page.locator('[name=\"htmlName\"]')\n - page.locator('[data-test=\"value\"]')\n - page.locator('select.className')\n Only use getByRole('role', { name: /text/i }) when the aria tree EXPLICITLY shows a quoted name\n like: button \"Submit\", link \"Home\", textbox \"Email\".\n\nINTERACTIVE ELEMENTS:\n- The interactiveElements array contains DOM metadata for ALL interactive elements including unnamed ones.\n- Each entry has: tag, type, role, id, classes, name, testId, text, options (for selects), selector, parentContext.\n- When an element has NO accessible name in the aria tree, use interactiveElements to find it by id, testId, classes, or parent context.\n- For <select> elements: use the \"selector\" or \"id\" field to build page.locator('#id') or page.getByTestId('...').\n- For unnamed comboboxes: look at interactiveElements for a select/combobox with matching options, then use its id/testId/classes.\n\nACTION-AWARE RULES:\n- If action is \"fill\", \"type\", \"clear\", \"press\": The target MUST be an editable element (textbox, searchbox, combobox, input). Use getByRole('textbox', ...) or getByPlaceholder or getByLabel. NEVER target a label or static text.\n- If action is \"click\", \"dblclick\", \"tap\", \"focus\", \"hover\": Target the interactive element (link, button, tab, menuitem, etc).\n- If action is \"check\", \"uncheck\": Target a checkbox or radio element.\n- If action is \"select\": Target a combobox, listbox, or <select> element. If the element is a native <select>, prefer page.locator('#id') or page.locator('select.className').\n- If action is \"getText\" or null: Target any matching element.\n\nLOCATOR PRIORITY: getByTestId > getByRole > getByLabel > getByPlaceholder > getByAltText > getByTitle > getByText > locator(CSS)\nFALLBACK: When no accessible name exists, use locator('CSS selector') with id, class, or data attribute from interactiveElements.\n- When using test IDs, use the EXACT attribute from the page data.\n- If data shows [data-test=\"x\"], use page.locator('[data-test=\"x\"]') NOT getByTestId('x').\n- Only use getByTestId() if the attribute is literally \"data-testid\".\nFor iframes: page.frameLocator('sel').getByRole(...)\nFor positional: .first() / .nth(n) / .last()\n\nReturn ONLY valid JSON.`;\n\n\nconst DOM_SYSTEM_PROMPT = `You are an expert at generating Playwright locators from raw DOM structure.\nYou receive a DOM tree with element metadata (tag, id, classes, xpath, css selectors, text, attributes).\nThere is NO accessibility tree available \u2014 you must build locators purely from DOM data.\n\nCRITICAL RULES:\n1. The user's query is a DESCRIPTION of the element, NOT the element's text. Match the description to DOM nodes.\n2. ONLY use data that EXISTS in the provided DOM structure. NEVER invent IDs, classes, or text.\n3. Each DOM node may have: tag, id, classes, role, testId ({attr, value}), ariaLabel, title, name, placeholder, text, href, xpath, css, label, type, value, disabled, checked, depth, interactive, heading, landmark.\n\nLOCATOR STRATEGY (in priority order):\n1. Test ID: If testId exists, use page.locator('[<attr>=\"<value>\"]') with the EXACT attribute name.\n Only use page.getByTestId('x') when attr is literally \"data-testid\".\n2. ID: page.locator('#<id>') \u2014 most stable, prefer when available.\n3. Role + accessible name: page.getByRole('<role>', { name: /<text>/i }) \u2014 when role and ariaLabel/label/text exist.\n4. Label: page.getByLabel(/<text>/i) \u2014 for form fields with associated labels.\n5. Placeholder: page.getByPlaceholder(/<text>/i) \u2014 for inputs with placeholder text.\n6. Name attribute: page.locator('[name=\"<name>\"]') \u2014 for form elements.\n7. CSS selector: page.locator('<css>') \u2014 use the \"css\" field from DOM data when available.\n8. XPath: page.locator('xpath=<xpath>') \u2014 use as last resort, take from \"xpath\" field.\n9. Compound CSS: Build from tag + class + structural position when no unique identifier exists.\n Example: page.locator('div.container button.submit')\n Example: page.locator('form#login input[type=\"email\"]')\n\nCOMBINING SELECTORS FOR UNIQUENESS:\n- If a single attribute isn't unique, combine: page.locator('form#login input[name=\"email\"]')\n- Use parent context from \"depth\" and surrounding nodes to disambiguate.\n- Use .first() / .nth(n) / .last() when multiple matches exist.\n- Use .filter({ hasText: /text/i }) to narrow results.\n\nACTION-AWARE RULES:\n- If action is \"fill\", \"type\", \"clear\", \"press\": Target MUST be input, textarea, select, or [contenteditable]. NEVER target labels, divs, or spans.\n- If action is \"click\": Target the clickable element (button, a, [role=\"button\"], etc).\n- If action is \"check\", \"uncheck\": Target checkbox or radio input.\n- If action is \"select\": Target the <select> element or [role=\"combobox\"]/[role=\"listbox\"].\n\nFALLBACK LOCATORS:\n- Always provide 1-2 fallback locators in case the primary doesn't match.\n- Use different strategies for fallbacks (e.g., primary=CSS, fallback=XPath).\n\nFor iframes: page.frameLocator('sel').locator(...)\nReturn ONLY valid JSON.`;\n\n\nfunction buildMessages(pageStructure, query, action) {\n const actionNote = action ? `\\nACTION: The user wants to \"${action}\" this element.` : '';\n return [\n { role: 'system', content: SYSTEM_PROMPT },\n {\n role: 'user',\n content: `Page structure:\\n${pageStructure}\\n\\nFind element: \"${query}\"${actionNote}\\n\\nIMPORTANT: Find the element that matches the description \"${query}\". Do NOT use \"${query}\" as the locator text - find the ACTUAL element name/text from the page structure above.\\n\\nReturn JSON: {\"locatorString\":\"page.getBy...(...)\", \"confidence\": 0.0-1.0, \"explanation\":\"...\", \"fallbackLocators\":[\"page.locator(...)\"]}`\n }\n ];\n}\n\nfunction buildDomMessages(pageStructure, query, action) {\n const actionNote = action ? `\\nACTION: The user wants to \"${action}\" this element.` : '';\n return [\n { role: 'system', content: DOM_SYSTEM_PROMPT },\n {\n role: 'user',\n content: `DOM structure:\\n${pageStructure}\\n\\nFind element: \"${query}\"${actionNote}\\n\\nINSTRUCTIONS:\\n- Search the domTree and interactiveElements for the element matching \"${query}\".\\n- Use the element's id, testId, css, xpath, name, classes, role, text, label, or placeholder to build a Playwright locator.\\n- Prefer stable selectors (id, testId, name) over positional ones (xpath, nth).\\n- Provide fallback locators using alternative strategies.\\n\\nReturn JSON: {\"locatorString\":\"page.locator(...)\", \"confidence\": 0.0-1.0, \"explanation\":\"...\", \"fallbackLocators\":[\"page.locator('xpath=...')\"]}`\n }\n ];\n}\n\nfunction buildBatchMessages(pageStructure, queries) {\n const queryList = queries.map((q, i) => `${i + 1}. \"${q.query || q}\" (action: ${q.action || 'none'})`).join('\\n');\n return [\n { role: 'system', content: SYSTEM_PROMPT },\n {\n role: 'user',\n content: `Page structure:\\n${pageStructure}\\n\\nFind ALL of these elements:\\n${queryList}\\n\\nIMPORTANT: For each query, find the ACTUAL element name/text from the page structure. Do NOT echo the query as locator text.\\n\\nReturn JSON array: [{\"query\":\"...\",\"locatorString\":\"page.getBy...(...)\", \"confidence\": 0.0-1.0, \"explanation\":\"...\", \"fallbackLocators\":[\"...\"]}]`\n }\n ];\n}\n\nfunction buildDomBatchMessages(pageStructure, queries) {\n const queryList = queries.map((q, i) => `${i + 1}. \"${q.query || q}\" (action: ${q.action || 'none'})`).join('\\n');\n return [\n { role: 'system', content: DOM_SYSTEM_PROMPT },\n {\n role: 'user',\n content: `DOM structure:\\n${pageStructure}\\n\\nFind ALL of these elements:\\n${queryList}\\n\\nINSTRUCTIONS:\\n- Search the domTree and interactiveElements for each element.\\n- Use id, testId, css, xpath, name, classes, role, text, label, or placeholder to build Playwright locators.\\n- Prefer stable selectors over positional ones.\\n\\nReturn JSON array: [{\"query\":\"...\",\"locatorString\":\"page.locator(...)\", \"confidence\": 0.0-1.0, \"explanation\":\"...\", \"fallbackLocators\":[\"...\"]}]`\n }\n ];\n}\n\nexport { SYSTEM_PROMPT, DOM_SYSTEM_PROMPT, buildMessages, buildDomMessages, buildBatchMessages, buildDomBatchMessages };", "import { chatCompletion } from './llm/client.js';\nimport { buildMessages, buildBatchMessages, buildDomMessages, buildDomBatchMessages } from './llm/prompt.js';\nimport { parseJsonResponse, createPlaywrightLocator, validateLocator, validateWithFallback } from './llm/parser.js';\nimport { getDiskEntry, setDiskEntry, invalidateDiskEntry, bumpHitCount } from './cache/disk-cache.js';\nimport { getMemEntry, setMemEntry, deleteMemEntry, clearStructureCache } from './cache/memory-cache.js';\nimport { getPageStructure, trimSnapshotForQuery, filterDomTreeForQuery } from './page-structure.js';\n\nconst DEBUG = process.env.LLM_LOCATOR_DEBUG === 'true';\n\nconst PAYLOAD_LIMITS = {\n good: 15000,\n sparse: 25000,\n none: 30000\n};\n\nfunction buildPayload(pageStructure, query) {\n const quality = pageStructure.mainFrame.ariaQuality || 'good';\n const maxPayload = PAYLOAD_LIMITS[quality] || PAYLOAD_LIMITS.good;\n\n if (quality === 'none') {\n return buildDomOnlyPayload(pageStructure, query, maxPayload);\n }\n\n if (quality === 'sparse') {\n return buildHybridPayload(pageStructure, query, maxPayload);\n }\n\n return buildAriaPayload(pageStructure, query, maxPayload);\n}\n\nfunction buildAriaPayload(pageStructure, query, maxPayload) {\n const trimmedAria = trimSnapshotForQuery(pageStructure.mainFrame.ariaTree, query);\n const specialElements = pageStructure.mainFrame.specialElements;\n const interactiveElements = pageStructure.mainFrame.interactiveElements || [];\n\n const payload = {\n mode: 'aria',\n ariaTree: trimmedAria,\n specialElements: specialElements.length > 30 ? specialElements.slice(0, 30) : specialElements,\n interactiveElements: interactiveElements.length > 50 ? interactiveElements.slice(0, 50) : interactiveElements,\n frames: buildFramesPayload(pageStructure, query)\n };\n\n let payloadStr = JSON.stringify(payload);\n if (payloadStr.length > maxPayload) payloadStr = payloadStr.substring(0, maxPayload) + '...(truncated)';\n return { payloadStr, mode: 'aria' };\n}\n\nfunction buildHybridPayload(pageStructure, query, maxPayload) {\n const trimmedAria = trimSnapshotForQuery(pageStructure.mainFrame.ariaTree, query);\n const interactiveElements = pageStructure.mainFrame.interactiveElements || [];\n const domTree = filterDomTreeForQuery(pageStructure.mainFrame.domTree || [], query, 120);\n\n const payload = {\n mode: 'hybrid',\n ariaTree: trimmedAria,\n interactiveElements: interactiveElements.slice(0, 60),\n domTree,\n frames: buildFramesPayload(pageStructure, query)\n };\n\n let payloadStr = JSON.stringify(payload);\n if (payloadStr.length > maxPayload) {\n payload.domTree = filterDomTreeForQuery(pageStructure.mainFrame.domTree || [], query, 60);\n payloadStr = JSON.stringify(payload);\n }\n if (payloadStr.length > maxPayload) payloadStr = payloadStr.substring(0, maxPayload) + '...(truncated)';\n return { payloadStr, mode: 'hybrid' };\n}\n\nfunction buildDomOnlyPayload(pageStructure, query, maxPayload) {\n const interactiveElements = pageStructure.mainFrame.interactiveElements || [];\n const domTree = filterDomTreeForQuery(pageStructure.mainFrame.domTree || [], query, 150);\n const specialElements = pageStructure.mainFrame.specialElements || [];\n\n const payload = {\n mode: 'dom',\n domTree,\n specialElements: specialElements.slice(0, 30),\n interactiveElements: interactiveElements.slice(0, 80),\n frames: buildFramesPayload(pageStructure, query)\n };\n\n let payloadStr = JSON.stringify(payload);\n if (payloadStr.length > maxPayload) {\n payload.domTree = filterDomTreeForQuery(pageStructure.mainFrame.domTree || [], query, 80);\n payload.interactiveElements = interactiveElements.slice(0, 50);\n payloadStr = JSON.stringify(payload);\n }\n if (payloadStr.length > maxPayload) payloadStr = payloadStr.substring(0, maxPayload) + '...(truncated)';\n return { payloadStr, mode: 'dom' };\n}\n\nfunction buildFramesPayload(pageStructure, query) {\n if (!pageStructure.frames || pageStructure.frames.length === 0) return undefined;\n return pageStructure.frames.map(f => {\n const frame = { selector: f.selector };\n if (f.content?.ariaTree) {\n frame.ariaTree = trimSnapshotForQuery(f.content.ariaTree, query, 50);\n }\n if (f.content?.specialElements) {\n frame.specialElements = (f.content.specialElements || []).slice(0, 10);\n }\n if (f.content?.interactiveElements) {\n frame.interactiveElements = (f.content.interactiveElements || []).slice(0, 20);\n }\n if (f.content?.domTree) {\n frame.domTree = filterDomTreeForQuery(f.content.domTree || [], query, 30);\n }\n return frame;\n });\n}\n\nasync function queryLLM(pageStructure, query, options = {}) {\n const { action = null } = options;\n const { payloadStr, mode } = buildPayload(pageStructure, query);\n\n if (DEBUG) console.log(`[Resolver] mode=${mode} payload=${payloadStr.length} chars`);\n\n const messages = (mode === 'dom')\n ? buildDomMessages(payloadStr, query, action)\n : (mode === 'hybrid')\n ? buildDomMessages(payloadStr, query, action)\n : buildMessages(payloadStr, query, action);\n\n const maxTokens = mode === 'aria' ? 256 : 512;\n const raw = await chatCompletion(messages, { ...options, maxTokens });\n return parseJsonResponse(raw);\n}\n\nasync function resolveLocator(page, query, options = {}) {\n const shouldDebug = DEBUG || options.debug;\n const action = options.action || null;\n const url = page.url();\n\n const memHit = getMemEntry(url, query, action);\n if (memHit) {\n if (shouldDebug) console.log(`[Memory Cache Hit] \"${query}\" \u2192 ${memHit.locatorString}`);\n return { ...memHit, source: 'memory' };\n }\n\n const diskHit = getDiskEntry(url, query, action);\n if (diskHit) {\n if (shouldDebug) console.log(`[Disk Cache Hit] \"${query}\" \u2192 ${diskHit.locatorString} (hits: ${diskHit.hitCount || 0})`);\n const result = {\n found: true,\n strategy: diskHit.strategy,\n locatorString: diskHit.locatorString,\n isInFrame: diskHit.isInFrame || false,\n frameSelector: diskHit.frameSelector || null,\n confidence: diskHit.confidence,\n reasoning: diskHit.reasoning,\n source: 'disk'\n };\n setMemEntry(url, query, action, result);\n return result;\n }\n\n if (shouldDebug) console.log(`[LLM] Querying: \"${query}\" (action: ${action || 'any'})`);\n const t0 = Date.now();\n\n const pageStructure = await getPageStructure(page);\n\n try {\n const parsed = await queryLLM(pageStructure, query, options);\n\n const result = {\n found: parsed.confidence > 0.5,\n strategy: parsed.strategy,\n locatorString: parsed.locatorString,\n isInFrame: parsed.isInFrame || false,\n frameSelector: parsed.frameSelector || null,\n confidence: parsed.confidence,\n reasoning: parsed.reasoning,\n fallbackLocators: parsed.fallbackLocators || [],\n source: 'llm'\n };\n\n if (shouldDebug) console.log(`[LLM] \"${query}\" \u2192 ${result.locatorString} (${Date.now() - t0}ms)`);\n\n if (result.found) {\n setMemEntry(url, query, action, result);\n setDiskEntry(url, query, action, result);\n }\n\n return result;\n } catch (error) {\n console.error('LLM locator error:', error.message);\n return { found: false, confidence: 0, error: error.message, source: 'llm' };\n }\n}\n\nasync function getLocator(page, query, options = {}) {\n const shouldDebug = DEBUG || options.debug;\n const action = options.action || null;\n const url = page.url();\n\n const result = await resolveLocator(page, query, options);\n if (!result.found) throw new Error(`Could not find element: ${query}. ${result.error || ''}`);\n\n const locator = createPlaywrightLocator(page, result.locatorString, result.isInFrame, result.frameSelector);\n\n if (result.source === 'disk') {\n const valid = await validateLocator(locator);\n if (valid) {\n bumpHitCount(url, query, action);\n return { locator, result };\n }\n\n // Try fallback locators if available\n if (result.fallbackLocators && result.fallbackLocators.length > 0) {\n if (shouldDebug) console.log(`[Fallback] Primary \"${result.locatorString}\" not found, trying ${result.fallbackLocators.length} fallbacks...`);\n const fbResult = await validateWithFallback(page, result.locatorString, result.fallbackLocators, result.isInFrame, result.frameSelector);\n if (fbResult && fbResult.locatorString !== result.locatorString) {\n if (shouldDebug) console.log(`[Fallback] Using fallback: ${fbResult.locatorString}`);\n const updatedResult = { ...result, locatorString: fbResult.locatorString, strategy: 'fallback' };\n setMemEntry(url, query, action, updatedResult);\n setDiskEntry(url, query, action, updatedResult);\n return { locator: fbResult.locator, result: updatedResult };\n }\n }\n\n if (shouldDebug) console.log(`[Stale Cache] \"${query}\" \u2192 ${result.locatorString} no longer valid, re-querying LLM...`);\n invalidateDiskEntry(url, query, action);\n deleteMemEntry(url, query, action);\n clearStructureCache();\n\n const freshResult = await resolveLocator(page, query, options);\n if (!freshResult.found) throw new Error(`Could not find element after retry: ${query}. ${freshResult.error || ''}`);\n\n const freshLocator = createPlaywrightLocator(page, freshResult.locatorString, freshResult.isInFrame, freshResult.frameSelector);\n return { locator: freshLocator, result: freshResult };\n }\n\n if (result.source === 'llm' && result.fallbackLocators && result.fallbackLocators.length > 0) {\n const valid = await validateLocator(locator, 2000);\n if (!valid) {\n if (shouldDebug) console.log(`[Fallback] Primary \"${result.locatorString}\" not found, trying ${result.fallbackLocators.length} fallbacks...`);\n const fbResult = await validateWithFallback(page, result.locatorString, result.fallbackLocators, result.isInFrame, result.frameSelector);\n if (fbResult && fbResult.locatorString !== result.locatorString) {\n if (shouldDebug) console.log(`[Fallback] Using fallback: ${fbResult.locatorString}`);\n const updatedResult = { ...result, locatorString: fbResult.locatorString, strategy: 'fallback' };\n setMemEntry(url, query, action, updatedResult);\n setDiskEntry(url, query, action, updatedResult);\n return { locator: fbResult.locator, result: updatedResult };\n }\n }\n }\n\n return { locator, result };\n}\n\nasync function resolveLocatorsBatch(page, queries, options = {}) {\n const shouldDebug = DEBUG || options.debug;\n const url = page.url();\n const results = new Map();\n const uncached = [];\n\n for (const q of queries) {\n const memHit = getMemEntry(url, q, null);\n if (memHit) { results.set(q, memHit); continue; }\n const diskHit = getDiskEntry(url, q, null);\n if (diskHit) {\n const r = {\n found: true, strategy: diskHit.strategy, locatorString: diskHit.locatorString,\n isInFrame: diskHit.isInFrame || false, frameSelector: diskHit.frameSelector || null,\n confidence: diskHit.confidence, reasoning: diskHit.reasoning, source: 'disk'\n };\n setMemEntry(url, q, null, r);\n results.set(q, r);\n } else {\n uncached.push(q);\n }\n }\n\n if (uncached.length === 0) return results;\n\n if (shouldDebug) console.log(`[Batch] Resolving ${uncached.length} queries in 1 call`);\n const t0 = Date.now();\n\n const pageStructure = await getPageStructure(page);\n const { payloadStr, mode } = buildPayload(pageStructure, uncached.join(' '));\n\n try {\n const messages = (mode === 'dom' || mode === 'hybrid')\n ? buildDomBatchMessages(payloadStr, uncached)\n : buildBatchMessages(payloadStr, uncached);\n\n const maxTokens = mode === 'aria' ? 256 : 512;\n const raw = await chatCompletion(messages, { ...options, maxTokens });\n const parsed = parseJsonResponse(raw);\n\n if (shouldDebug) console.log(`[Batch] ${parsed.length} results in ${Date.now() - t0}ms`);\n\n for (let i = 0; i < uncached.length && i < parsed.length; i++) {\n const p = parsed[i];\n const result = {\n found: p.confidence > 0.5,\n strategy: p.strategy,\n locatorString: p.locatorString,\n isInFrame: p.isInFrame || false,\n frameSelector: p.frameSelector || null,\n confidence: p.confidence,\n reasoning: p.reasoning,\n source: 'llm'\n };\n results.set(uncached[i], result);\n if (result.found) {\n setMemEntry(url, uncached[i], null, result);\n setDiskEntry(url, uncached[i], null, result);\n }\n }\n } catch (error) {\n console.error('Batch LLM error:', error.message);\n for (const q of uncached) {\n if (!results.has(q)) results.set(q, { found: false, confidence: 0, error: error.message });\n }\n }\n\n return results;\n}\n\nexport { resolveLocator, getLocator, resolveLocatorsBatch };", "import fs from 'fs';\nimport path from 'path';\n\nconst DEBUG = process.env.LLM_LOCATOR_DEBUG === 'true';\nconst CACHE_FILE = process.env.LOCATOR_CACHE_FILE || '.locator-cache.json';\n\nlet diskCache = null;\n\nfunction loadDiskCache() {\n if (diskCache !== null) return diskCache;\n const filePath = path.resolve(CACHE_FILE);\n try {\n if (fs.existsSync(filePath)) {\n diskCache = JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n if (DEBUG) console.log(`[Disk Cache] Loaded ${Object.keys(diskCache).length} entries from ${CACHE_FILE}`);\n } else {\n diskCache = {};\n }\n } catch (e) {\n console.warn(`[Disk Cache] Failed to read ${CACHE_FILE}:`, e.message);\n diskCache = {};\n }\n return diskCache;\n}\n\nfunction saveDiskCache() {\n const filePath = path.resolve(CACHE_FILE);\n try {\n fs.writeFileSync(filePath, JSON.stringify(diskCache, null, 2), 'utf-8');\n } catch (e) {\n console.warn(`[Disk Cache] Failed to write ${CACHE_FILE}:`, e.message);\n }\n}\n\nfunction makeCacheKey(urlOrPage, query, action) {\n let urlPath;\n if (typeof urlOrPage === 'string') {\n try { urlPath = new URL(urlOrPage).pathname; } catch { urlPath = urlOrPage; }\n } else {\n try { urlPath = new URL(urlOrPage.url()).pathname; } catch { urlPath = urlOrPage.url(); }\n }\n return `${urlPath}::${(action || 'any').toLowerCase()}::${query.toLowerCase().trim()}`;\n}\n\nfunction getDiskEntry(url, query, action) {\n const cache = loadDiskCache();\n return cache[makeCacheKey(url, query, action)] || null;\n}\n\nfunction setDiskEntry(url, query, action, entry) {\n const cache = loadDiskCache();\n cache[makeCacheKey(url, query, action)] = {\n locatorString: entry.locatorString,\n strategy: entry.strategy,\n isInFrame: entry.isInFrame || false,\n frameSelector: entry.frameSelector || null,\n confidence: entry.confidence,\n reasoning: entry.reasoning,\n createdAt: new Date().toISOString(),\n hitCount: 0\n };\n saveDiskCache();\n}\n\nfunction invalidateDiskEntry(url, query, action) {\n const cache = loadDiskCache();\n const key = makeCacheKey(url, query, action);\n if (cache[key]) {\n delete cache[key];\n saveDiskCache();\n return true;\n }\n return false;\n}\n\nfunction bumpHitCount(url, query, action) {\n const cache = loadDiskCache();\n const key = makeCacheKey(url, query, action);\n if (cache[key]) {\n cache[key].hitCount = (cache[key].hitCount || 0) + 1;\n cache[key].lastUsed = new Date().toISOString();\n saveDiskCache();\n }\n}\n\nfunction clearDiskCache() {\n diskCache = {};\n saveDiskCache();\n}\n\nexport {\n loadDiskCache, getDiskEntry, setDiskEntry,\n invalidateDiskEntry, bumpHitCount, clearDiskCache, makeCacheKey\n};", "const memCache = new Map();\nlet structureCache = { url: null, timestamp: 0, data: null };\nconst STRUCTURE_TTL = 8000;\n\nfunction getMemKey(url, query, action) {\n return `${url}::${(action || 'any').toLowerCase()}::${query.toLowerCase().trim()}`;\n}\n\nfunction getMemEntry(url, query, action) {\n return memCache.get(getMemKey(url, query, action)) || null;\n}\n\nfunction setMemEntry(url, query, action, entry) {\n memCache.set(getMemKey(url, query, action), entry);\n}\n\nfunction deleteMemEntry(url, query, action) {\n memCache.delete(getMemKey(url, query, action));\n}\n\nfunction getStructureCache() {\n return structureCache;\n}\n\nfunction setStructureCache(url, data) {\n structureCache = { url, timestamp: Date.now(), data };\n}\n\nfunction isStructureCacheValid(url) {\n return (\n structureCache.url === url &&\n (Date.now() - structureCache.timestamp) < STRUCTURE_TTL &&\n structureCache.data\n );\n}\n\nfunction clearStructureCache() {\n structureCache = { url: null, timestamp: 0, data: null };\n}\n\nfunction clearMemoryCache() {\n memCache.clear();\n clearStructureCache();\n}\n\nexport {\n getMemKey, getMemEntry, setMemEntry, deleteMemEntry,\n getStructureCache, setStructureCache, isStructureCacheValid, clearStructureCache,\n clearMemoryCache, STRUCTURE_TTL\n};", "import { isStructureCacheValid, getStructureCache, setStructureCache } from './cache/memory-cache.js';\n\nconst DEBUG = process.env.LLM_LOCATOR_DEBUG === 'true';\nconst MAX_DOM_NODES = 300;\nconst MAX_INTERACTIVE = 100;\n\nasync function getPageStructure(page, forceRefresh = false) {\n const url = page.url();\n\n if (!forceRefresh && isStructureCacheValid(url)) {\n if (DEBUG) console.log('[Page Structure] Using cached');\n return getStructureCache().data;\n }\n\n const structure = { mainFrame: await getFrameStructure(page), frames: [] };\n\n for (const frame of page.frames()) {\n if (frame === page.mainFrame()) continue;\n try {\n const frameElement = await frame.frameElement();\n const frameInfo = await page.evaluate((el) => ({\n id: el.id || null,\n name: el.name || null,\n selector: el.id ? `#${el.id}` :\n el.name ? `iframe[name=\"${el.name}\"]` :\n el.title ? `iframe[title=\"${el.title}\"]` : 'iframe'\n }), frameElement);\n structure.frames.push({ ...frameInfo, content: await getFrameStructure(frame) });\n } catch (e) { /* detached */ }\n }\n\n setStructureCache(url, structure);\n return structure;\n}\n\nasync function getFrameStructure(pageOrFrame) {\n let ariaTree = null;\n let specialElements = [];\n let interactiveElements = [];\n let domTree = [];\n\n const [ariaResult, domResult, interactiveResult, domTreeResult] = await Promise.allSettled([\n pageOrFrame.locator('body').ariaSnapshot({ timeout: 5000 }),\n pageOrFrame.evaluate(() => {\n const els = [];\n for (const el of document.querySelectorAll(\n '[data-testid], [data-test-id], [data-test], [data-qa], [data-cy], ' +\n '[placeholder], [alt], [aria-label]'\n )) {\n const e = {\n tag: el.tagName.toLowerCase(),\n testId: el.getAttribute('data-testid') || el.getAttribute('data-test-id') ||\n el.getAttribute('data-test') || el.getAttribute('data-qa') ||\n el.getAttribute('data-cy') || null,\n placeholder: el.getAttribute('placeholder') || null,\n alt: el.getAttribute('alt') || null,\n ariaLabel: el.getAttribute('aria-label') || null\n };\n if (e.testId || e.placeholder || e.alt || e.ariaLabel) els.push(e);\n }\n return els;\n }),\n pageOrFrame.evaluate((maxInteractive) => {\n const els = [];\n const selectors = 'select, input, textarea, button, a, [role=\"combobox\"], [role=\"listbox\"], [role=\"menu\"], [role=\"tab\"], [role=\"checkbox\"], [role=\"radio\"], [role=\"slider\"], [role=\"switch\"], [contenteditable=\"true\"]';\n for (const el of document.querySelectorAll(selectors)) {\n if (els.length >= maxInteractive) break;\n const ariaLabel = el.getAttribute('aria-label') || el.getAttribute('placeholder') || null;\n const htmlName = el.getAttribute('name') || null;\n const id = el.id || null;\n const classes = el.className ? el.className.toString().split(/\\s+/).filter(c => c && c.length < 40).slice(0, 3).join(' ') : null;\n const tag = el.tagName.toLowerCase();\n const type = el.getAttribute('type') || null;\n const role = el.getAttribute('role') || null;\n const testIdAttr = el.getAttribute('data-testid') ? 'data-testid' :\n el.getAttribute('data-test') ? 'data-test' :\n el.getAttribute('data-test-id') ? 'data-test-id' :\n el.getAttribute('data-qa') ? 'data-qa' :\n el.getAttribute('data-cy') ? 'data-cy' : null;\n const testId = testIdAttr ? el.getAttribute(testIdAttr) : null;\n const text = el.textContent?.trim().substring(0, 50) || null;\n const labelEl = id ? document.querySelector(`label[for=\"${id}\"]`) : null;\n const labelText = labelEl ? labelEl.textContent.trim().substring(0, 50) : null;\n\n let options = null;\n if (tag === 'select') {\n options = [...el.options].map(o => ({ value: o.value, text: o.text, selected: o.selected })).slice(0, 10);\n }\n\n const parent = el.closest('[class], [id], [data-testid], [data-test], [data-cy], [data-qa]');\n let parentContext = null;\n if (parent && parent !== el) {\n const parentTestAttr = parent.getAttribute('data-testid') ? 'data-testid' :\n parent.getAttribute('data-test') ? 'data-test' :\n parent.getAttribute('data-qa') ? 'data-qa' :\n parent.getAttribute('data-cy') ? 'data-cy' : null;\n parentContext = parent.id ? `#${parent.id}` :\n parentTestAttr ? `[${parentTestAttr}=\"${parent.getAttribute(parentTestAttr)}\"]` :\n parent.className ? `.${parent.className.toString().split(/\\s+/)[0]}` : null;\n }\n\n const selector = testId ? `[${testIdAttr}=\"${testId}\"]` :\n id ? `[id=\"${id}\"]` :\n htmlName ? `[name=\"${htmlName}\"]` :\n classes ? `.${classes.split(' ')[0]}` : null;\n\n els.push({\n tag, type, role, id, classes, ariaLabel, htmlName, testId, labelText,\n text: tag === 'select' ? null : text,\n options, selector, parentContext\n });\n }\n return els;\n }, MAX_INTERACTIVE),\n pageOrFrame.evaluate((maxNodes) => {\n function getXPath(el) {\n if (el.id) return `//*[@id=\"${el.id}\"]`;\n const parts = [];\n let current = el;\n while (current && current.nodeType === 1) {\n let idx = 0;\n let sibling = current.previousSibling;\n while (sibling) {\n if (sibling.nodeType === 1 && sibling.tagName === current.tagName) idx++;\n sibling = sibling.previousSibling;\n }\n const tag = current.tagName.toLowerCase();\n parts.unshift(idx > 0 || current.nextElementSibling?.tagName === current.tagName\n ? `${tag}[${idx + 1}]`\n : tag);\n current = current.parentElement;\n }\n return '/' + parts.join('/');\n }\n\n function getUniqueSelector(el) {\n if (el.id) return `#${CSS.escape(el.id)}`;\n const testAttrs = ['data-testid', 'data-test-id', 'data-test', 'data-qa', 'data-cy'];\n for (const attr of testAttrs) {\n const val = el.getAttribute(attr);\n if (val) return `[${attr}=\"${CSS.escape(val)}\"]`;\n }\n const tag = el.tagName.toLowerCase();\n const name = el.getAttribute('name');\n if (name) return `${tag}[name=\"${CSS.escape(name)}\"]`;\n const cls = el.className?.toString().trim();\n if (cls) {\n const sel = tag + '.' + cls.split(/\\s+/).map(c => CSS.escape(c)).join('.');\n if (document.querySelectorAll(sel).length === 1) return sel;\n }\n return null;\n }\n\n function isVisible(el) {\n if (!el.offsetParent && el.tagName !== 'BODY' && el.tagName !== 'HTML' &&\n getComputedStyle(el).position !== 'fixed' && getComputedStyle(el).position !== 'sticky') return false;\n const style = getComputedStyle(el);\n return style.display !== 'none' && style.visibility !== 'hidden' && parseFloat(style.opacity) > 0;\n }\n\n const interactiveTags = new Set([\n 'a', 'button', 'input', 'textarea', 'select', 'details', 'summary', 'label'\n ]);\n const interactiveRoles = new Set([\n 'button', 'link', 'tab', 'menuitem', 'menuitemcheckbox', 'menuitemradio',\n 'option', 'checkbox', 'radio', 'switch', 'slider', 'spinbutton',\n 'combobox', 'listbox', 'searchbox', 'textbox', 'treeitem'\n ]);\n const landmarkRoles = new Set([\n 'banner', 'navigation', 'main', 'complementary', 'contentinfo',\n 'form', 'region', 'search', 'dialog', 'alertdialog', 'tablist',\n 'toolbar', 'menu', 'menubar', 'tree', 'grid', 'table', 'list'\n ]);\n const structuralSel = 'h1, h2, h3, h4, h5, h6, nav, main, header, footer, section, form, table, thead, tbody, tr, th, td, ul, ol, li, dl, dt, dd, fieldset, legend, [role]';\n\n const nodes = [];\n const allEls = document.querySelectorAll('body *');\n\n for (const el of allEls) {\n if (nodes.length >= maxNodes) break;\n const tag = el.tagName.toLowerCase();\n if (['script', 'style', 'noscript', 'br', 'hr', 'wbr', 'meta', 'link'].includes(tag)) continue;\n if (!isVisible(el)) continue;\n\n const role = el.getAttribute('role') || null;\n const isInteractive = interactiveTags.has(tag) || (role && interactiveRoles.has(role))\n || el.getAttribute('contenteditable') === 'true' || el.getAttribute('tabindex') !== null\n || el.getAttribute('onclick') !== null;\n const isLandmark = landmarkRoles.has(role) || ['nav', 'main', 'header', 'footer', 'section', 'form', 'table'].includes(tag);\n const isHeading = /^h[1-6]$/.test(tag);\n const isStructural = el.matches(structuralSel);\n\n if (!isInteractive && !isLandmark && !isHeading && !isStructural) continue;\n\n const id = el.id || null;\n const classes = el.className ? el.className.toString().split(/\\s+/).filter(c => c && c.length < 50).slice(0, 5).join(' ') : null;\n const text = (el.textContent?.trim() || '').substring(0, 80) || null;\n const directText = (() => {\n let t = '';\n for (const child of el.childNodes) {\n if (child.nodeType === 3) t += child.textContent;\n }\n return t.trim().substring(0, 80) || null;\n })();\n const ariaLabel = el.getAttribute('aria-label') || null;\n const title = el.getAttribute('title') || null;\n const type = el.getAttribute('type') || null;\n const href = tag === 'a' ? (el.getAttribute('href') || '').substring(0, 100) : null;\n const placeholder = el.getAttribute('placeholder') || null;\n const htmlName = el.getAttribute('name') || null;\n const value = (tag === 'input' || tag === 'textarea') ? (el.value || '').substring(0, 50) || null : null;\n const disabled = el.disabled || el.getAttribute('aria-disabled') === 'true' || null;\n const checked = el.checked !== undefined ? el.checked : null;\n\n const testIdAttr = el.getAttribute('data-testid') ? 'data-testid' :\n el.getAttribute('data-test') ? 'data-test' :\n el.getAttribute('data-test-id') ? 'data-test-id' :\n el.getAttribute('data-qa') ? 'data-qa' :\n el.getAttribute('data-cy') ? 'data-cy' : null;\n const testId = testIdAttr ? { attr: testIdAttr, value: el.getAttribute(testIdAttr) } : null;\n\n const xpath = getXPath(el);\n const cssSelector = getUniqueSelector(el);\n\n const depth = (() => {\n let d = 0; let p = el.parentElement;\n while (p && p !== document.body) { d++; p = p.parentElement; }\n return d;\n })();\n\n const node = { tag, depth };\n if (role) node.role = role;\n if (id) node.id = id;\n if (classes) node.classes = classes;\n if (testId) node.testId = testId;\n if (ariaLabel) node.ariaLabel = ariaLabel;\n if (title) node.title = title;\n if (type) node.type = type;\n if (htmlName) node.name = htmlName;\n if (placeholder) node.placeholder = placeholder;\n if (href) node.href = href;\n if (directText) node.text = directText;\n else if (text && text.length <= 80) node.text = text;\n if (value) node.value = value;\n if (disabled) node.disabled = true;\n if (checked !== null && checked !== undefined) node.checked = checked;\n if (isInteractive) node.interactive = true;\n if (isHeading) node.heading = true;\n if (isLandmark) node.landmark = true;\n node.xpath = xpath;\n if (cssSelector) node.css = cssSelector;\n\n const labelEl = id ? document.querySelector(`label[for=\"${id}\"]`) : null;\n if (labelEl) node.label = labelEl.textContent.trim().substring(0, 50);\n\n let selectOpts = null;\n if (tag === 'select') {\n selectOpts = [...el.options].map(o => ({ value: o.value, text: o.text, selected: o.selected })).slice(0, 15);\n if (selectOpts.length) node.options = selectOpts;\n }\n\n nodes.push(node);\n }\n return nodes;\n }, MAX_DOM_NODES)\n ]);\n\n if (ariaResult.status === 'fulfilled') ariaTree = ariaResult.value;\n else {\n try {\n if (typeof pageOrFrame.mainFrame === 'function') {\n const snap = await pageOrFrame.accessibility.snapshot();\n if (snap) ariaTree = JSON.stringify(simplifyAriaTree(snap));\n }\n } catch (e) { /* */ }\n }\n\n if (domResult.status === 'fulfilled') specialElements = domResult.value;\n if (interactiveResult.status === 'fulfilled') interactiveElements = interactiveResult.value;\n if (domTreeResult.status === 'fulfilled') domTree = domTreeResult.value;\n\n const ariaQuality = evaluateAriaQuality(ariaTree, interactiveElements.length);\n\n return { ariaTree, specialElements, interactiveElements, domTree, ariaQuality };\n}\n\nfunction evaluateAriaQuality(ariaTree, interactiveCount) {\n if (!ariaTree || typeof ariaTree !== 'string') return 'none';\n const lines = ariaTree.split('\\n').filter(l => l.trim());\n const namedInteractive = (ariaTree.match(/(button|link|textbox|combobox|checkbox|tab|radio|switch)\\s+\"[^\"]+\"/g) || []).length;\n if (lines.length < 5) return 'none';\n if (namedInteractive < 3 && interactiveCount > 5) return 'sparse';\n if (lines.length < 20 && interactiveCount > 10) return 'sparse';\n return 'good';\n}\n\nfunction simplifyAriaTree(node, depth = 0) {\n if (!node || depth > 8) return null;\n const s = {};\n if (node.role) s.role = node.role;\n if (node.name) s.name = node.name;\n if (node.children?.length) {\n s.children = node.children.map(c => simplifyAriaTree(c, depth + 1)).filter(Boolean);\n }\n return s;\n}\n\nfunction trimSnapshotForQuery(ariaYaml, query, maxLines = 150) {\n if (!ariaYaml || typeof ariaYaml !== 'string') return ariaYaml;\n\n const lines = ariaYaml.split('\\n');\n if (lines.length <= maxLines) return ariaYaml;\n\n const queryTokens = query.toLowerCase().replace(/[^a-z0-9\\s]/g, '').split(/\\s+/).filter(Boolean);\n\n const scoredLines = lines.map((line, idx) => {\n const lower = line.toLowerCase();\n let score = 0;\n for (const token of queryTokens) {\n if (lower.includes(token)) score += 10;\n }\n if (/button|link|textbox|searchbox|combobox|checkbox|tab\\b/.test(lower)) score += 3;\n if (/heading|navigation|banner|main|form/.test(lower)) score += 2;\n return { line, idx, score };\n });\n\n const relevant = new Set();\n\n for (const { idx, score } of scoredLines) {\n if (score > 0) {\n const contextStart = Math.max(0, idx - 3);\n const contextEnd = Math.min(lines.length - 1, idx + 2);\n for (let i = contextStart; i <= contextEnd; i++) relevant.add(i);\n }\n }\n\n for (let i = 0; i < Math.min(15, lines.length); i++) relevant.add(i);\n\n if (relevant.size < maxLines) {\n const interactive = scoredLines\n .filter(s => s.score >= 3 && !relevant.has(s.idx))\n .sort((a, b) => b.score - a.score);\n for (const { idx } of interactive) {\n if (relevant.size >= maxLines) break;\n relevant.add(idx);\n if (idx > 0) relevant.add(idx - 1);\n }\n }\n\n const sorted = [...relevant].sort((a, b) => a - b);\n const result = [];\n let lastIdx = -1;\n for (const idx of sorted) {\n if (lastIdx !== -1 && idx - lastIdx > 1) result.push(' ...');\n result.push(lines[idx]);\n lastIdx = idx;\n }\n\n return result.join('\\n');\n}\n\nfunction filterDomTreeForQuery(domTree, query, maxNodes = 80) {\n if (!domTree || !domTree.length) return domTree;\n if (domTree.length <= maxNodes) return domTree;\n\n const queryTokens = query.toLowerCase().replace(/[^a-z0-9\\s]/g, '').split(/\\s+/).filter(Boolean);\n\n const scored = domTree.map((node, idx) => {\n let score = 0;\n if (node.interactive) score += 5;\n if (node.heading) score += 3;\n if (node.landmark) score += 2;\n const searchable = [node.text, node.ariaLabel, node.label, node.placeholder, node.title, node.id, node.name, node.testId?.value].filter(Boolean).join(' ').toLowerCase();\n for (const token of queryTokens) {\n if (searchable.includes(token)) score += 15;\n }\n return { node, idx, score };\n });\n\n scored.sort((a, b) => b.score - a.score);\n return scored.slice(0, maxNodes).sort((a, b) => a.idx - b.idx).map(s => s.node);\n}\n\nexport { getPageStructure, getFrameStructure, trimSnapshotForQuery, filterDomTreeForQuery, evaluateAriaQuality };", "const DEBUG = process.env.LLM_LOCATOR_DEBUG === 'true';\n\nclass SmartAction {\n #locator;\n #result;\n #query;\n\n constructor(locator, result, query) {\n this.#locator = locator;\n this.#result = result;\n this.#query = query;\n }\n\n get rawLocator() { return this.#locator; }\n get result() { return this.#result; }\n get query() { return this.#query; }\n\n async #safeAction(action, ...args) {\n try {\n return await this.#locator[action](...args);\n } catch (err) {\n if (err.message && err.message.includes('strict mode violation')) {\n if (DEBUG) console.log(`[SmartAction] Strict mode on \"${this.#query}\", retrying with .first()`);\n return await this.#locator.first()[action](...args);\n }\n throw err;\n }\n }\n\n async click(options) { return this.#safeAction('click', options); }\n async dblclick(options) { return this.#safeAction('dblclick', options); }\n async tap(options) { return this.#safeAction('tap', options); }\n async hover(options) { return this.#safeAction('hover', options); }\n async focus() { return this.#safeAction('focus'); }\n async blur() { return this.#safeAction('blur'); }\n\n async fill(value, options) { return this.#safeAction('fill', value, options); }\n async type(text, options) { return this.#safeAction('type', text, options); }\n async press(key, options) { return this.#safeAction('press', key, options); }\n async pressSequentially(text, options) { return this.#safeAction('pressSequentially', text, options); }\n async clear(options) { return this.#safeAction('clear', options); }\n async setInputFiles(files, options) { return this.#safeAction('setInputFiles', files, options); }\n async selectOption(values, options) { return this.#safeAction('selectOption', values, options); }\n async selectText(options) { return this.#safeAction('selectText', options); }\n\n async check(options) { return this.#safeAction('check', options); }\n async uncheck(options) { return this.#safeAction('uncheck', options); }\n async setChecked(checked, options) { return this.#safeAction('setChecked', checked, options); }\n\n async scrollIntoViewIfNeeded(options) { return this.#safeAction('scrollIntoViewIfNeeded', options); }\n async screenshot(options) { return this.#safeAction('screenshot', options); }\n\n async dragTo(target, options) {\n const dest = target instanceof SmartAction ? target.rawLocator : target;\n try {\n return await this.#locator.dragTo(dest, options);\n } catch (err) {\n if (err.message && err.message.includes('strict mode violation')) {\n return await this.#locator.first().dragTo(dest, options);\n }\n throw err;\n }\n }\n\n async waitFor(options) { return this.#locator.waitFor(options); }\n async waitForVisible(timeout = 30000) { return this.#locator.waitFor({ state: 'visible', timeout }); }\n async waitForHidden(timeout = 30000) { return this.#locator.waitFor({ state: 'hidden', timeout }); }\n async waitForAttached(timeout = 30000) { return this.#locator.waitFor({ state: 'attached', timeout }); }\n async waitForDetached(timeout = 30000) { return this.#locator.waitFor({ state: 'detached', timeout }); }\n\n async isVisible() { return this.#locator.isVisible(); }\n async isHidden() { return this.#locator.isHidden(); }\n async isEnabled() { return this.#locator.isEnabled(); }\n async isDisabled() { return this.#locator.isDisabled(); }\n async isChecked() { return this.#locator.isChecked(); }\n async isEditable() { return this.#locator.isEditable(); }\n\n async textContent() { return this.#safeAction('textContent'); }\n async innerText() { return this.#safeAction('innerText'); }\n async innerHTML() { return this.#safeAction('innerHTML'); }\n async inputValue(options) { return this.#safeAction('inputValue', options); }\n async getAttribute(name) { return this.#safeAction('getAttribute', name); }\n async boundingBox() { return this.#safeAction('boundingBox'); }\n async count() { return this.#locator.count(); }\n async allTextContents() { return this.#locator.allTextContents(); }\n async allInnerTexts() { return this.#locator.allInnerTexts(); }\n async all() { return this.#locator.all(); }\n\n async evaluate(pageFunction, arg) { return this.#safeAction('evaluate', pageFunction, arg); }\n async evaluateAll(pageFunction, arg) { return this.#locator.evaluateAll(pageFunction, arg); }\n async evaluateHandle(pageFunction, arg) { return this.#safeAction('evaluateHandle', pageFunction, arg); }\n\n first() { return this.#locator.first(); }\n last() { return this.#locator.last(); }\n nth(index) { return this.#locator.nth(index); }\n filter(options) { return this.#locator.filter(options); }\n getByRole(role, options) { return this.#locator.getByRole(role, options); }\n getByText(text, options) { return this.#locator.getByText(text, options); }\n getByLabel(text, options) { return this.#locator.getByLabel(text, options); }\n getByPlaceholder(text, options) { return this.#locator.getByPlaceholder(text, options); }\n getByTestId(testId) { return this.#locator.getByTestId(testId); }\n locator(selectorOrLocator, options) { return this.#locator.locator(selectorOrLocator, options); }\n\n async highlight() { return this.#locator.highlight(); }\n\n async exists() { return (await this.#locator.count()) > 0; }\n\n async getValue() {\n try { return await this.#locator.inputValue(); }\n catch { return await this.#locator.textContent(); }\n }\n\n async getClasses() {\n const cls = await this.getAttribute('class');\n return cls ? cls.split(/\\s+/).filter(Boolean) : [];\n }\n\n async hasClass(className) {\n return (await this.getClasses()).includes(className);\n }\n\n async getCssProperty(property) {\n return this.#safeAction('evaluate',\n (el, prop) => window.getComputedStyle(el).getPropertyValue(prop),\n property\n );\n }\n\n toString() {\n return `SmartAction(\"${this.#query}\" \u2192 ${this.#result?.locatorString || 'unknown'})`;\n }\n}\n\nexport { SmartAction };", "import { getLocator, resolveLocator, resolveLocatorsBatch } from './resolver.js';\nimport { clearMemoryCache } from './cache/memory-cache.js';\nimport { clearDiskCache } from './cache/disk-cache.js';\nimport { SmartAction } from './actions.js';\n\nfunction clearCache() {\n clearMemoryCache();\n}\n\nfunction clearAllCaches() {\n clearMemoryCache();\n clearDiskCache();\n}\n\nfunction createSmartLocator(page, options = {}) {\n const { verbose = false, actionTimeout = 10000 } = options;\n\n async function resolve(query, action) {\n const { locator, result } = await getLocator(page, query, { ...options, action });\n if (verbose) console.log(`[Smart Locator] ${action || 'locate'}(\"${query}\") \u2192 ${result.locatorString} (${result.source})`);\n return new SmartAction(locator, result, query);\n }\n\n function withTimeout(promise, ms, label) {\n if (!ms) return promise;\n return Promise.race([\n promise,\n new Promise((_, reject) =>\n setTimeout(() => reject(new Error(`Timeout: \"${label}\" exceeded ${ms}ms`)), ms)\n )\n ]);\n }\n\n return {\n async prefetch(...queries) {\n const t0 = Date.now();\n const results = await resolveLocatorsBatch(page, queries, options);\n if (verbose) console.log(`[Smart Locator] Prefetched ${results.size} locators in ${Date.now() - t0}ms`);\n return results;\n },\n\n async locate(query, action) {\n return resolve(query, action || null);\n },\n\n async click(query, clickOptions) {\n const el = await resolve(query, 'click');\n await withTimeout(el.click(clickOptions), actionTimeout, `click(\"${query}\")`);\n return el;\n },\n\n async dblclick(query, clickOptions) {\n const el = await resolve(query, 'click');\n await withTimeout(el.dblclick(clickOptions), actionTimeout, `dblclick(\"${query}\")`);\n return el;\n },\n\n async fill(query, value, fillOptions) {\n const el = await resolve(query, 'fill');\n await withTimeout(el.fill(value, fillOptions), actionTimeout, `fill(\"${query}\")`);\n return el;\n },\n\n async type(query, text, typeOptions) {\n const el = await resolve(query, 'fill');\n await withTimeout(el.type(text, typeOptions), actionTimeout, `type(\"${query}\")`);\n return el;\n },\n\n async pressSequentially(query, text, pressOptions) {\n const el = await resolve(query, 'fill');\n await withTimeout(el.pressSequentially(text, pressOptions), actionTimeout, `pressSequentially(\"${query}\")`);\n return el;\n },\n\n async clear(query) {\n const el = await resolve(query, 'fill');\n await withTimeout(el.clear(), actionTimeout, `clear(\"${query}\")`);\n return el;\n },\n\n async press(query, key, pressOptions) {\n const el = await resolve(query, 'fill');\n await withTimeout(el.press(key, pressOptions), actionTimeout, `press(\"${query}\")`);\n return el;\n },\n\n async check(query, checkOptions) {\n const el = await resolve(query, 'check');\n await withTimeout(el.check(checkOptions), actionTimeout, `check(\"${query}\")`);\n return el;\n },\n\n async uncheck(query, uncheckOptions) {\n const el = await resolve(query, 'uncheck');\n await withTimeout(el.uncheck(uncheckOptions), actionTimeout, `uncheck(\"${query}\")`);\n return el;\n },\n\n async setChecked(query, checked, checkOptions) {\n const el = await resolve(query, checked ? 'check' : 'uncheck');\n await withTimeout(el.setChecked(checked, checkOptions), actionTimeout, `setChecked(\"${query}\")`);\n return el;\n },\n\n async select(query, values, selectOptions) {\n const el = await resolve(query, 'select');\n await withTimeout(el.selectOption(values, selectOptions), actionTimeout, `select(\"${query}\")`);\n return el;\n },\n\n async hover(query, hoverOptions) {\n const el = await resolve(query, 'hover');\n await withTimeout(el.hover(hoverOptions), actionTimeout, `hover(\"${query}\")`);\n return el;\n },\n\n async focus(query) {\n const el = await resolve(query, 'click');\n await withTimeout(el.focus(), actionTimeout, `focus(\"${query}\")`);\n return el;\n },\n\n async tap(query, tapOptions) {\n const el = await resolve(query, 'click');\n await withTimeout(el.tap(tapOptions), actionTimeout, `tap(\"${query}\")`);\n return el;\n },\n\n async setInputFiles(query, files, fileOptions) {\n const el = await resolve(query, 'fill');\n await withTimeout(el.setInputFiles(files, fileOptions), actionTimeout, `setInputFiles(\"${query}\")`);\n return el;\n },\n\n async dragTo(srcQuery, destQuery, dragOptions) {\n const src = await resolve(srcQuery, 'click');\n const dest = await resolve(destQuery, 'click');\n await withTimeout(src.dragTo(dest, dragOptions), actionTimeout, `dragTo(\"${srcQuery}\")`);\n return { source: src, target: dest };\n },\n\n async selectText(query) {\n const el = await resolve(query, 'click');\n await withTimeout(el.selectText(), actionTimeout, `selectText(\"${query}\")`);\n return el;\n },\n\n async scrollIntoView(query) {\n const el = await resolve(query, null);\n await withTimeout(el.scrollIntoViewIfNeeded(), actionTimeout, `scrollIntoView(\"${query}\")`);\n return el;\n },\n\n async screenshot(query, screenshotOptions) {\n const el = await resolve(query, null);\n return el.screenshot(screenshotOptions);\n },\n\n async highlight(query) {\n const el = await resolve(query, null);\n await el.highlight();\n return el;\n },\n\n async waitFor(query, waitOptions) {\n const el = await resolve(query, null);\n await el.waitFor(waitOptions);\n return el;\n },\n\n async waitForVisible(query, timeout) {\n const el = await resolve(query, null);\n await el.waitForVisible(timeout);\n return el;\n },\n\n async waitForHidden(query, timeout) {\n const el = await resolve(query, null);\n await el.waitForHidden(timeout);\n return el;\n },\n\n async waitForAttached(query, timeout) {\n const el = await resolve(query, null);\n await el.waitForAttached(timeout);\n return el;\n },\n\n async waitForDetached(query, timeout) {\n const el = await resolve(query, null);\n await el.waitForDetached(timeout);\n return el;\n },\n\n async isVisible(query) {\n try { const el = await resolve(query, null); return await el.isVisible(); }\n catch { return false; }\n },\n\n async isHidden(query) {\n try { const el = await resolve(query, null); return await el.isHidden(); }\n catch { return true; }\n },\n\n async isEnabled(query) {\n try { const el = await resolve(query, null); return await el.isEnabled(); }\n catch { return false; }\n },\n\n async isDisabled(query) {\n try { const el = await resolve(query, null); return await el.isDisabled(); }\n catch { return true; }\n },\n\n async isChecked(query) {\n try { const el = await resolve(query, null); return await el.isChecked(); }\n catch { return false; }\n },\n\n async isEditable(query) {\n try { const el = await resolve(query, null); return await el.isEditable(); }\n catch { return false; }\n },\n\n async exists(query) {\n try {\n const result = await resolveLocator(page, query, { ...options, action: null });\n if (!result.found || result.confidence < 0.7) return false;\n const { createPlaywrightLocator } = await import('./llm/parser.js');\n const locator = createPlaywrightLocator(page, result.locatorString, result.isInFrame, result.frameSelector);\n return (await locator.count()) > 0;\n } catch { return false; }\n },\n\n async getText(query) {\n const el = await resolve(query, 'getText');\n return el.textContent();\n },\n\n async getInnerText(query) {\n const el = await resolve(query, 'getText');\n return el.innerText();\n },\n\n async getInnerHTML(query) {\n const el = await resolve(query, 'getText');\n return el.innerHTML();\n },\n\n async getInputValue(query) {\n const el = await resolve(query, 'fill');\n return el.inputValue();\n },\n\n async getAttribute(query, attr) {\n const el = await resolve(query, null);\n return el.getAttribute(attr);\n },\n\n async getBoundingBox(query) {\n const el = await resolve(query, null);\n return el.boundingBox();\n },\n\n async count(query) {\n const el = await resolve(query, null);\n return el.count();\n },\n\n clearCache() { clearCache(); },\n clearAllCaches() { clearAllCaches(); }\n };\n}\n\nexport { createSmartLocator, clearCache, clearAllCaches };", "export { getLocator, resolveLocator } from './resolver.js';\nexport { createSmartLocator, clearCache, clearAllCaches } from './smart-locator.js';\nexport { getPageStructure } from './page-structure.js';\nexport { loadDiskCache, invalidateDiskEntry } from './cache/disk-cache.js';\nexport { chatCompletion, getConfig } from './llm/client.js';\nexport { SmartAction } from './actions.js';\nimport { getLocator } from './resolver.js';\n\nasync function findLocator(page, query, options = {}) {\n try {\n const { result } = await getLocator(page, query, options);\n return {\n found: true, strategy: result.strategy, locatorString: result.locatorString,\n locatorType: result.strategy, confidence: result.confidence,\n fullLocatorString: result.locatorString, reasoning: result.reasoning,\n isInFrame: result.isInFrame, frameSelector: result.frameSelector,\n fallbackLocators: result.fallbackLocators || [], element: { strategy: result.strategy }\n };\n } catch (e) {\n return { found: false, locatorString: null, confidence: 0, error: e.message };\n }\n}\n\nasync function findAllMatches(page, query, options = {}) {\n try {\n const { result } = await getLocator(page, query, options);\n return result.found ? [result] : [];\n } catch { return []; }\n}\n\nexport { findLocator, findAllMatches };"],
5
+ "mappings": "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",
6
+ "names": ["OpenAI", "DEBUG", "path", "fs", "DEBUG", "DEBUG", "DEBUG", "createPlaywrightLocator"]
7
7
  }