agentv 2.18.4 → 2.19.0
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/{chunk-KSUL3F3R.js → chunk-4MSAOMCC.js} +4 -4
- package/dist/{chunk-KSUL3F3R.js.map → chunk-4MSAOMCC.js.map} +1 -1
- package/dist/{chunk-RMUVJ44Z.js → chunk-GC6T3RD4.js} +4 -4
- package/dist/{chunk-YTHTGLMT.js → chunk-XTYMR4I5.js} +35 -10
- package/dist/chunk-XTYMR4I5.js.map +1 -0
- package/dist/cli.js +3 -3
- package/dist/{dist-EDQZMZH2.js → dist-MQBGD6LP.js} +2 -2
- package/dist/index.js +3 -3
- package/dist/{interactive-J4IBXJF7.js → interactive-3TDBCSDW.js} +3 -3
- package/dist/templates/.agentv/config.yaml +0 -5
- package/dist/templates/.agentv/targets.yaml +7 -7
- package/package.json +1 -1
- package/dist/chunk-YTHTGLMT.js.map +0 -1
- /package/dist/{chunk-RMUVJ44Z.js.map → chunk-GC6T3RD4.js.map} +0 -0
- /package/dist/{dist-EDQZMZH2.js.map → dist-MQBGD6LP.js.map} +0 -0
- /package/dist/{interactive-J4IBXJF7.js.map → interactive-3TDBCSDW.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/commands/eval/shared.ts","../src/utils/targets.ts","../src/commands/eval/run-eval.ts","../src/version-check.ts","../src/commands/eval/env.ts","../src/commands/eval/output-writer.ts","../src/commands/eval/json-writer.ts","../src/utils/case-conversion.ts","../src/commands/eval/jsonl-writer.ts","../../../node_modules/.bun/async-mutex@0.5.0/node_modules/async-mutex/index.mjs","../src/commands/eval/junit-writer.ts","../src/commands/eval/yaml-writer.ts","../src/commands/eval/progress-display.ts","../src/commands/eval/retry-errors.ts","../src/commands/eval/statistics.ts","../../../packages/core/src/evaluation/validation/file-type.ts","../../../packages/core/src/evaluation/validation/eval-validator.ts","../../../packages/core/src/evaluation/validation/targets-validator.ts","../../../packages/core/src/evaluation/validation/config-validator.ts","../../../packages/core/src/evaluation/validation/file-reference-validator.ts","../src/commands/eval/targets.ts"],"sourcesContent":["{\n \"name\": \"agentv\",\n \"version\": \"2.18.4\",\n \"description\": \"CLI entry point for AgentV\",\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/EntityProcess/agentv.git\"\n },\n \"homepage\": \"https://github.com/EntityProcess/agentv#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/EntityProcess/agentv/issues\"\n },\n \"bin\": {\n \"agentv\": \"./dist/cli.js\"\n },\n \"files\": [\"dist\", \"README.md\"],\n \"scripts\": {\n \"dev\": \"bun src/cli.ts\",\n \"build\": \"tsup && bun run copy-readme\",\n \"copy-readme\": \"bun -e \\\"import { cpSync } from 'fs'; cpSync('../../README.md', 'README.md')\\\"\",\n \"prepublishOnly\": \"bun run copy-readme\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"biome check .\",\n \"format\": \"biome format --write .\",\n \"fix\": \"biome check --write .\",\n \"test\": \"bun test\",\n \"test:watch\": \"bun test --watch\"\n },\n \"dependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"^0.2.49\",\n \"@github/copilot-sdk\": \"^0.1.25\",\n \"@inquirer/prompts\": \"^8.2.1\",\n \"@mariozechner/pi-agent-core\": \"^0.54.2\",\n \"@mariozechner/pi-ai\": \"^0.54.2\",\n \"@openai/codex-sdk\": \"^0.104.0\",\n \"cmd-ts\": \"^0.14.3\",\n \"dotenv\": \"^16.4.5\",\n \"fast-glob\": \"^3.3.3\",\n \"json5\": \"^2.2.3\",\n \"micromatch\": \"^4.0.8\",\n \"semver\": \"^7.7.4\",\n \"yaml\": \"^2.6.1\"\n },\n \"devDependencies\": {\n \"@agentv/core\": \"workspace:*\",\n \"@types/semver\": \"^7.7.1\",\n \"execa\": \"^9.3.0\"\n }\n}\n","import { constants } from 'node:fs';\nimport { access, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport fg from 'fast-glob';\n\nexport async function resolveEvalPaths(evalPaths: string[], cwd: string): Promise<string[]> {\n const normalizedInputs = evalPaths.map((value) => value?.trim()).filter((value) => value);\n if (normalizedInputs.length === 0) {\n throw new Error('No eval paths provided.');\n }\n\n const unmatched: string[] = [];\n const results = new Set<string>();\n\n for (const pattern of normalizedInputs) {\n // If the pattern points to an existing file, short-circuit globbing\n const candidatePath = path.isAbsolute(pattern)\n ? path.normalize(pattern)\n : path.resolve(cwd, pattern);\n try {\n const stats = await stat(candidatePath);\n if (stats.isFile() && /\\.(ya?ml|jsonl)$/i.test(candidatePath)) {\n results.add(candidatePath);\n continue;\n }\n } catch {\n // fall through to glob matching\n }\n\n const globPattern = pattern.includes('\\\\') ? pattern.replace(/\\\\/g, '/') : pattern;\n const matches = await fg(globPattern, {\n cwd,\n absolute: true,\n onlyFiles: true,\n unique: true,\n dot: true,\n followSymbolicLinks: true,\n });\n\n const yamlMatches = matches.filter((filePath) => /\\.(ya?ml|jsonl)$/i.test(filePath));\n if (yamlMatches.length === 0) {\n unmatched.push(pattern);\n continue;\n }\n\n for (const filePath of yamlMatches) {\n results.add(path.normalize(filePath));\n }\n }\n\n if (unmatched.length > 0) {\n throw new Error(\n `No eval files matched: ${unmatched.join(\n ', ',\n )}. Provide YAML or JSONL paths or globs (e.g., \"evals/**/*.yaml\", \"evals/**/*.jsonl\").`,\n );\n }\n\n const sorted = Array.from(results);\n sorted.sort();\n return sorted;\n}\n\nexport async function findRepoRoot(start: string): Promise<string> {\n const fallback = path.resolve(start);\n let current: string | undefined = fallback;\n\n while (current !== undefined) {\n const candidate = path.join(current, '.git');\n try {\n await access(candidate, constants.F_OK);\n return current;\n } catch {\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n }\n\n return fallback;\n}\n","import { constants } from 'node:fs';\nimport { access } from 'node:fs/promises';\nimport path from 'node:path';\nimport { buildDirectoryChain } from '@agentv/core';\n\nexport const TARGET_FILE_CANDIDATES = [\n 'targets.yaml',\n 'targets.yml',\n path.join('.agentv', 'targets.yaml'),\n path.join('.agentv', 'targets.yml'),\n] as const;\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function discoverTargetsFile(options: {\n readonly explicitPath?: string;\n readonly testFilePath: string;\n readonly repoRoot: string;\n readonly cwd: string;\n}): Promise<string> {\n const { explicitPath, testFilePath, repoRoot, cwd } = options;\n\n if (explicitPath) {\n const resolvedExplicit = path.resolve(explicitPath);\n if (await fileExists(resolvedExplicit)) {\n return resolvedExplicit;\n }\n\n for (const candidate of TARGET_FILE_CANDIDATES) {\n const nested = path.join(resolvedExplicit, candidate);\n if (await fileExists(nested)) {\n return nested;\n }\n }\n\n throw new Error(`targets.yaml not found at provided path: ${resolvedExplicit}`);\n }\n\n const directories = [...buildDirectoryChain(testFilePath, repoRoot)];\n\n // Also check cwd if not already in chain\n const resolvedCwd = path.resolve(cwd);\n if (!directories.includes(resolvedCwd)) {\n directories.push(resolvedCwd);\n }\n\n for (const directory of directories) {\n for (const candidate of TARGET_FILE_CANDIDATES) {\n const fullPath = path.join(directory, candidate);\n if (await fileExists(fullPath)) {\n return fullPath;\n }\n }\n }\n\n throw new Error('Unable to locate targets.yaml. Use --targets to specify the file explicitly.');\n}\n","import { constants } from 'node:fs';\nimport { access } from 'node:fs/promises';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport {\n type EvalTest,\n type EvaluationCache,\n type EvaluationResult,\n type ExecutionDefaults,\n type FailOnError,\n type OtelTraceExporter as OtelTraceExporterType,\n ResponseCache,\n type TrialsConfig,\n runEvaluation as defaultRunEvaluation,\n ensureVSCodeSubagents,\n loadConfig,\n loadTestSuite,\n loadTsConfig,\n shouldEnableCache,\n shouldSkipCacheForTemperature,\n subscribeToCodexLogEntries,\n subscribeToCopilotCliLogEntries,\n subscribeToCopilotSdkLogEntries,\n subscribeToPiLogEntries,\n} from '@agentv/core';\n\nimport { enforceRequiredVersion } from '../../version-check.js';\nimport { loadEnvFromHierarchy } from './env.js';\nimport {\n type OutputFormat,\n type OutputWriter,\n createMultiWriter,\n createOutputWriter,\n getDefaultExtension,\n} from './output-writer.js';\nimport { ProgressDisplay, type WorkerProgress } from './progress-display.js';\nimport { loadErrorTestIds, loadNonErrorResults } from './retry-errors.js';\nimport { findRepoRoot } from './shared.js';\nimport {\n calculateEvaluationSummary,\n formatEvaluationSummary,\n formatMatrixSummary,\n} from './statistics.js';\nimport { type TargetSelection, selectMultipleTargets, selectTarget } from './targets.js';\n\nconst DEFAULT_WORKERS = 3;\n\ninterface RunEvalCommandInput {\n readonly testFiles: readonly string[];\n readonly rawOptions: Record<string, unknown>;\n}\n\ninterface NormalizedOptions {\n readonly target?: string;\n readonly cliTargets: readonly string[];\n readonly targetsPath?: string;\n readonly filter?: string;\n readonly workers?: number;\n readonly outPath?: string;\n readonly outputPaths: readonly string[];\n readonly format: OutputFormat;\n readonly dryRun: boolean;\n readonly dryRunDelay: number;\n readonly dryRunDelayMin: number;\n readonly dryRunDelayMax: number;\n readonly agentTimeoutSeconds?: number;\n readonly maxRetries: number;\n readonly cache: boolean;\n readonly noCache: boolean;\n readonly verbose: boolean;\n readonly otelFile?: string;\n readonly traceFile?: string;\n readonly exportOtel: boolean;\n readonly otelBackend?: string;\n readonly otelCaptureContent: boolean;\n readonly otelGroupTurns: boolean;\n readonly retryErrors?: string;\n readonly workspaceMode?: 'pooled' | 'temp' | 'static';\n readonly workspacePath?: string;\n}\n\nfunction normalizeBoolean(value: unknown): boolean {\n return value === true;\n}\n\nfunction normalizeString(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function resolveTimestampPlaceholder(value: string): string {\n if (!value.includes('{timestamp}')) {\n return value;\n }\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n return value.replaceAll('{timestamp}', timestamp);\n}\n\nfunction normalizeNumber(value: unknown, fallback: number): number {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isNaN(parsed)) {\n return parsed;\n }\n }\n return fallback;\n}\n\nfunction normalizeOptionalNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isNaN(parsed)) {\n return parsed;\n }\n }\n return undefined;\n}\n\nfunction normalizeWorkspaceMode(value: unknown): 'pooled' | 'temp' | 'static' | undefined {\n return value === 'pooled' || value === 'temp' || value === 'static' ? value : undefined;\n}\n\nfunction normalizeOptions(\n rawOptions: Record<string, unknown>,\n config?: Awaited<ReturnType<typeof loadTsConfig>>,\n yamlExecution?: ExecutionDefaults,\n): NormalizedOptions {\n const cliFormat = normalizeString(rawOptions.outputFormat);\n const configFormat = config?.output?.format;\n const formatStr = cliFormat ?? configFormat ?? 'jsonl';\n const format: OutputFormat = formatStr === 'yaml' ? 'yaml' : 'jsonl';\n\n const cliWorkers = normalizeOptionalNumber(rawOptions.workers);\n const configWorkers = config?.execution?.workers;\n const workers = cliWorkers ?? configWorkers ?? 0;\n\n const rawOutputPaths = rawOptions.output;\n const outputPaths: string[] = Array.isArray(rawOutputPaths)\n ? rawOutputPaths.filter((v): v is string => typeof v === 'string' && v.trim().length > 0)\n : [];\n\n // Normalize --target: can be a string (legacy) or string[] (multioption)\n const rawTarget = rawOptions.target;\n let cliTargets: string[] = [];\n let singleTarget: string | undefined;\n if (Array.isArray(rawTarget)) {\n cliTargets = rawTarget.filter((v): v is string => typeof v === 'string' && v.trim().length > 0);\n singleTarget = cliTargets.length === 1 ? cliTargets[0] : undefined;\n } else if (typeof rawTarget === 'string') {\n const trimmed = rawTarget.trim();\n if (trimmed.length > 0 && trimmed !== 'default') {\n cliTargets = [trimmed];\n singleTarget = trimmed;\n }\n }\n\n const cliAgentTimeout = normalizeOptionalNumber(rawOptions.agentTimeout);\n const configAgentTimeoutSeconds =\n config?.execution?.agentTimeoutMs != null ? config.execution.agentTimeoutMs / 1000 : undefined;\n\n const cliMaxRetries = normalizeOptionalNumber(rawOptions.maxRetries);\n const configMaxRetries = config?.execution?.maxRetries;\n\n // Cache: CLI flags take priority, then config file, then default (true via shouldEnableCache)\n const cliCache = normalizeBoolean(rawOptions.cache);\n const cliNoCache = normalizeBoolean(rawOptions.noCache);\n const configCacheEnabled = config?.cache?.enabled;\n // If neither --cache nor --no-cache was passed, use config value\n const resolvedCache = cliCache || (!cliNoCache && configCacheEnabled === true);\n const resolvedNoCache = cliNoCache;\n\n // Output dir: CLI --out > config output.dir > auto-generated\n const cliOut = normalizeString(rawOptions.out);\n const configOut = config?.output?.dir;\n const cliWorkspacePath = normalizeString(rawOptions.workspacePath);\n const cliWorkspaceModeRaw = normalizeString(rawOptions.workspaceMode);\n const cliWorkspaceMode = normalizeWorkspaceMode(rawOptions.workspaceMode);\n if (cliWorkspacePath && cliWorkspaceModeRaw && cliWorkspaceMode !== 'static') {\n throw new Error('--workspace-path requires --workspace-mode=static (or omit --workspace-mode)');\n }\n\n const yamlExecutionRecord = yamlExecution as Record<string, unknown> | undefined;\n const yamlWorkspaceMode = normalizeWorkspaceMode(yamlExecutionRecord?.workspace_mode);\n const yamlWorkspacePath = normalizeString(yamlExecutionRecord?.workspace_path);\n const workspacePath = cliWorkspacePath ?? yamlWorkspacePath;\n const workspaceMode = cliWorkspacePath ? 'static' : (cliWorkspaceMode ?? yamlWorkspaceMode);\n\n return {\n target: singleTarget,\n cliTargets,\n targetsPath: normalizeString(rawOptions.targets),\n filter: normalizeString(rawOptions.filter),\n workers: workers > 0 ? workers : undefined,\n outPath: cliOut ?? configOut,\n outputPaths,\n format,\n dryRun: normalizeBoolean(rawOptions.dryRun),\n dryRunDelay: normalizeNumber(rawOptions.dryRunDelay, 0),\n dryRunDelayMin: normalizeNumber(rawOptions.dryRunDelayMin, 0),\n dryRunDelayMax: normalizeNumber(rawOptions.dryRunDelayMax, 0),\n agentTimeoutSeconds: cliAgentTimeout ?? configAgentTimeoutSeconds,\n maxRetries: cliMaxRetries ?? configMaxRetries ?? 2,\n cache: resolvedCache,\n noCache: resolvedNoCache,\n // Boolean OR: config `true` cannot be overridden to `false` from CLI.\n // Intentional — there are no --no-verbose / --no-keep-workspaces flags.\n // Precedence: CLI > YAML config > TS config\n verbose:\n normalizeBoolean(rawOptions.verbose) ||\n yamlExecution?.verbose === true ||\n config?.execution?.verbose === true,\n // Precedence: CLI > YAML config > TS config\n otelFile:\n normalizeString(rawOptions.otelFile) ??\n (yamlExecution?.otel_file\n ? resolveTimestampPlaceholder(yamlExecution.otel_file)\n : undefined) ??\n (config?.execution?.otelFile\n ? resolveTimestampPlaceholder(config.execution.otelFile)\n : undefined),\n traceFile:\n normalizeString(rawOptions.traceFile) ??\n (yamlExecution?.trace_file\n ? resolveTimestampPlaceholder(yamlExecution.trace_file)\n : undefined) ??\n (config?.execution?.traceFile\n ? resolveTimestampPlaceholder(config.execution.traceFile)\n : undefined),\n exportOtel: normalizeBoolean(rawOptions.exportOtel),\n otelBackend: normalizeString(rawOptions.otelBackend),\n otelCaptureContent: normalizeBoolean(rawOptions.otelCaptureContent),\n otelGroupTurns: normalizeBoolean(rawOptions.otelGroupTurns),\n retryErrors: normalizeString(rawOptions.retryErrors),\n workspaceMode,\n workspacePath,\n } satisfies NormalizedOptions;\n}\n\nasync function ensureFileExists(filePath: string, description: string): Promise<void> {\n try {\n await access(filePath, constants.F_OK);\n } catch {\n throw new Error(`${description} not found: ${filePath}`);\n }\n}\n\nfunction buildDefaultOutputPath(cwd: string, format: OutputFormat): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const baseName = 'eval';\n const extension = getDefaultExtension(format);\n return path.join(cwd, '.agentv', 'results', `${baseName}_${timestamp}${extension}`);\n}\n\ntype ProgressReporter = {\n readonly isInteractive: boolean;\n start(): void;\n setTotal(total: number): void;\n update(workerId: number, progress: WorkerProgress): void;\n finish(): void;\n addLogPaths(paths: readonly string[], provider?: 'codex' | 'pi' | 'copilot'): void;\n};\n\nfunction createProgressReporter(\n maxWorkers: number,\n options?: { verbose?: boolean },\n): ProgressReporter {\n const display = new ProgressDisplay(maxWorkers, options);\n return {\n isInteractive: display.isInteractiveMode(),\n start: () => display.start(),\n setTotal: (total: number) => display.setTotalTests(total),\n update: (workerId: number, progress: WorkerProgress) =>\n display.updateWorker({ ...progress, workerId }),\n finish: () => display.finish(),\n addLogPaths: (paths: readonly string[], provider?: 'codex' | 'pi' | 'copilot') =>\n display.addLogPaths(paths, provider),\n };\n}\n\nfunction makeEvalKey(testFilePath: string, evalId: string): string {\n return `${path.resolve(testFilePath)}::${evalId}`;\n}\n\nfunction createDisplayIdTracker(): { getOrAssign(evalKey: string): number } {\n const map = new Map<string, number>();\n let nextId = 1;\n return {\n getOrAssign(evalKey: string): number {\n const existing = map.get(evalKey);\n if (existing !== undefined) {\n return existing;\n }\n const assigned = nextId++;\n map.set(evalKey, assigned);\n return assigned;\n },\n };\n}\n\n/**\n * Override CLI provider verbose setting based on CLI --verbose flag.\n * CLI provider logs should only appear when --verbose is passed.\n */\nfunction applyVerboseOverride(selection: TargetSelection, cliVerbose: boolean): TargetSelection {\n const { resolvedTarget } = selection;\n\n // Only CLI providers have a verbose setting in their config\n if (resolvedTarget.kind !== 'cli') {\n return selection;\n }\n\n // Set verbose to match CLI --verbose flag\n return {\n ...selection,\n resolvedTarget: {\n ...resolvedTarget,\n config: {\n ...resolvedTarget.config,\n verbose: cliVerbose,\n },\n },\n };\n}\n\nasync function prepareFileMetadata(params: {\n readonly testFilePath: string;\n readonly repoRoot: string;\n readonly cwd: string;\n readonly options: NormalizedOptions;\n}): Promise<{\n readonly evalIds: readonly string[];\n readonly evalCases: readonly EvalTest[];\n readonly selections: readonly { selection: TargetSelection; inlineTargetLabel: string }[];\n readonly trialsConfig?: TrialsConfig;\n readonly suiteTargets?: readonly string[];\n readonly yamlCache?: boolean;\n readonly yamlCachePath?: string;\n readonly totalBudgetUsd?: number;\n readonly failOnError?: FailOnError;\n}> {\n const { testFilePath, repoRoot, cwd, options } = params;\n\n await ensureFileExists(testFilePath, 'Test file');\n await loadEnvFromHierarchy({\n testFilePath,\n repoRoot,\n verbose: options.verbose,\n });\n\n const suite = await loadTestSuite(testFilePath, repoRoot, {\n verbose: options.verbose,\n filter: options.filter,\n });\n const filteredIds = suite.tests.map((value) => value.id);\n\n // Determine target names: CLI --target flags override YAML\n const cliTargets = options.cliTargets;\n const suiteTargets = suite.targets;\n\n // Resolve which target names to use (precedence: CLI > YAML targets > YAML target > default)\n let targetNames: readonly string[];\n if (cliTargets.length > 0) {\n targetNames = cliTargets;\n } else if (suiteTargets && suiteTargets.length > 0) {\n targetNames = suiteTargets;\n } else {\n targetNames = [];\n }\n\n let selections: { selection: TargetSelection; inlineTargetLabel: string }[];\n\n if (targetNames.length > 1) {\n // Matrix mode: multiple targets\n const multiSelections = await selectMultipleTargets({\n testFilePath,\n repoRoot,\n cwd,\n explicitTargetsPath: options.targetsPath,\n dryRun: options.dryRun,\n dryRunDelay: options.dryRunDelay,\n dryRunDelayMin: options.dryRunDelayMin,\n dryRunDelayMax: options.dryRunDelayMax,\n env: process.env,\n targetNames,\n });\n\n selections = multiSelections.map((sel) => {\n const providerLabel = options.dryRun\n ? `${sel.resolvedTarget.kind} (dry-run)`\n : sel.resolvedTarget.kind;\n return {\n selection: sel,\n inlineTargetLabel: `${sel.targetName} [provider=${providerLabel}]`,\n };\n });\n } else {\n // Single target mode (legacy path)\n const selection = await selectTarget({\n testFilePath,\n repoRoot,\n cwd,\n explicitTargetsPath: options.targetsPath,\n cliTargetName: targetNames.length === 1 ? targetNames[0] : options.target,\n dryRun: options.dryRun,\n dryRunDelay: options.dryRunDelay,\n dryRunDelayMin: options.dryRunDelayMin,\n dryRunDelayMax: options.dryRunDelayMax,\n env: process.env,\n });\n\n const providerLabel = options.dryRun\n ? `${selection.resolvedTarget.kind} (dry-run)`\n : selection.resolvedTarget.kind;\n selections = [\n {\n selection,\n inlineTargetLabel: `${selection.targetName} [provider=${providerLabel}]`,\n },\n ];\n }\n\n return {\n evalIds: filteredIds,\n evalCases: suite.tests,\n selections,\n trialsConfig: suite.trials,\n suiteTargets,\n yamlCache: suite.cacheConfig?.enabled,\n yamlCachePath: suite.cacheConfig?.cachePath,\n totalBudgetUsd: suite.totalBudgetUsd,\n failOnError: suite.failOnError,\n };\n}\n\nasync function runWithLimit<T>(\n items: readonly T[],\n limit: number,\n task: (item: T) => Promise<void>,\n): Promise<void> {\n const safeLimit = Math.max(1, limit);\n let index = 0;\n\n const workers = Array.from({ length: safeLimit }, async () => {\n while (index < items.length) {\n const current = items[index];\n index += 1;\n await task(current);\n }\n });\n\n await Promise.all(workers);\n}\n\nasync function runSingleEvalFile(params: {\n readonly testFilePath: string;\n readonly cwd: string;\n readonly repoRoot: string;\n readonly options: NormalizedOptions;\n readonly outputWriter: OutputWriter;\n readonly otelExporter?: OtelTraceExporterType | null;\n readonly cache?: EvaluationCache;\n readonly evaluationRunner: typeof defaultRunEvaluation;\n readonly workersOverride?: number;\n readonly progressReporter: ProgressReporter;\n readonly seenEvalCases: Set<string>;\n readonly displayIdTracker: { getOrAssign(evalKey: string): number };\n readonly selection: TargetSelection;\n readonly inlineTargetLabel: string;\n readonly evalCases: readonly EvalTest[];\n readonly trialsConfig?: TrialsConfig;\n readonly matrixMode?: boolean;\n readonly totalBudgetUsd?: number;\n readonly failOnError?: FailOnError;\n}): Promise<{ results: EvaluationResult[] }> {\n const {\n testFilePath,\n cwd,\n repoRoot,\n options,\n outputWriter,\n otelExporter,\n cache,\n evaluationRunner,\n workersOverride,\n progressReporter,\n seenEvalCases,\n displayIdTracker,\n selection,\n inlineTargetLabel,\n evalCases,\n trialsConfig,\n matrixMode,\n totalBudgetUsd,\n failOnError,\n } = params;\n\n const targetName = selection.targetName;\n\n await ensureFileExists(testFilePath, 'Test file');\n\n // CLI provider verbose logging should only be enabled when --verbose flag is passed\n const resolvedTargetSelection = applyVerboseOverride(selection, options.verbose);\n const providerLabel = options.dryRun\n ? `${resolvedTargetSelection.resolvedTarget.kind} (dry-run)`\n : resolvedTargetSelection.resolvedTarget.kind;\n const targetMessage = options.verbose\n ? `Using target (${resolvedTargetSelection.targetSource}): ${resolvedTargetSelection.targetName} [provider=${providerLabel}] via ${resolvedTargetSelection.targetsFilePath}`\n : `Using target: ${inlineTargetLabel}`;\n if (!progressReporter.isInteractive || options.verbose) {\n console.log(targetMessage);\n }\n\n const agentTimeoutMs =\n options.agentTimeoutSeconds != null\n ? Math.max(0, options.agentTimeoutSeconds) * 1000\n : undefined;\n\n // Resolve workers: CLI flag (adjusted per-file) > target setting > default (1)\n const workerPreference = workersOverride ?? options.workers;\n let resolvedWorkers =\n workerPreference ?? resolvedTargetSelection.resolvedTarget.workers ?? DEFAULT_WORKERS;\n if (resolvedWorkers < 1 || resolvedWorkers > 50) {\n throw new Error(`Workers must be between 1 and 50, got: ${resolvedWorkers}`);\n }\n\n // VSCode providers require window focus, so only 1 worker is allowed\n const isVSCodeProvider = ['vscode', 'vscode-insiders'].includes(\n resolvedTargetSelection.resolvedTarget.kind,\n );\n if (isVSCodeProvider && resolvedWorkers > 1) {\n console.warn(\n `Warning: VSCode providers require window focus. Limiting workers from ${resolvedWorkers} to 1 to prevent race conditions.`,\n );\n resolvedWorkers = 1;\n }\n\n // Auto-provision subagents for VSCode targets\n if (isVSCodeProvider && !options.dryRun) {\n const vsConfig = resolvedTargetSelection.resolvedTarget.config as { executable?: string };\n await ensureVSCodeSubagents({\n kind: resolvedTargetSelection.resolvedTarget.kind as 'vscode' | 'vscode-insiders',\n count: resolvedWorkers,\n verbose: options.verbose,\n vscodeCmd: vsConfig.executable,\n });\n }\n\n // Create streaming observer for real-time OTel span export\n const streamingObserver = otelExporter?.createStreamingObserver() ?? null;\n const results = await evaluationRunner({\n testFilePath,\n repoRoot,\n target: resolvedTargetSelection.resolvedTarget,\n targets: resolvedTargetSelection.definitions,\n env: process.env,\n maxRetries: Math.max(0, options.maxRetries),\n agentTimeoutMs,\n cache,\n useCache: (() => {\n // Skip cache if not enabled\n if (!cache) return false;\n // Skip cache when target has temperature > 0 (non-deterministic)\n const targetConfig = resolvedTargetSelection.resolvedTarget.config as Record<string, unknown>;\n if (shouldSkipCacheForTemperature(targetConfig)) {\n if (options.verbose) {\n console.log('Cache skipped: target temperature > 0');\n }\n return false;\n }\n return true;\n })(),\n evalCases,\n verbose: options.verbose,\n maxConcurrency: resolvedWorkers,\n workspaceMode: options.workspaceMode,\n workspacePath: options.workspacePath,\n trials: trialsConfig,\n totalBudgetUsd,\n failOnError,\n streamCallbacks: streamingObserver?.getStreamCallbacks(),\n onResult: async (result: EvaluationResult) => {\n // Finalize streaming observer span with score\n streamingObserver?.finalizeEvalCase(result.score, result.error);\n\n // Strip output from result before writing to avoid bloating results JSONL\n const { output: _, ...resultWithoutTrace } = result;\n await outputWriter.append(resultWithoutTrace as EvaluationResult);\n\n // Export to OTel if exporter is configured (skip batch export when streaming is active)\n if (otelExporter && !streamingObserver) {\n try {\n await otelExporter.exportResult(result);\n } catch (err) {\n // Export failures don't fail the evaluation\n if (options.verbose) {\n console.warn(\n `OTel export warning: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n },\n onProgress: async (event) => {\n const evalKeyId = matrixMode ? `${event.testId}@${targetName}` : event.testId;\n const evalKey = makeEvalKey(testFilePath, evalKeyId);\n if (event.status === 'pending' && !seenEvalCases.has(evalKey)) {\n seenEvalCases.add(evalKey);\n progressReporter.setTotal(seenEvalCases.size);\n }\n const displayId = displayIdTracker.getOrAssign(evalKey);\n\n // Start streaming observer when eval case begins execution\n if (event.status === 'running' && streamingObserver) {\n streamingObserver.startEvalCase(event.testId, targetName, testFilePath);\n }\n\n progressReporter.update(displayId, {\n workerId: displayId,\n testId: matrixMode ? `${event.testId}@${targetName}` : event.testId,\n status: event.status,\n startedAt: event.startedAt,\n completedAt: event.completedAt,\n error: event.error,\n targetLabel: inlineTargetLabel,\n });\n },\n });\n\n return { results: [...results] };\n}\n\nexport async function runEvalCommand(input: RunEvalCommandInput): Promise<void> {\n const cwd = process.cwd();\n\n // Load agentv.config.ts (if present) for default values\n let config: Awaited<ReturnType<typeof loadTsConfig>> = null;\n try {\n config = await loadTsConfig(cwd);\n } catch (err) {\n console.warn(\n `Warning: Failed to load agentv config: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const repoRoot = await findRepoRoot(cwd);\n\n // Load .agentv/config.yaml for execution defaults.\n // loadConfig expects an eval file path and walks up from its directory.\n // Pass a dummy file in cwd so the search starts from the working directory.\n const yamlConfig = await loadConfig(path.join(cwd, '_'), repoRoot);\n\n // Check required_version before proceeding with eval\n if (yamlConfig?.required_version) {\n await enforceRequiredVersion(yamlConfig.required_version, {\n strict: normalizeBoolean(input.rawOptions.strict),\n });\n }\n\n let options = normalizeOptions(input.rawOptions, config, yamlConfig?.execution);\n\n // --retry-errors: override filter to only re-run execution_error test cases.\n // IMPORTANT: JSONL must be fully loaded here, before the output writer is created below,\n // since the retry source and output destination may refer to the same file.\n let retryNonErrorResults: readonly EvaluationResult[] | undefined;\n if (options.retryErrors) {\n const retryPath = path.resolve(options.retryErrors);\n await ensureFileExists(retryPath, 'Retry-errors JSONL file');\n const errorIds = await loadErrorTestIds(retryPath);\n if (errorIds.length === 0) {\n console.log('No execution errors found in the previous output. Nothing to retry.');\n return;\n }\n console.log(`Retrying ${errorIds.length} execution-error test(s): ${errorIds.join(', ')}`);\n // Override the filter to match only error test IDs using micromatch brace expansion\n const filterPattern = errorIds.length === 1 ? errorIds[0] : `{${errorIds.join(',')}}`;\n options = { ...options, filter: filterPattern };\n retryNonErrorResults = await loadNonErrorResults(retryPath);\n }\n\n // Validate static workspace path exists and is a directory\n if (options.workspacePath) {\n const resolvedWorkspace = path.resolve(options.workspacePath);\n try {\n const { stat } = await import('node:fs/promises');\n const stats = await stat(resolvedWorkspace);\n if (!stats.isDirectory()) {\n throw new Error(`--workspace-path is not a directory: ${resolvedWorkspace}`);\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(`--workspace-path does not exist: ${resolvedWorkspace}`);\n }\n throw err;\n }\n options = { ...options, workspacePath: resolvedWorkspace };\n }\n\n if (options.verbose) {\n console.log(`Repository root: ${repoRoot}`);\n }\n\n // Initialize OTel exporter if --export-otel flag is set or file export flags are used\n let otelExporter: OtelTraceExporterType | null = null;\n const useFileExport = !!(options.otelFile || options.traceFile);\n\n if (options.exportOtel || useFileExport) {\n try {\n const { OtelTraceExporter, OTEL_BACKEND_PRESETS } = await import('@agentv/core');\n\n // Resolve endpoint and headers\n let endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT;\n let headers: Record<string, string> = {};\n\n if (options.otelBackend) {\n const preset = OTEL_BACKEND_PRESETS[options.otelBackend];\n if (preset) {\n endpoint = preset.endpoint;\n headers = preset.headers(process.env);\n } else {\n console.warn(`Unknown OTel backend preset: ${options.otelBackend}`);\n }\n }\n\n // Parse OTEL_EXPORTER_OTLP_HEADERS env var\n if (process.env.OTEL_EXPORTER_OTLP_HEADERS) {\n for (const pair of process.env.OTEL_EXPORTER_OTLP_HEADERS.split(',')) {\n const [key, ...rest] = pair.split('=');\n if (key) headers[key.trim()] = rest.join('=').trim();\n }\n }\n\n const captureContent =\n options.otelCaptureContent || process.env.AGENTV_OTEL_CAPTURE_CONTENT === 'true';\n\n otelExporter = new OtelTraceExporter({\n endpoint,\n headers,\n captureContent,\n groupTurns: options.otelGroupTurns,\n otlpFilePath: options.otelFile ? path.resolve(options.otelFile) : undefined,\n traceFilePath: options.traceFile ? path.resolve(options.traceFile) : undefined,\n });\n\n const initialized = await otelExporter.init();\n if (!initialized) {\n console.warn(\n 'OTel export requested but @opentelemetry packages not available. Install them to enable export.',\n );\n otelExporter = null;\n }\n } catch (err) {\n console.warn(\n `OTel export initialization failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n otelExporter = null;\n }\n }\n\n const outputPath = options.outPath\n ? path.resolve(options.outPath)\n : buildDefaultOutputPath(cwd, options.format);\n\n // Resolve -o / --output paths (new multi-format support)\n const extraOutputPaths = options.outputPaths.map((p) => path.resolve(p));\n\n // Build the primary output writer (from --out / default)\n // When extra --output paths are provided, combine all into a multi-writer\n const allOutputPaths =\n extraOutputPaths.length > 0 ? [outputPath, ...extraOutputPaths] : [outputPath];\n const uniqueOutputPaths = [...new Set(allOutputPaths)];\n\n let outputWriter: OutputWriter;\n if (uniqueOutputPaths.length === 1) {\n outputWriter = await createOutputWriter(outputPath, options.format);\n console.log(`Output path: ${outputPath}`);\n } else {\n outputWriter = await createMultiWriter(uniqueOutputPaths);\n console.log('Output paths:');\n for (const p of uniqueOutputPaths) {\n console.log(` ${p}`);\n }\n }\n\n // Log file export paths\n const resolvedTestFiles = input.testFiles.map((file) => path.resolve(file));\n if (options.otelFile) {\n console.log(`OTLP JSON file: ${path.resolve(options.otelFile)}`);\n }\n if (options.traceFile) {\n console.log(`Trace file: ${path.resolve(options.traceFile)}`);\n }\n\n // Determine cache state after loading file metadata (need YAML config)\n // We defer cache creation until after file metadata is loaded\n const evaluationRunner = await resolveEvaluationRunner();\n const allResults: EvaluationResult[] = [];\n const seenEvalCases = new Set<string>();\n const displayIdTracker = createDisplayIdTracker();\n\n // Derive file-level concurrency from worker count (global) when provided\n const totalWorkers = options.workers ?? DEFAULT_WORKERS;\n const fileConcurrency = Math.min(\n Math.max(1, totalWorkers),\n Math.max(1, resolvedTestFiles.length),\n );\n const perFileWorkers = options.workers\n ? Math.max(1, Math.floor(totalWorkers / fileConcurrency))\n : undefined;\n const fileMetadata = new Map<\n string,\n {\n readonly evalIds: readonly string[];\n readonly evalCases: readonly EvalTest[];\n readonly selections: readonly {\n selection: TargetSelection;\n inlineTargetLabel: string;\n }[];\n readonly trialsConfig?: TrialsConfig;\n readonly suiteTargets?: readonly string[];\n readonly yamlCache?: boolean;\n readonly yamlCachePath?: string;\n readonly totalBudgetUsd?: number;\n readonly failOnError?: FailOnError;\n }\n >();\n for (const testFilePath of resolvedTestFiles) {\n const meta = await prepareFileMetadata({\n testFilePath,\n repoRoot,\n cwd,\n options,\n });\n fileMetadata.set(testFilePath, meta);\n }\n\n // Resolve cache: combine CLI flags with YAML config\n // Use first file's YAML config for cache settings (consistent across a run)\n const firstMeta = fileMetadata.values().next().value;\n const yamlCacheEnabled = firstMeta?.yamlCache;\n const yamlCachePath = firstMeta?.yamlCachePath;\n const cacheEnabled = shouldEnableCache({\n cliCache: options.cache,\n cliNoCache: options.noCache,\n yamlCache: yamlCacheEnabled,\n });\n const cache = cacheEnabled\n ? new ResponseCache(yamlCachePath ? path.resolve(yamlCachePath) : undefined)\n : undefined;\n const useCache = cacheEnabled;\n\n if (cacheEnabled) {\n console.log(`Response cache: enabled${yamlCachePath ? ` (${yamlCachePath})` : ''}`);\n }\n\n // Detect matrix mode: multiple targets for any file\n const isMatrixMode = Array.from(fileMetadata.values()).some((meta) => meta.selections.length > 1);\n\n // In matrix mode, total eval count is tests × targets (accounting for per-test target overrides)\n let totalEvalCount = 0;\n for (const meta of fileMetadata.values()) {\n const suiteTargetNames = meta.selections.map((s) => s.selection.targetName);\n for (const test of meta.evalCases) {\n // Per-test targets override suite-level targets\n const testTargetNames =\n test.targets && test.targets.length > 0\n ? test.targets.filter((t) => suiteTargetNames.includes(t))\n : suiteTargetNames;\n totalEvalCount += testTargetNames.length > 0 ? testTargetNames.length : 1;\n }\n }\n\n if (totalEvalCount === 0) {\n throw new Error('No tests matched the provided filters.');\n }\n const progressReporter = createProgressReporter(totalWorkers, { verbose: options.verbose });\n progressReporter.start();\n progressReporter.setTotal(totalEvalCount);\n const seenCodexLogPaths = new Set<string>();\n const unsubscribeCodexLogs = subscribeToCodexLogEntries((entry) => {\n if (!entry.filePath || seenCodexLogPaths.has(entry.filePath)) {\n return;\n }\n seenCodexLogPaths.add(entry.filePath);\n progressReporter.addLogPaths([entry.filePath], 'codex');\n });\n const seenPiLogPaths = new Set<string>();\n const unsubscribePiLogs = subscribeToPiLogEntries((entry) => {\n if (!entry.filePath || seenPiLogPaths.has(entry.filePath)) {\n return;\n }\n seenPiLogPaths.add(entry.filePath);\n progressReporter.addLogPaths([entry.filePath], 'pi');\n });\n const seenCopilotLogPaths = new Set<string>();\n const unsubscribeCopilotSdkLogs = subscribeToCopilotSdkLogEntries((entry) => {\n if (!entry.filePath || seenCopilotLogPaths.has(entry.filePath)) {\n return;\n }\n seenCopilotLogPaths.add(entry.filePath);\n progressReporter.addLogPaths([entry.filePath], 'copilot');\n });\n const unsubscribeCopilotCliLogs = subscribeToCopilotCliLogEntries((entry) => {\n if (!entry.filePath || seenCopilotLogPaths.has(entry.filePath)) {\n return;\n }\n seenCopilotLogPaths.add(entry.filePath);\n progressReporter.addLogPaths([entry.filePath], 'copilot');\n });\n for (const [testFilePath, meta] of fileMetadata.entries()) {\n for (const { selection, inlineTargetLabel } of meta.selections) {\n for (const testId of meta.evalIds) {\n const evalKey = makeEvalKey(\n testFilePath,\n meta.selections.length > 1 ? `${testId}@${selection.targetName}` : testId,\n );\n seenEvalCases.add(evalKey);\n const displayId = displayIdTracker.getOrAssign(evalKey);\n progressReporter.update(displayId, {\n workerId: displayId,\n testId: meta.selections.length > 1 ? `${testId}@${selection.targetName}` : testId,\n status: 'pending',\n targetLabel: inlineTargetLabel,\n });\n }\n }\n }\n\n try {\n await runWithLimit(resolvedTestFiles, fileConcurrency, async (testFilePath) => {\n const targetPrep = fileMetadata.get(testFilePath);\n if (!targetPrep) {\n throw new Error(`Missing metadata for ${testFilePath}`);\n }\n\n // Run all targets concurrently (each target has its own worker limit)\n const targetResults = await Promise.all(\n targetPrep.selections.map(async ({ selection, inlineTargetLabel }) => {\n // Filter eval cases to those applicable to this target\n const targetName = selection.targetName;\n const applicableEvalCases =\n targetPrep.selections.length > 1\n ? targetPrep.evalCases.filter((test) => {\n if (test.targets && test.targets.length > 0) {\n return test.targets.includes(targetName);\n }\n return true;\n })\n : targetPrep.evalCases;\n\n if (applicableEvalCases.length === 0) {\n return [];\n }\n\n const result = await runSingleEvalFile({\n testFilePath,\n cwd,\n repoRoot,\n options,\n outputWriter,\n otelExporter,\n cache,\n evaluationRunner,\n workersOverride: perFileWorkers,\n progressReporter,\n seenEvalCases,\n displayIdTracker,\n selection,\n inlineTargetLabel,\n evalCases: applicableEvalCases,\n trialsConfig: targetPrep.trialsConfig,\n matrixMode: targetPrep.selections.length > 1,\n totalBudgetUsd: targetPrep.totalBudgetUsd,\n failOnError: targetPrep.failOnError,\n });\n\n return result.results;\n }),\n );\n for (const results of targetResults) {\n allResults.push(...results);\n }\n });\n\n progressReporter.finish();\n\n // Merge non-error results from previous run when using --retry-errors\n if (retryNonErrorResults && retryNonErrorResults.length > 0) {\n for (const preserved of retryNonErrorResults) {\n await outputWriter.append(preserved);\n }\n allResults.push(...retryNonErrorResults);\n console.log(\n `Merged ${retryNonErrorResults.length} non-error result(s) from previous output.`,\n );\n }\n\n const summary = calculateEvaluationSummary(allResults);\n console.log(formatEvaluationSummary(summary));\n\n // Print matrix summary when multiple targets were evaluated\n if (isMatrixMode && allResults.length > 0) {\n console.log(formatMatrixSummary(allResults));\n }\n\n // Print workspace paths for failed cases (when preserved for debugging)\n const failedWithWorkspaces = allResults.filter(\n (r) => r.workspacePath && (r.error || r.score < 0.5),\n );\n if (failedWithWorkspaces.length > 0) {\n console.log('\\nWorkspaces preserved for debugging:');\n for (const result of failedWithWorkspaces) {\n console.log(` ${result.testId}: ${result.workspacePath}`);\n }\n }\n\n if (allResults.length > 0) {\n if (uniqueOutputPaths.length === 1) {\n console.log(`\\nResults written to: ${outputPath}`);\n } else {\n console.log('\\nResults written to:');\n for (const p of uniqueOutputPaths) {\n console.log(` ${p}`);\n }\n }\n }\n } finally {\n unsubscribeCodexLogs();\n unsubscribePiLogs();\n unsubscribeCopilotSdkLogs();\n unsubscribeCopilotCliLogs();\n await outputWriter.close().catch(() => undefined);\n if (otelExporter) {\n try {\n await otelExporter.shutdown();\n } catch {\n // Silently ignore shutdown errors\n }\n }\n }\n}\n\nasync function resolveEvaluationRunner(): Promise<typeof defaultRunEvaluation> {\n const overridePath = process.env.AGENTEVO_CLI_EVAL_RUNNER;\n if (!overridePath) {\n return defaultRunEvaluation;\n }\n\n const resolved = path.isAbsolute(overridePath)\n ? overridePath\n : path.resolve(process.cwd(), overridePath);\n\n const moduleUrl = pathToFileURL(resolved).href;\n const mod = await import(moduleUrl);\n const candidate = mod.runEvaluation;\n if (typeof candidate !== 'function') {\n throw new Error(\n `Module '${resolved}' must export a 'runEvaluation' function to override the default implementation`,\n );\n }\n return candidate as typeof defaultRunEvaluation;\n}\n","import { satisfies, validRange } from 'semver';\n\nimport packageJson from '../package.json' with { type: 'json' };\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RED = '\\u001b[31m';\nconst ANSI_RESET = '\\u001b[0m';\n\nexport interface VersionCheckResult {\n readonly satisfied: boolean;\n readonly currentVersion: string;\n readonly requiredRange: string;\n}\n\n/**\n * Validate and check the installed version against a required semver range.\n * Throws on malformed range strings.\n */\nexport function checkVersion(requiredVersion: string): VersionCheckResult {\n const currentVersion = packageJson.version;\n\n if (!requiredVersion.trim() || !validRange(requiredVersion)) {\n throw new Error(\n `Invalid required_version \"${requiredVersion}\" in .agentv/config.yaml. Must be a valid semver range (e.g., \">=2.11.0\", \"^2.11.0\").`,\n );\n }\n\n return {\n satisfied: satisfies(currentVersion, requiredVersion),\n currentVersion,\n requiredRange: requiredVersion,\n };\n}\n\n/**\n * Run the version compatibility check and handle user interaction.\n *\n * - If the version satisfies the range, returns silently.\n * - If the range is malformed, prints an error and exits with code 1.\n * - If the version is below the range:\n * - Interactive (TTY): warns and prompts to continue or abort.\n * - Non-interactive: warns to stderr, continues (unless strict).\n * - Strict mode: warns and exits with code 1.\n */\nexport async function enforceRequiredVersion(\n requiredVersion: string,\n options?: { strict?: boolean },\n): Promise<void> {\n let result: VersionCheckResult;\n try {\n result = checkVersion(requiredVersion);\n } catch (err) {\n console.error(`${ANSI_RED}Error: ${(err as Error).message}${ANSI_RESET}`);\n process.exit(1);\n }\n\n if (result.satisfied) {\n return;\n }\n\n const warning = `${ANSI_YELLOW}Warning: This project requires agentv ${result.requiredRange} but you have ${result.currentVersion}.${ANSI_RESET}\\n Run \\`agentv self update\\` to upgrade.`;\n\n if (options?.strict) {\n console.error(warning);\n console.error(\n `${ANSI_RED}Aborting: --strict mode requires the installed version to satisfy the required range.${ANSI_RESET}`,\n );\n process.exit(1);\n }\n\n if (process.stdin.isTTY && process.stdout.isTTY) {\n console.warn(warning);\n const shouldContinue = await promptContinue();\n if (!shouldContinue) {\n process.exit(1);\n }\n } else {\n // Non-interactive: warn to stderr and continue\n process.stderr.write(`${warning}\\n`);\n }\n}\n\nasync function promptContinue(): Promise<boolean> {\n const { confirm } = await import('@inquirer/prompts');\n return confirm({ message: 'Continue anyway?', default: false });\n}\n","import { constants } from 'node:fs';\nimport { access } from 'node:fs/promises';\nimport path from 'node:path';\nimport { config as loadDotenv } from 'dotenv';\n\ninterface LoadEnvOptions {\n readonly testFilePath: string;\n readonly repoRoot: string;\n readonly verbose: boolean;\n}\n\nfunction uniqueDirs(directories: readonly string[]): readonly string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const dir of directories) {\n const absolute = path.resolve(dir);\n if (seen.has(absolute)) {\n continue;\n }\n seen.add(absolute);\n result.push(absolute);\n }\n return result;\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction collectAncestorDirectories(start: string, boundary: string): readonly string[] {\n const directories: string[] = [];\n const boundaryDir = path.resolve(boundary);\n let current: string | undefined = path.resolve(start);\n\n while (current !== undefined) {\n directories.push(current);\n if (current === boundaryDir) {\n break;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n return directories;\n}\n\nexport async function loadEnvFromHierarchy(options: LoadEnvOptions): Promise<string | undefined> {\n const { testFilePath, repoRoot, verbose } = options;\n const testDir = path.dirname(path.resolve(testFilePath));\n const cwd = process.cwd();\n\n const searchDirs = uniqueDirs([...collectAncestorDirectories(testDir, repoRoot), repoRoot, cwd]);\n\n // Collect all .env files in the hierarchy\n const envFiles: string[] = [];\n for (const dir of searchDirs) {\n const candidate = path.join(dir, '.env');\n if (await fileExists(candidate)) {\n envFiles.push(candidate);\n }\n }\n\n if (envFiles.length === 0) {\n if (verbose) {\n console.log('No .env file found in hierarchy');\n }\n return undefined;\n }\n\n // Load from root to child (reverse order) so child values override parent values\n // override: false means variables already in process.env won't be overwritten\n for (let i = envFiles.length - 1; i >= 0; i--) {\n const envFile = envFiles[i];\n loadDotenv({ path: envFile, override: false });\n if (verbose) {\n console.log(`Loaded environment from: ${envFile}`);\n }\n }\n\n // Return the closest (most specific) .env file path\n return envFiles[0];\n}\n","import path from 'node:path';\n\nimport type { EvaluationResult } from '@agentv/core';\n\nimport { JsonWriter } from './json-writer.js';\nimport { JsonlWriter } from './jsonl-writer.js';\nimport { JunitWriter } from './junit-writer.js';\nimport { YamlWriter } from './yaml-writer.js';\n\nexport type OutputFormat = 'jsonl' | 'yaml';\n\nexport interface OutputWriter {\n append(result: EvaluationResult): Promise<void>;\n close(): Promise<void>;\n}\n\nexport async function createOutputWriter(\n filePath: string,\n format: OutputFormat,\n): Promise<OutputWriter> {\n switch (format) {\n case 'jsonl':\n return JsonlWriter.open(filePath);\n case 'yaml':\n return YamlWriter.open(filePath);\n default: {\n const exhaustiveCheck: never = format;\n throw new Error(`Unsupported output format: ${exhaustiveCheck}`);\n }\n }\n}\n\nexport function getDefaultExtension(format: OutputFormat): string {\n switch (format) {\n case 'jsonl':\n return '.jsonl';\n case 'yaml':\n return '.yaml';\n default: {\n const exhaustiveCheck: never = format;\n throw new Error(`Unsupported output format: ${exhaustiveCheck}`);\n }\n }\n}\n\nconst SUPPORTED_EXTENSIONS = new Set(['.jsonl', '.json', '.xml', '.yaml', '.yml']);\n\nexport function createWriterFromPath(filePath: string): Promise<OutputWriter> {\n const ext = path.extname(filePath).toLowerCase();\n switch (ext) {\n case '.jsonl':\n return JsonlWriter.open(filePath);\n case '.json':\n return JsonWriter.open(filePath);\n case '.xml':\n return JunitWriter.open(filePath);\n case '.yaml':\n case '.yml':\n return YamlWriter.open(filePath);\n default:\n throw new Error(\n `Unsupported output file extension \"${ext}\". Supported: ${[...SUPPORTED_EXTENSIONS].join(', ')}`,\n );\n }\n}\n\nexport async function createMultiWriter(filePaths: readonly string[]): Promise<OutputWriter> {\n const writers = await Promise.all(filePaths.map((fp) => createWriterFromPath(fp)));\n return {\n async append(result: EvaluationResult): Promise<void> {\n await Promise.all(writers.map((w) => w.append(result)));\n },\n async close(): Promise<void> {\n await Promise.all(writers.map((w) => w.close()));\n },\n };\n}\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport type { EvaluationResult } from '@agentv/core';\n\nimport { toSnakeCaseDeep } from '../../utils/case-conversion.js';\n\nexport class JsonWriter {\n private readonly filePath: string;\n private readonly results: EvaluationResult[] = [];\n private closed = false;\n\n private constructor(filePath: string) {\n this.filePath = filePath;\n }\n\n static async open(filePath: string): Promise<JsonWriter> {\n await mkdir(path.dirname(filePath), { recursive: true });\n return new JsonWriter(filePath);\n }\n\n async append(result: EvaluationResult): Promise<void> {\n if (this.closed) {\n throw new Error('Cannot write to closed JSON writer');\n }\n this.results.push(result);\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n this.closed = true;\n\n const passed = this.results.filter((r) => r.score >= 0.5).length;\n const failed = this.results.length - passed;\n const total = this.results.length;\n\n const output = {\n stats: {\n total,\n passed,\n failed,\n passRate: total > 0 ? passed / total : 0,\n },\n results: this.results,\n };\n\n const snakeCaseOutput = toSnakeCaseDeep(output);\n await writeFile(this.filePath, `${JSON.stringify(snakeCaseOutput, null, 2)}\\n`, 'utf8');\n }\n}\n","/**\n * Converts a camelCase string to snake_case.\n * Examples:\n * testId -> test_id\n * answer -> answer\n * conversationId -> conversation_id\n *\n * Note: Keys that start with an uppercase letter are treated as proper nouns\n * and returned unchanged (e.g., \"Read\", \"Edit\" for tool names).\n */\nfunction toSnakeCase(str: string): string {\n // Don't convert keys that start with uppercase (proper nouns/tool names)\n if (/^[A-Z]/.test(str)) {\n return str;\n }\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Recursively converts all keys in an object from camelCase to snake_case.\n * This is used to convert TypeScript internal representations to snake_case\n * for Python ecosystem compatibility in JSONL output files.\n *\n * Conversion rules:\n * - Object keys: camelCase -> snake_case\n * - Array elements: recursively converted\n * - Primitives: returned unchanged\n * - null/undefined: returned unchanged\n *\n * @param obj - The object to convert (can be any JSON-serializable value)\n * @returns A new object with all keys converted to snake_case\n */\nexport function toSnakeCaseDeep(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => toSnakeCaseDeep(item));\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const snakeKey = toSnakeCase(key);\n result[snakeKey] = toSnakeCaseDeep(value);\n }\n return result;\n }\n\n return obj;\n}\n","import { createWriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport path from 'node:path';\nimport { finished } from 'node:stream/promises';\nimport { Mutex } from 'async-mutex';\n\nimport { toSnakeCaseDeep } from '../../utils/case-conversion.js';\n\nexport class JsonlWriter {\n private readonly stream: ReturnType<typeof createWriteStream>;\n private readonly mutex = new Mutex();\n private closed = false;\n\n private constructor(stream: ReturnType<typeof createWriteStream>) {\n this.stream = stream;\n }\n\n static async open(filePath: string): Promise<JsonlWriter> {\n await mkdir(path.dirname(filePath), { recursive: true });\n const stream = createWriteStream(filePath, { flags: 'w', encoding: 'utf8' });\n return new JsonlWriter(stream);\n }\n\n async append(record: unknown): Promise<void> {\n await this.mutex.runExclusive(async () => {\n if (this.closed) {\n throw new Error('Cannot write to closed JSONL writer');\n }\n // Convert camelCase keys to snake_case for Python ecosystem compatibility\n const snakeCaseRecord = toSnakeCaseDeep(record);\n const line = `${JSON.stringify(snakeCaseRecord)}\\n`;\n if (!this.stream.write(line)) {\n await new Promise<void>((resolve, reject) => {\n this.stream.once('drain', resolve);\n this.stream.once('error', reject);\n });\n }\n });\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.stream.end();\n await finished(this.stream);\n }\n}\n","const E_TIMEOUT = new Error('timeout while waiting for mutex to become available');\nconst E_ALREADY_LOCKED = new Error('mutex already locked');\nconst E_CANCELED = new Error('request for lock canceled');\n\nvar __awaiter$2 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nclass Semaphore {\n constructor(_value, _cancelError = E_CANCELED) {\n this._value = _value;\n this._cancelError = _cancelError;\n this._queue = [];\n this._weightedWaiters = [];\n }\n acquire(weight = 1, priority = 0) {\n if (weight <= 0)\n throw new Error(`invalid weight ${weight}: must be positive`);\n return new Promise((resolve, reject) => {\n const task = { resolve, reject, weight, priority };\n const i = findIndexFromEnd(this._queue, (other) => priority <= other.priority);\n if (i === -1 && weight <= this._value) {\n // Needs immediate dispatch, skip the queue\n this._dispatchItem(task);\n }\n else {\n this._queue.splice(i + 1, 0, task);\n }\n });\n }\n runExclusive(callback_1) {\n return __awaiter$2(this, arguments, void 0, function* (callback, weight = 1, priority = 0) {\n const [value, release] = yield this.acquire(weight, priority);\n try {\n return yield callback(value);\n }\n finally {\n release();\n }\n });\n }\n waitForUnlock(weight = 1, priority = 0) {\n if (weight <= 0)\n throw new Error(`invalid weight ${weight}: must be positive`);\n if (this._couldLockImmediately(weight, priority)) {\n return Promise.resolve();\n }\n else {\n return new Promise((resolve) => {\n if (!this._weightedWaiters[weight - 1])\n this._weightedWaiters[weight - 1] = [];\n insertSorted(this._weightedWaiters[weight - 1], { resolve, priority });\n });\n }\n }\n isLocked() {\n return this._value <= 0;\n }\n getValue() {\n return this._value;\n }\n setValue(value) {\n this._value = value;\n this._dispatchQueue();\n }\n release(weight = 1) {\n if (weight <= 0)\n throw new Error(`invalid weight ${weight}: must be positive`);\n this._value += weight;\n this._dispatchQueue();\n }\n cancel() {\n this._queue.forEach((entry) => entry.reject(this._cancelError));\n this._queue = [];\n }\n _dispatchQueue() {\n this._drainUnlockWaiters();\n while (this._queue.length > 0 && this._queue[0].weight <= this._value) {\n this._dispatchItem(this._queue.shift());\n this._drainUnlockWaiters();\n }\n }\n _dispatchItem(item) {\n const previousValue = this._value;\n this._value -= item.weight;\n item.resolve([previousValue, this._newReleaser(item.weight)]);\n }\n _newReleaser(weight) {\n let called = false;\n return () => {\n if (called)\n return;\n called = true;\n this.release(weight);\n };\n }\n _drainUnlockWaiters() {\n if (this._queue.length === 0) {\n for (let weight = this._value; weight > 0; weight--) {\n const waiters = this._weightedWaiters[weight - 1];\n if (!waiters)\n continue;\n waiters.forEach((waiter) => waiter.resolve());\n this._weightedWaiters[weight - 1] = [];\n }\n }\n else {\n const queuedPriority = this._queue[0].priority;\n for (let weight = this._value; weight > 0; weight--) {\n const waiters = this._weightedWaiters[weight - 1];\n if (!waiters)\n continue;\n const i = waiters.findIndex((waiter) => waiter.priority <= queuedPriority);\n (i === -1 ? waiters : waiters.splice(0, i))\n .forEach((waiter => waiter.resolve()));\n }\n }\n }\n _couldLockImmediately(weight, priority) {\n return (this._queue.length === 0 || this._queue[0].priority < priority) &&\n weight <= this._value;\n }\n}\nfunction insertSorted(a, v) {\n const i = findIndexFromEnd(a, (other) => v.priority <= other.priority);\n a.splice(i + 1, 0, v);\n}\nfunction findIndexFromEnd(a, predicate) {\n for (let i = a.length - 1; i >= 0; i--) {\n if (predicate(a[i])) {\n return i;\n }\n }\n return -1;\n}\n\nvar __awaiter$1 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nclass Mutex {\n constructor(cancelError) {\n this._semaphore = new Semaphore(1, cancelError);\n }\n acquire() {\n return __awaiter$1(this, arguments, void 0, function* (priority = 0) {\n const [, releaser] = yield this._semaphore.acquire(1, priority);\n return releaser;\n });\n }\n runExclusive(callback, priority = 0) {\n return this._semaphore.runExclusive(() => callback(), 1, priority);\n }\n isLocked() {\n return this._semaphore.isLocked();\n }\n waitForUnlock(priority = 0) {\n return this._semaphore.waitForUnlock(1, priority);\n }\n release() {\n if (this._semaphore.isLocked())\n this._semaphore.release();\n }\n cancel() {\n return this._semaphore.cancel();\n }\n}\n\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nfunction withTimeout(sync, timeout, timeoutError = E_TIMEOUT) {\n return {\n acquire: (weightOrPriority, priority) => {\n let weight;\n if (isSemaphore(sync)) {\n weight = weightOrPriority;\n }\n else {\n weight = undefined;\n priority = weightOrPriority;\n }\n if (weight !== undefined && weight <= 0) {\n throw new Error(`invalid weight ${weight}: must be positive`);\n }\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n let isTimeout = false;\n const handle = setTimeout(() => {\n isTimeout = true;\n reject(timeoutError);\n }, timeout);\n try {\n const ticket = yield (isSemaphore(sync)\n ? sync.acquire(weight, priority)\n : sync.acquire(priority));\n if (isTimeout) {\n const release = Array.isArray(ticket) ? ticket[1] : ticket;\n release();\n }\n else {\n clearTimeout(handle);\n resolve(ticket);\n }\n }\n catch (e) {\n if (!isTimeout) {\n clearTimeout(handle);\n reject(e);\n }\n }\n }));\n },\n runExclusive(callback, weight, priority) {\n return __awaiter(this, void 0, void 0, function* () {\n let release = () => undefined;\n try {\n const ticket = yield this.acquire(weight, priority);\n if (Array.isArray(ticket)) {\n release = ticket[1];\n return yield callback(ticket[0]);\n }\n else {\n release = ticket;\n return yield callback();\n }\n }\n finally {\n release();\n }\n });\n },\n release(weight) {\n sync.release(weight);\n },\n cancel() {\n return sync.cancel();\n },\n waitForUnlock: (weightOrPriority, priority) => {\n let weight;\n if (isSemaphore(sync)) {\n weight = weightOrPriority;\n }\n else {\n weight = undefined;\n priority = weightOrPriority;\n }\n if (weight !== undefined && weight <= 0) {\n throw new Error(`invalid weight ${weight}: must be positive`);\n }\n return new Promise((resolve, reject) => {\n const handle = setTimeout(() => reject(timeoutError), timeout);\n (isSemaphore(sync)\n ? sync.waitForUnlock(weight, priority)\n : sync.waitForUnlock(priority)).then(() => {\n clearTimeout(handle);\n resolve();\n });\n });\n },\n isLocked: () => sync.isLocked(),\n getValue: () => sync.getValue(),\n setValue: (value) => sync.setValue(value),\n };\n}\nfunction isSemaphore(sync) {\n return sync.getValue !== undefined;\n}\n\n// eslint-disable-next-lisne @typescript-eslint/explicit-module-boundary-types\nfunction tryAcquire(sync, alreadyAcquiredError = E_ALREADY_LOCKED) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return withTimeout(sync, 0, alreadyAcquiredError);\n}\n\nexport { E_ALREADY_LOCKED, E_CANCELED, E_TIMEOUT, Mutex, Semaphore, tryAcquire, withTimeout };\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport type { EvaluationResult } from '@agentv/core';\n\nexport function escapeXml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nexport class JunitWriter {\n private readonly filePath: string;\n private readonly results: EvaluationResult[] = [];\n private closed = false;\n\n private constructor(filePath: string) {\n this.filePath = filePath;\n }\n\n static async open(filePath: string): Promise<JunitWriter> {\n await mkdir(path.dirname(filePath), { recursive: true });\n return new JunitWriter(filePath);\n }\n\n async append(result: EvaluationResult): Promise<void> {\n if (this.closed) {\n throw new Error('Cannot write to closed JUnit writer');\n }\n this.results.push(result);\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n this.closed = true;\n\n const grouped = new Map<string, EvaluationResult[]>();\n for (const result of this.results) {\n const suite = result.dataset ?? 'default';\n const existing = grouped.get(suite);\n if (existing) {\n existing.push(result);\n } else {\n grouped.set(suite, [result]);\n }\n }\n\n const suiteXmls: string[] = [];\n for (const [suiteName, results] of grouped) {\n const failures = results.filter((r) => r.score < 0.5).length;\n const errors = results.filter((r) => r.error !== undefined).length;\n\n const testCases = results.map((r) => {\n const time = r.durationMs ? (r.durationMs / 1000).toFixed(3) : '0.000';\n\n let inner = '';\n if (r.error) {\n inner = `\\n <error message=\"${escapeXml(r.error)}\">${escapeXml(r.error)}</error>\\n `;\n } else if (r.score < 0.5) {\n const message = `score=${r.score.toFixed(3)}`;\n const detail = [\n `Score: ${r.score.toFixed(3)}`,\n r.reasoning ? `Reasoning: ${r.reasoning}` : '',\n r.misses.length > 0 ? `Misses: ${r.misses.join(', ')}` : '',\n ]\n .filter(Boolean)\n .join('\\n');\n inner = `\\n <failure message=\"${escapeXml(message)}\">${escapeXml(detail)}</failure>\\n `;\n }\n\n return ` <testcase name=\"${escapeXml(r.testId)}\" classname=\"${escapeXml(suiteName)}\" time=\"${time}\">${inner}</testcase>`;\n });\n\n suiteXmls.push(\n ` <testsuite name=\"${escapeXml(suiteName)}\" tests=\"${results.length}\" failures=\"${failures}\" errors=\"${errors}\">\\n${testCases.join('\\n')}\\n </testsuite>`,\n );\n }\n\n const totalTests = this.results.length;\n const totalFailures = this.results.filter((r) => r.score < 0.5).length;\n const totalErrors = this.results.filter((r) => r.error !== undefined).length;\n\n const xml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<testsuites tests=\"${totalTests}\" failures=\"${totalFailures}\" errors=\"${totalErrors}\">\\n${suiteXmls.join('\\n')}\\n</testsuites>\\n`;\n\n await writeFile(this.filePath, xml, 'utf8');\n }\n}\n","import { createWriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport path from 'node:path';\nimport { finished } from 'node:stream/promises';\nimport { normalizeLineEndings } from '@agentv/core';\nimport { Mutex } from 'async-mutex';\nimport { stringify as stringifyYaml } from 'yaml';\n\nimport { toSnakeCaseDeep } from '../../utils/case-conversion.js';\n\nexport class YamlWriter {\n private readonly stream: ReturnType<typeof createWriteStream>;\n private readonly mutex = new Mutex();\n private closed = false;\n private isFirst = true;\n\n private constructor(stream: ReturnType<typeof createWriteStream>) {\n this.stream = stream;\n }\n\n static async open(filePath: string): Promise<YamlWriter> {\n await mkdir(path.dirname(filePath), { recursive: true });\n const stream = createWriteStream(filePath, { flags: 'w', encoding: 'utf8' });\n return new YamlWriter(stream);\n }\n\n async append(record: unknown): Promise<void> {\n await this.mutex.runExclusive(async () => {\n if (this.closed) {\n throw new Error('Cannot write to closed YAML writer');\n }\n\n // Convert record to snake_case for Python ecosystem compatibility\n const snakeCaseRecord = toSnakeCaseDeep(record);\n\n // Convert to YAML with proper multi-line string handling\n const yamlDoc = stringifyYaml(snakeCaseRecord, {\n indent: 2,\n lineWidth: 0, // Disable line wrapping\n // Let YAML library choose appropriate string style based on content\n // (will use block literal for multiline strings with actual newlines)\n });\n\n // Normalize line endings to LF (\\n) for consistent output across platforms\n const normalizedYaml = normalizeLineEndings(yamlDoc);\n\n // Add YAML document separator (---) between records\n const separator = this.isFirst ? '---\\n' : '\\n---\\n';\n this.isFirst = false;\n\n const content = `${separator}${normalizedYaml}`;\n\n if (!this.stream.write(content)) {\n await new Promise<void>((resolve, reject) => {\n this.stream.once('drain', resolve);\n this.stream.once('error', reject);\n });\n }\n });\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.stream.end();\n await finished(this.stream);\n }\n}\n","export interface WorkerProgress {\n workerId: number;\n testId: string;\n status: 'pending' | 'running' | 'completed' | 'failed';\n startedAt?: number;\n completedAt?: number;\n error?: string;\n targetLabel?: string;\n}\n\n/**\n * Simple line-based progress display.\n * Prints each status update as a new line - no ANSI cursor manipulation.\n * This ensures compatibility with verbose logging from providers.\n */\nexport class ProgressDisplay {\n private readonly workers: Map<number, WorkerProgress> = new Map();\n private totalTests = 0;\n private completedTests = 0;\n private readonly logPaths: string[] = [];\n private readonly logPathSet = new Set<string>();\n private hasPrintedLogHeader = false;\n private started = false;\n private finished = false;\n private readonly verbose: boolean;\n\n constructor(_maxWorkers: number, options?: { verbose?: boolean }) {\n this.verbose = options?.verbose ?? false;\n }\n\n isInteractiveMode(): boolean {\n // Always return false - we use simple line-based output\n return false;\n }\n\n start(): void {\n this.started = true;\n this.finished = false;\n }\n\n setTotalTests(count: number): void {\n this.totalTests = count;\n }\n\n updateWorker(progress: WorkerProgress): void {\n const previous = this.workers.get(progress.workerId);\n this.workers.set(progress.workerId, progress);\n\n if (progress.status === 'completed' || progress.status === 'failed') {\n this.completedTests++;\n }\n\n // Print status updates as simple lines\n const targetSuffix = progress.targetLabel ? ` | ${progress.targetLabel}` : '';\n const countPrefix = `${this.completedTests}/${this.totalTests}`;\n\n switch (progress.status) {\n case 'pending':\n // Only print pending in verbose mode (just shows the queue)\n if (this.verbose && !previous) {\n console.log(`${countPrefix} ⏳ ${progress.testId}${targetSuffix}`);\n }\n break;\n case 'running':\n // Always print running - useful feedback for long-running agents\n if (!previous || previous.status === 'pending') {\n console.log(`${countPrefix} 🔄 ${progress.testId}${targetSuffix}`);\n }\n break;\n case 'completed':\n console.log(`${countPrefix} ✅ ${progress.testId}${targetSuffix}`);\n break;\n case 'failed':\n console.log(\n `${countPrefix} ❌ ${progress.testId}${targetSuffix}${progress.error ? `: ${progress.error}` : ''}`,\n );\n break;\n }\n }\n\n addLogPaths(paths: readonly string[], provider?: 'codex' | 'pi' | 'copilot'): void {\n const newPaths: string[] = [];\n for (const path of paths) {\n if (this.logPathSet.has(path)) {\n continue;\n }\n this.logPathSet.add(path);\n newPaths.push(path);\n }\n\n if (newPaths.length === 0) {\n return;\n }\n\n this.logPaths.push(...newPaths);\n\n if (!this.hasPrintedLogHeader) {\n console.log('');\n const label =\n provider === 'pi'\n ? 'Pi Coding Agent'\n : provider === 'copilot'\n ? 'Copilot CLI'\n : 'Codex CLI';\n console.log(`${label} logs:`);\n this.hasPrintedLogHeader = true;\n }\n\n const startIndex = this.logPaths.length - newPaths.length;\n newPaths.forEach((path, offset) => {\n console.log(`${startIndex + offset + 1}. ${path}`);\n });\n }\n\n finish(): void {\n this.finished = true;\n // Add blank line to separate from summary\n console.log('');\n }\n\n clear(): void {\n // No-op for line-based display\n }\n}\n","import { createReadStream } from 'node:fs';\nimport { createInterface } from 'node:readline';\n\nimport type { EvaluationResult } from '@agentv/core';\n\n/**\n * Load test IDs from a JSONL results file that have executionStatus === 'execution_error'.\n */\nexport async function loadErrorTestIds(jsonlPath: string): Promise<readonly string[]> {\n const ids: string[] = [];\n const rl = createInterface({\n input: createReadStream(jsonlPath),\n crlfDelay: Number.POSITIVE_INFINITY,\n });\n\n for await (const line of rl) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed = JSON.parse(trimmed) as Partial<EvaluationResult>;\n if (parsed.executionStatus === 'execution_error' && parsed.testId) {\n ids.push(parsed.testId);\n }\n } catch {\n // Skip malformed lines\n }\n }\n\n return [...new Set(ids)];\n}\n\n/**\n * Load results from a JSONL file that do NOT have executionStatus === 'execution_error'.\n * These are the \"good\" results that should be preserved when merging retry output.\n */\nexport async function loadNonErrorResults(jsonlPath: string): Promise<readonly EvaluationResult[]> {\n const results: EvaluationResult[] = [];\n const rl = createInterface({\n input: createReadStream(jsonlPath),\n crlfDelay: Number.POSITIVE_INFINITY,\n });\n\n for await (const line of rl) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed = JSON.parse(trimmed) as Partial<EvaluationResult>;\n if (!parsed.testId || parsed.score === undefined) continue;\n if (parsed.executionStatus !== 'execution_error') {\n results.push(parsed as EvaluationResult);\n }\n } catch {\n // Skip malformed lines\n }\n }\n\n return results;\n}\n","import type { EvaluationResult } from '@agentv/core';\n\nexport interface HistogramBin {\n readonly range: readonly [number, number];\n count: number;\n}\n\nexport interface EvaluationSummary {\n readonly total: number;\n readonly mean: number;\n readonly median: number;\n readonly min: number;\n readonly max: number;\n readonly standardDeviation?: number;\n readonly histogram: readonly HistogramBin[];\n readonly topResults: readonly EvaluationResult[];\n readonly bottomResults: readonly EvaluationResult[];\n readonly errorCount: number;\n readonly errors: readonly { readonly testId: string; readonly error: string }[];\n readonly executionErrorCount: number;\n readonly qualityFailureCount: number;\n readonly passedCount: number;\n readonly byFailureStage: Readonly<Record<string, number>>;\n readonly byFailureReason: Readonly<Record<string, number>>;\n}\n\nconst HISTOGRAM_BREAKPOINTS = [0, 0.2, 0.4, 0.6, 0.8, 1];\n\nfunction computeMean(values: readonly number[]): number {\n if (values.length === 0) {\n return 0;\n }\n const sum = values.reduce((acc, value) => acc + value, 0);\n return sum / values.length;\n}\n\nfunction computeMedian(values: readonly number[]): number {\n if (values.length === 0) {\n return 0;\n }\n const sorted = [...values].sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n if (sorted.length % 2 === 0) {\n return (sorted[mid - 1] + sorted[mid]) / 2;\n }\n return sorted[mid];\n}\n\nfunction computeStandardDeviation(values: readonly number[]): number | undefined {\n if (values.length < 2) {\n return undefined;\n }\n const mean = computeMean(values);\n const variance =\n values.reduce((acc, value) => acc + (value - mean) ** 2, 0) / (values.length - 1);\n return Math.sqrt(variance);\n}\n\nfunction buildHistogram(values: readonly number[]): readonly HistogramBin[] {\n const bins: HistogramBin[] = [];\n for (let index = 0; index < HISTOGRAM_BREAKPOINTS.length - 1; index += 1) {\n bins.push({\n range: [HISTOGRAM_BREAKPOINTS[index], HISTOGRAM_BREAKPOINTS[index + 1]] as const,\n count: 0,\n });\n }\n\n for (const value of values) {\n for (const bin of bins) {\n const [start, end] = bin.range;\n const isLastBin = end === HISTOGRAM_BREAKPOINTS[HISTOGRAM_BREAKPOINTS.length - 1];\n const withinRange = isLastBin\n ? value >= start && value <= end\n : value >= start && value < end + 1e-9;\n if (withinRange) {\n bin.count += 1;\n break;\n }\n }\n }\n\n return bins;\n}\n\nexport function calculateEvaluationSummary(\n results: readonly EvaluationResult[],\n): EvaluationSummary {\n const total = results.length;\n\n // Track errors\n const errors = results\n .filter((result) => result.error !== undefined)\n .map((result) => ({ testId: result.testId, error: result.error as string }));\n const errorCount = errors.length;\n\n if (total === 0) {\n return {\n total: 0,\n mean: 0,\n median: 0,\n min: 0,\n max: 0,\n standardDeviation: undefined,\n histogram: buildHistogram([]),\n topResults: [],\n bottomResults: [],\n errorCount: 0,\n errors: [],\n executionErrorCount: 0,\n qualityFailureCount: 0,\n passedCount: 0,\n byFailureStage: {},\n byFailureReason: {},\n };\n }\n\n // Separate execution errors from quality results\n const executionErrors = results.filter((r) => r.executionStatus === 'execution_error');\n const qualityResults = results.filter((r) => r.executionStatus !== 'execution_error');\n const qualityScores = qualityResults.map((r) => r.score);\n\n // Compute quality metrics from non-execution-error results only\n const mean = computeMean(qualityScores);\n const median = computeMedian(qualityScores);\n const min = qualityScores.length > 0 ? Math.min(...qualityScores) : 0;\n const max = qualityScores.length > 0 ? Math.max(...qualityScores) : 0;\n const standardDeviation = computeStandardDeviation(qualityScores);\n const histogram = buildHistogram(qualityScores);\n\n // Top/bottom results consider only non-execution-error results\n const sortedResults = [...qualityResults].sort((a, b) => b.score - a.score);\n const topResults = sortedResults.slice(0, Math.min(3, sortedResults.length));\n const bottomResults = sortedResults.slice(-Math.min(3, sortedResults.length));\n\n // Count by execution status\n const executionErrorCount = executionErrors.length;\n const qualityFailureCount = results.filter((r) => r.executionStatus === 'quality_failure').length;\n const passedCount = results.filter((r) => r.executionStatus === 'ok').length;\n\n // Aggregate by failure stage and reason (execution errors only)\n const byFailureStage: Record<string, number> = {};\n const byFailureReason: Record<string, number> = {};\n for (const result of executionErrors) {\n if (result.failureStage) {\n byFailureStage[result.failureStage] = (byFailureStage[result.failureStage] ?? 0) + 1;\n }\n if (result.failureReasonCode) {\n byFailureReason[result.failureReasonCode] =\n (byFailureReason[result.failureReasonCode] ?? 0) + 1;\n }\n }\n\n return {\n total,\n mean,\n median,\n min,\n max,\n standardDeviation,\n histogram,\n topResults,\n bottomResults,\n errorCount,\n errors,\n executionErrorCount,\n qualityFailureCount,\n passedCount,\n byFailureStage,\n byFailureReason,\n };\n}\n\nfunction formatScore(value: number): string {\n return value.toFixed(3);\n}\n\nexport function formatEvaluationSummary(summary: EvaluationSummary): string {\n if (summary.total === 0) {\n return '\\nNo results to summarize';\n }\n\n const lines: string[] = [];\n\n // Display errors first if any exist\n if (summary.errorCount > 0) {\n lines.push('\\n==================================================');\n lines.push('EXECUTION ERRORS');\n lines.push('==================================================');\n for (const error of summary.errors) {\n lines.push(`\\n❌ ${error.testId}`);\n lines.push(` ${error.error}`);\n }\n lines.push('');\n }\n\n lines.push('\\n==================================================');\n lines.push('EVALUATION SUMMARY');\n lines.push('==================================================');\n lines.push(`Total tests: ${summary.total}`);\n lines.push(`Passed: ${summary.passedCount}`);\n if (summary.qualityFailureCount > 0) {\n lines.push(`Quality failures: ${summary.qualityFailureCount}`);\n }\n if (summary.executionErrorCount > 0) {\n lines.push(`Execution errors: ${summary.executionErrorCount}`);\n }\n\n if (summary.executionErrorCount > 0) {\n const qualityCount = summary.total - summary.executionErrorCount;\n lines.push(\n `Mean score: ${formatScore(summary.mean)} (${qualityCount} quality tests, ${summary.executionErrorCount} execution errors excluded)`,\n );\n } else {\n lines.push(`Mean score: ${formatScore(summary.mean)}`);\n }\n lines.push(`Median score: ${formatScore(summary.median)}`);\n lines.push(`Min score: ${formatScore(summary.min)}`);\n lines.push(`Max score: ${formatScore(summary.max)}`);\n if (typeof summary.standardDeviation === 'number') {\n lines.push(`Std deviation: ${formatScore(summary.standardDeviation)}`);\n }\n\n lines.push('\\nScore distribution:');\n for (const bin of summary.histogram) {\n const [start, end] = bin.range;\n lines.push(` ${start.toFixed(1)}-${end.toFixed(1)}: ${bin.count}`);\n }\n\n lines.push('\\nTop performing tests:');\n summary.topResults.forEach((result, index) => {\n lines.push(` ${index + 1}. ${result.testId}: ${formatScore(result.score)}`);\n });\n\n lines.push('\\nLowest performing tests:');\n summary.bottomResults.forEach((result, index) => {\n lines.push(` ${index + 1}. ${result.testId}: ${formatScore(result.score)}`);\n });\n\n const failureStageEntries = Object.entries(summary.byFailureStage);\n if (failureStageEntries.length > 0) {\n lines.push('\\nExecution errors by stage:');\n for (const [stage, count] of failureStageEntries) {\n lines.push(` ${stage}: ${count}`);\n }\n }\n\n const failureReasonEntries = Object.entries(summary.byFailureReason);\n if (failureReasonEntries.length > 0) {\n lines.push('\\nExecution errors by reason:');\n for (const [reason, count] of failureReasonEntries) {\n lines.push(` ${reason}: ${count}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format a matrix summary table showing tests × targets.\n */\nexport function formatMatrixSummary(results: readonly EvaluationResult[]): string {\n // Collect unique targets and test IDs\n const targetSet = new Set<string>();\n const testIdSet = new Set<string>();\n for (const result of results) {\n targetSet.add(result.target);\n testIdSet.add(result.testId);\n }\n\n const targets = [...targetSet].sort();\n const testIds = [...testIdSet].sort();\n\n if (targets.length < 2) {\n return '';\n }\n\n // Build lookup: testId -> target -> score\n const scoreMap = new Map<string, Map<string, number>>();\n for (const result of results) {\n if (!scoreMap.has(result.testId)) {\n scoreMap.set(result.testId, new Map());\n }\n scoreMap.get(result.testId)?.set(result.target, result.score);\n }\n\n const lines: string[] = [];\n lines.push('\\n==================================================');\n lines.push('MATRIX RESULTS (tests × targets)');\n lines.push('==================================================');\n\n // Header row\n const testIdColWidth = Math.max(7, ...testIds.map((id) => id.length));\n const targetColWidth = Math.max(7, ...targets.map((t) => t.length));\n const header = `${'Test'.padEnd(testIdColWidth)} ${targets.map((t) => t.padEnd(targetColWidth)).join(' ')}`;\n lines.push(header);\n lines.push('-'.repeat(header.length));\n\n // Data rows\n for (const testId of testIds) {\n const cells = targets.map((target) => {\n const score = scoreMap.get(testId)?.get(target);\n return score !== undefined\n ? formatScore(score).padEnd(targetColWidth)\n : '-'.padEnd(targetColWidth);\n });\n lines.push(`${testId.padEnd(testIdColWidth)} ${cells.join(' ')}`);\n }\n\n // Per-target averages\n lines.push('-'.repeat(header.length));\n const avgCells = targets.map((target) => {\n const scores = results.filter((r) => r.target === target).map((r) => r.score);\n const avg = scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0;\n return formatScore(avg).padEnd(targetColWidth);\n });\n lines.push(`${'Average'.padEnd(testIdColWidth)} ${avgCells.join(' ')}`);\n\n return lines.join('\\n');\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport type { FileType } from './types.js';\n\nconst SCHEMA_EVAL_V2 = 'agentv-eval-v2';\nconst SCHEMA_TARGETS_V2 = 'agentv-targets-v2.2';\nconst SCHEMA_CONFIG_V2 = 'agentv-config-v2';\n\n/**\n * Detect file type by reading $schema field from YAML file.\n * If $schema is missing, infers type from filename/path:\n * - config.yaml under .agentv folder → 'config'\n * - targets.yaml under .agentv folder → 'targets'\n * - All other YAML files → 'eval' (default)\n */\nexport async function detectFileType(filePath: string): Promise<FileType> {\n try {\n const content = await readFile(filePath, 'utf8');\n const parsed = parse(content) as unknown;\n\n if (typeof parsed !== 'object' || parsed === null) {\n return inferFileTypeFromPath(filePath);\n }\n\n const record = parsed as Record<string, unknown>;\n const schema = record.$schema;\n\n if (typeof schema !== 'string') {\n // No $schema field - infer from path\n return inferFileTypeFromPath(filePath);\n }\n\n switch (schema) {\n case SCHEMA_EVAL_V2:\n return 'eval';\n case SCHEMA_TARGETS_V2:\n return 'targets';\n case SCHEMA_CONFIG_V2:\n return 'config';\n default:\n // Unknown schema - infer from path\n return inferFileTypeFromPath(filePath);\n }\n } catch {\n return inferFileTypeFromPath(filePath);\n }\n}\n\n/**\n * Infer file type from filename and directory path.\n */\nfunction inferFileTypeFromPath(filePath: string): FileType {\n const normalized = path.normalize(filePath).replace(/\\\\/g, '/');\n const basename = path.basename(filePath);\n\n // Check if file is under .agentv folder\n if (normalized.includes('/.agentv/')) {\n if (basename === 'config.yaml' || basename === 'config.yml') {\n return 'config';\n }\n if (basename === 'targets.yaml' || basename === 'targets.yml') {\n return 'targets';\n }\n }\n\n // Default to eval file\n return 'eval';\n}\n\n/**\n * Check if a schema value is a valid AgentV schema identifier.\n */\nexport function isValidSchema(schema: unknown): boolean {\n return schema === SCHEMA_EVAL_V2 || schema === SCHEMA_TARGETS_V2 || schema === SCHEMA_CONFIG_V2;\n}\n\n/**\n * Get the expected schema for a file type.\n */\nexport function getExpectedSchema(fileType: FileType): string | undefined {\n switch (fileType) {\n case 'eval':\n return SCHEMA_EVAL_V2;\n case 'targets':\n return SCHEMA_TARGETS_V2;\n case 'config':\n return SCHEMA_CONFIG_V2;\n default:\n return undefined;\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport { isEvaluatorKind } from '../types.js';\nimport type { ValidationError, ValidationResult } from './types.js';\n\ntype JsonValue = string | number | boolean | null | JsonObject | JsonArray;\ntype JsonObject = { readonly [key: string]: JsonValue };\ntype JsonArray = readonly JsonValue[];\n\n/** Assertion evaluator types that require a string `value` field. */\nconst ASSERTION_TYPES_WITH_STRING_VALUE = new Set([\n 'contains',\n 'icontains',\n 'starts-with',\n 'ends-with',\n 'equals',\n 'regex',\n]);\n/** Assertion evaluator types that require a string[] `value` field. */\nconst ASSERTION_TYPES_WITH_ARRAY_VALUE = new Set([\n 'contains-any',\n 'contains-all',\n 'icontains-any',\n 'icontains-all',\n]);\n\n/** Valid file extensions for external test files. */\nconst VALID_TEST_FILE_EXTENSIONS = new Set(['.yaml', '.yml', '.jsonl']);\n\n/** Name field pattern: lowercase alphanumeric with hyphens. */\nconst NAME_PATTERN = /^[a-z0-9-]+$/;\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Validate an eval file (agentv-eval-v2 schema).\n */\nexport async function validateEvalFile(filePath: string): Promise<ValidationResult> {\n const errors: ValidationError[] = [];\n const absolutePath = path.resolve(filePath);\n\n let parsed: unknown;\n try {\n const content = await readFile(absolutePath, 'utf8');\n parsed = parse(content);\n } catch (error) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n message: `Failed to parse YAML: ${(error as Error).message}`,\n });\n return {\n valid: false,\n filePath: absolutePath,\n fileType: 'eval',\n errors,\n };\n }\n\n if (!isObject(parsed)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n message: 'File must contain a YAML object',\n });\n return {\n valid: false,\n filePath: absolutePath,\n fileType: 'eval',\n errors,\n };\n }\n\n // Validate metadata fields\n validateMetadata(parsed, absolutePath, errors);\n\n // Validate suite-level input (optional: string shorthand or message array)\n const suiteInput = parsed.input;\n if (suiteInput !== undefined) {\n if (typeof suiteInput === 'string') {\n // String shorthand is valid\n } else if (Array.isArray(suiteInput)) {\n validateMessages(suiteInput, 'input', absolutePath, errors);\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'input',\n message: \"Invalid suite-level 'input' field (must be a string or array of messages)\",\n });\n }\n }\n\n // Resolve tests with backward-compat aliases\n let cases: JsonValue | undefined = parsed.tests;\n if (cases === undefined && 'eval_cases' in parsed) {\n cases = parsed.eval_cases;\n errors.push({\n severity: 'warning',\n filePath: absolutePath,\n location: 'eval_cases',\n message: \"'eval_cases' is deprecated. Use 'tests' instead.\",\n });\n }\n if (cases === undefined && 'evalcases' in parsed) {\n cases = parsed.evalcases;\n errors.push({\n severity: 'warning',\n filePath: absolutePath,\n location: 'evalcases',\n message: \"'evalcases' is deprecated. Use 'tests' instead.\",\n });\n }\n\n // tests can be a string path (external file reference) or an array\n if (typeof cases === 'string') {\n validateTestsStringPath(cases, absolutePath, errors);\n return {\n valid: errors.filter((e) => e.severity === 'error').length === 0,\n filePath: absolutePath,\n fileType: 'eval',\n errors,\n };\n }\n\n if (!Array.isArray(cases)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'tests',\n message: \"Missing or invalid 'tests' field (must be an array or a file path string)\",\n });\n return {\n valid: errors.length === 0,\n filePath: absolutePath,\n fileType: 'eval',\n errors,\n };\n }\n\n // Validate each eval case\n for (let i = 0; i < cases.length; i++) {\n const evalCase = cases[i];\n const location = `tests[${i}]`;\n\n if (!isObject(evalCase)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message: 'Eval case must be an object',\n });\n continue;\n }\n\n // Required fields: id, input\n const id = evalCase.id;\n if (typeof id !== 'string' || id.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.id`,\n message: \"Missing or invalid 'id' field (must be a non-empty string)\",\n });\n }\n\n // Optional: criteria (with backward-compat alias expected_outcome)\n let criteria: JsonValue | undefined = evalCase.criteria;\n if (criteria === undefined && 'expected_outcome' in evalCase) {\n criteria = evalCase.expected_outcome;\n errors.push({\n severity: 'warning',\n filePath: absolutePath,\n location: `${location}.expected_outcome`,\n message: \"'expected_outcome' is deprecated. Use 'criteria' instead.\",\n });\n }\n if (criteria !== undefined && (typeof criteria !== 'string' || criteria.trim().length === 0)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.criteria`,\n message: \"Invalid 'criteria' field (must be a non-empty string if provided)\",\n });\n }\n\n // input field (string shorthand or message array)\n const inputField = evalCase.input;\n if (inputField !== undefined) {\n if (typeof inputField === 'string') {\n // String shorthand is valid - no further validation needed\n } else if (Array.isArray(inputField)) {\n validateMessages(inputField, `${location}.input`, absolutePath, errors);\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.input`,\n message: \"Invalid 'input' field (must be a string or array of messages)\",\n });\n }\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.input`,\n message: \"Missing 'input' field (must be a string or array of messages)\",\n });\n }\n\n // expected_output field (string/object shorthand or message array)\n const expectedOutputField = evalCase.expected_output;\n if (expectedOutputField !== undefined) {\n if (typeof expectedOutputField === 'string') {\n // String shorthand is valid - no further validation needed\n } else if (Array.isArray(expectedOutputField)) {\n // Check if it looks like a message array (first element has 'role')\n if (\n expectedOutputField.length > 0 &&\n isObject(expectedOutputField[0]) &&\n 'role' in expectedOutputField[0]\n ) {\n validateMessages(\n expectedOutputField,\n `${location}.expected_output`,\n absolutePath,\n errors,\n );\n }\n // Otherwise it's treated as structured array content - valid\n } else if (isObject(expectedOutputField)) {\n // Object shorthand or single message - both are valid\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.expected_output`,\n message: \"Invalid 'expected_output' field (must be a string, object, or array)\",\n });\n }\n }\n\n // assert field (array of assertion objects)\n const assertField = evalCase.assert;\n if (assertField !== undefined) {\n validateAssertArray(assertField, location, absolutePath, errors);\n }\n }\n\n // Validate workspace repo lifecycle config\n if (isObject(parsed.workspace)) {\n validateWorkspaceRepoConfig(parsed.workspace, absolutePath, errors);\n }\n\n return {\n valid: errors.filter((e) => e.severity === 'error').length === 0,\n filePath: absolutePath,\n fileType: 'eval',\n errors,\n };\n}\n\nfunction validateWorkspaceRepoConfig(\n workspace: JsonObject,\n filePath: string,\n errors: ValidationError[],\n): void {\n const repos = workspace.repos;\n const hooks = workspace.hooks;\n const afterEachHook = isObject(hooks) ? hooks.after_each : undefined;\n const isolation = workspace.isolation;\n\n // Depth vs ancestor warning\n if (Array.isArray(repos)) {\n for (const repo of repos) {\n if (!isObject(repo)) continue;\n const checkout = repo.checkout;\n const clone = repo.clone;\n if (isObject(checkout) && isObject(clone)) {\n const ancestor = checkout.ancestor;\n const depth = clone.depth;\n if (typeof ancestor === 'number' && typeof depth === 'number' && depth < ancestor + 1) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `workspace.repos[path=${repo.path}]`,\n message:\n `clone.depth (${depth}) may be insufficient for checkout.ancestor (${ancestor}). ` +\n `Recommend depth >= ${ancestor + 1}.`,\n });\n }\n }\n }\n }\n\n // Reset without repos warning\n if (isObject(afterEachHook) && afterEachHook.reset && afterEachHook.reset !== 'none') {\n if (!Array.isArray(repos) || repos.length === 0) {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'workspace.hooks.after_each',\n message: `hooks.after_each.reset '${afterEachHook.reset}' has no effect without repos.`,\n });\n }\n }\n\n // after_each reset with per_test isolation warning\n if (isObject(afterEachHook) && afterEachHook.reset && isolation === 'per_test') {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'workspace.hooks.after_each',\n message:\n 'hooks.after_each.reset is redundant with isolation: per_test (each test gets a fresh workspace).',\n });\n }\n}\n\nfunction validateMessages(\n messages: JsonArray,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i];\n const msgLocation = `${location}[${i}]`;\n\n if (!isObject(message)) {\n errors.push({\n severity: 'error',\n filePath,\n location: msgLocation,\n message: 'Message must be an object',\n });\n continue;\n }\n\n // Validate role field\n const role = message.role;\n const validRoles = ['system', 'user', 'assistant'];\n if (!validRoles.includes(role as string)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${msgLocation}.role`,\n message: `Invalid role '${role}'. Must be one of: ${validRoles.join(', ')}`,\n });\n }\n\n // Validate content field (can be string or array)\n const content = message.content;\n if (typeof content === 'string') {\n validateContentForRoleMarkers(content, `${msgLocation}.content`, filePath, errors);\n } else if (Array.isArray(content)) {\n // Array content - validate each element\n for (let j = 0; j < content.length; j++) {\n const contentItem = content[j];\n const contentLocation = `${msgLocation}.content[${j}]`;\n\n if (typeof contentItem === 'string') {\n validateContentForRoleMarkers(contentItem, contentLocation, filePath, errors);\n } else if (isObject(contentItem)) {\n const type = contentItem.type;\n if (typeof type !== 'string') {\n errors.push({\n severity: 'error',\n filePath,\n location: `${contentLocation}.type`,\n message: \"Content object must have a 'type' field\",\n });\n }\n\n // For 'file' type, we'll validate existence later in file-reference-validator\n // For 'text' type, require 'value' field\n if (type === 'text') {\n const value = contentItem.value;\n if (typeof value !== 'string') {\n errors.push({\n severity: 'error',\n filePath,\n location: `${contentLocation}.value`,\n message: \"Content with type 'text' must have a 'value' field\",\n });\n } else {\n validateContentForRoleMarkers(value, `${contentLocation}.value`, filePath, errors);\n }\n }\n } else {\n errors.push({\n severity: 'error',\n filePath,\n location: contentLocation,\n message: 'Content array items must be strings or objects',\n });\n }\n }\n } else {\n errors.push({\n severity: 'error',\n filePath,\n location: `${msgLocation}.content`,\n message: \"Missing or invalid 'content' field (must be a string or array)\",\n });\n }\n }\n}\n\nfunction validateMetadata(parsed: JsonObject, filePath: string, errors: ValidationError[]): void {\n const name = parsed.name;\n if (name !== undefined) {\n if (typeof name === 'string') {\n if (!NAME_PATTERN.test(name)) {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'name',\n message: `Invalid 'name' format '${name}'. Must match pattern /^[a-z0-9-]+$/ (lowercase alphanumeric with hyphens).`,\n });\n }\n }\n\n // Warn if name is present but description is missing\n if (!('description' in parsed) || parsed.description === undefined) {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'name',\n message: \"When 'name' is present, 'description' should also be provided.\",\n });\n }\n }\n}\n\nfunction validateTestsStringPath(\n testsPath: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n const ext = path.extname(testsPath);\n if (!VALID_TEST_FILE_EXTENSIONS.has(ext)) {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'tests',\n message: `Unsupported file extension '${ext}' for tests path '${testsPath}'. Supported extensions: ${[...VALID_TEST_FILE_EXTENSIONS].join(', ')}`,\n });\n }\n}\n\nfunction validateAssertArray(\n assertField: JsonValue,\n parentLocation: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (!Array.isArray(assertField)) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${parentLocation}.assert`,\n message: \"'assert' must be an array of assertion objects.\",\n });\n return;\n }\n\n for (let i = 0; i < assertField.length; i++) {\n const item = assertField[i];\n const location = `${parentLocation}.assert[${i}]`;\n\n if (!isObject(item)) {\n errors.push({\n severity: 'warning',\n filePath,\n location,\n message: 'Assertion item must be an object with a type field.',\n });\n continue;\n }\n\n // Validate type field\n const rawTypeValue = item.type;\n if (rawTypeValue === undefined || typeof rawTypeValue !== 'string') {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.type`,\n message: \"Assertion item is missing a 'type' field.\",\n });\n continue;\n }\n\n // Normalize snake_case to kebab-case for backward compatibility\n const typeValue = rawTypeValue.replace(/_/g, '-');\n\n if (!isEvaluatorKind(typeValue)) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.type`,\n message: `Unknown assertion type '${rawTypeValue}'.`,\n });\n continue;\n }\n\n // Validate value field for types that require a string value\n if (ASSERTION_TYPES_WITH_STRING_VALUE.has(typeValue)) {\n const value = item.value;\n if (value === undefined || typeof value !== 'string') {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.value`,\n message: `Assertion type '${typeValue}' requires a 'value' field (string).`,\n });\n continue;\n }\n\n // For regex type, validate that the pattern is valid\n if (typeValue === 'regex') {\n try {\n new RegExp(value);\n } catch {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.value`,\n message: `Invalid regex pattern '${value}': not a valid regular expression.`,\n });\n }\n }\n }\n\n // Validate value field for types that require a string array value\n if (ASSERTION_TYPES_WITH_ARRAY_VALUE.has(typeValue)) {\n const value = item.value;\n if (!Array.isArray(value) || value.length === 0) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.value`,\n message: `Assertion type '${typeValue}' requires a 'value' field (non-empty string array).`,\n });\n continue;\n }\n }\n\n // Validate required field if present\n const required = item.required;\n if (required !== undefined) {\n validateRequiredField(required, location, filePath, errors);\n }\n }\n}\n\nfunction validateRequiredField(\n required: JsonValue,\n parentLocation: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (typeof required === 'boolean') {\n return; // Valid\n }\n if (typeof required === 'number') {\n if (required <= 0 || required > 1) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${parentLocation}.required`,\n message: `Invalid 'required' value ${required}. When a number, it must be between 0 (exclusive) and 1 (inclusive).`,\n });\n }\n return;\n }\n errors.push({\n severity: 'warning',\n filePath,\n location: `${parentLocation}.required`,\n message: `Invalid 'required' value. Must be a boolean or a number between 0 (exclusive) and 1 (inclusive).`,\n });\n}\n\nfunction validateContentForRoleMarkers(\n content: string,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n // Check for standard role markers that might confuse agentic providers\n const markers = ['@[System]:', '@[User]:', '@[Assistant]:', '@[Tool]:'];\n for (const marker of markers) {\n if (content.toLowerCase().includes(marker.toLowerCase())) {\n errors.push({\n severity: 'warning',\n filePath,\n location,\n message: `Content contains potential role marker '${marker}'. This may confuse agentic providers or cause prompt injection.`,\n });\n }\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport { CLI_PLACEHOLDERS } from '../providers/targets.js';\nimport { KNOWN_PROVIDERS, PROVIDER_ALIASES } from '../providers/types.js';\nimport type { ValidationError, ValidationResult } from './types.js';\n\ntype JsonValue = string | number | boolean | null | JsonObject | JsonArray;\ntype JsonObject = { readonly [key: string]: JsonValue };\ntype JsonArray = readonly JsonValue[];\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n// Known settings properties for each provider type\nconst COMMON_SETTINGS = new Set(['provider_batching', 'providerBatching']);\n\nconst RETRY_SETTINGS = new Set([\n 'max_retries',\n 'maxRetries',\n 'retry_initial_delay_ms',\n 'retryInitialDelayMs',\n 'retry_max_delay_ms',\n 'retryMaxDelayMs',\n 'retry_backoff_factor',\n 'retryBackoffFactor',\n 'retry_status_codes',\n 'retryStatusCodes',\n]);\n\nconst AZURE_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n ...RETRY_SETTINGS,\n 'endpoint',\n 'resource',\n 'resourceName',\n 'api_key',\n 'apiKey',\n 'deployment',\n 'deploymentName',\n 'model',\n 'version',\n 'api_version',\n 'temperature',\n 'max_output_tokens',\n 'maxTokens',\n]);\n\nconst ANTHROPIC_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n ...RETRY_SETTINGS,\n 'api_key',\n 'apiKey',\n 'model',\n 'deployment',\n 'variant',\n 'temperature',\n 'max_output_tokens',\n 'maxTokens',\n 'thinking_budget',\n 'thinkingBudget',\n]);\n\nconst GEMINI_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n ...RETRY_SETTINGS,\n 'api_key',\n 'apiKey',\n 'model',\n 'deployment',\n 'variant',\n 'temperature',\n 'max_output_tokens',\n 'maxTokens',\n]);\n\nconst CODEX_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'model',\n 'executable',\n 'command',\n 'binary',\n 'args',\n 'arguments',\n 'cwd',\n 'timeout_seconds',\n 'timeoutSeconds',\n 'log_dir',\n 'logDir',\n 'log_directory',\n 'logDirectory',\n 'log_format',\n 'logFormat',\n 'log_output_format',\n 'logOutputFormat',\n 'system_prompt',\n 'systemPrompt',\n 'workspace_template',\n 'workspaceTemplate',\n]);\n\nconst COPILOT_SDK_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'cli_url',\n 'cliUrl',\n 'cli_path',\n 'cliPath',\n 'github_token',\n 'githubToken',\n 'model',\n 'cwd',\n 'timeout_seconds',\n 'timeoutSeconds',\n 'log_dir',\n 'logDir',\n 'log_format',\n 'logFormat',\n 'system_prompt',\n 'systemPrompt',\n 'workspace_template',\n 'workspaceTemplate',\n]);\n\nconst COPILOT_CLI_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'executable',\n 'command',\n 'binary',\n 'args',\n 'arguments',\n 'model',\n 'cwd',\n 'timeout_seconds',\n 'timeoutSeconds',\n 'log_dir',\n 'logDir',\n 'log_format',\n 'logFormat',\n 'system_prompt',\n 'systemPrompt',\n 'workspace_template',\n 'workspaceTemplate',\n]);\n\nconst VSCODE_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'executable',\n 'workspace_template',\n 'workspaceTemplate',\n 'wait',\n 'dry_run',\n 'dryRun',\n 'subagent_root',\n 'subagentRoot',\n 'timeout_seconds',\n 'timeoutSeconds',\n]);\n\nconst MOCK_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'response',\n 'delayMs',\n 'delayMinMs',\n 'delayMaxMs',\n 'trace', // For testing tool-trajectory evaluator\n]);\n\n// CLI_SETTINGS removed - Zod schema validation now handles CLI provider settings validation\n// in resolveCliConfig() via CliTargetInputSchema\n\nconst CLAUDE_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'model',\n 'cwd',\n 'timeout_seconds',\n 'timeoutSeconds',\n 'log_dir',\n 'logDir',\n 'log_directory',\n 'logDirectory',\n 'log_format',\n 'logFormat',\n 'log_output_format',\n 'logOutputFormat',\n 'system_prompt',\n 'systemPrompt',\n 'workspace_template',\n 'workspaceTemplate',\n 'max_turns',\n 'maxTurns',\n 'max_budget_usd',\n 'maxBudgetUsd',\n]);\n\nfunction getKnownSettings(provider: string): Set<string> | null {\n const normalizedProvider = provider.toLowerCase();\n switch (normalizedProvider) {\n case 'azure':\n case 'azure-openai':\n return AZURE_SETTINGS;\n case 'anthropic':\n return ANTHROPIC_SETTINGS;\n case 'gemini':\n case 'google':\n case 'google-gemini':\n return GEMINI_SETTINGS;\n case 'codex':\n case 'codex-cli':\n return CODEX_SETTINGS;\n case 'copilot-sdk':\n case 'copilot_sdk':\n return COPILOT_SDK_SETTINGS;\n case 'copilot':\n case 'copilot-cli':\n return COPILOT_CLI_SETTINGS;\n case 'claude':\n case 'claude-code':\n case 'claude-sdk':\n return CLAUDE_SETTINGS;\n case 'vscode':\n case 'vscode-insiders':\n return VSCODE_SETTINGS;\n case 'mock':\n return MOCK_SETTINGS;\n case 'cli':\n // CLI provider validation is now handled by Zod schema in resolveCliConfig()\n // Return null to skip duplicate validation in validateUnknownSettings()\n return null;\n default:\n return null; // Unknown provider, can't validate settings\n }\n}\n\nfunction validateUnknownSettings(\n target: JsonObject,\n provider: string,\n absolutePath: string,\n location: string,\n errors: ValidationError[],\n): void {\n const removedTargetFields = new Set(['workspace_template', 'workspaceTemplate']);\n const knownSettings = getKnownSettings(provider);\n if (!knownSettings) {\n // Unknown provider, skip settings validation\n return;\n }\n\n // Known base target fields that aren't settings\n const baseFields = new Set(['name', 'provider', 'judge_target', 'workers', '$schema', 'targets']);\n\n for (const key of Object.keys(target)) {\n if (removedTargetFields.has(key)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.${key}`,\n message:\n 'target-level workspace_template has been removed. Use eval-level workspace.template.',\n });\n continue;\n }\n\n if (!baseFields.has(key) && !knownSettings.has(key)) {\n errors.push({\n severity: 'warning',\n filePath: absolutePath,\n location: `${location}.${key}`,\n message: `Unknown setting '${key}' for ${provider} provider. This property will be ignored.`,\n });\n }\n }\n}\n\n/**\n * Validate a targets file (agentv-targets-v2.1 schema).\n */\nexport async function validateTargetsFile(filePath: string): Promise<ValidationResult> {\n const errors: ValidationError[] = [];\n const absolutePath = path.resolve(filePath);\n\n let parsed: unknown;\n try {\n const content = await readFile(absolutePath, 'utf8');\n parsed = parse(content);\n } catch (error) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n message: `Failed to parse YAML: ${(error as Error).message}`,\n });\n return {\n valid: false,\n filePath: absolutePath,\n fileType: 'targets',\n errors,\n };\n }\n\n /**\n * Simplified CLI settings validation for early file validation.\n * Detailed type checking is now handled by Zod schema validation in resolveCliConfig().\n * This function focuses on critical early checks: command template presence and placeholder validation.\n */\n function validateCliSettings(\n target: JsonObject,\n absolutePath: string,\n location: string,\n errors: ValidationError[],\n ): void {\n // Critical check: command is required\n const command = target.command;\n if (typeof command !== 'string' || command.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.command`,\n message: \"CLI provider requires 'command' as a non-empty string\",\n });\n } else {\n // Validate CLI placeholders early to give helpful feedback\n recordUnknownPlaceholders(command, absolutePath, `${location}.command`, errors);\n }\n\n // Early validation of healthcheck structure and placeholders\n const healthcheck = target.healthcheck;\n if (healthcheck !== undefined) {\n validateCliHealthcheck(healthcheck, absolutePath, `${location}.healthcheck`, errors);\n }\n }\n\n function validateCliHealthcheck(\n healthcheck: unknown,\n absolutePath: string,\n location: string,\n errors: ValidationError[],\n ): void {\n if (!isObject(healthcheck)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message: \"'healthcheck' must be an object when provided\",\n });\n return;\n }\n\n const timeoutSeconds = healthcheck.timeout_seconds ?? healthcheck.timeoutSeconds;\n if (timeoutSeconds !== undefined) {\n const numericTimeout = Number(timeoutSeconds);\n if (!Number.isFinite(numericTimeout) || numericTimeout <= 0) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.timeoutSeconds`,\n message: 'healthcheck.timeoutSeconds must be a positive number when provided',\n });\n }\n }\n\n // Determine healthcheck type by presence of url or command\n const hasUrl = typeof healthcheck.url === 'string' && healthcheck.url.trim().length > 0;\n const hasCommand =\n typeof healthcheck.command === 'string' && healthcheck.command.trim().length > 0;\n\n if (!hasUrl && !hasCommand) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message: \"healthcheck must have either 'url' (HTTP) or 'command' (command)\",\n });\n return;\n }\n\n if (hasUrl) {\n // HTTP healthcheck — url already validated above\n return;\n }\n\n // Command healthcheck\n recordUnknownPlaceholders(\n healthcheck.command as string,\n absolutePath,\n `${location}.command`,\n errors,\n );\n\n const cwd = healthcheck.cwd;\n if (cwd !== undefined && typeof cwd !== 'string') {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.cwd`,\n message: 'healthcheck.cwd must be a string when provided',\n });\n }\n }\n\n function recordUnknownPlaceholders(\n template: string,\n absolutePath: string,\n location: string,\n errors: ValidationError[],\n ): void {\n const placeholders = extractPlaceholders(template);\n for (const placeholder of placeholders) {\n if (!CLI_PLACEHOLDERS.has(placeholder)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message: `Unknown CLI placeholder '{${placeholder}}'. Supported placeholders: ${Array.from(CLI_PLACEHOLDERS).join(', ')}`,\n });\n }\n }\n }\n\n function extractPlaceholders(template: string): string[] {\n const matches = template.matchAll(/\\{([A-Z_]+)\\}/g);\n const result: string[] = [];\n for (const match of matches) {\n const placeholder = match[1];\n if (placeholder) {\n result.push(placeholder);\n }\n }\n return result;\n }\n\n if (!isObject(parsed)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n message: 'File must contain a YAML object',\n });\n return {\n valid: false,\n filePath: absolutePath,\n fileType: 'targets',\n errors,\n };\n }\n\n // Validate targets array\n const targets = parsed.targets;\n if (!Array.isArray(targets)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'targets',\n message: \"Missing or invalid 'targets' field (must be an array)\",\n });\n return {\n valid: errors.length === 0,\n filePath: absolutePath,\n fileType: 'targets',\n errors,\n };\n }\n\n // Validate each target definition\n const knownProviders = [...KNOWN_PROVIDERS, ...PROVIDER_ALIASES];\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n const location = `targets[${i}]`;\n\n if (!isObject(target)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message: 'Target must be an object',\n });\n continue;\n }\n\n // Required field: name\n const name = target.name;\n if (typeof name !== 'string' || name.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.name`,\n message: \"Missing or invalid 'name' field (must be a non-empty string)\",\n });\n }\n\n // Required field: provider\n const provider = target.provider;\n const providerValue = typeof provider === 'string' ? provider.trim().toLowerCase() : undefined;\n if (typeof provider !== 'string' || provider.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.provider`,\n message: \"Missing or invalid 'provider' field (must be a non-empty string)\",\n });\n } else if (!knownProviders.includes(provider)) {\n // Warning for unknown providers (non-fatal)\n errors.push({\n severity: 'warning',\n filePath: absolutePath,\n location: `${location}.provider`,\n message: `Unknown provider '${provider}'. Known providers: ${knownProviders.join(', ')}`,\n });\n }\n\n // Validate CLI provider fields\n if (providerValue === 'cli') {\n validateCliSettings(target, absolutePath, location, errors);\n }\n\n // Check for unknown settings properties on target object\n if (typeof provider === 'string') {\n validateUnknownSettings(target, provider, absolutePath, location, errors);\n }\n\n // Optional field: judge_target (must be string if present)\n const judgeTarget = target.judge_target;\n if (judgeTarget !== undefined && typeof judgeTarget !== 'string') {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.judge_target`,\n message: \"Invalid 'judge_target' field (must be a string)\",\n });\n }\n }\n\n return {\n valid: errors.filter((e) => e.severity === 'error').length === 0,\n filePath: absolutePath,\n fileType: 'targets',\n errors,\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport { parse } from 'yaml';\n\nimport type { ValidationError, ValidationResult } from './types.js';\n\n/**\n * Validate a config.yaml file for schema compliance and structural correctness.\n */\nexport async function validateConfigFile(filePath: string): Promise<ValidationResult> {\n const errors: ValidationError[] = [];\n\n try {\n const content = await readFile(filePath, 'utf8');\n const parsed = parse(content) as unknown;\n\n // Check if parsed content is an object\n if (typeof parsed !== 'object' || parsed === null) {\n errors.push({\n severity: 'error',\n filePath,\n message: 'Config file must contain a valid YAML object',\n });\n return { valid: false, filePath, fileType: 'config', errors };\n }\n\n const config = parsed as Record<string, unknown>;\n\n // Validate guideline_patterns if present\n const guidelinePatterns = config.guideline_patterns;\n if (guidelinePatterns !== undefined) {\n if (!Array.isArray(guidelinePatterns)) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'guideline_patterns',\n message: \"Field 'guideline_patterns' must be an array\",\n });\n } else if (!guidelinePatterns.every((p) => typeof p === 'string')) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'guideline_patterns',\n message: \"All entries in 'guideline_patterns' must be strings\",\n });\n } else if (guidelinePatterns.length === 0) {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'guideline_patterns',\n message: \"Field 'guideline_patterns' is empty. Consider removing it or adding patterns.\",\n });\n }\n }\n\n // Validate eval_patterns if present\n const evalPatterns = config.eval_patterns;\n if (evalPatterns !== undefined) {\n if (!Array.isArray(evalPatterns)) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'eval_patterns',\n message: \"Field 'eval_patterns' must be an array\",\n });\n } else if (!evalPatterns.every((p) => typeof p === 'string')) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'eval_patterns',\n message: \"All entries in 'eval_patterns' must be strings\",\n });\n } else if (evalPatterns.length === 0) {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'eval_patterns',\n message: \"Field 'eval_patterns' is empty. Consider removing it or adding patterns.\",\n });\n }\n }\n\n // Check for unexpected fields\n const allowedFields = new Set(['$schema', 'guideline_patterns', 'eval_patterns']);\n const unexpectedFields = Object.keys(config).filter((key) => !allowedFields.has(key));\n\n if (unexpectedFields.length > 0) {\n errors.push({\n severity: 'warning',\n filePath,\n message: `Unexpected fields: ${unexpectedFields.join(', ')}`,\n });\n }\n\n return {\n valid: errors.filter((e) => e.severity === 'error').length === 0,\n filePath,\n fileType: 'config',\n errors,\n };\n } catch (error) {\n errors.push({\n severity: 'error',\n filePath,\n message: `Failed to parse config file: ${(error as Error).message}`,\n });\n return { valid: false, filePath, fileType: 'config', errors };\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport { buildSearchRoots, findGitRoot, resolveFileReference } from '../file-utils.js';\nimport type { ValidationError } from './types.js';\n\ntype JsonValue = string | number | boolean | null | JsonObject | JsonArray;\ntype JsonObject = { readonly [key: string]: JsonValue };\ntype JsonArray = readonly JsonValue[];\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Validate that file references in eval file content exist.\n * Checks content blocks with type: \"file\" and validates the referenced file exists.\n * Also checks that referenced files are not empty.\n */\nexport async function validateFileReferences(\n evalFilePath: string,\n): Promise<readonly ValidationError[]> {\n const errors: ValidationError[] = [];\n const absolutePath = path.resolve(evalFilePath);\n\n // Find git root and build search roots (same as yaml-parser does at runtime)\n const gitRoot = await findGitRoot(absolutePath);\n if (!gitRoot) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n message: 'Cannot validate file references: git repository root not found',\n });\n return errors;\n }\n\n const searchRoots = buildSearchRoots(absolutePath, gitRoot);\n\n let parsed: unknown;\n try {\n const content = await readFile(absolutePath, 'utf8');\n parsed = parse(content);\n } catch {\n // Parse errors are already caught by eval-validator\n return errors;\n }\n\n if (!isObject(parsed)) {\n return errors;\n }\n\n let cases: JsonValue | undefined = parsed.tests;\n if (cases === undefined && 'eval_cases' in parsed) {\n cases = parsed.eval_cases;\n }\n if (cases === undefined && 'evalcases' in parsed) {\n cases = parsed.evalcases;\n }\n if (!Array.isArray(cases)) {\n return errors;\n }\n\n for (let i = 0; i < cases.length; i++) {\n const evalCase = cases[i];\n if (!isObject(evalCase)) {\n continue;\n }\n\n // Check input\n const inputField = evalCase.input;\n if (Array.isArray(inputField)) {\n await validateMessagesFileRefs(\n inputField,\n `tests[${i}].input`,\n searchRoots,\n absolutePath,\n errors,\n );\n }\n\n // Check expected_output\n const expectedOutputField = evalCase.expected_output;\n if (Array.isArray(expectedOutputField)) {\n await validateMessagesFileRefs(\n expectedOutputField,\n `tests[${i}].expected_output`,\n searchRoots,\n absolutePath,\n errors,\n );\n }\n }\n\n return errors;\n}\n\nasync function validateMessagesFileRefs(\n messages: JsonArray,\n location: string,\n searchRoots: readonly string[],\n filePath: string,\n errors: ValidationError[],\n): Promise<void> {\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i];\n if (!isObject(message)) {\n continue;\n }\n\n const content = message.content;\n if (typeof content === 'string') {\n continue;\n }\n\n if (!Array.isArray(content)) {\n continue;\n }\n\n for (let j = 0; j < content.length; j++) {\n const contentItem = content[j];\n if (!isObject(contentItem)) {\n continue;\n }\n\n const type = contentItem.type;\n if (type !== 'file') {\n continue;\n }\n\n const value = contentItem.value;\n if (typeof value !== 'string') {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}[${i}].content[${j}].value`,\n message: \"File reference must have a 'value' field with the file path\",\n });\n continue;\n }\n\n // Use the same file resolution logic as yaml-parser at runtime\n const { resolvedPath } = await resolveFileReference(value, searchRoots);\n\n if (!resolvedPath) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}[${i}].content[${j}]`,\n message: `Referenced file not found: ${value}`,\n });\n } else {\n // Check that file is not empty\n try {\n const fileContent = await readFile(resolvedPath, 'utf8');\n if (fileContent.trim().length === 0) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}[${i}].content[${j}]`,\n message: `Referenced file is empty: ${value}`,\n });\n }\n } catch (error) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}[${i}].content[${j}]`,\n message: `Cannot read referenced file: ${value} (${(error as Error).message})`,\n });\n }\n }\n }\n }\n}\n","import {\n type ResolvedTarget,\n type TargetDefinition,\n listTargetNames,\n readTargetDefinitions,\n readTestSuiteMetadata,\n resolveTargetDefinition,\n} from '@agentv/core';\nimport { validateTargetsFile } from '@agentv/core/evaluation/validation';\nimport { discoverTargetsFile } from '../../utils/targets.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RED = '\\u001b[31m';\nconst ANSI_RESET = '\\u001b[0m';\n\nfunction isTTY(): boolean {\n return process.stdout.isTTY ?? false;\n}\n\nexport async function readTestSuiteTarget(testFilePath: string): Promise<string | undefined> {\n const metadata = await readTestSuiteMetadata(testFilePath);\n return metadata.target;\n}\n\nexport async function readTestSuiteTargets(\n testFilePath: string,\n): Promise<readonly string[] | undefined> {\n const metadata = await readTestSuiteMetadata(testFilePath);\n return metadata.targets;\n}\n\nexport interface TargetSelection {\n readonly definitions: readonly TargetDefinition[];\n readonly resolvedTarget: ResolvedTarget;\n readonly targetName: string;\n readonly targetSource: 'cli' | 'test-file' | 'default';\n readonly targetsFilePath: string;\n}\n\nexport interface TargetSelectionOptions {\n readonly testFilePath: string;\n readonly repoRoot: string;\n readonly cwd: string;\n readonly explicitTargetsPath?: string;\n readonly cliTargetName?: string;\n readonly cliTargetNames?: readonly string[];\n readonly dryRun: boolean;\n readonly dryRunDelay: number;\n readonly dryRunDelayMin: number;\n readonly dryRunDelayMax: number;\n readonly env: NodeJS.ProcessEnv;\n}\n\nfunction pickTargetName(options: {\n readonly cliTargetName?: string;\n readonly fileTargetName?: string;\n}): { readonly name: string; readonly source: 'cli' | 'test-file' | 'default' } {\n const cliName = options.cliTargetName?.trim();\n if (cliName && cliName !== 'default') {\n return { name: cliName, source: 'cli' };\n }\n\n const fileName = options.fileTargetName?.trim();\n if (fileName && fileName.length > 0) {\n return { name: fileName, source: 'test-file' };\n }\n\n return { name: 'default', source: 'default' };\n}\n\nexport async function selectTarget(options: TargetSelectionOptions): Promise<TargetSelection> {\n const {\n testFilePath,\n repoRoot,\n cwd,\n explicitTargetsPath,\n cliTargetName,\n dryRun,\n dryRunDelay,\n dryRunDelayMin,\n dryRunDelayMax,\n env,\n } = options;\n\n const targetsFilePath = await discoverTargetsFile({\n explicitPath: explicitTargetsPath,\n testFilePath,\n repoRoot,\n cwd,\n });\n\n // Validate the targets file and show warnings\n const validationResult = await validateTargetsFile(targetsFilePath);\n const warnings = validationResult.errors.filter((e) => e.severity === 'warning');\n const useColors = isTTY();\n\n if (warnings.length > 0) {\n console.warn(`\\nWarnings in ${targetsFilePath}:`);\n for (const warning of warnings) {\n const location = warning.location ? ` [${warning.location}]` : '';\n const prefix = useColors ? `${ANSI_YELLOW} ⚠${ANSI_RESET}` : ' ⚠';\n const message = useColors ? `${ANSI_YELLOW}${warning.message}${ANSI_RESET}` : warning.message;\n console.warn(`${prefix}${location} ${message}`);\n }\n console.warn('');\n }\n\n // Check for errors (should fail if invalid)\n const errors = validationResult.errors.filter((e) => e.severity === 'error');\n if (errors.length > 0) {\n console.error(`\\nErrors in ${targetsFilePath}:`);\n for (const error of errors) {\n const location = error.location ? ` [${error.location}]` : '';\n const prefix = useColors ? `${ANSI_RED} ✗${ANSI_RESET}` : ' ✗';\n const message = useColors ? `${ANSI_RED}${error.message}${ANSI_RESET}` : error.message;\n console.error(`${prefix}${location} ${message}`);\n }\n throw new Error(`Targets file validation failed with ${errors.length} error(s)`);\n }\n\n const definitions = await readTargetDefinitions(targetsFilePath);\n const fileTargetName = await readTestSuiteTarget(testFilePath);\n const targetChoice = pickTargetName({ cliTargetName, fileTargetName });\n\n const targetDefinition = definitions.find(\n (definition: TargetDefinition) => definition.name === targetChoice.name,\n );\n if (!targetDefinition) {\n const available = listTargetNames(definitions).join(', ');\n throw new Error(\n `Target '${targetChoice.name}' not found in ${targetsFilePath}. Available targets: ${available}`,\n );\n }\n\n if (dryRun) {\n const mockTarget: ResolvedTarget = {\n kind: 'mock',\n name: `${targetDefinition.name}-dry-run`,\n judgeTarget: undefined,\n config: {\n response: '{\"answer\":\"Mock dry-run response\"}',\n delayMs: dryRunDelay,\n delayMinMs: dryRunDelayMin,\n delayMaxMs: dryRunDelayMax,\n },\n };\n\n return {\n definitions,\n resolvedTarget: mockTarget,\n targetName: targetChoice.name,\n targetSource: targetChoice.source,\n targetsFilePath,\n };\n }\n\n try {\n const resolvedTarget = resolveTargetDefinition(targetDefinition, env, testFilePath);\n return {\n definitions,\n resolvedTarget,\n targetName: targetChoice.name,\n targetSource: targetChoice.source,\n targetsFilePath,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to resolve target '${targetChoice.name}': ${message}`);\n }\n}\n\n/**\n * Select multiple targets for matrix evaluation.\n * Returns an array of TargetSelection, one per target name.\n */\nexport async function selectMultipleTargets(\n options: TargetSelectionOptions & { readonly targetNames: readonly string[] },\n): Promise<readonly TargetSelection[]> {\n const {\n testFilePath,\n repoRoot,\n cwd,\n explicitTargetsPath,\n dryRun,\n dryRunDelay,\n dryRunDelayMin,\n dryRunDelayMax,\n env,\n targetNames,\n } = options;\n\n const targetsFilePath = await discoverTargetsFile({\n explicitPath: explicitTargetsPath,\n testFilePath,\n repoRoot,\n cwd,\n });\n\n // Validate targets file once\n const validationResult = await validateTargetsFile(targetsFilePath);\n const warnings = validationResult.errors.filter((e) => e.severity === 'warning');\n const useColors = isTTY();\n if (warnings.length > 0) {\n console.warn(`\\nWarnings in ${targetsFilePath}:`);\n for (const warning of warnings) {\n const location = warning.location ? ` [${warning.location}]` : '';\n const prefix = useColors ? `${ANSI_YELLOW} ⚠${ANSI_RESET}` : ' ⚠';\n const message = useColors ? `${ANSI_YELLOW}${warning.message}${ANSI_RESET}` : warning.message;\n console.warn(`${prefix}${location} ${message}`);\n }\n console.warn('');\n }\n const errors = validationResult.errors.filter((e) => e.severity === 'error');\n if (errors.length > 0) {\n console.error(`\\nErrors in ${targetsFilePath}:`);\n for (const error of errors) {\n const location = error.location ? ` [${error.location}]` : '';\n const prefix = useColors ? `${ANSI_RED} ✗${ANSI_RESET}` : ' ✗';\n const message = useColors ? `${ANSI_RED}${error.message}${ANSI_RESET}` : error.message;\n console.error(`${prefix}${location} ${message}`);\n }\n throw new Error(`Targets file validation failed with ${errors.length} error(s)`);\n }\n\n const definitions = await readTargetDefinitions(targetsFilePath);\n const results: TargetSelection[] = [];\n\n for (const name of targetNames) {\n const targetDefinition = definitions.find(\n (definition: TargetDefinition) => definition.name === name,\n );\n if (!targetDefinition) {\n const available = listTargetNames(definitions).join(', ');\n throw new Error(\n `Target '${name}' not found in ${targetsFilePath}. Available targets: ${available}`,\n );\n }\n\n if (dryRun) {\n const mockTarget: ResolvedTarget = {\n kind: 'mock',\n name: `${targetDefinition.name}-dry-run`,\n judgeTarget: undefined,\n config: {\n response: '{\"answer\":\"Mock dry-run response\"}',\n delayMs: dryRunDelay,\n delayMinMs: dryRunDelayMin,\n delayMaxMs: dryRunDelayMax,\n },\n };\n results.push({\n definitions,\n resolvedTarget: mockTarget,\n targetName: name,\n targetSource: 'cli',\n targetsFilePath,\n });\n } else {\n try {\n const resolvedTarget = resolveTargetDefinition(targetDefinition, env, testFilePath);\n results.push({\n definitions,\n resolvedTarget,\n targetName: name,\n targetSource: 'cli',\n targetsFilePath,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to resolve target '${name}': ${message}`);\n }\n }\n }\n\n return results;\n}\n"],"mappings":"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,KAAK;QACV,UAAU;QACV;QACA;QACA,SAAS,2CAA2C,MAAM;MAC5D,CAAC;IACH;EACF;AACF;ACllBA,SAASG,UAAS,OAAqC;AACrD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAGA,IAAM,kBAAkB,oBAAI,IAAI,CAAC,qBAAqB,kBAAkB,CAAC;AAEzE,IAAM,iBAAiB,oBAAI,IAAI;EAC7B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,iBAAiB,oBAAI,IAAI;EAC7B,GAAG;EACH,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,qBAAqB,oBAAI,IAAI;EACjC,GAAG;EACH,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,kBAAkB,oBAAI,IAAI;EAC9B,GAAG;EACH,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,iBAAiB,oBAAI,IAAI;EAC7B,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,uBAAuB,oBAAI,IAAI;EACnC,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,uBAAuB,oBAAI,IAAI;EACnC,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,kBAAkB,oBAAI,IAAI;EAC9B,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,gBAAgB,oBAAI,IAAI;EAC5B,GAAG;E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","names":["constants","access","path","path","access","constants","constants","access","path","constants","access","path","fileExists","path","path","path","mkdir","path","mkdir","path","mkdir","writeFile","path","createWriteStream","mkdir","path","finished","mkdir","path","createWriteStream","finished","path","path","path","readFile","parse","path","readFile","parse","isObject","absolutePath","errors","ANSI_YELLOW","ANSI_RED","ANSI_RESET","ANSI_YELLOW","ANSI_RESET","ANSI_RED","access","constants","path","stat"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/commands/eval/shared.ts","../src/utils/targets.ts","../src/commands/eval/run-eval.ts","../src/version-check.ts","../src/commands/eval/env.ts","../src/commands/eval/output-writer.ts","../src/commands/eval/json-writer.ts","../src/utils/case-conversion.ts","../src/commands/eval/jsonl-writer.ts","../../../node_modules/.bun/async-mutex@0.5.0/node_modules/async-mutex/index.mjs","../src/commands/eval/junit-writer.ts","../src/commands/eval/yaml-writer.ts","../src/commands/eval/progress-display.ts","../src/commands/eval/retry-errors.ts","../src/commands/eval/statistics.ts","../../../packages/core/src/evaluation/validation/file-type.ts","../../../packages/core/src/evaluation/validation/eval-validator.ts","../../../packages/core/src/evaluation/validation/targets-validator.ts","../../../packages/core/src/evaluation/validation/config-validator.ts","../../../packages/core/src/evaluation/validation/file-reference-validator.ts","../src/commands/eval/targets.ts"],"sourcesContent":["{\n \"name\": \"agentv\",\n \"version\": \"2.19.0\",\n \"description\": \"CLI entry point for AgentV\",\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/EntityProcess/agentv.git\"\n },\n \"homepage\": \"https://github.com/EntityProcess/agentv#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/EntityProcess/agentv/issues\"\n },\n \"bin\": {\n \"agentv\": \"./dist/cli.js\"\n },\n \"files\": [\"dist\", \"README.md\"],\n \"scripts\": {\n \"dev\": \"bun src/cli.ts\",\n \"build\": \"tsup && bun run copy-readme\",\n \"copy-readme\": \"bun -e \\\"import { cpSync } from 'fs'; cpSync('../../README.md', 'README.md')\\\"\",\n \"prepublishOnly\": \"bun run copy-readme\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"biome check .\",\n \"format\": \"biome format --write .\",\n \"fix\": \"biome check --write .\",\n \"test\": \"bun test\",\n \"test:watch\": \"bun test --watch\"\n },\n \"dependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"^0.2.49\",\n \"@github/copilot-sdk\": \"^0.1.25\",\n \"@inquirer/prompts\": \"^8.2.1\",\n \"@mariozechner/pi-agent-core\": \"^0.54.2\",\n \"@mariozechner/pi-ai\": \"^0.54.2\",\n \"@openai/codex-sdk\": \"^0.104.0\",\n \"cmd-ts\": \"^0.14.3\",\n \"dotenv\": \"^16.4.5\",\n \"fast-glob\": \"^3.3.3\",\n \"json5\": \"^2.2.3\",\n \"micromatch\": \"^4.0.8\",\n \"semver\": \"^7.7.4\",\n \"yaml\": \"^2.6.1\"\n },\n \"devDependencies\": {\n \"@agentv/core\": \"workspace:*\",\n \"@types/semver\": \"^7.7.1\",\n \"execa\": \"^9.3.0\"\n }\n}\n","import { constants } from 'node:fs';\nimport { access, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport fg from 'fast-glob';\n\nexport async function resolveEvalPaths(evalPaths: string[], cwd: string): Promise<string[]> {\n const normalizedInputs = evalPaths.map((value) => value?.trim()).filter((value) => value);\n if (normalizedInputs.length === 0) {\n throw new Error('No eval paths provided.');\n }\n\n const unmatched: string[] = [];\n const results = new Set<string>();\n\n for (const pattern of normalizedInputs) {\n // If the pattern points to an existing file, short-circuit globbing\n const candidatePath = path.isAbsolute(pattern)\n ? path.normalize(pattern)\n : path.resolve(cwd, pattern);\n try {\n const stats = await stat(candidatePath);\n if (stats.isFile() && /\\.(ya?ml|jsonl)$/i.test(candidatePath)) {\n results.add(candidatePath);\n continue;\n }\n } catch {\n // fall through to glob matching\n }\n\n const globPattern = pattern.includes('\\\\') ? pattern.replace(/\\\\/g, '/') : pattern;\n const matches = await fg(globPattern, {\n cwd,\n absolute: true,\n onlyFiles: true,\n unique: true,\n dot: true,\n followSymbolicLinks: true,\n });\n\n const yamlMatches = matches.filter((filePath) => /\\.(ya?ml|jsonl)$/i.test(filePath));\n if (yamlMatches.length === 0) {\n unmatched.push(pattern);\n continue;\n }\n\n for (const filePath of yamlMatches) {\n results.add(path.normalize(filePath));\n }\n }\n\n if (unmatched.length > 0) {\n throw new Error(\n `No eval files matched: ${unmatched.join(\n ', ',\n )}. Provide YAML or JSONL paths or globs (e.g., \"evals/**/*.yaml\", \"evals/**/*.jsonl\").`,\n );\n }\n\n const sorted = Array.from(results);\n sorted.sort();\n return sorted;\n}\n\nexport async function findRepoRoot(start: string): Promise<string> {\n const fallback = path.resolve(start);\n let current: string | undefined = fallback;\n\n while (current !== undefined) {\n const candidate = path.join(current, '.git');\n try {\n await access(candidate, constants.F_OK);\n return current;\n } catch {\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n }\n\n return fallback;\n}\n","import { constants } from 'node:fs';\nimport { access } from 'node:fs/promises';\nimport path from 'node:path';\nimport { buildDirectoryChain } from '@agentv/core';\n\nexport const TARGET_FILE_CANDIDATES = [\n 'targets.yaml',\n 'targets.yml',\n path.join('.agentv', 'targets.yaml'),\n path.join('.agentv', 'targets.yml'),\n] as const;\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function discoverTargetsFile(options: {\n readonly explicitPath?: string;\n readonly testFilePath: string;\n readonly repoRoot: string;\n readonly cwd: string;\n}): Promise<string> {\n const { explicitPath, testFilePath, repoRoot, cwd } = options;\n\n if (explicitPath) {\n const resolvedExplicit = path.resolve(explicitPath);\n if (await fileExists(resolvedExplicit)) {\n return resolvedExplicit;\n }\n\n for (const candidate of TARGET_FILE_CANDIDATES) {\n const nested = path.join(resolvedExplicit, candidate);\n if (await fileExists(nested)) {\n return nested;\n }\n }\n\n throw new Error(`targets.yaml not found at provided path: ${resolvedExplicit}`);\n }\n\n const directories = [...buildDirectoryChain(testFilePath, repoRoot)];\n\n // Also check cwd if not already in chain\n const resolvedCwd = path.resolve(cwd);\n if (!directories.includes(resolvedCwd)) {\n directories.push(resolvedCwd);\n }\n\n for (const directory of directories) {\n for (const candidate of TARGET_FILE_CANDIDATES) {\n const fullPath = path.join(directory, candidate);\n if (await fileExists(fullPath)) {\n return fullPath;\n }\n }\n }\n\n throw new Error('Unable to locate targets.yaml. Use --targets to specify the file explicitly.');\n}\n","import { constants } from 'node:fs';\nimport { access } from 'node:fs/promises';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport {\n type EvalTest,\n type EvaluationCache,\n type EvaluationResult,\n type ExecutionDefaults,\n type FailOnError,\n type OtelTraceExporter as OtelTraceExporterType,\n ResponseCache,\n type TrialsConfig,\n runEvaluation as defaultRunEvaluation,\n ensureVSCodeSubagents,\n loadConfig,\n loadTestSuite,\n loadTsConfig,\n shouldEnableCache,\n shouldSkipCacheForTemperature,\n subscribeToCodexLogEntries,\n subscribeToCopilotCliLogEntries,\n subscribeToCopilotSdkLogEntries,\n subscribeToPiLogEntries,\n} from '@agentv/core';\n\nimport { enforceRequiredVersion } from '../../version-check.js';\nimport { loadEnvFromHierarchy } from './env.js';\nimport {\n type OutputFormat,\n type OutputWriter,\n createMultiWriter,\n createOutputWriter,\n getDefaultExtension,\n} from './output-writer.js';\nimport { ProgressDisplay, type WorkerProgress } from './progress-display.js';\nimport { loadErrorTestIds, loadNonErrorResults } from './retry-errors.js';\nimport { findRepoRoot } from './shared.js';\nimport {\n calculateEvaluationSummary,\n formatEvaluationSummary,\n formatMatrixSummary,\n} from './statistics.js';\nimport { type TargetSelection, selectMultipleTargets, selectTarget } from './targets.js';\n\nconst DEFAULT_WORKERS = 3;\n\ninterface RunEvalCommandInput {\n readonly testFiles: readonly string[];\n readonly rawOptions: Record<string, unknown>;\n}\n\ninterface NormalizedOptions {\n readonly target?: string;\n readonly cliTargets: readonly string[];\n readonly targetsPath?: string;\n readonly filter?: string;\n readonly workers?: number;\n readonly outPath?: string;\n readonly outputPaths: readonly string[];\n readonly format: OutputFormat;\n readonly dryRun: boolean;\n readonly dryRunDelay: number;\n readonly dryRunDelayMin: number;\n readonly dryRunDelayMax: number;\n readonly agentTimeoutSeconds?: number;\n readonly maxRetries: number;\n readonly cache: boolean;\n readonly noCache: boolean;\n readonly verbose: boolean;\n readonly otelFile?: string;\n readonly traceFile?: string;\n readonly exportOtel: boolean;\n readonly otelBackend?: string;\n readonly otelCaptureContent: boolean;\n readonly otelGroupTurns: boolean;\n readonly retryErrors?: string;\n readonly workspaceMode?: 'pooled' | 'temp' | 'static';\n readonly workspacePath?: string;\n}\n\nfunction normalizeBoolean(value: unknown): boolean {\n return value === true;\n}\n\nfunction normalizeString(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function resolveTimestampPlaceholder(value: string): string {\n if (!value.includes('{timestamp}')) {\n return value;\n }\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n return value.replaceAll('{timestamp}', timestamp);\n}\n\nfunction normalizeNumber(value: unknown, fallback: number): number {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isNaN(parsed)) {\n return parsed;\n }\n }\n return fallback;\n}\n\nfunction normalizeOptionalNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isNaN(parsed)) {\n return parsed;\n }\n }\n return undefined;\n}\n\nfunction normalizeWorkspaceMode(value: unknown): 'pooled' | 'temp' | 'static' | undefined {\n return value === 'pooled' || value === 'temp' || value === 'static' ? value : undefined;\n}\n\nfunction normalizeOptions(\n rawOptions: Record<string, unknown>,\n config?: Awaited<ReturnType<typeof loadTsConfig>>,\n yamlExecution?: ExecutionDefaults,\n): NormalizedOptions {\n const cliFormat = normalizeString(rawOptions.outputFormat);\n const configFormat = config?.output?.format;\n const formatStr = cliFormat ?? configFormat ?? 'jsonl';\n const format: OutputFormat = formatStr === 'yaml' ? 'yaml' : 'jsonl';\n\n const cliWorkers = normalizeOptionalNumber(rawOptions.workers);\n const configWorkers = config?.execution?.workers;\n const workers = cliWorkers ?? configWorkers ?? 0;\n\n const rawOutputPaths = rawOptions.output;\n const outputPaths: string[] = Array.isArray(rawOutputPaths)\n ? rawOutputPaths.filter((v): v is string => typeof v === 'string' && v.trim().length > 0)\n : [];\n\n // Normalize --target: can be a string (legacy) or string[] (multioption)\n const rawTarget = rawOptions.target;\n let cliTargets: string[] = [];\n let singleTarget: string | undefined;\n if (Array.isArray(rawTarget)) {\n cliTargets = rawTarget.filter((v): v is string => typeof v === 'string' && v.trim().length > 0);\n singleTarget = cliTargets.length === 1 ? cliTargets[0] : undefined;\n } else if (typeof rawTarget === 'string') {\n const trimmed = rawTarget.trim();\n if (trimmed.length > 0 && trimmed !== 'default') {\n cliTargets = [trimmed];\n singleTarget = trimmed;\n }\n }\n\n const cliAgentTimeout = normalizeOptionalNumber(rawOptions.agentTimeout);\n const configAgentTimeoutSeconds =\n config?.execution?.agentTimeoutMs != null ? config.execution.agentTimeoutMs / 1000 : undefined;\n\n const cliMaxRetries = normalizeOptionalNumber(rawOptions.maxRetries);\n const configMaxRetries = config?.execution?.maxRetries;\n\n // Cache: CLI flags take priority, then config file, then default (true via shouldEnableCache)\n const cliCache = normalizeBoolean(rawOptions.cache);\n const cliNoCache = normalizeBoolean(rawOptions.noCache);\n const configCacheEnabled = config?.cache?.enabled;\n // If neither --cache nor --no-cache was passed, use config value\n const resolvedCache = cliCache || (!cliNoCache && configCacheEnabled === true);\n const resolvedNoCache = cliNoCache;\n\n // Output dir: CLI --out > config output.dir > auto-generated\n const cliOut = normalizeString(rawOptions.out);\n const configOut = config?.output?.dir;\n const cliWorkspacePath = normalizeString(rawOptions.workspacePath);\n const cliWorkspaceModeRaw = normalizeString(rawOptions.workspaceMode);\n const cliWorkspaceMode = normalizeWorkspaceMode(rawOptions.workspaceMode);\n if (cliWorkspacePath && cliWorkspaceModeRaw && cliWorkspaceMode !== 'static') {\n throw new Error('--workspace-path requires --workspace-mode=static (or omit --workspace-mode)');\n }\n\n const yamlExecutionRecord = yamlExecution as Record<string, unknown> | undefined;\n const yamlWorkspaceMode = normalizeWorkspaceMode(yamlExecutionRecord?.workspace_mode);\n const yamlWorkspacePath = normalizeString(yamlExecutionRecord?.workspace_path);\n const workspacePath = cliWorkspacePath ?? yamlWorkspacePath;\n const workspaceMode = cliWorkspacePath ? 'static' : (cliWorkspaceMode ?? yamlWorkspaceMode);\n\n return {\n target: singleTarget,\n cliTargets,\n targetsPath: normalizeString(rawOptions.targets),\n filter: normalizeString(rawOptions.filter),\n workers: workers > 0 ? workers : undefined,\n outPath: cliOut ?? configOut,\n outputPaths,\n format,\n dryRun: normalizeBoolean(rawOptions.dryRun),\n dryRunDelay: normalizeNumber(rawOptions.dryRunDelay, 0),\n dryRunDelayMin: normalizeNumber(rawOptions.dryRunDelayMin, 0),\n dryRunDelayMax: normalizeNumber(rawOptions.dryRunDelayMax, 0),\n agentTimeoutSeconds: cliAgentTimeout ?? configAgentTimeoutSeconds,\n maxRetries: cliMaxRetries ?? configMaxRetries ?? 2,\n cache: resolvedCache,\n noCache: resolvedNoCache,\n // Boolean OR: config `true` cannot be overridden to `false` from CLI.\n // Intentional — there are no --no-verbose / --no-keep-workspaces flags.\n // Precedence: CLI > YAML config > TS config\n verbose:\n normalizeBoolean(rawOptions.verbose) ||\n yamlExecution?.verbose === true ||\n config?.execution?.verbose === true,\n // Precedence: CLI > YAML config > TS config\n otelFile:\n normalizeString(rawOptions.otelFile) ??\n (yamlExecution?.otel_file\n ? resolveTimestampPlaceholder(yamlExecution.otel_file)\n : undefined) ??\n (config?.execution?.otelFile\n ? resolveTimestampPlaceholder(config.execution.otelFile)\n : undefined),\n traceFile:\n normalizeString(rawOptions.traceFile) ??\n (yamlExecution?.trace_file\n ? resolveTimestampPlaceholder(yamlExecution.trace_file)\n : undefined) ??\n (config?.execution?.traceFile\n ? resolveTimestampPlaceholder(config.execution.traceFile)\n : undefined),\n exportOtel: normalizeBoolean(rawOptions.exportOtel),\n otelBackend: normalizeString(rawOptions.otelBackend),\n otelCaptureContent: normalizeBoolean(rawOptions.otelCaptureContent),\n otelGroupTurns: normalizeBoolean(rawOptions.otelGroupTurns),\n retryErrors: normalizeString(rawOptions.retryErrors),\n workspaceMode,\n workspacePath,\n } satisfies NormalizedOptions;\n}\n\nasync function ensureFileExists(filePath: string, description: string): Promise<void> {\n try {\n await access(filePath, constants.F_OK);\n } catch {\n throw new Error(`${description} not found: ${filePath}`);\n }\n}\n\nfunction buildDefaultOutputPath(cwd: string, format: OutputFormat): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const baseName = 'eval';\n const extension = getDefaultExtension(format);\n return path.join(cwd, '.agentv', 'results', `${baseName}_${timestamp}${extension}`);\n}\n\ntype ProgressReporter = {\n readonly isInteractive: boolean;\n start(): void;\n setTotal(total: number): void;\n update(workerId: number, progress: WorkerProgress): void;\n finish(): void;\n addLogPaths(paths: readonly string[], provider?: 'codex' | 'pi' | 'copilot'): void;\n};\n\nfunction createProgressReporter(\n maxWorkers: number,\n options?: { verbose?: boolean },\n): ProgressReporter {\n const display = new ProgressDisplay(maxWorkers, options);\n return {\n isInteractive: display.isInteractiveMode(),\n start: () => display.start(),\n setTotal: (total: number) => display.setTotalTests(total),\n update: (workerId: number, progress: WorkerProgress) =>\n display.updateWorker({ ...progress, workerId }),\n finish: () => display.finish(),\n addLogPaths: (paths: readonly string[], provider?: 'codex' | 'pi' | 'copilot') =>\n display.addLogPaths(paths, provider),\n };\n}\n\nfunction makeEvalKey(testFilePath: string, evalId: string): string {\n return `${path.resolve(testFilePath)}::${evalId}`;\n}\n\nfunction createDisplayIdTracker(): { getOrAssign(evalKey: string): number } {\n const map = new Map<string, number>();\n let nextId = 1;\n return {\n getOrAssign(evalKey: string): number {\n const existing = map.get(evalKey);\n if (existing !== undefined) {\n return existing;\n }\n const assigned = nextId++;\n map.set(evalKey, assigned);\n return assigned;\n },\n };\n}\n\n/**\n * Override CLI provider verbose setting based on CLI --verbose flag.\n * CLI provider logs should only appear when --verbose is passed.\n */\nfunction applyVerboseOverride(selection: TargetSelection, cliVerbose: boolean): TargetSelection {\n const { resolvedTarget } = selection;\n\n // Only CLI providers have a verbose setting in their config\n if (resolvedTarget.kind !== 'cli') {\n return selection;\n }\n\n // Set verbose to match CLI --verbose flag\n return {\n ...selection,\n resolvedTarget: {\n ...resolvedTarget,\n config: {\n ...resolvedTarget.config,\n verbose: cliVerbose,\n },\n },\n };\n}\n\nasync function prepareFileMetadata(params: {\n readonly testFilePath: string;\n readonly repoRoot: string;\n readonly cwd: string;\n readonly options: NormalizedOptions;\n}): Promise<{\n readonly evalIds: readonly string[];\n readonly evalCases: readonly EvalTest[];\n readonly selections: readonly { selection: TargetSelection; inlineTargetLabel: string }[];\n readonly trialsConfig?: TrialsConfig;\n readonly suiteTargets?: readonly string[];\n readonly yamlCache?: boolean;\n readonly yamlCachePath?: string;\n readonly totalBudgetUsd?: number;\n readonly failOnError?: FailOnError;\n}> {\n const { testFilePath, repoRoot, cwd, options } = params;\n\n await ensureFileExists(testFilePath, 'Test file');\n await loadEnvFromHierarchy({\n testFilePath,\n repoRoot,\n verbose: options.verbose,\n });\n\n const suite = await loadTestSuite(testFilePath, repoRoot, {\n verbose: options.verbose,\n filter: options.filter,\n });\n const filteredIds = suite.tests.map((value) => value.id);\n\n // Determine target names: CLI --target flags override YAML\n const cliTargets = options.cliTargets;\n const suiteTargets = suite.targets;\n\n // Resolve which target names to use (precedence: CLI > YAML targets > YAML target > default)\n let targetNames: readonly string[];\n if (cliTargets.length > 0) {\n targetNames = cliTargets;\n } else if (suiteTargets && suiteTargets.length > 0) {\n targetNames = suiteTargets;\n } else {\n targetNames = [];\n }\n\n let selections: { selection: TargetSelection; inlineTargetLabel: string }[];\n\n if (targetNames.length > 1) {\n // Matrix mode: multiple targets\n const multiSelections = await selectMultipleTargets({\n testFilePath,\n repoRoot,\n cwd,\n explicitTargetsPath: options.targetsPath,\n dryRun: options.dryRun,\n dryRunDelay: options.dryRunDelay,\n dryRunDelayMin: options.dryRunDelayMin,\n dryRunDelayMax: options.dryRunDelayMax,\n env: process.env,\n targetNames,\n });\n\n selections = multiSelections.map((sel) => {\n const providerLabel = options.dryRun\n ? `${sel.resolvedTarget.kind} (dry-run)`\n : sel.resolvedTarget.kind;\n return {\n selection: sel,\n inlineTargetLabel: `${sel.targetName} [provider=${providerLabel}]`,\n };\n });\n } else {\n // Single target mode (legacy path)\n const selection = await selectTarget({\n testFilePath,\n repoRoot,\n cwd,\n explicitTargetsPath: options.targetsPath,\n cliTargetName: targetNames.length === 1 ? targetNames[0] : options.target,\n dryRun: options.dryRun,\n dryRunDelay: options.dryRunDelay,\n dryRunDelayMin: options.dryRunDelayMin,\n dryRunDelayMax: options.dryRunDelayMax,\n env: process.env,\n });\n\n const providerLabel = options.dryRun\n ? `${selection.resolvedTarget.kind} (dry-run)`\n : selection.resolvedTarget.kind;\n selections = [\n {\n selection,\n inlineTargetLabel: `${selection.targetName} [provider=${providerLabel}]`,\n },\n ];\n }\n\n return {\n evalIds: filteredIds,\n evalCases: suite.tests,\n selections,\n trialsConfig: suite.trials,\n suiteTargets,\n yamlCache: suite.cacheConfig?.enabled,\n yamlCachePath: suite.cacheConfig?.cachePath,\n totalBudgetUsd: suite.totalBudgetUsd,\n failOnError: suite.failOnError,\n };\n}\n\nasync function runWithLimit<T>(\n items: readonly T[],\n limit: number,\n task: (item: T) => Promise<void>,\n): Promise<void> {\n const safeLimit = Math.max(1, limit);\n let index = 0;\n\n const workers = Array.from({ length: safeLimit }, async () => {\n while (index < items.length) {\n const current = items[index];\n index += 1;\n await task(current);\n }\n });\n\n await Promise.all(workers);\n}\n\nasync function runSingleEvalFile(params: {\n readonly testFilePath: string;\n readonly cwd: string;\n readonly repoRoot: string;\n readonly options: NormalizedOptions;\n readonly outputWriter: OutputWriter;\n readonly otelExporter?: OtelTraceExporterType | null;\n readonly cache?: EvaluationCache;\n readonly evaluationRunner: typeof defaultRunEvaluation;\n readonly workersOverride?: number;\n readonly progressReporter: ProgressReporter;\n readonly seenEvalCases: Set<string>;\n readonly displayIdTracker: { getOrAssign(evalKey: string): number };\n readonly selection: TargetSelection;\n readonly inlineTargetLabel: string;\n readonly evalCases: readonly EvalTest[];\n readonly trialsConfig?: TrialsConfig;\n readonly matrixMode?: boolean;\n readonly totalBudgetUsd?: number;\n readonly failOnError?: FailOnError;\n}): Promise<{ results: EvaluationResult[] }> {\n const {\n testFilePath,\n cwd,\n repoRoot,\n options,\n outputWriter,\n otelExporter,\n cache,\n evaluationRunner,\n workersOverride,\n progressReporter,\n seenEvalCases,\n displayIdTracker,\n selection,\n inlineTargetLabel,\n evalCases,\n trialsConfig,\n matrixMode,\n totalBudgetUsd,\n failOnError,\n } = params;\n\n const targetName = selection.targetName;\n\n await ensureFileExists(testFilePath, 'Test file');\n\n // CLI provider verbose logging should only be enabled when --verbose flag is passed\n const resolvedTargetSelection = applyVerboseOverride(selection, options.verbose);\n const providerLabel = options.dryRun\n ? `${resolvedTargetSelection.resolvedTarget.kind} (dry-run)`\n : resolvedTargetSelection.resolvedTarget.kind;\n const targetMessage = options.verbose\n ? `Using target (${resolvedTargetSelection.targetSource}): ${resolvedTargetSelection.targetName} [provider=${providerLabel}] via ${resolvedTargetSelection.targetsFilePath}`\n : `Using target: ${inlineTargetLabel}`;\n if (!progressReporter.isInteractive || options.verbose) {\n console.log(targetMessage);\n }\n\n const agentTimeoutMs =\n options.agentTimeoutSeconds != null\n ? Math.max(0, options.agentTimeoutSeconds) * 1000\n : undefined;\n\n // Resolve workers: CLI flag (adjusted per-file) > target setting > default (1)\n const workerPreference = workersOverride ?? options.workers;\n let resolvedWorkers =\n workerPreference ?? resolvedTargetSelection.resolvedTarget.workers ?? DEFAULT_WORKERS;\n if (resolvedWorkers < 1 || resolvedWorkers > 50) {\n throw new Error(`Workers must be between 1 and 50, got: ${resolvedWorkers}`);\n }\n\n // VSCode providers require window focus, so only 1 worker is allowed\n const isVSCodeProvider = ['vscode', 'vscode-insiders'].includes(\n resolvedTargetSelection.resolvedTarget.kind,\n );\n if (isVSCodeProvider && resolvedWorkers > 1) {\n console.warn(\n `Warning: VSCode providers require window focus. Limiting workers from ${resolvedWorkers} to 1 to prevent race conditions.`,\n );\n resolvedWorkers = 1;\n }\n\n // Auto-provision subagents for VSCode targets\n if (isVSCodeProvider && !options.dryRun) {\n const vsConfig = resolvedTargetSelection.resolvedTarget.config as { executable?: string };\n await ensureVSCodeSubagents({\n kind: resolvedTargetSelection.resolvedTarget.kind as 'vscode' | 'vscode-insiders',\n count: resolvedWorkers,\n verbose: options.verbose,\n vscodeCmd: vsConfig.executable,\n });\n }\n\n // Create streaming observer for real-time OTel span export\n const streamingObserver = otelExporter?.createStreamingObserver() ?? null;\n const results = await evaluationRunner({\n testFilePath,\n repoRoot,\n target: resolvedTargetSelection.resolvedTarget,\n targets: resolvedTargetSelection.definitions,\n env: process.env,\n maxRetries: Math.max(0, options.maxRetries),\n agentTimeoutMs,\n cache,\n useCache: (() => {\n // Skip cache if not enabled\n if (!cache) return false;\n // Skip cache when target has temperature > 0 (non-deterministic)\n const targetConfig = resolvedTargetSelection.resolvedTarget.config as Record<string, unknown>;\n if (shouldSkipCacheForTemperature(targetConfig)) {\n if (options.verbose) {\n console.log('Cache skipped: target temperature > 0');\n }\n return false;\n }\n return true;\n })(),\n evalCases,\n verbose: options.verbose,\n maxConcurrency: resolvedWorkers,\n workspaceMode: options.workspaceMode,\n workspacePath: options.workspacePath,\n trials: trialsConfig,\n totalBudgetUsd,\n failOnError,\n streamCallbacks: streamingObserver?.getStreamCallbacks(),\n onResult: async (result: EvaluationResult) => {\n // Finalize streaming observer span with score\n streamingObserver?.finalizeEvalCase(result.score, result.error);\n\n // Strip output from result before writing to avoid bloating results JSONL\n const { output: _, ...resultWithoutTrace } = result;\n await outputWriter.append(resultWithoutTrace as EvaluationResult);\n\n // Export to OTel if exporter is configured (skip batch export when streaming is active)\n if (otelExporter && !streamingObserver) {\n try {\n await otelExporter.exportResult(result);\n } catch (err) {\n // Export failures don't fail the evaluation\n if (options.verbose) {\n console.warn(\n `OTel export warning: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n },\n onProgress: async (event) => {\n const evalKeyId = matrixMode ? `${event.testId}@${targetName}` : event.testId;\n const evalKey = makeEvalKey(testFilePath, evalKeyId);\n if (event.status === 'pending' && !seenEvalCases.has(evalKey)) {\n seenEvalCases.add(evalKey);\n progressReporter.setTotal(seenEvalCases.size);\n }\n const displayId = displayIdTracker.getOrAssign(evalKey);\n\n // Start streaming observer when eval case begins execution\n if (event.status === 'running' && streamingObserver) {\n streamingObserver.startEvalCase(event.testId, targetName, testFilePath);\n }\n\n progressReporter.update(displayId, {\n workerId: displayId,\n testId: matrixMode ? `${event.testId}@${targetName}` : event.testId,\n status: event.status,\n startedAt: event.startedAt,\n completedAt: event.completedAt,\n error: event.error,\n targetLabel: inlineTargetLabel,\n });\n },\n });\n\n return { results: [...results] };\n}\n\nexport async function runEvalCommand(input: RunEvalCommandInput): Promise<void> {\n const cwd = process.cwd();\n\n // Load agentv.config.ts (if present) for default values\n let config: Awaited<ReturnType<typeof loadTsConfig>> = null;\n try {\n config = await loadTsConfig(cwd);\n } catch (err) {\n console.warn(\n `Warning: Failed to load agentv config: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const repoRoot = await findRepoRoot(cwd);\n\n // Load .agentv/config.yaml for execution defaults.\n // loadConfig expects an eval file path and walks up from its directory.\n // Pass a dummy file in cwd so the search starts from the working directory.\n const yamlConfig = await loadConfig(path.join(cwd, '_'), repoRoot);\n\n // Check required_version before proceeding with eval\n if (yamlConfig?.required_version) {\n await enforceRequiredVersion(yamlConfig.required_version, {\n strict: normalizeBoolean(input.rawOptions.strict),\n });\n }\n\n let options = normalizeOptions(input.rawOptions, config, yamlConfig?.execution);\n\n // --retry-errors: override filter to only re-run execution_error test cases.\n // IMPORTANT: JSONL must be fully loaded here, before the output writer is created below,\n // since the retry source and output destination may refer to the same file.\n let retryNonErrorResults: readonly EvaluationResult[] | undefined;\n if (options.retryErrors) {\n const retryPath = path.resolve(options.retryErrors);\n await ensureFileExists(retryPath, 'Retry-errors JSONL file');\n const errorIds = await loadErrorTestIds(retryPath);\n if (errorIds.length === 0) {\n console.log('No execution errors found in the previous output. Nothing to retry.');\n return;\n }\n console.log(`Retrying ${errorIds.length} execution-error test(s): ${errorIds.join(', ')}`);\n // Override the filter to match only error test IDs using micromatch brace expansion\n const filterPattern = errorIds.length === 1 ? errorIds[0] : `{${errorIds.join(',')}}`;\n options = { ...options, filter: filterPattern };\n retryNonErrorResults = await loadNonErrorResults(retryPath);\n }\n\n // Validate static workspace path exists and is a directory\n if (options.workspacePath) {\n const resolvedWorkspace = path.resolve(options.workspacePath);\n try {\n const { stat } = await import('node:fs/promises');\n const stats = await stat(resolvedWorkspace);\n if (!stats.isDirectory()) {\n throw new Error(`--workspace-path is not a directory: ${resolvedWorkspace}`);\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(`--workspace-path does not exist: ${resolvedWorkspace}`);\n }\n throw err;\n }\n options = { ...options, workspacePath: resolvedWorkspace };\n }\n\n if (options.verbose) {\n console.log(`Repository root: ${repoRoot}`);\n }\n\n // Initialize OTel exporter if --export-otel flag is set or file export flags are used\n let otelExporter: OtelTraceExporterType | null = null;\n const useFileExport = !!(options.otelFile || options.traceFile);\n\n if (options.exportOtel || useFileExport) {\n try {\n const { OtelTraceExporter, OTEL_BACKEND_PRESETS } = await import('@agentv/core');\n\n // Resolve endpoint and headers\n let endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT;\n let headers: Record<string, string> = {};\n\n if (options.otelBackend) {\n const preset = OTEL_BACKEND_PRESETS[options.otelBackend];\n if (preset) {\n endpoint = preset.endpoint;\n headers = preset.headers(process.env);\n } else {\n console.warn(`Unknown OTel backend preset: ${options.otelBackend}`);\n }\n }\n\n // Parse OTEL_EXPORTER_OTLP_HEADERS env var\n if (process.env.OTEL_EXPORTER_OTLP_HEADERS) {\n for (const pair of process.env.OTEL_EXPORTER_OTLP_HEADERS.split(',')) {\n const [key, ...rest] = pair.split('=');\n if (key) headers[key.trim()] = rest.join('=').trim();\n }\n }\n\n const captureContent =\n options.otelCaptureContent || process.env.AGENTV_OTEL_CAPTURE_CONTENT === 'true';\n\n otelExporter = new OtelTraceExporter({\n endpoint,\n headers,\n captureContent,\n groupTurns: options.otelGroupTurns,\n otlpFilePath: options.otelFile ? path.resolve(options.otelFile) : undefined,\n traceFilePath: options.traceFile ? path.resolve(options.traceFile) : undefined,\n });\n\n const initialized = await otelExporter.init();\n if (!initialized) {\n console.warn(\n 'OTel export requested but @opentelemetry packages not available. Install them to enable export.',\n );\n otelExporter = null;\n }\n } catch (err) {\n console.warn(\n `OTel export initialization failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n otelExporter = null;\n }\n }\n\n const outputPath = options.outPath\n ? path.resolve(options.outPath)\n : buildDefaultOutputPath(cwd, options.format);\n\n // Resolve -o / --output paths (new multi-format support)\n const extraOutputPaths = options.outputPaths.map((p) => path.resolve(p));\n\n // Build the primary output writer (from --out / default)\n // When extra --output paths are provided, combine all into a multi-writer\n const allOutputPaths =\n extraOutputPaths.length > 0 ? [outputPath, ...extraOutputPaths] : [outputPath];\n const uniqueOutputPaths = [...new Set(allOutputPaths)];\n\n let outputWriter: OutputWriter;\n if (uniqueOutputPaths.length === 1) {\n outputWriter = await createOutputWriter(outputPath, options.format);\n console.log(`Output path: ${outputPath}`);\n } else {\n outputWriter = await createMultiWriter(uniqueOutputPaths);\n console.log('Output paths:');\n for (const p of uniqueOutputPaths) {\n console.log(` ${p}`);\n }\n }\n\n // Log file export paths\n const resolvedTestFiles = input.testFiles.map((file) => path.resolve(file));\n if (options.otelFile) {\n console.log(`OTLP JSON file: ${path.resolve(options.otelFile)}`);\n }\n if (options.traceFile) {\n console.log(`Trace file: ${path.resolve(options.traceFile)}`);\n }\n\n // Determine cache state after loading file metadata (need YAML config)\n // We defer cache creation until after file metadata is loaded\n const evaluationRunner = await resolveEvaluationRunner();\n const allResults: EvaluationResult[] = [];\n const seenEvalCases = new Set<string>();\n const displayIdTracker = createDisplayIdTracker();\n\n // Derive file-level concurrency from worker count (global) when provided\n const totalWorkers = options.workers ?? DEFAULT_WORKERS;\n const fileConcurrency = Math.min(\n Math.max(1, totalWorkers),\n Math.max(1, resolvedTestFiles.length),\n );\n const perFileWorkers = options.workers\n ? Math.max(1, Math.floor(totalWorkers / fileConcurrency))\n : undefined;\n const fileMetadata = new Map<\n string,\n {\n readonly evalIds: readonly string[];\n readonly evalCases: readonly EvalTest[];\n readonly selections: readonly {\n selection: TargetSelection;\n inlineTargetLabel: string;\n }[];\n readonly trialsConfig?: TrialsConfig;\n readonly suiteTargets?: readonly string[];\n readonly yamlCache?: boolean;\n readonly yamlCachePath?: string;\n readonly totalBudgetUsd?: number;\n readonly failOnError?: FailOnError;\n }\n >();\n for (const testFilePath of resolvedTestFiles) {\n const meta = await prepareFileMetadata({\n testFilePath,\n repoRoot,\n cwd,\n options,\n });\n fileMetadata.set(testFilePath, meta);\n }\n\n // Resolve cache: combine CLI flags with YAML config\n // Use first file's YAML config for cache settings (consistent across a run)\n const firstMeta = fileMetadata.values().next().value;\n const yamlCacheEnabled = firstMeta?.yamlCache;\n const yamlCachePath = firstMeta?.yamlCachePath;\n const cacheEnabled = shouldEnableCache({\n cliCache: options.cache,\n cliNoCache: options.noCache,\n yamlCache: yamlCacheEnabled,\n });\n const cache = cacheEnabled\n ? new ResponseCache(yamlCachePath ? path.resolve(yamlCachePath) : undefined)\n : undefined;\n const useCache = cacheEnabled;\n\n if (cacheEnabled) {\n console.log(`Response cache: enabled${yamlCachePath ? ` (${yamlCachePath})` : ''}`);\n }\n\n // Detect matrix mode: multiple targets for any file\n const isMatrixMode = Array.from(fileMetadata.values()).some((meta) => meta.selections.length > 1);\n\n // In matrix mode, total eval count is tests × targets (accounting for per-test target overrides)\n let totalEvalCount = 0;\n for (const meta of fileMetadata.values()) {\n const suiteTargetNames = meta.selections.map((s) => s.selection.targetName);\n for (const test of meta.evalCases) {\n // Per-test targets override suite-level targets\n const testTargetNames =\n test.targets && test.targets.length > 0\n ? test.targets.filter((t) => suiteTargetNames.includes(t))\n : suiteTargetNames;\n totalEvalCount += testTargetNames.length > 0 ? testTargetNames.length : 1;\n }\n }\n\n if (totalEvalCount === 0) {\n throw new Error('No tests matched the provided filters.');\n }\n const progressReporter = createProgressReporter(totalWorkers, { verbose: options.verbose });\n progressReporter.start();\n progressReporter.setTotal(totalEvalCount);\n const seenCodexLogPaths = new Set<string>();\n const unsubscribeCodexLogs = subscribeToCodexLogEntries((entry) => {\n if (!entry.filePath || seenCodexLogPaths.has(entry.filePath)) {\n return;\n }\n seenCodexLogPaths.add(entry.filePath);\n progressReporter.addLogPaths([entry.filePath], 'codex');\n });\n const seenPiLogPaths = new Set<string>();\n const unsubscribePiLogs = subscribeToPiLogEntries((entry) => {\n if (!entry.filePath || seenPiLogPaths.has(entry.filePath)) {\n return;\n }\n seenPiLogPaths.add(entry.filePath);\n progressReporter.addLogPaths([entry.filePath], 'pi');\n });\n const seenCopilotLogPaths = new Set<string>();\n const unsubscribeCopilotSdkLogs = subscribeToCopilotSdkLogEntries((entry) => {\n if (!entry.filePath || seenCopilotLogPaths.has(entry.filePath)) {\n return;\n }\n seenCopilotLogPaths.add(entry.filePath);\n progressReporter.addLogPaths([entry.filePath], 'copilot');\n });\n const unsubscribeCopilotCliLogs = subscribeToCopilotCliLogEntries((entry) => {\n if (!entry.filePath || seenCopilotLogPaths.has(entry.filePath)) {\n return;\n }\n seenCopilotLogPaths.add(entry.filePath);\n progressReporter.addLogPaths([entry.filePath], 'copilot');\n });\n for (const [testFilePath, meta] of fileMetadata.entries()) {\n for (const { selection, inlineTargetLabel } of meta.selections) {\n for (const testId of meta.evalIds) {\n const evalKey = makeEvalKey(\n testFilePath,\n meta.selections.length > 1 ? `${testId}@${selection.targetName}` : testId,\n );\n seenEvalCases.add(evalKey);\n const displayId = displayIdTracker.getOrAssign(evalKey);\n progressReporter.update(displayId, {\n workerId: displayId,\n testId: meta.selections.length > 1 ? `${testId}@${selection.targetName}` : testId,\n status: 'pending',\n targetLabel: inlineTargetLabel,\n });\n }\n }\n }\n\n try {\n await runWithLimit(resolvedTestFiles, fileConcurrency, async (testFilePath) => {\n const targetPrep = fileMetadata.get(testFilePath);\n if (!targetPrep) {\n throw new Error(`Missing metadata for ${testFilePath}`);\n }\n\n // Run all targets concurrently (each target has its own worker limit)\n const targetResults = await Promise.all(\n targetPrep.selections.map(async ({ selection, inlineTargetLabel }) => {\n // Filter eval cases to those applicable to this target\n const targetName = selection.targetName;\n const applicableEvalCases =\n targetPrep.selections.length > 1\n ? targetPrep.evalCases.filter((test) => {\n if (test.targets && test.targets.length > 0) {\n return test.targets.includes(targetName);\n }\n return true;\n })\n : targetPrep.evalCases;\n\n if (applicableEvalCases.length === 0) {\n return [];\n }\n\n const result = await runSingleEvalFile({\n testFilePath,\n cwd,\n repoRoot,\n options,\n outputWriter,\n otelExporter,\n cache,\n evaluationRunner,\n workersOverride: perFileWorkers,\n progressReporter,\n seenEvalCases,\n displayIdTracker,\n selection,\n inlineTargetLabel,\n evalCases: applicableEvalCases,\n trialsConfig: targetPrep.trialsConfig,\n matrixMode: targetPrep.selections.length > 1,\n totalBudgetUsd: targetPrep.totalBudgetUsd,\n failOnError: targetPrep.failOnError,\n });\n\n return result.results;\n }),\n );\n for (const results of targetResults) {\n allResults.push(...results);\n }\n });\n\n progressReporter.finish();\n\n // Merge non-error results from previous run when using --retry-errors\n if (retryNonErrorResults && retryNonErrorResults.length > 0) {\n for (const preserved of retryNonErrorResults) {\n await outputWriter.append(preserved);\n }\n allResults.push(...retryNonErrorResults);\n console.log(\n `Merged ${retryNonErrorResults.length} non-error result(s) from previous output.`,\n );\n }\n\n const summary = calculateEvaluationSummary(allResults);\n console.log(formatEvaluationSummary(summary));\n\n // Print matrix summary when multiple targets were evaluated\n if (isMatrixMode && allResults.length > 0) {\n console.log(formatMatrixSummary(allResults));\n }\n\n // Print workspace paths for failed cases (when preserved for debugging)\n const failedWithWorkspaces = allResults.filter(\n (r) => r.workspacePath && (r.error || r.score < 0.5),\n );\n if (failedWithWorkspaces.length > 0) {\n console.log('\\nWorkspaces preserved for debugging:');\n for (const result of failedWithWorkspaces) {\n console.log(` ${result.testId}: ${result.workspacePath}`);\n }\n }\n\n if (allResults.length > 0) {\n if (uniqueOutputPaths.length === 1) {\n console.log(`\\nResults written to: ${outputPath}`);\n } else {\n console.log('\\nResults written to:');\n for (const p of uniqueOutputPaths) {\n console.log(` ${p}`);\n }\n }\n }\n } finally {\n unsubscribeCodexLogs();\n unsubscribePiLogs();\n unsubscribeCopilotSdkLogs();\n unsubscribeCopilotCliLogs();\n await outputWriter.close().catch(() => undefined);\n if (otelExporter) {\n try {\n await otelExporter.shutdown();\n } catch {\n // Silently ignore shutdown errors\n }\n }\n }\n}\n\nasync function resolveEvaluationRunner(): Promise<typeof defaultRunEvaluation> {\n const overridePath = process.env.AGENTEVO_CLI_EVAL_RUNNER;\n if (!overridePath) {\n return defaultRunEvaluation;\n }\n\n const resolved = path.isAbsolute(overridePath)\n ? overridePath\n : path.resolve(process.cwd(), overridePath);\n\n const moduleUrl = pathToFileURL(resolved).href;\n const mod = await import(moduleUrl);\n const candidate = mod.runEvaluation;\n if (typeof candidate !== 'function') {\n throw new Error(\n `Module '${resolved}' must export a 'runEvaluation' function to override the default implementation`,\n );\n }\n return candidate as typeof defaultRunEvaluation;\n}\n","import { satisfies, validRange } from 'semver';\n\nimport packageJson from '../package.json' with { type: 'json' };\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RED = '\\u001b[31m';\nconst ANSI_RESET = '\\u001b[0m';\n\nexport interface VersionCheckResult {\n readonly satisfied: boolean;\n readonly currentVersion: string;\n readonly requiredRange: string;\n}\n\n/**\n * Validate and check the installed version against a required semver range.\n * Throws on malformed range strings.\n */\nexport function checkVersion(requiredVersion: string): VersionCheckResult {\n const currentVersion = packageJson.version;\n\n if (!requiredVersion.trim() || !validRange(requiredVersion)) {\n throw new Error(\n `Invalid required_version \"${requiredVersion}\" in .agentv/config.yaml. Must be a valid semver range (e.g., \">=2.11.0\", \"^2.11.0\").`,\n );\n }\n\n return {\n satisfied: satisfies(currentVersion, requiredVersion),\n currentVersion,\n requiredRange: requiredVersion,\n };\n}\n\n/**\n * Run the version compatibility check and handle user interaction.\n *\n * - If the version satisfies the range, returns silently.\n * - If the range is malformed, prints an error and exits with code 1.\n * - If the version is below the range:\n * - Interactive (TTY): warns and prompts to continue or abort.\n * - Non-interactive: warns to stderr, continues (unless strict).\n * - Strict mode: warns and exits with code 1.\n */\nexport async function enforceRequiredVersion(\n requiredVersion: string,\n options?: { strict?: boolean },\n): Promise<void> {\n let result: VersionCheckResult;\n try {\n result = checkVersion(requiredVersion);\n } catch (err) {\n console.error(`${ANSI_RED}Error: ${(err as Error).message}${ANSI_RESET}`);\n process.exit(1);\n }\n\n if (result.satisfied) {\n return;\n }\n\n const warning = `${ANSI_YELLOW}Warning: This project requires agentv ${result.requiredRange} but you have ${result.currentVersion}.${ANSI_RESET}\\n Run \\`agentv self update\\` to upgrade.`;\n\n if (options?.strict) {\n console.error(warning);\n console.error(\n `${ANSI_RED}Aborting: --strict mode requires the installed version to satisfy the required range.${ANSI_RESET}`,\n );\n process.exit(1);\n }\n\n if (process.stdin.isTTY && process.stdout.isTTY) {\n console.warn(warning);\n const shouldContinue = await promptContinue();\n if (!shouldContinue) {\n process.exit(1);\n }\n } else {\n // Non-interactive: warn to stderr and continue\n process.stderr.write(`${warning}\\n`);\n }\n}\n\nasync function promptContinue(): Promise<boolean> {\n const { confirm } = await import('@inquirer/prompts');\n return confirm({ message: 'Continue anyway?', default: false });\n}\n","import { constants } from 'node:fs';\nimport { access } from 'node:fs/promises';\nimport path from 'node:path';\nimport { config as loadDotenv } from 'dotenv';\n\ninterface LoadEnvOptions {\n readonly testFilePath: string;\n readonly repoRoot: string;\n readonly verbose: boolean;\n}\n\nfunction uniqueDirs(directories: readonly string[]): readonly string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const dir of directories) {\n const absolute = path.resolve(dir);\n if (seen.has(absolute)) {\n continue;\n }\n seen.add(absolute);\n result.push(absolute);\n }\n return result;\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction collectAncestorDirectories(start: string, boundary: string): readonly string[] {\n const directories: string[] = [];\n const boundaryDir = path.resolve(boundary);\n let current: string | undefined = path.resolve(start);\n\n while (current !== undefined) {\n directories.push(current);\n if (current === boundaryDir) {\n break;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n return directories;\n}\n\nexport async function loadEnvFromHierarchy(options: LoadEnvOptions): Promise<string | undefined> {\n const { testFilePath, repoRoot, verbose } = options;\n const testDir = path.dirname(path.resolve(testFilePath));\n const cwd = process.cwd();\n\n const searchDirs = uniqueDirs([...collectAncestorDirectories(testDir, repoRoot), repoRoot, cwd]);\n\n // Collect all .env files in the hierarchy\n const envFiles: string[] = [];\n for (const dir of searchDirs) {\n const candidate = path.join(dir, '.env');\n if (await fileExists(candidate)) {\n envFiles.push(candidate);\n }\n }\n\n if (envFiles.length === 0) {\n if (verbose) {\n console.log('No .env file found in hierarchy');\n }\n return undefined;\n }\n\n // Load from root to child (reverse order) so child values override parent values\n // override: false means variables already in process.env won't be overwritten\n for (let i = envFiles.length - 1; i >= 0; i--) {\n const envFile = envFiles[i];\n loadDotenv({ path: envFile, override: false });\n if (verbose) {\n console.log(`Loaded environment from: ${envFile}`);\n }\n }\n\n // Return the closest (most specific) .env file path\n return envFiles[0];\n}\n","import path from 'node:path';\n\nimport type { EvaluationResult } from '@agentv/core';\n\nimport { JsonWriter } from './json-writer.js';\nimport { JsonlWriter } from './jsonl-writer.js';\nimport { JunitWriter } from './junit-writer.js';\nimport { YamlWriter } from './yaml-writer.js';\n\nexport type OutputFormat = 'jsonl' | 'yaml';\n\nexport interface OutputWriter {\n append(result: EvaluationResult): Promise<void>;\n close(): Promise<void>;\n}\n\nexport async function createOutputWriter(\n filePath: string,\n format: OutputFormat,\n): Promise<OutputWriter> {\n switch (format) {\n case 'jsonl':\n return JsonlWriter.open(filePath);\n case 'yaml':\n return YamlWriter.open(filePath);\n default: {\n const exhaustiveCheck: never = format;\n throw new Error(`Unsupported output format: ${exhaustiveCheck}`);\n }\n }\n}\n\nexport function getDefaultExtension(format: OutputFormat): string {\n switch (format) {\n case 'jsonl':\n return '.jsonl';\n case 'yaml':\n return '.yaml';\n default: {\n const exhaustiveCheck: never = format;\n throw new Error(`Unsupported output format: ${exhaustiveCheck}`);\n }\n }\n}\n\nconst SUPPORTED_EXTENSIONS = new Set(['.jsonl', '.json', '.xml', '.yaml', '.yml']);\n\nexport function createWriterFromPath(filePath: string): Promise<OutputWriter> {\n const ext = path.extname(filePath).toLowerCase();\n switch (ext) {\n case '.jsonl':\n return JsonlWriter.open(filePath);\n case '.json':\n return JsonWriter.open(filePath);\n case '.xml':\n return JunitWriter.open(filePath);\n case '.yaml':\n case '.yml':\n return YamlWriter.open(filePath);\n default:\n throw new Error(\n `Unsupported output file extension \"${ext}\". Supported: ${[...SUPPORTED_EXTENSIONS].join(', ')}`,\n );\n }\n}\n\nexport async function createMultiWriter(filePaths: readonly string[]): Promise<OutputWriter> {\n const writers = await Promise.all(filePaths.map((fp) => createWriterFromPath(fp)));\n return {\n async append(result: EvaluationResult): Promise<void> {\n await Promise.all(writers.map((w) => w.append(result)));\n },\n async close(): Promise<void> {\n await Promise.all(writers.map((w) => w.close()));\n },\n };\n}\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport type { EvaluationResult } from '@agentv/core';\n\nimport { toSnakeCaseDeep } from '../../utils/case-conversion.js';\n\nexport class JsonWriter {\n private readonly filePath: string;\n private readonly results: EvaluationResult[] = [];\n private closed = false;\n\n private constructor(filePath: string) {\n this.filePath = filePath;\n }\n\n static async open(filePath: string): Promise<JsonWriter> {\n await mkdir(path.dirname(filePath), { recursive: true });\n return new JsonWriter(filePath);\n }\n\n async append(result: EvaluationResult): Promise<void> {\n if (this.closed) {\n throw new Error('Cannot write to closed JSON writer');\n }\n this.results.push(result);\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n this.closed = true;\n\n const passed = this.results.filter((r) => r.score >= 0.5).length;\n const failed = this.results.length - passed;\n const total = this.results.length;\n\n const output = {\n stats: {\n total,\n passed,\n failed,\n passRate: total > 0 ? passed / total : 0,\n },\n results: this.results,\n };\n\n const snakeCaseOutput = toSnakeCaseDeep(output);\n await writeFile(this.filePath, `${JSON.stringify(snakeCaseOutput, null, 2)}\\n`, 'utf8');\n }\n}\n","/**\n * Converts a camelCase string to snake_case.\n * Examples:\n * testId -> test_id\n * answer -> answer\n * conversationId -> conversation_id\n *\n * Note: Keys that start with an uppercase letter are treated as proper nouns\n * and returned unchanged (e.g., \"Read\", \"Edit\" for tool names).\n */\nfunction toSnakeCase(str: string): string {\n // Don't convert keys that start with uppercase (proper nouns/tool names)\n if (/^[A-Z]/.test(str)) {\n return str;\n }\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Recursively converts all keys in an object from camelCase to snake_case.\n * This is used to convert TypeScript internal representations to snake_case\n * for Python ecosystem compatibility in JSONL output files.\n *\n * Conversion rules:\n * - Object keys: camelCase -> snake_case\n * - Array elements: recursively converted\n * - Primitives: returned unchanged\n * - null/undefined: returned unchanged\n *\n * @param obj - The object to convert (can be any JSON-serializable value)\n * @returns A new object with all keys converted to snake_case\n */\nexport function toSnakeCaseDeep(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => toSnakeCaseDeep(item));\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const snakeKey = toSnakeCase(key);\n result[snakeKey] = toSnakeCaseDeep(value);\n }\n return result;\n }\n\n return obj;\n}\n","import { createWriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport path from 'node:path';\nimport { finished } from 'node:stream/promises';\nimport { Mutex } from 'async-mutex';\n\nimport { toSnakeCaseDeep } from '../../utils/case-conversion.js';\n\nexport class JsonlWriter {\n private readonly stream: ReturnType<typeof createWriteStream>;\n private readonly mutex = new Mutex();\n private closed = false;\n\n private constructor(stream: ReturnType<typeof createWriteStream>) {\n this.stream = stream;\n }\n\n static async open(filePath: string): Promise<JsonlWriter> {\n await mkdir(path.dirname(filePath), { recursive: true });\n const stream = createWriteStream(filePath, { flags: 'w', encoding: 'utf8' });\n return new JsonlWriter(stream);\n }\n\n async append(record: unknown): Promise<void> {\n await this.mutex.runExclusive(async () => {\n if (this.closed) {\n throw new Error('Cannot write to closed JSONL writer');\n }\n // Convert camelCase keys to snake_case for Python ecosystem compatibility\n const snakeCaseRecord = toSnakeCaseDeep(record);\n const line = `${JSON.stringify(snakeCaseRecord)}\\n`;\n if (!this.stream.write(line)) {\n await new Promise<void>((resolve, reject) => {\n this.stream.once('drain', resolve);\n this.stream.once('error', reject);\n });\n }\n });\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.stream.end();\n await finished(this.stream);\n }\n}\n","const E_TIMEOUT = new Error('timeout while waiting for mutex to become available');\nconst E_ALREADY_LOCKED = new Error('mutex already locked');\nconst E_CANCELED = new Error('request for lock canceled');\n\nvar __awaiter$2 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nclass Semaphore {\n constructor(_value, _cancelError = E_CANCELED) {\n this._value = _value;\n this._cancelError = _cancelError;\n this._queue = [];\n this._weightedWaiters = [];\n }\n acquire(weight = 1, priority = 0) {\n if (weight <= 0)\n throw new Error(`invalid weight ${weight}: must be positive`);\n return new Promise((resolve, reject) => {\n const task = { resolve, reject, weight, priority };\n const i = findIndexFromEnd(this._queue, (other) => priority <= other.priority);\n if (i === -1 && weight <= this._value) {\n // Needs immediate dispatch, skip the queue\n this._dispatchItem(task);\n }\n else {\n this._queue.splice(i + 1, 0, task);\n }\n });\n }\n runExclusive(callback_1) {\n return __awaiter$2(this, arguments, void 0, function* (callback, weight = 1, priority = 0) {\n const [value, release] = yield this.acquire(weight, priority);\n try {\n return yield callback(value);\n }\n finally {\n release();\n }\n });\n }\n waitForUnlock(weight = 1, priority = 0) {\n if (weight <= 0)\n throw new Error(`invalid weight ${weight}: must be positive`);\n if (this._couldLockImmediately(weight, priority)) {\n return Promise.resolve();\n }\n else {\n return new Promise((resolve) => {\n if (!this._weightedWaiters[weight - 1])\n this._weightedWaiters[weight - 1] = [];\n insertSorted(this._weightedWaiters[weight - 1], { resolve, priority });\n });\n }\n }\n isLocked() {\n return this._value <= 0;\n }\n getValue() {\n return this._value;\n }\n setValue(value) {\n this._value = value;\n this._dispatchQueue();\n }\n release(weight = 1) {\n if (weight <= 0)\n throw new Error(`invalid weight ${weight}: must be positive`);\n this._value += weight;\n this._dispatchQueue();\n }\n cancel() {\n this._queue.forEach((entry) => entry.reject(this._cancelError));\n this._queue = [];\n }\n _dispatchQueue() {\n this._drainUnlockWaiters();\n while (this._queue.length > 0 && this._queue[0].weight <= this._value) {\n this._dispatchItem(this._queue.shift());\n this._drainUnlockWaiters();\n }\n }\n _dispatchItem(item) {\n const previousValue = this._value;\n this._value -= item.weight;\n item.resolve([previousValue, this._newReleaser(item.weight)]);\n }\n _newReleaser(weight) {\n let called = false;\n return () => {\n if (called)\n return;\n called = true;\n this.release(weight);\n };\n }\n _drainUnlockWaiters() {\n if (this._queue.length === 0) {\n for (let weight = this._value; weight > 0; weight--) {\n const waiters = this._weightedWaiters[weight - 1];\n if (!waiters)\n continue;\n waiters.forEach((waiter) => waiter.resolve());\n this._weightedWaiters[weight - 1] = [];\n }\n }\n else {\n const queuedPriority = this._queue[0].priority;\n for (let weight = this._value; weight > 0; weight--) {\n const waiters = this._weightedWaiters[weight - 1];\n if (!waiters)\n continue;\n const i = waiters.findIndex((waiter) => waiter.priority <= queuedPriority);\n (i === -1 ? waiters : waiters.splice(0, i))\n .forEach((waiter => waiter.resolve()));\n }\n }\n }\n _couldLockImmediately(weight, priority) {\n return (this._queue.length === 0 || this._queue[0].priority < priority) &&\n weight <= this._value;\n }\n}\nfunction insertSorted(a, v) {\n const i = findIndexFromEnd(a, (other) => v.priority <= other.priority);\n a.splice(i + 1, 0, v);\n}\nfunction findIndexFromEnd(a, predicate) {\n for (let i = a.length - 1; i >= 0; i--) {\n if (predicate(a[i])) {\n return i;\n }\n }\n return -1;\n}\n\nvar __awaiter$1 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nclass Mutex {\n constructor(cancelError) {\n this._semaphore = new Semaphore(1, cancelError);\n }\n acquire() {\n return __awaiter$1(this, arguments, void 0, function* (priority = 0) {\n const [, releaser] = yield this._semaphore.acquire(1, priority);\n return releaser;\n });\n }\n runExclusive(callback, priority = 0) {\n return this._semaphore.runExclusive(() => callback(), 1, priority);\n }\n isLocked() {\n return this._semaphore.isLocked();\n }\n waitForUnlock(priority = 0) {\n return this._semaphore.waitForUnlock(1, priority);\n }\n release() {\n if (this._semaphore.isLocked())\n this._semaphore.release();\n }\n cancel() {\n return this._semaphore.cancel();\n }\n}\n\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nfunction withTimeout(sync, timeout, timeoutError = E_TIMEOUT) {\n return {\n acquire: (weightOrPriority, priority) => {\n let weight;\n if (isSemaphore(sync)) {\n weight = weightOrPriority;\n }\n else {\n weight = undefined;\n priority = weightOrPriority;\n }\n if (weight !== undefined && weight <= 0) {\n throw new Error(`invalid weight ${weight}: must be positive`);\n }\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n let isTimeout = false;\n const handle = setTimeout(() => {\n isTimeout = true;\n reject(timeoutError);\n }, timeout);\n try {\n const ticket = yield (isSemaphore(sync)\n ? sync.acquire(weight, priority)\n : sync.acquire(priority));\n if (isTimeout) {\n const release = Array.isArray(ticket) ? ticket[1] : ticket;\n release();\n }\n else {\n clearTimeout(handle);\n resolve(ticket);\n }\n }\n catch (e) {\n if (!isTimeout) {\n clearTimeout(handle);\n reject(e);\n }\n }\n }));\n },\n runExclusive(callback, weight, priority) {\n return __awaiter(this, void 0, void 0, function* () {\n let release = () => undefined;\n try {\n const ticket = yield this.acquire(weight, priority);\n if (Array.isArray(ticket)) {\n release = ticket[1];\n return yield callback(ticket[0]);\n }\n else {\n release = ticket;\n return yield callback();\n }\n }\n finally {\n release();\n }\n });\n },\n release(weight) {\n sync.release(weight);\n },\n cancel() {\n return sync.cancel();\n },\n waitForUnlock: (weightOrPriority, priority) => {\n let weight;\n if (isSemaphore(sync)) {\n weight = weightOrPriority;\n }\n else {\n weight = undefined;\n priority = weightOrPriority;\n }\n if (weight !== undefined && weight <= 0) {\n throw new Error(`invalid weight ${weight}: must be positive`);\n }\n return new Promise((resolve, reject) => {\n const handle = setTimeout(() => reject(timeoutError), timeout);\n (isSemaphore(sync)\n ? sync.waitForUnlock(weight, priority)\n : sync.waitForUnlock(priority)).then(() => {\n clearTimeout(handle);\n resolve();\n });\n });\n },\n isLocked: () => sync.isLocked(),\n getValue: () => sync.getValue(),\n setValue: (value) => sync.setValue(value),\n };\n}\nfunction isSemaphore(sync) {\n return sync.getValue !== undefined;\n}\n\n// eslint-disable-next-lisne @typescript-eslint/explicit-module-boundary-types\nfunction tryAcquire(sync, alreadyAcquiredError = E_ALREADY_LOCKED) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return withTimeout(sync, 0, alreadyAcquiredError);\n}\n\nexport { E_ALREADY_LOCKED, E_CANCELED, E_TIMEOUT, Mutex, Semaphore, tryAcquire, withTimeout };\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport type { EvaluationResult } from '@agentv/core';\n\nexport function escapeXml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nexport class JunitWriter {\n private readonly filePath: string;\n private readonly results: EvaluationResult[] = [];\n private closed = false;\n\n private constructor(filePath: string) {\n this.filePath = filePath;\n }\n\n static async open(filePath: string): Promise<JunitWriter> {\n await mkdir(path.dirname(filePath), { recursive: true });\n return new JunitWriter(filePath);\n }\n\n async append(result: EvaluationResult): Promise<void> {\n if (this.closed) {\n throw new Error('Cannot write to closed JUnit writer');\n }\n this.results.push(result);\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n this.closed = true;\n\n const grouped = new Map<string, EvaluationResult[]>();\n for (const result of this.results) {\n const suite = result.dataset ?? 'default';\n const existing = grouped.get(suite);\n if (existing) {\n existing.push(result);\n } else {\n grouped.set(suite, [result]);\n }\n }\n\n const suiteXmls: string[] = [];\n for (const [suiteName, results] of grouped) {\n const failures = results.filter((r) => r.score < 0.5).length;\n const errors = results.filter((r) => r.error !== undefined).length;\n\n const testCases = results.map((r) => {\n const time = r.durationMs ? (r.durationMs / 1000).toFixed(3) : '0.000';\n\n let inner = '';\n if (r.error) {\n inner = `\\n <error message=\"${escapeXml(r.error)}\">${escapeXml(r.error)}</error>\\n `;\n } else if (r.score < 0.5) {\n const message = `score=${r.score.toFixed(3)}`;\n const detail = [\n `Score: ${r.score.toFixed(3)}`,\n r.reasoning ? `Reasoning: ${r.reasoning}` : '',\n r.misses.length > 0 ? `Misses: ${r.misses.join(', ')}` : '',\n ]\n .filter(Boolean)\n .join('\\n');\n inner = `\\n <failure message=\"${escapeXml(message)}\">${escapeXml(detail)}</failure>\\n `;\n }\n\n return ` <testcase name=\"${escapeXml(r.testId)}\" classname=\"${escapeXml(suiteName)}\" time=\"${time}\">${inner}</testcase>`;\n });\n\n suiteXmls.push(\n ` <testsuite name=\"${escapeXml(suiteName)}\" tests=\"${results.length}\" failures=\"${failures}\" errors=\"${errors}\">\\n${testCases.join('\\n')}\\n </testsuite>`,\n );\n }\n\n const totalTests = this.results.length;\n const totalFailures = this.results.filter((r) => r.score < 0.5).length;\n const totalErrors = this.results.filter((r) => r.error !== undefined).length;\n\n const xml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<testsuites tests=\"${totalTests}\" failures=\"${totalFailures}\" errors=\"${totalErrors}\">\\n${suiteXmls.join('\\n')}\\n</testsuites>\\n`;\n\n await writeFile(this.filePath, xml, 'utf8');\n }\n}\n","import { createWriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport path from 'node:path';\nimport { finished } from 'node:stream/promises';\nimport { normalizeLineEndings } from '@agentv/core';\nimport { Mutex } from 'async-mutex';\nimport { stringify as stringifyYaml } from 'yaml';\n\nimport { toSnakeCaseDeep } from '../../utils/case-conversion.js';\n\nexport class YamlWriter {\n private readonly stream: ReturnType<typeof createWriteStream>;\n private readonly mutex = new Mutex();\n private closed = false;\n private isFirst = true;\n\n private constructor(stream: ReturnType<typeof createWriteStream>) {\n this.stream = stream;\n }\n\n static async open(filePath: string): Promise<YamlWriter> {\n await mkdir(path.dirname(filePath), { recursive: true });\n const stream = createWriteStream(filePath, { flags: 'w', encoding: 'utf8' });\n return new YamlWriter(stream);\n }\n\n async append(record: unknown): Promise<void> {\n await this.mutex.runExclusive(async () => {\n if (this.closed) {\n throw new Error('Cannot write to closed YAML writer');\n }\n\n // Convert record to snake_case for Python ecosystem compatibility\n const snakeCaseRecord = toSnakeCaseDeep(record);\n\n // Convert to YAML with proper multi-line string handling\n const yamlDoc = stringifyYaml(snakeCaseRecord, {\n indent: 2,\n lineWidth: 0, // Disable line wrapping\n // Let YAML library choose appropriate string style based on content\n // (will use block literal for multiline strings with actual newlines)\n });\n\n // Normalize line endings to LF (\\n) for consistent output across platforms\n const normalizedYaml = normalizeLineEndings(yamlDoc);\n\n // Add YAML document separator (---) between records\n const separator = this.isFirst ? '---\\n' : '\\n---\\n';\n this.isFirst = false;\n\n const content = `${separator}${normalizedYaml}`;\n\n if (!this.stream.write(content)) {\n await new Promise<void>((resolve, reject) => {\n this.stream.once('drain', resolve);\n this.stream.once('error', reject);\n });\n }\n });\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.stream.end();\n await finished(this.stream);\n }\n}\n","export interface WorkerProgress {\n workerId: number;\n testId: string;\n status: 'pending' | 'running' | 'completed' | 'failed';\n startedAt?: number;\n completedAt?: number;\n error?: string;\n targetLabel?: string;\n}\n\n/**\n * Simple line-based progress display.\n * Prints each status update as a new line - no ANSI cursor manipulation.\n * This ensures compatibility with verbose logging from providers.\n */\nexport class ProgressDisplay {\n private readonly workers: Map<number, WorkerProgress> = new Map();\n private totalTests = 0;\n private completedTests = 0;\n private readonly logPaths: string[] = [];\n private readonly logPathSet = new Set<string>();\n private hasPrintedLogHeader = false;\n private started = false;\n private finished = false;\n private readonly verbose: boolean;\n\n constructor(_maxWorkers: number, options?: { verbose?: boolean }) {\n this.verbose = options?.verbose ?? false;\n }\n\n isInteractiveMode(): boolean {\n // Always return false - we use simple line-based output\n return false;\n }\n\n start(): void {\n this.started = true;\n this.finished = false;\n }\n\n setTotalTests(count: number): void {\n this.totalTests = count;\n }\n\n updateWorker(progress: WorkerProgress): void {\n const previous = this.workers.get(progress.workerId);\n this.workers.set(progress.workerId, progress);\n\n if (progress.status === 'completed' || progress.status === 'failed') {\n this.completedTests++;\n }\n\n // Print status updates as simple lines\n const targetSuffix = progress.targetLabel ? ` | ${progress.targetLabel}` : '';\n const countPrefix = `${this.completedTests}/${this.totalTests}`;\n\n switch (progress.status) {\n case 'pending':\n // Only print pending in verbose mode (just shows the queue)\n if (this.verbose && !previous) {\n console.log(`${countPrefix} ⏳ ${progress.testId}${targetSuffix}`);\n }\n break;\n case 'running':\n // Always print running - useful feedback for long-running agents\n if (!previous || previous.status === 'pending') {\n console.log(`${countPrefix} 🔄 ${progress.testId}${targetSuffix}`);\n }\n break;\n case 'completed':\n console.log(`${countPrefix} ✅ ${progress.testId}${targetSuffix}`);\n break;\n case 'failed':\n console.log(\n `${countPrefix} ❌ ${progress.testId}${targetSuffix}${progress.error ? `: ${progress.error}` : ''}`,\n );\n break;\n }\n }\n\n addLogPaths(paths: readonly string[], provider?: 'codex' | 'pi' | 'copilot'): void {\n const newPaths: string[] = [];\n for (const path of paths) {\n if (this.logPathSet.has(path)) {\n continue;\n }\n this.logPathSet.add(path);\n newPaths.push(path);\n }\n\n if (newPaths.length === 0) {\n return;\n }\n\n this.logPaths.push(...newPaths);\n\n if (!this.hasPrintedLogHeader) {\n console.log('');\n const label =\n provider === 'pi'\n ? 'Pi Coding Agent'\n : provider === 'copilot'\n ? 'Copilot CLI'\n : 'Codex CLI';\n console.log(`${label} logs:`);\n this.hasPrintedLogHeader = true;\n }\n\n const startIndex = this.logPaths.length - newPaths.length;\n newPaths.forEach((path, offset) => {\n console.log(`${startIndex + offset + 1}. ${path}`);\n });\n }\n\n finish(): void {\n this.finished = true;\n // Add blank line to separate from summary\n console.log('');\n }\n\n clear(): void {\n // No-op for line-based display\n }\n}\n","import { createReadStream } from 'node:fs';\nimport { createInterface } from 'node:readline';\n\nimport type { EvaluationResult } from '@agentv/core';\n\n/**\n * Load test IDs from a JSONL results file that have executionStatus === 'execution_error'.\n */\nexport async function loadErrorTestIds(jsonlPath: string): Promise<readonly string[]> {\n const ids: string[] = [];\n const rl = createInterface({\n input: createReadStream(jsonlPath),\n crlfDelay: Number.POSITIVE_INFINITY,\n });\n\n for await (const line of rl) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed = JSON.parse(trimmed) as Partial<EvaluationResult>;\n if (parsed.executionStatus === 'execution_error' && parsed.testId) {\n ids.push(parsed.testId);\n }\n } catch {\n // Skip malformed lines\n }\n }\n\n return [...new Set(ids)];\n}\n\n/**\n * Load results from a JSONL file that do NOT have executionStatus === 'execution_error'.\n * These are the \"good\" results that should be preserved when merging retry output.\n */\nexport async function loadNonErrorResults(jsonlPath: string): Promise<readonly EvaluationResult[]> {\n const results: EvaluationResult[] = [];\n const rl = createInterface({\n input: createReadStream(jsonlPath),\n crlfDelay: Number.POSITIVE_INFINITY,\n });\n\n for await (const line of rl) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed = JSON.parse(trimmed) as Partial<EvaluationResult>;\n if (!parsed.testId || parsed.score === undefined) continue;\n if (parsed.executionStatus !== 'execution_error') {\n results.push(parsed as EvaluationResult);\n }\n } catch {\n // Skip malformed lines\n }\n }\n\n return results;\n}\n","import type { EvaluationResult } from '@agentv/core';\n\nexport interface HistogramBin {\n readonly range: readonly [number, number];\n count: number;\n}\n\nexport interface EvaluationSummary {\n readonly total: number;\n readonly mean: number;\n readonly median: number;\n readonly min: number;\n readonly max: number;\n readonly standardDeviation?: number;\n readonly histogram: readonly HistogramBin[];\n readonly topResults: readonly EvaluationResult[];\n readonly bottomResults: readonly EvaluationResult[];\n readonly errorCount: number;\n readonly errors: readonly { readonly testId: string; readonly error: string }[];\n readonly executionErrorCount: number;\n readonly qualityFailureCount: number;\n readonly passedCount: number;\n readonly byFailureStage: Readonly<Record<string, number>>;\n readonly byFailureReason: Readonly<Record<string, number>>;\n}\n\nconst HISTOGRAM_BREAKPOINTS = [0, 0.2, 0.4, 0.6, 0.8, 1];\n\nfunction computeMean(values: readonly number[]): number {\n if (values.length === 0) {\n return 0;\n }\n const sum = values.reduce((acc, value) => acc + value, 0);\n return sum / values.length;\n}\n\nfunction computeMedian(values: readonly number[]): number {\n if (values.length === 0) {\n return 0;\n }\n const sorted = [...values].sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n if (sorted.length % 2 === 0) {\n return (sorted[mid - 1] + sorted[mid]) / 2;\n }\n return sorted[mid];\n}\n\nfunction computeStandardDeviation(values: readonly number[]): number | undefined {\n if (values.length < 2) {\n return undefined;\n }\n const mean = computeMean(values);\n const variance =\n values.reduce((acc, value) => acc + (value - mean) ** 2, 0) / (values.length - 1);\n return Math.sqrt(variance);\n}\n\nfunction buildHistogram(values: readonly number[]): readonly HistogramBin[] {\n const bins: HistogramBin[] = [];\n for (let index = 0; index < HISTOGRAM_BREAKPOINTS.length - 1; index += 1) {\n bins.push({\n range: [HISTOGRAM_BREAKPOINTS[index], HISTOGRAM_BREAKPOINTS[index + 1]] as const,\n count: 0,\n });\n }\n\n for (const value of values) {\n for (const bin of bins) {\n const [start, end] = bin.range;\n const isLastBin = end === HISTOGRAM_BREAKPOINTS[HISTOGRAM_BREAKPOINTS.length - 1];\n const withinRange = isLastBin\n ? value >= start && value <= end\n : value >= start && value < end + 1e-9;\n if (withinRange) {\n bin.count += 1;\n break;\n }\n }\n }\n\n return bins;\n}\n\nexport function calculateEvaluationSummary(\n results: readonly EvaluationResult[],\n): EvaluationSummary {\n const total = results.length;\n\n // Track errors\n const errors = results\n .filter((result) => result.error !== undefined)\n .map((result) => ({ testId: result.testId, error: result.error as string }));\n const errorCount = errors.length;\n\n if (total === 0) {\n return {\n total: 0,\n mean: 0,\n median: 0,\n min: 0,\n max: 0,\n standardDeviation: undefined,\n histogram: buildHistogram([]),\n topResults: [],\n bottomResults: [],\n errorCount: 0,\n errors: [],\n executionErrorCount: 0,\n qualityFailureCount: 0,\n passedCount: 0,\n byFailureStage: {},\n byFailureReason: {},\n };\n }\n\n // Separate execution errors from quality results\n const executionErrors = results.filter((r) => r.executionStatus === 'execution_error');\n const qualityResults = results.filter((r) => r.executionStatus !== 'execution_error');\n const qualityScores = qualityResults.map((r) => r.score);\n\n // Compute quality metrics from non-execution-error results only\n const mean = computeMean(qualityScores);\n const median = computeMedian(qualityScores);\n const min = qualityScores.length > 0 ? Math.min(...qualityScores) : 0;\n const max = qualityScores.length > 0 ? Math.max(...qualityScores) : 0;\n const standardDeviation = computeStandardDeviation(qualityScores);\n const histogram = buildHistogram(qualityScores);\n\n // Top/bottom results consider only non-execution-error results\n const sortedResults = [...qualityResults].sort((a, b) => b.score - a.score);\n const topResults = sortedResults.slice(0, Math.min(3, sortedResults.length));\n const bottomResults = sortedResults.slice(-Math.min(3, sortedResults.length));\n\n // Count by execution status\n const executionErrorCount = executionErrors.length;\n const qualityFailureCount = results.filter((r) => r.executionStatus === 'quality_failure').length;\n const passedCount = results.filter((r) => r.executionStatus === 'ok').length;\n\n // Aggregate by failure stage and reason (execution errors only)\n const byFailureStage: Record<string, number> = {};\n const byFailureReason: Record<string, number> = {};\n for (const result of executionErrors) {\n if (result.failureStage) {\n byFailureStage[result.failureStage] = (byFailureStage[result.failureStage] ?? 0) + 1;\n }\n if (result.failureReasonCode) {\n byFailureReason[result.failureReasonCode] =\n (byFailureReason[result.failureReasonCode] ?? 0) + 1;\n }\n }\n\n return {\n total,\n mean,\n median,\n min,\n max,\n standardDeviation,\n histogram,\n topResults,\n bottomResults,\n errorCount,\n errors,\n executionErrorCount,\n qualityFailureCount,\n passedCount,\n byFailureStage,\n byFailureReason,\n };\n}\n\nfunction formatScore(value: number): string {\n return value.toFixed(3);\n}\n\nexport function formatEvaluationSummary(summary: EvaluationSummary): string {\n if (summary.total === 0) {\n return '\\nNo results to summarize';\n }\n\n const lines: string[] = [];\n\n // Display errors first if any exist\n if (summary.errorCount > 0) {\n lines.push('\\n==================================================');\n lines.push('EXECUTION ERRORS');\n lines.push('==================================================');\n for (const error of summary.errors) {\n lines.push(`\\n❌ ${error.testId}`);\n lines.push(` ${error.error}`);\n }\n lines.push('');\n }\n\n lines.push('\\n==================================================');\n lines.push('EVALUATION SUMMARY');\n lines.push('==================================================');\n lines.push(`Total tests: ${summary.total}`);\n lines.push(`Passed: ${summary.passedCount}`);\n if (summary.qualityFailureCount > 0) {\n lines.push(`Quality failures: ${summary.qualityFailureCount}`);\n }\n if (summary.executionErrorCount > 0) {\n lines.push(`Execution errors: ${summary.executionErrorCount}`);\n }\n\n if (summary.executionErrorCount > 0) {\n const qualityCount = summary.total - summary.executionErrorCount;\n lines.push(\n `Mean score: ${formatScore(summary.mean)} (${qualityCount} quality tests, ${summary.executionErrorCount} execution errors excluded)`,\n );\n } else {\n lines.push(`Mean score: ${formatScore(summary.mean)}`);\n }\n lines.push(`Median score: ${formatScore(summary.median)}`);\n lines.push(`Min score: ${formatScore(summary.min)}`);\n lines.push(`Max score: ${formatScore(summary.max)}`);\n if (typeof summary.standardDeviation === 'number') {\n lines.push(`Std deviation: ${formatScore(summary.standardDeviation)}`);\n }\n\n lines.push('\\nScore distribution:');\n for (const bin of summary.histogram) {\n const [start, end] = bin.range;\n lines.push(` ${start.toFixed(1)}-${end.toFixed(1)}: ${bin.count}`);\n }\n\n lines.push('\\nTop performing tests:');\n summary.topResults.forEach((result, index) => {\n lines.push(` ${index + 1}. ${result.testId}: ${formatScore(result.score)}`);\n });\n\n lines.push('\\nLowest performing tests:');\n summary.bottomResults.forEach((result, index) => {\n lines.push(` ${index + 1}. ${result.testId}: ${formatScore(result.score)}`);\n });\n\n const failureStageEntries = Object.entries(summary.byFailureStage);\n if (failureStageEntries.length > 0) {\n lines.push('\\nExecution errors by stage:');\n for (const [stage, count] of failureStageEntries) {\n lines.push(` ${stage}: ${count}`);\n }\n }\n\n const failureReasonEntries = Object.entries(summary.byFailureReason);\n if (failureReasonEntries.length > 0) {\n lines.push('\\nExecution errors by reason:');\n for (const [reason, count] of failureReasonEntries) {\n lines.push(` ${reason}: ${count}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format a matrix summary table showing tests × targets.\n */\nexport function formatMatrixSummary(results: readonly EvaluationResult[]): string {\n // Collect unique targets and test IDs\n const targetSet = new Set<string>();\n const testIdSet = new Set<string>();\n for (const result of results) {\n targetSet.add(result.target);\n testIdSet.add(result.testId);\n }\n\n const targets = [...targetSet].sort();\n const testIds = [...testIdSet].sort();\n\n if (targets.length < 2) {\n return '';\n }\n\n // Build lookup: testId -> target -> score\n const scoreMap = new Map<string, Map<string, number>>();\n for (const result of results) {\n if (!scoreMap.has(result.testId)) {\n scoreMap.set(result.testId, new Map());\n }\n scoreMap.get(result.testId)?.set(result.target, result.score);\n }\n\n const lines: string[] = [];\n lines.push('\\n==================================================');\n lines.push('MATRIX RESULTS (tests × targets)');\n lines.push('==================================================');\n\n // Header row\n const testIdColWidth = Math.max(7, ...testIds.map((id) => id.length));\n const targetColWidth = Math.max(7, ...targets.map((t) => t.length));\n const header = `${'Test'.padEnd(testIdColWidth)} ${targets.map((t) => t.padEnd(targetColWidth)).join(' ')}`;\n lines.push(header);\n lines.push('-'.repeat(header.length));\n\n // Data rows\n for (const testId of testIds) {\n const cells = targets.map((target) => {\n const score = scoreMap.get(testId)?.get(target);\n return score !== undefined\n ? formatScore(score).padEnd(targetColWidth)\n : '-'.padEnd(targetColWidth);\n });\n lines.push(`${testId.padEnd(testIdColWidth)} ${cells.join(' ')}`);\n }\n\n // Per-target averages\n lines.push('-'.repeat(header.length));\n const avgCells = targets.map((target) => {\n const scores = results.filter((r) => r.target === target).map((r) => r.score);\n const avg = scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0;\n return formatScore(avg).padEnd(targetColWidth);\n });\n lines.push(`${'Average'.padEnd(testIdColWidth)} ${avgCells.join(' ')}`);\n\n return lines.join('\\n');\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport type { FileType } from './types.js';\n\nconst SCHEMA_EVAL_V2 = 'agentv-eval-v2';\nconst SCHEMA_TARGETS_V2 = 'agentv-targets-v2.2';\nconst SCHEMA_CONFIG_V2 = 'agentv-config-v2';\n\n/**\n * Detect file type by reading $schema field from YAML file.\n * If $schema is missing, infers type from filename/path:\n * - config.yaml under .agentv folder → 'config'\n * - targets.yaml under .agentv folder → 'targets'\n * - All other YAML files → 'eval' (default)\n */\nexport async function detectFileType(filePath: string): Promise<FileType> {\n try {\n const content = await readFile(filePath, 'utf8');\n const parsed = parse(content) as unknown;\n\n if (typeof parsed !== 'object' || parsed === null) {\n return inferFileTypeFromPath(filePath);\n }\n\n const record = parsed as Record<string, unknown>;\n const schema = record.$schema;\n\n if (typeof schema !== 'string') {\n // No $schema field - infer from path\n return inferFileTypeFromPath(filePath);\n }\n\n switch (schema) {\n case SCHEMA_EVAL_V2:\n return 'eval';\n case SCHEMA_TARGETS_V2:\n return 'targets';\n case SCHEMA_CONFIG_V2:\n return 'config';\n default:\n // Unknown schema - infer from path\n return inferFileTypeFromPath(filePath);\n }\n } catch {\n return inferFileTypeFromPath(filePath);\n }\n}\n\n/**\n * Infer file type from filename and directory path.\n */\nfunction inferFileTypeFromPath(filePath: string): FileType {\n const normalized = path.normalize(filePath).replace(/\\\\/g, '/');\n const basename = path.basename(filePath);\n\n // Check if file is under .agentv folder\n if (normalized.includes('/.agentv/')) {\n if (basename === 'config.yaml' || basename === 'config.yml') {\n return 'config';\n }\n if (basename === 'targets.yaml' || basename === 'targets.yml') {\n return 'targets';\n }\n }\n\n // Default to eval file\n return 'eval';\n}\n\n/**\n * Check if a schema value is a valid AgentV schema identifier.\n */\nexport function isValidSchema(schema: unknown): boolean {\n return schema === SCHEMA_EVAL_V2 || schema === SCHEMA_TARGETS_V2 || schema === SCHEMA_CONFIG_V2;\n}\n\n/**\n * Get the expected schema for a file type.\n */\nexport function getExpectedSchema(fileType: FileType): string | undefined {\n switch (fileType) {\n case 'eval':\n return SCHEMA_EVAL_V2;\n case 'targets':\n return SCHEMA_TARGETS_V2;\n case 'config':\n return SCHEMA_CONFIG_V2;\n default:\n return undefined;\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport { isEvaluatorKind } from '../types.js';\nimport type { ValidationError, ValidationResult } from './types.js';\n\ntype JsonValue = string | number | boolean | null | JsonObject | JsonArray;\ntype JsonObject = { readonly [key: string]: JsonValue };\ntype JsonArray = readonly JsonValue[];\n\n/** Assertion evaluator types that require a string `value` field. */\nconst ASSERTION_TYPES_WITH_STRING_VALUE = new Set([\n 'contains',\n 'icontains',\n 'starts-with',\n 'ends-with',\n 'equals',\n 'regex',\n]);\n/** Assertion evaluator types that require a string[] `value` field. */\nconst ASSERTION_TYPES_WITH_ARRAY_VALUE = new Set([\n 'contains-any',\n 'contains-all',\n 'icontains-any',\n 'icontains-all',\n]);\n\n/** Valid file extensions for external test files. */\nconst VALID_TEST_FILE_EXTENSIONS = new Set(['.yaml', '.yml', '.jsonl']);\n\n/** Name field pattern: lowercase alphanumeric with hyphens. */\nconst NAME_PATTERN = /^[a-z0-9-]+$/;\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Validate an eval file (agentv-eval-v2 schema).\n */\nexport async function validateEvalFile(filePath: string): Promise<ValidationResult> {\n const errors: ValidationError[] = [];\n const absolutePath = path.resolve(filePath);\n\n let parsed: unknown;\n try {\n const content = await readFile(absolutePath, 'utf8');\n parsed = parse(content);\n } catch (error) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n message: `Failed to parse YAML: ${(error as Error).message}`,\n });\n return {\n valid: false,\n filePath: absolutePath,\n fileType: 'eval',\n errors,\n };\n }\n\n if (!isObject(parsed)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n message: 'File must contain a YAML object',\n });\n return {\n valid: false,\n filePath: absolutePath,\n fileType: 'eval',\n errors,\n };\n }\n\n // Validate metadata fields\n validateMetadata(parsed, absolutePath, errors);\n\n // Validate suite-level input (optional: string shorthand or message array)\n const suiteInput = parsed.input;\n if (suiteInput !== undefined) {\n if (typeof suiteInput === 'string') {\n // String shorthand is valid\n } else if (Array.isArray(suiteInput)) {\n validateMessages(suiteInput, 'input', absolutePath, errors);\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'input',\n message: \"Invalid suite-level 'input' field (must be a string or array of messages)\",\n });\n }\n }\n\n // Resolve tests with backward-compat aliases\n let cases: JsonValue | undefined = parsed.tests;\n if (cases === undefined && 'eval_cases' in parsed) {\n cases = parsed.eval_cases;\n errors.push({\n severity: 'warning',\n filePath: absolutePath,\n location: 'eval_cases',\n message: \"'eval_cases' is deprecated. Use 'tests' instead.\",\n });\n }\n if (cases === undefined && 'evalcases' in parsed) {\n cases = parsed.evalcases;\n errors.push({\n severity: 'warning',\n filePath: absolutePath,\n location: 'evalcases',\n message: \"'evalcases' is deprecated. Use 'tests' instead.\",\n });\n }\n\n // tests can be a string path (external file reference) or an array\n if (typeof cases === 'string') {\n validateTestsStringPath(cases, absolutePath, errors);\n return {\n valid: errors.filter((e) => e.severity === 'error').length === 0,\n filePath: absolutePath,\n fileType: 'eval',\n errors,\n };\n }\n\n if (!Array.isArray(cases)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'tests',\n message: \"Missing or invalid 'tests' field (must be an array or a file path string)\",\n });\n return {\n valid: errors.length === 0,\n filePath: absolutePath,\n fileType: 'eval',\n errors,\n };\n }\n\n // Validate each eval case\n for (let i = 0; i < cases.length; i++) {\n const evalCase = cases[i];\n const location = `tests[${i}]`;\n\n if (!isObject(evalCase)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message: 'Eval case must be an object',\n });\n continue;\n }\n\n // Required fields: id, input\n const id = evalCase.id;\n if (typeof id !== 'string' || id.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.id`,\n message: \"Missing or invalid 'id' field (must be a non-empty string)\",\n });\n }\n\n // Optional: criteria (with backward-compat alias expected_outcome)\n let criteria: JsonValue | undefined = evalCase.criteria;\n if (criteria === undefined && 'expected_outcome' in evalCase) {\n criteria = evalCase.expected_outcome;\n errors.push({\n severity: 'warning',\n filePath: absolutePath,\n location: `${location}.expected_outcome`,\n message: \"'expected_outcome' is deprecated. Use 'criteria' instead.\",\n });\n }\n if (criteria !== undefined && (typeof criteria !== 'string' || criteria.trim().length === 0)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.criteria`,\n message: \"Invalid 'criteria' field (must be a non-empty string if provided)\",\n });\n }\n\n // input field (string shorthand or message array)\n const inputField = evalCase.input;\n if (inputField !== undefined) {\n if (typeof inputField === 'string') {\n // String shorthand is valid - no further validation needed\n } else if (Array.isArray(inputField)) {\n validateMessages(inputField, `${location}.input`, absolutePath, errors);\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.input`,\n message: \"Invalid 'input' field (must be a string or array of messages)\",\n });\n }\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.input`,\n message: \"Missing 'input' field (must be a string or array of messages)\",\n });\n }\n\n // expected_output field (string/object shorthand or message array)\n const expectedOutputField = evalCase.expected_output;\n if (expectedOutputField !== undefined) {\n if (typeof expectedOutputField === 'string') {\n // String shorthand is valid - no further validation needed\n } else if (Array.isArray(expectedOutputField)) {\n // Check if it looks like a message array (first element has 'role')\n if (\n expectedOutputField.length > 0 &&\n isObject(expectedOutputField[0]) &&\n 'role' in expectedOutputField[0]\n ) {\n validateMessages(\n expectedOutputField,\n `${location}.expected_output`,\n absolutePath,\n errors,\n );\n }\n // Otherwise it's treated as structured array content - valid\n } else if (isObject(expectedOutputField)) {\n // Object shorthand or single message - both are valid\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.expected_output`,\n message: \"Invalid 'expected_output' field (must be a string, object, or array)\",\n });\n }\n }\n\n // assert field (array of assertion objects)\n const assertField = evalCase.assert;\n if (assertField !== undefined) {\n validateAssertArray(assertField, location, absolutePath, errors);\n }\n }\n\n // Validate workspace repo lifecycle config\n if (isObject(parsed.workspace)) {\n validateWorkspaceRepoConfig(parsed.workspace, absolutePath, errors);\n }\n\n return {\n valid: errors.filter((e) => e.severity === 'error').length === 0,\n filePath: absolutePath,\n fileType: 'eval',\n errors,\n };\n}\n\nfunction validateWorkspaceRepoConfig(\n workspace: JsonObject,\n filePath: string,\n errors: ValidationError[],\n): void {\n const repos = workspace.repos;\n const hooks = workspace.hooks;\n const afterEachHook = isObject(hooks) ? hooks.after_each : undefined;\n const isolation = workspace.isolation;\n\n // Depth vs ancestor warning\n if (Array.isArray(repos)) {\n for (const repo of repos) {\n if (!isObject(repo)) continue;\n const checkout = repo.checkout;\n const clone = repo.clone;\n if (isObject(checkout) && isObject(clone)) {\n const ancestor = checkout.ancestor;\n const depth = clone.depth;\n if (typeof ancestor === 'number' && typeof depth === 'number' && depth < ancestor + 1) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `workspace.repos[path=${repo.path}]`,\n message:\n `clone.depth (${depth}) may be insufficient for checkout.ancestor (${ancestor}). ` +\n `Recommend depth >= ${ancestor + 1}.`,\n });\n }\n }\n }\n }\n\n // Reset without repos warning\n if (isObject(afterEachHook) && afterEachHook.reset && afterEachHook.reset !== 'none') {\n if (!Array.isArray(repos) || repos.length === 0) {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'workspace.hooks.after_each',\n message: `hooks.after_each.reset '${afterEachHook.reset}' has no effect without repos.`,\n });\n }\n }\n\n // after_each reset with per_test isolation warning\n if (isObject(afterEachHook) && afterEachHook.reset && isolation === 'per_test') {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'workspace.hooks.after_each',\n message:\n 'hooks.after_each.reset is redundant with isolation: per_test (each test gets a fresh workspace).',\n });\n }\n}\n\nfunction validateMessages(\n messages: JsonArray,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i];\n const msgLocation = `${location}[${i}]`;\n\n if (!isObject(message)) {\n errors.push({\n severity: 'error',\n filePath,\n location: msgLocation,\n message: 'Message must be an object',\n });\n continue;\n }\n\n // Validate role field\n const role = message.role;\n const validRoles = ['system', 'user', 'assistant'];\n if (!validRoles.includes(role as string)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${msgLocation}.role`,\n message: `Invalid role '${role}'. Must be one of: ${validRoles.join(', ')}`,\n });\n }\n\n // Validate content field (can be string or array)\n const content = message.content;\n if (typeof content === 'string') {\n validateContentForRoleMarkers(content, `${msgLocation}.content`, filePath, errors);\n } else if (Array.isArray(content)) {\n // Array content - validate each element\n for (let j = 0; j < content.length; j++) {\n const contentItem = content[j];\n const contentLocation = `${msgLocation}.content[${j}]`;\n\n if (typeof contentItem === 'string') {\n validateContentForRoleMarkers(contentItem, contentLocation, filePath, errors);\n } else if (isObject(contentItem)) {\n const type = contentItem.type;\n if (typeof type !== 'string') {\n errors.push({\n severity: 'error',\n filePath,\n location: `${contentLocation}.type`,\n message: \"Content object must have a 'type' field\",\n });\n }\n\n // For 'file' type, we'll validate existence later in file-reference-validator\n // For 'text' type, require 'value' field\n if (type === 'text') {\n const value = contentItem.value;\n if (typeof value !== 'string') {\n errors.push({\n severity: 'error',\n filePath,\n location: `${contentLocation}.value`,\n message: \"Content with type 'text' must have a 'value' field\",\n });\n } else {\n validateContentForRoleMarkers(value, `${contentLocation}.value`, filePath, errors);\n }\n }\n } else {\n errors.push({\n severity: 'error',\n filePath,\n location: contentLocation,\n message: 'Content array items must be strings or objects',\n });\n }\n }\n } else {\n errors.push({\n severity: 'error',\n filePath,\n location: `${msgLocation}.content`,\n message: \"Missing or invalid 'content' field (must be a string or array)\",\n });\n }\n }\n}\n\nfunction validateMetadata(parsed: JsonObject, filePath: string, errors: ValidationError[]): void {\n const name = parsed.name;\n if (name !== undefined) {\n if (typeof name === 'string') {\n if (!NAME_PATTERN.test(name)) {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'name',\n message: `Invalid 'name' format '${name}'. Must match pattern /^[a-z0-9-]+$/ (lowercase alphanumeric with hyphens).`,\n });\n }\n }\n\n // Warn if name is present but description is missing\n if (!('description' in parsed) || parsed.description === undefined) {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'name',\n message: \"When 'name' is present, 'description' should also be provided.\",\n });\n }\n }\n}\n\nfunction validateTestsStringPath(\n testsPath: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n const ext = path.extname(testsPath);\n if (!VALID_TEST_FILE_EXTENSIONS.has(ext)) {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'tests',\n message: `Unsupported file extension '${ext}' for tests path '${testsPath}'. Supported extensions: ${[...VALID_TEST_FILE_EXTENSIONS].join(', ')}`,\n });\n }\n}\n\nfunction validateAssertArray(\n assertField: JsonValue,\n parentLocation: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (!Array.isArray(assertField)) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${parentLocation}.assert`,\n message: \"'assert' must be an array of assertion objects.\",\n });\n return;\n }\n\n for (let i = 0; i < assertField.length; i++) {\n const item = assertField[i];\n const location = `${parentLocation}.assert[${i}]`;\n\n if (!isObject(item)) {\n errors.push({\n severity: 'warning',\n filePath,\n location,\n message: 'Assertion item must be an object with a type field.',\n });\n continue;\n }\n\n // Validate type field\n const rawTypeValue = item.type;\n if (rawTypeValue === undefined || typeof rawTypeValue !== 'string') {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.type`,\n message: \"Assertion item is missing a 'type' field.\",\n });\n continue;\n }\n\n // Normalize snake_case to kebab-case for backward compatibility\n const typeValue = rawTypeValue.replace(/_/g, '-');\n\n if (!isEvaluatorKind(typeValue)) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.type`,\n message: `Unknown assertion type '${rawTypeValue}'.`,\n });\n continue;\n }\n\n // Validate value field for types that require a string value\n if (ASSERTION_TYPES_WITH_STRING_VALUE.has(typeValue)) {\n const value = item.value;\n if (value === undefined || typeof value !== 'string') {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.value`,\n message: `Assertion type '${typeValue}' requires a 'value' field (string).`,\n });\n continue;\n }\n\n // For regex type, validate that the pattern is valid\n if (typeValue === 'regex') {\n try {\n new RegExp(value);\n } catch {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.value`,\n message: `Invalid regex pattern '${value}': not a valid regular expression.`,\n });\n }\n }\n }\n\n // Validate value field for types that require a string array value\n if (ASSERTION_TYPES_WITH_ARRAY_VALUE.has(typeValue)) {\n const value = item.value;\n if (!Array.isArray(value) || value.length === 0) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.value`,\n message: `Assertion type '${typeValue}' requires a 'value' field (non-empty string array).`,\n });\n continue;\n }\n }\n\n // Validate required field if present\n const required = item.required;\n if (required !== undefined) {\n validateRequiredField(required, location, filePath, errors);\n }\n }\n}\n\nfunction validateRequiredField(\n required: JsonValue,\n parentLocation: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (typeof required === 'boolean') {\n return; // Valid\n }\n if (typeof required === 'number') {\n if (required <= 0 || required > 1) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${parentLocation}.required`,\n message: `Invalid 'required' value ${required}. When a number, it must be between 0 (exclusive) and 1 (inclusive).`,\n });\n }\n return;\n }\n errors.push({\n severity: 'warning',\n filePath,\n location: `${parentLocation}.required`,\n message: `Invalid 'required' value. Must be a boolean or a number between 0 (exclusive) and 1 (inclusive).`,\n });\n}\n\nfunction validateContentForRoleMarkers(\n content: string,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n // Check for standard role markers that might confuse agentic providers\n const markers = ['@[System]:', '@[User]:', '@[Assistant]:', '@[Tool]:'];\n for (const marker of markers) {\n if (content.toLowerCase().includes(marker.toLowerCase())) {\n errors.push({\n severity: 'warning',\n filePath,\n location,\n message: `Content contains potential role marker '${marker}'. This may confuse agentic providers or cause prompt injection.`,\n });\n }\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport { CLI_PLACEHOLDERS } from '../providers/targets.js';\nimport { KNOWN_PROVIDERS, PROVIDER_ALIASES } from '../providers/types.js';\nimport type { ValidationError, ValidationResult } from './types.js';\n\ntype JsonValue = string | number | boolean | null | JsonObject | JsonArray;\ntype JsonObject = { readonly [key: string]: JsonValue };\ntype JsonArray = readonly JsonValue[];\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n// Known settings properties for each provider type\nconst COMMON_SETTINGS = new Set(['provider_batching', 'providerBatching']);\n\nconst RETRY_SETTINGS = new Set([\n 'max_retries',\n 'maxRetries',\n 'retry_initial_delay_ms',\n 'retryInitialDelayMs',\n 'retry_max_delay_ms',\n 'retryMaxDelayMs',\n 'retry_backoff_factor',\n 'retryBackoffFactor',\n 'retry_status_codes',\n 'retryStatusCodes',\n]);\n\nconst AZURE_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n ...RETRY_SETTINGS,\n 'endpoint',\n 'resource',\n 'resourceName',\n 'api_key',\n 'apiKey',\n 'deployment',\n 'deploymentName',\n 'model',\n 'version',\n 'api_version',\n 'temperature',\n 'max_output_tokens',\n 'maxTokens',\n]);\n\nconst ANTHROPIC_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n ...RETRY_SETTINGS,\n 'api_key',\n 'apiKey',\n 'model',\n 'deployment',\n 'variant',\n 'temperature',\n 'max_output_tokens',\n 'maxTokens',\n 'thinking_budget',\n 'thinkingBudget',\n]);\n\nconst GEMINI_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n ...RETRY_SETTINGS,\n 'api_key',\n 'apiKey',\n 'model',\n 'deployment',\n 'variant',\n 'temperature',\n 'max_output_tokens',\n 'maxTokens',\n]);\n\nconst CODEX_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'model',\n 'executable',\n 'command',\n 'binary',\n 'args',\n 'arguments',\n 'cwd',\n 'timeout_seconds',\n 'timeoutSeconds',\n 'log_dir',\n 'logDir',\n 'log_directory',\n 'logDirectory',\n 'log_format',\n 'logFormat',\n 'log_output_format',\n 'logOutputFormat',\n 'system_prompt',\n 'systemPrompt',\n 'workspace_template',\n 'workspaceTemplate',\n]);\n\nconst COPILOT_SDK_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'cli_url',\n 'cliUrl',\n 'cli_path',\n 'cliPath',\n 'github_token',\n 'githubToken',\n 'model',\n 'cwd',\n 'timeout_seconds',\n 'timeoutSeconds',\n 'log_dir',\n 'logDir',\n 'log_format',\n 'logFormat',\n 'system_prompt',\n 'systemPrompt',\n 'workspace_template',\n 'workspaceTemplate',\n]);\n\nconst COPILOT_CLI_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'executable',\n 'command',\n 'binary',\n 'args',\n 'arguments',\n 'model',\n 'cwd',\n 'timeout_seconds',\n 'timeoutSeconds',\n 'log_dir',\n 'logDir',\n 'log_format',\n 'logFormat',\n 'system_prompt',\n 'systemPrompt',\n 'workspace_template',\n 'workspaceTemplate',\n]);\n\nconst VSCODE_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'executable',\n 'workspace_template',\n 'workspaceTemplate',\n 'wait',\n 'dry_run',\n 'dryRun',\n 'subagent_root',\n 'subagentRoot',\n 'timeout_seconds',\n 'timeoutSeconds',\n]);\n\nconst MOCK_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'response',\n 'delayMs',\n 'delayMinMs',\n 'delayMaxMs',\n 'trace', // For testing tool-trajectory evaluator\n]);\n\n// CLI_SETTINGS removed - Zod schema validation now handles CLI provider settings validation\n// in resolveCliConfig() via CliTargetInputSchema\n\nconst CLAUDE_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'model',\n 'cwd',\n 'timeout_seconds',\n 'timeoutSeconds',\n 'log_dir',\n 'logDir',\n 'log_directory',\n 'logDirectory',\n 'log_format',\n 'logFormat',\n 'log_output_format',\n 'logOutputFormat',\n 'system_prompt',\n 'systemPrompt',\n 'workspace_template',\n 'workspaceTemplate',\n 'max_turns',\n 'maxTurns',\n 'max_budget_usd',\n 'maxBudgetUsd',\n]);\n\nfunction getKnownSettings(provider: string): Set<string> | null {\n const normalizedProvider = provider.toLowerCase();\n switch (normalizedProvider) {\n case 'azure':\n case 'azure-openai':\n return AZURE_SETTINGS;\n case 'anthropic':\n return ANTHROPIC_SETTINGS;\n case 'gemini':\n case 'google':\n case 'google-gemini':\n return GEMINI_SETTINGS;\n case 'codex':\n case 'codex-cli':\n return CODEX_SETTINGS;\n case 'copilot-sdk':\n case 'copilot_sdk':\n return COPILOT_SDK_SETTINGS;\n case 'copilot':\n case 'copilot-cli':\n return COPILOT_CLI_SETTINGS;\n case 'claude':\n case 'claude-code':\n case 'claude-sdk':\n return CLAUDE_SETTINGS;\n case 'vscode':\n case 'vscode-insiders':\n return VSCODE_SETTINGS;\n case 'mock':\n return MOCK_SETTINGS;\n case 'cli':\n // CLI provider validation is now handled by Zod schema in resolveCliConfig()\n // Return null to skip duplicate validation in validateUnknownSettings()\n return null;\n default:\n return null; // Unknown provider, can't validate settings\n }\n}\n\nfunction validateUnknownSettings(\n target: JsonObject,\n provider: string,\n absolutePath: string,\n location: string,\n errors: ValidationError[],\n): void {\n const removedTargetFields = new Set(['workspace_template', 'workspaceTemplate']);\n const knownSettings = getKnownSettings(provider);\n if (!knownSettings) {\n // Unknown provider, skip settings validation\n return;\n }\n\n // Known base target fields that aren't settings\n const baseFields = new Set(['name', 'provider', 'judge_target', 'workers', '$schema', 'targets']);\n\n for (const key of Object.keys(target)) {\n if (removedTargetFields.has(key)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.${key}`,\n message:\n 'target-level workspace_template has been removed. Use eval-level workspace.template.',\n });\n continue;\n }\n\n if (!baseFields.has(key) && !knownSettings.has(key)) {\n errors.push({\n severity: 'warning',\n filePath: absolutePath,\n location: `${location}.${key}`,\n message: `Unknown setting '${key}' for ${provider} provider. This property will be ignored.`,\n });\n }\n }\n}\n\n/**\n * Validate a targets file (agentv-targets-v2.1 schema).\n */\nexport async function validateTargetsFile(filePath: string): Promise<ValidationResult> {\n const errors: ValidationError[] = [];\n const absolutePath = path.resolve(filePath);\n\n let parsed: unknown;\n try {\n const content = await readFile(absolutePath, 'utf8');\n parsed = parse(content);\n } catch (error) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n message: `Failed to parse YAML: ${(error as Error).message}`,\n });\n return {\n valid: false,\n filePath: absolutePath,\n fileType: 'targets',\n errors,\n };\n }\n\n /**\n * Simplified CLI settings validation for early file validation.\n * Detailed type checking is now handled by Zod schema validation in resolveCliConfig().\n * This function focuses on critical early checks: command template presence and placeholder validation.\n */\n function validateCliSettings(\n target: JsonObject,\n absolutePath: string,\n location: string,\n errors: ValidationError[],\n ): void {\n // Critical check: command is required\n const command = target.command;\n if (typeof command !== 'string' || command.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.command`,\n message: \"CLI provider requires 'command' as a non-empty string\",\n });\n } else {\n // Validate CLI placeholders early to give helpful feedback\n recordUnknownPlaceholders(command, absolutePath, `${location}.command`, errors);\n }\n\n // Early validation of healthcheck structure and placeholders\n const healthcheck = target.healthcheck;\n if (healthcheck !== undefined) {\n validateCliHealthcheck(healthcheck, absolutePath, `${location}.healthcheck`, errors);\n }\n }\n\n function validateCliHealthcheck(\n healthcheck: unknown,\n absolutePath: string,\n location: string,\n errors: ValidationError[],\n ): void {\n if (!isObject(healthcheck)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message: \"'healthcheck' must be an object when provided\",\n });\n return;\n }\n\n const timeoutSeconds = healthcheck.timeout_seconds ?? healthcheck.timeoutSeconds;\n if (timeoutSeconds !== undefined) {\n const numericTimeout = Number(timeoutSeconds);\n if (!Number.isFinite(numericTimeout) || numericTimeout <= 0) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.timeoutSeconds`,\n message: 'healthcheck.timeoutSeconds must be a positive number when provided',\n });\n }\n }\n\n // Determine healthcheck type by presence of url or command\n const hasUrl = typeof healthcheck.url === 'string' && healthcheck.url.trim().length > 0;\n const hasCommand =\n typeof healthcheck.command === 'string' && healthcheck.command.trim().length > 0;\n\n if (!hasUrl && !hasCommand) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message: \"healthcheck must have either 'url' (HTTP) or 'command' (command)\",\n });\n return;\n }\n\n if (hasUrl) {\n // HTTP healthcheck — url already validated above\n return;\n }\n\n // Command healthcheck\n recordUnknownPlaceholders(\n healthcheck.command as string,\n absolutePath,\n `${location}.command`,\n errors,\n );\n\n const cwd = healthcheck.cwd;\n if (cwd !== undefined && typeof cwd !== 'string') {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.cwd`,\n message: 'healthcheck.cwd must be a string when provided',\n });\n }\n }\n\n function recordUnknownPlaceholders(\n template: string,\n absolutePath: string,\n location: string,\n errors: ValidationError[],\n ): void {\n const placeholders = extractPlaceholders(template);\n for (const placeholder of placeholders) {\n if (!CLI_PLACEHOLDERS.has(placeholder)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message: `Unknown CLI placeholder '{${placeholder}}'. Supported placeholders: ${Array.from(CLI_PLACEHOLDERS).join(', ')}`,\n });\n }\n }\n }\n\n function extractPlaceholders(template: string): string[] {\n const matches = template.matchAll(/\\{([A-Z_]+)\\}/g);\n const result: string[] = [];\n for (const match of matches) {\n const placeholder = match[1];\n if (placeholder) {\n result.push(placeholder);\n }\n }\n return result;\n }\n\n if (!isObject(parsed)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n message: 'File must contain a YAML object',\n });\n return {\n valid: false,\n filePath: absolutePath,\n fileType: 'targets',\n errors,\n };\n }\n\n // Validate targets array\n const targets = parsed.targets;\n if (!Array.isArray(targets)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'targets',\n message: \"Missing or invalid 'targets' field (must be an array)\",\n });\n return {\n valid: errors.length === 0,\n filePath: absolutePath,\n fileType: 'targets',\n errors,\n };\n }\n\n // Validate each target definition\n const knownProviders = [...KNOWN_PROVIDERS, ...PROVIDER_ALIASES];\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n const location = `targets[${i}]`;\n\n if (!isObject(target)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message: 'Target must be an object',\n });\n continue;\n }\n\n // Required field: name\n const name = target.name;\n if (typeof name !== 'string' || name.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.name`,\n message: \"Missing or invalid 'name' field (must be a non-empty string)\",\n });\n }\n\n // Required field: provider\n const provider = target.provider;\n const providerValue = typeof provider === 'string' ? provider.trim().toLowerCase() : undefined;\n if (typeof provider !== 'string' || provider.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.provider`,\n message: \"Missing or invalid 'provider' field (must be a non-empty string)\",\n });\n } else if (!knownProviders.includes(provider)) {\n // Warning for unknown providers (non-fatal)\n errors.push({\n severity: 'warning',\n filePath: absolutePath,\n location: `${location}.provider`,\n message: `Unknown provider '${provider}'. Known providers: ${knownProviders.join(', ')}`,\n });\n }\n\n // Validate CLI provider fields\n if (providerValue === 'cli') {\n validateCliSettings(target, absolutePath, location, errors);\n }\n\n // Check for unknown settings properties on target object\n if (typeof provider === 'string') {\n validateUnknownSettings(target, provider, absolutePath, location, errors);\n }\n\n // Optional field: judge_target (must be string if present)\n const judgeTarget = target.judge_target;\n if (judgeTarget !== undefined && typeof judgeTarget !== 'string') {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.judge_target`,\n message: \"Invalid 'judge_target' field (must be a string)\",\n });\n }\n }\n\n return {\n valid: errors.filter((e) => e.severity === 'error').length === 0,\n filePath: absolutePath,\n fileType: 'targets',\n errors,\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport { parse } from 'yaml';\n\nimport type { ValidationError, ValidationResult } from './types.js';\n\n/**\n * Validate a config.yaml file for schema compliance and structural correctness.\n */\nexport async function validateConfigFile(filePath: string): Promise<ValidationResult> {\n const errors: ValidationError[] = [];\n\n try {\n const content = await readFile(filePath, 'utf8');\n const parsed = parse(content) as unknown;\n\n // Check if parsed content is an object\n if (typeof parsed !== 'object' || parsed === null) {\n errors.push({\n severity: 'error',\n filePath,\n message: 'Config file must contain a valid YAML object',\n });\n return { valid: false, filePath, fileType: 'config', errors };\n }\n\n const config = parsed as Record<string, unknown>;\n\n // Validate guideline_patterns if present\n const guidelinePatterns = config.guideline_patterns;\n if (guidelinePatterns !== undefined) {\n if (!Array.isArray(guidelinePatterns)) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'guideline_patterns',\n message: \"Field 'guideline_patterns' must be an array\",\n });\n } else if (!guidelinePatterns.every((p) => typeof p === 'string')) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'guideline_patterns',\n message: \"All entries in 'guideline_patterns' must be strings\",\n });\n } else if (guidelinePatterns.length === 0) {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'guideline_patterns',\n message: \"Field 'guideline_patterns' is empty. Consider removing it or adding patterns.\",\n });\n }\n }\n\n // Validate eval_patterns if present\n const evalPatterns = config.eval_patterns;\n if (evalPatterns !== undefined) {\n if (!Array.isArray(evalPatterns)) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'eval_patterns',\n message: \"Field 'eval_patterns' must be an array\",\n });\n } else if (!evalPatterns.every((p) => typeof p === 'string')) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'eval_patterns',\n message: \"All entries in 'eval_patterns' must be strings\",\n });\n } else if (evalPatterns.length === 0) {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'eval_patterns',\n message: \"Field 'eval_patterns' is empty. Consider removing it or adding patterns.\",\n });\n }\n }\n\n // Check for unexpected fields\n const allowedFields = new Set(['$schema', 'guideline_patterns', 'eval_patterns']);\n const unexpectedFields = Object.keys(config).filter((key) => !allowedFields.has(key));\n\n if (unexpectedFields.length > 0) {\n errors.push({\n severity: 'warning',\n filePath,\n message: `Unexpected fields: ${unexpectedFields.join(', ')}`,\n });\n }\n\n return {\n valid: errors.filter((e) => e.severity === 'error').length === 0,\n filePath,\n fileType: 'config',\n errors,\n };\n } catch (error) {\n errors.push({\n severity: 'error',\n filePath,\n message: `Failed to parse config file: ${(error as Error).message}`,\n });\n return { valid: false, filePath, fileType: 'config', errors };\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport { buildSearchRoots, findGitRoot, resolveFileReference } from '../file-utils.js';\nimport type { ValidationError } from './types.js';\n\ntype JsonValue = string | number | boolean | null | JsonObject | JsonArray;\ntype JsonObject = { readonly [key: string]: JsonValue };\ntype JsonArray = readonly JsonValue[];\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Validate that file references in eval file content exist.\n * Checks content blocks with type: \"file\" and validates the referenced file exists.\n * Also checks that referenced files are not empty.\n */\nexport async function validateFileReferences(\n evalFilePath: string,\n): Promise<readonly ValidationError[]> {\n const errors: ValidationError[] = [];\n const absolutePath = path.resolve(evalFilePath);\n\n // Find git root and build search roots (same as yaml-parser does at runtime)\n const gitRoot = await findGitRoot(absolutePath);\n if (!gitRoot) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n message: 'Cannot validate file references: git repository root not found',\n });\n return errors;\n }\n\n const searchRoots = buildSearchRoots(absolutePath, gitRoot);\n\n let parsed: unknown;\n try {\n const content = await readFile(absolutePath, 'utf8');\n parsed = parse(content);\n } catch {\n // Parse errors are already caught by eval-validator\n return errors;\n }\n\n if (!isObject(parsed)) {\n return errors;\n }\n\n let cases: JsonValue | undefined = parsed.tests;\n if (cases === undefined && 'eval_cases' in parsed) {\n cases = parsed.eval_cases;\n }\n if (cases === undefined && 'evalcases' in parsed) {\n cases = parsed.evalcases;\n }\n if (!Array.isArray(cases)) {\n return errors;\n }\n\n for (let i = 0; i < cases.length; i++) {\n const evalCase = cases[i];\n if (!isObject(evalCase)) {\n continue;\n }\n\n // Check input\n const inputField = evalCase.input;\n if (Array.isArray(inputField)) {\n await validateMessagesFileRefs(\n inputField,\n `tests[${i}].input`,\n searchRoots,\n absolutePath,\n errors,\n );\n }\n\n // Check expected_output\n const expectedOutputField = evalCase.expected_output;\n if (Array.isArray(expectedOutputField)) {\n await validateMessagesFileRefs(\n expectedOutputField,\n `tests[${i}].expected_output`,\n searchRoots,\n absolutePath,\n errors,\n );\n }\n }\n\n return errors;\n}\n\nasync function validateMessagesFileRefs(\n messages: JsonArray,\n location: string,\n searchRoots: readonly string[],\n filePath: string,\n errors: ValidationError[],\n): Promise<void> {\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i];\n if (!isObject(message)) {\n continue;\n }\n\n const content = message.content;\n if (typeof content === 'string') {\n continue;\n }\n\n if (!Array.isArray(content)) {\n continue;\n }\n\n for (let j = 0; j < content.length; j++) {\n const contentItem = content[j];\n if (!isObject(contentItem)) {\n continue;\n }\n\n const type = contentItem.type;\n if (type !== 'file') {\n continue;\n }\n\n const value = contentItem.value;\n if (typeof value !== 'string') {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}[${i}].content[${j}].value`,\n message: \"File reference must have a 'value' field with the file path\",\n });\n continue;\n }\n\n // Use the same file resolution logic as yaml-parser at runtime\n const { resolvedPath } = await resolveFileReference(value, searchRoots);\n\n if (!resolvedPath) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}[${i}].content[${j}]`,\n message: `Referenced file not found: ${value}`,\n });\n } else {\n // Check that file is not empty\n try {\n const fileContent = await readFile(resolvedPath, 'utf8');\n if (fileContent.trim().length === 0) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}[${i}].content[${j}]`,\n message: `Referenced file is empty: ${value}`,\n });\n }\n } catch (error) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}[${i}].content[${j}]`,\n message: `Cannot read referenced file: ${value} (${(error as Error).message})`,\n });\n }\n }\n }\n }\n}\n","import {\n type ResolvedTarget,\n type TargetDefinition,\n listTargetNames,\n readTargetDefinitions,\n readTestSuiteMetadata,\n resolveTargetDefinition,\n} from '@agentv/core';\nimport { validateTargetsFile } from '@agentv/core/evaluation/validation';\nimport { discoverTargetsFile } from '../../utils/targets.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RED = '\\u001b[31m';\nconst ANSI_RESET = '\\u001b[0m';\n\nfunction isTTY(): boolean {\n return process.stdout.isTTY ?? false;\n}\n\nexport async function readTestSuiteTarget(testFilePath: string): Promise<string | undefined> {\n const metadata = await readTestSuiteMetadata(testFilePath);\n return metadata.target;\n}\n\nexport async function readTestSuiteTargets(\n testFilePath: string,\n): Promise<readonly string[] | undefined> {\n const metadata = await readTestSuiteMetadata(testFilePath);\n return metadata.targets;\n}\n\nexport interface TargetSelection {\n readonly definitions: readonly TargetDefinition[];\n readonly resolvedTarget: ResolvedTarget;\n readonly targetName: string;\n readonly targetSource: 'cli' | 'test-file' | 'default';\n readonly targetsFilePath: string;\n}\n\nexport interface TargetSelectionOptions {\n readonly testFilePath: string;\n readonly repoRoot: string;\n readonly cwd: string;\n readonly explicitTargetsPath?: string;\n readonly cliTargetName?: string;\n readonly cliTargetNames?: readonly string[];\n readonly dryRun: boolean;\n readonly dryRunDelay: number;\n readonly dryRunDelayMin: number;\n readonly dryRunDelayMax: number;\n readonly env: NodeJS.ProcessEnv;\n}\n\nfunction pickTargetName(options: {\n readonly cliTargetName?: string;\n readonly fileTargetName?: string;\n}): { readonly name: string; readonly source: 'cli' | 'test-file' | 'default' } {\n const cliName = options.cliTargetName?.trim();\n if (cliName && cliName !== 'default') {\n return { name: cliName, source: 'cli' };\n }\n\n const fileName = options.fileTargetName?.trim();\n if (fileName && fileName.length > 0) {\n return { name: fileName, source: 'test-file' };\n }\n\n return { name: 'default', source: 'default' };\n}\n\nexport async function selectTarget(options: TargetSelectionOptions): Promise<TargetSelection> {\n const {\n testFilePath,\n repoRoot,\n cwd,\n explicitTargetsPath,\n cliTargetName,\n dryRun,\n dryRunDelay,\n dryRunDelayMin,\n dryRunDelayMax,\n env,\n } = options;\n\n const targetsFilePath = await discoverTargetsFile({\n explicitPath: explicitTargetsPath,\n testFilePath,\n repoRoot,\n cwd,\n });\n\n // Validate the targets file and show warnings\n const validationResult = await validateTargetsFile(targetsFilePath);\n const warnings = validationResult.errors.filter((e) => e.severity === 'warning');\n const useColors = isTTY();\n\n if (warnings.length > 0) {\n console.warn(`\\nWarnings in ${targetsFilePath}:`);\n for (const warning of warnings) {\n const location = warning.location ? ` [${warning.location}]` : '';\n const prefix = useColors ? `${ANSI_YELLOW} ⚠${ANSI_RESET}` : ' ⚠';\n const message = useColors ? `${ANSI_YELLOW}${warning.message}${ANSI_RESET}` : warning.message;\n console.warn(`${prefix}${location} ${message}`);\n }\n console.warn('');\n }\n\n // Check for errors (should fail if invalid)\n const errors = validationResult.errors.filter((e) => e.severity === 'error');\n if (errors.length > 0) {\n console.error(`\\nErrors in ${targetsFilePath}:`);\n for (const error of errors) {\n const location = error.location ? ` [${error.location}]` : '';\n const prefix = useColors ? `${ANSI_RED} ✗${ANSI_RESET}` : ' ✗';\n const message = useColors ? `${ANSI_RED}${error.message}${ANSI_RESET}` : error.message;\n console.error(`${prefix}${location} ${message}`);\n }\n throw new Error(`Targets file validation failed with ${errors.length} error(s)`);\n }\n\n const definitions = await readTargetDefinitions(targetsFilePath);\n const fileTargetName = await readTestSuiteTarget(testFilePath);\n const targetChoice = pickTargetName({ cliTargetName, fileTargetName });\n\n const targetDefinition = definitions.find(\n (definition: TargetDefinition) => definition.name === targetChoice.name,\n );\n if (!targetDefinition) {\n const available = listTargetNames(definitions).join(', ');\n throw new Error(\n `Target '${targetChoice.name}' not found in ${targetsFilePath}. Available targets: ${available}`,\n );\n }\n\n if (dryRun) {\n const mockTarget: ResolvedTarget = {\n kind: 'mock',\n name: `${targetDefinition.name}-dry-run`,\n judgeTarget: undefined,\n config: {\n response: '{\"answer\":\"Mock dry-run response\"}',\n delayMs: dryRunDelay,\n delayMinMs: dryRunDelayMin,\n delayMaxMs: dryRunDelayMax,\n },\n };\n\n return {\n definitions,\n resolvedTarget: mockTarget,\n targetName: targetChoice.name,\n targetSource: targetChoice.source,\n targetsFilePath,\n };\n }\n\n try {\n const resolvedTarget = resolveTargetDefinition(targetDefinition, env, testFilePath);\n return {\n definitions,\n resolvedTarget,\n targetName: targetChoice.name,\n targetSource: targetChoice.source,\n targetsFilePath,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to resolve target '${targetChoice.name}': ${message}`);\n }\n}\n\n/**\n * Select multiple targets for matrix evaluation.\n * Returns an array of TargetSelection, one per target name.\n */\nexport async function selectMultipleTargets(\n options: TargetSelectionOptions & { readonly targetNames: readonly string[] },\n): Promise<readonly TargetSelection[]> {\n const {\n testFilePath,\n repoRoot,\n cwd,\n explicitTargetsPath,\n dryRun,\n dryRunDelay,\n dryRunDelayMin,\n dryRunDelayMax,\n env,\n targetNames,\n } = options;\n\n const targetsFilePath = await discoverTargetsFile({\n explicitPath: explicitTargetsPath,\n testFilePath,\n repoRoot,\n cwd,\n });\n\n // Validate targets file once\n const validationResult = await validateTargetsFile(targetsFilePath);\n const warnings = validationResult.errors.filter((e) => e.severity === 'warning');\n const useColors = isTTY();\n if (warnings.length > 0) {\n console.warn(`\\nWarnings in ${targetsFilePath}:`);\n for (const warning of warnings) {\n const location = warning.location ? ` [${warning.location}]` : '';\n const prefix = useColors ? `${ANSI_YELLOW} ⚠${ANSI_RESET}` : ' ⚠';\n const message = useColors ? `${ANSI_YELLOW}${warning.message}${ANSI_RESET}` : warning.message;\n console.warn(`${prefix}${location} ${message}`);\n }\n console.warn('');\n }\n const errors = validationResult.errors.filter((e) => e.severity === 'error');\n if (errors.length > 0) {\n console.error(`\\nErrors in ${targetsFilePath}:`);\n for (const error of errors) {\n const location = error.location ? ` [${error.location}]` : '';\n const prefix = useColors ? `${ANSI_RED} ✗${ANSI_RESET}` : ' ✗';\n const message = useColors ? `${ANSI_RED}${error.message}${ANSI_RESET}` : error.message;\n console.error(`${prefix}${location} ${message}`);\n }\n throw new Error(`Targets file validation failed with ${errors.length} error(s)`);\n }\n\n const definitions = await readTargetDefinitions(targetsFilePath);\n const results: TargetSelection[] = [];\n\n for (const name of targetNames) {\n const targetDefinition = definitions.find(\n (definition: TargetDefinition) => definition.name === name,\n );\n if (!targetDefinition) {\n const available = listTargetNames(definitions).join(', ');\n throw new Error(\n `Target '${name}' not found in ${targetsFilePath}. Available targets: ${available}`,\n );\n }\n\n if (dryRun) {\n const mockTarget: ResolvedTarget = {\n kind: 'mock',\n name: `${targetDefinition.name}-dry-run`,\n judgeTarget: undefined,\n config: {\n response: '{\"answer\":\"Mock dry-run response\"}',\n delayMs: dryRunDelay,\n delayMinMs: dryRunDelayMin,\n delayMaxMs: dryRunDelayMax,\n },\n };\n results.push({\n definitions,\n resolvedTarget: mockTarget,\n targetName: name,\n targetSource: 'cli',\n targetsFilePath,\n });\n } else {\n try {\n const resolvedTarget = resolveTargetDefinition(targetDefinition, env, testFilePath);\n results.push({\n definitions,\n resolvedTarget,\n targetName: name,\n targetSource: 'cli',\n targetsFilePath,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to resolve target '${name}': ${message}`);\n }\n }\n }\n\n return results;\n}\n"],"mappings":"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,KAAK;QACV,UAAU;QACV;QACA;QACA,SAAS,2CAA2C,MAAM;MAC5D,CAAC;IACH;EACF;AACF;ACllBA,SAASG,UAAS,OAAqC;AACrD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAGA,IAAM,kBAAkB,oBAAI,IAAI,CAAC,qBAAqB,kBAAkB,CAAC;AAEzE,IAAM,iBAAiB,oBAAI,IAAI;EAC7B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,iBAAiB,oBAAI,IAAI;EAC7B,GAAG;EACH,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,qBAAqB,oBAAI,IAAI;EACjC,GAAG;EACH,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,kBAAkB,oBAAI,IAAI;EAC9B,GAAG;EACH,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,iBAAiB,oBAAI,IAAI;EAC7B,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,uBAAuB,oBAAI,IAAI;EACnC,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,uBAAuB,oBAAI,IAAI;EACnC,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,kBAAkB,oBAAI,IAAI;EAC9B,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,gBAAgB,oBAAI,IAAI;EAC5B,GAAG;E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","names":["constants","access","path","path","access","constants","constants","access","path","constants","access","path","fileExists","path","path","path","mkdir","path","mkdir","path","mkdir","writeFile","path","createWriteStream","mkdir","path","finished","mkdir","path","createWriteStream","finished","path","path","path","readFile","parse","path","readFile","parse","isObject","absolutePath","errors","ANSI_YELLOW","ANSI_RED","ANSI_RESET","ANSI_YELLOW","ANSI_RESET","ANSI_RED","access","constants","path","stat"]}
|