{"version":3,"file":"dockerChromeForTesting-BMmEQq88.mjs","names":["chromeForTestingConfig.version","chromeForTestingConfig.dockerImage","chromeForTestingConfig.dockerPlatform","cloakBrowserConfig.dockerImage","__decorateMetadata","path","fs","version","dockerImage$1","dockerBrowserBinary$1","dockerPlatform$1","dockerImage","dockerBrowserBinary","dockerPlatform","_ChromeForTestingService","PINNED_CHROME_FOR_TESTING_VERSION","CHROME_FOR_TESTING_PATH_ENV_VAR","compareChromeVersionParts","leftParts","left","part","rightParts","right","maxLength","index","leftPart","rightPart","getRequestedChromeForTestingVersion","override","CHROME_FOR_TESTING_VERSION_ENV_VAR","getConfiguredChromeForTestingPath","isRecorderPageCleanupSafeChromeVersion","shouldCleanupRecorderPageAfterStop","ChromeForTestingService","join","homedir","configuredPath","execPath","installedVersion","requestedVersion","pinnedVersion","existsSync","error","versionFile","readFile","chromeDir","rm","mkdirSync","downloadUrl","versionInfo","zipPath","extractDir","writeFile","platform","chmod","response","entry","stat","access","constants","platformKey","d","os","architecture","arch","archSuffix","url","tempPath","destPath","fileStream","createWriteStream","reader","nodeStream","Readable","done","value","pipeline","rename","proc","spawn","destDir","code","resolve","reject","err","__decorate","injectable","WORKSPACE_MARKERS","DEFAULT_DOCKER_IMAGE","DEFAULT_DOCKER_PLATFORM","DEFAULT_DOCKER_REPOSITORY","CLOAKBROWSER_DOCKER_IMAGE","CLOAKBROWSER_DOCKER_REPOSITORY","resolveWorkspaceRoot","current","startPath","marker","pathExists","parent","candidatePath","getDefaultDockerImageRepository","getDefaultDockerImage","resolvePackageRoot","startDir","packageJsonPath","resolveDockerfilePath","currentDir","fileURLToPath","resolveBuildContext","resolveVersionFromImage","image","tag","normalizedTag","normalizePlatform","resolveChromeForTestingArchivePlatform","normalized","isManagedDockerChromeForTestingImage","runDockerCommand","stderr","child","args","stdio","chunk","dockerImageExistsLocally","buildDockerChromeForTestingImage","options","archivePlatform","result","ensureManagedDockerChromeForTestingImageAvailable","input","isManagedCloakBrowserImage","resolveCloakBrowserDockerfilePath","buildDockerCloakBrowserImage","ensureCloakBrowserImageAvailable"],"sources":["../src/config/chrome-for-testing.json","../src/config/cloakbrowser.json","../src/services/ChromeForTestingService.ts","../src/utils/dockerChromeForTesting.ts"],"sourcesContent":["","","/**\n * ChromeForTestingService\n *\n * DESIGN PATTERNS:\n * - Service pattern for Chrome for Testing lifecycle management\n * - Downloads and caches Chrome for Testing binary\n * - Provides executable path for extension mode\n *\n * CODING STANDARDS:\n * - Use async/await for I/O operations\n * - Proper error handling with try-catch\n * - Clear responsibility: manage Chrome for Testing lifecycle\n *\n * AVOID:\n * - Synchronous blocking operations\n * - Mixing concerns with browser launching\n */\n\nimport 'reflect-metadata/lite';\nimport { type ChildProcess, spawn } from 'node:child_process';\nimport { constants, createWriteStream, existsSync, mkdirSync } from 'node:fs';\nimport { access, chmod, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';\nimport { arch, homedir, platform } from 'node:os';\nimport { join } from 'node:path';\nimport { Readable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\n\nimport { injectable } from 'inversify';\n\nimport chromeForTestingConfig from '../config/chrome-for-testing.json';\n\n/** Chrome for Testing version info from API */\ninterface CftVersionInfo {\n  version: string;\n  revision: string;\n  downloads: {\n    chrome: Array<{\n      platform: string;\n      url: string;\n    }>;\n  };\n}\n\n/** Chrome for Testing API response */\ninterface CftApiResponse {\n  timestamp: string;\n  versions: CftVersionInfo[];\n}\n\nexport const PINNED_CHROME_FOR_TESTING_VERSION = chromeForTestingConfig.version;\nexport const CHROME_FOR_TESTING_VERSION_ENV_VAR = 'BROWSE_TOOL_CHROME_FOR_TESTING_VERSION';\nexport const CHROME_FOR_TESTING_PATH_ENV_VAR = 'BROWSE_TOOL_CHROME_FOR_TESTING_PATH';\nexport const RECORDER_PAGE_CLEANUP_SAFE_MIN_VERSION = '147.0.7727.3';\n\nfunction compareChromeVersionParts(left: string, right: string): number {\n  const leftParts = left.split('.').map((part) => Number.parseInt(part, 10) || 0);\n  const rightParts = right.split('.').map((part) => Number.parseInt(part, 10) || 0);\n  const maxLength = Math.max(leftParts.length, rightParts.length);\n\n  for (let index = 0; index < maxLength; index += 1) {\n    const leftPart = leftParts[index] ?? 0;\n    const rightPart = rightParts[index] ?? 0;\n    if (leftPart !== rightPart) {\n      return leftPart > rightPart ? 1 : -1;\n    }\n  }\n\n  return 0;\n}\n\nexport function getRequestedChromeForTestingVersion(): string {\n  const override = process.env[CHROME_FOR_TESTING_VERSION_ENV_VAR]?.trim();\n  return override && override.length > 0 ? override : PINNED_CHROME_FOR_TESTING_VERSION;\n}\n\nexport function getConfiguredChromeForTestingPath(): string | undefined {\n  const override = process.env[CHROME_FOR_TESTING_PATH_ENV_VAR]?.trim();\n  return override && override.length > 0 ? override : undefined;\n}\n\nexport function isRecorderPageCleanupSafeChromeVersion(version: string): boolean {\n  return compareChromeVersionParts(version, RECORDER_PAGE_CLEANUP_SAFE_MIN_VERSION) >= 0;\n}\n\nexport function shouldCleanupRecorderPageAfterStop(): boolean {\n  return isRecorderPageCleanupSafeChromeVersion(getRequestedChromeForTestingVersion());\n}\n\nexport interface IChromeForTestingService {\n  /** Get the path to Chrome for Testing executable, downloading if necessary */\n  getExecutablePath(): Promise<string>;\n  /** Check if Chrome for Testing is installed */\n  isInstalled(): Promise<boolean>;\n  /** Get the installed version */\n  getInstalledVersion(): Promise<string | null>;\n  /** Force re-download of Chrome for Testing */\n  update(): Promise<string>;\n}\n\n@injectable()\nexport class ChromeForTestingService implements IChromeForTestingService {\n  private static readonly API_URL =\n    'https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json';\n\n  /** Cache directory for Chrome for Testing */\n  private readonly cacheDir: string;\n\n  constructor() {\n    this.cacheDir = join(homedir(), '.cache', 'chrome-for-testing');\n  }\n\n  /**\n   * Get the path to Chrome for Testing executable.\n   * Refreshes to the pinned known-good build when the cache is stale.\n   */\n  async getExecutablePath(): Promise<string> {\n    const configuredPath = getConfiguredChromeForTestingPath();\n    if (configuredPath) {\n      return this.validateConfiguredExecutablePath(configuredPath);\n    }\n\n    const execPath = this.getExpectedExecutablePath();\n    const installedVersion = await this.getInstalledVersion();\n\n    try {\n      const requestedVersion = this.getRequestedVersion();\n      const pinnedVersion = await this.fetchVersionInfo(requestedVersion);\n      const isCurrentInstall = existsSync(execPath) && installedVersion === requestedVersion;\n      if (isCurrentInstall) {\n        return execPath;\n      }\n\n      return this.download(pinnedVersion);\n    } catch (error) {\n      if (existsSync(execPath)) {\n        return execPath;\n      }\n\n      throw error;\n    }\n  }\n\n  /**\n   * Check if Chrome for Testing is installed\n   */\n  async isInstalled(): Promise<boolean> {\n    return existsSync(this.getExpectedExecutablePath());\n  }\n\n  /**\n   * Get the installed version from the version file\n   */\n  async getInstalledVersion(): Promise<string | null> {\n    const versionFile = join(this.cacheDir, 'version.txt');\n    if (!existsSync(versionFile)) {\n      return null;\n    }\n    try {\n      const version = await readFile(versionFile, 'utf-8');\n      return version.trim();\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Force re-download of Chrome for Testing\n   */\n  async update(): Promise<string> {\n    const chromeDir = join(this.cacheDir, 'chrome');\n    if (existsSync(chromeDir)) {\n      await rm(chromeDir, { recursive: true, force: true });\n    }\n    return this.download(await this.fetchVersionInfo(this.getRequestedVersion()));\n  }\n\n  /**\n   * Download Chrome for Testing\n   */\n  private async download(versionInfo: CftVersionInfo): Promise<string> {\n    mkdirSync(this.cacheDir, { recursive: true });\n    const downloadUrl = this.getDownloadUrl(versionInfo);\n\n    if (!downloadUrl) {\n      throw new Error(`No Chrome for Testing download available for ${this.getPlatformKey()}`);\n    }\n\n    const zipPath = join(this.cacheDir, 'chrome.zip');\n    const extractDir = join(this.cacheDir, 'chrome');\n\n    await this.downloadFile(downloadUrl, zipPath);\n    await this.extractZip(zipPath, extractDir);\n    await rm(zipPath, { force: true });\n    await writeFile(join(this.cacheDir, 'version.txt'), versionInfo.version, 'utf-8');\n\n    const execPath = this.getExpectedExecutablePath();\n    if (!existsSync(execPath)) {\n      throw new Error(`Chrome for Testing executable not found at expected path: ${execPath}`);\n    }\n\n    if (platform() !== 'win32') {\n      await chmod(execPath, 0o755);\n    }\n\n    return execPath;\n  }\n\n  /**\n   * Fetch version info from Chrome for Testing API\n   */\n  private async fetchVersionInfo(requestedVersion: string): Promise<CftVersionInfo> {\n    const response = await fetch(ChromeForTestingService.API_URL);\n    if (!response.ok) {\n      throw new Error(`Failed to fetch Chrome for Testing info: ${response.statusText}`);\n    }\n    const data = (await response.json()) as CftApiResponse;\n    const versionInfo = data.versions.find((entry) => entry.version === requestedVersion);\n    if (!versionInfo) {\n      throw new Error(`Chrome for Testing version ${requestedVersion} not found in feed`);\n    }\n    return versionInfo;\n  }\n\n  private getRequestedVersion(): string {\n    return getRequestedChromeForTestingVersion();\n  }\n\n  private async validateConfiguredExecutablePath(execPath: string): Promise<string> {\n    try {\n      const stats = await stat(execPath);\n      if (!stats.isFile()) {\n        throw new Error('configured path is not a file');\n      }\n\n      if (platform() !== 'win32') {\n        await access(execPath, constants.X_OK);\n      }\n\n      return execPath;\n    } catch (error) {\n      throw new Error(\n        `Chrome for Testing executable configured by ${CHROME_FOR_TESTING_PATH_ENV_VAR} was not found or is not executable: ${execPath}`,\n        { cause: error },\n      );\n    }\n  }\n\n  /**\n   * Get the download URL for current platform\n   */\n  private getDownloadUrl(versionInfo: CftVersionInfo): string | undefined {\n    const platformKey = this.getPlatformKey();\n    const download = versionInfo.downloads.chrome.find((d) => d.platform === platformKey);\n    return download?.url;\n  }\n\n  /**\n   * Get platform key for Chrome for Testing API\n   */\n  private getPlatformKey(): string {\n    const os = platform();\n    const architecture = arch();\n\n    if (os === 'darwin') {\n      return architecture === 'arm64' ? 'mac-arm64' : 'mac-x64';\n    }\n    if (os === 'linux') {\n      return 'linux64';\n    }\n    if (os === 'win32') {\n      return architecture === 'x64' ? 'win64' : 'win32';\n    }\n    throw new Error(`Unsupported platform: ${os}`);\n  }\n\n  /**\n   * Get the expected executable path based on platform\n   */\n  private getExpectedExecutablePath(): string {\n    const os = platform();\n    const chromeDir = join(this.cacheDir, 'chrome');\n\n    if (os === 'darwin') {\n      const archSuffix = arch() === 'arm64' ? 'arm64' : 'x64';\n      return join(\n        chromeDir,\n        `chrome-mac-${archSuffix}`,\n        'Google Chrome for Testing.app',\n        'Contents',\n        'MacOS',\n        'Google Chrome for Testing',\n      );\n    }\n    if (os === 'linux') {\n      return join(chromeDir, 'chrome-linux64', 'chrome');\n    }\n    if (os === 'win32') {\n      const archSuffix = arch() === 'x64' ? '64' : '32';\n      return join(chromeDir, `chrome-win${archSuffix}`, 'chrome.exe');\n    }\n    throw new Error(`Unsupported platform: ${os}`);\n  }\n\n  /**\n   * Download a file from URL to local path\n   */\n  private async downloadFile(url: string, destPath: string): Promise<void> {\n    const response = await fetch(url);\n    if (!response.ok || !response.body) {\n      throw new Error(`Failed to download: ${response.statusText}`);\n    }\n\n    const tempPath = `${destPath}.tmp`;\n    const fileStream = createWriteStream(tempPath);\n\n    const reader = response.body.getReader();\n    const nodeStream = new Readable({\n      async read() {\n        const { done, value } = await reader.read();\n        if (done) {\n          this.push(null);\n        } else {\n          this.push(Buffer.from(value));\n        }\n      },\n    });\n\n    await pipeline(nodeStream, fileStream);\n    await rename(tempPath, destPath);\n  }\n\n  /**\n   * Extract a zip file to destination directory\n   */\n  private async extractZip(zipPath: string, destDir: string): Promise<void> {\n    const os = platform();\n\n    return new Promise((resolve, reject) => {\n      let proc: ChildProcess;\n\n      if (os === 'win32') {\n        proc = spawn('powershell', [\n          '-NoProfile',\n          '-Command',\n          `Expand-Archive -Path \"${zipPath}\" -DestinationPath \"${destDir}\" -Force`,\n        ]);\n      } else {\n        mkdirSync(destDir, { recursive: true });\n        proc = spawn('unzip', ['-o', '-q', zipPath, '-d', destDir]);\n      }\n\n      proc.on('close', (code) => {\n        if (code === 0) {\n          resolve();\n        } else {\n          reject(new Error(`Failed to extract zip (exit code: ${code})`));\n        }\n      });\n\n      proc.on('error', (err) => {\n        reject(new Error(`Failed to spawn extraction process: ${err.message}`));\n      });\n    });\n  }\n}\n","import { spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport chromeForTestingConfig from '../config/chrome-for-testing.json';\nimport cloakBrowserConfig from '../config/cloakbrowser.json';\nimport { getRequestedChromeForTestingVersion } from '../services/ChromeForTestingService.js';\n\nconst WORKSPACE_MARKERS = ['pnpm-workspace.yaml', 'nx.json', '.git'];\nconst DEFAULT_DOCKER_IMAGE = chromeForTestingConfig.dockerImage;\nconst DEFAULT_DOCKER_PLATFORM = chromeForTestingConfig.dockerPlatform;\nconst DEFAULT_DOCKER_REPOSITORY = DEFAULT_DOCKER_IMAGE.split(':')[0] ?? DEFAULT_DOCKER_IMAGE;\nconst CLOAKBROWSER_DOCKER_IMAGE = cloakBrowserConfig.dockerImage;\nconst CLOAKBROWSER_DOCKER_REPOSITORY = CLOAKBROWSER_DOCKER_IMAGE.split(':')[0] ?? CLOAKBROWSER_DOCKER_IMAGE;\nconst PACKAGE_NAME = '@agimon-ai/po-browse-tool';\n\nexport interface DockerChromeForTestingBuildOptions {\n  version?: string;\n  image?: string;\n  platform?: string;\n  stdio?: 'inherit' | 'pipe' | 'ignore';\n}\n\ninterface DockerCommandResult {\n  exitCode: number;\n  stderr: string;\n}\n\nfunction resolveWorkspaceRoot(startPath = process.cwd()): string {\n  let current = path.resolve(startPath);\n\n  while (true) {\n    for (const marker of WORKSPACE_MARKERS) {\n      if (pathExists(path.join(current, marker))) {\n        return current;\n      }\n    }\n\n    const parent = path.dirname(current);\n    if (parent === current) {\n      return startPath;\n    }\n    current = parent;\n  }\n}\n\nfunction pathExists(candidatePath: string): boolean {\n  return fs.existsSync(candidatePath);\n}\n\nfunction getDefaultDockerImageRepository(): string {\n  return DEFAULT_DOCKER_REPOSITORY;\n}\n\nfunction getDefaultDockerImage(version: string): string {\n  return `${getDefaultDockerImageRepository()}:${version}`;\n}\n\nfunction resolvePackageRoot(startDir: string): string {\n  let current = path.resolve(startDir);\n\n  for (let index = 0; index < 8; index += 1) {\n    const packageJsonPath = path.join(current, 'package.json');\n    if (pathExists(packageJsonPath)) {\n      try {\n        const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) as { name?: string };\n        if (packageJson.name === PACKAGE_NAME) {\n          return current;\n        }\n      } catch {\n        // Keep walking.\n      }\n    }\n\n    const parent = path.dirname(current);\n    if (parent === current) {\n      break;\n    }\n    current = parent;\n  }\n\n  return path.resolve(startDir, '../..');\n}\n\nfunction resolveDockerfilePath(): string {\n  const currentDir = path.dirname(fileURLToPath(import.meta.url));\n  return path.join(resolvePackageRoot(currentDir), 'docker/chrome-for-testing.Dockerfile');\n}\n\nfunction resolveBuildContext(): string {\n  const currentDir = path.dirname(fileURLToPath(import.meta.url));\n  const packageRoot = resolvePackageRoot(currentDir);\n  return resolveWorkspaceRoot(packageRoot);\n}\n\nfunction resolveVersionFromImage(image?: string): string | undefined {\n  if (!image?.includes(':')) {\n    return undefined;\n  }\n\n  const [, tag] = image.split(':', 2);\n  const normalizedTag = tag?.trim();\n  if (!normalizedTag || !/^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(normalizedTag)) {\n    return undefined;\n  }\n\n  return normalizedTag;\n}\n\nfunction normalizePlatform(platform?: string): string {\n  return (platform?.trim() || DEFAULT_DOCKER_PLATFORM).toLowerCase();\n}\n\nexport function resolveChromeForTestingArchivePlatform(platform?: string): string {\n  const normalized = normalizePlatform(platform);\n\n  if (normalized.includes('arm64') || normalized.includes('aarch64')) {\n    return 'linux-arm64';\n  }\n\n  return 'linux64';\n}\n\nexport function isManagedDockerChromeForTestingImage(image: string): boolean {\n  return image.startsWith(`${getDefaultDockerImageRepository()}:`);\n}\n\nasync function runDockerCommand(args: string[], stdio: 'inherit' | 'pipe' | 'ignore'): Promise<DockerCommandResult> {\n  return await new Promise<DockerCommandResult>((resolve, reject) => {\n    let stderr = '';\n    const child = spawn('docker', args, {\n      stdio: stdio === 'pipe' ? ['ignore', 'pipe', 'pipe'] : ['ignore', stdio, stdio],\n    });\n\n    if (stdio === 'pipe') {\n      child.stderr?.on('data', (chunk) => {\n        stderr += chunk.toString('utf8');\n      });\n    }\n\n    child.once('error', reject);\n    child.once('close', (code) => {\n      resolve({\n        exitCode: code ?? 1,\n        stderr,\n      });\n    });\n  });\n}\n\nexport async function dockerImageExistsLocally(image: string): Promise<boolean> {\n  const result = await runDockerCommand(['image', 'inspect', image], 'ignore');\n  return result.exitCode === 0;\n}\n\nexport async function buildDockerChromeForTestingImage(\n  options: DockerChromeForTestingBuildOptions = {},\n): Promise<{ image: string; version: string; platform: string }> {\n  const version =\n    options.version?.trim() || resolveVersionFromImage(options.image) || getRequestedChromeForTestingVersion();\n  const image = options.image?.trim() || getDefaultDockerImage(version);\n  const platform = normalizePlatform(options.platform);\n  const archivePlatform = resolveChromeForTestingArchivePlatform(platform);\n  const stdio = options.stdio ?? 'inherit';\n  const args = [\n    'buildx',\n    'build',\n    '--platform',\n    platform,\n    '--load',\n    '-t',\n    image,\n    '--build-arg',\n    `CFT_VERSION=${version}`,\n    '--build-arg',\n    `CFT_ARCHIVE_PLATFORM=${archivePlatform}`,\n    '-f',\n    resolveDockerfilePath(),\n    resolveBuildContext(),\n  ];\n\n  const result = await runDockerCommand(args, stdio);\n  if (result.exitCode !== 0) {\n    const stderr = result.stderr.trim();\n    throw new Error(\n      stderr ? `Failed to build Docker image ${image}: ${stderr}` : `Failed to build Docker image ${image}`,\n    );\n  }\n\n  return { image, version, platform };\n}\n\nexport async function ensureManagedDockerChromeForTestingImageAvailable(input: {\n  image: string;\n  platform?: string;\n}): Promise<boolean> {\n  if (!isManagedDockerChromeForTestingImage(input.image)) {\n    return false;\n  }\n\n  const exists = await dockerImageExistsLocally(input.image);\n  if (exists) {\n    return false;\n  }\n\n  await buildDockerChromeForTestingImage({\n    image: input.image,\n    platform: input.platform,\n    stdio: 'inherit',\n  });\n  return true;\n}\n\nexport function isManagedCloakBrowserImage(image: string): boolean {\n  return image.startsWith(`${CLOAKBROWSER_DOCKER_REPOSITORY}:`);\n}\n\nfunction resolveCloakBrowserDockerfilePath(): string {\n  const currentDir = path.dirname(fileURLToPath(import.meta.url));\n  return path.join(resolvePackageRoot(currentDir), 'docker/cloakbrowser.Dockerfile');\n}\n\nexport async function buildDockerCloakBrowserImage(\n  options: { image?: string; platform?: string; stdio?: 'inherit' | 'pipe' | 'ignore' } = {},\n): Promise<{ image: string; platform: string }> {\n  const image = options.image?.trim() || CLOAKBROWSER_DOCKER_IMAGE;\n  const platform = normalizePlatform(options.platform);\n  const stdio = options.stdio ?? 'inherit';\n\n  const args = [\n    'buildx',\n    'build',\n    '--platform',\n    platform,\n    '--load',\n    '-t',\n    image,\n    '-f',\n    resolveCloakBrowserDockerfilePath(),\n    resolveBuildContext(),\n  ];\n\n  const result = await runDockerCommand(args, stdio);\n  if (result.exitCode !== 0) {\n    const stderr = result.stderr.trim();\n    throw new Error(\n      stderr\n        ? `Failed to build CloakBrowser Docker image ${image}: ${stderr}`\n        : `Failed to build CloakBrowser Docker image ${image}`,\n    );\n  }\n\n  return { image, platform };\n}\n\nexport async function ensureCloakBrowserImageAvailable(input: { image: string; platform?: string }): Promise<boolean> {\n  if (!isManagedCloakBrowserImage(input.image)) {\n    return false;\n  }\n\n  const exists = await dockerImageExistsLocally(input.image);\n  if (exists) {\n    return false;\n  }\n\n  await buildDockerCloakBrowserImage({\n    image: input.image,\n    platform: input.platform,\n    stdio: 'inherit',\n  });\n  return true;\n}\n"],"mappings":"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"}