{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/targets.ts","../src/commands/cache.ts"],"sourcesContent":["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 { 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","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"],"mappings":"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","names":["import_agent_qa_core","parseYaml","pc","resolvePath","import_picocolors","import_promises","import_yaml","import_node_path","import_agent_qa_core"]}