{"version":3,"sources":["../../src/utils/ui.ts","../../src/utils/logger.ts","../../src/utils/progress.ts","../../src/types/index.ts","../../src/utils/validation.ts","../../src/utils/fs.ts","../../src/core/shard-detection.ts","../../src/core/parser.ts","../../src/core/validators.ts","../../src/core/discovery.ts","../../src/core/cache-extractor.ts","../../src/version.ts","../../src/utils/verbose.ts","../../src/collectors/git.ts","../../src/utils/env.ts","../../src/collectors/ci.ts","../../src/core/build-detector.ts","../../src/utils/retry.ts","../../src/services/cache-api.ts","../../src/cli/commands/cache.ts","../../src/cli/commands/last-failed.ts","../../src/config/index.ts","../../src/core/attachments.ts","../../src/collectors/system.ts","../../src/services/api.ts","../../src/services/sas.ts","../../src/utils/files.ts","../../src/services/azure.ts","../../src/services/upload.ts","../../src/cli/commands/upload.ts","../../src/cli/commands.ts","../../src/cli/index.ts"],"names":["z","path","fs","join","os","resolve","grepPattern","type","Command","isVerbose"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * CLI UI utilities for rich terminal output\n * Provides colors, spinners, progress bars, and formatted boxes\n */\n\nimport chalk from 'chalk';\nimport ora, { type Ora } from 'ora';\nimport cliProgress from 'cli-progress';\nimport figures from 'figures';\n\n// ============================================================================\n// Environment Detection\n// ============================================================================\n\n/**\n * Check if the terminal supports interactive features (spinners, colors)\n */\nfunction isInteractive(): boolean {\n  // Disable in CI environments\n  if (process.env.CI || process.env.GITHUB_ACTIONS || process.env.GITLAB_CI) {\n    return false;\n  }\n  // Check if stdout is a TTY\n  return Boolean(process.stdout.isTTY);\n}\n\n/**\n * Check if colors should be enabled\n */\nfunction supportsColor(): boolean {\n  // Respect NO_COLOR environment variable\n  if (process.env.NO_COLOR) {\n    return false;\n  }\n  // Force color if requested\n  if (process.env.FORCE_COLOR) {\n    return true;\n  }\n  return Boolean(process.stdout.isTTY);\n}\n\n// ============================================================================\n// Colors\n// ============================================================================\n\n/**\n * Color utilities - automatically handles non-color environments\n */\nexport const colors = {\n  // Status colors\n  success: (text: string) => (supportsColor() ? chalk.green(text) : text),\n  error: (text: string) => (supportsColor() ? chalk.red(text) : text),\n  warning: (text: string) => (supportsColor() ? chalk.yellow(text) : text),\n  info: (text: string) => (supportsColor() ? chalk.cyan(text) : text),\n\n  // Text styles\n  bold: (text: string) => (supportsColor() ? chalk.bold(text) : text),\n  dim: (text: string) => (supportsColor() ? chalk.dim(text) : text),\n  italic: (text: string) => (supportsColor() ? chalk.italic(text) : text),\n  underline: (text: string) => (supportsColor() ? chalk.underline(text) : text),\n\n  // Specific colors\n  white: (text: string) => (supportsColor() ? chalk.white(text) : text),\n  gray: (text: string) => (supportsColor() ? chalk.gray(text) : text),\n  blue: (text: string) => (supportsColor() ? chalk.blue(text) : text),\n  magenta: (text: string) => (supportsColor() ? chalk.magenta(text) : text),\n\n  // Combined styles\n  successBold: (text: string) =>\n    supportsColor() ? chalk.green.bold(text) : text,\n  errorBold: (text: string) => (supportsColor() ? chalk.red.bold(text) : text),\n  url: (text: string) => (supportsColor() ? chalk.blue.underline(text) : text),\n  label: (text: string) => (supportsColor() ? chalk.white.bold(text) : text),\n  value: (text: string) => (supportsColor() ? chalk.white(text) : text),\n};\n\n// ============================================================================\n// Symbols\n// ============================================================================\n\n/**\n * Cross-platform symbols\n */\nexport const symbols = {\n  success: figures.tick,\n  error: figures.cross,\n  warning: figures.warning,\n  info: figures.info,\n  bullet: figures.bullet,\n  pointer: figures.pointer,\n  arrowRight: figures.arrowRight,\n  line: figures.line,\n  ellipsis: figures.ellipsis,\n};\n\n// ============================================================================\n// Box Drawing\n// ============================================================================\n\ninterface BoxOptions {\n  padding?: number;\n  borderColor?: 'green' | 'red' | 'yellow' | 'cyan' | 'white';\n  title?: string;\n}\n\n/**\n * Create a bordered box around content\n */\nexport function box(content: string[], options: BoxOptions = {}): string {\n  const { padding = 1, borderColor = 'white', title } = options;\n\n  // Calculate the maximum width\n  const maxContentWidth = Math.max(\n    ...content.map(line => stripAnsi(line).length),\n    title ? stripAnsi(title).length : 0\n  );\n  const boxWidth = maxContentWidth + padding * 2 + 2;\n\n  // Border characters\n  const chars = {\n    topLeft: '┌',\n    topRight: '┐',\n    bottomLeft: '└',\n    bottomRight: '┘',\n    horizontal: '─',\n    vertical: '│',\n  };\n\n  // Color function based on borderColor\n  const colorFn =\n    borderColor === 'green'\n      ? colors.success\n      : borderColor === 'red'\n        ? colors.error\n        : borderColor === 'yellow'\n          ? colors.warning\n          : borderColor === 'cyan'\n            ? colors.info\n            : colors.white;\n\n  // Build the box\n  const lines: string[] = [];\n\n  // Top border with optional title\n  if (title) {\n    const titleText = ` ${title} `;\n    const remainingWidth = boxWidth - 2 - titleText.length;\n    const leftPadding = Math.floor(remainingWidth / 2);\n    const rightPadding = remainingWidth - leftPadding;\n    lines.push(\n      colorFn(chars.topLeft) +\n        colorFn(chars.horizontal.repeat(leftPadding)) +\n        colors.bold(titleText) +\n        colorFn(chars.horizontal.repeat(rightPadding)) +\n        colorFn(chars.topRight)\n    );\n  } else {\n    lines.push(\n      colorFn(chars.topLeft) +\n        colorFn(chars.horizontal.repeat(boxWidth - 2)) +\n        colorFn(chars.topRight)\n    );\n  }\n\n  // Empty padding line\n  if (padding > 0) {\n    lines.push(\n      colorFn(chars.vertical) +\n        ' '.repeat(boxWidth - 2) +\n        colorFn(chars.vertical)\n    );\n  }\n\n  // Content lines\n  for (const line of content) {\n    const lineLength = stripAnsi(line).length;\n    const rightPad = boxWidth - 2 - padding - lineLength - padding;\n    lines.push(\n      colorFn(chars.vertical) +\n        ' '.repeat(padding) +\n        line +\n        ' '.repeat(Math.max(0, rightPad + padding)) +\n        colorFn(chars.vertical)\n    );\n  }\n\n  // Empty padding line\n  if (padding > 0) {\n    lines.push(\n      colorFn(chars.vertical) +\n        ' '.repeat(boxWidth - 2) +\n        colorFn(chars.vertical)\n    );\n  }\n\n  // Bottom border\n  lines.push(\n    colorFn(chars.bottomLeft) +\n      colorFn(chars.horizontal.repeat(boxWidth - 2)) +\n      colorFn(chars.bottomRight)\n  );\n\n  return lines.join('\\n');\n}\n\n/**\n * Strip ANSI escape codes from a string\n */\nfunction stripAnsi(str: string): string {\n  // eslint-disable-next-line no-control-regex\n  return str.replace(/\\x1B\\[[0-9;]*[a-zA-Z]/g, '');\n}\n\n// ============================================================================\n// Spinners\n// ============================================================================\n\n/**\n * Spinner wrapper that handles non-interactive environments\n */\nexport interface Spinner {\n  start(text?: string): void;\n  succeed(text?: string): void;\n  fail(text?: string): void;\n  warn(text?: string): void;\n  info(text?: string): void;\n  stop(): void;\n  text: string;\n}\n\nclass InteractiveSpinner implements Spinner {\n  private spinner: Ora;\n\n  constructor(text: string) {\n    this.spinner = ora({\n      text,\n      spinner: 'dots',\n      color: 'cyan',\n    });\n  }\n\n  get text(): string {\n    return this.spinner.text;\n  }\n\n  set text(value: string) {\n    this.spinner.text = value;\n  }\n\n  start(text?: string): void {\n    this.spinner.start(text);\n  }\n\n  succeed(text?: string): void {\n    this.spinner.succeed(text);\n  }\n\n  fail(text?: string): void {\n    this.spinner.fail(text);\n  }\n\n  warn(text?: string): void {\n    this.spinner.warn(text);\n  }\n\n  info(text?: string): void {\n    this.spinner.info(text);\n  }\n\n  stop(): void {\n    this.spinner.stop();\n  }\n}\n\nclass StaticSpinner implements Spinner {\n  private _text: string;\n\n  constructor(text: string) {\n    this._text = text;\n  }\n\n  get text(): string {\n    return this._text;\n  }\n\n  set text(value: string) {\n    this._text = value;\n  }\n\n  start(text?: string): void {\n    console.log(`  ${symbols.pointer} ${text || this._text}`);\n  }\n\n  succeed(text?: string): void {\n    console.log(`  ${colors.success(symbols.success)} ${text || this._text}`);\n  }\n\n  fail(text?: string): void {\n    console.log(`  ${colors.error(symbols.error)} ${text || this._text}`);\n  }\n\n  warn(text?: string): void {\n    console.log(`  ${colors.warning(symbols.warning)} ${text || this._text}`);\n  }\n\n  info(text?: string): void {\n    console.log(`  ${colors.info(symbols.info)} ${text || this._text}`);\n  }\n\n  stop(): void {\n    // No-op for static spinner\n  }\n}\n\n/**\n * Create a spinner (interactive or static based on environment)\n */\nexport function createSpinner(text: string): Spinner {\n  if (isInteractive()) {\n    return new InteractiveSpinner(text);\n  }\n  return new StaticSpinner(text);\n}\n\n// ============================================================================\n// Progress Bar\n// ============================================================================\n\nexport interface ProgressBar {\n  start(total: number, startValue?: number): void;\n  update(value: number, payload?: Record<string, string>): void;\n  increment(payload?: Record<string, string>): void;\n  stop(): void;\n}\n\nclass InteractiveProgressBar implements ProgressBar {\n  private bar: cliProgress.SingleBar;\n\n  constructor() {\n    this.bar = new cliProgress.SingleBar(\n      {\n        format: '  {bar} {percentage}% │ {value}/{total} │ {filename}',\n        barCompleteChar: '█',\n        barIncompleteChar: '░',\n        hideCursor: true,\n        clearOnComplete: true,\n        barsize: 30,\n      },\n      cliProgress.Presets.shades_classic\n    );\n  }\n\n  start(total: number, startValue: number = 0): void {\n    this.bar.start(total, startValue, { filename: '' });\n  }\n\n  update(value: number, payload?: Record<string, string>): void {\n    this.bar.update(value, payload);\n  }\n\n  increment(payload?: Record<string, string>): void {\n    if (payload) {\n      this.bar.increment(payload);\n    } else {\n      this.bar.increment();\n    }\n  }\n\n  stop(): void {\n    this.bar.stop();\n  }\n}\n\nclass StaticProgressBar implements ProgressBar {\n  private total: number = 0;\n  private current: number = 0;\n\n  start(total: number, startValue: number = 0): void {\n    this.total = total;\n    this.current = startValue;\n  }\n\n  update(value: number, payload?: Record<string, string>): void {\n    this.current = value;\n    const filename = payload?.filename || '';\n    console.log(\n      `  ${colors.success(symbols.success)} ${filename} (${value}/${this.total})`\n    );\n  }\n\n  increment(payload?: Record<string, string>): void {\n    this.current++;\n    const filename = payload?.filename || '';\n    console.log(`  ${colors.success(symbols.success)} ${filename}`);\n  }\n\n  stop(): void {\n    // No-op\n  }\n}\n\n/**\n * Create a progress bar (interactive or static based on environment)\n */\nexport function createProgressBar(): ProgressBar {\n  if (isInteractive()) {\n    return new InteractiveProgressBar();\n  }\n  return new StaticProgressBar();\n}\n\n// ============================================================================\n// Formatting Utilities\n// ============================================================================\n\n/**\n * Format a key-value pair with consistent spacing\n */\nexport function formatKeyValue(\n  key: string,\n  value: string | number | boolean,\n  keyWidth: number = 16\n): string {\n  const paddedKey = key.padEnd(keyWidth);\n  return `  ${colors.label(paddedKey)} ${colors.value(String(value))}`;\n}\n\n/**\n * Format a section header\n */\nexport function formatSection(title: string): string {\n  return `\\n${colors.bold(title)}`;\n}\n\n/**\n * Format a URL for display\n */\nexport function formatUrl(url: string): string {\n  return colors.url(url);\n}\n\n// ============================================================================\n// Preset Messages\n// ============================================================================\n\n/**\n * Print a header box for the CLI\n */\nexport function printHeader(\n  version: string,\n  action: string = 'Uploading Playwright reports'\n): void {\n  console.log(\n    box([`TestDino CLI v${version}`, colors.dim(action)], {\n      borderColor: 'cyan',\n    })\n  );\n  console.log();\n}\n\n/**\n * Print a success box\n */\nexport function printSuccess(message: string, url?: string): void {\n  const content = [colors.success(`${symbols.success} ${message}`)];\n  if (url) {\n    content.push('');\n    content.push('View results:');\n    content.push(formatUrl(url));\n  }\n  console.log();\n  console.log(box(content, { borderColor: 'green' }));\n}\n\n/**\n * Print an error box\n */\nexport function printError(\n  title: string,\n  message: string,\n  suggestions?: string[]\n): void {\n  const content = [colors.error(`${symbols.error} ${title}`)];\n  content.push('');\n  content.push(message);\n\n  if (suggestions && suggestions.length > 0) {\n    content.push('');\n    content.push(colors.dim('Troubleshooting:'));\n    for (const suggestion of suggestions) {\n      content.push(`${colors.dim(symbols.bullet)} ${suggestion}`);\n    }\n  }\n\n  console.log();\n  console.log(box(content, { borderColor: 'red' }));\n}\n\n// ============================================================================\n// Help Formatting\n// ============================================================================\n\n/**\n * Print help header with version\n */\nexport function printHelpHeader(version: string, description: string): void {\n  console.log(\n    box([`TestDino CLI v${version}`, colors.dim(description)], {\n      borderColor: 'cyan',\n      padding: 1,\n    })\n  );\n}\n\n/**\n * Print a section title for help\n */\nexport function printHelpSection(title: string): void {\n  console.log(`\\n${colors.bold(title)}`);\n}\n\n/**\n * Print a command entry for help\n */\nexport function printHelpCommand(\n  name: string,\n  description: string,\n  nameWidth: number = 20\n): void {\n  console.log(\n    `  ${colors.info(name.padEnd(nameWidth))} ${colors.dim(description)}`\n  );\n}\n\n/**\n * Print an option entry for help\n */\nexport function printHelpOption(\n  flags: string,\n  description: string,\n  flagWidth: number = 28\n): void {\n  console.log(`  ${colors.gray(flags.padEnd(flagWidth))} ${description}`);\n}\n\n/**\n * Print an example for help\n */\nexport function printHelpExample(command: string, description?: string): void {\n  if (description) {\n    console.log(`  ${colors.dim(description)}`);\n  }\n  console.log(`  ${colors.white('$')} ${command}`);\n}\n\n/**\n * Print a key-value pair for help (env vars, etc)\n */\nexport function printHelpEnvVar(\n  name: string,\n  description: string,\n  nameWidth: number = 22\n): void {\n  console.log(\n    `  ${colors.gray(name.padEnd(nameWidth))} ${colors.dim(description)}`\n  );\n}\n","/**\n * Simple logging utilities using UI colors and symbols\n */\n\nimport { colors, symbols, formatKeyValue, formatSection } from './ui';\n\nlet verboseMode = false;\n\nexport function setVerbose(verbose: boolean): void {\n  verboseMode = verbose;\n}\n\nexport function isVerbose(): boolean {\n  return verboseMode;\n}\n\n/**\n * Redact sensitive information\n */\nfunction redact(value: string): string {\n  return value\n    .replace(/trx_[a-z]+_[a-f0-9]{64}/gi, 'trx_***')\n    .replace(/\\?sv=[^&\\s]+(&[^&\\s]+)*/g, '?[REDACTED]')\n    .replace(/sig=[^&\\s]+/g, 'sig=***');\n}\n\nexport const logger = {\n  info: (msg: string) => console.log(`  ${msg}`),\n  success: (msg: string) =>\n    console.log(`  ${colors.success(symbols.success)} ${msg}`),\n  warn: (msg: string) =>\n    console.warn(`  ${colors.warning(symbols.warning)} ${colors.warning(msg)}`),\n  error: (msg: string) =>\n    console.error(`  ${colors.error(symbols.error)} ${colors.error(msg)}`),\n\n  verbose: (msg: string) =>\n    verboseMode && console.log(`  ${colors.dim(redact(msg))}`),\n  debug: (msg: string) =>\n    verboseMode && console.log(`  ${colors.dim(`[DEBUG] ${redact(msg)}`)}`),\n\n  section: (title: string) => console.log(formatSection(title)),\n  kv: (key: string, value: string | number | boolean) =>\n    console.log(formatKeyValue(key, value)),\n  item: (msg: string) => console.log(`  ${colors.dim(symbols.bullet)} ${msg}`),\n  blank: () => console.log(),\n\n  redact,\n};\n","/**\n * Progress tracker using spinners for rich terminal output\n */\n\nimport { ProgressTracker } from '@/types';\nimport { createSpinner, type Spinner } from './ui';\n\n/**\n * Animated progress tracker with ora spinners\n */\nexport class SpinnerProgressTracker implements ProgressTracker {\n  private spinner: Spinner | null = null;\n\n  start(message: string): void {\n    this.spinner = createSpinner(message);\n    this.spinner.start();\n  }\n\n  update(message: string): void {\n    if (this.spinner) {\n      this.spinner.text = message;\n    }\n  }\n\n  succeed(message: string): void {\n    if (this.spinner) {\n      this.spinner.succeed(message);\n      this.spinner = null;\n    }\n  }\n\n  fail(message: string): void {\n    if (this.spinner) {\n      this.spinner.fail(message);\n      this.spinner = null;\n    }\n  }\n\n  warn(message: string): void {\n    if (this.spinner) {\n      this.spinner.warn(message);\n      this.spinner = null;\n    }\n  }\n}\n\n/**\n * Factory to create a progress tracker\n */\nexport function createProgressTracker(): ProgressTracker {\n  return new SpinnerProgressTracker();\n}\n","/**\n * Core types and interfaces for TestDino CLI\n */\n\nimport { z } from 'zod';\n\n// CLI Options Schema\nexport const CLIOptionsSchema = z.object({\n  reportDirectory: z.string().min(1, 'Report directory is required'),\n  token: z.string().min(1, 'API token is required'),\n  uploadImages: z.boolean().optional().default(false),\n  uploadVideos: z.boolean().optional().default(false),\n  uploadHtml: z.boolean().optional().default(false),\n  uploadTraces: z.boolean().optional().default(false),\n  uploadFiles: z.boolean().optional().default(false),\n  uploadFullJson: z.boolean().optional().default(false),\n  jsonReport: z.string().optional(),\n  htmlReport: z.string().optional(),\n  traceDir: z.string().optional(),\n  verbose: z.boolean().optional().default(false),\n  json: z.boolean().optional().default(false),\n  environment: z.string().optional().default('unknown'),\n  tags: z.array(z.string()).optional().default([]),\n});\n\nexport type CLIOptions = z.infer<typeof CLIOptionsSchema>;\n\n// Configuration Schema\nexport const ConfigSchema = z.object({\n  apiUrl: z.string().url(),\n  token: z.string().min(1),\n  uploadImages: z.boolean().default(false),\n  uploadVideos: z.boolean().default(false),\n  uploadHtml: z.boolean().default(false),\n  uploadTraces: z.boolean().default(false),\n  uploadFiles: z.boolean().default(false),\n  uploadFullJson: z.boolean().default(false),\n  verbose: z.boolean().default(false),\n  // Target environment tag for upload metadata\n  environment: z.string().default('unknown'),\n  // Run tags (custom tags passed via --tag option)\n  tags: z.array(z.string()).default([]),\n  // Performance and upload settings\n  batchSize: z.number().min(1).max(20).default(5),\n  maxConcurrentUploads: z.number().min(1).max(50).default(10),\n  uploadTimeout: z.number().min(5000).max(300000).default(60000),\n  retryAttempts: z.number().min(1).max(10).default(3),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n\n// Error Types\nexport class BaseError extends Error {\n  public readonly code: string;\n\n  public readonly cause?: Error;\n\n  constructor(message: string, code: string, cause?: Error) {\n    super(message);\n    this.name = this.constructor.name;\n    this.code = code;\n    if (cause !== undefined) {\n      this.cause = cause;\n    }\n    Error.captureStackTrace(this, this.constructor);\n  }\n}\n\nexport class ConfigurationError extends BaseError {\n  constructor(message: string, cause?: Error) {\n    super(message, 'CONFIG_ERROR', cause);\n  }\n}\n\nexport class ValidationError extends BaseError {\n  constructor(message: string, cause?: Error) {\n    super(message, 'VALIDATION_ERROR', cause);\n  }\n}\n\nexport class NetworkError extends BaseError {\n  constructor(message: string, cause?: Error) {\n    super(message, 'NETWORK_ERROR', cause);\n  }\n}\n\nexport class FileSystemError extends BaseError {\n  constructor(message: string, cause?: Error) {\n    super(message, 'FILESYSTEM_ERROR', cause);\n  }\n}\n\nexport class AuthenticationError extends BaseError {\n  constructor(message: string, cause?: Error) {\n    super(message, 'AUTH_ERROR', cause);\n  }\n}\n\n/**\n * Usage limit error data from server response\n */\nexport interface UsageLimitData {\n  tier: string;\n  limit: number;\n  used: number;\n  remaining: number;\n  resetDate: string;\n  organizationId?: string;\n  projectName?: string;\n  projectLimit?: number;\n  projectUsed?: number;\n  projectBorrowed?: number;\n}\n\n/**\n * Error thrown when monthly test case limit is exceeded\n */\nexport class UsageLimitError extends BaseError {\n  public readonly data: UsageLimitData;\n\n  constructor(message: string, data: UsageLimitData, cause?: Error) {\n    super(message, 'QUOTA_LIMIT_EXCEEDED', cause);\n    this.data = data;\n  }\n}\n\n// Exit Codes\nexport enum ExitCode {\n  SUCCESS = 0,\n  GENERAL_ERROR = 1,\n  AUTHENTICATION_ERROR = 2,\n  FILE_NOT_FOUND_ERROR = 3,\n  NETWORK_ERROR = 4,\n  USAGE_LIMIT_ERROR = 5,\n}\n\n// Command Types\nexport interface Command {\n  readonly name: string;\n  readonly description: string;\n  execute(options: CLIOptions): Promise<void>;\n}\n\n// Progress Tracking\nexport interface ProgressTracker {\n  start(message: string): void;\n  update(message: string): void;\n  succeed(message: string): void;\n  fail(message: string): void;\n  warn(message: string): void;\n}\n\n// Utility function to convert string to boolean\nexport const stringToBoolean = (value: string | undefined): boolean => {\n  if (!value) return false;\n  return ['true', '1', 'yes', 'on'].includes(value.toLowerCase());\n};\n","/**\n * Validation utilities for configuration and input\n */\n\nimport { z } from 'zod';\nimport { ValidationError, ConfigurationError } from '@/types';\nimport { logger } from '@/utils/logger';\n\n/**\n * Validation result type\n */\nexport interface ValidationResult<T> {\n  success: boolean;\n  data?: T;\n  errors?: string[];\n}\n\n/**\n * Configuration validation utilities\n */\nexport class ValidationUtils {\n  /**\n   * Validate data against a Zod schema with user-friendly error messages\n   */\n  static validateSchema<T>(\n    schema: z.ZodSchema<T>,\n    data: unknown,\n    context: string\n  ): ValidationResult<T> {\n    try {\n      const validated = schema.parse(data);\n      return {\n        success: true,\n        data: validated,\n      };\n    } catch (error) {\n      if (error instanceof z.ZodError) {\n        const errors = error.issues.map(issue => {\n          const path = issue.path.length > 0 ? issue.path.join('.') : 'root';\n          return `${path}: ${issue.message}`;\n        });\n\n        return {\n          success: false,\n          errors,\n        };\n      }\n\n      return {\n        success: false,\n        errors: [`Unexpected validation error in ${context}: ${String(error)}`],\n      };\n    }\n  }\n\n  /**\n   * Validate and throw appropriate error with context\n   */\n  static validateOrThrow<T>(\n    schema: z.ZodSchema<T>,\n    data: unknown,\n    context: string\n  ): T {\n    const result = this.validateSchema(schema, data, context);\n\n    if (!result.success) {\n      throw new ValidationError(\n        `Validation failed for ${context}: ${result.errors?.join(', ')}`\n      );\n    }\n\n    return result.data as T;\n  }\n\n  /**\n   * Validate API token format with detailed feedback\n   */\n  static validateApiToken(token: string): void {\n    if (!token) {\n      throw new ValidationError('API token is required');\n    }\n\n    if (token.length < 10) {\n      throw new ValidationError('API token is too short');\n    }\n\n    const tokenPattern = /^trx_(development|staging|production)_[a-f0-9]{64}$/;\n    if (!tokenPattern.test(token)) {\n      const parts = token.split('_');\n\n      if (parts.length !== 3) {\n        throw new ValidationError(\n          'API token must have 3 parts separated by underscores: trx_{environment}_{key}'\n        );\n      }\n\n      const prefix = parts[0];\n      const environment = parts[1];\n      const key = parts[2];\n\n      if (prefix !== 'trx') {\n        throw new ValidationError(\n          `API token must start with \"trx\", found \"${prefix}\"`\n        );\n      }\n\n      if (\n        !environment ||\n        !['development', 'staging', 'production'].includes(environment)\n      ) {\n        throw new ValidationError(\n          `Invalid environment \"${environment || 'empty'}\". Must be: development, staging, or production`\n        );\n      }\n\n      if (!key || !/^[a-f0-9]{64}$/.test(key)) {\n        throw new ValidationError(\n          'API token key must be 64 lowercase hexadecimal characters'\n        );\n      }\n    }\n  }\n\n  /**\n   * Validate URL format with helpful feedback\n   */\n  static validateUrl(url: string, context: string): void {\n    if (!url) {\n      throw new ValidationError(`${context} URL is required`);\n    }\n\n    try {\n      const parsed = new URL(url);\n\n      if (!['http:', 'https:'].includes(parsed.protocol)) {\n        throw new ValidationError(\n          `${context} URL must use HTTP or HTTPS protocol, found: ${parsed.protocol}`\n        );\n      }\n\n      if (!parsed.hostname) {\n        throw new ValidationError(`${context} URL must have a valid hostname`);\n      }\n    } catch (error) {\n      if (error instanceof ValidationError) {\n        throw error;\n      }\n      throw new ValidationError(`Invalid ${context} URL format: ${url}`);\n    }\n  }\n\n  /**\n   * Validate file path exists and is accessible\n   */\n  static validateFilePath(path: string, context: string): void {\n    if (!path) {\n      throw new ValidationError(`${context} path is required`);\n    }\n\n    if (path.includes('..')) {\n      throw new ValidationError(\n        `${context} path cannot contain parent directory references (..)`\n      );\n    }\n\n    if (path.startsWith('/') && !process.platform.startsWith('win')) {\n      logger.warn(`Using absolute path for ${context}: ${path}`);\n    }\n  }\n\n  /**\n   * Validate Node.js version requirement\n   */\n  static validateNodeVersion(requiredVersion: string = '18.0.0'): void {\n    const currentVersion = process.version;\n    const current = this.parseVersion(currentVersion.slice(1)); // Remove 'v' prefix\n    const required = this.parseVersion(requiredVersion);\n\n    if (this.compareVersions(current, required) < 0) {\n      throw new ConfigurationError(\n        `Node.js ${requiredVersion} or higher is required. ` +\n          `Current version: ${currentVersion}`\n      );\n    }\n  }\n\n  /**\n   * Parse semantic version string\n   */\n  private static parseVersion(version: string): [number, number, number] {\n    const parts = version.split('.').map(Number);\n    return [parts[0] || 0, parts[1] || 0, parts[2] || 0];\n  }\n\n  /**\n   * Compare two semantic versions\n   * Returns: -1 if a < b, 0 if a === b, 1 if a > b\n   */\n  private static compareVersions(\n    a: [number, number, number],\n    b: [number, number, number]\n  ): number {\n    for (let i = 0; i < 3; i++) {\n      const aVal = a[i] ?? 0;\n      const bVal = b[i] ?? 0;\n      if (aVal < bVal) return -1;\n      if (aVal > bVal) return 1;\n    }\n    return 0;\n  }\n\n  /**\n   * Validate environment variable name\n   */\n  static validateEnvVarName(name: string): void {\n    if (!name) {\n      throw new ValidationError('Environment variable name is required');\n    }\n\n    if (!/^[A-Z][A-Z0-9_]*$/.test(name)) {\n      throw new ValidationError(\n        `Environment variable name \"${name}\" must be uppercase letters, numbers, and underscores only`\n      );\n    }\n  }\n\n  /**\n   * Sanitize and validate file size\n   */\n  static validateFileSize(\n    size: number,\n    maxSize: number,\n    filename: string\n  ): void {\n    if (size < 0) {\n      throw new ValidationError(`Invalid file size for ${filename}: ${size}`);\n    }\n\n    if (size > maxSize) {\n      const sizeMB = Math.round(size / 1024 / 1024);\n      const maxSizeMB = Math.round(maxSize / 1024 / 1024);\n\n      throw new ValidationError(\n        `File ${filename} is too large: ${sizeMB}MB (max: ${maxSizeMB}MB)`\n      );\n    }\n  }\n\n  /**\n   * Validate timeout value\n   */\n  static validateTimeout(timeout: number): void {\n    if (timeout <= 0) {\n      throw new ValidationError('Timeout must be greater than 0');\n    }\n\n    if (timeout > 300000) {\n      // 5 minutes\n      logger.warn(`Large timeout value: ${timeout}ms (${timeout / 1000}s)`);\n    }\n  }\n\n  /**\n   * Validate retry count\n   */\n  static validateRetryCount(retries: number): void {\n    if (retries < 0) {\n      throw new ValidationError('Retry count cannot be negative');\n    }\n\n    if (retries > 10) {\n      logger.warn(`High retry count: ${retries} (this may cause long delays)`);\n    }\n  }\n}\n","import { promises as fs } from 'fs';\nimport { join, resolve } from 'path';\nimport { FileSystemError } from '@/types';\nimport { ValidationUtils } from '@/utils/validation';\n\n/**\n * Validate and resolve a file or directory path.\n */\nexport function resolvePath(p: string, context: string): string {\n  ValidationUtils.validateFilePath(p, context);\n  return resolve(p);\n}\n\n/**\n * Check if a path exists.\n */\nexport async function exists(p: string): Promise<boolean> {\n  try {\n    await fs.stat(p);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Check if the given path is a directory.\n * Returns false if the path doesn't exist or is not accessible.\n */\nexport async function isDirectory(p: string): Promise<boolean> {\n  try {\n    const stats = await fs.stat(p);\n    return stats.isDirectory();\n  } catch (_error) {\n    // Return false if path doesn't exist or is not accessible\n    // This allows graceful handling in discovery logic\n    return false;\n  }\n}\n\n/**\n * Check if the given path is a file.\n * Returns false if the path doesn't exist or is not accessible.\n */\nexport async function isFile(p: string): Promise<boolean> {\n  try {\n    const stats = await fs.stat(p);\n    return stats.isFile();\n  } catch (_error) {\n    // Return false if path doesn't exist or is not accessible\n    // This allows graceful handling in discovery logic\n    return false;\n  }\n}\n\n/**\n * Read directory contents and return full paths.\n */\nexport async function readDir(p: string): Promise<string[]> {\n  try {\n    const entries = await fs.readdir(p);\n    return entries.map(name => join(p, name));\n  } catch (error) {\n    throw new FileSystemError(`Failed to read directory: ${p}`, error as Error);\n  }\n}\n\n/**\n * Read file as text.\n */\nexport async function readFile(p: string): Promise<string> {\n  try {\n    return await fs.readFile(p, 'utf-8');\n  } catch (error) {\n    throw new FileSystemError(`Failed to read file: ${p}`, error as Error);\n  }\n}\n\n/**\n * Read file as Buffer.\n */\nexport async function readFileBuffer(p: string): Promise<Buffer> {\n  try {\n    return await fs.readFile(p);\n  } catch (error) {\n    throw new FileSystemError(\n      `Failed to read file buffer: ${p}`,\n      error as Error\n    );\n  }\n}\n","/**\n * Playwright configuration and shard detection utilities\n */\n\nimport { readFileBuffer, exists } from '@/utils/fs';\nimport path from 'path';\n\n/**\n * Shard information detected from Playwright configuration\n */\nexport interface ShardInfo {\n  shardIndex: number;\n  shardTotal: number;\n  shardId: string;\n}\n\n/**\n * Playwright configuration parser for shard detection\n */\nexport class PlaywrightShardDetector {\n  /**\n   * Auto-detect shard information from Playwright configuration and environment\n   */\n  static async detectShardInfo(workingDir: string): Promise<ShardInfo | null> {\n    try {\n      // Strategy 1: Check environment variables first (most reliable in CI)\n      const envShard = this.detectFromEnvironment();\n      if (envShard) {\n        return envShard;\n      }\n\n      // Strategy 2: Read from Playwright configuration files\n      const configShard = await this.detectFromPlaywrightConfig(workingDir);\n      if (configShard) {\n        return configShard;\n      }\n\n      // Strategy 3: Analyze JSON reports for shard indicators\n      const reportShard = await this.detectFromReports(workingDir);\n      if (reportShard) {\n        return reportShard;\n      }\n\n      return null;\n    } catch (_error) {\n      // Return null on any error - shard detection is best-effort\n      return null;\n    }\n  }\n\n  /**\n   * Detect shard info from environment variables\n   */\n  private static detectFromEnvironment(): ShardInfo | null {\n    try {\n      const env = process.env;\n\n      // GitHub Actions matrix strategy\n      if (env.GITHUB_ACTIONS && env.SHARD_INDEX && env.SHARD_TOTAL) {\n        const shardIndex = parseInt(env.SHARD_INDEX, 10);\n        const shardTotal = parseInt(env.SHARD_TOTAL, 10);\n\n        if (shardIndex > 0 && shardTotal > 0) {\n          return {\n            shardIndex,\n            shardTotal,\n            shardId: `${shardIndex}/${shardTotal}`,\n          };\n        }\n      }\n\n      // GitLab CI parallel jobs\n      if (env.GITLAB_CI && env.CI_NODE_INDEX && env.CI_NODE_TOTAL) {\n        const shardIndex = parseInt(env.CI_NODE_INDEX, 10) + 1; // GitLab is 0-indexed\n        const shardTotal = parseInt(env.CI_NODE_TOTAL, 10);\n\n        if (shardIndex > 0 && shardTotal > 0) {\n          return {\n            shardIndex,\n            shardTotal,\n            shardId: `${shardIndex}/${shardTotal}`,\n          };\n        }\n      }\n\n      // CircleCI parallelism\n      if (env.CIRCLECI && env.CIRCLE_NODE_INDEX && env.CIRCLE_NODE_TOTAL) {\n        const shardIndex = parseInt(env.CIRCLE_NODE_INDEX, 10) + 1; // CircleCI is 0-indexed\n        const shardTotal = parseInt(env.CIRCLE_NODE_TOTAL, 10);\n\n        if (shardIndex > 0 && shardTotal > 0) {\n          return {\n            shardIndex,\n            shardTotal,\n            shardId: `${shardIndex}/${shardTotal}`,\n          };\n        }\n      }\n\n      // Generic environment variables\n      if (env.SHARD_INDEX && env.SHARD_TOTAL) {\n        const shardIndex = parseInt(env.SHARD_INDEX, 10);\n        const shardTotal = parseInt(env.SHARD_TOTAL, 10);\n\n        if (shardIndex > 0 && shardTotal > 0) {\n          return {\n            shardIndex,\n            shardTotal,\n            shardId: `${shardIndex}/${shardTotal}`,\n          };\n        }\n      }\n\n      return null;\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Detect shard info from Playwright configuration files\n   */\n  private static async detectFromPlaywrightConfig(\n    workingDir: string\n  ): Promise<ShardInfo | null> {\n    const configFiles = [\n      'playwright.config.ts',\n      'playwright.config.js',\n      'playwright.config.mjs',\n      'playwright.config.cjs',\n    ];\n\n    for (const configFile of configFiles) {\n      const configPath = path.join(workingDir, configFile);\n\n      if (await exists(configPath)) {\n        try {\n          const configContent = await readFileBuffer(configPath);\n          const configText = configContent.toString();\n\n          // Look for shard configuration patterns\n          const shardMatch = configText.match(/shard:\\s*(\\d+)\\s*\\/\\s*(\\d+)/);\n          if (shardMatch?.[1] && shardMatch[2]) {\n            const shardIndex = parseInt(shardMatch[1], 10);\n            const shardTotal = parseInt(shardMatch[2], 10);\n\n            return {\n              shardIndex,\n              shardTotal,\n              shardId: `${shardIndex}/${shardTotal}`,\n            };\n          }\n\n          // Look for CLI shard argument patterns\n          const cliShardMatch = configText.match(/--shard[=\\s]+(\\d+)\\/(\\d+)/);\n          if (cliShardMatch?.[1] && cliShardMatch[2]) {\n            const shardIndex = parseInt(cliShardMatch[1], 10);\n            const shardTotal = parseInt(cliShardMatch[2], 10);\n\n            return {\n              shardIndex,\n              shardTotal,\n              shardId: `${shardIndex}/${shardTotal}`,\n            };\n          }\n        } catch {\n          // Continue to next config file on error\n          continue;\n        }\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Detect shard info from JSON reports (look for metadata in reports)\n   */\n  private static async detectFromReports(\n    workingDir: string\n  ): Promise<ShardInfo | null> {\n    try {\n      // Common report locations\n      const reportPaths = [\n        path.join(workingDir, 'playwright-report', 'report.json'),\n        path.join(workingDir, 'playwright-report', 'results.json'),\n        path.join(workingDir, 'test-results', 'results.json'),\n        path.join(workingDir, 'test-results', 'report.json'),\n        path.join(workingDir, 'results.json'),\n        path.join(workingDir, 'report.json'),\n      ];\n\n      for (const reportPath of reportPaths) {\n        if (await exists(reportPath)) {\n          try {\n            const reportContent = await readFileBuffer(reportPath);\n            const reportText = reportContent.toString();\n\n            // Parse JSON to extract shard information from config\n            try {\n              const reportJson = JSON.parse(reportText);\n\n              // Check for Playwright's config.shard structure (official format)\n              if (\n                reportJson?.config?.shard &&\n                typeof reportJson.config.shard === 'object'\n              ) {\n                const shard = reportJson.config.shard;\n\n                // Playwright uses \"current\" and \"total\" fields\n                if (\n                  typeof shard.current === 'number' &&\n                  typeof shard.total === 'number'\n                ) {\n                  const shardIndex = shard.current;\n                  const shardTotal = shard.total;\n\n                  if (\n                    shardIndex > 0 &&\n                    shardTotal > 0 &&\n                    shardIndex <= shardTotal\n                  ) {\n                    return {\n                      shardIndex,\n                      shardTotal,\n                      shardId: `${shardIndex}/${shardTotal}`,\n                    };\n                  }\n                }\n              }\n            } catch {\n              // If JSON parsing fails, continue with regex-based detection\n            }\n\n            // Fallback: Look for shard indicators using regex patterns\n            const shardMatch = reportText.match(/\"shard\":\\s*\"(\\d+)\\/(\\d+)\"/);\n            if (shardMatch?.[1] && shardMatch[2]) {\n              const shardIndex = parseInt(shardMatch[1], 10);\n              const shardTotal = parseInt(shardMatch[2], 10);\n\n              return {\n                shardIndex,\n                shardTotal,\n                shardId: `${shardIndex}/${shardTotal}`,\n              };\n            }\n\n            // Look for Playwright CLI metadata\n            if (reportText.includes('--shard')) {\n              const cliMatch = reportText.match(/--shard[=\\s]+(\\d+)\\/(\\d+)/);\n              if (cliMatch?.[1] && cliMatch[2]) {\n                const shardIndex = parseInt(cliMatch[1], 10);\n                const shardTotal = parseInt(cliMatch[2], 10);\n\n                return {\n                  shardIndex,\n                  shardTotal,\n                  shardId: `${shardIndex}/${shardTotal}`,\n                };\n              }\n            }\n          } catch {\n            // Continue to next report on error\n            continue;\n          }\n        }\n      }\n\n      return null;\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Validate shard information\n   */\n  static validateShardInfo(shardInfo: ShardInfo): boolean {\n    return (\n      shardInfo.shardIndex > 0 &&\n      shardInfo.shardTotal > 0 &&\n      shardInfo.shardIndex <= shardInfo.shardTotal &&\n      shardInfo.shardId === `${shardInfo.shardIndex}/${shardInfo.shardTotal}`\n    );\n  }\n\n  /**\n   * Create default shard info (single shard)\n   */\n  static createDefaultShardInfo(): ShardInfo {\n    return {\n      shardIndex: 1,\n      shardTotal: 1,\n      shardId: '1/1',\n    };\n  }\n}\n","import { z } from 'zod';\nimport { readFile } from '@/utils/fs';\nimport { ValidationError } from '@/types';\n\n/**\n * Zod schema for validating essential parts of a Playwright JSON report\n */\nconst PlaywrightReportSchema = z.object({\n  config: z.any(),\n  suites: z.array(z.any()),\n  stats: z.object({\n    startTime: z.string(),\n    duration: z.number(),\n    expected: z.number(),\n    skipped: z.number(),\n    unexpected: z.number(),\n    flaky: z.number(),\n  }),\n  errors: z.array(z.any()).optional(),\n  metadata: z.any().optional(),\n});\n\n/**\n * TypeScript type for a validated Playwright report\n */\nexport type PlaywrightReport = z.infer<typeof PlaywrightReportSchema>;\n\n/**\n * Read, parse, and validate a Playwright JSON report from disk.\n * @param jsonPath Absolute path to the Playwright JSON report\n * @throws ValidationError if reading, parsing, or validation fails\n */\nexport async function parsePlaywrightJson(\n  jsonPath: string\n): Promise<PlaywrightReport> {\n  let raw: string;\n  try {\n    raw = await readFile(jsonPath);\n  } catch (error) {\n    throw new ValidationError(\n      `Failed to read JSON report at \"${jsonPath}\": ${(error as Error).message}`\n    );\n  }\n\n  let parsed: unknown;\n  try {\n    parsed = JSON.parse(raw);\n  } catch (error) {\n    throw new ValidationError(\n      `Invalid JSON format in report: ${(error as Error).message}`\n    );\n  }\n\n  const result = PlaywrightReportSchema.safeParse(parsed);\n  if (!result.success) {\n    const issues = result.error.issues.map(\n      issue => `${issue.path.join('.')}: ${issue.message}`\n    );\n    throw new ValidationError(\n      `Playwright report validation failed: ${issues.join(', ')}`\n    );\n  }\n\n  return result.data;\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { FileSystemError, ValidationError } from '@/types';\n\n/**\n * Validate that the JSON report exists and is parsable.\n */\nexport async function validateJsonReport(jsonPath: string): Promise<void> {\n  try {\n    const stat = await fs.stat(jsonPath);\n    if (!stat.isFile()) {\n      throw new ValidationError(`JSON report path is not a file: ${jsonPath}`);\n    }\n  } catch (error) {\n    if (error instanceof ValidationError) throw error;\n    throw new FileSystemError(\n      `JSON report not found: ${jsonPath}`,\n      error as Error\n    );\n  }\n\n  try {\n    const content = await fs.readFile(jsonPath, 'utf-8');\n    JSON.parse(content);\n  } catch (error) {\n    if (error instanceof SyntaxError) {\n      throw new ValidationError(\n        `Failed to parse JSON report: ${(error as Error).message}`\n      );\n    }\n    throw error as Error;\n  }\n}\n\n/**\n * Validate that the HTML report directory exists and contains index.html.\n */\nexport async function validateHtmlReportDir(htmlDir: string): Promise<void> {\n  try {\n    const stat = await fs.stat(htmlDir);\n    if (!stat.isDirectory()) {\n      throw new ValidationError(\n        `HTML report path is not a directory: ${htmlDir}`\n      );\n    }\n  } catch (error) {\n    throw new FileSystemError(\n      `HTML report directory not found: ${htmlDir}`,\n      error as Error\n    );\n  }\n\n  const indexPath = join(htmlDir, 'index.html');\n  try {\n    const stat = await fs.stat(indexPath);\n    if (!stat.isFile()) {\n      throw new ValidationError(\n        `index.html not found in HTML report directory: ${htmlDir}`\n      );\n    }\n  } catch {\n    throw new ValidationError(\n      `index.html not found in HTML report directory: ${htmlDir}`\n    );\n  }\n}\n\n/**\n * Validate that the trace directory exists.\n */\nexport async function validateTraceDir(traceDir: string): Promise<void> {\n  try {\n    const stat = await fs.stat(traceDir);\n    if (!stat.isDirectory()) {\n      throw new ValidationError(`Trace path is not a directory: ${traceDir}`);\n    }\n  } catch (error) {\n    throw new FileSystemError(\n      `Trace directory not found: ${traceDir}`,\n      error as Error\n    );\n  }\n}\n","import { join } from 'path';\nimport {\n  resolvePath,\n  exists,\n  isDirectory,\n  readDir,\n  readFile,\n} from '@/utils/fs';\nimport {\n  validateJsonReport,\n  validateHtmlReportDir,\n  validateTraceDir,\n} from './validators';\nimport { CLIOptions, FileSystemError } from '@/types';\n\n/**\n * Result of the discovery process.\n */\nexport interface DiscoveryResult {\n  jsonReport: string;\n  htmlReport?: string | undefined;\n  traceDir?: string | undefined;\n}\n\n/**\n * Service to discover Playwright test report files with smart scanning.\n */\nexport class ReportDiscoveryService {\n  constructor(private readonly reportDir: string) {}\n\n  /**\n   * Discover report files based on CLI options with smart scanning.\n   */\n  async discover(options: CLIOptions): Promise<DiscoveryResult> {\n    const baseDir = resolvePath(options.reportDirectory, 'Report directory');\n\n    // JSON report discovery with manual override\n    const jsonReportPath =\n      options.jsonReport ?? (await this.findJsonReport(baseDir));\n    await validateJsonReport(jsonReportPath);\n\n    // HTML report discovery (only if upload requested)\n    let htmlReportDir: string | undefined;\n    if (options.uploadHtml) {\n      htmlReportDir =\n        options.htmlReport ?? (await this.findHtmlReport(baseDir));\n      if (htmlReportDir) {\n        await validateHtmlReportDir(htmlReportDir);\n      }\n    }\n\n    // Trace files discovery (as fallback when not found in JSON attachments)\n    let traceDirectory: string | undefined;\n    if (options.uploadTraces) {\n      // Check if traces are available in JSON attachments first\n      const hasTracesInJson =\n        await this.checkTracesInJsonReport(jsonReportPath);\n\n      if (hasTracesInJson) {\n        // Traces found in JSON attachments, no need for separate trace directory\n        traceDirectory = undefined;\n      } else {\n        // No traces in JSON, try to find trace directory as fallback\n        if (options.traceDir) {\n          // User explicitly specified trace directory - validate it exists\n          await validateTraceDir(options.traceDir);\n          traceDirectory = options.traceDir;\n        } else {\n          // Auto-discover traces - gracefully handle missing traces (normal when tests pass)\n          traceDirectory = await this.findTraceDir(baseDir);\n          if (traceDirectory) {\n            await validateTraceDir(traceDirectory);\n          }\n          // If traceDirectory is undefined, that's OK - no traces found (tests likely passed)\n        }\n      }\n    }\n\n    return {\n      jsonReport: jsonReportPath,\n      htmlReport: htmlReportDir,\n      traceDir: traceDirectory,\n    };\n  }\n\n  /**\n   * Smart JSON report discovery - scan for valid Playwright JSON files\n   */\n  private async findJsonReport(baseDir: string): Promise<string> {\n    // Try common patterns first (faster)\n    const commonPatterns = [\n      join(baseDir, 'report.json'), // Standard Playwright\n      join(baseDir, 'results.json'), // Alternative name\n      join(baseDir, 'test-results.json'), // Another common name\n      join(baseDir, 'playwright-report', 'report.json'), // Nested structure\n      join(baseDir, 'playwright-report', 'results.json'), // Nested alternative\n    ];\n\n    for (const candidate of commonPatterns) {\n      if (await exists(candidate)) {\n        // Validate it's actually a Playwright report\n        if (await this.isValidPlaywrightJson(candidate)) {\n          return candidate;\n        }\n      }\n    }\n\n    // If no common patterns found, scan all JSON files\n    const jsonFiles = await this.scanForJsonFiles(baseDir);\n\n    for (const jsonFile of jsonFiles) {\n      if (await this.isValidPlaywrightJson(jsonFile)) {\n        return jsonFile;\n      }\n    }\n\n    throw new FileSystemError(\n      `No valid Playwright JSON report found in ${baseDir}.\\n` +\n        '💡 Looked for: report.json, results.json, test-results.json\\n' +\n        '💡 Use --json-report <path> to specify exact location'\n    );\n  }\n\n  /**\n   * Smart HTML report discovery - find directory containing index.html\n   */\n  private async findHtmlReport(baseDir: string): Promise<string> {\n    // Try common patterns first\n    const commonPatterns = [\n      baseDir, // Current directory\n      join(baseDir, 'html-report'), // Standard name\n      join(baseDir, 'playwright-report'), // Standard Playwright\n      join(baseDir, 'report'), // Alternative\n      join(baseDir, 'test-report'), // Alternative\n    ];\n\n    for (const candidate of commonPatterns) {\n      if (await isDirectory(candidate)) {\n        const indexPath = join(candidate, 'index.html');\n        if (await exists(indexPath)) {\n          return candidate;\n        }\n      }\n    }\n\n    // Scan for any directory containing index.html\n    const htmlDirs = await this.scanForHtmlDirectories(baseDir);\n    if (htmlDirs.length > 0) {\n      const candidateDir = htmlDirs[0];\n      if (candidateDir !== undefined) {\n        return candidateDir;\n      }\n    }\n\n    throw new FileSystemError(\n      `No HTML report directory with index.html found in ${baseDir}.\\n` +\n        '💡 Use --html-report <path> to specify exact location'\n    );\n  }\n\n  /**\n   * Smart trace directory discovery\n   */\n  private async findTraceDir(baseDir: string): Promise<string | undefined> {\n    // Try common patterns\n    const commonPatterns = [\n      join(baseDir, 'trace'),\n      join(baseDir, 'traces'),\n      join(baseDir, 'test-results'),\n      join(baseDir, 'playwright-report', 'trace'),\n      join(baseDir, 'playwright-report', 'traces'),\n    ];\n\n    for (const candidate of commonPatterns) {\n      if (await isDirectory(candidate)) {\n        // Check if directory contains any trace files\n        if (await this.containsTraceFiles(candidate)) {\n          return candidate;\n        }\n      }\n    }\n\n    // Scan for directories containing .zip files (common trace format)\n    const traceDirs = await this.scanForTraceDirectories(baseDir);\n    if (traceDirs.length > 0) {\n      const candidateTraceDir = traceDirs[0];\n      if (candidateTraceDir !== undefined) {\n        return candidateTraceDir;\n      }\n    }\n\n    // Return undefined if no traces found (normal when tests pass)\n    return undefined;\n  }\n\n  /**\n   * Check if JSON report contains trace files in attachments\n   */\n  private async checkTracesInJsonReport(jsonPath: string): Promise<boolean> {\n    try {\n      const content = await readFile(jsonPath);\n      const data = JSON.parse(content);\n\n      if (!data?.suites || !Array.isArray(data.suites)) {\n        return false;\n      }\n\n      // Recursively check for trace attachments in the report\n      return this.hasTraceAttachments(data.suites);\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Recursively check if suites contain trace attachments\n   */\n  private hasTraceAttachments(suites: unknown[]): boolean {\n    for (const suite of suites) {\n      const suiteRecord = suite as Record<string, unknown>;\n\n      // Check specs in this suite\n      if (Array.isArray(suiteRecord.specs)) {\n        for (const spec of suiteRecord.specs as unknown[]) {\n          if (this.hasTraceAttachmentsInSpec(spec)) {\n            return true;\n          }\n        }\n      }\n\n      // Check nested suites\n      if (Array.isArray(suiteRecord.suites)) {\n        if (this.hasTraceAttachments(suiteRecord.suites as unknown[])) {\n          return true;\n        }\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * Check if a spec contains trace attachments\n   */\n  private hasTraceAttachmentsInSpec(spec: unknown): boolean {\n    const specRecord = spec as Record<string, unknown>;\n    if (!Array.isArray(specRecord.tests)) return false;\n\n    for (const test of specRecord.tests as unknown[]) {\n      const testRecord = test as Record<string, unknown>;\n      if (!Array.isArray(testRecord.results)) continue;\n\n      for (const result of testRecord.results as unknown[]) {\n        const resultRecord = result as Record<string, unknown>;\n        if (Array.isArray(resultRecord.attachments)) {\n          for (const attachment of resultRecord.attachments as unknown[]) {\n            const attachmentRecord = attachment as Record<string, unknown>;\n\n            // Check if this attachment is a trace file\n            if (this.isTraceAttachment(attachmentRecord)) {\n              return true;\n            }\n          }\n        }\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * Check if an attachment is a trace file\n   */\n  private isTraceAttachment(attachment: Record<string, unknown>): boolean {\n    const name = attachment.name as string;\n    const contentType = attachment.contentType as string;\n\n    if (!name || !contentType) return false;\n\n    const lowerName = name.toLowerCase();\n    const lowerContentType = contentType.toLowerCase();\n\n    // Check content type for trace files\n    const traceContentTypes = [\n      'application/zip',\n      'application/x-zip-compressed',\n      'application/octet-stream',\n    ];\n\n    if (traceContentTypes.includes(lowerContentType)) {\n      // Additional check for trace files by name\n      if (\n        lowerName.includes('trace') ||\n        lowerName.endsWith('.trace') ||\n        lowerName.endsWith('.zip')\n      ) {\n        return true;\n      }\n    }\n\n    // Fallback check by name\n    return lowerName.includes('trace') || lowerName.endsWith('.trace');\n  }\n\n  /**\n   * Validate if a JSON file is a valid Playwright report\n   */\n  private async isValidPlaywrightJson(filePath: string): Promise<boolean> {\n    try {\n      const content = await readFile(filePath);\n      const data = JSON.parse(content);\n\n      // Check for required Playwright report structure\n      return (\n        data &&\n        typeof data === 'object' &&\n        'config' in data &&\n        'suites' in data &&\n        'stats' in data &&\n        Array.isArray(data.suites)\n      );\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Scan directory recursively for JSON files\n   */\n  private async scanForJsonFiles(\n    dir: string,\n    maxDepth: number = 2\n  ): Promise<string[]> {\n    const jsonFiles: string[] = [];\n\n    try {\n      await this.scanDirectory(\n        dir,\n        jsonFiles,\n        file => file.endsWith('.json'),\n        0,\n        maxDepth\n      );\n    } catch {\n      // Ignore scan errors\n    }\n\n    return jsonFiles;\n  }\n\n  /**\n   * Scan for directories containing index.html\n   */\n  private async scanForHtmlDirectories(\n    dir: string,\n    maxDepth: number = 2\n  ): Promise<string[]> {\n    const htmlDirs: string[] = [];\n\n    try {\n      await this.scanDirectoryForHtml(dir, htmlDirs, 0, maxDepth);\n    } catch {\n      // Ignore scan errors\n    }\n\n    return htmlDirs;\n  }\n\n  /**\n   * Scan for directories containing trace files\n   */\n  private async scanForTraceDirectories(\n    dir: string,\n    maxDepth: number = 2\n  ): Promise<string[]> {\n    const traceDirs: string[] = [];\n\n    try {\n      await this.scanDirectoryForTraces(dir, traceDirs, 0, maxDepth);\n    } catch {\n      // Ignore scan errors\n    }\n\n    return traceDirs;\n  }\n\n  /**\n   * Generic directory scanner for files\n   */\n  private async scanDirectory(\n    dir: string,\n    results: string[],\n    filter: (file: string) => boolean,\n    currentDepth: number,\n    maxDepth: number\n  ): Promise<void> {\n    if (currentDepth > maxDepth) return;\n\n    const entries = await readDir(dir);\n\n    for (const entry of entries) {\n      if (await isDirectory(entry)) {\n        await this.scanDirectory(\n          entry,\n          results,\n          filter,\n          currentDepth + 1,\n          maxDepth\n        );\n      } else if (filter(entry)) {\n        results.push(entry);\n      }\n    }\n  }\n\n  /**\n   * Scan for HTML directories\n   */\n  private async scanDirectoryForHtml(\n    dir: string,\n    results: string[],\n    currentDepth: number,\n    maxDepth: number\n  ): Promise<void> {\n    if (currentDepth > maxDepth) return;\n\n    // Check if current directory has index.html\n    const indexPath = join(dir, 'index.html');\n    if (await exists(indexPath)) {\n      results.push(dir);\n      return; // Don't scan subdirectories if we found one\n    }\n\n    // Scan subdirectories\n    const entries = await readDir(dir);\n    for (const entry of entries) {\n      if (await isDirectory(entry)) {\n        await this.scanDirectoryForHtml(\n          entry,\n          results,\n          currentDepth + 1,\n          maxDepth\n        );\n      }\n    }\n  }\n\n  /**\n   * Scan for trace directories\n   */\n  private async scanDirectoryForTraces(\n    dir: string,\n    results: string[],\n    currentDepth: number,\n    maxDepth: number\n  ): Promise<void> {\n    if (currentDepth > maxDepth) return;\n\n    // Check if current directory contains trace files\n    if (await this.containsTraceFiles(dir)) {\n      results.push(dir);\n      return;\n    }\n\n    // Scan subdirectories\n    const entries = await readDir(dir);\n    for (const entry of entries) {\n      if (await isDirectory(entry)) {\n        await this.scanDirectoryForTraces(\n          entry,\n          results,\n          currentDepth + 1,\n          maxDepth\n        );\n      }\n    }\n  }\n\n  /**\n   * Check if directory contains trace files\n   */\n  private async containsTraceFiles(dir: string): Promise<boolean> {\n    try {\n      const entries = await readDir(dir);\n      return entries.some(\n        entry =>\n          entry.endsWith('.zip') ||\n          entry.endsWith('.trace') ||\n          entry.includes('trace')\n      );\n    } catch {\n      return false;\n    }\n  }\n}\n","/**\n * Test failure extraction for cache functionality\n */\n\nimport { parsePlaywrightJson } from './parser';\nimport { ReportDiscoveryService } from './discovery';\nimport { FileSystemError, CLIOptions } from '@/types';\nimport { logger } from '@/utils/logger';\n\n/**\n * Playwright test result structure\n */\ninterface PlaywrightTestResult {\n  status: string;\n  duration?: number;\n  error?: {\n    message?: string;\n    name?: string;\n  };\n}\n\n/**\n * Playwright test structure\n */\ninterface PlaywrightTest {\n  title?: string;\n  name?: string;\n  status?: string;\n  outcome?: string;\n  state?: string;\n  file?: string;\n  location?: {\n    file?: string;\n  };\n  duration?: number;\n  error?: unknown;\n  results?: PlaywrightTestResult[];\n}\n\n/**\n * Playwright suite structure\n */\ninterface PlaywrightSuite {\n  title?: string;\n  file?: string; // Suite can contain file path\n  suites?: PlaywrightSuite[];\n  specs?: PlaywrightSpec[];\n  tests?: PlaywrightTest[];\n}\n\n/**\n * Playwright spec structure (intermediate level between suite and test)\n */\ninterface PlaywrightSpec {\n  title?: string;\n  ok?: boolean;\n  tests?: PlaywrightTest[];\n}\n\n/**\n * Playwright report data structure\n */\ninterface PlaywrightReportData {\n  suites?: PlaywrightSuite[];\n  stats?: {\n    expected?: number;\n    unexpected?: number;\n    skipped?: number;\n    duration?: number;\n  };\n}\n\n/**\n * Test failure data structure\n */\nexport interface TestFailure {\n  file: string;\n  testTitle: string;\n  project?: string | undefined; // Browser/project name (chromium, firefox, etc.)\n  error?: string | undefined;\n  duration?: number | undefined;\n}\n\n/**\n * Test summary data structure\n */\nexport interface TestSummary {\n  total: number;\n  passed: number;\n  failed: number;\n  skipped: number;\n  duration: number;\n}\n\n/**\n * Cache extraction result\n */\nexport interface CacheExtractionResult {\n  failures: TestFailure[];\n  summary: TestSummary;\n  reportPaths: string[];\n  hasData: boolean;\n}\n\n/**\n * Service for extracting test failure data for caching\n */\nexport class CacheExtractor {\n  constructor(private readonly workingDir: string) {}\n\n  /**\n   * Extract test failures and metadata for caching\n   */\n  async extractFailureData(): Promise<CacheExtractionResult> {\n    try {\n      // Step 1: Discover JSON reports using existing discovery system\n      const reportPaths = await this.discoverReports();\n\n      if (reportPaths.length === 0) {\n        return this.createEmptyResult();\n      }\n\n      // Step 2: Parse reports and extract failures\n      const failures: TestFailure[] = [];\n      const totalSummary: TestSummary = {\n        total: 0,\n        passed: 0,\n        failed: 0,\n        skipped: 0,\n        duration: 0,\n      };\n\n      for (const reportPath of reportPaths) {\n        try {\n          const reportData = await parsePlaywrightJson(reportPath);\n\n          // Extract failures from this report\n          const reportFailures = this.extractFailuresFromReport(\n            reportData,\n            reportPath\n          );\n          failures.push(...reportFailures);\n\n          // Aggregate summary data from stats\n          if (reportData.stats) {\n            const stats = reportData.stats;\n            totalSummary.total +=\n              (stats.expected || 0) +\n              (stats.unexpected || 0) +\n              (stats.skipped || 0);\n            totalSummary.passed += stats.expected || 0;\n            totalSummary.failed += stats.unexpected || 0;\n            totalSummary.skipped += stats.skipped || 0;\n            totalSummary.duration += Math.round(stats.duration || 0);\n          }\n        } catch (error) {\n          // Log but continue with other reports\n          logger.warn(\n            `Failed to parse report ${reportPath}: ${error instanceof Error ? error.message : error}`\n          );\n          continue;\n        }\n      }\n\n      return {\n        failures,\n        summary: totalSummary,\n        reportPaths,\n        hasData: reportPaths.length > 0,\n      };\n    } catch (error) {\n      throw new FileSystemError(\n        `Failed to extract test failure data: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Discover JSON reports using the existing discovery service\n   */\n  private async discoverReports(): Promise<string[]> {\n    try {\n      // Use the existing ReportDiscoveryService for comprehensive scanning\n      const discoveryService = new ReportDiscoveryService(this.workingDir);\n\n      // Create minimal options for discovery (only need JSON report)\n      const options: CLIOptions = {\n        reportDirectory: this.workingDir,\n        token: '',\n        uploadImages: false,\n        uploadVideos: false,\n        uploadHtml: false,\n        uploadTraces: false,\n        uploadFiles: false,\n        uploadFullJson: false,\n        verbose: false,\n        json: false,\n        environment: 'unknown',\n        tags: [],\n      };\n\n      const discoveryResult = await discoveryService.discover(options);\n\n      // Return the discovered JSON report path\n      if (discoveryResult.jsonReport) {\n        return [discoveryResult.jsonReport];\n      }\n\n      return [];\n    } catch (error) {\n      // If discovery fails, return empty array (no reports found)\n      if (error instanceof FileSystemError) {\n        console.debug('No JSON reports found:', error.message);\n      }\n      return [];\n    }\n  }\n\n  /**\n   * Extract failures from a parsed report\n   */\n  private extractFailuresFromReport(\n    reportData: PlaywrightReportData,\n    reportPath: string\n  ): TestFailure[] {\n    const failures: TestFailure[] = [];\n\n    try {\n      // Handle Playwright report structure - suites contain the test information\n      const suites = reportData.suites || [];\n\n      if (Array.isArray(suites)) {\n        for (const suite of suites) {\n          this.extractFailuresFromSuite(\n            suite,\n            failures,\n            '',\n            undefined,\n            undefined\n          );\n        }\n      }\n\n      return failures;\n    } catch (error) {\n      logger.warn(\n        `Failed to extract failures from ${reportPath}: ${error instanceof Error ? error.message : error}`\n      );\n      return [];\n    }\n  }\n\n  /**\n   * Recursively extract failures from suite structure\n   */\n  private extractFailuresFromSuite(\n    suite: PlaywrightSuite,\n    failures: TestFailure[],\n    parentPath?: string,\n    parentFile?: string,\n    project?: string\n  ): void {\n    try {\n      // Extract file from suite if available\n      const suiteFile = suite.file || parentFile;\n\n      // Detect project name: top-level suites without files are typically project names\n      // (e.g., \"chromium\", \"firefox\", \"webkit\")\n      const isProjectSuite = !suite.file && !parentFile && suite.title;\n      const currentProject = isProjectSuite ? suite.title : project;\n\n      // For building test path, only include non-file titles in the path\n      // Don't include project names in the path\n      const shouldIncludeInPath =\n        suite.title &&\n        (!suite.file || suite.title !== suite.file) &&\n        !isProjectSuite;\n      const suitePath = shouldIncludeInPath\n        ? parentPath\n          ? `${parentPath} > ${suite.title}`\n          : suite.title\n        : parentPath || '';\n\n      // Handle nested suites (recursive)\n      if (suite.suites && Array.isArray(suite.suites)) {\n        for (const nestedSuite of suite.suites) {\n          this.extractFailuresFromSuite(\n            nestedSuite,\n            failures,\n            suitePath,\n            suiteFile,\n            currentProject\n          );\n        }\n      }\n\n      // Handle specs in this suite (Playwright report structure: suites -> specs -> tests)\n      if (suite.specs && Array.isArray(suite.specs)) {\n        for (const spec of suite.specs) {\n          this.extractFailuresFromSpec(\n            spec,\n            failures,\n            suitePath,\n            suiteFile,\n            currentProject\n          );\n        }\n      }\n\n      // Handle individual tests in this suite (fallback for different report structures)\n      if (suite.tests && Array.isArray(suite.tests)) {\n        for (const test of suite.tests) {\n          this.extractFailuresFromTest(\n            test,\n            failures,\n            suitePath,\n            suiteFile,\n            undefined,\n            currentProject\n          );\n        }\n      }\n    } catch (error) {\n      // Continue processing other suites on error\n      logger.warn(\n        `Error processing suite: ${error instanceof Error ? error.message : error}`\n      );\n    }\n  }\n\n  /**\n   * Extract failures from spec structure (intermediate level between suite and test)\n   */\n  private extractFailuresFromSpec(\n    spec: PlaywrightSpec,\n    failures: TestFailure[],\n    parentPath?: string,\n    suiteFile?: string,\n    project?: string\n  ): void {\n    try {\n      // Use spec title as the test title directly (e.g., \"get started link\")\n      const specTitle = spec.title || '';\n\n      // Check if spec is marked as failed (spec.ok === false means test failed)\n      // This is the reliable way to check for failures in Playwright reports\n      const specFailed = spec.ok === false;\n\n      // Handle individual tests in this spec\n      if (spec.tests && Array.isArray(spec.tests) && specFailed) {\n        // Only process the first test in the spec (all tests in a spec are the same test with retries)\n        const test = spec.tests[0];\n        if (test) {\n          const failure = this.createTestFailure(\n            test,\n            parentPath,\n            suiteFile,\n            specTitle,\n            project\n          );\n          if (failure) {\n            // Check for duplicates (include project to differentiate same test in different browsers)\n            const isDuplicate = failures.some(\n              f =>\n                f.file === failure.file &&\n                f.testTitle === failure.testTitle &&\n                f.project === failure.project\n            );\n\n            if (!isDuplicate) {\n              failures.push(failure);\n            }\n          }\n        }\n      }\n    } catch (error) {\n      // Continue processing other specs on error\n      logger.warn(\n        `Error processing spec: ${error instanceof Error ? error.message : error}`\n      );\n    }\n  }\n\n  /**\n   * Extract failures from individual test\n   */\n  private extractFailuresFromTest(\n    test: PlaywrightTest,\n    failures: TestFailure[],\n    parentPath?: string,\n    suiteFile?: string,\n    specTitle?: string,\n    project?: string\n  ): void {\n    try {\n      // Handle direct test results - only count the test once, not each retry\n      if (this.isFailedTest(test)) {\n        const failure = this.createTestFailure(\n          test,\n          parentPath,\n          suiteFile,\n          specTitle,\n          project\n        );\n        if (failure) {\n          // Check if this failure already exists (avoid duplicates from retries)\n          // Include project to differentiate same test in different browsers\n          const isDuplicate = failures.some(\n            f =>\n              f.file === failure.file &&\n              f.testTitle === failure.testTitle &&\n              f.project === failure.project\n          );\n\n          if (!isDuplicate) {\n            failures.push(failure);\n          }\n        }\n      }\n    } catch (error) {\n      // Continue processing other tests on error\n      logger.warn(\n        `Error processing test: ${error instanceof Error ? error.message : error}`\n      );\n    }\n  }\n\n  /**\n   * Check if a test item represents a failed test\n   */\n  private isFailedTest(item: PlaywrightTest): boolean {\n    return Boolean(\n      item &&\n      (item.status === 'failed' ||\n        item.outcome === 'failed' ||\n        item.state === 'failed' ||\n        item.results?.some(r => r.status === 'failed'))\n    );\n  }\n\n  /**\n   * Create TestFailure object from test data\n   */\n  private createTestFailure(\n    test: PlaywrightTest,\n    _parentPath?: string,\n    suiteFile?: string,\n    specTitle?: string,\n    project?: string\n  ): TestFailure | null {\n    try {\n      // Extract file path - prioritize test file, then suite file\n      let filePath = test.file || test.location?.file || suiteFile || '';\n\n      // Clean up file path (remove absolute path prefixes)\n      if (filePath) {\n        // Convert to relative path if possible\n        const cwd = process.cwd();\n        if (filePath.startsWith(cwd)) {\n          filePath = filePath.substring(cwd.length + 1);\n        }\n      }\n\n      // Extract test title - use spec title only (without suite path)\n      // This ensures Playwright's -g flag can match exact test names\n      const testTitle = specTitle || test.title || test.name || 'Unknown test';\n\n      // Extract error information\n      let error: string | undefined;\n      if (test.results && Array.isArray(test.results)) {\n        const failedResult = test.results.find(r => r.status === 'failed');\n        if (failedResult?.error) {\n          error = this.formatError(failedResult.error);\n        }\n      } else if (test.error) {\n        error = this.formatError(test.error);\n      }\n\n      // Extract duration\n      let duration: number | undefined;\n      if (test.results && Array.isArray(test.results)) {\n        duration = test.results.reduce(\n          (total, r) => total + (r.duration || 0),\n          0\n        );\n      } else if (typeof test.duration === 'number') {\n        duration = test.duration;\n      }\n\n      // Only create failure if we have meaningful data\n      if (!filePath && !testTitle) {\n        return null;\n      }\n\n      return {\n        file: filePath || 'unknown',\n        testTitle: testTitle,\n        project,\n        error,\n        duration,\n      };\n    } catch (error) {\n      logger.warn(\n        `Failed to create test failure object: ${error instanceof Error ? error.message : error}`\n      );\n      return null;\n    }\n  }\n\n  /**\n   * Format error message for storage\n   */\n  private formatError(error: unknown): string {\n    try {\n      if (typeof error === 'string') {\n        return error;\n      }\n\n      if (error && typeof error === 'object') {\n        const errorObj = error as Record<string, unknown>;\n        return (\n          (errorObj.message as string) ||\n          (errorObj.name as string) ||\n          JSON.stringify(error)\n        );\n      }\n\n      return String(error);\n    } catch {\n      return 'Error formatting failed';\n    }\n  }\n\n  /**\n   * Create empty result for cases with no data\n   */\n  private createEmptyResult(): CacheExtractionResult {\n    return {\n      failures: [],\n      summary: {\n        total: 0,\n        passed: 0,\n        failed: 0,\n        skipped: 0,\n        duration: 0,\n      },\n      reportPaths: [],\n      hasData: false,\n    };\n  }\n}\n","import { readFileSync } from 'fs';\nimport { join } from 'path';\n\n/**\n * Get package version at runtime from package.json\n * Works in both development (src/) and production (dist/cli/) contexts\n */\nfunction getVersion(): string {\n  // Possible locations of package.json relative to this file:\n  // - Development: src/version.ts -> ../package.json\n  // - Production (bundled): dist/cli/index.js -> ../../package.json\n  const possiblePaths = [\n    join(__dirname, '../../package.json'), // dist/cli/ -> root\n    join(__dirname, '../package.json'), // src/ -> root\n  ];\n\n  for (const packagePath of possiblePaths) {\n    try {\n      const content = readFileSync(packagePath, 'utf-8');\n      const packageJson = JSON.parse(content) as { version?: string };\n      if (packageJson.version) {\n        return packageJson.version;\n      }\n    } catch {\n      // Try next path\n    }\n  }\n\n  return '0.0.0';\n}\n\nexport const VERSION = getVersion();\n","import { isVerbose, setVerbose } from './logger';\n\n/**\n * Utility function to check if verbose mode is enabled via CLI flags\n * Checks for --verbose or -v flags in process.argv\n */\nexport function isVerboseMode(): boolean {\n  return process.argv.includes('--verbose') || process.argv.includes('-v');\n}\n\n// Re-export logger functions\nexport { isVerbose, setVerbose };\n","import simpleGit, { SimpleGit } from 'simple-git';\nimport { VERSION } from '@/version';\nimport { isVerboseMode } from '@/utils/verbose';\nimport { logger } from '@/utils/logger';\n\n/**\n * Official documentation for CI/CD environment variables:\n * - GitHub Actions: https://docs.github.com/en/actions/reference/environment-variables\n * - CircleCI: https://circleci.com/docs/reference/variables/\n * - GitLab CI: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html\n * - Azure DevOps: https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml\n * - AWS CodeBuild: https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-env-vars.html\n * - Bitbucket Pipelines: https://support.atlassian.com/bitbucket-cloud/docs/variables-and-secrets/\n */\n\n/**\n * Git metadata structure matching server schema\n */\nexport interface GitMetadata {\n  branch: string;\n  commit: {\n    hash: string;\n    message: string;\n    author: string;\n    authorId?: string; // GitHub user ID for author deduplication\n    email: string;\n    timestamp: string;\n  };\n  repository: {\n    name: string;\n    url: string;\n  };\n  pr: {\n    id: string;\n    title: string;\n    url: string;\n    status:\n      | ''\n      | 'open'\n      | 'draft'\n      | 'ready_for_review'\n      | 'changes_requested'\n      | 'approved'\n      | 'merged'\n      | 'closed';\n  };\n  environment?: string; // Target environment tag for upload command (e.g., staging, production, qa)\n}\n\n/**\n * Environment variable sources for git metadata\n */\ninterface EnvironmentGitInfo {\n  branch?: string;\n  commitHash?: string;\n  commitMessage?: string;\n  author?: string;\n  authorId?: string; // GitHub user ID for author deduplication\n  email?: string;\n  repoUrl?: string;\n  repoName?: string;\n  prId?: string;\n  prTitle?: string;\n  prUrl?: string;\n  prStatus?: string;\n}\n\n/**\n * GitHub API response types\n */\ninterface _GitHubCommit {\n  sha: string;\n  message: string;\n  email: string;\n  authorId?: string; // GitHub user ID\n}\n\ninterface _GitHubPullRequest {\n  title: string;\n  status: string;\n}\n\n/**\n * Collector for Git metadata\n */\nexport class GitCollector {\n  private readonly git: SimpleGit;\n  private readonly repoPath: string;\n\n  constructor(repoPath: string = process.cwd()) {\n    this.repoPath = repoPath;\n    this.git = simpleGit({ baseDir: repoPath });\n  }\n\n  /**\n   * Configure git to work properly in CI/CD environments\n   * Fixes \"dubious ownership\" errors in GitHub Actions and other CI/CD platforms\n   */\n  private async configureGitForCI(): Promise<void> {\n    const env = process.env;\n    const isCICD =\n      env.GITHUB_ACTIONS === 'true' ||\n      env.GITLAB_CI === 'true' ||\n      env.CIRCLECI === 'true' ||\n      env.TF_BUILD === 'True' ||\n      env.JENKINS_URL ||\n      !!env.CODEBUILD_BUILD_ID ||\n      !!env.BITBUCKET_BUILD_NUMBER ||\n      !!env.CI; // Generic CI detection\n\n    if (isCICD) {\n      try {\n        // Add current directory to git safe.directory to allow git operations\n        // This fixes \"fatal: detected dubious ownership in repository\" errors\n        await this.git.raw([\n          'config',\n          '--global',\n          '--add',\n          'safe.directory',\n          this.repoPath,\n        ]);\n      } catch {\n        // If config fails, silently continue - git commands will fallback to env vars\n      }\n    }\n  }\n\n  /**\n   * Gather Git metadata: branch, latest commit, and remote repository info\n   * Uses git commands as primary source, falls back to environment variables in CI/CD\n   */\n  async getMetadata(): Promise<GitMetadata> {\n    // Configure git for CI/CD environments first\n    await this.configureGitForCI();\n\n    // Try to get metadata from git commands first\n    const gitMetadata = await this.getGitCommandMetadata();\n\n    // Get environment variable metadata as fallback\n    const envMetadata = await this.getEnvironmentMetadata();\n\n    // Build metadata with required fields and defaults\n    // For GitLab CI, CircleCI, Azure DevOps, and all GitHub Actions events, prioritize environment variables over git commands\n    const isGitLabCI = process.env.GITLAB_CI === 'true';\n    const isCircleCI = process.env.CIRCLECI === 'true';\n    const isAzureDevOps =\n      process.env.TF_BUILD === 'True' || !!process.env.AZURE_HTTP_USER_AGENT;\n    const isGitHubActions = process.env.GITHUB_ACTIONS === 'true';\n    const isAWSCodeBuild = !!process.env.CODEBUILD_BUILD_ID;\n    const isBitbucketPipelines = !!process.env.BITBUCKET_BUILD_NUMBER;\n    const shouldPrioritizeEnv =\n      isGitLabCI ||\n      isCircleCI ||\n      isAzureDevOps ||\n      isGitHubActions ||\n      isAWSCodeBuild ||\n      isBitbucketPipelines;\n\n    // Build commit object with optional authorId\n    const commitAuthorId = shouldPrioritizeEnv\n      ? envMetadata.authorId || gitMetadata.commit?.authorId\n      : gitMetadata.commit?.authorId || envMetadata.authorId;\n\n    const commitData: GitMetadata['commit'] = {\n      hash: shouldPrioritizeEnv\n        ? envMetadata.commitHash || gitMetadata.commit?.hash || 'unknown'\n        : gitMetadata.commit?.hash || envMetadata.commitHash || 'unknown',\n      message: shouldPrioritizeEnv\n        ? envMetadata.commitMessage || gitMetadata.commit?.message || ''\n        : gitMetadata.commit?.message || envMetadata.commitMessage || '',\n      author: shouldPrioritizeEnv\n        ? envMetadata.author || gitMetadata.commit?.author || ''\n        : gitMetadata.commit?.author || envMetadata.author || '',\n      email: shouldPrioritizeEnv\n        ? envMetadata.email || gitMetadata.commit?.email || ''\n        : gitMetadata.commit?.email || envMetadata.email || '',\n      timestamp: gitMetadata.commit?.timestamp || new Date().toISOString(),\n    };\n\n    // Only add authorId if it has a value\n    if (commitAuthorId) {\n      commitData.authorId = commitAuthorId;\n    }\n\n    const metadata: GitMetadata = {\n      branch: shouldPrioritizeEnv\n        ? envMetadata.branch || gitMetadata.branch || 'unknown'\n        : gitMetadata.branch || envMetadata.branch || 'unknown',\n      commit: commitData,\n      repository: {\n        name: gitMetadata.repository?.name || envMetadata.repoName || 'unknown',\n        url: shouldPrioritizeEnv\n          ? envMetadata.repoUrl || gitMetadata.repository?.url || ''\n          : gitMetadata.repository?.url || envMetadata.repoUrl || '',\n      },\n      pr: {\n        id: gitMetadata.pr?.id || envMetadata.prId || '',\n        title: gitMetadata.pr?.title || envMetadata.prTitle || '',\n        url: gitMetadata.pr?.url || envMetadata.prUrl || '',\n        status: this.normalizeStatus(\n          gitMetadata.pr?.status || envMetadata.prStatus || ''\n        ),\n      },\n    };\n\n    // Debug logging when verbose mode is enabled\n    if (isVerboseMode()) {\n      const gitSuccess = Object.keys(gitMetadata).length > 0;\n      const envFallback = Object.keys(envMetadata).length > 0;\n      logger.debug(\n        `Git metadata: ${metadata.branch}, ${gitSuccess ? 'git commands' : envFallback ? 'environment' : 'fallback'}`\n      );\n    }\n\n    return metadata;\n  }\n\n  /**\n   * Normalize PR status to match server enum\n   */\n  private normalizeStatus(\n    status: string\n  ):\n    | ''\n    | 'open'\n    | 'draft'\n    | 'ready_for_review'\n    | 'changes_requested'\n    | 'approved'\n    | 'merged'\n    | 'closed' {\n    const normalizedStatus = status.toLowerCase();\n    switch (normalizedStatus) {\n      case 'open':\n        return 'open';\n      case 'draft':\n        return 'draft';\n      case 'ready_for_review':\n        return 'ready_for_review';\n      case 'changes_requested':\n        return 'changes_requested';\n      case 'approved':\n        return 'approved';\n      case 'merged':\n        return 'merged';\n      case 'closed':\n        return 'closed';\n      default:\n        return '';\n    }\n  }\n\n  /**\n   * Attempt to gather metadata using git commands with comprehensive error handling\n   * CRITICAL: Ensures no data loss - always collects what's available\n   */\n  private async getGitCommandMetadata(): Promise<Partial<GitMetadata>> {\n    const metadata: Partial<GitMetadata> = {};\n    const errors: string[] = [];\n\n    // Branch name with multiple fallback strategies\n    try {\n      const branchSummary = await this.git.branch();\n      metadata.branch = branchSummary.current;\n    } catch (error) {\n      const errMsg = error instanceof Error ? error.message : 'unknown';\n      errors.push(`branch: ${errMsg}`);\n\n      // Fallback 1: Try git symbolic-ref\n      try {\n        const result = await this.git.raw(['symbolic-ref', '--short', 'HEAD']);\n        metadata.branch = result.trim();\n      } catch {\n        // Fallback 2: Try git rev-parse\n        try {\n          const result = await this.git.raw([\n            'rev-parse',\n            '--abbrev-ref',\n            'HEAD',\n          ]);\n          metadata.branch = result.trim();\n        } catch {\n          // No branch data available - will use environment fallback\n        }\n      }\n    }\n\n    // Latest commit with fallback strategies\n    try {\n      const log = await this.git.log({ maxCount: 1 });\n      if (log.latest) {\n        metadata.commit = {\n          hash: log.latest.hash,\n          message: log.latest.message,\n          author: log.latest.author_name,\n          email: log.latest.author_email,\n          timestamp: log.latest.date,\n        };\n      }\n    } catch (error) {\n      const errMsg = error instanceof Error ? error.message : 'unknown';\n      errors.push(`commit: ${errMsg}`);\n\n      // Fallback: Try to get just the commit hash\n      try {\n        const hash = await this.git.raw(['rev-parse', 'HEAD']);\n        metadata.commit = {\n          hash: hash.trim(),\n          message: '',\n          author: '',\n          email: '',\n          timestamp: new Date().toISOString(),\n        };\n      } catch {\n        // No commit data available - will use environment fallback\n      }\n    }\n\n    // Remote repo URL with comprehensive fallbacks\n    try {\n      const remotes = await this.git.getRemotes(true);\n      if (remotes.length) {\n        const origin = remotes.find(r => r.name === 'origin') || remotes[0];\n        if (origin) {\n          const url = origin.refs.push || origin.refs.fetch;\n          metadata.repository = {\n            url,\n            name: this.extractRepoNameFromUrl(url),\n          };\n        }\n      }\n    } catch (error) {\n      const errMsg = error instanceof Error ? error.message : 'unknown';\n      errors.push(`remote: ${errMsg}`);\n\n      // Fallback: Try git config\n      try {\n        const url = await this.git.raw([\n          'config',\n          '--get',\n          'remote.origin.url',\n        ]);\n        const cleanUrl = url.trim();\n        metadata.repository = {\n          url: cleanUrl,\n          name: this.extractRepoNameFromUrl(cleanUrl),\n        };\n      } catch {\n        // No remote data available - will use environment fallback\n      }\n    }\n\n    // Initialize empty PR metadata (filled by environment variables)\n    metadata.pr = {\n      id: '',\n      status: '',\n      title: '',\n      url: '',\n    };\n\n    // Log collection status\n    if (errors.length > 0 && isVerboseMode()) {\n      logger.warn(`Git command issues (using fallbacks): ${errors.join(', ')}`);\n    }\n\n    return metadata;\n  }\n\n  /**\n   * Extract git metadata from environment variables (CI/CD contexts)\n   *\n   * Author Resolution Priority (highest to lowest):\n   * ============================================\n   * For Pull Request Events:\n   *   1. GitHub Branch Commit API (data.author.login) - Most accurate, includes user ID\n   *   2. PR Head User Login (event file: pull_request.head.user.login)\n   *   3. Git Author Name (git show %an) - Fallback when GitHub login unavailable\n   *\n   * For Non-PR Events (push, workflow_dispatch, etc.):\n   *   1. GitHub Branch Commit API (data.author.login) - Most accurate, includes user ID\n   *   2. GitHub Users API (fetched by username) - Fallback if commit API unavailable\n   *   3. Git Author Name (git config user.name) - Fallback when APIs unavailable\n   *\n   * Rationale: GitHub login usernames are preferred for consistent author deduplication\n   * across the platform, as git config names can vary (e.g., \"John Doe\" vs \"John\" vs \"jdoe\").\n   */\n  private async getEnvironmentMetadata(): Promise<EnvironmentGitInfo> {\n    const env = process.env;\n    const envInfo: EnvironmentGitInfo = {};\n\n    // GitHub Actions\n    if (env.GITHUB_ACTIONS === 'true') {\n      // For Pull Requests, prioritize GITHUB_HEAD_REF (source branch)\n      if (env.GITHUB_EVENT_NAME === 'pull_request' && env.GITHUB_HEAD_REF) {\n        envInfo.branch = env.GITHUB_HEAD_REF; // This gives us the actual source branch\n      } else {\n        // For push events, extract from GITHUB_REF\n        const extractedBranch = this.extractBranchFromRef(env.GITHUB_REF);\n        if (extractedBranch) envInfo.branch = extractedBranch;\n      }\n\n      // For PRs, try to get data from GitHub event file (works for private repos without token)\n      if (env.GITHUB_EVENT_NAME === 'pull_request' && env.GITHUB_EVENT_PATH) {\n        try {\n          const fs = await import('fs/promises');\n          const eventData = JSON.parse(\n            await fs.readFile(env.GITHUB_EVENT_PATH, 'utf-8')\n          );\n          const pullRequest = eventData?.pull_request;\n\n          if (pullRequest) {\n            // Extract PR head SHA (actual commit, not merge commit)\n            if (pullRequest.head?.sha) {\n              envInfo.commitHash = pullRequest.head.sha;\n            }\n\n            // Extract PR title and status\n            if (pullRequest.title) {\n              envInfo.prTitle = pullRequest.title;\n            }\n\n            const state = pullRequest.state;\n            const draft = pullRequest.draft;\n            const merged = pullRequest.merged;\n\n            if (draft) {\n              envInfo.prStatus = 'draft';\n            } else if (merged) {\n              envInfo.prStatus = 'merged';\n            } else if (state === 'open') {\n              envInfo.prStatus = 'open';\n            } else if (state === 'closed') {\n              envInfo.prStatus = 'closed';\n            }\n\n            // Extract commit details from the PR head commit using git show\n            // This commit SHA is already available in the checked-out repository\n            const prHead = pullRequest.head;\n\n            if (prHead?.sha) {\n              try {\n                // Use git show to get commit details directly (no fetch needed - commit is local)\n                // Format: %B (commit body/message), %an (author name), %ae (author email)\n                const commitInfo = await this.git.show([\n                  prHead.sha,\n                  '--no-patch',\n                  '--format=%B%n%an%n%ae',\n                ]);\n\n                const lines = commitInfo.trim().split('\\n');\n\n                if (lines.length >= 3) {\n                  // Format: message (can be multiple lines), author name, author email\n                  const messageLines = lines.slice(0, -2);\n                  const message = messageLines.join('\\n').trim();\n                  const authorName = lines[lines.length - 2];\n                  const authorEmail = lines[lines.length - 1];\n\n                  // Set commit message, author, and email from git commit data\n                  if (message) {\n                    envInfo.commitMessage = message;\n                  }\n                  if (authorName) {\n                    envInfo.author = authorName;\n                  }\n                  if (authorEmail) {\n                    envInfo.email = authorEmail;\n                  }\n\n                  if (isVerboseMode()) {\n                    logger.verbose('Extracted commit metadata from git');\n                  }\n                }\n              } catch (gitShowError) {\n                // If git show fails, fallback to PR title and attempt GitHub API\n                if (isVerboseMode()) {\n                  logger.warn(\n                    `Could not extract commit from git: ${gitShowError instanceof Error ? gitShowError.message : 'unknown'}`\n                  );\n                }\n                if (pullRequest.title && !envInfo.commitMessage) {\n                  envInfo.commitMessage = pullRequest.title;\n                }\n              }\n            }\n          }\n        } catch (error) {\n          // Log parsing errors when verbose mode is enabled\n          if (isVerboseMode()) {\n            logger.warn(\n              `Failed to parse GitHub event file: ${error instanceof Error ? error.message : 'unknown'}`\n            );\n          }\n        }\n      }\n\n      if (!envInfo.commitHash && env.GITHUB_SHA)\n        envInfo.commitHash = env.GITHUB_SHA;\n      if (env.GITHUB_REPOSITORY) envInfo.repoName = env.GITHUB_REPOSITORY;\n      if (env.GITHUB_REPOSITORY)\n        envInfo.repoUrl = `https://github.com/${env.GITHUB_REPOSITORY}`;\n\n      // For all non-PR events, try to fetch author info from APIs\n      if (env.GITHUB_EVENT_NAME !== 'pull_request') {\n        // [Priority 1 - Non-PR] Try to get commit info from Branch Commit API (most accurate)\n        if (env.GITHUB_REPOSITORY && envInfo.branch) {\n          const branchCommitInfo = await this.fetchGitHubBranchCommit(\n            env.GITHUB_REPOSITORY,\n            envInfo.branch\n          );\n          if (branchCommitInfo) {\n            // Use commit message from API if not already set\n            if (branchCommitInfo.message && !envInfo.commitMessage) {\n              envInfo.commitMessage = branchCommitInfo.message;\n            }\n            // Use email from API if not already set\n            if (branchCommitInfo.email && !envInfo.email) {\n              envInfo.email = branchCommitInfo.email;\n            }\n            // Always use GitHub username from Branch Commit API (highest priority)\n            if (branchCommitInfo.author) {\n              envInfo.author = branchCommitInfo.author;\n            }\n            // Save GitHub user ID for deduplication (highest priority)\n            if (branchCommitInfo.authorId) {\n              envInfo.authorId = branchCommitInfo.authorId;\n            }\n          }\n        }\n\n        // [Priority 2 - Non-PR] Fallback to GitHub Users API if Branch Commit API didn't provide login\n        // This works for both public and private repos since we use the public Users API\n        if (env.GITHUB_ACTOR && !envInfo.author) {\n          const userInfo = await this.fetchGitHubUserInfo(env.GITHUB_ACTOR);\n          if (userInfo) {\n            // Use GitHub username from Users API (fallback if Branch Commit API unavailable)\n            if (userInfo.login) {\n              envInfo.author = userInfo.login;\n            }\n            // Save GitHub user ID for deduplication (fallback)\n            if (userInfo.id && !envInfo.authorId) {\n              envInfo.authorId = userInfo.id;\n            }\n          }\n        }\n      }\n\n      // Pull Request info\n      if (env.GITHUB_EVENT_NAME === 'pull_request') {\n        // Extract PR number from GITHUB_REF (refs/pull/3279/merge -> 3279)\n        if (env.GITHUB_REF) {\n          const prMatch = env.GITHUB_REF.match(/refs\\/pull\\/(\\d+)\\//);\n          if (prMatch?.[1]) {\n            envInfo.prId = prMatch[1];\n            if (env.GITHUB_REPOSITORY) {\n              envInfo.prUrl = `https://github.com/${env.GITHUB_REPOSITORY}/pull/${prMatch[1]}`;\n            }\n          }\n        }\n\n        // Try to get PR details from GitHub API for PRs\n        if (env.GITHUB_REPOSITORY && envInfo.prId) {\n          const prDetails = await this.fetchGitHubPullRequestDetails(\n            env.GITHUB_REPOSITORY,\n            envInfo.prId\n          );\n          if (prDetails) {\n            envInfo.prTitle = prDetails.title;\n            envInfo.prStatus = prDetails.status;\n          }\n        }\n\n        // Try to enhance with GitHub API data for PRs (optional - for GitHub user ID)\n        // This is an enhancement layer only - git data takes precedence for accuracy\n        if (env.GITHUB_REPOSITORY && env.GITHUB_HEAD_REF && !envInfo.authorId) {\n          // Only fetch from API if we don't already have authorId and if git data extraction succeeded\n          const branchCommitInfo = await this.fetchGitHubBranchCommit(\n            env.GITHUB_REPOSITORY,\n            env.GITHUB_HEAD_REF\n          );\n\n          if (branchCommitInfo) {\n            // Only use API data to fill in missing fields (don't override git data)\n            if (!envInfo.commitMessage && branchCommitInfo.message) {\n              envInfo.commitMessage = branchCommitInfo.message;\n            }\n            if (!envInfo.email && branchCommitInfo.email) {\n              envInfo.email = branchCommitInfo.email;\n            }\n            if (!envInfo.commitHash && branchCommitInfo.sha) {\n              envInfo.commitHash = branchCommitInfo.sha;\n            }\n\n            // GitHub user ID is valuable for deduplication - always use if available\n            if (branchCommitInfo.authorId) {\n              envInfo.authorId = branchCommitInfo.authorId;\n            }\n\n            // Only use GitHub username if git data is not available\n            if (!envInfo.author && branchCommitInfo.author) {\n              envInfo.author = branchCommitInfo.author;\n            }\n          }\n        }\n      }\n    }\n\n    // GitLab CI\n    else if (env.GITLAB_CI === 'true') {\n      // Branch name - prefer CI_COMMIT_BRANCH over CI_COMMIT_REF_NAME for accuracy\n      if (env.CI_COMMIT_BRANCH) {\n        envInfo.branch = env.CI_COMMIT_BRANCH;\n      } else if (env.CI_MERGE_REQUEST_SOURCE_BRANCH_NAME) {\n        // For merge requests, use the source branch\n        envInfo.branch = env.CI_MERGE_REQUEST_SOURCE_BRANCH_NAME;\n      } else if (env.CI_COMMIT_REF_NAME) {\n        envInfo.branch = env.CI_COMMIT_REF_NAME;\n      }\n\n      if (env.CI_COMMIT_SHA) envInfo.commitHash = env.CI_COMMIT_SHA;\n      if (env.CI_COMMIT_MESSAGE) envInfo.commitMessage = env.CI_COMMIT_MESSAGE;\n      if (env.CI_COMMIT_AUTHOR) envInfo.author = env.CI_COMMIT_AUTHOR;\n      if (env.CI_COMMIT_AUTHOR_EMAIL)\n        envInfo.email = env.CI_COMMIT_AUTHOR_EMAIL;\n      if (env.CI_PROJECT_PATH) envInfo.repoName = env.CI_PROJECT_PATH;\n\n      // Clean the repository URL to remove CI token\n      if (env.CI_REPOSITORY_URL) {\n        // Remove the gitlab-ci-token from the URL\n        envInfo.repoUrl = this.cleanGitLabUrl(env.CI_REPOSITORY_URL);\n      } else if (env.CI_PROJECT_URL) {\n        envInfo.repoUrl = env.CI_PROJECT_URL;\n      }\n\n      // Merge Request info\n      if (env.CI_MERGE_REQUEST_IID) {\n        envInfo.prId = env.CI_MERGE_REQUEST_IID;\n        if (env.CI_MERGE_REQUEST_TITLE)\n          envInfo.prTitle = env.CI_MERGE_REQUEST_TITLE;\n        if (env.CI_PROJECT_URL) {\n          envInfo.prUrl = `${env.CI_PROJECT_URL}/-/merge_requests/${env.CI_MERGE_REQUEST_IID}`;\n        }\n      }\n    }\n\n    // Azure DevOps\n    else if (env.TF_BUILD === 'True' || env.AZURE_HTTP_USER_AGENT) {\n      // Debug Azure DevOps environment variables\n      if (isVerboseMode() || process.env.DEBUG) {\n        logger.debug('Azure DevOps Branch Debug:');\n        logger.debug(`BUILD_SOURCEBRANCH: ${env.BUILD_SOURCEBRANCH}`);\n        logger.debug(`BUILD_SOURCEBRANCHNAME: ${env.BUILD_SOURCEBRANCHNAME}`);\n        logger.debug(`BUILD_REASON: ${env.BUILD_REASON}`);\n        logger.debug(\n          `SYSTEM_PULLREQUEST_SOURCEBRANCH: ${env.SYSTEM_PULLREQUEST_SOURCEBRANCH}`\n        );\n        logger.debug(\n          `SYSTEM_PULLREQUEST_TARGETBRANCH: ${env.SYSTEM_PULLREQUEST_TARGETBRANCH}`\n        );\n      }\n\n      // Branch handling - prioritize PR source branch for pull requests\n      if (\n        env.BUILD_REASON === 'PullRequest' &&\n        env.SYSTEM_PULLREQUEST_SOURCEBRANCH\n      ) {\n        // For PRs, use the source branch\n        envInfo.branch = env.SYSTEM_PULLREQUEST_SOURCEBRANCH.startsWith(\n          'refs/heads/'\n        )\n          ? env.SYSTEM_PULLREQUEST_SOURCEBRANCH.replace('refs/heads/', '')\n          : env.SYSTEM_PULLREQUEST_SOURCEBRANCH;\n      } else if (env.BUILD_SOURCEBRANCH) {\n        envInfo.branch = env.BUILD_SOURCEBRANCH.startsWith('refs/heads/')\n          ? env.BUILD_SOURCEBRANCH.replace('refs/heads/', '')\n          : env.BUILD_SOURCEBRANCH;\n      } else if (env.BUILD_SOURCEBRANCHNAME) {\n        envInfo.branch = env.BUILD_SOURCEBRANCHNAME;\n      }\n\n      if (isVerboseMode() || process.env.DEBUG) {\n        logger.debug(`Extracted branch: ${envInfo.branch}`);\n      }\n\n      // Commit info\n      if (env.BUILD_SOURCEVERSION) envInfo.commitHash = env.BUILD_SOURCEVERSION;\n      if (env.BUILD_SOURCEVERSIONMESSAGE)\n        envInfo.commitMessage = env.BUILD_SOURCEVERSIONMESSAGE;\n\n      // Author info\n      if (env.BUILD_REQUESTEDFOR) envInfo.author = env.BUILD_REQUESTEDFOR;\n      if (env.BUILD_REQUESTEDFOREMAIL)\n        envInfo.email = env.BUILD_REQUESTEDFOREMAIL;\n\n      // Repository info with URL cleaning\n      if (env.BUILD_REPOSITORY_NAME) {\n        envInfo.repoName = env.BUILD_REPOSITORY_NAME;\n      }\n\n      if (env.BUILD_REPOSITORY_URI) {\n        envInfo.repoUrl = this.cleanAzureDevOpsUrl(env.BUILD_REPOSITORY_URI);\n        // Extract clean repo name if not already set\n        if (!envInfo.repoName) {\n          envInfo.repoName = this.extractRepoNameFromUrl(envInfo.repoUrl);\n        }\n      }\n\n      // Pull Request info\n      if (env.SYSTEM_PULLREQUEST_PULLREQUESTID) {\n        envInfo.prId = env.SYSTEM_PULLREQUEST_PULLREQUESTID;\n        if (env.SYSTEM_PULLREQUEST_PULLREQUESTTITLE)\n          envInfo.prTitle = env.SYSTEM_PULLREQUEST_PULLREQUESTTITLE;\n        if (env.SYSTEM_PULLREQUEST_SOURCEREPOSITORYURI) {\n          envInfo.prUrl = `${env.SYSTEM_PULLREQUEST_SOURCEREPOSITORYURI}/pullrequest/${env.SYSTEM_PULLREQUEST_PULLREQUESTID}`;\n        }\n      }\n    }\n\n    // Jenkins\n    else if (env.JENKINS_URL) {\n      const gitBranch = env.BRANCH_NAME || env.GIT_BRANCH;\n      if (gitBranch) envInfo.branch = gitBranch.replace('origin/', '');\n      if (env.GIT_COMMIT) envInfo.commitHash = env.GIT_COMMIT;\n      if (env.GIT_AUTHOR_NAME) envInfo.author = env.GIT_AUTHOR_NAME;\n      if (env.GIT_AUTHOR_EMAIL) envInfo.email = env.GIT_AUTHOR_EMAIL;\n      if (env.GIT_URL) envInfo.repoUrl = env.GIT_URL;\n      if (env.GIT_URL)\n        envInfo.repoName = this.extractRepoNameFromUrl(env.GIT_URL);\n\n      // Pull Request info (if using GitHub Pull Request Builder plugin)\n      if (env.ghprbPullId) {\n        envInfo.prId = env.ghprbPullId;\n        if (env.ghprbPullTitle) envInfo.prTitle = env.ghprbPullTitle;\n        if (env.ghprbPullLink) envInfo.prUrl = env.ghprbPullLink;\n      }\n    }\n\n    // CircleCI\n    else if (env.CIRCLECI === 'true') {\n      if (env.CIRCLE_BRANCH) envInfo.branch = env.CIRCLE_BRANCH;\n      if (env.CIRCLE_SHA1) envInfo.commitHash = env.CIRCLE_SHA1;\n\n      // CircleCI commit message and author info\n      if (env.CIRCLE_USERNAME) envInfo.author = env.CIRCLE_USERNAME;\n      // Note: CircleCI doesn't provide commit message directly, will fall back to git commands\n\n      // Repository info - construct clean URLs\n      if (env.CIRCLE_PROJECT_USERNAME && env.CIRCLE_PROJECT_REPONAME) {\n        envInfo.repoName = `${env.CIRCLE_PROJECT_USERNAME}/${env.CIRCLE_PROJECT_REPONAME}`;\n        // Construct clean HTTPS URL - CircleCI supports GitHub, Bitbucket, etc.\n        if (env.CIRCLE_REPOSITORY_URL) {\n          envInfo.repoUrl = this.cleanCircleCIUrl(env.CIRCLE_REPOSITORY_URL);\n        } else {\n          // Default to GitHub if no repository URL provided\n          envInfo.repoUrl = `https://github.com/${env.CIRCLE_PROJECT_USERNAME}/${env.CIRCLE_PROJECT_REPONAME}`;\n        }\n      } else if (env.CIRCLE_REPOSITORY_URL) {\n        // Clean up the repository URL (remove SSH format, credentials, etc.)\n        envInfo.repoUrl = this.cleanCircleCIUrl(env.CIRCLE_REPOSITORY_URL);\n        envInfo.repoName = this.extractRepoNameFromUrl(envInfo.repoUrl);\n      }\n\n      // Pull Request info - enhanced handling\n      if (env.CIRCLE_PULL_REQUEST || env.CIRCLE_PR_NUMBER) {\n        // Extract PR number from URL if not directly available\n        if (env.CIRCLE_PR_NUMBER) {\n          envInfo.prId = env.CIRCLE_PR_NUMBER;\n        } else if (env.CIRCLE_PULL_REQUEST) {\n          // Extract PR number from URL like: https://github.com/owner/repo/pull/123\n          const prMatch = env.CIRCLE_PULL_REQUEST.match(/\\/pull\\/(\\d+)$/);\n          if (prMatch?.[1]) {\n            envInfo.prId = prMatch[1];\n          }\n        }\n\n        envInfo.prUrl = env.CIRCLE_PULL_REQUEST || '';\n\n        // Determine PR status based on available info\n        if (env.CIRCLE_TAG) {\n          // If there's a tag, it might be a release PR that was merged\n          envInfo.prStatus = '';\n        } else if (env.CIRCLE_PULL_REQUEST) {\n          envInfo.prStatus = 'open'; // Assume open if we have PR info\n        }\n      }\n    }\n\n    // AWS CodeBuild\n    else if (env.CODEBUILD_BUILD_ID) {\n      // Branch: extract from CODEBUILD_SOURCE_VERSION or CODEBUILD_WEBHOOK_HEAD_REF\n      if (env.CODEBUILD_WEBHOOK_HEAD_REF) {\n        // Webhook trigger: refs/heads/branch-name -> branch-name\n        envInfo.branch = env.CODEBUILD_WEBHOOK_HEAD_REF.replace(\n          'refs/heads/',\n          ''\n        );\n      } else if (env.CODEBUILD_SOURCE_VERSION) {\n        // For CodeCommit: could be commit ID, branch name, or pr/number\n        const sourceVersion = env.CODEBUILD_SOURCE_VERSION;\n        if (\n          !sourceVersion.startsWith('pr/') &&\n          !sourceVersion.match(/^[0-9a-f]{40}$/)\n        ) {\n          // It's a branch name (not a PR ref or full commit hash)\n          envInfo.branch = sourceVersion.replace('refs/heads/', '');\n        }\n      }\n\n      // Commit hash\n      if (env.CODEBUILD_RESOLVED_SOURCE_VERSION) {\n        envInfo.commitHash = env.CODEBUILD_RESOLVED_SOURCE_VERSION;\n      }\n\n      // Repository URL and name\n      if (env.CODEBUILD_SOURCE_REPO_URL) {\n        envInfo.repoUrl = this.convertCodeCommitToConsoleUrl(\n          env.CODEBUILD_SOURCE_REPO_URL\n        );\n        envInfo.repoName = this.extractRepoNameFromUrl(\n          env.CODEBUILD_SOURCE_REPO_URL\n        );\n      }\n\n      // Pull Request info from webhook\n      if (env.CODEBUILD_WEBHOOK_TRIGGER) {\n        const prMatch = env.CODEBUILD_WEBHOOK_TRIGGER.match(/^pr\\/(\\d+)$/);\n        if (prMatch?.[1]) {\n          envInfo.prId = prMatch[1];\n          envInfo.prStatus = 'open';\n\n          // Build PR URL from source repo URL (works for GitHub, Bitbucket, GitLab)\n          if (env.CODEBUILD_SOURCE_REPO_URL) {\n            const repoUrl = env.CODEBUILD_SOURCE_REPO_URL.replace(/\\.git$/, '');\n            if (repoUrl.includes('github.com')) {\n              envInfo.prUrl = `${repoUrl}/pull/${prMatch[1]}`;\n\n              // Fetch PR title and status from GitHub API\n              const repoName = this.extractRepoNameFromUrl(\n                env.CODEBUILD_SOURCE_REPO_URL\n              );\n              if (repoName) {\n                const prDetails = await this.fetchGitHubPullRequestDetails(\n                  repoName,\n                  prMatch[1]\n                );\n                if (prDetails) {\n                  envInfo.prTitle = prDetails.title;\n                  envInfo.prStatus = prDetails.status;\n                }\n              }\n            } else if (repoUrl.includes('bitbucket.org')) {\n              envInfo.prUrl = `${repoUrl}/pull-requests/${prMatch[1]}`;\n            } else if (repoUrl.includes('gitlab.com')) {\n              envInfo.prUrl = `${repoUrl}/-/merge_requests/${prMatch[1]}`;\n            }\n          }\n        }\n      }\n    }\n\n    // Bitbucket Pipelines\n    else if (env.BITBUCKET_BUILD_NUMBER) {\n      if (env.BITBUCKET_BRANCH) envInfo.branch = env.BITBUCKET_BRANCH;\n      if (env.BITBUCKET_COMMIT) envInfo.commitHash = env.BITBUCKET_COMMIT;\n\n      if (env.BITBUCKET_WORKSPACE && env.BITBUCKET_REPO_SLUG) {\n        envInfo.repoName = `${env.BITBUCKET_WORKSPACE}/${env.BITBUCKET_REPO_SLUG}`;\n        envInfo.repoUrl = `https://bitbucket.org/${env.BITBUCKET_WORKSPACE}/${env.BITBUCKET_REPO_SLUG}`;\n      } else if (env.BITBUCKET_GIT_HTTP_ORIGIN) {\n        envInfo.repoUrl = env.BITBUCKET_GIT_HTTP_ORIGIN;\n        envInfo.repoName = this.extractRepoNameFromUrl(\n          env.BITBUCKET_GIT_HTTP_ORIGIN\n        );\n      }\n\n      if (env.BITBUCKET_PR_ID) {\n        envInfo.prId = env.BITBUCKET_PR_ID;\n        if (env.BITBUCKET_WORKSPACE && env.BITBUCKET_REPO_SLUG) {\n          envInfo.prUrl = `https://bitbucket.org/${env.BITBUCKET_WORKSPACE}/${env.BITBUCKET_REPO_SLUG}/pull-requests/${env.BITBUCKET_PR_ID}`;\n        }\n        // Bitbucket does not expose PR state via env vars; default to 'open'\n        // for in-PR runs. Post-merge runs (no BITBUCKET_PR_ID) are reclassified\n        // to 'merged' by CiCollector.reconcileWithGit.\n        envInfo.prStatus = 'open';\n      }\n    }\n\n    // Generic CI environment variables (fallback)\n    if (!envInfo.branch) {\n      const fallbackBranch = env.CI_BRANCH || env.BRANCH_NAME || env.GIT_BRANCH;\n      if (fallbackBranch) envInfo.branch = fallbackBranch;\n    }\n    if (!envInfo.commitHash) {\n      const fallbackCommit = env.CI_COMMIT || env.COMMIT_SHA || env.GIT_COMMIT;\n      if (fallbackCommit) envInfo.commitHash = fallbackCommit;\n    }\n    if (!envInfo.author) {\n      const fallbackAuthor =\n        env.CI_AUTHOR || env.GIT_AUTHOR || env.COMMIT_AUTHOR;\n      if (fallbackAuthor) envInfo.author = fallbackAuthor;\n    }\n    if (!envInfo.repoUrl) {\n      const fallbackUrl =\n        env.CI_REPOSITORY_URL || env.REPOSITORY_URL || env.GIT_URL;\n      if (fallbackUrl) envInfo.repoUrl = fallbackUrl;\n    }\n\n    return envInfo;\n  }\n\n  /**\n   * Extract branch name from git ref (e.g., \"refs/heads/main\" -> \"main\")\n   */\n  private extractBranchFromRef(ref?: string): string | undefined {\n    if (!ref) return undefined;\n    if (ref.startsWith('refs/heads/')) {\n      return ref.replace('refs/heads/', '');\n    }\n    if (ref.startsWith('refs/tags/')) {\n      return ref.replace('refs/tags/', '');\n    }\n    return ref;\n  }\n\n  /**\n   * Extract repository name from URL (e.g., \"https://github.com/user/repo.git\" -> \"user/repo\")\n   * Special handling for Azure DevOps: \"https://dev.azure.com/org/project/_git/repo\" -> \"project/repo\"\n   */\n  private extractRepoNameFromUrl(url?: string): string {\n    if (!url) return '';\n\n    try {\n      // First clean GitLab URLs that might contain CI tokens\n      let cleanUrl = url;\n      if (url.includes('gitlab-ci-token')) {\n        cleanUrl = this.cleanGitLabUrl(url);\n      }\n\n      // Remove .git suffix\n      cleanUrl = cleanUrl.replace(/\\.git$/, '');\n\n      // Special handling for Azure DevOps URLs\n      if (\n        cleanUrl.includes('dev.azure.com') ||\n        cleanUrl.includes('visualstudio.com')\n      ) {\n        // Azure DevOps format: https://dev.azure.com/org/project/_git/repo\n        const azureMatch = cleanUrl.match(/\\/([^/]+)\\/_git\\/([^/]+)$/);\n        if (azureMatch?.[1] && azureMatch[2]) {\n          // Decode URL encoding for display (spaces, etc.)\n          const project = decodeURIComponent(azureMatch[1]);\n          const repo = decodeURIComponent(azureMatch[2]);\n          return `${project}/${repo}`;\n        }\n      }\n\n      // Default: Extract the last two parts of the path\n      const parts = cleanUrl.split('/').filter(part => part.length > 0);\n      if (parts.length >= 2) {\n        try {\n          return decodeURIComponent(parts.slice(-2).join('/'));\n        } catch {\n          // Fallback if decoding fails\n          return parts.slice(-2).join('/');\n        }\n      }\n\n      return cleanUrl;\n    } catch {\n      return url;\n    }\n  }\n\n  /**\n   * Clean GitLab repository URL by removing CI token\n   * Converts: https://gitlab-ci-token:xxxxx@gitlab.com/user/repo.git\n   * To: https://gitlab.com/user/repo.git\n   */\n  private cleanGitLabUrl(url: string): string {\n    try {\n      // Parse URL to remove credentials\n      const urlObj = new URL(url);\n      // Remove any auth info (username:password)\n      urlObj.username = '';\n      urlObj.password = '';\n      return urlObj.toString();\n    } catch {\n      // Fallback: regex-based cleaning\n      return url.replace(/gitlab-ci-token:[^@]+@/, '');\n    }\n  }\n\n  /**\n   * Clean CircleCI repository URL by removing SSH format and converting to HTTPS\n   * Converts: git@github.com:user/repo.git -> https://github.com/user/repo.git\n   * Also removes any credentials and normalizes URLs\n   */\n  private cleanCircleCIUrl(url: string): string {\n    if (!url || typeof url !== 'string') {\n      return '';\n    }\n\n    try {\n      // Handle SSH format: git@github.com:user/repo.git\n      if (url.startsWith('git@')) {\n        const sshMatch = url.match(/git@([^:]+):([^/]+)\\/(.+?)(?:\\.git)?$/);\n        if (sshMatch && sshMatch.length >= 4) {\n          const [, host, user, repo] = sshMatch;\n          return `https://${host}/${user}/${repo}`;\n        }\n      }\n\n      // Handle HTTPS URLs - clean credentials\n      const urlObj = new URL(url);\n      urlObj.username = '';\n      urlObj.password = '';\n\n      // Remove .git suffix if present\n      if (urlObj.pathname.endsWith('.git')) {\n        urlObj.pathname = urlObj.pathname.slice(0, -4);\n      }\n\n      return urlObj.toString();\n    } catch {\n      // Fallback: basic cleaning for malformed URLs\n      try {\n        return url\n          .replace(/^git@([^:]+):/, 'https://$1/')\n          .replace(/\\.git$/, '')\n          .replace(/\\/+$/, '');\n      } catch {\n        return url;\n      }\n    }\n  }\n\n  /**\n   * Convert CodeCommit clone URL to AWS Console base URL\n   * Converts: https://git-codecommit.eu-north-1.amazonaws.com/v1/repos/my-repo\n   * To: https://eu-north-1.console.aws.amazon.com/codesuite/codecommit/repositories/my-repo\n   * Dashboard can append /browse, /commit/{hash}, etc.\n   */\n  private convertCodeCommitToConsoleUrl(url: string): string {\n    if (!url) return '';\n\n    try {\n      const match = url.match(\n        /git-codecommit\\.([^.]+)\\.amazonaws\\.com\\/v1\\/repos\\/(.+?)(?:\\.git)?$/\n      );\n      if (match?.[1] && match[2]) {\n        const region = match[1];\n        const repoName = match[2];\n        return `https://${region}.console.aws.amazon.com/codesuite/codecommit/repositories/${repoName}`;\n      }\n    } catch {\n      // Fallback to original URL\n    }\n\n    return url;\n  }\n\n  /**\n   * Clean Azure DevOps repository URL by removing credentials\n   * Converts: https://user@dev.azure.com/org/Project%20Name/_git/Repo%20Name\n   * To: https://dev.azure.com/org/Project%20Name/_git/Repo%20Name\n   * Note: Keeps URL encoding intact for valid URL format\n   */\n  private cleanAzureDevOpsUrl(url: string): string {\n    if (!url || typeof url !== 'string') {\n      return '';\n    }\n\n    try {\n      const urlObj = new URL(url);\n\n      // Remove credentials\n      urlObj.username = '';\n      urlObj.password = '';\n\n      // Keep the pathname encoded for valid URL format\n      // Azure DevOps needs encoded spaces in URLs\n      return urlObj.toString();\n    } catch {\n      // Fallback: remove credentials only\n      try {\n        return url.replace(/\\/\\/[^@]+@/, '//');\n      } catch {\n        return url;\n      }\n    }\n  }\n\n  /**\n   * Fetch GitHub user info using the public Users API\n   * This works for both public and private repos since it only queries user data\n   */\n  private async fetchGitHubUserInfo(\n    username: string\n  ): Promise<{ login?: string; id?: string } | null> {\n    try {\n      const url = `https://api.github.com/users/${username}`;\n\n      if (isVerboseMode() || process.env.LOG_LEVEL === 'debug') {\n        logger.debug(`Fetching user info from GitHub API: ${url}`);\n      }\n\n      const response = await fetch(url, {\n        method: 'GET',\n        headers: {\n          Accept: 'application/vnd.github.v3+json',\n          'User-Agent': `tdpw/${VERSION}`,\n        },\n        // Increased timeout for reliable metadata collection\n        signal: AbortSignal.timeout(15000),\n      });\n\n      if (response.ok) {\n        const data = (await response.json()) as {\n          login?: string;\n          id?: number;\n          name?: string;\n          email?: string;\n        };\n\n        const login = data?.login;\n        const id = data?.id ? String(data.id) : undefined;\n        const result: { login?: string; id?: string } = {};\n        if (login) result.login = login;\n        if (id) result.id = id;\n\n        return Object.keys(result).length > 0 ? result : null;\n      } else {\n        return null;\n      }\n    } catch (_error) {\n      return null;\n    }\n  }\n\n  /**\n   * Fetch the HEAD commit information from a specific branch to get the actual commit message\n   * This avoids merge commit messages in PR scenarios\n   */\n  private async fetchGitHubBranchCommit(\n    repository: string,\n    branch: string\n  ): Promise<{\n    sha: string;\n    message: string;\n    email: string;\n    author?: string;\n    authorId?: string;\n  } | null> {\n    try {\n      // Use GitHub's API to fetch the latest commit from the specific branch\n      const url = `https://api.github.com/repos/${repository}/commits/${branch}`;\n\n      if (process.env.LOG_LEVEL === 'debug') {\n        logger.debug(`Fetching branch HEAD commit from GitHub API: ${url}`);\n      }\n\n      const response = await fetch(url, {\n        method: 'GET',\n        headers: {\n          Accept: 'application/vnd.github.v3+json',\n          'User-Agent': `tdpw/${VERSION}`,\n          // If GITHUB_TOKEN is available, use it for higher rate limits\n          ...(process.env.GITHUB_TOKEN && {\n            Authorization: `token ${process.env.GITHUB_TOKEN}`,\n          }),\n        },\n        // Increased timeout for reliable metadata collection\n        signal: AbortSignal.timeout(15000),\n      });\n\n      if (response.ok) {\n        const data = (await response.json()) as {\n          sha?: string;\n          commit?: {\n            message?: string;\n            author?: { email?: string; name?: string };\n          };\n          author?: {\n            id?: number;\n            login?: string;\n            name?: string;\n            email?: string;\n          };\n        };\n\n        const sha = data?.sha;\n        const message = data?.commit?.message;\n        const email = data?.commit?.author?.email;\n        const authorLogin = data?.author?.login; // GitHub username\n        const authorId = data?.author?.id ? String(data.author.id) : undefined;\n\n        if (sha && message) {\n          const result: {\n            sha: string;\n            message: string;\n            email: string;\n            author?: string;\n            authorId?: string;\n          } = {\n            sha,\n            message,\n            email: email || '',\n          };\n          if (authorLogin) {\n            result.author = authorLogin;\n          }\n          if (authorId) {\n            result.authorId = authorId;\n          }\n          return result;\n        }\n        return null;\n      } else {\n        return null;\n      }\n    } catch (error) {\n      if (process.env.LOG_LEVEL === 'debug') {\n        logger.debug(`Error fetching GitHub branch commit: ${error}`);\n      }\n      return null;\n    }\n  }\n\n  /**\n   * Fetch pull request details from GitHub API to get PR title and status\n   */\n  private async fetchGitHubPullRequestDetails(\n    repository: string,\n    prId: string\n  ): Promise<{ title: string; status: string } | null> {\n    try {\n      // Use GitHub's API to fetch PR details\n      const url = `https://api.github.com/repos/${repository}/pulls/${prId}`;\n\n      if (process.env.LOG_LEVEL === 'debug') {\n        logger.debug(`Fetching PR details from GitHub API: ${url}`);\n      }\n\n      const response = await fetch(url, {\n        method: 'GET',\n        headers: {\n          Accept: 'application/vnd.github.v3+json',\n          'User-Agent': `tdpw/${VERSION}`,\n          // If GITHUB_TOKEN is available, use it for higher rate limits\n          ...(process.env.GITHUB_TOKEN && {\n            Authorization: `token ${process.env.GITHUB_TOKEN}`,\n          }),\n        },\n        // Increased timeout for reliable metadata collection\n        signal: AbortSignal.timeout(15000),\n      });\n\n      if (response.ok) {\n        const data = (await response.json()) as {\n          title?: string;\n          state?: string;\n          draft?: boolean;\n        };\n        const title = data?.title;\n        const state = data?.state;\n        const draft = data?.draft;\n\n        // Determine PR status based on state and draft status\n        let status = '';\n        if (draft) {\n          status = 'draft';\n        } else if (state === 'open') {\n          status = 'open';\n        } else if (state === 'closed') {\n          status = 'closed';\n        } else if (state === 'merged') {\n          status = 'merged';\n        }\n\n        if (process.env.LOG_LEVEL === 'debug') {\n          logger.debug(\n            `Successfully fetched PR details - Title: ${title}, Status: ${status}`\n          );\n        }\n\n        if (title) {\n          return { title, status };\n        }\n        return null;\n      } else {\n        if (process.env.LOG_LEVEL === 'debug') {\n          logger.debug(\n            `GitHub API request for PR details failed: ${response.status} ${response.statusText}`\n          );\n        }\n        return null;\n      }\n    } catch (error) {\n      if (process.env.LOG_LEVEL === 'debug') {\n        logger.debug(`Error fetching GitHub PR details: ${error}`);\n      }\n      return null;\n    }\n  }\n}\n","/**\n * Environment detection and validation utilities\n */\n\nimport { z } from 'zod';\nimport { ConfigurationError, stringToBoolean } from '@/types';\n\n/**\n * Environment variable schema with validation\n */\nexport const EnvVarSchema = z.object({\n  // Core configuration - Only 3 supported environment variables\n  TESTDINO_RUNTIME: z\n    .enum(['development', 'staging', 'production', 'test'])\n    .optional(),\n  TESTDINO_API_URL: z.string().url().optional(),\n  TESTDINO_TOKEN: z.string().optional(),\n  TESTDINO_TARGET_ENV: z.string().optional(),\n\n  // CI/CD detection variables (auto-detected, not user-configurable)\n  CI: z.string().optional(),\n  GITHUB_ACTIONS: z.string().optional(),\n  GITLAB_CI: z.string().optional(),\n  JENKINS_URL: z.string().optional(),\n  AZURE_HTTP_USER_AGENT: z.string().optional(),\n  CIRCLECI: z.string().optional(),\n  CODEBUILD_BUILD_ID: z.string().optional(),\n  BITBUCKET_BUILD_NUMBER: z.string().optional(),\n});\n\nexport type EnvVars = z.infer<typeof EnvVarSchema>;\n\n/**\n * Environment type detection\n */\nexport enum EnvironmentType {\n  DEVELOPMENT = 'development',\n  STAGING = 'staging',\n  PRODUCTION = 'production',\n  TEST = 'test',\n}\n\n/**\n * CI/CD provider detection\n */\nexport enum CIProvider {\n  GITHUB_ACTIONS = 'github-actions',\n  GITLAB_CI = 'gitlab-ci',\n  JENKINS = 'jenkins',\n  AZURE_DEVOPS = 'azure-devops',\n  CIRCLECI = 'circleci',\n  AWS_CODEBUILD = 'aws-codebuild',\n  BITBUCKET_PIPELINES = 'bitbucket-pipelines',\n  UNKNOWN = 'unknown',\n}\n\n/**\n * Environment utilities class\n */\nexport class EnvironmentUtils {\n  private static envCache: EnvVars | null = null;\n\n  /**\n   * Get and validate environment variables with caching\n   */\n  static getEnvironment(): EnvVars {\n    if (this.envCache) {\n      return this.envCache;\n    }\n\n    try {\n      this.envCache = EnvVarSchema.parse(process.env);\n      return this.envCache;\n    } catch (error) {\n      if (error instanceof z.ZodError) {\n        const issues = error.issues\n          .map(issue => `${issue.path.join('.')}: ${issue.message}`)\n          .join(', ');\n        throw new ConfigurationError(\n          `Invalid environment variables: ${issues}`,\n          error\n        );\n      }\n      throw new ConfigurationError(\n        'Failed to validate environment',\n        error as Error\n      );\n    }\n  }\n\n  /**\n   * Clear environment cache (useful for testing)\n   */\n  static clearCache(): void {\n    this.envCache = null;\n  }\n\n  /**\n   * Detect current environment type\n   */\n  static detectEnvironmentType(): EnvironmentType {\n    const env = this.getEnvironment();\n\n    switch (env.TESTDINO_RUNTIME) {\n      case 'development':\n        return EnvironmentType.DEVELOPMENT;\n      case 'staging':\n        return EnvironmentType.STAGING;\n      case 'production':\n        return EnvironmentType.PRODUCTION;\n      case 'test':\n        return EnvironmentType.TEST;\n      default:\n        // Default to production for safety\n        return EnvironmentType.PRODUCTION;\n    }\n  }\n\n  /**\n   * Detect CI/CD provider\n   */\n  static detectCIProvider(): CIProvider {\n    const env = this.getEnvironment();\n\n    if (env.GITHUB_ACTIONS) {\n      return CIProvider.GITHUB_ACTIONS;\n    }\n\n    if (env.GITLAB_CI) {\n      return CIProvider.GITLAB_CI;\n    }\n\n    if (env.JENKINS_URL) {\n      return CIProvider.JENKINS;\n    }\n\n    if (env.AZURE_HTTP_USER_AGENT) {\n      return CIProvider.AZURE_DEVOPS;\n    }\n\n    if (env.CIRCLECI) {\n      return CIProvider.CIRCLECI;\n    }\n\n    if (env.CODEBUILD_BUILD_ID) {\n      return CIProvider.AWS_CODEBUILD;\n    }\n\n    if (env.BITBUCKET_BUILD_NUMBER) {\n      return CIProvider.BITBUCKET_PIPELINES;\n    }\n\n    return CIProvider.UNKNOWN;\n  }\n\n  /**\n   * Check if running in CI environment\n   */\n  static isCI(): boolean {\n    const env = this.getEnvironment();\n    return (\n      stringToBoolean(env.CI) || this.detectCIProvider() !== CIProvider.UNKNOWN\n    );\n  }\n\n  /**\n   * Check if in development mode\n   */\n  static isDevelopment(): boolean {\n    return this.detectEnvironmentType() === EnvironmentType.DEVELOPMENT;\n  }\n\n  /**\n   * Check if in production mode\n   */\n  static isProduction(): boolean {\n    return this.detectEnvironmentType() === EnvironmentType.PRODUCTION;\n  }\n\n  /**\n   * Check if in test mode\n   */\n  static isTest(): boolean {\n    return this.detectEnvironmentType() === EnvironmentType.TEST;\n  }\n\n  /**\n   * Get string value from environment variable\n   */\n  static getStringEnv(\n    key: keyof EnvVars,\n    defaultValue?: string\n  ): string | undefined {\n    const env = this.getEnvironment();\n    return env[key] || defaultValue;\n  }\n\n  /**\n   * Get environment summary for debugging\n   */\n  static getEnvironmentSummary(): Record<string, unknown> {\n    const env = this.getEnvironment();\n\n    return {\n      type: this.detectEnvironmentType(),\n      ci: this.isCI(),\n      provider: this.detectCIProvider(),\n      runtime: env.TESTDINO_RUNTIME,\n      hasToken: !!env.TESTDINO_TOKEN,\n      hasApiUrl: !!env.TESTDINO_API_URL,\n      hasTargetEnv: !!env.TESTDINO_TARGET_ENV,\n    };\n  }\n}\n","import os from 'os';\nimport { EnvironmentUtils } from '@/utils/env';\nimport type { GitMetadata } from '@/collectors/git';\n\n/**\n * Official documentation for CI/CD environment variables:\n * - GitHub Actions: https://docs.github.com/en/actions/reference/workflows-and-actions/variables\n * - CircleCI: https://circleci.com/docs/reference/variables/\n * - GitLab CI: https://docs.gitlab.com/ci/variables/predefined_variables/\n * - Jenkins: https://devopsqa.wordpress.com/2019/11/19/list-of-available-jenkins-environment-variables/\n * - Azure DevOps: https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml#pipeline-variables\n * - AWS CodeBuild: https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-env-vars.html\n * - Bitbucket Pipelines: https://support.atlassian.com/bitbucket-cloud/docs/variables-and-secrets/\n */\n\n/**\n * CI metadata structure matching server schema\n */\nexport interface CiMetadata {\n  provider: string;\n  pipeline: {\n    id: string;\n    name: string;\n    url: string;\n  };\n  build: {\n    number: string;\n    trigger: string;\n  };\n  environment: {\n    name: string;\n    type: string;\n    os: string;\n    node: string;\n  };\n}\n\n/**\n * Internal structure for CI provider-specific metadata extraction\n */\ninterface CIProviderMetadata {\n  pipelineId: string;\n  pipelineName: string;\n  pipelineUrl: string;\n  buildNumber: string;\n  buildTrigger: string;\n  environmentName: string;\n}\n\n/**\n * Collector for CI/CD metadata from environment variables\n */\nexport class CiCollector {\n  private static readonly env = process.env;\n\n  /**\n   * Collects comprehensive CI metadata from the current environment\n   * @returns Structured CI metadata including provider, pipeline, build, and environment info\n   */\n  static collect(): CiMetadata {\n    const providerKey = EnvironmentUtils.detectCIProvider();\n    const provider = providerKey || 'unknown';\n    const metadata = this.getProviderMetadata(provider);\n    const systemInfo = this.getSystemInfo();\n\n    return {\n      provider,\n      pipeline: {\n        id: metadata.pipelineId,\n        name: metadata.pipelineName,\n        url: metadata.pipelineUrl,\n      },\n      build: {\n        number: metadata.buildNumber,\n        trigger: metadata.buildTrigger,\n      },\n      environment: {\n        name: metadata.environmentName,\n        type: systemInfo.platform,\n        os: systemInfo.osRelease,\n        node: systemInfo.nodeVersion,\n      },\n    };\n  }\n\n  /**\n   * Extracts system information common to all CI providers\n   */\n  private static getSystemInfo() {\n    return {\n      platform: os.platform() || '',\n      osRelease: `${os.type()} ${os.release()}`,\n      nodeVersion: process.version || 'unknown',\n    };\n  }\n\n  /**\n   * Routes to the appropriate metadata extractor based on CI provider\n   */\n  private static getProviderMetadata(provider: string): CIProviderMetadata {\n    const extractors: Record<string, () => CIProviderMetadata> = {\n      'github-actions': this.getGitHubActionsMetadata,\n      'gitlab-ci': this.getGitLabCIMetadata,\n      circleci: this.getCircleCIMetadata,\n      jenkins: this.getJenkinsMetadata,\n      'azure-devops': this.getAzureDevOpsMetadata,\n      'aws-codebuild': this.getAWSCodeBuildMetadata,\n      'bitbucket-pipelines': this.getBitbucketPipelinesMetadata,\n    };\n\n    const extractor = extractors[provider];\n    return extractor ? extractor.call(this) : this.getGenericMetadata();\n  }\n\n  /**\n   * Extracts GitHub Actions specific metadata\n   */\n  private static getGitHubActionsMetadata(): CIProviderMetadata {\n    const { GITHUB_SERVER_URL, GITHUB_REPOSITORY, GITHUB_RUN_ID } = this.env;\n\n    const pipelineUrl =\n      GITHUB_SERVER_URL && GITHUB_REPOSITORY && GITHUB_RUN_ID\n        ? `${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}`\n        : '';\n\n    return {\n      pipelineId: this.env.GITHUB_RUN_ID || 'unknown',\n      pipelineName: this.env.GITHUB_WORKFLOW || 'GitHub Actions',\n      pipelineUrl,\n      buildNumber: this.env.GITHUB_RUN_NUMBER || 'unknown',\n      buildTrigger: this.env.GITHUB_EVENT_NAME || '',\n      environmentName: this.env.RUNNER_OS || 'github-actions',\n    };\n  }\n\n  /**\n   * Extracts GitLab CI specific metadata\n   */\n  private static getGitLabCIMetadata(): CIProviderMetadata {\n    const pipelineName = this.getGitLabPipelineName();\n    const buildNumber =\n      this.env.CI_JOB_ID || this.env.CI_PIPELINE_IID || 'unknown';\n    const environmentName =\n      this.env.CI_ENVIRONMENT_NAME || this.env.CI_JOB_STAGE || 'gitlab-ci';\n\n    return {\n      pipelineId: this.env.CI_PIPELINE_ID || 'unknown',\n      pipelineName,\n      pipelineUrl: this.env.CI_PIPELINE_URL || '',\n      buildNumber,\n      buildTrigger: this.env.CI_PIPELINE_SOURCE || '',\n      environmentName,\n    };\n  }\n\n  /**\n   * Determines GitLab pipeline name using fallback strategy\n   */\n  private static getGitLabPipelineName(): string {\n    const { CI_PIPELINE_SOURCE, CI_COMMIT_TITLE, CI_PIPELINE_NAME } = this.env;\n\n    if (CI_PIPELINE_SOURCE) {\n      return `${CI_PIPELINE_SOURCE} pipeline`;\n    }\n\n    return CI_COMMIT_TITLE || CI_PIPELINE_NAME || 'GitLab Pipeline';\n  }\n\n  /**\n   * Extracts CircleCI specific metadata\n   */\n  private static getCircleCIMetadata(): CIProviderMetadata {\n    const buildTrigger = this.getCircleCIBuildTrigger();\n    const pipelineId =\n      this.env.CIRCLE_PIPELINE_ID || this.env.CIRCLE_BUILD_NUM || 'unknown';\n    const jobName = this.env.CIRCLE_JOB || 'CircleCI Pipeline';\n\n    return {\n      pipelineId,\n      pipelineName: jobName,\n      pipelineUrl: this.env.CIRCLE_BUILD_URL || '',\n      buildNumber: this.env.CIRCLE_BUILD_NUM || 'unknown',\n      buildTrigger,\n      environmentName: this.env.CIRCLE_JOB || 'circleci',\n    };\n  }\n\n  /**\n   * Determines CircleCI build trigger based on environment variables\n   */\n  private static getCircleCIBuildTrigger(): string {\n    if (this.env.CIRCLE_TAG) {\n      return 'tag';\n    }\n\n    if (this.env.CIRCLE_PR_NUMBER || this.env.CIRCLE_PULL_REQUEST) {\n      return 'pr';\n    }\n\n    return 'push';\n  }\n\n  /**\n   * Extracts Jenkins specific metadata\n   */\n  private static getJenkinsMetadata(): CIProviderMetadata {\n    return {\n      pipelineId: this.env.BUILD_ID || 'unknown',\n      pipelineName: this.env.JOB_NAME || 'Jenkins Pipeline',\n      pipelineUrl: this.env.BUILD_URL || '',\n      buildNumber: this.env.BUILD_NUMBER || 'unknown',\n      buildTrigger: this.env.BUILD_CAUSE || '',\n      environmentName: this.env.NODE_NAME || 'jenkins',\n    };\n  }\n\n  /**\n   * Extracts Azure DevOps specific metadata\n   */\n  private static getAzureDevOpsMetadata(): CIProviderMetadata {\n    const pipelineUrl = this.buildAzureDevOpsPipelineUrl();\n    const environmentName = this.getAzureDevOpsEnvironmentName();\n\n    return {\n      pipelineId: this.env.BUILD_BUILDID || 'unknown',\n      pipelineName: this.env.BUILD_DEFINITIONNAME || 'Azure Pipeline',\n      pipelineUrl,\n      buildNumber: this.env.BUILD_BUILDNUMBER || 'unknown',\n      buildTrigger: this.env.BUILD_REASON || '',\n      environmentName,\n    };\n  }\n\n  /**\n   * Constructs Azure DevOps pipeline URL from environment variables\n   */\n  private static buildAzureDevOpsPipelineUrl(): string {\n    const {\n      SYSTEM_TEAMFOUNDATIONSERVERURI,\n      SYSTEM_TEAMPROJECT,\n      BUILD_BUILDID,\n    } = this.env;\n\n    if (\n      !SYSTEM_TEAMFOUNDATIONSERVERURI ||\n      !SYSTEM_TEAMPROJECT ||\n      !BUILD_BUILDID\n    ) {\n      return '';\n    }\n\n    try {\n      const baseUrl = SYSTEM_TEAMFOUNDATIONSERVERURI.replace(/\\/$/, '');\n      const encodedProject = encodeURIComponent(SYSTEM_TEAMPROJECT);\n\n      return `${baseUrl}/${encodedProject}/_build/results?buildId=${BUILD_BUILDID}`;\n    } catch {\n      // Fallback if URL encoding fails\n      return '';\n    }\n  }\n\n  /**\n   * Determines Azure DevOps environment name with fallback strategy\n   */\n  private static getAzureDevOpsEnvironmentName(): string {\n    const { SYSTEM_STAGENAME, AGENT_JOBNAME, AGENT_MACHINENAME } = this.env;\n\n    return (\n      SYSTEM_STAGENAME || AGENT_JOBNAME || AGENT_MACHINENAME || 'azure-devops'\n    );\n  }\n\n  /**\n   * Extracts AWS CodeBuild specific metadata\n   */\n  private static getAWSCodeBuildMetadata(): CIProviderMetadata {\n    const buildId = this.env.CODEBUILD_BUILD_ID || '';\n    // Extract project name from build ID (format: project-name:build-uuid)\n    const projectName = buildId.split(':')[0] || 'CodeBuild';\n\n    // Determine build trigger from webhook or initiator\n    let buildTrigger = '';\n    if (this.env.CODEBUILD_WEBHOOK_EVENT) {\n      buildTrigger = this.env.CODEBUILD_WEBHOOK_EVENT;\n    } else if (this.env.CODEBUILD_INITIATOR) {\n      buildTrigger = this.env.CODEBUILD_INITIATOR.startsWith('codepipeline/')\n        ? 'codepipeline'\n        : 'manual';\n    }\n\n    return {\n      pipelineId: buildId,\n      pipelineName: projectName,\n      pipelineUrl: this.env.CODEBUILD_BUILD_URL || '',\n      buildNumber: this.env.CODEBUILD_BUILD_NUMBER || 'unknown',\n      buildTrigger,\n      environmentName: this.env.CODEBUILD_BUILD_IMAGE || 'aws-codebuild',\n    };\n  }\n\n  /**\n   * Extracts Bitbucket Pipelines specific metadata\n   */\n  private static getBitbucketPipelinesMetadata(): CIProviderMetadata {\n    const {\n      BITBUCKET_WORKSPACE,\n      BITBUCKET_REPO_SLUG,\n      BITBUCKET_BUILD_NUMBER,\n      BITBUCKET_PIPELINE_UUID,\n      BITBUCKET_PR_ID,\n      BITBUCKET_TAG,\n      BITBUCKET_DEPLOYMENT_ENVIRONMENT,\n    } = this.env;\n\n    const pipelineUrl =\n      BITBUCKET_WORKSPACE && BITBUCKET_REPO_SLUG && BITBUCKET_BUILD_NUMBER\n        ? `https://bitbucket.org/${BITBUCKET_WORKSPACE}/${BITBUCKET_REPO_SLUG}/pipelines/results/${BITBUCKET_BUILD_NUMBER}`\n        : '';\n\n    let buildTrigger = 'push';\n    if (BITBUCKET_PR_ID) {\n      buildTrigger = 'pull_request';\n    } else if (BITBUCKET_TAG) {\n      buildTrigger = 'tag';\n    }\n\n    return {\n      pipelineId: BITBUCKET_PIPELINE_UUID || 'unknown',\n      pipelineName: 'Bitbucket Pipeline',\n      pipelineUrl,\n      buildNumber: BITBUCKET_BUILD_NUMBER || 'unknown',\n      buildTrigger,\n      environmentName:\n        BITBUCKET_DEPLOYMENT_ENVIRONMENT || 'bitbucket-pipelines',\n    };\n  }\n\n  /**\n   * Reconcile CI and Git metadata after both have been collected.\n   *\n   * Currently handles: Bitbucket Pipelines runs that fire on the target branch\n   * after a PR merge. Bitbucket does not expose BITBUCKET_PR_ID for the\n   * post-merge build, so the env-only detection reports `push`. The auto-merge\n   * commit message (`Merged in <branch> (pull request #N)`) is the reliable\n   * signal that this push originated from a PR — when present we surface the\n   * run as a `pull_request` trigger and backfill PR id/url/status.\n   */\n  static reconcileWithGit(ci: CiMetadata, git: GitMetadata): void {\n    if (ci.provider !== 'bitbucket-pipelines') return;\n    if (ci.build.trigger !== 'push') return;\n\n    const message = git.commit?.message || '';\n    // Anchored to Bitbucket's auto-merge subject so we don't false-positive on\n    // commits that merely quote the phrase (e.g. `Revert \"Merged in ...\"`).\n    const match = message.match(/^Merged in [^\\n]+\\(pull request #(\\d+)\\)/i);\n    if (!match?.[1]) return;\n\n    const prId = match[1];\n    ci.build.trigger = 'pull_request';\n\n    if (!git.pr.id) {\n      git.pr.id = prId;\n      if (git.repository.url) {\n        const base = git.repository.url\n          .replace(/\\.git$/, '')\n          .replace(/\\/$/, '');\n        git.pr.url = `${base}/pull-requests/${prId}`;\n      }\n      git.pr.status = 'merged';\n    }\n\n    // The auto-merge commit subject is the only place the PR title lives for\n    // post-merge runs; use it when nothing better is available.\n    if (!git.pr.title) {\n      const subject = message.split('\\n')[0]?.trim();\n      if (subject) git.pr.title = subject;\n    }\n  }\n\n  /**\n   * Fallback metadata extraction for unknown or generic CI providers\n   */\n  private static getGenericMetadata(): CIProviderMetadata {\n    const buildNumber =\n      this.env.CI_BUILD_NUMBER || this.env.BUILD_NUMBER || 'unknown';\n\n    return {\n      pipelineId: this.env.CI_PIPELINE_ID || 'unknown',\n      pipelineName: this.env.CI_PIPELINE_NAME || 'CI Pipeline',\n      pipelineUrl: this.env.CI_PIPELINE_URL || '',\n      buildNumber,\n      buildTrigger: this.env.CI_PIPELINE_SOURCE || '',\n      environmentName: 'local',\n    };\n  }\n}\n","/**\n * Cache ID detection utilities for cache functionality\n * Cache ID format: <ciProvider>_<repoName>_<branch>\n * Example: gh_playwright-tests_main\n */\n\nimport { GitCollector } from '@/collectors/git';\nimport { CiCollector } from '@/collectors/ci';\nimport { logger } from '@/utils/logger';\nimport crypto from 'crypto';\n\n/**\n * Cache identification information\n */\nexport interface CacheIdInfo {\n  cacheId: string; // Format: ciProvider_repoName_branch\n  pipelineId: string; // CI pipeline/run ID (e.g., GITHUB_RUN_ID)\n  commit: string; // Git commit hash\n  branch: string; // Original branch name (unsanitized)\n  repository: string; // Full repo (owner/repo)\n  ciProvider: string; // CI provider name\n  source: 'ci' | 'local' | 'custom';\n}\n\n/**\n * Service for detecting and generating cache IDs\n */\nexport class CacheIdDetector {\n  /**\n   * Detect cache ID and related metadata from environment.\n   * Format: <ciProvider>_<repoName>_<branch>\n   * Supports custom cache ID via TESTDINO_CACHE_ID env var or --cache-id flag.\n   * Supports custom branch and commit via --branch and --commit flags.\n   */\n  static async detectCacheId(\n    customCacheId?: string,\n    customBranch?: string,\n    customCommit?: string\n  ): Promise<CacheIdInfo> {\n    try {\n      // Check for custom cache ID (highest priority)\n      const envCustomId = process.env.TESTDINO_CACHE_ID;\n      if (customCacheId || envCustomId) {\n        const finalCustomId = customCacheId || envCustomId || 'unknown';\n\n        // Still need git/ci metadata for commit, pipelineId, etc.\n        const metadata = await this.collectMetadata();\n\n        return {\n          cacheId: finalCustomId,\n          pipelineId: metadata.pipelineId,\n          commit: customCommit || metadata.commit,\n          branch: customBranch || metadata.branch,\n          repository: metadata.repository,\n          ciProvider: metadata.ciProvider,\n          source: 'custom',\n        };\n      }\n\n      // Auto-detect cache ID from environment\n      return await this.generateCacheId(customBranch, customCommit);\n    } catch (error) {\n      logger.warn(\n        `Cache ID detection failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n\n      // Fallback to basic cache ID\n      return {\n        cacheId: `local_unknown_${this.generateHash('fallback', 6)}`,\n        pipelineId: 'unknown',\n        commit: customCommit || 'unknown',\n        branch: customBranch || 'unknown',\n        repository: 'unknown/unknown',\n        ciProvider: 'local',\n        source: 'local',\n      };\n    }\n  }\n\n  /**\n   * Collect metadata from Git and CI collectors\n   */\n  private static async collectMetadata() {\n    const gitCollector = new GitCollector(process.cwd());\n    const gitMetadata = await gitCollector.getMetadata();\n    const ciMetadata = CiCollector.collect();\n\n    return {\n      commit: gitMetadata.commit?.hash || 'unknown',\n      branch: gitMetadata.branch || 'unknown',\n      repository: gitMetadata.repository?.name || 'unknown/unknown',\n      pipelineId: ciMetadata.pipeline.id || 'unknown',\n      ciProvider: ciMetadata.provider || 'unknown',\n    };\n  }\n\n  /**\n   * Generate cache ID from environment\n   * Format: <ciProvider>_<repoName>_<branch>\n   */\n  private static async generateCacheId(\n    customBranch?: string,\n    customCommit?: string\n  ): Promise<CacheIdInfo> {\n    const metadata = await this.collectMetadata();\n\n    // Use custom values if provided, otherwise use detected values\n    const finalBranch = customBranch || metadata.branch;\n    const finalCommit = customCommit || metadata.commit;\n\n    // Extract repo name (without owner)\n    let repoName = this.extractRepoName(metadata.repository);\n\n    // If repo name is unknown, add hash and warn user\n    if (repoName === 'unknown') {\n      const hash = this.generateHash('unknown', 6);\n      repoName = `unknown${hash}`;\n      logger.warn('Repository name could not be detected');\n      logger.info('Use a Git repository or set TESTDINO_CACHE_ID explicitly');\n      logger.info(`Generated cache ID: ${repoName}`);\n    }\n\n    // Get CI provider prefix\n    const ciPrefix = this.getCIProviderPrefix(metadata.ciProvider);\n\n    // Sanitize branch name for cache ID\n    const sanitizedBranch = this.sanitizeComponent(finalBranch);\n\n    // Build cache ID\n    const cacheId = `${ciPrefix}_${repoName}_${sanitizedBranch}`;\n\n    return {\n      cacheId,\n      pipelineId: metadata.pipelineId,\n      commit: finalCommit,\n      branch: finalBranch, // Original unsanitized branch\n      repository: metadata.repository,\n      ciProvider: metadata.ciProvider,\n      source: metadata.ciProvider === 'unknown' ? 'local' : 'ci',\n    };\n  }\n\n  /**\n   * Extract repository name from full repo string\n   * \"owner/repo\" → \"repo\"\n   */\n  private static extractRepoName(fullRepo: string): string {\n    if (!fullRepo || fullRepo === 'unknown/unknown') {\n      return 'unknown';\n    }\n\n    const parts = fullRepo.split('/');\n    return parts[parts.length - 1] || 'unknown';\n  }\n\n  /**\n   * Get CI provider prefix for cache ID\n   */\n  private static getCIProviderPrefix(provider: string): string {\n    const prefixes: Record<string, string> = {\n      'github-actions': 'gh',\n      'gitlab-ci': 'gl',\n      jenkins: 'jenkins',\n      'azure-devops': 'az',\n      circleci: 'circle',\n      'bitbucket-pipelines': 'bb',\n      unknown: 'local',\n    };\n\n    return prefixes[provider] || 'local';\n  }\n\n  /**\n   * Sanitize component for cache ID (remove special characters)\n   */\n  private static sanitizeComponent(component: string): string {\n    return component\n      .toLowerCase()\n      .replace(/[^a-z0-9]+/g, '-') // Replace non-alphanumeric with dash\n      .replace(/^-+|-+$/g, '') // Trim dashes\n      .substring(0, 50); // Max 50 chars\n  }\n\n  /**\n   * Generate hash from string\n   */\n  private static generateHash(input: string, length: number): string {\n    const hash = crypto\n      .createHash('sha256')\n      .update(input + Date.now())\n      .digest('hex');\n    return hash.substring(0, length);\n  }\n\n  /**\n   * Validate cache ID format\n   */\n  static validateCacheId(cacheId: string): boolean {\n    if (!cacheId || typeof cacheId !== 'string') {\n      return false;\n    }\n\n    // Allow reasonable length and characters (underscores and dashes)\n    return (\n      cacheId.length >= 5 &&\n      cacheId.length <= 150 &&\n      /^[a-zA-Z0-9\\-_]+$/.test(cacheId)\n    );\n  }\n\n  /**\n   * Get cache context information for logging using existing collectors\n   */\n  static async getCacheContext(): Promise<Record<string, string | undefined>> {\n    try {\n      const cacheIdInfo = await this.detectCacheId();\n\n      return {\n        // Cache identification\n        cacheId: cacheIdInfo.cacheId,\n        pipelineId: cacheIdInfo.pipelineId,\n        commit: cacheIdInfo.commit,\n        branch: cacheIdInfo.branch,\n        repository: cacheIdInfo.repository,\n        ciProvider: cacheIdInfo.ciProvider,\n        source: cacheIdInfo.source,\n      };\n    } catch (_error) {\n      // Fallback to basic detection if detection fails\n      return {\n        cacheId: 'unknown',\n        pipelineId: 'unknown',\n        commit: 'unknown',\n        branch: 'unknown',\n        repository: 'unknown',\n        ciProvider: 'local',\n        source: 'local',\n      };\n    }\n  }\n}\n","/**\n * Retry utility with exponential backoff and circuit breaker\n * Handles network failures and temporary service unavailability\n */\n\nimport { NetworkError } from '@/types';\nimport { logger } from '@/utils/logger';\n\n/**\n * Configuration options for retry behavior\n */\nexport interface RetryOptions {\n  /** Maximum number of attempts (default: 3) */\n  maxAttempts?: number;\n  /** Base delay in milliseconds (default: 1000) */\n  baseDelay?: number;\n  /** Maximum delay in milliseconds (default: 30000) */\n  maxDelay?: number;\n  /** Backoff factor (default: 2) */\n  factor?: number;\n  /** Timeout per attempt in milliseconds (default: 120000 = 2 minutes) */\n  timeout?: number;\n  /** Function to determine if error should trigger retry */\n  shouldRetry?: (error: Error) => boolean;\n}\n\n/**\n * Default retry configuration\n */\nconst DEFAULT_OPTIONS: Required<RetryOptions> = {\n  maxAttempts: 3,\n  baseDelay: 1000,\n  maxDelay: 30000,\n  factor: 2,\n  timeout: 120000, // 2 minutes as specified\n  shouldRetry: (error: Error) => {\n    // Check if error is explicitly marked as non-retryable\n    if (\n      'retryable' in error &&\n      (error as { retryable: boolean }).retryable === false\n    ) {\n      return false;\n    }\n\n    // Don't retry on conflict errors (409) - cache already exists\n    if (error.message.includes('already exists')) return false;\n\n    // Retry on network errors, timeouts, and 5xx server errors\n    if (error instanceof NetworkError) return true;\n    if (error.message.includes('timeout')) return true;\n    if (error.message.includes('ECONNRESET')) return true;\n    if (error.message.includes('ENOTFOUND')) return true;\n    if (error.message.includes('fetch failed')) return true;\n\n    // Check for HTTP status codes that warrant retry\n    if (error.message.match(/50[0-9]/)) return true; // 500-509\n    if (error.message.includes('429')) return true; // Rate limiting\n\n    return false;\n  },\n};\n\n/**\n * Execute an operation with retry logic and exponential backoff\n */\nexport async function withRetry<T>(\n  operation: () => Promise<T>,\n  options: RetryOptions = {}\n): Promise<T> {\n  const config = { ...DEFAULT_OPTIONS, ...options };\n  let lastError!: Error;\n\n  for (let attempt = 1; attempt <= config.maxAttempts; attempt++) {\n    try {\n      // Wrap operation with timeout\n      const result = await Promise.race([\n        operation(),\n        new Promise<never>((_, reject) => {\n          setTimeout(() => {\n            reject(new Error(`Operation timeout after ${config.timeout}ms`));\n          }, config.timeout);\n        }),\n      ]);\n\n      return result;\n    } catch (error) {\n      lastError = error as Error;\n\n      // Check if we should retry this error\n      if (!config.shouldRetry(lastError)) {\n        throw lastError;\n      }\n\n      // If this is the last attempt, throw the error\n      if (attempt === config.maxAttempts) {\n        throw new NetworkError(\n          `Operation failed after ${config.maxAttempts} attempts: ${lastError.message}`,\n          lastError\n        );\n      }\n\n      // Calculate delay with exponential backoff\n      const delay = Math.min(\n        config.baseDelay * config.factor ** (attempt - 1),\n        config.maxDelay\n      );\n\n      logger.warn(\n        `Attempt ${attempt}/${config.maxAttempts} failed: ${lastError.message}`\n      );\n      logger.info(`Retrying in ${delay}ms...`);\n\n      // Wait before next attempt\n      await new Promise(resolve => setTimeout(resolve, delay));\n    }\n  }\n\n  // This should never be reached, but TypeScript requires it\n  throw lastError;\n}\n\n/**\n * Specialized retry for file upload operations\n * Uses different retry logic optimized for large file uploads\n */\nexport async function withFileUploadRetry<T>(\n  operation: () => Promise<T>,\n  _fileName?: string\n): Promise<T> {\n  return withRetry(operation, {\n    maxAttempts: 3,\n    baseDelay: 2000, // Longer initial delay for file operations\n    maxDelay: 60000, // Allow longer delays for large files\n    timeout: 300000, // 5 minutes for file uploads\n    shouldRetry: (error: Error) => {\n      // More lenient retry for file uploads\n      const message = error.message.toLowerCase();\n\n      // Retry on common file upload failures\n      if (message.includes('network')) return true;\n      if (message.includes('timeout')) return true;\n      if (message.includes('connection')) return true;\n      if (message.includes('upload')) return true;\n      if (message.includes('blob')) return true;\n      if (message.includes('storage')) return true;\n\n      // Don't retry on authentication or permission errors\n      if (message.includes('unauthorized') || message.includes('403'))\n        return false;\n      if (message.includes('forbidden')) return false;\n\n      return DEFAULT_OPTIONS.shouldRetry(error);\n    },\n  });\n}\n","/**\n * Cache API client extension for TestDino API\n */\n\nimport type { Config } from '@/config';\nimport { NetworkError, AuthenticationError } from '@/types';\nimport { withRetry } from '@/utils/retry';\nimport { VERSION } from '@/version';\nimport { logger } from '@/utils/logger';\n\n/**\n * Cache submission response from TestDino API\n */\nexport interface CacheSubmissionResponse {\n  success: boolean;\n  cacheId: string;\n  message?: string | undefined;\n}\n\n/**\n * Cache retrieval options\n */\nexport interface CacheRetrievalOptions {\n  cacheId: string;\n  shardIndex?: number;\n  forAllShards?: boolean;\n}\n\n/**\n * Cache retrieval response - Default (no query params)\n */\nexport interface CacheRetrievalResponse {\n  success: boolean;\n  message: string;\n  data?: {\n    cacheId: string;\n    pipelineId: string;\n    commit: string;\n    cache: {\n      branch: string;\n      commit: string;\n      repository: string;\n      ci: {\n        provider: string;\n        pipelineId: string;\n        buildNumber: string;\n      };\n      failures: Array<{\n        file: string;\n        testTitle: string;\n      }>;\n      // Optional fields based on query params\n      shardInfo?: {\n        isSharded: boolean;\n        shardIndex: number;\n        shardTotal: number;\n      };\n      shardTotal?: number;\n      shards?: Array<{\n        shardIndex: number;\n        failures: Array<{\n          file: string;\n          testTitle: string;\n        }>;\n      }>;\n    };\n  };\n}\n\n/**\n * Cache payload structure matching new API specification\n */\nexport interface CachePayload {\n  cacheId: string; // Format: ciProvider_repoName_branch\n  pipelineId: string; // CI pipeline/run ID\n  commit: string; // Git commit hash\n  branch: string; // Original branch name\n  repository: string; // Full repo (owner/repo)\n  ci: {\n    provider: string;\n    pipelineId: string;\n    buildNumber: string;\n  };\n  isSharded: boolean;\n  shardIndex: number | null;\n  shardTotal: number | null;\n  failures: Array<{\n    file: string;\n    testTitle: string;\n    project?: string; // Optional for backward compatibility\n  }>;\n  summary: {\n    total: number;\n    passed: number;\n    failed: number;\n    skipped: number;\n    duration: number;\n  };\n  timestamp: string;\n}\n\n/**\n * Cache API client for submitting test metadata to TestDino\n */\nexport class CacheApiClient {\n  private readonly baseUrl: string;\n  private readonly apiKey: string;\n\n  constructor(config: Config) {\n    this.baseUrl = config.apiUrl;\n    this.apiKey = config.token;\n  }\n\n  /**\n   * Submit cache data to TestDino API with retry logic\n   */\n  async submitCacheData(\n    payload: CachePayload\n  ): Promise<CacheSubmissionResponse> {\n    return await withRetry(async () => this.submitCacheDataAttempt(payload), {\n      maxAttempts: 3,\n      baseDelay: 1000,\n      maxDelay: 5000,\n    });\n  }\n\n  /**\n   * Single attempt to submit cache data\n   */\n  private async submitCacheDataAttempt(\n    payload: CachePayload\n  ): Promise<CacheSubmissionResponse> {\n    const url = `${this.baseUrl}/api/cache`;\n\n    try {\n      const response = await fetch(url, {\n        method: 'POST',\n        headers: this.getHeaders(),\n        body: JSON.stringify(payload),\n      });\n\n      if (!response.ok) {\n        await this.handleHttpError(response);\n      }\n\n      const data = await response.json();\n      return this.parseResponse(data);\n    } catch (error) {\n      if (\n        error instanceof AuthenticationError ||\n        error instanceof NetworkError\n      ) {\n        throw error;\n      }\n\n      // Handle network-level errors\n      const errorMessage =\n        error instanceof Error ? error.message : 'Unknown error';\n      throw new NetworkError(`Failed to submit cache data: ${errorMessage}`);\n    }\n  }\n\n  /**\n   * Headers for API requests\n   */\n  private getHeaders(): Record<string, string> {\n    return {\n      'Content-Type': 'application/json',\n      'User-Agent': `tdpw-cache/${VERSION}`,\n      'X-API-Key': this.apiKey,\n    };\n  }\n\n  /**\n   * Handle HTTP error responses\n   */\n  private async handleHttpError(response: Response): Promise<never> {\n    let errorBody: string;\n    try {\n      errorBody = await response.text();\n    } catch {\n      errorBody = 'Unable to read error response';\n    }\n\n    switch (response.status) {\n      case 401:\n        throw new AuthenticationError('Invalid API key for cache submission');\n\n      case 403:\n        throw new AuthenticationError(\n          'API key does not have permission to submit cache data'\n        );\n\n      case 400:\n        throw new NetworkError(`Bad cache data format: ${errorBody}`);\n\n      case 404:\n        throw new NetworkError(\n          'Cache endpoint not found - feature may not be available yet'\n        );\n\n      case 409: {\n        // Conflict - cache data already exists (not an error, don't retry)\n        // This is a non-retryable error - mark it specially so retry logic stops\n        const conflictError = new NetworkError(\n          'Cache data already exists for this shard'\n        );\n        (conflictError as NetworkError & { retryable: boolean }).retryable =\n          false;\n        throw conflictError;\n      }\n\n      case 413:\n        throw new NetworkError(\n          'Cache payload too large - consider reducing failure data'\n        );\n\n      case 429:\n        throw new NetworkError('Rate limit exceeded for cache submissions');\n\n      case 500:\n      case 502:\n      case 503:\n      case 504:\n        throw new NetworkError(\n          `Server error submitting cache data (${response.status}) - will retry`\n        );\n\n      default:\n        throw new NetworkError(\n          `Cache submission failed: HTTP ${response.status} - ${errorBody}`\n        );\n    }\n  }\n\n  /**\n   * Parse and validate API response\n   */\n  private parseResponse(data: unknown): CacheSubmissionResponse {\n    if (!data || typeof data !== 'object') {\n      throw new NetworkError('Invalid cache submission response format');\n    }\n\n    const response = data as Record<string, unknown>;\n\n    // Handle response with nested data structure\n    if (\n      'success' in response &&\n      'data' in response &&\n      typeof response.data === 'object'\n    ) {\n      const responseData = response.data as Record<string, unknown>;\n      return {\n        success: Boolean(response.success),\n        cacheId: String(responseData.cacheId || 'unknown'),\n        message: response.message ? String(response.message) : undefined,\n      };\n    }\n\n    // Handle flat response format\n    if ('success' in response && 'cacheId' in response) {\n      return {\n        success: Boolean(response.success),\n        cacheId: String(response.cacheId || 'unknown'),\n        message: response.message ? String(response.message) : undefined,\n      };\n    }\n\n    // Fallback: assume success if we got a response\n    return {\n      success: true,\n      cacheId: response.cacheId ? String(response.cacheId) : 'unknown',\n      message: response.message ? String(response.message) : undefined,\n    };\n  }\n\n  /**\n   * Test if cache API endpoint is available (health check)\n   */\n  async testCacheEndpoint(): Promise<boolean> {\n    try {\n      const response = await fetch(`${this.baseUrl}/api/cache`, {\n        method: 'OPTIONS', // Preflight request\n        headers: {\n          'User-Agent': `tdpw-cache/${VERSION}`,\n        },\n      });\n\n      // Even 404 means the server is responding\n      return response.status < 500;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Mock cache submission for development/testing\n   */\n  async mockCacheSubmission(\n    payload: CachePayload\n  ): Promise<CacheSubmissionResponse> {\n    // Simulate API call delay\n    await new Promise(resolve => setTimeout(resolve, 500));\n\n    logger.debug(\n      `MOCK: Would submit cache data to /api/v1/cache: cacheId=${payload.cacheId}, pipelineId=${payload.pipelineId}, commit=${payload.commit}, isSharded=${payload.isSharded}, shardIndex=${payload.shardIndex}, shardTotal=${payload.shardTotal}, failures=${payload.failures.length}, totalTests=${payload.summary.total}`\n    );\n\n    return {\n      success: true,\n      cacheId: payload.cacheId,\n      message: payload.isSharded\n        ? `Mock cache submission successful for shard ${payload.shardIndex}/${payload.shardTotal}`\n        : 'Mock cache submission successful',\n    };\n  }\n\n  /**\n   * Retrieve cache data for a specific cache ID\n   */\n  async retrieveCache(\n    options: CacheRetrievalOptions\n  ): Promise<CacheRetrievalResponse> {\n    // Validate mutually exclusive parameters\n    if (options.shardIndex !== undefined && options.forAllShards) {\n      throw new Error(\n        'Cannot specify both shardIndex and forAllShards parameters'\n      );\n    }\n\n    const url = new URL(`${this.baseUrl}/api/cache/${options.cacheId}`);\n\n    // Add query parameters\n    if (options.shardIndex !== undefined) {\n      url.searchParams.append('shardIndex', options.shardIndex.toString());\n    }\n    if (options.forAllShards === true) {\n      url.searchParams.append('forAllShards', 'true');\n    }\n\n    try {\n      const response = await fetch(url.toString(), {\n        method: 'GET',\n        headers: this.getHeaders(),\n      });\n\n      if (!response.ok) {\n        return this.handleRetrievalError(response, options.cacheId);\n      }\n\n      const data = (await response.json()) as CacheRetrievalResponse;\n      return data;\n    } catch (error) {\n      // Network or parsing error\n      return {\n        success: false,\n        message: `Failed to retrieve cache: ${error instanceof Error ? error.message : 'Unknown error'}`,\n      };\n    }\n  }\n\n  /**\n   * Handle retrieval errors with appropriate messages\n   */\n  private async handleRetrievalError(\n    response: Response,\n    cacheId: string\n  ): Promise<CacheRetrievalResponse> {\n    let errorMessage = 'Failed to retrieve cache data';\n    let errorBody: { message?: string } | undefined;\n\n    try {\n      errorBody = (await response.json()) as { message?: string };\n      errorMessage = errorBody.message || errorMessage;\n    } catch {\n      // If response body is not JSON, use status text\n      errorMessage = response.statusText || errorMessage;\n    }\n\n    switch (response.status) {\n      case 400:\n        return {\n          success: false,\n          message:\n            errorMessage ||\n            'Invalid request: Cannot specify both shardIndex and forAllShards',\n        };\n\n      case 401:\n      case 403:\n        return {\n          success: false,\n          message: 'Unauthorized: Invalid or missing API token',\n        };\n\n      case 404:\n        return {\n          success: false,\n          message: `Cache not found for cache ID: ${cacheId}`,\n        };\n\n      default:\n        return {\n          success: false,\n          message: `${errorMessage} (HTTP ${response.status})`,\n        };\n    }\n  }\n\n  /**\n   * Get cache data for specific cache ID (simplified for last-failed command)\n   */\n  async getCacheData(\n    cacheId: string,\n    options?: {\n      branch?: string;\n      commit?: string;\n      shard?: number;\n      pipelineId?: string;\n    }\n  ): Promise<{\n    cacheId: string;\n    failures: Array<{ file: string; testTitle: string }>;\n    branch: string;\n    repository: string;\n  } | null> {\n    try {\n      const url = new URL(`${this.baseUrl}/api/cache/${cacheId}`);\n\n      // Add query parameters if provided\n      if (options?.branch) {\n        url.searchParams.append('branch', options.branch);\n      }\n      if (options?.commit) {\n        url.searchParams.append('commit', options.commit);\n      }\n      if (options?.shard !== undefined) {\n        url.searchParams.append('shard', options.shard.toString());\n      }\n      if (options?.pipelineId) {\n        url.searchParams.append('pipelineId', options.pipelineId);\n      }\n\n      const response = await fetch(url.toString(), {\n        method: 'GET',\n        headers: this.getHeaders(),\n      });\n\n      if (!response.ok) {\n        // Return null for 404 or other errors - let caller handle fallback\n        return null;\n      }\n\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const data = (await response.json()) as any;\n\n      // Extract the data we need for last-failed command\n      if (data?.data?.cache) {\n        return {\n          cacheId: data.data.cacheId || cacheId,\n          failures: data.data.cache.failures || [],\n          branch: data.data.cache.branch || 'unknown',\n          repository: data.data.cache.repository || 'unknown',\n        };\n      }\n\n      return null;\n    } catch (_error) {\n      // Network error - return null to allow fallback\n      return null;\n    }\n  }\n\n  /**\n   * Get latest cache data (with optional branch filter)\n   */\n  async getLatestCacheData(branch?: string): Promise<{\n    cacheId: string;\n    failures: Array<{ file: string; testTitle: string }>;\n    branch: string;\n    repository: string;\n  } | null> {\n    try {\n      const url = new URL(`${this.baseUrl}/api/cache/latest`);\n\n      if (branch) {\n        url.searchParams.append('branch', branch);\n      }\n\n      const response = await fetch(url.toString(), {\n        method: 'GET',\n        headers: this.getHeaders(),\n      });\n\n      if (!response.ok) {\n        return null;\n      }\n\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const data = (await response.json()) as any;\n\n      // Extract the data we need for last-failed command\n      if (data?.data?.cache) {\n        return {\n          cacheId: data.data.cacheId || 'unknown',\n          failures: data.data.cache.failures || [],\n          branch: data.data.cache.branch || 'unknown',\n          repository: data.data.cache.repository || 'unknown',\n        };\n      }\n\n      return null;\n    } catch (_error) {\n      return null;\n    }\n  }\n}\n","/**\n * Cache command - Store test execution metadata after Playwright runs\n */\n\nimport type { Config } from '@/config';\nimport type { Command } from '@/types';\nimport { logger, setVerbose } from '@/utils/logger';\nimport { createProgressTracker } from '@/utils/progress';\nimport {\n  PlaywrightShardDetector,\n  type ShardInfo,\n} from '@/core/shard-detection';\nimport {\n  CacheExtractor,\n  type CacheExtractionResult,\n} from '@/core/cache-extractor';\nimport { CacheIdDetector, type CacheIdInfo } from '@/core/build-detector';\nimport { GitCollector, type GitMetadata } from '@/collectors/git';\nimport { CiCollector, type CiMetadata } from '@/collectors/ci';\nimport { CacheApiClient, type CachePayload } from '@/services/cache-api';\n\n/**\n * CLI options specific to the cache command\n */\nexport interface CacheOptions {\n  cacheId?: string; // Custom cache ID override\n  workingDir?: string;\n  token?: string;\n  verbose?: boolean;\n}\n\n/**\n * Zod schema for cache options validation\n */\nimport { z } from 'zod';\n\nexport const CacheOptionsSchema = z.object({\n  cacheId: z.string().optional(),\n  workingDir: z.string().optional(),\n  token: z.string().optional(),\n  verbose: z.boolean().optional().default(false),\n});\n\nexport type ValidatedCacheOptions = z.infer<typeof CacheOptionsSchema>;\n\n/**\n * Cache command implementation\n */\nexport class CacheCommand implements Command {\n  readonly name = 'cache';\n  readonly description = 'Store test execution metadata after Playwright runs';\n\n  constructor(private readonly config: Config) {}\n\n  /**\n   * Execute the cache command\n   */\n  async execute(options: ValidatedCacheOptions): Promise<void> {\n    const progress = createProgressTracker();\n\n    // Set verbose mode for logger\n    setVerbose(options.verbose || false);\n\n    try {\n      progress.start('Caching test execution metadata...');\n\n      if (options.verbose) {\n        logger.verbose(\n          `Cache configuration: workingDir=${options.workingDir || process.cwd()}, customCacheId=${options.cacheId || 'auto-detect'}`\n        );\n      }\n\n      // Step 1: Detect working directory\n      const workingDir = options.workingDir || process.cwd();\n      progress.update(`Working directory: ${workingDir}`);\n\n      // Step 2: Auto-detect Playwright configuration and shard info\n      progress.update('Detecting Playwright configuration...');\n      const shardInfo = await this.detectShardInfo(workingDir);\n\n      if (options.verbose && shardInfo) {\n        logger.verbose(\n          `Detected shard configuration: ${shardInfo.shardIndex}/${shardInfo.shardTotal}`\n        );\n      }\n\n      // Step 3: Extract test failure data using existing discovery and parsing\n      progress.update('Discovering and extracting test data...');\n      const failureData = await this.extractFailureData(workingDir);\n\n      if (failureData.reportPaths.length === 0) {\n        progress.warn(\n          'No test reports found - tests may not have completed yet'\n        );\n        logger.info('Run this command after your Playwright tests complete');\n        return; // Exit successfully (CI-friendly)\n      }\n\n      if (options.verbose) {\n        logger.verbose(\n          `Found ${failureData.failures.length} failed tests from ${failureData.reportPaths.length} reports`\n        );\n      }\n\n      // Step 4: Collect build and CI metadata\n      progress.update('Collecting build metadata...');\n      const metadata = await this.collectBuildMetadata(options);\n\n      // Step 5: Prepare cache payload\n      const cachePayload = this.prepareCachePayload({\n        metadata,\n        shardInfo,\n        failureData,\n        timestamp: new Date().toISOString(),\n      });\n\n      if (options.verbose) {\n        logger.verbose(`Cache payload summary:`);\n        logger.kv('Cache ID', cachePayload.cacheId);\n        logger.kv('Pipeline ID', cachePayload.pipelineId);\n        logger.kv('Commit', cachePayload.commit);\n        logger.kv('Sharded', cachePayload.isSharded ? 'Yes' : 'No');\n        if (cachePayload.isSharded) {\n          logger.kv(\n            'Shard',\n            `${cachePayload.shardIndex}/${cachePayload.shardTotal}`\n          );\n        }\n        logger.kv('Failures', cachePayload.failures.length);\n        logger.kv('Total Tests', cachePayload.summary.total);\n        logger.kv('Branch', cachePayload.branch);\n        logger.kv('Repository', cachePayload.repository);\n      }\n\n      // Step 7: Send to API\n      progress.update('Sending cache data to TestDino API...');\n      await this.sendCacheData(cachePayload);\n\n      progress.succeed('Test execution metadata cached successfully');\n    } catch (error) {\n      const errorMessage =\n        error instanceof Error ? error.message : 'Unknown error';\n\n      // Special handling for cache conflicts (409) - this is not an error\n      if (errorMessage.includes('already exists')) {\n        progress.warn('Cache data already exists for this shard');\n        logger.info('This shard has already been cached - skipping');\n        logger.info('This warning will not affect your CI pipeline');\n        return;\n      }\n\n      // CI-friendly error handling - warn but don't fail for other errors\n      progress.warn(`Failed to cache test metadata: ${errorMessage}`);\n\n      if (options.verbose) {\n        logger.debug(`Full error details: ${error}`);\n      }\n\n      logger.info('This warning will not affect your CI pipeline');\n      // Exit with success code (0) to avoid breaking CI\n    }\n  }\n\n  /**\n   * Auto-detect shard information from Playwright configuration\n   */\n  private async detectShardInfo(workingDir: string): Promise<ShardInfo | null> {\n    return await PlaywrightShardDetector.detectShardInfo(workingDir);\n  }\n\n  /**\n   * Discover and extract test failure data\n   */\n  private async extractFailureData(\n    workingDir: string\n  ): Promise<CacheExtractionResult> {\n    const extractor = new CacheExtractor(workingDir);\n    return await extractor.extractFailureData();\n  }\n\n  /**\n   * Collect build and CI metadata using existing collectors\n   */\n  private async collectBuildMetadata(options: ValidatedCacheOptions): Promise<{\n    cacheIdInfo: CacheIdInfo;\n    gitMetadata: GitMetadata;\n    ciMetadata: CiMetadata;\n  }> {\n    // Collect cache ID information from environment\n    const cacheIdInfo = await CacheIdDetector.detectCacheId(options.cacheId);\n\n    // Collect Git metadata\n    const gitCollector = new GitCollector(options.workingDir || process.cwd());\n    const gitMetadata = await gitCollector.getMetadata();\n\n    // Collect CI metadata\n    const ciMetadata = CiCollector.collect();\n\n    return {\n      cacheIdInfo,\n      gitMetadata,\n      ciMetadata,\n    };\n  }\n\n  /**\n   * Prepare cache payload for TestDino API based on PRD specification\n   */\n  private prepareCachePayload(data: {\n    metadata: {\n      cacheIdInfo: CacheIdInfo;\n      gitMetadata: GitMetadata;\n      ciMetadata: CiMetadata;\n    };\n    shardInfo: ShardInfo | null;\n    failureData: CacheExtractionResult;\n    timestamp: string;\n  }): CachePayload {\n    const { cacheIdInfo, ciMetadata } = data.metadata;\n    const effectiveShardInfo =\n      data.shardInfo || PlaywrightShardDetector.createDefaultShardInfo();\n\n    return {\n      // Cache identification (new format)\n      cacheId: cacheIdInfo.cacheId,\n      pipelineId: cacheIdInfo.pipelineId,\n      commit: cacheIdInfo.commit,\n\n      // Git metadata\n      branch: cacheIdInfo.branch, // Use original branch from cacheIdInfo\n      repository: cacheIdInfo.repository,\n\n      // CI information\n      ci: {\n        provider: ciMetadata.provider || 'unknown',\n        pipelineId: ciMetadata.pipeline?.id || 'unknown',\n        buildNumber: ciMetadata.build?.number || 'unknown',\n      },\n\n      // Shard information (cleaner structure)\n      isSharded: effectiveShardInfo.shardTotal > 1,\n      shardIndex:\n        effectiveShardInfo.shardTotal > 1\n          ? effectiveShardInfo.shardIndex\n          : null,\n      shardTotal:\n        effectiveShardInfo.shardTotal > 1\n          ? effectiveShardInfo.shardTotal\n          : null,\n\n      // Test failure data (simplified)\n      failures: data.failureData.failures.map(f => ({\n        file: f.file,\n        testTitle: f.testTitle,\n        ...(f.project && { project: f.project }),\n      })),\n\n      // Test summary for this shard\n      summary: data.failureData.summary,\n\n      // Timestamp\n      timestamp: data.timestamp,\n    };\n  }\n\n  /**\n   * Send cache data to TestDino API\n   */\n  private async sendCacheData(payload: CachePayload): Promise<void> {\n    const apiClient = new CacheApiClient(this.config);\n\n    // Check if cache endpoint is available (since APIs aren't implemented yet)\n    const isEndpointAvailable = await apiClient.testCacheEndpoint();\n\n    if (!isEndpointAvailable) {\n      logger.info(\n        'Cache API endpoint not available yet - using mock submission'\n      );\n      await apiClient.mockCacheSubmission(payload);\n      return;\n    }\n\n    // Submit cache data to real API\n    const result = await apiClient.submitCacheData(payload);\n\n    if (result.success) {\n      logger.success(`Cache data submitted for cache: ${result.cacheId}`);\n      if (result.message) {\n        logger.info(result.message);\n      }\n    } else {\n      throw new Error(`Cache submission failed for cache: ${result.cacheId}`);\n    }\n  }\n}\n","/**\n * Last Failed command - Retrieve cached test failure data\n */\n\nimport type { Config } from '@/config';\nimport type { Command } from '@/types';\nimport { CacheIdDetector } from '@/core/build-detector';\nimport { CacheApiClient } from '@/services/cache-api';\nimport { CiCollector } from '@/collectors/ci';\nimport { EnvironmentUtils } from '@/utils/env';\nimport { logger, setVerbose } from '@/utils/logger';\nimport { z } from 'zod';\n\n/**\n * CLI options specific to the last failed command\n */\nexport interface LastFailedOptions {\n  cacheId?: string; // Custom cache ID override\n  branch?: string; // Custom branch name override\n  commit?: string; // Custom commit hash override\n  shard?: string; // Shard specification (e.g., \"1/3\")\n  token?: string;\n  verbose?: boolean;\n}\n\n/**\n * Parsed shard information\n */\ninterface ShardInfo {\n  shardIndex: number;\n  shardTotal: number;\n}\n\n/**\n * Zod schema for last failed options validation\n */\nexport const LastFailedOptionsSchema = z.object({\n  cacheId: z.string().optional(),\n  branch: z.string().optional(),\n  commit: z.string().optional(),\n  shard: z\n    .string()\n    .optional()\n    .refine(\n      val => {\n        if (!val) return true; // Optional field\n        const match = val.match(/^(\\d+)\\/(\\d+)$/);\n        if (!match) return false;\n        const [, index, total] = match;\n        const shardIndex = parseInt(index || '0', 10);\n        const shardTotal = parseInt(total || '0', 10);\n        return shardIndex > 0 && shardTotal > 0 && shardIndex <= shardTotal;\n      },\n      {\n        message:\n          'Shard must be in format \"index/total\" where index > 0 and index <= total (e.g., \"1/3\")',\n      }\n    ),\n  token: z.string().optional(),\n  verbose: z.boolean().optional().default(false),\n});\n\nexport type ValidatedLastFailedOptions = z.infer<\n  typeof LastFailedOptionsSchema\n>;\n\n/**\n * Cached failure data from API\n */\ninterface CacheFailureData {\n  cacheId: string;\n  failures: Array<{\n    file: string;\n    testTitle: string;\n  }>;\n  branch: string;\n  repository: string;\n}\n\n/**\n * Last Failed command implementation\n */\nexport class LastFailedCommand implements Command {\n  readonly name = 'last-failed';\n  readonly description = 'Get last failed test cases for Playwright execution';\n\n  constructor(private readonly config: Config) {}\n\n  /**\n   * Execute the last failed command\n   */\n  async execute(options: ValidatedLastFailedOptions): Promise<void> {\n    const isDebugMode =\n      options.verbose ||\n      EnvironmentUtils.getStringEnv('TESTDINO_RUNTIME') === 'development';\n\n    // Set verbose mode for logger\n    setVerbose(isDebugMode);\n\n    try {\n      if (isDebugMode) {\n        logger.debug('Retrieving last failed tests...');\n        if (\n          options.cacheId ||\n          options.branch ||\n          options.commit ||\n          options.shard\n        ) {\n          logger.debug(\n            `Custom overrides: cacheId=${options.cacheId || 'auto-detect'}, branch=${options.branch || 'auto-detect'}, commit=${options.commit || 'auto-detect'}, shard=${options.shard || 'none'}`\n          );\n        }\n      }\n\n      // Step 1: Parse shard information if provided\n      const shardInfo = options.shard\n        ? this.parseShardInfo(options.shard)\n        : null;\n\n      if (isDebugMode && shardInfo) {\n        logger.debug(`Shard: ${shardInfo.shardIndex}/${shardInfo.shardTotal}`);\n      }\n\n      // Step 2: Determine cache ID with custom overrides\n      const cacheId = await this.determineCacheId(\n        options.cacheId,\n        options.branch,\n        options.commit\n      );\n\n      if (isDebugMode && cacheId) {\n        logger.debug(`Cache ID: ${cacheId}`);\n      }\n\n      // Step 3: Get cached failure data\n      const failureData = await this.getCachedFailures(\n        cacheId,\n        options,\n        shardInfo,\n        isDebugMode\n      );\n\n      if (!failureData?.failures || failureData.failures.length === 0) {\n        if (isDebugMode) {\n          if (shardInfo) {\n            logger.info(\n              `No failed test cases found for shard ${shardInfo.shardIndex}/${shardInfo.shardTotal}`\n            );\n          } else {\n            logger.info('No last failed test cases found');\n          }\n        }\n        process.exit(0);\n        return;\n      }\n\n      if (isDebugMode) {\n        logger.debug(`Found: ${failureData.failures.length} failed tests`);\n        logger.debug(`Branch: ${failureData.branch}`);\n        logger.debug(`Repository: ${failureData.repository}`);\n      }\n\n      // Step 4: Format output for Playwright\n      const playwrightArgs = this.formatPlaywrightArgs(failureData.failures);\n\n      // Step 5: Output result (to stdout for shell substitution)\n      console.log(playwrightArgs);\n    } catch (_error) {\n      if (isDebugMode) {\n        const errorMessage =\n          _error instanceof Error ? _error.message : 'Unknown error';\n        logger.error(`Failed to retrieve cached failures: ${errorMessage}`);\n      }\n      process.exit(1);\n    }\n  }\n\n  /**\n   * Parse shard information from string format (e.g., \"1/3\")\n   */\n  private parseShardInfo(shard: string): ShardInfo | null {\n    const match = shard.match(/^(\\d+)\\/(\\d+)$/);\n    if (!match) return null;\n\n    const [, index, total] = match;\n    return {\n      shardIndex: parseInt(index || '0', 10),\n      shardTotal: parseInt(total || '0', 10),\n    };\n  }\n\n  /**\n   * Determine cache ID using same logic as cache store command\n   */\n  private async determineCacheId(\n    customCacheId?: string,\n    customBranch?: string,\n    customCommit?: string\n  ): Promise<string | null> {\n    try {\n      const cacheIdInfo = await CacheIdDetector.detectCacheId(\n        customCacheId,\n        customBranch,\n        customCommit\n      );\n      return cacheIdInfo.cacheId;\n    } catch (_error) {\n      return null;\n    }\n  }\n\n  /**\n   * Get cached failure data from API\n   */\n  private async getCachedFailures(\n    cacheId: string | null,\n    options: ValidatedLastFailedOptions,\n    shardInfo: ShardInfo | null,\n    isDebugMode: boolean\n  ): Promise<CacheFailureData | null> {\n    const apiClient = new CacheApiClient(this.config);\n\n    try {\n      // Get cache for specific cache ID\n      if (cacheId) {\n        // Determine query parameters based on whether cache ID is custom\n        const queryParams: {\n          branch?: string;\n          commit?: string;\n          shard?: number;\n          pipelineId?: string;\n        } = {};\n\n        // If custom cache ID is provided, pass branch/commit as query params\n        if (options.cacheId) {\n          if (options.branch) queryParams.branch = options.branch;\n          if (options.commit) queryParams.commit = options.commit;\n        } else {\n          // If auto-generated cache ID:\n          // - Branch affects cache ID generation (not passed as query param)\n          // - Commit is passed as query param only\n          if (options.commit) queryParams.commit = options.commit;\n        }\n\n        // Add shard index if specified\n        if (shardInfo) {\n          queryParams.shard = shardInfo.shardIndex;\n        }\n\n        // Detect and add pipelineId from CI environment\n        // This ensures we get cache data for the current pipeline run,\n        // not a different pipeline that may have the same cacheId\n        const ciMetadata = CiCollector.collect();\n        if (ciMetadata.pipeline.id && ciMetadata.pipeline.id !== 'unknown') {\n          queryParams.pipelineId = ciMetadata.pipeline.id;\n        }\n\n        if (isDebugMode) {\n          logger.debug(`Fetching cache for: ${cacheId}`);\n          if (Object.keys(queryParams).length > 0) {\n            logger.debug(`Query parameters: ${JSON.stringify(queryParams)}`);\n          }\n        }\n\n        const cache = await apiClient.getCacheData(cacheId, queryParams);\n        if (cache) {\n          return cache;\n        }\n\n        if (isDebugMode) {\n          if (shardInfo) {\n            logger.debug(\n              `No cache found for ${cacheId} (shard ${shardInfo.shardIndex}/${shardInfo.shardTotal})`\n            );\n          } else {\n            logger.debug(`No cache found for ${cacheId}`);\n          }\n        }\n      }\n\n      return null;\n    } catch (error) {\n      if (isDebugMode) {\n        logger.debug(\n          `API error: ${error instanceof Error ? error.message : 'Unknown error'}`\n        );\n      }\n      return null;\n    }\n  }\n\n  /**\n   * Format failure data for Playwright command\n   */\n  private formatPlaywrightArgs(\n    failures: Array<{ file: string; testTitle: string }>\n  ): string {\n    if (failures.length === 0) {\n      return '';\n    }\n\n    // Group failures by file\n    const failuresByFile = failures.reduce<Record<string, string[]>>(\n      (acc, failure) => {\n        if (!acc[failure.file]) {\n          acc[failure.file] = [];\n        }\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        acc[failure.file]!.push(failure.testTitle);\n        return acc;\n      },\n      {}\n    );\n\n    const files = Object.keys(failuresByFile);\n\n    // If all failures are from a single file\n    if (files.length === 1) {\n      const file = files[0];\n      if (file) {\n        const testTitles = failuresByFile[file];\n        if (testTitles) {\n          const grepPattern = testTitles\n            .map((title: string) => this.escapeForGrep(title))\n            .join('|');\n          return `${file} -g \"${grepPattern}\"`;\n        }\n      }\n    }\n\n    // Multiple files - use global grep pattern\n    const allTestTitles = failures.map(f => this.escapeForGrep(f.testTitle));\n    const grepPattern = allTestTitles.join('|');\n    return `-g \"${grepPattern}\"`;\n  }\n\n  /**\n   * Escape test title for Playwright's -g flag\n   */\n  private escapeForGrep(testTitle: string): string {\n    // Escape special regex characters for Playwright's grep\n    return testTitle\n      .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') // Escape regex special chars\n      .replace(/\"/g, '\\\\\"') // Escape double quotes for shell\n      .trim();\n  }\n}\n","/**\n * Configuration management with environment detection and validation\n */\n\nimport * as dotenv from 'dotenv-expand';\nimport { z } from 'zod';\nimport {\n  Config,\n  ConfigSchema,\n  CLIOptions,\n  ConfigurationError,\n  ValidationError,\n  stringToBoolean,\n} from '@/types';\nimport { EnvironmentUtils, EnvironmentType, CIProvider } from '@/utils/env';\nimport { ValidationUtils } from '@/utils/validation';\nimport { logger } from '@/utils/logger';\n\n// Load environment variables with proper typing\ndotenv.expand({ parsed: process.env as Record<string, string> });\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG = {\n  // API URLs by environment\n  API_URLS: {\n    [EnvironmentType.PRODUCTION]: 'https://api.testdino.com',\n    [EnvironmentType.STAGING]: 'https://stg-api.testdino.com',\n    [EnvironmentType.DEVELOPMENT]: 'http://localhost:3000',\n    [EnvironmentType.TEST]: 'http://localhost:3000',\n  },\n\n  // Default options\n  UPLOAD_IMAGES: false,\n  UPLOAD_VIDEOS: false,\n  UPLOAD_HTML: false,\n  UPLOAD_TRACES: false,\n  UPLOAD_FILES: false,\n  UPLOAD_FULL_JSON: false,\n  VERBOSE: false,\n\n  // Performance settings\n  TIMEOUT_MS: 60000, // 60 seconds\n  RETRY_COUNT: 3,\n  MAX_FILE_SIZE_MB: 100,\n  BATCH_SIZE: 5,\n  MAX_CONCURRENT_UPLOADS: 10,\n  UPLOAD_TIMEOUT: 60000,\n} as const;\n\n/**\n * Environment detection utilities\n */\nclass EnvironmentDetectorClass {\n  /**\n   * Determine current environment type\n   */\n  getEnvironmentType(): EnvironmentType {\n    return EnvironmentUtils.detectEnvironmentType();\n  }\n\n  /**\n   * Determine if we're in development mode\n   */\n  isDevelopment(): boolean {\n    return EnvironmentUtils.isDevelopment();\n  }\n\n  /**\n   * Determine if we're in production mode\n   */\n  isProduction(): boolean {\n    return EnvironmentUtils.isProduction();\n  }\n\n  /**\n   * Determine if we're in test mode\n   */\n  isTest(): boolean {\n    return EnvironmentUtils.isTest();\n  }\n\n  /**\n   * Check if running in CI environment\n   */\n  isCI(): boolean {\n    return EnvironmentUtils.isCI();\n  }\n\n  /**\n   * Get CI provider information\n   */\n  getCIProvider(): CIProvider {\n    return EnvironmentUtils.detectCIProvider();\n  }\n\n  /**\n   * Get the appropriate API URL based on environment\n   */\n  getApiUrl(): string {\n    const envType = this.getEnvironmentType();\n\n    // Check for explicit override (always allow override)\n    const override = EnvironmentUtils.getStringEnv('TESTDINO_API_URL');\n    if (override) {\n      return override;\n    }\n\n    // Use environment-specific default\n    return DEFAULT_CONFIG.API_URLS[envType];\n  }\n\n  /**\n   * Get environment summary for debugging\n   */\n  getEnvironmentInfo(): Record<string, unknown> {\n    return {\n      ...EnvironmentUtils.getEnvironmentSummary(),\n      apiUrl: this.getApiUrl(),\n      isCI: this.isCI(),\n      ciProvider: this.getCIProvider(),\n    };\n  }\n}\n\n/**\n * Enhanced configuration loader and validator\n */\nexport class ConfigLoader {\n  /**\n   * Validate API token format and environment compatibility\n   */\n  private validateToken(token: string): void {\n    ValidationUtils.validateApiToken(token);\n\n    // Extract environment from token\n    const tokenEnv = token.split('_')[1];\n    EnvironmentDetector.getEnvironmentType();\n\n    // Warn about environment mismatches in development\n    if (EnvironmentDetector.isDevelopment() && tokenEnv !== 'development') {\n      logger.warn(\n        `Using ${tokenEnv} token in development environment. Consider using a development token for local testing.`\n      );\n    }\n  }\n\n  /**\n   * Resolve configuration values with proper precedence\n   */\n  private resolveConfigValue<T>(\n    cliValue: T | undefined,\n    envKey: string,\n    defaultValue: T,\n    converter?: (value: string) => T\n  ): T {\n    // CLI option has highest precedence\n    if (cliValue !== undefined) {\n      return cliValue;\n    }\n\n    // Environment variable is second\n    const envValue = EnvironmentUtils.getStringEnv(\n      envKey as keyof typeof EnvironmentUtils.getStringEnv\n    );\n    if (envValue !== undefined) {\n      if (converter) {\n        return converter(envValue);\n      }\n      // For boolean values\n      if (typeof defaultValue === 'boolean') {\n        return stringToBoolean(envValue) as T;\n      }\n      return envValue as T;\n    }\n\n    // Default value is last\n    return defaultValue;\n  }\n\n  /**\n   * Create configuration from CLI options with environment fallbacks\n   */\n  createConfig(options: CLIOptions): Config {\n    // Token resolution: CLI > ENV > error\n    const token = this.resolveConfigValue(options.token, 'TESTDINO_TOKEN', '');\n\n    if (!token) {\n      throw new ConfigurationError(\n        'API token is required. Provide via --token flag or TESTDINO_TOKEN environment variable.'\n      );\n    }\n\n    // Validate token format\n    this.validateToken(token);\n\n    // Build configuration with only CLI options (no environment variable fallbacks)\n    const config: Config = {\n      apiUrl: EnvironmentDetector.getApiUrl(),\n      token,\n      uploadImages: options.uploadImages || DEFAULT_CONFIG.UPLOAD_IMAGES,\n      uploadVideos: options.uploadVideos || DEFAULT_CONFIG.UPLOAD_VIDEOS,\n      uploadHtml: options.uploadHtml || DEFAULT_CONFIG.UPLOAD_HTML,\n      uploadTraces: options.uploadTraces || DEFAULT_CONFIG.UPLOAD_TRACES,\n      uploadFiles: options.uploadFiles || DEFAULT_CONFIG.UPLOAD_FILES,\n      uploadFullJson: options.uploadFullJson || DEFAULT_CONFIG.UPLOAD_FULL_JSON,\n      verbose: options.verbose || DEFAULT_CONFIG.VERBOSE,\n      // Target environment tag (already resolved with env var fallback in commands.ts)\n      environment: options.environment || 'unknown',\n      // Run tags (already resolved with env var fallback in commands.ts)\n      tags: options.tags || [],\n      // Performance settings use defaults only\n      batchSize: DEFAULT_CONFIG.BATCH_SIZE,\n      maxConcurrentUploads: DEFAULT_CONFIG.MAX_CONCURRENT_UPLOADS,\n      uploadTimeout: DEFAULT_CONFIG.UPLOAD_TIMEOUT,\n      retryAttempts: DEFAULT_CONFIG.RETRY_COUNT,\n    };\n\n    // Validate the final configuration\n    try {\n      const validatedConfig = ConfigSchema.parse(config);\n\n      // Log configuration summary in verbose mode\n      if (validatedConfig.verbose) {\n        this.logConfigurationSummary(validatedConfig, options);\n      }\n\n      return validatedConfig;\n    } catch (error) {\n      if (error instanceof z.ZodError) {\n        const issues = error.issues.map(\n          issue => `${issue.path.join('.')}: ${issue.message}`\n        );\n        throw new ConfigurationError(\n          `Invalid configuration: ${issues.join(', ')}`,\n          error\n        );\n      }\n      throw new ConfigurationError(\n        'Configuration validation failed',\n        error as Error\n      );\n    }\n  }\n\n  /**\n   * Log configuration summary for debugging\n   */\n  private logConfigurationSummary(config: Config, options: CLIOptions): void {\n    const envInfo = EnvironmentDetector.getEnvironmentInfo();\n\n    logger.section('Configuration:');\n    logger.kv('Environment', String(envInfo.type));\n    logger.kv('CI/CD', envInfo.isCI ? `Yes (${envInfo.ciProvider})` : 'No');\n    logger.kv('Report', options.reportDirectory);\n\n    // Build upload flags summary\n    const uploadFlags: string[] = [];\n    if (config.uploadFullJson) uploadFlags.push('full-json');\n    if (config.uploadImages) uploadFlags.push('images');\n    if (config.uploadVideos) uploadFlags.push('videos');\n    if (config.uploadHtml) uploadFlags.push('html');\n    if (config.uploadTraces) uploadFlags.push('traces');\n    if (config.uploadFiles) uploadFlags.push('files');\n\n    if (uploadFlags.length > 0) {\n      logger.kv('Upload', uploadFlags.join(', '));\n    } else {\n      logger.kv('Upload', 'report only');\n    }\n\n    // Show run tags if specified\n    if (config.tags && config.tags.length > 0) {\n      logger.kv('Run Tags', config.tags.join(', '));\n    }\n  }\n\n  /**\n   * Get runtime configuration with validation\n   */\n  getRuntimeConfig(): {\n    timeout: number;\n    retryCount: number;\n    maxFileSize: number;\n    logLevel: string;\n  } {\n    // Use only default values - no environment variable overrides\n    const timeout = DEFAULT_CONFIG.TIMEOUT_MS;\n    const retryCount = DEFAULT_CONFIG.RETRY_COUNT;\n    const maxFileSizeMB = DEFAULT_CONFIG.MAX_FILE_SIZE_MB;\n    const logLevel = 'info';\n\n    // Validate runtime values\n    ValidationUtils.validateTimeout(timeout);\n    ValidationUtils.validateRetryCount(retryCount);\n\n    return {\n      timeout,\n      retryCount,\n      maxFileSize: maxFileSizeMB * 1024 * 1024, // Convert MB to bytes\n      logLevel,\n    };\n  }\n\n  /**\n   * Validate environment for CLI operation\n   */\n  validateEnvironment(): void {\n    try {\n      // Validate environment variables\n      EnvironmentUtils.getEnvironment();\n\n      // Check Node.js version\n      ValidationUtils.validateNodeVersion('18.0.0');\n\n      // Validate API URL if present\n      const apiUrl = EnvironmentDetector.getApiUrl();\n      ValidationUtils.validateUrl(apiUrl, 'API');\n    } catch (error) {\n      if (\n        error instanceof ConfigurationError ||\n        error instanceof ValidationError\n      ) {\n        throw error;\n      }\n      throw new ConfigurationError(\n        'Environment validation failed',\n        error as Error\n      );\n    }\n  }\n}\n\n/**\n * Global configuration instance\n */\nexport const configLoader = new ConfigLoader();\n\n/**\n * Create a singleton instance of EnvironmentDetector\n */\nexport const EnvironmentDetector = new EnvironmentDetectorClass();\n\n/**\n * Export utilities for external use\n */\nexport { EnvironmentUtils };\nexport type { Config, EnvironmentType, CIProvider };\n","/**\n * Attachment processing utilities for Playwright reports\n */\n\nimport { relative, resolve, isAbsolute } from 'path';\nimport { exists } from '@/utils/fs';\nimport { PlaywrightReport } from './parser';\nimport { logger } from '@/utils/logger';\n\n/**\n * Attachment information extracted from Playwright report\n */\nexport interface AttachmentInfo {\n  name: string;\n  contentType: string;\n  originalPath: string;\n  relativePath: string;\n  absolutePath: string;\n  type: 'image' | 'video' | 'trace' | 'file' | 'other';\n}\n\n/**\n * Result of attachment scanning process\n */\n/**\n * An attachment referenced in the report whose file was not found on disk\n */\nexport interface MissingAttachment {\n  name: string;\n  contentType: string;\n  path: string;\n  type: AttachmentInfo['type'];\n}\n\nexport interface AttachmentScanResult {\n  images: AttachmentInfo[];\n  videos: AttachmentInfo[];\n  traces: AttachmentInfo[];\n  files: AttachmentInfo[];\n  other: AttachmentInfo[];\n  total: number;\n  /** Attachments referenced in the report but not found on disk */\n  missingFiles: MissingAttachment[];\n  /** Total attachment entries found in the report (found + missing) */\n  referencedInReport: number;\n}\n\n/**\n * Content type mappings for attachment classification\n */\nconst CONTENT_TYPE_MAPPING = {\n  image: [\n    'image/png',\n    'image/jpeg',\n    'image/jpg',\n    'image/gif',\n    'image/webp',\n    'image/svg+xml',\n    'image/bmp',\n    'image/tiff',\n  ],\n  video: ['video/webm', 'video/mp4', 'video/avi', 'video/mov', 'video/mkv'],\n  trace: [\n    'application/zip',\n    'application/x-zip-compressed',\n    'application/octet-stream', // Common for .trace files\n  ],\n  file: [\n    'text/markdown',\n    'text/plain',\n    'application/pdf',\n    'text/x-log',\n    'application/octet-stream', // Sometimes used for .log files\n  ],\n} as const;\n\n/**\n * Service for scanning and processing attachments from Playwright reports\n */\nexport class AttachmentScanner {\n  constructor(private readonly baseDirectory: string) {}\n\n  /**\n   * Scan Playwright report for all attachments\n   */\n  async scanAttachments(\n    report: PlaywrightReport\n  ): Promise<AttachmentScanResult> {\n    const attachments: AttachmentInfo[] = [];\n    const missingFiles: MissingAttachment[] = [];\n\n    // Recursively scan all test suites and specs\n    for (const suite of report.suites || []) {\n      await this.scanSuite(suite, attachments, missingFiles);\n    }\n\n    // Classify attachments by type\n    const result: AttachmentScanResult = {\n      images: [],\n      videos: [],\n      traces: [],\n      files: [],\n      other: [],\n      total: attachments.length,\n      missingFiles,\n      referencedInReport: attachments.length + missingFiles.length,\n    };\n\n    for (const attachment of attachments) {\n      switch (attachment.type) {\n        case 'image':\n          result.images.push(attachment);\n          break;\n        case 'video':\n          result.videos.push(attachment);\n          break;\n        case 'trace':\n          result.traces.push(attachment);\n          break;\n        case 'file':\n          result.files.push(attachment);\n          break;\n        default:\n          result.other.push(attachment);\n          break;\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Recursively scan a test suite for attachments\n   */\n  private async scanSuite(\n    suite: unknown,\n    attachments: AttachmentInfo[],\n    missingFiles: MissingAttachment[]\n  ): Promise<void> {\n    const suiteRecord = suite as Record<string, unknown>;\n\n    // Scan specs in this suite\n    if (Array.isArray(suiteRecord.specs)) {\n      for (const spec of suiteRecord.specs as unknown[]) {\n        await this.scanSpec(spec, attachments, missingFiles);\n      }\n    }\n\n    // Scan nested suites\n    if (Array.isArray(suiteRecord.suites)) {\n      for (const nestedSuite of suiteRecord.suites as unknown[]) {\n        await this.scanSuite(nestedSuite, attachments, missingFiles);\n      }\n    }\n  }\n\n  /**\n   * Scan a spec for attachments\n   */\n  private async scanSpec(\n    spec: unknown,\n    attachments: AttachmentInfo[],\n    missingFiles: MissingAttachment[]\n  ): Promise<void> {\n    const specRecord = spec as Record<string, unknown>;\n    if (!Array.isArray(specRecord.tests)) return;\n\n    for (const test of specRecord.tests as unknown[]) {\n      const testRecord = test as Record<string, unknown>;\n      if (!Array.isArray(testRecord.results)) continue;\n\n      for (const result of testRecord.results as unknown[]) {\n        const resultRecord = result as Record<string, unknown>;\n        if (Array.isArray(resultRecord.attachments)) {\n          for (const attachment of resultRecord.attachments as unknown[]) {\n            const attachmentInfo = await this.processAttachment(\n              attachment,\n              missingFiles\n            );\n            if (attachmentInfo) {\n              attachments.push(attachmentInfo);\n            }\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Process a single attachment and resolve its paths\n   */\n  private async processAttachment(\n    attachment: unknown,\n    missingFiles: MissingAttachment[]\n  ): Promise<AttachmentInfo | null> {\n    if (!attachment || typeof attachment !== 'object') {\n      return null;\n    }\n\n    const attachmentRecord = attachment as Record<string, unknown>;\n    const { name, contentType, path } = attachmentRecord;\n\n    if (\n      !name ||\n      !contentType ||\n      !path ||\n      typeof name !== 'string' ||\n      typeof contentType !== 'string' ||\n      typeof path !== 'string'\n    ) {\n      return null;\n    }\n\n    // Resolve paths\n    const absolutePath = isAbsolute(path)\n      ? path\n      : resolve(this.baseDirectory, path);\n\n    // Check if file exists — track as missing if not found\n    if (!(await exists(absolutePath))) {\n      const type = this.classifyAttachment(contentType, name);\n      missingFiles.push({ name, contentType, path, type });\n      logger.warn(`Attachment file not found: ${absolutePath}`);\n      return null;\n    }\n\n    // Calculate relative path from base directory\n    const relativePath = relative(this.baseDirectory, absolutePath);\n\n    // Determine attachment type\n    const type = this.classifyAttachment(contentType, name);\n\n    return {\n      name,\n      contentType,\n      originalPath: path,\n      relativePath,\n      absolutePath,\n      type,\n    };\n  }\n\n  /**\n   * Classify attachment by content type and name\n   */\n  private classifyAttachment(\n    contentType: string,\n    name: string\n  ): AttachmentInfo['type'] {\n    const lowerContentType = contentType.toLowerCase();\n    const lowerName = name.toLowerCase();\n\n    // Check content type mappings\n    if (CONTENT_TYPE_MAPPING.image.includes(lowerContentType as 'image/png')) {\n      return 'image';\n    }\n\n    if (CONTENT_TYPE_MAPPING.video.includes(lowerContentType as 'video/webm')) {\n      return 'video';\n    }\n\n    if (\n      CONTENT_TYPE_MAPPING.trace.includes(lowerContentType as 'application/zip')\n    ) {\n      // Additional check for trace files by name\n      if (\n        lowerName.includes('trace') ||\n        lowerName.endsWith('.trace') ||\n        lowerName.endsWith('.zip')\n      ) {\n        return 'trace';\n      }\n    }\n\n    if (\n      CONTENT_TYPE_MAPPING.file.includes(lowerContentType as 'text/markdown')\n    ) {\n      return 'file';\n    }\n\n    // Fallback classification by file extension\n    if (\n      lowerName.endsWith('.png') ||\n      lowerName.endsWith('.jpg') ||\n      lowerName.endsWith('.jpeg') ||\n      lowerName.endsWith('.gif') ||\n      lowerName.endsWith('.webp') ||\n      lowerName.endsWith('.svg')\n    ) {\n      return 'image';\n    }\n\n    if (\n      lowerName.endsWith('.webm') ||\n      lowerName.endsWith('.mp4') ||\n      lowerName.endsWith('.avi') ||\n      lowerName.endsWith('.mov')\n    ) {\n      return 'video';\n    }\n\n    if (\n      lowerName.includes('trace') ||\n      lowerName.endsWith('.trace') ||\n      lowerName.endsWith('.zip')\n    ) {\n      return 'trace';\n    }\n\n    if (\n      lowerName.endsWith('.md') ||\n      lowerName.endsWith('.pdf') ||\n      lowerName.endsWith('.txt') ||\n      lowerName.endsWith('.log')\n    ) {\n      return 'file';\n    }\n\n    return 'other';\n  }\n\n  /**\n   * Filter attachments based on configuration flags\n   */\n  static filterAttachments(\n    scanResult: AttachmentScanResult,\n    config: {\n      uploadImages: boolean;\n      uploadVideos: boolean;\n      uploadHtml: boolean;\n      uploadTraces: boolean;\n      uploadFiles: boolean;\n      uploadFullJson: boolean;\n    }\n  ): AttachmentInfo[] {\n    const filtered: AttachmentInfo[] = [];\n\n    // uploadFullJson overrides all other flags\n    if (config.uploadFullJson) {\n      filtered.push(...scanResult.images);\n      filtered.push(...scanResult.videos);\n      filtered.push(...scanResult.files);\n      return filtered;\n    }\n\n    // HTML flag includes images and videos\n    if (config.uploadHtml) {\n      filtered.push(...scanResult.images);\n      filtered.push(...scanResult.videos);\n    }\n\n    // Individual flags (can be combined with HTML flag)\n    if (config.uploadImages && !config.uploadHtml) {\n      filtered.push(...scanResult.images);\n    }\n\n    if (config.uploadVideos && !config.uploadHtml) {\n      filtered.push(...scanResult.videos);\n    }\n\n    if (config.uploadFiles) {\n      filtered.push(...scanResult.files);\n    }\n\n    if (config.uploadTraces) {\n      filtered.push(...scanResult.traces);\n    }\n\n    return filtered;\n  }\n\n  /**\n   * Static version of classifyAttachment for use in static methods\n   */\n  private static classifyAttachmentType(\n    contentType: string,\n    name: string\n  ): AttachmentInfo['type'] {\n    const lowerContentType = contentType.toLowerCase();\n    const lowerName = name.toLowerCase();\n\n    // Check content type mappings\n    if (CONTENT_TYPE_MAPPING.image.includes(lowerContentType as 'image/png')) {\n      return 'image';\n    }\n\n    if (CONTENT_TYPE_MAPPING.video.includes(lowerContentType as 'video/webm')) {\n      return 'video';\n    }\n\n    if (\n      CONTENT_TYPE_MAPPING.trace.includes(lowerContentType as 'application/zip')\n    ) {\n      // Additional check for trace files by name\n      if (\n        lowerName.includes('trace') ||\n        lowerName.endsWith('.trace') ||\n        lowerName.endsWith('.zip')\n      ) {\n        return 'trace';\n      }\n    }\n\n    if (\n      CONTENT_TYPE_MAPPING.file.includes(lowerContentType as 'text/markdown')\n    ) {\n      return 'file';\n    }\n\n    // Fallback classification by file extension\n    if (\n      lowerName.endsWith('.png') ||\n      lowerName.endsWith('.jpg') ||\n      lowerName.endsWith('.jpeg') ||\n      lowerName.endsWith('.gif') ||\n      lowerName.endsWith('.webp') ||\n      lowerName.endsWith('.svg')\n    ) {\n      return 'image';\n    }\n\n    if (\n      lowerName.endsWith('.webm') ||\n      lowerName.endsWith('.mp4') ||\n      lowerName.endsWith('.avi') ||\n      lowerName.endsWith('.mov')\n    ) {\n      return 'video';\n    }\n\n    if (\n      lowerName.includes('trace') ||\n      lowerName.endsWith('.trace') ||\n      lowerName.endsWith('.zip')\n    ) {\n      return 'trace';\n    }\n\n    if (\n      lowerName.endsWith('.md') ||\n      lowerName.endsWith('.pdf') ||\n      lowerName.endsWith('.txt') ||\n      lowerName.endsWith('.log')\n    ) {\n      return 'file';\n    }\n\n    return 'other';\n  }\n\n  /**\n   * Determine what should happen to an attachment path based on config\n   * Returns: 'upload' | 'not-enabled' | 'not-supported' | 'unchanged'\n   */\n  private static getAttachmentPathAction(\n    attachmentRecord: Record<string, unknown>,\n    config: {\n      uploadImages: boolean;\n      uploadVideos: boolean;\n      uploadHtml: boolean;\n      uploadTraces: boolean;\n      uploadFiles: boolean;\n      uploadFullJson: boolean;\n    }\n  ): 'upload' | 'not-enabled' | 'not-supported' | 'unchanged' {\n    const contentType = (attachmentRecord.contentType as string) || '';\n    const name = (attachmentRecord.name as string) || '';\n\n    // Classify the attachment type using the same logic as classifyAttachment\n    const type = this.classifyAttachmentType(contentType, name);\n\n    // uploadFullJson overrides everything\n    if (config.uploadFullJson) {\n      switch (type) {\n        case 'image':\n        case 'video':\n        case 'file':\n          return 'upload';\n        case 'trace':\n          return 'not-supported';\n        default:\n          return 'unchanged';\n      }\n    }\n\n    // Determine action based on type and config\n    switch (type) {\n      case 'image':\n        return config.uploadImages || config.uploadHtml\n          ? 'upload'\n          : 'not-enabled';\n      case 'video':\n        return config.uploadVideos || config.uploadHtml\n          ? 'upload'\n          : 'not-enabled';\n      case 'file':\n        return config.uploadFiles ? 'upload' : 'not-enabled';\n      case 'trace':\n        return config.uploadTraces ? 'upload' : 'not-enabled';\n      default:\n        // Other attachment types are not processed\n        return 'unchanged';\n    }\n  }\n\n  /**\n   * Update attachment paths in the JSON report to use Azure URLs or mark as 'Not Enabled'\n   */\n  static updateAttachmentPaths(\n    report: PlaywrightReport,\n    urlMapping: Map<string, string>,\n    config?: {\n      uploadImages: boolean;\n      uploadVideos: boolean;\n      uploadHtml: boolean;\n      uploadTraces: boolean;\n      uploadFiles: boolean;\n      uploadFullJson: boolean;\n    }\n  ): PlaywrightReport {\n    // Deep clone the report to avoid mutations\n    const updatedReport = JSON.parse(JSON.stringify(report));\n\n    // Keep track of statistics for verbose logging\n    let _uploadedCount = 0;\n    let _notEnabledCount = 0;\n    let _unchangedCount = 0;\n\n    // Keep track of statistics for verbose logging\n    let _notSupportedCount = 0;\n\n    // Counter function\n    const countUpdate = (newPath: string, _originalPath: string) => {\n      if (newPath.startsWith('http')) {\n        _uploadedCount++;\n      } else if (newPath === 'Not Enabled') {\n        _notEnabledCount++;\n      } else if (newPath === 'Not Supported') {\n        _notSupportedCount++;\n      } else {\n        _unchangedCount++;\n      }\n    };\n\n    // Recursively update all attachment paths\n    const updateSuite = (suite: unknown) => {\n      if (Array.isArray((suite as Record<string, unknown>).specs)) {\n        for (const spec of (suite as Record<string, unknown>)\n          .specs as unknown[]) {\n          updateSpec(spec);\n        }\n      }\n\n      if (Array.isArray((suite as Record<string, unknown>).suites)) {\n        for (const nestedSuite of (suite as Record<string, unknown>)\n          .suites as unknown[]) {\n          updateSuite(nestedSuite);\n        }\n      }\n    };\n\n    const updateSpec = (spec: unknown) => {\n      const specRecord = spec as Record<string, unknown>;\n      if (!Array.isArray(specRecord.tests)) return;\n\n      for (const test of specRecord.tests as unknown[]) {\n        const testRecord = test as Record<string, unknown>;\n        if (!Array.isArray(testRecord.results)) continue;\n\n        for (const result of testRecord.results as unknown[]) {\n          const resultRecord = result as Record<string, unknown>;\n          if (Array.isArray(resultRecord.attachments)) {\n            for (const attachment of resultRecord.attachments as unknown[]) {\n              const attachmentRecord = attachment as Record<string, unknown>;\n\n              if (\n                attachmentRecord.path &&\n                typeof attachmentRecord.path === 'string'\n              ) {\n                const originalPath = attachmentRecord.path;\n                let newPath = originalPath;\n\n                // If we have the uploaded URL, use it\n                if (urlMapping.has(originalPath)) {\n                  newPath = urlMapping.get(originalPath) || originalPath;\n                  attachmentRecord.path = newPath;\n                }\n                // If config is provided, determine what action to take\n                else if (config) {\n                  const action = this.getAttachmentPathAction(\n                    attachmentRecord,\n                    config\n                  );\n\n                  switch (action) {\n                    case 'not-enabled':\n                      newPath = 'Not Enabled';\n                      attachmentRecord.path = newPath;\n                      break;\n\n                    case 'not-supported':\n                      newPath = 'Not Supported';\n                      attachmentRecord.path = newPath;\n                      break;\n\n                    case 'upload':\n                    case 'unchanged':\n                    default:\n                      // Leave the original path unchanged\n                      break;\n                  }\n                }\n\n                countUpdate(newPath, originalPath);\n              }\n            }\n          }\n        }\n      }\n    };\n\n    // Update all suites\n    for (const suite of updatedReport.suites || []) {\n      updateSuite(suite);\n    }\n\n    return updatedReport;\n  }\n}\n","import os from 'os';\n\n/**\n * System metadata structure matching server schema\n */\nexport interface SystemMetadata {\n  hostname: string;\n  cpu: {\n    count: number;\n    model: string;\n  };\n  memory: {\n    total: string;\n  };\n  os: string;\n  nodejs: string;\n  playwright: string;\n}\n\n/**\n * Collector for system metadata\n */\nexport class SystemCollector {\n  /**\n   * Gather system metadata\n   */\n  static collect(): SystemMetadata {\n    const hostname = os.hostname() || 'unknown';\n\n    const cpus = os.cpus();\n    const cpuCount = cpus.length || 0;\n    const cpuModel = cpus[0]?.model || 'unknown';\n\n    const totalMemBytes = os.totalmem();\n    const totalMemGB = Math.round(totalMemBytes / 1024 ** 3);\n    const memoryTotal = totalMemBytes > 0 ? `${totalMemGB} GB` : 'unknown';\n\n    const osInfo = `${os.type()} ${os.release()}`;\n    const nodeVersion = process.version || 'unknown';\n\n    let playwrightVersion = 'unknown';\n    try {\n      // Attempt to read Playwright version from package\n      // eslint-disable-next-line @typescript-eslint/no-require-imports\n      const pkg = require('playwright/package.json');\n      playwrightVersion = pkg.version || 'unknown';\n    } catch {\n      // Try alternative paths for Playwright version\n      try {\n        // eslint-disable-next-line @typescript-eslint/no-require-imports\n        const pkg = require('@playwright/test/package.json');\n        playwrightVersion = pkg.version || 'unknown';\n      } catch {\n        // Keep default 'unknown'\n      }\n    }\n\n    return {\n      hostname,\n      cpu: {\n        count: cpuCount,\n        model: cpuModel,\n      },\n      memory: {\n        total: memoryTotal,\n      },\n      os: osInfo,\n      nodejs: nodeVersion,\n      playwright: playwrightVersion,\n    };\n  }\n}\n","import type { Config } from '@/config';\nimport {\n  AuthenticationError,\n  NetworkError,\n  UsageLimitError,\n  UsageLimitData,\n} from '@/types';\nimport { VERSION } from '@/version';\n\n// Upload endpoint relative to base API URL\nconst UPLOAD_ENDPOINT = '/api/reports/playwright';\n\n/**\n * Response payload from the TestDino API when uploading a report\n */\nexport interface ReportUploadResponse {\n  testRunId: string;\n  organizationId?: string;\n  projectId?: string;\n  viewUrl?: string;\n  status?: string;\n  warnings?: string[];\n}\n\n/**\n * Client for communicating with the TestDino API\n */\nexport class ApiClient {\n  private readonly baseUrl: string;\n\n  private readonly apiKey: string;\n\n  constructor(config: Config) {\n    this.baseUrl = config.apiUrl;\n    this.apiKey = config.token;\n  }\n\n  /**\n   * Headers to include on every API request\n   */\n  private getHeaders(): Record<string, string> {\n    return {\n      'Content-Type': 'application/json',\n      'User-Agent': `tdpw/${VERSION}`,\n      'X-API-Key': this.apiKey,\n    };\n  }\n\n  /**\n   * Upload a JSON payload to the TestDino API with enhanced error handling\n   * @param payload The data to upload (report + metadata)\n   */\n  async uploadReport(payload: unknown): Promise<ReportUploadResponse> {\n    const url = `${this.baseUrl}${UPLOAD_ENDPOINT}`;\n    let response: Response;\n\n    try {\n      response = await fetch(url, {\n        method: 'POST',\n        headers: this.getHeaders(),\n        body: JSON.stringify(payload),\n      });\n    } catch (error) {\n      // Handle network-level errors (DNS, connection refused, etc.)\n      const errorMessage =\n        error instanceof Error ? error.message : 'Unknown network error';\n\n      throw new NetworkError(\n        `Failed to connect to TestDino API: ${errorMessage}`\n      );\n    }\n\n    // Handle HTTP error responses\n    if (!response.ok) {\n      await this.handleHttpError(response);\n    }\n\n    // Parse JSON response\n    let json: unknown;\n    try {\n      json = await response.json();\n    } catch (error) {\n      throw new NetworkError(\n        `Invalid JSON response from API: ${error instanceof Error ? error.message : 'Parse error'}`\n      );\n    }\n\n    // Extract response data\n    const result = this.parseUploadResponse(json);\n    return result;\n  }\n\n  /**\n   * Handle HTTP error responses with detailed error messages\n   */\n  private async handleHttpError(response: Response): Promise<never> {\n    let errorBody: string;\n    try {\n      errorBody = await response.text();\n    } catch {\n      errorBody = 'Unable to read error response';\n    }\n\n    switch (response.status) {\n      case 401:\n        throw new AuthenticationError('Invalid API key or unauthorized access');\n\n      case 403:\n        throw new AuthenticationError(\n          'API key does not have permission to upload reports'\n        );\n\n      case 400:\n        throw new NetworkError(\n          `Bad request - Invalid data format: ${errorBody}`\n        );\n\n      case 413:\n        throw new NetworkError(\n          'Report payload too large - consider uploading without HTML/traces'\n        );\n\n      case 429:\n        throw new NetworkError(\n          'Rate limit exceeded - please wait before retrying'\n        );\n\n      case 500:\n      case 502:\n      case 503:\n      case 504:\n        throw new NetworkError(\n          `TestDino API server error (${response.status}) - please try again later`\n        );\n\n      default:\n        throw new NetworkError(\n          `HTTP ${response.status}: ${errorBody || response.statusText}`\n        );\n    }\n  }\n\n  /**\n   * Parse and validate the upload response\n   */\n  private parseUploadResponse(json: unknown): ReportUploadResponse {\n    if (!json || typeof json !== 'object') {\n      throw new NetworkError('Invalid response format - expected JSON object');\n    }\n\n    // Check for usage limit error (HTTP 200 with success: false)\n    this.checkForUsageLimitError(json);\n\n    // Handle different response structures\n    let responseData: ReportUploadResponse;\n\n    // Check for direct response\n    if ('testRunId' in json) {\n      responseData = json as ReportUploadResponse;\n    }\n    // Check for wrapped response\n    else if (\n      'data' in json &&\n      json.data &&\n      typeof json.data === 'object' &&\n      'testRunId' in json.data\n    ) {\n      responseData = json.data as ReportUploadResponse;\n    }\n    // Check for success wrapper\n    else if (\n      'success' in json &&\n      'result' in json &&\n      json.result &&\n      typeof json.result === 'object' &&\n      'testRunId' in json.result\n    ) {\n      responseData = json.result as ReportUploadResponse;\n    } else {\n      throw new NetworkError(\n        `Unexpected API response structure: ${JSON.stringify(json)}`\n      );\n    }\n\n    // Validate required fields\n    if (!responseData.testRunId || typeof responseData.testRunId !== 'string') {\n      throw new NetworkError('API response missing required testRunId field');\n    }\n\n    // Build response object\n    const result: ReportUploadResponse = {\n      testRunId: responseData.testRunId,\n    };\n\n    // Add optional fields if present\n    if (\n      responseData.organizationId &&\n      typeof responseData.organizationId === 'string'\n    ) {\n      result.organizationId = responseData.organizationId;\n    }\n\n    if (responseData.projectId && typeof responseData.projectId === 'string') {\n      result.projectId = responseData.projectId;\n    }\n\n    if (responseData.viewUrl && typeof responseData.viewUrl === 'string') {\n      result.viewUrl = responseData.viewUrl;\n    }\n\n    if (responseData.status && typeof responseData.status === 'string') {\n      result.status = responseData.status;\n    }\n\n    // Extract warnings array if present\n    if (Array.isArray(responseData.warnings)) {\n      result.warnings = responseData.warnings.filter(\n        (w): w is string => typeof w === 'string'\n      );\n    }\n\n    return result;\n  }\n\n  /**\n   * Check for usage limit error in API response\n   * Server returns HTTP 200 with success: false and either:\n   * - data.code: \"QUOTA_LIMIT_EXCEEDED\" (with full usage data)\n   * - message containing quota-related keywords (minimal response)\n   */\n  private checkForUsageLimitError(json: unknown): void {\n    if (!json || typeof json !== 'object') return;\n\n    const response = json as Record<string, unknown>;\n\n    // Only check if success is explicitly false\n    if (response.success !== false) return;\n\n    const message =\n      typeof response.message === 'string' ? response.message : '';\n    const lowerMessage = message.toLowerCase();\n\n    // Check for usage limit error by code or message pattern\n    const data =\n      response.data && typeof response.data === 'object'\n        ? (response.data as Record<string, unknown>)\n        : {};\n\n    const isUsageLimitError =\n      data.code === 'QUOTA_LIMIT_EXCEEDED' ||\n      lowerMessage.includes('limit reached') ||\n      lowerMessage.includes('test case limit') ||\n      lowerMessage.includes('allocation exhausted') ||\n      lowerMessage.includes('quota') ||\n      lowerMessage.includes('execution allocation');\n\n    if (isUsageLimitError) {\n      // Map server field names (planName/orgLimit/orgUsed) to CLI fields (tier/limit/used)\n      const usageData: UsageLimitData = {\n        tier:\n          typeof data.planName === 'string'\n            ? data.planName\n            : typeof data.tier === 'string'\n              ? data.tier\n              : 'unknown',\n        limit:\n          typeof data.orgLimit === 'number'\n            ? data.orgLimit\n            : typeof data.limit === 'number'\n              ? data.limit\n              : 0,\n        used:\n          typeof data.orgUsed === 'number'\n            ? data.orgUsed\n            : typeof data.used === 'number'\n              ? data.used\n              : 0,\n        remaining:\n          typeof data.orgRemaining === 'number'\n            ? data.orgRemaining\n            : typeof data.remaining === 'number'\n              ? data.remaining\n              : 0,\n        resetDate:\n          typeof data.resetDate === 'string'\n            ? data.resetDate\n            : new Date().toISOString(),\n      };\n\n      // Add optional fields if present in response\n      if (typeof data.organizationId === 'string') {\n        usageData.organizationId = data.organizationId;\n      }\n      if (typeof data.projectName === 'string') {\n        usageData.projectName = data.projectName;\n      }\n      if (typeof data.projectAllocated === 'number') {\n        usageData.projectLimit = data.projectAllocated;\n      } else if (typeof data.projectLimit === 'number') {\n        usageData.projectLimit = data.projectLimit;\n      }\n      if (typeof data.projectUsed === 'number') {\n        usageData.projectUsed = data.projectUsed;\n      }\n      if (typeof data.projectBorrowed === 'number') {\n        usageData.projectBorrowed = data.projectBorrowed;\n      }\n\n      throw new UsageLimitError(message || 'Usage limit exceeded.', usageData);\n    }\n  }\n\n  /**\n   * Health check endpoint to verify API connectivity\n   */\n  async healthCheck(): Promise<boolean> {\n    try {\n      const response = await fetch(`${this.baseUrl}/api/health`, {\n        method: 'GET',\n        headers: {\n          'User-Agent': `tdpw/${VERSION}`,\n        },\n      });\n      return response.ok;\n    } catch {\n      return false;\n    }\n  }\n}\n","import type { Config } from '@/config';\nimport { AuthenticationError, NetworkError } from '@/types';\nimport { VERSION } from '@/version';\n\n// Endpoint for SAS token\nconst SAS_ENDPOINT = '/api/storage/token';\n\n/**\n * Response structure for SAS token request (based on actual API response)\n */\nexport interface SasTokenResponse {\n  // Token ID for tracking\n  tokenId: string;\n  // SAS token string (e.g., 'sv=2025-05-05&spr=https&st=...')\n  sasToken: string;\n  // Container URL (e.g., 'https://testreportx.blob.core.windows.net/staging-data')\n  containerUrl: string;\n  // Path prefix for uploads (e.g., '2025/06/16/mbywj9boxoxqogznm')\n  blobPath: string;\n  // Unique identifier\n  uniqueId: string;\n  // Expiration timestamp ISO\n  expiresAt: string;\n  // Maximum file size\n  maxSize: number;\n  // Permissions array\n  permissions: string[];\n  // Allowed file types for upload\n  allowedFileTypes: string[];\n}\n\n/**\n * Internal wrapper for SAS token HTTP response\n */\ninterface RawSasResponse {\n  success?: unknown;\n  data?: unknown;\n  message?: unknown;\n}\n\n/**\n * Service to request and manage Azure SAS tokens from TestDino API\n */\nexport class SasTokenService {\n  private readonly baseUrl: string;\n\n  private readonly apiKey: string;\n\n  constructor(private readonly config: Config) {\n    this.baseUrl = config.apiUrl;\n    this.apiKey = config.token;\n  }\n\n  /**\n   * Headers to include on every SAS token request\n   */\n  private getHeaders(): Record<string, string> {\n    return {\n      'Content-Type': 'application/json',\n      'User-Agent': `tdpw/${VERSION}`,\n      'X-API-Key': this.apiKey, // Fixed: was 'X-API-key', now matches curl\n    };\n  }\n\n  /**\n   * Request a SAS token from TestDino API using POST method\n   */\n  async requestSasToken(): Promise<SasTokenResponse> {\n    const url = `${this.baseUrl}${SAS_ENDPOINT}`;\n    let response: Response;\n\n    try {\n      // Fixed: Use POST method with proper headers as shown in curl\n      response = await fetch(url, {\n        method: 'POST', // Changed from GET to POST\n        headers: this.getHeaders(),\n        // Empty body for POST request\n        body: JSON.stringify({}),\n      });\n    } catch (error) {\n      throw new NetworkError(\n        `Network error requesting SAS token: ${(error as Error).message}`\n      );\n    }\n\n    // Handle HTTP error responses\n    if (!response.ok) {\n      await this.handleSasError(response);\n    }\n\n    // Parse JSON response\n    let data: unknown;\n    try {\n      data = await response.json();\n    } catch (error) {\n      throw new NetworkError(\n        `Failed to parse SAS token response: ${(error as Error).message}`\n      );\n    }\n\n    // Validate and extract SAS token data\n    return this.validateSasResponse(data);\n  }\n\n  /**\n   * Handle HTTP error responses with detailed error messages\n   */\n  private async handleSasError(response: Response): Promise<never> {\n    let errorBody: string;\n    try {\n      errorBody = await response.text();\n    } catch {\n      errorBody = 'Unable to read error response';\n    }\n\n    switch (response.status) {\n      case 401:\n        throw new AuthenticationError('Invalid API key for SAS token request');\n\n      case 403:\n        throw new AuthenticationError(\n          'API key does not have permission to request SAS tokens'\n        );\n\n      case 400:\n        throw new NetworkError(`Bad SAS token request: ${errorBody}`);\n\n      case 404:\n        throw new NetworkError(\n          `SAS token endpoint not found (${response.status}): ${errorBody}`\n        );\n\n      case 429:\n        throw new NetworkError('Rate limit exceeded for SAS token requests');\n\n      case 500:\n      case 502:\n      case 503:\n      case 504:\n        throw new NetworkError(\n          `Server error requesting SAS token (${response.status}) - please try again later`\n        );\n\n      default:\n        throw new NetworkError(\n          `SAS token request failed: HTTP ${response.status} - ${errorBody}`\n        );\n    }\n  }\n\n  /**\n   * Validate and parse the SAS token response (updated for actual API format)\n   */\n  private validateSasResponse(data: unknown): SasTokenResponse {\n    if (!data || typeof data !== 'object') {\n      throw new NetworkError(\n        'Invalid SAS token response format - expected JSON object'\n      );\n    }\n\n    const response = data as RawSasResponse;\n\n    // Check for success wrapper format\n    if (\n      response.success !== true ||\n      response.data == null ||\n      typeof response.data !== 'object'\n    ) {\n      const message =\n        typeof response.message === 'string'\n          ? response.message\n          : 'Unknown error';\n      throw new NetworkError(`SAS token request failed: ${message}`);\n    }\n\n    const sasData = response.data as Record<string, unknown>;\n\n    // Validate required fields based on actual API response\n    const requiredFields = [\n      'tokenId',\n      'sasToken',\n      'containerUrl',\n      'blobPath',\n      'uniqueId',\n      'expiresAt',\n    ];\n    const missingFields = requiredFields.filter(field => !(field in sasData));\n\n    if (missingFields.length > 0) {\n      throw new NetworkError(\n        `SAS token response missing required fields: ${missingFields.join(', ')}`\n      );\n    }\n\n    // Validate field types\n    if (typeof sasData.tokenId !== 'string') {\n      throw new NetworkError('SAS token response: tokenId must be a string');\n    }\n\n    if (typeof sasData.sasToken !== 'string') {\n      throw new NetworkError('SAS token response: sasToken must be a string');\n    }\n\n    if (typeof sasData.containerUrl !== 'string') {\n      throw new NetworkError(\n        'SAS token response: containerUrl must be a string'\n      );\n    }\n\n    if (typeof sasData.expiresAt !== 'string') {\n      throw new NetworkError('SAS token response: expiresAt must be a string');\n    }\n\n    // Validate container URL format\n    try {\n      new URL(sasData.containerUrl as string);\n    } catch {\n      throw new NetworkError(\n        `Invalid containerUrl format: ${sasData.containerUrl}`\n      );\n    }\n\n    const result: SasTokenResponse = {\n      tokenId: sasData.tokenId as string,\n      sasToken: sasData.sasToken as string,\n      containerUrl: sasData.containerUrl as string,\n      blobPath: sasData.blobPath as string,\n      uniqueId: sasData.uniqueId as string,\n      expiresAt: sasData.expiresAt as string,\n      maxSize:\n        typeof sasData.maxSize === 'number' ? sasData.maxSize : 2147483648, // 2GB default\n      permissions: Array.isArray(sasData.permissions)\n        ? (sasData.permissions as string[])\n        : [],\n      allowedFileTypes: Array.isArray(sasData.allowedFileTypes)\n        ? (sasData.allowedFileTypes as string[])\n        : [],\n    };\n\n    return result;\n  }\n\n  /**\n   * Check if SAS token is expired (updated for actual API format)\n   */\n  isTokenExpired(sasResponse: SasTokenResponse): boolean {\n    try {\n      const expirationDate = new Date(sasResponse.expiresAt);\n      const now = new Date();\n\n      // Add small buffer (5 minutes) to account for clock skew\n      const bufferMs = 5 * 60 * 1000;\n      return expirationDate.getTime() - bufferMs <= now.getTime();\n    } catch {\n      // If we can't parse the date, assume it's expired for safety\n      return true;\n    }\n  }\n\n  /**\n   * Get time until SAS token expires (in minutes)\n   */\n  getTimeUntilExpiry(sasResponse: SasTokenResponse): number {\n    try {\n      const expirationDate = new Date(sasResponse.expiresAt);\n      const now = new Date();\n      const diffMs = expirationDate.getTime() - now.getTime();\n      return Math.floor(diffMs / (60 * 1000)); // Convert to minutes\n    } catch {\n      return 0;\n    }\n  }\n}\n","import { isDirectory, readDir, isFile } from '@/utils/fs';\nimport { FileSystemError } from '@/types';\nimport { isVerboseMode } from '@/utils/verbose';\n\n/**\n * Recursively collect all file paths under a directory\n */\nexport async function collectFilePaths(dir: string): Promise<string[]> {\n  const files: string[] = [];\n  try {\n    const entries = await readDir(dir);\n    for (const entry of entries) {\n      if (await isDirectory(entry)) {\n        const nested = await collectFilePaths(entry);\n        files.push(...nested);\n      } else if (await isFile(entry)) {\n        files.push(entry);\n      }\n    }\n    return files;\n  } catch (error) {\n    throw new FileSystemError(\n      `Failed to collect files from directory: ${dir}`,\n      error as Error\n    );\n  }\n}\n\n/**\n * File extension sets for filtering HTML report uploads\n */\nconst HTML_REPORT_ALLOWED_EXTENSIONS = new Set([\n  // HTML files\n  'html',\n  'htm',\n  // CSS and JavaScript (needed for HTML reports)\n  'css',\n  'js',\n  'mjs',\n  // Images\n  'png',\n  'jpg',\n  'jpeg',\n  'gif',\n  'webp',\n  'svg',\n  'bmp',\n  'tiff',\n  // Videos\n  'webm',\n  'mp4',\n  'avi',\n  'mov',\n  'mkv',\n  // Other web assets (excluding json)\n  'ico',\n  'woff',\n  'woff2',\n  'ttf',\n  'eot',\n]);\n\n/**\n * Check if a file should be included in HTML report uploads\n */\nexport function isAllowedForHtmlUpload(\n  filePath: string,\n  config?: {\n    uploadImages: boolean;\n    uploadVideos: boolean;\n    uploadHtml: boolean;\n  }\n): boolean {\n  const ext = filePath.toLowerCase().split('.').pop() || '';\n\n  // If no config provided, use the default behavior (all allowed extensions)\n  if (!config) {\n    return HTML_REPORT_ALLOWED_EXTENSIONS.has(ext);\n  }\n\n  // HTML, CSS, JS, and web assets only allowed with --upload-html\n  const webAssets = [\n    'html',\n    'htm',\n    'css',\n    'js',\n    'mjs',\n    'ico',\n    'woff',\n    'woff2',\n    'ttf',\n    'eot',\n  ];\n  if (webAssets.includes(ext)) {\n    return config.uploadHtml;\n  }\n\n  // Exclude files with \"trace\" in the name for HTML uploads\n  const fileName = filePath.toLowerCase().split('/').pop() || '';\n  if (config.uploadHtml && fileName.includes('trace')) {\n    return false;\n  }\n\n  // Apply filtering based on config for media files\n  const imageExtensions = [\n    'png',\n    'jpg',\n    'jpeg',\n    'gif',\n    'webp',\n    'svg',\n    'bmp',\n    'tiff',\n  ];\n  const videoExtensions = ['webm', 'mp4', 'avi', 'mov', 'mkv'];\n\n  if (imageExtensions.includes(ext)) {\n    return config.uploadImages || config.uploadHtml;\n  }\n\n  if (videoExtensions.includes(ext)) {\n    return config.uploadVideos || config.uploadHtml;\n  }\n\n  // Other extensions not allowed\n  return false;\n}\n\n/**\n * Recursively collect file paths with optional filtering for HTML uploads\n */\nexport async function collectFilePathsForHtml(\n  dir: string,\n  filterForHtml: boolean = false,\n  config?: {\n    uploadImages: boolean;\n    uploadVideos: boolean;\n    uploadHtml: boolean;\n  }\n): Promise<string[]> {\n  const files: string[] = [];\n  const skippedFiles: string[] = [];\n\n  try {\n    const entries = await readDir(dir);\n    for (const entry of entries) {\n      if (await isDirectory(entry)) {\n        // Skip trace directories when uploading HTML\n        const dirName = entry.toLowerCase().split('/').pop() || '';\n        if (config?.uploadHtml && dirName.includes('trace')) {\n          continue; // Skip trace directories silently\n        }\n\n        const nested = await collectFilePathsForHtml(\n          entry,\n          filterForHtml,\n          config\n        );\n        files.push(...nested);\n      } else if (await isFile(entry)) {\n        // Apply filtering if requested\n        if (!filterForHtml || isAllowedForHtmlUpload(entry, config)) {\n          files.push(entry);\n        } else if (filterForHtml) {\n          skippedFiles.push(entry);\n        }\n      }\n    }\n\n    if (\n      filterForHtml &&\n      skippedFiles.length > 0 &&\n      (process.env.LOG_LEVEL === 'debug' || isVerboseMode())\n    ) {\n      console.log(\n        `🚫 Filtered ${skippedFiles.length} files (traces, logs, etc.)`\n      );\n    }\n\n    return files;\n  } catch (error) {\n    throw new FileSystemError(\n      `Failed to collect files from directory: ${dir}`,\n      error as Error\n    );\n  }\n}\n\n/**\n * Basic content-type detection based on file extension\n */\nexport function getContentType(filePath: string): string {\n  const ext = filePath.toLowerCase().split('.').pop() || '';\n  switch (ext) {\n    case 'html':\n      return 'text/html';\n    case 'css':\n      return 'text/css';\n    case 'js':\n      return 'application/javascript';\n    case 'json':\n      return 'application/json';\n    case 'png':\n      return 'image/png';\n    case 'jpg':\n    case 'jpeg':\n      return 'image/jpeg';\n    case 'svg':\n      return 'image/svg+xml';\n    case 'webm':\n      return 'video/webm';\n    case 'webp':\n      return 'image/webp';\n    case 'zip':\n      return 'application/zip';\n    case 'txt':\n      return 'text/plain';\n    case 'md':\n      return 'text/plain; charset=utf-8';\n    case 'pdf':\n      return 'application/pdf';\n    case 'log':\n      return 'text/plain; charset=utf-8';\n    default:\n      return 'application/octet-stream';\n  }\n}\n","import type { SasTokenResponse } from './sas';\nimport {\n  collectFilePaths,\n  collectFilePathsForHtml,\n  getContentType,\n} from '@/utils/files';\nimport { readFileBuffer } from '@/utils/fs';\nimport { withFileUploadRetry } from '@/utils/retry';\nimport { isVerboseMode } from '@/utils/verbose';\nimport { logger } from '@/utils/logger';\n\n/**\n * Upload progress callback type\n */\ntype ProgressCallback = (\n  uploadedFiles: number,\n  totalFiles: number,\n  currentFile: string\n) => void;\n\n/**\n * Azure storage client configured with SAS-based authentication\n */\nexport class AzureStorageClient {\n  private readonly sasResponse: SasTokenResponse;\n\n  constructor(sasResponse: SasTokenResponse) {\n    this.sasResponse = sasResponse;\n  }\n\n  /**\n   * Upload a single file using the SAS token response format\n   */\n  async uploadFile(filePath: string, blobPath: string): Promise<string> {\n    // Pre-validate file type before attempting upload\n    const allowedTypes = this.sasResponse.allowedFileTypes;\n    const fileExtension = filePath.split('.').pop()?.toLowerCase() || '';\n\n    if (allowedTypes.length > 0 && !allowedTypes.includes(fileExtension)) {\n      throw new Error(\n        `File type '${fileExtension}' not allowed. Allowed types: ${allowedTypes.join(', ')}`\n      );\n    }\n\n    // Build the complete upload URL using the SAS response format\n    const { containerUrl, blobPath: pathPrefix } = this.sasResponse;\n\n    // Combine path prefix with blob path\n    const fullBlobPath = `${pathPrefix}/${blobPath}`;\n\n    // Build upload URL (containerUrl + path + SAS token)\n    const uploadUrl = `${containerUrl}/${fullBlobPath}?${this.sasResponse.sasToken}`;\n\n    // Read file data\n    const data = await readFileBuffer(filePath);\n\n    // Detect content type\n    const contentType = getContentType(filePath);\n\n    // Validate file size\n    if (data.length > this.sasResponse.maxSize) {\n      const sizeMB = Math.round(data.length / (1024 * 1024));\n      const maxSizeMB = Math.round(this.sasResponse.maxSize / (1024 * 1024));\n      throw new Error(`File too large: ${sizeMB}MB (max: ${maxSizeMB}MB)`);\n    }\n\n    // Prepare headers based on example upload format\n    const headers: Record<string, string> = {\n      'x-ms-blob-type': 'BlockBlob',\n      'Content-Type': contentType,\n      'Content-Length': data.length.toString(),\n    };\n\n    // Upload file using PUT request\n    const response = await fetch(uploadUrl, {\n      method: 'PUT',\n      headers,\n      body: data,\n    });\n\n    if (!response.ok) {\n      const errorText = await response.text();\n      throw new Error(\n        `TestDino platform upload failed: ${response.status} ${errorText}`\n      );\n    }\n\n    // Return the public URL (without SAS token for public access)\n    return `${this.sasResponse.containerUrl}/${fullBlobPath}`;\n  }\n}\n\n/**\n * Service to upload files to Azure Blob Storage using SAS credentials with optimal concurrency\n */\nexport class AzureUploadService {\n  private readonly maxConcurrentUploads = 5; // Optimal for most scenarios\n\n  constructor(private readonly storageClient: AzureStorageClient) {}\n\n  /**\n   * Upload an entire directory of files with concurrent uploads and progress tracking\n   * @param localDir Local directory path\n   * @param prefix Additional prefix for blob paths (optional)\n   * @param onProgress Progress callback (optional)\n   * @param preFilteredPaths Optional pre-filtered file paths (if not provided, will collect all files)\n   */\n  async uploadDirectory(\n    localDir: string,\n    prefix: string = '',\n    onProgress?: ProgressCallback,\n    preFilteredPaths?: string[]\n  ): Promise<string[]> {\n    // Use provided file paths or collect all files recursively\n    const filePaths = preFilteredPaths || (await collectFilePaths(localDir));\n\n    const uploadedUrls: string[] = [];\n    let uploadedCount = 0;\n\n    // Upload files in batches for optimal performance\n    const batches = this.createBatches(filePaths, this.maxConcurrentUploads);\n\n    for (const batch of batches) {\n      // Upload batch concurrently\n      const batchPromises = batch.map(async filePath => {\n        try {\n          // Compute blob path: prefix + relative path from directory\n          const relativePath = this.getRelativePath(filePath, localDir);\n          const blobPath = prefix ? `${prefix}/${relativePath}` : relativePath;\n\n          // Upload with retry logic\n          const uploadUrl = await withFileUploadRetry(\n            async () => this.storageClient.uploadFile(filePath, blobPath),\n            filePath\n          );\n\n          uploadedUrls.push(uploadUrl);\n          uploadedCount++;\n\n          // Report progress\n          if (onProgress) {\n            onProgress(uploadedCount, filePaths.length, relativePath);\n          }\n\n          return uploadUrl;\n        } catch (_error) {\n          // Show warnings only for critical files or if verbose is enabled\n          const isImportantFile =\n            filePath.includes('index.html') || filePath.includes('.json');\n          if (isImportantFile || isVerboseMode()) {\n            const fileName = filePath.split('/').pop() || filePath;\n            logger.warn(`Skipped: ${fileName}`);\n          }\n          return null;\n        }\n      });\n\n      // Wait for current batch to complete before starting next\n      const results = await Promise.all(batchPromises);\n\n      // Filter out null results (skipped files)\n      results.filter(url => url !== null) as string[];\n      // Note: uploadedUrls is already populated in the map function above\n    }\n\n    return uploadedUrls;\n  }\n\n  /**\n   * Get relative path from a local directory, ensuring proper path handling\n   */\n  private getRelativePath(filePath: string, localDir: string): string {\n    // Normalize paths to handle different OS separators\n    const normalizedFilePath = filePath.replace(/\\\\/g, '/');\n    const normalizedLocalDir = localDir.replace(/\\\\/g, '/').replace(/\\/$/, '');\n\n    // Remove the local directory prefix to get relative path\n    let relativePath = normalizedFilePath.replace(`${normalizedLocalDir}/`, '');\n\n    // Handle edge case where local dir doesn't end with /\n    if (relativePath === normalizedFilePath) {\n      relativePath = normalizedFilePath.replace(normalizedLocalDir, '');\n      if (relativePath.startsWith('/')) {\n        relativePath = relativePath.substring(1);\n      }\n    }\n\n    return relativePath;\n  }\n\n  /**\n   * Create batches of files for concurrent upload\n   */\n  private createBatches<T>(items: T[], batchSize: number): T[][] {\n    const batches: T[][] = [];\n    for (let i = 0; i < items.length; i += batchSize) {\n      batches.push(items.slice(i, i + batchSize));\n    }\n    return batches;\n  }\n\n  /**\n   * Upload with progress reporting and detailed feedback\n   */\n  async uploadDirectoryWithProgress(\n    localDir: string,\n    prefix: string = ''\n  ): Promise<string[]> {\n    return this.uploadDirectory(localDir, prefix);\n  }\n\n  /**\n   * Upload HTML directory with filtering based on upload configuration\n   */\n  async uploadHtmlDirectoryWithProgress(\n    localDir: string,\n    prefix: string = '',\n    config?: {\n      uploadImages: boolean;\n      uploadVideos: boolean;\n      uploadHtml: boolean;\n    }\n  ): Promise<string[]> {\n    const filePaths = await collectFilePathsForHtml(localDir, true, config);\n\n    const uploadedUrls = await this.uploadDirectory(\n      localDir,\n      prefix,\n      undefined,\n      filePaths\n    );\n\n    return uploadedUrls;\n  }\n}\n","/**\n * Enhanced Upload Service - Complete Integration\n * Implements the full upload flow: Azure files → JSON + URLs → TestDino API\n */\n\nimport { dirname } from 'path';\nimport type { Config } from '@/config';\nimport { parsePlaywrightJson, PlaywrightReport } from '@/core/parser';\nimport {\n  AttachmentScanner,\n  AttachmentInfo,\n  AttachmentScanResult,\n} from '@/core/attachments';\nimport { GitCollector, GitMetadata } from '@/collectors/git';\nimport { CiCollector, CiMetadata } from '@/collectors/ci';\nimport { SystemCollector, SystemMetadata } from '@/collectors/system';\nimport { ApiClient, ReportUploadResponse } from './api';\nimport { SasTokenService } from './sas';\nimport { AzureStorageClient, AzureUploadService } from './azure';\nimport { createProgressTracker } from '@/utils/progress';\nimport { createProgressBar } from '@/utils/ui';\nimport { logger } from '@/utils/logger';\nimport { withRetry } from '@/utils/retry';\nimport { NetworkError } from '@/types';\n\n/**\n * Azure upload result for HTML reports and attachment URL mappings\n */\ninterface AzureUploadResult {\n  status: 'uploaded' | 'disabled' | 'failed' | 'not-found';\n  url: string;\n  urlMapping: Map<string, string>; // Maps original attachment paths to Azure URLs\n}\n\n/**\n * Final payload structure matching sample-report.json format\n */\ninterface FinalPayload {\n  config: PlaywrightReport['config'];\n  suites: PlaywrightReport['suites'];\n  stats: PlaywrightReport['stats'];\n  errors: PlaywrightReport['errors'];\n  metadata: CompleteMetadata;\n}\n\n/**\n * Test configuration metadata extracted from Playwright report\n */\ninterface TestMetadata {\n  framework: {\n    name: string;\n    version: string;\n  };\n  config: {\n    browsers: Array<{\n      browserId: string;\n      name: string;\n      version: string;\n      viewport: string;\n      headless: boolean;\n      repeatEach: number;\n      retries: number;\n      testDir: string;\n      outputDir: string;\n    }>;\n    actualWorkers: number;\n    timeout: number;\n    preserveOutput: string;\n    reporters: Array<{ name: string; options: unknown }>;\n    grep: unknown;\n    grepInvert: unknown;\n    fullyParallel: boolean;\n    forbidOnly: boolean;\n    projects: number;\n    shard: unknown;\n  };\n  customTags: string[];\n}\n\n/**\n * Complete metadata structure matching sample-report.json\n */\ninterface CompleteMetadata {\n  git: GitMetadata;\n  ci: CiMetadata;\n  system: SystemMetadata;\n  test: TestMetadata;\n  azureUpload?: AzureUploadResult;\n}\n\n/**\n * Service to upload Playwright report and metadata to TestDino\n */\nexport class UploadService {\n  private readonly apiClient: ApiClient;\n\n  private readonly sasService: SasTokenService;\n\n  constructor(private readonly config: Config) {\n    this.apiClient = new ApiClient(config);\n    this.sasService = new SasTokenService(config);\n  }\n\n  /**\n   * Get report directory from JSON file path\n   */\n  private getReportDirectory(jsonPath: string): string {\n    return dirname(jsonPath);\n  }\n\n  /**\n   * Generate unique Azure blob path for attachment using UUID\n   * This eliminates any possibility of path collisions regardless of directory structure\n   */\n  private createJsonAttachmentPath(attachment: AttachmentInfo): string {\n    // Generate a unique ID for this attachment\n    const uniqueId = this.generateUniqueId();\n\n    // Get file extension from original path or content type\n    const fileExtension = this.getFileExtension(attachment);\n\n    // Create clean, unique path: json/attachments/{uniqueId}.{extension}\n    return `json/attachments/${uniqueId}${fileExtension}`;\n  }\n\n  /**\n   * Generate unique Azure blob path for trace attachment using UUID\n   * Places traces in the same location as other attachments\n   */\n  private createJsonTraceAttachmentPath(attachment: AttachmentInfo): string {\n    // Generate a unique ID for this attachment\n    const uniqueId = this.generateUniqueId();\n\n    // Ensure trace files have .zip extension for proper viewer compatibility\n    let fileExtension = this.getFileExtension(attachment);\n    if (!fileExtension.includes('.zip')) {\n      fileExtension = '.zip';\n    }\n\n    // Create clean, unique path: json/attachments/traces/{uniqueId}.zip\n    return `json/traces/${uniqueId}${fileExtension}`;\n  }\n\n  /**\n   * Generate a unique identifier for attachments\n   * Uses timestamp + random string for uniqueness\n   */\n  private generateUniqueId(): string {\n    const timestamp = Date.now().toString(36); // Base36 timestamp\n    const random = Math.random().toString(36).substring(2, 8); // 6 random chars\n    return `${timestamp}_${random}`;\n  }\n\n  /**\n   * Extract file extension from attachment info\n   */\n  private getFileExtension(attachment: AttachmentInfo): string {\n    // First try to get extension from original path\n    const pathParts = attachment.originalPath.split('.');\n    if (pathParts.length > 1) {\n      const extension = pathParts[pathParts.length - 1];\n      if (extension) {\n        return `.${extension.toLowerCase()}`;\n      }\n    }\n\n    // Fallback: derive from content type\n    const contentType = attachment.contentType.toLowerCase();\n    if (contentType.includes('png')) return '.png';\n    if (contentType.includes('jpeg') || contentType.includes('jpg'))\n      return '.jpg';\n    if (contentType.includes('gif')) return '.gif';\n    if (contentType.includes('webp')) return '.webp';\n    if (contentType.includes('svg')) return '.svg';\n    if (contentType.includes('webm')) return '.webm';\n    if (contentType.includes('mp4')) return '.mp4';\n    if (contentType.includes('zip')) return '.zip';\n\n    // Default fallback\n    return '.bin';\n  }\n\n  /**\n   * Main upload orchestration method\n   * Flow: Collect Metadata → Upload Azure Files → Send JSON + URLs to API\n   */\n  async uploadReport(\n    jsonPath: string,\n    htmlDir?: string,\n    traceDir?: string\n  ): Promise<ReportUploadResponse> {\n    const tracker = createProgressTracker();\n\n    try {\n      // Step 1: Parse the base Playwright report\n      tracker.start('Parsing Playwright report...');\n      const baseReport = await parsePlaywrightJson(jsonPath);\n      tracker.succeed('Report parsed successfully');\n\n      // Step 2: Scan for attachments\n      tracker.start('Scanning for attachments...');\n      const reportDirectory = this.getReportDirectory(jsonPath);\n      const attachmentScanner = new AttachmentScanner(reportDirectory);\n      const attachmentScanResult =\n        await attachmentScanner.scanAttachments(baseReport);\n\n      // Filter attachments based on configuration\n      const attachmentsToUpload = AttachmentScanner.filterAttachments(\n        attachmentScanResult,\n        this.config\n      );\n\n      if (attachmentsToUpload.length > 0) {\n        tracker.succeed(\n          `Found ${attachmentsToUpload.length} attachments to upload`\n        );\n      } else {\n        tracker.succeed('No attachments to upload based on current flags');\n      }\n\n      // Step 3: Collect all metadata\n      tracker.start('Collecting environment metadata...');\n      const metadata = await this.collectMetadata(baseReport);\n      tracker.succeed('Metadata collected');\n\n      // Step 4: Upload files to Azure with STRICT validation after auto-discovery\n      let azureUploadResult: AzureUploadResult | undefined;\n      const shouldUploadToAzure =\n        this.config.uploadImages ||\n        this.config.uploadVideos ||\n        this.config.uploadHtml ||\n        this.config.uploadTraces ||\n        this.config.uploadFiles ||\n        this.config.uploadFullJson;\n\n      if (shouldUploadToAzure) {\n        // SMART VALIDATION: Only fail if report references attachments but files are missing\n        this.enforceStrictUploadRequirements(\n          htmlDir,\n          traceDir,\n          attachmentsToUpload,\n          attachmentScanResult\n        );\n\n        tracker.start('Uploading files to TestDino platform...');\n        azureUploadResult = await this.uploadToAzure(\n          htmlDir,\n          traceDir,\n          attachmentsToUpload\n        );\n\n        if (azureUploadResult.status === 'uploaded') {\n          tracker.succeed('TestDino platform upload completed successfully');\n        } else if (azureUploadResult.status === 'failed') {\n          tracker.fail('TestDino platform upload failed');\n          throw new Error('Upload failed when uploads were explicitly enabled');\n        } else {\n          tracker.succeed('TestDino platform upload skipped');\n        }\n      }\n\n      // Step 5: Build final payload with Azure URLs\n      tracker.start('Uploading to TestDino API...');\n\n      // Update attachment paths with Azure URLs or status markers\n      const urlMapping =\n        azureUploadResult?.urlMapping || new Map<string, string>();\n      const finalReport = AttachmentScanner.updateAttachmentPaths(\n        baseReport,\n        urlMapping,\n        this.config\n      );\n\n      const finalPayload = this.buildFinalPayload(\n        finalReport,\n        metadata,\n        azureUploadResult\n      );\n\n      if (this.config.verbose) {\n        const testCount = Array.isArray(finalPayload.suites)\n          ? finalPayload.suites.length\n          : 0;\n        logger.verbose(`Uploading report: ${testCount} test suites`);\n      }\n\n      // Step 5: Upload to TestDino API with retry\n      const response = await withRetry(\n        () => this.apiClient.uploadReport(finalPayload),\n        { maxAttempts: 3, baseDelay: 1000 }\n      );\n\n      tracker.succeed('Report uploaded successfully');\n      return response;\n    } catch (error) {\n      tracker.fail('Upload failed');\n      throw error;\n    }\n  }\n\n  /**\n   * Collect all metadata with ZERO data loss guarantee\n   * CRITICAL: Each collector has fallbacks - never fails completely\n   */\n  private async collectMetadata(\n    baseReport: PlaywrightReport\n  ): Promise<CompleteMetadata> {\n    const collectionResults = await Promise.allSettled([\n      this.collectGitMetadataWithFallback(),\n      this.collectCiMetadataWithFallback(),\n      this.collectSystemMetadataWithFallback(),\n    ]);\n\n    // Extract results, using fallbacks for any failures\n    const gitMeta =\n      collectionResults[0].status === 'fulfilled'\n        ? collectionResults[0].value\n        : this.getGitMetadataFallback();\n\n    const ciMeta =\n      collectionResults[1].status === 'fulfilled'\n        ? collectionResults[1].value\n        : this.getCiMetadataFallback();\n\n    const systemMeta =\n      collectionResults[2].status === 'fulfilled'\n        ? collectionResults[2].value\n        : this.getSystemMetadataFallback();\n\n    // Extract test configuration from the base report\n    const testMeta = this.extractTestMetadata(baseReport);\n\n    // Add target environment from config to git metadata\n    gitMeta.environment = this.config.environment;\n\n    // Cross-collector reconciliation (e.g. Bitbucket post-merge PR detection)\n    CiCollector.reconcileWithGit(ciMeta, gitMeta);\n\n    const metadata = {\n      git: gitMeta,\n      ci: ciMeta,\n      system: systemMeta,\n      test: testMeta,\n    };\n\n    // Log any collection failures\n    const failures = collectionResults\n      .map((result, index) => ({\n        result,\n        type: ['git', 'ci', 'system'][index],\n      }))\n      .filter(({ result }) => result.status === 'rejected')\n      .map(\n        ({ type, result }) =>\n          `${type}: ${(result as PromiseRejectedResult).reason}`\n      );\n\n    if (failures.length > 0) {\n      logger.warn(\n        `Metadata collection issues (using fallbacks): ${failures.join(', ')}`\n      );\n    }\n\n    if (this.config.verbose) {\n      logger.verbose(\n        `Metadata: ${gitMeta.branch || 'unknown branch'}, ${ciMeta.provider || 'local'} environment`\n      );\n      if (gitMeta.environment && gitMeta.environment !== 'unknown') {\n        logger.verbose(`Target Environment: ${gitMeta.environment}`);\n      }\n    }\n\n    // STRICT ENFORCEMENT: Validate critical metadata when uploads are enabled\n    this.enforceStrictMetadataRequirements(metadata);\n\n    return metadata;\n  }\n\n  /**\n   * Collect Git metadata with comprehensive error handling\n   */\n  private async collectGitMetadataWithFallback(): Promise<GitMetadata> {\n    try {\n      return await new GitCollector(process.cwd()).getMetadata();\n    } catch (error) {\n      if (this.config.verbose) {\n        logger.warn(\n          `Git metadata collection failed: ${error instanceof Error ? error.message : 'unknown error'}`\n        );\n      }\n      return this.getGitMetadataFallback();\n    }\n  }\n\n  /**\n   * Collect CI metadata with error handling\n   */\n  private async collectCiMetadataWithFallback(): Promise<CiMetadata> {\n    try {\n      return CiCollector.collect();\n    } catch (error) {\n      if (this.config.verbose) {\n        logger.warn(\n          `CI metadata collection failed: ${error instanceof Error ? error.message : 'unknown error'}`\n        );\n      }\n      return this.getCiMetadataFallback();\n    }\n  }\n\n  /**\n   * Collect System metadata with error handling\n   */\n  private async collectSystemMetadataWithFallback(): Promise<SystemMetadata> {\n    try {\n      return SystemCollector.collect();\n    } catch (error) {\n      if (this.config.verbose) {\n        logger.warn(\n          `System metadata collection failed: ${error instanceof Error ? error.message : 'unknown error'}`\n        );\n      }\n      return this.getSystemMetadataFallback();\n    }\n  }\n\n  /**\n   * Fallback Git metadata when all collection methods fail\n   */\n  private getGitMetadataFallback(): GitMetadata {\n    const env = process.env;\n    return {\n      branch:\n        env.CI_COMMIT_REF_NAME ||\n        env.GITHUB_HEAD_REF ||\n        env.BRANCH_NAME ||\n        'unknown',\n      commit: {\n        hash:\n          env.CI_COMMIT_SHA || env.GITHUB_SHA || env.GIT_COMMIT || 'unknown',\n        message: env.CI_COMMIT_MESSAGE || '',\n        author:\n          env.CI_COMMIT_AUTHOR || env.GITHUB_ACTOR || env.GIT_AUTHOR_NAME || '',\n        email: env.CI_COMMIT_AUTHOR_EMAIL || env.GIT_AUTHOR_EMAIL || '',\n        timestamp: new Date().toISOString(),\n      },\n      repository: {\n        name: env.CI_PROJECT_PATH || env.GITHUB_REPOSITORY || 'unknown',\n        url:\n          env.CI_PROJECT_URL || env.GITHUB_REPOSITORY_URL || env.GIT_URL || '',\n      },\n      pr: {\n        id: env.CI_MERGE_REQUEST_ID || env.GITHUB_PR_NUMBER || '',\n        title: env.CI_MERGE_REQUEST_TITLE || '',\n        url: env.CI_MERGE_REQUEST_URL || '',\n        status: '',\n      },\n    };\n  }\n\n  /**\n   * Fallback CI metadata when collection fails\n   */\n  private getCiMetadataFallback(): CiMetadata {\n    const env = process.env;\n    return {\n      provider: 'unknown',\n      pipeline: {\n        id: env.CI_PIPELINE_ID || env.GITHUB_RUN_ID || 'unknown',\n        name: env.CI_PIPELINE_NAME || env.GITHUB_WORKFLOW || 'CI Pipeline',\n        url: env.CI_PIPELINE_URL || '',\n      },\n      build: {\n        number: env.CI_BUILD_NUMBER || env.GITHUB_RUN_NUMBER || 'unknown',\n        trigger: env.CI_PIPELINE_TRIGGER || env.GITHUB_EVENT_NAME || '',\n      },\n      environment: {\n        name: env.CI_ENVIRONMENT_NAME || 'local',\n        type: '',\n        os: 'unknown',\n        node: process.version || 'unknown',\n      },\n    };\n  }\n\n  /**\n   * Fallback System metadata when collection fails\n   */\n  private getSystemMetadataFallback(): SystemMetadata {\n    return {\n      hostname: 'unknown',\n      cpu: {\n        count: 1,\n        model: 'unknown',\n      },\n      memory: {\n        total: 'unknown',\n      },\n      os: 'unknown',\n      nodejs: process.version || 'unknown',\n      playwright: 'unknown',\n    };\n  }\n\n  /**\n   * STRICT ENFORCEMENT: Validate we have required files/directories after auto-discovery\n   * FAILS HARD if user enabled options but we can't deliver what they requested\n   */\n  private enforceStrictUploadRequirements(\n    htmlDir?: string,\n    traceDir?: string,\n    attachments: AttachmentInfo[] = [],\n    scanResult?: AttachmentScanResult\n  ): void {\n    const violations: string[] = [];\n\n    // Strict HTML upload validation\n    if (this.config.uploadHtml && !htmlDir) {\n      violations.push(\n        'HTML upload enabled (--upload-html) but no HTML report directory found. ' +\n          'Auto-discovery failed - ensure HTML report exists or use --html-report <path>'\n      );\n    }\n\n    // Smart attachment validation (per-type, unified for all flags):\n    // - Flag set + zero entries of that type in report → warn and continue (all tests passed)\n    // - Flag set + entries exist but ANY file missing on disk → fail hard\n    // Check each enabled type independently so combined flags get per-type errors\n    {\n      const missingFiles = scanResult?.missingFiles ?? [];\n\n      const typesToCheck: Array<{\n        type: string;\n        label: string;\n        enabled: boolean;\n      }> = [\n        {\n          type: 'image',\n          label: 'images',\n          enabled: this.config.uploadImages || this.config.uploadFullJson,\n        },\n        {\n          type: 'video',\n          label: 'videos',\n          enabled: this.config.uploadVideos || this.config.uploadFullJson,\n        },\n        {\n          type: 'file',\n          label: 'files',\n          enabled: this.config.uploadFiles || this.config.uploadFullJson,\n        },\n        {\n          type: 'trace',\n          label: 'traces',\n          enabled: this.config.uploadTraces,\n        },\n      ];\n\n      let anyRelevantFound = false;\n\n      for (const { type, label, enabled } of typesToCheck) {\n        if (!enabled) continue;\n\n        const missingOfType = missingFiles.filter(m => m.type === type);\n        const foundOfType = attachments.filter(a => a.type === type);\n        const totalInReport = foundOfType.length + missingOfType.length;\n\n        if (totalInReport === 0) {\n          // No entries of this type in the report — graceful\n          continue;\n        }\n\n        anyRelevantFound = true;\n\n        if (missingOfType.length > 0) {\n          // ANY missing file of this type → fail hard\n          const missingPaths = missingOfType.slice(0, 5).map(m => m.path);\n          const suffix =\n            missingOfType.length > 5\n              ? ` (and ${missingOfType.length - 5} more)`\n              : '';\n\n          violations.push(\n            `${missingOfType.length} ${label} referenced in the report not found on disk:\\n` +\n              missingPaths.map(p => `  - ${p}`).join('\\n') +\n              suffix\n          );\n        }\n      }\n\n      if (!anyRelevantFound && typesToCheck.some(t => t.enabled)) {\n        logger.warn(\n          'Upload flags enabled but no matching attachments found in the report. ' +\n            'This is normal when all tests pass without generating attachments.'\n        );\n      }\n    }\n\n    // STRICT FAILURE: If any enabled option cannot be fulfilled, fail hard\n    if (violations.length > 0) {\n      const errorMessage =\n        'STRICT VALIDATION FAILED - Cannot fulfill explicitly enabled upload options:\\n\\n' +\n        violations.join('\\n\\n') +\n        '\\n\\nEither provide the missing files/directories or remove the corresponding upload flags.';\n\n      throw new Error(errorMessage);\n    }\n\n    // Additional validation: Check directory accessibility\n    if (htmlDir && this.config.uploadHtml) {\n      this.validateDirectoryAccess(htmlDir, 'HTML report directory');\n    }\n\n    if (traceDir && this.config.uploadTraces) {\n      this.validateDirectoryAccess(traceDir, 'trace directory');\n    }\n  }\n\n  /**\n   * Validate directory is accessible and contains expected content\n   */\n  private validateDirectoryAccess(dirPath: string, description: string): void {\n    try {\n      // Basic accessibility check would go here\n      // For now, we trust that auto-discovery already validated these\n      if (this.config.verbose) {\n        logger.success(`${description} validated: ${dirPath}`);\n      }\n    } catch (error) {\n      throw new Error(\n        `${description} validation failed: ${dirPath}\\n` +\n          `${error instanceof Error ? error.message : 'Directory is not accessible'}`,\n        { cause: error }\n      );\n    }\n  }\n\n  /**\n   * STRICT ENFORCEMENT: Validate critical metadata is available\n   * FAILS HARD if essential metadata is missing when uploads are enabled\n   */\n  private enforceStrictMetadataRequirements(metadata: CompleteMetadata): void {\n    const isUploadEnabled =\n      this.config.uploadImages ||\n      this.config.uploadVideos ||\n      this.config.uploadHtml ||\n      this.config.uploadTraces ||\n      this.config.uploadFiles ||\n      this.config.uploadFullJson;\n\n    if (!isUploadEnabled) {\n      return; // No strict requirements for JSON-only uploads\n    }\n\n    const violations: string[] = [];\n\n    // Strict Git metadata validation\n    if (!metadata.git.commit?.hash || metadata.git.commit.hash === 'unknown') {\n      violations.push(\n        'Git commit hash missing or unknown. ' +\n          \"Required for upload tracking - ensure you're in a git repository with commits\"\n      );\n    }\n\n    if (!metadata.git.branch || metadata.git.branch === 'unknown') {\n      violations.push(\n        'Git branch information missing or unknown. ' +\n          \"Required for upload organization - ensure you're on a valid git branch\"\n      );\n    }\n\n    // Strict repository metadata validation\n    if (\n      !metadata.git.repository?.name ||\n      metadata.git.repository.name === 'unknown'\n    ) {\n      violations.push(\n        'Repository name missing or unknown. ' +\n          'Required for upload categorization - ensure git remote is configured'\n      );\n    }\n\n    // STRICT FAILURE: If critical metadata is missing during uploads, fail hard\n    if (violations.length > 0) {\n      const errorMessage =\n        'STRICT METADATA VALIDATION FAILED - Missing critical information for uploads:\\n\\n' +\n        violations.join('\\n\\n') +\n        '\\n\\nEither fix the git repository setup or disable upload options for JSON-only uploads.';\n\n      throw new Error(errorMessage);\n    }\n\n    if (this.config.verbose) {\n      logger.success(\n        'Strict metadata validation passed - all critical information available'\n      );\n    }\n  }\n\n  /**\n   * Validate and sanitize path prefix from SAS response\n   * CRITICAL: Ensures reliable URL generation even with malformed server responses\n   */\n  private validateAndSanitizePathPrefix(sasResponse: unknown): string {\n    // New format uses blobPath at top level\n    const pathPrefix = (sasResponse as Record<string, unknown>)?.blobPath;\n\n    if (!pathPrefix || typeof pathPrefix !== 'string') {\n      // Generate fallback path prefix based on current timestamp\n      const now = new Date();\n      const year = now.getFullYear();\n      const month = String(now.getMonth() + 1).padStart(2, '0');\n      const day = String(now.getDate()).padStart(2, '0');\n      const randomId = Math.random().toString(36).substring(2, 10);\n\n      const fallbackPrefix = `${year}/${month}/${day}/${randomId}`;\n\n      if (this.config.verbose) {\n        logger.warn(\n          `Invalid or missing blobPath from server, using fallback: ${fallbackPrefix}`\n        );\n      }\n\n      return fallbackPrefix;\n    }\n\n    // Sanitize path prefix to ensure it's safe\n    const sanitized = pathPrefix\n      .replace(/^\\/+|\\/+$/g, '') // Remove leading/trailing slashes\n      .replace(/\\/+/g, '/') // Replace multiple slashes with single slash\n      .replace(/[^a-zA-Z0-9/\\-_]/g, ''); // Remove unsafe characters\n\n    if (!sanitized) {\n      // If sanitization resulted in empty string, use fallback\n      const now = new Date();\n      const fallbackPrefix = `${now.getFullYear()}/${String(now.getMonth() + 1).padStart(2, '0')}/${String(now.getDate()).padStart(2, '0')}/fallback_${Date.now()}`;\n\n      if (this.config.verbose) {\n        logger.warn(\n          `Path prefix sanitization resulted in empty string, using fallback: ${fallbackPrefix}`\n        );\n      }\n\n      return fallbackPrefix;\n    }\n\n    if (sanitized !== pathPrefix && this.config.verbose) {\n      logger.warn(`Path prefix sanitized: '${pathPrefix}' → '${sanitized}'`);\n    }\n\n    return sanitized;\n  }\n\n  /**\n   * Validate SAS response completeness and generate safe fallbacks\n   */\n  private validateSasResponse(sasResponse: unknown): void {\n    // New format: sasToken, containerUrl, blobPath, maxSize, allowedFileTypes at top level\n    const required = ['sasToken', 'containerUrl', 'blobPath'];\n\n    const missing = [];\n    const response = sasResponse as Record<string, unknown>;\n\n    for (const field of required) {\n      if (!(field in response) || !response[field]) {\n        missing.push(field);\n      }\n    }\n\n    if (missing.length > 0) {\n      throw new Error(\n        `Invalid SAS response from server - missing required fields: ${missing.join(', ')}\\n` +\n          'This indicates a server-side issue. Please contact support.'\n      );\n    }\n\n    // Validate data types and ranges\n    if (typeof response.maxSize !== 'number' || response.maxSize <= 0) {\n      throw new Error('Invalid maxSize in SAS response');\n    }\n\n    if (!Array.isArray(response.allowedFileTypes)) {\n      throw new Error('Invalid allowedFileTypes in SAS response');\n    }\n  }\n\n  /**\n   * Extract test configuration metadata from Playwright report\n   */\n  private extractTestMetadata(report: PlaywrightReport): TestMetadata {\n    const config = report.config || {};\n    const projects = config.projects || [];\n\n    // Get Playwright version\n    let playwrightVersion = 'unknown';\n    try {\n      // eslint-disable-next-line @typescript-eslint/no-require-imports\n      const pkg = require('playwright/package.json');\n      playwrightVersion = pkg.version || 'unknown';\n    } catch {\n      try {\n        // eslint-disable-next-line @typescript-eslint/no-require-imports\n        const pkg = require('@playwright/test/package.json');\n        playwrightVersion = pkg.version || 'unknown';\n      } catch {\n        // Keep default 'unknown'\n      }\n    }\n\n    // Build browser configurations\n    const browsers = projects.map(\n      (project: PlaywrightReport['config']['projects'][number]) => ({\n        browserId: project.id || project.name || 'unknown',\n        name: project.name || 'unknown',\n        version: config.version || 'unknown',\n        viewport: '1280x720', // Default, could be extracted from project config\n        headless: true, // Default assumption\n        repeatEach: project.repeatEach || 1,\n        retries: project.retries || 0,\n        testDir: project.testDir || config.rootDir || 'unknown',\n        outputDir: project.outputDir || 'unknown',\n      })\n    );\n\n    return {\n      framework: {\n        name: 'playwright',\n        version: playwrightVersion,\n      },\n      config: {\n        browsers,\n        actualWorkers: config.metadata?.actualWorkers || config.workers || 1,\n        timeout: projects[0]?.timeout || config.timeout || 30000,\n        preserveOutput: config.preserveOutput || 'always',\n        reporters: this.extractReporterConfig(config.reporter),\n        grep: config.grep || {},\n        grepInvert: config.grepInvert || null,\n        fullyParallel: config.fullyParallel || false,\n        forbidOnly: config.forbidOnly || false,\n        projects: projects.length || 0,\n        shard: config.shard || null,\n      },\n      customTags: this.config.tags || [],\n    };\n  }\n\n  /**\n   * Extract reporter configuration from Playwright config\n   */\n  private extractReporterConfig(\n    reporters: PlaywrightReport['config']['reporter']\n  ): PlaywrightReport['config']['reporter'] {\n    if (!Array.isArray(reporters)) return [];\n\n    return reporters.map(reporter => {\n      if (Array.isArray(reporter)) {\n        return {\n          name: reporter[0],\n          options: reporter[1] || {},\n        };\n      }\n      return {\n        name: reporter,\n        options: {},\n      };\n    });\n  }\n\n  /**\n   * Upload HTML, trace files, and attachments to Azure storage with proper directory structure\n   */\n  private async uploadToAzure(\n    htmlDir?: string,\n    traceDir?: string,\n    attachments: AttachmentInfo[] = []\n  ): Promise<AzureUploadResult> {\n    try {\n      // Request SAS token with retry (ONE TOKEN PER COMMAND)\n      const sasResponse = await withRetry(\n        () => this.sasService.requestSasToken(),\n        { maxAttempts: 3, baseDelay: 1000 }\n      );\n\n      // Validate SAS response completeness\n      this.validateSasResponse(sasResponse);\n\n      // Validate and sanitize path prefix\n      const sanitizedPathPrefix =\n        this.validateAndSanitizePathPrefix(sasResponse);\n\n      if (this.config.verbose) {\n        const expiryMinutes = Math.floor(\n          (new Date(sasResponse.expiresAt).getTime() - Date.now()) / 60000\n        );\n        logger.verbose(\n          `Storage token acquired (expires in ${expiryMinutes} min)`\n        );\n        logger.verbose(`Upload path: ${sanitizedPathPrefix}/`);\n      }\n\n      // Create Azure storage client with validated path prefix\n      const validatedSasResponse = {\n        ...sasResponse,\n        blobPath: sanitizedPathPrefix,\n      };\n\n      const storageClient = new AzureStorageClient(validatedSasResponse);\n      const uploadService = new AzureUploadService(storageClient);\n\n      let htmlUrl = '';\n      const urlMapping = new Map<string, string>();\n\n      // Upload attachments (images, videos, etc.) and collect URL mappings\n      if (attachments.length > 0) {\n        try {\n          logger.info(`Uploading ${attachments.length} attachments...`);\n\n          // Create progress bar for attachment uploads\n          const progressBar = createProgressBar();\n          progressBar.start(attachments.length, 0);\n\n          // Upload attachments in configurable batches for better performance\n          const batchSize = this.config.batchSize;\n          let uploadedCount = 0;\n          let failedCount = 0;\n\n          for (let i = 0; i < attachments.length; i += batchSize) {\n            const batch = attachments.slice(i, i + batchSize);\n\n            // Upload batch in parallel and collect results\n            const uploadPromises = batch.map(async attachment => {\n              try {\n                // Create clean blob path for JSON attachments with directory structure\n                const cleanPath = this.createJsonAttachmentPath(attachment);\n                const uploadedUrl = await storageClient.uploadFile(\n                  attachment.absolutePath,\n                  cleanPath\n                );\n\n                const fileName =\n                  attachment.absolutePath.split('/').pop() || attachment.name;\n                progressBar.increment({ filename: fileName });\n\n                return { attachment, uploadedUrl };\n              } catch (error) {\n                failedCount++;\n                const fileName =\n                  attachment.absolutePath.split('/').pop() || attachment.name;\n                progressBar.increment({ filename: `(failed) ${fileName}` });\n                if (this.config.verbose) {\n                  logger.warn(\n                    `${attachment.name}: ${error instanceof Error ? error.message : 'Upload failed'}`\n                  );\n                }\n                return null;\n              }\n            });\n\n            const results = await Promise.all(uploadPromises);\n\n            // Collect successful uploads into URL mapping\n            for (const result of results) {\n              if (result?.uploadedUrl) {\n                uploadedCount++;\n                urlMapping.set(\n                  result.attachment.originalPath,\n                  result.uploadedUrl\n                );\n              }\n            }\n          }\n\n          progressBar.stop();\n\n          if (failedCount > 0) {\n            logger.warn(\n              `Uploaded ${uploadedCount}/${attachments.length} attachments (${failedCount} failed)`\n            );\n          } else {\n            logger.success(`Uploaded ${uploadedCount} attachments`);\n          }\n        } catch (error) {\n          logger.warn(\n            `Attachment upload failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n          );\n        }\n      }\n\n      // Upload HTML report if enabled and directory exists\n      const shouldUploadHtmlDir = this.config.uploadHtml && htmlDir;\n      if (shouldUploadHtmlDir) {\n        try {\n          if (this.config.verbose) {\n            logger.verbose('Uploading HTML report...');\n          }\n\n          // Upload directory contents with filtering based on flags\n          const htmlConfig = {\n            uploadImages: this.config.uploadImages || this.config.uploadHtml,\n            uploadVideos: this.config.uploadVideos || this.config.uploadHtml,\n            uploadHtml: this.config.uploadHtml,\n          };\n          const uploadedUrls =\n            await uploadService.uploadHtmlDirectoryWithProgress(\n              htmlDir,\n              'html',\n              htmlConfig\n            );\n\n          // Build HTML URL - find the index.html in uploaded URLs\n          const indexUrl = uploadedUrls.find(url => url.endsWith('index.html'));\n          if (indexUrl) {\n            htmlUrl = indexUrl;\n          } else {\n            // Fallback: construct URL manually using validated path prefix\n            htmlUrl = `${sasResponse.containerUrl}/${sanitizedPathPrefix}/html/index.html`;\n          }\n\n          logger.success('HTML report uploaded');\n        } catch (error) {\n          logger.error(\n            `HTML upload failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n          );\n          // htmlUrl remains empty, which will result in 'failed' status\n        }\n      }\n\n      // Upload trace files - try JSON attachments first, then fallback to trace directory\n      if (this.config.uploadTraces) {\n        const traceAttachments = attachments.filter(\n          attachment => attachment.type === 'trace'\n        );\n\n        if (traceAttachments.length > 0) {\n          // Upload individual trace files from JSON attachments\n          try {\n            logger.info(`Uploading ${traceAttachments.length} trace files...`);\n\n            let uploadedTraces = 0;\n            for (const traceAttachment of traceAttachments) {\n              try {\n                // Create clean blob path for trace files with proper naming and .zip extension\n                const cleanPath =\n                  this.createJsonTraceAttachmentPath(traceAttachment);\n                const uploadedUrl = await storageClient.uploadFile(\n                  traceAttachment.absolutePath,\n                  cleanPath\n                );\n\n                if (this.config.verbose) {\n                  const fileName = traceAttachment.absolutePath\n                    .split('/')\n                    .pop();\n                  logger.success(`${fileName}`);\n                }\n\n                // Add to URL mapping so it gets updated in the JSON\n                urlMapping.set(traceAttachment.originalPath, uploadedUrl);\n                uploadedTraces++;\n              } catch (error) {\n                if (this.config.verbose) {\n                  logger.warn(\n                    `${traceAttachment.name}: ${error instanceof Error ? error.message : 'Upload failed'}`\n                  );\n                }\n              }\n            }\n\n            logger.success(`Uploaded ${uploadedTraces} trace files`);\n          } catch (error) {\n            logger.warn(\n              `Trace upload failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n            );\n          }\n        } else if (traceDir) {\n          // Fallback: Upload trace files from directory if no traces found in JSON\n          try {\n            if (this.config.verbose) {\n              logger.verbose('Uploading traces from directory...');\n            }\n\n            // Upload traces with 'json/traces' prefix to match JSON attachment structure\n            const traceUrls = await uploadService.uploadDirectoryWithProgress(\n              traceDir,\n              'json/traces'\n            );\n\n            logger.success(`Uploaded ${traceUrls.length} trace files`);\n          } catch (error) {\n            logger.warn(\n              `Trace directory upload failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n            );\n          }\n        } else {\n          logger.warn('No trace files found');\n        }\n      }\n\n      // Return result based on HTML upload status only\n      if (this.config.uploadHtml) {\n        if (htmlUrl) {\n          return { status: 'uploaded', url: htmlUrl, urlMapping };\n        } else {\n          return { status: 'failed', url: '', urlMapping };\n        }\n      } else {\n        return { status: 'disabled', url: '', urlMapping };\n      }\n    } catch (error) {\n      const errorMessage =\n        error instanceof Error ? error.message : 'Unknown error';\n      const emptyUrlMapping = new Map<string, string>();\n\n      // If Azure upload fails completely and HTML upload was enabled, return failed\n      if (this.config.uploadHtml) {\n        logger.error(\n          `TestDino platform upload failed completely: ${errorMessage}`\n        );\n        return { status: 'failed', url: '', urlMapping: emptyUrlMapping };\n      } else {\n        logger.warn(`TestDino platform upload failed: ${errorMessage}`);\n        return { status: 'disabled', url: '', urlMapping: emptyUrlMapping };\n      }\n    }\n  }\n\n  /**\n   * Build the final payload combining base report + metadata + Azure URLs\n   * This must match the exact structure from sample-report.json\n   */\n  private buildFinalPayload(\n    baseReport: PlaywrightReport,\n    metadata: CompleteMetadata,\n    azureUpload?: AzureUploadResult\n  ): FinalPayload {\n    // Attach Azure upload result to metadata if available\n    if (azureUpload) {\n      metadata.azureUpload = azureUpload;\n    } else {\n      // No Azure upload attempted - use default\n      metadata.azureUpload = {\n        status: 'not-found',\n        url: '',\n        urlMapping: new Map<string, string>(),\n      };\n    }\n\n    // Build the payload EXACTLY matching sample-report.json structure\n    const payload = {\n      config: baseReport.config,\n      suites: baseReport.suites,\n      stats: baseReport.stats,\n      errors: baseReport.errors ?? [],\n      metadata,\n    };\n\n    return payload;\n  }\n\n  /**\n   * Upload with graceful fallback for failed Azure uploads\n   */\n  async uploadWithFallback(\n    jsonPath: string,\n    htmlDir?: string,\n    traceDir?: string\n  ): Promise<ReportUploadResponse> {\n    try {\n      // Try full upload first\n      return await this.uploadReport(jsonPath, htmlDir, traceDir);\n    } catch (error) {\n      if (error instanceof NetworkError && (htmlDir || traceDir)) {\n        logger.warn('Full upload failed, attempting JSON-only upload...');\n\n        // Fallback: try JSON-only upload\n        try {\n          return await this.uploadReport(jsonPath); // No HTML/traces\n        } catch (fallbackError) {\n          logger.error('Fallback upload also failed');\n          throw fallbackError;\n        }\n      }\n\n      throw error;\n    }\n  }\n}\n","/**\n * Upload command with rich terminal UI\n */\n\nimport {\n  CLIOptions,\n  Command,\n  ExitCode,\n  NetworkError,\n  AuthenticationError,\n  UsageLimitError,\n  BaseError,\n  Config,\n  ProgressTracker,\n} from '@/types';\nimport { configLoader, EnvironmentDetector } from '@/config';\nimport { DiscoveryResult, ReportDiscoveryService } from '@/core/discovery';\nimport { parsePlaywrightJson, PlaywrightReport } from '@/core/parser';\nimport { UploadService } from '@/services/upload';\nimport type { ReportUploadResponse } from '@/services/api';\nimport { createProgressTracker } from '@/utils/progress';\nimport { EnvironmentType, EnvironmentUtils } from '@/utils/env';\nimport { VERSION } from '@/version';\nimport {\n  printHeader,\n  printSuccess,\n  printError,\n  colors,\n  formatKeyValue,\n} from '@/utils/ui';\nimport { setVerbose, logger } from '@/utils/logger';\n\n/**\n * Main upload command that orchestrates the entire upload process\n */\nexport class UploadCommand implements Command {\n  public readonly name = 'upload';\n  public readonly description = 'Upload Playwright test reports to TestDino';\n\n  async execute(options: CLIOptions): Promise<void> {\n    const isJsonMode = options.json ?? false;\n\n    // In JSON mode, redirect all console output to stderr\n    // so only the final JSON result goes to stdout\n    const origLog = console.log;\n    const origWarn = console.warn;\n    const origError = console.error;\n    const origCI = process.env.CI;\n\n    if (isJsonMode) {\n      const stderrWrite = (...args: unknown[]) => {\n        process.stderr.write(\n          args.map(a => (typeof a === 'string' ? a : String(a))).join(' ') +\n            '\\n'\n        );\n      };\n      console.log = stderrWrite;\n      console.warn = stderrWrite;\n      console.error = stderrWrite;\n      // Force non-interactive spinners/progress bars to avoid stdout corruption\n      process.env.CI = 'true';\n    }\n\n    const tracker = createProgressTracker();\n\n    try {\n      // Print header\n      printHeader(VERSION);\n\n      // Validate configuration\n      tracker.start('Validating configuration...');\n      const config = configLoader.createConfig(options);\n      setVerbose(config.verbose);\n      tracker.succeed('Configuration validated');\n\n      // Show configuration summary\n      if (config.verbose) {\n        this.printConfigSummary(config, options);\n      }\n\n      // Discover report files\n      tracker.start('Discovering report files...');\n      const discoveryService = new ReportDiscoveryService(\n        options.reportDirectory\n      );\n      const discoveryResult = await discoveryService.discover(options);\n\n      const reportCount = this.countReports(discoveryResult);\n      tracker.succeed(\n        `Found ${reportCount} ${reportCount === 1 ? 'report type' : 'report types'}`\n      );\n\n      // Show discovered files in verbose mode\n      if (config.verbose) {\n        this.printDiscoveredFiles(discoveryResult);\n      }\n\n      // Guard against empty runs — skip upload when the report contains zero tests\n      tracker.start('Checking test run...');\n      const report = await parsePlaywrightJson(discoveryResult.jsonReport);\n      if (this.isEmptyRun(report)) {\n        tracker.succeed('Test run is empty — skipping upload');\n        logger.blank();\n        logger.warn(\n          'No tests were found in this run. Nothing to upload to TestDino.'\n        );\n\n        if (isJsonMode) {\n          const jsonOutput = {\n            success: true as const,\n            data: {\n              skipped: true,\n              reason: 'empty-run',\n            },\n          };\n          process.stdout.write(JSON.stringify(jsonOutput) + '\\n');\n        }\n        return;\n      }\n      tracker.succeed('Test run has tests to upload');\n\n      // Perform upload\n      const uploadService = new UploadService(config);\n      const uploadResponse = await uploadService.uploadWithFallback(\n        discoveryResult.jsonReport,\n        discoveryResult.htmlReport,\n        discoveryResult.traceDir\n      );\n\n      // Build result URL\n      const testdinoUrl = this.buildResultUrl(uploadResponse);\n\n      // Show warnings if any\n      if (uploadResponse.warnings?.length) {\n        logger.blank();\n        for (const warning of uploadResponse.warnings) {\n          logger.warn(warning);\n        }\n      }\n\n      // Success!\n      printSuccess('Upload completed successfully!', testdinoUrl);\n\n      // In JSON mode, emit structured output to stdout\n      if (isJsonMode) {\n        const jsonOutput = {\n          success: true as const,\n          data: {\n            testRunId: uploadResponse.testRunId,\n            url: testdinoUrl ?? null,\n          },\n        };\n        process.stdout.write(JSON.stringify(jsonOutput) + '\\n');\n      }\n    } catch (error) {\n      if (isJsonMode) {\n        this.handleJsonError(error, tracker);\n      } else {\n        this.handleError(error, tracker);\n      }\n    } finally {\n      if (isJsonMode) {\n        console.log = origLog;\n        console.warn = origWarn;\n        console.error = origError;\n        if (origCI === undefined) {\n          delete process.env.CI;\n        } else {\n          process.env.CI = origCI;\n        }\n      }\n    }\n  }\n\n  private printConfigSummary(config: Config, options: CLIOptions): void {\n    const envInfo = EnvironmentDetector.getEnvironmentInfo();\n\n    console.log();\n    console.log(colors.bold('Configuration'));\n    console.log(formatKeyValue('Environment', String(envInfo.type)));\n    console.log(\n      formatKeyValue(\n        'CI/CD',\n        envInfo.isCI ? `Yes (${envInfo.ciProvider})` : 'No'\n      )\n    );\n    console.log(formatKeyValue('Report', options.reportDirectory));\n\n    const uploadFlags: string[] = [];\n    if (config.uploadFullJson) uploadFlags.push('full-json');\n    if (config.uploadImages) uploadFlags.push('images');\n    if (config.uploadVideos) uploadFlags.push('videos');\n    if (config.uploadHtml) uploadFlags.push('html');\n    if (config.uploadTraces) uploadFlags.push('traces');\n    if (config.uploadFiles) uploadFlags.push('files');\n\n    console.log(\n      formatKeyValue(\n        'Upload',\n        uploadFlags.length ? uploadFlags.join(', ') : 'report only'\n      )\n    );\n    console.log();\n  }\n\n  private printDiscoveredFiles(discoveryResult: DiscoveryResult): void {\n    console.log();\n    console.log(colors.bold('Discovered Files'));\n    console.log(formatKeyValue('JSON', discoveryResult.jsonReport));\n    if (discoveryResult.htmlReport) {\n      console.log(formatKeyValue('HTML', discoveryResult.htmlReport));\n    }\n    if (discoveryResult.traceDir) {\n      console.log(formatKeyValue('Traces', discoveryResult.traceDir));\n    }\n    console.log();\n  }\n\n  private isEmptyRun(report: PlaywrightReport): boolean {\n    const { expected, unexpected, flaky, skipped } = report.stats;\n    return (\n      expected + unexpected + flaky + skipped === 0 &&\n      report.suites.length === 0\n    );\n  }\n\n  private countReports(discoveryResult: DiscoveryResult): number {\n    let count = 1; // JSON is always present\n    if (discoveryResult.htmlReport) count++;\n    if (discoveryResult.traceDir) count++;\n    return count;\n  }\n\n  private buildResultUrl(\n    uploadResponse: ReportUploadResponse\n  ): string | undefined {\n    // Use viewUrl if provided by the API\n    if (uploadResponse.viewUrl) {\n      return uploadResponse.viewUrl;\n    }\n\n    // Construct URL from components if available\n    if (\n      uploadResponse.organizationId &&\n      uploadResponse.projectId &&\n      uploadResponse.testRunId\n    ) {\n      const envType = EnvironmentUtils.detectEnvironmentType();\n      const baseUrl =\n        envType === EnvironmentType.PRODUCTION\n          ? 'https://app.testdino.com'\n          : envType === EnvironmentType.STAGING\n            ? 'https://staging.testdino.com'\n            : 'http://localhost:3001';\n\n      return `${baseUrl}/${uploadResponse.organizationId}/projects/${uploadResponse.projectId}/test-runs/${uploadResponse.testRunId}`;\n    }\n\n    // No URL available\n    return undefined;\n  }\n\n  private printQuotaError(error: UsageLimitError): void {\n    const border = '═'.repeat(70);\n    const { data } = error;\n    const orgRemaining = (data.limit ?? 0) - (data.used ?? 0);\n    const formattedResetDate = data.resetDate\n      ? new Date(data.resetDate).toLocaleDateString('en-US', {\n          day: '2-digit',\n          month: 'short',\n          year: 'numeric',\n        })\n      : undefined;\n\n    const isOrgExhausted = orgRemaining <= 0 && !data.projectName;\n\n    console.error('');\n    console.error(border);\n\n    if (isOrgExhausted) {\n      console.error('  ❌ TestDino Organization Execution Limit Reached');\n      console.error(border);\n      console.error('');\n      console.error(\n        '  Your organization has exhausted its monthly test case limit.'\n      );\n      console.error('');\n      console.error('  Organization Usage:');\n      console.error(\n        `    Plan:             ${data.tier} (${data.limit || 'Unknown'} test cases / month)`\n      );\n      console.error(`    Used:             ${data.used || 'Unknown'}`);\n      console.error('    Remaining:        0');\n      console.error('');\n      console.error('  Solutions:');\n      console.error(\n        '    1. Upgrade your plan to increase monthly test case limit'\n      );\n    } else {\n      console.error('  ❌ TestDino Project Execution Limit Reached');\n      console.error(border);\n      console.error('');\n      console.error(\n        '  The test case limit allocated to this project has been exceeded.'\n      );\n      console.error('');\n      const effectiveLimit =\n        (data.projectLimit ?? 0) + (data.projectBorrowed ?? 0);\n      console.error('  Project Usage:');\n      if (data.projectName) {\n        console.error(`    Project:          ${data.projectName}`);\n      }\n      if (data.projectLimit != null) {\n        console.error(\n          `    Limit:            ${effectiveLimit} test cases${data.projectBorrowed ? ` (${data.projectLimit} allocated + ${data.projectBorrowed} borrowed)` : ''}`\n        );\n      }\n      if (data.projectUsed != null) {\n        console.error(`    Used:             ${data.projectUsed}`);\n      }\n      console.error('    Status:           Project quota exhausted');\n      console.error('');\n      console.error('  Organization Usage:');\n      console.error(\n        `    Plan:             ${data.tier} (${data.limit || 'Unknown'} test cases / month)`\n      );\n      console.error(`    Used:             ${data.used || 'Unknown'}`);\n      console.error(`    Remaining:        ${orgRemaining}`);\n      if (orgRemaining > 0) {\n        console.error('');\n        console.error('  Note:');\n        console.error(\n          `  Your organization still has ${orgRemaining} test cases available,`\n        );\n        console.error('  but they are not allocated to this project.');\n      }\n      console.error('');\n      console.error('  Solutions:');\n      console.error('    1. Allocate more test case quota to this project in');\n      console.error('       Settings → Billing & Usage → Test Limits');\n      console.error(\n        '    2. Enable Auto Allocation to automatically distribute'\n      );\n      console.error('       remaining organization quota');\n    }\n\n    if (formattedResetDate) {\n      console.error('');\n      console.error('  Monthly Reset:');\n      console.error(`    ${formattedResetDate}`);\n    }\n\n    console.error('');\n    console.error(\n      '  Docs:    https://docs.testdino.com/platform/billing-and-usage/test-limits'\n    );\n    console.error('  Pricing: https://testdino.com/pricing');\n    console.error(border);\n    console.error('');\n  }\n\n  private handleJsonError(error: unknown, tracker: ProgressTracker): never {\n    tracker.fail('Upload failed');\n\n    const errorCode = error instanceof BaseError ? error.code : 'GENERAL_ERROR';\n    const message = error instanceof Error ? error.message : 'Unknown error';\n\n    const jsonOutput = {\n      success: false as const,\n      error: {\n        code: errorCode,\n        message: message,\n      },\n    };\n\n    process.stdout.write(JSON.stringify(jsonOutput) + '\\n');\n\n    if (error instanceof AuthenticationError) {\n      process.exit(ExitCode.AUTHENTICATION_ERROR);\n    }\n    if (error instanceof NetworkError) {\n      process.exit(ExitCode.NETWORK_ERROR);\n    }\n    if (error instanceof UsageLimitError) {\n      process.exit(ExitCode.USAGE_LIMIT_ERROR);\n    }\n    process.exit(ExitCode.GENERAL_ERROR);\n  }\n\n  private handleError(error: unknown, tracker: ProgressTracker): never {\n    tracker.fail('Upload failed');\n\n    if (error instanceof AuthenticationError) {\n      printError('Authentication Failed', error.message, [\n        'Verify your API token is correct',\n        'Check that your token has upload permissions',\n        \"Ensure you're using the right environment token\",\n      ]);\n      process.exit(ExitCode.AUTHENTICATION_ERROR);\n    }\n\n    if (error instanceof NetworkError) {\n      printError('Network Error', error.message, [\n        'Check your internet connection',\n        'Verify the API endpoint is accessible',\n        'Try again in a few moments',\n      ]);\n      process.exit(ExitCode.NETWORK_ERROR);\n    }\n\n    if (error instanceof UsageLimitError) {\n      this.printQuotaError(error);\n      process.exit(ExitCode.USAGE_LIMIT_ERROR);\n    }\n\n    // Generic error\n    const message = error instanceof Error ? error.message : 'Unknown error';\n    printError('Upload Failed', message, [\n      'Run with --verbose for more details',\n      'Check https://docs.testdino.com for help',\n    ]);\n\n    process.exit(ExitCode.GENERAL_ERROR);\n  }\n}\n","/**\n * Command registry and execution logic\n */\n\nimport { Command } from 'commander';\nimport { CacheCommand, CacheOptionsSchema } from './commands/cache';\nimport {\n  LastFailedCommand,\n  LastFailedOptionsSchema,\n} from './commands/last-failed';\nimport { UploadCommand } from './commands/upload';\nimport { ValidationError, CLIOptions, Config } from '@/types';\nimport { VERSION } from '@/version';\nimport {\n  printHelpHeader,\n  printHelpSection,\n  printHelpCommand,\n  printHelpOption,\n  printHelpExample,\n  printHelpEnvVar,\n  colors,\n} from '@/utils/ui';\n\n/**\n * Command manager for handling subcommands and backward compatibility\n */\nexport class CommandManager {\n  private readonly program: Command;\n  private config?: Config;\n\n  constructor() {\n    this.program = new Command();\n    this.setupProgram();\n  }\n\n  /**\n   * Setup the main program with subcommands and backward compatibility\n   */\n  private setupProgram(): void {\n    this.program\n      .name('tdpw')\n      .description('TestDino CLI - Upload reports and cache test metadata')\n      .version(VERSION, '--version', 'Display version')\n      .helpOption(false);\n\n    // Cache subcommand (store metadata)\n    this.program\n      .command('cache')\n      .description('Store test execution metadata after Playwright runs')\n      .option(\n        '--cache-id <value>',\n        'Custom cache ID (or TESTDINO_CACHE_ID env var)'\n      )\n      .option(\n        '--working-dir <path>',\n        'Directory to scan for test results (default: cwd)'\n      )\n      .option(\n        '-t, --token <value>',\n        'TestDino API token (or TESTDINO_TOKEN env var)'\n      )\n      .option('-v, --verbose', 'Verbose logging')\n      .action(async options => {\n        await this.executeCache(options);\n      });\n\n    // Last Failed subcommand (retrieve failure data)\n    this.program\n      .command('last-failed')\n      .description('Get last failed test cases for Playwright execution')\n      .option(\n        '--cache-id <value>',\n        'Custom cache ID (or TESTDINO_CACHE_ID env var)'\n      )\n      .option(\n        '--branch <name>',\n        'Override branch name (auto-detected from Git by default)'\n      )\n      .option(\n        '--commit <hash>',\n        'Override commit hash (auto-detected from Git by default)'\n      )\n      .option(\n        '--shard <value>',\n        'Retrieve failures for specific shard (format: index/total, e.g., \"1/3\")'\n      )\n      .option(\n        '-t, --token <value>',\n        'TestDino API token (or TESTDINO_TOKEN env var)'\n      )\n      .option('-v, --verbose', 'Verbose logging')\n      .action(async options => {\n        await this.executeLastFailed(options);\n      });\n\n    // Upload subcommand for backward compatibility\n    this.program\n      .command('upload')\n      .description('Upload test reports to TestDino')\n      .arguments('[report-directory]')\n      .option('-t, --token <value>', 'TestDino API token')\n      .option(\n        '--environment <value>',\n        'Target environment tag (e.g., staging, production, qa)'\n      )\n      .option(\n        '--tag <values>',\n        'Comma-separated run tags (e.g., --tag regression,smoke,v1.2.3)'\n      )\n      .option('--upload-images', 'Upload image attachments', false)\n      .option('--upload-videos', 'Upload video attachments', false)\n      .option('--upload-html', 'Upload HTML reports', false)\n      .option('--upload-traces', 'Upload trace files', false)\n      .option('--upload-files', 'Upload file attachments', false)\n      .option('--upload-full-json', 'Upload all attachments', false)\n      .option('--json-report <path>', 'Specific JSON report path')\n      .option('--html-report <path>', 'Specific HTML report path')\n      .option('--trace-dir <path>', 'Specific trace directory path')\n      .option('-v, --verbose', 'Verbose logging', false)\n      .option(\n        '--json',\n        'Output results as JSON to stdout (for CI/CD integration)',\n        false\n      )\n      .action(async (reportDirectory, options) => {\n        await this.executeUpload(reportDirectory, options);\n      });\n  }\n\n  /**\n   * Execute cache command\n   */\n  private async executeCache(options: Record<string, unknown>): Promise<void> {\n    try {\n      // Validate cache options\n      const validatedOptions = CacheOptionsSchema.parse(options);\n\n      // Create configuration for cache command\n      const config = this.getOrCreateConfig(validatedOptions.token);\n\n      // Execute cache command\n      const cacheCommand = new CacheCommand(config);\n      await cacheCommand.execute(validatedOptions);\n    } catch (error) {\n      throw new ValidationError(\n        error instanceof Error ? error.message : 'Cache command failed'\n      );\n    }\n  }\n\n  /**\n   * Execute last failed command\n   */\n  private async executeLastFailed(\n    options: Record<string, unknown>\n  ): Promise<void> {\n    try {\n      // Validate last-failed options\n      const validatedOptions = LastFailedOptionsSchema.parse(options);\n\n      // Create configuration for last failed command\n      const config = this.getOrCreateConfig(validatedOptions.token);\n\n      // Execute last failed command\n      const lastFailedCommand = new LastFailedCommand(config);\n      await lastFailedCommand.execute(validatedOptions);\n    } catch (error) {\n      throw new ValidationError(\n        error instanceof Error ? error.message : 'Last failed command failed'\n      );\n    }\n  }\n\n  /**\n   * Execute upload command (backward compatibility)\n   */\n  private async executeUpload(\n    reportDirectory: string,\n    options: Record<string, unknown>\n  ): Promise<void> {\n    if (!reportDirectory) {\n      throw new ValidationError(\n        'Report directory is required for upload command. Use \"npx tdpw cache\" for caching metadata.'\n      );\n    }\n\n    // Resolve environment value: CLI option > env var > default\n    const resolvedEnvironment = this.resolveEnvironmentValue(\n      options.environment as string | undefined\n    );\n\n    // Resolve tags value: CLI option > env var > default\n    const resolvedTags = this.resolveTagsValue(\n      options.tag as string | undefined\n    );\n\n    // Build CLIOptions for upload command\n    const cliOptions: CLIOptions = {\n      reportDirectory,\n      token: (options.token as string) || '',\n      uploadImages: Boolean(options.uploadImages),\n      uploadVideos: Boolean(options.uploadVideos),\n      uploadHtml: Boolean(options.uploadHtml),\n      uploadTraces: Boolean(options.uploadTraces),\n      uploadFiles: Boolean(options.uploadFiles),\n      uploadFullJson: Boolean(options.uploadFullJson),\n      jsonReport: options.jsonReport as string | undefined,\n      htmlReport: options.htmlReport as string | undefined,\n      traceDir: options.traceDir as string | undefined,\n      verbose: Boolean(options.verbose),\n      json: Boolean(options.json),\n      environment: resolvedEnvironment,\n      tags: resolvedTags,\n    };\n\n    // Create configuration and execute\n    this.getOrCreateConfig(cliOptions.token); // Ensures config is created with token\n    const uploadCommand = new UploadCommand();\n    await uploadCommand.execute(cliOptions);\n  }\n\n  /**\n   * Resolve tags value with precedence: CLI option > env var > default\n   * Parses comma-separated tags and validates format\n   */\n  private resolveTagsValue(cliValue?: string): string[] {\n    const envVarValue = process.env.TESTDINO_RUN_TAGS;\n\n    // Determine the resolved value based on precedence\n    let resolvedValue: string;\n    if (cliValue !== undefined && cliValue !== '') {\n      resolvedValue = cliValue;\n    } else if (envVarValue !== undefined && envVarValue !== '') {\n      resolvedValue = envVarValue;\n    } else {\n      return []; // No tags specified\n    }\n\n    // Parse comma-separated tags, filter out empty strings, and deduplicate\n    const tags = [\n      ...new Set(\n        resolvedValue\n          .split(',')\n          .map(tag => tag.trim())\n          .filter(tag => tag.length > 0)\n      ),\n    ];\n\n    // Validate each tag format, warn and skip invalid tags\n    const tagPattern = /^[a-zA-Z0-9_\\-.]+$/;\n    const validTags: string[] = [];\n    for (const tag of tags) {\n      if (!tagPattern.test(tag)) {\n        console.warn(\n          colors.warning(\n            `Warning: Ignoring invalid tag \"${tag}\". ` +\n              'Tags must contain only letters, numbers, hyphens, underscores, and dots. ' +\n              'Examples: regression, smoke, v1.2.3, feature-test'\n          )\n        );\n      } else {\n        validTags.push(tag);\n      }\n    }\n\n    // Limit to MAX_TAGS and warn if exceeded\n    const MAX_TAGS = 5;\n    let finalTags = validTags;\n    if (validTags.length > MAX_TAGS) {\n      const droppedTags = validTags.slice(MAX_TAGS);\n      finalTags = validTags.slice(0, MAX_TAGS);\n      console.warn(\n        colors.warning(\n          `Warning: Too many tags specified (${validTags.length}). ` +\n            `Only first ${MAX_TAGS} tags will be used: ${finalTags.join(', ')}. ` +\n            `Dropped tags: ${droppedTags.join(', ')}`\n        )\n      );\n    }\n\n    return finalTags;\n  }\n\n  /**\n   * Resolve environment value with precedence: CLI option > env var > default\n   * Validates format using regex: /^[a-z0-9]+([_-][a-z0-9]+)*$/\n   */\n  private resolveEnvironmentValue(cliValue?: string): string {\n    const defaultValue = 'unknown';\n    const envVarValue = process.env.TESTDINO_TARGET_ENV;\n\n    // Determine the resolved value based on precedence\n    let resolvedValue: string;\n    if (cliValue !== undefined && cliValue !== '') {\n      resolvedValue = cliValue;\n    } else if (envVarValue !== undefined && envVarValue !== '') {\n      resolvedValue = envVarValue;\n    } else {\n      resolvedValue = defaultValue;\n    }\n\n    // Skip validation for default value\n    if (resolvedValue === defaultValue) {\n      return resolvedValue;\n    }\n\n    // Validate format using regex\n    const environmentPattern = /^[a-z0-9]+([_-][a-z0-9]+)*$/;\n    if (!environmentPattern.test(resolvedValue)) {\n      throw new ValidationError(\n        `Invalid environment value \"${resolvedValue}\". ` +\n          'Must contain only lowercase letters, numbers, hyphens, and underscores. ' +\n          'Examples: staging, production, qa, dev-1, test_env'\n      );\n    }\n\n    return resolvedValue;\n  }\n\n  /**\n   * Get or create configuration for cache command\n   */\n  private getOrCreateConfig(token?: string): Config {\n    if (!this.config) {\n      this.config = this.createConfigForCache(token);\n    }\n    return this.config;\n  }\n\n  /**\n   * Create configuration specifically for cache command\n   */\n  private createConfigForCache(token?: string): Config {\n    // Resolve token from CLI option or environment variable\n    const resolvedToken = token || process.env.TESTDINO_TOKEN || '';\n\n    if (!resolvedToken) {\n      throw new ValidationError(\n        'API token is required. Provide via --token flag or TESTDINO_TOKEN environment variable.'\n      );\n    }\n\n    // Create minimal config for cache command\n    const config: Config = {\n      apiUrl: process.env.TESTDINO_API_URL || 'https://api.testdino.com',\n      token: resolvedToken,\n      uploadImages: false,\n      uploadVideos: false,\n      uploadHtml: false,\n      uploadTraces: false,\n      uploadFiles: false,\n      uploadFullJson: false,\n      verbose: false,\n      environment: 'unknown', // Not used by cache command\n      batchSize: 5,\n      maxConcurrentUploads: 10,\n      uploadTimeout: 60000,\n      retryAttempts: 3,\n      tags: [],\n    };\n\n    return config;\n  }\n\n  /**\n   * Parse and execute commands\n   */\n  async parseAndExecute(args: string[] = process.argv): Promise<void> {\n    try {\n      // Note: Help handling is now done in CLI index.ts before reaching here\n\n      await this.program.parseAsync(args);\n    } catch (error) {\n      // Re-throw with better context\n      throw new ValidationError(\n        error instanceof Error ? error.message : 'Command execution failed'\n      );\n    }\n  }\n\n  /**\n   * Show main help\n   */\n  showHelp(): void {\n    printHelpHeader(VERSION, 'Upload reports and cache test metadata');\n\n    printHelpSection('Commands');\n    printHelpCommand('upload <dir>', 'Upload Playwright reports');\n    printHelpCommand('cache', 'Store test metadata for reruns');\n    printHelpCommand('last-failed', 'Get previously failed tests');\n\n    printHelpSection('Quick Start');\n    printHelpExample('npx tdpw upload ./playwright-report --token=\"...\"');\n    printHelpExample('npx tdpw cache --token=\"...\"');\n    printHelpExample('npx playwright test $(npx tdpw last-failed)');\n\n    printHelpSection('Environment Variables');\n    printHelpEnvVar('TESTDINO_TOKEN', 'API authentication token');\n    printHelpEnvVar('TESTDINO_TARGET_ENV', 'Test run target environment tag');\n    printHelpEnvVar('TESTDINO_RUN_TAGS', 'Comma-separated run tags');\n\n    console.log(\n      `\\n  ${colors.dim('Run')} tdpw <command> --help ${colors.dim('for command details')}`\n    );\n    console.log(`  ${colors.dim('Docs:')} https://docs.testdino.com/cli\\n`);\n  }\n\n  /**\n   * Show cache command help\n   */\n  showCacheHelp(): void {\n    console.log(`\\n${colors.bold('Usage:')} tdpw cache [options]\\n`);\n    console.log(\n      `${colors.dim('Store test execution metadata after Playwright runs')}\\n`\n    );\n\n    printHelpSection('Options');\n    printHelpOption('-t, --token <value>', 'API token (or TESTDINO_TOKEN)');\n    printHelpOption('--cache-id <value>', 'Custom cache ID');\n    printHelpOption('--working-dir <path>', 'Directory to scan');\n    printHelpOption('-v, --verbose', 'Verbose logging');\n\n    printHelpSection('Examples');\n    printHelpExample('npx tdpw cache --token=\"...\"');\n    printHelpExample('npx tdpw cache --working-dir ./test-results');\n    console.log();\n  }\n\n  /**\n   * Show last-failed command help\n   */\n  showLastFailedHelp(): void {\n    console.log(`\\n${colors.bold('Usage:')} tdpw last-failed [options]\\n`);\n    console.log(\n      `${colors.dim('Get previously failed tests for selective reruns')}\\n`\n    );\n\n    printHelpSection('Options');\n    printHelpOption('-t, --token <value>', 'API token (or TESTDINO_TOKEN)');\n    printHelpOption('--cache-id <value>', 'Custom cache ID');\n    printHelpOption('--branch <name>', 'Override branch name');\n    printHelpOption('--commit <hash>', 'Override commit hash');\n    printHelpOption('--shard <value>', 'Filter by shard (e.g., 1/3)');\n    printHelpOption('-v, --verbose', 'Verbose logging');\n\n    printHelpSection('Examples');\n    printHelpExample('npx tdpw last-failed --token=\"...\"');\n    printHelpExample('npx playwright test $(npx tdpw last-failed)');\n    console.log();\n  }\n\n  /**\n   * Show upload command help\n   */\n  showUploadHelp(): void {\n    console.log(\n      `\\n${colors.bold('Usage:')} tdpw upload <report-dir> [options]\\n`\n    );\n    console.log(\n      `${colors.dim('Upload Playwright test reports to TestDino')}\\n`\n    );\n\n    printHelpSection('Options');\n    printHelpOption('-t, --token <value>', 'API token (or TESTDINO_TOKEN)');\n    printHelpOption(\n      '--environment <value>',\n      'Environment tag (staging, production)'\n    );\n    printHelpOption(\n      '--tag <values>',\n      'Run tags (e.g., regression,smoke,v1.2.3)'\n    );\n    printHelpOption('--upload-full-json', 'Upload all attachments');\n    printHelpOption('--upload-images', 'Upload image attachments');\n    printHelpOption('--upload-videos', 'Upload video attachments');\n    printHelpOption('--upload-traces', 'Upload trace files');\n    printHelpOption('--upload-html', 'Upload HTML reports');\n    printHelpOption('-v, --verbose', 'Verbose logging');\n    printHelpOption('--json', 'Output results as JSON (for CI/CD)');\n\n    printHelpSection('Examples');\n    printHelpExample('npx tdpw upload ./playwright-report --token=\"...\"');\n    printHelpExample('npx tdpw upload ./playwright-report --upload-full-json');\n    printHelpExample(\n      'npx tdpw upload ./playwright-report --environment=\"staging\"'\n    );\n    printHelpExample(\n      'npx tdpw upload ./playwright-report --tag=\"regression,smoke\"'\n    );\n    console.log();\n  }\n\n  /**\n   * Get version\n   */\n  getVersion(): string {\n    return VERSION;\n  }\n}\n\n/**\n * Export command manager instance\n */\nexport const commandManager = new CommandManager();\n","#!/usr/bin/env node\n\n/**\n * TestDino CLI Entry Point\n * Main entry point for the tdpw CLI tool\n */\n\nimport { commandManager } from './commands';\nimport {\n  BaseError,\n  ConfigurationError,\n  ValidationError,\n  AuthenticationError,\n  NetworkError,\n  FileSystemError,\n  UsageLimitError,\n  ExitCode,\n} from '@/types';\nimport { logger, setVerbose } from '@/utils/logger';\n\n/**\n * CLI Application main class\n */\nclass TestDinoCLI {\n  /**\n   * Main application entry point\n   */\n  async run(args: string[] = process.argv): Promise<void> {\n    try {\n      // Handle help and version flags manually for better control\n      if (this.shouldShowHelp(args)) {\n        const helpResult = this.handleHelpCommand(args);\n        if (helpResult.handled) {\n          if (helpResult.showCache) {\n            commandManager.showCacheHelp();\n          } else if (helpResult.showLastFailed) {\n            commandManager.showLastFailedHelp();\n          } else if (helpResult.showUpload) {\n            commandManager.showUploadHelp();\n          } else {\n            commandManager.showHelp();\n          }\n          process.exit(ExitCode.SUCCESS);\n        }\n      }\n\n      if (this.shouldShowVersion(args)) {\n        logger.info(`tdpw v${commandManager.getVersion()}`);\n        process.exit(ExitCode.SUCCESS);\n      }\n\n      // Check for legacy syntax and transform to new format\n      const transformedArgs = this.handleLegacySyntax(args);\n\n      // Execute commands through the command manager\n      await commandManager.parseAndExecute(transformedArgs);\n\n      process.exit(ExitCode.SUCCESS);\n    } catch (error) {\n      await this.handleError(error);\n    }\n  }\n\n  /**\n   * Check if help should be displayed\n   */\n  private shouldShowHelp(args: string[]): boolean {\n    return (\n      args.includes('--help') || args.includes('-h') || args.includes('help')\n    );\n  }\n\n  /**\n   * Handle help command and determine which help to show\n   */\n  private handleHelpCommand(args: string[]): {\n    handled: boolean;\n    showCache: boolean;\n    showLastFailed: boolean;\n    showUpload: boolean;\n  } {\n    const userArgs = args.slice(2); // Remove node and script path\n\n    // Check for subcommand help: \"cache --help\", \"last-failed --help\", \"upload --help\"\n    if (userArgs.length >= 2) {\n      if (\n        userArgs[0] === 'cache' &&\n        (userArgs[1] === '--help' || userArgs[1] === '-h')\n      ) {\n        return {\n          handled: true,\n          showCache: true,\n          showLastFailed: false,\n          showUpload: false,\n        };\n      }\n      if (\n        userArgs[0] === 'last-failed' &&\n        (userArgs[1] === '--help' || userArgs[1] === '-h')\n      ) {\n        return {\n          handled: true,\n          showCache: false,\n          showLastFailed: true,\n          showUpload: false,\n        };\n      }\n      if (\n        userArgs[0] === 'upload' &&\n        (userArgs[1] === '--help' || userArgs[1] === '-h')\n      ) {\n        return {\n          handled: true,\n          showCache: false,\n          showLastFailed: false,\n          showUpload: true,\n        };\n      }\n    }\n\n    // Check for \"help cache\", \"help last-failed\", or \"help upload\"\n    if (userArgs.length >= 2 && userArgs[0] === 'help') {\n      if (userArgs[1] === 'cache') {\n        return {\n          handled: true,\n          showCache: true,\n          showLastFailed: false,\n          showUpload: false,\n        };\n      }\n      if (userArgs[1] === 'last-failed') {\n        return {\n          handled: true,\n          showCache: false,\n          showLastFailed: true,\n          showUpload: false,\n        };\n      }\n      if (userArgs[1] === 'upload') {\n        return {\n          handled: true,\n          showCache: false,\n          showLastFailed: false,\n          showUpload: true,\n        };\n      }\n    }\n\n    // Check for main help: \"--help\", \"-h\", or just \"help\"\n    if (\n      userArgs.length === 0 ||\n      (userArgs.length === 1 &&\n        (userArgs[0] === '--help' ||\n          userArgs[0] === '-h' ||\n          userArgs[0] === 'help'))\n    ) {\n      return {\n        handled: true,\n        showCache: false,\n        showLastFailed: false,\n        showUpload: false,\n      };\n    }\n\n    return {\n      handled: false,\n      showCache: false,\n      showLastFailed: false,\n      showUpload: false,\n    };\n  }\n\n  /**\n   * Check if version should be displayed\n   */\n  private shouldShowVersion(args: string[]): boolean {\n    return args.includes('--version');\n  }\n\n  /**\n   * Handle legacy syntax for backward compatibility\n   * Transforms: npx tdpw ./path --flags\n   * To:         npx tdpw upload ./path --flags\n   */\n  private handleLegacySyntax(args: string[]): string[] {\n    const userArgs = args.slice(2); // Remove node and script path\n\n    // If no args, return as-is\n    if (userArgs.length === 0) {\n      return args;\n    }\n\n    const firstArg = userArgs[0];\n\n    // Known subcommands - not legacy syntax\n    const knownCommands = ['cache', 'last-failed', 'upload', 'help'];\n\n    // If first arg is a known command, return as-is\n    if (firstArg && knownCommands.includes(firstArg)) {\n      return args;\n    }\n\n    // If first arg is a flag, return as-is\n    if (firstArg?.startsWith('-')) {\n      return args;\n    }\n\n    // If we reach here, first arg is likely a path (legacy syntax)\n    // Check if there are any upload-related flags\n    const uploadFlags = [\n      '--upload-images',\n      '--upload-videos',\n      '--upload-html',\n      '--upload-traces',\n      '--upload-files',\n      '--upload-full-json',\n      '--json-report',\n      '--html-report',\n      '--trace-dir',\n    ];\n\n    const hasUploadFlag = userArgs.some(arg => uploadFlags.includes(arg));\n\n    // Legacy syntax detected: path provided without 'upload' command\n    if (hasUploadFlag || firstArg) {\n      logger.warn('DEPRECATION WARNING: Legacy syntax detected.');\n      logger.info('Old: npx tdpw ./path --flags');\n      logger.info('New: npx tdpw upload ./path --flags');\n      logger.info('Legacy syntax will be removed in a future version.');\n      logger.blank();\n\n      // Transform: insert 'upload' command after script name\n      const nodePath = args[0] || 'node';\n      const scriptPath = args[1] || 'tdpw';\n      return [nodePath, scriptPath, 'upload', ...userArgs];\n    }\n\n    return args;\n  }\n\n  /**\n   * Professional error handling with appropriate messaging\n   */\n  private async handleError(error: unknown): Promise<void> {\n    const isJsonMode = process.argv.includes('--json');\n    const isVerbose =\n      process.argv.includes('--verbose') || process.argv.includes('-v');\n\n    setVerbose(isVerbose);\n\n    // In JSON mode, emit structured error to stdout and exit\n    if (isJsonMode) {\n      const errorCode =\n        error instanceof BaseError ? error.code : 'GENERAL_ERROR';\n      const message = error instanceof Error ? error.message : 'Unknown error';\n\n      const jsonOutput = {\n        success: false as const,\n        error: { code: errorCode, message },\n      };\n\n      process.stdout.write(JSON.stringify(jsonOutput) + '\\n');\n\n      if (error instanceof BaseError) {\n        process.exit(this.getExitCode(error));\n      }\n      process.exit(ExitCode.GENERAL_ERROR);\n    }\n\n    if (error instanceof BaseError) {\n      logger.error(error.message);\n\n      // Show helpful suggestions without being verbose\n      switch (true) {\n        case error instanceof ConfigurationError:\n          logger.info('Check your API token and configuration');\n          break;\n        case error instanceof ValidationError:\n          logger.info('Use --help for correct usage');\n          break;\n        case error instanceof AuthenticationError:\n          logger.info('Verify your API token has proper permissions');\n          break;\n        case error instanceof NetworkError:\n          logger.info('Check your internet connection');\n          break;\n        case error instanceof FileSystemError:\n          logger.info('Verify the specified paths exist and are readable');\n          break;\n      }\n\n      // Show stack trace only in verbose mode\n      if (isVerbose && error.stack) {\n        logger.section('Stack trace:');\n        logger.verbose(error.stack);\n      }\n\n      process.exit(this.getExitCode(error));\n    } else if (error instanceof Error) {\n      logger.error(error.message);\n\n      if (!isVerbose) {\n        logger.info('Use --verbose for detailed error information');\n      } else if (error.stack) {\n        logger.section('Stack trace:');\n        logger.verbose(error.stack);\n      }\n\n      process.exit(ExitCode.GENERAL_ERROR);\n    } else {\n      logger.error('An unexpected error occurred');\n      if (isVerbose) {\n        logger.debug(`Error details: ${error}`);\n      }\n      process.exit(ExitCode.GENERAL_ERROR);\n    }\n  }\n\n  /**\n   * Get appropriate exit code for error type\n   */\n  private getExitCode(error: BaseError): number {\n    if (error instanceof AuthenticationError)\n      return ExitCode.AUTHENTICATION_ERROR;\n    if (error instanceof NetworkError) return ExitCode.NETWORK_ERROR;\n    if (error instanceof FileSystemError) return ExitCode.FILE_NOT_FOUND_ERROR;\n    if (error instanceof UsageLimitError) return ExitCode.USAGE_LIMIT_ERROR;\n    return ExitCode.GENERAL_ERROR;\n  }\n}\n\n/**\n * Application execution\n */\nasync function main(): Promise<void> {\n  const cli = new TestDinoCLI();\n  await cli.run();\n}\n\n// Execute CLI when this module is run\n(async () => {\n  try {\n    await main();\n  } catch (error) {\n    logger.error(`Fatal error during CLI execution: ${error}`);\n    process.exit(ExitCode.GENERAL_ERROR);\n  }\n})();\n\n// Export for testing\nexport { TestDinoCLI, main };\n"]}