intellitester 0.5.2 → 0.5.3
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.
- package/dist/{chunk-VWXGXFIM.js → chunk-7UYD5Q7D.js} +226 -1011
- package/dist/chunk-7UYD5Q7D.js.map +1 -0
- package/dist/{chunk-XF2UENRQ.cjs → chunk-TBMJMXJK.cjs} +225 -1009
- package/dist/chunk-TBMJMXJK.cjs.map +1 -0
- package/dist/cli/index.cjs +206 -31
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +188 -13
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +16 -12
- package/dist/index.d.cts +70 -2
- package/dist/index.d.ts +70 -2
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-VWXGXFIM.js.map +0 -1
- package/dist/chunk-XF2UENRQ.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/randomUsername.ts","../src/core/randomPhoto.ts","../src/core/fillerText.ts","../src/core/randomEmail.ts","../src/core/randomPhone.ts","../src/core/interpolation.ts","../src/tracking/trackingServer.ts","../src/tracking/fileTracking.ts","../src/tracking/index.ts","../src/executors/web/playwrightExecutor.ts","../src/integrations/email/inbucketClient.ts","../src/integrations/appwrite/index.ts","../src/integrations/appwrite/appwriteClient.ts","../src/integrations/appwrite/types.ts","../src/executors/web/browserOptions.ts","../src/executors/web/matchers.ts","../src/executors/web/responseLog.ts","../src/executors/web/cssEscape.ts","../src/executors/web/uploadResolver.ts","../src/ai/errorHelper.ts","../src/ai/provider.ts","../src/ai/healingAgent.ts","../src/executors/web/webServerManager.ts","../src/ai/evaluator.ts","../src/executors/web/workflowExecutor.ts","../src/executors/web/index.ts"],"names":["crypto","areaCode","subscriber","path","fs","stat","Workflow","ChatMessage","path3","z","track","Client","Users","loadTestDefinition","testFilePath","defaultScreenshotDir","getBrowser","firefox","webkit","chromium","result"],"mappings":"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","file":"chunk-7UYD5Q7D.js","sourcesContent":["import {\n uniqueNamesGenerator,\n adjectives,\n animals,\n NumberDictionary,\n} from 'unique-names-generator';\n\n/**\n * Generates a random username in PascalCase format.\n * Format: AdjectiveAnimalNN (e.g., \"HappyTiger42\", \"BlueFox07\")\n *\n * The username is designed to:\n * - Be human-readable and memorable\n * - Stay under 30 characters (typical username validation limit)\n * - Include a 2-digit suffix for uniqueness\n *\n * Examples: \"HappyTiger42\", \"BlueFox07\", \"QuickBear91\"\n */\nexport function generateRandomUsername(): string {\n // Generate 2-digit number for suffix (00-99)\n const numberDictionary = NumberDictionary.generate({ min: 0, max: 99 });\n\n const username = uniqueNamesGenerator({\n dictionaries: [adjectives, animals, numberDictionary],\n separator: '',\n style: 'capital',\n length: 3,\n });\n\n // Ensure we stay under 30 characters\n // Most adjective+animal combos are well under this, but truncate if needed\n if (username.length > 30) {\n return username.slice(0, 30);\n }\n\n return username;\n}\n","/**\n * Generates a random photo URL from picsum.photos.\n *\n * @param dimensions - Optional dimensions in \"WIDTHxHEIGHT\" format (e.g., \"500x500\", \"200x300\")\n * Defaults to \"500x500\" if not provided.\n * @returns A URL like \"https://picsum.photos/500/500\"\n *\n * Examples:\n * generateRandomPhoto() -> \"https://picsum.photos/500/500\"\n * generateRandomPhoto(\"200x300\") -> \"https://picsum.photos/200/300\"\n * generateRandomPhoto(\"800\") -> \"https://picsum.photos/800/800\" (square)\n */\nexport function generateRandomPhoto(dimensions?: string): string {\n let width = 500;\n let height = 500;\n\n if (dimensions) {\n if (dimensions.includes('x')) {\n const [w, h] = dimensions.split('x').map((d) => parseInt(d.trim(), 10));\n if (!isNaN(w) && w > 0) width = w;\n if (!isNaN(h) && h > 0) height = h;\n } else {\n // Single number means square\n const size = parseInt(dimensions.trim(), 10);\n if (!isNaN(size) && size > 0) {\n width = size;\n height = size;\n }\n }\n }\n\n return `https://picsum.photos/${width}/${height}`;\n}\n","/**\n * Lorem ipsum word list for generating filler text.\n * Using a curated list of Latin-style words commonly found in lorem ipsum generators.\n */\nconst LOREM_WORDS = [\n 'lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipiscing', 'elit',\n 'sed', 'do', 'eiusmod', 'tempor', 'incididunt', 'ut', 'labore', 'et', 'dolore',\n 'magna', 'aliqua', 'enim', 'ad', 'minim', 'veniam', 'quis', 'nostrud',\n 'exercitation', 'ullamco', 'laboris', 'nisi', 'aliquip', 'ex', 'ea', 'commodo',\n 'consequat', 'duis', 'aute', 'irure', 'in', 'reprehenderit', 'voluptate',\n 'velit', 'esse', 'cillum', 'fugiat', 'nulla', 'pariatur', 'excepteur', 'sint',\n 'occaecat', 'cupidatat', 'non', 'proident', 'sunt', 'culpa', 'qui', 'officia',\n 'deserunt', 'mollit', 'anim', 'id', 'est', 'laborum', 'perspiciatis', 'unde',\n 'omnis', 'iste', 'natus', 'error', 'voluptatem', 'accusantium', 'doloremque',\n 'laudantium', 'totam', 'rem', 'aperiam', 'eaque', 'ipsa', 'quae', 'ab', 'illo',\n 'inventore', 'veritatis', 'quasi', 'architecto', 'beatae', 'vitae', 'dicta',\n 'explicabo', 'nemo', 'ipsam', 'quia', 'voluptas', 'aspernatur', 'aut', 'odit',\n 'fugit', 'consequuntur', 'magni', 'dolores', 'eos', 'ratione', 'sequi',\n 'nesciunt', 'neque', 'porro', 'quisquam', 'nihil', 'impedit', 'quo', 'minus',\n];\n\n/**\n * Generates lorem ipsum style filler text.\n *\n * @param wordCount - Number of words to generate. Defaults to 50.\n * @returns A string of lorem ipsum style filler text.\n *\n * Examples:\n * generateFillerText() -> ~50 words of lorem ipsum\n * generateFillerText(10) -> ~10 words of lorem ipsum\n * generateFillerText(100) -> ~100 words of lorem ipsum\n */\nexport function generateFillerText(wordCount?: number | string): string {\n let count = 50;\n\n if (wordCount !== undefined) {\n const parsed = typeof wordCount === 'string' ? parseInt(wordCount.trim(), 10) : wordCount;\n if (!isNaN(parsed) && parsed > 0) {\n count = parsed;\n }\n }\n\n const words: string[] = [];\n\n // Start with \"Lorem ipsum\" for authenticity if we have enough words\n if (count >= 2) {\n words.push('Lorem', 'ipsum');\n count -= 2;\n }\n\n for (let i = 0; i < count; i++) {\n const randomIndex = Math.floor(Math.random() * LOREM_WORDS.length);\n words.push(LOREM_WORDS[randomIndex]);\n }\n\n // Join and add basic punctuation for readability\n let result = words.join(' ');\n\n // Add periods roughly every 8-12 words for sentence structure\n const resultWords = result.split(' ');\n const sentenceWords: string[] = [];\n let sentenceLength = 0;\n const nextSentenceLength = () => 8 + Math.floor(Math.random() * 5);\n let targetLength = nextSentenceLength();\n\n for (let i = 0; i < resultWords.length; i++) {\n let word = resultWords[i];\n\n // Capitalize first word of sentence\n if (sentenceLength === 0) {\n word = word.charAt(0).toUpperCase() + word.slice(1);\n }\n\n sentenceWords.push(word);\n sentenceLength++;\n\n // Add period if we've reached sentence length\n if (sentenceLength >= targetLength && i < resultWords.length - 1) {\n sentenceWords[sentenceWords.length - 1] += '.';\n sentenceLength = 0;\n targetLength = nextSentenceLength();\n }\n }\n\n // Ensure the text ends with a period\n result = sentenceWords.join(' ');\n if (!result.endsWith('.')) {\n result += '.';\n }\n\n return result;\n}\n","import crypto from 'node:crypto';\n\n/**\n * Generates a random test email address.\n *\n * The format is: test-{randomHex}@test.local\n *\n * @param domain - Optional custom domain. Defaults to \"test.local\"\n * @returns A random email address suitable for testing.\n *\n * Examples:\n * generateRandomEmail() -> \"test-a1b2c3@test.local\"\n * generateRandomEmail(\"example.com\") -> \"test-a1b2c3@example.com\"\n */\nexport function generateRandomEmail(domain?: string): string {\n // Generate a short random hex string (6 characters)\n const randomPart = crypto.randomBytes(3).toString('hex');\n const emailDomain = domain?.trim() || 'test.local';\n\n return `test-${randomPart}@${emailDomain}`;\n}\n","import { parsePhoneNumber, CountryCode, isValidPhoneNumber } from 'libphonenumber-js';\n\n// Country-specific phone number formats (area codes and subscriber ranges)\nconst COUNTRY_FORMATS: Record<string, { areaCode: () => string; subscriber: () => string }> = {\n US: {\n areaCode: () => {\n // Valid US area codes (avoid reserved ones like 555)\n const areaCodes = ['201', '212', '213', '310', '312', '404', '415', '512', '617', '702', '713', '718', '805', '818', '917'];\n return areaCodes[Math.floor(Math.random() * areaCodes.length)];\n },\n subscriber: () => String(Math.floor(Math.random() * 9000000) + 1000000).slice(0, 7),\n },\n GB: {\n areaCode: () => {\n const areaCodes = ['20', '121', '131', '141', '151', '161', '171', '181'];\n return areaCodes[Math.floor(Math.random() * areaCodes.length)];\n },\n subscriber: () => String(Math.floor(Math.random() * 90000000) + 10000000).slice(0, 8),\n },\n DE: {\n areaCode: () => {\n const areaCodes = ['30', '40', '69', '89', '211', '221', '341', '351'];\n return areaCodes[Math.floor(Math.random() * areaCodes.length)];\n },\n subscriber: () => String(Math.floor(Math.random() * 9000000) + 1000000).slice(0, 7),\n },\n FR: {\n areaCode: () => {\n const areaCodes = ['1', '2', '3', '4', '5'];\n return areaCodes[Math.floor(Math.random() * areaCodes.length)];\n },\n subscriber: () => String(Math.floor(Math.random() * 90000000) + 10000000).slice(0, 8),\n },\n AU: {\n areaCode: () => {\n const areaCodes = ['2', '3', '7', '8'];\n return areaCodes[Math.floor(Math.random() * areaCodes.length)];\n },\n subscriber: () => String(Math.floor(Math.random() * 90000000) + 10000000).slice(0, 8),\n },\n};\n\n/**\n * Generate a random valid phone number for a given country\n * @param country - ISO 3166-1 alpha-2 country code (default: 'US')\n * @returns Phone number in E.164 format (e.g., +14155551234)\n */\nexport function generateRandomPhone(country: string = 'US'): string {\n const countryCode = country.toUpperCase() as CountryCode;\n const format = COUNTRY_FORMATS[countryCode] || COUNTRY_FORMATS['US'];\n\n // Try up to 10 times to generate a valid number\n for (let i = 0; i < 10; i++) {\n const areaCode = format.areaCode();\n const subscriber = format.subscriber();\n const nationalNumber = areaCode + subscriber;\n\n try {\n // Format as national number and let libphonenumber parse it\n const phoneNumber = parsePhoneNumber(nationalNumber, countryCode);\n if (phoneNumber && isValidPhoneNumber(phoneNumber.number)) {\n return phoneNumber.format('E.164');\n }\n } catch {\n // Try again\n }\n }\n\n // Fallback: return a simple formatted number\n const fallbackFormat = COUNTRY_FORMATS[countryCode] || COUNTRY_FORMATS['US'];\n const areaCode = fallbackFormat.areaCode();\n const subscriber = fallbackFormat.subscriber();\n\n // Get country calling code\n const callingCodes: Record<string, string> = {\n US: '1', GB: '44', DE: '49', FR: '33', AU: '61',\n };\n const callingCode = callingCodes[countryCode] || '1';\n\n return `+${callingCode}${areaCode}${subscriber}`;\n}\n","import crypto from 'node:crypto';\nimport { generateRandomUsername } from './randomUsername';\nimport { generateRandomPhoto } from './randomPhoto';\nimport { generateFillerText } from './fillerText';\nimport { generateRandomEmail } from './randomEmail';\nimport { generateRandomPhone } from './randomPhone';\n\n/**\n * Built-in variable interpolation for test values.\n *\n * Supports the following patterns:\n * - {{uuid}} - Short UUID (first segment of a UUID v4)\n * - {{randomUsername}} - Random username like \"HappyTiger42\"\n * - {{randomPhoto}} - Random photo URL (500x500 default)\n * - {{randomPhoto:WxH}} - Random photo with custom dimensions (e.g., {{randomPhoto:200x300}})\n * - {{fillerText}} - Lorem ipsum filler text (~50 words default)\n * - {{fillerText:N}} - Lorem ipsum with N words (e.g., {{fillerText:100}})\n * - {{randomEmail}} - Random test email (e.g., test-abc123@test.local)\n * - {{randomEmail:domain}} - Random email with custom domain (e.g., {{randomEmail:example.com}})\n * - {{randomPhone}} - Random valid phone number in E.164 format (default: US)\n * - {{randomPhone:CC}} - Random phone for country code (e.g., {{randomPhone:GB}})\n * - {{varName}} - User-defined variable from context\n *\n * @param value - The string containing {{variable}} placeholders\n * @param variables - Map of user-defined variables\n * @returns The interpolated string with all placeholders replaced\n */\nexport function interpolateVariables(\n value: string,\n variables: Map<string, string>\n): string {\n // Match {{name}} or {{name:param}} patterns\n // The regex captures: full match, name, optional parameter (after colon)\n return value.replace(/\\{\\{(\\w+)(?::([^}]+))?\\}\\}/g, (match, name, param) => {\n switch (name) {\n case 'uuid':\n return crypto.randomUUID().split('-')[0];\n\n case 'randomUsername':\n return generateRandomUsername();\n\n case 'randomPhoto':\n return generateRandomPhoto(param);\n\n case 'fillerText':\n return generateFillerText(param);\n\n case 'randomEmail':\n return generateRandomEmail(param);\n\n case 'randomPhone':\n return generateRandomPhone(param);\n\n default:\n // Check user-defined variables\n return variables.get(name) ?? match;\n }\n });\n}\n\n/**\n * Export individual generators for direct use if needed.\n */\nexport { generateRandomUsername } from './randomUsername';\nexport { generateRandomPhoto } from './randomPhoto';\nexport { generateFillerText } from './fillerText';\nexport { generateRandomEmail } from './randomEmail';\nexport { generateRandomPhone } from './randomPhone';\n","import { createServer, IncomingMessage, ServerResponse } from 'http';\n\nexport interface TrackingServerOptions {\n port?: number; // 0 = random available port\n}\n\n/**\n * Generic tracked resource - stores whatever JSON is posted.\n * Provider-agnostic format.\n */\nexport interface TrackedResource {\n type: string;\n id: string;\n createdAt: string;\n [key: string]: unknown; // Any additional metadata\n}\n\n/**\n * Track request - sessionId plus the resource metadata\n */\nexport interface TrackRequest {\n sessionId: string;\n type: string;\n id: string;\n [key: string]: unknown; // Any additional metadata\n}\n\nexport class TrackingServer {\n private server: ReturnType<typeof createServer> | null = null;\n private resources: Map<string, TrackedResource[]> = new Map();\n public port: number = 0;\n\n async start(options: TrackingServerOptions = {}): Promise<void> {\n return new Promise((resolve, reject) => {\n // Create HTTP server\n this.server = createServer((req, res) => {\n this.handleRequest(req, res);\n });\n\n this.server.on('error', (error) => {\n reject(error);\n });\n\n // Listen on port (0 = random)\n const port = options.port ?? 0;\n this.server.listen(port, () => {\n const address = this.server?.address();\n if (address && typeof address === 'object') {\n this.port = address.port;\n resolve();\n } else {\n reject(new Error('Failed to get server port'));\n }\n });\n });\n }\n\n private handleRequest(req: IncomingMessage, res: ServerResponse): void {\n // Enable CORS for cross-origin requests\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n\n // Handle preflight requests\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n const url = new URL(req.url || '/', `http://${req.headers.host}`);\n\n if (req.method === 'POST' && url.pathname === '/track') {\n this.handleTrackRequest(req, res);\n } else if (req.method === 'GET' && url.pathname.startsWith('/resources/')) {\n this.handleGetResources(url, res);\n } else {\n res.writeHead(404, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Not found' }));\n }\n }\n\n private handleTrackRequest(req: IncomingMessage, res: ServerResponse): void {\n let body = '';\n\n req.on('data', (chunk) => {\n body += chunk.toString();\n });\n\n req.on('end', () => {\n try {\n const trackRequest: TrackRequest = JSON.parse(body);\n\n // Validate required fields\n if (!trackRequest.sessionId || !trackRequest.type || !trackRequest.id) {\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Missing required fields (sessionId, type, id)' }));\n return;\n }\n\n // Extract sessionId and create tracked resource with all other fields\n const { sessionId, ...resourceData } = trackRequest;\n\n // Create tracked resource - just store whatever JSON was posted\n const resource: TrackedResource = {\n ...resourceData,\n type: trackRequest.type,\n id: trackRequest.id,\n createdAt: new Date().toISOString(),\n };\n\n // Store resource by sessionId\n const sessionResources = this.resources.get(sessionId) || [];\n sessionResources.push(resource);\n this.resources.set(sessionId, sessionResources);\n\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ success: true }));\n } catch {\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Invalid JSON' }));\n }\n });\n\n req.on('error', () => {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Internal server error' }));\n });\n }\n\n private handleGetResources(url: URL, res: ServerResponse): void {\n const sessionId = url.pathname.split('/').pop();\n\n if (!sessionId) {\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Missing sessionId' }));\n return;\n }\n\n const resources = this.resources.get(sessionId) || [];\n\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ resources }));\n }\n\n getResources(sessionId: string): TrackedResource[] {\n return this.resources.get(sessionId) ?? [];\n }\n\n clearSession(sessionId: string): void {\n this.resources.delete(sessionId);\n }\n\n async stop(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.server) {\n resolve();\n return;\n }\n\n this.server.close((error) => {\n if (error) {\n reject(error);\n } else {\n this.server = null;\n resolve();\n }\n });\n });\n }\n}\n\nexport async function startTrackingServer(\n options?: TrackingServerOptions\n): Promise<TrackingServer> {\n const server = new TrackingServer();\n await server.start(options);\n return server;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { executeCleanup } from '../core/cleanup/executor.js';\nimport { loadCleanupHandlers } from '../core/cleanup/loader.js';\nimport type { CleanupConfig, CleanupProvider } from '../core/cleanup/types.js';\n\nconst TRACK_DIR = '.intellitester/track';\nconst ACTIVE_TESTS_FILE = 'ACTIVE_TESTS.json';\nconst DEFAULT_STALE_MS = 2 * 60 * 60 * 1000; // 2 hours\nconst HEARTBEAT_MS = 15000;\n\ninterface ActiveTestEntry {\n sessionId: string;\n trackFile: string;\n startedAt: string;\n lastUpdated: string;\n cwd: string;\n providerConfig?: Record<string, unknown>;\n}\n\ninterface ActiveTestsState {\n version: number;\n updatedAt: string;\n sessions: Record<string, ActiveTestEntry>;\n}\n\ninterface FileTrackingOptions {\n sessionId: string;\n cwd?: string;\n trackDir?: string;\n providerConfig?: Record<string, unknown>;\n cleanupConfig?: CleanupConfig;\n}\n\nconst getTrackDir = (cwd: string, trackDir?: string) =>\n trackDir ? path.resolve(cwd, trackDir) : path.join(cwd, TRACK_DIR);\nconst getActiveTestsPath = (cwd: string, trackDir?: string) =>\n path.join(getTrackDir(cwd, trackDir), ACTIVE_TESTS_FILE);\n\nconst loadActiveTests = async (cwd: string, trackDir?: string): Promise<ActiveTestsState> => {\n const filePath = getActiveTestsPath(cwd, trackDir);\n try {\n const content = await fs.readFile(filePath, 'utf8');\n const parsed = JSON.parse(content) as ActiveTestsState;\n if (!parsed.sessions || typeof parsed.sessions !== 'object') {\n throw new Error('Invalid ACTIVE_TESTS structure');\n }\n return parsed;\n } catch {\n return {\n version: 1,\n updatedAt: new Date().toISOString(),\n sessions: {},\n };\n }\n};\n\nconst saveActiveTests = async (cwd: string, state: ActiveTestsState, trackDir?: string): Promise<void> => {\n const filePath = getActiveTestsPath(cwd, trackDir);\n state.updatedAt = new Date().toISOString();\n await fs.writeFile(filePath, JSON.stringify(state, null, 2), 'utf8');\n};\n\nconst isStale = (entry: ActiveTestEntry, staleMs: number): boolean => {\n const last = new Date(entry.lastUpdated).getTime();\n if (Number.isNaN(last)) return true;\n return Date.now() - last > staleMs;\n};\n\nconst readTrackedResources = async (trackFile: string): Promise<unknown[]> => {\n try {\n const content = await fs.readFile(trackFile, 'utf8');\n if (!content.trim()) return [];\n return content\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n try {\n return JSON.parse(line);\n } catch {\n return null;\n }\n })\n .filter((entry): entry is Record<string, unknown> => Boolean(entry));\n } catch {\n return [];\n }\n};\n\nconst cleanupStaleSession = async (\n entry: ActiveTestEntry,\n cleanupConfig?: CleanupConfig\n): Promise<void> => {\n if (!entry.providerConfig || !cleanupConfig?.provider) return;\n\n const resources = await readTrackedResources(entry.trackFile);\n if (resources.length === 0) return;\n\n try {\n const { handlers, typeMappings, provider } = await loadCleanupHandlers(cleanupConfig, entry.cwd);\n if (!provider) return;\n\n await executeCleanup(resources as any, handlers, typeMappings, {\n parallel: cleanupConfig.parallel ?? false,\n retries: cleanupConfig.retries ?? 3,\n sessionId: entry.sessionId,\n testStartTime: entry.startedAt,\n providerConfig: entry.providerConfig as { provider: string; [key: string]: unknown },\n cwd: entry.cwd,\n config: { ...cleanupConfig, scanUntracked: false },\n provider: provider as CleanupProvider,\n });\n } catch {\n // Best-effort cleanup only\n }\n};\n\nconst cleanupOrphanedTrackFiles = async (cwd: string, state: ActiveTestsState, trackDir?: string): Promise<void> => {\n const dir = getTrackDir(cwd, trackDir);\n try {\n const files = await fs.readdir(dir);\n const activeFiles = new Set(Object.values(state.sessions).map((s) => path.basename(s.trackFile)));\n\n for (const file of files) {\n // Only clean up .jsonl track files, not ACTIVE_TESTS.json or other files\n if (!file.endsWith('.jsonl')) continue;\n if (activeFiles.has(file)) continue;\n\n const filePath = path.join(dir, file);\n try {\n const stat = await fs.stat(filePath);\n // Remove if empty or older than stale threshold\n const staleMs = Number(process.env.INTELLITESTER_STALE_TEST_MS ?? DEFAULT_STALE_MS);\n const isOld = Date.now() - stat.mtimeMs > staleMs;\n const isEmpty = stat.size === 0;\n\n if (isEmpty || isOld) {\n await fs.rm(filePath, { force: true });\n }\n } catch {\n // Ignore errors for individual files\n }\n }\n } catch {\n // Directory might not exist yet\n }\n};\n\nconst pruneStaleTests = async (cwd: string, cleanupConfig?: CleanupConfig, trackDir?: string): Promise<void> => {\n const state = await loadActiveTests(cwd, trackDir);\n const staleMs = Number(process.env.INTELLITESTER_STALE_TEST_MS ?? DEFAULT_STALE_MS);\n let changed = false;\n\n for (const [sessionId, entry] of Object.entries(state.sessions)) {\n let missingFile = false;\n let isEmpty = false;\n try {\n const stat = await fs.stat(entry.trackFile);\n isEmpty = stat.size === 0;\n } catch {\n missingFile = true;\n }\n\n // Also clean up empty track files for stale sessions\n if (!missingFile && !isEmpty && !isStale(entry, staleMs)) continue;\n changed = true;\n\n await cleanupStaleSession(entry, cleanupConfig);\n try {\n await fs.rm(entry.trackFile, { force: true });\n } catch {\n // Ignore missing files\n }\n delete state.sessions[sessionId];\n }\n\n if (changed) {\n await saveActiveTests(cwd, state, trackDir);\n }\n\n // Also clean up orphaned track files not in ACTIVE_TESTS.json\n await cleanupOrphanedTrackFiles(cwd, state, trackDir);\n};\n\nexport async function initFileTracking(options: FileTrackingOptions): Promise<{\n trackFile: string;\n stop: () => Promise<void>;\n}> {\n const cwd = options.cwd ?? process.cwd();\n const trackDir = options.trackDir;\n await fs.mkdir(getTrackDir(cwd, trackDir), { recursive: true });\n\n await pruneStaleTests(cwd, options.cleanupConfig, trackDir);\n\n const trackFile = path.join(getTrackDir(cwd, trackDir), `TEST_SESSION_${options.sessionId}.jsonl`);\n await fs.writeFile(trackFile, '', 'utf8');\n\n const state = await loadActiveTests(cwd, trackDir);\n state.sessions[options.sessionId] = {\n sessionId: options.sessionId,\n trackFile,\n startedAt: new Date().toISOString(),\n lastUpdated: new Date().toISOString(),\n cwd,\n providerConfig: options.providerConfig,\n };\n await saveActiveTests(cwd, state, trackDir);\n\n const touch = async () => {\n const current = await loadActiveTests(cwd, trackDir);\n const entry = current.sessions[options.sessionId];\n if (!entry) return;\n entry.lastUpdated = new Date().toISOString();\n current.sessions[options.sessionId] = entry;\n await saveActiveTests(cwd, current, trackDir);\n };\n\n const interval = setInterval(() => {\n void touch();\n }, HEARTBEAT_MS);\n\n const stop = async () => {\n clearInterval(interval);\n const current = await loadActiveTests(cwd, trackDir);\n delete current.sessions[options.sessionId];\n await saveActiveTests(cwd, current, trackDir);\n try {\n await fs.rm(trackFile, { force: true });\n } catch {\n // Ignore missing file\n }\n };\n\n return { trackFile, stop };\n}\n\nexport async function mergeFileTrackedResources(\n trackFile: string,\n target: { resources: Array<Record<string, unknown>>; userId?: string; userEmail?: string },\n allowedTypes?: Set<string>\n): Promise<void> {\n const entries = await readTrackedResources(trackFile);\n for (const entry of entries) {\n const resource = entry as Record<string, unknown>;\n if (!resource.type || !resource.id) continue;\n if (allowedTypes && !allowedTypes.has(String(resource.type))) continue;\n const exists = target.resources.some(\n (existing) => existing.type === resource.type && existing.id === resource.id\n );\n if (!exists) {\n target.resources.push(resource);\n }\n if (resource.type === 'user') {\n if (!target.userId && typeof resource.id === 'string') {\n target.userId = resource.id;\n }\n const email = resource.email;\n if (!target.userEmail && typeof email === 'string') {\n target.userEmail = email;\n }\n }\n }\n}\n","export { TrackingServer, startTrackingServer } from './trackingServer';\nexport type { TrackingServerOptions, TrackRequest } from './trackingServer';\nexport { initFileTracking, mergeFileTrackedResources } from './fileTracking';\n","import crypto from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport {\n chromium,\n firefox,\n webkit,\n type BrowserContextOptions,\n type BrowserType,\n type FrameLocator,\n type Locator as PWLocator,\n type Page,\n} from 'playwright';\nimport prompts from 'prompts';\n\nimport type { Action, Locator, TestDefinition, ErrorIf } from '../../core/types';\nimport { interpolateVariables } from '../../core/interpolation';\nimport { InbucketClient } from '../../integrations/email/inbucketClient';\nimport type { Email } from '../../integrations/email/types';\nimport { AppwriteTestClient, createTestContext, APPWRITE_PATTERNS, APPWRITE_UPDATE_PATTERNS, APPWRITE_DELETE_PATTERNS, type TrackedResource } from '../../integrations/appwrite';\nimport { getBrowserLaunchOptions, getBrowserTimingConfig, parseViewportSize } from './browserOptions.js';\nimport { compileMatcher } from './matchers.js';\nimport { ResponseLog } from './responseLog.js';\nimport { cssEscape } from './cssEscape';\nimport { cleanupResolvedFiles, resolveUploadFiles, toPlaywrightFiles } from './uploadResolver';\nimport { getAISuggestion } from '../../ai/errorHelper';\nimport { runHealingAgent, type HealingContext } from '../../ai/healingAgent';\nimport { TrackingServer, initFileTracking, mergeFileTrackedResources } from '../../tracking';\nimport { track as trackResource } from '../../integration/index.js';\nimport type { TrackedResource as IntegrationTrackedResource } from '../../integration/index.js';\nimport { webServerManager, type WebServerConfig, type WebServerInput } from './webServerManager.js';\nimport { evaluate, terminateOCRWorker } from '../../ai/evaluator';\n\nexport type BrowserName = 'chromium' | 'firefox' | 'webkit';\n\nexport type { WebServerConfig };\n\nexport interface WebRunOptions {\n baseUrl?: string;\n browser?: BrowserName;\n headed?: boolean;\n screenshotDir?: string;\n defaultTimeoutMs?: number;\n webServer?: WebServerInput;\n debug?: boolean;\n interactive?: boolean;\n aiConfig?: import('../../ai/types').AIConfig;\n sessionId?: string;\n trackDir?: string;\n /** Viewport sizes to test at. Can be predefined ('xs', 'sm', 'md', 'lg', 'xl') or custom 'WxH' format (e.g., '1920x1080'). */\n testSizes?: string[];\n /** Playwright storageState (cookies/localStorage) to apply on every new context. File path string or inline {cookies, origins} object. */\n storageState?: BrowserContextOptions['storageState'];\n /** Absolute path to the test YAML file. Used to resolve relative paths in saveStorageState actions. */\n testFilePath?: string;\n /** Skip tracking server setup (CLI already owns it) */\n skipTrackingSetup?: boolean;\n /** Skip web server start (CLI already owns it) */\n skipWebServerStart?: boolean;\n /** AI-assisted healing configuration */\n healing?: {\n enabled: boolean;\n maxAttempts?: number;\n };\n /** Callback invoked before each step begins for real-time output. */\n onStepStart?: (info: { action: Action; index: number; total: number }) => void;\n /** Callback invoked after each step completes (passed or failed) for real-time output */\n onStepComplete?: (result: StepResult, index: number, total: number) => void;\n}\n\n/** Invoke a step callback without letting an exception in the user code cancel the test run. */\nfunction safeCallback(label: string, fn: (() => void) | undefined): void {\n if (!fn) return;\n try {\n fn();\n } catch (e) {\n console.error(`[intellitester] ${label} callback threw:`, e);\n }\n}\n\nexport interface StepResult {\n action: Action;\n status: 'passed' | 'failed';\n error?: string;\n screenshotPath?: string;\n logOutput?: string;\n}\n\nexport interface WebRunResult {\n status: 'passed' | 'failed';\n steps: StepResult[];\n variables?: Map<string, string>;\n}\n\ninterface ExecutionContext {\n variables: Map<string, string>;\n lastEmail: Email | null;\n emailClient: InbucketClient | null;\n appwriteContext: import('../../integrations/appwrite/types').TestContext;\n appwriteConfig?: {\n endpoint: string;\n projectId: string;\n apiKey: string;\n };\n}\n\nconst defaultScreenshotDir = path.join(process.cwd(), 'artifacts', 'screenshots');\n\n/**\n * Resolve a Playwright storageState value against a base directory.\n * - String paths: returned as-is if absolute, else joined with baseDir.\n * - Inline {cookies, origins} objects: returned unchanged.\n * - Undefined: returned unchanged.\n */\nexport const resolveStorageStatePath = (\n value: BrowserContextOptions['storageState'] | undefined,\n baseDir: string,\n): BrowserContextOptions['storageState'] | undefined => {\n if (typeof value !== 'string') return value;\n return path.isAbsolute(value) ? value : path.resolve(baseDir, value);\n};\n\nconst interpolateTrackMetadata = (\n value: unknown,\n variables: Map<string, string>\n): unknown => {\n if (typeof value === 'string') {\n return interpolateVariables(value, variables);\n }\n if (Array.isArray(value)) {\n return value.map((entry) => interpolateTrackMetadata(entry, variables));\n }\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, entry]) => [\n key,\n interpolateTrackMetadata(entry, variables),\n ])\n );\n }\n return value;\n};\n\nconst resolveUrl = (value: string, baseUrl?: string): string => {\n if (!baseUrl) return value;\n try {\n const url = new URL(value, baseUrl);\n return url.toString();\n } catch {\n return value;\n }\n};\n\nconst resolveLocator = (page: Page, locator: Locator): PWLocator => {\n if (locator.testId) {\n // Try data-testid first (Playwright default), then fallback to id, then class\n return page.locator(\n `[data-testid=\"${locator.testId}\"], #${cssEscape(locator.testId)}, .${cssEscape(locator.testId)}`\n ).first();\n }\n if (locator.text) return page.getByText(locator.text);\n if (locator.css) return page.locator(locator.css);\n if (locator.xpath) return page.locator(`xpath=${locator.xpath}`);\n if (locator.role) {\n const options: { name?: string } = {};\n if (locator.name) options.name = locator.name;\n // playwright typing expects an ARIA role; rely on runtime validation for flexibility\n return page.getByRole(locator.role as any, options);\n }\n if (locator.description) return page.getByText(locator.description);\n throw new Error('No usable selector found for locator');\n};\n\ninterface FrameSpec {\n css?: string;\n name?: string;\n index?: number;\n}\n\n/**\n * Resolve a frame locator from the page. Returns a FrameLocator for iframe interaction.\n * If no frameSpec provided, returns null (use page directly).\n */\nconst resolveFrameLocator = (\n page: Page,\n frameSpec: FrameSpec | undefined,\n): FrameLocator | null => {\n if (!frameSpec) return null;\n\n let frameLocator: FrameLocator;\n\n if (frameSpec.css) {\n frameLocator = page.frameLocator(frameSpec.css);\n } else if (frameSpec.name) {\n // Match by name or id attribute of iframe\n frameLocator = page.frameLocator(`iframe[name=\"${frameSpec.name}\"], iframe#${frameSpec.name}`);\n } else {\n return null;\n }\n\n // Apply index if specified, otherwise use first()\n if (typeof frameSpec.index === 'number') {\n frameLocator = frameLocator.nth(frameSpec.index);\n } else {\n frameLocator = frameLocator.first();\n }\n\n return frameLocator;\n};\n\n/**\n * Resolve a locator within a context (Page or FrameLocator).\n * Works with both main page and iframe contexts.\n */\nconst resolveLocatorInContext = (\n context: Page | FrameLocator,\n locator: Locator,\n): PWLocator => {\n if (locator.testId) {\n // Try data-testid first (Playwright default), then fallback to id, then class\n return context.locator(\n `[data-testid=\"${locator.testId}\"], #${cssEscape(locator.testId)}, .${cssEscape(locator.testId)}`\n ).first();\n }\n if (locator.text) return context.getByText(locator.text);\n if (locator.css) return context.locator(locator.css);\n if (locator.xpath) return context.locator(`xpath=${locator.xpath}`);\n if (locator.role) {\n const options: { name?: string } = {};\n if (locator.name) options.name = locator.name;\n return context.getByRole(locator.role as any, options);\n }\n if (locator.description) return context.getByText(locator.description);\n throw new Error('No usable selector found for locator');\n};\n\n/**\n * Get the appropriate context (Page or FrameLocator) for an action.\n */\nconst getActionContext = (\n page: Page,\n frameSpec: FrameSpec | undefined,\n): Page | FrameLocator => {\n const frame = resolveFrameLocator(page, frameSpec);\n return frame ?? page;\n};\n\n/**\n * Check if errorIf condition is met and throw immediately if so.\n * This check is quick (no waiting) - if condition is met, throws immediately.\n */\nconst checkErrorIf = async (\n page: Page,\n locator: Locator,\n errorIf: ErrorIf | undefined,\n): Promise<void> => {\n if (!errorIf) return;\n\n const handle = resolveLocator(page, locator);\n\n switch (errorIf) {\n case 'not-found': {\n // Check if element exists in DOM right now (no waiting)\n const count = await handle.count();\n if (count === 0) {\n throw new Error(`errorIf: Element not found in DOM (testId/selector: ${JSON.stringify(locator)})`);\n }\n break;\n }\n case 'not-visible': {\n // Check if element exists but is not visible\n const count = await handle.count();\n if (count > 0) {\n const isVisible = await handle.isVisible();\n if (!isVisible) {\n throw new Error(`errorIf: Element exists but is not visible (testId/selector: ${JSON.stringify(locator)})`);\n }\n }\n break;\n }\n case 'disabled': {\n // Check if element is disabled\n const count = await handle.count();\n if (count > 0) {\n const isDisabled = await handle.isDisabled();\n if (isDisabled) {\n throw new Error(`errorIf: Element is disabled (testId/selector: ${JSON.stringify(locator)})`);\n }\n }\n break;\n }\n case 'empty': {\n // Check if element has no text content\n const count = await handle.count();\n if (count > 0) {\n const text = await handle.textContent();\n if (!text || text.trim() === '') {\n throw new Error(`errorIf: Element has no text content (testId/selector: ${JSON.stringify(locator)})`);\n }\n }\n break;\n }\n }\n};\n\nasync function ensureScreenshotDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\nconst runNavigate = async (\n page: Page,\n value: string,\n baseUrl: string | undefined,\n context: ExecutionContext,\n): Promise<void> => {\n const interpolated = interpolateVariables(value, context.variables);\n const target = resolveUrl(interpolated, baseUrl);\n await page.goto(target);\n};\n\nconst runTap = async (page: Page, locator: Locator, browserName?: BrowserName): Promise<void> => {\n const handle = resolveLocator(page, locator);\n await handle.click();\n\n // Wait for page to stabilize after click (handles 302 redirect cookie timing, SPA navigation)\n const timing = getBrowserTimingConfig(browserName ?? 'chromium');\n await waitForPageStable(page, timing.networkIdleTimeout);\n};\n\nconst runInput = async (\n page: Page,\n locator: Locator,\n value: string,\n context: ExecutionContext,\n): Promise<void> => {\n const interpolated = interpolateVariables(value, context.variables);\n const handle = resolveLocator(page, locator);\n await handle.fill(interpolated);\n};\n\nconst runAssert = async (\n page: Page,\n locator: Locator,\n value: string | undefined,\n context: ExecutionContext,\n): Promise<void> => {\n const handle = resolveLocator(page, locator);\n await handle.waitFor({ state: 'visible' });\n if (value) {\n const interpolated = interpolateVariables(value, context.variables);\n const text = (await handle.textContent())?.trim() ?? '';\n if (!text.includes(interpolated)) {\n throw new Error(\n `Assertion failed: expected element text to include \"${interpolated}\", got \"${text}\"`,\n );\n }\n }\n};\n\nconst runWait = async (page: Page, action: Extract<Action, { type: 'wait' }>): Promise<void> => {\n if (action.target) {\n const handle = resolveLocator(page, action.target);\n await handle.waitFor({ state: 'visible', timeout: action.timeout });\n return;\n }\n await page.waitForTimeout(action.timeout ?? 1000);\n};\n\nconst waitForCondition = async (\n checkFn: () => Promise<boolean>,\n timeout: number,\n errorMessage: string,\n browserName?: BrowserName,\n): Promise<void> => {\n // Firefox benefits from slightly longer timeouts and slower polling\n const effectiveTimeout = browserName === 'firefox' ? Math.round(timeout * 1.5) : timeout;\n const pollInterval = browserName === 'firefox' ? 150 : 100;\n\n const start = Date.now();\n while (Date.now() - start < effectiveTimeout) {\n if (await checkFn()) return;\n await new Promise((r) => setTimeout(r, pollInterval));\n }\n throw new Error(errorMessage);\n};\n\n/**\n * Cascading wait strategy that works reliably across all browsers:\n * 1. Wait for domcontentloaded (fast, reliable baseline)\n * 2. Then wait for networkidle (handles SPA data loading)\n * 3. If networkidle times out, continue anyway\n */\nconst waitForPageStable = async (\n page: Page,\n networkIdleTimeout: number,\n): Promise<void> => {\n // Step 1: Wait for DOM to be ready (fast, reliable)\n await page.waitForLoadState('domcontentloaded').catch(() => {});\n\n // Step 2: Wait for network to settle (handles SPAs loading data)\n // If this times out, we proceed anyway since DOM is ready\n await page.waitForLoadState('networkidle', { timeout: networkIdleTimeout }).catch(() => {});\n};\n\nconst runScroll = async (\n page: Page,\n action: Extract<Action, { type: 'scroll' }>,\n): Promise<void> => {\n if (action.target) {\n const handle = resolveLocator(page, action.target);\n await handle.scrollIntoViewIfNeeded();\n return;\n }\n const amount = action.amount ?? 500;\n const direction = action.direction ?? 'down';\n const deltaY = direction === 'up' ? -amount : amount;\n await page.evaluate((value) => window.scrollBy(0, value), deltaY);\n};\n\nconst runScreenshot = async (\n page: Page,\n name: string | undefined,\n screenshotDir: string,\n stepIndex: number,\n browserName?: BrowserName,\n): Promise<string> => {\n await ensureScreenshotDir(screenshotDir);\n\n // Wait for page to stabilize before screenshot\n const timing = getBrowserTimingConfig(browserName ?? 'chromium');\n await waitForPageStable(page, timing.screenshotNetworkIdleTimeout);\n\n const filename = name ?? `step-${stepIndex + 1}.png`;\n const filePath = path.join(screenshotDir, filename);\n await page.screenshot({ path: filePath, fullPage: true });\n return filePath;\n};\n\nconst getBrowser = (browser: BrowserName): BrowserType => {\n switch (browser) {\n case 'firefox':\n return firefox;\n case 'webkit':\n return webkit;\n default:\n return chromium;\n }\n};\n\nasync function handleInteractiveError(\n page: Page,\n action: Action,\n error: Error,\n screenshotDir: string,\n stepIndex: number,\n aiConfig?: import('../../ai/types').AIConfig,\n): Promise<'retry' | 'skip' | 'abort' | 'debug'> {\n console.error(`\\n❌ Action failed: ${action.type}`);\n console.error(` Error: ${error.message}\\n`);\n\n // Take screenshot\n await ensureScreenshotDir(screenshotDir);\n const screenshotPath = path.join(screenshotDir, `error-step-${stepIndex + 1}.png`);\n await page.screenshot({ path: screenshotPath, fullPage: true });\n\n // Get page content\n const pageContent = await page.content();\n\n // Get AI suggestion\n if (aiConfig) {\n console.log('🤖 Analyzing error with AI...\\n');\n const screenshot = await fs.readFile(screenshotPath);\n const suggestion = await getAISuggestion(error.message, action, pageContent, screenshot, aiConfig);\n\n if (suggestion.hasSuggestion && suggestion.suggestedSelector) {\n console.log('🤖 AI Suggestion:');\n console.log(` ${suggestion.explanation}\\n`);\n console.log(' Suggested selector:');\n console.log(' target:');\n if (suggestion.suggestedSelector.testId) {\n console.log(` testId: \"${suggestion.suggestedSelector.testId}\"`);\n }\n if (suggestion.suggestedSelector.text) {\n console.log(` text: \"${suggestion.suggestedSelector.text}\"`);\n }\n if (suggestion.suggestedSelector.css) {\n console.log(` css: \"${suggestion.suggestedSelector.css}\"`);\n }\n if (suggestion.suggestedSelector.role) {\n console.log(` role: \"${suggestion.suggestedSelector.role}\"`);\n }\n if (suggestion.suggestedSelector.name) {\n console.log(` name: \"${suggestion.suggestedSelector.name}\"`);\n }\n console.log('');\n } else {\n console.log(`🤖 AI Analysis: ${suggestion.explanation}\\n`);\n }\n }\n\n // Prompt user\n const response = await prompts({\n type: 'select',\n name: 'action',\n message: 'What would you like to do?',\n choices: [\n { title: 'Retry with AI suggestion', value: 'retry', disabled: !aiConfig },\n { title: 'Skip this step', value: 'skip' },\n { title: 'Abort test', value: 'abort' },\n { title: 'Open in browser (pause)', value: 'debug' },\n ],\n initial: 0,\n });\n\n return response.action || 'abort';\n}\n\nexport interface ActionExtras {\n logOutput?: string;\n}\n\nexport interface ExecuteActionOptions {\n baseUrl?: string;\n context: ExecutionContext;\n screenshotDir: string;\n debugMode: boolean;\n interactive: boolean;\n aiConfig?: import('../../ai/types').AIConfig;\n browserName?: BrowserName;\n healing?: {\n enabled: boolean;\n maxAttempts?: number;\n };\n /** Absolute path to the running test YAML, used to resolve relative file paths for upload/saveStorageState. */\n testFilePath?: string;\n /** Network response log attached to the page; required for `expectResponse`. */\n responseLog?: ResponseLog;\n /** Timestamp of the start of this step (used as the default `since` for `expectResponse`). */\n stepStartTs?: number;\n}\n\nexport async function executeActionWithRetry(\n page: Page,\n action: Action,\n index: number,\n options: ExecuteActionOptions,\n): Promise<ActionExtras> {\n const { baseUrl, context, screenshotDir, debugMode, interactive, aiConfig, browserName, healing, testFilePath, responseLog, stepStartTs } = options;\n const extras: ActionExtras = {};\n\n const buildTrackPayload = (stepExtras?: Record<string, unknown>): IntegrationTrackedResource | null => {\n if (!('track' in action)) return null;\n const rawTrack = (action as { track?: Record<string, unknown> }).track;\n if (!rawTrack || typeof rawTrack !== 'object') return null;\n const track = interpolateTrackMetadata(rawTrack, context.variables) as Record<string, unknown>;\n if (typeof track.type !== 'string' || typeof track.id !== 'string') return null;\n\n const { includeStepContext, ...rest } = track;\n const payload: IntegrationTrackedResource = {\n type: track.type,\n id: track.id,\n ...rest,\n };\n if (includeStepContext) {\n payload.step = { index, ...action, ...stepExtras };\n }\n return payload;\n };\n\n while (true) {\n try {\n switch (action.type) {\n case 'navigate': {\n const interpolated = interpolateVariables(action.value, context.variables);\n const target = resolveUrl(interpolated, baseUrl);\n if (debugMode) {\n console.log(`[DEBUG] Navigating to: ${target}`);\n }\n await runNavigate(page, action.value, baseUrl, context);\n break;\n }\n case 'tap': {\n const tapAction = action as Extract<Action, { type: 'tap' }>;\n if (debugMode) {\n console.log(`[DEBUG] Tapping element:`, tapAction.target);\n if (tapAction.frame) console.log(`[DEBUG] In frame:`, tapAction.frame);\n }\n if (tapAction.frame) {\n const frameContext = getActionContext(page, tapAction.frame);\n const handle = resolveLocatorInContext(frameContext, tapAction.target);\n await handle.click();\n // Wait for page to stabilize after click\n const timing = getBrowserTimingConfig(browserName ?? 'chromium');\n await waitForPageStable(page, timing.networkIdleTimeout);\n } else {\n await checkErrorIf(page, tapAction.target, tapAction.errorIf);\n await runTap(page, tapAction.target, browserName);\n }\n break;\n }\n case 'input': {\n const inputAction = action as Extract<Action, { type: 'input' }>;\n if (debugMode) {\n const interpolated = interpolateVariables(inputAction.value, context.variables);\n console.log(`[DEBUG] Inputting value into element:`, inputAction.target);\n console.log(`[DEBUG] Value: ${interpolated}`);\n if (inputAction.frame) console.log(`[DEBUG] In frame:`, inputAction.frame);\n }\n if (inputAction.frame) {\n const frameContext = getActionContext(page, inputAction.frame);\n const handle = resolveLocatorInContext(frameContext, inputAction.target);\n const interpolated = interpolateVariables(inputAction.value, context.variables);\n await handle.fill(interpolated);\n } else {\n await checkErrorIf(page, inputAction.target, inputAction.errorIf);\n await runInput(page, inputAction.target, inputAction.value, context);\n }\n break;\n }\n case 'type': {\n const typeAction = action as Extract<Action, { type: 'type' }>;\n const interpolated = interpolateVariables(typeAction.value, context.variables);\n if (debugMode) {\n console.log(`[DEBUG] Typing value:`, typeAction.target ?? '(focused element)');\n console.log(`[DEBUG] Value: ${interpolated}`);\n if (typeAction.frame) console.log(`[DEBUG] In frame:`, typeAction.frame);\n }\n if (typeAction.target) {\n const frameContext = getActionContext(page, typeAction.frame);\n const handle = resolveLocatorInContext(frameContext, typeAction.target);\n await handle.pressSequentially(interpolated, { delay: typeAction.delay ?? 50 });\n } else {\n // No target: type into whatever currently has focus\n await page.keyboard.type(interpolated, { delay: typeAction.delay ?? 50 });\n }\n break;\n }\n case 'clear': {\n const clearAction = action as Extract<Action, { type: 'clear' }>;\n if (debugMode) {\n console.log(`[DEBUG] Clearing element:`, clearAction.target);\n if (clearAction.frame) console.log(`[DEBUG] In frame:`, clearAction.frame);\n }\n if (clearAction.frame) {\n const frameContext = getActionContext(page, clearAction.frame);\n const handle = resolveLocatorInContext(frameContext, clearAction.target);\n await handle.clear();\n } else {\n await checkErrorIf(page, clearAction.target, clearAction.errorIf);\n const handle = resolveLocator(page, clearAction.target);\n await handle.clear();\n }\n break;\n }\n case 'upload': {\n const uploadAction = action as Extract<Action, { type: 'upload' }>;\n if (!uploadAction.target && !uploadAction.trigger) {\n throw new Error('upload action requires either `target` (file input) or `trigger` (button)');\n }\n if (uploadAction.target && uploadAction.trigger) {\n throw new Error('upload action accepts `target` OR `trigger`, not both');\n }\n if (debugMode) {\n console.log(`[DEBUG] Uploading files:`, uploadAction.files);\n if (uploadAction.target) console.log(`[DEBUG] To input:`, uploadAction.target);\n if (uploadAction.trigger) console.log(`[DEBUG] Via trigger:`, uploadAction.trigger);\n if (uploadAction.frame) console.log(`[DEBUG] In frame:`, uploadAction.frame);\n }\n const resolved = await resolveUploadFiles(uploadAction.files, {\n testFilePath,\n variables: context.variables,\n });\n try {\n const pwFiles = await toPlaywrightFiles(resolved);\n if (uploadAction.target) {\n const ctx = uploadAction.frame\n ? getActionContext(page, uploadAction.frame)\n : page;\n if (!uploadAction.frame) {\n await checkErrorIf(page, uploadAction.target, uploadAction.errorIf);\n }\n const handle = resolveLocatorInContext(ctx, uploadAction.target);\n await handle.setInputFiles(pwFiles);\n } else if (uploadAction.trigger) {\n const ctx = uploadAction.frame\n ? getActionContext(page, uploadAction.frame)\n : page;\n if (!uploadAction.frame) {\n await checkErrorIf(page, uploadAction.trigger, uploadAction.errorIf);\n }\n const triggerHandle = resolveLocatorInContext(ctx, uploadAction.trigger);\n const [chooser] = await Promise.all([\n page.waitForEvent('filechooser'),\n triggerHandle.click(),\n ]);\n await chooser.setFiles(pwFiles);\n }\n } finally {\n await cleanupResolvedFiles(resolved);\n }\n break;\n }\n case 'hover': {\n const hoverAction = action as Extract<Action, { type: 'hover' }>;\n if (debugMode) {\n console.log(`[DEBUG] Hovering element:`, hoverAction.target);\n if (hoverAction.frame) console.log(`[DEBUG] In frame:`, hoverAction.frame);\n }\n if (hoverAction.frame) {\n const frameContext = getActionContext(page, hoverAction.frame);\n const handle = resolveLocatorInContext(frameContext, hoverAction.target);\n await handle.hover();\n } else {\n await checkErrorIf(page, hoverAction.target, hoverAction.errorIf);\n const handle = resolveLocator(page, hoverAction.target);\n await handle.hover();\n }\n break;\n }\n case 'select': {\n const interpolated = interpolateVariables(action.value, context.variables);\n if (debugMode) console.log(`[DEBUG] Selecting: ${interpolated}`);\n await checkErrorIf(page, action.target, action.errorIf);\n const handle = resolveLocator(page, action.target);\n await handle.selectOption(interpolated);\n break;\n }\n case 'check': {\n if (debugMode) console.log(`[DEBUG] Checking:`, action.target);\n await checkErrorIf(page, action.target, action.errorIf);\n const handle = resolveLocator(page, action.target);\n await handle.check();\n break;\n }\n case 'uncheck': {\n if (debugMode) console.log(`[DEBUG] Unchecking:`, action.target);\n await checkErrorIf(page, action.target, action.errorIf);\n const handle = resolveLocator(page, action.target);\n await handle.uncheck();\n break;\n }\n case 'press': {\n const pressAction = action as Extract<Action, { type: 'press' }>;\n if (debugMode) {\n console.log(`[DEBUG] Pressing key: ${pressAction.key}`);\n if (pressAction.frame) console.log(`[DEBUG] In frame:`, pressAction.frame);\n }\n if (pressAction.frame) {\n const frameContext = getActionContext(page, pressAction.frame);\n if (pressAction.target) {\n const handle = resolveLocatorInContext(frameContext, pressAction.target);\n await handle.press(pressAction.key);\n } else {\n // For frame-scoped keyboard press without target, focus the frame first\n // by clicking inside it, then press the key\n await frameContext.locator('body').first().press(pressAction.key);\n }\n } else {\n if (pressAction.target) {\n await checkErrorIf(page, pressAction.target, pressAction.errorIf);\n const handle = resolveLocator(page, pressAction.target);\n await handle.press(pressAction.key);\n } else {\n await page.keyboard.press(pressAction.key);\n }\n }\n break;\n }\n case 'focus': {\n const focusAction = action as Extract<Action, { type: 'focus' }>;\n if (debugMode) {\n console.log(`[DEBUG] Focusing:`, focusAction.target);\n if (focusAction.frame) console.log(`[DEBUG] In frame:`, focusAction.frame);\n }\n if (focusAction.frame) {\n const frameContext = getActionContext(page, focusAction.frame);\n const handle = resolveLocatorInContext(frameContext, focusAction.target);\n await handle.focus();\n } else {\n await checkErrorIf(page, focusAction.target, focusAction.errorIf);\n const handle = resolveLocator(page, focusAction.target);\n await handle.focus();\n }\n break;\n }\n case 'assert': {\n const assertAction = action as Extract<Action, { type: 'assert' }>;\n if (debugMode) {\n console.log(`[DEBUG] Asserting element:`, assertAction.target);\n if (assertAction.value) {\n const interpolated = interpolateVariables(assertAction.value, context.variables);\n console.log(`[DEBUG] Expected text contains: ${interpolated}`);\n }\n if (assertAction.frame) console.log(`[DEBUG] In frame:`, assertAction.frame);\n }\n if (assertAction.frame) {\n const frameContext = getActionContext(page, assertAction.frame);\n const handle = resolveLocatorInContext(frameContext, assertAction.target);\n await handle.waitFor({ state: 'visible' });\n if (assertAction.value) {\n const interpolated = interpolateVariables(assertAction.value, context.variables);\n const text = (await handle.textContent())?.trim() ?? '';\n if (!text.includes(interpolated)) {\n throw new Error(\n `Assertion failed: expected element text to include \"${interpolated}\", got \"${text}\"`,\n );\n }\n }\n } else {\n await checkErrorIf(page, assertAction.target, assertAction.errorIf);\n await runAssert(page, assertAction.target, assertAction.value, context);\n }\n break;\n }\n case 'wait': {\n const waitAction = action as Extract<Action, { type: 'wait' }>;\n if (debugMode && waitAction.frame) {\n console.log(`[DEBUG] Waiting in frame:`, waitAction.frame);\n }\n if (waitAction.frame && waitAction.target) {\n const frameContext = getActionContext(page, waitAction.frame);\n const handle = resolveLocatorInContext(frameContext, waitAction.target);\n await handle.waitFor({ state: 'visible', timeout: waitAction.timeout });\n } else {\n if (waitAction.target && waitAction.errorIf) {\n await checkErrorIf(page, waitAction.target, waitAction.errorIf);\n }\n await runWait(page, waitAction);\n }\n break;\n }\n case 'scroll':\n if (action.target && action.errorIf) {\n await checkErrorIf(page, action.target, action.errorIf);\n }\n await runScroll(page, action);\n break;\n case 'screenshot':\n throw new Error('Screenshot action should be handled separately');\n case 'evaluate':\n throw new Error('Evaluate action should be handled separately');\n case 'setVar': {\n let value: string;\n if (action.value) {\n value = interpolateVariables(action.value, context.variables);\n } else if (action.from === 'response') {\n throw new Error('setVar from response not yet implemented');\n } else if (action.from === 'element') {\n throw new Error('setVar from element not yet implemented');\n } else if (action.from === 'email') {\n throw new Error('Use email.extractCode or email.extractLink instead');\n } else {\n throw new Error('setVar requires value or from');\n }\n context.variables.set(action.name, value);\n break;\n }\n case 'email.waitFor': {\n if (!context.emailClient) {\n throw new Error('Email client not configured');\n }\n const mailbox = interpolateVariables(action.mailbox, context.variables);\n context.lastEmail = await context.emailClient.waitForEmail(mailbox, {\n timeout: action.timeout,\n subjectContains: action.subjectContains,\n });\n break;\n }\n case 'email.extractCode': {\n if (!context.emailClient) {\n throw new Error('Email client not configured');\n }\n if (!context.lastEmail) {\n throw new Error('No email loaded - call email.waitFor first');\n }\n const code = context.emailClient.extractCode(\n context.lastEmail,\n action.pattern ? new RegExp(action.pattern) : undefined,\n );\n if (!code) {\n throw new Error('No code found in email');\n }\n context.variables.set(action.saveTo, code);\n break;\n }\n case 'email.extractLink': {\n if (!context.emailClient) {\n throw new Error('Email client not configured');\n }\n if (!context.lastEmail) {\n throw new Error('No email loaded - call email.waitFor first');\n }\n const link = context.emailClient.extractLink(\n context.lastEmail,\n action.pattern ? new RegExp(action.pattern) : undefined,\n );\n if (!link) {\n throw new Error('No link found in email');\n }\n context.variables.set(action.saveTo, link);\n break;\n }\n case 'email.clear': {\n if (!context.emailClient) {\n throw new Error('Email client not configured');\n }\n const mailbox = interpolateVariables(action.mailbox, context.variables);\n await context.emailClient.clearMailbox(mailbox);\n break;\n }\n case 'appwrite.verifyEmail': {\n if (!context.appwriteContext.userId) {\n throw new Error('No user tracked. appwrite.verifyEmail requires a user signup to have occurred first.');\n }\n if (!context.appwriteConfig?.apiKey) {\n throw new Error('appwrite.verifyEmail requires appwrite.apiKey in config');\n }\n const { Client, Users } = await import('node-appwrite');\n const client = new Client()\n .setEndpoint(context.appwriteConfig.endpoint)\n .setProject(context.appwriteConfig.projectId)\n .setKey(context.appwriteConfig.apiKey);\n const users = new Users(client);\n await users.updateEmailVerification(context.appwriteContext.userId, true);\n console.log(`Verified email for user ${context.appwriteContext.userId}`);\n break;\n }\n case 'debug': {\n console.log('[DEBUG] Pausing execution - Playwright Inspector will open');\n await page.pause();\n break;\n }\n case 'waitForSelector': {\n const wsAction = action as Extract<Action, { type: 'waitForSelector' }>;\n const timeout = wsAction.timeout ?? 30000;\n\n if (debugMode) {\n console.log(`[DEBUG] Waiting for element to be ${wsAction.state}:`, wsAction.target);\n if (wsAction.frame) console.log(`[DEBUG] In frame:`, wsAction.frame);\n }\n\n let handle: PWLocator;\n if (wsAction.frame) {\n const frameContext = getActionContext(page, wsAction.frame);\n handle = resolveLocatorInContext(frameContext, wsAction.target);\n } else {\n if (wsAction.errorIf) {\n await checkErrorIf(page, wsAction.target, wsAction.errorIf);\n }\n handle = resolveLocator(page, wsAction.target);\n }\n\n switch (wsAction.state) {\n case 'visible':\n case 'hidden':\n case 'attached':\n case 'detached':\n await handle.waitFor({ state: wsAction.state, timeout });\n break;\n case 'enabled':\n await waitForCondition(\n () => handle.isEnabled(),\n timeout,\n `Element did not become enabled within ${timeout}ms`,\n browserName,\n );\n break;\n case 'disabled':\n await waitForCondition(\n () => handle.isDisabled(),\n timeout,\n `Element did not become disabled within ${timeout}ms`,\n browserName,\n );\n break;\n }\n break;\n }\n case 'conditional': {\n const condAction = action as Extract<Action, { type: 'conditional' }>;\n const handle = resolveLocator(page, condAction.condition.target);\n let conditionMet = false;\n\n if (debugMode) {\n console.log(`[DEBUG] Checking condition ${condAction.condition.type}:`, condAction.condition.target);\n }\n\n try {\n switch (condAction.condition.type) {\n case 'exists':\n await handle.waitFor({ state: 'attached', timeout: 500 });\n conditionMet = true;\n break;\n case 'notExists':\n try {\n await handle.waitFor({ state: 'detached', timeout: 500 });\n conditionMet = true;\n } catch {\n conditionMet = false;\n }\n break;\n case 'visible':\n conditionMet = await handle.isVisible();\n break;\n case 'hidden':\n conditionMet = !(await handle.isVisible());\n break;\n }\n } catch {\n // Element not found - condition is false unless we're checking for 'notExists'\n conditionMet = condAction.condition.type === 'notExists';\n }\n\n if (debugMode) {\n console.log(`[DEBUG] Condition result: ${conditionMet}`);\n }\n\n const stepsToRun = conditionMet ? condAction.then : (condAction.else ?? []);\n for (const [nestedIdx, nestedAction] of stepsToRun.entries()) {\n if (debugMode) {\n console.log(`[DEBUG] Executing nested step ${nestedIdx + 1}: ${nestedAction.type}`);\n }\n await executeActionWithRetry(page, nestedAction, index, options);\n }\n break;\n }\n case 'log': {\n const logAction = action as Extract<Action, { type: 'log' }>;\n const format = logAction.format ?? 'text';\n let logOutput: string;\n\n if (logAction.message) {\n // Static message - interpolate variables\n logOutput = interpolateVariables(logAction.message, context.variables);\n console.log(`[LOG] ${logOutput}`);\n } else if (logAction.eval) {\n // JS expression evaluation\n const interpolated = interpolateVariables(logAction.eval, context.variables);\n try {\n const result = await page.evaluate(interpolated);\n logOutput = typeof result === 'string' ? result : JSON.stringify(result, null, 2);\n console.log(`[LOG eval] ${logOutput}`);\n } catch (evalError) {\n logOutput = `[eval error] ${evalError instanceof Error ? evalError.message : String(evalError)}`;\n console.log(`[LOG] ${logOutput}`);\n }\n } else if (logAction.target) {\n // Element content extraction\n const frameContext = getActionContext(page, logAction.frame);\n const handle = resolveLocatorInContext(frameContext, logAction.target);\n\n switch (format) {\n case 'html':\n logOutput = await handle.innerHTML();\n break;\n case 'json':\n // Try to parse element's text as JSON and pretty-print\n const text = await handle.textContent() ?? '';\n try {\n logOutput = JSON.stringify(JSON.parse(text), null, 2);\n } catch {\n logOutput = text;\n }\n break;\n case 'text':\n default:\n logOutput = await handle.textContent() ?? '';\n break;\n }\n console.log(`[LOG element] ${logOutput}`);\n } else {\n logOutput = '(no content)';\n }\n\n // Store log output in extras so it can be captured in reports\n extras.logOutput = logOutput;\n break;\n }\n case 'fail': {\n const failAction = action as Extract<Action, { type: 'fail' }>;\n throw new Error(failAction.message);\n }\n case 'waitForBranch': {\n const wfbAction = action as Extract<Action, { type: 'waitForBranch' }>;\n const handle = resolveLocator(page, wfbAction.target);\n const timeout = wfbAction.timeout ?? 30000;\n const state = wfbAction.state ?? 'visible';\n const pollInterval = wfbAction.pollInterval ?? 100;\n\n if (debugMode) {\n console.log(`[DEBUG] waitForBranch: Waiting for element to be ${state}, timeout: ${timeout}ms`);\n }\n\n let elementAppeared = false;\n const startTime = Date.now();\n\n // Polling loop - does NOT throw on timeout\n while (Date.now() - startTime < timeout) {\n try {\n switch (state) {\n case 'visible':\n if (await handle.isVisible()) {\n elementAppeared = true;\n }\n break;\n case 'attached':\n if ((await handle.count()) > 0) {\n elementAppeared = true;\n }\n break;\n case 'enabled':\n if (await handle.isEnabled().catch(() => false)) {\n elementAppeared = true;\n }\n break;\n }\n } catch {\n // Element not found yet, continue polling\n }\n\n if (elementAppeared) break;\n await page.waitForTimeout(pollInterval);\n }\n\n if (debugMode) {\n console.log(`[DEBUG] waitForBranch result: ${elementAppeared ? 'appeared' : 'timeout'}`);\n }\n\n // Determine which branch to execute\n const branchToExecute = elementAppeared ? wfbAction.onAppear : wfbAction.onTimeout;\n\n // If no branch defined (onTimeout omitted and timed out), silently continue\n if (!branchToExecute) {\n if (debugMode) {\n console.log(`[DEBUG] No branch to execute, continuing silently`);\n }\n break;\n }\n\n // Execute the branch\n if (Array.isArray(branchToExecute)) {\n // Inline actions - execute each action recursively\n for (const [nestedIdx, nestedAction] of branchToExecute.entries()) {\n if (debugMode) {\n console.log(`[DEBUG] Executing branch step ${nestedIdx + 1}: ${nestedAction.type}`);\n }\n await executeActionWithRetry(page, nestedAction, index, options);\n }\n } else {\n // Workflow file reference - load and execute workflow\n const { loadWorkflowDefinition, loadTestDefinition } = await import('../../core/loader.js');\n\n // Resolve relative to cwd\n const workflowPath = path.resolve(process.cwd(), branchToExecute.workflow);\n const workflowDir = path.dirname(workflowPath);\n\n if (debugMode) {\n console.log(`[DEBUG] Executing workflow: ${workflowPath}`);\n }\n\n const workflow = await loadWorkflowDefinition(workflowPath);\n\n // Merge variables from branch definition\n if (branchToExecute.variables) {\n for (const [key, value] of Object.entries(branchToExecute.variables)) {\n const interpolated = interpolateVariables(value, context.variables);\n context.variables.set(key, interpolated);\n }\n }\n\n // Execute each test reference in the workflow\n for (const testRef of workflow.tests) {\n const testFilePath = path.resolve(workflowDir, testRef.file);\n\n if (debugMode) {\n console.log(`[DEBUG] Loading test from workflow: ${testFilePath}`);\n }\n\n const test = await loadTestDefinition(testFilePath);\n\n // Initialize test variables\n if (test.variables) {\n for (const [key, value] of Object.entries(test.variables)) {\n const interpolated = interpolateVariables(value, context.variables);\n context.variables.set(key, interpolated);\n }\n }\n\n // Execute each step in the test\n for (const [testStepIdx, testAction] of test.steps.entries()) {\n await executeActionWithRetry(page, testAction, testStepIdx, options);\n }\n }\n }\n break;\n }\n case 'saveStorageState': {\n const saveAction = action as Extract<Action, { type: 'saveStorageState' }>;\n if (saveAction.path) {\n const resolvedPath = interpolateVariables(saveAction.path, context.variables);\n const baseDir = testFilePath ? path.dirname(testFilePath) : process.cwd();\n const absPath = path.isAbsolute(resolvedPath) ? resolvedPath : path.resolve(baseDir, resolvedPath);\n await page.context().storageState({ path: absPath });\n if (debugMode) {\n console.log(`[DEBUG] Saved storage state to ${absPath}`);\n }\n } else if (saveAction.handler) {\n const resolvedHandler = interpolateVariables(saveAction.handler, context.variables);\n const baseDir = testFilePath ? path.dirname(testFilePath) : process.cwd();\n const absPath = path.isAbsolute(resolvedHandler) ? resolvedHandler : path.resolve(baseDir, resolvedHandler);\n let loadPath = absPath;\n if (absPath.endsWith('.ts')) {\n const jsPath = absPath.replace(/\\.ts$/, '.js');\n try {\n await fs.access(jsPath);\n loadPath = jsPath;\n } catch {\n // Fall through to direct .ts import (requires tsx/ts-node in user's env)\n }\n }\n const mod = await import(`${loadPath}?t=${Date.now()}`);\n const fn = (mod.default ?? mod) as (ctx: {\n page: typeof page;\n context: ReturnType<typeof page.context>;\n variables: Map<string, string>;\n }) => Promise<void> | void;\n if (typeof fn !== 'function') {\n throw new Error(`saveStorageState handler at ${resolvedHandler} did not export a default function`);\n }\n await fn({\n page,\n context: page.context(),\n variables: context.variables,\n });\n if (debugMode) {\n console.log(`[DEBUG] Ran custom saveStorageState handler: ${resolvedHandler}`);\n }\n } else {\n throw new Error('saveStorageState requires either `path` or `handler` (schema should have caught this)');\n }\n break;\n }\n case 'assertCookies': {\n const cookieAction = action as Extract<Action, { type: 'assertCookies' }>;\n const filterUrl = cookieAction.url\n ? interpolateVariables(cookieAction.url, context.variables)\n : undefined;\n const jar = await page.context().cookies(filterUrl);\n const names = new Set(jar.map((c) => c.name));\n const problems: string[] = [];\n\n if (cookieAction.has) {\n for (const name of cookieAction.has) {\n if (!names.has(name)) problems.push(`expected cookie \"${name}\" to be present`);\n }\n }\n if (cookieAction.not) {\n for (const name of cookieAction.not) {\n if (names.has(name)) problems.push(`expected cookie \"${name}\" to be absent`);\n }\n }\n if (cookieAction.match) {\n for (const [name, pattern] of Object.entries(cookieAction.match)) {\n const c = jar.find((entry) => entry.name === name);\n if (!c) {\n problems.push(`expected cookie \"${name}\" to be present (for value match)`);\n continue;\n }\n const matcher = compileMatcher(interpolateVariables(pattern, context.variables), 'substr');\n if (!matcher(c.value)) {\n problems.push(`cookie \"${name}\" value \"${c.value}\" did not match pattern \"${pattern}\"`);\n }\n }\n }\n if (problems.length > 0) {\n throw new Error(`assertCookies failed:\\n - ${problems.join('\\n - ')}\\n (cookies seen: ${[...names].join(', ') || '<none>'})`);\n }\n break;\n }\n case 'expectResponse': {\n if (!responseLog) {\n throw new Error('expectResponse requires a responseLog to be attached (executor wiring issue)');\n }\n const respAction = action as Extract<Action, { type: 'expectResponse' }>;\n const urlPattern = interpolateVariables(respAction.url, context.variables);\n const urlMatch = compileMatcher(urlPattern, 'url');\n const headerMatchers = respAction.headers\n ? Object.entries(respAction.headers).map(([name, pattern]) => ({\n name: name.toLowerCase(),\n test: compileMatcher(interpolateVariables(pattern, context.variables), 'substr'),\n pattern,\n }))\n : [];\n const expectedStatus = respAction.status;\n\n let sinceTs: number;\n if (respAction.since === 'testStart') {\n sinceTs = 0;\n } else if (typeof respAction.since === 'number') {\n sinceTs = respAction.since;\n } else {\n sinceTs = stepStartTs ?? 0;\n }\n\n const timeout = respAction.timeout ?? 5000;\n const deadline = Date.now() + timeout;\n\n const findMatch = () => {\n for (const entry of responseLog.snapshot()) {\n if (entry.ts < sinceTs) continue;\n if (!urlMatch(entry.url)) continue;\n if (expectedStatus !== undefined && entry.status !== expectedStatus) continue;\n let headersOk = true;\n for (const h of headerMatchers) {\n const value = entry.headers[h.name];\n if (value === undefined || !h.test(value)) {\n headersOk = false;\n break;\n }\n }\n if (headersOk) return entry;\n }\n return null;\n };\n\n let match = findMatch();\n while (!match && Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, 50));\n match = findMatch();\n }\n\n if (!match) {\n const recent = responseLog.snapshot().slice(-5).map((e) => `${e.status} ${e.url}`).join('\\n ');\n throw new Error(\n `expectResponse timed out after ${timeout}ms.\\n` +\n ` url pattern: ${urlPattern}\\n` +\n (expectedStatus !== undefined ? ` expected status: ${expectedStatus}\\n` : '') +\n (headerMatchers.length > 0 ? ` expected headers: ${headerMatchers.map((h) => `${h.name}=${h.pattern}`).join(', ')}\\n` : '') +\n ` recent responses:\\n ${recent || '<none>'}`\n );\n }\n\n if (debugMode) {\n console.log(`[DEBUG] expectResponse matched: ${match.status} ${match.url}`);\n }\n break;\n }\n default:\n throw new Error(`Unsupported action type: ${(action as Action).type}`);\n }\n\n const trackedPayload = buildTrackPayload();\n if (trackedPayload) {\n await trackResource(trackedPayload);\n }\n\n // Success - break out of retry loop\n return extras;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n\n // Try AI-assisted healing if enabled (before interactive mode)\n if (healing?.enabled && aiConfig && hasTarget(action)) {\n const maxAttempts = healing.maxAttempts ?? 3;\n console.log(`\\n🔧 Attempting AI-assisted healing (max ${maxAttempts} attempts)...`);\n\n try {\n const pageContent = await page.content();\n const healingContext: HealingContext = {\n page,\n action,\n error: error.message,\n pageContent,\n };\n\n const healingResult = await runHealingAgent(healingContext, aiConfig, maxAttempts);\n\n if (healingResult.success && healingResult.fixedAction) {\n console.log(`✅ AI found fix: ${healingResult.explanation}`);\n\n // Retry with fixed action (disable healing to prevent infinite loops)\n const fixedExtras = await executeActionWithRetry(page, healingResult.fixedAction, index, {\n ...options,\n healing: { enabled: false },\n });\n return fixedExtras;\n } else {\n console.log(`❌ AI healing failed: ${healingResult.explanation}`);\n }\n } catch (healingError) {\n console.log(`❌ AI healing error: ${healingError instanceof Error ? healingError.message : String(healingError)}`);\n }\n }\n\n if (interactive && aiConfig && hasTarget(action)) {\n const choice = await handleInteractiveError(page, action, error, screenshotDir, index, aiConfig);\n\n switch (choice) {\n case 'retry':\n console.log('Retrying with AI suggestion...\\n');\n // Note: In a full implementation, we would modify the action.target with the suggestion\n // For now, just retry with the same selector\n continue;\n case 'skip':\n console.log('Skipping step...\\n');\n return extras;\n case 'debug':\n console.log('Opening Playwright Inspector...\\n');\n await page.pause();\n continue;\n case 'abort':\n default:\n throw error;\n }\n }\n\n // Non-interactive mode or debug mode - handle normally\n if (debugMode) {\n console.error(`[DEBUG] Action failed: ${error.message}`);\n console.log('[DEBUG] Opening Playwright Inspector for debugging...');\n await page.pause();\n }\n\n throw error;\n }\n }\n}\n\nfunction hasTarget(action: Action): boolean {\n return 'target' in action && action.target !== undefined;\n}\n\nexport const runWebTest = async (\n test: TestDefinition,\n options: WebRunOptions = {},\n): Promise<WebRunResult> => {\n if (test.platform !== 'web') {\n throw new Error(`runWebTest only supports web platform, received ${test.platform}`);\n }\n\n const browserName = options.browser ?? 'chromium';\n const headless = !(options.headed ?? false);\n const screenshotDir = options.screenshotDir ?? defaultScreenshotDir;\n const defaultTimeout = options.defaultTimeoutMs ?? 30000;\n\n // Check if tracking is already set up by CLI\n const trackingAlreadySetUp = options.skipTrackingSetup ||\n (process.env.INTELLITESTER_TRACKING_OWNER === 'cli');\n\n let ownsTracking = false;\n let trackingServer: TrackingServer | null = null;\n let fileTracking: Awaited<ReturnType<typeof initFileTracking>> | null = null;\n const sessionId = options.sessionId ?? crypto.randomUUID();\n\n if (!trackingAlreadySetUp) {\n ownsTracking = true;\n // Start tracking server for SSR resource tracking\n trackingServer = new TrackingServer();\n await trackingServer.start();\n\n // Set env vars so the app can track resources\n process.env.INTELLITESTER_SESSION_ID = sessionId;\n process.env.INTELLITESTER_TRACK_URL = `http://localhost:${trackingServer.port}`;\n fileTracking = await initFileTracking({\n sessionId,\n trackDir: options.trackDir,\n cleanupConfig: test.config?.appwrite?.cleanup ? {\n provider: 'appwrite',\n scanUntracked: true,\n appwrite: {\n endpoint: test.config.appwrite.endpoint,\n projectId: test.config.appwrite.projectId,\n apiKey: test.config.appwrite.apiKey,\n cleanupOnFailure: test.config.appwrite.cleanupOnFailure,\n },\n } : undefined,\n providerConfig: test.config?.appwrite ? {\n provider: 'appwrite',\n endpoint: test.config.appwrite.endpoint,\n projectId: test.config.appwrite.projectId,\n apiKey: test.config.appwrite.apiKey,\n } : undefined,\n });\n process.env.INTELLITESTER_TRACK_FILE = fileTracking.trackFile;\n } else {\n console.log('Using existing tracking setup (owned by CLI)');\n }\n\n // Start webServer if configured (unless CLI already started it)\n if (options.webServer && !options.skipWebServerStart) {\n const requiresTrackingEnv = Boolean(\n test.config?.appwrite?.cleanup || test.config?.appwrite?.cleanupOnFailure\n );\n const wsEntries = Array.isArray(options.webServer) ? options.webServer : [options.webServer];\n const userExplicitlySetReuse = wsEntries.some((e) => e.reuseExistingServer !== undefined);\n const shouldForceNoReuse = ownsTracking && requiresTrackingEnv && !userExplicitlySetReuse;\n if (shouldForceNoReuse) {\n console.log('[Intellitester] Appwrite cleanup enabled; restarting server to inject tracking env.');\n }\n const normalized = wsEntries.map((entry) => ({\n ...entry,\n ...(shouldForceNoReuse ? { reuseExistingServer: false } : {}),\n }));\n await webServerManager.start(normalized.length === 1 ? normalized[0] : normalized);\n } else if (options.skipWebServerStart) {\n console.log('Using existing web server (owned by CLI)');\n }\n\n // Handle Ctrl+C and termination signals\n const cleanup = () => {\n if (ownsTracking) {\n trackingServer?.stop();\n webServerManager.kill();\n if (fileTracking) {\n void fileTracking.stop();\n }\n delete process.env.INTELLITESTER_TRACK_FILE;\n }\n process.exit(1);\n };\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n\n // Launch local browser\n console.log(`Launching ${browserName}${headless ? ' (headless)' : ' (visible)'}...`);\n const browser = await getBrowser(browserName).launch(getBrowserLaunchOptions({ headless, browser: browserName }));\n console.log(`Browser launched successfully`);\n\n // Determine viewport sizes to test\n const sizesToTest: Array<{ size: string; viewport: { width: number; height: number } }> = [];\n if (options.testSizes && options.testSizes.length > 0) {\n for (const size of options.testSizes) {\n const viewport = parseViewportSize(size);\n if (!viewport) {\n throw new Error(\n `Invalid viewport size: \"${size}\". Use predefined sizes (xs, sm, md, lg, xl) or \"WxH\" format (e.g., \"1920x1080\").`\n );\n }\n sizesToTest.push({ size, viewport });\n }\n } else {\n // Default: single run at 1920x1080\n sizesToTest.push({ size: 'default', viewport: { width: 1920, height: 1080 } });\n }\n\n const allResults: StepResult[] = [];\n let overallFailed = false;\n let lastExecutionContext: ExecutionContext | null = null;\n\n const debugMode = options.debug ?? false;\n const interactive = options.interactive ?? false;\n\n // Loop over each viewport size\n for (const { size, viewport } of sizesToTest) {\n if (sizesToTest.length > 1) {\n console.log(`Testing at viewport: ${size} (${viewport.width}x${viewport.height})`);\n }\n\n const browserContext = await browser.newContext({\n viewport: { width: viewport.width, height: viewport.height },\n ...(options.storageState ? { storageState: options.storageState } : {}),\n });\n const page = await browserContext.newPage();\n page.setDefaultTimeout(defaultTimeout);\n\n // Network response log for `expectResponse` action (bounded ring buffer).\n const responseLog = new ResponseLog();\n responseLog.attach(page);\n let lastStepEndTs = Date.now();\n\n // Initialize execution context with variables\n const executionContext: ExecutionContext = {\n variables: new Map<string, string>(),\n lastEmail: null,\n emailClient: null,\n appwriteContext: createTestContext(),\n appwriteConfig: test.config?.appwrite ? {\n endpoint: test.config.appwrite.endpoint,\n projectId: test.config.appwrite.projectId,\n apiKey: test.config.appwrite.apiKey,\n } : undefined,\n };\n\n // Initialize email client if configured\n if (test.config?.email) {\n const emailEndpoint = test.config.email.endpoint ?? process.env.INBUCKET_URL;\n if (!emailEndpoint) {\n throw new Error('Email testing requires endpoint in config or INBUCKET_URL env var');\n }\n executionContext.emailClient = new InbucketClient({\n endpoint: emailEndpoint,\n });\n }\n\n // Set up network interception for Appwrite API responses\n page.on('response', async (response) => {\n const url = response.url();\n const method = response.request().method();\n\n try {\n // Handle POST requests (resource creation)\n if (method === 'POST') {\n // User created\n if (APPWRITE_PATTERNS.userCreate.test(url)) {\n const data = await response.json();\n executionContext.appwriteContext.userId = data.$id;\n executionContext.appwriteContext.userEmail = data.email;\n return;\n }\n\n // Row created\n const rowMatch = url.match(APPWRITE_PATTERNS.rowCreate);\n if (rowMatch) {\n const data = await response.json();\n executionContext.appwriteContext.resources.push({\n type: 'row',\n id: data.$id,\n databaseId: rowMatch[1],\n tableId: rowMatch[2],\n createdAt: new Date().toISOString(),\n });\n return;\n }\n\n // File created\n const fileMatch = url.match(APPWRITE_PATTERNS.fileCreate);\n if (fileMatch) {\n const data = await response.json();\n executionContext.appwriteContext.resources.push({\n type: 'file',\n id: data.$id,\n bucketId: fileMatch[1],\n createdAt: new Date().toISOString(),\n });\n return;\n }\n\n // Team created\n const teamMatch = url.match(APPWRITE_PATTERNS.teamCreate);\n if (teamMatch) {\n const data = await response.json();\n executionContext.appwriteContext.resources.push({\n type: 'team',\n id: data.$id,\n createdAt: new Date().toISOString(),\n });\n return;\n }\n\n // Membership created\n const membershipMatch = url.match(APPWRITE_PATTERNS.membershipCreate);\n if (membershipMatch) {\n const data = await response.json();\n executionContext.appwriteContext.resources.push({\n type: 'membership',\n id: data.$id,\n teamId: membershipMatch[1],\n createdAt: new Date().toISOString(),\n });\n return;\n }\n\n // Message created\n const messageMatch = url.match(APPWRITE_PATTERNS.messageCreate);\n if (messageMatch) {\n const data = await response.json();\n executionContext.appwriteContext.resources.push({\n type: 'message',\n id: data.$id,\n createdAt: new Date().toISOString(),\n });\n return;\n }\n }\n\n // Handle PUT/PATCH requests (resource updates)\n if (method === 'PUT' || method === 'PATCH') {\n // Row updated\n const rowUpdateMatch = url.match(APPWRITE_UPDATE_PATTERNS.rowUpdate);\n if (rowUpdateMatch) {\n const resourceId = rowUpdateMatch[3];\n const existingResource = executionContext.appwriteContext.resources.find(\n r => r.type === 'row' && r.id === resourceId\n );\n if (!existingResource) {\n // Resource was updated but not created in this test - track it for potential cleanup\n executionContext.appwriteContext.resources.push({\n type: 'row',\n id: resourceId,\n databaseId: rowUpdateMatch[1],\n tableId: rowUpdateMatch[2],\n createdAt: new Date().toISOString(),\n });\n }\n return;\n }\n\n // File updated\n const fileUpdateMatch = url.match(APPWRITE_UPDATE_PATTERNS.fileUpdate);\n if (fileUpdateMatch) {\n const resourceId = fileUpdateMatch[2];\n const existingResource = executionContext.appwriteContext.resources.find(\n r => r.type === 'file' && r.id === resourceId\n );\n if (!existingResource) {\n // Resource was updated but not created in this test - track it for potential cleanup\n executionContext.appwriteContext.resources.push({\n type: 'file',\n id: resourceId,\n bucketId: fileUpdateMatch[1],\n createdAt: new Date().toISOString(),\n });\n }\n return;\n }\n\n // Team updated\n const teamUpdateMatch = url.match(APPWRITE_UPDATE_PATTERNS.teamUpdate);\n if (teamUpdateMatch) {\n const resourceId = teamUpdateMatch[1];\n const existingResource = executionContext.appwriteContext.resources.find(\n r => r.type === 'team' && r.id === resourceId\n );\n if (!existingResource) {\n // Resource was updated but not created in this test - track it for potential cleanup\n executionContext.appwriteContext.resources.push({\n type: 'team',\n id: resourceId,\n createdAt: new Date().toISOString(),\n });\n }\n return;\n }\n }\n\n // Handle DELETE requests (mark resources as deleted)\n if (method === 'DELETE') {\n // Row deleted\n const rowDeleteMatch = url.match(APPWRITE_DELETE_PATTERNS.rowDelete);\n if (rowDeleteMatch) {\n const resourceId = rowDeleteMatch[3];\n const resource = executionContext.appwriteContext.resources.find(\n r => r.type === 'row' && r.id === resourceId\n );\n if (resource) {\n resource.deleted = true;\n }\n return;\n }\n\n // File deleted\n const fileDeleteMatch = url.match(APPWRITE_DELETE_PATTERNS.fileDelete);\n if (fileDeleteMatch) {\n const resourceId = fileDeleteMatch[2];\n const resource = executionContext.appwriteContext.resources.find(\n r => r.type === 'file' && r.id === resourceId\n );\n if (resource) {\n resource.deleted = true;\n }\n return;\n }\n\n // Team deleted\n const teamDeleteMatch = url.match(APPWRITE_DELETE_PATTERNS.teamDelete);\n if (teamDeleteMatch) {\n const resourceId = teamDeleteMatch[1];\n const resource = executionContext.appwriteContext.resources.find(\n r => r.type === 'team' && r.id === resourceId\n );\n if (resource) {\n resource.deleted = true;\n }\n return;\n }\n\n // Membership deleted\n const membershipDeleteMatch = url.match(APPWRITE_DELETE_PATTERNS.membershipDelete);\n if (membershipDeleteMatch) {\n const resourceId = membershipDeleteMatch[2];\n const resource = executionContext.appwriteContext.resources.find(\n r => r.type === 'membership' && r.id === resourceId\n );\n if (resource) {\n resource.deleted = true;\n }\n return;\n }\n }\n } catch {\n // Ignore parse errors for non-JSON responses\n }\n });\n\n // Initialize variables from test definition\n if (test.variables) {\n for (const [key, value] of Object.entries(test.variables)) {\n // Interpolate variable values to handle nested {{uuid}}\n const interpolated = interpolateVariables(value, executionContext.variables);\n executionContext.variables.set(key, interpolated);\n }\n }\n\n const sizeResults: StepResult[] = [];\n const buildTrackPayload = (\n action: Action,\n index: number,\n stepExtras?: Record<string, unknown>\n ): IntegrationTrackedResource | null => {\n if (!('track' in action)) return null;\n const rawTrack = (action as { track?: Record<string, unknown> }).track;\n if (!rawTrack || typeof rawTrack !== 'object') return null;\n const track = interpolateTrackMetadata(rawTrack, executionContext.variables) as Record<string, unknown>;\n if (typeof track.type !== 'string' || typeof track.id !== 'string') return null;\n\n const { includeStepContext, ...rest } = track;\n const payload: IntegrationTrackedResource = {\n type: track.type,\n id: track.id,\n ...rest,\n };\n if (includeStepContext) {\n payload.step = { index, ...action, ...stepExtras };\n }\n return payload;\n };\n\n let _sizeTestFailed = false;\n\n try {\n for (let index = 0; index < test.steps.length; index++) {\n // ts of when this iteration began == when the previous step ended.\n // Captured once at the top so every handler sees a stable value within\n // this iteration. On the first iteration this equals the test start ts.\n lastStepEndTs = Date.now();\n const action = test.steps[index];\n if (debugMode) {\n console.log(`[DEBUG] Executing step ${index + 1}: ${action.type}`);\n }\n safeCallback('onStepStart', options.onStepStart\n ? () => options.onStepStart!({ action, index, total: test.steps.length })\n : undefined);\n\n // Merge server-tracked resources before each action (only if we own tracking)\n const serverResources = trackingServer?.getResources(sessionId) ?? [];\n for (const resource of serverResources) {\n // Check for tracked users\n if (resource.type === 'user' && !executionContext.appwriteContext.userId) {\n executionContext.appwriteContext.userId = resource.id;\n }\n // Add to resources if not already tracked (only for known types)\n const knownTypes = ['row', 'file', 'user', 'team', 'membership', 'message'] as const;\n if (knownTypes.includes(resource.type as any)) {\n const exists = executionContext.appwriteContext.resources.some(\n r => r.type === resource.type && r.id === resource.id\n );\n if (!exists) {\n executionContext.appwriteContext.resources.push({\n type: resource.type as TrackedResource['type'],\n id: resource.id,\n databaseId: resource.databaseId as string | undefined,\n tableId: resource.tableId as string | undefined,\n bucketId: resource.bucketId as string | undefined,\n teamId: resource.teamId as string | undefined,\n createdAt: resource.createdAt || new Date().toISOString(),\n });\n }\n }\n }\n\n try {\n // Handle screenshot separately since it has special return handling\n if (action.type === 'screenshot') {\n const ssAction = action as Extract<Action, { type: 'screenshot' }>;\n const waitBefore = ssAction.waitBefore ?? 500;\n\n if (waitBefore > 0) {\n if (debugMode) {\n console.log(`[DEBUG] Screenshot: waiting ${waitBefore}ms for visual stability`);\n }\n await page.waitForTimeout(waitBefore);\n }\n\n // Include viewport size in screenshot filename when testing multiple sizes\n const screenshotName = sizesToTest.length > 1 && ssAction.name\n ? ssAction.name.replace(/\\.png$/, `-${size}.png`)\n : ssAction.name;\n const screenshotPath = await runScreenshot(page, screenshotName, screenshotDir, index, browserName);\n sizeResults.push({ action, status: 'passed', screenshotPath });\n safeCallback('onStepComplete', options.onStepComplete\n ? () => options.onStepComplete!(sizeResults[sizeResults.length - 1], index, test.steps.length)\n : undefined);\n const trackedPayload = buildTrackPayload(action, index, { screenshotPath });\n if (trackedPayload) {\n await trackResource(trackedPayload);\n }\n continue;\n }\n\n // Handle evaluate separately since it captures screenshots and returns special results\n if (action.type === 'evaluate') {\n const evalAction = action as Extract<Action, { type: 'evaluate' }>;\n const waitBefore = evalAction.waitBefore ?? 500;\n\n if (waitBefore > 0) {\n if (debugMode) {\n console.log(`[DEBUG] Evaluate: waiting ${waitBefore}ms for visual stability`);\n }\n await page.waitForTimeout(waitBefore);\n }\n\n // Wait for page to settle\n const timing = getBrowserTimingConfig(browserName ?? 'chromium');\n await waitForPageStable(page, timing.screenshotNetworkIdleTimeout);\n\n // Take screenshot\n await ensureScreenshotDir(screenshotDir);\n const evalScreenshotPath = path.join(screenshotDir, `evaluate-step-${index + 1}.png`);\n const screenshotBuffer = await page.screenshot({\n path: evalScreenshotPath,\n fullPage: evalAction.fullPage ?? true,\n });\n\n // Interpolate expected values\n const expectedRaw = evalAction.expected;\n const expectedArray = Array.isArray(expectedRaw)\n ? expectedRaw.map(e => interpolateVariables(e, executionContext.variables))\n : [interpolateVariables(expectedRaw, executionContext.variables)];\n\n // Run evaluation\n const evalResult = await evaluate({\n expected: expectedArray,\n mode: evalAction.mode ?? 'auto',\n regex: evalAction.regex ?? false,\n prompt: evalAction.prompt,\n confidence: evalAction.confidence ?? 60,\n screenshotBuffer,\n screenshotPath: evalScreenshotPath,\n aiConfig: options.aiConfig,\n });\n\n if (debugMode) {\n console.log(`[DEBUG] Evaluate result: ${evalResult.passed ? 'PASSED' : 'FAILED'} (${evalResult.mode})`);\n console.log(`[DEBUG] Reason: ${evalResult.reason}`);\n if (evalResult.ocrText) {\n console.log(`[DEBUG] OCR text (first 200 chars): ${evalResult.ocrText.slice(0, 200)}`);\n }\n }\n\n if (!evalResult.passed) {\n throw new Error(`Evaluate failed (${evalResult.mode} mode): ${evalResult.reason}`);\n }\n\n sizeResults.push({\n action,\n status: 'passed',\n screenshotPath: evalScreenshotPath,\n logOutput: `Evaluate passed (${evalResult.mode}): ${evalResult.reason}`,\n });\n safeCallback('onStepComplete', options.onStepComplete\n ? () => options.onStepComplete!(sizeResults[sizeResults.length - 1], index, test.steps.length)\n : undefined);\n continue;\n }\n\n const stepStartTs = lastStepEndTs;\n const actionExtras = await executeActionWithRetry(page, action, index, {\n baseUrl: options.baseUrl ?? test.config?.web?.baseUrl,\n context: executionContext,\n screenshotDir,\n debugMode,\n interactive,\n aiConfig: options.aiConfig,\n browserName,\n healing: options.healing,\n testFilePath: options.testFilePath,\n responseLog,\n stepStartTs,\n });\n\n sizeResults.push({ action, status: 'passed', logOutput: actionExtras.logOutput });\n safeCallback('onStepComplete', options.onStepComplete\n ? () => options.onStepComplete!(sizeResults[sizeResults.length - 1], index, test.steps.length)\n : undefined);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n sizeResults.push({ action, status: 'failed', error: message });\n safeCallback('onStepComplete', options.onStepComplete\n ? () => options.onStepComplete!(sizeResults[sizeResults.length - 1], index, test.steps.length)\n : undefined);\n _sizeTestFailed = true;\n overallFailed = true;\n // Don't throw - continue to next viewport size if there is one\n break;\n }\n }\n } finally {\n // Always close this browser context\n await browserContext.close();\n }\n\n // Add results with viewport prefix if multiple sizes\n for (const result of sizeResults) {\n if (sizesToTest.length > 1) {\n // Clone the result with size info in error message if failed\n if (result.status === 'failed' && result.error) {\n allResults.push({\n ...result,\n error: `[${size}] ${result.error}`,\n });\n } else {\n allResults.push(result);\n }\n } else {\n allResults.push(result);\n }\n }\n\n // Keep track of the last execution context for cleanup\n lastExecutionContext = executionContext;\n }\n\n // Cleanup after all viewport tests complete\n try {\n // Remove signal handlers\n process.off('SIGINT', cleanup);\n process.off('SIGTERM', cleanup);\n\n if (lastExecutionContext && ownsTracking && fileTracking) {\n await mergeFileTrackedResources(\n fileTracking.trackFile,\n lastExecutionContext.appwriteContext\n );\n\n // Run Appwrite cleanup if configured\n if (test.config?.appwrite?.cleanup) {\n const appwriteClient = new AppwriteTestClient({\n endpoint: test.config.appwrite.endpoint,\n projectId: test.config.appwrite.projectId,\n apiKey: test.config.appwrite.apiKey,\n cleanup: true,\n });\n\n const cleanupResult = await appwriteClient.cleanup(\n lastExecutionContext.appwriteContext,\n sessionId,\n process.cwd()\n );\n console.log('Cleanup result:', cleanupResult);\n }\n }\n\n // Only clean up tracking/web server if we own them\n if (ownsTracking) {\n if (fileTracking) {\n await fileTracking.stop();\n }\n delete process.env.INTELLITESTER_TRACK_FILE;\n\n // Stop tracking server\n trackingServer?.stop();\n\n // Stop webServer if it was started\n await webServerManager.stop();\n }\n\n await browser.close();\n await terminateOCRWorker();\n } catch (cleanupError) {\n console.error('Error during cleanup:', cleanupError);\n }\n\n return {\n status: overallFailed ? 'failed' : 'passed',\n steps: allResults,\n variables: lastExecutionContext?.variables,\n };\n};\n","import type { EmailClientConfig, EmailHeader, Email } from \"./types\";\n\nexport class InbucketClient {\n private endpoint: string;\n\n constructor(config: EmailClientConfig) {\n this.endpoint = config.endpoint.replace(/\\/$/, \"\"); // Remove trailing slash\n }\n\n /**\n * Extract mailbox name from email (e.g., \"test@example.com\" → \"test\")\n */\n private getMailboxName(email: string): string {\n return email.split(\"@\")[0];\n }\n\n /**\n * List all messages in a mailbox\n */\n async listMessages(email: string): Promise<EmailHeader[]> {\n const mailbox = this.getMailboxName(email);\n const url = `${this.endpoint}/api/v1/mailbox/${mailbox}`;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(\n `Failed to list messages for ${email}: ${response.status} ${response.statusText}`,\n );\n }\n\n const messages = (await response.json()) as EmailHeader[];\n return messages;\n }\n\n /**\n * Get a specific message\n */\n async getMessage(email: string, id: string): Promise<Email> {\n const mailbox = this.getMailboxName(email);\n const url = `${this.endpoint}/api/v1/mailbox/${mailbox}/${id}`;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(\n `Failed to get message ${id} for ${email}: ${response.status} ${response.statusText}`,\n );\n }\n\n const message = (await response.json()) as Email;\n return message;\n }\n\n /**\n * Wait for an email to arrive (polling with timeout)\n */\n async waitForEmail(\n email: string,\n options?: {\n timeout?: number; // default 30000ms\n pollInterval?: number; // default 1000ms\n subjectContains?: string;\n },\n ): Promise<Email> {\n const timeout = options?.timeout ?? 30000;\n const pollInterval = options?.pollInterval ?? 1000;\n const subjectContains = options?.subjectContains;\n\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n const messages = await this.listMessages(email);\n\n // Find matching message\n const matchingMessage = messages.find((msg) => {\n if (subjectContains) {\n return msg.subject.includes(subjectContains);\n }\n return true; // Return first message if no subject filter\n });\n\n if (matchingMessage) {\n // Get the full message\n return await this.getMessage(email, matchingMessage.id);\n }\n\n // Wait before next poll\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new Error(\n `Timeout waiting for email to ${email}${subjectContains ? ` with subject containing \"${subjectContains}\"` : \"\"}`,\n );\n }\n\n /**\n * Extract verification code from email body\n */\n extractCode(email: Email, pattern?: RegExp): string | null {\n // Default pattern: 6-digit code\n const regex = pattern ?? /\\b(\\d{6})\\b/;\n const text = email.body.text || email.body.html;\n const match = text.match(regex);\n return match ? match[1] : null;\n }\n\n /**\n * Extract link from email body\n */\n extractLink(email: Email, pattern?: RegExp): string | null {\n // Default: any http/https URL\n const regex = pattern ?? /https?:\\/\\/[^\\s\"'<>]+/;\n const text = email.body.text || email.body.html;\n const match = text.match(regex);\n return match ? match[0] : null;\n }\n\n /**\n * Delete a specific message\n */\n async deleteMessage(email: string, id: string): Promise<void> {\n const mailbox = this.getMailboxName(email);\n const url = `${this.endpoint}/api/v1/mailbox/${mailbox}/${id}`;\n\n const response = await fetch(url, {\n method: \"DELETE\",\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to delete message ${id} for ${email}: ${response.status} ${response.statusText}`,\n );\n }\n }\n\n /**\n * Clear all messages in a mailbox\n */\n async clearMailbox(email: string): Promise<void> {\n const mailbox = this.getMailboxName(email);\n const url = `${this.endpoint}/api/v1/mailbox/${mailbox}`;\n\n const response = await fetch(url, {\n method: \"DELETE\",\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to clear mailbox for ${email}: ${response.status} ${response.statusText}`,\n );\n }\n }\n}\n","export { AppwriteTestClient, createTestContext } from './appwriteClient';\nexport type {\n TrackedResource,\n TestContext,\n AppwriteCleanupConfig,\n} from './types';\nexport { APPWRITE_PATTERNS, APPWRITE_UPDATE_PATTERNS, APPWRITE_DELETE_PATTERNS } from './types';\n","import { Client, Users, TablesDB, Storage, Teams } from 'node-appwrite';\nimport type { TestContext, AppwriteCleanupConfig } from './types';\nimport { saveFailedCleanup } from '../../core/cleanup/persistence.js';\n\nexport class AppwriteTestClient {\n private client: Client;\n private users: Users;\n private tablesDB: TablesDB;\n private storage: Storage;\n private teams: Teams;\n private config: AppwriteCleanupConfig;\n\n constructor(config: AppwriteCleanupConfig) {\n this.config = config;\n this.client = new Client()\n .setEndpoint(config.endpoint)\n .setProject(config.projectId)\n .setKey(config.apiKey);\n\n this.users = new Users(this.client);\n this.tablesDB = new TablesDB(this.client);\n this.storage = new Storage(this.client);\n this.teams = new Teams(this.client);\n }\n\n async cleanup(\n context: TestContext,\n sessionId?: string,\n cwd?: string\n ): Promise<{ success: boolean; deleted: string[]; failed: string[] }> {\n const deleted: string[] = [];\n const failed: string[] = [];\n\n // Delete in reverse order (newest first, user last)\n const sortedResources = [...context.resources].reverse();\n\n for (const resource of sortedResources) {\n // Skip resources that were already deleted during the test\n if (resource.deleted) {\n deleted.push(`${resource.type}:${resource.id} (already deleted)`);\n continue;\n }\n\n try {\n switch (resource.type) {\n case 'row':\n if (resource.databaseId && resource.tableId) {\n await this.tablesDB.deleteRow({\n databaseId: resource.databaseId,\n tableId: resource.tableId,\n rowId: resource.id,\n });\n }\n break;\n case 'file':\n if (resource.bucketId) {\n await this.storage.deleteFile(resource.bucketId, resource.id);\n }\n break;\n case 'membership':\n if (resource.teamId) {\n await this.teams.deleteMembership(resource.teamId, resource.id);\n }\n break;\n case 'team':\n await this.teams.delete(resource.id);\n break;\n case 'message':\n // Messages typically can't be deleted after being sent\n // Skip cleanup for message type\n deleted.push(`${resource.type}:${resource.id} (skipped - messages cannot be deleted)`);\n continue;\n case 'user':\n // Delete user last\n break;\n }\n deleted.push(`${resource.type}:${resource.id}`);\n } catch (error) {\n failed.push(`${resource.type}:${resource.id}`);\n console.warn(`Failed to delete ${resource.type} ${resource.id}:`, error);\n }\n }\n\n // Delete user last\n if (context.userId) {\n try {\n await this.users.delete(context.userId);\n deleted.push(`user:${context.userId}`);\n } catch (error) {\n failed.push(`user:${context.userId}`);\n console.warn(`Failed to delete user ${context.userId}:`, error);\n }\n }\n\n // Persist failed cleanup if there are failures\n if (failed.length > 0 && sessionId) {\n const failedResources = context.resources.filter(r =>\n failed.some(f => f.includes(r.id))\n );\n\n await saveFailedCleanup({\n sessionId,\n timestamp: new Date().toISOString(),\n resources: failedResources.map(r => ({\n type: r.type,\n id: r.id,\n databaseId: r.databaseId,\n tableId: r.tableId,\n bucketId: r.bucketId,\n teamId: r.teamId,\n })),\n providerConfig: {\n provider: 'appwrite',\n endpoint: this.config.endpoint,\n projectId: this.config.projectId,\n },\n errors: failed,\n }, cwd);\n }\n\n return { success: failed.length === 0, deleted, failed };\n }\n}\n\nexport function createTestContext(): TestContext {\n return {\n resources: [],\n variables: new Map(),\n };\n}\n","export interface TrackedResource {\n type: 'row' | 'file' | 'user' | 'team' | 'membership' | 'message';\n id: string;\n [key: string]: unknown;\n // For rows\n databaseId?: string;\n tableId?: string;\n // For files\n bucketId?: string;\n // For teams/memberships\n teamId?: string;\n createdAt: string;\n deleted?: boolean; // Mark as deleted if we see a DELETE request\n}\n\nexport interface TestContext {\n userId?: string;\n userEmail?: string;\n resources: TrackedResource[];\n variables: Map<string, string>;\n}\n\nexport interface AppwriteCleanupConfig {\n endpoint: string;\n projectId: string;\n apiKey: string;\n cleanup: boolean;\n cleanupOnFailure?: boolean;\n}\n\n// Network interception patterns for resource creation (POST)\nexport const APPWRITE_PATTERNS = {\n userCreate: /\\/v1\\/account$/,\n rowCreate: /\\/v1\\/tablesdb\\/([\\w-]+)\\/tables\\/([\\w-]+)\\/rows$/,\n fileCreate: /\\/v1\\/storage\\/buckets\\/([\\w-]+)\\/files$/,\n teamCreate: /\\/v1\\/teams$/,\n membershipCreate: /\\/v1\\/teams\\/([\\w-]+)\\/memberships$/,\n messageCreate: /\\/v1\\/messaging\\/messages$/,\n};\n\n// Network interception patterns for resource updates (PUT/PATCH)\nexport const APPWRITE_UPDATE_PATTERNS = {\n rowUpdate: /\\/v1\\/tablesdb\\/([\\w-]+)\\/tables\\/([\\w-]+)\\/rows\\/([\\w-]+)$/,\n fileUpdate: /\\/v1\\/storage\\/buckets\\/([\\w-]+)\\/files\\/([\\w-]+)$/,\n teamUpdate: /\\/v1\\/teams\\/([\\w-]+)$/,\n};\n\n// Network interception patterns for resource deletions (DELETE)\nexport const APPWRITE_DELETE_PATTERNS = {\n rowDelete: /\\/v1\\/tablesdb\\/([\\w-]+)\\/tables\\/([\\w-]+)\\/rows\\/([\\w-]+)$/,\n fileDelete: /\\/v1\\/storage\\/buckets\\/([\\w-]+)\\/files\\/([\\w-]+)$/,\n teamDelete: /\\/v1\\/teams\\/([\\w-]+)$/,\n membershipDelete: /\\/v1\\/teams\\/([\\w-]+)\\/memberships\\/([\\w-]+)$/,\n};\n","/**\n * Performance-optimized browser launch options\n * These settings help with slow page loads and work well in both local and CI/Docker environments\n */\n\nexport type BrowserName = 'chromium' | 'firefox' | 'webkit';\n\n/**\n * Viewport sizes matching Tailwind breakpoints for responsive testing.\n */\nexport type ViewportSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport const VIEWPORT_SIZES: Record<ViewportSize, { width: number; height: number }> = {\n xs: { width: 320, height: 568 }, // Mobile portrait\n sm: { width: 640, height: 800 }, // Small tablet\n md: { width: 768, height: 1024 }, // Tablet\n lg: { width: 1024, height: 768 }, // Desktop\n xl: { width: 1280, height: 720 }, // Large desktop\n};\n\n/**\n * Parse a viewport size string into width and height dimensions.\n * Accepts either a named size ('xs', 'sm', 'md', 'lg', 'xl') or a custom\n * dimension string like '1280x800' or '1920x1080'.\n *\n * @param size - The viewport size string to parse\n * @returns The parsed dimensions, or null if invalid\n */\nexport function parseViewportSize(size: string): { width: number; height: number } | null {\n // Check if it's a named size\n if (size in VIEWPORT_SIZES) {\n return VIEWPORT_SIZES[size as ViewportSize];\n }\n\n // Try to parse as WxH format (e.g., '1280x800', '1920x1080')\n const match = size.match(/^(\\d+)x(\\d+)$/);\n if (match) {\n const width = parseInt(match[1], 10);\n const height = parseInt(match[2], 10);\n if (width > 0 && height > 0) {\n return { width, height };\n }\n }\n\n return null;\n}\n\n/**\n * Browser-specific timing configuration for wait strategies.\n * Different browsers have varying network idle detection behavior.\n */\nexport interface BrowserTimingConfig {\n networkIdleTimeout: number;\n screenshotNetworkIdleTimeout: number;\n}\n\n/**\n * Get browser-specific timing configuration.\n * Firefox needs longer timeouts as its network idle detection can be inconsistent.\n */\nexport function getBrowserTimingConfig(browser: BrowserName): BrowserTimingConfig {\n switch (browser) {\n case 'firefox':\n return {\n networkIdleTimeout: 15000, // 50% longer for Firefox\n screenshotNetworkIdleTimeout: 8000,\n };\n case 'webkit':\n return {\n networkIdleTimeout: 12000,\n screenshotNetworkIdleTimeout: 6000,\n };\n default: // chromium\n return {\n networkIdleTimeout: 10000,\n screenshotNetworkIdleTimeout: 5000,\n };\n }\n}\n\nexport interface BrowserLaunchOptions {\n headless: boolean;\n browser?: BrowserName;\n}\n\n/**\n * Get optimized launch options for Playwright browsers\n * Returns browser-specific options to avoid compatibility issues\n */\nexport function getBrowserLaunchOptions(options: BrowserLaunchOptions) {\n const { headless, browser } = options;\n\n // Chromium-specific flags (not supported by Firefox/WebKit)\n if (browser === 'chromium' || !browser) {\n return {\n headless,\n args: [\n // Use Chrome's new headless mode which behaves more like regular browser\n ...(headless ? ['--headless=new'] : []),\n\n // For Docker/CI environments - disables sandboxing (required for root/container)\n '--no-sandbox',\n\n // Shared memory - critical for Docker/CI, harmless locally\n '--disable-dev-shm-usage',\n\n // GPU acceleration - not needed in headless mode\n '--disable-gpu',\n\n // Set explicit window size (fallback for viewport)\n '--window-size=1920,1080',\n\n // Reduce overhead\n '--disable-extensions',\n\n // Prevent JavaScript throttling (helps with slow page loads)\n '--disable-background-timer-throttling',\n '--disable-backgrounding-occluded-windows',\n '--disable-renderer-backgrounding',\n\n // Process isolation - reduces overhead for testing\n '--disable-features=IsolateOrigins,site-per-process',\n\n // Networking tweaks\n '--disable-features=VizDisplayCompositor',\n '--disable-blink-features=AutomationControlled',\n ],\n };\n }\n\n // Firefox-specific optimizations (via firefoxUserPrefs)\n if (browser === 'firefox') {\n return {\n headless,\n // Enable WebDriver BiDi for faster bidirectional communication (experimental)\n env: {\n MOZ_WEBDRIVER_BIDI: '1',\n },\n firefoxUserPrefs: {\n // Enable JIT (disabled in automation mode by default, causes 2-4x JS slowdown)\n 'javascript.options.jit': true,\n // Disable fission for stability/speed\n 'fission.autostart': false,\n // Disable hardware acceleration overhead in headless\n 'layers.acceleration.disabled': true,\n 'gfx.webrender.all': false,\n\n // Disable speculative network activity that interferes with networkidle detection\n // These are prefetch/preconnect features, NOT actual workers or app functionality\n 'network.http.speculative-parallel-limit': 0, // Disable speculative connections\n 'network.predictor.enabled': false, // Disable network predictor\n 'network.prefetch-next': false, // Disable link prefetching\n 'network.dns.disablePrefetch': true, // Disable DNS prefetch\n },\n };\n }\n\n // WebKit/Safari - minimal options (no Chrome flags supported)\n return { headless };\n}\n","/**\n * Compile a YAML-friendly pattern into a JS predicate.\n *\n * - Pattern wrapped in `/.../` → `RegExp.test` (the slashes are stripped before construction).\n * - Otherwise, depending on mode:\n * - `'url'`: glob — `**` matches any number of segments (including `/`),\n * `*` matches any chars except `/`. All other regex metachars are escaped.\n * The compiled regex is anchored at both ends (`^...$`).\n * - `'substr'`: plain substring (`String.includes`).\n *\n * Used by the `expectResponse` and `assertCookies` actions to match URL and\n * header/value patterns from YAML.\n */\nexport function compileMatcher(pattern: string, mode: 'url' | 'substr'): (s: string) => boolean {\n if (pattern.length >= 2 && pattern.startsWith('/') && pattern.endsWith('/')) {\n const re = new RegExp(pattern.slice(1, -1));\n return (s) => re.test(s);\n }\n if (mode === 'url') {\n // Escape regex metachars EXCEPT * (we'll handle that next).\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&');\n // ** → any chars (greedy), * → any non-slash chars. Use a sentinel to avoid double-replacement.\n const globbed = escaped\n .replace(/\\*\\*/g, ' ')\n .replace(/\\*/g, '[^/]*')\n .replace(/ /g, '.*');\n const re = new RegExp(`^${globbed}$`);\n return (s) => re.test(s);\n }\n return (s) => s.includes(pattern);\n}\n","import type { Page } from 'playwright';\n\n/**\n * A single buffered response observation.\n * Header names are lower-cased on capture.\n */\nexport interface LoggedResponse {\n url: string;\n status: number;\n headers: Record<string, string>;\n ts: number;\n}\n\n/** Maximum entries kept in the ring buffer. Older entries are dropped first. */\nexport const RESPONSE_LOG_MAX_ENTRIES = 200;\n\n/**\n * Bounded ring buffer of recent network responses for the page.\n * Used by the `expectResponse` action to look back at what fired since a marker timestamp.\n *\n * Public surface:\n * - `attach(page)`: subscribes to `page.on('response')`.\n * - `push(entry)`: append directly (used by unit tests).\n * - `snapshot()`: read-only view of current buffer contents (newest at the end).\n */\nexport class ResponseLog {\n private readonly buf: LoggedResponse[] = [];\n private readonly cap: number;\n\n constructor(cap: number = RESPONSE_LOG_MAX_ENTRIES) {\n this.cap = cap;\n }\n\n attach(page: Page): void {\n page.on('response', (res) => {\n void res\n .allHeaders()\n .then((headers) => {\n // Defensively lower-case header names.\n const lowered: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n lowered[k.toLowerCase()] = v;\n }\n this.push({\n url: res.url(),\n status: res.status(),\n headers: lowered,\n ts: Date.now(),\n });\n })\n .catch(() => {\n /* page may have closed mid-response; ignore */\n });\n });\n }\n\n push(entry: LoggedResponse): void {\n if (this.buf.length >= this.cap) this.buf.shift();\n this.buf.push(entry);\n }\n\n snapshot(): readonly LoggedResponse[] {\n return this.buf;\n }\n}\n","/**\n * Spec-compliant CSS.escape polyfill for Node.\n * Implements CSS-OM Living Standard §6.5 (CSS.escape).\n *\n * Node does not expose the DOM `CSS` global, so any `CSS.escape(...)` call\n * in Node-side code throws `ReferenceError: CSS is not defined`. This module\n * replaces those calls.\n */\nexport function cssEscape(value: string): string {\n const s = String(value);\n const length = s.length;\n let result = '';\n let firstCharCode = 0;\n\n for (let i = 0; i < length; i++) {\n const c = s.charCodeAt(i);\n\n if (c === 0x0000) {\n result += '�';\n continue;\n }\n\n if (\n (c >= 0x0001 && c <= 0x001f) ||\n c === 0x007f ||\n (i === 0 && c >= 0x0030 && c <= 0x0039) ||\n (i === 1 && c >= 0x0030 && c <= 0x0039 && firstCharCode === 0x002d)\n ) {\n result += '\\\\' + c.toString(16) + ' ';\n if (i === 0) firstCharCode = c;\n continue;\n }\n\n if (i === 0 && length === 1 && c === 0x002d) {\n result += '\\\\' + s.charAt(i);\n continue;\n }\n\n if (\n c >= 0x0080 ||\n c === 0x002d ||\n c === 0x005f ||\n (c >= 0x0030 && c <= 0x0039) ||\n (c >= 0x0041 && c <= 0x005a) ||\n (c >= 0x0061 && c <= 0x007a)\n ) {\n result += s.charAt(i);\n if (i === 0) firstCharCode = c;\n continue;\n }\n\n result += '\\\\' + s.charAt(i);\n if (i === 0) firstCharCode = c;\n }\n\n return result;\n}\n","import fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { interpolateVariables } from '../../core/interpolation';\n\n/**\n * Inline synthetic file entry as it appears in a test YAML (after Zod parse).\n * One of `content` or `base64` is set; the validator guarantees XOR.\n */\nexport interface UploadInlineFile {\n name: string;\n mimeType?: string;\n content?: string;\n base64?: string;\n}\n\nexport type UploadFileEntry = string | UploadInlineFile;\n\n/** Resolved entry ready to feed Playwright's `setInputFiles` (or `FileChooser.setFiles`). */\nexport type ResolvedUploadFile =\n | { kind: 'path'; path: string; tempDir?: string }\n | { kind: 'inline'; name: string; mimeType: string; buffer: Buffer };\n\nexport interface ResolveContext {\n /** Absolute path to the test YAML file. Used to anchor relative `files` entries. */\n testFilePath?: string;\n /** Test-level variable bag for `${VAR}` interpolation. */\n variables: Map<string, string>;\n}\n\nconst MIME_BY_EXTENSION: Record<string, string> = {\n '.pdf': 'application/pdf',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.txt': 'text/plain',\n '.csv': 'text/csv',\n '.json': 'application/json',\n '.xml': 'application/xml',\n '.html': 'text/html',\n '.zip': 'application/zip',\n '.tar': 'application/x-tar',\n '.gz': 'application/gzip',\n '.mp3': 'audio/mpeg',\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n};\n\nfunction mimeFromName(name: string): string {\n const ext = path.extname(name).toLowerCase();\n return MIME_BY_EXTENSION[ext] ?? 'application/octet-stream';\n}\n\nfunction deriveFilenameFromUrl(url: string): string {\n try {\n const parsed = new URL(url);\n const last = parsed.pathname.split('/').filter(Boolean).pop();\n if (last && last.length > 0) return decodeURIComponent(last);\n } catch {\n // fall through\n }\n return 'download.bin';\n}\n\nasync function downloadUrl(url: string): Promise<{ path: string; tempDir: string }> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`upload: failed to download ${url} (HTTP ${response.status} ${response.statusText})`);\n }\n const arrayBuffer = await response.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n\n const name = deriveFilenameFromUrl(url);\n const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'intellitester-upload-'));\n const tempPath = path.join(tempDir, name);\n await fs.writeFile(tempPath, buffer);\n return { path: tempPath, tempDir };\n}\n\nasync function resolveOne(\n entry: UploadFileEntry,\n context: ResolveContext,\n): Promise<ResolvedUploadFile> {\n if (typeof entry === 'string') {\n const interpolated = interpolateVariables(entry, context.variables);\n if (/^https?:\\/\\//i.test(interpolated)) {\n const downloaded = await downloadUrl(interpolated);\n return { kind: 'path', path: downloaded.path, tempDir: downloaded.tempDir };\n }\n\n const absolute = path.isAbsolute(interpolated)\n ? interpolated\n : path.resolve(\n context.testFilePath ? path.dirname(context.testFilePath) : process.cwd(),\n interpolated,\n );\n\n try {\n await fs.access(absolute);\n } catch {\n throw new Error(`upload: file not found at ${absolute} (from \"${interpolated}\")`);\n }\n return { kind: 'path', path: absolute };\n }\n\n // Inline synthetic file. Zod guarantees exactly one of content/base64.\n const name = interpolateVariables(entry.name, context.variables);\n const mimeType = entry.mimeType ?? mimeFromName(name);\n let buffer: Buffer;\n if (entry.base64 !== undefined) {\n const interpolated = interpolateVariables(entry.base64, context.variables);\n buffer = Buffer.from(interpolated, 'base64');\n } else {\n const interpolated = interpolateVariables(entry.content ?? '', context.variables);\n buffer = Buffer.from(interpolated, 'utf-8');\n }\n return { kind: 'inline', name, mimeType, buffer };\n}\n\n/**\n * Resolve every entry in the test YAML's `files` field to a value Playwright\n * can consume. URL entries are downloaded to a temp directory; the caller is\n * responsible for calling `cleanupResolvedFiles` once the upload is done.\n */\nexport async function resolveUploadFiles(\n files: UploadFileEntry | UploadFileEntry[],\n context: ResolveContext,\n): Promise<ResolvedUploadFile[]> {\n const entries = Array.isArray(files) ? files : [files];\n const resolved: ResolvedUploadFile[] = [];\n try {\n for (const entry of entries) {\n resolved.push(await resolveOne(entry, context));\n }\n return resolved;\n } catch (e) {\n // Best-effort cleanup of anything that landed in tmp before the failure.\n await cleanupResolvedFiles(resolved).catch(() => undefined);\n throw e;\n }\n}\n\n/** Shape Playwright accepts for `setInputFiles` / `FileChooser.setFiles`. */\nexport interface PlaywrightFilePayload {\n name: string;\n mimeType: string;\n buffer: Buffer;\n}\n\n/**\n * Convert resolved files to Playwright's uniform `FilePayload[]` shape. Reads\n * any path-kind entries off disk so the resulting array is homogeneous (mixed\n * `string | FilePayload` arrays are not accepted by `setInputFiles`).\n */\nexport async function toPlaywrightFiles(\n resolved: ResolvedUploadFile[],\n): Promise<PlaywrightFilePayload[]> {\n return Promise.all(\n resolved.map(async (r) => {\n if (r.kind === 'inline') {\n return { name: r.name, mimeType: r.mimeType, buffer: r.buffer };\n }\n const buffer = await fs.readFile(r.path);\n return {\n name: path.basename(r.path),\n mimeType: mimeFromName(r.path),\n buffer,\n };\n }),\n );\n}\n\n/** Remove temp directories created by URL downloads. Real-disk paths are left alone. */\nexport async function cleanupResolvedFiles(resolved: ResolvedUploadFile[]): Promise<void> {\n const tempDirs = new Set<string>();\n for (const r of resolved) {\n if (r.kind === 'path' && r.tempDir) tempDirs.add(r.tempDir);\n }\n for (const dir of tempDirs) {\n await fs.rm(dir, { recursive: true, force: true }).catch(() => undefined);\n }\n}\n","import { ChatMessage, Workflow } from 'blazen';\nimport type { Context, JsToolDef } from 'blazen';\nimport { z } from 'zod';\nimport type { Action, Locator } from '../core/types';\nimport type { AIConfig } from './types';\nimport { buildModel, buildCompletionOptions } from './provider';\n\nexport interface ErrorSuggestion {\n hasSuggestion: boolean;\n suggestedSelector?: {\n testId?: string;\n text?: string;\n css?: string;\n role?: string;\n name?: string;\n };\n explanation: string;\n}\n\nconst SuggestionToolArgs = z.object({\n hasSuggestion: z.boolean(),\n suggestedSelector: z\n .object({\n testId: z.string().optional(),\n text: z.string().optional(),\n css: z.string().optional(),\n role: z.string().optional(),\n name: z.string().optional(),\n })\n .optional(),\n explanation: z.string(),\n});\n\nfunction formatLocator(locator: Locator): string {\n const parts: string[] = [];\n if (locator.testId) parts.push(`testId: \"${locator.testId}\"`);\n if (locator.text) parts.push(`text: \"${locator.text}\"`);\n if (locator.css) parts.push(`css: \"${locator.css}\"`);\n if (locator.xpath) parts.push(`xpath: \"${locator.xpath}\"`);\n if (locator.role) parts.push(`role: \"${locator.role}\"`);\n if (locator.name) parts.push(`name: \"${locator.name}\"`);\n if (locator.description) parts.push(`description: \"${locator.description}\"`);\n return parts.join(', ');\n}\n\nfunction formatAction(action: Action): string {\n switch (action.type) {\n case 'tap':\n return `tap on element (${formatLocator(action.target)})`;\n case 'input':\n return `input into element (${formatLocator(action.target)})`;\n case 'assert':\n return `assert element exists (${formatLocator(action.target)})`;\n case 'wait':\n return action.target\n ? `wait for element (${formatLocator(action.target)})`\n : `wait ${action.timeout}ms`;\n case 'scroll':\n return action.target\n ? `scroll to element (${formatLocator(action.target)})`\n : `scroll ${action.direction || 'down'}`;\n case 'evaluate': {\n const evaluateAction = action as Extract<Action, { type: 'evaluate' }>;\n return `evaluate page state (expected: ${\n Array.isArray(evaluateAction.expected)\n ? evaluateAction.expected.join(', ')\n : evaluateAction.expected\n })`;\n }\n default:\n return action.type;\n }\n}\n\nconst SUBMIT_SUGGESTION_TOOL: JsToolDef = {\n name: 'submit_suggestion',\n description:\n 'Submit your analysis of the failed web action and suggested better selector. Always call this exactly once.',\n parameters: {\n type: 'object',\n properties: {\n hasSuggestion: {\n type: 'boolean',\n description: 'Whether a better selector can be suggested.',\n },\n suggestedSelector: {\n type: 'object',\n description: 'The replacement selector. Provide at least one field.',\n properties: {\n testId: { type: 'string' },\n text: { type: 'string' },\n css: { type: 'string' },\n role: { type: 'string' },\n name: { type: 'string' },\n },\n },\n explanation: {\n type: 'string',\n description: 'Why this selector is better than the failing one.',\n },\n },\n required: ['hasSuggestion', 'explanation'],\n },\n};\n\nexport async function getAISuggestion(\n error: string,\n action: Action,\n pageContent: string,\n screenshot?: Buffer,\n aiConfig?: AIConfig,\n): Promise<ErrorSuggestion> {\n if (!aiConfig) {\n return {\n hasSuggestion: false,\n explanation: 'AI configuration not provided. Cannot generate suggestions.',\n };\n }\n\n const model = buildModel(aiConfig);\n const options = buildCompletionOptions(aiConfig);\n\n const systemPrompt = `You are an expert at analyzing web automation errors and suggesting better element selectors.\n\nPrefer selectors in this order:\n1. testId (most reliable)\n2. text (good for user-facing elements)\n3. role with name (semantic and accessible)\n4. css (last resort, but can be precise)\n\nDo not suggest xpath unless absolutely necessary. Always submit your final answer by calling the submit_suggestion tool exactly once.`;\n\n const userPrompt = `Action failed: ${formatAction(action)}\n\nError message:\n${error}\n\nPage content (truncated to 10000 chars):\n${pageContent.slice(0, 10000)}\n\n${screenshot ? '[Screenshot attached but not analyzed in this implementation]' : ''}\n\nAnalyze the error and submit a better selector via the submit_suggestion tool. Focus on what went wrong, what would be more reliable, and why.`;\n\n const wf = new Workflow('ai-error-suggestion');\n\n wf.addStep('ask', ['blazen::StartEvent'], async (_event: Record<string, unknown>, _ctx: Context) => {\n try {\n const response = await model.completeWithOptions(\n [ChatMessage.system(systemPrompt), ChatMessage.user(userPrompt)],\n { ...options, tools: [SUBMIT_SUGGESTION_TOOL] },\n );\n\n const call = response.toolCalls?.[0];\n if (!call || call.name !== 'submit_suggestion') {\n return {\n type: 'blazen::StopEvent',\n result: {\n hasSuggestion: false,\n explanation: 'AI did not submit a structured suggestion.',\n } satisfies ErrorSuggestion,\n };\n }\n\n const parsed = SuggestionToolArgs.safeParse(call.arguments);\n if (!parsed.success) {\n return {\n type: 'blazen::StopEvent',\n result: {\n hasSuggestion: false,\n explanation: `AI suggestion did not match expected schema: ${parsed.error.message}`,\n } satisfies ErrorSuggestion,\n };\n }\n return { type: 'blazen::StopEvent', result: parsed.data satisfies ErrorSuggestion };\n } catch (err) {\n return {\n type: 'blazen::StopEvent',\n result: {\n hasSuggestion: false,\n explanation: `Failed to generate AI suggestion: ${err instanceof Error ? err.message : String(err)}`,\n } satisfies ErrorSuggestion,\n };\n }\n });\n\n const result = await wf.run({});\n return result.data as ErrorSuggestion;\n}\n","import { CompletionModel } from 'blazen';\nimport type {\n JsAzureOptions,\n JsBedrockOptions,\n JsCompletionOptions,\n JsFalOptions,\n JsOpenAiCompatConfig,\n JsProviderOptions,\n} from 'blazen';\nimport type { AIConfig, AIProvider } from './types';\n\nconst DEFAULT_OLLAMA_HOST = 'localhost';\nconst DEFAULT_OLLAMA_PORT = 11434;\nconst DEFAULT_OLLAMA_BASE_URL = 'http://localhost:11434/v1';\nconst DEFAULT_LM_STUDIO_HOST = 'localhost';\nconst DEFAULT_LM_STUDIO_PORT = 1234;\n\nfunction resolveEnvVars(value: string): string {\n return value.replace(/\\$\\{(\\w+)\\}/g, (_, name) => process.env[name] || '');\n}\n\nfunction resolveEnvInValue(value: unknown): unknown {\n if (typeof value === 'string') return resolveEnvVars(value);\n if (Array.isArray(value)) return value.map(resolveEnvInValue);\n if (value && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = resolveEnvInValue(v);\n }\n return out;\n }\n return value;\n}\n\nfunction resolveProviderOptions(\n options: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n if (!options) return {};\n return resolveEnvInValue(options) as Record<string, unknown>;\n}\n\nfunction requireString(\n options: Record<string, unknown>,\n key: string,\n provider: AIProvider,\n): string {\n const v = options[key];\n if (typeof v !== 'string' || v.length === 0) {\n throw new Error(\n `provider \"${provider}\" requires providerOptions.${key} (string)`,\n );\n }\n return v;\n}\n\nfunction optionalNumber(\n options: Record<string, unknown>,\n key: string,\n fallback: number,\n): number {\n const v = options[key];\n if (typeof v === 'number' && Number.isFinite(v)) return v;\n return fallback;\n}\n\nconst STANDARD_PROVIDERS = {\n anthropic: CompletionModel.anthropic,\n openai: CompletionModel.openai,\n gemini: CompletionModel.gemini,\n openrouter: CompletionModel.openrouter,\n groq: CompletionModel.groq,\n together: CompletionModel.together,\n mistral: CompletionModel.mistral,\n deepseek: CompletionModel.deepseek,\n fireworks: CompletionModel.fireworks,\n perplexity: CompletionModel.perplexity,\n xai: CompletionModel.xai,\n cohere: CompletionModel.cohere,\n} as const satisfies Record<\n string,\n (options?: JsProviderOptions | null) => CompletionModel\n>;\n\ntype StandardProvider = keyof typeof STANDARD_PROVIDERS;\n\nfunction isStandardProvider(provider: AIProvider): provider is StandardProvider {\n return provider in STANDARD_PROVIDERS;\n}\n\nexport function buildModel(config: AIConfig): CompletionModel {\n const apiKey = config.apiKey ? resolveEnvVars(config.apiKey) : undefined;\n const { provider, model, baseUrl } = config;\n const providerOptions = resolveProviderOptions(config.providerOptions);\n\n if (isStandardProvider(provider)) {\n const options: JsProviderOptions = {\n ...(providerOptions as JsProviderOptions),\n ...(apiKey !== undefined ? { apiKey } : {}),\n ...(model ? { model } : {}),\n ...(baseUrl ? { baseUrl } : {}),\n };\n return STANDARD_PROVIDERS[provider](options);\n }\n\n switch (provider) {\n case 'ollama': {\n // Preserve historical openai-compat behaviour for configs that don't\n // explicitly opt into native host/port options. Existing configs that\n // set only baseUrl (or nothing at all) keep working unchanged.\n const hasNativeOpts = 'host' in providerOptions || 'port' in providerOptions;\n if (!hasNativeOpts) {\n return CompletionModel.openai({\n apiKey: apiKey ?? 'ollama',\n baseUrl: baseUrl ?? DEFAULT_OLLAMA_BASE_URL,\n model,\n });\n }\n const host = (providerOptions.host as string | undefined) ?? DEFAULT_OLLAMA_HOST;\n const port = optionalNumber(providerOptions, 'port', DEFAULT_OLLAMA_PORT);\n return CompletionModel.ollama(host, port, model);\n }\n case 'lmStudio': {\n const host = (providerOptions.host as string | undefined) ?? DEFAULT_LM_STUDIO_HOST;\n const port = optionalNumber(providerOptions, 'port', DEFAULT_LM_STUDIO_PORT);\n return CompletionModel.lmStudio(host, port, model);\n }\n case 'azure': {\n const azureOptions: JsAzureOptions = {\n ...(providerOptions as Partial<JsAzureOptions>),\n resourceName: requireString(providerOptions, 'resourceName', 'azure'),\n deploymentName: requireString(providerOptions, 'deploymentName', 'azure'),\n ...(apiKey !== undefined ? { apiKey } : {}),\n ...(model ? { model } : {}),\n ...(baseUrl ? { baseUrl } : {}),\n };\n return CompletionModel.azure(azureOptions);\n }\n case 'bedrock': {\n const bedrockOptions: JsBedrockOptions = {\n ...(providerOptions as Partial<JsBedrockOptions>),\n region: requireString(providerOptions, 'region', 'bedrock'),\n ...(apiKey !== undefined ? { apiKey } : {}),\n ...(model ? { model } : {}),\n ...(baseUrl ? { baseUrl } : {}),\n };\n return CompletionModel.bedrock(bedrockOptions);\n }\n case 'fal': {\n const falOptions: JsFalOptions = {\n ...(providerOptions as Partial<JsFalOptions>),\n ...(apiKey !== undefined ? { apiKey } : {}),\n ...(model ? { model } : {}),\n ...(baseUrl ? { baseUrl } : {}),\n };\n return CompletionModel.fal(falOptions);\n }\n case 'openaiCompat': {\n const providerId =\n typeof providerOptions.providerId === 'string'\n ? (providerOptions.providerId as string)\n : 'custom';\n const compatConfig: JsOpenAiCompatConfig = {\n ...(providerOptions as Partial<JsOpenAiCompatConfig>),\n providerName: requireString(providerOptions, 'providerName', 'openaiCompat'),\n baseUrl: baseUrl ?? requireString(providerOptions, 'baseUrl', 'openaiCompat'),\n apiKey: apiKey ?? requireString(providerOptions, 'apiKey', 'openaiCompat'),\n defaultModel:\n model ||\n (typeof providerOptions.defaultModel === 'string'\n ? (providerOptions.defaultModel as string)\n : (() => {\n throw new Error(\n 'provider \"openaiCompat\" requires either a top-level model or providerOptions.defaultModel',\n );\n })()),\n };\n return CompletionModel.openaiCompat(providerId, compatConfig);\n }\n }\n}\n\nexport function buildCompletionOptions(config: AIConfig): JsCompletionOptions {\n return {\n temperature: config.temperature,\n maxTokens: config.maxTokens,\n model: config.model,\n };\n}\n","import { ChatMessage, Workflow, runAgent } from 'blazen';\nimport type { Context, JsToolDef } from 'blazen';\nimport type { Page } from 'playwright';\nimport type { Action, Locator } from '../core/types';\nimport type { AIConfig } from './types';\nimport { buildModel, buildCompletionOptions } from './provider';\nimport { cssEscape } from '../executors/web/cssEscape';\n\nexport interface HealingContext {\n page: Page;\n action: Action;\n error: string;\n pageContent: string;\n}\n\nexport interface HealingResult {\n success: boolean;\n fixedAction?: Action;\n attempts: number;\n explanation: string;\n}\n\ninterface SelectorCheckResult {\n found: boolean;\n count: number;\n texts?: string[];\n error?: string;\n}\n\nasync function checkSelector(page: Page, selector: string): Promise<SelectorCheckResult> {\n try {\n const count = await page.locator(selector).count();\n if (count === 0) return { found: false, count: 0 };\n const texts = await page.locator(selector).allTextContents();\n return { found: true, count, texts: texts.slice(0, 5) };\n } catch (e) {\n return { found: false, count: 0, error: String(e) };\n }\n}\n\nasync function checkByText(page: Page, text: string): Promise<SelectorCheckResult> {\n try {\n const locator = page.getByText(text, { exact: false });\n const count = await locator.count();\n if (count === 0) return { found: false, count: 0 };\n return { found: true, count };\n } catch (e) {\n return { found: false, count: 0, error: String(e) };\n }\n}\n\nasync function checkByRole(\n page: Page,\n role: string,\n name?: string,\n): Promise<SelectorCheckResult> {\n try {\n const locator = page.getByRole(\n role as Parameters<Page['getByRole']>[0],\n name ? { name } : undefined,\n );\n const count = await locator.count();\n if (count === 0) return { found: false, count: 0 };\n return { found: true, count };\n } catch (e) {\n return { found: false, count: 0, error: String(e) };\n }\n}\n\nasync function checkTestId(page: Page, testId: string): Promise<SelectorCheckResult> {\n try {\n const selector = `[data-testid=\"${testId}\"], #${cssEscape(testId)}`;\n const count = await page.locator(selector).count();\n return { found: count > 0, count };\n } catch (e) {\n return { found: false, count: 0, error: String(e) };\n }\n}\n\nasync function validateLocator(page: Page, locator: Locator): Promise<SelectorCheckResult> {\n if (locator.testId) return checkTestId(page, locator.testId);\n if (locator.text) return checkByText(page, locator.text);\n if (locator.css) return checkSelector(page, locator.css);\n if (locator.role) return checkByRole(page, locator.role, locator.name);\n return { found: false, count: 0, error: 'No selector field provided' };\n}\n\nconst SELECTOR_FIELDS = {\n type: 'object',\n description: 'Selector with at least one of testId / text / css / role provided.',\n properties: {\n testId: { type: 'string', description: 'data-testid attribute value (most reliable).' },\n text: { type: 'string', description: 'Visible text content to match.' },\n css: { type: 'string', description: 'CSS selector (last resort).' },\n role: { type: 'string', description: 'ARIA role.' },\n name: { type: 'string', description: 'Optional accessible name (used with role).' },\n },\n} as const;\n\nconst VALIDATE_SELECTOR_TOOL: JsToolDef = {\n name: 'validate_selector',\n description:\n 'Try a candidate selector against the live page and get back whether it finds an element.',\n parameters: SELECTOR_FIELDS,\n};\n\nconst FINALIZE_SELECTOR_TOOL: JsToolDef = {\n name: 'finalize_selector',\n description:\n 'Commit your final selector. The system validates it; if the selector finds an element the workflow succeeds, otherwise you may try again until iterations run out.',\n parameters: SELECTOR_FIELDS,\n};\n\nexport async function runHealingAgent(\n context: HealingContext,\n aiConfig: AIConfig,\n maxAttempts: number = 3,\n): Promise<HealingResult> {\n const model = buildModel(aiConfig);\n const completionOptions = buildCompletionOptions(aiConfig);\n\n const currentTarget = 'target' in context.action ? (context.action.target as Locator) : null;\n const initialValidation: string[] = [];\n if (currentTarget) {\n const res = await validateLocator(context.page, currentTarget);\n initialValidation.push(\n `Failing target ${JSON.stringify(currentTarget)}: ${\n res.found ? `found ${res.count} elements` : 'NOT FOUND'\n }${res.error ? ` (${res.error})` : ''}`,\n );\n }\n\n const systemPrompt = `You are debugging a failing web test action by finding a working element selector.\n\nPrefer selectors in this order:\n1. testId (most stable)\n2. text (good for buttons, links)\n3. role with name (semantic and accessible)\n4. css (last resort)\n\nUse the validate_selector tool to probe candidates against the live page. When you find one that works, call finalize_selector to commit. You have a limited budget of iterations.`;\n\n const userPrompt = `Action type: ${context.action.type}\nError: ${context.error}\n\nFailed selector: ${JSON.stringify(currentTarget)}\n\nInitial validation:\n${initialValidation.length > 0 ? initialValidation.join('\\n') : 'No current selector to validate'}\n\nPage HTML (first 6000 chars):\n${context.pageContent.slice(0, 6000)}\n\nFind a working selector for this action.`;\n\n const wf = new Workflow('ai-healing-agent');\n\n wf.addStep(\n 'heal',\n ['blazen::StartEvent'],\n async (_event: Record<string, unknown>, _ctx: Context) => {\n let chosen: Locator | null = null;\n let lastFailure: string | null = null;\n\n const agentResult = await runAgent(\n model,\n [ChatMessage.system(systemPrompt), ChatMessage.user(userPrompt)],\n [VALIDATE_SELECTOR_TOOL, FINALIZE_SELECTOR_TOOL],\n async (toolName: string, args: unknown) => {\n const locator = args as Locator;\n if (toolName === 'validate_selector') {\n const r = await validateLocator(context.page, locator);\n return r.found\n ? { found: true, count: r.count, sample: r.texts ?? [] }\n : { found: false, count: 0, error: r.error ?? 'No matching elements' };\n }\n if (toolName === 'finalize_selector') {\n const r = await validateLocator(context.page, locator);\n if (r.found) {\n chosen = locator;\n return { status: 'committed', count: r.count };\n }\n lastFailure = `Selector ${JSON.stringify(locator)} did not match any elements`;\n return { status: 'rejected', error: lastFailure };\n }\n return { error: `Unknown tool: ${toolName}` };\n },\n {\n maxIterations: maxAttempts,\n temperature: completionOptions.temperature,\n maxTokens: completionOptions.maxTokens,\n },\n );\n\n if (chosen) {\n const fixedAction = { ...context.action } as Action & { target: Locator };\n if ('target' in fixedAction) {\n fixedAction.target = chosen;\n }\n return {\n type: 'blazen::StopEvent',\n result: {\n success: true,\n fixedAction: fixedAction as Action,\n attempts: agentResult.iterations,\n explanation: `Found working selector: ${JSON.stringify(chosen)}`,\n } satisfies HealingResult,\n };\n }\n\n return {\n type: 'blazen::StopEvent',\n result: {\n success: false,\n attempts: agentResult.iterations,\n explanation:\n lastFailure ??\n `Could not find a working selector within ${maxAttempts} iterations`,\n } satisfies HealingResult,\n };\n },\n );\n\n const result = await wf.run({});\n return result.data as HealingResult;\n}\n","import { spawn, type ChildProcess } from 'child_process';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { rmSync, readFileSync, existsSync } from 'fs';\n\n/**\n * Per-process web server configuration entry.\n *\n * `webServer` in YAML can be either a single entry or an ordered array of these.\n * When given an array, the manager starts each entry sequentially -- waiting for\n * the previous one's `url` to respond before launching the next -- and shuts\n * them down in reverse order. This lets users express dependencies like \"start\n * the API before the frontend that proxies to it\".\n */\nexport interface WebServerConfig {\n /** Identifier used in logs and the marker file (defaults to server-1, server-2, ...). */\n name?: string;\n url: string;\n command?: string;\n auto?: boolean;\n static?: string;\n port?: number;\n workdir?: string;\n /** Deprecated: use workdir instead. */\n cwd?: string;\n reuseExistingServer?: boolean;\n timeout?: number;\n idleTimeout?: number;\n}\n\n/**\n * Either a single web server config (existing single-process behaviour) or an\n * ordered list of entries. Array order determines start order and the reverse\n * determines shutdown order.\n */\nexport type WebServerInput = WebServerConfig | WebServerConfig[];\n\n// ---------------------------------------------------------------------------\n// Marker file constants and helpers\n// ---------------------------------------------------------------------------\n\nconst INTELLITESTER_DIR = '.intellitester';\nconst SERVERS_MARKER_FILE = 'servers.json';\nconst LEGACY_SINGLE_MARKER_FILE = 'server.json';\n\ninterface ServerMarker {\n name: string;\n pid: number;\n port: number;\n url: string;\n cwd: string;\n command: string;\n startTime: string;\n}\n\ninterface ServersMarkerFile {\n entries: ServerMarker[];\n}\n\nconst getMarkerDir = (cwd: string): string => path.join(cwd, INTELLITESTER_DIR);\nconst getMarkerPath = (cwd: string): string => path.join(getMarkerDir(cwd), SERVERS_MARKER_FILE);\nconst getLegacyMarkerPath = (cwd: string): string =>\n path.join(getMarkerDir(cwd), LEGACY_SINGLE_MARKER_FILE);\n\nasync function readMarkers(cwd: string): Promise<ServersMarkerFile> {\n // New multi-entry format first.\n try {\n const content = await fs.readFile(getMarkerPath(cwd), 'utf-8');\n const parsed = JSON.parse(content) as Partial<ServersMarkerFile>;\n if (Array.isArray(parsed.entries)) {\n return { entries: parsed.entries as ServerMarker[] };\n }\n } catch {\n // fall through to legacy\n }\n // One-shot migration: legacy server.json was a single object.\n try {\n const content = await fs.readFile(getLegacyMarkerPath(cwd), 'utf-8');\n const legacy = JSON.parse(content) as Partial<ServerMarker>;\n if (legacy && typeof legacy.pid === 'number' && typeof legacy.url === 'string') {\n return {\n entries: [\n {\n name: 'server-1',\n pid: legacy.pid,\n port: legacy.port ?? 0,\n url: legacy.url,\n cwd: legacy.cwd ?? cwd,\n command: legacy.command ?? '',\n startTime: legacy.startTime ?? new Date().toISOString(),\n },\n ],\n };\n }\n } catch {\n // no legacy marker either\n }\n return { entries: [] };\n}\n\nasync function writeMarkers(cwd: string, markers: ServersMarkerFile): Promise<void> {\n await fs.mkdir(getMarkerDir(cwd), { recursive: true });\n await fs.writeFile(getMarkerPath(cwd), JSON.stringify(markers, null, 2), 'utf-8');\n}\n\nasync function upsertMarker(cwd: string, entry: ServerMarker): Promise<void> {\n const current = await readMarkers(cwd);\n const filtered = current.entries.filter((e) => e.url !== entry.url && e.name !== entry.name);\n filtered.push(entry);\n await writeMarkers(cwd, { entries: filtered });\n}\n\nasync function removeMarker(cwd: string, identifier: { name?: string; url?: string }): Promise<void> {\n try {\n const current = await readMarkers(cwd);\n const filtered = current.entries.filter(\n (e) =>\n (identifier.name === undefined || e.name !== identifier.name) &&\n (identifier.url === undefined || e.url !== identifier.url),\n );\n if (filtered.length === 0) {\n await fs.rm(getMarkerPath(cwd), { force: true });\n } else {\n await writeMarkers(cwd, { entries: filtered });\n }\n } catch {\n // Ignore -- the marker file may not exist.\n }\n}\n\nfunction removeMarkerSync(cwd: string, identifier: { name?: string; url?: string }): void {\n try {\n const markerPath = getMarkerPath(cwd);\n if (!existsSync(markerPath)) return;\n const parsed = JSON.parse(readFileSync(markerPath, 'utf-8')) as Partial<ServersMarkerFile>;\n if (!Array.isArray(parsed.entries)) return;\n const filtered = (parsed.entries as ServerMarker[]).filter(\n (e) =>\n (identifier.name === undefined || e.name !== identifier.name) &&\n (identifier.url === undefined || e.url !== identifier.url),\n );\n if (filtered.length === 0) {\n rmSync(markerPath, { force: true });\n } else {\n // Synchronous-write fallback for signal handlers.\n const tmp = JSON.stringify({ entries: filtered }, null, 2);\n // We deliberately use writeFileSync via fs.rm + readFileSync neighbours;\n // node's fs has writeFileSync but importing it adds noise -- inline path:\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n require('fs').writeFileSync(markerPath, tmp, 'utf-8');\n }\n } catch {\n // Ignore -- signal-handler context, best-effort.\n }\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function isServerRunning(url: string): Promise<boolean> {\n try {\n const response = await fetch(url, { method: 'HEAD' });\n return response.ok || response.status < 500;\n } catch {\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Auto-detect helpers (unchanged from previous version)\n// ---------------------------------------------------------------------------\n\nasync function readPackageJson(cwd: string): Promise<Record<string, unknown> | null> {\n try {\n const packagePath = path.join(cwd, 'package.json');\n const content = await fs.readFile(packagePath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\ntype FrameworkInfo = {\n name: string;\n buildCommand: string;\n devCommand: string;\n};\n\nfunction detectFramework(pkg: Record<string, unknown> | null): FrameworkInfo | null {\n if (!pkg) return null;\n const deps = {\n ...((pkg.dependencies as Record<string, string>) || {}),\n ...((pkg.devDependencies as Record<string, string>) || {}),\n };\n if (deps['next']) return { name: 'next', buildCommand: 'npx -y next start', devCommand: 'next dev' };\n if (deps['nuxt']) return { name: 'nuxt', buildCommand: 'node .output/server/index.mjs', devCommand: 'nuxi dev' };\n if (deps['astro']) return { name: 'astro', buildCommand: 'npx -y astro dev', devCommand: 'astro dev' };\n if (deps['@sveltejs/kit']) return { name: 'sveltekit', buildCommand: 'npx -y vite preview', devCommand: 'vite dev' };\n if (deps['@remix-run/serve'] || deps['@remix-run/dev']) {\n return { name: 'remix', buildCommand: 'npx -y remix-serve build/server/index.js', devCommand: 'remix vite:dev' };\n }\n if (deps['vite']) return { name: 'vite', buildCommand: 'npx -y vite preview', devCommand: 'vite dev' };\n if (deps['react-scripts']) return { name: 'cra', buildCommand: 'npx -y serve -s build', devCommand: 'react-scripts start' };\n return null;\n}\n\ntype PackageManager = 'deno' | 'bun' | 'pnpm' | 'yarn' | 'npm';\n\nasync function detectPackageManager(cwd: string): Promise<PackageManager> {\n const hasDenoLock = await fs.stat(path.join(cwd, 'deno.lock')).catch(() => null);\n const hasBunLockb = await fs.stat(path.join(cwd, 'bun.lockb')).catch(() => null);\n const hasBunLock = await fs.stat(path.join(cwd, 'bun.lock')).catch(() => null);\n const hasPnpmLock = await fs.stat(path.join(cwd, 'pnpm-lock.yaml')).catch(() => null);\n const hasYarnLock = await fs.stat(path.join(cwd, 'yarn.lock')).catch(() => null);\n if (hasDenoLock) return 'deno';\n if (hasBunLockb || hasBunLock) return 'bun';\n if (hasPnpmLock) return 'pnpm';\n if (hasYarnLock) return 'yarn';\n return 'npm';\n}\n\nfunction getDevCommand(pm: PackageManager, script: string): string {\n switch (pm) {\n case 'deno': return `deno task ${script}`;\n case 'bun': return `bun run ${script}`;\n case 'pnpm': return `pnpm ${script}`;\n case 'yarn': return `yarn ${script}`;\n case 'npm': return `npm run ${script}`;\n }\n}\n\nasync function detectBuildDirectory(cwd: string): Promise<string | null> {\n const commonDirs = ['.next', '.output', '.svelte-kit', 'dist', 'build', 'out'];\n for (const dir of commonDirs) {\n const fullPath = path.join(cwd, dir);\n try {\n const stat = await fs.stat(fullPath);\n if (stat.isDirectory()) return dir;\n } catch {\n // continue\n }\n }\n return null;\n}\n\nasync function detectServerCommand(cwd: string): Promise<string> {\n const pkg = await readPackageJson(cwd);\n const framework = detectFramework(pkg);\n const pm = await detectPackageManager(cwd);\n const buildDir = await detectBuildDirectory(cwd);\n if (buildDir) {\n if (framework) return framework.buildCommand;\n return `npx -y serve ${buildDir}`;\n }\n const scripts = pkg?.scripts as Record<string, string> | undefined;\n if (scripts?.dev) return getDevCommand(pm, 'dev');\n if (scripts?.start) return getDevCommand(pm, 'start');\n throw new Error('Could not auto-detect server command. Please specify command explicitly.');\n}\n\n// ---------------------------------------------------------------------------\n// Manager\n// ---------------------------------------------------------------------------\n\ninterface ManagedServer {\n name: string;\n /** null means we are reusing an externally-managed server (not ours to kill). */\n process: ChildProcess | null;\n url: string;\n cwd: string;\n startedAt: number;\n}\n\ntype ServerState = 'idle' | 'starting' | 'reusing' | 'running' | 'stopping' | 'killed';\n\nfunction log(name: string, state: ServerState, msg: string): void {\n console.log(`[webServer:${name}:${state}] ${msg}`);\n}\n\n/**\n * Normalises a `WebServerInput` (object or array) into a guaranteed-array form\n * with each entry given a stable name (synthesised from index when omitted).\n */\nexport function normalizeWebServerInput(config: WebServerInput): WebServerConfig[] {\n const list = Array.isArray(config) ? config : [config];\n return list.map((entry, i) => ({\n ...entry,\n name: entry.name ?? `server-${i + 1}`,\n }));\n}\n\n/**\n * Singleton manager for the lifecycle of one or more web server processes.\n *\n * Sequential start, reverse-order shutdown, per-entry readiness polling, and\n * per-entry marker entries in `.intellitester/servers.json` for cross-run reuse.\n */\nclass WebServerManager {\n private static instance: WebServerManager;\n\n /** Servers indexed by name. Iteration order matches insertion order; shutdown walks it in reverse. */\n private servers: Map<string, ManagedServer> = new Map();\n private stopping = false;\n\n private constructor() {}\n\n static getInstance(): WebServerManager {\n if (!WebServerManager.instance) {\n WebServerManager.instance = new WebServerManager();\n }\n return WebServerManager.instance;\n }\n\n isRunning(): boolean {\n if (this.servers.size === 0) return false;\n for (const s of this.servers.values()) {\n if (!s.process || s.process.killed) continue;\n return true;\n }\n // Any externally-reused entry also counts as \"running\" from the caller's POV.\n return [...this.servers.values()].some((s) => s.process === null);\n }\n\n /** URL of the LAST started server -- the convention is \"frontend last\" so this matches the test baseUrl. */\n getUrl(): string | null {\n let last: ManagedServer | null = null;\n for (const s of this.servers.values()) last = s;\n return last?.url ?? null;\n }\n\n getServer(name: string): ManagedServer | undefined {\n return this.servers.get(name);\n }\n\n /**\n * Start one or more web servers. Accepts either a single config (existing\n * single-process behaviour) or an array (multi-process). Array entries are\n * started sequentially; if any entry fails readiness, previously-started\n * entries are torn down in reverse before the error is rethrown.\n */\n async start(config: WebServerInput): Promise<ChildProcess | null> {\n // Wait for any in-progress stop.\n while (this.stopping) {\n await new Promise((r) => setTimeout(r, 100));\n }\n\n const entries = normalizeWebServerInput(config);\n let lastSpawned: ChildProcess | null = null;\n const startedThisCall: string[] = [];\n\n for (const entry of entries) {\n try {\n const proc = await this.startOne(entry);\n if (proc) lastSpawned = proc;\n startedThisCall.push(entry.name!);\n } catch (e) {\n log(entry.name!, 'idle', `failed to start: ${e instanceof Error ? e.message : String(e)}`);\n // Tear down anything we successfully started in this call, in reverse.\n for (const name of [...startedThisCall].reverse()) {\n await this.stopOne(name).catch(() => undefined);\n }\n throw e;\n }\n }\n return lastSpawned;\n }\n\n private async startOne(entry: WebServerConfig): Promise<ChildProcess | null> {\n const name = entry.name!;\n const url = entry.url;\n const cwd = entry.workdir ?? entry.cwd ?? process.cwd();\n const reuseExistingServer = entry.reuseExistingServer ?? true;\n const timeout = entry.timeout ?? 30000;\n const idleTimeout = entry.idleTimeout ?? 20000;\n\n // If we already own this server in-process at the same URL, reuse it.\n const existing = this.servers.get(name);\n if (existing && existing.url === url && (existing.process === null || !existing.process.killed)) {\n if (await isServerRunning(url)) {\n if (reuseExistingServer) {\n log(name, 'reusing', `in-process server at ${url}`);\n return existing.process;\n }\n await this.stopOne(name);\n } else {\n await this.stopOne(name);\n }\n }\n\n // Cross-run reuse via marker file.\n const markers = await readMarkers(cwd);\n const marker = markers.entries.find((m) => m.url === url || m.name === name);\n if (marker && reuseExistingServer) {\n if (isPidAlive(marker.pid) && (await isServerRunning(url))) {\n log(name, 'reusing', `previously-started server at ${url} (pid ${marker.pid})`);\n this.servers.set(name, { name, process: null, url, cwd, startedAt: Date.now() });\n return null;\n }\n // Marker is stale -- clean up the orphan.\n log(name, 'stopping', `stale marker for ${url}, cleaning up`);\n if (isPidAlive(marker.pid)) {\n try {\n process.kill(marker.pid, 'SIGTERM');\n await new Promise((r) => setTimeout(r, 1000));\n if (isPidAlive(marker.pid)) {\n process.kill(marker.pid, 'SIGKILL');\n await new Promise((r) => setTimeout(r, 500));\n }\n } catch {\n // process might already be dead\n }\n if (isPidAlive(marker.pid)) {\n throw new Error(\n `[webServer:${name}] orphan server pid ${marker.pid} still alive after SIGKILL; ` +\n `port ${new URL(url).port || ''} likely blocked. Kill it manually and retry.`,\n );\n }\n }\n await removeMarker(cwd, { name, url });\n }\n\n // Externally-running server we don't own?\n if (await isServerRunning(url)) {\n if (!reuseExistingServer) {\n throw new Error(`Port ${new URL(url).port} is already in use by another process`);\n }\n log(name, 'reusing', `external server at ${url}`);\n this.servers.set(name, { name, process: null, url, cwd, startedAt: Date.now() });\n return null;\n }\n\n // Determine the spawn command.\n let command: string;\n if (entry.command) {\n command = entry.command;\n } else if (entry.static) {\n const port = entry.port ?? new URL(url).port ?? '3000';\n command = `npx -y serve ${entry.static} -l ${port}`;\n } else if (entry.auto) {\n command = await detectServerCommand(cwd);\n } else {\n throw new Error('WebServerConfig requires command, auto: true, or static directory');\n }\n\n log(name, 'starting', `${command} (cwd: ${cwd})`);\n const child = spawn(command, {\n shell: true,\n stdio: 'pipe',\n cwd,\n detached: true,\n });\n this.servers.set(name, { name, process: child, url, cwd, startedAt: Date.now() });\n\n let stderrOutput = '';\n let lastOutputTime = Date.now();\n const prefix = `[server:${name}]`;\n child.stdout?.on('data', (data) => {\n lastOutputTime = Date.now();\n process.stdout.write(`${prefix} ${data}`);\n });\n child.stderr?.on('data', (data) => {\n lastOutputTime = Date.now();\n stderrOutput += data.toString();\n process.stderr.write(`${prefix} ${data}`);\n });\n\n // Clean up the marker entry if the subprocess dies on its own.\n child.on('exit', () => {\n const current = this.servers.get(name);\n if (current?.process === child) {\n removeMarkerSync(cwd, { name, url });\n }\n });\n\n // Wait for the server to be ready.\n await new Promise<void>((resolve, reject) => {\n let resolved = false;\n const startTime = Date.now();\n const cleanup = () => {\n resolved = true;\n clearInterval(pollInterval);\n };\n\n child.on('close', (code) => {\n if (!resolved && code !== 0 && code !== null) {\n cleanup();\n this.servers.delete(name);\n reject(new Error(`Server \"${name}\" exited with code ${code}\\n${stderrOutput}`));\n }\n });\n\n child.on('error', (err) => {\n if (!resolved) {\n cleanup();\n this.servers.delete(name);\n reject(err);\n }\n });\n\n const pollInterval = setInterval(async () => {\n if (resolved) return;\n if (await isServerRunning(url)) {\n cleanup();\n resolve();\n return;\n }\n if (Date.now() - startTime > timeout) {\n cleanup();\n reject(new Error(`Server \"${name}\" at ${url} not ready after ${timeout}ms`));\n return;\n }\n if (Date.now() - lastOutputTime > idleTimeout) {\n cleanup();\n child.kill('SIGTERM');\n this.servers.delete(name);\n const tail = stderrOutput.slice(-500);\n reject(new Error(`Server \"${name}\" stalled - no output for ${idleTimeout}ms. Last output:\\n${tail}`));\n return;\n }\n }, 500);\n });\n\n log(name, 'running', `ready at ${url}`);\n\n if (child.pid) {\n await upsertMarker(cwd, {\n name,\n pid: child.pid,\n port: parseInt(new URL(url).port || '80'),\n url,\n cwd,\n command,\n startTime: new Date().toISOString(),\n });\n }\n\n return child;\n }\n\n /**\n * Stop all managed servers in reverse insertion order. Frontend goes down\n * before API so the frontend doesn't spam errors during its own teardown.\n */\n async stop(): Promise<void> {\n if (this.servers.size === 0) return;\n this.stopping = true;\n try {\n const names = [...this.servers.keys()].reverse();\n for (const name of names) {\n await this.stopOne(name);\n }\n } finally {\n this.stopping = false;\n }\n }\n\n private async stopOne(name: string): Promise<void> {\n const server = this.servers.get(name);\n if (!server) return;\n const { process: child, cwd, url } = server;\n\n // Externally-reused server: just drop our handle, don't signal anything.\n if (!child) {\n this.servers.delete(name);\n return;\n }\n\n if (child.killed) {\n this.servers.delete(name);\n return;\n }\n\n log(name, 'stopping', `signalling pid ${child.pid ?? '?'}`);\n\n const exitPromise = new Promise<void>((resolve) => {\n const onExit = () => {\n child.removeListener('close', onExit);\n child.removeListener('exit', onExit);\n resolve();\n };\n child.on('close', onExit);\n child.on('exit', onExit);\n if (child.killed || child.exitCode !== null) resolve();\n });\n\n const pid = child.pid;\n try {\n if (pid) {\n globalThis.process.kill(-pid, 'SIGTERM');\n } else {\n child.kill('SIGTERM');\n }\n } catch {\n child.kill('SIGTERM');\n }\n\n const timeoutPromise = new Promise<void>((resolve) => {\n setTimeout(() => {\n if (!child.killed && child.exitCode === null) {\n log(name, 'stopping', 'did not stop gracefully, sending SIGKILL');\n try {\n if (pid) globalThis.process.kill(-pid, 'SIGKILL');\n else child.kill('SIGKILL');\n } catch {\n child.kill('SIGKILL');\n }\n }\n resolve();\n }, 5000);\n });\n\n await Promise.race([exitPromise, timeoutPromise]);\n // Brief grace period so the OS releases the port.\n await new Promise((r) => setTimeout(r, 200));\n\n await removeMarker(cwd, { name, url });\n this.servers.delete(name);\n log(name, 'killed', 'stopped');\n }\n\n /**\n * Synchronous kill for signal handlers. Walks in reverse insertion order and\n * sends SIGTERM (followed by SIGKILL after 1s) to each owned subprocess.\n * State is cleared only AFTER signals are sent so a follow-up stop() can see\n * the process if it survives.\n */\n kill(): void {\n if (this.servers.size === 0) return;\n const names = [...this.servers.keys()].reverse();\n for (const name of names) {\n const server = this.servers.get(name);\n if (!server) continue;\n const child = server.process;\n if (!child) {\n // External reuse -- nothing to signal.\n this.servers.delete(name);\n continue;\n }\n if (child.killed) {\n this.servers.delete(name);\n continue;\n }\n log(name, 'stopping', 'sync kill');\n const pid = child.pid;\n if (pid) {\n try {\n process.kill(-pid, 'SIGTERM');\n } catch {\n child.kill('SIGTERM');\n }\n // Force SIGKILL after a short delay, then clear state.\n setTimeout(() => {\n try {\n if (pid) process.kill(-pid, 'SIGKILL');\n } catch {\n // already dead\n }\n removeMarkerSync(server.cwd, { name, url: server.url });\n this.servers.delete(name);\n }, 1000);\n } else {\n child.kill('SIGTERM');\n removeMarkerSync(server.cwd, { name, url: server.url });\n this.servers.delete(name);\n }\n }\n }\n}\n\nexport const webServerManager = WebServerManager.getInstance();\nexport { isServerRunning };\n","import { ChatMessage, Workflow } from 'blazen';\nimport type { Context, JsToolDef } from 'blazen';\nimport { createWorker, type Worker, type RecognizeResult } from 'tesseract.js';\nimport { z } from 'zod';\nimport type { AIConfig } from './types';\nimport { buildModel, buildCompletionOptions } from './provider';\n\nexport interface EvaluateResult {\n passed: boolean;\n mode: 'ocr' | 'ai';\n reason: string;\n ocrText?: string;\n ocrConfidence?: number;\n aiReason?: string;\n screenshotPath: string;\n}\n\nexport interface EvaluateOptions {\n expected: string | string[];\n mode: 'ocr' | 'ai' | 'auto';\n regex: boolean;\n prompt?: string;\n confidence: number;\n screenshotBuffer: Buffer;\n screenshotPath: string;\n aiConfig?: AIConfig;\n}\n\ninterface MatchResult {\n allMatched: boolean;\n matched: string[];\n missing: string[];\n}\n\nlet ocrWorker: Worker | null = null;\n\nasync function getOCRWorker(): Promise<Worker> {\n if (!ocrWorker) {\n ocrWorker = await createWorker('eng');\n }\n return ocrWorker;\n}\n\nexport async function terminateOCRWorker(): Promise<void> {\n if (ocrWorker) {\n await ocrWorker.terminate();\n ocrWorker = null;\n }\n}\n\nasync function runOCR(screenshotBuffer: Buffer): Promise<{ text: string; confidence: number }> {\n const worker = await getOCRWorker();\n const result: RecognizeResult = await worker.recognize(screenshotBuffer);\n return {\n text: result.data.text,\n confidence: result.data.confidence,\n };\n}\n\nfunction matchExpected(text: string, expectedArray: string[], useRegex: boolean): MatchResult {\n const matched: string[] = [];\n const missing: string[] = [];\n\n for (const expected of expectedArray) {\n let found = false;\n if (useRegex) {\n try {\n const regex = new RegExp(expected, 'i');\n found = regex.test(text);\n } catch {\n found = text.toLowerCase().includes(expected.toLowerCase());\n }\n } else {\n found = text.toLowerCase().includes(expected.toLowerCase());\n }\n\n if (found) matched.push(expected);\n else missing.push(expected);\n }\n\n return { allMatched: missing.length === 0, matched, missing };\n}\n\nconst AIEvaluationResponseSchema = z.object({\n passed: z.boolean(),\n reason: z.string(),\n});\n\nconst SUBMIT_EVALUATION_TOOL: JsToolDef = {\n name: 'submit_evaluation',\n description:\n 'Submit the structured pass/fail evaluation of the screenshot. Always call this exactly once.',\n parameters: {\n type: 'object',\n properties: {\n passed: {\n type: 'boolean',\n description: 'Whether the screenshot meets the expected criteria.',\n },\n reason: {\n type: 'string',\n description: 'Concise explanation of the decision.',\n },\n },\n required: ['passed', 'reason'],\n },\n};\n\nasync function runAIEvaluation(\n screenshotBuffer: Buffer,\n expectedArray: string[],\n customPrompt: string | undefined,\n aiConfig: AIConfig,\n): Promise<{ passed: boolean; reason: string }> {\n const model = buildModel(aiConfig);\n const options = buildCompletionOptions(aiConfig);\n\n const systemPrompt = `You are evaluating a screenshot against expected content or conditions.\nAnalyze the image and submit your decision by calling the submit_evaluation tool exactly once.`;\n\n const defaultPrompt = `Expected content or conditions:\n${expectedArray.map((exp) => `- ${exp}`).join('\\n')}\n\nDoes the screenshot contain all of the expected content or meet the specified conditions? Submit your decision via the submit_evaluation tool.`;\n\n const prompt = customPrompt || defaultPrompt;\n const imageBase64 = screenshotBuffer.toString('base64');\n\n const wf = new Workflow('ai-evaluation');\n\n wf.addStep(\n 'evaluate',\n ['blazen::StartEvent'],\n async (_event: Record<string, unknown>, _ctx: Context) => {\n const response = await model.completeWithOptions(\n [\n ChatMessage.system(systemPrompt),\n ChatMessage.userImageBase64(prompt, imageBase64, 'image/png'),\n ],\n { ...options, tools: [SUBMIT_EVALUATION_TOOL] },\n );\n\n const call = response.toolCalls?.[0];\n if (!call || call.name !== 'submit_evaluation') {\n throw new Error('AI did not submit a structured evaluation via tool call.');\n }\n\n const parsed = AIEvaluationResponseSchema.parse(call.arguments);\n return { type: 'blazen::StopEvent', result: parsed };\n },\n );\n\n const result = await wf.run({});\n return result.data as { passed: boolean; reason: string };\n}\n\nexport async function evaluate(options: EvaluateOptions): Promise<EvaluateResult> {\n const expectedArray = Array.isArray(options.expected) ? options.expected : [options.expected];\n\n let ocrFailReason: string | undefined;\n\n if (options.mode === 'ocr' || options.mode === 'auto') {\n try {\n const ocrResult = await runOCR(options.screenshotBuffer);\n const matchResult = matchExpected(ocrResult.text, expectedArray, options.regex);\n const ocrPassed = matchResult.allMatched && ocrResult.confidence >= options.confidence;\n\n if (ocrPassed) {\n return {\n passed: true,\n mode: 'ocr',\n reason: `OCR matched all expected content with ${ocrResult.confidence.toFixed(1)}% confidence`,\n ocrText: ocrResult.text,\n ocrConfidence: ocrResult.confidence,\n screenshotPath: options.screenshotPath,\n };\n }\n\n ocrFailReason =\n matchResult.missing.length > 0\n ? `OCR did not find expected content: ${matchResult.missing.join(', ')}`\n : `OCR confidence (${ocrResult.confidence.toFixed(1)}%) below threshold (${options.confidence}%)`;\n\n if (options.mode === 'ocr') {\n return {\n passed: false,\n mode: 'ocr',\n reason: ocrFailReason,\n ocrText: ocrResult.text,\n ocrConfidence: ocrResult.confidence,\n screenshotPath: options.screenshotPath,\n };\n }\n } catch (e) {\n ocrFailReason = `OCR failed: ${e instanceof Error ? e.message : String(e)}`;\n if (options.mode === 'ocr') {\n return {\n passed: false,\n mode: 'ocr',\n reason: ocrFailReason,\n screenshotPath: options.screenshotPath,\n };\n }\n }\n }\n\n if (options.mode === 'ai' || options.mode === 'auto') {\n if (!options.aiConfig) {\n const reason =\n options.mode === 'auto' && ocrFailReason\n ? `${ocrFailReason}. No AI provider configured to fall back on`\n : 'AI evaluation requested but no AI configuration provided';\n\n return {\n passed: false,\n mode: options.mode === 'auto' ? 'ocr' : 'ai',\n reason,\n screenshotPath: options.screenshotPath,\n };\n }\n\n try {\n const aiResult = await runAIEvaluation(\n options.screenshotBuffer,\n expectedArray,\n options.prompt,\n options.aiConfig,\n );\n\n return {\n passed: aiResult.passed,\n mode: 'ai',\n reason: aiResult.reason,\n aiReason: aiResult.reason,\n screenshotPath: options.screenshotPath,\n };\n } catch (e) {\n const aiError = e instanceof Error ? e.message : String(e);\n const reason =\n options.mode === 'auto' && ocrFailReason\n ? `${ocrFailReason}. AI fallback also failed: ${aiError}`\n : `AI evaluation failed: ${aiError}`;\n\n return {\n passed: false,\n mode: 'ai',\n reason,\n screenshotPath: options.screenshotPath,\n };\n }\n }\n\n return {\n passed: false,\n mode: 'ocr',\n reason: 'Invalid evaluation mode',\n screenshotPath: options.screenshotPath,\n };\n}\n","import crypto from 'node:crypto';\nimport path from 'node:path';\n\nimport {\n chromium,\n firefox,\n webkit,\n type BrowserContextOptions,\n type BrowserType,\n type Page,\n} from 'playwright';\n\nimport type { TestDefinition, WorkflowDefinition } from '../../core/types';\nimport { interpolateVariables } from '../../core/interpolation';\nimport { loadTestDefinition } from '../../core/loader';\nimport { InbucketClient } from '../../integrations/email/inbucketClient';\nimport type { Email } from '../../integrations/email/types';\nimport { getBrowserLaunchOptions, parseViewportSize } from './browserOptions.js';\nimport { executeActionWithRetry, resolveStorageStatePath } from './playwrightExecutor.js';\nimport { ResponseLog } from './responseLog.js';\nimport {\n createTestContext,\n APPWRITE_PATTERNS,\n APPWRITE_UPDATE_PATTERNS,\n APPWRITE_DELETE_PATTERNS,\n} from '../../integrations/appwrite';\nimport type { TestContext } from '../../integrations/appwrite/types';\nimport { startTrackingServer, type TrackingServer, initFileTracking, mergeFileTrackedResources } from '../../tracking';\nimport { type BrowserName, type StepResult } from './playwrightExecutor';\nimport { webServerManager, type WebServerInput } from './webServerManager.js';\nimport type { AIConfig } from '../../ai/types';\nimport { loadCleanupHandlers, executeCleanup } from '../../core/cleanup/index.js';\nimport type { CleanupConfig } from '../../core/cleanup/types.js';\nimport type { WorkflowConfig } from '../../core/workflowSchema.js';\nimport type { ExecutorOptions } from '../../core/options.js';\nimport { terminateOCRWorker } from '../../ai/evaluator';\n\n/**\n * Options for running a workflow.\n * Extends base ExecutorOptions with workflow-specific options.\n */\nexport interface WorkflowOptions extends Omit<ExecutorOptions, 'storageState'> {\n /** AI configuration for interactive/healing mode */\n aiConfig?: AIConfig;\n /** Web server configuration */\n webServer?: WebServerInput;\n /** Fallback baseUrl from pipeline config */\n baseUrl?: string;\n /** Playwright storageState (cookies/localStorage) to apply on every new context. File path string or inline {cookies, origins} object. CLI flag is string-only; YAML config can be either. */\n storageState?: BrowserContextOptions['storageState'];\n /** Fallback Appwrite configuration from pipeline config */\n appwriteConfig?: {\n endpoint: string;\n projectId: string;\n apiKey: string;\n };\n}\n\nexport interface WorkflowWithContextOptions extends WorkflowOptions {\n page: Page;\n executionContext: ExecutionContext;\n skipCleanup?: boolean;\n sessionId?: string;\n testStartTime?: string; // ISO timestamp when the test started\n}\n\nexport interface WorkflowTestResult {\n id?: string;\n file: string;\n status: 'passed' | 'failed' | 'skipped';\n steps: StepResult[];\n error?: string;\n}\n\nexport interface WorkflowResult {\n status: 'passed' | 'failed';\n tests: WorkflowTestResult[];\n sessionId: string;\n cleanupResult?: { success: boolean; deleted: string[]; failed: string[] };\n}\n\nexport interface ExecutionContext {\n variables: Map<string, string>;\n lastEmail: Email | null;\n emailClient: InbucketClient | null;\n appwriteContext: TestContext;\n appwriteConfig?: {\n endpoint: string;\n projectId: string;\n apiKey: string;\n };\n}\n\nconst defaultScreenshotDir = path.join(process.cwd(), 'artifacts', 'screenshots');\n\nconst getBrowser = (browser: BrowserName): BrowserType => {\n switch (browser) {\n case 'firefox':\n return firefox;\n case 'webkit':\n return webkit;\n default:\n return chromium;\n }\n};\n\n/**\n * Interpolates variables from the execution context and previous test results.\n * Supports syntax: {{testId.varName}} for cross-test references and {{varName}} for current test variables.\n */\nfunction interpolateWorkflowVariables(\n value: string,\n currentVariables: Map<string, string>,\n testResults: WorkflowTestResult[]\n): string {\n return value.replace(/\\{\\{([^}]+)\\}\\}/g, (match, path) => {\n // Handle {{testId.varName}} syntax\n if (path.includes('.') && !path.includes(':')) {\n const [testId, _varName] = path.split('.', 2);\n const _testResult = testResults.find((t) => t.id === testId);\n\n // Check if the test result has variables in steps\n // Variables are stored in the execution context during test run\n // For now, we'll return the match if we can't find the variable\n // TODO: Store test-level variables in test results for cross-test access\n console.warn(`Cross-test variable interpolation {{${path}}} not yet fully implemented`);\n return match;\n }\n\n // Use the centralized interpolation for built-in variables\n const result = interpolateVariables(`{{${path}}}`, currentVariables);\n return result;\n });\n}\n\n/**\n * Runs a single test within the workflow context (shared browser, shared variables).\n *\n * The per-action dispatch is delegated to `executeActionWithRetry` so the\n * workflow path stays structurally in sync with the standalone test path.\n * Adding a new action type to `executeActionWithRetry` automatically makes\n * it work here too.\n */\nasync function runTestInWorkflow(\n test: TestDefinition,\n page: Page,\n context: ExecutionContext,\n options: WorkflowOptions,\n _workflowDir: string,\n testFilePath: string,\n workflowBaseUrl?: string\n): Promise<{ status: 'passed' | 'failed'; steps: StepResult[] }> {\n const results: StepResult[] = [];\n const debugMode = options.debug ?? false;\n const screenshotDir = defaultScreenshotDir;\n const browserName = (options.browser ?? 'chromium') as BrowserName;\n const baseUrl = test.config?.web?.baseUrl || workflowBaseUrl;\n\n // Network response log for `expectResponse`; the executor reads from it.\n const responseLog = new ResponseLog();\n responseLog.attach(page);\n\n try {\n for (const [index, action] of test.steps.entries()) {\n const stepStartTs = Date.now();\n if (debugMode) {\n console.log(` [DEBUG] Step ${index + 1}: ${action.type}`);\n }\n\n try {\n const actionExtras = await executeActionWithRetry(page, action, index, {\n baseUrl,\n context,\n screenshotDir,\n debugMode,\n interactive: false,\n aiConfig: options.aiConfig,\n browserName,\n testFilePath,\n responseLog,\n stepStartTs,\n });\n results.push({ action, status: 'passed', logOutput: actionExtras.logOutput });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n results.push({ action, status: 'failed', error: message });\n throw error;\n }\n }\n\n return {\n status: 'passed',\n steps: results,\n };\n } catch {\n return {\n status: 'failed',\n steps: results,\n };\n }\n}\n\n/**\n * Sets up network interception for Appwrite API tracking.\n */\nexport function setupAppwriteTracking(page: Page, context: ExecutionContext): void {\n page.on('response', async (response) => {\n const url = response.url();\n const method = response.request().method();\n\n try {\n // Handle POST requests (resource creation)\n if (method === 'POST') {\n if (APPWRITE_PATTERNS.userCreate.test(url)) {\n const data = await response.json();\n context.appwriteContext.userId = data.$id;\n context.appwriteContext.userEmail = data.email;\n return;\n }\n\n const rowMatch = url.match(APPWRITE_PATTERNS.rowCreate);\n if (rowMatch) {\n const data = await response.json();\n context.appwriteContext.resources.push({\n type: 'row',\n id: data.$id,\n databaseId: rowMatch[1],\n tableId: rowMatch[2],\n createdAt: new Date().toISOString(),\n });\n return;\n }\n\n const fileMatch = url.match(APPWRITE_PATTERNS.fileCreate);\n if (fileMatch) {\n const data = await response.json();\n context.appwriteContext.resources.push({\n type: 'file',\n id: data.$id,\n bucketId: fileMatch[1],\n createdAt: new Date().toISOString(),\n });\n return;\n }\n\n const teamMatch = url.match(APPWRITE_PATTERNS.teamCreate);\n if (teamMatch) {\n const data = await response.json();\n context.appwriteContext.resources.push({\n type: 'team',\n id: data.$id,\n createdAt: new Date().toISOString(),\n });\n return;\n }\n\n const membershipMatch = url.match(APPWRITE_PATTERNS.membershipCreate);\n if (membershipMatch) {\n const data = await response.json();\n context.appwriteContext.resources.push({\n type: 'membership',\n id: data.$id,\n teamId: membershipMatch[1],\n createdAt: new Date().toISOString(),\n });\n return;\n }\n\n const messageMatch = url.match(APPWRITE_PATTERNS.messageCreate);\n if (messageMatch) {\n const data = await response.json();\n context.appwriteContext.resources.push({\n type: 'message',\n id: data.$id,\n createdAt: new Date().toISOString(),\n });\n return;\n }\n }\n\n // Handle PUT/PATCH requests (resource updates)\n if (method === 'PUT' || method === 'PATCH') {\n const rowUpdateMatch = url.match(APPWRITE_UPDATE_PATTERNS.rowUpdate);\n if (rowUpdateMatch) {\n const resourceId = rowUpdateMatch[3];\n const existing = context.appwriteContext.resources.find(\n (r) => r.type === 'row' && r.id === resourceId\n );\n if (!existing) {\n context.appwriteContext.resources.push({\n type: 'row',\n id: resourceId,\n databaseId: rowUpdateMatch[1],\n tableId: rowUpdateMatch[2],\n createdAt: new Date().toISOString(),\n });\n }\n return;\n }\n\n const fileUpdateMatch = url.match(APPWRITE_UPDATE_PATTERNS.fileUpdate);\n if (fileUpdateMatch) {\n const resourceId = fileUpdateMatch[2];\n const existing = context.appwriteContext.resources.find(\n (r) => r.type === 'file' && r.id === resourceId\n );\n if (!existing) {\n context.appwriteContext.resources.push({\n type: 'file',\n id: resourceId,\n bucketId: fileUpdateMatch[1],\n createdAt: new Date().toISOString(),\n });\n }\n return;\n }\n\n const teamUpdateMatch = url.match(APPWRITE_UPDATE_PATTERNS.teamUpdate);\n if (teamUpdateMatch) {\n const resourceId = teamUpdateMatch[1];\n const existing = context.appwriteContext.resources.find(\n (r) => r.type === 'team' && r.id === resourceId\n );\n if (!existing) {\n context.appwriteContext.resources.push({\n type: 'team',\n id: resourceId,\n createdAt: new Date().toISOString(),\n });\n }\n return;\n }\n }\n\n // Handle DELETE requests\n if (method === 'DELETE') {\n const rowDeleteMatch = url.match(APPWRITE_DELETE_PATTERNS.rowDelete);\n if (rowDeleteMatch) {\n const resource = context.appwriteContext.resources.find(\n (r) => r.type === 'row' && r.id === rowDeleteMatch[3]\n );\n if (resource) resource.deleted = true;\n return;\n }\n\n const fileDeleteMatch = url.match(APPWRITE_DELETE_PATTERNS.fileDelete);\n if (fileDeleteMatch) {\n const resource = context.appwriteContext.resources.find(\n (r) => r.type === 'file' && r.id === fileDeleteMatch[2]\n );\n if (resource) resource.deleted = true;\n return;\n }\n\n const teamDeleteMatch = url.match(APPWRITE_DELETE_PATTERNS.teamDelete);\n if (teamDeleteMatch) {\n const resource = context.appwriteContext.resources.find(\n (r) => r.type === 'team' && r.id === teamDeleteMatch[1]\n );\n if (resource) resource.deleted = true;\n return;\n }\n\n const membershipDeleteMatch = url.match(APPWRITE_DELETE_PATTERNS.membershipDelete);\n if (membershipDeleteMatch) {\n const resource = context.appwriteContext.resources.find(\n (r) => r.type === 'membership' && r.id === membershipDeleteMatch[2]\n );\n if (resource) resource.deleted = true;\n return;\n }\n }\n } catch {\n // Ignore parse errors for non-JSON responses\n }\n });\n}\n\n/**\n * Infer cleanup configuration from workflow config.\n * Provides backwards compatibility by converting old Appwrite config to new cleanup config.\n */\nfunction inferCleanupConfig(config: WorkflowConfig | undefined): CleanupConfig | undefined {\n console.log('[Debug] inferCleanupConfig called');\n console.log('[Debug] config:', config ? JSON.stringify(config, null, 2) : 'undefined');\n\n if (!config) {\n console.log('[Debug] Config is undefined/null, returning undefined');\n return undefined;\n }\n\n // Check for new cleanup config first\n if (config.cleanup) {\n console.log('[Debug] Found config.cleanup, returning it');\n return config.cleanup;\n }\n\n // Backwards compatibility: convert old appwrite config\n console.log('[Debug] Checking config.appwrite?.cleanup:', config.appwrite?.cleanup);\n if (config.appwrite?.cleanup) {\n console.log('[Debug] Found config.appwrite.cleanup, returning cleanup config');\n return {\n provider: 'appwrite',\n scanUntracked: true,\n appwrite: {\n endpoint: config.appwrite.endpoint,\n projectId: config.appwrite.projectId,\n apiKey: config.appwrite.apiKey,\n cleanupOnFailure: config.appwrite.cleanupOnFailure,\n },\n };\n }\n\n console.log('[Debug] No cleanup config found, returning undefined');\n return undefined;\n}\n\n/**\n * Result from runWorkflowWithContext, includes internal state for cleanup handling.\n */\nexport interface WorkflowWithContextResult extends WorkflowResult {\n workflowFailed: boolean;\n}\n\n/**\n * Runs a workflow with an externally provided page and execution context.\n * This is useful for pipeline execution where multiple workflows share the same browser session.\n *\n * @param workflow - The workflow definition to execute\n * @param workflowFilePath - Path to the workflow file (used for resolving relative test paths)\n * @param options - Options including the page, executionContext, and skipCleanup flag\n * @returns WorkflowWithContextResult with test results and cleanup data\n */\nexport async function runWorkflowWithContext(\n workflow: WorkflowDefinition,\n workflowFilePath: string,\n options: WorkflowWithContextOptions\n): Promise<WorkflowWithContextResult> {\n const { page, executionContext, skipCleanup = false, sessionId: providedSessionId, testStartTime: providedTestStartTime } = options;\n const workflowDir = path.dirname(workflowFilePath);\n const sessionId = providedSessionId ?? crypto.randomUUID();\n const testStartTime = providedTestStartTime ?? new Date().toISOString();\n\n console.log(`\\nStarting workflow: ${workflow.name}`);\n console.log(`Session ID: ${sessionId}\\n`);\n\n // Set up Appwrite network tracking if configured\n // Workflow config wins; otherwise fall back to options.appwriteConfig (e.g. from pipeline).\n const effectiveAppwriteConfig = workflow.config?.appwrite\n ? {\n endpoint: workflow.config.appwrite.endpoint,\n projectId: workflow.config.appwrite.projectId,\n apiKey: workflow.config.appwrite.apiKey,\n }\n : options.appwriteConfig;\n if (effectiveAppwriteConfig) {\n // Update executionContext with appwrite config if not already set\n if (!executionContext.appwriteConfig) {\n executionContext.appwriteConfig = effectiveAppwriteConfig;\n }\n setupAppwriteTracking(page, executionContext);\n }\n\n // Load workflow-level variables (only if not already set by parent pipeline)\n if (workflow.variables) {\n for (const [key, value] of Object.entries(workflow.variables)) {\n // Don't overwrite variables already set by pipeline\n if (!executionContext.variables.has(key)) {\n const interpolated = interpolateVariables(value, executionContext.variables);\n executionContext.variables.set(key, interpolated);\n }\n }\n }\n\n // Run tests in sequence\n const testResults: WorkflowTestResult[] = [];\n let workflowFailed = false;\n\n for (const [index, testRef] of workflow.tests.entries()) {\n const testFilePath = path.resolve(workflowDir, testRef.file);\n console.log(`\\n[${index + 1}/${workflow.tests.length}] Running: ${testRef.file}`);\n\n if (testRef.id) {\n console.log(` Test ID: ${testRef.id}`);\n }\n\n try {\n // Load test definition\n const test = await loadTestDefinition(testFilePath);\n\n // Merge test variables with workflow-injected variables\n if (testRef.variables) {\n for (const [key, value] of Object.entries(testRef.variables)) {\n // Interpolate cross-test variables\n const interpolated = interpolateWorkflowVariables(\n value,\n executionContext.variables,\n testResults\n );\n\n // Store in test definition\n if (!test.variables) test.variables = {};\n test.variables[key] = interpolated;\n\n // Also store in execution context\n executionContext.variables.set(key, interpolated);\n }\n }\n\n // Initialize test variables in execution context\n if (test.variables) {\n for (const [key, value] of Object.entries(test.variables)) {\n // Use centralized interpolation for all built-in variables\n const interpolated = interpolateVariables(value, executionContext.variables);\n executionContext.variables.set(key, interpolated);\n }\n }\n\n // Run test with shared browser context (baseUrl: workflow → pipeline → undefined)\n const effectiveBaseUrl = workflow.config?.web?.baseUrl || options.baseUrl;\n if (options.debug) {\n console.log(` [DEBUG] Effective baseUrl for test: ${effectiveBaseUrl ?? '(none)'}`);\n console.log(` [DEBUG] - workflow.config?.web?.baseUrl: ${workflow.config?.web?.baseUrl ?? '(undefined)'}`);\n console.log(` [DEBUG] - options.baseUrl: ${options.baseUrl ?? '(undefined)'}`);\n }\n const result = await runTestInWorkflow(test, page, executionContext, options, workflowDir, testFilePath, effectiveBaseUrl);\n\n const testResult: WorkflowTestResult = {\n id: testRef.id,\n file: testRef.file,\n status: result.status,\n steps: result.steps,\n };\n\n testResults.push(testResult);\n\n if (result.status === 'passed') {\n console.log(` ✓ Passed (${result.steps.length} steps)`);\n } else {\n console.log(` ✗ Failed`);\n const failedStep = result.steps.find((s) => s.status === 'failed');\n if (failedStep) {\n console.log(` Error: ${failedStep.error}`);\n testResult.error = failedStep.error;\n }\n\n // Stop on failure unless continueOnFailure is set\n if (!workflow.continueOnFailure) {\n workflowFailed = true;\n break;\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.log(` ✗ Failed to load/run test: ${message}`);\n\n testResults.push({\n id: testRef.id,\n file: testRef.file,\n status: 'failed',\n steps: [],\n error: message,\n });\n\n if (!workflow.continueOnFailure) {\n workflowFailed = true;\n break;\n }\n }\n }\n\n // Skip cleanup if requested (e.g., pipeline will handle it)\n let cleanupResult: { success: boolean; deleted: string[]; failed: string[] } | undefined;\n\n if (!skipCleanup) {\n const cleanupConfig = inferCleanupConfig(workflow.config);\n\n if (cleanupConfig) {\n // Determine if we should cleanup based on test status\n const appwriteConfig = cleanupConfig.appwrite as { cleanupOnFailure?: boolean } | undefined;\n const cleanupOnFailure = appwriteConfig?.cleanupOnFailure ?? true;\n const shouldCleanup = workflowFailed ? cleanupOnFailure : true;\n\n if (shouldCleanup) {\n try {\n console.log('\\n[Cleanup] Starting cleanup...');\n\n const { handlers, typeMappings, provider } = await loadCleanupHandlers(\n cleanupConfig,\n process.cwd()\n );\n\n // Convert Appwrite-specific TrackedResource to generic TrackedResource\n const genericResources = executionContext.appwriteContext.resources.map((r) => ({\n ...r,\n }));\n\n // Build provider config (without secrets!)\n const providerConfig: { provider: string; [key: string]: unknown } = {\n provider: cleanupConfig.provider || 'appwrite',\n };\n\n // Add provider-specific non-secret config\n if (cleanupConfig.provider === 'appwrite' && cleanupConfig.appwrite) {\n const appwriteCleanupConfig = cleanupConfig.appwrite as any;\n providerConfig.endpoint = appwriteCleanupConfig.endpoint;\n providerConfig.projectId = appwriteCleanupConfig.projectId;\n // Note: NOT including apiKey for security\n } else if (cleanupConfig.provider === 'postgres' && cleanupConfig.postgres) {\n const pgConfig = cleanupConfig.postgres as any;\n // Only store connection details, not password\n const connString = pgConfig.connectionString as string;\n if (connString) {\n // Parse and remove password from connection string\n try {\n const url = new URL(connString.replace('postgresql://', 'http://'));\n providerConfig.host = url.hostname;\n providerConfig.port = url.port;\n providerConfig.database = url.pathname.slice(1);\n providerConfig.user = url.username;\n // Note: NOT including password\n } catch {\n // If parsing fails, just note that it's configured\n providerConfig.configured = true;\n }\n }\n } else if (cleanupConfig.provider === 'mysql' && cleanupConfig.mysql) {\n const mysqlConfig = cleanupConfig.mysql as any;\n providerConfig.host = mysqlConfig.host;\n providerConfig.port = mysqlConfig.port;\n providerConfig.database = mysqlConfig.database;\n providerConfig.user = mysqlConfig.user;\n // Note: NOT including password\n } else if (cleanupConfig.provider === 'sqlite' && cleanupConfig.sqlite) {\n const sqliteConfig = cleanupConfig.sqlite as any;\n providerConfig.database = sqliteConfig.database;\n // Note: SQLite doesn't have passwords\n }\n\n cleanupResult = await executeCleanup(\n genericResources,\n handlers,\n typeMappings,\n {\n parallel: cleanupConfig.parallel ?? false,\n retries: cleanupConfig.retries ?? 3,\n sessionId,\n testStartTime,\n userId: executionContext.appwriteContext.userId,\n userEmail: executionContext.appwriteContext.userEmail,\n providerConfig,\n cwd: process.cwd(),\n config: cleanupConfig,\n provider,\n }\n );\n\n if (cleanupResult.success) {\n console.log(`[Cleanup] Cleanup complete: ${cleanupResult.deleted.length} resources deleted`);\n } else {\n console.log(`[Cleanup] Cleanup partial: ${cleanupResult.deleted.length} deleted, ${cleanupResult.failed.length} failed`);\n for (const failed of cleanupResult.failed) {\n console.log(` - ${failed}`);\n }\n }\n } catch (error) {\n console.error('[Cleanup] Cleanup failed:', error);\n }\n } else {\n console.log('\\nSkipping cleanup (cleanupOnFailure is false)');\n }\n }\n }\n\n const overallStatus = testResults.every((t) => t.status === 'passed') ? 'passed' : 'failed';\n\n console.log(`\\n${'='.repeat(60)}`);\n console.log(`Workflow: ${overallStatus === 'passed' ? '✓ PASSED' : '✗ FAILED'}`);\n console.log(`Tests: ${testResults.filter(t => t.status === 'passed').length}/${testResults.length} passed`);\n console.log(`${'='.repeat(60)}\\n`);\n\n return {\n status: overallStatus,\n tests: testResults,\n sessionId,\n cleanupResult,\n workflowFailed,\n };\n}\n\n/**\n * Runs a workflow: multiple tests in sequence with shared browser session.\n * This is the main entry point that manages browser lifecycle, tracking server, and cleanup.\n */\nexport async function runWorkflow(\n workflow: WorkflowDefinition,\n workflowFilePath: string,\n options: WorkflowOptions = {}\n): Promise<WorkflowResult> {\n const workflowDir = path.dirname(workflowFilePath);\n const sessionId = options.sessionId ?? crypto.randomUUID();\n const testStartTime = new Date().toISOString();\n const cleanupConfig = inferCleanupConfig(workflow.config);\n\n // 1. Check if tracking is already set up by CLI (e.g., --preview mode)\n const trackingAlreadySetUp = options.skipTrackingSetup ||\n (process.env.INTELLITESTER_TRACKING_OWNER === 'cli');\n\n let ownsTracking = false;\n let trackingServer: TrackingServer | null = null;\n let fileTracking: { trackFile: string; stop: () => Promise<void> } | null = null;\n\n if (!trackingAlreadySetUp) {\n ownsTracking = true;\n // Start tracking server\n try {\n trackingServer = await startTrackingServer({ port: 0 });\n console.log(`Tracking server started on port ${trackingServer.port}`);\n } catch (error) {\n console.warn('Failed to start tracking server:', error);\n }\n\n // 2. Set environment variables for the app under test\n if (trackingServer) {\n process.env.INTELLITESTER_SESSION_ID = sessionId;\n process.env.INTELLITESTER_TRACK_URL = `http://localhost:${trackingServer.port}`;\n }\n // Workflow config wins; otherwise fall back to options.appwriteConfig (e.g. from pipeline).\n const trackingAppwrite = workflow.config?.appwrite\n ? {\n endpoint: workflow.config.appwrite.endpoint,\n projectId: workflow.config.appwrite.projectId,\n apiKey: workflow.config.appwrite.apiKey,\n }\n : options.appwriteConfig;\n fileTracking = await initFileTracking({\n sessionId,\n cleanupConfig,\n trackDir: options.trackDir,\n providerConfig: trackingAppwrite ? {\n provider: 'appwrite',\n endpoint: trackingAppwrite.endpoint,\n projectId: trackingAppwrite.projectId,\n apiKey: trackingAppwrite.apiKey,\n } : undefined,\n });\n process.env.INTELLITESTER_TRACK_FILE = fileTracking.trackFile;\n } else {\n console.log('Using existing tracking setup (owned by CLI)');\n }\n\n // 3. Start web server if configured (workflow config takes precedence over global)\n const webServerConfig = workflow.config?.webServer ?? options.webServer;\n const skipWebServer = options.skipWebServerStart;\n\n console.log(`[Debug] webServerConfig: ${webServerConfig ? 'set' : 'not set'}, skipWebServer: ${skipWebServer}`);\n\n if (webServerConfig && !skipWebServer) {\n try {\n // Use workflow dir for workflow-defined webServer, process.cwd() for global config\n const serverCwd = workflow.config?.webServer ? workflowDir : process.cwd();\n\n // Only force restart if we own tracking AND user didn't explicitly set reuseExistingServer\n const requiresTrackingEnv = Boolean(\n workflow.config?.appwrite?.cleanup || workflow.config?.appwrite?.cleanupOnFailure\n );\n const wsEntries = Array.isArray(webServerConfig) ? webServerConfig : [webServerConfig];\n const userExplicitlySetReuse = wsEntries.some((e) => e.reuseExistingServer !== undefined);\n const shouldForceNoReuse = requiresTrackingEnv && !userExplicitlySetReuse && ownsTracking;\n if (shouldForceNoReuse) {\n console.log('[Intellitester] Appwrite cleanup enabled; restarting server to inject tracking env.');\n }\n\n const normalized = wsEntries.map((entry) => ({\n ...entry,\n workdir: path.resolve(serverCwd, entry.workdir ?? entry.cwd ?? '.'),\n ...(shouldForceNoReuse ? { reuseExistingServer: false } : {}),\n }));\n await webServerManager.start(normalized.length === 1 ? normalized[0] : normalized);\n } catch (error) {\n console.error('Failed to start web server:', error);\n if (trackingServer) await trackingServer.stop();\n throw error;\n }\n } else if (skipWebServer) {\n console.log('Using existing web server (started by CLI)');\n }\n\n // Handle cleanup on Ctrl+C (only clean up resources we own)\n const signalCleanup = async () => {\n console.log('\\n\\nInterrupted - cleaning up...');\n if (ownsTracking) {\n if (!skipWebServer) webServerManager.kill(); // Synchronous kill for signal handlers\n if (trackingServer) await trackingServer.stop();\n if (fileTracking) await fileTracking.stop();\n delete process.env.INTELLITESTER_TRACK_FILE;\n }\n process.exit(1);\n };\n process.on('SIGINT', signalCleanup);\n process.on('SIGTERM', signalCleanup);\n\n // 4. Launch browser ONCE for entire workflow\n // Workflow config wins; otherwise fall back to options.browser (e.g. from pipeline/CLI).\n const browserName = workflow.config?.web?.browser ?? options.browser ?? 'chromium';\n const headless = options.headed === true ? false : (workflow.config?.web?.headless ?? true);\n console.log(`Launching ${browserName}${headless ? ' (headless)' : ' (visible)'}...`);\n const browser = await getBrowser(browserName).launch(getBrowserLaunchOptions({ headless, browser: browserName }));\n console.log(`Browser launched successfully`);\n\n // Determine viewport sizes to test\n // Workflow config wins; otherwise fall back to options.testSizes (e.g. from pipeline/CLI).\n const workflowTestSizes = workflow.config?.web?.testSizes;\n const testSizes = (workflowTestSizes && workflowTestSizes.length > 0)\n ? workflowTestSizes\n : (options.testSizes && options.testSizes.length > 0\n ? options.testSizes\n : ['1920x1080']); // Default to standard desktop size\n\n // Validate all viewport sizes upfront\n const viewportSizes: Array<{ size: string; viewport: { width: number; height: number } }> = [];\n for (const size of testSizes) {\n const viewport = parseViewportSize(size);\n if (!viewport) {\n throw new Error(\n `Invalid viewport size: \"${size}\". Use named sizes (xs, sm, md, lg, xl) or WIDTHxHEIGHT format (e.g., \"1920x1080\")`\n );\n }\n viewportSizes.push({ size, viewport });\n }\n\n // Track all results across viewport sizes\n const allTestResults: WorkflowTestResult[] = [];\n let anyFailed = false;\n let _lastCleanupResult: { success: boolean; deleted: string[]; failed: string[] } | undefined;\n\n // Create browser context (will be replaced for each size)\n // Workflow config wins (resolved against workflow file dir); otherwise fall back to\n // options.storageState (CLI string resolves against cwd; inline object passes through).\n const optionsStorageState: BrowserContextOptions['storageState'] | undefined =\n typeof options.storageState === 'string'\n ? (path.isAbsolute(options.storageState) ? options.storageState : path.resolve(process.cwd(), options.storageState))\n : options.storageState;\n const workflowStorageState = resolveStorageStatePath(\n workflow.config?.web?.storageState as BrowserContextOptions['storageState'],\n workflowDir,\n );\n const storageState: BrowserContextOptions['storageState'] | undefined =\n workflowStorageState ?? optionsStorageState;\n let browserContext = await browser.newContext({\n viewport: viewportSizes[0].viewport,\n ...(storageState ? { storageState } : {}),\n });\n let page = await browserContext.newPage();\n page.setDefaultTimeout(30000);\n\n // 5. Create shared execution context\n // Workflow config wins; otherwise fall back to options.appwriteConfig (e.g. from pipeline).\n const executionContext: ExecutionContext = {\n variables: new Map<string, string>(),\n lastEmail: null,\n emailClient: null,\n appwriteContext: createTestContext(),\n appwriteConfig: workflow.config?.appwrite\n ? {\n endpoint: workflow.config.appwrite.endpoint,\n projectId: workflow.config.appwrite.projectId,\n apiKey: workflow.config.appwrite.apiKey,\n }\n : options.appwriteConfig,\n };\n\n // 5b. Load workflow-level variables into execution context\n if (workflow.variables) {\n for (const [key, value] of Object.entries(workflow.variables)) {\n // Use centralized interpolation for all built-in variables\n const interpolated = interpolateVariables(value, executionContext.variables);\n executionContext.variables.set(key, interpolated);\n }\n }\n\n try {\n // 6. Run workflow for each viewport size\n for (let sizeIndex = 0; sizeIndex < viewportSizes.length; sizeIndex++) {\n const { size, viewport } = viewportSizes[sizeIndex];\n\n // Create new browser context for each size (after first)\n if (sizeIndex > 0) {\n await browserContext.close();\n browserContext = await browser.newContext({\n viewport,\n ...(storageState ? { storageState } : {}),\n });\n page = await browserContext.newPage();\n page.setDefaultTimeout(30000);\n\n // Re-setup Appwrite tracking for new page if configured\n if (workflow.config?.appwrite) {\n setupAppwriteTracking(page, executionContext);\n }\n }\n\n console.log(`\\nTesting workflow at viewport: ${size} (${viewport.width}x${viewport.height})`);\n\n const result = await runWorkflowWithContext(workflow, workflowFilePath, {\n ...options,\n page,\n executionContext,\n skipCleanup: true,\n sessionId,\n testStartTime,\n });\n\n // Prefix test results with viewport size if testing multiple sizes\n const sizePrefix = viewportSizes.length > 1 ? `[${size}] ` : '';\n for (const testResult of result.tests) {\n allTestResults.push({\n ...testResult,\n file: sizePrefix + testResult.file,\n });\n }\n\n if (result.status === 'failed') {\n anyFailed = true;\n }\n }\n\n // Combine results - use the final result's structure\n const result: { status: 'passed' | 'failed'; tests: WorkflowTestResult[]; sessionId: string; workflowFailed: boolean } = {\n status: anyFailed ? 'failed' : 'passed',\n tests: allTestResults,\n sessionId,\n workflowFailed: anyFailed,\n };\n\n // 7. Collect server-tracked resources AFTER workflow execution\n if (trackingServer) {\n const serverResources = trackingServer.getResources(sessionId);\n if (serverResources.length > 0) {\n console.log(`\\nCollected ${serverResources.length} server-tracked resources`);\n // Cast generic tracked resources to Appwrite-specific format\n // The tracking server is now generic, so we trust the tracked data is valid\n executionContext.appwriteContext.resources.push(...(serverResources as any));\n }\n }\n\n if (fileTracking) {\n await mergeFileTrackedResources(fileTracking.trackFile, executionContext.appwriteContext);\n } else if (process.env.INTELLITESTER_TRACK_FILE) {\n // CLI owns tracking, use its track file\n await mergeFileTrackedResources(process.env.INTELLITESTER_TRACK_FILE, executionContext.appwriteContext);\n }\n\n // 8. Cleanup resources using the extensible cleanup system\n let cleanupResult: { success: boolean; deleted: string[]; failed: string[] } | undefined;\n\n console.log('[Debug] About to check cleanupConfig:', cleanupConfig ? 'truthy' : 'falsy');\n console.log('[Debug] cleanupConfig value:', cleanupConfig ? JSON.stringify(cleanupConfig, null, 2) : 'undefined');\n\n if (cleanupConfig) {\n // Determine if we should cleanup based on test status\n const appwriteConfig = cleanupConfig.appwrite as { cleanupOnFailure?: boolean } | undefined;\n const cleanupOnFailure = appwriteConfig?.cleanupOnFailure ?? true;\n const shouldCleanup = result.workflowFailed ? cleanupOnFailure : true;\n\n if (shouldCleanup) {\n try {\n console.log('\\n[Cleanup] Starting cleanup...');\n\n const { handlers, typeMappings, provider } = await loadCleanupHandlers(\n cleanupConfig,\n process.cwd()\n );\n\n // Convert Appwrite-specific TrackedResource to generic TrackedResource\n const genericResources = executionContext.appwriteContext.resources.map((r) => ({\n ...r,\n }));\n\n // Build provider config (without secrets!)\n const providerConfig: { provider: string; [key: string]: unknown } = {\n provider: cleanupConfig.provider || 'appwrite',\n };\n\n // Add provider-specific non-secret config\n if (cleanupConfig.provider === 'appwrite' && cleanupConfig.appwrite) {\n const appwriteCleanupConfig = cleanupConfig.appwrite as any;\n providerConfig.endpoint = appwriteCleanupConfig.endpoint;\n providerConfig.projectId = appwriteCleanupConfig.projectId;\n // Note: NOT including apiKey for security\n } else if (cleanupConfig.provider === 'postgres' && cleanupConfig.postgres) {\n const pgConfig = cleanupConfig.postgres as any;\n // Only store connection details, not password\n const connString = pgConfig.connectionString as string;\n if (connString) {\n // Parse and remove password from connection string\n try {\n const url = new URL(connString.replace('postgresql://', 'http://'));\n providerConfig.host = url.hostname;\n providerConfig.port = url.port;\n providerConfig.database = url.pathname.slice(1);\n providerConfig.user = url.username;\n // Note: NOT including password\n } catch {\n // If parsing fails, just note that it's configured\n providerConfig.configured = true;\n }\n }\n } else if (cleanupConfig.provider === 'mysql' && cleanupConfig.mysql) {\n const mysqlConfig = cleanupConfig.mysql as any;\n providerConfig.host = mysqlConfig.host;\n providerConfig.port = mysqlConfig.port;\n providerConfig.database = mysqlConfig.database;\n providerConfig.user = mysqlConfig.user;\n // Note: NOT including password\n } else if (cleanupConfig.provider === 'sqlite' && cleanupConfig.sqlite) {\n const sqliteConfig = cleanupConfig.sqlite as any;\n providerConfig.database = sqliteConfig.database;\n // Note: SQLite doesn't have passwords\n }\n\n cleanupResult = await executeCleanup(\n genericResources,\n handlers,\n typeMappings,\n {\n parallel: cleanupConfig.parallel ?? false,\n retries: cleanupConfig.retries ?? 3,\n sessionId,\n testStartTime,\n userId: executionContext.appwriteContext.userId,\n userEmail: executionContext.appwriteContext.userEmail,\n providerConfig,\n cwd: process.cwd(),\n config: cleanupConfig,\n provider,\n }\n );\n\n if (cleanupResult.success) {\n console.log(`[Cleanup] Cleanup complete: ${cleanupResult.deleted.length} resources deleted`);\n } else {\n console.log(`[Cleanup] Cleanup partial: ${cleanupResult.deleted.length} deleted, ${cleanupResult.failed.length} failed`);\n for (const failed of cleanupResult.failed) {\n console.log(` - ${failed}`);\n }\n }\n } catch (error) {\n console.error('[Cleanup] Cleanup failed:', error);\n }\n } else {\n console.log('\\nSkipping cleanup (cleanupOnFailure is false)');\n }\n }\n\n return {\n status: result.status,\n tests: result.tests,\n sessionId,\n cleanupResult,\n };\n } finally {\n // Remove signal handlers\n process.off('SIGINT', signalCleanup);\n process.off('SIGTERM', signalCleanup);\n\n // Close browser\n await browserContext.close();\n await browser.close();\n\n // Cleanup OCR worker\n await terminateOCRWorker();\n\n // Only clean up resources we own\n if (ownsTracking) {\n // Stop servers\n if (!skipWebServer) await webServerManager.stop();\n if (trackingServer) {\n await trackingServer.stop();\n }\n if (fileTracking) {\n await fileTracking.stop();\n }\n\n // Clean up env vars\n delete process.env.INTELLITESTER_SESSION_ID;\n delete process.env.INTELLITESTER_TRACK_URL;\n delete process.env.INTELLITESTER_TRACK_FILE;\n }\n }\n}\n","export * from './playwrightExecutor';\nexport * from './workflowExecutor';\n"]}
|