intellitester 0.2.12 → 0.2.13

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.
@@ -1789,7 +1789,7 @@ function interpolateWorkflowVariables(value, currentVariables, testResults) {
1789
1789
  return currentVariables.get(path3) ?? match;
1790
1790
  });
1791
1791
  }
1792
- async function runTestInWorkflow(test, page, context, options, _workflowDir) {
1792
+ async function runTestInWorkflow(test, page, context, options, _workflowDir, workflowBaseUrl) {
1793
1793
  const results = [];
1794
1794
  const debugMode = options.debug ?? false;
1795
1795
  const screenshotDir = defaultScreenshotDir2;
@@ -1832,7 +1832,8 @@ async function runTestInWorkflow(test, page, context, options, _workflowDir) {
1832
1832
  switch (action.type) {
1833
1833
  case "navigate": {
1834
1834
  const interpolated = interpolateVariables2(action.value);
1835
- const target = resolveUrl2(interpolated, test.config?.web?.baseUrl);
1835
+ const baseUrl = test.config?.web?.baseUrl ?? workflowBaseUrl;
1836
+ const target = resolveUrl2(interpolated, baseUrl);
1836
1837
  if (debugMode) console.log(` [DEBUG] Navigating to: ${target}`);
1837
1838
  await page.goto(target);
1838
1839
  break;
@@ -2229,7 +2230,7 @@ Starting workflow: ${workflow.name}`);
2229
2230
  executionContext.variables.set(key, interpolated);
2230
2231
  }
2231
2232
  }
2232
- const result = await runTestInWorkflow(test, page, executionContext, options, workflowDir);
2233
+ const result = await runTestInWorkflow(test, page, executionContext, options, workflowDir, workflow.config?.web?.baseUrl);
2233
2234
  const testResult = {
2234
2235
  id: testRef.id,
2235
2236
  file: testRef.file,
@@ -2531,5 +2532,5 @@ Collected ${serverResources.length} server-tracked resources`);
2531
2532
  }
2532
2533
 
2533
2534
  export { ActionSchema, IntellitesterConfigSchema, LocatorSchema, TestConfigSchema, TestDefinitionSchema, cleanupConfigSchema, cleanupDiscoverSchema, collectMissingEnvVars, createAIProvider, createTestContext, isPipelineContent, isPipelineFile, isWorkflowContent, isWorkflowFile, killServer, loadIntellitesterConfig, loadPipelineDefinition, loadTestDefinition, loadWorkflowDefinition, parseIntellitesterConfig, parsePipelineDefinition, parseTestDefinition, parseWorkflowDefinition, previewConfigSchema, runWebTest, runWorkflow, runWorkflowWithContext, setupAppwriteTracking, startTrackingServer, startWebServer };
2534
- //# sourceMappingURL=chunk-LVWIFM33.js.map
2535
- //# sourceMappingURL=chunk-LVWIFM33.js.map
2535
+ //# sourceMappingURL=chunk-BYSKHSJB.js.map
2536
+ //# sourceMappingURL=chunk-BYSKHSJB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/schema.ts","../src/core/workflowSchema.ts","../src/core/pipelineSchema.ts","../src/core/loader.ts","../src/integrations/email/inbucketClient.ts","../src/integrations/appwrite/appwriteClient.ts","../src/integrations/appwrite/types.ts","../src/ai/provider.ts","../src/ai/errorHelper.ts","../src/tracking/trackingServer.ts","../src/executors/web/playwrightExecutor.ts","../src/executors/web/workflowExecutor.ts"],"names":["nonEmptyString","z","path","fs","crypto","Client","Users","defaultScreenshotDir","getBrowser","firefox","webkit","chromium","resolveUrl","interpolateVariables","resolveLocator","options"],"mappings":"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","file":"chunk-BYSKHSJB.js","sourcesContent":["import { z } from 'zod';\n\nconst nonEmptyString = z.string().trim().min(1, 'Value cannot be empty');\n\nexport const LocatorSchema = z\n .object({\n description: z.string().trim().optional().describe('AI-friendly description of the element to find'),\n testId: z.string().trim().optional().describe('data-testid attribute value'),\n text: z.string().trim().optional().describe('Visible text content'),\n css: z.string().trim().optional().describe('CSS selector'),\n xpath: z.string().trim().optional().describe('XPath selector'),\n role: z.string().trim().optional().describe('ARIA role'),\n name: z.string().trim().optional().describe('Accessible name'),\n })\n .describe('Defines how to locate an element on the page. At least one selector must be provided.')\n .refine(\n (locator) =>\n Boolean(\n locator.description ||\n locator.testId ||\n locator.text ||\n locator.css ||\n locator.xpath ||\n locator.role ||\n locator.name,\n ),\n { message: 'Locator requires at least one selector or description' },\n );\n\nconst navigateActionSchema = z.object({\n type: z.literal('navigate'),\n value: nonEmptyString.describe('URL or path to navigate to'),\n}).describe('Navigate to a URL');\n\nconst tapActionSchema = z.object({\n type: z.literal('tap'),\n target: LocatorSchema,\n}).describe('Click or tap on an element');\n\nconst inputActionSchema = z.object({\n type: z.literal('input'),\n target: LocatorSchema,\n value: z.string().describe('Text to input (can reference variables with ${VAR_NAME})'),\n}).describe('Input text into a field');\n\nconst assertActionSchema = z.object({\n type: z.literal('assert'),\n target: LocatorSchema,\n value: z.string().optional().describe('Expected text content'),\n}).describe('Assert that an element exists or contains expected text');\n\nconst waitActionSchema = z\n .object({\n type: z.literal('wait'),\n target: LocatorSchema.optional().describe('Element to wait for'),\n timeout: z.number().int().positive().optional().describe('Time to wait in milliseconds'),\n })\n .describe('Wait for an element or timeout')\n .refine((action) => action.target || action.timeout, {\n message: 'wait requires a target or timeout',\n });\n\nconst scrollActionSchema = z.object({\n type: z.literal('scroll'),\n target: LocatorSchema.optional().describe('Element to scroll'),\n direction: z.enum(['up', 'down']).optional().describe('Direction to scroll'),\n amount: z.number().int().positive().optional().describe('Amount to scroll in pixels'),\n}).describe('Scroll the page or an element');\n\nconst screenshotActionSchema = z.object({\n type: z.literal('screenshot'),\n name: z.string().optional().describe('Name for the screenshot file'),\n}).describe('Take a screenshot');\n\nconst setVarActionSchema = z.object({\n type: z.literal('setVar'),\n name: nonEmptyString.describe('Variable name to set'),\n value: z.string().optional().describe('Static value to set'),\n from: z.enum(['response', 'element', 'email']).optional().describe('Extract value from a source'),\n path: z.string().optional().describe('JSON path or selector for extraction'),\n pattern: z.string().optional().describe('Regular expression pattern for extraction'),\n}).describe('Set a variable for use in later steps');\n\nconst emailWaitForActionSchema = z.object({\n type: z.literal('email.waitFor'),\n mailbox: nonEmptyString.describe('Email address or mailbox to check'),\n timeout: z.number().int().positive().optional().describe('How long to wait for email in milliseconds'),\n subjectContains: z.string().optional().describe('Filter by email subject'),\n}).describe('Wait for an email to arrive');\n\nconst emailExtractCodeActionSchema = z.object({\n type: z.literal('email.extractCode'),\n saveTo: nonEmptyString.describe('Variable name to save the extracted code'),\n pattern: z.string().optional().describe('Regular expression to extract code'),\n}).describe('Extract a verification code from email');\n\nconst emailExtractLinkActionSchema = z.object({\n type: z.literal('email.extractLink'),\n saveTo: nonEmptyString.describe('Variable name to save the extracted link'),\n pattern: z.string().optional().describe('Regular expression to match specific links'),\n}).describe('Extract a link from email');\n\nconst emailClearActionSchema = z.object({\n type: z.literal('email.clear'),\n mailbox: nonEmptyString.describe('Email address or mailbox to clear'),\n}).describe('Clear emails from a mailbox');\n\nconst appwriteVerifyEmailActionSchema = z.object({\n type: z.literal('appwrite.verifyEmail'),\n}).describe('Verify email using Appwrite');\n\nconst debugActionSchema = z.object({\n type: z.literal('debug'),\n}).describe('Pause execution and open Playwright Inspector for debugging');\n\nexport const ActionSchema = z.discriminatedUnion('type', [\n navigateActionSchema,\n tapActionSchema,\n inputActionSchema,\n assertActionSchema,\n waitActionSchema,\n scrollActionSchema,\n screenshotActionSchema,\n setVarActionSchema,\n emailWaitForActionSchema,\n emailExtractCodeActionSchema,\n emailExtractLinkActionSchema,\n emailClearActionSchema,\n appwriteVerifyEmailActionSchema,\n debugActionSchema,\n]);\n\nconst defaultsSchema = z.object({\n timeout: z.number().int().positive().optional().describe('Default timeout in milliseconds for all actions'),\n screenshots: z.enum(['on-failure', 'always', 'never']).optional().describe('When to capture screenshots during test execution'),\n}).describe('Default settings that apply to all tests unless overridden');\n\nconst webConfigSchema = z.object({\n baseUrl: nonEmptyString.url().optional().describe('Base URL for the web application'),\n browser: z.string().trim().optional().describe('Browser to use for testing'),\n headless: z.boolean().optional().describe('Run browser in headless mode'),\n timeout: z.number().int().positive().optional().describe('Timeout in milliseconds for web actions'),\n}).describe('Web platform configuration');\n\nconst androidConfigSchema = z.object({\n appId: z.string().trim().optional().describe('Android application ID'),\n device: z.string().trim().optional().describe('Device name or ID to run tests on'),\n}).describe('Android platform configuration');\n\nconst iosConfigSchema = z.object({\n bundleId: z.string().trim().optional().describe('iOS bundle identifier'),\n simulator: z.string().trim().optional().describe('Simulator name to run tests on'),\n}).describe('iOS platform configuration');\n\nconst emailConfigSchema = z.object({\n provider: z.literal('inbucket').describe('Email testing provider'),\n endpoint: nonEmptyString.url().optional().describe('Email service endpoint URL'),\n}).describe('Email testing configuration');\n\nconst appwriteConfigSchema = z.object({\n endpoint: nonEmptyString.url().describe('Appwrite API endpoint'),\n projectId: nonEmptyString.describe('Appwrite project ID'),\n apiKey: nonEmptyString.describe('Appwrite API key with appropriate permissions'),\n cleanup: z.boolean().optional().describe('Enable automatic cleanup of created resources'),\n cleanupOnFailure: z.boolean().optional().describe('Clean up resources even when test fails'),\n}).describe('Appwrite backend configuration');\n\nconst healingSchema = z.object({\n enabled: z.boolean().optional().describe('Enable self-healing capabilities'),\n strategies: z.array(z.string().trim()).optional().describe('Healing strategies to use'),\n}).describe('Self-healing test configuration');\n\nconst webServerSchema = z\n .object({\n command: nonEmptyString.optional().describe('Command to start the web server'),\n auto: z.boolean().optional().describe('Automatically detect and run the dev server from package.json'),\n static: z.string().optional().describe('Serve a static directory instead of running a command'),\n url: nonEmptyString.url().describe('URL to wait for before starting tests'),\n port: z.number().int().positive().optional().describe('Port number for the web server'),\n reuseExistingServer: z.boolean().default(true).describe('Use existing server if already running at the specified URL'),\n timeout: z.number().int().positive().default(30000).describe('Timeout in milliseconds to wait for server to become available'),\n cwd: z.string().optional().describe('Working directory for the server command'),\n })\n .describe('Configuration for starting a web server before running tests')\n .refine((config) => config.command || config.auto || config.static, {\n message: 'WebServerConfig requires command, auto: true, or static directory',\n });\n\nconst aiSourceSchema = z.object({\n pagesDir: z.string().optional().describe('Directory containing page components'),\n componentsDir: z.string().optional().describe('Directory containing reusable components'),\n extensions: z.array(z.string()).default(['.vue', '.astro', '.tsx', '.jsx', '.svelte']).describe('File extensions to include in source code analysis'),\n}).optional().describe('Source code directories for AI to analyze when generating tests');\n\nconst aiConfigSchema = z.object({\n provider: z.enum(['anthropic', 'openai', 'ollama']).describe('AI provider to use for test generation'),\n model: nonEmptyString.describe('Model name to use'),\n apiKey: z.string().trim().optional().describe('API key for the AI provider'),\n baseUrl: z.string().trim().url().optional().describe('Base URL for the AI API (required for Ollama)'),\n temperature: z.number().min(0).max(2).default(0.2).describe('Temperature for AI generation (0 = deterministic, 2 = very creative)'),\n maxTokens: z.number().int().positive().default(4096).describe('Maximum tokens for AI responses'),\n source: aiSourceSchema,\n}).describe('AI configuration for test generation and healing');\n\n// Cleanup discovery configuration\nexport const cleanupDiscoverSchema = z.object({\n enabled: z.boolean().default(true).describe('Enable auto-discovery of cleanup handlers in specified paths'),\n paths: z.array(z.string()).default(['./tests/cleanup']).describe('Directories to search for cleanup handler files'),\n pattern: z.string().default('**/*.ts').describe('Glob pattern to match handler files'),\n}).optional().describe('Auto-discovery configuration for cleanup handlers');\n\n// Main cleanup configuration\nexport const cleanupConfigSchema = z.object({\n provider: z.string().optional().describe('Primary cleanup provider to use'),\n parallel: z.boolean().default(false).describe('Execute cleanup operations in parallel'),\n retries: z.number().min(1).max(10).default(3).describe('Number of retry attempts for failed cleanup operations'),\n types: z.record(z.string(), z.string()).optional().describe('Map resource types to cleanup handler methods'),\n handlers: z.array(z.string()).optional().describe('Explicit paths to custom cleanup handler files'),\n discover: cleanupDiscoverSchema,\n}).passthrough().describe('Comprehensive resource cleanup configuration'); // Allow provider-specific configs like appwrite: {...}\n\n// Export the inferred type\nexport type CleanupConfig = z.infer<typeof cleanupConfigSchema>;\n\nconst platformsSchema = z.object({\n web: webConfigSchema.optional(),\n android: androidConfigSchema.optional(),\n ios: iosConfigSchema.optional(),\n}).describe('Platform-specific configurations');\n\n// Preview configuration for --preview flag\nexport const previewConfigSchema = z.object({\n build: z.object({\n command: z.string().optional().describe('Command to build the project'),\n }).optional().describe('Build configuration'),\n preview: z.object({\n command: z.string().optional().describe('Command to start the preview server after build'),\n }).optional().describe('Preview server configuration'),\n url: z.string().url().optional().describe('URL to wait for before starting tests'),\n timeout: z.number().int().positive().optional().describe('Timeout in milliseconds to wait for preview server'),\n}).describe('Configuration for the --preview flag (build and serve production build)');\n\nexport const TestConfigSchema = z.object({\n defaults: defaultsSchema.optional(),\n web: webConfigSchema.optional(),\n android: androidConfigSchema.optional(),\n ios: iosConfigSchema.optional(),\n email: emailConfigSchema.optional(),\n appwrite: appwriteConfigSchema.optional(),\n}).describe('Test-specific configuration that overrides global settings');\n\nexport const TestDefinitionSchema = z.object({\n name: nonEmptyString.describe('The name of the test'),\n platform: z.enum(['web', 'android', 'ios']).describe('The platform to run the test on'),\n variables: z.record(z.string(), z.string()).optional().describe('Variables that can be referenced in test steps using ${VARIABLE_NAME} syntax'),\n config: TestConfigSchema.optional(),\n steps: z.array(ActionSchema).min(1).describe('The sequence of actions to execute in this test'),\n}).describe('Schema for IntelliTester test definition files');\n\nexport const IntellitesterConfigSchema = z.object({\n defaults: defaultsSchema.optional(),\n ai: aiConfigSchema.optional(),\n platforms: platformsSchema.optional(),\n healing: healingSchema.optional(),\n email: emailConfigSchema.optional(),\n appwrite: appwriteConfigSchema.optional(),\n cleanup: cleanupConfigSchema.optional(),\n webServer: webServerSchema.optional(),\n preview: previewConfigSchema.optional(),\n secrets: z.record(z.string(), z.string().trim()).optional().describe('Secret values that can be referenced in tests'),\n}).describe('Global configuration file for IntelliTester');\n","import { z } from 'zod';\n\nconst nonEmptyString = z.string().trim().min(1, 'Value cannot be empty');\n\n// Reference to a test file in the workflow\nconst testReferenceSchema = z.object({\n file: nonEmptyString.describe('Path to the test file relative to the workflow file'),\n id: nonEmptyString.optional().describe('Optional ID for referencing this test in variables or dependencies'),\n variables: z.record(z.string(), z.string()).optional().describe('Variables to inject or override for this specific test'),\n}).describe('Reference to a test file');\n\n// Workflow-specific web config\nconst workflowWebConfigSchema = z.object({\n baseUrl: nonEmptyString.url().optional().describe('Base URL for all tests in this workflow'),\n browser: z.enum(['chromium', 'firefox', 'webkit']).optional().describe('Browser to use for all web tests'),\n headless: z.boolean().optional().describe('Run browser in headless mode'),\n}).describe('Web platform configuration for the workflow');\n\n// Workflow-specific Appwrite config\nconst workflowAppwriteConfigSchema = z.object({\n endpoint: nonEmptyString.url().describe('Appwrite API endpoint'),\n projectId: nonEmptyString.describe('Appwrite project ID'),\n apiKey: nonEmptyString.describe('Appwrite API key'),\n cleanup: z.boolean().default(true).describe('Enable automatic cleanup of created resources'),\n cleanupOnFailure: z.boolean().default(true).describe('Clean up resources even when tests fail'),\n}).describe('Appwrite backend configuration for the workflow');\n\n// Cleanup discovery configuration for workflows\nconst workflowCleanupDiscoverSchema = z.object({\n enabled: z.boolean().default(true).describe('Enable auto-discovery of cleanup handlers'),\n paths: z.array(z.string()).default(['./tests/cleanup']).describe('Directories to search for cleanup handlers'),\n pattern: z.string().default('**/*.ts').describe('Glob pattern for handler files'),\n}).optional().describe('Auto-discovery configuration for cleanup handlers');\n\n// Workflow cleanup configuration\nconst workflowCleanupConfigSchema = z.object({\n provider: z.string().optional().describe('Cleanup provider to use'),\n parallel: z.boolean().default(false).describe('Run cleanup tasks in parallel'),\n retries: z.number().min(1).max(10).default(3).describe('Number of retry attempts for failed cleanup operations'),\n types: z.record(z.string(), z.string()).optional().describe('Map resource types to cleanup handler methods'),\n handlers: z.array(z.string()).optional().describe('Explicit paths to custom cleanup handler files'),\n discover: workflowCleanupDiscoverSchema,\n}).passthrough().describe('Resource cleanup configuration'); // Allow provider-specific configs like appwrite: {...}\n\n// Workflow-specific web server config\nconst workflowWebServerSchema = z.object({\n command: nonEmptyString.optional().describe('Command to start the web server'),\n auto: z.boolean().optional().describe('Auto-detect server start command from package.json'),\n url: nonEmptyString.url().describe('URL to wait for before starting tests'),\n reuseExistingServer: z.boolean().default(true).describe('Use existing server if already running at the URL'),\n timeout: z.number().int().positive().default(30000).describe('Timeout in milliseconds to wait for server to start'),\n}).describe('Configuration for starting a web server before tests');\n\n// Workflow configuration\nconst workflowConfigSchema = z.object({\n web: workflowWebConfigSchema.optional(),\n appwrite: workflowAppwriteConfigSchema.optional(),\n cleanup: workflowCleanupConfigSchema.optional(),\n webServer: workflowWebServerSchema.optional(),\n}).describe('Workflow-level configuration that applies to all tests');\n\n// Main workflow definition schema\nexport const WorkflowDefinitionSchema = z.object({\n name: nonEmptyString.describe('The name of the workflow'),\n platform: z.enum(['web', 'android', 'ios']).default('web').describe('The platform to run the workflow on'),\n config: workflowConfigSchema.optional(),\n continueOnFailure: z.boolean().default(false).describe('Continue running subsequent tests even if a test fails'),\n tests: z.array(testReferenceSchema).min(1, 'Workflow must contain at least one test').describe('List of test files to execute in this workflow'),\n}).describe('Schema for IntelliTester workflow files that orchestrate multiple tests');\n\n// Export inferred types\nexport type WorkflowDefinition = z.infer<typeof WorkflowDefinitionSchema>;\nexport type TestReference = z.infer<typeof testReferenceSchema>;\nexport type WorkflowConfig = z.infer<typeof workflowConfigSchema>;\nexport type WorkflowWebConfig = z.infer<typeof workflowWebConfigSchema>;\nexport type WorkflowAppwriteConfig = z.infer<typeof workflowAppwriteConfigSchema>;\nexport type WorkflowCleanupConfig = z.infer<typeof workflowCleanupConfigSchema>;\nexport type WorkflowWebServerConfig = z.infer<typeof workflowWebServerSchema>;\n","import { z } from 'zod';\n\nconst nonEmptyString = z.string().trim().min(1, 'Value cannot be empty');\n\n// Workflow reference within a pipeline\nconst workflowReferenceSchema = z.object({\n file: nonEmptyString.describe('Path to the workflow file'),\n id: nonEmptyString.optional().describe('Optional ID for referencing this workflow in dependencies'),\n depends_on: z.array(nonEmptyString).optional().describe('IDs of workflows that must complete before this one'),\n on_failure: z.enum(['skip', 'fail', 'ignore']).optional().describe('How to handle failure of this workflow'),\n variables: z.record(z.string(), z.string()).optional().describe('Variables to inject or override for this workflow'),\n}).describe('Reference to a workflow file');\n\n// Pipeline-specific web config (matches workflow web config pattern)\nconst pipelineWebConfigSchema = z.object({\n baseUrl: nonEmptyString.url().optional().describe('Base URL for all workflows in this pipeline'),\n browser: z.enum(['chromium', 'firefox', 'webkit']).optional().describe('Browser to use for all web tests'),\n headless: z.boolean().optional().describe('Run browser in headless mode'),\n}).describe('Web platform configuration for the pipeline');\n\n// Pipeline-specific Appwrite config\nconst pipelineAppwriteConfigSchema = z.object({\n endpoint: nonEmptyString.url().describe('Appwrite API endpoint'),\n projectId: nonEmptyString.describe('Appwrite project ID'),\n apiKey: nonEmptyString.describe('Appwrite API key'),\n cleanup: z.boolean().default(true).describe('Enable automatic cleanup of created resources'),\n cleanupOnFailure: z.boolean().default(true).describe('Clean up resources even when workflows fail'),\n}).describe('Appwrite backend configuration for the pipeline');\n\n// Pipeline cleanup discovery configuration\nconst pipelineCleanupDiscoverSchema = z.object({\n enabled: z.boolean().default(true).describe('Enable auto-discovery of cleanup handlers'),\n paths: z.array(z.string()).default(['./tests/cleanup']).describe('Directories to search for cleanup handlers'),\n pattern: z.string().default('**/*.ts').describe('Glob pattern for handler files'),\n}).optional().describe('Auto-discovery configuration for cleanup handlers');\n\n// Pipeline cleanup configuration\nconst pipelineCleanupConfigSchema = z.object({\n provider: z.string().optional().describe('Cleanup provider to use'),\n parallel: z.boolean().default(false).describe('Run cleanup tasks in parallel'),\n retries: z.number().min(1).max(10).default(3).describe('Number of retry attempts for failed cleanup operations'),\n types: z.record(z.string(), z.string()).optional().describe('Map resource types to cleanup handler methods'),\n handlers: z.array(z.string()).optional().describe('Explicit paths to custom cleanup handler files'),\n discover: pipelineCleanupDiscoverSchema,\n on_failure: z.boolean().default(true).describe('Run cleanup even if pipeline fails'),\n}).passthrough().describe('Resource cleanup configuration'); // Allow provider-specific configs like appwrite: {...}\n\n// Pipeline-specific web server config\nconst pipelineWebServerSchema = z.object({\n command: nonEmptyString.optional().describe('Command to start the web server'),\n auto: z.boolean().optional().describe('Auto-detect server start command from package.json'),\n url: nonEmptyString.url().describe('URL to wait for before starting workflows'),\n reuseExistingServer: z.boolean().default(true).describe('Use existing server if already running at the URL'),\n timeout: z.number().int().positive().default(30000).describe('Timeout in milliseconds to wait for server to start'),\n}).describe('Configuration for starting a web server before workflows');\n\n// Pipeline configuration (similar to workflow config)\nconst pipelineConfigSchema = z.object({\n web: pipelineWebConfigSchema.optional(),\n appwrite: pipelineAppwriteConfigSchema.optional(),\n cleanup: pipelineCleanupConfigSchema.optional(),\n webServer: pipelineWebServerSchema.optional(),\n}).describe('Pipeline-level configuration that applies to all workflows');\n\n// Main pipeline definition schema\nexport const PipelineDefinitionSchema = z.object({\n name: nonEmptyString.describe('The name of the pipeline'),\n platform: z.enum(['web', 'android', 'ios']).default('web').describe('The platform to run the pipeline on'),\n config: pipelineConfigSchema.optional(),\n on_failure: z.enum(['skip', 'fail', 'ignore']).default('skip').describe('Default failure handling for workflows'),\n cleanup_on_failure: z.boolean().default(true).describe('Run cleanup even when pipeline fails'),\n workflows: z.array(workflowReferenceSchema).min(1, 'Pipeline must contain at least one workflow').describe('List of workflow files to execute in this pipeline'),\n}).describe('Schema for IntelliTester pipeline files that orchestrate multiple workflows');\n\n// Export inferred types\nexport type PipelineDefinition = z.infer<typeof PipelineDefinitionSchema>;\nexport type WorkflowReference = z.infer<typeof workflowReferenceSchema>;\nexport type PipelineConfig = z.infer<typeof pipelineConfigSchema>;\nexport type PipelineWebConfig = z.infer<typeof pipelineWebConfigSchema>;\nexport type PipelineAppwriteConfig = z.infer<typeof pipelineAppwriteConfigSchema>;\nexport type PipelineCleanupConfig = z.infer<typeof pipelineCleanupConfigSchema>;\nexport type PipelineWebServerConfig = z.infer<typeof pipelineWebServerSchema>;\n","import fs from 'node:fs/promises';\n\nimport type { ZodIssue, ZodType } from 'zod';\nimport { parse } from 'yaml';\n\nimport { IntellitesterConfigSchema, TestDefinitionSchema } from './schema';\nimport type { IntellitesterConfig, TestDefinition } from './types';\nimport { WorkflowDefinitionSchema, type WorkflowDefinition } from './workflowSchema';\nimport { PipelineDefinitionSchema, type PipelineDefinition } from './pipelineSchema';\n\nconst formatIssues = (issues: ZodIssue[]): string =>\n issues\n .map((issue) => {\n const path = issue.path.join('.') || '<root>';\n return `${path}: ${issue.message}`;\n })\n .join('; ');\n\n/**\n * Interpolates environment variables in a parsed YAML object.\n * Recursively replaces ${VAR_NAME} patterns with environment variable values.\n */\nconst interpolateEnvVars = (obj: unknown): unknown => {\n if (typeof obj === 'string') {\n // Replace ${VAR_NAME} with environment variable value\n return obj.replace(/\\$\\{([^}]+)\\}/g, (_, varName) => {\n const value = process.env[varName];\n if (value === undefined) {\n throw new Error(`Environment variable ${varName} is not defined`);\n }\n return value;\n });\n }\n\n if (Array.isArray(obj)) {\n return obj.map(interpolateEnvVars);\n }\n\n if (obj !== null && typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = interpolateEnvVars(value);\n }\n return result;\n }\n\n return obj;\n};\n\nconst parseWithSchema = <T>(content: string, schema: ZodType<T>, subject: string): T => {\n let parsed: unknown;\n try {\n parsed = parse(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid YAML for ${subject}: ${message}`);\n }\n\n // Interpolate environment variables in the parsed content\n const interpolated = interpolateEnvVars(parsed);\n\n const result = schema.safeParse(interpolated);\n if (!result.success) {\n throw new Error(`Invalid ${subject}: ${formatIssues(result.error.issues)}`);\n }\n\n return result.data;\n};\n\nexport const parseTestDefinition = (content: string): TestDefinition =>\n parseWithSchema(content, TestDefinitionSchema, 'test definition');\n\nexport const loadTestDefinition = async (filePath: string): Promise<TestDefinition> => {\n const fileContent = await fs.readFile(filePath, 'utf8');\n return parseTestDefinition(fileContent);\n};\n\nexport const parseIntellitesterConfig = (content: string): IntellitesterConfig =>\n parseWithSchema(content, IntellitesterConfigSchema, 'config');\n\nexport const loadIntellitesterConfig = async (filePath: string): Promise<IntellitesterConfig> => {\n const fileContent = await fs.readFile(filePath, 'utf8');\n return parseIntellitesterConfig(fileContent);\n};\n\nexport const parseWorkflowDefinition = (content: string): WorkflowDefinition =>\n parseWithSchema(content, WorkflowDefinitionSchema, 'workflow definition');\n\nexport const loadWorkflowDefinition = async (filePath: string): Promise<WorkflowDefinition> => {\n const fileContent = await fs.readFile(filePath, 'utf8');\n return parseWorkflowDefinition(fileContent);\n};\n\nexport const isWorkflowFile = (filePath: string): boolean => {\n return filePath.endsWith('.workflow.yaml') || filePath.endsWith('.workflow.yml');\n};\n\n/**\n * Check if a file is a pipeline file based on naming convention.\n * Pipeline files end with .pipeline.yaml or .pipeline.yml\n */\nexport const isPipelineFile = (filePath: string): boolean => {\n return filePath.endsWith('.pipeline.yaml') || filePath.endsWith('.pipeline.yml');\n};\n\n/**\n * Parse pipeline definition from string content.\n */\nexport const parsePipelineDefinition = (content: string): PipelineDefinition =>\n parseWithSchema(content, PipelineDefinitionSchema, 'pipeline definition');\n\n/**\n * Load and validate a pipeline definition from a YAML file.\n */\nexport const loadPipelineDefinition = async (filePath: string): Promise<PipelineDefinition> => {\n const fileContent = await fs.readFile(filePath, 'utf8');\n return parsePipelineDefinition(fileContent);\n};\n\n/**\n * Recursively collects all environment variable names that are referenced\n * but not defined in the process environment.\n */\nexport const collectMissingEnvVars = (obj: unknown): string[] => {\n const missing: string[] = [];\n\n const collect = (value: unknown): void => {\n if (typeof value === 'string') {\n const matches = value.matchAll(/\\$\\{([^}]+)\\}/g);\n for (const match of matches) {\n const varName = match[1];\n if (process.env[varName] === undefined && !missing.includes(varName)) {\n missing.push(varName);\n }\n }\n } else if (Array.isArray(value)) {\n value.forEach(collect);\n } else if (value !== null && typeof value === 'object') {\n Object.values(value).forEach(collect);\n }\n };\n\n collect(obj);\n return missing;\n};\n\n/**\n * Detect if YAML content is a workflow by checking for 'tests' array.\n */\nexport const isWorkflowContent = (content: string): boolean => {\n try {\n const parsed = parse(content);\n return parsed && Array.isArray(parsed.tests) && !parsed.steps && !parsed.workflows;\n } catch {\n return false;\n }\n};\n\n/**\n * Detect if YAML content is a pipeline by checking for 'workflows' array.\n */\nexport const isPipelineContent = (content: string): boolean => {\n try {\n const parsed = parse(content);\n return parsed && Array.isArray(parsed.workflows) && !parsed.steps;\n } catch {\n return false;\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","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 // 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","import { Anthropic } from '@llamaindex/anthropic';\nimport { OpenAI } from '@llamaindex/openai';\nimport { Ollama } from '@llamaindex/ollama';\nimport type { AIConfig, AIProvider } from './types';\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\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\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\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 }\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 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 { 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 crypto from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { spawn, type ChildProcess } from 'node:child_process';\n\nimport {\n chromium,\n firefox,\n webkit,\n type BrowserType,\n type Locator as PWLocator,\n type Page,\n} from 'playwright';\nimport prompts from 'prompts';\n\nimport type { Action, Locator, TestDefinition } from '../../core/types';\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 { getAISuggestion } from '../../ai/errorHelper';\nimport { TrackingServer } from '../../tracking/trackingServer';\n\nexport type BrowserName = 'chromium' | 'firefox' | 'webkit';\n\nexport interface WebServerConfig {\n // Option 1: Explicit command\n command?: string;\n\n // Option 2: Auto-detect from package.json and build output\n auto?: boolean;\n\n // Option 3: Serve static directory\n static?: string;\n\n url: string;\n port?: number;\n reuseExistingServer?: boolean;\n timeout?: number;\n cwd?: string;\n}\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}\n\nexport interface StepResult {\n action: Action;\n status: 'passed' | 'failed';\n error?: string;\n screenshotPath?: 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\nfunction interpolateVariables(value: string, variables: Map<string, string>): string {\n return value.replace(/\\{\\{(\\w+)\\}\\}/g, (match, varName) => {\n if (varName === 'uuid') {\n return crypto.randomUUID().split('-')[0]; // Short UUID\n }\n return variables.get(varName) ?? match;\n });\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) 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 // 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\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): Promise<void> => {\n const handle = resolveLocator(page, locator);\n await handle.click();\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 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): Promise<string> => {\n await ensureScreenshotDir(screenshotDir);\n\n // Wait for network to be idle (or max 5 seconds)\n await page.waitForLoadState('networkidle', { timeout: 5000 }).catch(() => {\n // Timeout is fine - proceed with screenshot anyway\n });\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 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 waitForServer(url: string, timeout: number): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < timeout) {\n if (await isServerRunning(url)) return;\n await new Promise(r => setTimeout(r, 500));\n }\n throw new Error(`Server at ${url} not ready after ${timeout}ms`);\n}\n\nasync function detectBuildDirectory(cwd: string): Promise<string | null> {\n // Order matters - check framework-specific dirs first, then generic ones\n const commonDirs = [\n '.next', // Next.js\n '.output', // Nuxt 3\n '.svelte-kit', // SvelteKit\n 'dist', // Vite, Astro, Rollup, generic\n 'build', // CRA, Remix, generic\n 'out', // Next.js static export\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 readPackageJson(cwd: string): Promise<any> {\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 // Check in order of specificity (meta-frameworks first, then base frameworks)\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 // Use astro dev for both - astro preview doesn't work with some adapters (e.g., Cloudflare)\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 hasBunLock = await fs.stat(path.join(cwd, 'bun.lockb')).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 (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 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 we have a build directory, use the appropriate preview/start command\n if (buildDir) {\n if (framework) {\n console.log(`Detected ${framework.name} project with build at ${buildDir}`);\n return framework.buildCommand;\n }\n // Unknown framework with build dir - use generic static server\n console.log(`Detected build directory at ${buildDir}, using static server`);\n return `npx -y serve ${buildDir}`;\n }\n\n // No build directory - run dev server\n if (pkg?.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 (pkg?.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\nexport async function startWebServer(config: WebServerConfig): Promise<ChildProcess | null> {\n const { url, reuseExistingServer = true, timeout = 30000, cwd = process.cwd() } = config;\n\n // Check if already running\n if (reuseExistingServer && await isServerRunning(url)) {\n console.log(`Server already running at ${url}`);\n return null;\n }\n\n // Determine the command to run\n let command: string;\n\n if (config.command) {\n // Option 1: Explicit command\n command = config.command;\n } else if (config.static) {\n // Option 3: Serve static directory\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 // Option 2: Auto-detect\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 const serverProcess = spawn(command, {\n shell: true,\n stdio: 'pipe',\n cwd,\n detached: false,\n });\n\n serverProcess.stdout?.on('data', (data) => {\n process.stdout.write(`[server] ${data}`);\n });\n\n serverProcess.stderr?.on('data', (data) => {\n process.stderr.write(`[server] ${data}`);\n });\n\n await waitForServer(url, timeout);\n console.log(`Server ready at ${url}`);\n\n return serverProcess;\n}\n\nexport function killServer(serverProcess: ChildProcess | null): void {\n if (serverProcess && !serverProcess.killed) {\n console.log('Stopping server...');\n serverProcess.kill('SIGTERM');\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\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 },\n): Promise<void> {\n const { baseUrl, context, screenshotDir, debugMode, interactive, aiConfig } = options;\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 if (debugMode) {\n console.log(`[DEBUG] Tapping element:`, action.target);\n }\n await runTap(page, action.target);\n break;\n }\n case 'input': {\n if (debugMode) {\n const interpolated = interpolateVariables(action.value, context.variables);\n console.log(`[DEBUG] Inputting value into element:`, action.target);\n console.log(`[DEBUG] Value: ${interpolated}`);\n }\n await runInput(page, action.target, action.value, context);\n break;\n }\n case 'assert': {\n if (debugMode) {\n console.log(`[DEBUG] Asserting element:`, action.target);\n if (action.value) {\n const interpolated = interpolateVariables(action.value, context.variables);\n console.log(`[DEBUG] Expected text contains: ${interpolated}`);\n }\n }\n await runAssert(page, action.target, action.value, context);\n break;\n }\n case 'wait':\n await runWait(page, action);\n break;\n case 'scroll':\n await runScroll(page, action);\n break;\n case 'screenshot':\n throw new Error('Screenshot 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 default:\n throw new Error(`Unsupported action type: ${(action as Action).type}`);\n }\n\n // Success - break out of retry loop\n return;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\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;\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 : true;\n const screenshotDir = options.screenshotDir ?? defaultScreenshotDir;\n const defaultTimeout = options.defaultTimeoutMs ?? 30000;\n\n // Start tracking server for SSR resource tracking\n const sessionId = crypto.randomUUID();\n const 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\n // Start webServer if configured\n let serverProcess: ChildProcess | null = null;\n if (options.webServer) {\n serverProcess = await startWebServer(options.webServer);\n }\n\n // Handle Ctrl+C and termination signals\n const cleanup = () => {\n trackingServer.stop();\n killServer(serverProcess);\n process.exit(1);\n };\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n\n // Launch local browser\n const browser = await getBrowser(browserName).launch({ headless });\n\n const browserContext = await browser.newContext();\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 results: StepResult[] = [];\n const debugMode = options.debug ?? false;\n const interactive = options.interactive ?? 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\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 screenshotPath = await runScreenshot(page, action.name, screenshotDir, index);\n results.push({ action, status: 'passed', screenshotPath });\n continue;\n }\n\n // Use the new executeActionWithRetry for all other actions\n 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 });\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 } finally {\n // Remove signal handlers\n process.off('SIGINT', cleanup);\n process.off('SIGTERM', cleanup);\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 executionContext.appwriteContext,\n sessionId,\n process.cwd()\n );\n console.log('Cleanup result:', cleanupResult);\n }\n\n await browserContext.close();\n await browser.close();\n\n // Stop tracking server\n trackingServer.stop();\n\n // Stop webServer if it was started\n killServer(serverProcess);\n }\n\n return {\n status: results.every((step) => step.status === 'passed') ? 'passed' : 'failed',\n steps: results,\n variables: executionContext.variables,\n };\n};\n","import crypto from 'node:crypto';\nimport path from 'node:path';\nimport { type ChildProcess } from 'node:child_process';\n\nimport {\n chromium,\n firefox,\n webkit,\n type BrowserType,\n type Page,\n} from 'playwright';\n\nimport type { Action, TestDefinition, WorkflowDefinition } from '../../core/types';\nimport { loadTestDefinition } from '../../core/loader';\nimport { InbucketClient } from '../../integrations/email/inbucketClient';\nimport type { Email } from '../../integrations/email/types';\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 } from '../../tracking';\nimport { startWebServer, killServer, type BrowserName, type StepResult } from './playwrightExecutor';\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';\n\nexport interface WorkflowOptions {\n headed?: boolean;\n browser?: BrowserName;\n interactive?: boolean;\n debug?: boolean;\n aiConfig?: AIConfig;\n}\n\nexport interface WorkflowWithContextOptions extends WorkflowOptions {\n page: Page;\n executionContext: ExecutionContext;\n skipCleanup?: boolean;\n sessionId?: string;\n testStartTime?: string; // ISO timestamp when the test started\n}\n\nexport interface WorkflowTestResult {\n id?: string;\n file: string;\n status: 'passed' | 'failed' | 'skipped';\n steps: StepResult[];\n error?: string;\n}\n\nexport interface WorkflowResult {\n status: 'passed' | 'failed';\n tests: WorkflowTestResult[];\n sessionId: string;\n cleanupResult?: { success: boolean; deleted: string[]; failed: string[] };\n}\n\nexport interface ExecutionContext {\n variables: Map<string, string>;\n lastEmail: Email | null;\n emailClient: InbucketClient | null;\n appwriteContext: TestContext;\n appwriteConfig?: {\n endpoint: string;\n projectId: string;\n apiKey: string;\n };\n}\n\nconst defaultScreenshotDir = path.join(process.cwd(), 'artifacts', 'screenshots');\n\nconst getBrowser = (browser: BrowserName): BrowserType => {\n switch (browser) {\n case 'firefox':\n return firefox;\n case 'webkit':\n return webkit;\n default:\n return chromium;\n }\n};\n\n/**\n * Interpolates variables from the execution context and previous test results.\n * Supports syntax: {{testId.varName}} for cross-test references and {{varName}} for current test variables.\n */\nfunction interpolateWorkflowVariables(\n value: string,\n currentVariables: Map<string, string>,\n testResults: WorkflowTestResult[]\n): string {\n return value.replace(/\\{\\{([^}]+)\\}\\}/g, (match, path) => {\n // Handle {{testId.varName}} syntax\n if (path.includes('.')) {\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 // Handle {{varName}} syntax from current test variables\n if (path === 'uuid') {\n return crypto.randomUUID().split('-')[0]; // Short UUID\n }\n return currentVariables.get(path) ?? match;\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 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 const interpolateVariables = (value: string): string => {\n return value.replace(/\\{\\{(\\w+)\\}\\}/g, (match, varName) => {\n if (varName === 'uuid') {\n return crypto.randomUUID().split('-')[0];\n }\n return context.variables.get(varName) ?? match;\n });\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 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 = interpolateVariables(action.value);\n const baseUrl = test.config?.web?.baseUrl ?? workflowBaseUrl;\n const target = resolveUrl(interpolated, baseUrl);\n if (debugMode) console.log(` [DEBUG] Navigating to: ${target}`);\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 break;\n }\n case 'input': {\n const interpolated = interpolateVariables(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 '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 = interpolateVariables(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 filename = action.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 continue;\n }\n case 'setVar': {\n let value: string;\n if (action.value) {\n value = interpolateVariables(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 = interpolateVariables(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 = interpolateVariables(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 default:\n throw new Error(`Unsupported action type: ${(action as Action).type}`);\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 if (!config) return undefined;\n\n // Check for new cleanup config first\n if (config.cleanup) {\n return config.cleanup;\n }\n\n // Backwards compatibility: convert old appwrite config\n if (config.appwrite?.cleanup) {\n return {\n provider: 'appwrite',\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 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 // 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 // Interpolate {{uuid}} and other built-in variables\n const interpolated = value.replace(/\\{\\{(\\w+)\\}\\}/g, (match, varName) => {\n if (varName === 'uuid') {\n return crypto.randomUUID().split('-')[0];\n }\n return executionContext.variables.get(varName) ?? match;\n });\n executionContext.variables.set(key, interpolated);\n }\n }\n\n // Run test with shared browser context\n const result = await runTestInWorkflow(test, page, executionContext, options, workflowDir, workflow.config?.web?.baseUrl);\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 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 = crypto.randomUUID();\n const testStartTime = new Date().toISOString();\n\n // 1. Start tracking server\n let trackingServer: TrackingServer | null = null;\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\n // 3. Start web server if configured\n let serverProcess: ChildProcess | null = null;\n if (workflow.config?.webServer) {\n try {\n serverProcess = await startWebServer({\n ...workflow.config.webServer,\n cwd: workflowDir,\n });\n } catch (error) {\n console.error('Failed to start web server:', error);\n if (trackingServer) await trackingServer.stop();\n throw error;\n }\n }\n\n // Handle cleanup on Ctrl+C\n const signalCleanup = async () => {\n console.log('\\n\\nInterrupted - cleaning up...');\n killServer(serverProcess);\n if (trackingServer) await trackingServer.stop();\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 ? false : workflow.config?.web?.headless ?? true;\n const browser = await getBrowser(browserName).launch({ headless });\n const browserContext = await browser.newContext();\n const 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 try {\n // 6. Run workflow with context (skipCleanup=true so we can collect tracking resources first)\n const result = await runWorkflowWithContext(workflow, workflowFilePath, {\n ...options,\n page,\n executionContext,\n skipCleanup: true,\n sessionId,\n testStartTime,\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 // 8. Cleanup resources using the extensible cleanup system\n let cleanupResult: { success: boolean; deleted: string[]; failed: string[] } | undefined;\n\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 = 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 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 // Stop servers\n killServer(serverProcess);\n if (trackingServer) {\n await trackingServer.stop();\n }\n\n // Clean up env vars\n delete process.env.INTELLITESTER_SESSION_ID;\n delete process.env.INTELLITESTER_TRACK_URL;\n }\n}\n"]}