intellitester 0.4.2 → 0.4.4
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-J7357E4Q.js → chunk-7OBDMLJ3.js} +172 -20
- package/dist/chunk-7OBDMLJ3.js.map +1 -0
- package/dist/{chunk-UYI7XVUE.cjs → chunk-JX63IML5.cjs} +35 -5
- package/dist/chunk-JX63IML5.cjs.map +1 -0
- package/dist/{chunk-CGGEE467.cjs → chunk-QHIU4JKR.cjs} +173 -20
- package/dist/chunk-QHIU4JKR.cjs.map +1 -0
- package/dist/{chunk-A3UKMKXR.js → chunk-YEB47TDJ.js} +35 -5
- package/dist/chunk-YEB47TDJ.js.map +1 -0
- package/dist/cli/index.cjs +68 -42
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +32 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +39 -35
- package/dist/index.d.cts +86 -3
- package/dist/index.d.ts +86 -3
- package/dist/index.js +2 -2
- package/dist/{loader-4HFRIWQQ.cjs → loader-BNUKI7J3.cjs} +16 -16
- package/dist/{loader-4HFRIWQQ.cjs.map → loader-BNUKI7J3.cjs.map} +1 -1
- package/dist/{loader-GDI65KW7.js → loader-JTBS7GW4.js} +3 -3
- package/dist/{loader-GDI65KW7.js.map → loader-JTBS7GW4.js.map} +1 -1
- package/package.json +1 -1
- package/schemas/intellitester.config.schema.json +13 -0
- package/schemas/pipeline.schema.json +13 -0
- package/schemas/test.schema.json +13 -0
- package/schemas/workflow.schema.json +13 -0
- package/dist/chunk-A3UKMKXR.js.map +0 -1
- package/dist/chunk-CGGEE467.cjs.map +0 -1
- package/dist/chunk-J7357E4Q.js.map +0 -1
- package/dist/chunk-UYI7XVUE.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/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","path2","fs2","process","track","Client","Users","loadTestDefinition","defaultScreenshotDir","interpolateTrackMetadata","getBrowser","firefox","webkit","chromium","resolveUrl","resolveLocator","options","trackedPayload","waitForCondition","testFilePath","result"],"mappings":"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","file":"chunk-7OBDMLJ3.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 { 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 } 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?: WebServerConfig;\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 after each step completes (passed or failed) for real-time output */\n onStepComplete?: (result: StepResult, index: number, total: number) => void;\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}\"], #${CSS.escape(locator.testId)}, .${CSS.escape(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}\"], #${CSS.escape(locator.testId)}, .${CSS.escape(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\ninterface ActionExtras {\n logOutput?: string;\n}\n\nasync function executeActionWithRetry(\n page: Page,\n action: Action,\n index: number,\n options: {\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 },\n): Promise<ActionExtras> {\n const { baseUrl, context, screenshotDir, debugMode, interactive, aiConfig, browserName, healing } = 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 '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, {\n baseUrl,\n context,\n screenshotDir,\n debugMode,\n interactive,\n aiConfig,\n browserName,\n });\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, {\n baseUrl,\n context,\n screenshotDir,\n debugMode,\n interactive,\n aiConfig,\n browserName,\n });\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, {\n baseUrl,\n context,\n screenshotDir,\n debugMode,\n interactive,\n aiConfig,\n browserName,\n });\n }\n }\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 // Only force reuseExistingServer: false if we own tracking AND user didn't explicitly set it\n const userExplicitlySetReuse = options.webServer.reuseExistingServer !== undefined;\n const webServerConfig = (ownsTracking && requiresTrackingEnv && !userExplicitlySetReuse)\n ? { ...options.webServer, reuseExistingServer: false }\n : options.webServer;\n if (ownsTracking && requiresTrackingEnv && !userExplicitlySetReuse) {\n console.log('[Intellitester] Appwrite cleanup enabled; restarting server to inject tracking env.');\n }\n await webServerManager.start(webServerConfig);\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 // 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 (const [index, action] of test.steps.entries()) {\n if (debugMode) {\n console.log(`[DEBUG] Executing step ${index + 1}: ${action.type}`);\n }\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 options.onStepComplete?.(sizeResults[sizeResults.length - 1], index, test.steps.length);\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 options.onStepComplete?.(sizeResults[sizeResults.length - 1], index, test.steps.length);\n continue;\n }\n\n if (action.type === 'saveStorageState') {\n const saveAction = action as Extract<Action, { type: 'saveStorageState' }>;\n try {\n if (saveAction.path) {\n const resolvedPath = interpolateVariables(saveAction.path, executionContext.variables);\n const baseDir = options.testFilePath ? path.dirname(options.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, executionContext.variables);\n const baseDir = options.testFilePath ? path.dirname(options.testFilePath) : process.cwd();\n const absPath = path.isAbsolute(resolvedHandler) ? resolvedHandler : path.resolve(baseDir, resolvedHandler);\n // Match cleanup loader pattern: prefer .js sibling if a .ts path is given and the .js exists\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: executionContext.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 sizeResults.push({ action, status: 'passed' });\n options.onStepComplete?.(sizeResults[sizeResults.length - 1], index, test.steps.length);\n const trackedPayload = buildTrackPayload(action, index);\n if (trackedPayload) {\n await trackResource(trackedPayload);\n }\n } catch (e) {\n const errMsg = e instanceof Error ? e.message : String(e);\n sizeResults.push({ action, status: 'failed', error: errMsg });\n options.onStepComplete?.(sizeResults[sizeResults.length - 1], index, test.steps.length);\n throw e;\n }\n continue;\n }\n\n // Use the new executeActionWithRetry for all other actions\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 });\n\n sizeResults.push({ action, status: 'passed', logOutput: actionExtras.logOutput });\n options.onStepComplete?.(sizeResults[sizeResults.length - 1], index, test.steps.length);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n sizeResults.push({ action, status: 'failed', error: message });\n options.onStepComplete?.(sizeResults[sizeResults.length - 1], index, test.steps.length);\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","import type { Action, Locator } from '../core/types';\nimport type { AIConfig } from './types';\nimport { createAIProvider } 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\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 ? `wait for element (${formatLocator(action.target)})` : `wait ${action.timeout}ms`;\n case 'scroll':\n return action.target ? `scroll to element (${formatLocator(action.target)})` : `scroll ${action.direction || 'down'}`;\n case 'evaluate': {\n const evaluateAction = action as Extract<Action, { type: 'evaluate' }>;\n return `evaluate page state (expected: ${Array.isArray(evaluateAction.expected) ? evaluateAction.expected.join(', ') : evaluateAction.expected})`;\n }\n default:\n return action.type;\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 try {\n const provider = createAIProvider(aiConfig);\n\n const systemPrompt = `You are an expert at analyzing web automation errors and suggesting better element selectors.\nYour task is to analyze failed actions and suggest better selectors based on the page content and error message.\n\nReturn your response in the following JSON format:\n{\n \"hasSuggestion\": boolean,\n \"suggestedSelector\": {\n \"testId\": \"string (optional)\",\n \"text\": \"string (optional)\",\n \"css\": \"string (optional)\",\n \"role\": \"string (optional)\",\n \"name\": \"string (optional)\"\n },\n \"explanation\": \"string explaining why this selector is better\"\n}\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.`;\n\n const prompt = `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\nPlease analyze the error and suggest a better selector that would work reliably. Focus on:\n- What went wrong with the current selector\n- What selector would be more reliable\n- Why the suggested selector is better\n\nReturn ONLY valid JSON, no additional text.`;\n\n const response = await provider.generateCompletion(prompt, systemPrompt);\n\n // Extract JSON from response (in case AI returns markdown code blocks)\n let jsonStr = response.trim();\n if (jsonStr.startsWith('```json')) {\n jsonStr = jsonStr.replace(/^```json\\s*/, '').replace(/\\s*```$/, '');\n } else if (jsonStr.startsWith('```')) {\n jsonStr = jsonStr.replace(/^```\\s*/, '').replace(/\\s*```$/, '');\n }\n\n const parsed = JSON.parse(jsonStr) as ErrorSuggestion;\n return parsed;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n hasSuggestion: false,\n explanation: `Failed to generate AI suggestion: ${message}`,\n };\n }\n}\n","import { Anthropic } from '@llamaindex/anthropic';\nimport { OpenAI } from '@llamaindex/openai';\nimport { Ollama } from '@llamaindex/ollama';\nimport type { AIConfig, AIProvider } from './types';\nimport type { ChatMessage } from 'llamaindex';\n\nfunction resolveEnvVars(value: string): string {\n return value.replace(/\\$\\{(\\w+)\\}/g, (_, name) => process.env[name] || '');\n}\n\nclass AnthropicProvider implements AIProvider {\n private client: Anthropic;\n private config: AIConfig;\n\n constructor(config: AIConfig) {\n this.config = config;\n const apiKey = config.apiKey ? resolveEnvVars(config.apiKey) : undefined;\n this.client = new Anthropic({\n apiKey,\n model: this.config.model,\n temperature: this.config.temperature,\n });\n }\n\n async generateCompletion(prompt: string, systemPrompt?: string): Promise<string> {\n const messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }> = [];\n\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt });\n }\n messages.push({ role: 'user', content: prompt });\n\n const response = await this.client.chat({ messages });\n\n const content = response.message.content;\n if (!content) {\n throw new Error('No content in Anthropic response');\n }\n return typeof content === 'string' ? content : JSON.stringify(content);\n }\n\n async generateVisionCompletion(\n prompt: string,\n imageBase64: string,\n imageMimeType: string,\n systemPrompt?: string,\n ): Promise<string> {\n const messages: ChatMessage[] = [];\n\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt });\n }\n\n messages.push({\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: `data:${imageMimeType};base64,${imageBase64}`,\n },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n });\n\n const response = await this.client.chat({ messages });\n\n const content = response.message.content;\n if (!content) {\n throw new Error('No content in Anthropic response');\n }\n return typeof content === 'string' ? content : JSON.stringify(content);\n }\n}\n\nclass OpenAIProvider implements AIProvider {\n private client: OpenAI;\n private config: AIConfig;\n\n constructor(config: AIConfig) {\n this.config = config;\n const apiKey = config.apiKey ? resolveEnvVars(config.apiKey) : undefined;\n const baseURL = config.baseUrl;\n this.client = new OpenAI({\n apiKey,\n model: this.config.model,\n temperature: this.config.temperature,\n baseURL,\n });\n }\n\n async generateCompletion(prompt: string, systemPrompt?: string): Promise<string> {\n const messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }> = [];\n\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt });\n }\n messages.push({ role: 'user', content: prompt });\n\n const response = await this.client.chat({ messages });\n\n const content = response.message.content;\n if (!content) {\n throw new Error('No content in OpenAI response');\n }\n return typeof content === 'string' ? content : JSON.stringify(content);\n }\n\n async generateVisionCompletion(\n prompt: string,\n imageBase64: string,\n imageMimeType: string,\n systemPrompt?: string,\n ): Promise<string> {\n const messages: ChatMessage[] = [];\n\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt });\n }\n\n messages.push({\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: `data:${imageMimeType};base64,${imageBase64}`,\n },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n });\n\n const response = await this.client.chat({ messages });\n\n const content = response.message.content;\n if (!content) {\n throw new Error('No content in OpenAI response');\n }\n return typeof content === 'string' ? content : JSON.stringify(content);\n }\n}\n\nclass OllamaProvider implements AIProvider {\n private client: Ollama;\n private config: AIConfig;\n\n constructor(config: AIConfig) {\n this.config = config;\n this.client = new Ollama({\n model: this.config.model,\n options: {\n temperature: this.config.temperature,\n },\n });\n }\n\n async generateCompletion(prompt: string, systemPrompt?: string): Promise<string> {\n const messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }> = [];\n\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt });\n }\n messages.push({ role: 'user', content: prompt });\n\n const response = await this.client.chat({ messages });\n\n const content = response.message.content;\n if (!content) {\n throw new Error('No content in Ollama response');\n }\n return typeof content === 'string' ? content : JSON.stringify(content);\n }\n\n async generateVisionCompletion(\n prompt: string,\n imageBase64: string,\n imageMimeType: string,\n systemPrompt?: string,\n ): Promise<string> {\n const messages: ChatMessage[] = [];\n\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt });\n }\n\n messages.push({\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: `data:${imageMimeType};base64,${imageBase64}`,\n },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n });\n\n const response = await this.client.chat({ messages });\n\n const content = response.message.content;\n if (!content) {\n throw new Error('No content in Ollama response');\n }\n return typeof content === 'string' ? content : JSON.stringify(content);\n }\n}\n\nclass GroqProvider implements AIProvider {\n private client: OpenAI;\n private config: AIConfig;\n\n constructor(config: AIConfig) {\n this.config = config;\n const apiKey = config.apiKey ? resolveEnvVars(config.apiKey) : process.env.GROQ_API_KEY;\n this.client = new OpenAI({\n apiKey,\n model: this.config.model,\n temperature: this.config.temperature,\n baseURL: 'https://api.groq.com/openai/v1',\n });\n }\n\n async generateCompletion(prompt: string, systemPrompt?: string): Promise<string> {\n const messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }> = [];\n\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt });\n }\n messages.push({ role: 'user', content: prompt });\n\n const response = await this.client.chat({ messages });\n\n const content = response.message.content;\n if (!content) {\n throw new Error('No content in GROQ response');\n }\n return typeof content === 'string' ? content : JSON.stringify(content);\n }\n\n async generateVisionCompletion(\n prompt: string,\n imageBase64: string,\n imageMimeType: string,\n systemPrompt?: string,\n ): Promise<string> {\n const messages: ChatMessage[] = [];\n\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt });\n }\n\n messages.push({\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: `data:${imageMimeType};base64,${imageBase64}`,\n },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n });\n\n const response = await this.client.chat({ messages });\n\n const content = response.message.content;\n if (!content) {\n throw new Error('No content in GROQ response');\n }\n return typeof content === 'string' ? content : JSON.stringify(content);\n }\n}\n\nclass OpenRouterProvider implements AIProvider {\n private client: OpenAI;\n private config: AIConfig;\n\n constructor(config: AIConfig) {\n this.config = config;\n const apiKey = config.apiKey ? resolveEnvVars(config.apiKey) : process.env.OPENROUTER_API_KEY;\n this.client = new OpenAI({\n apiKey,\n model: this.config.model,\n temperature: this.config.temperature,\n baseURL: 'https://openrouter.ai/api/v1',\n });\n }\n\n async generateCompletion(prompt: string, systemPrompt?: string): Promise<string> {\n const messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }> = [];\n\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt });\n }\n messages.push({ role: 'user', content: prompt });\n\n const response = await this.client.chat({ messages });\n\n const content = response.message.content;\n if (!content) {\n throw new Error('No content in OpenRouter response');\n }\n return typeof content === 'string' ? content : JSON.stringify(content);\n }\n\n async generateVisionCompletion(\n prompt: string,\n imageBase64: string,\n imageMimeType: string,\n systemPrompt?: string,\n ): Promise<string> {\n const messages: ChatMessage[] = [];\n\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt });\n }\n\n messages.push({\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: `data:${imageMimeType};base64,${imageBase64}`,\n },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n });\n\n const response = await this.client.chat({ messages });\n\n const content = response.message.content;\n if (!content) {\n throw new Error('No content in OpenRouter response');\n }\n return typeof content === 'string' ? content : JSON.stringify(content);\n }\n}\n\nexport function createAIProvider(config: AIConfig): AIProvider {\n switch (config.provider) {\n case 'anthropic':\n return new AnthropicProvider(config);\n case 'openai':\n return new OpenAIProvider(config);\n case 'ollama':\n return new OllamaProvider(config);\n case 'groq':\n return new GroqProvider(config);\n case 'openrouter':\n return new OpenRouterProvider(config);\n }\n}\n","import type { Page } from 'playwright';\nimport type { Action, Locator } from '../core/types';\nimport type { AIConfig } from './types';\nimport { createAIProvider } from './provider';\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\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(page: Page, role: string, name?: string): Promise<SelectorCheckResult> {\n try {\n const locator = page.getByRole(role as Parameters<Page['getByRole']>[0], name ? { name } : undefined);\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}\"], #${CSS.escape(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\nfunction extractLocatorFromResponse(response: string): Locator | null {\n // Try to extract JSON from the response\n const jsonMatch = response.match(/\\{[\\s\\S]*?\"(?:testId|text|css|role)\"[\\s\\S]*?\\}/);\n if (!jsonMatch) return null;\n\n try {\n const parsed = JSON.parse(jsonMatch[0]);\n if (parsed.testId || parsed.text || parsed.css || parsed.role) {\n return parsed as Locator;\n }\n } catch {\n // Try to extract from code blocks\n const codeMatch = response.match(/```(?:json)?\\s*(\\{[\\s\\S]*?\\})\\s*```/);\n if (codeMatch) {\n try {\n const parsed = JSON.parse(codeMatch[1]);\n if (parsed.testId || parsed.text || parsed.css || parsed.role) {\n return parsed as Locator;\n }\n } catch {\n // Fallback patterns\n }\n }\n }\n\n // Fallback: Try to extract specific selector patterns\n const cssMatch = response.match(/css['\":\\s]+['\"]([^'\"]+)['\"]/i);\n if (cssMatch) return { css: cssMatch[1] };\n\n const textMatch = response.match(/text['\":\\s]+['\"]([^'\"]+)['\"]/i);\n if (textMatch) return { text: textMatch[1] };\n\n const testIdMatch = response.match(/testId['\":\\s]+['\"]([^'\"]+)['\"]/i);\n if (testIdMatch) return { testId: testIdMatch[1] };\n\n return null;\n}\n\nexport async function runHealingAgent(\n context: HealingContext,\n aiConfig: AIConfig,\n maxAttempts: number = 3,\n): Promise<HealingResult> {\n const provider = createAIProvider(aiConfig);\n\n // Get current target info from action\n const currentTarget = 'target' in context.action ? context.action.target : null;\n\n const systemPrompt = `You are debugging a failing web test action. Your goal is to analyze the page and suggest a working selector.\n\nWhen suggesting a selector, respond with a JSON object containing ONE of these fields:\n- testId: for data-testid attributes (most reliable)\n- text: for visible text content\n- css: for CSS selectors\n- role: for ARIA roles (with optional \"name\" field)\n\nExample responses:\n{\"testId\": \"submit-button\"}\n{\"text\": \"Sign In\"}\n{\"css\": \"button.primary\"}\n{\"role\": \"button\", \"name\": \"Submit\"}\n\nPrefer selectors in this order of reliability:\n1. testId - most stable, unlikely to change\n2. text - good for buttons, links\n3. role + name - good for accessible elements\n4. css - last resort, more brittle\n\nRespond ONLY with the JSON selector object, no other text.`;\n\n let attempts = 0;\n let lastExplanation = '';\n\n while (attempts < maxAttempts) {\n attempts++;\n\n // Build context with validation results\n const validationResults: string[] = [];\n\n // If we have a current target, check what's wrong with it\n if (currentTarget) {\n if (currentTarget.testId) {\n const result = await checkTestId(context.page, currentTarget.testId);\n validationResults.push(`testId \"${currentTarget.testId}\": ${result.found ? `found ${result.count} elements` : 'NOT FOUND'}`);\n }\n if (currentTarget.text) {\n const result = await checkByText(context.page, currentTarget.text);\n validationResults.push(`text \"${currentTarget.text}\": ${result.found ? `found ${result.count} elements` : 'NOT FOUND'}`);\n }\n if (currentTarget.css) {\n const result = await checkSelector(context.page, currentTarget.css);\n validationResults.push(`css \"${currentTarget.css}\": ${result.found ? `found ${result.count} elements` : 'NOT FOUND'}`);\n }\n if (currentTarget.role) {\n const result = await checkByRole(context.page, currentTarget.role, currentTarget.name);\n validationResults.push(`role \"${currentTarget.role}\"${currentTarget.name ? ` name=\"${currentTarget.name}\"` : ''}: ${result.found ? `found ${result.count} elements` : 'NOT FOUND'}`);\n }\n }\n\n const prompt = `Action type: ${context.action.type}\nError: ${context.error}\n\nFailed selector: ${JSON.stringify(currentTarget)}\n\nValidation results:\n${validationResults.length > 0 ? validationResults.join('\\n') : 'No current selector to validate'}\n\nPage HTML (first 6000 chars):\n${context.pageContent.slice(0, 6000)}\n\nBased on the page content, suggest a working selector for this action. Respond with a JSON object.`;\n\n try {\n const response = await provider.generateCompletion(prompt, systemPrompt);\n const suggestedLocator = extractLocatorFromResponse(response);\n\n if (!suggestedLocator) {\n lastExplanation = `Attempt ${attempts}: Could not parse selector from AI response`;\n continue;\n }\n\n // Validate the suggested selector\n let isValid = false;\n if (suggestedLocator.testId) {\n const result = await checkTestId(context.page, suggestedLocator.testId);\n isValid = result.found;\n } else if (suggestedLocator.text) {\n const result = await checkByText(context.page, suggestedLocator.text);\n isValid = result.found;\n } else if (suggestedLocator.css) {\n const result = await checkSelector(context.page, suggestedLocator.css);\n isValid = result.found;\n } else if (suggestedLocator.role) {\n const result = await checkByRole(context.page, suggestedLocator.role, suggestedLocator.name);\n isValid = result.found;\n }\n\n if (isValid) {\n // Create fixed action with new locator\n const fixedAction = { ...context.action } as Action & { target: Locator };\n if ('target' in fixedAction) {\n fixedAction.target = suggestedLocator;\n }\n\n return {\n success: true,\n fixedAction: fixedAction as Action,\n attempts,\n explanation: `Found working selector: ${JSON.stringify(suggestedLocator)}`,\n };\n }\n\n lastExplanation = `Attempt ${attempts}: Suggested selector ${JSON.stringify(suggestedLocator)} did not find any elements`;\n } catch (e) {\n lastExplanation = `Attempt ${attempts}: AI error - ${e instanceof Error ? e.message : String(e)}`;\n }\n }\n\n return {\n success: false,\n attempts,\n explanation: lastExplanation || 'Could not find a working selector within the allowed attempts',\n };\n}\n","import { spawn, type ChildProcess } from 'child_process';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { rmSync } from 'fs';\n\nexport interface WebServerConfig {\n url: string;\n command?: string;\n auto?: boolean;\n static?: string;\n port?: number;\n workdir?: string;\n cwd?: string;\n reuseExistingServer?: boolean;\n timeout?: number;\n idleTimeout?: number;\n}\n\n// Marker file constants and helpers for server ownership tracking\nconst SERVER_MARKER_FILE = 'server.json';\nconst INTELLITESTER_DIR = '.intellitester';\n\ninterface ServerMarker {\n pid: number;\n port: number;\n url: string;\n cwd: string;\n command: string;\n startTime: string;\n}\n\nconst getMarkerPath = (cwd: string): string => path.join(cwd, INTELLITESTER_DIR, SERVER_MARKER_FILE);\n\nasync function writeMarkerFile(cwd: string, marker: ServerMarker): Promise<void> {\n const dir = path.join(cwd, INTELLITESTER_DIR);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(getMarkerPath(cwd), JSON.stringify(marker, null, 2), 'utf-8');\n}\n\nasync function readMarkerFile(cwd: string): Promise<ServerMarker | null> {\n try {\n const content = await fs.readFile(getMarkerPath(cwd), 'utf-8');\n return JSON.parse(content) as ServerMarker;\n } catch {\n return null;\n }\n}\n\nasync function deleteMarkerFile(cwd: string): Promise<void> {\n try {\n await fs.rm(getMarkerPath(cwd), { force: true });\n } catch {\n // Ignore errors\n }\n}\n\nfunction deleteMarkerFileSync(cwd: string): void {\n try {\n rmSync(getMarkerPath(cwd), { force: true });\n } catch {\n // Ignore errors\n }\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0); // Signal 0 just checks if process exists\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\nasync function verifyMarker(cwd: string, url: string): Promise<{ valid: boolean; marker: ServerMarker | null; reason?: string }> {\n const marker = await readMarkerFile(cwd);\n if (!marker) {\n return { valid: false, marker: null, reason: 'No marker file found' };\n }\n \n if (marker.url !== url) {\n return { valid: false, marker, reason: `URL mismatch: expected ${url}, got ${marker.url}` };\n }\n \n if (marker.cwd !== cwd) {\n return { valid: false, marker, reason: `CWD mismatch: expected ${cwd}, got ${marker.cwd}` };\n }\n \n if (!isPidAlive(marker.pid)) {\n return { valid: false, marker, reason: `PID ${marker.pid} is not alive` };\n }\n \n // Verify the server is actually responding (with retries)\n let serverResponding = false;\n for (let i = 0; i < 3; i++) {\n if (await isServerRunning(url)) {\n serverResponding = true;\n break;\n }\n await new Promise(r => setTimeout(r, 500));\n }\n if (!serverResponding) {\n return { valid: false, marker, reason: 'Server not responding to HTTP after retries' };\n }\n \n return { valid: true, marker };\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\n const deps = { ...(pkg.dependencies as Record<string, string> || {}), ...(pkg.devDependencies as Record<string, string> || {}) };\n\n if (deps['next']) {\n return { name: 'next', buildCommand: 'npx -y next start', devCommand: 'next dev' };\n }\n if (deps['nuxt']) {\n return { name: 'nuxt', buildCommand: 'node .output/server/index.mjs', devCommand: 'nuxi dev' };\n }\n if (deps['astro']) {\n return { name: 'astro', buildCommand: 'npx -y astro dev', devCommand: 'astro dev' };\n }\n if (deps['@sveltejs/kit']) {\n return { name: 'sveltekit', buildCommand: 'npx -y vite preview', devCommand: 'vite dev' };\n }\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']) {\n return { name: 'vite', buildCommand: 'npx -y vite preview', devCommand: 'vite dev' };\n }\n if (deps['react-scripts']) {\n return { name: 'cra', buildCommand: 'npx -y serve -s build', devCommand: 'react-scripts start' };\n }\n\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\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 = [\n '.next', '.output', '.svelte-kit', 'dist', 'build', 'out',\n ];\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()) {\n return dir;\n }\n } catch {\n // Directory doesn't exist, 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\n if (buildDir) {\n if (framework) {\n console.log(`Detected ${framework.name} project with build at ${buildDir}`);\n return framework.buildCommand;\n }\n console.log(`Detected build directory at ${buildDir}, using static server`);\n return `npx -y serve ${buildDir}`;\n }\n\n const scripts = pkg?.scripts as Record<string, string> | undefined;\n if (scripts?.dev) {\n if (framework) {\n console.log(`Detected ${framework.name} project, running dev server`);\n }\n return getDevCommand(pm, 'dev');\n }\n\n if (scripts?.start) {\n return getDevCommand(pm, 'start');\n }\n\n throw new Error('Could not auto-detect server command. Please specify command explicitly.');\n}\n\n/**\n * Singleton manager for web server lifecycle.\n *\n * Handles starting/stopping the dev server with proper cleanup to avoid\n * race conditions where a dying server responds to health checks but is\n * gone by the time tests run.\n */\nclass WebServerManager {\n private static instance: WebServerManager;\n\n private serverProcess: ChildProcess | null = null;\n private currentUrl: string | null = null;\n private currentCwd: string | null = null;\n private stopping: boolean = 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 /**\n * Check if the managed server is currently running\n */\n isRunning(): boolean {\n return this.serverProcess !== null && !this.serverProcess.killed;\n }\n\n /**\n * Get the current server URL if running\n */\n getUrl(): string | null {\n return this.currentUrl;\n }\n\n /**\n * Start a web server with the given config.\n *\n * - If a server is already running at the same URL, reuses it (unless reuseExistingServer=false)\n * - If a server is running at a different URL, stops it first\n * - Properly waits for any stopping server to fully terminate\n */\n async start(config: WebServerConfig): Promise<ChildProcess | null> {\n const { url, reuseExistingServer = true, timeout = 30000, idleTimeout = 20000 } = config;\n const cwd = config.workdir ?? config.cwd ?? process.cwd();\n\n // Wait for any in-progress stop operation\n while (this.stopping) {\n await new Promise(r => setTimeout(r, 100));\n }\n\n // Check if we already have a server running at this URL\n if (this.serverProcess && !this.serverProcess.killed && this.currentUrl === url) {\n // Verify it's actually responding\n if (await isServerRunning(url)) {\n if (reuseExistingServer) {\n console.log(`Server already running at ${url}`);\n return this.serverProcess;\n } else {\n // Need to restart - stop first\n await this.stop();\n }\n } else {\n // Process exists but not responding - clean it up\n await this.stop();\n }\n }\n\n // If we have a server at a different URL, stop it\n if (this.serverProcess && !this.serverProcess.killed && this.currentUrl !== url) {\n await this.stop();\n }\n\n // Check if we have a valid marker for a server we previously started\n const verification = await verifyMarker(cwd, url);\n if (verification.valid && reuseExistingServer) {\n // Wait a moment to ensure server is fully ready\n await new Promise(r => setTimeout(r, 1000));\n // Double-check it's still responding\n if (!await isServerRunning(url)) {\n console.log('Server stopped responding, will start fresh');\n } else {\n console.log(`Reusing existing server at ${url} (PID: ${verification.marker!.pid})`);\n this.currentUrl = url;\n this.currentCwd = cwd;\n return null;\n }\n }\n\n // If marker exists but invalid, clean up the orphaned server\n if (verification.marker && !verification.valid) {\n console.log(`Cleaning up stale server: ${verification.reason}`);\n if (isPidAlive(verification.marker.pid)) {\n try {\n process.kill(verification.marker.pid, 'SIGTERM');\n // Wait a bit for graceful shutdown\n await new Promise(r => setTimeout(r, 1000));\n if (isPidAlive(verification.marker.pid)) {\n process.kill(verification.marker.pid, 'SIGKILL');\n }\n } catch {\n // Process might already be dead\n }\n }\n await deleteMarkerFile(cwd);\n }\n\n // If something else is running at this URL (not ours), handle it\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 console.log(`Reusing existing server at ${url}`);\n return null; // Return null to indicate we're reusing an external server\n }\n\n // Determine the command to run\n let command: string;\n\n if (config.command) {\n command = config.command;\n } else if (config.static) {\n const port = config.port ?? new URL(url).port ?? '3000';\n command = `npx -y serve ${config.static} -l ${port}`;\n } else if (config.auto) {\n command = await detectServerCommand(cwd);\n } else {\n throw new Error('WebServerConfig requires command, auto: true, or static directory');\n }\n\n console.log(`Starting server: ${command}`);\n this.serverProcess = spawn(command, {\n shell: true,\n stdio: 'pipe',\n cwd,\n detached: true, // Create new process group so we can kill all children\n });\n this.currentUrl = url;\n this.currentCwd = cwd;\n\n let stderrOutput = '';\n let lastOutputTime = Date.now();\n\n this.serverProcess.stdout?.on('data', (data) => {\n lastOutputTime = Date.now();\n process.stdout.write(`[server] ${data}`);\n });\n\n this.serverProcess.stderr?.on('data', (data) => {\n lastOutputTime = Date.now();\n stderrOutput += data.toString();\n process.stderr.write(`[server] ${data}`);\n });\n\n // Delete marker if server exits unexpectedly\n this.serverProcess.on('exit', () => {\n if (this.currentCwd) {\n deleteMarkerFileSync(this.currentCwd);\n }\n });\n\n // Wait for server to be ready\n await new Promise<void>((resolve, reject) => {\n let resolved = false;\n const startTime = Date.now();\n\n const cleanup = () => {\n resolved = true;\n clearInterval(pollInterval);\n };\n\n this.serverProcess!.on('close', (code) => {\n if (!resolved && code !== 0 && code !== null) {\n cleanup();\n this.serverProcess = null;\n this.currentUrl = null;\n reject(new Error(`Server exited with code ${code}\\n${stderrOutput}`));\n }\n });\n\n this.serverProcess!.on('error', (err) => {\n if (!resolved) {\n cleanup();\n this.serverProcess = null;\n this.currentUrl = null;\n reject(err);\n }\n });\n\n const pollInterval = setInterval(async () => {\n if (resolved) return;\n\n if (await isServerRunning(url)) {\n cleanup();\n resolve();\n return;\n }\n\n if (Date.now() - startTime > timeout) {\n cleanup();\n reject(new Error(`Server at ${url} not ready after ${timeout}ms`));\n return;\n }\n\n if (Date.now() - lastOutputTime > idleTimeout) {\n cleanup();\n this.serverProcess?.kill('SIGTERM');\n this.serverProcess = null;\n this.currentUrl = null;\n const lastOutput = stderrOutput.slice(-500);\n reject(new Error(`Server stalled - no output for ${idleTimeout}ms. Last output:\\n${lastOutput}`));\n return;\n }\n }, 500);\n });\n\n console.log(`Server ready at ${url}`);\n\n // Write marker file for future reuse verification\n if (this.serverProcess?.pid) {\n await writeMarkerFile(cwd, {\n pid: this.serverProcess.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 this.serverProcess;\n }\n\n /**\n * Stop the managed server and wait for it to fully terminate.\n * This prevents race conditions where a dying server still responds to health checks.\n */\n async stop(): Promise<void> {\n if (!this.serverProcess || this.serverProcess.killed) {\n this.serverProcess = null;\n this.currentUrl = null;\n this.currentCwd = null;\n return;\n }\n\n this.stopping = true;\n console.log('Stopping server...');\n\n const process = this.serverProcess;\n\n // Create a promise that resolves when the process actually exits\n const exitPromise = new Promise<void>((resolve) => {\n const onExit = () => {\n process.removeListener('close', onExit);\n process.removeListener('exit', onExit);\n resolve();\n };\n process.on('close', onExit);\n process.on('exit', onExit);\n\n // Also resolve if already dead\n if (process.killed || process.exitCode !== null) {\n resolve();\n }\n });\n\n // Send SIGTERM to process group (negative PID) to kill children too\n const pid = process.pid;\n try {\n if (pid) {\n globalThis.process.kill(-pid, 'SIGTERM');\n } else {\n process.kill('SIGTERM');\n }\n } catch {\n process.kill('SIGTERM');\n }\n\n // Wait for exit with a timeout\n const timeoutPromise = new Promise<void>((resolve) => {\n setTimeout(() => {\n // If still alive after 5 seconds, force kill\n if (!process.killed && process.exitCode === null) {\n console.log('Server did not stop gracefully, sending SIGKILL...');\n try {\n if (pid) {\n globalThis.process.kill(-pid, 'SIGKILL');\n } else {\n process.kill('SIGKILL');\n }\n } catch {\n process.kill('SIGKILL');\n }\n }\n resolve();\n }, 5000);\n });\n\n await Promise.race([exitPromise, timeoutPromise]);\n\n // Wait a bit more to ensure port is released\n await new Promise(r => setTimeout(r, 200));\n\n // Delete marker file before clearing state\n if (this.currentCwd) {\n await deleteMarkerFile(this.currentCwd);\n }\n\n this.serverProcess = null;\n this.currentUrl = null;\n this.currentCwd = null;\n this.stopping = false;\n }\n\n /**\n * Synchronous kill for signal handlers - kills process group to ensure children die too\n */\n kill(): void {\n if (this.serverProcess && !this.serverProcess.killed) {\n console.log('Stopping server...');\n const pid = this.serverProcess.pid;\n if (pid) {\n try {\n // Kill the entire process group (negative PID) to kill shell children too\n process.kill(-pid, 'SIGTERM');\n } catch {\n // Fallback to regular kill if process group kill fails\n this.serverProcess.kill('SIGTERM');\n }\n // Also send SIGKILL after a short delay to force termination\n setTimeout(() => {\n try {\n if (pid) process.kill(-pid, 'SIGKILL');\n } catch {\n // Process already dead, ignore\n }\n }, 1000);\n } else {\n this.serverProcess.kill('SIGTERM');\n }\n }\n // Delete marker file synchronously for signal handlers\n if (this.currentCwd) {\n deleteMarkerFileSync(this.currentCwd);\n }\n this.serverProcess = null;\n this.currentUrl = null;\n this.currentCwd = null;\n }\n}\n\n// Export singleton instance\nexport const webServerManager = WebServerManager.getInstance();\n\nexport { isServerRunning };\n","import { createWorker, type Worker, type RecognizeResult } from 'tesseract.js';\nimport { z } from 'zod';\nimport type { AIConfig } from './types';\nimport { createAIProvider } 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\n// Lazy singleton OCR worker\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\n return {\n text: result.data.text,\n confidence: result.data.confidence,\n };\n}\n\nfunction matchExpected(\n text: string,\n expectedArray: string[],\n useRegex: boolean,\n): MatchResult {\n const matched: string[] = [];\n const missing: string[] = [];\n\n for (const expected of expectedArray) {\n let found = false;\n\n if (useRegex) {\n try {\n const regex = new RegExp(expected, 'i');\n found = regex.test(text);\n } catch (e) {\n // Invalid regex, treat as literal string\n found = text.toLowerCase().includes(expected.toLowerCase());\n }\n } else {\n found = text.toLowerCase().includes(expected.toLowerCase());\n }\n\n if (found) {\n matched.push(expected);\n } else {\n missing.push(expected);\n }\n }\n\n return {\n allMatched: missing.length === 0,\n matched,\n missing,\n };\n}\n\n// Zod schema for AI evaluation response\nconst AIEvaluationResponseSchema = z.object({\n passed: z.boolean(),\n reason: z.string(),\n});\n\nfunction extractJSONFromResponse(response: string): unknown {\n // Try to extract JSON from markdown code blocks\n const codeMatch = response.match(/```(?:json)?\\s*(\\{[\\s\\S]*?\\})\\s*```/);\n if (codeMatch) {\n try {\n return JSON.parse(codeMatch[1]);\n } catch {\n // Continue to fallback\n }\n }\n\n // Try to find raw JSON in the response\n const jsonMatch = response.match(/\\{[\\s\\S]*?\"passed\"[\\s\\S]*?\\}/);\n if (jsonMatch) {\n try {\n return JSON.parse(jsonMatch[0]);\n } catch {\n // Continue to fallback\n }\n }\n\n // Last resort: try to parse the entire response as JSON\n try {\n return JSON.parse(response);\n } catch {\n throw new Error('Could not extract valid JSON from AI response');\n }\n}\n\nasync function runAIEvaluation(\n screenshotBuffer: Buffer,\n expectedArray: string[],\n customPrompt?: string,\n aiConfig?: AIConfig,\n): Promise<{ passed: boolean; reason: string }> {\n if (!aiConfig) {\n throw new Error('AI configuration is required for AI evaluation mode');\n }\n\n const provider = createAIProvider(aiConfig);\n\n if (!provider.generateVisionCompletion) {\n throw new Error(\n `AI provider \"${aiConfig.provider}\" does not support vision completion. ` +\n 'Please use a provider with vision capabilities (e.g., anthropic, openai) or switch to OCR mode.',\n );\n }\n\n const systemPrompt = `You are evaluating a screenshot against expected content or conditions.\nAnalyze the image and determine if it matches the criteria.\n\nIMPORTANT: Respond ONLY with a JSON object in this exact format:\n{\"passed\": true, \"reason\": \"explanation\"}\nor\n{\"passed\": false, \"reason\": \"explanation\"}\n\nDo not include any other text, markdown formatting, or explanations outside the JSON object.`;\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?\nRespond with a JSON object containing \"passed\" (boolean) and \"reason\" (string explaining your decision).`;\n\n const prompt = customPrompt || defaultPrompt;\n const imageBase64 = screenshotBuffer.toString('base64');\n const imageMimeType = 'image/png';\n\n const response = await provider.generateVisionCompletion(\n prompt,\n imageBase64,\n imageMimeType,\n systemPrompt,\n );\n\n // Extract and validate JSON response\n let parsedResponse: unknown;\n try {\n parsedResponse = extractJSONFromResponse(response);\n } catch (e) {\n throw new Error(\n `Failed to parse AI response: ${e instanceof Error ? e.message : String(e)}. Response: ${response}`,\n );\n }\n\n const validated = AIEvaluationResponseSchema.parse(parsedResponse);\n return validated;\n}\n\nexport async function evaluate(options: EvaluateOptions): Promise<EvaluateResult> {\n const expectedArray = Array.isArray(options.expected)\n ? options.expected\n : [options.expected];\n\n // Track OCR failure reason for clear error messages\n let ocrFailReason: string | undefined;\n\n // Mode: OCR or auto (try OCR first)\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\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 // Build OCR failure reason\n ocrFailReason = 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 OCR mode only, return failure\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\n // Auto mode: OCR failed, will fall through to AI\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 // Auto mode: OCR failed, fall through to AI\n }\n }\n\n // Mode: AI or auto (fallback from OCR)\n if (options.mode === 'ai' || options.mode === 'auto') {\n if (!options.aiConfig) {\n // In auto mode, report the OCR failure + no AI config\n const reason = 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 // In auto mode, include what OCR found + why AI failed\n const aiError = e instanceof Error ? e.message : String(e);\n const reason = 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 // Should never reach here\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 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 Page,\n} from 'playwright';\n\nimport type { Action, 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 { resolveStorageStatePath } from './playwrightExecutor.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 { track as trackResource } from '../../integration/index.js';\nimport type { TrackedResource as IntegrationTrackedResource } from '../../integration/index.js';\nimport { type BrowserName, type StepResult } from './playwrightExecutor';\nimport { webServerManager, type WebServerConfig } 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 { evaluate, 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?: WebServerConfig;\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}\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 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 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 */\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\n // Import action execution functions from playwrightExecutor\n // For now, we'll duplicate the core action logic here\n // TODO: Refactor playwrightExecutor to export shared functions\n\n const 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\n // Use the centralized interpolation function with context variables\n const interpolate = (value: string): string => {\n return interpolateVariables(value, context.variables);\n };\n\n const resolveLocator = (locator: any) => {\n if (locator.testId) return page.getByTestId(locator.testId);\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 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\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, 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 try {\n for (const [index, action] of test.steps.entries()) {\n if (debugMode) {\n console.log(` [DEBUG] Step ${index + 1}: ${action.type}`);\n }\n\n try {\n switch (action.type) {\n case 'navigate': {\n const interpolated = interpolate(action.value);\n const baseUrl = test.config?.web?.baseUrl || workflowBaseUrl;\n const target = resolveUrl(interpolated, baseUrl);\n if (debugMode) {\n console.log(` [DEBUG] Navigate step:`);\n console.log(` [DEBUG] - action.value: ${action.value}`);\n console.log(` [DEBUG] - interpolated: ${interpolated}`);\n console.log(` [DEBUG] - test.config?.web?.baseUrl: ${test.config?.web?.baseUrl ?? '(undefined)'}`);\n console.log(` [DEBUG] - workflowBaseUrl: ${workflowBaseUrl ?? '(undefined)'}`);\n console.log(` [DEBUG] - effective baseUrl: ${baseUrl ?? '(undefined)'}`);\n console.log(` [DEBUG] - target: ${target}`);\n }\n await page.goto(target);\n break;\n }\n case 'tap': {\n if (debugMode) console.log(` [DEBUG] Tapping element:`, action.target);\n const handle = resolveLocator(action.target);\n await handle.click();\n // Cascading wait: domcontentloaded first (reliable), then networkidle (handles SPAs)\n await page.waitForLoadState('domcontentloaded').catch(() => {});\n await page.waitForLoadState('networkidle', { timeout: 10000 }).catch(() => {\n // Timeout is fine - proceed anyway since DOM is ready\n });\n break;\n }\n case 'input': {\n const interpolated = interpolate(action.value);\n if (debugMode) console.log(` [DEBUG] Input: ${interpolated}`);\n const handle = resolveLocator(action.target);\n await handle.fill(interpolated);\n break;\n }\n case 'clear': {\n if (debugMode) console.log(` [DEBUG] Clearing element:`, action.target);\n const handle = resolveLocator(action.target);\n await handle.clear();\n break;\n }\n case 'hover': {\n if (debugMode) console.log(` [DEBUG] Hovering element:`, action.target);\n const handle = resolveLocator(action.target);\n await handle.hover();\n break;\n }\n case 'select': {\n const interpolated = interpolate(action.value);\n if (debugMode) console.log(` [DEBUG] Selecting: ${interpolated}`);\n const handle = resolveLocator(action.target);\n await handle.selectOption(interpolated);\n break;\n }\n case 'check': {\n if (debugMode) console.log(` [DEBUG] Checking:`, action.target);\n const handle = resolveLocator(action.target);\n await handle.check();\n break;\n }\n case 'uncheck': {\n if (debugMode) console.log(` [DEBUG] Unchecking:`, action.target);\n const handle = resolveLocator(action.target);\n await handle.uncheck();\n break;\n }\n case 'press': {\n if (debugMode) console.log(` [DEBUG] Pressing key: ${action.key}`);\n if (action.target) {\n const handle = resolveLocator(action.target);\n await handle.press(action.key);\n } else {\n await page.keyboard.press(action.key);\n }\n break;\n }\n case 'focus': {\n if (debugMode) console.log(` [DEBUG] Focusing:`, action.target);\n const handle = resolveLocator(action.target);\n await handle.focus();\n break;\n }\n case 'assert': {\n if (debugMode) console.log(` [DEBUG] Assert:`, action.target);\n const handle = resolveLocator(action.target);\n await handle.waitFor({ state: 'visible' });\n if (action.value) {\n const interpolated = interpolate(action.value);\n const text = (await handle.textContent())?.trim() ?? '';\n if (!text.includes(interpolated)) {\n throw new Error(\n `Assertion failed: expected \"${interpolated}\", got \"${text}\"`\n );\n }\n }\n break;\n }\n case 'wait': {\n if (action.target) {\n const handle = resolveLocator(action.target);\n await handle.waitFor({ state: 'visible', timeout: action.timeout });\n } else {\n await page.waitForTimeout(action.timeout ?? 1000);\n }\n break;\n }\n case 'scroll': {\n if (action.target) {\n const handle = resolveLocator(action.target);\n await handle.scrollIntoViewIfNeeded();\n } else {\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 break;\n }\n case 'screenshot': {\n const ssAction = action as Extract<Action, { type: 'screenshot' }>;\n // Cascading wait for page stability before screenshot\n await page.waitForLoadState('domcontentloaded').catch(() => {});\n await page.waitForLoadState('networkidle', { timeout: 5000 }).catch(() => {});\n const waitBefore = ssAction.waitBefore ?? 500;\n if (waitBefore > 0) {\n await page.waitForTimeout(waitBefore);\n }\n const filename = ssAction.name ?? `step-${index + 1}.png`;\n const filePath = path.join(screenshotDir, filename);\n await page.screenshot({ path: filePath, fullPage: true });\n results.push({ action, status: 'passed', screenshotPath: filePath });\n const trackedPayload = buildTrackPayload(action, index, { screenshotPath: filePath });\n if (trackedPayload) {\n await trackResource(trackedPayload);\n }\n continue;\n }\n case 'saveStorageState': {\n const saveAction = action as Extract<Action, { type: 'saveStorageState' }>;\n if (saveAction.path) {\n const resolvedPath = interpolate(saveAction.path);\n const baseDir = path.dirname(testFilePath);\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 = interpolate(saveAction.handler);\n const baseDir = path.dirname(testFilePath);\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 .ts (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 results.push({ action, status: 'passed' });\n const trackedPayload = buildTrackPayload(action, index);\n if (trackedPayload) {\n await trackResource(trackedPayload);\n }\n break;\n }\n case 'setVar': {\n let value: string;\n if (action.value) {\n value = interpolate(action.value);\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 if (debugMode) console.log(` [DEBUG] Set variable ${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 = interpolate(action.mailbox);\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 = interpolate(action.mailbox);\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 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 if (debugMode) console.log(` [DEBUG] 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 handle = resolveLocator(action.target);\n const timeout = action.timeout ?? 30000;\n\n if (debugMode) {\n console.log(` [DEBUG] Waiting for element to be ${action.state}:`, action.target);\n }\n\n const waitForCondition = async (\n checkFn: () => Promise<boolean>,\n timeoutMs: number,\n errorMessage: string,\n ): Promise<void> => {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (await checkFn()) return;\n await new Promise((r) => setTimeout(r, 100));\n }\n throw new Error(errorMessage);\n };\n\n switch (action.state) {\n case 'visible':\n case 'hidden':\n case 'attached':\n case 'detached':\n await handle.waitFor({ state: action.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 );\n break;\n case 'disabled':\n await waitForCondition(\n () => handle.isDisabled(),\n timeout,\n `Element did not become disabled within ${timeout}ms`,\n );\n break;\n }\n break;\n }\n case 'conditional': {\n const handle = resolveLocator(action.condition.target);\n let conditionMet = false;\n\n if (debugMode) {\n console.log(` [DEBUG] Checking condition ${action.condition.type}:`, action.condition.target);\n }\n\n try {\n switch (action.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 conditionMet = action.condition.type === 'notExists';\n }\n\n if (debugMode) {\n console.log(` [DEBUG] Condition result: ${conditionMet}`);\n }\n\n // Execute nested steps - recursive call to handle nested actions\n const stepsToRun = conditionMet ? action.then : (action.else ?? []);\n for (const nestedAction of stepsToRun) {\n // For nested actions, we need to execute them inline\n // This is a simplified version - complex nesting would require refactoring\n switch (nestedAction.type) {\n case 'screenshot': {\n // Cascading wait for page stability\n await page.waitForLoadState('domcontentloaded').catch(() => {});\n await page.waitForLoadState('networkidle', { timeout: 5000 }).catch(() => {});\n const filename = nestedAction.name ?? `conditional-step.png`;\n const filePath = path.join(screenshotDir, filename);\n await page.screenshot({ path: filePath, fullPage: true });\n results.push({ action: nestedAction, status: 'passed', screenshotPath: filePath });\n const trackedPayload = buildTrackPayload(nestedAction, index, { screenshotPath: filePath });\n if (trackedPayload) {\n await trackResource(trackedPayload);\n }\n break;\n }\n case 'evaluate':\n throw new Error('Evaluate action in nested context (conditional/waitForBranch) is not yet supported');\n case 'fail': {\n throw new Error(nestedAction.message);\n }\n default:\n throw new Error(`Nested action type ${nestedAction.type} in conditional not yet supported`);\n }\n }\n break;\n }\n case 'evaluate': {\n const evalAction = action as Extract<Action, { type: 'evaluate' }>;\n // Wait for visual stability\n await page.waitForLoadState('domcontentloaded').catch(() => {});\n await page.waitForLoadState('networkidle', { timeout: 5000 }).catch(() => {});\n const waitBefore = evalAction.waitBefore ?? 500;\n if (waitBefore > 0) {\n await page.waitForTimeout(waitBefore);\n }\n\n // Take screenshot\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 => interpolate(e))\n : [interpolate(expectedRaw)];\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 }\n\n if (!evalResult.passed) {\n throw new Error(`Evaluate failed (${evalResult.mode} mode): ${evalResult.reason}`);\n }\n\n results.push({\n action,\n status: 'passed',\n screenshotPath: evalScreenshotPath,\n logOutput: `Evaluate passed (${evalResult.mode}): ${evalResult.reason}`,\n });\n continue;\n }\n case 'fail': {\n throw new Error(action.message);\n }\n case 'waitForBranch': {\n const wfbAction = action as Extract<Action, { type: 'waitForBranch' }>;\n const handle = resolveLocator(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}:`, wfbAction.target);\n }\n\n // Poll for element state without throwing on timeout\n const startTime = Date.now();\n let elementAppeared = false;\n\n while (Date.now() - startTime < timeout) {\n try {\n let conditionMet = false;\n switch (state) {\n case 'visible':\n conditionMet = await handle.isVisible();\n break;\n case 'attached':\n conditionMet = (await handle.count()) > 0;\n break;\n case 'enabled':\n conditionMet = await handle.isEnabled().catch(() => false);\n break;\n }\n if (conditionMet) {\n elementAppeared = true;\n break;\n }\n } catch {\n // Element not found yet, continue polling\n }\n await new Promise((r) => setTimeout(r, pollInterval));\n }\n\n if (debugMode) {\n console.log(` [DEBUG] waitForBranch: element ${elementAppeared ? 'appeared' : 'timed out'}`);\n }\n\n // Determine which branch to execute\n const branch = elementAppeared ? wfbAction.onAppear : wfbAction.onTimeout;\n\n if (branch) {\n // Check if branch is inline actions (array) or workflow reference (object with workflow property)\n if (Array.isArray(branch)) {\n // Inline actions - execute recursively\n for (const nestedAction of branch) {\n if (debugMode) {\n console.log(` [DEBUG] waitForBranch: executing nested action ${nestedAction.type}`);\n }\n // Execute nested action inline (simplified - complex actions may need full handler)\n switch (nestedAction.type) {\n case 'navigate': {\n const interpolated = interpolate(nestedAction.value);\n const baseUrl = test.config?.web?.baseUrl || workflowBaseUrl;\n const target = resolveUrl(interpolated, baseUrl);\n await page.goto(target);\n break;\n }\n case 'tap': {\n const nestedHandle = resolveLocator(nestedAction.target);\n await nestedHandle.click();\n // Cascading wait for page stability after click\n await page.waitForLoadState('domcontentloaded').catch(() => {});\n await page.waitForLoadState('networkidle', { timeout: 10000 }).catch(() => {});\n break;\n }\n case 'input': {\n const interpolated = interpolate(nestedAction.value);\n const nestedHandle = resolveLocator(nestedAction.target);\n await nestedHandle.fill(interpolated);\n break;\n }\n case 'screenshot': {\n // Cascading wait for page stability\n await page.waitForLoadState('domcontentloaded').catch(() => {});\n await page.waitForLoadState('networkidle', { timeout: 5000 }).catch(() => {});\n const nestedSsAction = nestedAction as Extract<Action, { type: 'screenshot' }>;\n const nestedWaitBefore = nestedSsAction.waitBefore ?? 500;\n if (nestedWaitBefore > 0) {\n await page.waitForTimeout(nestedWaitBefore);\n }\n const filename = nestedSsAction.name ?? `waitForBranch-step.png`;\n const filePath = path.join(screenshotDir, filename);\n await page.screenshot({ path: filePath, fullPage: true });\n results.push({ action: nestedAction, status: 'passed', screenshotPath: filePath });\n const trackedPayload = buildTrackPayload(nestedAction, index, { screenshotPath: filePath });\n if (trackedPayload) {\n await trackResource(trackedPayload);\n }\n break;\n }\n case 'wait': {\n if (nestedAction.target) {\n const nestedHandle = resolveLocator(nestedAction.target);\n await nestedHandle.waitFor({ state: 'visible', timeout: nestedAction.timeout });\n } else {\n await page.waitForTimeout(nestedAction.timeout ?? 1000);\n }\n break;\n }\n case 'evaluate':\n throw new Error('Evaluate action in nested context (conditional/waitForBranch) is not yet supported');\n case 'fail': {\n throw new Error(nestedAction.message);\n }\n case 'setVar': {\n let value: string;\n if (nestedAction.value) {\n value = interpolate(nestedAction.value);\n } else {\n throw new Error('setVar in waitForBranch requires value');\n }\n context.variables.set(nestedAction.name, value);\n if (debugMode) console.log(` [DEBUG] Set variable ${nestedAction.name} = ${value}`);\n break;\n }\n case 'assert': {\n const nestedHandle = resolveLocator(nestedAction.target);\n await nestedHandle.waitFor({ state: 'visible' });\n if (nestedAction.value) {\n const interpolated = interpolate(nestedAction.value);\n const text = (await nestedHandle.textContent())?.trim() ?? '';\n if (!text.includes(interpolated)) {\n throw new Error(\n `Assertion failed: expected \"${interpolated}\", got \"${text}\"`\n );\n }\n }\n break;\n }\n default:\n throw new Error(`Nested action type ${nestedAction.type} in waitForBranch not yet supported`);\n }\n if (nestedAction.type !== 'screenshot') {\n const trackedPayload = buildTrackPayload(nestedAction, index);\n if (trackedPayload) {\n await trackResource(trackedPayload);\n }\n }\n\n results.push({ action: nestedAction, status: 'passed' });\n }\n } else if (typeof branch === 'object' && 'workflow' in branch) {\n // Workflow reference - load and execute\n const workflowPath = path.resolve(workflowDir, branch.workflow);\n if (debugMode) {\n console.log(` [DEBUG] waitForBranch: loading workflow from ${workflowPath}`);\n }\n const { loadWorkflowDefinition } = await import('../../core/loader.js');\n const nestedWorkflow = await loadWorkflowDefinition(workflowPath);\n\n // Inject variables if provided\n if (branch.variables) {\n for (const [key, value] of Object.entries(branch.variables)) {\n const interpolated = interpolate(value);\n context.variables.set(key, interpolated);\n }\n }\n\n // Run nested workflow tests\n for (const testRef of nestedWorkflow.tests) {\n const testFilePath = path.resolve(path.dirname(workflowPath), testRef.file);\n const nestedTest = await loadTestDefinition(testFilePath);\n\n // Initialize test variables\n if (nestedTest.variables) {\n for (const [key, value] of Object.entries(nestedTest.variables)) {\n const interpolated = interpolateVariables(value, context.variables);\n context.variables.set(key, interpolated);\n }\n }\n\n const nestedResult = await runTestInWorkflow(\n nestedTest,\n page,\n context,\n options,\n path.dirname(workflowPath),\n testFilePath,\n nestedWorkflow.config?.web?.baseUrl ?? workflowBaseUrl\n );\n\n results.push(...nestedResult.steps);\n\n if (nestedResult.status === 'failed') {\n throw new Error(`Nested workflow test failed in waitForBranch`);\n }\n }\n }\n } else if (!elementAppeared && debugMode) {\n console.log(` [DEBUG] waitForBranch: timeout occurred but no onTimeout branch defined, continuing silently`);\n }\n break;\n }\n default:\n throw new Error(`Unsupported action type: ${(action as Action).type}`);\n }\n\n const trackedPayload = buildTrackPayload(action, index);\n if (trackedPayload) {\n await trackResource(trackedPayload);\n }\n\n results.push({ action, status: 'passed' });\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 if (workflow.config?.appwrite) {\n // Update executionContext with appwrite config if not already set\n if (!executionContext.appwriteConfig) {\n executionContext.appwriteConfig = {\n endpoint: workflow.config.appwrite.endpoint,\n projectId: workflow.config.appwrite.projectId,\n apiKey: workflow.config.appwrite.apiKey,\n };\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 fileTracking = await initFileTracking({\n sessionId,\n cleanupConfig,\n trackDir: options.trackDir,\n providerConfig: workflow.config?.appwrite ? {\n provider: 'appwrite',\n endpoint: workflow.config.appwrite.endpoint,\n projectId: workflow.config.appwrite.projectId,\n apiKey: workflow.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 // 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 userExplicitlySetReuse = webServerConfig.reuseExistingServer !== undefined;\n\n let effectiveConfig = webServerConfig;\n if (requiresTrackingEnv && !userExplicitlySetReuse && ownsTracking) {\n effectiveConfig = { ...webServerConfig, reuseExistingServer: false };\n console.log('[Intellitester] Appwrite cleanup enabled; restarting server to inject tracking env.');\n }\n\n await webServerManager.start({\n ...effectiveConfig,\n workdir: path.resolve(serverCwd, effectiveConfig.workdir ?? effectiveConfig.cwd ?? '.'),\n });\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 const browserName = options.browser ?? workflow.config?.web?.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 const testSizes = 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 // CLI flag (string only) resolves against cwd; YAML config resolves against the workflow file dir.\n const cliStorageState = typeof options.storageState === 'string'\n ? (path.isAbsolute(options.storageState) ? options.storageState : path.resolve(process.cwd(), options.storageState))\n : options.storageState;\n const storageState: BrowserContextOptions['storageState'] | undefined =\n cliStorageState ?? resolveStorageStatePath(\n workflow.config?.web?.storageState as BrowserContextOptions['storageState'],\n workflowDir,\n );\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 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 : undefined,\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"]}
|