{"version":3,"sources":["../src/config.ts","../src/model-defaults.ts","../src/llm-utils.ts","../src/cli.ts","../src/index.ts","../src/targets.ts","../src/commands/cache.ts","../src/commands/init.ts","../src/commands/install-browsers.ts","../src/commands/install-mobile-drivers.ts","../src/commands/doctor.ts","../src/commands/run.ts","../src/devices.ts","../src/version-notice.ts","../src/commands/dashboard.ts","../src/commands/mcp.ts","../src/commands/config.ts","../src/commands/queue.ts","../src/commands/validate.ts","../src/commands/auth.ts","../src/commands/auth-state.ts","../src/commands/devices.ts","../src/commands/ids.ts","../src/commands/create-test.ts","../src/commands/create-suite.ts","../src/commands/clean-memory.ts","../src/commands/skills.ts","../src/removed-cli-surface.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises'\nimport { dirname, resolve as resolvePath } from 'node:path'\nimport { parse as parseYaml } from 'yaml'\nimport pc from 'picocolors'\nimport { AgentQaConfigSchema, loadLLMAuthPlugins } from '@vostride/agent-qa-core'\nimport type { AgentQaConfig } from '@vostride/agent-qa-core'\n\nconst ENV_MAPPING: Record<string, string> = {\n  AGENT_QA_DASHBOARD_PORT: 'services.dashboard.port',\n  AGENT_QA_MCP_PORT: 'services.mcp.port',\n  AGENT_QA_CACHE_DIR: 'services.cache.dir',\n  AGENT_QA_CACHE_TTL: 'services.cache.ttl',\n  AGENT_QA_LOG_LEVEL: 'services.logging.level',\n  AGENT_QA_HEADLESS: 'use.browser.headless',\n}\n\nfunction setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n  const parts = path.split('.')\n  let current: Record<string, unknown> = obj\n  for (let i = 0; i < parts.length - 1; i++) {\n    const key = parts[i]\n    if (!(key in current) || typeof current[key] !== 'object' || current[key] === null) {\n      current[key] = {}\n    }\n    current = current[key] as Record<string, unknown>\n  }\n  current[parts[parts.length - 1]] = value\n}\n\nfunction parseEnvValue(key: string, value: string): unknown {\n  if (key === 'AGENT_QA_DASHBOARD_PORT' || key === 'AGENT_QA_MCP_PORT') {\n    const parsed = Number.parseInt(value, 10)\n    if (Number.isInteger(parsed)) return parsed\n  }\n  if (key === 'AGENT_QA_HEADLESS') {\n    const normalized = value.trim().toLowerCase()\n    if (normalized === 'true') return true\n    if (normalized === 'false') return false\n  }\n  return value\n}\n\nexport async function loadConfigFile(configPath: string): Promise<unknown> {\n  try {\n    const content = await readFile(configPath, 'utf-8')\n    return parseYaml(content) ?? {}\n  } catch (err: unknown) {\n    if ((err as NodeJS.ErrnoException).code === 'ENOENT') return {}\n    throw err\n  }\n}\n\nexport async function loadRequiredConfigFile(configPath: string): Promise<unknown> {\n  try {\n    const content = await readFile(configPath, 'utf-8')\n    return parseYaml(content) ?? {}\n  } catch (err: unknown) {\n    if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n      throw new Error(`Config file not found: ${configPath}`)\n    }\n    throw err\n  }\n}\n\nexport function loadEnvOverrides(): Record<string, unknown> {\n  const result: Record<string, unknown> = {}\n  for (const [envKey, configPath] of Object.entries(ENV_MAPPING)) {\n    const value = process.env[envKey]\n    if (value !== undefined) {\n      setNestedValue(result, configPath, parseEnvValue(envKey, value))\n    }\n  }\n  return result\n}\n\nfunction isPlainObject(val: unknown): val is Record<string, unknown> {\n  return typeof val === 'object' && val !== null && !Array.isArray(val)\n}\n\nexport function mergeConfigs(\n  file: unknown,\n  env: Record<string, unknown>,\n  flags: Record<string, unknown>,\n): unknown {\n  return deepMerge(deepMerge(file ?? {}, env), flags)\n}\n\nexport function deepMerge(base: unknown, override: unknown): unknown {\n  if (!isPlainObject(base) || !isPlainObject(override)) return override\n  const result: Record<string, unknown> = { ...base }\n  for (const key of Object.keys(override)) {\n    if (key in result && isPlainObject(result[key]) && isPlainObject(override[key])) {\n      result[key] = deepMerge(result[key], override[key])\n    } else {\n      result[key] = override[key]\n    }\n  }\n  return result\n}\n\nexport function mergeWithTestConfig(\n  globalConfig: unknown,\n  testConfig: unknown,\n  flagOverrides: Record<string, unknown>,\n): unknown {\n  return deepMerge(deepMerge(globalConfig ?? {}, testConfig ?? {}), flagOverrides)\n}\n\nfunction normalizeConfigForValidation(config: unknown): unknown {\n  if (!isPlainObject(config)) return config\n  const normalized = deepMerge({}, config) as Record<string, unknown>\n  const use = normalized.use\n  if (isPlainObject(use)) {\n    delete use.headless\n  }\n  return normalized\n}\n\nexport function mergeUseBlocks(\n  globalUse: Record<string, unknown> | undefined,\n  suiteUse: Record<string, unknown> | undefined,\n  testUse: Record<string, unknown> | undefined,\n  cliFlags: Record<string, unknown>,\n): Record<string, unknown> {\n  return deepMerge(\n    deepMerge(\n      deepMerge(globalUse ?? {}, suiteUse ?? {}),\n      testUse ?? {},\n    ),\n    cliFlags,\n  ) as Record<string, unknown>\n}\n\nfunction flattenObject(obj: unknown, prefix = ''): Record<string, unknown> {\n  const result: Record<string, unknown> = {}\n  if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {\n    if (prefix) result[prefix] = obj\n    return result\n  }\n  for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n    const path = prefix ? `${prefix}.${key}` : key\n    if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n      Object.assign(result, flattenObject(value, path))\n    } else {\n      result[path] = value\n    }\n  }\n  return result\n}\n\ntype ConfigSource = 'global config' | 'test yaml' | 'cli flag'\n\nexport function formatConfigDebug(\n  globalConfig: unknown,\n  testConfig: unknown,\n  flagOverrides: Record<string, unknown>,\n): string {\n  const layers: { flat: Record<string, unknown>; label: ConfigSource }[] = [\n    { flat: flattenObject(globalConfig), label: 'global config' },\n    { flat: flattenObject(testConfig), label: 'test yaml' },\n    { flat: flattenObject(flagOverrides), label: 'cli flag' },\n  ]\n\n  const merged = mergeWithTestConfig(globalConfig, testConfig, flagOverrides)\n  const mergedFlat = flattenObject(merged)\n\n  const colorize: Record<ConfigSource, (s: string) => string> = {\n    'global config': pc.dim,\n    'test yaml': pc.cyan,\n    'cli flag': pc.green,\n  }\n\n  const rows: { key: string; value: string; source: ConfigSource }[] = []\n  for (const key of Object.keys(mergedFlat).sort()) {\n    let source: ConfigSource = 'global config'\n    // Check layers in reverse priority order — last match wins\n    for (const layer of layers) {\n      if (key in layer.flat) {\n        source = layer.label\n      }\n    }\n    const valStr = typeof mergedFlat[key] === 'string' ? mergedFlat[key] : JSON.stringify(mergedFlat[key])\n    rows.push({ key, value: valStr, source })\n  }\n\n  if (rows.length === 0) return pc.dim('  (no config values)')\n\n  const maxKey = Math.max(...rows.map(r => r.key.length), 3)\n  const maxVal = Math.max(...rows.map(r => r.value.length), 5)\n\n  const header = `  ${'Key'.padEnd(maxKey)}  ${'Value'.padEnd(maxVal)}  Source`\n  const sep = `  ${'─'.repeat(maxKey)}  ${'─'.repeat(maxVal)}  ${'─'.repeat(13)}`\n  const lines = rows.map(r => {\n    const color = colorize[r.source]\n    return `  ${r.key.padEnd(maxKey)}  ${r.value.padEnd(maxVal)}  ${color(r.source)}`\n  })\n\n  return [header, sep, ...lines].join('\\n')\n}\n\nexport async function resolveConfig(options: {\n  configPath?: string\n  flags?: Record<string, unknown>\n  loadAuthPlugins?: boolean\n}): Promise<AgentQaConfig> {\n  const configPath = options.configPath ?? 'agent-qa.config.yaml'\n  const fileConfig = await loadRequiredConfigFile(configPath)\n  const envOverrides = loadEnvOverrides()\n  const merged = mergeConfigs(fileConfig, envOverrides, options.flags ?? {})\n  const normalized = normalizeConfigForValidation(merged)\n\n  const result = AgentQaConfigSchema.safeParse(normalized)\n  if (!result.success) {\n    const messages = result.error.issues.map((issue: { path: PropertyKey[]; message: string }) => {\n      const path = issue.path.map(String).join('.')\n      return `  ${path}: ${issue.message}`\n    })\n    const legacyDashboardEnabled =\n      typeof merged === 'object'\n      && merged !== null\n      && !Array.isArray(merged)\n      && typeof (merged as Record<string, unknown>).services === 'object'\n      && (merged as Record<string, unknown>).services !== null\n      && !Array.isArray((merged as Record<string, unknown>).services)\n      && typeof ((merged as Record<string, unknown>).services as Record<string, unknown>).dashboard === 'object'\n      && ((merged as Record<string, unknown>).services as Record<string, unknown>).dashboard !== null\n      && !Array.isArray(((merged as Record<string, unknown>).services as Record<string, unknown>).dashboard)\n      && 'enabled' in (((merged as Record<string, unknown>).services as Record<string, unknown>).dashboard as Record<string, unknown>)\n\n    const dashboardHint = legacyDashboardEnabled\n      ? `\\n\\nHint: services.dashboard.enabled was removed. Dashboard behavior is enabled by the presence of the services.dashboard block itself. Remove the enabled key and keep fields like port, dbPath, or artifactsDir.`\n      : ''\n    throw new Error(\n      `Config validation failed:\\n${messages.join('\\n')}\\n\\n` +\n      `Run 'agent-qa init' to generate a complete config file.` +\n      dashboardHint\n    )\n  }\n  if (options.loadAuthPlugins !== false) {\n    await loadLLMAuthPlugins(result.data.plugins?.auth, {\n      baseDir: dirname(resolvePath(configPath)),\n    })\n  }\n  return result.data\n}\n","export const DEFAULT_OPENAI_MODEL = 'gpt-5.5'\nexport const DEFAULT_ANTHROPIC_MODEL = 'claude-sonnet-4-6'\nexport const DEFAULT_GEMINI_MODEL = 'gemini-3-flash-preview'\n","import { dirname, resolve as resolvePath } from 'node:path'\nimport { DEFAULT_ANTHROPIC_MODEL } from './model-defaults.js'\n\nexport type BuiltInLLMProviderMode =\n  | 'openai-compatible'\n  | 'anthropic-compatible'\n  | 'openai-subscription'\n  | 'anthropic-subscription'\n  | 'gemini'\n\nexport type LLMProviderMode = BuiltInLLMProviderMode | (string & {})\n\nexport type LLMModelAdapter = 'openai-responses' | 'anthropic-messages'\n\nexport type ResolvedLLMAuth =\n  | { kind: 'api-key'; credentialKey: string; provider: BuiltInLLMProviderMode; apiKey: string }\n  | { kind: 'bearer-token'; credentialKey: string; provider: 'anthropic-compatible'; token: string }\n  | {\n    kind: 'auth-fetch'\n    credentialKey: string\n    provider: string\n    modelAdapter: LLMModelAdapter\n    fetch: typeof globalThis.fetch\n    expires?: number\n  }\n  | {\n    kind: 'unauthenticated'\n    credentialKey: string\n    provider: 'openai-compatible' | 'anthropic-compatible'\n    optional: true\n    message: string\n  }\n  | {\n    kind: 'missing'\n    credentialKey: string\n    provider: string\n    required: true\n    message: string\n  }\n\nexport type LLMConfigLike = {\n  provider: LLMProviderMode\n  model: string\n  baseURL?: string\n  providerHeaders?: Record<string, string>\n  screenshotSize?: number\n  effectiveResolution?: number\n  contextWindow?: number\n}\n\nexport type NamedLLMConfigLike = LLMConfigLike & {\n  name: string\n}\n\nexport type RuntimeModelConfigLike = LLMConfigLike & {\n  apiKey?: string\n  authToken?: string\n  fetch?: typeof globalThis.fetch\n  modelAdapter?: LLMModelAdapter\n  screenshotSize?: number\n  effectiveResolution?: number\n  contextWindow?: number\n}\n\nfunction normalizeLLMConfig(raw: NamedLLMConfigLike & Record<string, unknown>): NamedLLMConfigLike {\n  return {\n    name: raw.name,\n    provider: raw.provider,\n    model: raw.model,\n    ...(raw.baseURL !== undefined ? { baseURL: raw.baseURL } : {}),\n    ...(raw.providerHeaders !== undefined ? { providerHeaders: raw.providerHeaders } : {}),\n    ...(raw.screenshotSize !== undefined ? { screenshotSize: raw.screenshotSize } : {}),\n    ...(raw.effectiveResolution !== undefined ? { effectiveResolution: raw.effectiveResolution } : {}),\n    ...(raw.contextWindow !== undefined ? { contextWindow: raw.contextWindow } : {}),\n  }\n}\n\nexport async function loadAuthPluginsForRawConfig(raw: unknown, configPath = 'agent-qa.config.yaml'): Promise<void> {\n  const declarations = (raw as { plugins?: { auth?: unknown } } | null)?.plugins?.auth\n  if (!Array.isArray(declarations) || declarations.length === 0) return\n\n  const { loadLLMAuthPlugins } = await import('@vostride/agent-qa-core')\n  await loadLLMAuthPlugins(declarations as Parameters<typeof loadLLMAuthPlugins>[0], {\n    baseDir: dirname(resolvePath(configPath)),\n  })\n}\n\nexport async function resolveNamedConfig(\n  configName?: string,\n  configPath = 'agent-qa.config.yaml',\n): Promise<{\n  config: NamedLLMConfigLike\n  allConfigs: NamedLLMConfigLike[]\n  defaultName: string\n}> {\n  const { loadConfigFile } = await import('./config.js')\n  const raw = (await loadConfigFile(configPath)) as Record<string, unknown> | null\n  await loadAuthPluginsForRawConfig(raw, configPath)\n  const llms = ((raw as any)?.registry?.llms as Array<NamedLLMConfigLike & Record<string, unknown>> | undefined)\n    ?.map(normalizeLLMConfig)\n  const defaultLLM = (raw as any)?.use?.llm as string | undefined\n\n  if (!llms?.length) {\n    throw new Error('No LLM configs found. Run `agent-qa init` to set up your config.')\n  }\n\n  const targetName = configName ?? defaultLLM\n  if (!targetName) {\n    throw new Error('No config name specified and no use.llm set in config.')\n  }\n\n  const found = llms.find(c => c.name === targetName)\n  if (!found) {\n    throw new Error(`Config \"${targetName}\" not found. Available: ${llms.map(c => c.name).join(', ')}`)\n  }\n\n  return { config: found, allConfigs: llms, defaultName: defaultLLM ?? '' }\n}\n\nexport function resolveLLMModels(config: {\n  registry?: { llms?: NamedLLMConfigLike[] }\n  use?: { llm?: string }\n}): {\n  planner: LLMConfigLike\n  verifier: LLMConfigLike\n  configName: string\n} {\n  const defaults: LLMConfigLike = { provider: 'anthropic-subscription', model: DEFAULT_ANTHROPIC_MODEL }\n  if (!config.registry?.llms || !config.use?.llm) {\n    return { planner: defaults, verifier: defaults, configName: '' }\n  }\n  const found = config.registry.llms.find(c => c.name === config.use!.llm)\n  if (!found) {\n    return { planner: defaults, verifier: defaults, configName: '' }\n  }\n  const { name, ...modelFields } = normalizeLLMConfig(found as NamedLLMConfigLike & Record<string, unknown>)\n  return { planner: modelFields, verifier: modelFields, configName: name }\n}\n\nexport async function resolveModelAuth(\n  configName: string,\n  llmConfig: LLMConfigLike,\n): Promise<ResolvedLLMAuth> {\n  const { resolveLLMAuth } = await import('@vostride/agent-qa-core') as unknown as {\n    resolveLLMAuth: (configName: string, llmConfig: LLMConfigLike) => Promise<ResolvedLLMAuth>\n  }\n  return resolveLLMAuth(configName, llmConfig)\n}\n\nexport function applyResolvedAuthToModelConfig(\n  llmConfig: LLMConfigLike,\n  auth: ResolvedLLMAuth,\n): RuntimeModelConfigLike {\n  switch (auth.kind) {\n    case 'api-key':\n      return { ...llmConfig, apiKey: auth.apiKey }\n    case 'bearer-token':\n      return { ...llmConfig, authToken: auth.token }\n    case 'auth-fetch':\n      return { ...llmConfig, fetch: auth.fetch, modelAdapter: auth.modelAdapter }\n    case 'unauthenticated':\n      return { ...llmConfig }\n    case 'missing':\n      throw new Error(auth.message)\n  }\n}\n\nexport async function resolveCredentials(\n  configName: string,\n  llmConfig: LLMConfigLike,\n): Promise<{ apiKey?: string; authToken?: string; authFetch?: typeof globalThis.fetch }> {\n  try {\n    const auth = await resolveModelAuth(configName, llmConfig)\n    if (auth.kind === 'api-key') return { apiKey: auth.apiKey }\n    if (auth.kind === 'bearer-token') return { authToken: auth.token }\n    if (auth.kind === 'auth-fetch') return { authFetch: auth.fetch }\n    return {}\n  } catch {\n    return {}\n  }\n}\n","import { Command } from 'commander'\nimport { VERSION } from './index.js'\nimport { createRunCommand, createInitCommand, createInstallBrowsersCommand, createInstallMobileDriversCommand, createDoctorCommand, createDashboardCommand, createServeCommand, createMcpCommand, createConfigCommand, createQueueCommand, createCacheCommand, createValidateCommand, createAuthCommand, createAuthStateCommand, createDevicesCommand, createIdsCommand, createCreateTestCommand, createCreateSuiteCommand, createCleanMemoryCommand, createSkillsCommand } from './commands/index.js'\nimport { rejectRemovedCliSurface } from './removed-cli-surface.js'\n\nrejectRemovedCliSurface()\n\nconst program = new Command()\nprogram.enablePositionalOptions()\n\nprogram\n  .name('agent-qa')\n  .description('The self-improving Agentic QA harness with Memory')\n  .version(VERSION)\n\nprogram\n  .option('--config <path>', 'config file path', 'agent-qa.config.yaml')\n  .option('--log-level <level>', 'log verbosity: silent|error|warn|info|debug')\n  .option('--verbose', 'shorthand for --log-level debug')\n  .option('--quiet', 'shorthand for --log-level silent')\n\nprogram.addCommand(createRunCommand())\nprogram.addCommand(createInitCommand())\nprogram.addCommand(createInstallBrowsersCommand())\nprogram.addCommand(createInstallMobileDriversCommand())\n\nprogram.addCommand(createDoctorCommand())\nprogram.addCommand(createDashboardCommand())\nprogram.addCommand(createServeCommand())\nprogram.addCommand(createMcpCommand())\nprogram.addCommand(createConfigCommand())\nprogram.addCommand(createQueueCommand())\nprogram.addCommand(createCacheCommand())\nprogram.addCommand(createValidateCommand())\nprogram.addCommand(createAuthCommand())\nprogram.addCommand(createAuthStateCommand())\nprogram.addCommand(createDevicesCommand())\nprogram.addCommand(createIdsCommand())\nprogram.addCommand(createCreateTestCommand())\nprogram.addCommand(createCreateSuiteCommand())\nprogram.addCommand(createCleanMemoryCommand())\nprogram.addCommand(createSkillsCommand())\n\nprogram.parse()\n\nexport { program }\n","import { getAgentQaVersion } from '@vostride/agent-qa-core'\n\nexport * from '@vostride/agent-qa-core'\nexport const VERSION = getAgentQaVersion()\nexport * from './config.js'\nexport * from './targets.js'\nexport { purgeTest, purgeAll } from './commands/cache.js'\n","import type { AgentQaConfig } from '@vostride/agent-qa-core'\n\nexport interface ResolvedTarget {\n  name: string\n  product: string\n  platform: 'web' | 'android' | 'ios'\n  url?: string\n  bundleId?: string\n  appPackage?: string\n  appActivity?: string\n  device?: string\n}\n\nexport interface TargetSummary {\n  name: string\n  platform: 'web' | 'android' | 'ios'\n}\n\ninterface TargetEntry {\n  product?: string\n  platform: 'web' | 'android' | 'ios'\n  bundleId?: string\n  appPackage?: string\n  appActivity?: string\n  url?: string\n  device?: string\n}\n\nexport function resolveTarget(\n  config: AgentQaConfig,\n  targetName: string,\n): ResolvedTarget {\n  const targets = (config as any).registry?.targets\n  if (!targets || !(targetName in targets)) {\n    throw new Error(`Target \"${targetName}\" not found in config. Available targets: ${targets ? Object.keys(targets).join(', ') : 'none'}`)\n  }\n\n  const target = targets[targetName] as TargetEntry\n\n  return {\n    name: targetName,\n    product: target.product ?? targetName,\n    platform: target.platform,\n    url: target.url,\n    bundleId: target.bundleId,\n    appPackage: target.appPackage,\n    appActivity: target.appActivity,\n    device: target.device,\n  }\n}\n\nexport function listTargets(config: AgentQaConfig): TargetSummary[] {\n  const targets = (config as any).registry?.targets\n  if (!targets) return []\n\n  return Object.entries(targets).map(([name, entry]) => {\n    const typedEntry = entry as TargetEntry\n    return {\n      name,\n      platform: typedEntry.platform,\n    }\n  })\n}\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { readFile, readdir, rm, stat } from 'node:fs/promises'\nimport { parse } from 'yaml'\nimport { join, resolve, basename } from 'node:path'\nimport { createInterface } from 'node:readline'\nimport { DEFAULT_AGENT_QA_CACHE_DIR, hashStepInstruction } from '@vostride/agent-qa-core'\nimport { resolveConfig } from '../config.js'\n\nconst CACHE_DIR_FALLBACK = DEFAULT_AGENT_QA_CACHE_DIR || '.agent-qa/cache'\n\nexport async function purgeTest(testPath: string, cacheDir: string, configContent = ''): Promise<number> {\n  const content = await readFile(testPath, 'utf-8')\n  const doc = parse(content)\n  const platform: string = doc.platform ?? 'web'\n  const steps: string[] = (doc.steps ?? []).map((s: unknown) =>\n    typeof s === 'string' ? s : (s as Record<string, string>).step,\n  )\n\n  const resolvedCacheDir = resolve(cacheDir)\n  let purged = 0\n\n  for (let i = 0; i < steps.length; i++) {\n    const stepHash = hashStepInstruction(steps[i], platform, configContent, content, i)\n    const dirPath = join(resolvedCacheDir, stepHash)\n    try {\n      await stat(dirPath)\n      await rm(dirPath, { recursive: true, force: true })\n      purged++\n    } catch {\n      // directory doesn't exist — skip\n    }\n  }\n\n  return purged\n}\n\nexport async function purgeAll(cacheDir: string, force: boolean): Promise<number> {\n  const resolvedDir = resolve(cacheDir)\n  let entries: string[]\n  try {\n    entries = await readdir(resolvedDir)\n  } catch (err: unknown) {\n    if ((err as NodeJS.ErrnoException).code === 'ENOENT') return 0\n    throw err\n  }\n\n  if (entries.length === 0) return 0\n\n  if (!force) {\n    const rl = createInterface({ input: process.stdin, output: process.stdout })\n    const answer = await new Promise<string>((res) => {\n      rl.question(`About to delete ${entries.length} cached plans. Continue? (y/N) `, res)\n    })\n    rl.close()\n    if (answer.toLowerCase() !== 'y') {\n      console.log('Aborted.')\n      return 0\n    }\n  }\n\n  for (const entry of entries) {\n    await rm(join(resolvedDir, entry), { recursive: true, force: true })\n  }\n\n  return entries.length\n}\n\nexport function createCacheCommand(): Command {\n  const cmd = new Command('cache').description('Manage action cache')\n\n  cmd\n    .command('purge')\n    .description('Clear cached action plans')\n    .option('--test <path>', 'purge cache for a specific test file')\n    .option('--all', 'purge all cached plans')\n    .option('--force', 'skip confirmation prompt')\n    .action(async (opts) => {\n      if (!opts.test && !opts.all) {\n        console.error(pc.red('Specify --test <path> or --all'))\n        process.exitCode = 1\n        return\n      }\n\n      const parentOpts = cmd.parent?.opts() ?? {}\n      const config = await resolveConfig({\n        configPath: parentOpts.config as string | undefined,\n      })\n      const cacheDir = config.services?.cache?.dir ?? CACHE_DIR_FALLBACK\n\n      // Read raw config file content for cache key scoping\n      const configPath = (parentOpts.config as string | undefined) ?? 'agent-qa.config.yaml'\n      let configContent = ''\n      try {\n        configContent = await readFile(configPath, 'utf-8')\n      } catch { /* config file may not exist */ }\n\n      if (opts.test) {\n        const count = await purgeTest(opts.test, cacheDir, configContent)\n        if (count === 0) {\n          console.log(pc.dim('No cached plans found'))\n        } else {\n          console.log(pc.green(`Purged ${count} cached plans for ${basename(opts.test)}`))\n        }\n      } else if (opts.all) {\n        const count = await purgeAll(cacheDir, !!opts.force)\n        if (count === 0) {\n          console.log(pc.dim('No cached plans found'))\n        } else {\n          console.log(pc.green(`Purged ${count} cached plans (all)`))\n        }\n      }\n    })\n\n  return cmd\n}\n","import { Command } from 'commander'\nimport { writeFileSync, mkdirSync, existsSync, readFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport { stringify } from 'yaml'\nimport pc from 'picocolors'\nimport select from '@inquirer/select'\nimport input from '@inquirer/input'\nimport checkbox from '@inquirer/checkbox'\nimport {\n  DEFAULT_AGENT_QA_AUTH_STATES_DIR,\n  DEFAULT_AGENT_QA_CACHE_DIR,\n  DEFAULT_AGENT_QA_RUNTIME_DIR,\n} from '@vostride/agent-qa-core'\nimport { DEFAULT_ANTHROPIC_MODEL, DEFAULT_GEMINI_MODEL, DEFAULT_OPENAI_MODEL } from '../model-defaults.js'\n\ntype Platform = 'web' | 'android' | 'ios' | 'web+android' | 'web+ios'\ntype PlatformCapability = 'web' | 'mobile'\ntype MobileRuntime = 'android' | 'ios'\ntype InitPlatformSelection = {\n  capabilities: PlatformCapability[]\n  mobileRuntimes: MobileRuntime[]\n}\ntype InitPlatformInput = Platform | InitPlatformSelection\ntype LLMSetupChoice = 'none' | 'codex' | 'claude-code'\ntype InitLLMConfig = {\n  name: string\n  provider: string\n  model: string\n  baseURL?: string\n}\nconst INIT_CACHE_DIR = DEFAULT_AGENT_QA_CACHE_DIR || '.agent-qa/cache'\nconst INIT_AUTH_STATES_DIR = DEFAULT_AGENT_QA_AUTH_STATES_DIR || '.agent-qa/auth-states'\nconst INIT_RUNTIME_DIR = DEFAULT_AGENT_QA_RUNTIME_DIR || '.agent-qa'\nconst SUBSCRIPTION_AUTH_PACKAGE = '@vostride/agent-qa-subscription-auth'\nconst PACKAGE_JSON_FILE = 'package.json'\nconst DEFAULT_SCREENSHOT_SIZE = '50kb'\nconst DEFAULT_EFFECTIVE_RESOLUTION = 500\nconst OPENAI_SUBSCRIPTION_CONFIG: InitLLMConfig = {\n  name: 'codex',\n  provider: 'openai-subscription',\n  model: DEFAULT_OPENAI_MODEL,\n}\nconst ANTHROPIC_SUBSCRIPTION_CONFIG: InitLLMConfig = {\n  name: 'claude-subscription',\n  provider: 'anthropic-subscription',\n  model: DEFAULT_ANTHROPIC_MODEL,\n}\n\nexport const PROVIDER_CHOICES = [\n  { value: 'openai-compatible', name: 'OpenAI-compatible' },\n  { value: 'anthropic-compatible', name: 'Anthropic-compatible' },\n  { value: 'openai-subscription', name: 'OpenAI subscription' },\n  { value: 'anthropic-subscription', name: 'Anthropic subscription' },\n  { value: 'gemini', name: 'Gemini' },\n]\nexport const COMPATIBLE_PROVIDER_CHOICES = PROVIDER_CHOICES.filter(\n  choice => choice.value === 'openai-compatible' || choice.value === 'anthropic-compatible' || choice.value === 'gemini',\n)\nexport const LLM_SETUP_CHOICES: Array<{ value: LLMSetupChoice; name: string; description: string }> = [\n  {\n    value: 'none',\n    name: 'No subscription auth',\n    description: 'Configure OpenAI-compatible, Anthropic-compatible, or Gemini credentials later.',\n  },\n  {\n    value: 'codex',\n    name: 'Codex',\n    description: 'Use your existing OpenAI Codex subscription through the subscription-auth plugin.',\n  },\n  {\n    value: 'claude-code',\n    name: 'Claude Code',\n    description: 'Use your existing Anthropic Claude subscription through the subscription-auth plugin.',\n  },\n]\n\nfunction normalizePlatformSelection(platform: InitPlatformInput): InitPlatformSelection {\n  if (typeof platform !== 'string') {\n    return {\n      capabilities: [...new Set(platform.capabilities)],\n      mobileRuntimes: [...new Set(platform.mobileRuntimes)],\n    }\n  }\n\n  switch (platform) {\n    case 'web':\n      return { capabilities: ['web'], mobileRuntimes: [] }\n    case 'android':\n      return { capabilities: ['mobile'], mobileRuntimes: ['android'] }\n    case 'ios':\n      return { capabilities: ['mobile'], mobileRuntimes: ['ios'] }\n    case 'web+android':\n      return { capabilities: ['web', 'mobile'], mobileRuntimes: ['android'] }\n    case 'web+ios':\n      return { capabilities: ['web', 'mobile'], mobileRuntimes: ['ios'] }\n  }\n}\n\nfunction hasWeb(platform: InitPlatformInput): boolean {\n  return normalizePlatformSelection(platform).capabilities.includes('web')\n}\n\nfunction defaultExampleTargetName(platform: InitPlatformInput): string {\n  const selection = normalizePlatformSelection(platform)\n  if (hasWeb(platform)) return 'example-web'\n  if (selection.mobileRuntimes.includes('android')) return 'example-android'\n  return 'example-ios'\n}\n\nfunction buildTargets(platform: InitPlatformInput): Record<string, unknown> {\n  const selection = normalizePlatformSelection(platform)\n  const targets: Record<string, unknown> = {}\n\n  if (selection.capabilities.includes('web')) {\n    targets['example-web'] = { platform: 'web', url: 'https://example.com' }\n    targets['automation-exercise'] = { platform: 'web', url: 'https://automationexercise.com' }\n    targets['wai-bad'] = { platform: 'web', url: 'https://www.w3.org/WAI/demos/bad/before/home.html' }\n  }\n  if (selection.mobileRuntimes.includes('android')) {\n    targets['example-android'] = { platform: 'android' }\n  }\n  if (selection.mobileRuntimes.includes('ios')) {\n    targets['example-ios'] = { platform: 'ios' }\n  }\n\n  return targets\n}\n\nfunction buildExampleTest(platform: InitPlatformInput, variant: 'pass' | 'fail'): string {\n  const expectedUrl = variant === 'pass'\n    ? 'https://www.iana.org/help/example-domains'\n    : 'https://www.iana.org/example-domains'\n  const testId = variant === 'pass'\n    ? 't_amber-birch-coral-delta-ember-falcon-garden-harbor-island-jungle'\n    : 't_bronze-cedar-dune-ember-fjord-glade-harbor-ivory-jade-kelp'\n  const name = variant === 'pass' ? 'Example passing test' : 'Example failing test'\n  const browserOverride = variant === 'fail' && hasWeb(platform)\n    ? `use:\n  browser:\n    headless: false\n`\n    : ''\n\n  return `test-id: ${testId}\nname: ${name}\ntarget: ${defaultExampleTargetName(platform)}\n${browserOverride}steps:\n  - Verify the page says \"Example Domain\"\n  - Click on \"Learn More\"\n  - Verify the page url is \"${expectedUrl}\"\n`\n}\n\nconst AUTOMATION_EXERCISE_TESTS = [\n  {\n    fileName: 'home-smoke.yaml',\n    id: 't_class-volume-nth-intent-break-gun-gone-ging-twig-vert',\n    name: 'Automation Exercise home smoke',\n    steps: [\n      'Verify the page says \"Automation Exercise\"',\n      'Verify the page has \"Signup / Login\"',\n    ],\n  },\n  {\n    fileName: 'products-smoke.yaml',\n    id: 't_umble-ruby-direct-notify-rama-phony-dust-owl-lop-etch',\n    name: 'Automation Exercise products smoke',\n    steps: [\n      'Click on \"Products\"',\n      'Verify the page says \"All Products\"',\n    ],\n  },\n  {\n    fileName: 'cart-smoke.yaml',\n    id: 't_kend-lack-infect-nou-bah-kil-point-reak-ura-loo',\n    name: 'Automation Exercise cart smoke',\n    steps: [\n      'Click on \"Cart\"',\n      'Verify the page says \"Shopping Cart\"',\n    ],\n  },\n]\nconst HN_TOP_STORY_HOOK_ID = 'h_aster-bloom-cloud-drift-ember-field-glade-hollow-ivory-jasper'\nconst HN_TOP_STORY_TEST_ID = 't_quad-adar-micro-magic-cross-cue-open-agog-rang-cours'\nconst BAD_A11Y_TEST_ID = 't_ponent-toa-base-fred-click-sigma-lad-agen-report-sticky'\n\nfunction buildAutomationExerciseTest(test: typeof AUTOMATION_EXERCISE_TESTS[number]): string {\n  return `test-id: ${test.id}\nname: ${test.name}\ntarget: automation-exercise\nsteps:\n${test.steps.map(step => `  - ${step}`).join('\\n')}\n`\n}\n\nfunction buildAutomationExerciseSuite(): string {\n  return `suite-id: s_hill-gant-verb-nast-hunter-rita-home-store-amy-crest\nname: Automation Exercise demo suite\ntarget: automation-exercise\ntests:\n${AUTOMATION_EXERCISE_TESTS.map(test => `  - test: tests/automation-exercise/${test.fileName}\\n    id: ${test.id}`).join('\\n')}\n`\n}\n\nfunction buildHooksFile(platform: InitPlatformInput): string {\n  if (!hasWeb(platform)) return 'hooks: []\\n'\n\n  return `hooks:\n  - id: ${HN_TOP_STORY_HOOK_ID}\n    name: Fetch first Hacker News story\n    runtime: node\n    file: scripts/fetch-hn-top-story.mjs\n    timeout: 30s\n    network: true\n`\n}\n\nfunction buildHackerNewsHookScript(): string {\n  return `import { writeFile } from 'node:fs/promises'\n\nconst topStoriesUrl = 'https://hacker-news.firebaseio.com/v0/topstories.json'\n\nasync function getJson(url) {\n  const response = await fetch(url)\n  if (!response.ok) {\n    throw new Error(\\`HN API request failed: \\${response.status} \\${response.statusText}\\`)\n  }\n  return response.json()\n}\n\nfunction escapeEnvValue(value) {\n  return value\n    .replace(/\\\\r?\\\\n/g, ' ')\n    .replace(/\\\\\\\\/g, '\\\\\\\\\\\\\\\\')\n    .replace(/\"/g, '\\\\\\\\\"')\n}\n\nconst storyIds = await getJson(topStoriesUrl)\nconst firstStoryId = Array.isArray(storyIds) ? storyIds[0] : undefined\nif (!Number.isInteger(firstStoryId)) {\n  throw new Error('HN API returned no first story id')\n}\n\nconst story = await getJson(\\`https://hacker-news.firebaseio.com/v0/item/\\${firstStoryId}.json\\`)\nconst title = typeof story?.title === 'string' ? story.title.trim() : ''\nif (!title) {\n  throw new Error(\\`HN item \\${firstStoryId} returned no title\\`)\n}\n\nawait writeFile('/tmp/agent-qa.env', [\n  \\`HN_FIRST_STORY_TITLE=\"\\${escapeEnvValue(title)}\"\\`,\n  \\`HN_FIRST_STORY_ID=\\${firstStoryId}\\`,\n  '',\n].join('\\\\n'), 'utf-8')\n`\n}\n\nfunction buildHackerNewsTopStoryTest(): string {\n  return `test-id: ${HN_TOP_STORY_TEST_ID}\nname: Hacker News top story hook demo\ntarget: example-web\nsetup:\n  - ${HN_TOP_STORY_HOOK_ID}\nuse:\n  cache: false\nsteps:\n  - Navigate to \"https://news.ycombinator.com/\"\n  - Verify the page shows \"{{env:HN_FIRST_STORY_TITLE}}\"\n`\n}\n\nfunction buildBadA11yTest(): string {\n  return `test-id: ${BAD_A11Y_TEST_ID}\nname: W3C BAD accessibility smoke\ntarget: wai-bad\nsteps:\n  - Verify the page says \"Welcome to CityLights\"\n  - Verify the page says \"Inaccessible Home Page\"\n`\n}\n\nfunction isSubscriptionProvider(provider: string): boolean {\n  return provider === 'openai-subscription' || provider === 'anthropic-subscription'\n}\n\nfunction readAgentQaPackageVersion(): string | null {\n  try {\n    const manifest = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf-8')) as Record<string, unknown>\n    return typeof manifest.version === 'string' && manifest.version.trim() ? manifest.version.trim() : null\n  } catch {\n    return null\n  }\n}\n\nfunction subscriptionAuthDependencyRange(): string {\n  return readAgentQaPackageVersion() ?? '*'\n}\n\nfunction objectRecord(value: unknown): Record<string, unknown> | null {\n  return value && typeof value === 'object' && !Array.isArray(value)\n    ? value as Record<string, unknown>\n    : null\n}\n\nfunction configUsesSubscriptionAuth(config: Record<string, unknown>): boolean {\n  const plugins = objectRecord(config.plugins)\n  const authPlugins = plugins?.auth\n  if (!Array.isArray(authPlugins)) return false\n  return authPlugins.some(plugin => objectRecord(plugin)?.package === SUBSCRIPTION_AUTH_PACKAGE)\n}\n\ntype SubscriptionAuthDependencyResult = {\n  path: string\n  created: boolean\n  range: string\n}\n\nexport function upsertSubscriptionAuthPackageDependency(dir: string): SubscriptionAuthDependencyResult {\n  const packageJsonPath = join(dir, PACKAGE_JSON_FILE)\n  const created = !existsSync(packageJsonPath)\n  const pkg = created\n    ? { private: true } as Record<string, unknown>\n    : JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as Record<string, unknown>\n\n  if (!objectRecord(pkg)) {\n    throw new Error(`${PACKAGE_JSON_FILE} must contain a JSON object to add ${SUBSCRIPTION_AUTH_PACKAGE}`)\n  }\n\n  const dependencyBlocks = ['devDependencies', 'dependencies', 'optionalDependencies', 'peerDependencies'] as const\n  const existingBlock = dependencyBlocks.find(blockName => {\n    const block = objectRecord(pkg[blockName])\n    return block && Object.prototype.hasOwnProperty.call(block, SUBSCRIPTION_AUTH_PACKAGE)\n  })\n  const targetBlock = existingBlock ?? 'devDependencies'\n  const targetDependencies = {\n    ...(objectRecord(pkg[targetBlock]) ?? {}),\n    [SUBSCRIPTION_AUTH_PACKAGE]: subscriptionAuthDependencyRange(),\n  }\n\n  pkg[targetBlock] = targetDependencies\n  for (const blockName of dependencyBlocks) {\n    if (blockName === targetBlock) continue\n    const block = objectRecord(pkg[blockName])\n    if (!block || !Object.prototype.hasOwnProperty.call(block, SUBSCRIPTION_AUTH_PACKAGE)) continue\n    const nextBlock = { ...block }\n    delete nextBlock[SUBSCRIPTION_AUTH_PACKAGE]\n    if (Object.keys(nextBlock).length > 0) pkg[blockName] = nextBlock\n    else delete pkg[blockName]\n  }\n\n  writeFileSync(packageJsonPath, `${JSON.stringify(pkg, null, 2)}\\n`)\n  return {\n    path: packageJsonPath,\n    created,\n    range: String(targetDependencies[SUBSCRIPTION_AUTH_PACKAGE]),\n  }\n}\n\nfunction toLLMEntry(config: InitLLMConfig): Record<string, unknown> {\n  const llmEntry: Record<string, unknown> = {\n    name: config.name,\n    provider: config.provider,\n    model: config.model,\n    screenshotSize: DEFAULT_SCREENSHOT_SIZE,\n    effectiveResolution: DEFAULT_EFFECTIVE_RESOLUTION,\n  }\n\n  if (config.provider === 'openai-compatible' || config.provider === 'anthropic-compatible') {\n    llmEntry.baseURL = config.baseURL\n  }\n\n  return llmEntry\n}\n\nfunction buildSingleLLMConfig(provider: string, model: string, baseURL?: string): InitLLMConfig {\n  return { name: 'default', provider, model, baseURL }\n}\n\nfunction defaultModelForProvider(provider: string): string {\n  switch (provider) {\n    case 'openai-compatible':\n      return DEFAULT_OPENAI_MODEL\n    case 'anthropic-compatible':\n      return DEFAULT_ANTHROPIC_MODEL\n    case 'gemini':\n      return DEFAULT_GEMINI_MODEL\n    default:\n      return 'model-name'\n  }\n}\n\nfunction subscriptionConfigsForChoice(choice: LLMSetupChoice): InitLLMConfig[] {\n  if (choice === 'codex') return [OPENAI_SUBSCRIPTION_CONFIG]\n  if (choice === 'claude-code') return [ANTHROPIC_SUBSCRIPTION_CONFIG]\n  return []\n}\n\nfunction subscriptionConfigsForChoices(choices: LLMSetupChoice[]): InitLLMConfig[] {\n  return choices.flatMap(subscriptionConfigsForChoice)\n}\n\nexport function buildDefaultConfig(\n  platform: InitPlatformInput,\n  providerOrLLMs: string | InitLLMConfig[],\n  model?: string,\n  baseURL?: string,\n): Record<string, unknown> {\n  const llmConfigs = Array.isArray(providerOrLLMs)\n    ? providerOrLLMs\n    : [buildSingleLLMConfig(providerOrLLMs, model ?? 'model-name', baseURL)]\n  const llmEntries = llmConfigs.map(toLLMEntry)\n  const usesSubscriptionAuth = llmConfigs.some(config => isSubscriptionProvider(config.provider))\n\n  const config: Record<string, unknown> = {\n    workspace: {\n      testMatch: ['tests/**/*.yaml'],\n      suiteMatch: ['suites/**/*.suite.yaml'],\n      hooksFile: 'hooks.yaml',\n      agentRules: './agent-rules.md',\n      envFile: '.env',\n      secretsFile: '.env.secrets.local',\n    },\n    services: {\n      dashboard: { port: 3100, artifactsDir: '.agent-qa/artifacts' },\n      mcp: { enabled: true, transport: 'http', host: '127.0.0.1', port: 3471, path: '/mcp' },\n      cache: { dir: INIT_CACHE_DIR, ttl: '7d' },\n      authState: { dir: INIT_AUTH_STATES_DIR },\n      ...(hasWeb(platform)\n        ? {\n            accessibility: {\n              enabled: true,\n              standard: 'wcag2aa',\n              runAfter: 'every-step',\n              failOnViolation: false,\n            },\n          }\n        : {}),\n      recording: { enabled: true },\n      memory: { enabled: true, provider: 'local', dir: 'agent-qa-memory' },\n      logging: { level: 'warn' },\n    },\n    registry: {\n      llms: llmEntries,\n      targets: buildTargets(platform),\n    },\n    ...(usesSubscriptionAuth\n      ? {\n          plugins: {\n            auth: [{ package: SUBSCRIPTION_AUTH_PACKAGE }],\n          },\n        }\n      : {}),\n    use: {\n      ...(hasWeb(platform) ? { browser: { name: 'chromium', headless: true, viewport: { width: 1280, height: 720 } } } : {}),\n      mobile: { appState: 'preserve' },\n      timeout: { step: '5m', test: '30m', navigation: '1m' },\n      healing: { maxAttempts: 3 },\n      planner: { maxSubActions: 10, previousStepCount: 5 },\n      logCapture: { console: true, network: true },\n      parallel: false,\n      llm: llmConfigs[0]?.name ?? 'default',\n    },\n  }\n\n  return config\n}\n\nfunction addYamlComments(yamlStr: string): string {\n  let result = '# agent-qa Configuration\\n\\n'\n\n  const lines = yamlStr.split('\\n')\n  for (const line of lines) {\n    if (line.startsWith('workspace:')) {\n      result += '# File discovery and project settings\\n'\n    } else if (line.startsWith('services:')) {\n      result += '\\n# Infrastructure services (dashboard, MCP, cache, auth state, logging)\\n'\n    } else if (line.startsWith('registry:')) {\n      result += '\\n# Named resource definitions (LLM configs, app targets)\\n'\n    } else if (line.startsWith('plugins:')) {\n      result += '\\n# Optional subscription auth plugin declarations\\n'\n    } else if (line.startsWith('use:')) {\n      result += '\\n# Execution settings (cascades: global -> suite -> test -> CLI flags)\\n'\n    }\n    result += line + '\\n'\n\n    if (line === '  secretsFile: .env.secrets.local') {\n      result += '# Optional: ignore archived or generated tests.\\n'\n      result += '  # testPathIgnore:\\n'\n      result += '  #   - tests/archive/**/*.yaml\\n'\n    } else if (line === '    artifactsDir: .agent-qa/artifacts') {\n      result += '    # Optional: persist dashboard state to a custom SQLite path.\\n'\n      result += '    # dbPath: .agent-qa/dashboard.sqlite\\n'\n    } else if (line === '    ttl: 7d') {\n      if (yamlStr.includes('\\n  accessibility:\\n')) {\n        result += '  # Accessibility checks power the W3C BAD demo test.\\n'\n      } else {\n        result += '  # Optional accessibility service example:\\n'\n        result += '  # accessibility:\\n'\n        result += '  #   enabled: false\\n'\n        result += '  #   standard: wcag2aa\\n'\n      }\n    } else if (line === 'registry:') {\n      result += '  # Optional: local and cloud device/provider profiles.\\n'\n      result += '  # devices:\\n'\n      result += '  #   android-emu:\\n'\n      result += '  #     platform: android\\n'\n      result += '  #     transport: local\\n'\n      result += '  # providers:\\n'\n      result += '  #   browserstack:\\n'\n      result += '  #     username: ${BROWSERSTACK_USERNAME}\\n'\n      result += '  #     accessKey: ${BROWSERSTACK_ACCESS_KEY}\\n'\n    } else if (line === '  targets:') {\n      result += '    # Optional: add more web or mobile targets here.\\n'\n      result += '    # my-mobile:\\n'\n      result += '    #   platform: android\\n'\n      result += '    #   appPackage: com.example.app\\n'\n      result += '    #   appActivity: .MainActivity\\n'\n      result += '    #   app:\\n'\n      result += '    #     path: apps/example.apk\\n'\n    } else if (line === '  llm: codex' || line === '  llm: claude-subscription' || line === '  llm: default') {\n      result += '  # Optional: bind mobile runs to a configured device profile.\\n'\n      result += '  # device: android-emu\\n'\n    }\n  }\n\n  return result\n}\n\nconst DEFAULT_HOOKS_FILE = 'hooks.yaml'\nconst DEFAULT_AGENT_RULES_FILE = 'agent-rules.md'\nconst DEFAULT_ENV_FILE = '.env'\nconst DEFAULT_SECRETS_FILE = '.env.secrets.local'\nconst DEFAULT_LOCAL_CONFIG_FILE = 'agent-qa.local.yaml'\n\nfunction directoryGitignoreEntry(value: string): string {\n  return value.endsWith('/') ? value : `${value}/`\n}\n\nfunction buildGitignoreEntries(): string[] {\n  return [\n    directoryGitignoreEntry(INIT_RUNTIME_DIR),\n    directoryGitignoreEntry(INIT_AUTH_STATES_DIR),\n    'node_modules/',\n    DEFAULT_LOCAL_CONFIG_FILE,\n    DEFAULT_ENV_FILE,\n    DEFAULT_SECRETS_FILE,\n  ]\n}\n\nfunction buildLocalConfigTemplate(): string {\n  return `# This file is for machine-specific device, app, and provider bindings.\n# Keep it out of git.\n# Add agent-qa.local.yaml to .gitignore.\n\ndevices:\n  # Example local device binding:\n  # android-emu:\n  #   avd: Pixel_8_API_35\n\napps:\n  # Example app install binding:\n  # example-android:\n  #   path: apps/example.apk\n\nproviders:\n  # Example cloud provider credentials:\n  # browserstack:\n  #   username: ${'${BROWSERSTACK_USERNAME}'}\n  #   accessKey: ${'${BROWSERSTACK_ACCESS_KEY}'}\n`\n}\n\nfunction appendGitignore(dir: string): void {\n  const gitignorePath = join(dir, '.gitignore')\n  let existing = ''\n  if (existsSync(gitignorePath)) {\n    existing = readFileSync(gitignorePath, 'utf-8')\n  }\n\n  const existingEntries = new Set(\n    existing\n      .split(/\\r?\\n/)\n      .map(line => line.trim())\n      .filter(Boolean),\n  )\n  const missing = buildGitignoreEntries().filter((entry) => !existingEntries.has(entry))\n  if (missing.length === 0) return\n\n  const append = (existing.length > 0 && !existing.endsWith('\\n') ? '\\n' : '') + missing.join('\\n') + '\\n'\n  writeFileSync(gitignorePath, existing + append)\n}\n\nfunction browserSetupCommand(platform: InitPlatformInput): string | null {\n  return hasWeb(platform) ? 'agent-qa install-browsers --chromium' : null\n}\n\nfunction mobileDriverSetupCommand(platform: InitPlatformInput): string | null {\n  const runtimes = normalizePlatformSelection(platform).mobileRuntimes\n  if (runtimes.length === 0) return null\n  return 'agent-qa install-mobile-drivers --all'\n}\n\nfunction initNextSteps(platform: InitPlatformInput): Array<{ command: string; description: string }> {\n  const steps: Array<{ command: string; description: string }> = []\n  const browserCommand = browserSetupCommand(platform)\n  const mobileCommand = mobileDriverSetupCommand(platform)\n\n  if (browserCommand) {\n    steps.push({ command: browserCommand, description: 'Install browser support' })\n  }\n  if (mobileCommand) {\n    steps.push({ command: mobileCommand, description: 'Install mobile driver support' })\n  }\n\n  steps.push(\n    { command: 'agent-qa doctor', description: 'Verify your environment' },\n    { command: 'Edit tests/example-pass.yaml', description: 'Write your first test' },\n    { command: 'agent-qa run', description: 'Run all tests' },\n    { command: 'agent-qa dashboard', description: 'View results in browser' },\n  )\n\n  return steps\n}\n\nexport function createInitCommand(): Command {\n  const cmd = new Command('init')\n    .description('Initialize a new agent-qa project')\n    .option('--dir <path>', 'target directory', process.cwd())\n    .option('--platform <type>', 'platform to configure (web, android, ios, web+android, web+ios)')\n    .option('--skip-install', 'deprecated no-op; setup commands are shown after init')\n    .option('--force', 'overwrite existing files')\n    .action(async (opts) => {\n      const dir = resolve(opts.dir)\n      const force = opts.force ?? false\n\n      const isInteractive = !opts.platform\n\n      let platform: InitPlatformInput\n      let provider = 'anthropic-subscription'\n      let model = DEFAULT_ANTHROPIC_MODEL\n      let baseURL: string | undefined\n      let llmConfigs: InitLLMConfig[] | undefined\n\n      if (isInteractive) {\n        // Step 1 — Platform selection\n        const capabilities = await checkbox<PlatformCapability>({\n          message: 'What platform will you test?',\n          choices: [\n            { value: 'web', name: 'Web', description: 'Test web apps with Playwright', checked: true },\n            { value: 'mobile', name: 'Mobile', description: 'Test Android or iOS apps with Appium', checked: false },\n          ],\n          required: true,\n          validate: (value) => value.length > 0 || 'Select at least one platform.',\n        }) as PlatformCapability[]\n\n        const mobileRuntimes: MobileRuntime[] = capabilities.includes('mobile') ? ['android', 'ios'] : []\n\n        platform = { capabilities, mobileRuntimes }\n\n        // Step 2 — Subscription-auth choice\n        const llmSetup = await checkbox<LLMSetupChoice>({\n          message: `Subscription auth ${pc.dim('(optional)')}`,\n          choices: LLM_SETUP_CHOICES,\n          required: true,\n          validate: (value) => {\n            if (value.length === 0) return 'Select No subscription auth or at least one subscription provider.'\n            const selectedValues = value.map(choice => choice.value)\n            if (selectedValues.includes('none') && selectedValues.length > 1) {\n              return 'No subscription auth cannot be combined with Codex or Claude Code.'\n            }\n            return true\n          },\n        }) as LLMSetupChoice[]\n\n        if (llmSetup.includes('none')) {\n          // Step 3 — Provider selection for non-subscription paths\n          provider = await select({\n            message: 'Which LLM provider?',\n            choices: COMPATIBLE_PROVIDER_CHOICES,\n            default: 'anthropic-compatible',\n          })\n\n          // Step 4 — Model selection\n          model = await input({ message: 'Model name:', default: defaultModelForProvider(provider) })\n        } else {\n          llmConfigs = subscriptionConfigsForChoices(llmSetup)\n          provider = llmConfigs[0]?.provider ?? provider\n          model = llmConfigs[0]?.model ?? model\n        }\n\n        // Step 5 — Exact compatible endpoint URL\n        if (provider === 'openai-compatible' || provider === 'anthropic-compatible') {\n          baseURL = await input({\n            message: 'Base URL:',\n            validate: (value) => value.trim().length > 0 || 'Base URL is required for compatible providers.',\n          })\n        }\n      } else {\n        // Non-interactive mode — use flag values\n        platform = (opts.platform ?? 'web') as Platform\n        provider = 'anthropic-subscription'\n        model = DEFAULT_ANTHROPIC_MODEL\n      }\n\n      const configPath = join(dir, 'agent-qa.config.yaml')\n\n      // Check existing config\n      if (existsSync(configPath) && !force) {\n        console.log(pc.yellow(`Config file already exists at ${configPath}. Use --force to overwrite.`))\n        return\n      }\n\n      // Create tests directory\n      const testsDir = join(dir, 'tests')\n      if (!existsSync(testsDir)) {\n        mkdirSync(testsDir, { recursive: true })\n      }\n\n      // Write config file\n      const config = buildDefaultConfig(platform, llmConfigs ?? provider, model, baseURL)\n      const usesSubscriptionAuth = configUsesSubscriptionAuth(config)\n      const yamlStr = stringify(config)\n      const configContent = addYamlComments(yamlStr)\n      writeFileSync(configPath, configContent)\n      console.log(pc.green(`✓ Created ${configPath}`))\n\n      const subscriptionAuthDependency = usesSubscriptionAuth\n        ? upsertSubscriptionAuthPackageDependency(dir)\n        : null\n      if (subscriptionAuthDependency) {\n        const action = subscriptionAuthDependency.created ? 'Created' : 'Updated'\n        console.log(pc.green(`✓ ${action} ${subscriptionAuthDependency.path}`))\n      }\n\n      const secretsPath = join(dir, DEFAULT_SECRETS_FILE)\n      if (force || !existsSync(secretsPath)) {\n        writeFileSync(secretsPath, '')\n        console.log(pc.green(`✓ Created ${secretsPath}`))\n      }\n\n      const envPath = join(dir, DEFAULT_ENV_FILE)\n      if (force || !existsSync(envPath)) {\n        writeFileSync(envPath, '')\n        console.log(pc.green(`✓ Created ${envPath}`))\n      }\n\n      const hooksPath = join(dir, DEFAULT_HOOKS_FILE)\n      if (force || !existsSync(hooksPath)) {\n        writeFileSync(hooksPath, buildHooksFile(platform))\n        console.log(pc.green(`✓ Created ${hooksPath}`))\n      }\n\n      const agentRulesPath = join(dir, DEFAULT_AGENT_RULES_FILE)\n      if (force || !existsSync(agentRulesPath)) {\n        writeFileSync(agentRulesPath, '# agent-qa Rules\\n')\n        console.log(pc.green(`✓ Created ${agentRulesPath}`))\n      }\n\n      const localConfigPath = join(dir, DEFAULT_LOCAL_CONFIG_FILE)\n      if (force || !existsSync(localConfigPath)) {\n        writeFileSync(localConfigPath, buildLocalConfigTemplate())\n        console.log(pc.green(`✓ Created ${localConfigPath}`))\n      }\n\n      // Write example tests\n      const examplePassPath = join(testsDir, 'example-pass.yaml')\n      writeFileSync(examplePassPath, buildExampleTest(platform, 'pass'))\n      console.log(pc.green(`✓ Created ${examplePassPath}`))\n\n      const exampleFailPath = join(testsDir, 'example-fail.yaml')\n      writeFileSync(exampleFailPath, buildExampleTest(platform, 'fail'))\n      console.log(pc.green(`✓ Created ${exampleFailPath}`))\n\n      if (hasWeb(platform)) {\n        const suitesDir = join(dir, 'suites')\n        if (!existsSync(suitesDir)) {\n          mkdirSync(suitesDir, { recursive: true })\n        }\n\n        const scriptsDir = join(dir, 'scripts')\n        if (!existsSync(scriptsDir)) {\n          mkdirSync(scriptsDir, { recursive: true })\n        }\n\n        const automationTestsDir = join(testsDir, 'automation-exercise')\n        if (!existsSync(automationTestsDir)) {\n          mkdirSync(automationTestsDir, { recursive: true })\n        }\n\n        for (const test of AUTOMATION_EXERCISE_TESTS) {\n          const testPath = join(automationTestsDir, test.fileName)\n          writeFileSync(testPath, buildAutomationExerciseTest(test))\n          console.log(pc.green(`✓ Created ${testPath}`))\n        }\n\n        const automationSuitePath = join(suitesDir, 'automation-exercise.suite.yaml')\n        writeFileSync(automationSuitePath, buildAutomationExerciseSuite())\n        console.log(pc.green(`✓ Created ${automationSuitePath}`))\n\n        const hnScriptPath = join(scriptsDir, 'fetch-hn-top-story.mjs')\n        writeFileSync(hnScriptPath, buildHackerNewsHookScript())\n        console.log(pc.green(`✓ Created ${hnScriptPath}`))\n\n        const hnTestPath = join(testsDir, 'hacker-news-top-story.yaml')\n        writeFileSync(hnTestPath, buildHackerNewsTopStoryTest())\n        console.log(pc.green(`✓ Created ${hnTestPath}`))\n\n        const badA11yTestPath = join(testsDir, 'bad-a11y.yaml')\n        writeFileSync(badA11yTestPath, buildBadA11yTest())\n        console.log(pc.green(`✓ Created ${badA11yTestPath}`))\n      }\n\n      // Update .gitignore\n      appendGitignore(dir)\n      console.log(pc.green('✓ Updated .gitignore'))\n\n      // Post-init summary\n      console.log('')\n      console.log(pc.green(pc.bold('✓ agent-qa project initialized!')))\n      console.log('')\n      console.log('  Created:')\n      console.log(`    ${pc.dim('•')} agent-qa.config.yaml`)\n      if (subscriptionAuthDependency) {\n        console.log(`    ${pc.dim('•')} ${PACKAGE_JSON_FILE} dependency for ${SUBSCRIPTION_AUTH_PACKAGE}@${subscriptionAuthDependency.range}`)\n      }\n      console.log(`    ${pc.dim('•')} ${DEFAULT_HOOKS_FILE}`)\n      console.log(`    ${pc.dim('•')} ${DEFAULT_AGENT_RULES_FILE}`)\n      console.log(`    ${pc.dim('•')} ${DEFAULT_ENV_FILE}`)\n      console.log(`    ${pc.dim('•')} ${DEFAULT_SECRETS_FILE}`)\n      console.log(`    ${pc.dim('•')} ${DEFAULT_LOCAL_CONFIG_FILE}`)\n      console.log(`    ${pc.dim('•')} tests/example-pass.yaml`)\n      console.log(`    ${pc.dim('•')} tests/example-fail.yaml`)\n      if (hasWeb(platform)) {\n        console.log(`    ${pc.dim('•')} tests/automation-exercise/*.yaml`)\n        console.log(`    ${pc.dim('•')} tests/hacker-news-top-story.yaml`)\n        console.log(`    ${pc.dim('•')} tests/bad-a11y.yaml`)\n        console.log(`    ${pc.dim('•')} suites/automation-exercise.suite.yaml`)\n        console.log(`    ${pc.dim('•')} scripts/fetch-hn-top-story.mjs`)\n      }\n      console.log(`    ${pc.dim('•')} .gitignore entries`)\n      console.log('')\n      console.log('  Next steps:')\n      for (const [index, step] of initNextSteps(platform).entries()) {\n        console.log(`    ${index + 1}. ${pc.cyan(step.command)}  ${step.description}`)\n      }\n      const generatedLLMs = ((config.registry as Record<string, unknown> | undefined)?.llms ?? []) as InitLLMConfig[]\n      const subscriptionLLMs = generatedLLMs.filter(llm => isSubscriptionProvider(String(llm.provider)))\n      if (subscriptionLLMs.length === 0) {\n        console.log(`    ${pc.dim('•')} Save credentials with ${pc.cyan('agent-qa auth set --config default --type api-key')}`)\n        if (provider === 'anthropic-compatible') {\n          console.log(`    ${pc.dim('•')} Bearer tokens use ${pc.cyan('agent-qa auth set --config default --type bearer-token')}`)\n        }\n      } else {\n        console.log(`    ${pc.dim('•')} Fetch ${SUBSCRIPTION_AUTH_PACKAGE} with your package manager install command`)\n        for (const llm of subscriptionLLMs) {\n          console.log(`    ${pc.dim('•')} Authenticate ${pc.cyan(String(llm.name))} from ${pc.cyan('agent-qa dashboard')}`)\n        }\n      }\n      console.log('')\n    })\n\n  return cmd\n}\n","import { spawnSync, type SpawnSyncReturns } from 'node:child_process'\nimport { createRequire } from 'node:module'\nimport { dirname, join } from 'node:path'\nimport { Command } from 'commander'\nimport pc from 'picocolors'\n\nexport interface BrowserInstallSelection {\n  all?: boolean\n  chromium?: boolean\n  firefox?: boolean\n  webkit?: boolean\n  withDeps?: boolean\n  force?: boolean\n}\n\nexport interface BrowserInstallResult {\n  ok: boolean\n  status: number\n  stage: 'resolve' | 'spawn' | 'installer'\n  error?: unknown\n}\n\nexport interface BrowserInstallDeps {\n  resolveCli?: () => string\n  spawn?: typeof spawnSync\n}\n\nfunction selectedBrowserCount(selection: BrowserInstallSelection): number {\n  return [selection.chromium, selection.firefox, selection.webkit].filter(Boolean).length\n}\n\nfunction validateBrowserInstallSelection(selection: BrowserInstallSelection): string | null {\n  if (!selection.all && selectedBrowserCount(selection) === 0) {\n    return 'Select at least one browser flag: --all, --chromium, --firefox, or --webkit.'\n  }\n\n  if (selection.all && selectedBrowserCount(selection) > 0) {\n    return 'Cannot combine --all with --chromium, --firefox, or --webkit.'\n  }\n\n  return null\n}\n\nexport function buildBrowserInstallArgs(selection: BrowserInstallSelection): string[] {\n  const args: string[] = []\n\n  if (selection.withDeps) args.push('--with-deps')\n  if (selection.force) args.push('--force')\n\n  if (!selection.all) {\n    if (selection.chromium) args.push('chromium')\n    if (selection.firefox) args.push('firefox')\n    if (selection.webkit) args.push('webkit')\n  }\n\n  return args\n}\n\nexport function formatInstallBrowsersRetryCommand(selection: BrowserInstallSelection): string {\n  const args = ['agent-qa', 'install-browsers']\n\n  if (selection.all) {\n    args.push('--all')\n  } else {\n    if (selection.chromium) args.push('--chromium')\n    if (selection.firefox) args.push('--firefox')\n    if (selection.webkit) args.push('--webkit')\n  }\n\n  if (selection.withDeps) args.push('--with-deps')\n  if (selection.force) args.push('--force')\n\n  return args.join(' ')\n}\n\nexport function resolvePlaywrightCoreCli(): string {\n  const require = createRequire(import.meta.url)\n  const webEntry = require.resolve('@vostride/agent-qa-web')\n  const webRequire = createRequire(webEntry)\n  const packagePath = webRequire.resolve('playwright-core/package.json')\n\n  return join(dirname(packagePath), 'cli.js')\n}\n\nfunction normalizeSpawnStatus(result: SpawnSyncReturns<Buffer>): number {\n  if (typeof result.status === 'number') return result.status\n  return 1\n}\n\nexport function runBrowserInstall(\n  selection: BrowserInstallSelection,\n  deps: BrowserInstallDeps = {},\n): BrowserInstallResult {\n  let cliPath: string\n  try {\n    cliPath = (deps.resolveCli ?? resolvePlaywrightCoreCli)()\n  } catch (error) {\n    return { ok: false, status: 1, stage: 'resolve', error }\n  }\n\n  const spawn = deps.spawn ?? spawnSync\n  const result = spawn(process.execPath, [cliPath, 'install', ...buildBrowserInstallArgs(selection)], {\n    stdio: 'inherit',\n  })\n\n  if (result.error) {\n    return { ok: false, status: normalizeSpawnStatus(result), stage: 'spawn', error: result.error }\n  }\n\n  const status = normalizeSpawnStatus(result)\n  return { ok: status === 0, status, stage: 'installer' }\n}\n\nfunction printBrowserInstallFailure(selection: BrowserInstallSelection, result: BrowserInstallResult): void {\n  if (result.stage === 'resolve') {\n    console.error(pc.red('agent-qa could not find its bundled browser installer.'))\n    console.error(pc.dim('Reinstall agent-qa dependencies, then retry:'))\n  } else {\n    console.error(pc.red('Browser installation failed.'))\n    console.error(pc.dim('Retry:'))\n  }\n\n  console.error(`  ${pc.cyan(formatInstallBrowsersRetryCommand(selection))}`)\n}\n\nexport function createInstallBrowsersCommand(deps: BrowserInstallDeps = {}): Command {\n  const cmd = new Command('install-browsers')\n    .description('Install browser support for agent-qa')\n    .option('--all', 'install all Playwright-managed browsers for agent-qa')\n    .option('--chromium', 'install Chromium browser support')\n    .option('--firefox', 'install Firefox browser support')\n    .option('--webkit', 'install WebKit browser support')\n    .option('--with-deps', 'also install required system dependencies')\n    .option('--force', 'force reinstall even if browser support already exists')\n    .action((opts) => {\n      const selection: BrowserInstallSelection = {\n        all: !!opts.all,\n        chromium: !!opts.chromium,\n        firefox: !!opts.firefox,\n        webkit: !!opts.webkit,\n        withDeps: !!opts.withDeps,\n        force: !!opts.force,\n      }\n\n      const validationError = validateBrowserInstallSelection(selection)\n      if (validationError) {\n        console.error(pc.red(`Error: ${validationError}`))\n        console.error(cmd.helpInformation())\n        process.exitCode = 1\n        return\n      }\n\n      console.log(pc.blue('Installing agent-qa browser support...'))\n      const result = runBrowserInstall(selection, deps)\n      if (result.ok) {\n        console.log(pc.green('✓ agent-qa browser support installed'))\n        return\n      }\n\n      printBrowserInstallFailure(selection, result)\n      process.exitCode = result.status || 1\n    })\n\n  return cmd\n}\n","import { execFileSync } from 'node:child_process'\nimport { dirname, resolve } from 'node:path'\nimport { Command } from 'commander'\nimport pc from 'picocolors'\nimport {\n  formatAppiumInstallGuidance,\n  resolveAppiumExecutable,\n  type ResolvedAppiumExecutable,\n} from '@vostride/agent-qa-core'\n\nexport type MobileDriverName = 'uiautomator2' | 'xcuitest'\nexport type MobileDriverTarget = 'android' | 'ios'\n\nexport interface MobileDriverInstallSelection {\n  all?: boolean\n  android?: boolean\n  ios?: boolean\n  update?: boolean\n  unsafe?: boolean\n  cwd?: string\n}\n\nexport interface MobileDriverInstallEvent {\n  driver: MobileDriverName\n  label: string\n  action: 'install' | 'reuse' | 'update'\n  ok: boolean\n  error?: unknown\n}\n\nexport interface MobileDriverInstallResult {\n  ok: boolean\n  status: number\n  stage: 'resolve' | 'check' | 'list' | 'driver'\n  appium?: ResolvedAppiumExecutable\n  events: MobileDriverInstallEvent[]\n  error?: unknown\n}\n\nexport interface MobileDriverInstallDeps {\n  resolveAppium?: typeof resolveAppiumExecutable\n  execFile?: AppiumExecFile\n}\n\nexport type AppiumExecFile = (\n  file: string,\n  args: string[],\n  options?: Record<string, unknown>,\n) => Buffer | string\n\ninterface MobileDriverDefinition {\n  target: MobileDriverTarget\n  driver: MobileDriverName\n  label: string\n}\n\nconst MOBILE_DRIVERS: MobileDriverDefinition[] = [\n  { target: 'android', driver: 'uiautomator2', label: 'UiAutomator2' },\n  { target: 'ios', driver: 'xcuitest', label: 'XCUITest' },\n]\n\nfunction selectedTargetCount(selection: MobileDriverInstallSelection): number {\n  return [selection.android, selection.ios].filter(Boolean).length\n}\n\nfunction selectedDrivers(selection: MobileDriverInstallSelection): MobileDriverDefinition[] {\n  if (selection.all) return MOBILE_DRIVERS\n  return MOBILE_DRIVERS.filter((driver) => selection[driver.target])\n}\n\nexport function validateMobileDriverInstallSelection(selection: MobileDriverInstallSelection): string | null {\n  if (!selection.all && selectedTargetCount(selection) === 0) {\n    return 'Select at least one mobile platform flag: --all, --android, or --ios.'\n  }\n\n  if (selection.all && selectedTargetCount(selection) > 0) {\n    return 'Cannot combine --all with --android or --ios.'\n  }\n\n  if (selection.unsafe && !selection.update) {\n    return 'Cannot use --unsafe without --update.'\n  }\n\n  return null\n}\n\nexport function formatInstallMobileDriversRetryCommand(selection: MobileDriverInstallSelection): string {\n  const args = ['agent-qa', 'install-mobile-drivers']\n\n  if (selection.all) {\n    args.push('--all')\n  } else {\n    if (selection.android) args.push('--android')\n    if (selection.ios) args.push('--ios')\n  }\n\n  if (selection.update) args.push('--update')\n  if (selection.unsafe) args.push('--unsafe')\n\n  return args.join(' ')\n}\n\nfunction collectDriverNames(value: unknown, names: Set<string>): void {\n  if (!value) return\n  if (typeof value === 'string') {\n    names.add(value)\n    return\n  }\n  if (Array.isArray(value)) {\n    for (const item of value) collectDriverNames(item, names)\n    return\n  }\n  if (typeof value !== 'object') return\n\n  const record = value as Record<string, unknown>\n  if (typeof record.name === 'string') names.add(record.name)\n  if (typeof record.driverName === 'string') names.add(record.driverName)\n  if (typeof record.automationName === 'string') names.add(record.automationName)\n\n  for (const [key, child] of Object.entries(record)) {\n    if (key !== 'drivers' && key !== 'installed' && key !== 'name' && key !== 'driverName' && typeof child === 'object' && child !== null) {\n      names.add(key)\n    }\n    collectDriverNames(child, names)\n  }\n}\n\nexport function parseInstalledAppiumDrivers(output: string): Set<string> {\n  const names = new Set<string>()\n  const trimmed = output.trim()\n  if (!trimmed) return names\n\n  try {\n    collectDriverNames(JSON.parse(trimmed), names)\n    const normalizedNames = new Set<string>()\n    for (const name of names) {\n      const normalized = name.toLowerCase()\n      normalizedNames.add(normalized)\n      if (normalized.includes('uiautomator2')) normalizedNames.add('uiautomator2')\n      if (normalized.includes('xcuitest')) normalizedNames.add('xcuitest')\n    }\n    return normalizedNames\n  } catch {\n    for (const line of trimmed.split('\\n')) {\n      const normalized = line.toLowerCase()\n      if (normalized.includes('uiautomator2')) names.add('uiautomator2')\n      if (normalized.includes('xcuitest')) names.add('xcuitest')\n    }\n    return names\n  }\n}\n\nfunction errorStatus(error: unknown): number {\n  const status = (error as { status?: unknown } | undefined)?.status\n  return typeof status === 'number' ? status : 1\n}\n\nfunction isMissingExecutableError(error: unknown): boolean {\n  return (error as NodeJS.ErrnoException | undefined)?.code === 'ENOENT'\n}\n\nfunction isAlreadyInstalledDriverError(error: unknown, driver: MobileDriverName): boolean {\n  const details = [\n    error instanceof Error ? error.message : String(error),\n    (error as { stdout?: unknown } | undefined)?.stdout,\n    (error as { stderr?: unknown } | undefined)?.stderr,\n  ].map(String).join('\\n').toLowerCase()\n\n  return details.includes(`driver named \"${driver}\" is already installed`)\n    || details.includes(`${driver}\" is already installed`)\n    || details.includes(`${driver} is already installed`)\n}\n\nfunction getInstalledAppiumDrivers(appiumCommand: string, execFile: AppiumExecFile): { ok: true; drivers: Set<string> } | { ok: false; error: unknown; status: number } {\n  try {\n    const output = execFile(appiumCommand, ['driver', 'list', '--installed', '--json'], { stdio: 'pipe', encoding: 'utf-8' })\n    return { ok: true, drivers: parseInstalledAppiumDrivers(String(output)) }\n  } catch {\n    try {\n      const output = execFile(appiumCommand, ['driver', 'list', '--installed'], { stdio: 'pipe', encoding: 'utf-8' })\n      return { ok: true, drivers: parseInstalledAppiumDrivers(String(output)) }\n    } catch (error) {\n      return { ok: false, error, status: errorStatus(error) }\n    }\n  }\n}\n\nfunction driverOperationArgs(driver: MobileDriverName, selection: MobileDriverInstallSelection, installed: boolean): { action: 'install' | 'reuse' | 'update'; args: string[] | null } {\n  if (installed && !selection.update) {\n    return { action: 'reuse', args: null }\n  }\n\n  if (installed && selection.update) {\n    const args = ['driver', 'update', driver]\n    if (selection.unsafe) args.push('--unsafe')\n    return { action: 'update', args }\n  }\n\n  return { action: 'install', args: ['driver', 'install', driver] }\n}\n\nexport function runMobileDriverInstall(\n  selection: MobileDriverInstallSelection,\n  deps: MobileDriverInstallDeps = {},\n): MobileDriverInstallResult {\n  const resolveAppium = deps.resolveAppium ?? resolveAppiumExecutable\n  const execFile = deps.execFile ?? execFileSync\n  const events: MobileDriverInstallEvent[] = []\n\n  let appium: ResolvedAppiumExecutable\n  try {\n    appium = resolveAppium({ cwd: selection.cwd ?? process.cwd() })\n  } catch (error) {\n    return { ok: false, status: 1, stage: 'resolve', events, error }\n  }\n\n  try {\n    execFile(appium.command, ['--version'], { stdio: 'pipe' })\n  } catch (error) {\n    return { ok: false, status: errorStatus(error), stage: 'check', appium, events, error }\n  }\n\n  const installedResult = getInstalledAppiumDrivers(appium.command, execFile)\n  if (!installedResult.ok) {\n    return { ok: false, status: installedResult.status, stage: 'list', appium, events, error: installedResult.error }\n  }\n\n  let status = 0\n  for (const definition of selectedDrivers(selection)) {\n    const installed = installedResult.drivers.has(definition.driver)\n    const operation = driverOperationArgs(definition.driver, selection, installed)\n    if (!operation.args) {\n      events.push({ driver: definition.driver, label: definition.label, action: operation.action, ok: true })\n      continue\n    }\n\n    try {\n      execFile(appium.command, operation.args, { stdio: 'inherit' })\n      events.push({ driver: definition.driver, label: definition.label, action: operation.action, ok: true })\n    } catch (error) {\n      if (operation.action === 'install' && isAlreadyInstalledDriverError(error, definition.driver)) {\n        events.push({ driver: definition.driver, label: definition.label, action: 'reuse', ok: true })\n        continue\n      }\n\n      status = status || errorStatus(error)\n      events.push({ driver: definition.driver, label: definition.label, action: operation.action, ok: false, error })\n    }\n  }\n\n  return { ok: status === 0, status, stage: 'driver', appium, events }\n}\n\nfunction resolveCommandCwd(command: Command): string {\n  const configPath = command.parent?.opts<{ config?: string }>().config ?? 'agent-qa.config.yaml'\n  return dirname(resolve(configPath))\n}\n\nfunction printMobileDriverInstallResult(selection: MobileDriverInstallSelection, result: MobileDriverInstallResult): void {\n  if (result.stage === 'check' && isMissingExecutableError(result.error)) {\n    console.error(pc.red('Appium not found.'))\n    console.error(pc.dim(formatAppiumInstallGuidance()))\n    return\n  }\n\n  if (result.stage === 'resolve') {\n    console.error(pc.red('agent-qa could not resolve an Appium executable.'))\n    console.error(pc.dim(formatAppiumInstallGuidance()))\n    return\n  }\n\n  if (result.stage === 'check') {\n    console.error(pc.red('Could not run Appium.'))\n    console.error(pc.dim(formatAppiumInstallGuidance()))\n    return\n  }\n\n  if (result.stage === 'list') {\n    console.error(pc.red('Could not inspect installed Appium drivers.'))\n    console.error(pc.dim('Retry:'))\n    console.error(`  ${pc.cyan(formatInstallMobileDriversRetryCommand(selection))}`)\n    return\n  }\n\n  for (const event of result.events) {\n    if (event.ok && event.action === 'reuse') {\n      console.log(pc.green(`✓ ${event.label} driver already installed`))\n    } else if (event.ok && event.action === 'install') {\n      console.log(pc.green(`✓ ${event.label} driver installed`))\n    } else if (event.ok && event.action === 'update') {\n      console.log(pc.green(`✓ ${event.label} driver updated`))\n    } else {\n      const action = event.action === 'update' ? 'update' : 'installation'\n      console.error(pc.red(`✗ ${event.label} driver ${action} failed`))\n    }\n  }\n\n  if (!result.ok) {\n    console.error(pc.dim('Retry:'))\n    console.error(`  ${pc.cyan(formatInstallMobileDriversRetryCommand(selection))}`)\n    return\n  }\n\n  console.log(pc.green('✓ agent-qa mobile driver support ready'))\n}\n\nexport function createInstallMobileDriversCommand(deps: MobileDriverInstallDeps = {}): Command {\n  const cmd = new Command('install-mobile-drivers')\n    .description('Install Appium mobile drivers for agent-qa')\n    .option('--all', 'install Android and iOS Appium drivers')\n    .option('--android', 'install the UiAutomator2 Appium driver')\n    .option('--ios', 'install the XCUITest Appium driver')\n    .option('--update', 'update selected drivers when they are already installed')\n    .option('--unsafe', 'allow Appium driver updates across major versions; requires --update')\n    .action((opts) => {\n      const selection: MobileDriverInstallSelection = {\n        all: !!opts.all,\n        android: !!opts.android,\n        ios: !!opts.ios,\n        update: !!opts.update,\n        unsafe: !!opts.unsafe,\n        cwd: resolveCommandCwd(cmd),\n      }\n\n      const validationError = validateMobileDriverInstallSelection(selection)\n      if (validationError) {\n        console.error(pc.red(`Error: ${validationError}`))\n        console.error(cmd.helpInformation())\n        process.exitCode = 1\n        return\n      }\n\n      console.log(pc.blue('Installing agent-qa mobile driver support...'))\n      const result = runMobileDriverInstall(selection, deps)\n      printMobileDriverInstallResult(selection, result)\n      if (!result.ok) {\n        process.exitCode = result.status || 1\n      }\n    })\n\n  return cmd\n}\n","import { Command } from 'commander'\nimport { execFileSync, execSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport pc from 'picocolors'\nimport { loadConfigFile } from '../config.js'\nimport { loadAuthPluginsForRawConfig, type LLMModelAdapter } from '../llm-utils.js'\nimport { DEFAULT_ANTHROPIC_MODEL } from '../model-defaults.js'\nimport {\n  discoverWorkspaceFiles,\n  formatAppiumInstallGuidance,\n  resolveAppiumExecutable,\n  resolveWorkspacePaths,\n  type AgentQaConfig,\n  type ResolvedWorkspacePaths,\n} from '@vostride/agent-qa-core'\n\ntype CheckStatus = 'pass' | 'warn' | 'fail' | 'skip'\n\ninterface CheckResult {\n  status: CheckStatus\n  message: string\n}\n\ninterface DoctorCheck {\n  name: string\n  check: () => Promise<CheckResult>\n  fixInstructions: string\n}\n\ntype DoctorWorkspaceResolution =\n  | { ok: true; workspace: ResolvedWorkspacePaths }\n  | { ok: false; error: string }\n\nfunction resolveDoctorWorkspace(\n  config: Record<string, unknown>,\n  configPath: string,\n): DoctorWorkspaceResolution {\n  try {\n    return {\n      ok: true,\n      workspace: resolveWorkspacePaths({\n        config: config as AgentQaConfig,\n        configPath,\n      }),\n    }\n  } catch (err) {\n    return {\n      ok: false,\n      error: err instanceof Error ? err.message : String(err),\n    }\n  }\n}\n\ntype ResolvedDoctorAuth =\n  | { kind: 'api-key'; apiKey: string }\n  | { kind: 'bearer-token'; token: string }\n  | { kind: 'auth-fetch'; fetch: typeof globalThis.fetch; modelAdapter: LLMModelAdapter }\n  | { kind: 'unauthenticated'; message: string }\n  | { kind: 'missing'; message: string }\n\nconst COMPATIBLE_PROVIDERS = new Set(['openai-compatible', 'anthropic-compatible'])\nconst SUBSCRIPTION_PROVIDERS = new Set(['openai-subscription', 'anthropic-subscription'])\n\ninterface ActiveLLMConfig {\n  name: string\n  provider: string\n  model: string\n  baseURL?: string\n  providerHeaders?: Record<string, string>\n}\n\nfunction getActiveLLMConfig(config: Record<string, unknown> | null): ActiveLLMConfig {\n  const registry = config?.registry as { llms?: ActiveLLMConfig[] } | undefined\n  const use = config?.use as { llm?: string } | undefined\n  const llms = registry?.llms ?? []\n  const selected = llms.find(llm => llm.name === use?.llm) ?? llms[0]\n\n  if (selected) {\n    return selected\n  }\n\n  return {\n    name: 'default',\n    provider: 'anthropic-subscription',\n    model: DEFAULT_ANTHROPIC_MODEL,\n  }\n}\n\nasync function resolveActiveLLMAuth(llm: ActiveLLMConfig): Promise<ResolvedDoctorAuth> {\n  const { resolveLLMAuth } = await import('@vostride/agent-qa-core') as unknown as {\n    resolveLLMAuth: (\n      configName: string,\n      llmConfig: {\n        provider: string\n        model: string\n        baseURL?: string\n        providerHeaders?: Record<string, string>\n      },\n    ) => Promise<ResolvedDoctorAuth>\n  }\n  return await resolveLLMAuth(llm.name, {\n    provider: llm.provider,\n    model: llm.model,\n    ...(llm.baseURL ? { baseURL: llm.baseURL } : {}),\n    ...(llm.providerHeaders ? { providerHeaders: llm.providerHeaders } : {}),\n  }) as ResolvedDoctorAuth\n}\n\nfunction applyResolvedAuth(llm: ActiveLLMConfig, auth: ResolvedDoctorAuth): Record<string, unknown> {\n  switch (auth.kind) {\n    case 'api-key':\n      return { ...llm, apiKey: auth.apiKey }\n    case 'bearer-token':\n      return { ...llm, authToken: auth.token }\n    case 'auth-fetch':\n      return { ...llm, fetch: auth.fetch, modelAdapter: auth.modelAdapter }\n    case 'unauthenticated':\n      return { ...llm }\n    case 'missing':\n      throw new Error(auth.message)\n  }\n}\n\nfunction formatStatus(status: CheckStatus): string {\n  switch (status) {\n    case 'pass': return pc.green('PASS')\n    case 'warn': return pc.yellow('WARN')\n    case 'fail': return pc.red('FAIL')\n    case 'skip': return pc.dim('SKIP')\n  }\n}\n\nfunction padDots(name: string, message: string): string {\n  const totalWidth = 60\n  const used = name.length + message.length\n  const dots = Math.max(2, totalWidth - used)\n  return pc.dim('.'.repeat(dots))\n}\n\nfunction checkNodeVersion(): DoctorCheck {\n  return {\n    name: 'Node.js',\n    fixInstructions: 'Install Node.js 24+ from https://nodejs.org/',\n    check: async () => {\n      const version = process.version\n      const major = parseInt(version.slice(1).split('.')[0], 10)\n      if (major >= 24) {\n        return { status: 'pass', message: version }\n      }\n      return { status: 'fail', message: `${version} (requires 24+)` }\n    },\n  }\n}\n\nfunction checkConfigFile(configPath: string): DoctorCheck {\n  return {\n    name: 'Config file',\n    fixInstructions: 'Run `agent-qa init` to create a config file',\n    check: async () => {\n      if (existsSync(configPath)) {\n        return { status: 'pass', message: 'agent-qa.config.yaml found' }\n      }\n      return { status: 'warn', message: 'agent-qa.config.yaml not found' }\n    },\n  }\n}\n\nfunction checkConfigValidation(config: Record<string, unknown> | null): DoctorCheck {\n  return {\n    name: 'Config validation',\n    fixInstructions: 'Fix the config errors above, or delete agent-qa.config.yaml and re-run `agent-qa init`',\n    check: async () => {\n      if (!config) {\n        return { status: 'skip', message: 'no config to validate' }\n      }\n\n      try {\n        const { AgentQaConfigSchema } = await import('@vostride/agent-qa-core')\n        const result = AgentQaConfigSchema.safeParse(config)\n        if (result.success) {\n          return { status: 'pass', message: 'config schema valid' }\n        }\n\n        const issues = result.error.issues.slice(0, 3)\n        const errors = issues.map((i: { path: PropertyKey[]; message: string }) =>\n          `${i.path.map(String).join('.')}: ${i.message}`\n        ).join('; ')\n        return { status: 'fail', message: errors }\n      } catch {\n        return { status: 'warn', message: 'could not validate config' }\n      }\n    },\n  }\n}\n\nfunction checkSecretsFile(config: Record<string, unknown> | null, configPath: string): DoctorCheck {\n  return {\n    name: 'Secrets file',\n    fixInstructions: 'Set workspace.secretsFile in agent-qa.config.yaml and create the file. It may be empty, but it must exist.',\n    check: async () => {\n      if (!config) {\n        return { status: 'skip', message: 'no config' }\n      }\n\n      const resolved = resolveDoctorWorkspace(config, configPath)\n      if (!resolved.ok) {\n        return { status: 'fail', message: resolved.error }\n      }\n\n      if (!existsSync(resolved.workspace.secretsFile.absolutePath)) {\n        return { status: 'fail', message: `not found: ${resolved.workspace.secretsFile.absolutePath}` }\n      }\n\n      return { status: 'pass', message: `${resolved.workspace.secretsFile.workspaceRelativePath} found` }\n    },\n  }\n}\n\nfunction checkWorkspaceSupportFiles(config: Record<string, unknown> | null, configPath: string): DoctorCheck {\n  return {\n    name: 'Workspace files',\n    fixInstructions: 'Create the files configured by workspace.hooksFile, workspace.agentRules, and workspace.envFile.',\n    check: async () => {\n      if (!config) {\n        return { status: 'skip', message: 'no config' }\n      }\n\n      const resolved = resolveDoctorWorkspace(config, configPath)\n      if (!resolved.ok) {\n        return { status: 'fail', message: resolved.error }\n      }\n\n      const missing = [\n        ['workspace.hooksFile', resolved.workspace.hooksFile],\n        ['workspace.agentRules', resolved.workspace.agentRules],\n        ['workspace.envFile', resolved.workspace.envFile],\n      ] as const\n      const missingFiles = missing.filter(([, file]) => !existsSync(file.absolutePath))\n\n      if (missingFiles.length > 0) {\n        return {\n          status: 'fail',\n          message: missingFiles.map(([key, file]) => `${key} -> ${file.absolutePath}`).join('; '),\n        }\n      }\n\n      return { status: 'pass', message: 'hooks, agent rules, and env file found' }\n    },\n  }\n}\n\nfunction checkDocker(): DoctorCheck {\n  return {\n    name: 'Docker',\n    fixInstructions: 'Install Docker Desktop from https://docker.com/ and ensure the daemon is running',\n    check: async () => {\n      try {\n        const { checkDockerAvailable } = await import('@vostride/agent-qa-core')\n        const available = await checkDockerAvailable()\n        if (available) {\n          return { status: 'pass', message: 'Docker daemon running' }\n        }\n        return { status: 'warn', message: 'Docker not available (hooks require Docker)' }\n      } catch {\n        return { status: 'warn', message: 'Docker not available (hooks require Docker)' }\n      }\n    },\n  }\n}\n\nfunction checkLLMApiKey(config: Record<string, unknown> | null): DoctorCheck {\n  return {\n    name: 'LLM credential',\n    fixInstructions: 'Run `agent-qa auth set --config <name> --type api-key` for API modes, or declare a subscription auth plugin and authenticate from `agent-qa dashboard`.',\n    check: async () => {\n      const llm = getActiveLLMConfig(config)\n      try {\n        const auth = await resolveActiveLLMAuth(llm)\n        switch (auth.kind) {\n          case 'api-key':\n            return { status: 'pass', message: 'Saved API key' }\n          case 'bearer-token':\n            return { status: 'pass', message: 'Saved bearer token' }\n          case 'auth-fetch':\n            return { status: 'pass', message: 'OAuth connected' }\n          case 'unauthenticated':\n            return { status: 'pass', message: `credential optional — ${auth.message}` }\n          case 'missing':\n            return { status: 'fail', message: auth.message }\n        }\n      } catch (err: unknown) {\n        return { status: 'warn', message: err instanceof Error ? err.message : 'could not resolve LLM credential' }\n      }\n    },\n  }\n}\n\nfunction checkSubscriptionAuth(config: Record<string, unknown> | null): DoctorCheck {\n  return {\n    name: 'Subscription Auth',\n    fixInstructions: 'Install `@vostride/agent-qa-subscription-auth`, declare it in plugins.auth, and authenticate from `agent-qa dashboard`.',\n    check: async () => {\n      const llm = getActiveLLMConfig(config)\n      if (!SUBSCRIPTION_PROVIDERS.has(llm.provider)) {\n        return { status: 'skip', message: `subscription not used for ${llm.provider}` }\n      }\n\n      try {\n        const auth = await resolveActiveLLMAuth(llm)\n        if (auth.kind === 'auth-fetch') {\n          return { status: 'pass', message: 'OAuth connected' }\n        }\n        if (auth.kind === 'missing') {\n          return { status: 'warn', message: auth.message }\n        }\n        return { status: 'warn', message: 'Subscription providers use OAuth login' }\n      } catch {\n        return { status: 'warn', message: 'could not check auth store' }\n      }\n    },\n  }\n}\n\nfunction checkLLMConnection(config: Record<string, unknown> | null): DoctorCheck {\n  return {\n    name: 'LLM connection',\n    fixInstructions: 'Check the saved credential, model name, and exact base URL. Run `agent-qa auth test --config <name>` for details.',\n    check: async () => {\n      if (!config) {\n        return { status: 'skip', message: 'no config' }\n      }\n\n      const llm = getActiveLLMConfig(config)\n      const provider = llm.provider\n      const baseURL = llm.baseURL\n\n      if (COMPATIBLE_PROVIDERS.has(provider) && (!baseURL || baseURL.trim() === '')) {\n        return { status: 'fail', message: `baseURL required for ${provider}` }\n      }\n\n      try {\n        const auth = await resolveActiveLLMAuth(llm)\n        if (auth.kind === 'missing') {\n          return { status: 'fail', message: auth.message }\n        }\n        const { createModel, getProviderOptions } = await import('@vostride/agent-qa-core')\n        const { generateText } = await import('ai')\n        const modelConfig = applyResolvedAuth(llm, auth)\n        const testModel = await createModel(modelConfig as any)\n        const providerOptions = getProviderOptions(modelConfig as any)\n        const controller = new AbortController()\n        const timeout = setTimeout(() => controller.abort(), 10000)\n        try {\n          await generateText({\n            model: testModel,\n            prompt: 'Say \"ok\"',\n            abortSignal: controller.signal,\n            ...(providerOptions ? { providerOptions } : {}),\n          })\n        } finally {\n          clearTimeout(timeout)\n        }\n        if (auth.kind === 'unauthenticated') {\n          return { status: 'pass', message: auth.message }\n        }\n        return { status: 'pass', message: 'connected' }\n      } catch (err) {\n        const msg = err instanceof Error ? err.message : String(err)\n        if (/auth|unauthorized|401|invalid.*key/i.test(msg)) {\n          return { status: 'fail', message: 'Authentication failed. Check the saved credential for this config.' }\n        }\n        if (/model|not found|404/i.test(msg)) {\n          return { status: 'fail', message: 'Model not found. Check the model name.' }\n        }\n        if (/rate.?limit|429/i.test(msg)) {\n          return { status: 'warn', message: 'rate limited — try again later' }\n        }\n        if (/ECONNREFUSED|ENOTFOUND|timeout|abort/i.test(msg)) {\n          return { status: 'fail', message: 'Network error. Check the exact base URL and try again.' }\n        }\n        return { status: 'fail', message: msg.slice(0, 60) }\n      }\n    },\n  }\n}\n\nfunction checkPlaywright(config: Record<string, unknown> | null): DoctorCheck {\n  return {\n    name: 'Playwright',\n    fixInstructions: 'Run `agent-qa install-browsers --chromium`',\n    check: async () => {\n      // Skip if no browser config (mobile-only)\n      const browsers = config?.browsers as unknown[] | undefined\n      const hasBrowsers = browsers && browsers.length > 0\n      if (!hasBrowsers && !isWebPlatform(config)) {\n        return { status: 'skip', message: 'not configured' }\n      }\n\n      try {\n        execSync('npx playwright --version', { stdio: 'pipe' })\n        return { status: 'pass', message: 'installed' }\n      } catch {\n        return { status: 'fail', message: 'not installed' }\n      }\n    },\n  }\n}\n\nfunction appiumResolverCwd(configPath: string): string {\n  return dirname(resolve(configPath))\n}\n\nfunction mobileDriverInstallCommand(): string {\n  return 'agent-qa install-mobile-drivers --all'\n}\n\nfunction checkAppium(config: Record<string, unknown> | null, configPath: string): DoctorCheck {\n  return {\n    name: 'Appium',\n    fixInstructions: `${formatAppiumInstallGuidance()} Then run \\`${mobileDriverInstallCommand()}\\`.`,\n    check: async () => {\n      if (!isMobilePlatform(config)) {\n        return { status: 'skip', message: 'not configured' }\n      }\n\n      try {\n        const appium = resolveAppiumExecutable({ cwd: appiumResolverCwd(configPath) })\n        const version = execFileSync(appium.command, ['--version'], { stdio: 'pipe' }).toString().trim()\n        return { status: 'pass', message: `v${version}` }\n      } catch {\n        return { status: 'fail', message: 'not installed' }\n      }\n    },\n  }\n}\n\nfunction checkAppiumDrivers(config: Record<string, unknown> | null, configPath: string): DoctorCheck {\n  return {\n    name: 'Appium drivers',\n    fixInstructions: `Run \\`${mobileDriverInstallCommand()}\\``,\n    check: async () => {\n      if (!isMobilePlatform(config)) {\n        return { status: 'skip', message: 'not configured' }\n      }\n\n      try {\n        const appium = resolveAppiumExecutable({ cwd: appiumResolverCwd(configPath) })\n        const output = execFileSync(appium.command, ['driver', 'list', '--installed'], { stdio: 'pipe' }).toString()\n        const hasDrivers = output.includes('uiautomator2') || output.includes('xcuitest')\n        if (hasDrivers) {\n          return { status: 'pass', message: 'drivers installed' }\n        }\n        return { status: 'fail', message: 'no drivers installed' }\n      } catch {\n        return { status: 'fail', message: 'could not check drivers' }\n      }\n    },\n  }\n}\n\nfunction checkAndroidSDK(config: Record<string, unknown> | null): DoctorCheck {\n  return {\n    name: 'Android SDK',\n    fixInstructions: 'Install Android Studio and set ANDROID_HOME environment variable',\n    check: async () => {\n      if (!hasAndroidPlatform(config)) {\n        return { status: 'skip', message: 'not configured' }\n      }\n\n      const androidHome = process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT\n      if (!androidHome) {\n        return { status: 'fail', message: 'ANDROID_HOME not set' }\n      }\n\n      const adbPath = `${androidHome}/platform-tools/adb`\n      if (existsSync(adbPath)) {\n        return { status: 'pass', message: 'SDK found' }\n      }\n      return { status: 'fail', message: 'adb not found in ANDROID_HOME' }\n    },\n  }\n}\n\nfunction checkXcode(config: Record<string, unknown> | null): DoctorCheck {\n  return {\n    name: 'Xcode',\n    fixInstructions: 'Install Xcode from the Mac App Store and run `xcode-select --install`',\n    check: async () => {\n      if (!hasIOSPlatform(config)) {\n        return { status: 'skip', message: 'not configured' }\n      }\n\n      if (process.platform !== 'darwin') {\n        return { status: 'fail', message: 'iOS testing requires macOS' }\n      }\n\n      try {\n        execSync('xcrun simctl list', { stdio: 'pipe' })\n        return { status: 'pass', message: 'simctl available' }\n      } catch {\n        return { status: 'fail', message: 'simctl not available' }\n      }\n    },\n  }\n}\n\nfunction checkValidation(config: Record<string, unknown> | null, configPath: string): DoctorCheck {\n  return {\n    name: 'Validate',\n    fixInstructions: 'Run `agent-qa validate` for full details, then fix reported errors',\n    check: async () => {\n      if (!config) {\n        return { status: 'skip', message: 'no config' }\n      }\n\n      const resolved = resolveDoctorWorkspace(config, configPath)\n      if (!resolved.ok) {\n        return { status: 'fail', message: resolved.error }\n      }\n\n      try {\n        const { validateProject } = await import('@vostride/agent-qa-core')\n        const result = await validateProject({ configPath, workspace: resolved.workspace })\n\n        if (result.errorCount === 0 && result.warningCount === 0) {\n          return { status: 'pass', message: `${result.fileCount} files valid` }\n        }\n        if (result.errorCount === 0) {\n          return { status: 'warn', message: `${result.warningCount} warning(s)` }\n        }\n        return { status: 'fail', message: `${result.errorCount} error(s), ${result.warningCount} warning(s)` }\n      } catch {\n        return { status: 'warn', message: 'could not run validation' }\n      }\n    },\n  }\n}\n\nfunction checkTestDiscovery(config: Record<string, unknown> | null, configPath: string): DoctorCheck {\n  return {\n    name: 'Test discovery',\n    fixInstructions: 'Add testMatch patterns to agent-qa.config.yaml, or create test files matching your configured patterns',\n    check: async () => {\n      if (!config) {\n        return { status: 'skip', message: 'no config' }\n      }\n\n      try {\n        const resolved = resolveDoctorWorkspace(config, configPath)\n        if (!resolved.ok) {\n          return { status: 'fail', message: resolved.error }\n        }\n        const parts: string[] = []\n\n        const [testFiles, suiteFiles] = await Promise.all([\n          discoverWorkspaceFiles({ workspace: resolved.workspace, kind: 'test' }),\n          discoverWorkspaceFiles({ workspace: resolved.workspace, kind: 'suite' }),\n        ])\n        parts.push(`${testFiles.length} test file(s)`)\n        parts.push(`${suiteFiles.length} suite file(s)`)\n\n        const total = parts.join(', ')\n        if (parts.every(p => p.startsWith('0 '))) {\n          return { status: 'warn', message: `no files found — ${total}` }\n        }\n        return { status: 'pass', message: total }\n      } catch {\n        return { status: 'warn', message: 'could not scan for test files' }\n      }\n    },\n  }\n}\n\n// Helpers to detect platform from config\nfunction getTargetPlatforms(config: Record<string, unknown> | null): string[] {\n  const registry = config?.registry as { targets?: Record<string, Record<string, unknown>> } | undefined\n  const targets = registry?.targets\n    ?? (config?.targets as Record<string, Record<string, unknown>> | undefined)\n  if (!targets) return []\n  return Object.values(targets).map((t) => (t.platform as string) ?? 'web')\n}\n\nfunction isWebPlatform(config: Record<string, unknown> | null): boolean {\n  const platforms = getTargetPlatforms(config)\n  if (platforms.length === 0) return true // default\n  return platforms.some((p) => p === 'web')\n}\n\nfunction isMobilePlatform(config: Record<string, unknown> | null): boolean {\n  const platforms = getTargetPlatforms(config)\n  return platforms.some((p) => p === 'android' || p === 'ios')\n}\n\nfunction hasAndroidPlatform(config: Record<string, unknown> | null): boolean {\n  return getTargetPlatforms(config).some((p) => p === 'android')\n}\n\nfunction hasIOSPlatform(config: Record<string, unknown> | null): boolean {\n  return getTargetPlatforms(config).some((p) => p === 'ios')\n}\n\nfunction getGlobalConfigPath(command: Command): string {\n  return command.parent?.opts<{ config?: string }>().config ?? 'agent-qa.config.yaml'\n}\n\nexport function createDoctorCommand(): Command {\n  const cmd = new Command('doctor')\n    .description('Validate environment and dependencies')\n    .action(async function (this: Command) {\n      const configPath = getGlobalConfigPath(this)\n\n      // Try loading config (non-validated, just raw YAML)\n      let config: Record<string, unknown> | null = null\n      try {\n        const loaded = await loadConfigFile(configPath)\n        if (loaded && typeof loaded === 'object') {\n          config = loaded as Record<string, unknown>\n          await loadAuthPluginsForRawConfig(config, configPath)\n        }\n      } catch {\n        // Config load failed — doctor will report it\n      }\n\n      const checks: DoctorCheck[] = [\n        checkNodeVersion(),\n        checkConfigFile(configPath),\n        checkConfigValidation(config),\n        checkSecretsFile(config, configPath),\n        checkWorkspaceSupportFiles(config, configPath),\n        checkDocker(),\n        checkLLMApiKey(config),\n        checkSubscriptionAuth(config),\n        checkLLMConnection(config),\n        checkPlaywright(config),\n        checkAppium(config, configPath),\n        checkAppiumDrivers(config, configPath),\n        checkAndroidSDK(config),\n        checkXcode(config),\n        checkTestDiscovery(config, configPath),\n        checkValidation(config, configPath),\n      ]\n\n      console.log('')\n      console.log(pc.bold('  agent-qa doctor'))\n      console.log('')\n\n      let hasFailure = false\n      const results: { check: DoctorCheck; result: CheckResult }[] = []\n\n      for (const check of checks) {\n        const result = await check.check()\n        results.push({ check, result })\n\n        const dots = padDots(check.name, result.message)\n        const status = formatStatus(result.status)\n        console.log(`    ${check.name}  ${dots}  ${result.message}  ${status}`)\n\n        if (result.status === 'fail') {\n          console.log(pc.dim(`      Fix: ${check.fixInstructions}`))\n          hasFailure = true\n        }\n      }\n\n      console.log('')\n      if (hasFailure) {\n        console.log(pc.red('  Some checks failed. See fix instructions above.'))\n        process.exitCode = 1\n      } else {\n        console.log(pc.green('  All checks passed! Your environment is ready.'))\n      }\n      console.log('')\n    })\n\n  return cmd\n}\n","import { randomUUID } from 'node:crypto'\nimport { resolve as resolvePath } from 'node:path'\nimport { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveConfig, mergeWithTestConfig, mergeUseBlocks, formatConfigDebug, loadEnvOverrides } from '../config.js'\nimport { ATTR_RUNNER, ATTR_TRIGGER, AUTH_STATE_SCHEMA_VERSION, buildInternalRunAttributes, DEFAULT_AGENT_QA_ARTIFACTS_DIR, DEFAULT_AGENT_QA_CACHE_DIR, DEFAULT_AGENT_QA_VIDEOS_DIR, formatRunAttributesBlock, generateRunId, mergeRunAttributes, MobileSetupError, normalizeAuthStateUse, parseRunAttrFlags, redactAuthStateValue, resolveAuthStateForRun, resolveAuthStatePaths, resolveMemoryRoot, resolveMobileRunConfig, validateTrustedRunAttributes } from '@vostride/agent-qa-core'\nimport { discoverWorkspaceFiles, isWorkspacePathMatch, resolveWorkspaceFileTarget, resolveWorkspacePaths } from '@vostride/agent-qa-core'\nimport type { AgentQaConfig, AuthStateMetadata, NormalizedAuthStateUse, ResolvedAuthStateForRun, ResolvedAuthStatePaths, ResolvedMobileRunConfig, ResolvedWorkspacePaths, RunAttributes, RunAttributeRunner, RunAttributeTrigger, WorkspaceFileKind, WorkspaceFileRecord } from '@vostride/agent-qa-core'\nimport { resolveTarget, type ResolvedTarget } from '../targets.js'\nimport { resolveDevice, loadLocalBindings, resolveProviderCredentials, type ResolvedDevice } from '../devices.js'\nimport { applyResolvedAuthToModelConfig, resolveLLMModels, resolveModelAuth } from '../llm-utils.js'\nimport { formatInstallBrowsersRetryCommand, type BrowserInstallSelection } from './install-browsers.js'\nimport type { TestDefinition, TestResult, ParseError, PlatformAdapter, PlatformConfig, SuiteDefinition, SuiteResult, RunSuiteConfig, HookDefinition, SandboxRunnerOptions, SecretStore, SecretRedactor } from '@vostride/agent-qa-core'\nimport { isPathInsideDir } from '@vostride/agent-qa-core'\nimport { printAgentQaUpdateNoticeIfNeeded, shouldPrintAgentQaUpdateNotice, type AgentQaUpdateNoticeContext } from '../version-notice.js'\n\nconst RUNTIME_ARTIFACTS_DIR = DEFAULT_AGENT_QA_ARTIFACTS_DIR || '.agent-qa/artifacts'\nconst RUNTIME_CACHE_DIR = DEFAULT_AGENT_QA_CACHE_DIR || '.agent-qa/cache'\nconst RUNTIME_VIDEOS_DIR = DEFAULT_AGENT_QA_VIDEOS_DIR || '.agent-qa/artifacts/videos'\n\nlet _appiumManager: InstanceType<typeof import('@vostride/agent-qa-dashboard').AppiumManager> | null = null\n\nasync function acquireAppium(logLevel: string): Promise<string | undefined> {\n  if (process.env.AGENT_QA_APPIUM_URL) return process.env.AGENT_QA_APPIUM_URL\n  const { AppiumManager } = await import('@vostride/agent-qa-dashboard')\n  if (!_appiumManager) {\n    _appiumManager = new AppiumManager({\n      logLevel: logLevel === 'debug' ? 'debug' : 'normal',\n    })\n  }\n  await _appiumManager.acquire()\n  return _appiumManager.getUrl()\n}\n\nfunction releaseAppium(): void {\n  _appiumManager?.release()\n}\n\nexport async function createPlatformAdapter(\n  platform: 'web' | 'android' | 'ios',\n): Promise<PlatformAdapter> {\n  if (platform === 'android') {\n    try {\n      const { AndroidPlatformAdapter } = await import('@vostride/agent-qa-android')\n      return new AndroidPlatformAdapter()\n    } catch {\n      throw new Error(\n        'Android adapter not available. Install @vostride/agent-qa-android: pnpm add @vostride/agent-qa-android',\n      )\n    }\n  }\n  if (platform === 'ios') {\n    try {\n      const { IOSPlatformAdapter } = await import('@vostride/agent-qa-ios')\n      return new IOSPlatformAdapter()\n    } catch {\n      throw new Error(\n        'iOS adapter not available. Install @vostride/agent-qa-ios: pnpm add @vostride/agent-qa-ios',\n      )\n    }\n  }\n  const { WebPlatformAdapter } = await import('@vostride/agent-qa-web')\n  return new WebPlatformAdapter()\n}\n\nconst runWebAccessibilityCheck: NonNullable<RunSuiteConfig['accessibilityCheck']> = async (page, options) => {\n  const { runAccessibilityCheck } = await import('@vostride/agent-qa-web')\n  return runAccessibilityCheck(page as any, options)\n}\n\nexport function buildPlatformConfig(\n  platform: 'web' | 'android' | 'ios',\n  resolvedDevice: ResolvedDevice | undefined,\n  timeouts: PlatformConfig['timeouts'],\n  globalBrowser?: { name?: string; headless?: boolean; viewport?: { width: number; height: number } },\n  logCapture?: { console?: boolean; network?: boolean },\n  farmSession?: PlatformConfig['farmSession'],\n  mobileResolved?: ResolvedMobileRunConfig,\n): PlatformConfig {\n  if (platform === 'web') {\n    return {\n      platform: 'web',\n      browser: {\n        name: (globalBrowser?.name as 'chromium' | 'firefox' | 'webkit') ?? 'chromium',\n        headless: globalBrowser?.headless ?? true,\n        viewport: globalBrowser?.viewport,\n      },\n      timeouts,\n      logCapture,\n    }\n  }\n  return {\n    platform,\n    device: resolvedDevice ? {\n      name: resolvedDevice.name,\n      platform: resolvedDevice.platform,\n      transport: resolvedDevice.transport,\n      match: resolvedDevice.match,\n    } : undefined,\n    bundleId: mobileResolved?.app.bundleId,\n    appPackage: mobileResolved?.app.appPackage,\n    appActivity: mobileResolved?.app.appActivity,\n    deepLinkAppId: mobileResolved?.app.deepLinkAppId,\n    appState: mobileResolved?.appState,\n    appPath: mobileResolved?.app.install?.path,\n    browserstackApp: mobileResolved?.app.install?.browserstack,\n    appiumUrl: mobileResolved?.appium.url,\n    timeouts,\n    logCapture,\n    farmSession,\n  }\n}\n\ntype WebBrowserName = 'chromium' | 'firefox' | 'webkit'\n\ninterface FormattedFrameworkError {\n  displayMessage: string\n  failureSummary: string\n}\n\nfunction inferMissingBrowser(message: string): WebBrowserName | null {\n  const lower = message.toLowerCase()\n  if (/(^|[/\\\\])webkit-\\d/.test(lower) || lower.includes('webkit')) return 'webkit'\n  if (/(^|[/\\\\])firefox-\\d/.test(lower) || lower.includes('firefox')) return 'firefox'\n  if (/(^|[/\\\\])chromium-\\d/.test(lower) || lower.includes('chromium')) return 'chromium'\n  return null\n}\n\nfunction isRawPlaywrightMissingBrowserError(message: string): boolean {\n  const lower = message.toLowerCase()\n  return lower.includes(\"executable doesn't exist\")\n    && lower.includes('playwright')\n    && lower.includes('install')\n}\n\nfunction formatBrowserInstallSelection(browserName: WebBrowserName | null): BrowserInstallSelection {\n  if (browserName === 'chromium') return { chromium: true }\n  if (browserName === 'firefox') return { firefox: true }\n  if (browserName === 'webkit') return { webkit: true }\n  return { all: true }\n}\n\nfunction browserDisplayName(browserName: WebBrowserName | null): string {\n  if (browserName === 'chromium') return 'Chromium'\n  if (browserName === 'firefox') return 'Firefox'\n  if (browserName === 'webkit') return 'WebKit'\n  return 'the selected browser'\n}\n\nfunction formatMissingBrowserFrameworkError(message: string): FormattedFrameworkError | null {\n  const browserName = inferMissingBrowser(message)\n  const retryCommand = formatInstallBrowsersRetryCommand(formatBrowserInstallSelection(browserName))\n  const alreadyFriendly = message.startsWith('agent-qa browser support is not installed')\n\n  if (!alreadyFriendly && !isRawPlaywrightMissingBrowserError(message)) return null\n\n  const displayMessage = alreadyFriendly\n    ? message\n    : [\n      `agent-qa browser support is not installed for ${browserDisplayName(browserName)}.`,\n      '',\n      'Install the browser managed by agent-qa, then rerun the test:',\n      `  ${retryCommand}`,\n      '',\n      'This can happen after upgrading agent-qa or Playwright because browser binaries live outside the package install.',\n    ].join('\\n')\n\n  return {\n    displayMessage,\n    failureSummary: `Browser support missing: run ${retryCommand}`,\n  }\n}\n\nfunction formatFrameworkError(message: string): FormattedFrameworkError {\n  return formatMissingBrowserFrameworkError(message) ?? {\n    displayMessage: `Framework error: ${message}`,\n    failureSummary: `Framework error: ${message.slice(0, 200)}`,\n  }\n}\n\nfunction resolveDashboardVideoDir(\n  config: AgentQaConfig,\n  configDir: string,\n  dashboardEnabled: boolean,\n): string {\n  const recordingCfg = config.services?.recording as Record<string, unknown> | undefined\n  const configuredVideoDir = recordingCfg?.videoDir as string | undefined\n  if (configuredVideoDir) {\n    return resolvePath(configDir, configuredVideoDir)\n  }\n  if (dashboardEnabled) {\n    const dashArtifactsDir = (config.services?.dashboard as Record<string, unknown> | undefined)?.artifactsDir as string | undefined\n    return resolvePath(configDir, dashArtifactsDir ?? RUNTIME_ARTIFACTS_DIR, 'videos')\n  }\n  return resolvePath(configDir, RUNTIME_VIDEOS_DIR)\n}\n\ninterface RunOptions {\n  browser?: string\n  platform?: string\n  headless?: boolean\n  cache?: boolean\n  memory?: boolean\n  bail?: boolean\n  dryRun?: boolean\n  listTests?: boolean\n  junitOutput?: string\n  screenshotDir?: string\n  screenshotMode?: string\n  reporter?: string[]\n  record?: boolean\n  configDebug?: boolean\n  test?: boolean\n  suite?: boolean\n  all?: boolean\n  device?: string\n  var?: string[]\n  runAttr?: string[]\n}\n\nconst SUPPORTED_REPORTERS = ['console', 'junit', 'stdout-live', 'dashboard'] as const\ntype ReporterName = typeof SUPPORTED_REPORTERS[number]\n\ninterface ReporterSelection {\n  console: boolean\n  junit: boolean\n  stdoutLive: boolean\n  dashboard: boolean\n}\n\ninterface SecretsFileArtifactMetadata {\n  path: string | null\n  status: 'loaded' | 'missing' | 'unreadable' | 'invalid'\n  count?: number\n}\n\ninterface RuntimeSecretsContext {\n  secretStore: SecretStore\n  secretRedactor: SecretRedactor\n  secretsFileMetadata: SecretsFileArtifactMetadata\n}\n\nfunction parseVarFlags(flags: string[] | undefined): Record<string, string> {\n  if (!flags) return {}\n  const vars: Record<string, string> = {}\n  for (const kv of flags) {\n    const eqIdx = kv.indexOf('=')\n    if (eqIdx === -1) {\n      console.warn(`Warning: --var \"${kv}\" missing =, ignored`)\n      continue\n    }\n    vars[kv.slice(0, eqIdx)] = kv.slice(eqIdx + 1)\n  }\n  return vars\n}\n\nfunction resolveRunnerAttribute(transport: string | undefined): RunAttributeRunner {\n  return transport === 'browserstack' ? 'browserstack' : 'local'\n}\n\nfunction buildCliRunAttributes(userAttributes: RunAttributes, runner: RunAttributeRunner): RunAttributes {\n  return mergeRunAttributes(\n    buildInternalRunAttributes({ trigger: 'cli', runner }),\n    userAttributes,\n  )\n}\n\nfunction readRunAttributesFromEnv(): RunAttributes | undefined {\n  const raw = process.env.AGENT_QA_RUN_ATTRIBUTES_JSON\n  if (!raw) return undefined\n  let parsed: unknown\n  try {\n    parsed = JSON.parse(raw)\n  } catch {\n    throw new Error('inherited run attributes: AGENT_QA_RUN_ATTRIBUTES_JSON must contain valid run attributes JSON')\n  }\n  const attributes = validateTrustedRunAttributes(parsed, 'inherited run attributes')\n  return Object.keys(attributes).length > 0 ? attributes : undefined\n}\n\nfunction resolveCliRunAttributes(\n  userAttributes: RunAttributes,\n  runner: RunAttributeRunner,\n  inheritedAttributes?: RunAttributes,\n): RunAttributes {\n  if (!inheritedAttributes) return buildCliRunAttributes(userAttributes, runner)\n  const trigger = inheritedAttributes[ATTR_TRIGGER] as RunAttributeTrigger | undefined\n  const inheritedUserAttributes = Object.fromEntries(\n    Object.entries(inheritedAttributes)\n      .filter(([key]) => key !== ATTR_TRIGGER && key !== ATTR_RUNNER),\n  )\n  return mergeRunAttributes(\n    buildInternalRunAttributes({ trigger: trigger ?? 'cli', runner }),\n    inheritedUserAttributes,\n  )\n}\n\nfunction writeRunAttributesToEnv(attributes: RunAttributes): void {\n  process.env.AGENT_QA_RUN_ATTRIBUTES_JSON = JSON.stringify(attributes)\n}\n\nfunction printRunAttributes(attributes: RunAttributes | undefined): void {\n  if (!attributes || Object.keys(attributes).length === 0) return\n  const block = formatRunAttributesBlock(attributes)\n  if (block) console.log(block)\n}\n\nfunction resolveReporterSelection(opts: RunOptions, dashboardConfigured: boolean): { selection?: ReporterSelection; error?: string } {\n  const requiredDashboard = Boolean(process.env.AGENT_QA_RUN_ID || process.env.AGENT_QA_SUITE_QUEUE_ID)\n  const requested = opts.reporter\n    ?.flatMap((name) => name.split(','))\n    .map((name) => name.trim())\n    .filter(Boolean)\n\n  if (!requested?.length) {\n    return {\n      selection: {\n        console: true,\n        junit: Boolean(opts.junitOutput),\n        stdoutLive: process.env.AGENT_QA_LIVE_EVENTS === 'true',\n        dashboard: dashboardConfigured || requiredDashboard,\n      },\n    }\n  }\n\n  for (const name of requested) {\n    if (!SUPPORTED_REPORTERS.includes(name as ReporterName)) {\n      return { error: `Unknown reporter \"${name}\". Supported reporters: ${SUPPORTED_REPORTERS.join(', ')}` }\n    }\n  }\n\n  const selected = new Set(requested as ReporterName[])\n  if (selected.has('junit') && !opts.junitOutput) {\n    return { error: '--reporter junit requires --junit-output <path>' }\n  }\n\n  return {\n    selection: {\n      console: selected.has('console'),\n      junit: selected.has('junit'),\n      stdoutLive: selected.has('stdout-live'),\n      dashboard: selected.has('dashboard') || requiredDashboard,\n    },\n  }\n}\n\ntype AnalyticsRunEndReporter = {\n  onRunEnd?: (summary: {\n    results: TestResult[]\n    duration: number\n    passed: number\n    failed: number\n    skipped: number\n  }) => Promise<void> | void\n  flush: () => Promise<void>\n}\n\nasync function flushAnalyticsRunReporter(reporter: { flush: () => Promise<void> } | undefined): Promise<void> {\n  if (!reporter) return\n  try {\n    await reporter.flush()\n  } catch {\n    // Analytics is best-effort and must not affect run outcomes.\n  }\n}\n\nasync function maybePrintPostRunUpdateNotice(context: AgentQaUpdateNoticeContext): Promise<void> {\n  try {\n    if (!shouldPrintAgentQaUpdateNotice(context)) return\n    await printAgentQaUpdateNoticeIfNeeded(context)\n  } catch {\n    // Update notices are best-effort and must not affect run outcomes.\n  }\n}\n\nasync function captureSingleAnalyticsResult(\n  reporter: AnalyticsRunEndReporter | undefined,\n  result: TestResult,\n): Promise<void> {\n  if (!reporter?.onRunEnd) {\n    await flushAnalyticsRunReporter(reporter)\n    return\n  }\n  try {\n    await reporter.onRunEnd({\n      results: [result],\n      duration: result.duration,\n      passed: result.status === 'passed' ? 1 : 0,\n      failed: result.status === 'failed' ? 1 : 0,\n      skipped: result.status === 'skipped' ? 1 : 0,\n    })\n  } catch {\n    // Analytics is best-effort and must not affect run outcomes.\n  }\n  await flushAnalyticsRunReporter(reporter)\n}\n\nfunction formatParseErrors(errors: ParseError[]): void {\n  for (const err of errors) {\n    const location = `${err.file}:${err.line}:${err.column}`\n    const severity = err.severity === 'error' ? pc.red('error') : pc.yellow('warning')\n    console.error(`${severity}: ${err.message}`)\n    console.error(`  ${pc.blue('-->')} ${location}`)\n    if (err.source) {\n      console.error(`  ${pc.blue('|')} ${err.source}`)\n    }\n    if (err.suggestion) {\n      console.error(`  ${pc.blue('=')} ${pc.bold('help')}: ${err.suggestion}`)\n    }\n    console.error()\n  }\n}\n\nfunction createTestRunId(): string {\n  return process.env.AGENT_QA_RUN_ID ?? generateRunId()\n}\n\nfunction createSuiteRunId(): string {\n  return process.env.AGENT_QA_SUITE_QUEUE_ID ?? process.env.AGENT_QA_RUN_ID ?? generateRunId()\n}\n\nfunction printRunId(runId: string | null | undefined): void {\n  if (runId) console.log(`Run ID: ${runId}`)\n}\n\nfunction printMemoryStatus(log: { added: number; confirmed: number; deprecated: number; errors: string[]; curatorDuration: number }): void {\n  const parts: string[] = []\n  if (log.added > 0) parts.push(pc.green(`${log.added} added`))\n  if (log.confirmed > 0) parts.push(`${log.confirmed} confirmed`)\n  if (log.deprecated > 0) parts.push(pc.yellow(`${log.deprecated} deprecated`))\n  if (parts.length === 0) parts.push('no changes')\n  const secs = log.curatorDuration >= 1000 ? `${Math.round(log.curatorDuration / 1000)}s` : `${log.curatorDuration}ms`\n  console.log(`  ${pc.dim('Memory:')} ${parts.join(', ')} ${pc.dim(`(${secs})`)}`)\n  for (const err of log.errors) {\n    console.log(`  ${pc.dim('Memory:')} ${pc.yellow(`warning -- ${err}`)}`)\n  }\n}\n\nfunction isGlobLikePattern(value: string): boolean {\n  return /[*?[{]/.test(value)\n}\n\nfunction classifyRunPattern(pattern: string): WorkspaceFileKind {\n  return pattern.includes('.suite.') ? 'suite' : 'test'\n}\n\nfunction matchesCliWorkspacePattern(\n  workspace: ResolvedWorkspacePaths,\n  kind: WorkspaceFileKind,\n  pattern: string,\n  record: WorkspaceFileRecord,\n): boolean {\n  const patternWorkspace = {\n    ...workspace,\n    testMatch: kind === 'test' ? [pattern] : workspace.testMatch,\n    suiteMatch: kind === 'suite' ? [pattern] : workspace.suiteMatch,\n  }\n  return isWorkspacePathMatch({\n    workspace: patternWorkspace,\n    kind,\n    workspaceRelativePath: record.workspaceRelativePath,\n  })\n}\n\nasync function discoverFilesForCliPatterns(\n  workspace: ResolvedWorkspacePaths,\n  patterns: string[],\n): Promise<{ tests: string[]; suites: string[] }> {\n  const testRecords = await discoverWorkspaceFiles({ workspace, kind: 'test' })\n  const suiteRecords = await discoverWorkspaceFiles({ workspace, kind: 'suite' })\n  const discoveredByKind: Record<WorkspaceFileKind, WorkspaceFileRecord[]> = {\n    test: testRecords,\n    suite: suiteRecords,\n  }\n  const selectedByKind: Record<WorkspaceFileKind, Map<string, WorkspaceFileRecord>> = {\n    test: new Map(),\n    suite: new Map(),\n  }\n  const seenKinds = new Set<WorkspaceFileKind>()\n\n  for (const pattern of patterns) {\n    const kind = classifyRunPattern(pattern)\n    seenKinds.add(kind)\n\n    if (isGlobLikePattern(pattern)) {\n      for (const record of discoveredByKind[kind]) {\n        if (matchesCliWorkspacePattern(workspace, kind, pattern, record)) {\n          selectedByKind[kind].set(record.workspaceRelativePath, record)\n        }\n      }\n      continue\n    }\n\n    const record = await resolveWorkspaceFileTarget({\n      workspace,\n      kind,\n      filePath: pattern,\n      requireExisting: true,\n    })\n    selectedByKind[kind].set(record.workspaceRelativePath, record)\n  }\n\n  if (seenKinds.size > 1) {\n    throw new Error('Cannot mix suite files and test patterns in the same run')\n  }\n\n  return {\n    tests: [...selectedByKind.test.values()].map(record => record.absolutePath),\n    suites: [...selectedByKind.suite.values()].map(record => record.absolutePath),\n  }\n}\n\nfunction buildHooksArtifact(hooks?: Map<string, HookDefinition>): Array<{ id: string; name: string; runtime?: string; sourcePath?: string }> {\n  if (!hooks) return []\n  return [...hooks.values()].map((hook) => ({\n    id: hook.id,\n    name: hook.name,\n    runtime: (hook as any).runtime,\n    sourcePath: (hook as any).path ?? (hook as any).sourcePath,\n  }))\n}\n\nasync function loadRuntimeSecrets(input: {\n  config: AgentQaConfig\n  configDir: string\n  secretsFilePath?: string\n  readFileSync: typeof import('node:fs').readFileSync\n  existsSync: typeof import('node:fs').existsSync\n}): Promise<RuntimeSecretsContext> {\n  const configuredSecretsFile = (input.config as any).workspace?.secretsFile\n  if (typeof configuredSecretsFile !== 'string' || configuredSecretsFile.trim().length === 0) {\n    console.error(pc.red('Error: workspace.secretsFile is required. Run `agent-qa init` or set it in agent-qa.config.yaml.'))\n    process.exit(1)\n  }\n\n  const secretsPath = input.secretsFilePath ?? resolvePath(input.configDir, configuredSecretsFile)\n  if (!input.existsSync(secretsPath)) {\n    console.error(pc.red(`Error: Secrets file not found: ${secretsPath}`))\n    console.error(pc.dim('Create the file before running tests. It may be empty, but it must exist.'))\n    process.exit(1)\n  }\n\n  let secretsContent: string\n  try {\n    secretsContent = input.readFileSync(secretsPath, 'utf-8')\n  } catch {\n    console.error(pc.red(`Error: Secrets file could not be read: ${secretsPath}`))\n    console.error(pc.dim('Check the path and file permissions before running tests.'))\n    process.exit(1)\n  }\n\n  try {\n    const { SecretStore, SecretRedactor } = await import('@vostride/agent-qa-core')\n    const secretStore = SecretStore.fromEnvContent(secretsContent)\n    return {\n      secretStore,\n      secretRedactor: new SecretRedactor(secretStore),\n      secretsFileMetadata: {\n        path: secretsPath,\n        status: 'loaded',\n        count: secretStore.count(),\n      },\n    }\n  } catch (err) {\n    const message = err instanceof Error ? err.message : String(err)\n    console.error(pc.red(`Error: Secrets file is invalid: ${message}`))\n    process.exit(1)\n  }\n}\n\nfunction buildRunArtifactContext(input: {\n  kind: 'test' | 'suite-parent' | 'suite-child'\n  configContent: string\n  parsedConfig: unknown\n  effectiveConfig: unknown\n  envFilePath: string | null\n  rawEnvFileContent: string | null\n  envFileVars: Record<string, string>\n  secretsFileMetadata?: SecretsFileArtifactMetadata | null\n  cliVars: Record<string, string>\n  inlineVars: Record<string, string>\n  hooks?: Map<string, HookDefinition>\n  planner: { provider?: string; model?: string }\n  verifier: { provider?: string; model?: string }\n  platform: 'web' | 'android' | 'ios'\n  target: ResolvedTarget\n  deviceName?: string\n  attributes: RunAttributes\n  timeouts: Record<string, unknown>\n  cache: Record<string, unknown>\n  memory: Record<string, unknown>\n  source: Record<string, unknown>\n}): { artifact: Record<string, unknown> & { kind: 'test' | 'suite-parent' | 'suite-child' } } {\n  return redactAuthStateValue({\n    artifact: {\n      kind: input.kind,\n      config: {\n        rawConfigContent: input.configContent,\n        parsedConfig: input.parsedConfig,\n        effectiveConfig: input.effectiveConfig,\n        envFile: {\n          path: input.envFilePath,\n          content: input.rawEnvFileContent,\n          variables: input.envFileVars,\n        },\n        secretsFile: input.secretsFileMetadata ?? null,\n        cliVars: input.cliVars,\n        inlineVars: input.inlineVars,\n        hooks: buildHooksArtifact(input.hooks),\n        model: {\n          planner: input.planner,\n          verifier: input.verifier,\n        },\n        runtime: {\n          platform: input.platform,\n          targetName: input.target.name,\n          deviceName: input.deviceName,\n        },\n        timeouts: input.timeouts,\n        cache: input.cache,\n        memory: input.memory,\n      },\n      source: input.source,\n      metadata: {\n        attributes: input.attributes,\n      },\n    },\n  }) as { artifact: Record<string, unknown> & { kind: 'test' | 'suite-parent' | 'suite-child' } }\n}\n\nexport async function resolveDeviceAndFarmSession(\n  config: AgentQaConfig,\n  deviceName: string | undefined,\n  testPlatform: 'web' | 'android' | 'ios',\n  testName: string,\n  testTimeout?: number,\n  preResolvedDevice?: ResolvedDevice,\n  localBindingsOverride?: ReturnType<typeof loadLocalBindings>,\n  mobileResolved?: ResolvedMobileRunConfig,\n): Promise<{ resolvedDevice?: ResolvedDevice; farmSession?: PlatformConfig['farmSession'] }> {\n  if (!deviceName || testPlatform === 'web') return {}\n\n  const localBindings = localBindingsOverride ?? loadLocalBindings()\n  const resolved = preResolvedDevice ?? resolveDevice(config, deviceName, localBindings)\n\n  if (resolved.transport === 'local') {\n    return { resolvedDevice: resolved }\n  }\n\n  const credentials = resolveProviderCredentials(resolved.transport, localBindings)\n  const { getProvider, registerAllProviders } = await import('@vostride/agent-qa-core')\n  registerAllProviders()\n  const provider = getProvider(resolved.transport)\n  if (!provider) {\n    throw new Error(`Farm provider \"${resolved.transport}\" not found. Available: browserstack`)\n  }\n  const browserstackApp = mobileResolved?.app.install?.browserstack\n  if (!browserstackApp && hasNativeAppIdentity(mobileResolved) && !isBrowserMode(resolved.match)) {\n    throw new MobileSetupError({\n      category: 'app-install',\n      message: `BrowserStack native app target \"${mobileResolved?.targetName ?? 'unknown'}\" requires app.browserstack; app.path is local-only and is not used as a BrowserStack fallback.`,\n      platform: resolved.platform,\n      targetName: mobileResolved?.targetName,\n      deviceName: resolved.name,\n      appId: mobileResolved?.app.deepLinkAppId,\n      sourceTrace: mobileResolved?.sourceTrace,\n    })\n  }\n  let farmSession: PlatformConfig['farmSession']\n  try {\n    farmSession = await provider.resolveMobileCapabilities({\n      match: resolved.match,\n      platform: resolved.platform,\n      credentials,\n      testName,\n      testTimeout,\n      app: browserstackApp,\n      appState: mobileResolved?.appState,\n      appBaseDir: mobileResolved?.app.install?.browserstackBaseDir,\n      appSourceTrace: mobileResolved?.sourceTrace,\n    })\n  } catch (err) {\n    if (err instanceof MobileSetupError) throw err\n    if (browserstackApp) {\n      throw new MobileSetupError({\n        category: 'app-install',\n        message: `Failed to resolve BrowserStack app reference: ${err instanceof Error ? err.message : String(err)}`,\n        platform: resolved.platform,\n        targetName: mobileResolved?.targetName,\n        deviceName: resolved.name,\n        appId: browserstackApp,\n        cause: err,\n      })\n    }\n    throw err\n  }\n  return { resolvedDevice: resolved, farmSession }\n}\n\nfunction isBrowserMode(match: Record<string, unknown>): boolean {\n  return typeof match.browserName === 'string' && match.browserName.trim().length > 0\n}\n\nfunction hasNativeAppIdentity(mobileResolved?: ResolvedMobileRunConfig): boolean {\n  const app = mobileResolved?.app\n  return Boolean(app?.bundleId || app?.appPackage || app?.appActivity || app?.deepLinkAppId)\n}\n\nfunction wrapMobileSetupError(err: unknown): never {\n  if (err instanceof MobileSetupError) {\n    throw new Error(`${err.category}: ${err.message}`)\n  }\n  throw err\n}\n\nfunction resolveMobileRunOrThrow(input: Parameters<typeof resolveMobileRunConfig>[0]): ResolvedMobileRunConfig {\n  try {\n    return resolveMobileRunConfig(input)\n  } catch (err) {\n    wrapMobileSetupError(err)\n  }\n}\n\nfunction getSelectedAuthStateUse(use: Record<string, unknown> | undefined): NormalizedAuthStateUse | undefined {\n  return normalizeAuthStateUse(use)\n}\n\nasync function resolveSelectedAuthStateForRun(input: {\n  config: AgentQaConfig\n  configDir: string\n  resolvedTarget: ResolvedTarget\n  authState: NormalizedAuthStateUse | undefined\n}): Promise<ResolvedAuthStateForRun | undefined> {\n  if (!input.authState || input.authState.load === false) return undefined\n  try {\n    return await resolveAuthStateForRun({\n      configDir: input.configDir,\n      authStateDir: input.config.services?.authState?.dir,\n      targetName: input.resolvedTarget.name,\n      stateName: input.authState.name,\n      target: { platform: input.resolvedTarget.platform },\n    })\n  } catch (err) {\n    console.error(pc.red(`Error: ${err instanceof Error ? err.message : String(err)}`))\n    process.exit(2)\n  }\n}\n\nfunction resolveAuthStateCapturePathsForRun(input: {\n  config: AgentQaConfig\n  configDir: string\n  resolvedTarget: ResolvedTarget\n  authState: NormalizedAuthStateUse | undefined\n}): ResolvedAuthStatePaths | undefined {\n  if (input.authState?.capture !== true) return undefined\n  try {\n    return resolveAuthStatePaths({\n      configDir: input.configDir,\n      authStateDir: input.config.services?.authState?.dir,\n      targetName: input.resolvedTarget.name,\n      stateName: input.authState.name,\n      target: { platform: input.resolvedTarget.platform },\n    })\n  } catch (err) {\n    console.error(pc.red(`Error: ${err instanceof Error ? err.message : String(err)}`))\n    process.exit(2)\n  }\n}\n\nfunction formatAuthStateCaptureFailure(paths: ResolvedAuthStatePaths): string {\n  return `Could not save auth state \"${paths.stateName}\" for target \"${paths.targetName}\".`\n}\n\nfunction getStorageStateContext(adapter: PlatformAdapter): { storageState: (options?: { indexedDB?: boolean }) => Promise<unknown> } | null {\n  const maybeGetPage = (adapter as { getPage?: () => unknown }).getPage\n  if (typeof maybeGetPage !== 'function') return null\n\n  const page = maybeGetPage.call(adapter)\n  if (!page || typeof page !== 'object') return null\n\n  const maybeContext = (page as { context?: () => unknown }).context\n  if (typeof maybeContext !== 'function') return null\n\n  const context = maybeContext.call(page)\n  if (!context || typeof context !== 'object') return null\n\n  const storageState = (context as { storageState?: (options?: { indexedDB?: boolean }) => Promise<unknown> }).storageState\n  if (typeof storageState !== 'function') return null\n\n  return {\n    storageState: storageState.bind(context),\n  }\n}\n\nasync function captureAuthStateForRun(input: {\n  adapter: PlatformAdapter\n  paths: ResolvedAuthStatePaths\n}): Promise<ResolvedAuthStateForRun> {\n  const context = getStorageStateContext(input.adapter)\n  if (!context) {\n    throw new Error('Web auth-state capture requires a Playwright browser context.')\n  }\n\n  const payload = await context.storageState({ indexedDB: true })\n  const capturedAt = new Date().toISOString()\n  const metadata: AuthStateMetadata = {\n    version: AUTH_STATE_SCHEMA_VERSION,\n    kind: 'web' as const,\n    target: input.paths.targetName,\n    name: input.paths.stateName,\n    capturedAt,\n  }\n  const { writeAuthStateFiles } = await import('@vostride/agent-qa-core')\n  await writeAuthStateFiles(input.paths, { payload, metadata })\n\n  return {\n    version: metadata.version,\n    kind: metadata.kind,\n    targetName: metadata.target,\n    stateName: metadata.name,\n    capturedAt: metadata.capturedAt,\n    storageStatePath: input.paths.payloadPath,\n  }\n}\n\nasync function executeSuites(\n  suiteFiles: string[],\n  opts: RunOptions,\n  config: AgentQaConfig,\n  globalOpts: { config?: string; verbose?: boolean; quiet?: boolean; logLevel?: string },\n  configContent: string,\n  effectiveLogLevel: string,\n  variableContext?: {\n    envFileVars: Record<string, string>\n    inlineVars: Record<string, string>\n    cliVars: Record<string, string>\n    rawEnvFileContent?: string | null\n    resolvedEnvFilePath?: string | null\n    secretStore?: SecretStore\n    secretRedactor?: SecretRedactor\n    secretsFileMetadata?: SecretsFileArtifactMetadata | null\n    userRunAttributes: RunAttributes\n    inheritedRunAttributes?: RunAttributes\n  },\n  hooksContext?: { resolvedHooks: Map<string, HookDefinition>; sandboxOptions: SandboxRunnerOptions },\n): Promise<boolean> {\n  const { parseSuiteFile, parseTestFile, runSuite,\n    createModel, getProviderOptions, LLMPlanner, LLMVerifier,\n    ConsoleReporter, JUnitReporter, MultiReporter, createAnalyticsRunReporter,\n  } = await import('@vostride/agent-qa-core')\n  const { readFile } = await import('node:fs/promises')\n  const path = await import('node:path')\n\n  const configFilePath = globalOpts.config ?? 'agent-qa.config.yaml'\n  const configDir = path.dirname(path.resolve(configFilePath))\n\n  const suiteResults: SuiteResult[] = []\n\n  const activeSuiteDbs = new Set<any>()\n  let shutdownRequested = false\n\n  const handleShutdown = () => {\n    shutdownRequested = true\n    process.exitCode = 130\n    for (const activeSuiteDb of activeSuiteDbs) {\n      try {\n        const now = new Date().toISOString()\n        const runningRuns = activeSuiteDb.getRuns({ status: 'running' })\n          .filter((run: any) => run.suiteId && !run.parentRunId)\n        for (const run of runningRuns) {\n          activeSuiteDb.updateRun(run.id, { status: 'cancelled', endedAt: now })\n          const children = activeSuiteDb.getRunsByParent(run.id)\n          for (const child of children) {\n            if (child.status === 'running') {\n              activeSuiteDb.updateRun(child.id, { status: 'cancelled', endedAt: now })\n            }\n          }\n        }\n      } catch { /* best-effort cleanup */ }\n    }\n  }\n\n  process.once('SIGINT', handleShutdown)\n  process.once('SIGTERM', handleShutdown)\n\n  const dashboardCfg = config.services?.dashboard as Record<string, unknown> | undefined\n  const reporterSelectionResult = resolveReporterSelection(opts, Boolean(dashboardCfg))\n  if (reporterSelectionResult.error) {\n    console.error(pc.red(`Error: ${reporterSelectionResult.error}`))\n    process.exit(2)\n  }\n  const reporterSelection = reporterSelectionResult.selection!\n  const dashboardEnabled = reporterSelection.dashboard\n\n  const createSuiteDashboardResources = async (): Promise<{ dashboardDb?: any; logStorage?: any }> => {\n    if (!dashboardEnabled) return {}\n    try {\n      const { DashboardDatabase, resolveDashboardDbPath } = await import('@vostride/agent-qa-dashboard')\n      const configuredDbPath = dashboardCfg?.dbPath as string | undefined\n      const dashboardDb = new DashboardDatabase({\n        dbPath: resolveDashboardDbPath({ configDir, configuredDbPath }),\n      })\n      activeSuiteDbs.add(dashboardDb)\n      return { dashboardDb, logStorage: dashboardDb }\n    } catch (err) {\n      console.warn(pc.yellow(`Warning: Could not load dashboard reporter: ${err instanceof Error ? err.message : String(err)}`))\n      return {}\n    }\n  }\n\n  const closeSuiteDashboardDb = (dashboardDb?: any) => {\n    if (!dashboardDb) return\n    activeSuiteDbs.delete(dashboardDb)\n    dashboardDb.close()\n  }\n\n  type SuiteParentOutcome = { failed: boolean; cancelled: boolean }\n\n  const resolveSuiteParentPlatform = async (suite: SuiteDefinition): Promise<'web' | 'android' | 'ios'> => {\n    if (suite.target) {\n      return resolveTarget(config, suite.target).platform\n    }\n    const firstEntry = suite.tests[0]\n    if (firstEntry) {\n      const absolutePath = path.resolve(configDir, firstEntry.test)\n      const fileContent = await readFile(absolutePath, 'utf-8')\n      const parseResult = parseTestFile(fileContent, absolutePath)\n      const firstTest = parseResult.tests[0]\n      if (firstTest?.target) {\n        return resolveTarget(config, firstTest.target).platform\n      }\n    }\n    return 'web'\n  }\n\n  const runOneSuiteFile = async (suiteFile: string, suite: SuiteDefinition): Promise<SuiteParentOutcome> => {\n    const suiteFailureAttributes = resolveCliRunAttributes(\n      variableContext?.userRunAttributes ?? {},\n      'local',\n      variableContext?.inheritedRunAttributes,\n    )\n    const { dashboardDb, logStorage } = await createSuiteDashboardResources()\n    let lastSuiteRunId: string | undefined\n    let suiteFileContent = ''\n    try { suiteFileContent = await readFile(suiteFile, 'utf-8') } catch { /* best-effort */ }\n\n    const mergedUse = mergeUseBlocks(\n      config.use as Record<string, unknown>,\n      suite.use as Record<string, unknown> | undefined,\n      undefined,\n      {},\n    )\n    const suiteAuthStateUse = getSelectedAuthStateUse(mergedUse as Record<string, unknown>)\n\n    const testEntries: [TestDefinition, string][] = []\n    const suiteMembers: Array<Record<string, unknown>> = []\n    for (const { test: relativePath, id: suiteEntryId } of suite.tests) {\n      if (!isPathInsideDir(relativePath, configDir)) {\n        console.error(pc.red(`Path traversal rejected: ${relativePath}`))\n        const runId = createSuiteRunId()\n        if (dashboardDb) {\n          const now = new Date().toISOString()\n          const existingRunId = process.env.AGENT_QA_RUN_ID ?? process.env.AGENT_QA_SUITE_QUEUE_ID\n          if (existingRunId) {\n            dashboardDb.updateRun(existingRunId, {\n              name: `Path traversal rejected in suite`,\n              status: 'failed',\n              duration: 0,\n              endedAt: now,\n              attributes: suiteFailureAttributes,\n              failureSummary: `Path traversal rejected: ${relativePath}`,\n              errorLog: `Path traversal rejected: ${relativePath}`,\n            })\n          } else {\n            dashboardDb.insertRun({\n              id: runId,\n              name: `Path traversal rejected in suite`,\n              status: 'failed',\n              duration: 0,\n              startedAt: now,\n              endedAt: now,\n              attributes: suiteFailureAttributes,\n              failureSummary: `Path traversal rejected: ${relativePath}`,\n            })\n            dashboardDb.updateRun(runId, { errorLog: `Path traversal rejected: ${relativePath}` })\n          }\n          closeSuiteDashboardDb(dashboardDb)\n        }\n        printRunId(runId)\n        printRunAttributes(suiteFailureAttributes)\n        process.exit(2)\n      }\n\n      const absolutePath = path.resolve(configDir, relativePath)\n      const fileContent = await readFile(absolutePath, 'utf-8')\n      const parseResult = parseTestFile(fileContent, absolutePath)\n      if (parseResult.errors.length > 0) {\n        console.error(pc.red(`Parse errors in ${relativePath}:`))\n        formatParseErrors(parseResult.errors)\n        const runId = createSuiteRunId()\n        if (dashboardDb) {\n          const now = new Date().toISOString()\n          const errorLines: string[] = []\n          for (const e of parseResult.errors) {\n            const location = `${e.file}:${e.line}:${e.column}`\n            errorLines.push(`${e.severity}: ${e.message}\\n  --> ${location}`)\n          }\n          const existingRunId = process.env.AGENT_QA_RUN_ID ?? process.env.AGENT_QA_SUITE_QUEUE_ID\n          if (existingRunId) {\n            dashboardDb.updateRun(existingRunId, {\n              name: `Parse errors in suite \"${suite.name}\"`,\n              status: 'failed',\n              duration: 0,\n              endedAt: now,\n              attributes: suiteFailureAttributes,\n              failureSummary: `${parseResult.errors.length} parse error(s) in ${relativePath}`,\n              errorLog: errorLines.join('\\n'),\n            })\n          } else {\n            dashboardDb.insertRun({\n              id: runId,\n              name: `Parse errors in suite \"${suite.name}\"`,\n              status: 'failed',\n              duration: 0,\n              startedAt: now,\n              endedAt: now,\n              attributes: suiteFailureAttributes,\n              failureSummary: `${parseResult.errors.length} parse error(s) in ${relativePath}`,\n            })\n            dashboardDb.updateRun(runId, { errorLog: errorLines.join('\\n') })\n          }\n          closeSuiteDashboardDb(dashboardDb)\n        }\n        printRunId(runId)\n        printRunAttributes(suiteFailureAttributes)\n        process.exit(2)\n      }\n      if (parseResult.tests.length === 0) {\n        console.error(pc.red(`No test definition found in ${relativePath}`))\n        const runId = createSuiteRunId()\n        if (dashboardDb) {\n          const now = new Date().toISOString()\n          const existingRunId = process.env.AGENT_QA_RUN_ID ?? process.env.AGENT_QA_SUITE_QUEUE_ID\n          if (existingRunId) {\n            dashboardDb.updateRun(existingRunId, {\n              name: `No test definition in suite \"${suite.name}\"`,\n              status: 'failed',\n              duration: 0,\n              endedAt: now,\n              attributes: suiteFailureAttributes,\n              failureSummary: `No test definition found in ${relativePath}`,\n              errorLog: `No test definition found in ${relativePath}`,\n            })\n          } else {\n            dashboardDb.insertRun({\n              id: runId,\n              name: `No test definition in suite \"${suite.name}\"`,\n              status: 'failed',\n              duration: 0,\n              startedAt: now,\n              endedAt: now,\n              attributes: suiteFailureAttributes,\n              failureSummary: `No test definition found in ${relativePath}`,\n            })\n            dashboardDb.updateRun(runId, { errorLog: `No test definition found in ${relativePath}` })\n          }\n          closeSuiteDashboardDb(dashboardDb)\n        }\n        printRunId(runId)\n        printRunAttributes(suiteFailureAttributes)\n        process.exit(2)\n      }\n\n      const testDef = parseResult.tests[0]\n      const childAuthStateUse = getSelectedAuthStateUse(testDef.use as Record<string, unknown> | undefined)\n      // The suite owns the shared browser context; child authState can only repeat the same logical state.\n      if (suiteAuthStateUse && childAuthStateUse && childAuthStateUse.name !== suiteAuthStateUse.name) {\n        console.error(pc.red(`Suite auth state \"${suiteAuthStateUse.name}\" conflicts with child test auth state \"${childAuthStateUse.name}\". Use one primary auth state per suite.`))\n        process.exit(2)\n      }\n      if (testDef['test-id'] && testDef['test-id'] !== suiteEntryId) {\n        const mismatchMsg = `ID mismatch in suite \"${suite.name}\": test file ${relativePath} has test-id \"${testDef['test-id']}\" but suite entry specifies id \"${suiteEntryId}\"`\n        console.error(pc.red(mismatchMsg))\n        const runId = createSuiteRunId()\n        if (dashboardDb) {\n          const now = new Date().toISOString()\n          const existingRunId = process.env.AGENT_QA_RUN_ID ?? process.env.AGENT_QA_SUITE_QUEUE_ID\n          if (existingRunId) {\n            dashboardDb.updateRun(existingRunId, {\n              name: `ID mismatch in suite \"${suite.name}\"`,\n              status: 'failed',\n              duration: 0,\n              endedAt: now,\n              attributes: suiteFailureAttributes,\n              failureSummary: mismatchMsg,\n              errorLog: mismatchMsg,\n            })\n          } else {\n            dashboardDb.insertRun({\n              id: runId,\n              name: `ID mismatch in suite \"${suite.name}\"`,\n              status: 'failed',\n              duration: 0,\n              startedAt: now,\n              endedAt: now,\n              attributes: suiteFailureAttributes,\n              failureSummary: mismatchMsg,\n            })\n            dashboardDb.updateRun(runId, { errorLog: mismatchMsg })\n          }\n          closeSuiteDashboardDb(dashboardDb)\n        }\n        printRunId(runId)\n        printRunAttributes(suiteFailureAttributes)\n        process.exit(2)\n      }\n\n      suiteMembers.push({\n        index: suiteMembers.length,\n        ref: { test: relativePath, id: suiteEntryId },\n        filePath: absolutePath,\n        testId: testDef['test-id'] ?? null,\n        name: testDef.name,\n        target: testDef.target ?? null,\n        rawYaml: fileContent,\n        resolvedDefinition: testDef,\n        loadStatus: 'loaded',\n      })\n      testEntries.push([testDef, absolutePath])\n    }\n\n    const suiteResolvedTarget = suite.target\n      ? resolveTarget(config, suite.target!)\n      : resolveTarget(config, testEntries[0][0].target!)\n    const suitePlatform: 'web' | 'android' | 'ios' = suiteResolvedTarget.platform\n\n    const suiteAuthState = await resolveSelectedAuthStateForRun({\n      config,\n      configDir,\n      resolvedTarget: suiteResolvedTarget,\n      authState: suiteAuthStateUse,\n    })\n    const suiteAuthStateCapturePaths = resolveAuthStateCapturePathsForRun({\n      config,\n      configDir,\n      resolvedTarget: suiteResolvedTarget,\n      authState: suiteAuthStateUse,\n    })\n    const suiteEffectiveCacheEnabled = opts.cache !== false && (mergedUse as Record<string, unknown>).cache !== false\n    let suiteDeviceName = opts.device ?? (mergedUse.device as string | undefined)\n\n    if ((suitePlatform === 'android' || suitePlatform === 'ios') && !suiteDeviceName) {\n      const childDeviceNames = testEntries.map(([testDef]) => {\n        const device = (testDef.use as Record<string, unknown> | undefined)?.device\n        return typeof device === 'string' && device.trim().length > 0 ? device.trim() : undefined\n      })\n      const missingChildDevice = childDeviceNames.some((device) => !device)\n      const uniqueChildDevices = [...new Set(childDeviceNames.filter((device): device is string => Boolean(device)))]\n\n      if (missingChildDevice || uniqueChildDevices.length === 0) {\n        throw new Error(`Select a device for this mobile suite \"${suite.name}\" with suite use.device or every child test use.device.`)\n      }\n      if (uniqueChildDevices.length > 1) {\n        throw new Error(`Mobile suite child tests use multiple devices (${uniqueChildDevices.join(', ')}); set suite use.device or split the suite.`)\n      }\n      suiteDeviceName = uniqueChildDevices[0]\n    }\n    const deviceName = suiteDeviceName\n\n    const suiteTimeoutConfig = mergedUse.timeout as Record<string, unknown> | undefined\n    const testTimeouts = {\n      step: typeof suiteTimeoutConfig?.step === 'number' ? suiteTimeoutConfig.step : 30000,\n      test: typeof suiteTimeoutConfig?.test === 'number' ? suiteTimeoutConfig.test : 120000,\n      navigation: typeof suiteTimeoutConfig?.navigation === 'number' ? suiteTimeoutConfig.navigation : 30000,\n    }\n\n    const suiteLocalBindings = suitePlatform === 'android' || suitePlatform === 'ios'\n      ? loadLocalBindings()\n      : null\n    let mobileResolved: ResolvedMobileRunConfig | undefined\n    let resolvedDevice: ResolvedDevice | undefined\n    let farmSession: PlatformConfig['farmSession'] | undefined\n    if (suitePlatform === 'android' || suitePlatform === 'ios') {\n      mobileResolved = resolveMobileRunOrThrow({\n        config: config as unknown as Record<string, any>,\n        targetName: suiteResolvedTarget.name,\n        platform: suitePlatform,\n        explicitDeviceName: opts.device,\n        useDeviceName: suiteDeviceName,\n        appState: (mergedUse.mobile as Record<string, unknown> | undefined)?.appState as 'preserve' | 'reset' | undefined,\n        localBindings: suiteLocalBindings,\n        configFilePath: path.resolve(configFilePath),\n        localConfigFilePath: suiteLocalBindings?.filePath,\n        appiumUrl: process.env.AGENT_QA_APPIUM_URL,\n      })\n      const resolved = await resolveDeviceAndFarmSession(\n        config, mobileResolved.deviceName, suitePlatform,\n        `Suite: ${suite.name} — ${new Date().toISOString().slice(0, 19)}`,\n        testTimeouts.test,\n        mobileResolved.device,\n        suiteLocalBindings,\n        mobileResolved,\n      )\n      resolvedDevice = resolved.resolvedDevice\n      farmSession = resolved.farmSession\n    }\n\n    const useFarm = resolvedDevice?.transport !== undefined && resolvedDevice.transport !== 'local'\n    const suiteAttributes = resolveCliRunAttributes(\n      variableContext?.userRunAttributes ?? {},\n      resolveRunnerAttribute(resolvedDevice?.transport),\n      variableContext?.inheritedRunAttributes,\n    )\n    writeRunAttributesToEnv(suiteAttributes)\n\n    // Auto-start Appium for mobile platforms\n    if ((suitePlatform === 'ios' || suitePlatform === 'android') && !useFarm) {\n      try {\n        const appiumUrl = await acquireAppium(effectiveLogLevel)\n        if (mobileResolved) {\n          mobileResolved = { ...mobileResolved, appium: { url: appiumUrl, managed: !process.env.AGENT_QA_APPIUM_URL } }\n        }\n      } catch (err) {\n        throw new MobileSetupError({\n          category: 'appium-startup',\n          message: `Could not auto-start Appium: ${err instanceof Error ? err.message : String(err)}`,\n          platform: suitePlatform,\n          targetName: suiteResolvedTarget.name,\n          deviceName,\n          cause: err,\n        })\n      }\n    }\n\n    const adapter = await createPlatformAdapter(suitePlatform)\n\n    const resolvedTarget = suite.target\n      ? resolveTarget(config, suite.target)\n      : testEntries[0][0].target\n        ? resolveTarget(config, testEntries[0][0].target)\n        : undefined\n\n    const suiteBrowser = (mergedUse.browser as Record<string, unknown> | undefined) ?? config.use?.browser\n    const suiteLogCapture = (mergedUse.logCapture as Record<string, unknown> | undefined) ?? (config as any).use?.logCapture\n    const platformConfig = buildPlatformConfig(suitePlatform, resolvedDevice, testTimeouts, suiteBrowser as any, suiteLogCapture, farmSession, mobileResolved)\n    platformConfig.authState = suiteAuthState\n    platformConfig.verbose = effectiveLogLevel === 'debug'\n    if (opts.headless !== undefined && platformConfig.browser) {\n      platformConfig.browser.headless = opts.headless\n    }\n\n    const recordingEnabled = opts.record ?? config.services?.recording?.enabled ?? false\n    if (recordingEnabled) {\n      const recordingCfg = config.services?.recording as Record<string, unknown> | undefined\n      platformConfig.recording = {\n        enabled: true,\n        videoDir: resolveDashboardVideoDir(config, configDir, dashboardEnabled),\n        videoSize: recordingCfg?.videoSize as { width: number; height: number } | undefined,\n      }\n    }\n\n    // Resolve LLM models\n    const { planner: plannerCfg, verifier: verifierCfg, configName } = resolveLLMModels(config)\n    const resolvedAuth = await resolveModelAuth(configName, plannerCfg)\n    const plannerModelConfig = applyResolvedAuthToModelConfig(plannerCfg, resolvedAuth)\n    const verifierModelConfig = applyResolvedAuthToModelConfig(verifierCfg, resolvedAuth)\n    process.env.AGENT_QA_LLM_MODEL = plannerCfg.model\n    process.env.AGENT_QA_LLM_PROVIDER = plannerCfg.provider\n\n    const plannerModel = await createModel(plannerModelConfig)\n    const verifierModel = await createModel(verifierModelConfig)\n\n    const providerOpts = getProviderOptions(plannerModelConfig)\n\n    const { LogManager } = await import('@vostride/agent-qa-core')\n\n    const logger = new LogManager({\n      runId: process.env.AGENT_QA_RUN_ID || undefined,\n      displayLevel: effectiveLogLevel as any,\n      storage: logStorage,\n      ndjson: process.env.AGENT_QA_LIVE_EVENTS === 'true',\n      redactor: variableContext?.secretRedactor,\n    })\n\n    let agentRulesContent: string | undefined\n    const agentRulesPath = (config as any).workspace?.agentRules\n    if (agentRulesPath) {\n      const { readFile: readFileAsync } = await import('node:fs/promises')\n      const resolvedRulesPath = path.resolve(configDir, agentRulesPath)\n      try {\n        agentRulesContent = await readFileAsync(resolvedRulesPath, 'utf-8')\n      } catch { /* agent rules file not found — ignore */ }\n    }\n    let suiteEffectiveRules = agentRulesContent ?? ''\n    if (suiteLogCapture?.console === false) {\n      suiteEffectiveRules += '\\nConsole log capture is DISABLED for this test run. The readConsoleLogs action will return no data. If a test step explicitly requires reading console logs, use stepFailed to fail the step — do not silently pass with empty data.'\n    }\n    if (suiteLogCapture?.network === false) {\n      suiteEffectiveRules += '\\nNetwork log capture is DISABLED for this test run. The readNetworkLogs action will return no data. If a test step explicitly requires reading network logs, use stepFailed to fail the step — do not silently pass with empty data.'\n    }\n    const planner = new LLMPlanner(plannerModel, suitePlatform, providerOpts, logger.createScopedLogger('planner'), suiteEffectiveRules || undefined)\n    const verifier = new LLMVerifier(verifierModel, providerOpts)\n\n    const reporters: import('@vostride/agent-qa-core').Reporter[] = []\n    if (reporterSelection.console) {\n      reporters.push(new ConsoleReporter({ verbose: false, logLevel: effectiveLogLevel }))\n    }\n    if (reporterSelection.junit && opts.junitOutput) {\n      reporters.push(new JUnitReporter({ outputPath: opts.junitOutput }))\n    }\n    if (reporterSelection.stdoutLive) {\n      const { StdoutLiveReporter } = await import('@vostride/agent-qa-core')\n      reporters.push(new StdoutLiveReporter({ active: true, redactor: variableContext?.secretRedactor }))\n    }\n    if (reporterSelection.dashboard && dashboardDb) {\n      try {\n        const { DashboardReporter } = await import('@vostride/agent-qa-dashboard')\n        const { resolve } = await import('node:path')\n        const dashArtifactsDir = config.services?.dashboard?.artifactsDir ?? RUNTIME_ARTIFACTS_DIR\n        reporters.push(new DashboardReporter({\n          db: dashboardDb,\n          artifactsDir: resolve(configDir, dashArtifactsDir),\n          redactor: variableContext?.secretRedactor,\n          onRunCreated: (runId: string) => { lastSuiteRunId = runId; logger.setRunId(runId) },\n        }))\n      } catch { /* dashboard reporter not available */ }\n    }\n    const analyticsReporter = createAnalyticsRunReporter({ config, surface: 'cli' })\n    reporters.push(analyticsReporter)\n\n    // Wire action cache\n    let actionCache: import('@vostride/agent-qa-core').ActionCache | undefined\n    if (opts.cache !== false) {\n      const { FileActionCache } = await import('@vostride/agent-qa-core')\n      const { resolve } = await import('node:path')\n      actionCache = new FileActionCache({\n        dir: resolve(configDir, config.services?.cache?.dir ?? RUNTIME_CACHE_DIR),\n        ttl: config.services?.cache?.ttl ?? '7d',\n        logger: logger.createScopedLogger('cache'),\n      })\n    }\n\n    const healingConfig = {\n      maxAttempts: config.use?.healing?.maxAttempts ?? 3,\n    }\n\n    const captureScreenshots = reporterSelection.dashboard || opts.screenshotMode === 'every-step' || Boolean(opts.screenshotDir)\n\n    let suiteMemoryProvider: import('@vostride/agent-qa-core').MemoryProvider | undefined\n    let suiteCircuitBreaker: import('@vostride/agent-qa-core').CircuitBreaker | undefined\n    const suiteMemoryConfig = config.services?.memory\n    const suiteMemoryRoot = resolveMemoryRoot(config, configDir)\n\n    if (opts.memory !== false && suiteMemoryConfig?.enabled !== false) {\n      try {\n        const { createMemoryProvider } = await import('@vostride/agent-qa-core')\n        suiteMemoryProvider = await createMemoryProvider({\n          provider: suiteMemoryConfig?.provider ?? 'local',\n          memoryRoot: suiteMemoryRoot,\n          curatorLockTimeout: suiteMemoryConfig?.curatorLockTimeout,\n        })\n      } catch (err) {\n        console.warn(`  ${pc.dim('Memory:')} init error -- ${(err as Error).message}`)\n      }\n\n      if (suiteMemoryConfig?.circuitBreakerEnabled !== false) {\n        const { CircuitBreaker } = await import('@vostride/agent-qa-core')\n        suiteCircuitBreaker = new CircuitBreaker({\n          windowSize: suiteMemoryConfig?.circuitBreakerWindowSize,\n          baselineSize: suiteMemoryConfig?.circuitBreakerBaselineSize,\n          threshold: suiteMemoryConfig?.circuitBreakerThreshold,\n        })\n      }\n    }\n\n    const suiteArtifactContext = buildRunArtifactContext({\n      kind: 'suite-parent',\n      configContent,\n      parsedConfig: config,\n      effectiveConfig: { ...config, use: mergedUse },\n      envFilePath: variableContext?.resolvedEnvFilePath ?? null,\n      rawEnvFileContent: variableContext?.rawEnvFileContent ?? null,\n      envFileVars: variableContext?.envFileVars ?? {},\n      secretsFileMetadata: variableContext?.secretsFileMetadata ?? null,\n      cliVars: variableContext?.cliVars ?? {},\n      inlineVars: variableContext?.inlineVars ?? {},\n      hooks: hooksContext?.resolvedHooks,\n      planner: { provider: plannerCfg.provider, model: plannerCfg.model },\n      verifier: { provider: verifierCfg.provider, model: verifierCfg.model },\n      platform: suitePlatform,\n      target: suiteResolvedTarget,\n      deviceName,\n      attributes: suiteAttributes,\n      timeouts: testTimeouts,\n      cache: {\n        enabled: suiteEffectiveCacheEnabled,\n        dir: config.services?.cache?.dir,\n        ttl: config.services?.cache?.ttl,\n      },\n      memory: {\n        enabled: opts.memory !== false && suiteMemoryConfig?.enabled !== false,\n        curatorEnabled: suiteMemoryConfig?.curatorEnabled,\n        provider: suiteMemoryConfig?.provider ?? 'local',\n        dir: suiteMemoryConfig?.dir,\n      },\n      source: {\n        kind: 'suite',\n        suiteId: (suite as any)['suite-id'] ?? null,\n        name: suite.name,\n        filePath: suiteFile,\n        rawYaml: suiteFileContent || null,\n        resolvedDefinition: suite,\n        loadStatus: 'loaded',\n        members: suiteMembers,\n      },\n    })\n\n    const suiteConfig: RunSuiteConfig = {\n      adapter,\n      platformConfig,\n      planner,\n      verifier,\n      cache: suiteEffectiveCacheEnabled ? actionCache : undefined,\n      healingConfig,\n      plannerModel,\n      verifierModel,\n      providerOptions: providerOpts,\n      reporters,\n      captureScreenshots,\n      screenshotMode: (opts.screenshotMode as 'failure' | 'every-step') ?? 'failure',\n      timeouts: testTimeouts,\n      logger,\n      configContent,\n      suiteFileContent,\n      envFileVars: variableContext?.envFileVars,\n      inlineVars: variableContext?.inlineVars,\n      cliVars: variableContext?.cliVars,\n      resolvedHooks: hooksContext?.resolvedHooks,\n      sandboxOptions: hooksContext?.sandboxOptions,\n      logCapture: suiteLogCapture,\n      accessibility: config.services?.accessibility,\n      accessibilityCheck: runWebAccessibilityCheck,\n      screenshotSize: plannerCfg.screenshotSize,\n      effectiveResolution: plannerCfg.effectiveResolution,\n      memoryProvider: suiteMemoryProvider,\n      memoryConfig: suiteMemoryConfig,\n      memoryRoot: suiteMemoryRoot,\n      circuitBreaker: suiteCircuitBreaker,\n      product: resolvedTarget?.product,\n      authStateCapture: suiteAuthStateCapturePaths\n        ? {\n            capture: () => captureAuthStateForRun({ adapter, paths: suiteAuthStateCapturePaths }),\n            failureSummary: formatAuthStateCaptureFailure(suiteAuthStateCapturePaths),\n          }\n        : undefined,\n      createAdapter: () => createPlatformAdapter(suitePlatform),\n      resolveUrl: (targetName: string) => {\n        try { return resolveTarget(config, targetName).url } catch { return undefined }\n      },\n      onCuratorComplete: dashboardDb ? (_testName: string, memoryLog: any) => {\n        if (lastSuiteRunId) {\n          try {\n            dashboardDb.updateRun(lastSuiteRunId, { memoryLog: JSON.stringify(memoryLog) })\n          } catch { /* DB write failure must not fail the test */ }\n        }\n      } : undefined,\n    }\n    ;(suiteConfig as any).artifactContext = suiteArtifactContext.artifact\n    ;(suiteConfig as any).secretStore = variableContext?.secretStore\n    ;(suiteConfig as any).secretRedactor = variableContext?.secretRedactor\n    ;(suiteConfig as any).secretsFileMetadata = variableContext?.secretsFileMetadata\n\n    const suiteResult = await runSuite(suite, testEntries, suiteConfig)\n      .finally(async () => {\n        closeSuiteDashboardDb(dashboardDb)\n        await flushAnalyticsRunReporter(analyticsReporter)\n      })\n    suiteResults.push(suiteResult)\n    printRunAttributes(suiteAttributes)\n\n    return {\n      failed: suiteResult.status === 'failed',\n      cancelled: suiteResult.status === 'cancelled' || shutdownRequested,\n    }\n  }\n\n  const pendingSuiteParents: Promise<SuiteParentOutcome>[] = []\n  const flushSuiteParents = async (): Promise<SuiteParentOutcome> => {\n    if (pendingSuiteParents.length === 0) return { failed: false, cancelled: false }\n    const batch = pendingSuiteParents.splice(0, pendingSuiteParents.length)\n    const settled = await Promise.allSettled(batch)\n    const rejected = settled.find((outcome): outcome is PromiseRejectedResult => outcome.status === 'rejected')\n    if (rejected) throw rejected.reason\n    const outcomes = settled\n      .filter((outcome): outcome is PromiseFulfilledResult<SuiteParentOutcome> => outcome.status === 'fulfilled')\n      .map((outcome) => outcome.value)\n    return {\n      failed: outcomes.some((outcome) => outcome.failed),\n      cancelled: outcomes.some((outcome) => outcome.cancelled),\n    }\n  }\n\n  for (const suiteFile of suiteFiles) {\n    const suite = await parseSuiteFile(suiteFile)\n    const suitePlatform = await resolveSuiteParentPlatform(suite)\n    const effectiveSuiteParallel = suite.use?.parallel ?? config.use?.parallel ?? false\n    const canRunSuiteInParallel = suitePlatform === 'web' && effectiveSuiteParallel === true\n\n    if (canRunSuiteInParallel) {\n      pendingSuiteParents.push(runOneSuiteFile(suiteFile, suite))\n      continue\n    }\n\n    const batchOutcome = await flushSuiteParents()\n    if (batchOutcome.cancelled || shutdownRequested) break\n    if (opts.bail && batchOutcome.failed) {\n      console.log(pc.yellow('\\nBailing out — stopping after first failed suite'))\n      break\n    }\n\n    const outcome = await runOneSuiteFile(suiteFile, suite)\n    if (outcome.cancelled || shutdownRequested) break\n    if (opts.bail && outcome.failed) {\n      console.log(pc.yellow('\\nBailing out — stopping after first failed suite'))\n      break\n    }\n  }\n\n  const finalBatchOutcome = await flushSuiteParents()\n  if (opts.bail && finalBatchOutcome.failed) {\n    console.log(pc.yellow('\\nBailing out — stopping after first failed suite'))\n  }\n\n  process.removeListener('SIGINT', handleShutdown)\n  process.removeListener('SIGTERM', handleShutdown)\n\n  releaseAppium()\n  return suiteResults.some(r => r.status === 'failed' || r.status === 'cancelled') || shutdownRequested\n}\n\nexport function createRunCommand(): Command {\n  const cmd = new Command('run')\n    .description('Run test files')\n    .argument('[patterns...]', 'glob patterns for test files')\n    .option('--browser <name>', 'override browser (chromium, firefox, webkit)')\n    .option('--platform <name>', 'filter by platform (web, android, ios)')\n    .option('--headless', 'run in headless mode')\n    .option('--no-headless', 'run in headed mode')\n    .option('--no-cache', 'bypass action cache for this run')\n    .option('--no-memory', 'disable runtime memory injection for this run')\n    .option('--bail', 'stop on first test failure')\n    .option('--dry-run', 'parse and list tests without executing')\n    .option('--list-tests', 'list discovered test files without executing')\n    .option('--junit-output <path>', 'path for JUnit XML output')\n    .option('--screenshot-dir <dir>', 'directory for failure screenshots')\n    .option('--screenshot-mode <mode>', 'when to capture: failure (default) or every-step')\n    .option('--reporter <names...>', 'select reporters (default: console)')\n    .option('--record', 'enable session video recording')\n    .option('--config-debug', 'print resolved config with source attribution for each test')\n    .option('--test', 'discover and run tests via testMatch patterns (default when no flags)')\n    .option('--suite', 'discover and run suites via suiteMatch patterns')\n    .option('--all', 'discover and run both tests (testMatch) and suites (suiteMatch)')\n    .option('--device <name>', 'Override the mobile test/suite device for this run')\n    .option('--var <kv...>', 'set variable KEY=VALUE (repeatable)')\n    .option('--run-attr <kv...>', 'attach run attribute KEY=VALUE; repeatable')\n    .action(async (patterns: string[], opts: RunOptions, command: Command) => {\n      let _crashDb: any\n      try {\n        const modeFlags = [opts.test, opts.suite, opts.all].filter(Boolean).length\n        if (modeFlags > 1) {\n          console.error(pc.red('Error: --test, --suite, and --all are mutually exclusive.'))\n          process.exit(1)\n        }\n\n        const program = command.parent!\n        const globalOpts = program.opts<{ config?: string; verbose?: boolean; quiet?: boolean; logLevel?: string }>()\n\n        const flagOverrides: Record<string, unknown> = {}\n        if (opts.browser) {\n          flagOverrides.browsers = [{ name: opts.browser }]\n        }\n        if (opts.headless !== undefined) {\n          // headless is handled per-platform in platformConfig setup below\n        }\n\n        const config = await resolveConfig({\n          configPath: globalOpts.config,\n          flags: flagOverrides,\n          loadAuthPlugins: !(opts.dryRun || opts.listTests),\n        })\n\n        // Read raw config file content for cache key scoping\n        const configFilePath = resolvePath(globalOpts.config ?? 'agent-qa.config.yaml')\n        const workspacePaths = resolveWorkspacePaths({\n          config,\n          configPath: configFilePath,\n        })\n        let configContent = ''\n        try {\n          const { readFile: readConfigFile } = await import('node:fs/promises')\n          configContent = await readConfigFile(configFilePath, 'utf-8')\n        } catch { /* best-effort: resolveConfig already required the file */ }\n\n        // Load variables from env file, config inline, and CLI flags\n        const { parseEnvFile } = await import('@vostride/agent-qa-core')\n        const { readFileSync, existsSync } = await import('node:fs')\n        const configDir = workspacePaths.configDir\n\n        const cliVars = parseVarFlags(opts.var)\n        const inheritedContextRunId = process.env.AGENT_QA_RUN_ID\n          ?? process.env.AGENT_QA_SUITE_QUEUE_ID\n          ?? process.env.AGENT_QA_PARENT_RUN_ID\n        const inheritedRunAttributes = inheritedContextRunId\n          ? readRunAttributesFromEnv()\n          : undefined\n        let userRunAttributes: RunAttributes\n        try {\n          const parsedRunAttrs = parseRunAttrFlags(opts.runAttr)\n          userRunAttributes = parsedRunAttrs.attributes\n          for (const duplicateKey of parsedRunAttrs.duplicateKeys) {\n            console.warn(`Warning: duplicate --run-attr key \"${duplicateKey}\"; using last value`)\n          }\n        } catch (err) {\n          console.error(pc.red(`Error: ${err instanceof Error ? err.message : String(err)}`))\n          process.exit(2)\n        }\n        const inlineVars: Record<string, string> = {}\n\n        const runtimeSecrets = await loadRuntimeSecrets({\n          config,\n          configDir,\n          secretsFilePath: workspacePaths.secretsFile.absolutePath,\n          readFileSync,\n          existsSync,\n        })\n\n        let envFileVars: Record<string, string> = {}\n        let rawEnvFileContent: string | null = null\n        let resolvedEnvFilePath: string | null = null\n        resolvedEnvFilePath = workspacePaths.envFile.absolutePath\n        if (!existsSync(workspacePaths.envFile.absolutePath)) {\n          console.error(pc.red(`Error: Env file not found: ${workspacePaths.envFile.absolutePath}`))\n          process.exit(1)\n        }\n        try {\n          rawEnvFileContent = readFileSync(workspacePaths.envFile.absolutePath, 'utf-8')\n          envFileVars = parseEnvFile(rawEnvFileContent)\n        } catch {\n          console.error(pc.red(`Error: Env file could not be read: ${workspacePaths.envFile.absolutePath}`))\n          process.exit(1)\n        }\n\n        let resolvedHooks: Map<string, HookDefinition> | undefined\n        let sandboxOptions: SandboxRunnerOptions | undefined\n\n        const hooksFilePath = workspacePaths.hooksFile.absolutePath\n        if (!existsSync(hooksFilePath)) {\n          console.error(pc.red(`Error: Hooks file not found: ${hooksFilePath}`))\n          process.exit(1)\n        }\n        try {\n          const { parseHooksFile } = await import('@vostride/agent-qa-core')\n          const { hooks, errors } = await parseHooksFile(hooksFilePath)\n          if (errors.length > 0) {\n            console.error(pc.red('Hooks configuration errors:'))\n            for (const err of errors) console.error(pc.red(`  - ${err}`))\n            process.exit(1)\n          }\n          resolvedHooks = new Map(hooks.map((h: HookDefinition) => [h.id, h]))\n          sandboxOptions = {\n            secretStore: runtimeSecrets.secretStore,\n            secretRedactor: runtimeSecrets.secretRedactor,\n          } as any\n        } catch (err: any) {\n          console.error(pc.red(`Error: Hooks file could not be read: ${hooksFilePath}`))\n          if (err instanceof Error && err.message) console.error(pc.dim(err.message))\n          process.exit(1)\n        }\n\n        let agentRulesContent: string | undefined\n        const { readFile: readFileAsync } = await import('node:fs/promises')\n        try {\n          agentRulesContent = await readFileAsync(workspacePaths.agentRules.absolutePath, 'utf-8')\n        } catch {\n          console.error(pc.red(`Error: Agent rules file not found: ${workspacePaths.agentRules.absolutePath}`))\n          process.exit(1)\n        }\n\n        // Resolve effective log level: CLI flag > --verbose/--quiet > config > fallback\n        const effectiveLogLevel = globalOpts.logLevel\n          ?? (globalOpts.verbose ? 'debug' : undefined)\n          ?? (globalOpts.quiet ? 'silent' : undefined)\n          ?? (config as any).services?.logging?.level\n          ?? 'warn'\n\n        let discoveredTestFiles: string[] = []\n        let discoveredSuiteFiles: string[] = []\n\n        if (patterns && patterns.length > 0) {\n          try {\n            const selected = await discoverFilesForCliPatterns(workspacePaths, patterns)\n            discoveredTestFiles = selected.tests\n            discoveredSuiteFiles = selected.suites\n          } catch (err) {\n            console.error(pc.red(`Error: ${err instanceof Error ? err.message : String(err)}`))\n            process.exit(1)\n          }\n\n          if (discoveredTestFiles.length === 0 && discoveredSuiteFiles.length === 0) {\n            const patternKind = patterns.every((pattern) => classifyRunPattern(pattern) === 'suite') ? 'suite' : 'test'\n            console.error(pc.red(`Error: No ${patternKind} files found matching patterns:`))\n            for (const p of patterns) console.error(pc.red(`  ${p}`))\n            process.exit(2)\n          }\n        } else if (opts.suite) {\n          discoveredSuiteFiles = (await discoverWorkspaceFiles({ workspace: workspacePaths, kind: 'suite' }))\n            .map(record => record.absolutePath)\n          if (discoveredSuiteFiles.length === 0) {\n            console.error(pc.red('Error: No suite files found matching workspace.suiteMatch'))\n            for (const p of workspacePaths.suiteMatch) {\n              console.error(pc.red(`  ${p}`))\n            }\n            process.exit(2)\n          }\n        } else if (opts.all) {\n          discoveredTestFiles = (await discoverWorkspaceFiles({ workspace: workspacePaths, kind: 'test' }))\n            .map(record => record.absolutePath)\n          discoveredSuiteFiles = (await discoverWorkspaceFiles({ workspace: workspacePaths, kind: 'suite' }))\n            .map(record => record.absolutePath)\n\n          if (discoveredTestFiles.length === 0 && discoveredSuiteFiles.length === 0) {\n            console.error(pc.red('Error: No test or suite files found. Check workspace.testMatch and workspace.suiteMatch in agent-qa.config.yaml'))\n            process.exit(2)\n          }\n        } else {\n          if (!workspacePaths.testMatch || workspacePaths.testMatch.length === 0) {\n            console.error(pc.red('Error: No testMatch patterns in config. Add workspace.testMatch to agent-qa.config.yaml.'))\n            process.exit(2)\n          }\n          discoveredTestFiles = (await discoverWorkspaceFiles({ workspace: workspacePaths, kind: 'test' }))\n            .map(record => record.absolutePath)\n          if (discoveredTestFiles.length === 0) {\n            console.error(pc.red('Error: No test files found matching workspace.testMatch'))\n            for (const p of workspacePaths.testMatch) {\n              console.error(pc.red(`  ${p}`))\n            }\n            process.exit(2)\n          }\n        }\n\n        // Handle suite execution (early return)\n        if (discoveredSuiteFiles.length > 0 && discoveredTestFiles.length === 0) {\n          const hasFailed = await executeSuites(discoveredSuiteFiles, opts, config, globalOpts, configContent, effectiveLogLevel, { envFileVars, inlineVars, cliVars, rawEnvFileContent, resolvedEnvFilePath, userRunAttributes, inheritedRunAttributes, ...runtimeSecrets }, resolvedHooks && sandboxOptions ? { resolvedHooks, sandboxOptions } : undefined)\n          const exitCode = hasFailed ? 1 : 0\n          const suiteReporterSelection = resolveReporterSelection(opts, Boolean(config.services?.dashboard)).selection\n          if (suiteReporterSelection) {\n            await maybePrintPostRunUpdateNotice({\n              reporterSelection: suiteReporterSelection,\n              effectiveLogLevel,\n              liveEvents: process.env.AGENT_QA_LIVE_EVENTS,\n              cwd: process.cwd(),\n            })\n          }\n          process.exit(exitCode)\n        }\n\n        // Handle --all: run suites first, then fall through to test execution\n        let suitesFailed = false\n        if (discoveredSuiteFiles.length > 0 && discoveredTestFiles.length > 0) {\n          suitesFailed = await executeSuites(discoveredSuiteFiles, opts, config, globalOpts, configContent, effectiveLogLevel, { envFileVars, inlineVars, cliVars, rawEnvFileContent, resolvedEnvFilePath, userRunAttributes, inheritedRunAttributes, ...runtimeSecrets }, resolvedHooks && sandboxOptions ? { resolvedHooks, sandboxOptions } : undefined)\n        }\n\n        const files = discoveredTestFiles\n\n        if (opts.listTests) {\n          console.log(pc.bold(`\\nDiscovered ${files.length} test file(s):\\n`))\n          for (const file of files) {\n            console.log(`  ${file}`)\n          }\n          process.exit(0)\n        }\n\n        // Hoist dashboard DB init before parsing so parse errors can write to DB\n        let logStorage: any\n        const dashboardCfg2 = config.services?.dashboard as Record<string, unknown> | undefined\n        const reporterSelectionResult = resolveReporterSelection(opts, Boolean(dashboardCfg2))\n        if (reporterSelectionResult.error) {\n          console.error(pc.red(`Error: ${reporterSelectionResult.error}`))\n          process.exit(2)\n        }\n        const reporterSelection = reporterSelectionResult.selection!\n        const dashboardEnabled = reporterSelection.dashboard\n        let dashboardDb: any\n        let currentRunId: string | undefined\n        if (dashboardEnabled) {\n          try {\n            const { DashboardDatabase, resolveDashboardDbPath } = await import('@vostride/agent-qa-dashboard')\n            const configuredDbPath = dashboardCfg2?.dbPath as string | undefined\n            dashboardDb = new DashboardDatabase({\n              dbPath: resolveDashboardDbPath({ configDir, configuredDbPath }),\n            })\n            logStorage = dashboardDb\n            _crashDb = dashboardDb\n          } catch (err) {\n            console.warn(pc.yellow(`Warning: Could not load dashboard reporter: ${err instanceof Error ? err.message : String(err)}`))\n          }\n        }\n\n        const { parseAllTests, formatParseError } = await import('@vostride/agent-qa-core')\n        const parseResult = await parseAllTests(files)\n\n        if (parseResult.errors.length > 0) {\n          console.error(pc.red(`Found ${parseResult.errors.length} parse error(s):\\n`))\n          for (const err of parseResult.errors) {\n            console.error(formatParseError(err))\n          }\n          const validationRunId = createTestRunId()\n          const validationAttributes = resolveCliRunAttributes(userRunAttributes, 'local', inheritedRunAttributes)\n          if (dashboardDb) {\n            const now = new Date().toISOString()\n            const { basename } = await import('node:path')\n            const errorText = parseResult.errors.map(e => formatParseError(e)).join('\\n').replace(/\\x1b\\[[0-9;]*m/g, '')\n            const { readFileSync } = await import('node:fs')\n            const rawContent = readFileSync(files[0], 'utf-8')\n            const nameMatch = rawContent.match(/^\\s*name:\\s*(.+)$/m)\n            const targetMatch = rawContent.match(/^\\s*target:\\s*(.+)$/m)\n            let detectedPlatform = 'web'\n            if (targetMatch) {\n              const targetName = targetMatch[1].trim()\n              const resolvedTarget = (config as any).registry?.targets?.[targetName]\n              if (resolvedTarget?.platform) detectedPlatform = resolvedTarget.platform\n            }\n            const testName = nameMatch ? nameMatch[1].trim().replace(/^['\"]|['\"]$/g, '') : basename(files[0], '.yaml')\n            const existingRunId = process.env.AGENT_QA_RUN_ID\n            let artifactRunId: string\n            if (existingRunId) {\n              dashboardDb.updateRun(existingRunId, {\n                name: testName,\n                status: 'failed',\n                duration: 0,\n                endedAt: now,\n                attributes: validationAttributes,\n                platform: detectedPlatform,\n                failureSummary: `${parseResult.errors.length} parse error(s)`,\n                errorLog: errorText,\n              })\n              artifactRunId = existingRunId\n            } else {\n              dashboardDb.insertRun({\n                id: validationRunId,\n                name: testName,\n                status: 'failed',\n                duration: 0,\n                startedAt: now,\n                endedAt: now,\n                attributes: validationAttributes,\n                platform: detectedPlatform,\n                failureSummary: `${parseResult.errors.length} parse error(s)`,\n              })\n              dashboardDb.updateRun(validationRunId, { errorLog: errorText })\n              artifactRunId = validationRunId\n            }\n            dashboardDb.insertRunArtifact({\n              runId: artifactRunId,\n              kind: 'test',\n              payload: redactAuthStateValue({\n                config: {\n                  rawConfigContent: configContent,\n                  parsedConfig: config,\n                  effectiveConfig: config,\n                  envFile: { path: resolvedEnvFilePath, content: rawEnvFileContent, variables: envFileVars },\n                  secretsFile: runtimeSecrets.secretsFileMetadata,\n                  cliVars,\n                  inlineVars,\n                  hooks: buildHooksArtifact(resolvedHooks),\n                },\n                source: {\n                  kind: 'test',\n                  testId: null,\n                  name: testName,\n                  filePath: files[0],\n                  rawYaml: rawContent,\n                  resolvedDefinition: null,\n                  loadStatus: 'parse-error',\n                },\n                runtime: {\n                  platform: detectedPlatform,\n                  targetName: targetMatch ? targetMatch[1].trim() : null,\n                },\n                metadata: { attributes: validationAttributes },\n                errors: parseResult.errors.map((error) => ({\n                  code: 'parse-error',\n                  phase: 'parse',\n                  message: error.message,\n                  details: error,\n                })),\n              }),\n            })\n            dashboardDb.finalizeRunArtifact(artifactRunId)\n            dashboardDb.close()\n          }\n          printRunId(validationRunId)\n          printRunAttributes(validationAttributes)\n          process.exit(2)\n        }\n\n        const filtered = parseResult.tests\n\n        if (filtered.length === 0) {\n          console.log(pc.yellow('No tests match filters'))\n          process.exit(0)\n        }\n\n        if (opts.dryRun) {\n          console.log(pc.bold(`\\nFound ${filtered.length} test(s):\\n`))\n          for (const test of filtered) {\n            console.log(`  ${pc.green('●')} ${test.name}`)\n            if (opts.configDebug) {\n              console.log(pc.bold(`\\n  Config for: ${test.name}`))\n              console.log(formatConfigDebug(config, test.use, flagOverrides))\n              console.log()\n            }\n          }\n          process.exit(0)\n        }\n\n        // Actual execution\n        const startTime = Date.now()\n        const {\n          createModel, getProviderOptions, LLMPlanner, LLMVerifier, runTestWithRetry,\n          ConsoleReporter, JUnitReporter, MultiReporter, createAnalyticsRunReporter,\n        } = await import('@vostride/agent-qa-core')\n\n        const recordingEnabled = opts.record ?? config.services?.recording?.enabled ?? false\n\n        // Wire action cache from config (logger wired after LogManager creation below)\n        let actionCache: import('@vostride/agent-qa-core').ActionCache | undefined\n\n        const reporters: import('@vostride/agent-qa-core').Reporter[] = []\n        if (reporterSelection.console) {\n          reporters.push(new ConsoleReporter({ verbose: false, logLevel: effectiveLogLevel }))\n        }\n        if (reporterSelection.junit && opts.junitOutput) {\n          reporters.push(new JUnitReporter({ outputPath: opts.junitOutput }))\n        }\n\n        if (reporterSelection.stdoutLive) {\n          const { StdoutLiveReporter } = await import('@vostride/agent-qa-core')\n          reporters.push(new StdoutLiveReporter({ active: true, redactor: runtimeSecrets.secretRedactor }))\n        }\n\n        const captureScreenshots = reporterSelection.dashboard || opts.screenshotMode === 'every-step' || Boolean(opts.screenshotDir)\n\n        // Wire DashboardReporter (DB already created above before parse step)\n        const { LogManager } = await import('@vostride/agent-qa-core')\n        if (reporterSelection.dashboard && dashboardDb) {\n          try {\n            const { DashboardReporter } = await import('@vostride/agent-qa-dashboard')\n            const { resolve } = await import('node:path')\n            const dashArtifactsDir = config.services?.dashboard?.artifactsDir ?? RUNTIME_ARTIFACTS_DIR\n            reporters.push(new DashboardReporter({\n              db: dashboardDb,\n              artifactsDir: resolve(configDir, dashArtifactsDir),\n              redactor: runtimeSecrets.secretRedactor,\n              onRunCreated: (runId: string) => { currentRunId = runId; logger.setRunId(runId) },\n            }))\n          } catch (err) {\n            console.warn(pc.yellow(`Warning: Could not load dashboard reporter: ${err instanceof Error ? err.message : String(err)}`))\n          }\n        }\n        const analyticsReporter = createAnalyticsRunReporter({ config, surface: 'cli' })\n        reporters.push(analyticsReporter)\n\n        const logger = new LogManager({\n          runId: process.env.AGENT_QA_RUN_ID || undefined,\n          displayLevel: effectiveLogLevel as any,\n          storage: logStorage,\n          ndjson: process.env.AGENT_QA_LIVE_EVENTS === 'true',\n          redactor: runtimeSecrets.secretRedactor,\n        })\n\n        // Wire action cache with logger (skip when --no-cache)\n        if (opts.cache !== false) {\n          const { FileActionCache } = await import('@vostride/agent-qa-core')\n          const { resolve } = await import('node:path')\n          actionCache = new FileActionCache({\n            dir: resolve(configDir, config.services?.cache?.dir ?? RUNTIME_CACHE_DIR),\n            ttl: config.services?.cache?.ttl ?? '7d',\n            logger: logger.createScopedLogger('cache'),\n          })\n        } else {\n          const cacheLog = logger.createScopedLogger('cache')\n          cacheLog.info('Cache disabled via --no-cache', { operation: 'bypass' })\n        }\n\n        const multiReporter = new MultiReporter(reporters)\n\n        const results: TestResult[] = []\n\n        let circuitBreaker: import('@vostride/agent-qa-core').CircuitBreaker | undefined\n        let circuitBreakerTripped = false\n        const memoryGlobalConfig = config.services?.memory\n        const runtimeMemoryRoot = resolveMemoryRoot(config, configDir)\n        if (opts.memory !== false && memoryGlobalConfig?.circuitBreakerEnabled !== false && memoryGlobalConfig?.enabled !== false) {\n          const { CircuitBreaker } = await import('@vostride/agent-qa-core')\n          circuitBreaker = new CircuitBreaker({\n            windowSize: memoryGlobalConfig?.circuitBreakerWindowSize,\n            baselineSize: memoryGlobalConfig?.circuitBreakerBaselineSize,\n            threshold: memoryGlobalConfig?.circuitBreakerThreshold,\n          })\n        }\n\n        await multiReporter.onRunStart(filtered)\n\n        type DirectTestOutcome = { failed: boolean }\n        const runOneDirectTest = async (test: TestDefinition): Promise<DirectTestOutcome> => {\n          let currentPlatform: 'web' | 'android' | 'ios' | null = null\n          let currentAdapterKey: string | null = null\n          let adapter: import('@vostride/agent-qa-core').PlatformAdapter | null = null\n          let analyticsRunId: string | undefined\n          let analyticsFilePath = 'unknown'\n          let analyticsPlatform: 'web' | 'android' | 'ios' | undefined\n          let analyticsTestId: string | undefined\n          let analyticsAttributes: RunAttributes | undefined = resolveCliRunAttributes(\n            userRunAttributes,\n            'local',\n            inheritedRunAttributes,\n          )\n          let analyticsMobileTransport: string | undefined\n          let analyticsAppState: string | undefined\n          let analyticsStartedAt = Date.now()\n          let completedResult: TestResult | undefined\n          try {\n          try {\n          let testResolvedTarget = resolveTarget(config, test.target!)\n          let testTargetUrl = testResolvedTarget.url\n\n          const testDef = {\n            ...test,\n            url: testTargetUrl,\n          }\n          analyticsTestId = testDef['test-id']\n\n          const filePath = files.find(f =>\n            parseResult.tests.some(t => t.name === test.name),\n          ) ?? 'unknown'\n          analyticsFilePath = filePath\n\n          const runId = process.env.AGENT_QA_RUN_ID ?? generateRunId()\n          analyticsRunId = runId\n          analyticsStartedAt = Date.now()\n          currentRunId = runId\n          logger.setRunId(runId)\n\n          // Read raw test file content for cache key scoping\n          let testFileContent = ''\n          if (filePath !== 'unknown') {\n            try {\n              const { readFile: readTestFile } = await import('node:fs/promises')\n              testFileContent = await readTestFile(filePath, 'utf-8')\n            } catch { /* best-effort */ }\n          }\n\n          // Per-test config merge (global config < test YAML use: < CLI flags)\n          const testFlagOverrides: Record<string, unknown> = {}\n          if (opts.headless !== undefined) testFlagOverrides['browser'] = { headless: opts.headless }\n          if (opts.browser) testFlagOverrides['browser'] = { ...(testFlagOverrides['browser'] as Record<string, unknown> ?? {}), name: opts.browser }\n\n          const mergedUse = mergeUseBlocks(\n            config.use as Record<string, unknown>,\n            undefined,\n            test.use as Record<string, unknown> | undefined,\n            testFlagOverrides,\n          )\n          const testMergedConfig = { ...config, use: mergedUse } as AgentQaConfig\n          const effectiveCacheEnabled = opts.cache !== false && (mergedUse as Record<string, unknown>).cache !== false\n\n          if (opts.configDebug) {\n            console.log(pc.bold(`\\nConfig for: ${test.name}`))\n            console.log(formatConfigDebug(config, test.use, testFlagOverrides))\n            console.log()\n          }\n\n          const testPlatform: 'web' | 'android' | 'ios' = testResolvedTarget.platform\n          analyticsPlatform = testPlatform\n          const testAuthStateUse = getSelectedAuthStateUse(mergedUse as Record<string, unknown>)\n          const testAuthState = await resolveSelectedAuthStateForRun({\n            config,\n            configDir,\n            resolvedTarget: testResolvedTarget,\n            authState: testAuthStateUse,\n          })\n          const testAuthStateCapturePaths = resolveAuthStateCapturePathsForRun({\n            config,\n            configDir,\n            resolvedTarget: testResolvedTarget,\n            authState: testAuthStateUse,\n          })\n          let activeTestAuthState = testAuthState\n\n          const testMergedUse = (testMergedConfig as any).use ?? (config as any).use ?? {}\n          const testDeviceName = opts.device ?? testMergedUse.device as string | undefined\n\n          const testTimeoutsForSetup = {\n            step: (testMergedConfig as any).use?.timeout?.step ?? config.use?.timeout?.step,\n            test: (testMergedConfig as any).use?.timeout?.test ?? config.use?.timeout?.test,\n            navigation: (testMergedConfig as any).use?.timeout?.navigation ?? config.use?.timeout?.navigation,\n          }\n\n          const testLocalBindings = testPlatform === 'android' || testPlatform === 'ios'\n            ? loadLocalBindings()\n            : null\n          let testMobileResolved: ResolvedMobileRunConfig | undefined\n          let testResolvedDevice: ResolvedDevice | undefined\n          let testFarmSession: PlatformConfig['farmSession'] | undefined\n          if (testPlatform === 'android' || testPlatform === 'ios') {\n            testMobileResolved = resolveMobileRunOrThrow({\n              config: config as unknown as Record<string, any>,\n              targetName: testResolvedTarget.name,\n              platform: testPlatform,\n              explicitDeviceName: opts.device,\n              useDeviceName: testMergedUse.device as string | undefined,\n              appState: testMergedUse.mobile?.appState as 'preserve' | 'reset' | undefined,\n              localBindings: testLocalBindings,\n              configFilePath: resolvePath(configFilePath),\n              localConfigFilePath: testLocalBindings?.filePath,\n              appiumUrl: process.env.AGENT_QA_APPIUM_URL,\n            })\n            analyticsAppState = testMobileResolved.appState\n            const resolved = await resolveDeviceAndFarmSession(\n              config, testMobileResolved.deviceName, testPlatform,\n              `${test.name} — ${new Date().toISOString().slice(0, 19)}`,\n              testTimeoutsForSetup.test,\n              testMobileResolved.device,\n              testLocalBindings,\n              testMobileResolved,\n            )\n            testResolvedDevice = resolved.resolvedDevice\n            testFarmSession = resolved.farmSession\n            analyticsMobileTransport = testResolvedDevice?.transport\n          }\n\n          const useFarm = testResolvedDevice?.transport !== undefined && testResolvedDevice.transport !== 'local'\n          const testAttributes = resolveCliRunAttributes(\n            userRunAttributes,\n            resolveRunnerAttribute(testResolvedDevice?.transport),\n            inheritedRunAttributes,\n          )\n          analyticsAttributes = testAttributes\n          writeRunAttributesToEnv(testAttributes)\n          const adapterKey = JSON.stringify({\n            platform: testPlatform,\n            device: testResolvedDevice?.name,\n            appPackage: testMobileResolved?.app.appPackage,\n            appActivity: testMobileResolved?.app.appActivity,\n            bundleId: testMobileResolved?.app.bundleId,\n            appPath: testMobileResolved?.app.install?.path,\n            browserstackApp: testMobileResolved?.app.install?.browserstack,\n          })\n\n            // Each direct test owns its adapter so parallel batches cannot share mutable browser/mobile state.\n            if (testPlatform !== currentPlatform || adapterKey !== currentAdapterKey) {\n              currentPlatform = testPlatform\n              currentAdapterKey = adapterKey\n\n              // Auto-start Appium for mobile platforms (if not already running and not in farm mode)\n              if ((testPlatform === 'ios' || testPlatform === 'android') && !useFarm) {\n                try {\n                  const appiumUrl = await acquireAppium(effectiveLogLevel)\n                  if (testMobileResolved) {\n                    testMobileResolved = { ...testMobileResolved, appium: { url: appiumUrl, managed: !process.env.AGENT_QA_APPIUM_URL } }\n                  }\n                } catch (err) {\n                  throw new MobileSetupError({\n                    category: 'appium-startup',\n                    message: `Could not auto-start Appium: ${err instanceof Error ? err.message : String(err)}`,\n                    platform: testPlatform,\n                    targetName: testResolvedTarget.name,\n                    deviceName: testDeviceName,\n                    cause: err,\n                  })\n                }\n              }\n\n              adapter = await createPlatformAdapter(testPlatform)\n\n              const mergedBrowser = (mergedUse as Record<string, unknown>).browser as Record<string, unknown> | undefined\n              const platformConfig = buildPlatformConfig(testPlatform, testResolvedDevice, testTimeoutsForSetup, mergedBrowser ?? config.use?.browser, (testMergedConfig as any).use?.logCapture ?? config.use?.logCapture, testFarmSession, testMobileResolved)\n              platformConfig.authState = activeTestAuthState\n              platformConfig.verbose = effectiveLogLevel === 'debug'\n              if (opts.headless !== undefined) {\n                if (platformConfig.browser) {\n                  platformConfig.browser.headless = opts.headless\n                }\n              }\n\n              // Wire recording config for this platform adapter\n              const anyTestNeedsRecording = filtered.some(t => (t.meta as any)?.record === true)\n              if (recordingEnabled || anyTestNeedsRecording) {\n                const recCfg = config.services?.recording as Record<string, unknown> | undefined\n                platformConfig.recording = {\n                  enabled: true,\n                  videoDir: resolveDashboardVideoDir(config, configDir, dashboardEnabled),\n                  videoSize: recCfg?.videoSize as { width: number; height: number } | undefined,\n                }\n              }\n\n              await adapter.setup(platformConfig)\n\n              // Exit cleanup for farm sessions on mobile\n              if (useFarm && (testPlatform === 'android' || testPlatform === 'ios')) {\n                const farmAdapter = adapter\n                process.on('exit', () => { void Promise.resolve(farmAdapter.cleanup()).catch(() => {}) })\n              }\n\n              if (effectiveLogLevel === 'debug') {\n                console.log(pc.dim(`  Platform: ${testPlatform}${useFarm ? ` (farm: ${testResolvedDevice?.transport})` : ''}${testPlatform !== 'web' ? ' (adapter re-created)' : ''}`))\n              }\n            }\n\n            // Per-test model creation using merged LLM config\n            const mergedForLLM = { registry: (config as any).registry, use: (testMergedConfig as any).use ?? (config as any).use }\n            const { planner: plannerCfg, verifier: verifierCfg, configName } = resolveLLMModels(mergedForLLM)\n            const resolvedAuth = await resolveModelAuth(configName, plannerCfg)\n            const plannerModelConfig = applyResolvedAuthToModelConfig(plannerCfg, resolvedAuth)\n            const verifierModelConfig = applyResolvedAuthToModelConfig(verifierCfg, resolvedAuth)\n            process.env.AGENT_QA_LLM_MODEL = plannerCfg.model\n            process.env.AGENT_QA_LLM_PROVIDER = plannerCfg.provider\n            if (effectiveLogLevel === 'debug') {\n              console.log(pc.dim(`  Model: ${plannerCfg.model} (${plannerCfg.provider})`))\n            }\n            const plannerModel = await createModel(plannerModelConfig)\n            const verifierModel = await createModel(verifierModelConfig)\n            const plannerConfig = {\n              maxSubActions: testMergedConfig.use?.planner?.maxSubActions ?? 10,\n              previousStepCount: testMergedConfig.use?.planner?.previousStepCount ?? 3,\n            }\n\n            const providerOpts = getProviderOptions(plannerModelConfig)\n            const testLogCapture = (testMergedConfig as any).use?.logCapture ?? config.use?.logCapture\n            let testEffectiveRules = agentRulesContent ?? ''\n            if (testLogCapture?.console === false) {\n              testEffectiveRules += '\\nConsole log capture is DISABLED for this test run. The readConsoleLogs action will return no data. If a test step explicitly requires reading console logs, use stepFailed to fail the step — do not silently pass with empty data.'\n            }\n            if (testLogCapture?.network === false) {\n              testEffectiveRules += '\\nNetwork log capture is DISABLED for this test run. The readNetworkLogs action will return no data. If a test step explicitly requires reading network logs, use stepFailed to fail the step — do not silently pass with empty data.'\n            }\n            const planner = new LLMPlanner(plannerModel, testPlatform, providerOpts, logger.createScopedLogger('planner'), testEffectiveRules || undefined)\n            const verifier = new LLMVerifier(verifierModel, providerOpts)\n\n            // Per-test timeouts from merged config\n            const testTimeouts = {\n              step: testMergedConfig.use?.timeout?.step,\n              test: testMergedConfig.use?.timeout?.test,\n              navigation: testMergedConfig.use?.timeout?.navigation,\n            }\n\n            // Per-test healing config from merged config\n            const testHealingConfig = {\n              maxAttempts: testMergedConfig.use?.healing?.maxAttempts ?? 3,\n            }\n\n            // Per-test recording override: meta.record takes priority over global\n            let testRecording: import('@vostride/agent-qa-core').PlatformConfig['recording'] | undefined\n            const testRecordMeta = (testDef.meta as any)?.record\n            if (testRecordMeta === true || recordingEnabled) {\n              const recCfg2 = config.services?.recording as Record<string, unknown> | undefined\n              testRecording = {\n                enabled: true,\n                videoDir: resolveDashboardVideoDir(config, configDir, dashboardEnabled),\n                videoSize: recCfg2?.videoSize as { width: number; height: number } | undefined,\n              }\n            }\n            if (testRecordMeta === false) {\n              testRecording = undefined\n            }\n\n            const artifactContext = buildRunArtifactContext({\n              kind: 'test',\n              configContent,\n              parsedConfig: config,\n              effectiveConfig: testMergedConfig,\n              envFilePath: resolvedEnvFilePath,\n              rawEnvFileContent,\n              envFileVars,\n              secretsFileMetadata: runtimeSecrets.secretsFileMetadata,\n              cliVars,\n              inlineVars,\n              hooks: resolvedHooks,\n              planner: { provider: plannerCfg.provider, model: plannerCfg.model },\n              verifier: { provider: verifierCfg.provider, model: verifierCfg.model },\n              platform: testPlatform,\n              target: testResolvedTarget,\n              deviceName: testDeviceName,\n              attributes: testAttributes,\n              timeouts: testTimeouts,\n              cache: {\n                enabled: effectiveCacheEnabled,\n                dir: config.services?.cache?.dir,\n                ttl: config.services?.cache?.ttl,\n              },\n              memory: {\n                enabled: opts.memory !== false && config.services?.memory?.enabled !== false,\n                curatorEnabled: config.services?.memory?.curatorEnabled,\n                provider: config.services?.memory?.provider ?? 'local',\n              },\n              source: {\n                kind: 'test',\n                testId: testDef['test-id'] ?? null,\n                name: testDef.name,\n                filePath,\n                rawYaml: testFileContent || null,\n                resolvedDefinition: testDef,\n                loadStatus: 'loaded',\n              },\n            })\n\n            // Fire onTestStart BEFORE setup hooks so DashboardReporter creates\n            // the DB row and runId is available for hook recording (Phase 107 fix)\n            await (multiReporter.onTestStart as any)(testDef, filePath, {\n              runId,\n              artifact: artifactContext.artifact,\n            })\n\n            const getAuthAwareSandboxOptions = () => sandboxOptions && activeTestAuthState\n              ? { ...sandboxOptions, authState: activeTestAuthState }\n              : sandboxOptions\n            const authAwareSandboxOptions = getAuthAwareSandboxOptions()\n\n            // Per-test setup hooks: run BEFORE test execution (D-01, D-03)\n            let perTestSetupVars: Record<string, string> = {}\n            let testStartTime = Date.now()\n            let setupHookFailed = false\n            if (resolvedHooks && authAwareSandboxOptions && (testDef as any).setup?.length) {\n              const { runHooks } = await import('@vostride/agent-qa-core')\n              const hookDefs: HookDefinition[] = []\n              let hookSetupError: string | undefined\n              for (const hookId of (testDef as any).setup) {\n                const hook = resolvedHooks.get(hookId)\n                if (!hook) { hookSetupError = `Hook ID \"${hookId}\" not found in hooks registry`; break }\n                hookDefs.push(hook)\n              }\n\n              if (!hookSetupError && hookDefs.length > 0) {\n                const allVars: Record<string, string> = { ...envFileVars }\n                if (inlineVars) Object.assign(allVars, inlineVars)\n                if ((testDef as any).variables) Object.assign(allVars, (testDef as any).variables)\n                if (cliVars) Object.assign(allVars, cliVars)\n\n                for (const hookDef of hookDefs) {\n                  const hookExecId = randomUUID()\n                  await multiReporter.onHookStart({ hookId: hookDef.id, hookName: hookDef.name, phase: 'setup', hookExecutionId: hookExecId, runId })\n                  const hookResult = await runHooks([hookDef], { ...authAwareSandboxOptions, envVars: { ...authAwareSandboxOptions.envVars, ...allVars, ...perTestSetupVars } })\n                  const hr = hookResult.results.get(hookDef.name)\n                  await multiReporter.onHookEnd({\n                    hookId: hookDef.id,\n                    hookName: hookDef.name,\n                    phase: 'setup',\n                    hookExecutionId: hookExecId,\n                    runId,\n                    status: hr?.success ? 'passed' : 'failed',\n                    duration: hr?.duration ?? 0,\n                    stdout: hr?.stdout ?? '',\n                    stderr: hr?.stderr ?? '',\n                    variables: hr?.variables ?? {},\n                    error: hr?.error,\n                  })\n                  if (!hr?.success) {\n                    hookSetupError = `Setup hook \"${hookDef.name}\" failed: ${hr?.error ?? 'unknown'}`\n                    break\n                  }\n                  Object.assign(perTestSetupVars, hr.variables)\n                  Object.assign(allVars, hr.variables)\n                }\n              }\n\n              if (hookSetupError) {\n                setupHookFailed = true\n                const setupResult: TestResult = {\n                  runId,\n                  name: test.name,\n                  filePath,\n                  status: 'failed',\n                  steps: [],\n                  duration: Date.now() - testStartTime,\n                  failureSummary: hookSetupError,\n                }\n                results.push(setupResult)\n                await multiReporter.onTestEnd(setupResult)\n                printRunAttributes(testAttributes)\n              }\n            }\n\n            if (setupHookFailed) {\n              return { failed: true }\n            }\n\n            // Memory provider setup (best-effort)\n            let memoryProvider: import('@vostride/agent-qa-core').MemoryProvider | undefined\n            let memoryInitParams: import('@vostride/agent-qa-core').MemoryIndexParams | undefined\n            const memoryConfig = config.services?.memory\n            let memoryRoot: string | undefined\n            if (opts.memory !== false && memoryConfig?.enabled !== false) {\n              try {\n                const { createMemoryProvider } = await import('@vostride/agent-qa-core')\n                memoryRoot = runtimeMemoryRoot\n                memoryProvider = await createMemoryProvider({\n                  provider: memoryConfig?.provider ?? 'local',\n                  memoryRoot,\n                  curatorLockTimeout: memoryConfig?.curatorLockTimeout,\n                })\n                const product = testResolvedTarget.product\n                const testId = testDef['test-id'] ?? testDef.name\n                memoryInitParams = { product, testId, memoryRoot }\n              } catch (err) {\n                console.warn(`  ${pc.dim('Memory:')} init error -- ${(err as Error).message}`)\n              }\n            }\n\n            const result = await runTestWithRetry(testDef, {\n              adapter: adapter!,\n              planner,\n              verifier,\n              healingConfig: testHealingConfig,\n              plannerModel,\n              verifierModel,\n              reporters,\n              captureScreenshots,\n              screenshotMode: (opts.screenshotMode as 'failure' | 'every-step') ?? 'failure',\n              cache: effectiveCacheEnabled ? actionCache : undefined,\n              recording: testRecording,\n              plannerConfig,\n              timeouts: testTimeouts,\n              logger,\n              configContent,\n              testFileContent,\n              envFileVars,\n              secretStore: runtimeSecrets.secretStore,\n              secretRedactor: runtimeSecrets.secretRedactor,\n              secretsFileMetadata: runtimeSecrets.secretsFileMetadata,\n              inlineVars,\n              cliVars,\n              hookSetupVars: perTestSetupVars,\n              inlineHookDefs: resolvedHooks,\n              inlineHookSandboxOptions: authAwareSandboxOptions,\n              logCapture: testLogCapture,\n              accessibility: config.services?.accessibility,\n              accessibilityCheck: runWebAccessibilityCheck,\n              screenshotSize: plannerCfg.screenshotSize,\n              effectiveResolution: plannerCfg.effectiveResolution,\n              contextWindow: plannerCfg.contextWindow,\n              memoryProvider,\n              memoryInitParams,\n              circuitBreaker,\n              runId,\n              skipReporterOnTestStart: true,\n              skipReporterOnTestEnd: testAuthStateUse?.capture === true,\n            } as any, filePath)\n\n            if (!result.runId) result.runId = runId\n            completedResult = result\n\n            if (testAuthStateCapturePaths && result.status === 'passed') {\n              try {\n                activeTestAuthState = await captureAuthStateForRun({\n                  adapter: adapter!,\n                  paths: testAuthStateCapturePaths,\n                })\n              } catch {\n                result.status = 'failed'\n                result.failureSummary = formatAuthStateCaptureFailure(testAuthStateCapturePaths)\n                result.metadata = {\n                  ...result.metadata,\n                  phase: 'auth-state-capture',\n                }\n              }\n            }\n\n            const teardownSandboxOptions = getAuthAwareSandboxOptions()\n\n            // Per-test teardown hooks: run AFTER test execution (D-01, D-03)\n            if (resolvedHooks && teardownSandboxOptions && (testDef as any).teardown?.length) {\n              const { runHooks } = await import('@vostride/agent-qa-core')\n              for (const hookId of (testDef as any).teardown) {\n                const hook = resolvedHooks.get(hookId)\n                if (!hook) continue\n                const hookExecId = randomUUID()\n                try {\n                  await multiReporter.onHookStart({ hookId: hook.id, hookName: hook.name, phase: 'teardown', hookExecutionId: hookExecId, runId })\n                  const allVars: Record<string, string> = { ...envFileVars, ...perTestSetupVars }\n                  if (cliVars) Object.assign(allVars, cliVars)\n                  const hookResult = await runHooks([hook], { ...teardownSandboxOptions, envVars: { ...teardownSandboxOptions.envVars, ...allVars } })\n                  const hr = hookResult.results.get(hook.name)\n                  await multiReporter.onHookEnd({\n                    hookId: hook.id,\n                    hookName: hook.name,\n                    phase: 'teardown',\n                    hookExecutionId: hookExecId,\n                    runId,\n                    status: hr?.success ? 'passed' : 'failed',\n                    duration: hr?.duration ?? 0,\n                    stdout: hr?.stdout ?? '',\n                    stderr: hr?.stderr ?? '',\n                    variables: hr?.variables ?? {},\n                    error: hr?.error,\n                  })\n                } catch {}\n              }\n            }\n\n            // Capture farm session URL and device context for metadata\n            if (useFarm && adapter) {\n              try {\n                const farmSessionUrl = (adapter as any).getSessionUrl?.()\n                result.metadata = {\n                  ...result.metadata,\n                  ...(farmSessionUrl ? { farmSessionUrl } : {}),\n                  runDevice: testPlatform === 'web'\n                    ? `${config.use?.browser?.name ?? 'chromium'} (remote)`\n                    : `${testResolvedDevice?.name ?? testPlatform} (remote)`,\n                }\n                if (result.status === 'failed') {\n                  (adapter as any).markFailed?.()\n                }\n              } catch { /* best-effort session URL capture */ }\n            } else {\n              result.metadata = {\n                ...result.metadata,\n                runDevice: testPlatform === 'web'\n                  ? `${config.use?.browser?.name ?? 'chromium'} (local)`\n                  : `${testResolvedDevice?.name ?? testPlatform} (local)`,\n              }\n            }\n\n            // Selective ablation: re-run failed test without memory to confirm memory caused failure (REL-01)\n            let ablationHandledDeprecation = false\n            const authStateCaptureFailed = result.metadata?.phase === 'auth-state-capture'\n            if (memoryProvider && memoryConfig?.ablationEnabled !== false && result.status === 'failed' && !authStateCaptureFailed) {\n              try {\n                const { shouldAblate, collectAllInjectedIds, deprecateOnFailure } = await import('@vostride/agent-qa-core')\n                if (shouldAblate(result, memoryProvider)) {\n                  console.log(`  ${pc.dim('Memory:')} ablation retry -- re-running without memory...`)\n                  const ablationAdapter = await createPlatformAdapter(testPlatform)\n                  const mergedBrowser = (mergedUse as Record<string, unknown>).browser as Record<string, unknown> | undefined\n                  const ablationPlatformConfig = buildPlatformConfig(testPlatform, testResolvedDevice, testTimeoutsForSetup, mergedBrowser ?? config.use?.browser, (testMergedConfig as any).use?.logCapture ?? config.use?.logCapture, testFarmSession, testMobileResolved)\n                  ablationPlatformConfig.authState = activeTestAuthState\n                  ablationPlatformConfig.verbose = effectiveLogLevel === 'debug'\n                  if (opts.headless !== undefined && ablationPlatformConfig.browser) {\n                    ablationPlatformConfig.browser.headless = opts.headless\n                  }\n                  await ablationAdapter.setup(ablationPlatformConfig)\n                  try {\n                    const ablationResult = await runTestWithRetry(testDef, {\n                      adapter: ablationAdapter,\n                      planner,\n                      verifier,\n                      healingConfig: testHealingConfig,\n                      plannerModel,\n                      verifierModel,\n                      reporters: undefined,\n                      captureScreenshots,\n                      screenshotMode: (opts.screenshotMode as 'failure' | 'every-step') ?? 'failure',\n                      cache: effectiveCacheEnabled ? actionCache : undefined,\n                      recording: testRecording,\n                      plannerConfig,\n                      timeouts: testTimeouts,\n                      logger,\n                      configContent,\n                      testFileContent,\n                      envFileVars,\n                      secretStore: runtimeSecrets.secretStore,\n                      secretRedactor: runtimeSecrets.secretRedactor,\n                      secretsFileMetadata: runtimeSecrets.secretsFileMetadata,\n                      inlineVars,\n                      cliVars,\n                      hookSetupVars: perTestSetupVars,\n                      inlineHookDefs: resolvedHooks,\n                      inlineHookSandboxOptions: authAwareSandboxOptions,\n                      logCapture: testLogCapture,\n                      accessibility: config.services?.accessibility,\n                      accessibilityCheck: runWebAccessibilityCheck,\n                      screenshotSize: plannerCfg.screenshotSize,\n                      effectiveResolution: plannerCfg.effectiveResolution,\n                      contextWindow: plannerCfg.contextWindow,\n                    }, filePath)\n\n                    if (circuitBreaker) {\n                      circuitBreaker.record({ withMemory: false, passed: ablationResult.status === 'passed' })\n                    }\n\n                    if (ablationResult.status === 'passed') {\n                      console.log(`  ${pc.dim('Memory:')} ablation confirmed memory caused failure -- penalizing observations`)\n                      const injectedMap = collectAllInjectedIds(result, memoryProvider)\n                      await deprecateOnFailure({\n                        testResult: result,\n                        provider: memoryProvider,\n                        memoryRoot: memoryRoot ?? runtimeMemoryRoot,\n                        injectedObservationIds: injectedMap,\n                        trustContradictDelta: memoryConfig?.trustContradictDelta,\n                      })\n                      ablationHandledDeprecation = true\n                    } else {\n                      console.log(`  ${pc.dim('Memory:')} ablation retry also failed -- memory not the cause`)\n                    }\n                  } finally {\n                    await ablationAdapter.cleanup()\n                  }\n                }\n              } catch (err) {\n                console.warn(`  ${pc.dim('Memory:')} ablation error -- ${(err as Error).message}`)\n              }\n            }\n\n            // Memory curator: inline blocking after teardown hooks (D-02)\n            if (memoryProvider && memoryConfig?.curatorEnabled !== false && !ablationHandledDeprecation) {\n              try {\n                const { runCurator } = await import('@vostride/agent-qa-core')\n                const injectedObservationIds = new Map<number, string[]>()\n                for (let i = 0; i < result.steps.length; i++) {\n                  const ids = memoryProvider.getInjectedObservations(i)\n                  if (ids.length > 0) injectedObservationIds.set(i, ids)\n                }\n                const curatorProduct = testResolvedTarget.product\n                const testId = testDef['test-id'] ?? testDef.name\n                const memoryLog = await runCurator({\n                  testResult: result,\n                  provider: memoryProvider,\n                  model: plannerModel,\n                  providerOptions: providerOpts,\n                  memoryRoot: memoryRoot ?? runtimeMemoryRoot,\n                  product: curatorProduct,\n                  testId,\n                  injectedObservationIds,\n                  trustConfirmDelta: memoryConfig?.trustConfirmDelta,\n                  trustContradictDelta: memoryConfig?.trustContradictDelta,\n                });\n                (result as any).memoryLog = memoryLog\n                printMemoryStatus(memoryLog)\n                if (dashboardDb && currentRunId) {\n                  try {\n                    dashboardDb.updateRun(currentRunId, { memoryLog: JSON.stringify(memoryLog) })\n                  } catch { /* DB write failure must not fail the test */ }\n                }\n              } catch (err) {\n                console.warn(`  ${pc.dim('Memory:')} curator error -- ${(err as Error).message}`)\n              }\n            }\n\n            if (testAuthStateUse?.capture === true) {\n              await multiReporter.onTestEnd(result)\n            }\n\n            results.push(result)\n            printRunAttributes(testAttributes)\n\n            if (circuitBreaker && memoryProvider) {\n              const hadMemory = result.steps.some((_, i) => memoryProvider!.getInjectedObservations(i).length > 0)\n              circuitBreaker.record({ withMemory: hadMemory, passed: result.status === 'passed' })\n            }\n            if (circuitBreaker?.isTripped() && !circuitBreakerTripped) {\n              circuitBreakerTripped = true\n              console.log(`  ${pc.yellow('Memory: circuit breaker tripped -- disabling memory injection for remaining tests')}`)\n            }\n\n            // Post-run cache invalidation: delete all step cache entries for failed runs\n            if (result.status === 'failed' && !authStateCaptureFailed && actionCache && effectiveCacheEnabled && result.steps.length > 0) {\n              const { hashStepInstruction } = await import('@vostride/agent-qa-core')\n              const { rm } = await import('node:fs/promises')\n              const { resolve, join } = await import('node:path')\n              const cacheDir = resolve(configDir, config.services?.cache?.dir ?? RUNTIME_CACHE_DIR)\n              const cacheLog = logger.createScopedLogger('cache')\n\n              let purged = 0\n              for (let i = 0; i < result.steps.length; i++) {\n                const step = result.steps[i]\n                const stepHash = hashStepInstruction(step.name, testPlatform, configContent, testFileContent, i)\n                try {\n                  await rm(join(cacheDir, stepHash), { recursive: true, force: true })\n                  purged++\n                } catch { /* ignore — directory may not exist */ }\n              }\n\n              if (purged > 0) {\n                cacheLog.info('Failed run cache invalidation', {\n                  operation: 'batch-purge',\n                  stepHash: 'batch',\n                  entriesDeleted: purged,\n                })\n              }\n            }\n\n            return { failed: result.status === 'failed' }\n          } finally {\n            if (adapter) await adapter.cleanup()\n          }\n          } catch (err) {\n            if ((analyticsPlatform === 'android' || analyticsPlatform === 'ios') && analyticsRunId) {\n              const errorMessage = err instanceof Error ? err.message : String(err)\n              const analyticsResult = completedResult ?? {\n                runId: analyticsRunId,\n                name: test.name,\n                filePath: analyticsFilePath,\n                status: 'failed',\n                steps: [],\n                duration: Date.now() - analyticsStartedAt,\n                failureSummary: errorMessage,\n                metadata: {\n                  phase: 'setup',\n                  error: errorMessage,\n                  platform: analyticsPlatform,\n                  testId: analyticsTestId,\n                  attributes: analyticsAttributes,\n                  runtime: {\n                    platform: analyticsPlatform,\n                    mobileTransport: analyticsMobileTransport,\n                    appState: analyticsAppState,\n                  },\n                },\n              } satisfies TestResult\n              await captureSingleAnalyticsResult(analyticsReporter, analyticsResult)\n            }\n            throw err\n          }\n        }\n\n        const pendingParallelRuns: Promise<DirectTestOutcome>[] = []\n        const flushParallelRuns = async (): Promise<boolean> => {\n          if (pendingParallelRuns.length === 0) return false\n          const batch = pendingParallelRuns.splice(0, pendingParallelRuns.length)\n          const outcomes = await Promise.all(batch)\n          return outcomes.some((outcome) => outcome.failed)\n        }\n\n        let bailTriggered = false\n        for (const test of filtered) {\n          const testFlagOverrides: Record<string, unknown> = {}\n          if (opts.headless !== undefined) testFlagOverrides.browser = { headless: opts.headless }\n          if (opts.browser) testFlagOverrides.browser = { ...(testFlagOverrides.browser as Record<string, unknown> ?? {}), name: opts.browser }\n          const schedulingUse = mergeUseBlocks(\n            config.use as Record<string, unknown>,\n            undefined,\n            test.use as Record<string, unknown> | undefined,\n            testFlagOverrides,\n          )\n          const schedulingTarget = resolveTarget(config, test.target!)\n          const canRunInParallel = schedulingTarget.platform === 'web' && (schedulingUse as Record<string, unknown>).parallel === true\n\n          if (canRunInParallel) {\n            pendingParallelRuns.push(runOneDirectTest(test))\n            continue\n          }\n\n          const parallelBatchFailed = await flushParallelRuns()\n          if (opts.bail && parallelBatchFailed) {\n            console.log(pc.yellow('\\nBailing out — stopping after first failure'))\n            bailTriggered = true\n            break\n          }\n\n          const outcome = await runOneDirectTest(test)\n          if (opts.bail && outcome.failed) {\n            console.log(pc.yellow('\\nBailing out — stopping after first failure'))\n            bailTriggered = true\n            break\n          }\n        }\n\n        if (!bailTriggered) {\n          const parallelBatchFailed = await flushParallelRuns()\n          if (opts.bail && parallelBatchFailed) {\n            console.log(pc.yellow('\\nBailing out — stopping after first failure'))\n          }\n        }\n\n        releaseAppium()\n\n        const duration = results.reduce((sum, r) => sum + r.duration, 0)\n        const passed = results.filter(r => r.status === 'passed').length\n        const failed = results.filter(r => r.status === 'failed').length\n        const skipped = results.filter(r => r.status === 'skipped').length\n\n        await multiReporter.onRunEnd({ results, duration, passed, failed, skipped })\n        await flushAnalyticsRunReporter(analyticsReporter)\n\n        if (dashboardDb) {\n          dashboardDb.close()\n        }\n\n        const hasFailed = results.some(r => r.status === 'failed') || suitesFailed\n        const exitCode = hasFailed ? 1 : 0\n        await maybePrintPostRunUpdateNotice({\n          reporterSelection,\n          effectiveLogLevel,\n          liveEvents: process.env.AGENT_QA_LIVE_EVENTS,\n          cwd: process.cwd(),\n        })\n        process.exit(exitCode)\n      } catch (err) {\n        const errMsg = err instanceof Error ? err.message : String(err)\n        const errStack = err instanceof Error ? err.stack ?? '' : ''\n        const formattedError = formatFrameworkError(errMsg)\n        console.error(pc.red(formattedError.displayMessage))\n\n        if (_crashDb) {\n          const fullError = `${errMsg}\\n${errStack}`\n          const isBrowserClose = fullError.includes('Target page, context or browser has been closed')\n            || fullError.includes('browser has been closed')\n            || fullError.includes('Browser closed')\n          try {\n            const runs = _crashDb.getRuns({ status: 'running' })\n            for (const run of runs) {\n              const finalStatus = isBrowserClose ? 'cancelled' : 'failed'\n              printRunId(run.id)\n              printRunAttributes(run.attributes)\n              _crashDb.updateRun(run.id, {\n                status: finalStatus,\n                duration: run.startedAt ? Date.now() - new Date(run.startedAt).getTime() : 0,\n                endedAt: new Date().toISOString(),\n                failureSummary: isBrowserClose ? 'Browser closed by user' : redactAuthStateValue(formattedError.failureSummary),\n              })\n              try {\n                const artifact = _crashDb.getRunArtifact(run.id)\n                if (artifact && !artifact.finalizedAt) {\n                  _crashDb.finalizeRunArtifact(run.id, {\n                    runtime: {\n                      status: finalStatus,\n                      duration: run.startedAt ? Date.now() - new Date(run.startedAt).getTime() : 0,\n                    },\n                    errors: [{\n                      code: isBrowserClose ? 'browser-disconnect' : 'process-close',\n                      phase: 'process-close',\n                      message: isBrowserClose ? 'Browser closed by user' : redactAuthStateValue(formattedError.failureSummary),\n                    }],\n                  })\n                }\n              } catch { /* best-effort cleanup */ }\n            }\n          } catch { /* best-effort cleanup */ }\n        }\n\n        if (_crashDb) {\n          try { _crashDb.close() } catch {}\n        }\n        process.exit(2)\n      }\n    })\n\n  return cmd\n}\n","import { readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { parse as parseYaml } from 'yaml'\nimport { z } from 'zod'\nimport type { AgentQaConfig } from '@vostride/agent-qa-core'\n\nconst LocalAppBindingSchema = z.object({\n  path: z.string().optional(),\n  browserstack: z.string().optional(),\n}).strict()\n\nconst LocalDeviceBindingsSchema = z.object({\n  devices: z.record(z.string(), z.record(z.string(), z.unknown())).optional(),\n  providers: z.record(z.string(), z.object({\n    username: z.string(),\n    accessKey: z.string(),\n  }).strict()).optional(),\n  apps: z.record(z.string(), LocalAppBindingSchema).optional(),\n}).strict()\n\nfunction normalizeLocalBindings(raw: unknown): unknown {\n  if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return raw ?? {}\n\n  const normalized = { ...(raw as Record<string, unknown>) }\n  for (const key of ['devices', 'providers', 'apps']) {\n    if (normalized[key] === null) normalized[key] = {}\n  }\n  return normalized\n}\n\nexport type LocalDeviceBindings = z.infer<typeof LocalDeviceBindingsSchema> & {\n  filePath?: string\n}\n\nexport interface ResolvedDevice {\n  name: string\n  platform: 'android' | 'ios'\n  transport: 'local' | 'browserstack'\n  match: Record<string, unknown>\n}\n\nconst ENV_MAP: Record<string, { username: string; accessKey: string }> = {\n  browserstack: {\n    username: 'BROWSERSTACK_USERNAME',\n    accessKey: 'BROWSERSTACK_ACCESS_KEY',\n  },\n}\n\nconst DISPLAY_NAMES: Record<string, string> = {\n  browserstack: 'BrowserStack',\n}\n\nexport function formatTransportProvider(transport?: string | null): string {\n  if (!transport || transport === 'local') return 'Local'\n  return DISPLAY_NAMES[transport] ?? 'Local'\n}\n\nexport function loadLocalBindings(dir?: string): LocalDeviceBindings | null {\n  const filePath = join(dir ?? process.cwd(), 'agent-qa.local.yaml')\n  let content: string\n  try {\n    content = readFileSync(filePath, 'utf-8')\n  } catch (err: unknown) {\n    if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null\n    throw err\n  }\n  const raw = normalizeLocalBindings(parseYaml(content))\n  return { ...LocalDeviceBindingsSchema.parse(raw), filePath }\n}\n\nexport function resolveDevice(\n  config: AgentQaConfig,\n  deviceName: string,\n  localBindings?: LocalDeviceBindings | null,\n): ResolvedDevice {\n  const devices = (config as any).registry?.devices\n  if (!devices || !(deviceName in devices)) {\n    const available = devices ? Object.keys(devices).join(', ') : 'none'\n    throw new Error(\n      `Device \"${deviceName}\" not found in registry.devices. Available devices: ${available}`,\n    )\n  }\n\n  const profile = devices[deviceName] as {\n    platform: 'android' | 'ios'\n    transport: 'local' | 'browserstack'\n    match: Record<string, unknown>\n  }\n\n  const localMatch = localBindings?.devices?.[deviceName] ?? null\n\n  if (profile.transport === 'local' && !localMatch) {\n    throw new Error(\n      `Device '${deviceName}' has transport: local but no binding found in agent-qa.local.yaml. Run \\`agent-qa devices init\\` to generate local bindings.`,\n    )\n  }\n\n  const mergedMatch = { ...profile.match, ...(localMatch ?? {}) }\n\n  return {\n    name: deviceName,\n    platform: profile.platform,\n    transport: profile.transport,\n    match: mergedMatch,\n  }\n}\n\nexport function resolveProviderCredentials(\n  transport: string,\n  localBindings?: LocalDeviceBindings | null,\n): { username: string; accessKey: string } {\n  const envKeys = ENV_MAP[transport]\n  if (!envKeys) {\n    throw new Error(`Unknown provider: \"${transport}\"`)\n  }\n\n  const localCreds = localBindings?.providers?.[transport]\n  if (localCreds?.username && localCreds?.accessKey) {\n    return { username: localCreds.username, accessKey: localCreds.accessKey }\n  }\n\n  const envUsername = process.env[envKeys.username]\n  const envAccessKey = process.env[envKeys.accessKey]\n  if (envUsername && envAccessKey) {\n    return { username: envUsername, accessKey: envAccessKey }\n  }\n\n  const displayName = DISPLAY_NAMES[transport] ?? transport\n  throw new Error(\n    `${displayName} credentials not found. Set ${envKeys.username} and ${envKeys.accessKey} env vars, or add provider credentials to agent-qa.local.yaml.`,\n  )\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport pc from 'picocolors'\nimport { getAgentQaUpdateStatus } from '@vostride/agent-qa-core'\n\nexport type AgentQaUpdateNoticeReporterSelection = {\n  console: boolean\n  stdoutLive: boolean\n  junit?: boolean\n  dashboard?: boolean\n}\n\nexport type AgentQaUpdateNoticeContext = {\n  reporterSelection: AgentQaUpdateNoticeReporterSelection\n  effectiveLogLevel: string\n  liveEvents?: string\n  cwd?: string\n  log?: (line?: string) => void\n}\n\ntype PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun'\n\nconst RELEASES_URL = 'https://github.com/vostride/agent-qa/releases'\nconst UPDATE_COMMANDS: Record<PackageManager, string> = {\n  pnpm: 'pnpm add -D agent-qa@latest',\n  npm: 'npm install --save-dev agent-qa@latest',\n  yarn: 'yarn add --dev agent-qa@latest',\n  bun: 'bun add --dev agent-qa@latest',\n}\n\nconst LOCKFILES: Array<{ file: string; packageManager: PackageManager }> = [\n  { file: 'pnpm-lock.yaml', packageManager: 'pnpm' },\n  { file: 'package-lock.json', packageManager: 'npm' },\n  { file: 'npm-shrinkwrap.json', packageManager: 'npm' },\n  { file: 'yarn.lock', packageManager: 'yarn' },\n  { file: 'bun.lock', packageManager: 'bun' },\n  { file: 'bun.lockb', packageManager: 'bun' },\n]\n\nexport function shouldPrintAgentQaUpdateNotice(context: AgentQaUpdateNoticeContext): boolean {\n  return Boolean(\n    context.reporterSelection.console &&\n      !context.reporterSelection.stdoutLive &&\n      context.liveEvents !== 'true' &&\n      context.effectiveLogLevel !== 'quiet' &&\n      context.effectiveLogLevel !== 'silent',\n  )\n}\n\nexport function inferAgentQaDevDependencyUpdateCommand(cwd = process.cwd()): string | undefined {\n  try {\n    const packageJsonPath = join(cwd, 'package.json')\n    if (!existsSync(packageJsonPath)) return undefined\n\n    const manifest = JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as unknown\n    if (!isRecord(manifest) || !hasAgentQaDevDependency(manifest)) return undefined\n\n    const packageManager = inferPackageManager(manifest, cwd)\n    return packageManager ? UPDATE_COMMANDS[packageManager] : undefined\n  } catch {\n    return undefined\n  }\n}\n\nexport async function printAgentQaUpdateNoticeIfNeeded(\n  context: AgentQaUpdateNoticeContext,\n): Promise<void> {\n  try {\n    if (!shouldPrintAgentQaUpdateNotice(context)) return\n\n    const status = await getAgentQaUpdateStatus()\n    const installedVersion = status.installedVersion.trim()\n    const latestVersion = typeof status.latestVersion === 'string'\n      ? status.latestVersion.trim()\n      : ''\n    if (!status.updateAvailable || !latestVersion) return\n\n    const command = inferAgentQaDevDependencyUpdateCommand(context.cwd)\n    const log = context.log ?? console.log\n\n    log()\n    log(`${pc.bold('Update available:')} agent-qa v${latestVersion}`)\n    if (installedVersion) {\n      log(pc.dim(`Current version: v${installedVersion}`))\n    }\n    log(`Releases: ${pc.cyan(RELEASES_URL)}`)\n    if (command) {\n      log(`Update: ${pc.cyan(command)}`)\n    }\n  } catch {\n    // Update notices are optional and must never change CLI run outcomes.\n  }\n}\n\nfunction hasAgentQaDevDependency(manifest: Record<string, unknown>): boolean {\n  const devDependencies = manifest.devDependencies\n  return (\n    isRecord(devDependencies) &&\n    Object.prototype.hasOwnProperty.call(devDependencies, 'agent-qa')\n  )\n}\n\nfunction inferPackageManager(\n  manifest: Record<string, unknown>,\n  cwd: string,\n): PackageManager | undefined {\n  if (typeof manifest.packageManager === 'string') {\n    return packageManagerFromSpecifier(manifest.packageManager)\n  }\n\n  const matchingLockfiles = LOCKFILES.filter(({ file }) => existsSync(join(cwd, file)))\n  return matchingLockfiles.length === 1 ? matchingLockfiles[0].packageManager : undefined\n}\n\nfunction packageManagerFromSpecifier(specifier: string): PackageManager | undefined {\n  const name = specifier.split('@')[0]\n  if (name === 'pnpm' || name === 'npm' || name === 'yarn' || name === 'bun') {\n    return name\n  }\n  return undefined\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import { Command } from 'commander'\nimport { resolve, dirname } from 'node:path'\nimport { createRequire } from 'node:module'\nimport pc from 'picocolors'\nimport { flushAnalytics, resolveWorkspacePaths } from '@vostride/agent-qa-core'\nimport { resolveConfig } from '../config.js'\nimport { applyResolvedAuthToModelConfig, resolveModelAuth, type LLMConfigLike } from '../llm-utils.js'\nimport { DEFAULT_ANTHROPIC_MODEL } from '../model-defaults.js'\n\ntype DashboardCommandOptions = {\n  port?: string\n  db?: string\n  open?: boolean\n}\n\ntype ServiceCommandLabels = {\n  error: string\n  shutdown: string\n}\n\nasync function startDashboardBackedServices(\n  opts: DashboardCommandOptions,\n  command: Command,\n  labels: ServiceCommandLabels,\n): Promise<void> {\n  try {\n    const program = command.parent!\n    const globalOpts = program.opts<{ config?: string; verbose?: boolean }>()\n\n    const config = await resolveConfig({\n      configPath: globalOpts.config,\n    })\n\n    const configFilePath = resolve(globalOpts.config ?? 'agent-qa.config.yaml')\n    const configDir = dirname(configFilePath)\n    const workspacePaths = resolveWorkspacePaths({\n      config,\n      configPath: configFilePath,\n      requireExistingFiles: true,\n    })\n\n    const servicesConfig = (config as any).services?.dashboard ?? {}\n    const mcpConfig = (config as any).services?.mcp ?? {}\n    const port = opts.port ? parseInt(opts.port, 10) : (servicesConfig.port || 3470)\n    const configuredDbPath = opts.db ?? servicesConfig.dbPath\n    const artifactsDir = servicesConfig.artifactsDir ?? '.agent-qa/artifacts'\n\n    const registryLlms = (config as any).registry?.llms ?? []\n    const useLlm = (config as any).use?.llm\n    const defaultCfg = registryLlms.find((c: any) => c.name === useLlm) ?? {}\n    const configName = defaultCfg.name ?? useLlm ?? ''\n    const llmConfig: LLMConfigLike = {\n      provider: defaultCfg.provider ?? 'anthropic-subscription',\n      model: defaultCfg.model ?? DEFAULT_ANTHROPIC_MODEL,\n      baseURL: defaultCfg.baseURL,\n      providerHeaders: defaultCfg.providerHeaders,\n      screenshotSize: defaultCfg.screenshotSize,\n      effectiveResolution: defaultCfg.effectiveResolution,\n    }\n    const resolvedAuth = await resolveModelAuth(configName, llmConfig)\n    let authFetch: typeof globalThis.fetch | undefined\n    let resolvedLLMConfig: LLMConfigLike = llmConfig\n    if (resolvedAuth.kind !== 'missing') {\n      const runtimeConfig = applyResolvedAuthToModelConfig(llmConfig, resolvedAuth)\n      const { fetch, ...modelConfig } = runtimeConfig\n      authFetch = fetch\n      resolvedLLMConfig = modelConfig\n    }\n\n    const { DashboardDatabase, resolveDashboardDbPath, startServer } = await import('@vostride/agent-qa-dashboard')\n\n    const db = new DashboardDatabase({\n      dbPath: resolveDashboardDbPath({ configDir, configuredDbPath }),\n    })\n\n    let uiDir: string | undefined\n    try {\n      const require = createRequire(import.meta.url)\n      const pkgPath = require.resolve('@vostride/agent-qa-dashboard-ui/package.json')\n      uiDir = resolve(dirname(pkgPath), 'dist')\n    } catch {\n      if (globalOpts.verbose) {\n        console.log(pc.yellow('Warning: @vostride/agent-qa-dashboard-ui not found — API-only mode'))\n      }\n    }\n\n    const { close } = await startServer({\n      db,\n      port,\n      uiDir,\n      artifactsDir: resolve(configDir, artifactsDir),\n      workspacePaths,\n      configPath: configFilePath,\n      mcp: mcpConfig,\n      llmConfig: resolvedLLMConfig,\n      authFetch,\n    })\n\n    if (opts.open) {\n      const { exec } = await import('node:child_process')\n      const openCmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open'\n      exec(`${openCmd} http://localhost:${port}`)\n    }\n\n    let shuttingDown = false\n    const shutdown = async () => {\n      if (shuttingDown) return\n      shuttingDown = true\n      console.log(pc.dim(`\\nShutting down ${labels.shutdown}...`))\n      close()\n      await flushAnalytics({ config }).catch(() => {})\n      process.exit(0)\n    }\n\n    process.on('SIGINT', shutdown)\n    process.on('SIGTERM', shutdown)\n  } catch (err) {\n    console.error(pc.red(`${labels.error} error: ${err instanceof Error ? err.message : String(err)}`))\n    process.exit(2)\n  }\n}\n\nexport function createDashboardCommand(): Command {\n  const cmd = new Command('dashboard')\n    .description('Start the dashboard web server')\n    .option('--port <number>', 'server port (default: 3470)')\n    .option('--db <path>', 'database file path')\n    .option('--open', 'open browser after start')\n    .action(async (opts: DashboardCommandOptions, command: Command) => {\n      await startDashboardBackedServices(opts, command, {\n        error: 'Dashboard',\n        shutdown: 'dashboard',\n      })\n    })\n\n  return cmd\n}\n\nexport function createServeCommand(): Command {\n  const cmd = new Command('serve')\n    .description('Start configured local agent-qa services')\n    .action(async (_opts: unknown, command: Command) => {\n      await startDashboardBackedServices({}, command, {\n        error: 'Serve',\n        shutdown: 'local services',\n      })\n    })\n\n  return cmd\n}\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { flushAnalytics } from '@vostride/agent-qa-core'\nimport { resolveConfig } from '../config.js'\n\nexport function createMcpCommand(): Command {\n  const cmd = new Command('mcp')\n    .description('Start MCP (Model Context Protocol) server over stdio')\n    .action(async (command: Command) => {\n      try {\n        const program = command.parent\n        const globalOpts = program?.opts<{ config?: string }>() ?? {}\n        let config: Awaited<ReturnType<typeof resolveConfig>> | undefined\n        try {\n          config = await resolveConfig({ configPath: globalOpts.config })\n        } catch {\n          config = undefined\n        }\n\n        const { startMcpServer } = await import('@vostride/agent-qa-mcp')\n        try {\n          const startupOptions = { analyticsConfig: config, startupOutput: process.stderr }\n          await startMcpServer(startupOptions)\n        } finally {\n          await flushAnalytics(config ? { config } : undefined).catch(() => {})\n        }\n      } catch (err) {\n        console.error(pc.red('Failed to start MCP server:'), err instanceof Error ? err.message : String(err))\n        process.exitCode = 1\n      }\n    })\n\n  return cmd\n}\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { parseDocument, Document } from 'yaml'\nimport { readFile, writeFile } from 'node:fs/promises'\nimport { createInterface } from 'node:readline'\nimport { loadConfigFile, loadEnvOverrides, formatConfigDebug } from '../config.js'\n\nconst SENSITIVE_KEYS = new Set([\n  'apikey',\n  'authtoken',\n  'token',\n  'key',\n  'accesskey',\n  'secret',\n  'password',\n  'bearertoken',\n  'accesstoken',\n  'refreshtoken',\n])\n\nfunction isSensitiveKey(key: string): boolean {\n  const lastSegment = key.split('.').pop() ?? ''\n  return SENSITIVE_KEYS.has(lastSegment.toLowerCase().replace(/[^a-z0-9]/g, ''))\n}\n\nasync function readStdin(): Promise<string> {\n  const chunks: Buffer[] = []\n  for await (const chunk of process.stdin) {\n    chunks.push(chunk as Buffer)\n  }\n  return Buffer.concat(chunks).toString('utf-8').trim()\n}\n\nfunction plainPrompt(question: string): Promise<string> {\n  const rl = createInterface({ input: process.stdin, output: process.stdout })\n  return new Promise((resolve) => {\n    rl.question(question, (answer) => {\n      rl.close()\n      resolve(answer.trim())\n    })\n  })\n}\n\nasync function getValue(key: string, providedValue: string | undefined): Promise<string | null> {\n  if (providedValue !== undefined) return providedValue\n\n  if (process.stdin.isTTY) {\n    return plainPrompt(`Enter value for ${key}: `)\n  }\n  return readStdin()\n}\n\nasync function setAction(key: string, value: string | undefined): Promise<void> {\n  if (isSensitiveKey(key)) {\n    console.error(pc.red('Credential values are not written by config set.'))\n    console.error('Use agent-qa auth set --config <name> --type api-key|bearer-token for compatible or Gemini configs.')\n    console.error('Use plugins.auth plus the dashboard auth flow for subscription configs.')\n    return\n  }\n\n  const resolved = await getValue(key, value)\n  if (!resolved) {\n    console.error(pc.red('No value provided.'))\n    return\n  }\n\n  const configPath = 'agent-qa.config.yaml'\n  let doc: Document\n  try {\n    const content = await readFile(configPath, 'utf-8')\n    doc = parseDocument(content)\n  } catch (err: unknown) {\n    if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n      doc = new Document({})\n    } else {\n      throw err\n    }\n  }\n\n  doc.setIn(key.split('.'), resolved)\n  await writeFile(configPath, doc.toString())\n  console.log(pc.green(`\\u2713 ${key} = ${resolved} saved to agent-qa.config.yaml`))\n}\n\nasync function showAction(): Promise<void> {\n  const fileConfig = await loadConfigFile('agent-qa.config.yaml')\n  const envOverrides = loadEnvOverrides()\n  // Merge env into file config (3-layer: file+env is the global config)\n  const { mergeConfigs } = await import('../config.js')\n  const globalConfig = mergeConfigs(fileConfig, envOverrides, {})\n  const table = formatConfigDebug(globalConfig, {}, {})\n  console.log(pc.bold('\\nResolved Configuration:\\n'))\n  console.log(table)\n  console.log()\n}\n\nexport function createConfigCommand(): Command {\n  const cmd = new Command('config').description('Manage configuration')\n\n  cmd\n    .command('set <key> [value]')\n    .description('Set a config value')\n    .action(setAction)\n\n  cmd\n    .command('show')\n    .description('Show resolved config with source attribution')\n    .action(showAction)\n\n  return cmd\n}\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { resolveConfig } from '../config.js'\n\n// All triggers (dashboard, webhook, CLI, API) route through JobQueue — see Phase 60\n\nfunction timeAgo(dateStr: string): string {\n  const diff = Date.now() - new Date(dateStr).getTime()\n  const seconds = Math.floor(diff / 1000)\n  if (seconds < 60) return `${seconds}s ago`\n  const minutes = Math.floor(seconds / 60)\n  if (minutes < 60) return `${minutes}m ago`\n  const hours = Math.floor(minutes / 60)\n  return `${hours}h ago`\n}\n\nasync function resolveServerUrl(opts: { server?: string }, globalOpts: { config?: string }): Promise<string> {\n  if (opts.server) return opts.server\n  const envUrl = process.env.AGENT_QA_DASHBOARD_URL\n  if (envUrl) return envUrl\n  try {\n    const config = await resolveConfig({ configPath: globalOpts.config })\n    const port = (config as any).dashboard?.port || 3470\n    return `http://localhost:${port}`\n  } catch {\n    return 'http://localhost:3470'\n  }\n}\n\nexport function createQueueCommand(): Command {\n  const cmd = new Command('queue')\n    .description('Manage the test execution queue')\n\n  cmd\n    .command('list')\n    .description('Show pending and running jobs in the queue')\n    .option('--json', 'output raw JSON')\n    .option('--all', 'include recently completed jobs')\n    .option('--server <url>', 'dashboard server URL')\n    .action(async (opts: { json?: boolean; all?: boolean; server?: string }, command: Command) => {\n      try {\n        const program = command.parent!.parent!\n        const globalOpts = program.opts<{ config?: string }>()\n        const serverUrl = await resolveServerUrl(opts, globalOpts)\n        const endpoint = `${serverUrl}/api/queue/status?completed=${opts.all ? 'true' : 'false'}`\n\n        let data: any\n        try {\n          const response = await fetch(endpoint)\n          if (!response.ok) {\n            console.error(pc.red(`Server returned ${response.status}: ${response.statusText}`))\n            process.exit(1)\n          }\n          data = await response.json()\n        } catch {\n          console.error(pc.red(`Could not connect to dashboard server at ${serverUrl}`))\n          console.error(pc.dim('Make sure the dashboard is running: agent-qa dashboard'))\n          process.exit(1)\n        }\n\n        if (opts.json) {\n          console.log(JSON.stringify(data, null, 2))\n          return\n        }\n\n        console.log()\n        console.log(pc.bold('Queue Status'))\n        console.log(`  Concurrency: ${pc.blue(String(data.concurrency))} slots (${pc.yellow(String(data.activeSlots))} active)`)\n        console.log()\n\n        const pending = data.pending?.jobs ?? []\n        const running = data.running?.jobs ?? []\n\n        if (pending.length === 0 && running.length === 0) {\n          console.log(pc.dim('  Queue is empty — no pending or running jobs'))\n          console.log()\n          return\n        }\n\n        if (pending.length > 0) {\n          console.log(pc.bold(`Pending (${pending.length} jobs):`))\n          console.log(pc.dim('  #   ID            Name                Priority  Source      Queued'))\n          for (let i = 0; i < pending.length; i++) {\n            const job = pending[i]\n            const num = String(i + 1).padEnd(3)\n            const id = (job.id ?? '').slice(0, 12).padEnd(12)\n            const name = (job.name ?? '').slice(0, 18).padEnd(18)\n            const priority = String(job.priority ?? 0).padEnd(8)\n            const source = (job.source ?? '').padEnd(10)\n            const queued = job.createdAt ? timeAgo(job.createdAt) : ''\n            console.log(`  ${num} ${pc.dim(id)}  ${name}  ${priority}  ${source}  ${pc.dim(queued)}`)\n          }\n          console.log()\n        }\n\n        if (running.length > 0) {\n          console.log(pc.bold(`Running (${running.length} jobs):`))\n          console.log(pc.dim('  ID            Name                Source      Started'))\n          for (const job of running) {\n            const id = (job.id ?? '').slice(0, 12).padEnd(12)\n            const name = (job.name ?? '').slice(0, 18).padEnd(18)\n            const source = (job.source ?? '').padEnd(10)\n            const started = job.startedAt ? timeAgo(job.startedAt) : ''\n            console.log(`  ${pc.green(id)}  ${name}  ${source}  ${pc.dim(started)}`)\n          }\n          console.log()\n        }\n\n        if (opts.all && data.recent?.length > 0) {\n          console.log(pc.bold(`Recent (${data.recent.length} jobs):`))\n          console.log(pc.dim('  ID            Name                Status    Duration'))\n          for (const job of data.recent) {\n            const id = (job.id ?? '').slice(0, 12).padEnd(12)\n            const name = (job.name ?? '').slice(0, 18).padEnd(18)\n            const status = (job.status ?? '').padEnd(8)\n            const duration = job.duration ? `${Math.round(job.duration / 1000)}s` : ''\n            const statusColor = job.status === 'passed' ? pc.green : job.status === 'failed' ? pc.red : pc.dim\n            console.log(`  ${pc.dim(id)}  ${name}  ${statusColor(status)}  ${pc.dim(duration)}`)\n          }\n          console.log()\n        }\n      } catch (err) {\n        console.error(pc.red(`Error: ${err instanceof Error ? err.message : String(err)}`))\n        process.exit(1)\n      }\n    })\n\n  cmd\n    .command('cancel')\n    .description('Cancel a pending or running job')\n    .argument('<runId>', 'ID of the job to cancel')\n    .option('--server <url>', 'dashboard server URL')\n    .action(async (runId: string, opts: { server?: string }, command: Command) => {\n      try {\n        const program = command.parent!.parent!\n        const globalOpts = program.opts<{ config?: string }>()\n        const serverUrl = await resolveServerUrl(opts, globalOpts)\n\n        let response: Response\n        try {\n          response = await fetch(`${serverUrl}/api/runs/${runId}/cancel`, { method: 'POST' })\n        } catch {\n          console.error(pc.red(`Could not connect to dashboard server at ${serverUrl}`))\n          console.error(pc.dim('Make sure the dashboard is running: agent-qa dashboard'))\n          process.exit(1)\n        }\n\n        if (response.ok) {\n          const data = await response.json() as any\n          if (data.cancelled) {\n            console.log(pc.green(`✓ Cancelled job ${runId}`))\n          } else {\n            console.log(pc.red(`Failed to cancel: ${data.error ?? 'Unknown error'}`))\n          }\n        } else if (response.status === 404) {\n          console.log(pc.red(`Job not found: ${runId}`))\n        } else {\n          const data = await response.json().catch(() => ({})) as any\n          console.log(pc.red(`Failed to cancel: ${data.error ?? response.statusText}`))\n        }\n      } catch (err) {\n        console.error(pc.red(`Error: ${err instanceof Error ? err.message : String(err)}`))\n        process.exit(1)\n      }\n    })\n\n  return cmd\n}\n","import { Command } from 'commander'\nimport { validateProject, formatDiagnostics, resolveWorkspacePaths } from '@vostride/agent-qa-core'\nimport { resolveConfig } from '../config.js'\n\nexport function createValidateCommand(): Command {\n  const cmd = new Command('validate')\n    .description('Validate config, test files, and suite references')\n    .argument('[files...]', 'specific files to validate (default: auto-discover all)')\n    .action(async (files: string[], command: Command) => {\n      const configPath = command.parent?.opts<{ config?: string }>().config ?? 'agent-qa.config.yaml'\n      let workspace\n\n      try {\n        const config = await resolveConfig({ configPath })\n        workspace = resolveWorkspacePaths({ config, configPath })\n      } catch {\n        // validateProject will report config read/schema diagnostics.\n      }\n\n      const result = await validateProject({\n        configPath,\n        files: files.length > 0 ? files : undefined,\n        workspace,\n      })\n\n      const output = formatDiagnostics(result)\n      process.stdout.write(output)\n\n      if (result.errorCount > 0) {\n        process.exitCode = 1\n      }\n    })\n\n  return cmd\n}\n","import { Command } from 'commander'\nimport { exec } from 'node:child_process'\nimport pc from 'picocolors'\nimport input from '@inquirer/input'\nimport password from '@inquirer/password'\nimport type { LLMAuthProviderPlugin, OAuthTokens } from '@vostride/agent-qa-core'\n\ntype ProviderMode =\n  | 'openai-compatible'\n  | 'anthropic-compatible'\n  | 'openai-subscription'\n  | 'anthropic-subscription'\n  | 'gemini'\n  | (string & {})\n\ntype SubscriptionProvider = 'openai-subscription' | 'anthropic-subscription'\n\ntype CliLLMConfig = {\n  name?: string\n  provider: ProviderMode\n  model: string\n  baseURL?: string\n  providerHeaders?: Record<string, string>\n  screenshotSize?: number\n  effectiveResolution?: number\n  contextWindow?: number\n}\n\ntype ResolvedAuth =\n  | { kind: 'api-key'; apiKey: string }\n  | { kind: 'bearer-token'; token: string }\n  | { kind: 'auth-fetch'; fetch: typeof globalThis.fetch; modelAdapter?: string; expires?: number }\n  | { kind: 'unauthenticated'; message: string }\n  | { kind: 'missing'; message: string }\n\nconst PROVIDER_LABELS: Record<ProviderMode, string> = {\n  'openai-compatible': 'OpenAI-compatible',\n  'anthropic-compatible': 'Anthropic-compatible',\n  'openai-subscription': 'OpenAI subscription',\n  'anthropic-subscription': 'Anthropic subscription',\n  gemini: 'Gemini',\n}\n\nconst SUBSCRIPTION_PROVIDERS = new Set<string>([\n  'openai-subscription',\n  'anthropic-subscription',\n])\n\nconst API_KEY_CREDENTIAL_PROVIDERS = new Set<string>([\n  'openai-compatible',\n  'anthropic-compatible',\n  'gemini',\n])\n\nfunction providerLabel(provider: string): string {\n  return PROVIDER_LABELS[provider as ProviderMode] ?? provider\n}\n\nfunction isSubscriptionProvider(provider: string): provider is SubscriptionProvider {\n  return provider === 'openai-subscription' || provider === 'anthropic-subscription'\n}\n\nfunction normalizeConfigName(rawName: unknown): string | null {\n  if (typeof rawName !== 'string') return null\n  const name = rawName.trim()\n  if (!name || name !== rawName) return null\n  return name\n}\n\nfunction getGlobalConfigPath(command: Command): string | undefined {\n  return command.parent?.parent?.opts<{ config?: string }>().config\n    ?? command.parent?.opts<{ config?: string }>().config\n}\n\nfunction printCredentialGuidance(configName: string, provider: string): void {\n  console.log(pc.red(`Config ${configName} uses ${providerLabel(provider)} credentials.`))\n  console.log(pc.dim('Use agent-qa auth set --config <name> --type api-key'))\n  if (provider === 'anthropic-compatible') {\n    console.log(pc.dim('or --type bearer-token'))\n  }\n}\n\nfunction applyAuthToModelConfig(llmConfig: CliLLMConfig, auth: ResolvedAuth): Record<string, unknown> {\n  switch (auth.kind) {\n    case 'api-key':\n      return { ...llmConfig, apiKey: auth.apiKey }\n    case 'bearer-token':\n      return { ...llmConfig, authToken: auth.token }\n    case 'auth-fetch':\n      return { ...llmConfig, fetch: auth.fetch, modelAdapter: auth.modelAdapter }\n    case 'unauthenticated':\n      return { ...llmConfig }\n    case 'missing':\n      throw new Error(auth.message)\n  }\n}\n\nfunction statusForResolvedAuth(auth: ResolvedAuth): string {\n  switch (auth.kind) {\n    case 'api-key':\n      return pc.green('Saved API key')\n    case 'bearer-token':\n      return pc.green('Saved bearer token')\n    case 'auth-fetch':\n      return Number(auth.expires ?? Date.now() + 1) <= Date.now()\n        ? pc.red('Expired')\n        : pc.green('OAuth connected')\n    case 'unauthenticated':\n      return pc.dim('No credential')\n    case 'missing':\n      return pc.red('Missing credential')\n  }\n}\n\nfunction extractProviderError(err: unknown): { message: string; statusCode?: number } {\n  const errObj = err as Record<string, unknown>\n  const statusCode = errObj?.statusCode as number | undefined\n  const responseBody = errObj?.responseBody as string | undefined\n  const data = errObj?.data as Record<string, unknown> | undefined\n  const apiError = data?.error as Record<string, string> | undefined\n\n  let message = err instanceof Error ? err.message : String(err)\n\n  if (apiError?.message && apiError.message !== 'Error') {\n    message = apiError.message\n  } else if (typeof data?.detail === 'string') {\n    message = data.detail\n  } else if (responseBody) {\n    try {\n      const body = JSON.parse(responseBody)\n      if (body?.detail) message = body.detail\n      else if (body?.error?.message && body.error.message !== 'Error') message = body.error.message\n    } catch {\n      // Provider did not return JSON.\n    }\n  }\n\n  return { message, statusCode }\n}\n\nfunction openAuthorizationUrl(url: string): void {\n  const quotedUrl = JSON.stringify(url)\n  const command = process.platform === 'darwin'\n    ? `open ${quotedUrl}`\n    : process.platform === 'win32'\n      ? `start \"\" ${quotedUrl}`\n      : `xdg-open ${quotedUrl}`\n  exec(command, () => {})\n}\n\nfunction printMissingSubscriptionPluginGuidance(configName: string, provider: SubscriptionProvider): void {\n  console.log(pc.red(`Provider \"${provider}\" is configured for \"${configName}\", but no auth plugin is registered.`))\n  console.log(pc.dim(`Config: ${configName}`))\n  console.log(pc.dim(`Provider: ${provider}`))\n  console.log(pc.dim('Add the subscription auth plugin to package.json and install with your package manager:'))\n  console.log(pc.dim('  \"devDependencies\": { \"@vostride/agent-qa-subscription-auth\": \"<agent-qa version>\" }'))\n  console.log(pc.dim('Declare it in agent-qa.config.yaml under plugins.auth:'))\n  console.log(pc.dim('  plugins:'))\n  console.log(pc.dim('    auth:'))\n  console.log(pc.dim('      - package: @vostride/agent-qa-subscription-auth'))\n  console.log(pc.dim('Then authenticate from agent-qa dashboard or rerun this command.'))\n}\n\nasync function readTokensFromPlugin(\n  provider: SubscriptionProvider,\n  plugin: LLMAuthProviderPlugin,\n  started: Awaited<ReturnType<NonNullable<LLMAuthProviderPlugin['startAuth']>>>,\n): Promise<OAuthTokens | null> {\n  if (started.waitForTokens) {\n    return await started.waitForTokens\n  }\n\n  if (plugin.dashboardAuth.mode === 'manual-code') {\n    if (!plugin.exchangeCode) {\n      console.log(pc.red(`Provider \"${provider}\" does not support CLI code exchange. Use agent-qa dashboard.`))\n      process.exitCode = 1\n      return null\n    }\n    const code = (await input({ message: 'Authorization code:' })).trim()\n    if (!code) {\n      console.log(pc.red('Authorization code is required'))\n      process.exitCode = 1\n      return null\n    }\n    return await plugin.exchangeCode({ code, sessionState: started.sessionState })\n  }\n\n  console.log(pc.red(`Provider \"${provider}\" does not support CLI auth login. Use agent-qa dashboard.`))\n  process.exitCode = 1\n  return null\n}\n\nasync function runSubscriptionPluginLogin(configName: string, provider: SubscriptionProvider): Promise<void> {\n  const { getLLMAuthProviderPlugin, writeAuth } = await import('@vostride/agent-qa-core')\n  const plugin = getLLMAuthProviderPlugin(provider)\n\n  if (!plugin) {\n    printMissingSubscriptionPluginGuidance(configName, provider)\n    process.exitCode = 1\n    return\n  }\n\n  if (!plugin.startAuth) {\n    console.log(pc.red(`Provider \"${provider}\" does not support CLI auth login. Use agent-qa dashboard.`))\n    process.exitCode = 1\n    return\n  }\n\n  let started: Awaited<ReturnType<NonNullable<LLMAuthProviderPlugin['startAuth']>>> | undefined\n  try {\n    started = await plugin.startAuth({ configName })\n    console.log(`Open this URL to authenticate: ${pc.cyan(started.authorizeUrl)}`)\n    openAuthorizationUrl(started.authorizeUrl)\n\n    const tokens = await readTokensFromPlugin(provider, plugin, started)\n    if (!tokens) return\n\n    await writeAuth(configName, {\n      type: 'oauth',\n      provider: plugin.credentialProviderId,\n      tokens,\n    })\n    console.log(pc.green(`Authenticated ${configName} with ${plugin.label}`))\n  } catch (err: unknown) {\n    console.log(pc.red(err instanceof Error ? err.message : String(err)))\n    process.exitCode = 1\n  } finally {\n    started?.cleanup?.()\n  }\n}\n\nexport function createAuthCommand(): Command {\n  const cmd = new Command('auth')\n    .description('Manage LLM config credentials')\n\n  cmd.addCommand(\n    new Command('login')\n      .description('Authenticate with a subscription provider')\n      .requiredOption('--config <name>', 'named subscription LLM config to authenticate')\n      .action(async (opts: { config: string }, command: Command) => {\n        const { resolveNamedConfig } = await import('../llm-utils.js')\n        const configPath = getGlobalConfigPath(command)\n\n        let provider: SubscriptionProvider\n        let configName: string\n\n        try {\n          const requestedName = normalizeConfigName(opts.config)\n          if (!requestedName) {\n            console.log(pc.red('configName is required'))\n            return\n          }\n          const resolved = await resolveNamedConfig(requestedName, configPath)\n          const resolvedName = normalizeConfigName(resolved.config.name)\n          if (!resolvedName) {\n            console.log(pc.red('Config name is invalid'))\n            return\n          }\n          configName = resolvedName\n          const configProvider = resolved.config.provider\n          if (!isSubscriptionProvider(configProvider)) {\n            printCredentialGuidance(configName, configProvider)\n            return\n          }\n          provider = configProvider\n        } catch (err: unknown) {\n          console.log(pc.red(err instanceof Error ? err.message : String(err)))\n          return\n        }\n\n        await runSubscriptionPluginLogin(configName, provider)\n      }),\n  )\n\n  cmd.addCommand(\n    new Command('set')\n      .description('Save a credential for a named LLM config')\n      .requiredOption('--config <name>', 'named LLM config to save a credential for')\n      .requiredOption('--type <type>', 'credential type: api-key or bearer-token')\n      .argument('[secret]', 'credential secret; prompted when omitted')\n      .action(async (secretArg: string | undefined, opts: { config: string; type: string }, command: Command) => {\n        const credentialType = opts.type.trim()\n        if (credentialType !== 'api-key' && credentialType !== 'bearer-token') {\n          console.log(pc.red('type must be api-key or bearer-token'))\n          return\n        }\n\n        const { resolveNamedConfig } = await import('../llm-utils.js')\n        const configPath = getGlobalConfigPath(command)\n        let resolved: { config: CliLLMConfig }\n        try {\n          resolved = await resolveNamedConfig(opts.config, configPath)\n        } catch (err: unknown) {\n          console.log(pc.red(err instanceof Error ? err.message : String(err)))\n          return\n        }\n\n        const configName = resolved.config.name ?? opts.config\n        const provider = resolved.config.provider\n\n        if (SUBSCRIPTION_PROVIDERS.has(provider)) {\n          console.log(pc.red('Subscription providers use OAuth login'))\n          return\n        }\n\n        if (credentialType === 'bearer-token' && provider !== 'anthropic-compatible') {\n          console.log(pc.red('bearer-token credentials are only supported for anthropic-compatible configs'))\n          return\n        }\n\n        if (credentialType === 'api-key' && !API_KEY_CREDENTIAL_PROVIDERS.has(provider)) {\n          console.log(pc.red('api-key credentials are not supported for this provider'))\n          return\n        }\n\n        const secret = (secretArg ?? await password({ message: 'Secret:' })).trim()\n        if (!secret) {\n          console.log(pc.red('Secret is required'))\n          return\n        }\n\n        const { writeAuth } = await import('@vostride/agent-qa-core') as unknown as {\n          writeAuth: (configName: string, credential: Record<string, unknown>) => Promise<void>\n        }\n        if (credentialType === 'bearer-token') {\n          await writeAuth(configName, { type: 'bearer', provider: 'anthropic-compatible', token: secret })\n          console.log(pc.green(`Saved bearer token for ${configName}`))\n        } else {\n          await writeAuth(configName, { type: 'api', provider, key: secret })\n          console.log(pc.green(`Saved API key for ${configName}`))\n        }\n      }),\n  )\n\n  cmd.addCommand(\n    new Command('status')\n      .description('Show credential status for configured LLMs')\n      .action(async function (this: Command) {\n        const { loadAuthPluginsForRawConfig, resolveModelAuth } = await import('../llm-utils.js')\n        const { loadConfigFile } = await import('../config.js')\n        const configPath = getGlobalConfigPath(this) ?? 'agent-qa.config.yaml'\n\n        console.log(pc.bold('Auth status:\\n'))\n\n        let llms: CliLLMConfig[] | undefined\n        let defaultLLM: string | undefined\n        try {\n          const cfg = (await loadConfigFile(configPath)) as any\n          await loadAuthPluginsForRawConfig(cfg, configPath)\n          llms = cfg?.registry?.llms\n          defaultLLM = cfg?.use?.llm\n        } catch {\n          // No readable config.\n        }\n\n        if (!llms?.length) {\n          console.log(pc.dim('  No LLM configs found'))\n          return\n        }\n\n        const maxNameLen = Math.max(...llms.map(c => String(c.name ?? '').length), 4) + 12\n        for (const llm of llms) {\n          const name = String(llm.name ?? '')\n          const isDefault = name === defaultLLM\n          const label = isDefault ? `${name} ${pc.dim('(default)')}` : name\n          const rawLabel = isDefault ? `${name} (default)` : name\n          const padLen = Math.max(0, maxNameLen - rawLabel.length)\n          const dots = '.'.repeat(padLen + 2)\n          const provider = llm.provider\n          const status = statusForResolvedAuth(await resolveModelAuth(name, llm) as ResolvedAuth)\n\n          console.log(`  ${label} ${pc.dim(`[${providerLabel(provider)}]`)} ${pc.dim(dots)} ${status}`)\n        }\n      }),\n  )\n\n  cmd.addCommand(\n    new Command('logout')\n      .description('Remove stored credentials for a named config')\n      .option('--config <name>', 'named LLM config to log out from')\n      .action(async (opts: { config?: string }, command: Command) => {\n        const { removeAuth } = await import('@vostride/agent-qa-core')\n        const { resolveNamedConfig } = await import('../llm-utils.js')\n        const configPath = getGlobalConfigPath(command)\n\n        let storeKey: string | undefined\n\n        if (opts.config) {\n          storeKey = opts.config\n        } else {\n          try {\n            const resolved = await resolveNamedConfig(undefined, configPath)\n            storeKey = resolved.config.name\n          } catch {\n            console.log(pc.red('Specify --config <name> or run with a config file'))\n            return\n          }\n        }\n\n        await removeAuth(storeKey)\n        console.log(pc.green(`Logged out from ${storeKey}`))\n      }),\n  )\n\n  cmd.addCommand(\n    new Command('test')\n      .description('Test LLM connection using named config credentials')\n      .option('--config <name>', 'named LLM config to test')\n      .option('--provider <name>', 'override config provider')\n      .option('--model <name>', 'override config model')\n      .action(async (opts: { config?: string; provider?: string; model?: string }, command: Command) => {\n        const { resolveModelAuth, resolveNamedConfig } = await import('../llm-utils.js')\n        const configPath = getGlobalConfigPath(command)\n\n        let planner: CliLLMConfig\n        let configName: string\n\n        try {\n          const resolved = await resolveNamedConfig(opts.config, configPath)\n          const { name, ...modelFields } = resolved.config\n          planner = modelFields\n          configName = name\n        } catch (err: unknown) {\n          console.log(pc.red(err instanceof Error ? err.message : String(err)))\n          return\n        }\n\n        if (opts.provider) planner = { ...planner, provider: opts.provider as ProviderMode }\n        if (opts.model) planner = { ...planner, model: opts.model }\n\n        console.log(pc.dim(`Testing config: ${configName}...`))\n\n        const auth = await resolveModelAuth(configName, planner) as ResolvedAuth\n        if (auth.kind === 'missing') {\n          console.log(pc.red(auth.message))\n          return\n        }\n        if (auth.kind === 'unauthenticated') {\n          console.log(pc.dim(auth.message))\n        }\n\n        const { createModel, getProviderOptions } = await import('@vostride/agent-qa-core')\n        const { generateText } = await import('ai')\n\n        const modelConfig = applyAuthToModelConfig(planner, auth)\n        const model = await createModel(modelConfig as any)\n        const providerOpts = getProviderOptions(modelConfig as any)\n\n        const start = Date.now()\n        const controller = new AbortController()\n        const timeout = setTimeout(() => controller.abort(), 10000)\n        try {\n          await generateText({\n            model,\n            prompt: 'Say \"ok\"',\n            abortSignal: controller.signal,\n            ...(providerOpts ? { providerOptions: providerOpts } : {}),\n          })\n          const elapsed = Date.now() - start\n          console.log(pc.green(`Connected to ${planner.provider}/${planner.model} (${elapsed}ms)`))\n        } catch (err: unknown) {\n          const { message, statusCode } = extractProviderError(err)\n          const fullContext = `${message} ${statusCode ?? ''}`\n\n          if (/auth|unauthorized|401|invalid.*key|permission/i.test(fullContext)) {\n            console.log(pc.red('Authentication failed. Check the saved credential for this config.'))\n          } else if (/model.*not.*support|not found|404|does not exist/i.test(fullContext)) {\n            console.log(pc.red('Model not found. Check the model name.'))\n          } else if (/rate|429|quota|limit/i.test(fullContext)) {\n            console.log(pc.red('Rate limited. Try again later.'))\n          } else if (/ECONNREFUSED|ENOTFOUND|timeout|abort|fetch failed|network/i.test(fullContext)) {\n            console.log(pc.red('Network error. Check the exact base URL and try again.'))\n          } else if (/invalid_request|400|bad request/i.test(fullContext)) {\n            console.log(pc.red('Invalid request. Check model and provider settings.'))\n          } else {\n            console.log(pc.red(`Connection failed. ${message}`))\n          }\n          console.log(pc.dim(message))\n        } finally {\n          clearTimeout(timeout)\n        }\n      }),\n  )\n\n  return cmd\n}\n","import { createInterface } from 'node:readline/promises'\nimport { dirname, resolve as resolvePath } from 'node:path'\nimport { Command } from 'commander'\nimport pc from 'picocolors'\nimport {\n  AUTH_STATE_SCHEMA_VERSION,\n  listAuthStateMetadata,\n  readAuthStateMetadata,\n  removeAuthStateFiles,\n  removeAuthStateTarget,\n  resolveAuthStatePaths,\n  writeAuthStateFiles,\n} from '@vostride/agent-qa-core'\nimport { resolveConfig } from '../config.js'\nimport { resolveTarget } from '../targets.js'\nimport type { AgentQaConfig, AuthStateMetadata } from '@vostride/agent-qa-core'\n\ntype BrowserName = 'chromium' | 'firefox' | 'webkit'\ntype ConfirmationResult = 'confirmed' | 'cancelled' | 'browser-closed'\n\ninterface BrowserLike {\n  close(): Promise<void>\n  on(event: 'disconnected', listener: () => void): unknown\n  off?(event: 'disconnected', listener: () => void): unknown\n  newContext(): Promise<{\n    newPage(): Promise<{ goto(url: string, options?: Record<string, unknown>): Promise<unknown> }>\n    storageState(options?: { indexedDB?: boolean }): Promise<unknown>\n  }>\n}\n\ninterface BrowserLauncher {\n  launch(options: { headless: boolean }): Promise<BrowserLike>\n}\n\ninterface PlaywrightLaunchers {\n  chromium: BrowserLauncher\n  firefox: BrowserLauncher\n  webkit: BrowserLauncher\n}\n\nexport interface CaptureConfirmationInput {\n  browser: BrowserLike\n  message: string\n}\n\nexport interface AuthStateCommandDeps {\n  launchers?: PlaywrightLaunchers\n  waitForConfirmation?: (input: CaptureConfirmationInput) => Promise<ConfirmationResult>\n  now?: () => Date\n}\n\nfunction getGlobalConfigPath(command: Command): string | undefined {\n  return command.parent?.parent?.opts<{ config?: string }>().config\n    ?? command.parent?.opts<{ config?: string }>().config\n}\n\nfunction isBrowserName(value: unknown): value is BrowserName {\n  return value === 'chromium' || value === 'firefox' || value === 'webkit'\n}\n\nfunction resolveBrowserName(config: unknown): BrowserName {\n  const name = (config as { use?: { browser?: { name?: unknown } } }).use?.browser?.name\n  return isBrowserName(name) ? name : 'chromium'\n}\n\nasync function loadPlaywrightLaunchers(): Promise<PlaywrightLaunchers> {\n  const { chromium, firefox, webkit } = await import('playwright-core')\n  return { chromium, firefox, webkit }\n}\n\nexport async function waitForCaptureConfirmation(\n  input: CaptureConfirmationInput,\n): Promise<ConfirmationResult> {\n  console.log(input.message)\n  const rl = createInterface({ input: process.stdin, output: process.stdout })\n\n  return await new Promise<ConfirmationResult>((resolve) => {\n    let settled = false\n\n    const finish = (result: ConfirmationResult): void => {\n      if (settled) return\n      settled = true\n      process.off('SIGINT', onSigint)\n      input.browser.off?.('disconnected', onDisconnected)\n      rl.close()\n      resolve(result)\n    }\n\n    const onSigint = (): void => finish('cancelled')\n    const onDisconnected = (): void => finish('browser-closed')\n\n    process.once('SIGINT', onSigint)\n    input.browser.on('disconnected', onDisconnected)\n\n    rl.question('')\n      .then(() => finish('confirmed'))\n      .catch(() => finish('cancelled'))\n  })\n}\n\nasync function authStateExists(paths: Parameters<typeof readAuthStateMetadata>[0]): Promise<boolean> {\n  try {\n    await readAuthStateMetadata(paths)\n    return true\n  } catch {\n    return false\n  }\n}\n\nfunction buildConfirmationMessage(targetName: string, stateName: string, exists: boolean): string {\n  const replace = exists ? ' Existing auth state will be replaced.' : ''\n  return `Log in in the opened browser, then press Enter to save auth state \"${stateName}\" for target \"${targetName}\".${replace} Press Ctrl+C to cancel.`\n}\n\nasync function loadCommandContext(command: Command): Promise<{\n  configPath: string\n  configDir: string\n  config: AgentQaConfig\n}> {\n  const configPath = getGlobalConfigPath(command) ?? 'agent-qa.config.yaml'\n  const configDir = dirname(resolvePath(configPath))\n  const config = await resolveConfig({ configPath, loadAuthPlugins: false })\n  return { configPath, configDir, config }\n}\n\nfunction isSafeAuthStateError(message: string): boolean {\n  return message.includes('auth state is only supported for web targets')\n    || message.includes('use.mobile.appState: preserve')\n    || message.includes('Auth state name must match')\n    || message.includes('Target name must match')\n}\n\nfunction printSafeAuthStateError(error: unknown, fallback: string): void {\n  const message = error instanceof Error ? error.message : String(error)\n  console.error(pc.red(isSafeAuthStateError(message) ? message : fallback))\n}\n\nfunction assertWebAuthStateTarget(input: {\n  configDir: string\n  config: AgentQaConfig\n  target: ReturnType<typeof resolveTarget>\n}): void {\n  resolveAuthStatePaths({\n    configDir: input.configDir,\n    authStateDir: input.config.services?.authState?.dir,\n    targetName: input.target.name,\n    stateName: 'placeholder',\n    target: { platform: input.target.platform },\n  })\n}\n\nfunction printAuthStateList(metadata: AuthStateMetadata[], targetName?: string): void {\n  if (metadata.length === 0) {\n    console.log(targetName\n      ? `No auth states saved for target \"${targetName}\".`\n      : 'No auth states saved.')\n    return\n  }\n\n  console.log('Target\\tName\\tCaptured\\tKind')\n  for (const entry of metadata) {\n    console.log(`${entry.target}\\t${entry.name}\\t${entry.capturedAt}\\t${entry.kind}`)\n  }\n}\n\nasync function closeBrowser(browser: BrowserLike | undefined): Promise<void> {\n  if (!browser) return\n  try {\n    await browser.close()\n  } catch {\n    // Browser may already be closed by the user.\n  }\n}\n\nexport function createAuthStateCommand(deps: AuthStateCommandDeps = {}): Command {\n  const cmd = new Command('auth-state')\n    .description('Manage product auth state')\n\n  cmd.addCommand(\n    new Command('list')\n      .description('List saved auth states')\n      .option('--target <target>', 'target name from agent-qa config')\n      .action(async (opts: { target?: string }, command: Command) => {\n        try {\n          const { configDir, config } = await loadCommandContext(command)\n          let targetName: string | undefined\n          if (opts.target) {\n            const target = resolveTarget(config, opts.target)\n            assertWebAuthStateTarget({ configDir, config, target })\n            targetName = target.name\n          }\n\n          const metadata = await listAuthStateMetadata({\n            configDir,\n            authStateDir: config.services?.authState?.dir,\n            targetName,\n          })\n          printAuthStateList(metadata, targetName)\n        } catch (error) {\n          printSafeAuthStateError(error, 'Could not list auth states.')\n          process.exitCode = 1\n        }\n      }),\n  )\n\n  cmd.addCommand(\n    new Command('remove')\n      .description('Remove saved auth state files for a target')\n      .requiredOption('--target <target>', 'target name from agent-qa config')\n      .option('--name <name>', 'logical auth-state name')\n      .action(async (opts: { target: string; name?: string }, command: Command) => {\n        let resolvedTargetName = opts.target\n        try {\n          const { configDir, config } = await loadCommandContext(command)\n          const target = resolveTarget(config, opts.target)\n          resolvedTargetName = target.name\n\n          if (opts.name) {\n            await removeAuthStateFiles({\n              configDir,\n              authStateDir: config.services?.authState?.dir,\n              targetName: target.name,\n              stateName: opts.name,\n              target: { platform: target.platform },\n            })\n            console.log(`Removed auth state \"${opts.name}\" for target \"${target.name}\".`)\n            return\n          }\n\n          await removeAuthStateTarget({\n            configDir,\n            authStateDir: config.services?.authState?.dir,\n            targetName: target.name,\n            target: { platform: target.platform },\n          })\n          console.log(`Removed auth states for target \"${target.name}\".`)\n        } catch (error) {\n          printSafeAuthStateError(\n            error,\n            opts.name\n              ? `Could not remove auth state \"${opts.name}\" for target \"${resolvedTargetName}\".`\n              : `Could not remove auth states for target \"${resolvedTargetName}\".`,\n          )\n          process.exitCode = 1\n        }\n      }),\n  )\n\n  cmd.addCommand(\n    new Command('capture')\n      .description('Capture a named web auth state for a target')\n      .requiredOption('--target <target>', 'target name from agent-qa config')\n      .requiredOption('--name <name>', 'logical auth-state name')\n      .action(async (opts: { target: string; name: string }, command: Command) => {\n        let browser: BrowserLike | undefined\n\n        try {\n          const { configDir, config } = await loadCommandContext(command)\n          const target = resolveTarget(config, opts.target)\n          const paths = resolveAuthStatePaths({\n            configDir,\n            authStateDir: config.services?.authState?.dir,\n            targetName: target.name,\n            stateName: opts.name,\n            target: { platform: target.platform },\n          })\n\n          if (!target.url) {\n            console.error(pc.red(`Target \"${target.name}\" must define a web URL for auth-state capture.`))\n            process.exitCode = 1\n            return\n          }\n\n          const launchers = deps.launchers ?? await loadPlaywrightLaunchers()\n          const browserName = resolveBrowserName(config)\n          browser = await launchers[browserName].launch({ headless: false })\n          const context = await browser.newContext()\n          const page = await context.newPage()\n          await page.goto(target.url, { waitUntil: 'domcontentloaded' })\n\n          const exists = await authStateExists(paths)\n          const waitForConfirmation = deps.waitForConfirmation ?? waitForCaptureConfirmation\n          const confirmation = await waitForConfirmation({\n            browser,\n            message: buildConfirmationMessage(target.name, opts.name, exists),\n          })\n\n          if (confirmation === 'cancelled') {\n            await closeBrowser(browser)\n            console.log('Auth-state capture cancelled.')\n            process.exitCode = 1\n            return\n          }\n\n          if (confirmation === 'browser-closed') {\n            await closeBrowser(browser)\n            console.error(pc.red('Browser was closed before auth state was saved.'))\n            process.exitCode = 1\n            return\n          }\n\n          const payload = await context.storageState({ indexedDB: true })\n          try {\n            await writeAuthStateFiles(paths, {\n              payload,\n              metadata: {\n                version: AUTH_STATE_SCHEMA_VERSION,\n                kind: 'web',\n                target: target.name,\n                name: opts.name,\n                capturedAt: (deps.now ?? (() => new Date()))().toISOString(),\n              },\n            })\n          } catch {\n            await closeBrowser(browser)\n            console.error(pc.red(`Could not save auth state \"${opts.name}\" for target \"${target.name}\".`))\n            process.exitCode = 1\n            return\n          }\n\n          await closeBrowser(browser)\n          console.log(`Saved auth state \"${opts.name}\" for target \"${target.name}\".`)\n        } catch (error) {\n          await closeBrowser(browser)\n          console.error(pc.red(error instanceof Error ? error.message : String(error)))\n          process.exitCode = 1\n        }\n      }),\n  )\n\n  return cmd\n}\n","import { Command } from 'commander'\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { stringify } from 'yaml'\nimport pc from 'picocolors'\nimport { resolveConfig } from '../config.js'\nimport { loadLocalBindings } from '../devices.js'\n\nfunction formatStatus(\n  transport: string,\n  localBinding: Record<string, unknown> | null,\n): string {\n  if (transport !== 'local') {\n    return pc.green('Ready') + pc.dim(' (no local binding required)')\n  }\n  if (!localBinding) {\n    return pc.red('UNBOUND') + pc.yellow(' - run `agent-qa devices init`')\n  }\n  const keys = Object.entries(localBinding).slice(0, 2)\n  const details = keys.map(([k, v]) => `${k}: ${v}`).join(', ')\n  return pc.green('Bound') + pc.dim(` (${details})`)\n}\n\nasync function listDevices(): Promise<void> {\n  let config\n  try {\n    config = await resolveConfig({})\n  } catch (err) {\n    console.error(pc.red(`Config error: ${err instanceof Error ? err.message : String(err)}`))\n    process.exitCode = 1\n    return\n  }\n\n  const devices = (config as any).registry?.devices\n  if (!devices || Object.keys(devices).length === 0) {\n    console.log(pc.yellow('No devices configured in registry.devices'))\n    return\n  }\n\n  const localBindings = loadLocalBindings()\n\n  const nameWidth = Math.max(12, ...Object.keys(devices).map(n => n.length))\n  const platWidth = 10\n  const transWidth = 14\n\n  console.log('')\n  console.log(pc.bold('  Configured Devices'))\n  console.log('')\n  console.log(\n    `  ${pc.dim('Name'.padEnd(nameWidth))}  ${pc.dim('Platform'.padEnd(platWidth))}  ${pc.dim('Transport'.padEnd(transWidth))}  ${pc.dim('Status')}`,\n  )\n  console.log(\n    `  ${pc.dim('─'.repeat(nameWidth))}  ${pc.dim('─'.repeat(platWidth))}  ${pc.dim('─'.repeat(transWidth))}  ${pc.dim('─'.repeat(30))}`,\n  )\n\n  for (const [name, profile] of Object.entries(devices) as [string, any][]) {\n    const localBinding = localBindings?.devices?.[name] as Record<string, unknown> | undefined ?? null\n    const status = formatStatus(profile.transport, localBinding)\n    console.log(\n      `  ${name.padEnd(nameWidth)}  ${profile.platform.padEnd(platWidth)}  ${profile.transport.padEnd(transWidth)}  ${status}`,\n    )\n  }\n  console.log('')\n}\n\ninterface AdbDevice {\n  serial: string\n  model: string\n}\n\ninterface SimctlDevice {\n  name: string\n  udid: string\n  state: string\n}\n\nfunction scanAdbDevices(): AdbDevice[] {\n  try {\n    const output = execSync('adb devices -l', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] })\n    const lines = output.split('\\n').slice(1)\n    const results: AdbDevice[] = []\n    for (const line of lines) {\n      const trimmed = line.trim()\n      if (!trimmed || trimmed.startsWith('*')) continue\n      const parts = trimmed.split(/\\s+/)\n      if (parts.length < 2 || parts[1] !== 'device') continue\n      const serial = parts[0]\n      const modelMatch = trimmed.match(/model:(\\S+)/)\n      results.push({ serial, model: modelMatch?.[1] ?? serial })\n    }\n    return results\n  } catch {\n    return []\n  }\n}\n\nfunction scanSimctlDevices(): SimctlDevice[] {\n  try {\n    const output = execSync('xcrun simctl list devices --json', {\n      encoding: 'utf-8',\n      stdio: ['pipe', 'pipe', 'pipe'],\n    })\n    const data = JSON.parse(output)\n    const results: SimctlDevice[] = []\n    for (const runtime of Object.values(data.devices) as any[][]) {\n      for (const device of runtime) {\n        if (device.isAvailable !== false) {\n          results.push({ name: device.name, udid: device.udid, state: device.state })\n        }\n      }\n    }\n    return results\n  } catch {\n    return []\n  }\n}\n\nfunction appendGitignoreEntry(dir: string, entry: string): void {\n  const gitignorePath = join(dir, '.gitignore')\n  let existing = ''\n  if (existsSync(gitignorePath)) {\n    existing = readFileSync(gitignorePath, 'utf-8')\n  }\n  if (existing.includes(entry)) return\n  const append = (existing.length > 0 && !existing.endsWith('\\n') ? '\\n' : '') + entry + '\\n'\n  writeFileSync(gitignorePath, existing + append)\n}\n\nasync function initDevices(): Promise<void> {\n  const dir = process.cwd()\n  const localFilePath = join(dir, 'agent-qa.local.yaml')\n\n  if (existsSync(localFilePath)) {\n    console.log(pc.yellow('agent-qa.local.yaml already exists. Skipping generation.'))\n    return\n  }\n\n  console.log(pc.bold('\\n  Scanning for connected devices...\\n'))\n\n  const adbDevices = scanAdbDevices()\n  const simctlDevices = scanSimctlDevices()\n\n  if (adbDevices.length > 0) {\n    console.log(`  ${pc.green('Android:')} found ${adbDevices.length} device(s)`)\n    for (const d of adbDevices) {\n      console.log(`    ${pc.dim('•')} ${d.model} (${d.serial})`)\n    }\n  } else {\n    console.log(`  ${pc.dim('Android:')} no devices found (adb not available or no devices connected)`)\n  }\n\n  if (simctlDevices.length > 0) {\n    const booted = simctlDevices.filter(d => d.state === 'Booted')\n    console.log(`  ${pc.green('iOS:')} found ${simctlDevices.length} simulator(s) (${booted.length} booted)`)\n    for (const d of booted) {\n      console.log(`    ${pc.dim('•')} ${d.name} (${d.udid})`)\n    }\n  } else {\n    console.log(`  ${pc.dim('iOS:')} no simulators found (simctl not available or none installed)`)\n  }\n\n  let config\n  try {\n    config = await resolveConfig({})\n  } catch {\n    config = null\n  }\n\n  const registryDevices = (config as any)?.registry?.devices ?? {}\n  const localDevices: Record<string, Record<string, string>> = {}\n  let bindCount = 0\n\n  for (const [name, profile] of Object.entries(registryDevices) as [string, any][]) {\n    if (profile.transport !== 'local') continue\n\n    if (profile.platform === 'android' && adbDevices.length > 0) {\n      const device = adbDevices[0]\n      localDevices[name] = { avd: device.model }\n      bindCount++\n    } else if (profile.platform === 'ios' && simctlDevices.length > 0) {\n      const booted = simctlDevices.find(d => d.state === 'Booted')\n      const device = booted ?? simctlDevices[0]\n      localDevices[name] = { udid: device.udid }\n      bindCount++\n    } else {\n      localDevices[name] = {}\n    }\n  }\n\n  const localFileContent = {\n    devices: Object.keys(localDevices).length > 0 ? localDevices : {},\n    providers: {},\n  }\n\n  const yamlContent =\n    '# Generated by agent-qa devices init\\n' +\n    '# Edit device bindings for your local machine\\n' +\n    stringify(localFileContent)\n\n  writeFileSync(localFilePath, yamlContent)\n\n  appendGitignoreEntry(dir, 'agent-qa.local.yaml')\n\n  console.log('')\n  console.log(pc.green(`  Generated agent-qa.local.yaml with ${bindCount} device binding(s)`))\n  console.log(pc.dim('  Added agent-qa.local.yaml to .gitignore'))\n  console.log('')\n}\n\nexport function createDevicesCommand(): Command {\n  const cmd = new Command('devices')\n    .description('Manage device profiles and local bindings')\n\n  cmd\n    .command('list')\n    .description('Show configured devices with merged shared + local view')\n    .action(listDevices)\n\n  cmd\n    .command('init')\n    .description('Scan connected devices and generate agent-qa.local.yaml')\n    .action(initDevices)\n\n  return cmd\n}\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport {\n  ENTITY_ID_TYPES,\n  generateCanonicalId,\n  getEntityIdContract,\n  isCanonicalId,\n  type EntityIdType,\n} from '@vostride/agent-qa-ids'\n\nfunction parseEntityType(value: string): EntityIdType {\n  if ((ENTITY_ID_TYPES as readonly string[]).includes(value)) {\n    return value as EntityIdType\n  }\n  throw new Error(`Unknown ID type \"${value}\". Expected one of: ${ENTITY_ID_TYPES.join(', ')}`)\n}\n\nexport function createIdsCommand(): Command {\n  const cmd = new Command('ids')\n    .description('Generate and validate canonical agent-qa entity IDs')\n\n  cmd\n    .command('generate')\n    .description('Generate a canonical agent-qa ID using id-agent')\n    .argument('<type>', `entity type: ${ENTITY_ID_TYPES.join('|')}`)\n    .option('--json', 'print structured JSON')\n    .action((typeValue: string, opts: { json?: boolean }) => {\n      try {\n        const type = parseEntityType(typeValue)\n        const id = generateCanonicalId(type)\n        const contract = getEntityIdContract(type)\n        if (opts.json) {\n          console.log(JSON.stringify({ id, type, contract }, null, 2))\n        } else {\n          console.log(id)\n        }\n      } catch (err) {\n        console.error(pc.red(err instanceof Error ? err.message : String(err)))\n        process.exitCode = 1\n      }\n    })\n\n  cmd\n    .command('validate')\n    .description('Validate a canonical agent-qa ID')\n    .argument('<type>', `entity type: ${ENTITY_ID_TYPES.join('|')}`)\n    .argument('<id>', 'ID to validate')\n    .option('--json', 'print structured JSON')\n    .action((typeValue: string, id: string, opts: { json?: boolean }) => {\n      try {\n        const type = parseEntityType(typeValue)\n        const contract = getEntityIdContract(type)\n        const valid = isCanonicalId(type, id)\n        const result = {\n          valid,\n          id,\n          type,\n          contract,\n          message: valid\n            ? 'ID is canonical.'\n            : `Expected ${contract.prefixWithSeparator} followed by ${contract.words} id-agent words.`,\n        }\n        if (opts.json) {\n          console.log(JSON.stringify(result, null, 2))\n        } else if (valid) {\n          console.log(pc.green(result.message))\n        } else {\n          console.error(pc.red(result.message))\n        }\n        if (!valid) {\n          process.exitCode = 1\n        }\n      } catch (err) {\n        console.error(pc.red(err instanceof Error ? err.message : String(err)))\n        process.exitCode = 1\n      }\n    })\n\n  return cmd\n}\n","import { Command } from 'commander'\nimport { generateTestId } from '@vostride/agent-qa-ids'\nimport { stringify } from 'yaml'\nimport { writeFile, mkdir } from 'node:fs/promises'\nimport { existsSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport pc from 'picocolors'\n\nexport function createCreateTestCommand(): Command {\n  const cmd = new Command('create-test')\n    .description('Scaffold a new test YAML file with auto-generated ID')\n    .argument('<path>', 'output file path for the test YAML')\n    .action(async (path: string) => {\n      const resolved = resolve(path)\n\n      if (existsSync(resolved)) {\n        console.error(pc.red('Error: File already exists: ' + resolved))\n        process.exitCode = 1\n        return\n      }\n\n      const testId = generateTestId()\n\n      const template = {\n        name: 'New test',\n        'test-id': testId,\n        target: 'my-target',\n        steps: ['Describe your first test step here'],\n      }\n\n      const yamlContent = stringify(template)\n\n      await mkdir(dirname(resolved), { recursive: true })\n      await writeFile(resolved, yamlContent, 'utf-8')\n\n      console.log(pc.green('Created ' + resolved))\n      console.log(pc.dim('  test-id: ' + testId))\n    })\n\n  return cmd\n}\n","import { Command } from 'commander'\nimport { generateSuiteId } from '@vostride/agent-qa-ids'\nimport { stringify } from 'yaml'\nimport { writeFile, mkdir } from 'node:fs/promises'\nimport { existsSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport pc from 'picocolors'\n\nexport function createCreateSuiteCommand(): Command {\n  const cmd = new Command('create-suite')\n    .description('Scaffold a new suite YAML file with auto-generated ID')\n    .argument('<path>', 'output file path for the suite YAML')\n    .action(async (path: string) => {\n      const resolved = resolve(path)\n\n      if (existsSync(resolved)) {\n        console.error(pc.red('Error: File already exists: ' + resolved))\n        process.exitCode = 1\n        return\n      }\n\n      const suiteId = generateSuiteId()\n\n      const template = {\n        name: 'New suite',\n        'suite-id': suiteId,\n        tests: [],\n      }\n\n      const yamlContent = stringify(template).replace(\n        'tests: []',\n        'tests: []\\n  # - test: ./path/to/test.yaml\\n  #   id: my-test-id',\n      )\n\n      await mkdir(dirname(resolved), { recursive: true })\n      await writeFile(resolved, yamlContent, 'utf-8')\n\n      console.log(pc.green('Created ' + resolved))\n      console.log(pc.dim('  suite-id: ' + suiteId))\n    })\n\n  return cmd\n}\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { createInterface } from 'node:readline'\nimport { readFile, readdir, rm, stat } from 'node:fs/promises'\nimport { existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport {\n  discoverWorkspaceFiles,\n  parseObservation,\n  listObservations,\n  parseTestFile,\n  parseSuiteFile,\n  resolveMemoryRoot,\n  resolveWorkspacePaths,\n} from '@vostride/agent-qa-core'\nimport { resolveConfig } from '../config.js'\n\ninterface OrphanInfo {\n  path: string\n  tier: string\n  scope: string\n  fileCount: number\n  lastConfirmed: string | null\n  size: number\n}\n\nfunction formatSize(bytes: number): string {\n  if (bytes === 0) return '0 B'\n  if (bytes < 1048576) return `${Math.ceil(bytes / 1024)} KB`\n  return `${(bytes / 1048576).toFixed(1)} MB`\n}\n\nasync function getOrphanInfo(memoryRoot: string, tier: string, scope: string): Promise<OrphanInfo> {\n  const scopePath = join(memoryRoot, tier, scope)\n  const obsFiles = await listObservations(scopePath)\n\n  let newest: string | null = null\n  for (const filename of obsFiles) {\n    try {\n      const content = await readFile(join(scopePath, filename), 'utf-8')\n      const { data } = parseObservation(content, filename)\n      if (data?.last_confirmed) {\n        if (!newest || data.last_confirmed > newest) {\n          newest = data.last_confirmed\n        }\n      }\n    } catch { /* skip unreadable files */ }\n  }\n\n  let totalSize = 0\n  try {\n    const entries = await readdir(scopePath)\n    for (const entry of entries) {\n      try {\n        const s = await stat(join(scopePath, entry))\n        if (s.isFile()) totalSize += s.size\n      } catch { /* skip inaccessible entries */ }\n    }\n  } catch { /* empty dir */ }\n\n  return {\n    path: join(tier, scope),\n    tier,\n    scope,\n    fileCount: obsFiles.length,\n    lastConfirmed: newest,\n    size: totalSize,\n  }\n}\n\nexport function createCleanMemoryCommand(): Command {\n  const cmd = new Command('clean-memory')\n    .description('Remove orphaned memory observation directories')\n    .option('-y, --yes', 'skip confirmation prompt')\n    .action(async (_opts, command) => {\n      const opts = command.opts()\n      const configPath = command.parent?.opts()?.config ?? 'agent-qa.config.yaml'\n      const config = await resolveConfig({ configPath })\n      const workspace = resolveWorkspacePaths({ config, configPath })\n\n      const expectedProducts = new Set<string>()\n      const targets = config.registry?.targets ?? {}\n      for (const [name, entry] of Object.entries(targets)) {\n        expectedProducts.add((entry as any)?.product ?? name)\n      }\n\n      const expectedTests = new Set<string>()\n      for (const file of await discoverWorkspaceFiles({ workspace, kind: 'test' })) {\n        try {\n          const content = await readFile(file.absolutePath, 'utf-8')\n          const result = parseTestFile(content, file.workspaceRelativePath)\n          for (const t of result.tests) {\n            if (t['test-id']) expectedTests.add(t['test-id'])\n            expectedTests.add(t.name)\n          }\n        } catch { /* skip unparseable files */ }\n      }\n\n      const expectedSuites = new Set<string>()\n      for (const file of await discoverWorkspaceFiles({ workspace, kind: 'suite' })) {\n        try {\n          const suite = await parseSuiteFile(file.absolutePath)\n          if (suite['suite-id']) expectedSuites.add(suite['suite-id'])\n          expectedSuites.add(suite.name)\n        } catch { /* skip unparseable files */ }\n      }\n\n      const memoryRoot = resolveMemoryRoot(config, workspace.configDir)\n      if (!existsSync(memoryRoot)) {\n        console.log(pc.dim('No memory directory found.'))\n        return\n      }\n\n      const TIERS = [\n        { dir: 'products', expected: expectedProducts },\n        { dir: 'suites', expected: expectedSuites },\n        { dir: 'tests', expected: expectedTests },\n      ]\n\n      const orphans: OrphanInfo[] = []\n      for (const tier of TIERS) {\n        const tierPath = join(memoryRoot, tier.dir)\n        let entries: string[]\n        try {\n          entries = await readdir(tierPath)\n        } catch { continue }\n\n        for (const entry of entries) {\n          try {\n            const s = await stat(join(tierPath, entry))\n            if (!s.isDirectory()) continue\n          } catch { continue }\n\n          if (!tier.expected.has(entry)) {\n            orphans.push(await getOrphanInfo(memoryRoot, tier.dir, entry))\n          }\n        }\n      }\n\n      if (orphans.length === 0) {\n        console.log(pc.dim('No orphaned memory directories found.'))\n        return\n      }\n\n      const maxPathLen = Math.max('Path'.length, ...orphans.map(o => o.path.length))\n      console.log('')\n      console.log(pc.bold('Orphaned memory directories:'))\n      console.log('')\n      console.log('  ' + pc.dim('Path'.padEnd(maxPathLen + 2) + 'Files'.padStart(7) + '  ' + 'Last Confirmed'.padEnd(20) + 'Size'.padStart(10)))\n      console.log('  ' + pc.dim('-'.repeat(maxPathLen + 2 + 7 + 2 + 20 + 10)))\n      for (const o of orphans) {\n        const confirmed = o.lastConfirmed ?? pc.dim('never')\n        console.log('  ' + o.path.padEnd(maxPathLen + 2) + String(o.fileCount).padStart(7) + '  ' + String(confirmed).padEnd(20) + formatSize(o.size).padStart(10))\n      }\n      console.log('')\n\n      if (!opts.yes) {\n        const rl = createInterface({ input: process.stdin, output: process.stdout })\n        const answer = await new Promise<string>((res) => {\n          rl.question(`Delete ${orphans.length} orphaned director${orphans.length === 1 ? 'y' : 'ies'}? (y/N) `, res)\n        })\n        rl.close()\n        if (answer.toLowerCase() !== 'y') {\n          console.log('Aborted.')\n          return\n        }\n      }\n\n      for (const orphan of orphans) {\n        await rm(join(memoryRoot, orphan.tier, orphan.scope), { recursive: true, force: true })\n      }\n      console.log(pc.green(`Deleted ${orphans.length} orphaned director${orphans.length === 1 ? 'y' : 'ies'}.`))\n    })\n\n  return cmd\n}\n","import { Command } from 'commander'\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nexport interface AgentQaSkillInfo {\n  name: string\n  path: string\n  description?: string\n}\n\nexport interface ResolvedSkillsDirectory {\n  path: string\n  source: 'package' | 'source' | 'missing'\n}\n\ninterface SkillsCommandOptions {\n  startDir?: string\n  stdout?: Pick<NodeJS.WriteStream, 'write'>\n  stderr?: Pick<NodeJS.WriteStream, 'write'>\n}\n\nfunction findPackageRoot(startDir: string): string {\n  let current = resolve(startDir)\n\n  while (true) {\n    const packagePath = join(current, 'package.json')\n    if (existsSync(packagePath)) {\n      try {\n        const pkg = JSON.parse(readFileSync(packagePath, 'utf-8')) as { name?: string }\n        if (pkg.name === 'agent-qa') {\n          return current\n        }\n      } catch {\n        // Keep walking; malformed package files are reported by publish validation.\n      }\n    }\n\n    const parent = dirname(current)\n    if (parent === current) {\n      return resolve(startDir)\n    }\n    current = parent\n  }\n}\n\nfunction hasSkillDirectories(dir: string): boolean {\n  if (!existsSync(dir)) return false\n\n  try {\n    return readdirSync(dir).some((entry) => {\n      const skillDir = join(dir, entry)\n      return statSync(skillDir).isDirectory() && existsSync(join(skillDir, 'SKILL.md'))\n    })\n  } catch {\n    return false\n  }\n}\n\nexport function resolveAgentQaSkillsDirectory(startDir = dirname(fileURLToPath(import.meta.url))): ResolvedSkillsDirectory {\n  const packageRoot = findPackageRoot(startDir)\n  const packagedSkills = join(packageRoot, 'skills')\n  if (hasSkillDirectories(packagedSkills)) {\n    return { path: packagedSkills, source: 'package' }\n  }\n\n  const sourceSkills = resolve(packageRoot, '../..', 'skills')\n  if (hasSkillDirectories(sourceSkills)) {\n    return { path: sourceSkills, source: 'source' }\n  }\n\n  return { path: packagedSkills, source: 'missing' }\n}\n\n\nfunction parseSkillDescription(skillPath: string): string | undefined {\n  const body = readFileSync(skillPath, 'utf-8')\n  const description = body.match(/^description:\\s*(.+)$/m)?.[1]?.trim()\n  return description?.replace(/^[\"']|[\"']$/g, '')\n}\n\nexport function listAgentQaSkills(skillsDir: string): AgentQaSkillInfo[] {\n  if (!hasSkillDirectories(skillsDir)) return []\n\n  return readdirSync(skillsDir)\n    .filter((entry) => {\n      const skillDir = join(skillsDir, entry)\n      return statSync(skillDir).isDirectory() && existsSync(join(skillDir, 'SKILL.md'))\n    })\n    .sort()\n    .map((entry) => {\n      const skillDir = join(skillsDir, entry)\n      return {\n        name: entry,\n        path: skillDir,\n        description: parseSkillDescription(join(skillDir, 'SKILL.md')),\n      }\n    })\n}\n\n\nexport function createSkillsCommand(options: SkillsCommandOptions = {}): Command {\n  const stdout = options.stdout ?? process.stdout\n  const stderr = options.stderr ?? process.stderr\n\n  return new Command('skills')\n    .description('List packaged agent-qa skills')\n    .option('--json', 'print machine-readable output')\n    .action((opts: { json?: boolean }) => {\n      const resolved = resolveAgentQaSkillsDirectory(options.startDir)\n      const skills = listAgentQaSkills(resolved.path)\n\n      if (resolved.source === 'missing' || skills.length === 0) {\n        const payload = { path: resolved.path, source: resolved.source, skills: [] }\n        if (opts.json) {\n          stdout.write(`${JSON.stringify(payload, null, 2)}\\n`)\n        } else {\n          stderr.write(`agent-qa skills not found at ${resolved.path}\\n`)\n        }\n        process.exitCode = 1\n        return\n      }\n\n      if (opts.json) {\n        stdout.write(`${JSON.stringify({ path: resolved.path, source: resolved.source, skills }, null, 2)}\\n`)\n        return\n      }\n\n      stdout.write(`agent-qa skills\\n`)\n      stdout.write(`Path: ${resolved.path}\\n`)\n      stdout.write(`Source: ${resolved.source}\\n`)\n      for (const skill of skills) {\n        stdout.write(`- ${skill.name}${skill.description ? `: ${skill.description}` : ''}\\n`)\n      }\n    })\n}\n","const REMOVED_NODE_ENV_FILE_FLAG = '--env-file'\nconst REMOVED_TOP_LEVEL_COMMANDS = new Set(['connect'])\nconst GLOBAL_OPTIONS_WITH_VALUE = new Set(['--config', '--log-level'])\nconst GLOBAL_BOOLEAN_OPTIONS = new Set(['--verbose', '--quiet', '--help', '-h', '--version', '-V'])\n\nexport function findRemovedNodeEnvFileArg(execArgv: readonly string[]): string | null {\n  for (const arg of execArgv) {\n    if (arg === REMOVED_NODE_ENV_FILE_FLAG || arg.startsWith(`${REMOVED_NODE_ENV_FILE_FLAG}=`)) {\n      return REMOVED_NODE_ENV_FILE_FLAG\n    }\n  }\n  return null\n}\n\nexport function findTopLevelCommandArg(argv: readonly string[]): string | null {\n  for (let index = 0; index < argv.length; index++) {\n    const arg = argv[index]\n    if (!arg) continue\n    if (arg === '--') return argv[index + 1] ?? null\n    if (GLOBAL_OPTIONS_WITH_VALUE.has(arg)) {\n      index++\n      continue\n    }\n    if ([...GLOBAL_OPTIONS_WITH_VALUE].some(option => arg.startsWith(`${option}=`))) continue\n    if (GLOBAL_BOOLEAN_OPTIONS.has(arg)) continue\n    if (arg.startsWith('-')) return null\n    return arg\n  }\n  return null\n}\n\nexport function findRemovedTopLevelCommandArg(argv: readonly string[]): string | null {\n  const command = findTopLevelCommandArg(argv)\n  return command && REMOVED_TOP_LEVEL_COMMANDS.has(command) ? command : null\n}\n\nexport function rejectRemovedCliSurface(input: {\n  execArgv?: readonly string[]\n  argv?: readonly string[]\n} = {}): void {\n  // Node 24 can consume shebang-launched `agent-qa run --env-file ...` into\n  // execArgv before Commander sees it, so reject it here as a removed agent-qa\n  // flag instead of letting Node treat it as its own env loader.\n  const removedNodeArg = findRemovedNodeEnvFileArg(input.execArgv ?? process.execArgv)\n  if (removedNodeArg) {\n    console.error(`error: unknown option '${removedNodeArg}'`)\n    process.exit(1)\n  }\n\n  const removedCommand = findRemovedTopLevelCommandArg(input.argv ?? process.argv.slice(2))\n  if (removedCommand) {\n    console.error(`error: unknown command '${removedCommand}'`)\n    process.exit(1)\n  }\n}\n"],"mappings":"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","names":["parseYaml","pc","resolvePath","loadLLMAuthPlugins","resolvePath","loadConfigFile","import_node_path","import_commander","import_agent_qa_core","import_picocolors","import_promises","import_yaml","import_node_path","import_agent_qa_core","pc","import_commander","import_node_path","import_yaml","import_picocolors","import_agent_qa_core","config","checkbox","pc","select","input","import_node_path","import_commander","import_picocolors","import_meta","require","pc","import_node_child_process","import_node_path","import_commander","import_picocolors","import_agent_qa_core","pc","import_commander","import_node_child_process","import_node_fs","import_node_path","import_picocolors","import_agent_qa_core","pc","AgentQaConfigSchema","validateProject","import_node_path","import_commander","import_picocolors","import_agent_qa_core","import_node_fs","import_node_path","import_yaml","parseYaml","import_agent_qa_core","import_node_fs","import_node_path","import_picocolors","import_agent_qa_core","pc","resolvePath","pc","record","input","writeAuthStateFiles","parseSuiteFile","parseTestFile","readFile","resolve","program","readFileSync","existsSync","hasFailed","exitCode","basename","hashStepInstruction","rm","join","import_commander","import_node_path","import_node_module","import_picocolors","import_agent_qa_core","import_meta","program","fetch","require","pc","exec","import_commander","import_picocolors","import_agent_qa_core","program","pc","import_commander","import_picocolors","import_yaml","import_promises","import_node_readline","resolve","pc","mergeConfigs","import_commander","import_picocolors","program","pc","import_commander","import_agent_qa_core","import_commander","import_node_child_process","import_picocolors","import_input","SUBSCRIPTION_PROVIDERS","isSubscriptionProvider","getGlobalConfigPath","pc","input","resolveNamedConfig","password","loadAuthPluginsForRawConfig","resolveModelAuth","loadConfigFile","import_promises","import_node_path","import_commander","import_picocolors","import_agent_qa_core","getGlobalConfigPath","input","resolve","resolvePath","pc","import_commander","import_node_child_process","import_node_fs","import_node_path","import_yaml","import_picocolors","formatStatus","pc","import_commander","import_picocolors","pc","import_commander","import_agent_qa_ids","import_yaml","import_promises","import_node_fs","import_node_path","import_picocolors","pc","import_commander","import_agent_qa_ids","import_yaml","import_promises","import_node_fs","import_node_path","import_picocolors","pc","import_commander","import_picocolors","import_node_readline","import_promises","import_node_fs","import_node_path","import_agent_qa_core","pc","import_commander","import_node_fs","import_node_path","import_meta","input"]}