agent-qa 0.1.18 → 0.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"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/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\n return `test-id: ${testId}\nname: ${name}\ntarget: ${defaultExampleTargetName(platform)}\nsteps:\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'\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 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 process.exit(hasFailed ? 1 : 0)\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 process.exit(hasFailed ? 1 : 0)\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 { 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":["dirname","resolvePath","loadLLMAuthPlugins","loadConfigFile","Command","pc","readFile","Command","join","resolve","pc","DEFAULT_AGENT_QA_CACHE_DIR","config","dirname","join","Command","pc","require","dirname","resolve","Command","pc","Command","execFileSync","existsSync","dirname","resolve","pc","formatAppiumInstallGuidance","resolveAppiumExecutable","AgentQaConfigSchema","validateProject","resolvePath","Command","pc","DEFAULT_AGENT_QA_CACHE_DIR","discoverWorkspaceFiles","resolveWorkspacePaths","readFileSync","join","parseYaml","join","readFileSync","parseYaml","DEFAULT_AGENT_QA_CACHE_DIR","resolvePath","pc","discoverWorkspaceFiles","record","input","writeAuthStateFiles","parseSuiteFile","parseTestFile","readFile","resolve","Command","program","resolveWorkspacePaths","readFileSync","existsSync","hasFailed","basename","hashStepInstruction","rm","join","Command","resolve","dirname","createRequire","pc","resolveWorkspacePaths","program","fetch","require","exec","Command","pc","flushAnalytics","program","Command","pc","readFile","createInterface","resolve","mergeConfigs","Command","pc","program","Command","resolveWorkspacePaths","Command","pc","input","SUBSCRIPTION_PROVIDERS","isSubscriptionProvider","getGlobalConfigPath","resolveNamedConfig","loadAuthPluginsForRawConfig","resolveModelAuth","loadConfigFile","createInterface","dirname","resolvePath","Command","pc","AUTH_STATE_SCHEMA_VERSION","resolveAuthStatePaths","getGlobalConfigPath","input","createInterface","resolve","dirname","resolvePath","pc","resolveAuthStatePaths","Command","AUTH_STATE_SCHEMA_VERSION","Command","execSync","existsSync","readFileSync","writeFileSync","join","stringify","pc","formatStatus","pc","execSync","join","existsSync","readFileSync","writeFileSync","stringify","Command","Command","pc","Command","stringify","writeFile","existsSync","resolve","dirname","pc","Command","stringify","writeFile","mkdir","existsSync","resolve","dirname","pc","Command","pc","createInterface","readFile","readdir","rm","stat","existsSync","join","discoverWorkspaceFiles","resolveMemoryRoot","resolveWorkspacePaths","Command","existsSync","readFileSync","dirname","join","resolve","input","Command"]}
1
+ {"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":["dirname","resolvePath","loadLLMAuthPlugins","loadConfigFile","Command","pc","readFile","Command","join","resolve","pc","DEFAULT_AGENT_QA_CACHE_DIR","config","dirname","join","Command","pc","require","dirname","resolve","Command","pc","Command","execFileSync","existsSync","dirname","resolve","pc","formatAppiumInstallGuidance","resolveAppiumExecutable","AgentQaConfigSchema","validateProject","resolvePath","Command","pc","DEFAULT_AGENT_QA_CACHE_DIR","discoverWorkspaceFiles","resolveWorkspacePaths","readFileSync","join","parseYaml","join","readFileSync","parseYaml","existsSync","readFileSync","join","pc","DEFAULT_AGENT_QA_CACHE_DIR","resolvePath","pc","discoverWorkspaceFiles","record","input","writeAuthStateFiles","parseSuiteFile","parseTestFile","readFile","resolve","Command","program","resolveWorkspacePaths","readFileSync","existsSync","hasFailed","exitCode","basename","hashStepInstruction","rm","join","Command","resolve","dirname","createRequire","pc","resolveWorkspacePaths","program","fetch","require","exec","Command","pc","flushAnalytics","program","Command","pc","readFile","createInterface","resolve","mergeConfigs","Command","pc","program","Command","resolveWorkspacePaths","Command","pc","input","SUBSCRIPTION_PROVIDERS","isSubscriptionProvider","getGlobalConfigPath","resolveNamedConfig","loadAuthPluginsForRawConfig","resolveModelAuth","loadConfigFile","createInterface","dirname","resolvePath","Command","pc","AUTH_STATE_SCHEMA_VERSION","resolveAuthStatePaths","getGlobalConfigPath","input","createInterface","resolve","dirname","resolvePath","pc","resolveAuthStatePaths","Command","AUTH_STATE_SCHEMA_VERSION","Command","execSync","existsSync","readFileSync","writeFileSync","join","stringify","pc","formatStatus","pc","execSync","join","existsSync","readFileSync","writeFileSync","stringify","Command","Command","pc","Command","stringify","writeFile","existsSync","resolve","dirname","pc","Command","stringify","writeFile","mkdir","existsSync","resolve","dirname","pc","Command","pc","createInterface","readFile","readdir","rm","stat","existsSync","join","discoverWorkspaceFiles","resolveMemoryRoot","resolveWorkspacePaths","Command","existsSync","readFileSync","dirname","join","resolve","input","Command"]}