qagentic-reporter 0.1.27 → 0.1.28

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.
@@ -673,6 +673,7 @@ var QAgenticCypressReporter = class {
673
673
  constructor(config) {
674
674
  this.currentRun = null;
675
675
  this.runStarted = false;
676
+ this.runFinalized = false;
676
677
  this.stats = {
677
678
  suites: 0,
678
679
  tests: 0,
@@ -759,8 +760,10 @@ var QAgenticCypressReporter = class {
759
760
  console.warn("[QAagentic] Failed to report test:", error);
760
761
  }
761
762
  }
762
- async onRunEnd() {
763
- if (!this.currentRun) return;
763
+ async finalizeRun() {
764
+ if (this.runFinalized || !this.currentRun) return;
765
+ this.runFinalized = true;
766
+ console.log("[QAagentic] Finalizing run");
764
767
  try {
765
768
  this.stats.end = /* @__PURE__ */ new Date();
766
769
  this.stats.duration = this.stats.end.getTime() - this.stats.start.getTime();
@@ -770,51 +773,32 @@ var QAgenticCypressReporter = class {
770
773
  this.currentRun.passed = this.stats.passes;
771
774
  this.currentRun.failed = this.stats.failures;
772
775
  this.currentRun.skipped = this.stats.pending;
776
+ console.log("[QAagentic] Calling reporter.endRun with stats:", {
777
+ total: this.currentRun.total,
778
+ passed: this.currentRun.passed,
779
+ failed: this.currentRun.failed,
780
+ skipped: this.currentRun.skipped
781
+ });
773
782
  await this.reporter.endRun();
774
- await new Promise((resolve) => setTimeout(resolve, 2e3));
783
+ console.log("[QAagentic] Run finalized successfully");
775
784
  } catch (error) {
776
- console.warn("[QAagentic] Failed to end run:", error);
785
+ console.warn("[QAagentic] Failed to finalize run:", error);
777
786
  }
778
787
  }
779
788
  };
780
789
  function setupQAgentic(on, config) {
781
790
  const reporter = new QAgenticCypressReporter(config);
782
- on("before:run", () => {
783
- return (async () => {
784
- console.log("[QAagentic] Starting test run");
785
- try {
786
- await reporter.onRunBegin();
787
- console.log("[QAagentic] Test run started successfully");
788
- await new Promise((resolve) => setTimeout(resolve, 2e3));
789
- } catch (error) {
790
- console.warn("[QAagentic] Error starting test run:", error);
791
- }
792
- })();
793
- });
794
791
  on("after:spec", (_spec, results) => {
795
792
  return (async () => {
796
793
  if (!results?.tests) return;
797
- console.log("[QAagentic] Processing", results.tests.length, "test results");
798
794
  try {
799
795
  for (const test of results.tests) {
800
796
  await reporter.onTestEnd(test);
801
797
  }
802
- console.log("[QAagentic] Test results processed successfully");
803
- await new Promise((resolve) => setTimeout(resolve, 1e3));
804
- } catch (error) {
805
- console.warn("[QAagentic] Error processing test results:", error);
806
- }
807
- })();
808
- });
809
- on("after:run", () => {
810
- return (async () => {
811
- console.log("[QAagentic] Ending test run");
812
- try {
813
- await reporter.onRunEnd();
814
- console.log("[QAagentic] Test run ended successfully");
815
- await new Promise((resolve) => setTimeout(resolve, 3e3));
798
+ await reporter.finalizeRun();
799
+ await new Promise((resolve) => setTimeout(resolve, 2e3));
816
800
  } catch (error) {
817
- console.warn("[QAagentic] Error ending test run:", error);
801
+ console.warn("[QAagentic] Error processing spec:", error);
818
802
  }
819
803
  })();
820
804
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/config.ts","../../src/core/status.ts","../../src/core/reporter.ts","../../src/cypress/simple-setup.ts"],"names":["fs","path","fs2","path2","axios","uuidv4"],"mappings":"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","file":"simple-setup.js","sourcesContent":["/**\r\n * Configuration management for QAagentic SDK.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\n/**\r\n * API reporting configuration.\r\n */\r\nexport interface APIConfig {\r\n enabled: boolean;\r\n url: string;\r\n key?: string;\r\n timeout: number;\r\n retryCount: number;\r\n batchSize: number;\r\n}\r\n\r\n/**\r\n * Local file reporting configuration.\r\n */\r\nexport interface LocalConfig {\r\n enabled: boolean;\r\n outputDir: string;\r\n formats: ('json' | 'html' | 'junit')[];\r\n cleanOnStart: boolean;\r\n}\r\n\r\n/**\r\n * Feature flags configuration.\r\n */\r\nexport interface FeaturesConfig {\r\n aiAnalysis: boolean;\r\n failureClustering: boolean;\r\n flakyDetection: boolean;\r\n screenshots: 'always' | 'on_failure' | 'never';\r\n videos: 'always' | 'on_failure' | 'never';\r\n consoleOutput: boolean;\r\n}\r\n\r\n/**\r\n * Labels configuration.\r\n */\r\nexport interface LabelsConfig {\r\n team?: string;\r\n component?: string;\r\n environment?: string;\r\n custom: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Main configuration for QAagentic SDK.\r\n */\r\nexport interface QAgenticConfig {\r\n projectName: string;\r\n environment: string;\r\n api: APIConfig;\r\n local: LocalConfig;\r\n features: FeaturesConfig;\r\n labels: LabelsConfig;\r\n}\r\n\r\n/**\r\n * Default configuration values.\r\n */\r\nconst defaultConfig: QAgenticConfig = {\r\n projectName: 'default',\r\n environment: 'local',\r\n api: {\r\n enabled: true,\r\n url: 'http://localhost:8080',\r\n timeout: 30000,\r\n retryCount: 3,\r\n batchSize: 100,\r\n },\r\n local: {\r\n enabled: true,\r\n outputDir: './qagentic-results',\r\n formats: ['json', 'html'],\r\n cleanOnStart: true,\r\n },\r\n features: {\r\n aiAnalysis: true,\r\n failureClustering: true,\r\n flakyDetection: true,\r\n screenshots: 'on_failure',\r\n videos: 'on_failure',\r\n consoleOutput: true,\r\n },\r\n labels: {\r\n custom: {},\r\n },\r\n};\r\n\r\n// Global configuration instance\r\nlet globalConfig: QAgenticConfig = { ...defaultConfig };\r\n\r\n/**\r\n * Load configuration from environment variables.\r\n */\r\nfunction loadFromEnv(config: QAgenticConfig): QAgenticConfig {\r\n const env = process.env;\r\n\r\n // Project settings\r\n if (env.QAGENTIC_PROJECT_NAME) {\r\n config.projectName = env.QAGENTIC_PROJECT_NAME;\r\n }\r\n if (env.QAGENTIC_ENVIRONMENT) {\r\n config.environment = env.QAGENTIC_ENVIRONMENT;\r\n }\r\n\r\n // API settings\r\n if (env.QAGENTIC_API_ENABLED !== undefined) {\r\n config.api.enabled = env.QAGENTIC_API_ENABLED.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_API_URL) {\r\n config.api.url = env.QAGENTIC_API_URL;\r\n }\r\n if (env.QAGENTIC_API_KEY) {\r\n config.api.key = env.QAGENTIC_API_KEY;\r\n }\r\n\r\n // Local settings\r\n if (env.QAGENTIC_LOCAL_ENABLED !== undefined) {\r\n config.local.enabled = env.QAGENTIC_LOCAL_ENABLED.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_OUTPUT_DIR) {\r\n config.local.outputDir = env.QAGENTIC_OUTPUT_DIR;\r\n }\r\n if (env.QAGENTIC_OUTPUT_FORMAT) {\r\n config.local.formats = env.QAGENTIC_OUTPUT_FORMAT.split(',').map(\r\n (f) => f.trim() as 'json' | 'html' | 'junit'\r\n );\r\n }\r\n\r\n // Feature flags\r\n if (env.QAGENTIC_AI_ANALYSIS !== undefined) {\r\n config.features.aiAnalysis = env.QAGENTIC_AI_ANALYSIS.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_SCREENSHOTS) {\r\n config.features.screenshots = env.QAGENTIC_SCREENSHOTS as 'always' | 'on_failure' | 'never';\r\n }\r\n if (env.QAGENTIC_VIDEOS) {\r\n config.features.videos = env.QAGENTIC_VIDEOS as 'always' | 'on_failure' | 'never';\r\n }\r\n\r\n // Labels\r\n if (env.QAGENTIC_TEAM) {\r\n config.labels.team = env.QAGENTIC_TEAM;\r\n }\r\n if (env.QAGENTIC_COMPONENT) {\r\n config.labels.component = env.QAGENTIC_COMPONENT;\r\n }\r\n\r\n return config;\r\n}\r\n\r\n/**\r\n * Load configuration from YAML file.\r\n */\r\nfunction loadFromFile(filePath: string, config: QAgenticConfig): QAgenticConfig {\r\n try {\r\n if (!fs.existsSync(filePath)) {\r\n return config;\r\n }\r\n\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n // Simple YAML parsing for common cases\r\n const yaml = require('yaml');\r\n const data = yaml.parse(content);\r\n\r\n if (data.project) {\r\n if (data.project.name) config.projectName = data.project.name;\r\n if (data.project.environment) config.environment = data.project.environment;\r\n }\r\n\r\n if (data.reporting?.api) {\r\n if (data.reporting.api.enabled !== undefined) config.api.enabled = data.reporting.api.enabled;\r\n if (data.reporting.api.url) config.api.url = data.reporting.api.url;\r\n if (data.reporting.api.key) config.api.key = data.reporting.api.key;\r\n }\r\n\r\n if (data.reporting?.local) {\r\n if (data.reporting.local.enabled !== undefined)\r\n config.local.enabled = data.reporting.local.enabled;\r\n if (data.reporting.local.output_dir) config.local.outputDir = data.reporting.local.output_dir;\r\n if (data.reporting.local.formats) config.local.formats = data.reporting.local.formats;\r\n }\r\n\r\n if (data.features) {\r\n if (data.features.ai_analysis !== undefined)\r\n config.features.aiAnalysis = data.features.ai_analysis;\r\n if (data.features.failure_clustering !== undefined)\r\n config.features.failureClustering = data.features.failure_clustering;\r\n if (data.features.flaky_detection !== undefined)\r\n config.features.flakyDetection = data.features.flaky_detection;\r\n if (data.features.screenshots) config.features.screenshots = data.features.screenshots;\r\n if (data.features.videos) config.features.videos = data.features.videos;\r\n }\r\n\r\n if (data.labels) {\r\n if (data.labels.team) config.labels.team = data.labels.team;\r\n if (data.labels.component) config.labels.component = data.labels.component;\r\n config.labels.custom = { ...config.labels.custom, ...data.labels };\r\n }\r\n } catch (error) {\r\n console.warn(`Failed to load config from ${filePath}:`, error);\r\n }\r\n\r\n return config;\r\n}\r\n\r\n/**\r\n * Auto-discover configuration from common locations.\r\n */\r\nfunction autoDiscover(): QAgenticConfig {\r\n const config = { ...defaultConfig };\r\n const cwd = process.cwd();\r\n\r\n const searchPaths = [\r\n path.join(cwd, 'qagentic.yaml'),\r\n path.join(cwd, 'qagentic.yml'),\r\n path.join(cwd, '.qagentic.yaml'),\r\n path.join(cwd, '.qagentic.yml'),\r\n ];\r\n\r\n for (const filePath of searchPaths) {\r\n if (fs.existsSync(filePath)) {\r\n loadFromFile(filePath, config);\r\n break;\r\n }\r\n }\r\n\r\n return loadFromEnv(config);\r\n}\r\n\r\n/**\r\n * Configure QAagentic SDK.\r\n */\r\nexport function configure(options: Partial<QAgenticConfig> & {\r\n projectName?: string;\r\n apiUrl?: string;\r\n apiKey?: string;\r\n outputDir?: string;\r\n} = {}): QAgenticConfig {\r\n globalConfig = autoDiscover();\r\n\r\n if (options.projectName) {\r\n globalConfig.projectName = options.projectName;\r\n }\r\n if (options.environment) {\r\n globalConfig.environment = options.environment;\r\n }\r\n if (options.apiUrl) {\r\n globalConfig.api.url = options.apiUrl;\r\n }\r\n if (options.apiKey) {\r\n globalConfig.api.key = options.apiKey;\r\n }\r\n if (options.outputDir) {\r\n globalConfig.local.outputDir = options.outputDir;\r\n }\r\n\r\n // Merge nested configs\r\n if (options.api) {\r\n globalConfig.api = { ...globalConfig.api, ...options.api };\r\n }\r\n if (options.local) {\r\n globalConfig.local = { ...globalConfig.local, ...options.local };\r\n }\r\n if (options.features) {\r\n globalConfig.features = { ...globalConfig.features, ...options.features };\r\n }\r\n if (options.labels) {\r\n globalConfig.labels = { ...globalConfig.labels, ...options.labels };\r\n }\r\n\r\n return globalConfig;\r\n}\r\n\r\n/**\r\n * Get the current configuration.\r\n */\r\nexport function getConfig(): QAgenticConfig {\r\n return globalConfig;\r\n}\r\n\r\n/**\r\n * Reset configuration to defaults.\r\n */\r\nexport function resetConfig(): void {\r\n globalConfig = { ...defaultConfig };\r\n}\r\n","/**\r\n * Test execution status.\r\n */\r\n\r\nexport enum Status {\r\n PASSED = 'passed',\r\n FAILED = 'failed',\r\n BROKEN = 'broken',\r\n SKIPPED = 'skipped',\r\n PENDING = 'pending',\r\n RUNNING = 'running',\r\n UNKNOWN = 'unknown',\r\n}\r\n\r\n/**\r\n * Check if status represents a successful outcome.\r\n */\r\nexport function isSuccessful(status: Status): boolean {\r\n return status === Status.PASSED;\r\n}\r\n\r\n/**\r\n * Check if status represents a failure.\r\n */\r\nexport function isFailure(status: Status): boolean {\r\n return status === Status.FAILED || status === Status.BROKEN;\r\n}\r\n\r\n/**\r\n * Parse status from string.\r\n */\r\nexport function parseStatus(value: string): Status {\r\n const normalized = value.toLowerCase();\r\n switch (normalized) {\r\n case 'passed':\r\n case 'pass':\r\n case 'success':\r\n return Status.PASSED;\r\n case 'failed':\r\n case 'fail':\r\n case 'failure':\r\n return Status.FAILED;\r\n case 'broken':\r\n case 'error':\r\n return Status.BROKEN;\r\n case 'skipped':\r\n case 'skip':\r\n case 'pending':\r\n return Status.SKIPPED;\r\n case 'running':\r\n return Status.RUNNING;\r\n default:\r\n return Status.UNKNOWN;\r\n }\r\n}\r\n","/**\r\n * Reporter classes for outputting test results to various destinations.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport axios from 'axios';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { getConfig, QAgenticConfig } from './config';\r\nimport { Status } from './status';\r\nimport type { TestResult, TestRunResult, StepResult } from './types';\r\n\r\n/**\r\n * Base reporter interface.\r\n */\r\nexport interface BaseReporter {\r\n startRun(run: TestRunResult): void | Promise<void>;\r\n endRun(run: TestRunResult): void | Promise<void>;\r\n reportTest(test: TestResult): void | Promise<void>;\r\n}\r\n\r\n/**\r\n * Console reporter with colored output.\r\n */\r\nexport class ConsoleReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n }\r\n\r\n startRun(run: TestRunResult): void {\r\n console.log('\\n' + '='.repeat(60));\r\n console.log(`🚀 QAagentic Test Run - ${run.projectName}`);\r\n console.log(`Environment: ${run.environment}`);\r\n console.log('='.repeat(60) + '\\n');\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n const icon = run.failed === 0 ? '✅' : '❌';\r\n console.log('\\n' + '='.repeat(60));\r\n console.log(`${icon} Test Run Complete - ${run.passRate.toFixed(1)}% Pass Rate`);\r\n console.log(`Passed: ${run.passed} | Failed: ${run.failed} | Skipped: ${run.skipped}`);\r\n console.log('='.repeat(60) + '\\n');\r\n }\r\n\r\n reportTest(test: TestResult): void {\r\n if (!this.config.features.consoleOutput) return;\r\n\r\n const symbols: Record<Status, string> = {\r\n [Status.PASSED]: '✓',\r\n [Status.FAILED]: '✗',\r\n [Status.BROKEN]: '!',\r\n [Status.SKIPPED]: '○',\r\n [Status.PENDING]: '…',\r\n [Status.RUNNING]: '→',\r\n [Status.UNKNOWN]: '?',\r\n };\r\n\r\n const symbol = symbols[test.status as Status] || '?';\r\n console.log(` ${symbol} ${test.name}`);\r\n\r\n if (test.errorMessage) {\r\n console.log(` Error: ${test.errorMessage.slice(0, 100)}...`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * JSON file reporter.\r\n */\r\nexport class JSONReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private outputDir: string;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n this.outputDir = this.config.local.outputDir;\r\n }\r\n\r\n startRun(run: TestRunResult): void {\r\n // Create output directory\r\n if (!fs.existsSync(this.outputDir)) {\r\n fs.mkdirSync(this.outputDir, { recursive: true });\r\n }\r\n\r\n // Clean previous results if configured\r\n if (this.config.local.cleanOnStart) {\r\n const files = fs.readdirSync(this.outputDir);\r\n for (const file of files) {\r\n if (file.endsWith('.json')) {\r\n fs.unlinkSync(path.join(this.outputDir, file));\r\n }\r\n }\r\n }\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n if (!this.config.local.enabled || !this.config.local.formats.includes('json')) {\r\n return;\r\n }\r\n\r\n // Write run summary\r\n const runFile = path.join(this.outputDir, 'run.json');\r\n fs.writeFileSync(runFile, JSON.stringify(this.serializeRun(run), null, 2));\r\n\r\n // Write individual test results\r\n const testsDir = path.join(this.outputDir, 'tests');\r\n if (!fs.existsSync(testsDir)) {\r\n fs.mkdirSync(testsDir, { recursive: true });\r\n }\r\n\r\n for (const test of run.tests) {\r\n const testFile = path.join(testsDir, `${test.id}.json`);\r\n fs.writeFileSync(testFile, JSON.stringify(this.serializeTest(test), null, 2));\r\n }\r\n }\r\n\r\n reportTest(_test: TestResult): void {\r\n // Tests are written at end\r\n }\r\n\r\n private serializeRun(run: TestRunResult): Record<string, unknown> {\r\n return {\r\n ...run,\r\n startTime: run.startTime?.toISOString(),\r\n endTime: run.endTime?.toISOString(),\r\n tests: run.tests.map((t) => this.serializeTest(t)),\r\n };\r\n }\r\n\r\n private serializeTest(test: TestResult): Record<string, unknown> {\r\n return {\r\n ...test,\r\n startTime: test.startTime?.toISOString(),\r\n endTime: test.endTime?.toISOString(),\r\n steps: test.steps.map((s) => this.serializeStep(s)),\r\n };\r\n }\r\n\r\n private serializeStep(step: StepResult): Record<string, unknown> {\r\n return {\r\n ...step,\r\n startTime: step.startTime?.toISOString(),\r\n endTime: step.endTime?.toISOString(),\r\n children: step.children.map((c) => this.serializeStep(c)),\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * JUnit XML reporter for CI/CD compatibility.\r\n */\r\nexport class JUnitReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private outputDir: string;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n this.outputDir = this.config.local.outputDir;\r\n }\r\n\r\n startRun(_run: TestRunResult): void {\r\n if (!fs.existsSync(this.outputDir)) {\r\n fs.mkdirSync(this.outputDir, { recursive: true });\r\n }\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n if (!this.config.local.enabled || !this.config.local.formats.includes('junit')) {\r\n return;\r\n }\r\n\r\n const xml = this.generateXml(run);\r\n const junitFile = path.join(this.outputDir, 'junit.xml');\r\n fs.writeFileSync(junitFile, xml);\r\n }\r\n\r\n reportTest(_test: TestResult): void {\r\n // Tests are written at end\r\n }\r\n\r\n private generateXml(run: TestRunResult): string {\r\n const escape = (str: string) =>\r\n str\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;');\r\n\r\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\r\n xml += `<testsuite name=\"${escape(run.projectName)}\" `;\r\n xml += `tests=\"${run.total}\" `;\r\n xml += `failures=\"${run.failed}\" `;\r\n xml += `errors=\"${run.broken}\" `;\r\n xml += `skipped=\"${run.skipped}\" `;\r\n xml += `time=\"${(run.durationMs / 1000).toFixed(3)}\" `;\r\n xml += `timestamp=\"${run.startTime?.toISOString() || ''}\">\\n`;\r\n\r\n for (const test of run.tests) {\r\n xml += ` <testcase name=\"${escape(test.name)}\" `;\r\n xml += `classname=\"${escape(test.fullName)}\" `;\r\n xml += `time=\"${(test.durationMs / 1000).toFixed(3)}\"`;\r\n\r\n if (test.status === Status.PASSED) {\r\n xml += '/>\\n';\r\n } else if (test.status === Status.FAILED) {\r\n xml += '>\\n';\r\n xml += ` <failure message=\"${escape(test.errorMessage || 'Test failed')}\" `;\r\n xml += `type=\"${escape(test.errorType || 'AssertionError')}\">`;\r\n if (test.stackTrace) {\r\n xml += escape(test.stackTrace);\r\n }\r\n xml += '</failure>\\n';\r\n xml += ' </testcase>\\n';\r\n } else if (test.status === Status.BROKEN) {\r\n xml += '>\\n';\r\n xml += ` <error message=\"${escape(test.errorMessage || 'Test error')}\" `;\r\n xml += `type=\"${escape(test.errorType || 'Error')}\">`;\r\n if (test.stackTrace) {\r\n xml += escape(test.stackTrace);\r\n }\r\n xml += '</error>\\n';\r\n xml += ' </testcase>\\n';\r\n } else if (test.status === Status.SKIPPED) {\r\n xml += '>\\n';\r\n xml += ` <skipped${test.errorMessage ? ` message=\"${escape(test.errorMessage)}\"` : ''}/>\\n`;\r\n xml += ' </testcase>\\n';\r\n } else {\r\n xml += '/>\\n';\r\n }\r\n }\r\n\r\n xml += '</testsuite>\\n';\r\n return xml;\r\n }\r\n}\r\n\r\n/**\r\n * API reporter that sends results to QAagentic server.\r\n */\r\nexport class APIReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private batch: TestResult[] = [];\r\n private currentRun?: TestRunResult;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n }\r\n\r\n async startRun(run: TestRunResult): Promise<void> {\r\n if (!this.config.api.enabled) {\r\n console.log('[APIReporter] API reporting disabled');\r\n return;\r\n }\r\n\r\n this.currentRun = run;\r\n this.batch = [];\r\n\r\n try {\r\n console.log('[APIReporter] Starting test run:', run.id);\r\n const url = `${this.config.api.url}/api/v1/runs`;\r\n console.log('[APIReporter] POST to:', url);\r\n \r\n const response = await axios.post(\r\n url,\r\n {\r\n id: run.id,\r\n name: run.name,\r\n project_name: run.projectName,\r\n environment: run.environment,\r\n start_time: run.startTime?.toISOString(),\r\n labels: run.labels,\r\n ci_build_id: run.ciBuildId,\r\n branch: run.branch,\r\n commit_hash: run.commitHash,\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n 'X-Project': this.config.projectName,\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Test run started successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to register run with API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n }\r\n }\r\n\r\n async endRun(run: TestRunResult): Promise<void> {\r\n if (!this.config.api.enabled) return;\r\n\r\n try {\r\n console.log('[APIReporter] endRun called, batch size:', this.batch.length);\r\n \r\n // Flush remaining batch - ALWAYS flush, even if batch is not full\r\n if (this.batch.length > 0) {\r\n console.log('[APIReporter] Flushing remaining', this.batch.length, 'test results');\r\n await this.flushBatch();\r\n console.log('[APIReporter] Batch flushed, waiting for processing...');\r\n await new Promise((resolve) => setTimeout(resolve, 1500));\r\n }\r\n\r\n console.log('[APIReporter] Finalizing run with test counts:', {\r\n total: run.total,\r\n passed: run.passed,\r\n failed: run.failed,\r\n broken: run.broken,\r\n skipped: run.skipped,\r\n });\r\n \r\n const patchData = {\r\n end_time: run.endTime?.toISOString(),\r\n duration_ms: run.durationMs,\r\n total: run.total,\r\n passed: run.passed,\r\n failed: run.failed,\r\n broken: run.broken,\r\n skipped: run.skipped,\r\n status: 'completed',\r\n };\r\n \r\n console.log('[APIReporter] PATCH to:', `${this.config.api.url}/api/v1/runs/${run.id}`);\r\n console.log('[APIReporter] PATCH data:', patchData);\r\n \r\n const response = await axios.patch(\r\n `${this.config.api.url}/api/v1/runs/${run.id}`,\r\n patchData,\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n 'X-Project': this.config.projectName,\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Run finalized successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to finalize run with API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n }\r\n }\r\n\r\n async reportTest(test: TestResult): Promise<void> {\r\n console.log('[APIReporter] reportTest called for:', test.name, 'API enabled:', this.config.api.enabled);\r\n if (!this.config.api.enabled) {\r\n console.log('[APIReporter] API reporting disabled, skipping test report');\r\n return;\r\n }\r\n\r\n console.log('[APIReporter] Adding test to batch:', test.name, '- batch size:', this.batch.length + 1);\r\n this.batch.push(test);\r\n\r\n if (this.batch.length >= this.config.api.batchSize) {\r\n console.log('[APIReporter] Batch size reached, flushing batch');\r\n await this.flushBatch();\r\n } else {\r\n console.log('[APIReporter] Batch size:', this.batch.length, '/', this.config.api.batchSize);\r\n }\r\n }\r\n\r\n private async flushBatch(): Promise<void> {\r\n if (this.batch.length === 0 || !this.currentRun) return;\r\n\r\n try {\r\n console.log('[APIReporter] Flushing batch of', this.batch.length, 'test results');\r\n const response = await axios.post(\r\n `${this.config.api.url}/api/v1/runs/${this.currentRun.id}/results`,\r\n this.batch.map((t) => ({\r\n ...t,\r\n startTime: t.startTime?.toISOString(),\r\n endTime: t.endTime?.toISOString(),\r\n })),\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Batch flushed successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to send test results to API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n } finally {\r\n this.batch = [];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Main reporter that coordinates multiple output destinations.\r\n */\r\nexport class QAgenticReporter {\r\n private static instance: QAgenticReporter | null = null;\r\n private config: QAgenticConfig;\r\n private reporters: BaseReporter[] = [];\r\n private currentRun: TestRunResult | null = null;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n\r\n console.log('[QAgenticReporter] Initializing with config:', {\r\n projectName: this.config.projectName,\r\n environment: this.config.environment,\r\n apiEnabled: this.config.api.enabled,\r\n apiUrl: this.config.api.url,\r\n });\r\n\r\n // Initialize reporters based on config\r\n if (this.config.features.consoleOutput) {\r\n this.reporters.push(new ConsoleReporter(this.config));\r\n console.log('[QAgenticReporter] Added ConsoleReporter');\r\n }\r\n\r\n if (this.config.local.enabled) {\r\n this.reporters.push(new JSONReporter(this.config));\r\n console.log('[QAgenticReporter] Added JSONReporter');\r\n if (this.config.local.formats.includes('junit')) {\r\n this.reporters.push(new JUnitReporter(this.config));\r\n console.log('[QAgenticReporter] Added JUnitReporter');\r\n }\r\n }\r\n\r\n if (this.config.api.enabled) {\r\n this.reporters.push(new APIReporter(this.config));\r\n console.log('[QAgenticReporter] Added APIReporter');\r\n }\r\n\r\n console.log('[QAgenticReporter] Initialization complete with', this.reporters.length, 'reporters');\r\n }\r\n\r\n /**\r\n * Get singleton instance.\r\n */\r\n static getInstance(config?: QAgenticConfig): QAgenticReporter {\r\n if (!QAgenticReporter.instance) {\r\n QAgenticReporter.instance = new QAgenticReporter(config);\r\n }\r\n return QAgenticReporter.instance;\r\n }\r\n\r\n /**\r\n * Reset singleton instance.\r\n */\r\n static reset(): void {\r\n QAgenticReporter.instance = null;\r\n }\r\n\r\n /**\r\n * Start a new test run.\r\n */\r\n async startRun(options: Partial<TestRunResult> = {}): Promise<TestRunResult> {\r\n this.currentRun = {\r\n id: options.id || uuidv4(),\r\n name: options.name || `run_${new Date().toISOString().replace(/[:.]/g, '')}`,\r\n projectName: options.projectName || this.config.projectName,\r\n environment: options.environment || this.config.environment,\r\n startTime: new Date(),\r\n durationMs: 0,\r\n tests: [],\r\n total: 0,\r\n passed: 0,\r\n failed: 0,\r\n broken: 0,\r\n skipped: 0,\r\n passRate: 0,\r\n labels: { ...this.config.labels.custom, ...options.labels },\r\n parameters: options.parameters || {},\r\n ciBuildId: options.ciBuildId,\r\n ciBuildUrl: options.ciBuildUrl,\r\n branch: options.branch,\r\n commitHash: options.commitHash,\r\n };\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.startRun(this.currentRun);\r\n }\r\n\r\n return this.currentRun;\r\n }\r\n\r\n /**\r\n * End the current test run.\r\n */\r\n async endRun(): Promise<TestRunResult | null> {\r\n if (!this.currentRun) return null;\r\n\r\n this.currentRun.endTime = new Date();\r\n this.currentRun.durationMs =\r\n this.currentRun.endTime.getTime() - (this.currentRun.startTime?.getTime() || 0);\r\n this.currentRun.passRate =\r\n this.currentRun.total > 0 ? (this.currentRun.passed / this.currentRun.total) * 100 : 0;\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.endRun(this.currentRun);\r\n }\r\n\r\n const run = this.currentRun;\r\n this.currentRun = null;\r\n return run;\r\n }\r\n\r\n /**\r\n * Report a test result.\r\n */\r\n async reportTest(test: TestResult): Promise<void> {\r\n if (!this.currentRun) {\r\n console.warn('[QAgenticReporter] No active run to report test');\r\n return;\r\n }\r\n\r\n this.currentRun.tests.push(test);\r\n this.currentRun.total++;\r\n\r\n switch (test.status) {\r\n case 'passed':\r\n this.currentRun.passed++;\r\n break;\r\n case 'failed':\r\n this.currentRun.failed++;\r\n break;\r\n case 'broken':\r\n this.currentRun.broken++;\r\n break;\r\n case 'skipped':\r\n this.currentRun.skipped++;\r\n break;\r\n }\r\n\r\n console.log('[QAgenticReporter] Test counts:', {\r\n total: this.currentRun.total,\r\n passed: this.currentRun.passed,\r\n failed: this.currentRun.failed,\r\n broken: this.currentRun.broken,\r\n skipped: this.currentRun.skipped,\r\n });\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.reportTest(test);\r\n }\r\n }\r\n\r\n /**\r\n * Get the current test run.\r\n */\r\n getCurrentRun(): TestRunResult | null {\r\n return this.currentRun;\r\n }\r\n}\r\n\r\n/**\r\n * Get the global reporter instance.\r\n */\r\nexport function getReporter(config?: QAgenticConfig): QAgenticReporter {\r\n return QAgenticReporter.getInstance(config);\r\n}\r\n","/**\r\n * QAagentic Cypress - Simplified Setup\r\n * \r\n * One-line integration for Cypress projects\r\n * No complex configuration needed!\r\n * \r\n * @example\r\n * ```typescript\r\n * // cypress.config.ts - Just add this one line!\r\n * import { setupQAgentic } from '@qagentic/reporter/cypress/simple-setup';\r\n * \r\n * export default defineConfig({\r\n * e2e: {\r\n * setupNodeEvents(on, config) {\r\n * setupQAgentic(on, config); // That's it!\r\n * return config;\r\n * },\r\n * },\r\n * });\r\n * ```\r\n */\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { configure } from '../core/config';\r\nimport { QAgenticReporter } from '../core/reporter';\r\nimport { parseStatus } from '../core/status';\r\nimport type { TestResult, TestRunResult } from '../core/types';\r\n\r\n/**\r\n * Simplified QAagentic setup for Cypress\r\n * Auto-detects configuration from environment variables\r\n * Zero manual configuration needed!\r\n */\r\nclass QAgenticCypressReporter {\r\n private reporter: QAgenticReporter;\r\n private currentRun: TestRunResult | null = null;\r\n private projectName: string;\r\n private environment: string;\r\n private runStarted = false;\r\n private stats = {\r\n suites: 0,\r\n tests: 0,\r\n passes: 0,\r\n pending: 0,\r\n failures: 0,\r\n start: new Date(),\r\n end: new Date(),\r\n duration: 0\r\n };\r\n\r\n constructor(config: any) {\r\n // Auto-configure from environment or defaults\r\n this.projectName = process.env.QAGENTIC_PROJECT_NAME || \r\n config.projectId || \r\n 'Cypress E2E Tests';\r\n \r\n this.environment = process.env.QAGENTIC_ENVIRONMENT || \r\n process.env.NODE_ENV || \r\n 'e2e';\r\n \r\n const apiUrl = process.env.QAGENTIC_API_URL || \r\n 'http://localhost:8080';\r\n\r\n // Configure QAagentic\r\n configure({\r\n projectName: this.projectName,\r\n environment: this.environment,\r\n apiUrl,\r\n outputDir: './qagentic-results',\r\n });\r\n\r\n this.reporter = QAgenticReporter.getInstance();\r\n this.stats.start = new Date();\r\n }\r\n\r\n async onRunBegin() {\r\n try {\r\n console.log('[QAagentic] onRunBegin called, calling reporter.startRun()');\r\n this.currentRun = await this.reporter.startRun({\r\n name: this.projectName,\r\n projectName: this.projectName,\r\n environment: this.environment,\r\n startTime: this.stats.start,\r\n });\r\n console.log('[QAagentic] onRunBegin completed, currentRun:', this.currentRun?.id);\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to start run:', error);\r\n }\r\n }\r\n\r\n async ensureRunStarted() {\r\n if (this.runStarted) return;\r\n \r\n this.runStarted = true;\r\n console.log('[QAagentic] Ensuring run is started');\r\n try {\r\n await this.onRunBegin();\r\n console.log('[QAagentic] Run started successfully');\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to start run:', error);\r\n }\r\n }\r\n\r\n async onTestEnd(test: any) {\r\n // Ensure run is started before processing tests\r\n await this.ensureRunStarted();\r\n \r\n if (!this.currentRun) return;\r\n\r\n try {\r\n const testResult: TestResult = {\r\n id: uuidv4(),\r\n name: test.title[test.title.length - 1],\r\n fullName: test.title.join(' > '),\r\n status: parseStatus(test.state),\r\n durationMs: test.duration,\r\n startTime: new Date(Date.now() - test.duration),\r\n endTime: new Date(),\r\n labels: {\r\n suite: test.title.slice(0, -1).join(' > '),\r\n feature: test.title[0],\r\n },\r\n links: [],\r\n parameters: {},\r\n steps: [],\r\n attachments: [],\r\n filePath: test.invocationDetails?.relativeFile || '',\r\n retryCount: 0,\r\n isRetry: false,\r\n isFlaky: false,\r\n };\r\n\r\n if (test.err) {\r\n testResult.errorMessage = test.err.message;\r\n testResult.stackTrace = test.err.stack;\r\n testResult.errorType = 'AssertionError';\r\n }\r\n\r\n // Update stats\r\n this.stats.tests++;\r\n if (test.state === 'passed') this.stats.passes++;\r\n if (test.state === 'failed') this.stats.failures++;\r\n if (test.state === 'pending') this.stats.pending++;\r\n\r\n await this.reporter.reportTest(testResult);\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to report test:', error);\r\n }\r\n }\r\n\r\n async onRunEnd() {\r\n if (!this.currentRun) return;\r\n\r\n try {\r\n this.stats.end = new Date();\r\n this.stats.duration = this.stats.end.getTime() - this.stats.start.getTime();\r\n\r\n // Update run with final stats\r\n this.currentRun.endTime = this.stats.end;\r\n this.currentRun.durationMs = this.stats.duration;\r\n this.currentRun.total = this.stats.tests;\r\n this.currentRun.passed = this.stats.passes;\r\n this.currentRun.failed = this.stats.failures;\r\n this.currentRun.skipped = this.stats.pending;\r\n\r\n await this.reporter.endRun();\r\n \r\n // Wait a bit longer to ensure all async operations complete\r\n await new Promise((resolve) => setTimeout(resolve, 2000));\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to end run:', error);\r\n }\r\n }\r\n}\r\n\r\nexport function setupQAgentic(on: any, config: any): void {\r\n const reporter = new QAgenticCypressReporter(config);\r\n\r\n // Register reporter events - return promises to ensure Cypress waits\r\n on('before:run', () => {\r\n return (async () => {\r\n console.log('[QAagentic] Starting test run');\r\n try {\r\n await reporter.onRunBegin();\r\n console.log('[QAagentic] Test run started successfully');\r\n // Wait to ensure async API calls complete\r\n await new Promise((resolve) => setTimeout(resolve, 2000));\r\n } catch (error) {\r\n console.warn('[QAagentic] Error starting test run:', error);\r\n }\r\n })();\r\n });\r\n \r\n on('after:spec', (_spec: any, results: any) => {\r\n return (async () => {\r\n if (!results?.tests) return;\r\n console.log('[QAagentic] Processing', results.tests.length, 'test results');\r\n try {\r\n for (const test of results.tests) {\r\n await reporter.onTestEnd(test);\r\n }\r\n console.log('[QAagentic] Test results processed successfully');\r\n // Wait for batch to flush\r\n await new Promise((resolve) => setTimeout(resolve, 1000));\r\n } catch (error) {\r\n console.warn('[QAagentic] Error processing test results:', error);\r\n }\r\n })();\r\n });\r\n \r\n on('after:run', () => {\r\n return (async () => {\r\n console.log('[QAagentic] Ending test run');\r\n try {\r\n await reporter.onRunEnd();\r\n console.log('[QAagentic] Test run ended successfully');\r\n // Final wait to ensure all uploads complete\r\n await new Promise((resolve) => setTimeout(resolve, 3000));\r\n } catch (error) {\r\n console.warn('[QAagentic] Error ending test run:', error);\r\n }\r\n })();\r\n });\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/core/config.ts","../../src/core/status.ts","../../src/core/reporter.ts","../../src/cypress/simple-setup.ts"],"names":["fs","path","fs2","path2","axios","uuidv4"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkEA,IAAM,aAAA,GAAgC;AAAA,EACpC,WAAA,EAAa,SAAA;AAAA,EACb,WAAA,EAAa,OAAA;AAAA,EACb,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,IAAA;AAAA,IACT,GAAA,EAAK,uBAAA;AAAA,IACL,OAAA,EAAS,GAAA;AAAA,IACT,UAAA,EAAY,CAAA;AAAA,IACZ,SAAA,EAAW;AAAA,GACb;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,SAAA,EAAW,oBAAA;AAAA,IACX,OAAA,EAAS,CAAC,MAAA,EAAQ,MAAM,CAAA;AAAA,IACxB,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,QAAA,EAAU;AAAA,IACR,UAAA,EAAY,IAAA;AAAA,IACZ,iBAAA,EAAmB,IAAA;AAAA,IACnB,cAAA,EAAgB,IAAA;AAAA,IAChB,WAAA,EAAa,YAAA;AAAA,IACb,MAAA,EAAQ,YAAA;AAAA,IACR,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,QAAQ;AAAC;AAEb,CAAA;AAGA,IAAI,YAAA,GAA+B,EAAE,GAAG,aAAA,EAAc;AAKtD,SAAS,YAAY,MAAA,EAAwC;AAC3D,EAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AAGpB,EAAA,IAAI,IAAI,qBAAA,EAAuB;AAC7B,IAAA,MAAA,CAAO,cAAc,GAAA,CAAI,qBAAA;AAAA,EAC3B;AACA,EAAA,IAAI,IAAI,oBAAA,EAAsB;AAC5B,IAAA,MAAA,CAAO,cAAc,GAAA,CAAI,oBAAA;AAAA,EAC3B;AAGA,EAAA,IAAI,GAAA,CAAI,yBAAyB,MAAA,EAAW;AAC1C,IAAA,MAAA,CAAO,GAAA,CAAI,OAAA,GAAU,GAAA,CAAI,oBAAA,CAAqB,aAAY,KAAM,MAAA;AAAA,EAClE;AACA,EAAA,IAAI,IAAI,gBAAA,EAAkB;AACxB,IAAA,MAAA,CAAO,GAAA,CAAI,MAAM,GAAA,CAAI,gBAAA;AAAA,EACvB;AACA,EAAA,IAAI,IAAI,gBAAA,EAAkB;AACxB,IAAA,MAAA,CAAO,GAAA,CAAI,MAAM,GAAA,CAAI,gBAAA;AAAA,EACvB;AAGA,EAAA,IAAI,GAAA,CAAI,2BAA2B,MAAA,EAAW;AAC5C,IAAA,MAAA,CAAO,KAAA,CAAM,OAAA,GAAU,GAAA,CAAI,sBAAA,CAAuB,aAAY,KAAM,MAAA;AAAA,EACtE;AACA,EAAA,IAAI,IAAI,mBAAA,EAAqB;AAC3B,IAAA,MAAA,CAAO,KAAA,CAAM,YAAY,GAAA,CAAI,mBAAA;AAAA,EAC/B;AACA,EAAA,IAAI,IAAI,sBAAA,EAAwB;AAC9B,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU,GAAA,CAAI,sBAAA,CAAuB,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA;AAAA,MAC3D,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA;AAAK,KAChB;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,yBAAyB,MAAA,EAAW;AAC1C,IAAA,MAAA,CAAO,QAAA,CAAS,UAAA,GAAa,GAAA,CAAI,oBAAA,CAAqB,aAAY,KAAM,MAAA;AAAA,EAC1E;AACA,EAAA,IAAI,IAAI,oBAAA,EAAsB;AAC5B,IAAA,MAAA,CAAO,QAAA,CAAS,cAAc,GAAA,CAAI,oBAAA;AAAA,EACpC;AACA,EAAA,IAAI,IAAI,eAAA,EAAiB;AACvB,IAAA,MAAA,CAAO,QAAA,CAAS,SAAS,GAAA,CAAI,eAAA;AAAA,EAC/B;AAGA,EAAA,IAAI,IAAI,aAAA,EAAe;AACrB,IAAA,MAAA,CAAO,MAAA,CAAO,OAAO,GAAA,CAAI,aAAA;AAAA,EAC3B;AACA,EAAA,IAAI,IAAI,kBAAA,EAAoB;AAC1B,IAAA,MAAA,CAAO,MAAA,CAAO,YAAY,GAAA,CAAI,kBAAA;AAAA,EAChC;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,YAAA,CAAa,UAAkB,MAAA,EAAwC;AAC9E,EAAA,IAAI;AACF,IAAA,IAAI,CAAIA,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAA,GAAaA,cAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAEjD,IAAA,MAAM,IAAA,GAAO,UAAQ,MAAM,CAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAE/B,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAI,KAAK,OAAA,CAAQ,IAAA,EAAM,MAAA,CAAO,WAAA,GAAc,KAAK,OAAA,CAAQ,IAAA;AACzD,MAAA,IAAI,KAAK,OAAA,CAAQ,WAAA,EAAa,MAAA,CAAO,WAAA,GAAc,KAAK,OAAA,CAAQ,WAAA;AAAA,IAClE;AAEA,IAAA,IAAI,IAAA,CAAK,WAAW,GAAA,EAAK;AACvB,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAA,KAAY,KAAA,CAAA,SAAkB,GAAA,CAAI,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAA;AACtF,MAAA,IAAI,IAAA,CAAK,UAAU,GAAA,CAAI,GAAA,SAAY,GAAA,CAAI,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAA;AAChE,MAAA,IAAI,IAAA,CAAK,UAAU,GAAA,CAAI,GAAA,SAAY,GAAA,CAAI,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAA;AAAA,IAClE;AAEA,IAAA,IAAI,IAAA,CAAK,WAAW,KAAA,EAAO;AACzB,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAA,KAAY,KAAA,CAAA;AACnC,QAAA,MAAA,CAAO,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAA;AAC9C,MAAA,IAAI,IAAA,CAAK,UAAU,KAAA,CAAM,UAAA,SAAmB,KAAA,CAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,UAAA;AACnF,MAAA,IAAI,IAAA,CAAK,UAAU,KAAA,CAAM,OAAA,SAAgB,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAA;AAAA,IAChF;AAEA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,IAAI,IAAA,CAAK,SAAS,WAAA,KAAgB,KAAA,CAAA;AAChC,QAAA,MAAA,CAAO,QAAA,CAAS,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,WAAA;AAC7C,MAAA,IAAI,IAAA,CAAK,SAAS,kBAAA,KAAuB,KAAA,CAAA;AACvC,QAAA,MAAA,CAAO,QAAA,CAAS,iBAAA,GAAoB,IAAA,CAAK,QAAA,CAAS,kBAAA;AACpD,MAAA,IAAI,IAAA,CAAK,SAAS,eAAA,KAAoB,KAAA,CAAA;AACpC,QAAA,MAAA,CAAO,QAAA,CAAS,cAAA,GAAiB,IAAA,CAAK,QAAA,CAAS,eAAA;AACjD,MAAA,IAAI,KAAK,QAAA,CAAS,WAAA,SAAoB,QAAA,CAAS,WAAA,GAAc,KAAK,QAAA,CAAS,WAAA;AAC3E,MAAA,IAAI,KAAK,QAAA,CAAS,MAAA,SAAe,QAAA,CAAS,MAAA,GAAS,KAAK,QAAA,CAAS,MAAA;AAAA,IACnE;AAEA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAI,KAAK,MAAA,CAAO,IAAA,SAAa,MAAA,CAAO,IAAA,GAAO,KAAK,MAAA,CAAO,IAAA;AACvD,MAAA,IAAI,KAAK,MAAA,CAAO,SAAA,SAAkB,MAAA,CAAO,SAAA,GAAY,KAAK,MAAA,CAAO,SAAA;AACjE,MAAA,MAAA,CAAO,MAAA,CAAO,SAAS,EAAE,GAAG,OAAO,MAAA,CAAO,MAAA,EAAQ,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,IACnE;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,2BAAA,EAA8B,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,EAC/D;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,YAAA,GAA+B;AACtC,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,aAAA,EAAc;AAClC,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AAExB,EAAA,MAAM,WAAA,GAAc;AAAA,IACbC,gBAAA,CAAA,IAAA,CAAK,KAAK,eAAe,CAAA;AAAA,IACzBA,gBAAA,CAAA,IAAA,CAAK,KAAK,cAAc,CAAA;AAAA,IACxBA,gBAAA,CAAA,IAAA,CAAK,KAAK,gBAAgB,CAAA;AAAA,IAC1BA,gBAAA,CAAA,IAAA,CAAK,KAAK,eAAe;AAAA,GAChC;AAEA,EAAA,KAAA,MAAW,YAAY,WAAA,EAAa;AAClC,IAAA,IAAOD,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,MAAA,YAAA,CAAa,UAAU,MAAM,CAAA;AAC7B,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,YAAY,MAAM,CAAA;AAC3B;AAKO,SAAS,SAAA,CAAU,OAAA,GAKtB,EAAC,EAAmB;AACtB,EAAA,YAAA,GAAe,YAAA,EAAa;AAE5B,EAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,IAAA,YAAA,CAAa,cAAc,OAAA,CAAQ,WAAA;AAAA,EACrC;AACA,EAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,IAAA,YAAA,CAAa,cAAc,OAAA,CAAQ,WAAA;AAAA,EACrC;AACA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,YAAA,CAAa,GAAA,CAAI,MAAM,OAAA,CAAQ,MAAA;AAAA,EACjC;AACA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,YAAA,CAAa,GAAA,CAAI,MAAM,OAAA,CAAQ,MAAA;AAAA,EACjC;AACA,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,YAAA,CAAa,KAAA,CAAM,YAAY,OAAA,CAAQ,SAAA;AAAA,EACzC;AAGA,EAAA,IAAI,QAAQ,GAAA,EAAK;AACf,IAAA,YAAA,CAAa,MAAM,EAAE,GAAG,aAAa,GAAA,EAAK,GAAG,QAAQ,GAAA,EAAI;AAAA,EAC3D;AACA,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,YAAA,CAAa,QAAQ,EAAE,GAAG,aAAa,KAAA,EAAO,GAAG,QAAQ,KAAA,EAAM;AAAA,EACjE;AACA,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,YAAA,CAAa,WAAW,EAAE,GAAG,aAAa,QAAA,EAAU,GAAG,QAAQ,QAAA,EAAS;AAAA,EAC1E;AACA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,YAAA,CAAa,SAAS,EAAE,GAAG,aAAa,MAAA,EAAQ,GAAG,QAAQ,MAAA,EAAO;AAAA,EACpE;AAEA,EAAA,OAAO,YAAA;AACT;AAKO,SAAS,SAAA,GAA4B;AAC1C,EAAA,OAAO,YAAA;AACT;;;AC/PO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AACrC,EAAA,QAAQ,UAAA;AAAY,IAClB,KAAK,QAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,QAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,QAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,SAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT;AACE,MAAA,OAAO,SAAA;AAAA;AAEb;;;AC9BO,IAAM,kBAAN,MAA8C;AAAA,EAGnD,YAAY,MAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,UAAU,SAAA,EAAU;AAAA,EACpC;AAAA,EAEA,SAAS,GAAA,EAA0B;AACjC,IAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,GAAO,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AACjC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAA2B,GAAA,CAAI,WAAW,CAAA,CAAE,CAAA;AACxD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,GAAA,CAAI,WAAW,CAAA,CAAE,CAAA;AAC7C,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,EAAE,IAAI,IAAI,CAAA;AAAA,EACnC;AAAA,EAEA,OAAO,GAAA,EAA0B;AAC/B,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,KAAW,CAAA,GAAI,QAAA,GAAM,QAAA;AACtC,IAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,GAAO,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AACjC,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,IAAI,CAAA,qBAAA,EAAwB,IAAI,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,WAAA,CAAa,CAAA;AAC/E,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,QAAA,EAAW,GAAA,CAAI,MAAM,CAAA,WAAA,EAAc,IAAI,MAAM,CAAA,YAAA,EAAe,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AACrF,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,EAAE,IAAI,IAAI,CAAA;AAAA,EACnC;AAAA,EAEA,WAAW,IAAA,EAAwB;AACjC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,aAAA,EAAe;AAEzC,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,yBAAiB,QAAA;AAAA,MACjB,yBAAiB,QAAA;AAAA,MACjB,yBAAiB,GAAA;AAAA,MACjB,2BAAkB,QAAA;AAAA,MAClB,2BAAkB,QAAA;AAAA,MAClB,2BAAkB,QAAA;AAAA,MAClB,2BAAkB;AAAA,KACpB;AAEA,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,MAAgB,CAAA,IAAK,GAAA;AACjD,IAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAEtC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAA,CAAQ,GAAA,CAAI,cAAc,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAK,CAAA;AAAA,IAChE;AAAA,EACF;AACF,CAAA;AAKO,IAAM,eAAN,MAA2C;AAAA,EAIhD,YAAY,MAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,UAAU,SAAA,EAAU;AAClC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,SAAA;AAAA,EACrC;AAAA,EAEA,SAAS,GAAA,EAA0B;AAEjC,IAAA,IAAI,CAAIE,cAAA,CAAA,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA,EAAG;AAClC,MAAGA,yBAAU,IAAA,CAAK,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAClD;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,YAAA,EAAc;AAClC,MAAA,MAAM,KAAA,GAAWA,cAAA,CAAA,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA;AAC3C,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAC1B,UAAGA,cAAA,CAAA,UAAA,CAAgBC,gBAAA,CAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,GAAA,EAA0B;AAC/B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAA,IAAW,CAAC,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC7E,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAeA,gBAAA,CAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AACpD,IAAGD,cAAA,CAAA,aAAA,CAAc,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,aAAa,GAAG,CAAA,EAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AAGzE,IAAA,MAAM,QAAA,GAAgBC,gBAAA,CAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA;AAClD,IAAA,IAAI,CAAID,cAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,MAAGA,cAAA,CAAA,SAAA,CAAU,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAC5C;AAEA,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,KAAA,EAAO;AAC5B,MAAA,MAAM,WAAgBC,gBAAA,CAAA,IAAA,CAAK,QAAA,EAAU,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,KAAA,CAAO,CAAA;AACtD,MAAGD,cAAA,CAAA,aAAA,CAAc,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,cAAc,IAAI,CAAA,EAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IAC9E;AAAA,EACF;AAAA,EAEA,WAAW,KAAA,EAAyB;AAAA,EAEpC;AAAA,EAEQ,aAAa,GAAA,EAA6C;AAChE,IAAA,OAAO;AAAA,MACL,GAAG,GAAA;AAAA,MACH,SAAA,EAAW,GAAA,CAAI,SAAA,EAAW,WAAA,EAAY;AAAA,MACtC,OAAA,EAAS,GAAA,CAAI,OAAA,EAAS,WAAA,EAAY;AAAA,MAClC,KAAA,EAAO,IAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,aAAA,CAAc,CAAC,CAAC;AAAA,KACnD;AAAA,EACF;AAAA,EAEQ,cAAc,IAAA,EAA2C;AAC/D,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,WAAA,EAAY;AAAA,MACvC,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,WAAA,EAAY;AAAA,MACnC,KAAA,EAAO,KAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,aAAA,CAAc,CAAC,CAAC;AAAA,KACpD;AAAA,EACF;AAAA,EAEQ,cAAc,IAAA,EAA2C;AAC/D,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,WAAA,EAAY;AAAA,MACvC,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,WAAA,EAAY;AAAA,MACnC,QAAA,EAAU,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,aAAA,CAAc,CAAC,CAAC;AAAA,KAC1D;AAAA,EACF;AACF,CAAA;AAKO,IAAM,gBAAN,MAA4C;AAAA,EAIjD,YAAY,MAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,UAAU,SAAA,EAAU;AAClC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,SAAA;AAAA,EACrC;AAAA,EAEA,SAAS,IAAA,EAA2B;AAClC,IAAA,IAAI,CAAIA,cAAA,CAAA,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA,EAAG;AAClC,MAAGA,yBAAU,IAAA,CAAK,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,OAAO,GAAA,EAA0B;AAC/B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAA,IAAW,CAAC,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AAC9E,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAChC,IAAA,MAAM,SAAA,GAAiBC,gBAAA,CAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,WAAW,CAAA;AACvD,IAAGD,cAAA,CAAA,aAAA,CAAc,WAAW,GAAG,CAAA;AAAA,EACjC;AAAA,EAEA,WAAW,KAAA,EAAyB;AAAA,EAEpC;AAAA,EAEQ,YAAY,GAAA,EAA4B;AAC9C,IAAA,MAAM,SAAS,CAAC,GAAA,KACd,IACG,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,IAAA,EAAM,MAAM,EACpB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,MAAM,QAAQ,CAAA;AAE3B,IAAA,IAAI,GAAA,GAAM,0CAAA;AACV,IAAA,GAAA,IAAO,CAAA,iBAAA,EAAoB,MAAA,CAAO,GAAA,CAAI,WAAW,CAAC,CAAA,EAAA,CAAA;AAClD,IAAA,GAAA,IAAO,CAAA,OAAA,EAAU,IAAI,KAAK,CAAA,EAAA,CAAA;AAC1B,IAAA,GAAA,IAAO,CAAA,UAAA,EAAa,IAAI,MAAM,CAAA,EAAA,CAAA;AAC9B,IAAA,GAAA,IAAO,CAAA,QAAA,EAAW,IAAI,MAAM,CAAA,EAAA,CAAA;AAC5B,IAAA,GAAA,IAAO,CAAA,SAAA,EAAY,IAAI,OAAO,CAAA,EAAA,CAAA;AAC9B,IAAA,GAAA,IAAO,UAAU,GAAA,CAAI,UAAA,GAAa,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAClD,IAAA,GAAA,IAAO,CAAA,WAAA,EAAc,GAAA,CAAI,SAAA,EAAW,WAAA,MAAiB,EAAE,CAAA;AAAA,CAAA;AAEvD,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,KAAA,EAAO;AAC5B,MAAA,GAAA,IAAO,CAAA,kBAAA,EAAqB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,CAAA;AAC7C,MAAA,GAAA,IAAO,CAAA,WAAA,EAAc,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAC,CAAA,EAAA,CAAA;AAC1C,MAAA,GAAA,IAAO,UAAU,IAAA,CAAK,UAAA,GAAa,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAEnD,MAAA,IAAI,KAAK,MAAA,KAAA,QAAA,eAA0B;AACjC,QAAA,GAAA,IAAO,MAAA;AAAA,MACT,CAAA,MAAA,IAAW,KAAK,MAAA,KAAA,QAAA,eAA0B;AACxC,QAAA,GAAA,IAAO,KAAA;AACP,QAAA,GAAA,IAAO,CAAA,sBAAA,EAAyB,MAAA,CAAO,IAAA,CAAK,YAAA,IAAgB,aAAa,CAAC,CAAA,EAAA,CAAA;AAC1E,QAAA,GAAA,IAAO,CAAA,MAAA,EAAS,MAAA,CAAO,IAAA,CAAK,SAAA,IAAa,gBAAgB,CAAC,CAAA,EAAA,CAAA;AAC1D,QAAA,IAAI,KAAK,UAAA,EAAY;AACnB,UAAA,GAAA,IAAO,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA,QAC/B;AACA,QAAA,GAAA,IAAO,cAAA;AACP,QAAA,GAAA,IAAO,iBAAA;AAAA,MACT,CAAA,MAAA,IAAW,KAAK,MAAA,KAAA,QAAA,eAA0B;AACxC,QAAA,GAAA,IAAO,KAAA;AACP,QAAA,GAAA,IAAO,CAAA,oBAAA,EAAuB,MAAA,CAAO,IAAA,CAAK,YAAA,IAAgB,YAAY,CAAC,CAAA,EAAA,CAAA;AACvE,QAAA,GAAA,IAAO,CAAA,MAAA,EAAS,MAAA,CAAO,IAAA,CAAK,SAAA,IAAa,OAAO,CAAC,CAAA,EAAA,CAAA;AACjD,QAAA,IAAI,KAAK,UAAA,EAAY;AACnB,UAAA,GAAA,IAAO,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA,QAC/B;AACA,QAAA,GAAA,IAAO,YAAA;AACP,QAAA,GAAA,IAAO,iBAAA;AAAA,MACT,CAAA,MAAA,IAAW,KAAK,MAAA,KAAA,SAAA,gBAA2B;AACzC,QAAA,GAAA,IAAO,KAAA;AACP,QAAA,GAAA,IAAO,CAAA,YAAA,EAAe,KAAK,YAAA,GAAe,CAAA,UAAA,EAAa,OAAO,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA;AAAA,CAAA;AACxF,QAAA,GAAA,IAAO,iBAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,GAAA,IAAO,MAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,GAAA,IAAO,gBAAA;AACP,IAAA,OAAO,GAAA;AAAA,EACT;AACF,CAAA;AAKO,IAAM,cAAN,MAA0C;AAAA,EAK/C,YAAY,MAAA,EAAyB;AAHrC,IAAA,IAAA,CAAQ,QAAsB,EAAC;AAI7B,IAAA,IAAA,CAAK,MAAA,GAAS,UAAU,SAAA,EAAU;AAAA,EACpC;AAAA,EAEA,MAAM,SAAS,GAAA,EAAmC;AAChD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS;AAC5B,MAAA,OAAA,CAAQ,IAAI,sCAAsC,CAAA;AAClD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAA,GAAa,GAAA;AAClB,IAAA,IAAA,CAAK,QAAQ,EAAC;AAEd,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,GAAA,CAAI,kCAAA,EAAoC,GAAA,CAAI,EAAE,CAAA;AACtD,MAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,IAAI,GAAG,CAAA,YAAA,CAAA;AAClC,MAAA,OAAA,CAAQ,GAAA,CAAI,0BAA0B,GAAG,CAAA;AAEzC,MAAA,MAAM,QAAA,GAAW,MAAME,sBAAA,CAAM,IAAA;AAAA,QAC3B,GAAA;AAAA,QACA;AAAA,UACE,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,cAAc,GAAA,CAAI,WAAA;AAAA,UAClB,aAAa,GAAA,CAAI,WAAA;AAAA,UACjB,UAAA,EAAY,GAAA,CAAI,SAAA,EAAW,WAAA,EAAY;AAAA,UACvC,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,aAAa,GAAA,CAAI,SAAA;AAAA,UACjB,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,aAAa,GAAA,CAAI;AAAA,SACnB;AAAA,QACA;AAAA,UACE,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB,kBAAA;AAAA,YAChB,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,IAAO,EAAA;AAAA,YACpC,WAAA,EAAa,KAAK,MAAA,CAAO;AAAA,WAC3B;AAAA,UACA,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI;AAAA;AAC3B,OACF;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,8CAAA,EAAgD,QAAA,CAAS,MAAM,CAAA;AAAA,IAC7E,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAK,gDAAgD,CAAA;AAC7D,MAAA,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,KAAA,CAAM,OAAO,CAAA;AACtC,MAAA,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,KAAA,CAAM,QAAA,EAAU,MAAM,CAAA;AAChD,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAA,EAAW,KAAA,CAAM,QAAA,EAAU,IAAI,CAAA;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,GAAA,EAAmC;AAC9C,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS;AAE9B,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,GAAA,CAAI,0CAAA,EAA4C,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAGzE,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACzB,QAAA,OAAA,CAAQ,GAAA,CAAI,kCAAA,EAAoC,IAAA,CAAK,KAAA,CAAM,QAAQ,cAAc,CAAA;AACjF,QAAA,MAAM,KAAK,UAAA,EAAW;AACtB,QAAA,OAAA,CAAQ,IAAI,wDAAwD,CAAA;AACpE,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,IAAI,CAAC,CAAA;AAAA,MAC1D;AAEA,MAAA,OAAA,CAAQ,IAAI,gDAAA,EAAkD;AAAA,QAC5D,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,SAAS,GAAA,CAAI;AAAA,OACd,CAAA;AAED,MAAA,MAAM,SAAA,GAAY;AAAA,QAChB,QAAA,EAAU,GAAA,CAAI,OAAA,EAAS,WAAA,EAAY;AAAA,QACnC,aAAa,GAAA,CAAI,UAAA;AAAA,QACjB,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,MAAA,EAAQ;AAAA,OACV;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,yBAAA,EAA2B,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,IAAI,GAAG,CAAA,aAAA,EAAgB,GAAA,CAAI,EAAE,CAAA,CAAE,CAAA;AACrF,MAAA,OAAA,CAAQ,GAAA,CAAI,6BAA6B,SAAS,CAAA;AAElD,MAAA,MAAM,QAAA,GAAW,MAAMA,sBAAA,CAAM,KAAA;AAAA,QAC3B,GAAG,IAAA,CAAK,MAAA,CAAO,IAAI,GAAG,CAAA,aAAA,EAAgB,IAAI,EAAE,CAAA,CAAA;AAAA,QAC5C,SAAA;AAAA,QACA;AAAA,UACE,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB,kBAAA;AAAA,YAChB,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,IAAO,EAAA;AAAA,YACpC,WAAA,EAAa,KAAK,MAAA,CAAO;AAAA,WAC3B;AAAA,UACA,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI;AAAA;AAC3B,OACF;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,2CAAA,EAA6C,QAAA,CAAS,MAAM,CAAA;AAAA,IAC1E,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAK,gDAAgD,CAAA;AAC7D,MAAA,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,KAAA,CAAM,OAAO,CAAA;AACtC,MAAA,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,KAAA,CAAM,QAAA,EAAU,MAAM,CAAA;AAChD,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAA,EAAW,KAAA,CAAM,QAAA,EAAU,IAAI,CAAA;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,IAAA,EAAiC;AAChD,IAAA,OAAA,CAAQ,GAAA,CAAI,wCAAwC,IAAA,CAAK,IAAA,EAAM,gBAAgB,IAAA,CAAK,MAAA,CAAO,IAAI,OAAO,CAAA;AACtG,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS;AAC5B,MAAA,OAAA,CAAQ,IAAI,4DAA4D,CAAA;AACxE,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,uCAAuC,IAAA,CAAK,IAAA,EAAM,iBAAiB,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AACpG,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAEpB,IAAA,IAAI,KAAK,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,IAAI,SAAA,EAAW;AAClD,MAAA,OAAA,CAAQ,IAAI,kDAAkD,CAAA;AAC9D,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,GAAA,CAAI,6BAA6B,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAA,EAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAAA,IAC5F;AAAA,EACF;AAAA,EAEA,MAAc,UAAA,GAA4B;AACxC,IAAA,IAAI,KAAK,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,CAAC,KAAK,UAAA,EAAY;AAEjD,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,GAAA,CAAI,iCAAA,EAAmC,IAAA,CAAK,KAAA,CAAM,QAAQ,cAAc,CAAA;AAChF,MAAA,MAAM,QAAA,GAAW,MAAMA,sBAAA,CAAM,IAAA;AAAA,QAC3B,CAAA,EAAG,KAAK,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,aAAA,EAAgB,IAAA,CAAK,WAAW,EAAE,CAAA,QAAA,CAAA;AAAA,QACxD,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACrB,GAAG,CAAA;AAAA,UACH,SAAA,EAAW,CAAA,CAAE,SAAA,EAAW,WAAA,EAAY;AAAA,UACpC,OAAA,EAAS,CAAA,CAAE,OAAA,EAAS,WAAA;AAAY,SAClC,CAAE,CAAA;AAAA,QACF;AAAA,UACE,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB,kBAAA;AAAA,YAChB,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,IAAO;AAAA,WACtC;AAAA,UACA,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI;AAAA;AAC3B,OACF;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,2CAAA,EAA6C,QAAA,CAAS,MAAM,CAAA;AAAA,IAC1E,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAK,mDAAmD,CAAA;AAChE,MAAA,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,KAAA,CAAM,OAAO,CAAA;AACtC,MAAA,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,KAAA,CAAM,QAAA,EAAU,MAAM,CAAA;AAChD,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAA,EAAW,KAAA,CAAM,QAAA,EAAU,IAAI,CAAA;AAAA,IAC9C,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,QAAQ,EAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAA;AAKO,IAAM,iBAAA,GAAN,MAAM,iBAAA,CAAiB;AAAA,EAM5B,YAAY,MAAA,EAAyB;AAHrC,IAAA,IAAA,CAAQ,YAA4B,EAAC;AACrC,IAAA,IAAA,CAAQ,UAAA,GAAmC,IAAA;AAGzC,IAAA,IAAA,CAAK,MAAA,GAAS,UAAU,SAAA,EAAU;AAElC,IAAA,OAAA,CAAQ,IAAI,8CAAA,EAAgD;AAAA,MAC1D,WAAA,EAAa,KAAK,MAAA,CAAO,WAAA;AAAA,MACzB,WAAA,EAAa,KAAK,MAAA,CAAO,WAAA;AAAA,MACzB,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAA;AAAA,MAC5B,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI;AAAA,KACzB,CAAA;AAGD,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,aAAA,EAAe;AACtC,MAAA,IAAA,CAAK,UAAU,IAAA,CAAK,IAAI,eAAA,CAAgB,IAAA,CAAK,MAAM,CAAC,CAAA;AACpD,MAAA,OAAA,CAAQ,IAAI,0CAA0C,CAAA;AAAA,IACxD;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS;AAC7B,MAAA,IAAA,CAAK,UAAU,IAAA,CAAK,IAAI,YAAA,CAAa,IAAA,CAAK,MAAM,CAAC,CAAA;AACjD,MAAA,OAAA,CAAQ,IAAI,uCAAuC,CAAA;AACnD,MAAA,IAAI,KAAK,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AAC/C,QAAA,IAAA,CAAK,UAAU,IAAA,CAAK,IAAI,aAAA,CAAc,IAAA,CAAK,MAAM,CAAC,CAAA;AAClD,QAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AAAA,MACtD;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS;AAC3B,MAAA,IAAA,CAAK,UAAU,IAAA,CAAK,IAAI,WAAA,CAAY,IAAA,CAAK,MAAM,CAAC,CAAA;AAChD,MAAA,OAAA,CAAQ,IAAI,sCAAsC,CAAA;AAAA,IACpD;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,iDAAA,EAAmD,IAAA,CAAK,SAAA,CAAU,QAAQ,WAAW,CAAA;AAAA,EACnG;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,YAAY,MAAA,EAA2C;AAC5D,IAAA,IAAI,CAAC,kBAAiB,QAAA,EAAU;AAC9B,MAAA,iBAAA,CAAiB,QAAA,GAAW,IAAI,iBAAA,CAAiB,MAAM,CAAA;AAAA,IACzD;AACA,IAAA,OAAO,iBAAA,CAAiB,QAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAAA,GAAc;AACnB,IAAA,iBAAA,CAAiB,QAAA,GAAW,IAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,OAAA,GAAkC,EAAC,EAA2B;AAC3E,IAAA,IAAA,CAAK,UAAA,GAAa;AAAA,MAChB,EAAA,EAAI,OAAA,CAAQ,EAAA,IAAMC,OAAA,EAAO;AAAA,MACzB,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,CAAA,IAAA,EAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAC,CAAA,CAAA;AAAA,MAC1E,WAAA,EAAa,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,MAAA,CAAO,WAAA;AAAA,MAChD,WAAA,EAAa,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,MAAA,CAAO,WAAA;AAAA,MAChD,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,UAAA,EAAY,CAAA;AAAA,MACZ,OAAO,EAAC;AAAA,MACR,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,MAAA,EAAQ,CAAA;AAAA,MACR,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS,CAAA;AAAA,MACT,QAAA,EAAU,CAAA;AAAA,MACV,MAAA,EAAQ,EAAE,GAAG,IAAA,CAAK,OAAO,MAAA,CAAO,MAAA,EAAQ,GAAG,OAAA,CAAQ,MAAA,EAAO;AAAA,MAC1D,UAAA,EAAY,OAAA,CAAQ,UAAA,IAAc,EAAC;AAAA,MACnC,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ;AAAA,KACtB;AAEA,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACrC,MAAA,MAAM,QAAA,CAAS,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA;AAAA,IACzC;AAEA,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,GAAwC;AAC5C,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,EAAY,OAAO,IAAA;AAE7B,IAAA,IAAA,CAAK,UAAA,CAAW,OAAA,mBAAU,IAAI,IAAA,EAAK;AACnC,IAAA,IAAA,CAAK,UAAA,CAAW,UAAA,GACd,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,OAAA,EAAQ,IAAK,IAAA,CAAK,UAAA,CAAW,SAAA,EAAW,OAAA,EAAQ,IAAK,CAAA,CAAA;AAC/E,IAAA,IAAA,CAAK,UAAA,CAAW,QAAA,GACd,IAAA,CAAK,UAAA,CAAW,KAAA,GAAQ,CAAA,GAAK,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,KAAA,GAAS,GAAA,GAAM,CAAA;AAEvF,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACrC,MAAA,MAAM,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,IACvC;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,UAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,IAAA,EAAiC;AAChD,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,OAAA,CAAQ,KAAK,iDAAiD,CAAA;AAC9D,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,UAAA,CAAW,KAAA,EAAA;AAEhB,IAAA,QAAQ,KAAK,MAAA;AAAQ,MACnB,KAAK,QAAA;AACH,QAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAA;AAChB,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAA;AAChB,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAA;AAChB,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,IAAA,CAAK,UAAA,CAAW,OAAA,EAAA;AAChB,QAAA;AAAA;AAGJ,IAAA,OAAA,CAAQ,IAAI,iCAAA,EAAmC;AAAA,MAC7C,KAAA,EAAO,KAAK,UAAA,CAAW,KAAA;AAAA,MACvB,MAAA,EAAQ,KAAK,UAAA,CAAW,MAAA;AAAA,MACxB,MAAA,EAAQ,KAAK,UAAA,CAAW,MAAA;AAAA,MACxB,MAAA,EAAQ,KAAK,UAAA,CAAW,MAAA;AAAA,MACxB,OAAA,EAAS,KAAK,UAAA,CAAW;AAAA,KAC1B,CAAA;AAED,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACrC,MAAA,MAAM,QAAA,CAAS,WAAW,IAAI,CAAA;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAsC;AACpC,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AACF,CAAA;AA5Ja,iBAAA,CACI,QAAA,GAAoC,IAAA;AAD9C,IAAM,gBAAA,GAAN,iBAAA;;;ACpXP,IAAM,0BAAN,MAA8B;AAAA,EAkB5B,YAAY,MAAA,EAAa;AAhBzB,IAAA,IAAA,CAAQ,UAAA,GAAmC,IAAA;AAG3C,IAAA,IAAA,CAAQ,UAAA,GAAa,KAAA;AACrB,IAAA,IAAA,CAAQ,YAAA,GAAe,KAAA;AACvB,IAAA,IAAA,CAAQ,KAAA,GAAQ;AAAA,MACd,MAAA,EAAQ,CAAA;AAAA,MACR,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS,CAAA;AAAA,MACT,QAAA,EAAU,CAAA;AAAA,MACV,KAAA,sBAAW,IAAA,EAAK;AAAA,MAChB,GAAA,sBAAS,IAAA,EAAK;AAAA,MACd,QAAA,EAAU;AAAA,KACZ;AAIE,IAAA,IAAA,CAAK,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,qBAAA,IACb,OAAO,SAAA,IACP,mBAAA;AAElB,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,GAAA,CAAI,oBAAA,IACb,OAAA,CAAQ,IAAI,QAAA,IACZ,KAAA;AAElB,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,gBAAA,IACb,uBAAA;AAGd,IAAA,SAAA,CAAU;AAAA,MACR,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,MAAA;AAAA,MACA,SAAA,EAAW;AAAA,KACZ,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,GAAW,iBAAiB,WAAA,EAAY;AAC7C,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,mBAAQ,IAAI,IAAA,EAAK;AAAA,EAC9B;AAAA,EAEA,MAAM,UAAA,GAAa;AACjB,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAI,4DAA4D,CAAA;AACxE,MAAA,IAAA,CAAK,UAAA,GAAa,MAAM,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS;AAAA,QAC7C,MAAM,IAAA,CAAK,WAAA;AAAA,QACX,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,SAAA,EAAW,KAAK,KAAA,CAAM;AAAA,OACvB,CAAA;AACD,MAAA,OAAA,CAAQ,GAAA,CAAI,+CAAA,EAAiD,IAAA,CAAK,UAAA,EAAY,EAAE,CAAA;AAAA,IAClF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,oCAAoC,KAAK,CAAA;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,MAAM,gBAAA,GAAmB;AACvB,IAAA,IAAI,KAAK,UAAA,EAAY;AAErB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,OAAA,CAAQ,IAAI,qCAAqC,CAAA;AACjD,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,UAAA,EAAW;AACtB,MAAA,OAAA,CAAQ,IAAI,sCAAsC,CAAA;AAAA,IACpD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,oCAAoC,KAAK,CAAA;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,IAAA,EAAW;AAEzB,IAAA,MAAM,KAAK,gBAAA,EAAiB;AAE5B,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAEtB,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAyB;AAAA,QAC7B,IAAIA,OAAAA,EAAO;AAAA,QACX,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,QACtC,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAAA,QAC/B,MAAA,EAAQ,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AAAA,QAC9B,YAAY,IAAA,CAAK,QAAA;AAAA,QACjB,WAAW,IAAI,IAAA,CAAK,KAAK,GAAA,EAAI,GAAI,KAAK,QAAQ,CAAA;AAAA,QAC9C,OAAA,sBAAa,IAAA,EAAK;AAAA,QAClB,MAAA,EAAQ;AAAA,UACN,KAAA,EAAO,KAAK,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAA,CAAE,KAAK,KAAK,CAAA;AAAA,UACzC,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,CAAC;AAAA,SACvB;AAAA,QACA,OAAO,EAAC;AAAA,QACR,YAAY,EAAC;AAAA,QACb,OAAO,EAAC;AAAA,QACR,aAAa,EAAC;AAAA,QACd,QAAA,EAAU,IAAA,CAAK,iBAAA,EAAmB,YAAA,IAAgB,EAAA;AAAA,QAClD,UAAA,EAAY,CAAA;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACX;AAEA,MAAA,IAAI,KAAK,GAAA,EAAK;AACZ,QAAA,UAAA,CAAW,YAAA,GAAe,KAAK,GAAA,CAAI,OAAA;AACnC,QAAA,UAAA,CAAW,UAAA,GAAa,KAAK,GAAA,CAAI,KAAA;AACjC,QAAA,UAAA,CAAW,SAAA,GAAY,gBAAA;AAAA,MACzB;AAGA,MAAA,IAAA,CAAK,KAAA,CAAM,KAAA,EAAA;AACX,MAAA,IAAI,IAAA,CAAK,KAAA,KAAU,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,MAAA,EAAA;AACxC,MAAA,IAAI,IAAA,CAAK,KAAA,KAAU,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,QAAA,EAAA;AACxC,MAAA,IAAI,IAAA,CAAK,KAAA,KAAU,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,OAAA,EAAA;AAEzC,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,UAAU,CAAA;AAAA,IAC3C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,sCAAsC,KAAK,CAAA;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,GAAc;AAClB,IAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,CAAC,IAAA,CAAK,UAAA,EAAY;AAE3C,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,OAAA,CAAQ,IAAI,4BAA4B,CAAA;AAExC,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,mBAAM,IAAI,IAAA,EAAK;AAC1B,MAAA,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAQ,GAAI,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,OAAA,EAAQ;AAG1E,MAAA,IAAA,CAAK,UAAA,CAAW,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAA;AACrC,MAAA,IAAA,CAAK,UAAA,CAAW,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,QAAA;AACxC,MAAA,IAAA,CAAK,UAAA,CAAW,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA;AACnC,MAAA,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA;AACpC,MAAA,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,QAAA;AACpC,MAAA,IAAA,CAAK,UAAA,CAAW,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA;AAErC,MAAA,OAAA,CAAQ,IAAI,iDAAA,EAAmD;AAAA,QAC7D,KAAA,EAAO,KAAK,UAAA,CAAW,KAAA;AAAA,QACvB,MAAA,EAAQ,KAAK,UAAA,CAAW,MAAA;AAAA,QACxB,MAAA,EAAQ,KAAK,UAAA,CAAW,MAAA;AAAA,QACxB,OAAA,EAAS,KAAK,UAAA,CAAW;AAAA,OAC1B,CAAA;AAED,MAAA,MAAM,IAAA,CAAK,SAAS,MAAA,EAAO;AAC3B,MAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AAAA,IACtD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,uCAAuC,KAAK,CAAA;AAAA,IAC3D;AAAA,EACF;AAEF,CAAA;AAEO,SAAS,aAAA,CAAc,IAAS,MAAA,EAAmB;AACxD,EAAA,MAAM,QAAA,GAAW,IAAI,uBAAA,CAAwB,MAAM,CAAA;AAGnD,EAAA,EAAA,CAAG,YAAA,EAAc,CAAC,KAAA,EAAY,OAAA,KAAiB;AAC7C,IAAA,OAAA,CAAQ,YAAY;AAClB,MAAA,IAAI,CAAC,SAAS,KAAA,EAAO;AAErB,MAAA,IAAI;AAEF,QAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,KAAA,EAAO;AAChC,UAAA,MAAM,QAAA,CAAS,UAAU,IAAI,CAAA;AAAA,QAC/B;AAGA,QAAA,MAAM,SAAS,WAAA,EAAY;AAG3B,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,GAAI,CAAC,CAAA;AAAA,MAC1D,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,sCAAsC,KAAK,CAAA;AAAA,MAC1D;AAAA,IACF,CAAA,GAAG;AAAA,EACL,CAAC,CAAA;AACH","file":"simple-setup.js","sourcesContent":["/**\r\n * Configuration management for QAagentic SDK.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\n/**\r\n * API reporting configuration.\r\n */\r\nexport interface APIConfig {\r\n enabled: boolean;\r\n url: string;\r\n key?: string;\r\n timeout: number;\r\n retryCount: number;\r\n batchSize: number;\r\n}\r\n\r\n/**\r\n * Local file reporting configuration.\r\n */\r\nexport interface LocalConfig {\r\n enabled: boolean;\r\n outputDir: string;\r\n formats: ('json' | 'html' | 'junit')[];\r\n cleanOnStart: boolean;\r\n}\r\n\r\n/**\r\n * Feature flags configuration.\r\n */\r\nexport interface FeaturesConfig {\r\n aiAnalysis: boolean;\r\n failureClustering: boolean;\r\n flakyDetection: boolean;\r\n screenshots: 'always' | 'on_failure' | 'never';\r\n videos: 'always' | 'on_failure' | 'never';\r\n consoleOutput: boolean;\r\n}\r\n\r\n/**\r\n * Labels configuration.\r\n */\r\nexport interface LabelsConfig {\r\n team?: string;\r\n component?: string;\r\n environment?: string;\r\n custom: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Main configuration for QAagentic SDK.\r\n */\r\nexport interface QAgenticConfig {\r\n projectName: string;\r\n environment: string;\r\n api: APIConfig;\r\n local: LocalConfig;\r\n features: FeaturesConfig;\r\n labels: LabelsConfig;\r\n}\r\n\r\n/**\r\n * Default configuration values.\r\n */\r\nconst defaultConfig: QAgenticConfig = {\r\n projectName: 'default',\r\n environment: 'local',\r\n api: {\r\n enabled: true,\r\n url: 'http://localhost:8080',\r\n timeout: 30000,\r\n retryCount: 3,\r\n batchSize: 100,\r\n },\r\n local: {\r\n enabled: true,\r\n outputDir: './qagentic-results',\r\n formats: ['json', 'html'],\r\n cleanOnStart: true,\r\n },\r\n features: {\r\n aiAnalysis: true,\r\n failureClustering: true,\r\n flakyDetection: true,\r\n screenshots: 'on_failure',\r\n videos: 'on_failure',\r\n consoleOutput: true,\r\n },\r\n labels: {\r\n custom: {},\r\n },\r\n};\r\n\r\n// Global configuration instance\r\nlet globalConfig: QAgenticConfig = { ...defaultConfig };\r\n\r\n/**\r\n * Load configuration from environment variables.\r\n */\r\nfunction loadFromEnv(config: QAgenticConfig): QAgenticConfig {\r\n const env = process.env;\r\n\r\n // Project settings\r\n if (env.QAGENTIC_PROJECT_NAME) {\r\n config.projectName = env.QAGENTIC_PROJECT_NAME;\r\n }\r\n if (env.QAGENTIC_ENVIRONMENT) {\r\n config.environment = env.QAGENTIC_ENVIRONMENT;\r\n }\r\n\r\n // API settings\r\n if (env.QAGENTIC_API_ENABLED !== undefined) {\r\n config.api.enabled = env.QAGENTIC_API_ENABLED.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_API_URL) {\r\n config.api.url = env.QAGENTIC_API_URL;\r\n }\r\n if (env.QAGENTIC_API_KEY) {\r\n config.api.key = env.QAGENTIC_API_KEY;\r\n }\r\n\r\n // Local settings\r\n if (env.QAGENTIC_LOCAL_ENABLED !== undefined) {\r\n config.local.enabled = env.QAGENTIC_LOCAL_ENABLED.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_OUTPUT_DIR) {\r\n config.local.outputDir = env.QAGENTIC_OUTPUT_DIR;\r\n }\r\n if (env.QAGENTIC_OUTPUT_FORMAT) {\r\n config.local.formats = env.QAGENTIC_OUTPUT_FORMAT.split(',').map(\r\n (f) => f.trim() as 'json' | 'html' | 'junit'\r\n );\r\n }\r\n\r\n // Feature flags\r\n if (env.QAGENTIC_AI_ANALYSIS !== undefined) {\r\n config.features.aiAnalysis = env.QAGENTIC_AI_ANALYSIS.toLowerCase() === 'true';\r\n }\r\n if (env.QAGENTIC_SCREENSHOTS) {\r\n config.features.screenshots = env.QAGENTIC_SCREENSHOTS as 'always' | 'on_failure' | 'never';\r\n }\r\n if (env.QAGENTIC_VIDEOS) {\r\n config.features.videos = env.QAGENTIC_VIDEOS as 'always' | 'on_failure' | 'never';\r\n }\r\n\r\n // Labels\r\n if (env.QAGENTIC_TEAM) {\r\n config.labels.team = env.QAGENTIC_TEAM;\r\n }\r\n if (env.QAGENTIC_COMPONENT) {\r\n config.labels.component = env.QAGENTIC_COMPONENT;\r\n }\r\n\r\n return config;\r\n}\r\n\r\n/**\r\n * Load configuration from YAML file.\r\n */\r\nfunction loadFromFile(filePath: string, config: QAgenticConfig): QAgenticConfig {\r\n try {\r\n if (!fs.existsSync(filePath)) {\r\n return config;\r\n }\r\n\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n // Simple YAML parsing for common cases\r\n const yaml = require('yaml');\r\n const data = yaml.parse(content);\r\n\r\n if (data.project) {\r\n if (data.project.name) config.projectName = data.project.name;\r\n if (data.project.environment) config.environment = data.project.environment;\r\n }\r\n\r\n if (data.reporting?.api) {\r\n if (data.reporting.api.enabled !== undefined) config.api.enabled = data.reporting.api.enabled;\r\n if (data.reporting.api.url) config.api.url = data.reporting.api.url;\r\n if (data.reporting.api.key) config.api.key = data.reporting.api.key;\r\n }\r\n\r\n if (data.reporting?.local) {\r\n if (data.reporting.local.enabled !== undefined)\r\n config.local.enabled = data.reporting.local.enabled;\r\n if (data.reporting.local.output_dir) config.local.outputDir = data.reporting.local.output_dir;\r\n if (data.reporting.local.formats) config.local.formats = data.reporting.local.formats;\r\n }\r\n\r\n if (data.features) {\r\n if (data.features.ai_analysis !== undefined)\r\n config.features.aiAnalysis = data.features.ai_analysis;\r\n if (data.features.failure_clustering !== undefined)\r\n config.features.failureClustering = data.features.failure_clustering;\r\n if (data.features.flaky_detection !== undefined)\r\n config.features.flakyDetection = data.features.flaky_detection;\r\n if (data.features.screenshots) config.features.screenshots = data.features.screenshots;\r\n if (data.features.videos) config.features.videos = data.features.videos;\r\n }\r\n\r\n if (data.labels) {\r\n if (data.labels.team) config.labels.team = data.labels.team;\r\n if (data.labels.component) config.labels.component = data.labels.component;\r\n config.labels.custom = { ...config.labels.custom, ...data.labels };\r\n }\r\n } catch (error) {\r\n console.warn(`Failed to load config from ${filePath}:`, error);\r\n }\r\n\r\n return config;\r\n}\r\n\r\n/**\r\n * Auto-discover configuration from common locations.\r\n */\r\nfunction autoDiscover(): QAgenticConfig {\r\n const config = { ...defaultConfig };\r\n const cwd = process.cwd();\r\n\r\n const searchPaths = [\r\n path.join(cwd, 'qagentic.yaml'),\r\n path.join(cwd, 'qagentic.yml'),\r\n path.join(cwd, '.qagentic.yaml'),\r\n path.join(cwd, '.qagentic.yml'),\r\n ];\r\n\r\n for (const filePath of searchPaths) {\r\n if (fs.existsSync(filePath)) {\r\n loadFromFile(filePath, config);\r\n break;\r\n }\r\n }\r\n\r\n return loadFromEnv(config);\r\n}\r\n\r\n/**\r\n * Configure QAagentic SDK.\r\n */\r\nexport function configure(options: Partial<QAgenticConfig> & {\r\n projectName?: string;\r\n apiUrl?: string;\r\n apiKey?: string;\r\n outputDir?: string;\r\n} = {}): QAgenticConfig {\r\n globalConfig = autoDiscover();\r\n\r\n if (options.projectName) {\r\n globalConfig.projectName = options.projectName;\r\n }\r\n if (options.environment) {\r\n globalConfig.environment = options.environment;\r\n }\r\n if (options.apiUrl) {\r\n globalConfig.api.url = options.apiUrl;\r\n }\r\n if (options.apiKey) {\r\n globalConfig.api.key = options.apiKey;\r\n }\r\n if (options.outputDir) {\r\n globalConfig.local.outputDir = options.outputDir;\r\n }\r\n\r\n // Merge nested configs\r\n if (options.api) {\r\n globalConfig.api = { ...globalConfig.api, ...options.api };\r\n }\r\n if (options.local) {\r\n globalConfig.local = { ...globalConfig.local, ...options.local };\r\n }\r\n if (options.features) {\r\n globalConfig.features = { ...globalConfig.features, ...options.features };\r\n }\r\n if (options.labels) {\r\n globalConfig.labels = { ...globalConfig.labels, ...options.labels };\r\n }\r\n\r\n return globalConfig;\r\n}\r\n\r\n/**\r\n * Get the current configuration.\r\n */\r\nexport function getConfig(): QAgenticConfig {\r\n return globalConfig;\r\n}\r\n\r\n/**\r\n * Reset configuration to defaults.\r\n */\r\nexport function resetConfig(): void {\r\n globalConfig = { ...defaultConfig };\r\n}\r\n","/**\r\n * Test execution status.\r\n */\r\n\r\nexport enum Status {\r\n PASSED = 'passed',\r\n FAILED = 'failed',\r\n BROKEN = 'broken',\r\n SKIPPED = 'skipped',\r\n PENDING = 'pending',\r\n RUNNING = 'running',\r\n UNKNOWN = 'unknown',\r\n}\r\n\r\n/**\r\n * Check if status represents a successful outcome.\r\n */\r\nexport function isSuccessful(status: Status): boolean {\r\n return status === Status.PASSED;\r\n}\r\n\r\n/**\r\n * Check if status represents a failure.\r\n */\r\nexport function isFailure(status: Status): boolean {\r\n return status === Status.FAILED || status === Status.BROKEN;\r\n}\r\n\r\n/**\r\n * Parse status from string.\r\n */\r\nexport function parseStatus(value: string): Status {\r\n const normalized = value.toLowerCase();\r\n switch (normalized) {\r\n case 'passed':\r\n case 'pass':\r\n case 'success':\r\n return Status.PASSED;\r\n case 'failed':\r\n case 'fail':\r\n case 'failure':\r\n return Status.FAILED;\r\n case 'broken':\r\n case 'error':\r\n return Status.BROKEN;\r\n case 'skipped':\r\n case 'skip':\r\n case 'pending':\r\n return Status.SKIPPED;\r\n case 'running':\r\n return Status.RUNNING;\r\n default:\r\n return Status.UNKNOWN;\r\n }\r\n}\r\n","/**\r\n * Reporter classes for outputting test results to various destinations.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport axios from 'axios';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { getConfig, QAgenticConfig } from './config';\r\nimport { Status } from './status';\r\nimport type { TestResult, TestRunResult, StepResult } from './types';\r\n\r\n/**\r\n * Base reporter interface.\r\n */\r\nexport interface BaseReporter {\r\n startRun(run: TestRunResult): void | Promise<void>;\r\n endRun(run: TestRunResult): void | Promise<void>;\r\n reportTest(test: TestResult): void | Promise<void>;\r\n}\r\n\r\n/**\r\n * Console reporter with colored output.\r\n */\r\nexport class ConsoleReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n }\r\n\r\n startRun(run: TestRunResult): void {\r\n console.log('\\n' + '='.repeat(60));\r\n console.log(`🚀 QAagentic Test Run - ${run.projectName}`);\r\n console.log(`Environment: ${run.environment}`);\r\n console.log('='.repeat(60) + '\\n');\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n const icon = run.failed === 0 ? '✅' : '❌';\r\n console.log('\\n' + '='.repeat(60));\r\n console.log(`${icon} Test Run Complete - ${run.passRate.toFixed(1)}% Pass Rate`);\r\n console.log(`Passed: ${run.passed} | Failed: ${run.failed} | Skipped: ${run.skipped}`);\r\n console.log('='.repeat(60) + '\\n');\r\n }\r\n\r\n reportTest(test: TestResult): void {\r\n if (!this.config.features.consoleOutput) return;\r\n\r\n const symbols: Record<Status, string> = {\r\n [Status.PASSED]: '✓',\r\n [Status.FAILED]: '✗',\r\n [Status.BROKEN]: '!',\r\n [Status.SKIPPED]: '○',\r\n [Status.PENDING]: '…',\r\n [Status.RUNNING]: '→',\r\n [Status.UNKNOWN]: '?',\r\n };\r\n\r\n const symbol = symbols[test.status as Status] || '?';\r\n console.log(` ${symbol} ${test.name}`);\r\n\r\n if (test.errorMessage) {\r\n console.log(` Error: ${test.errorMessage.slice(0, 100)}...`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * JSON file reporter.\r\n */\r\nexport class JSONReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private outputDir: string;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n this.outputDir = this.config.local.outputDir;\r\n }\r\n\r\n startRun(run: TestRunResult): void {\r\n // Create output directory\r\n if (!fs.existsSync(this.outputDir)) {\r\n fs.mkdirSync(this.outputDir, { recursive: true });\r\n }\r\n\r\n // Clean previous results if configured\r\n if (this.config.local.cleanOnStart) {\r\n const files = fs.readdirSync(this.outputDir);\r\n for (const file of files) {\r\n if (file.endsWith('.json')) {\r\n fs.unlinkSync(path.join(this.outputDir, file));\r\n }\r\n }\r\n }\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n if (!this.config.local.enabled || !this.config.local.formats.includes('json')) {\r\n return;\r\n }\r\n\r\n // Write run summary\r\n const runFile = path.join(this.outputDir, 'run.json');\r\n fs.writeFileSync(runFile, JSON.stringify(this.serializeRun(run), null, 2));\r\n\r\n // Write individual test results\r\n const testsDir = path.join(this.outputDir, 'tests');\r\n if (!fs.existsSync(testsDir)) {\r\n fs.mkdirSync(testsDir, { recursive: true });\r\n }\r\n\r\n for (const test of run.tests) {\r\n const testFile = path.join(testsDir, `${test.id}.json`);\r\n fs.writeFileSync(testFile, JSON.stringify(this.serializeTest(test), null, 2));\r\n }\r\n }\r\n\r\n reportTest(_test: TestResult): void {\r\n // Tests are written at end\r\n }\r\n\r\n private serializeRun(run: TestRunResult): Record<string, unknown> {\r\n return {\r\n ...run,\r\n startTime: run.startTime?.toISOString(),\r\n endTime: run.endTime?.toISOString(),\r\n tests: run.tests.map((t) => this.serializeTest(t)),\r\n };\r\n }\r\n\r\n private serializeTest(test: TestResult): Record<string, unknown> {\r\n return {\r\n ...test,\r\n startTime: test.startTime?.toISOString(),\r\n endTime: test.endTime?.toISOString(),\r\n steps: test.steps.map((s) => this.serializeStep(s)),\r\n };\r\n }\r\n\r\n private serializeStep(step: StepResult): Record<string, unknown> {\r\n return {\r\n ...step,\r\n startTime: step.startTime?.toISOString(),\r\n endTime: step.endTime?.toISOString(),\r\n children: step.children.map((c) => this.serializeStep(c)),\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * JUnit XML reporter for CI/CD compatibility.\r\n */\r\nexport class JUnitReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private outputDir: string;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n this.outputDir = this.config.local.outputDir;\r\n }\r\n\r\n startRun(_run: TestRunResult): void {\r\n if (!fs.existsSync(this.outputDir)) {\r\n fs.mkdirSync(this.outputDir, { recursive: true });\r\n }\r\n }\r\n\r\n endRun(run: TestRunResult): void {\r\n if (!this.config.local.enabled || !this.config.local.formats.includes('junit')) {\r\n return;\r\n }\r\n\r\n const xml = this.generateXml(run);\r\n const junitFile = path.join(this.outputDir, 'junit.xml');\r\n fs.writeFileSync(junitFile, xml);\r\n }\r\n\r\n reportTest(_test: TestResult): void {\r\n // Tests are written at end\r\n }\r\n\r\n private generateXml(run: TestRunResult): string {\r\n const escape = (str: string) =>\r\n str\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;');\r\n\r\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\r\n xml += `<testsuite name=\"${escape(run.projectName)}\" `;\r\n xml += `tests=\"${run.total}\" `;\r\n xml += `failures=\"${run.failed}\" `;\r\n xml += `errors=\"${run.broken}\" `;\r\n xml += `skipped=\"${run.skipped}\" `;\r\n xml += `time=\"${(run.durationMs / 1000).toFixed(3)}\" `;\r\n xml += `timestamp=\"${run.startTime?.toISOString() || ''}\">\\n`;\r\n\r\n for (const test of run.tests) {\r\n xml += ` <testcase name=\"${escape(test.name)}\" `;\r\n xml += `classname=\"${escape(test.fullName)}\" `;\r\n xml += `time=\"${(test.durationMs / 1000).toFixed(3)}\"`;\r\n\r\n if (test.status === Status.PASSED) {\r\n xml += '/>\\n';\r\n } else if (test.status === Status.FAILED) {\r\n xml += '>\\n';\r\n xml += ` <failure message=\"${escape(test.errorMessage || 'Test failed')}\" `;\r\n xml += `type=\"${escape(test.errorType || 'AssertionError')}\">`;\r\n if (test.stackTrace) {\r\n xml += escape(test.stackTrace);\r\n }\r\n xml += '</failure>\\n';\r\n xml += ' </testcase>\\n';\r\n } else if (test.status === Status.BROKEN) {\r\n xml += '>\\n';\r\n xml += ` <error message=\"${escape(test.errorMessage || 'Test error')}\" `;\r\n xml += `type=\"${escape(test.errorType || 'Error')}\">`;\r\n if (test.stackTrace) {\r\n xml += escape(test.stackTrace);\r\n }\r\n xml += '</error>\\n';\r\n xml += ' </testcase>\\n';\r\n } else if (test.status === Status.SKIPPED) {\r\n xml += '>\\n';\r\n xml += ` <skipped${test.errorMessage ? ` message=\"${escape(test.errorMessage)}\"` : ''}/>\\n`;\r\n xml += ' </testcase>\\n';\r\n } else {\r\n xml += '/>\\n';\r\n }\r\n }\r\n\r\n xml += '</testsuite>\\n';\r\n return xml;\r\n }\r\n}\r\n\r\n/**\r\n * API reporter that sends results to QAagentic server.\r\n */\r\nexport class APIReporter implements BaseReporter {\r\n private config: QAgenticConfig;\r\n private batch: TestResult[] = [];\r\n private currentRun?: TestRunResult;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n }\r\n\r\n async startRun(run: TestRunResult): Promise<void> {\r\n if (!this.config.api.enabled) {\r\n console.log('[APIReporter] API reporting disabled');\r\n return;\r\n }\r\n\r\n this.currentRun = run;\r\n this.batch = [];\r\n\r\n try {\r\n console.log('[APIReporter] Starting test run:', run.id);\r\n const url = `${this.config.api.url}/api/v1/runs`;\r\n console.log('[APIReporter] POST to:', url);\r\n \r\n const response = await axios.post(\r\n url,\r\n {\r\n id: run.id,\r\n name: run.name,\r\n project_name: run.projectName,\r\n environment: run.environment,\r\n start_time: run.startTime?.toISOString(),\r\n labels: run.labels,\r\n ci_build_id: run.ciBuildId,\r\n branch: run.branch,\r\n commit_hash: run.commitHash,\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n 'X-Project': this.config.projectName,\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Test run started successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to register run with API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n }\r\n }\r\n\r\n async endRun(run: TestRunResult): Promise<void> {\r\n if (!this.config.api.enabled) return;\r\n\r\n try {\r\n console.log('[APIReporter] endRun called, batch size:', this.batch.length);\r\n \r\n // Flush remaining batch - ALWAYS flush, even if batch is not full\r\n if (this.batch.length > 0) {\r\n console.log('[APIReporter] Flushing remaining', this.batch.length, 'test results');\r\n await this.flushBatch();\r\n console.log('[APIReporter] Batch flushed, waiting for processing...');\r\n await new Promise((resolve) => setTimeout(resolve, 1500));\r\n }\r\n\r\n console.log('[APIReporter] Finalizing run with test counts:', {\r\n total: run.total,\r\n passed: run.passed,\r\n failed: run.failed,\r\n broken: run.broken,\r\n skipped: run.skipped,\r\n });\r\n \r\n const patchData = {\r\n end_time: run.endTime?.toISOString(),\r\n duration_ms: run.durationMs,\r\n total: run.total,\r\n passed: run.passed,\r\n failed: run.failed,\r\n broken: run.broken,\r\n skipped: run.skipped,\r\n status: 'completed',\r\n };\r\n \r\n console.log('[APIReporter] PATCH to:', `${this.config.api.url}/api/v1/runs/${run.id}`);\r\n console.log('[APIReporter] PATCH data:', patchData);\r\n \r\n const response = await axios.patch(\r\n `${this.config.api.url}/api/v1/runs/${run.id}`,\r\n patchData,\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n 'X-Project': this.config.projectName,\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Run finalized successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to finalize run with API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n }\r\n }\r\n\r\n async reportTest(test: TestResult): Promise<void> {\r\n console.log('[APIReporter] reportTest called for:', test.name, 'API enabled:', this.config.api.enabled);\r\n if (!this.config.api.enabled) {\r\n console.log('[APIReporter] API reporting disabled, skipping test report');\r\n return;\r\n }\r\n\r\n console.log('[APIReporter] Adding test to batch:', test.name, '- batch size:', this.batch.length + 1);\r\n this.batch.push(test);\r\n\r\n if (this.batch.length >= this.config.api.batchSize) {\r\n console.log('[APIReporter] Batch size reached, flushing batch');\r\n await this.flushBatch();\r\n } else {\r\n console.log('[APIReporter] Batch size:', this.batch.length, '/', this.config.api.batchSize);\r\n }\r\n }\r\n\r\n private async flushBatch(): Promise<void> {\r\n if (this.batch.length === 0 || !this.currentRun) return;\r\n\r\n try {\r\n console.log('[APIReporter] Flushing batch of', this.batch.length, 'test results');\r\n const response = await axios.post(\r\n `${this.config.api.url}/api/v1/runs/${this.currentRun.id}/results`,\r\n this.batch.map((t) => ({\r\n ...t,\r\n startTime: t.startTime?.toISOString(),\r\n endTime: t.endTime?.toISOString(),\r\n })),\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.api.key || '',\r\n },\r\n timeout: this.config.api.timeout,\r\n }\r\n );\r\n console.log('[APIReporter] Batch flushed successfully:', response.status);\r\n } catch (error: any) {\r\n console.warn('[APIReporter] Failed to send test results to API:');\r\n console.warn(' Error:', error.message);\r\n console.warn(' Status:', error.response?.status);\r\n console.warn(' Data:', error.response?.data);\r\n } finally {\r\n this.batch = [];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Main reporter that coordinates multiple output destinations.\r\n */\r\nexport class QAgenticReporter {\r\n private static instance: QAgenticReporter | null = null;\r\n private config: QAgenticConfig;\r\n private reporters: BaseReporter[] = [];\r\n private currentRun: TestRunResult | null = null;\r\n\r\n constructor(config?: QAgenticConfig) {\r\n this.config = config || getConfig();\r\n\r\n console.log('[QAgenticReporter] Initializing with config:', {\r\n projectName: this.config.projectName,\r\n environment: this.config.environment,\r\n apiEnabled: this.config.api.enabled,\r\n apiUrl: this.config.api.url,\r\n });\r\n\r\n // Initialize reporters based on config\r\n if (this.config.features.consoleOutput) {\r\n this.reporters.push(new ConsoleReporter(this.config));\r\n console.log('[QAgenticReporter] Added ConsoleReporter');\r\n }\r\n\r\n if (this.config.local.enabled) {\r\n this.reporters.push(new JSONReporter(this.config));\r\n console.log('[QAgenticReporter] Added JSONReporter');\r\n if (this.config.local.formats.includes('junit')) {\r\n this.reporters.push(new JUnitReporter(this.config));\r\n console.log('[QAgenticReporter] Added JUnitReporter');\r\n }\r\n }\r\n\r\n if (this.config.api.enabled) {\r\n this.reporters.push(new APIReporter(this.config));\r\n console.log('[QAgenticReporter] Added APIReporter');\r\n }\r\n\r\n console.log('[QAgenticReporter] Initialization complete with', this.reporters.length, 'reporters');\r\n }\r\n\r\n /**\r\n * Get singleton instance.\r\n */\r\n static getInstance(config?: QAgenticConfig): QAgenticReporter {\r\n if (!QAgenticReporter.instance) {\r\n QAgenticReporter.instance = new QAgenticReporter(config);\r\n }\r\n return QAgenticReporter.instance;\r\n }\r\n\r\n /**\r\n * Reset singleton instance.\r\n */\r\n static reset(): void {\r\n QAgenticReporter.instance = null;\r\n }\r\n\r\n /**\r\n * Start a new test run.\r\n */\r\n async startRun(options: Partial<TestRunResult> = {}): Promise<TestRunResult> {\r\n this.currentRun = {\r\n id: options.id || uuidv4(),\r\n name: options.name || `run_${new Date().toISOString().replace(/[:.]/g, '')}`,\r\n projectName: options.projectName || this.config.projectName,\r\n environment: options.environment || this.config.environment,\r\n startTime: new Date(),\r\n durationMs: 0,\r\n tests: [],\r\n total: 0,\r\n passed: 0,\r\n failed: 0,\r\n broken: 0,\r\n skipped: 0,\r\n passRate: 0,\r\n labels: { ...this.config.labels.custom, ...options.labels },\r\n parameters: options.parameters || {},\r\n ciBuildId: options.ciBuildId,\r\n ciBuildUrl: options.ciBuildUrl,\r\n branch: options.branch,\r\n commitHash: options.commitHash,\r\n };\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.startRun(this.currentRun);\r\n }\r\n\r\n return this.currentRun;\r\n }\r\n\r\n /**\r\n * End the current test run.\r\n */\r\n async endRun(): Promise<TestRunResult | null> {\r\n if (!this.currentRun) return null;\r\n\r\n this.currentRun.endTime = new Date();\r\n this.currentRun.durationMs =\r\n this.currentRun.endTime.getTime() - (this.currentRun.startTime?.getTime() || 0);\r\n this.currentRun.passRate =\r\n this.currentRun.total > 0 ? (this.currentRun.passed / this.currentRun.total) * 100 : 0;\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.endRun(this.currentRun);\r\n }\r\n\r\n const run = this.currentRun;\r\n this.currentRun = null;\r\n return run;\r\n }\r\n\r\n /**\r\n * Report a test result.\r\n */\r\n async reportTest(test: TestResult): Promise<void> {\r\n if (!this.currentRun) {\r\n console.warn('[QAgenticReporter] No active run to report test');\r\n return;\r\n }\r\n\r\n this.currentRun.tests.push(test);\r\n this.currentRun.total++;\r\n\r\n switch (test.status) {\r\n case 'passed':\r\n this.currentRun.passed++;\r\n break;\r\n case 'failed':\r\n this.currentRun.failed++;\r\n break;\r\n case 'broken':\r\n this.currentRun.broken++;\r\n break;\r\n case 'skipped':\r\n this.currentRun.skipped++;\r\n break;\r\n }\r\n\r\n console.log('[QAgenticReporter] Test counts:', {\r\n total: this.currentRun.total,\r\n passed: this.currentRun.passed,\r\n failed: this.currentRun.failed,\r\n broken: this.currentRun.broken,\r\n skipped: this.currentRun.skipped,\r\n });\r\n\r\n for (const reporter of this.reporters) {\r\n await reporter.reportTest(test);\r\n }\r\n }\r\n\r\n /**\r\n * Get the current test run.\r\n */\r\n getCurrentRun(): TestRunResult | null {\r\n return this.currentRun;\r\n }\r\n}\r\n\r\n/**\r\n * Get the global reporter instance.\r\n */\r\nexport function getReporter(config?: QAgenticConfig): QAgenticReporter {\r\n return QAgenticReporter.getInstance(config);\r\n}\r\n","/**\r\n * QAagentic Cypress - Simplified Setup\r\n * \r\n * One-line integration for Cypress projects\r\n * No complex configuration needed!\r\n * \r\n * @example\r\n * ```typescript\r\n * // cypress.config.ts - Just add this one line!\r\n * import { setupQAgentic } from '@qagentic/reporter/cypress/simple-setup';\r\n * \r\n * export default defineConfig({\r\n * e2e: {\r\n * setupNodeEvents(on, config) {\r\n * setupQAgentic(on, config); // That's it!\r\n * return config;\r\n * },\r\n * },\r\n * });\r\n * ```\r\n */\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { configure } from '../core/config';\r\nimport { QAgenticReporter } from '../core/reporter';\r\nimport { parseStatus } from '../core/status';\r\nimport type { TestResult, TestRunResult } from '../core/types';\r\n\r\n/**\r\n * Simplified QAagentic setup for Cypress\r\n * Auto-detects configuration from environment variables\r\n * Zero manual configuration needed!\r\n */\r\nclass QAgenticCypressReporter {\r\n private reporter: QAgenticReporter;\r\n private currentRun: TestRunResult | null = null;\r\n private projectName: string;\r\n private environment: string;\r\n private runStarted = false;\r\n private runFinalized = false;\r\n private stats = {\r\n suites: 0,\r\n tests: 0,\r\n passes: 0,\r\n pending: 0,\r\n failures: 0,\r\n start: new Date(),\r\n end: new Date(),\r\n duration: 0\r\n };\r\n\r\n constructor(config: any) {\r\n // Auto-configure from environment or defaults\r\n this.projectName = process.env.QAGENTIC_PROJECT_NAME || \r\n config.projectId || \r\n 'Cypress E2E Tests';\r\n \r\n this.environment = process.env.QAGENTIC_ENVIRONMENT || \r\n process.env.NODE_ENV || \r\n 'e2e';\r\n \r\n const apiUrl = process.env.QAGENTIC_API_URL || \r\n 'http://localhost:8080';\r\n\r\n // Configure QAagentic\r\n configure({\r\n projectName: this.projectName,\r\n environment: this.environment,\r\n apiUrl,\r\n outputDir: './qagentic-results',\r\n });\r\n\r\n this.reporter = QAgenticReporter.getInstance();\r\n this.stats.start = new Date();\r\n }\r\n\r\n async onRunBegin() {\r\n try {\r\n console.log('[QAagentic] onRunBegin called, calling reporter.startRun()');\r\n this.currentRun = await this.reporter.startRun({\r\n name: this.projectName,\r\n projectName: this.projectName,\r\n environment: this.environment,\r\n startTime: this.stats.start,\r\n });\r\n console.log('[QAagentic] onRunBegin completed, currentRun:', this.currentRun?.id);\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to start run:', error);\r\n }\r\n }\r\n\r\n async ensureRunStarted() {\r\n if (this.runStarted) return;\r\n \r\n this.runStarted = true;\r\n console.log('[QAagentic] Ensuring run is started');\r\n try {\r\n await this.onRunBegin();\r\n console.log('[QAagentic] Run started successfully');\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to start run:', error);\r\n }\r\n }\r\n\r\n async onTestEnd(test: any) {\r\n // Ensure run is started before processing tests\r\n await this.ensureRunStarted();\r\n \r\n if (!this.currentRun) return;\r\n\r\n try {\r\n const testResult: TestResult = {\r\n id: uuidv4(),\r\n name: test.title[test.title.length - 1],\r\n fullName: test.title.join(' > '),\r\n status: parseStatus(test.state),\r\n durationMs: test.duration,\r\n startTime: new Date(Date.now() - test.duration),\r\n endTime: new Date(),\r\n labels: {\r\n suite: test.title.slice(0, -1).join(' > '),\r\n feature: test.title[0],\r\n },\r\n links: [],\r\n parameters: {},\r\n steps: [],\r\n attachments: [],\r\n filePath: test.invocationDetails?.relativeFile || '',\r\n retryCount: 0,\r\n isRetry: false,\r\n isFlaky: false,\r\n };\r\n\r\n if (test.err) {\r\n testResult.errorMessage = test.err.message;\r\n testResult.stackTrace = test.err.stack;\r\n testResult.errorType = 'AssertionError';\r\n }\r\n\r\n // Update stats\r\n this.stats.tests++;\r\n if (test.state === 'passed') this.stats.passes++;\r\n if (test.state === 'failed') this.stats.failures++;\r\n if (test.state === 'pending') this.stats.pending++;\r\n\r\n await this.reporter.reportTest(testResult);\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to report test:', error);\r\n }\r\n }\r\n\r\n async finalizeRun() {\r\n if (this.runFinalized || !this.currentRun) return;\r\n \r\n this.runFinalized = true;\r\n console.log('[QAagentic] Finalizing run');\r\n \r\n try {\r\n this.stats.end = new Date();\r\n this.stats.duration = this.stats.end.getTime() - this.stats.start.getTime();\r\n\r\n // Update run with final stats\r\n this.currentRun.endTime = this.stats.end;\r\n this.currentRun.durationMs = this.stats.duration;\r\n this.currentRun.total = this.stats.tests;\r\n this.currentRun.passed = this.stats.passes;\r\n this.currentRun.failed = this.stats.failures;\r\n this.currentRun.skipped = this.stats.pending;\r\n\r\n console.log('[QAagentic] Calling reporter.endRun with stats:', {\r\n total: this.currentRun.total,\r\n passed: this.currentRun.passed,\r\n failed: this.currentRun.failed,\r\n skipped: this.currentRun.skipped,\r\n });\r\n \r\n await this.reporter.endRun();\r\n console.log('[QAagentic] Run finalized successfully');\r\n } catch (error) {\r\n console.warn('[QAagentic] Failed to finalize run:', error);\r\n }\r\n }\r\n\r\n}\r\n\r\nexport function setupQAgentic(on: any, config: any): void {\r\n const reporter = new QAgenticCypressReporter(config);\r\n\r\n // Simple approach: Process tests in after:spec and finalize immediately\r\n on('after:spec', (_spec: any, results: any) => {\r\n return (async () => {\r\n if (!results?.tests) return;\r\n \r\n try {\r\n // Process all tests from this spec\r\n for (const test of results.tests) {\r\n await reporter.onTestEnd(test);\r\n }\r\n \r\n // Finalize run after all tests are processed\r\n await reporter.finalizeRun();\r\n \r\n // Wait for API calls to complete\r\n await new Promise((resolve) => setTimeout(resolve, 2000));\r\n } catch (error) {\r\n console.warn('[QAagentic] Error processing spec:', error);\r\n }\r\n })();\r\n });\r\n}\r\n"]}
@@ -647,6 +647,7 @@ var QAgenticCypressReporter = class {
647
647
  constructor(config) {
648
648
  this.currentRun = null;
649
649
  this.runStarted = false;
650
+ this.runFinalized = false;
650
651
  this.stats = {
651
652
  suites: 0,
652
653
  tests: 0,
@@ -733,8 +734,10 @@ var QAgenticCypressReporter = class {
733
734
  console.warn("[QAagentic] Failed to report test:", error);
734
735
  }
735
736
  }
736
- async onRunEnd() {
737
- if (!this.currentRun) return;
737
+ async finalizeRun() {
738
+ if (this.runFinalized || !this.currentRun) return;
739
+ this.runFinalized = true;
740
+ console.log("[QAagentic] Finalizing run");
738
741
  try {
739
742
  this.stats.end = /* @__PURE__ */ new Date();
740
743
  this.stats.duration = this.stats.end.getTime() - this.stats.start.getTime();
@@ -744,51 +747,32 @@ var QAgenticCypressReporter = class {
744
747
  this.currentRun.passed = this.stats.passes;
745
748
  this.currentRun.failed = this.stats.failures;
746
749
  this.currentRun.skipped = this.stats.pending;
750
+ console.log("[QAagentic] Calling reporter.endRun with stats:", {
751
+ total: this.currentRun.total,
752
+ passed: this.currentRun.passed,
753
+ failed: this.currentRun.failed,
754
+ skipped: this.currentRun.skipped
755
+ });
747
756
  await this.reporter.endRun();
748
- await new Promise((resolve) => setTimeout(resolve, 2e3));
757
+ console.log("[QAagentic] Run finalized successfully");
749
758
  } catch (error) {
750
- console.warn("[QAagentic] Failed to end run:", error);
759
+ console.warn("[QAagentic] Failed to finalize run:", error);
751
760
  }
752
761
  }
753
762
  };
754
763
  function setupQAgentic(on, config) {
755
764
  const reporter = new QAgenticCypressReporter(config);
756
- on("before:run", () => {
757
- return (async () => {
758
- console.log("[QAagentic] Starting test run");
759
- try {
760
- await reporter.onRunBegin();
761
- console.log("[QAagentic] Test run started successfully");
762
- await new Promise((resolve) => setTimeout(resolve, 2e3));
763
- } catch (error) {
764
- console.warn("[QAagentic] Error starting test run:", error);
765
- }
766
- })();
767
- });
768
765
  on("after:spec", (_spec, results) => {
769
766
  return (async () => {
770
767
  if (!results?.tests) return;
771
- console.log("[QAagentic] Processing", results.tests.length, "test results");
772
768
  try {
773
769
  for (const test of results.tests) {
774
770
  await reporter.onTestEnd(test);
775
771
  }
776
- console.log("[QAagentic] Test results processed successfully");
777
- await new Promise((resolve) => setTimeout(resolve, 1e3));
778
- } catch (error) {
779
- console.warn("[QAagentic] Error processing test results:", error);
780
- }
781
- })();
782
- });
783
- on("after:run", () => {
784
- return (async () => {
785
- console.log("[QAagentic] Ending test run");
786
- try {
787
- await reporter.onRunEnd();
788
- console.log("[QAagentic] Test run ended successfully");
789
- await new Promise((resolve) => setTimeout(resolve, 3e3));
772
+ await reporter.finalizeRun();
773
+ await new Promise((resolve) => setTimeout(resolve, 2e3));
790
774
  } catch (error) {
791
- console.warn("[QAagentic] Error ending test run:", error);
775
+ console.warn("[QAagentic] Error processing spec:", error);
792
776
  }
793
777
  })();
794
778
  });