agentv 5.3.0-next.1 → 5.3.1-next.1
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/README.md +22 -20
- package/dist/{artifact-writer-JFNIPMKW.js → artifact-writer-7NBCOAYC.js} +4 -4
- package/dist/{chunk-T32NL3E6.js → chunk-ASIGJIOJ.js} +50 -30
- package/dist/chunk-ASIGJIOJ.js.map +1 -0
- package/dist/{chunk-6ZZCDZPD.js → chunk-ELCJ23K4.js} +12766 -12478
- package/dist/chunk-ELCJ23K4.js.map +1 -0
- package/dist/{chunk-FVR4RQFK.js → chunk-LKGARI3W.js} +333 -24
- package/dist/chunk-LKGARI3W.js.map +1 -0
- package/dist/{chunk-V52ATPTT.js → chunk-LXBI3SPX.js} +142 -14
- package/dist/chunk-LXBI3SPX.js.map +1 -0
- package/dist/{chunk-BHKQHG26.js → chunk-RKE7SSET.js} +2 -2
- package/dist/cli.js +5 -5
- package/dist/dashboard/assets/{index-DNgf3qJ2.js → index-CbEMiJSb.js} +1 -1
- package/dist/dashboard/assets/{index-r_jSJmlw.js → index-DTA6-l7q.js} +3 -3
- package/dist/dashboard/index.html +1 -1
- package/dist/{dist-6Z7U473R.js → dist-NMXMI5SK.js} +17 -5
- package/dist/index.js +5 -5
- package/dist/{interactive-RUY3OCBI.js → interactive-BN527UV3.js} +5 -5
- package/dist/skills/agentv-bench/SKILL.md +14 -13
- package/dist/skills/agentv-bench/agents/analyzer.md +1 -1
- package/dist/skills/agentv-bench/agents/executor.md +1 -1
- package/dist/skills/agentv-bench/references/autoresearch.md +9 -9
- package/dist/skills/agentv-bench/references/environment-adaptation.md +4 -4
- package/dist/skills/agentv-bench/references/eval-yaml-spec.md +30 -47
- package/dist/skills/agentv-bench/references/schemas.md +44 -60
- package/dist/skills/agentv-bench/references/subagent-pipeline.md +20 -18
- package/dist/skills/agentv-eval-migrations/SKILL.md +13 -0
- package/dist/skills/agentv-eval-migrations/references/breaking-changes.md +39 -21
- package/dist/skills/agentv-eval-writer/SKILL.md +75 -46
- package/dist/skills/agentv-eval-writer/references/custom-evaluators.md +10 -5
- package/dist/skills/agentv-eval-writer/references/eval.schema.json +749 -2158
- package/dist/skills/agentv-eval-writer/references/rubric-evaluator.md +1 -1
- package/dist/{ts-eval-loader-DQDYRULE-V3377FOL.js → ts-eval-loader-2RFVZHCT-7CZ3DCDD.js} +8 -4
- package/package.json +1 -1
- package/dist/chunk-6ZZCDZPD.js.map +0 -1
- package/dist/chunk-FVR4RQFK.js.map +0 -1
- package/dist/chunk-T32NL3E6.js.map +0 -1
- package/dist/chunk-V52ATPTT.js.map +0 -1
- /package/dist/{artifact-writer-JFNIPMKW.js.map → artifact-writer-7NBCOAYC.js.map} +0 -0
- /package/dist/{chunk-BHKQHG26.js.map → chunk-RKE7SSET.js.map} +0 -0
- /package/dist/{dist-6Z7U473R.js.map → dist-NMXMI5SK.js.map} +0 -0
- /package/dist/{interactive-RUY3OCBI.js.map → interactive-BN527UV3.js.map} +0 -0
- /package/dist/{ts-eval-loader-DQDYRULE-V3377FOL.js.map → ts-eval-loader-2RFVZHCT-7CZ3DCDD.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/eval/shared.ts","../src/commands/read-adapters/agent-skills-evals.ts","../package.json","../src/commands/eval/result-layout.ts","../src/utils/targets.ts","../src/commands/eval/discover.ts","../src/commands/eval/run-eval.ts","../../../node_modules/.bun/yocto-queue@1.2.2/node_modules/yocto-queue/index.js","../../../node_modules/.bun/p-limit@6.2.0/node_modules/p-limit/index.js","../src/version-check.ts","../src/commands/results/remote.ts","../src/commands/inspect/utils.ts","../src/commands/results/manifest.ts","../src/commands/eval/env.ts","../src/commands/eval/jsonl-writer.ts","../../../node_modules/.bun/async-mutex@0.5.0/node_modules/async-mutex/index.mjs","../src/commands/eval/output-writer.ts","../src/commands/eval/progress-display.ts","../src/commands/eval/retry-errors.ts","../src/commands/eval/run-cache.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/cases-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","../../../packages/core/src/evaluation/validation/workspace-path-validator.ts","../src/commands/eval/targets.ts","../src/commands/eval/wip-checkpoint.ts"],"sourcesContent":["import { constants } from 'node:fs';\nimport { access, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { isTypeScriptEvalConfigFileName, typeScriptEvalConfigGlob } from '@agentv/core';\nimport fg from 'fast-glob';\n\nimport { isAgentSkillsEvalsJsonFile } from '../read-adapters/agent-skills-evals.js';\n\nexport interface ResolveEvalPathOptions {\n readonly allowReadAdapters?: boolean;\n}\n\nfunction isNativeEvalFile(filePath: string): boolean {\n return /\\.(ya?ml|jsonl)$/i.test(filePath) || isTypeScriptEvalConfigFileName(filePath);\n}\n\nfunction shouldInspectJsonPath(filePath: string): boolean {\n const base = path.basename(filePath).toLowerCase();\n return base === 'evals.json' || base.endsWith('.evals.json');\n}\n\nfunction jsonEvalPathError(pattern: string): Error {\n return new Error(\n `Unsupported .json eval file: ${pattern}. Agent Skills evals.json read adapters require top-level 'skill_name' and 'evals'. Use YAML, JSONL, TypeScript, or run 'agentv convert ${pattern} --out EVAL.yaml'.`,\n );\n}\n\nexport async function resolveEvalPaths(\n evalPaths: string[],\n cwd: string,\n options: ResolveEvalPathOptions = {},\n): 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 // Separate negation patterns (!glob) from include patterns.\n // Negation patterns are passed to fast-glob as `ignore`.\n const includePatterns: string[] = [];\n const ignorePatterns: string[] = [];\n for (const input of normalizedInputs) {\n if (input.startsWith('!')) {\n ignorePatterns.push(input.slice(1));\n } else {\n includePatterns.push(input);\n }\n }\n\n if (includePatterns.length === 0) {\n throw new Error('No eval paths provided (only negation patterns found).');\n }\n\n const results = new Set<string>();\n\n for (const pattern of includePatterns) {\n // If the pattern points to an existing file or directory, short-circuit globbing\n const candidatePath = path.isAbsolute(pattern)\n ? path.normalize(pattern)\n : path.resolve(cwd, pattern);\n let candidateStats: Awaited<ReturnType<typeof stat>> | undefined;\n try {\n candidateStats = await stat(candidatePath);\n } catch {\n candidateStats = undefined;\n }\n\n if (candidateStats) {\n if (candidateStats.isFile() && path.extname(candidatePath).toLowerCase() === '.json') {\n if (options.allowReadAdapters && isAgentSkillsEvalsJsonFile(candidatePath)) {\n results.add(candidatePath);\n continue;\n }\n throw jsonEvalPathError(pattern);\n }\n if (candidateStats.isFile() && isNativeEvalFile(candidatePath)) {\n results.add(candidatePath);\n continue;\n }\n if (candidateStats.isDirectory()) {\n // Auto-expand directory to recursive eval file glob\n const filePattern = options.allowReadAdapters\n ? `{suite.yaml,suite.yml,*.eval.yaml,*.eval.yml,eval.yaml,eval.yml,${typeScriptEvalConfigGlob()},evals.json,*.evals.json}`\n : `{suite.yaml,suite.yml,*.eval.yaml,*.eval.yml,eval.yaml,eval.yml,${typeScriptEvalConfigGlob()}}`;\n const dirGlob = path.posix.join(candidatePath.replace(/\\\\/g, '/'), `**/${filePattern}`);\n const dirMatches = await fg(dirGlob, {\n absolute: true,\n onlyFiles: true,\n unique: true,\n dot: true,\n followSymbolicLinks: true,\n ignore: ignorePatterns,\n });\n for (const filePath of dirMatches) {\n results.add(path.normalize(filePath));\n }\n continue;\n }\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 ignore: ignorePatterns,\n });\n\n const supportedMatches = matches.filter((filePath) => {\n if (isNativeEvalFile(filePath)) {\n return true;\n }\n return (\n options.allowReadAdapters &&\n path.extname(filePath).toLowerCase() === '.json' &&\n shouldInspectJsonPath(filePath) &&\n isAgentSkillsEvalsJsonFile(filePath)\n );\n });\n for (const filePath of supportedMatches) {\n results.add(path.normalize(filePath));\n }\n }\n\n if (ignorePatterns.length > 0 && results.size > 0) {\n const ignoredMatches = await fg(ignorePatterns, {\n cwd,\n absolute: true,\n onlyFiles: true,\n unique: true,\n dot: true,\n followSymbolicLinks: true,\n });\n\n for (const filePath of ignoredMatches) {\n results.delete(path.normalize(filePath));\n }\n }\n\n if (results.size === 0) {\n throw new Error(\n `No eval files matched any provided paths or globs: ${includePatterns.join(\n ', ',\n )}. Provide YAML, JSONL, TypeScript, or supported read-adapter paths/globs (e.g., \"evals/**/suite.yaml\", \"evals/**/*.eval.ts\", \"skills/**/evals.json\").`,\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 { readFileSync } from 'node:fs';\n\ninterface AgentSkillsEvalsFile {\n readonly skill_name: string;\n readonly evals: readonly unknown[];\n}\n\nexport interface AgentSkillsCriterion {\n readonly id: string;\n readonly outcome: string;\n readonly required: true;\n}\n\nexport interface ConvertedAgentSkillsTest {\n readonly id: string;\n readonly prompt: string;\n readonly expectedOutcome?: string;\n readonly criteria: readonly AgentSkillsCriterion[];\n readonly files: readonly string[];\n readonly metadata: Record<string, unknown>;\n}\n\nexport interface ConvertedAgentSkillsSuite {\n readonly skillName: string;\n readonly tests: readonly ConvertedAgentSkillsTest[];\n}\n\nexport interface AgentVYamlObject {\n readonly description: string;\n readonly tags: Record<string, string>;\n readonly metadata: Record<string, unknown>;\n readonly tests: readonly Record<string, unknown>[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.every((item) => typeof item === 'string');\n}\n\nexport function isAgentSkillsEvalsFormat(parsed: unknown): parsed is AgentSkillsEvalsFile {\n return (\n isRecord(parsed) &&\n typeof parsed.skill_name === 'string' &&\n parsed.skill_name.trim().length > 0 &&\n Array.isArray(parsed.evals)\n );\n}\n\nfunction normalizedStringArray(value: unknown): readonly string[] {\n return isStringArray(value) ? value.map((item) => item.trim()).filter(Boolean) : [];\n}\n\nexport function parseAgentSkillsEvals(parsed: unknown, source: string): ConvertedAgentSkillsSuite {\n if (!isAgentSkillsEvalsFormat(parsed)) {\n throw new Error(\n \"Not a valid Agent Skills evals.json: expected top-level 'skill_name' string and 'evals' array\",\n );\n }\n\n if (parsed.evals.length === 0) {\n throw new Error(`Invalid Agent Skills evals.json: 'evals' array is empty in '${source}'`);\n }\n\n const skillName = parsed.skill_name.trim();\n const tests = parsed.evals.map((rawCase, index): ConvertedAgentSkillsTest => {\n if (!isRecord(rawCase)) {\n throw new Error(`Invalid Agent Skills evals.json: evals[${index}] must be an object`);\n }\n\n if (typeof rawCase.prompt !== 'string' || rawCase.prompt.trim() === '') {\n throw new Error(\n `Invalid Agent Skills evals.json: evals[${index}].prompt must be a non-empty string`,\n );\n }\n\n const id = rawCase.id === undefined ? String(index + 1) : String(rawCase.id);\n const expectedOutcome =\n typeof rawCase.expected_output === 'string' && rawCase.expected_output.trim().length > 0\n ? rawCase.expected_output.trim()\n : undefined;\n const assertions = normalizedStringArray(rawCase.assertions);\n const expectations = normalizedStringArray(rawCase.expectations);\n const files = normalizedStringArray(rawCase.files);\n const criteria: AgentSkillsCriterion[] = [];\n\n if (expectedOutcome) {\n criteria.push({\n id: 'expected-outcome',\n outcome: expectedOutcome,\n required: true,\n });\n }\n\n for (const [assertionIndex, assertion] of assertions.entries()) {\n criteria.push({\n id: `assertion-${assertionIndex + 1}`,\n outcome: assertion,\n required: true,\n });\n }\n\n for (const [expectationIndex, expectation] of expectations.entries()) {\n criteria.push({\n id: `expectation-${expectationIndex + 1}`,\n outcome: expectation,\n required: true,\n });\n }\n\n const metadata: Record<string, unknown> = {};\n if (typeof rawCase.name === 'string' && rawCase.name.trim().length > 0) {\n metadata.agent_skills_name = rawCase.name.trim();\n }\n if (rawCase.id !== undefined) {\n metadata.agent_skills_id = rawCase.id;\n }\n if (files.length > 0) {\n metadata.agent_skills_files = files;\n }\n\n return {\n id,\n prompt: rawCase.prompt,\n ...(expectedOutcome ? { expectedOutcome } : {}),\n criteria,\n files,\n metadata,\n };\n });\n\n return { skillName, tests };\n}\n\nexport function readAgentSkillsEvalsFile(filePath: string): ConvertedAgentSkillsSuite {\n const content = readFileSync(filePath, 'utf8');\n return parseAgentSkillsEvals(JSON.parse(content), filePath);\n}\n\nexport function isAgentSkillsEvalsJsonFile(filePath: string): boolean {\n try {\n const content = readFileSync(filePath, 'utf8');\n return isAgentSkillsEvalsFormat(JSON.parse(content));\n } catch {\n return false;\n }\n}\n\nexport function agentSkillsToAgentVYamlObject(suite: ConvertedAgentSkillsSuite): AgentVYamlObject {\n return {\n description: `Evals for ${suite.skillName} skill`,\n tags: {\n skill: suite.skillName,\n },\n metadata: {\n source_adapter: 'agent-skills-evals-json',\n },\n tests: suite.tests.map((test) => ({\n id: test.id,\n ...(test.expectedOutcome ? { criteria: test.expectedOutcome } : {}),\n ...(test.files.length > 0 ? { input_files: [...test.files] } : {}),\n input: test.prompt,\n ...(test.criteria.length > 0\n ? {\n assert: [\n {\n metric: 'agent-skills-criteria',\n type: 'llm-rubric',\n value: test.criteria.map((criterion) => ({ ...criterion })),\n },\n ],\n }\n : {}),\n ...(Object.keys(test.metadata).length > 0 ? { metadata: test.metadata } : {}),\n })),\n };\n}\n","{\n \"name\": \"agentv\",\n \"version\": \"5.3.1-next.1\",\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://agentv.dev\",\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\": \"(cd ../../packages/sdk && bun run build) && tsup && bun run copy-readme\",\n \"copy-readme\": \"bun -e \\\"import { cpSync } from 'fs'; cpSync('../../README.md', 'README.md')\\\"\",\n \"prepublishOnly\": \"node -e \\\"if(process.env.ALLOW_PUBLISH!=='1'){console.error('ERROR: Use bun run publish:next, then bun run promote:latest');process.exit(1)}\\\"\",\n \"typecheck\": \"(cd ../../packages/sdk && bun run build) && tsc --noEmit\",\n \"lint\": \"biome check .\",\n \"format\": \"biome format --write .\",\n \"fix\": \"biome check --write .\",\n \"test\": \"(cd ../../packages/sdk && bun run build) && bun test\",\n \"test:watch\": \"bun test --watch\"\n },\n \"dependencies\": {\n \"@hono/node-server\": \"^1.19.11\",\n \"@inquirer/prompts\": \"^8.2.1\",\n \"@earendil-works/pi-ai\": \"^0.74.0\",\n \"cmd-ts\": \"^0.14.3\",\n \"dotenv\": \"^16.4.5\",\n \"fast-glob\": \"^3.3.3\",\n \"hono\": \"^4.12.9\",\n \"json5\": \"^2.2.3\",\n \"micromatch\": \"^4.0.8\",\n \"semver\": \"^7.7.4\",\n \"yaml\": \"^2.8.3\"\n },\n \"peerDependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"^0.2.89\",\n \"@github/copilot-sdk\": \"^1.0.3\",\n \"@openai/codex-sdk\": \"^0.136.0\",\n \"@earendil-works/pi-coding-agent\": \"^0.74.0\"\n },\n \"peerDependenciesMeta\": {\n \"@anthropic-ai/claude-agent-sdk\": {\n \"optional\": true\n },\n \"@github/copilot-sdk\": {\n \"optional\": true\n },\n \"@openai/codex-sdk\": {\n \"optional\": true\n },\n \"@earendil-works/pi-coding-agent\": {\n \"optional\": true\n }\n },\n \"optionalDependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"^0.2.89\",\n \"@github/copilot-sdk\": \"^1.0.3\",\n \"@openai/codex-sdk\": \"^0.136.0\",\n \"@earendil-works/pi-coding-agent\": \"^0.74.0\"\n },\n \"devDependencies\": {\n \"@agentv/core\": \"workspace:*\",\n \"@agentv/sdk\": \"workspace:*\",\n \"@types/semver\": \"^7.7.1\",\n \"execa\": \"^9.3.0\"\n }\n}\n","import { type Dirent, existsSync, readdirSync, statSync } from 'node:fs';\nimport path from 'node:path';\n\nexport const RESULT_INDEX_FILENAME = 'index.jsonl';\nexport const RUN_SUMMARY_FILENAME = 'summary.json';\nexport const RUN_INTERNAL_DIRNAME = '.internal';\nexport const RESULTS_DIRNAME = 'results';\nexport const DEFAULT_EXPERIMENT_NAME = 'default';\nexport const RESERVED_RESULTS_NAMESPACES = new Set(['export', 'metadata', 'runs']);\n\nexport function isReservedResultsNamespace(value: string | undefined): boolean {\n return value !== undefined && (value.startsWith('.') || RESERVED_RESULTS_NAMESPACES.has(value));\n}\n\nexport function normalizeExperimentName(experiment?: string): string {\n const trimmed = experiment?.trim();\n if (!trimmed) {\n return DEFAULT_EXPERIMENT_NAME;\n }\n if (!/^[A-Za-z0-9._-]+$/.test(trimmed)) {\n throw new Error(\n `Invalid experiment name \"${trimmed}\". Use only letters, numbers, \".\", \"_\" and \"-\".`,\n );\n }\n if (isReservedResultsNamespace(trimmed)) {\n throw new Error(`Invalid experiment name \"${trimmed}\". This results namespace is reserved.`);\n }\n return trimmed;\n}\n\nexport function createRunDirName(timestamp = new Date()): string {\n return timestamp.toISOString().replace(/[:.]/g, '-');\n}\n\nfunction defaultRunPathSegments(experiment: string | undefined, runDirName: string): string[] {\n if (experiment !== undefined) {\n normalizeExperimentName(experiment);\n }\n return [runDirName];\n}\n\nexport function buildResultsRootDir(cwd: string): string {\n return path.join(cwd, '.agentv', RESULTS_DIRNAME);\n}\n\nexport function buildDefaultRunDirFromName(\n cwd: string,\n experiment: string | undefined,\n runDirName: string,\n): string {\n return path.join(buildResultsRootDir(cwd), ...defaultRunPathSegments(experiment, runDirName));\n}\n\nexport function buildDefaultRunDir(\n cwd: string,\n experiment?: string,\n timestamp = new Date(),\n): string {\n return buildDefaultRunDirFromName(cwd, experiment, createRunDirName(timestamp));\n}\n\nexport function buildDefaultIndexPath(cwd: string, experiment?: string): string {\n return resolveRunIndexPath(buildDefaultRunDir(cwd, experiment));\n}\n\nexport function resolveRunIndexPath(runDir: string): string {\n return path.join(runDir, RUN_INTERNAL_DIRNAME, RESULT_INDEX_FILENAME);\n}\n\nexport function isRunManifestPath(filePath: string): boolean {\n return path.basename(filePath) === RESULT_INDEX_FILENAME;\n}\n\nexport function resolveExistingRunPrimaryPath(runDir: string): string | undefined {\n const indexPath = resolveRunIndexPath(runDir);\n if (existsSync(indexPath)) {\n return indexPath;\n }\n\n const legacyIndexPath = path.join(runDir, RESULT_INDEX_FILENAME);\n if (existsSync(legacyIndexPath)) {\n return legacyIndexPath;\n }\n\n return undefined;\n}\n\nexport function discoverRunManifestPaths(runDir: string): readonly string[] {\n const direct = resolveExistingRunPrimaryPath(runDir);\n if (direct) {\n return [direct];\n }\n\n const manifests: string[] = [];\n function walk(currentDir: string): void {\n const primary = resolveExistingRunPrimaryPath(currentDir);\n if (primary) {\n manifests.push(primary);\n return;\n }\n\n let entries: Dirent<string>[];\n try {\n entries = readdirSync(currentDir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (entry.isDirectory()) {\n walk(path.join(currentDir, entry.name));\n }\n }\n }\n\n walk(runDir);\n return manifests.sort();\n}\n\nexport function isDirectoryPath(filePath: string): boolean {\n try {\n return statSync(filePath).isDirectory();\n } catch {\n return false;\n }\n}\n\nexport function resolveWorkspaceOrFilePath(filePath: string): string {\n if (!isDirectoryPath(filePath)) {\n return filePath;\n }\n\n const existing = resolveExistingRunPrimaryPath(filePath);\n if (existing) {\n return existing;\n }\n\n const nested = discoverRunManifestPaths(filePath);\n if (nested.length === 1) {\n return nested[0];\n }\n if (nested.length > 1) {\n throw new Error(\n `Result workspace contains multiple run manifests; pass one bundle directory or manifest: ${filePath}`,\n );\n }\n throw new Error(`Result workspace is missing ${RESULT_INDEX_FILENAME}: ${filePath}`);\n}\n\nexport function resolveRunManifestPath(filePath: string): string {\n if (isDirectoryPath(filePath)) {\n return resolveWorkspaceOrFilePath(filePath);\n }\n\n if (!isRunManifestPath(filePath)) {\n throw new Error(\n `Expected a run workspace directory or ${RESULT_INDEX_FILENAME} manifest: ${filePath}`,\n );\n }\n\n return filePath;\n}\n\nexport function relativeRunPathFromCwd(cwd: string, runDir: string): string | undefined {\n const relative = path.relative(path.resolve(buildResultsRootDir(cwd)), path.resolve(runDir));\n if (!relative || relative.startsWith('..') || path.isAbsolute(relative)) {\n return undefined;\n }\n\n const parts = relative.split(path.sep).filter(Boolean);\n if (parts.length !== 1 || isReservedResultsNamespace(parts[0])) {\n return undefined;\n }\n\n return parts.join(path.posix.sep);\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 path from 'node:path';\nimport { DEFAULT_EVAL_PATTERNS, deriveCategory, loadConfig } from '@agentv/core';\nimport fg from 'fast-glob';\n\nimport { findRepoRoot } from './shared.js';\n\nexport interface DiscoveredEvalFile {\n /** Absolute path to the eval file */\n readonly path: string;\n /** Relative path from cwd for display */\n readonly relativePath: string;\n /** Category derived from parent folder structure */\n readonly category: string;\n}\n\n/**\n * Discover eval files by glob pattern matching.\n *\n * Uses `eval_patterns` from `.agentv/config.yaml` if configured,\n * otherwise falls back to default patterns that match `suite.yaml`,\n * `eval.yaml`, and `*.eval.yaml` files under `evals/` directories.\n */\nexport async function discoverEvalFiles(cwd: string): Promise<readonly DiscoveredEvalFile[]> {\n const repoRoot = await findRepoRoot(cwd);\n\n // Load config to check for custom eval_patterns\n // Pass a dummy file path in cwd so buildDirectoryChain starts from cwd\n const config = await loadConfig(path.join(cwd, '_'), repoRoot);\n const patterns =\n config?.eval_patterns && config.eval_patterns.length > 0\n ? config.eval_patterns\n : DEFAULT_EVAL_PATTERNS;\n\n const ignore = ['**/node_modules/**', '**/dist/**'];\n\n const matches = await fg(patterns as string[], {\n cwd,\n absolute: true,\n onlyFiles: true,\n ignore,\n followSymbolicLinks: true,\n caseSensitiveMatch: false,\n });\n\n const evalFiles: DiscoveredEvalFile[] = matches.map((absPath) => {\n const relativePath = path.relative(cwd, absPath);\n const category = deriveCategory(relativePath);\n return { path: absPath, relativePath, category };\n });\n\n evalFiles.sort((a, b) => a.relativePath.localeCompare(b.relativePath));\n return evalFiles;\n}\n\n/** Get unique categories from discovered eval files. */\nexport function getCategories(files: readonly DiscoveredEvalFile[]): readonly string[] {\n const categories = new Set<string>();\n for (const file of files) {\n categories.add(file.category);\n }\n const sorted = Array.from(categories);\n sorted.sort();\n return sorted;\n}\n\n/** Filter eval files by category. */\nexport function filterByCategory(\n files: readonly DiscoveredEvalFile[],\n category: string,\n): readonly DiscoveredEvalFile[] {\n return files.filter((f) => f.category === category);\n}\n","import { constants, existsSync, mkdirSync } from 'node:fs';\nimport { access, readFile } from 'node:fs/promises';\nimport { createRequire as createNodeRequire } from 'node:module';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport pLimit from 'p-limit';\n\nimport {\n DEFAULT_THRESHOLD,\n type EvalRunOverride,\n type EvalTargetRef,\n type EvalTest,\n type EvaluationCache,\n type EvaluationResult,\n type ExecutionDefaults,\n type ExperimentArtifactMetadata,\n type ExperimentConfig,\n type FailOnError,\n type ResolvedTarget,\n ResponseCache,\n RunBudgetTracker,\n type RunRuntimeSourceMetadata,\n type TrialsConfig,\n buildExperimentArtifactMetadata,\n buildTraceFromMessages,\n runEvaluation as defaultRunEvaluation,\n deriveCategory,\n ensureVSCodeSubagents,\n loadConfig,\n loadTestSuite,\n loadTestSuiteFromYamlObject,\n loadTsConfig,\n resolveTargetDefinition,\n shouldEnableCache,\n shouldSkipCacheForTemperature,\n subscribeToCodexLogEntries,\n subscribeToCopilotCliLogEntries,\n subscribeToCopilotSdkLogEntries,\n subscribeToPiLogEntries,\n} from '@agentv/core';\n\nimport {\n type VersionCheckResult,\n enforceRequiredVersion,\n formatRequiredVersionFailureNote,\n} from '../../version-check.js';\nimport {\n agentSkillsToAgentVYamlObject,\n readAgentSkillsEvalsFile,\n} from '../read-adapters/agent-skills-evals.js';\nimport {\n type RemoteExportStatus,\n type ResultsPublishOverrides,\n getRelativeRunPath,\n loadNormalizedResultsConfig,\n maybeAutoExportRunArtifacts,\n} from '../results/remote.js';\nimport {\n aggregateRunDir,\n buildEvalTestTargetKey,\n buildEvaluationResultTargetKey,\n buildTestTargetKey,\n deduplicateByTestIdTarget,\n parseJsonlResults,\n writeArtifactsFromResults,\n writeInitialRunSummaryArtifact,\n} from './artifact-writer.js';\nimport { loadEnvFromHierarchy } from './env.js';\nimport { type OutputWriter, createOutputWriter } from './output-writer.js';\nimport { ProgressDisplay, type Verdict, type WorkerProgress } from './progress-display.js';\nimport {\n RESULT_INDEX_FILENAME,\n buildDefaultRunDirFromName,\n createRunDirName,\n discoverRunManifestPaths,\n normalizeExperimentName,\n resolveRunIndexPath,\n} from './result-layout.js';\nimport {\n buildExclusionFilter,\n loadErrorTestIds,\n loadFullyCompletedTestIds,\n loadNonErrorResults,\n} from './retry-errors.js';\nimport { resolveCachedRunDir, saveRunCache } from './run-cache.js';\nimport { findRepoRoot, resolveEvalPaths } from './shared.js';\nimport {\n calculateEvaluationSummary,\n formatEvaluationSummary,\n formatMatrixSummary,\n} from './statistics.js';\nimport { type TargetSelection, selectMultipleTargets, selectTarget } from './targets.js';\nimport type { TaskBundleTargetSelection } from './task-bundle.js';\nimport { WipCheckpointLoop } from './wip-checkpoint.js';\n\nconst DEFAULT_WORKERS = 3;\nconst loadCjsModule = createNodeRequire(import.meta.url);\nconst micromatch = loadCjsModule('micromatch') as {\n isMatch(id: string, pattern: string): boolean;\n};\n\ntype LoadTestSuiteOptions = Parameters<typeof loadTestSuite>[2];\n\nasync function loadCliEvalSuite(\n testFilePath: string,\n repoRoot: string,\n options?: LoadTestSuiteOptions,\n): ReturnType<typeof loadTestSuite> {\n if (path.extname(testFilePath).toLowerCase() === '.json') {\n const adapterSuite = readAgentSkillsEvalsFile(testFilePath);\n return loadTestSuiteFromYamlObject(\n testFilePath,\n agentSkillsToAgentVYamlObject(adapterSuite),\n repoRoot,\n options,\n );\n }\n\n return loadTestSuite(testFilePath, repoRoot, options);\n}\n\nfunction shouldSkipExistingResultForResume(\n result: Pick<EvaluationResult, 'executionStatus'>,\n rerunFailed: boolean,\n): boolean {\n if (rerunFailed) {\n return result.executionStatus === 'ok';\n }\n return result.executionStatus !== 'execution_error';\n}\n\ninterface ResumeIdentityEntry {\n readonly kind: 'precise' | 'legacy';\n readonly key: string;\n readonly result: EvaluationResult;\n}\n\ninterface ResumeIdentityMatcher {\n readonly preciseKeys: Set<string>;\n readonly legacyKeys: Set<string>;\n}\n\nfunction hasNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction objectRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction resultProjectionDimensions(result: EvaluationResult): Record<string, unknown> | undefined {\n const projectionIdentity = objectRecord(\n (result as unknown as Record<string, unknown>).projectionIdentity,\n );\n return objectRecord(projectionIdentity?.dimensions);\n}\n\nfunction hasCanonicalResultIdentity(result: EvaluationResult): boolean {\n const source = result.source;\n const dimensions = resultProjectionDimensions(result);\n const resultRecord = result as unknown as Record<string, unknown>;\n return (\n hasNonEmptyString(dimensions?.evalPath) ||\n hasNonEmptyString(dimensions?.suite) ||\n hasNonEmptyString(dimensions?.promptId) ||\n hasNonEmptyString(resultRecord.evalPath) ||\n hasNonEmptyString(source?.evalFileRepoPath) ||\n hasNonEmptyString(source?.evalFilePath) ||\n hasNonEmptyString(source?.evalFileAbsolutePath) ||\n hasNonEmptyString(result.suite) ||\n hasNonEmptyString(result.prompt?.id)\n );\n}\n\nfunction resultResumeIdentityEntry(result: EvaluationResult): ResumeIdentityEntry {\n if (hasCanonicalResultIdentity(result)) {\n return {\n kind: 'precise',\n key: buildEvaluationResultTargetKey(result),\n result,\n };\n }\n return {\n kind: 'legacy',\n key: buildTestTargetKey(result.testId, result.target, result.variant),\n result,\n };\n}\n\nfunction latestResumeIdentityEntries(\n results: readonly EvaluationResult[],\n): readonly ResumeIdentityEntry[] {\n const latestByIdentity = new Map<string, ResumeIdentityEntry>();\n for (const result of results) {\n const entry = resultResumeIdentityEntry(result);\n latestByIdentity.set(`${entry.kind}:${entry.key}`, entry);\n }\n return Array.from(latestByIdentity.values());\n}\n\nfunction createResumeIdentityMatcher(): ResumeIdentityMatcher {\n return { preciseKeys: new Set<string>(), legacyKeys: new Set<string>() };\n}\n\nfunction addResumeIdentityEntry(matcher: ResumeIdentityMatcher, entry: ResumeIdentityEntry): void {\n if (entry.kind === 'legacy') {\n matcher.legacyKeys.add(entry.key);\n return;\n }\n matcher.preciseKeys.add(entry.key);\n}\n\nfunction uniqueStrings(values: readonly (string | undefined)[]): string[] {\n return Array.from(new Set(values.filter(hasNonEmptyString)));\n}\n\nfunction buildPlannedResumeIdentityKeys(\n test: EvalTest,\n target: string,\n variant: string | undefined,\n): readonly string[] {\n const keys = new Set<string>([buildEvalTestTargetKey(test, target, variant)]);\n const evalPaths = uniqueStrings([\n test.source?.evalFileRepoPath,\n test.source?.evalFilePath,\n test.source?.evalFileAbsolutePath,\n ]);\n const suites = Array.from(new Set<string | null>([test.suite ?? null, null]));\n const promptIds = Array.from(new Set<string | null>([test.prompt?.id ?? null, null]));\n\n for (const evalPath of evalPaths) {\n for (const suite of suites) {\n for (const promptId of promptIds) {\n keys.add(\n JSON.stringify({\n eval_path: evalPath,\n suite,\n test_id: test.id ?? 'unknown',\n prompt_id: promptId,\n target: target ?? 'unknown',\n variant: variant ?? null,\n }),\n );\n }\n }\n }\n\n return Array.from(keys);\n}\n\nfunction resumeIdentityMatches(\n matcher: ResumeIdentityMatcher,\n test: EvalTest,\n target: string,\n variant: string | undefined,\n): boolean {\n return (\n buildPlannedResumeIdentityKeys(test, target, variant).some((key) =>\n matcher.preciseKeys.has(key),\n ) || matcher.legacyKeys.has(buildTestTargetKey(test.id, target, variant))\n );\n}\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 | readonly string[];\n readonly workers?: number;\n /** --output <dir>: canonical artifact directory */\n readonly outputDir?: string;\n /** Removed: use --output for run directories */\n readonly removedOut?: string;\n readonly agentTimeoutSeconds?: number;\n readonly cliAgentTimeoutSeconds?: number;\n readonly maxRetries: number;\n readonly cache: boolean;\n readonly cachePath?: string;\n readonly noCache: boolean;\n readonly tsConfigCache?: boolean;\n readonly tsConfigCachePath?: string;\n readonly verbose: boolean;\n readonly retryErrors?: string;\n readonly resume: boolean;\n readonly rerunFailed: boolean;\n readonly rerunFailedSource?: string;\n readonly workspacePath?: string;\n readonly keepWorkspaces: boolean;\n /** Removed: use --output instead */\n readonly artifacts?: string;\n /** Removed: the run directory always uses index.jsonl */\n readonly outputFormat?: string;\n readonly graderTarget?: string;\n readonly model?: string;\n readonly outputMessages: number | 'all';\n readonly threshold?: number;\n readonly cliThreshold?: number;\n readonly tags: readonly string[];\n readonly excludeTags: readonly string[];\n /** Promptfoo-shaped `--tag key=value` entries (CLI layer of the tags map). */\n readonly tagMap: Record<string, string>;\n readonly transcript?: string;\n readonly recordReplay?: string;\n readonly recordReplayVariant?: string;\n readonly experiment?: string;\n readonly experimentConfig?: ExperimentConfig;\n readonly experimentMetadata?: ExperimentArtifactMetadata;\n readonly experimentTargets?: readonly string[];\n readonly experimentTargetRefs?: readonly EvalTargetRef[];\n readonly targetModelOverride?: string;\n readonly experimentTrialsConfig?: TrialsConfig;\n readonly budgetUsd?: number;\n readonly cliBudgetUsd?: number;\n readonly sourceMetadataByEvalFile?: ReadonlyMap<string, Record<string, unknown>>;\n readonly resultsOverrides?: ResultsPublishOverrides;\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\nfunction resultsRepoOverride(\n value: string | undefined,\n): Pick<ResultsPublishOverrides, 'repo' | 'repo_path'> {\n if (!value) {\n return {};\n }\n if (\n value === 'current' ||\n value === '.' ||\n value.startsWith('./') ||\n value.startsWith('../') ||\n value.startsWith('/') ||\n value.startsWith('~/') ||\n value.startsWith('~\\\\') ||\n /^[A-Za-z]:[/\\\\]/.test(value)\n ) {\n return { repo_path: value === 'current' ? '.' : value };\n }\n return { repo: value };\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 normalizeStringArray(value: unknown): readonly string[] {\n if (Array.isArray(value)) {\n return value.filter((v): v is string => typeof v === 'string' && v.trim().length > 0);\n }\n return [];\n}\n\nfunction normalizeFilter(value: unknown): string | readonly string[] | undefined {\n if (Array.isArray(value)) {\n const filters = normalizeStringArray(value);\n if (filters.length === 0) {\n return undefined;\n }\n return filters.length === 1 ? filters[0] : filters;\n }\n\n return normalizeString(value);\n}\n\nfunction normalizeSourceMetadataByEvalFile(\n value: unknown,\n): ReadonlyMap<string, Record<string, unknown>> | undefined {\n if (value instanceof Map) {\n const entries = [...value.entries()].filter(\n (entry): entry is [string, Record<string, unknown>] =>\n typeof entry[0] === 'string' &&\n typeof entry[1] === 'object' &&\n entry[1] !== null &&\n !Array.isArray(entry[1]),\n );\n return entries.length > 0\n ? new Map(entries.map(([key, metadata]) => [path.resolve(key), metadata]))\n : undefined;\n }\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n const entries = Object.entries(value).filter(\n (entry): entry is [string, Record<string, unknown>] =>\n typeof entry[1] === 'object' && entry[1] !== null && !Array.isArray(entry[1]),\n );\n return entries.length > 0\n ? new Map(entries.map(([key, metadata]) => [path.resolve(key), metadata]))\n : undefined;\n }\n\n return undefined;\n}\n\nconst LEGACY_OUTPUT_FILE_EXTENSIONS = new Set([\n '.jsonl',\n '.json',\n '.xml',\n '.yaml',\n '.yml',\n '.html',\n '.htm',\n]);\n\nfunction looksLikeLegacyOutputFilePath(value: string): boolean {\n return LEGACY_OUTPUT_FILE_EXTENSIONS.has(path.extname(value).toLowerCase());\n}\n\nfunction outputFileMigrationMessage(value: string): string {\n const ext = path.extname(value).toLowerCase();\n const removalHint =\n ext === '.xml'\n ? 'JUnit XML export from agentv eval has been removed.'\n : 'Flat result file export from agentv eval has been removed.';\n return `--output expects a run directory, not a file path: ${value}\\n${removalHint} Set --output <dir> for the canonical run artifacts; AgentV always writes <dir>/${RESULT_INDEX_FILENAME}.`;\n}\n\nfunction artifactsMigrationMessage(artifactsDir: string, outputDir?: string): string {\n const lines = [`--artifacts was removed from agentv eval. Use --output ${artifactsDir} instead.`];\n if (outputDir && looksLikeLegacyOutputFilePath(outputDir)) {\n const ext = path.extname(outputDir).toLowerCase();\n lines.push(\n ext === '.xml'\n ? 'JUnit XML export from agentv eval has been removed.'\n : 'Flat result file export from agentv eval has been removed.',\n );\n lines.push(`Migration example: --output ${artifactsDir}`);\n }\n return lines.join('\\n');\n}\n\n/**\n * Check whether an eval file's tags satisfy --tag / --exclude-tag filters.\n *\n * - `--tag X` means the file must have tag X (AND logic: all specified tags must be present)\n * - `--exclude-tag X` means the file must NOT have tag X (AND logic: none of the specified tags may be present)\n * - When both are used, both conditions must hold.\n * - Files without tags are excluded when --tag is specified, but included when only --exclude-tag is specified.\n */\nexport function matchesTagFilters(\n fileTags: readonly string[] | undefined,\n includeTags: readonly string[],\n excludeTags: readonly string[],\n): boolean {\n const tags = new Set(fileTags ?? []);\n\n // --tag: every specified tag must be present\n if (includeTags.length > 0) {\n for (const required of includeTags) {\n if (!tags.has(required)) return false;\n }\n }\n\n // --exclude-tag: none of the specified tags may be present\n for (const excluded of excludeTags) {\n if (tags.has(excluded)) return false;\n }\n\n return true;\n}\n\n/**\n * Split repeatable `--tag` values into two shapes, mirroring the suite-level\n * `tags` union (selection list vs promptfoo map):\n *\n * - `--tag key=value` (contains `=`) -> a `Record<string,string>` tag-map entry\n * (promptfoo-shaped run metadata; the reserved `experiment` key feeds the\n * experiment namespace).\n * - `--tag name` (no `=`) -> a bare selection tag, preserving the existing\n * file-level `--tag`/`--exclude-tag` AND-filter behavior.\n *\n * On repeated `key=value` for the same key, the last value wins. An empty value\n * (`--tag experiment=`) is kept as an explicit empty string so callers can\n * detect an intentional clear.\n */\nexport function splitCliTags(value: unknown): {\n selectionTags: readonly string[];\n tagMap: Record<string, string>;\n} {\n const selectionTags: string[] = [];\n const tagMap: Record<string, string> = {};\n for (const entry of normalizeStringArray(value)) {\n const eq = entry.indexOf('=');\n if (eq === -1) {\n selectionTags.push(entry);\n continue;\n }\n const key = entry.slice(0, eq).trim();\n if (key.length === 0) {\n continue;\n }\n tagMap[key] = entry.slice(eq + 1).trim();\n }\n return { selectionTags, tagMap };\n}\n\n/**\n * Resolve the effective promptfoo-shaped tags map for a run by merging layers\n * with precedence CLI `--tag key=value` > project config `tags` > eval `tags`.\n * Returns undefined when no layer contributes any entry.\n */\nexport function resolveEffectiveTags(layers: {\n evalTags?: Record<string, string>;\n configTags?: Record<string, string>;\n cliTags?: Record<string, string>;\n}): Record<string, string> | undefined {\n const merged: Record<string, string> = {\n ...(layers.evalTags ?? {}),\n ...(layers.configTags ?? {}),\n ...(layers.cliTags ?? {}),\n };\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\n/**\n * Keep an emitted tags map's `experiment` key in lockstep with the resolved\n * experiment namespace so a row's `experiment` field and `tags.experiment` never\n * disagree — but only when an experiment was intentionally set (`--experiment`,\n * i.e. `experimentIsIntentional`, or an authored `tags.experiment`). A tags map\n * that carries no experiment (e.g. only `--tag team=core`) must not gain an\n * eval-default experiment key, and no tags map means nothing to emit.\n */\nexport function syncTagsExperiment(\n resolvedTags: Record<string, string> | undefined,\n options: { experimentIsIntentional: boolean; normalizedExperiment: string },\n): Record<string, string> | undefined {\n if (!resolvedTags) {\n return undefined;\n }\n if (!options.experimentIsIntentional && resolvedTags.experiment === undefined) {\n return resolvedTags;\n }\n return { ...resolvedTags, experiment: options.normalizedExperiment };\n}\n\n/**\n * Resolve the experiment namespace and its provenance for a run.\n *\n * Precedence: `--experiment` (CLI) > `tags.experiment` (resolved tags map) >\n * the eval-derived default (multi-eval label, suite `metadata.name`, or eval\n * filename). This keeps `--experiment` authoritative while letting a\n * promptfoo-shaped `tags.experiment` label a run, and preserves the existing\n * default fallback when neither is set.\n */\nexport function resolveExperimentNamespace(params: {\n cliExperiment?: string;\n tagsExperiment?: string;\n isMultiEval: boolean;\n suiteName?: string;\n resultGroupName: string;\n}): {\n experiment: string;\n} {\n if (params.cliExperiment) {\n return { experiment: params.cliExperiment };\n }\n if (params.tagsExperiment) {\n return { experiment: params.tagsExperiment };\n }\n return { experiment: params.resultGroupName };\n}\n\n/**\n * Normalize --output-messages value. Accepts a number (>= 1) or \"all\".\n * Defaults to 1 (last assistant message only).\n */\nfunction normalizeOutputMessages(cliValue: string | undefined): number | 'all' {\n if (cliValue === undefined) {\n return 1;\n }\n if (cliValue === 'all') {\n return 'all';\n }\n const parsed = Number.parseInt(cliValue, 10);\n if (Number.isNaN(parsed) || !Number.isInteger(parsed) || parsed < 1) {\n console.warn(\n `Warning: Invalid --output-messages value '${cliValue}'. Must be a positive integer or 'all'. Defaulting to 1.`,\n );\n return 1;\n }\n return parsed;\n}\n\n/**\n * Deprecated compatibility hook for the old output-as-messages JSONL surface.\n * Result `output` is now the final answer string; full transcript data stays\n * under `trace.messages` and is intentionally not trimmed here.\n */\nexport function trimOutputMessages(\n output: EvaluationResult['output'],\n _outputMessages: number | 'all',\n): EvaluationResult['output'] {\n return output;\n}\n\nexport function prepareResultForJsonl(\n result: EvaluationResult,\n options: { readonly outputMessages: number | 'all' },\n): EvaluationResult {\n return {\n ...result,\n output: trimOutputMessages(result.output, options.outputMessages),\n };\n}\n\nfunction normalizeOptions(\n rawOptions: Record<string, unknown>,\n config?: Awaited<ReturnType<typeof loadTsConfig>>,\n yamlExecution?: ExecutionDefaults,\n): NormalizedOptions {\n const cliWorkers = normalizeOptionalNumber(rawOptions.workers);\n const configWorkers = config?.execution?.maxConcurrency ?? yamlExecution?.max_concurrency;\n const workers = cliWorkers ?? configWorkers ?? 0;\n\n const cliOutputDir = normalizeString(rawOptions.output);\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 cliThreshold = normalizeOptionalNumber(rawOptions.threshold);\n const cliBudgetUsd = normalizeOptionalNumber(rawOptions.budgetUsd);\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 // Response cache: CLI request/path, then eval YAML, then TypeScript config, then default off.\n const cliCachePath = normalizeString(rawOptions.cachePath);\n const cliCache = normalizeBoolean(rawOptions.cache) || cliCachePath !== undefined;\n const cliNoCache = normalizeBoolean(rawOptions.noCache);\n const configCacheEnabled = config?.cache?.enabled;\n const configCachePath = normalizeString(config?.cache?.path);\n\n // Output dir: CLI --output > config output.dir > auto-generated\n const cliOut = normalizeString(rawOptions.out);\n const configOutputDir = normalizeString(config?.output?.dir);\n const cliWorkspacePath = normalizeString(rawOptions.workspacePath);\n const configWorkspacePath = normalizeString(yamlExecution?.workspace_path);\n const workspacePath = cliWorkspacePath ?? configWorkspacePath;\n const resultsRepo = normalizeString(rawOptions.resultsRepo);\n const resultsPush = normalizeBoolean(rawOptions.resultsPush);\n const resultsNoPush = normalizeBoolean(rawOptions.noResultsPush);\n const resultsRequirePush = normalizeBoolean(rawOptions.resultsRequirePush);\n const resultsOverrides: ResultsPublishOverrides = {\n ...resultsRepoOverride(resultsRepo),\n ...(normalizeString(rawOptions.resultsBranch) !== undefined && {\n branch: normalizeString(rawOptions.resultsBranch),\n }),\n ...(normalizeString(rawOptions.resultsRemote) !== undefined && {\n remote: normalizeString(rawOptions.resultsRemote),\n }),\n ...(resultsPush || resultsNoPush ? { auto_push: resultsPush && !resultsNoPush } : {}),\n ...(resultsRequirePush ? { require_push: true } : {}),\n };\n const cliTags = splitCliTags(rawOptions.tag);\n\n return {\n target: singleTarget,\n cliTargets,\n targetsPath: normalizeString(rawOptions.targets),\n filter: normalizeFilter(rawOptions.filter),\n workers: workers > 0 ? workers : undefined,\n outputDir: cliOutputDir ?? configOutputDir,\n removedOut: cliOut,\n agentTimeoutSeconds: cliAgentTimeout ?? configAgentTimeoutSeconds,\n cliAgentTimeoutSeconds: cliAgentTimeout,\n maxRetries: cliMaxRetries ?? configMaxRetries ?? 2,\n cache: cliCache,\n cachePath: cliCachePath,\n noCache: cliNoCache,\n tsConfigCache: configCacheEnabled,\n tsConfigCachePath: configCachePath,\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 retryErrors: normalizeString(rawOptions.retryErrors),\n resume:\n normalizeBoolean(rawOptions.resume) || normalizeString(rawOptions.rerunFailed) !== undefined,\n rerunFailed: normalizeString(rawOptions.rerunFailed) !== undefined,\n rerunFailedSource: normalizeString(rawOptions.rerunFailed),\n workspacePath,\n // Precedence: CLI > YAML config > TS config\n keepWorkspaces:\n normalizeBoolean(rawOptions.keepWorkspaces) ||\n yamlExecution?.keep_workspaces === true ||\n config?.execution?.keepWorkspaces === true,\n artifacts: normalizeString(rawOptions.artifacts),\n outputFormat: normalizeString(rawOptions.outputFormat),\n graderTarget: normalizeString(rawOptions.graderTarget),\n model: normalizeString(rawOptions.model),\n outputMessages: normalizeOutputMessages(normalizeString(rawOptions.outputMessages)),\n threshold: cliThreshold,\n cliThreshold,\n tags: cliTags.selectionTags,\n excludeTags: normalizeStringArray(rawOptions.excludeTag),\n tagMap: cliTags.tagMap,\n transcript: normalizeString(rawOptions.transcript),\n recordReplay: normalizeString(rawOptions.recordReplay),\n recordReplayVariant: normalizeString(rawOptions.recordReplayVariant),\n experiment: normalizeString(rawOptions.experiment),\n budgetUsd: cliBudgetUsd,\n cliBudgetUsd,\n sourceMetadataByEvalFile: normalizeSourceMetadataByEvalFile(\n rawOptions.sourceMetadataByEvalFile,\n ),\n resultsOverrides: Object.keys(resultsOverrides).length > 0 ? resultsOverrides : undefined,\n } satisfies NormalizedOptions;\n}\n\nfunction withSourceMetadata(\n result: EvaluationResult,\n testFilePath: string,\n options: NormalizedOptions,\n): EvaluationResult {\n const sourceMetadata = options.sourceMetadataByEvalFile?.get(path.resolve(testFilePath));\n if (!sourceMetadata) {\n return result;\n }\n return {\n ...result,\n metadata: {\n ...result.metadata,\n ...sourceMetadata,\n },\n };\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 deriveEvalResultGroupName(evalFilePath: string | undefined): string {\n if (!evalFilePath) {\n return 'eval';\n }\n return (\n path\n .basename(evalFilePath)\n .replace(/\\.eval\\.ya?ml$/i, '')\n .replace(/\\.ya?ml$/i, '')\n .replace(/[^A-Za-z0-9._-]/g, '-') || 'eval'\n );\n}\n\nconst CLI_RUNTIME_SOURCE_OPTION_KEYS = [\n 'target',\n 'targets',\n 'filter',\n 'tag',\n 'excludeTag',\n 'workers',\n 'dryRun',\n 'dryRunDelay',\n 'dryRunDelayMin',\n 'dryRunDelayMax',\n 'agentTimeout',\n 'maxRetries',\n 'cache',\n 'cachePath',\n 'noCache',\n 'graderTarget',\n 'model',\n 'threshold',\n 'budgetUsd',\n 'transcript',\n 'recordReplay',\n 'recordReplayVariant',\n 'workspacePath',\n] as const;\n\nfunction hasCliRuntimeSource(rawOptions: Record<string, unknown>): boolean {\n return CLI_RUNTIME_SOURCE_OPTION_KEYS.some((key) => {\n const value = rawOptions[key];\n if (Array.isArray(value)) {\n return value.some((entry) => typeof entry === 'string' && entry.trim().length > 0);\n }\n if (typeof value === 'string') {\n return value.trim().length > 0 && value.trim() !== 'default';\n }\n if (typeof value === 'number') {\n return Number.isFinite(value) && value !== 0;\n }\n return value === true;\n });\n}\n\nfunction toRuntimeSourcePath(cwd: string, filePath: string | undefined): string | undefined {\n const trimmed = filePath?.trim();\n if (!trimmed) {\n return undefined;\n }\n const resolved = path.isAbsolute(trimmed) ? trimmed : path.resolve(cwd, trimmed);\n const relative = path.relative(cwd, resolved);\n const displayPath =\n relative && !relative.startsWith('..') && !path.isAbsolute(relative) ? relative : trimmed;\n return displayPath.split(path.sep).join('/');\n}\n\nfunction uniqueRuntimeSourcePaths(values: Iterable<string | undefined>): readonly string[] {\n return [...new Set([...values].filter((value): value is string => Boolean(value)))].sort();\n}\n\nfunction testSourceEvalPath(cwd: string, test: EvalTest): string | undefined {\n return (\n toRuntimeSourcePath(cwd, test.source?.evalFileRepoPath) ??\n toRuntimeSourcePath(cwd, test.source?.evalFileAbsolutePath) ??\n toRuntimeSourcePath(cwd, test.source?.evalFilePath)\n );\n}\n\nfunction testSourceEvalPathForComparison(test: EvalTest): string | undefined {\n const sourcePath = test.source?.evalFileAbsolutePath ?? test.source?.evalFilePath;\n return sourcePath ? path.resolve(sourcePath) : undefined;\n}\n\nfunction buildRuntimeConfigSource(params: {\n readonly activeTestFiles: readonly string[];\n readonly fileMetadata: ReadonlyMap<string, { readonly options: NormalizedOptions }>;\n readonly hasCliRuntimeConfig: boolean;\n}): RunRuntimeSourceMetadata['config_source'] {\n const inlineFingerprints = new Set<string>();\n let hasInlineExperiment = false;\n let hasDefaultRuntime = false;\n\n for (const activeTestFile of params.activeTestFiles) {\n const experimentMetadata = params.fileMetadata.get(activeTestFile)?.options.experimentMetadata;\n if (experimentMetadata) {\n hasInlineExperiment = true;\n inlineFingerprints.add(experimentMetadata.fingerprint ?? activeTestFile);\n } else {\n hasDefaultRuntime = true;\n }\n }\n\n if (\n (hasInlineExperiment && params.hasCliRuntimeConfig) ||\n (hasInlineExperiment && hasDefaultRuntime) ||\n inlineFingerprints.size > 1\n ) {\n return 'mixed';\n }\n if (params.hasCliRuntimeConfig) {\n return 'cli_flags';\n }\n if (hasInlineExperiment) {\n return 'inline_experiment';\n }\n return 'defaults';\n}\n\nfunction buildRuntimeSourceMetadata(params: {\n readonly cwd: string;\n readonly activeTestFiles: readonly string[];\n readonly sourceTests: readonly EvalTest[];\n readonly fileMetadata: ReadonlyMap<string, { readonly options: NormalizedOptions }>;\n readonly hasCliRuntimeConfig: boolean;\n}): RunRuntimeSourceMetadata {\n const activeEvalFiles = uniqueRuntimeSourcePaths(\n params.activeTestFiles.map((filePath) => toRuntimeSourcePath(params.cwd, filePath)),\n );\n const activeResolvedFiles = new Set(\n params.activeTestFiles.map((filePath) => path.resolve(filePath)),\n );\n const sourceEvalFiles = uniqueRuntimeSourcePaths(\n params.sourceTests.map((test) => testSourceEvalPath(params.cwd, test)),\n );\n const hasImportedSuite = params.sourceTests.some((test) => test.source?.importedSuiteName);\n const hasNonActiveSourceFile = params.sourceTests.some((test) => {\n const sourceFile = testSourceEvalPathForComparison(test);\n return sourceFile ? !activeResolvedFiles.has(sourceFile) : false;\n });\n const isWrapperEval =\n params.activeTestFiles.length === 1 && (hasImportedSuite || hasNonActiveSourceFile);\n const wrapperEvalFile = isWrapperEval\n ? toRuntimeSourcePath(params.cwd, params.activeTestFiles[0])\n : undefined;\n const evalFiles = sourceEvalFiles.length > 0 ? sourceEvalFiles : activeEvalFiles;\n\n return {\n schema_version: 'agentv.runtime_source.v1',\n config_source: buildRuntimeConfigSource({\n activeTestFiles: params.activeTestFiles,\n fileMetadata: params.fileMetadata,\n hasCliRuntimeConfig: params.hasCliRuntimeConfig,\n }),\n eval_files: evalFiles,\n ...(wrapperEvalFile && { wrapper_eval_file: wrapperEvalFile }),\n };\n}\n\ntype ResolvedExperimentForRun = {\n readonly name?: string;\n};\n\nfunction resolveExperimentForRun(explicitExperiment?: string): ResolvedExperimentForRun {\n return explicitExperiment ? { name: explicitExperiment } : {};\n}\n\nfunction applyExperimentOptions(\n options: NormalizedOptions,\n experiment: ExperimentConfig | undefined,\n): NormalizedOptions {\n if (!experiment) {\n return options;\n }\n\n const experimentTargetRefs = buildExperimentTargetRefs(experiment);\n const experimentTargetNames = experimentTargetRefs?.map((target) => target.name) ?? [];\n const experimentTarget =\n experiment.target && experiment.target.trim().length > 0 ? experiment.target : undefined;\n const experimentTargets =\n options.cliTargets.length === 0\n ? experimentTargetNames.length > 0\n ? experimentTargetNames\n : experimentTarget\n ? [experimentTarget]\n : undefined\n : undefined;\n\n return {\n ...options,\n target: options.target,\n agentTimeoutSeconds: options.agentTimeoutSeconds ?? experiment.timeoutSeconds,\n workspacePath: options.workspacePath,\n budgetUsd: options.budgetUsd ?? experiment.budgetUsd,\n threshold: options.threshold ?? experiment.threshold,\n experimentConfig: experiment,\n experimentMetadata: buildExperimentArtifactMetadata(experiment),\n experimentTargets,\n experimentTargetRefs: options.cliTargets.length === 0 ? experimentTargetRefs : undefined,\n targetModelOverride: options.targetModelOverride ?? experiment.model,\n experimentTrialsConfig: buildExperimentTrialsConfig(experiment),\n };\n}\n\nfunction buildExperimentTargetRefs(\n experiment: ExperimentConfig,\n): readonly EvalTargetRef[] | undefined {\n if (!experiment.targets || experiment.targets.length === 0) {\n return undefined;\n }\n return experiment.targets.map((target) => {\n if (typeof target === 'string') {\n return { name: target };\n }\n return {\n name: target.name,\n ...(target.useTarget !== undefined && { use_target: target.useTarget }),\n ...(target.hooks !== undefined && {\n hooks: target.hooks as EvalTargetRef['hooks'],\n }),\n };\n });\n}\n\nfunction buildExperimentTrialsConfig(experiment: ExperimentConfig): TrialsConfig | undefined {\n if (experiment.repeat) {\n if (experiment.repeat.count <= 1) {\n return undefined;\n }\n return {\n count: experiment.repeat.count,\n strategy: experiment.repeat.strategy,\n ...(experiment.repeat.costLimitUsd !== undefined && {\n costLimitUsd: experiment.repeat.costLimitUsd,\n }),\n ...(experiment.repeat.earlyExit !== undefined && { earlyExit: experiment.repeat.earlyExit }),\n };\n }\n return undefined;\n}\n\ntype EffectiveRunPolicy = {\n readonly trialsConfig?: TrialsConfig;\n readonly threshold?: number;\n readonly timeoutSeconds?: number;\n readonly budgetUsd?: number;\n readonly hasScopedOverride: boolean;\n};\n\nfunction buildRunOverrideTrialsConfig(run: EvalRunOverride | undefined): TrialsConfig | undefined {\n const repeat = run?.repeat;\n if (!repeat || repeat.count <= 1) {\n return undefined;\n }\n return {\n count: repeat.count,\n strategy: repeat.strategy,\n ...(repeat.costLimitUsd !== undefined && { costLimitUsd: repeat.costLimitUsd }),\n ...(repeat.earlyExit !== undefined && { earlyExit: repeat.earlyExit }),\n };\n}\n\nfunction resolveEffectiveRunPolicy(params: {\n readonly test: EvalTest;\n readonly options: NormalizedOptions;\n readonly defaultTrialsConfig?: TrialsConfig;\n readonly defaultThreshold?: number;\n readonly defaultTimeoutSeconds?: number;\n readonly defaultBudgetUsd?: number;\n}): EffectiveRunPolicy {\n const { test, options, defaultTrialsConfig, defaultThreshold, defaultTimeoutSeconds } = params;\n const run = test.run;\n const threshold = options.cliThreshold ?? run?.threshold ?? test.threshold ?? defaultThreshold;\n const timeoutSeconds =\n options.cliAgentTimeoutSeconds ?? run?.timeoutSeconds ?? defaultTimeoutSeconds;\n const budgetUsd = run?.budgetUsd ?? params.defaultBudgetUsd;\n const trialsConfig = buildRunOverrideTrialsConfig(run) ?? defaultTrialsConfig;\n return {\n ...(trialsConfig !== undefined && { trialsConfig }),\n ...(threshold !== undefined && { threshold }),\n ...(timeoutSeconds !== undefined && { timeoutSeconds }),\n ...(budgetUsd !== undefined && { budgetUsd }),\n hasScopedOverride: run !== undefined || test.threshold !== undefined,\n };\n}\n\nfunction runPolicyKey(policy: EffectiveRunPolicy): string {\n return JSON.stringify({\n trialsConfig: policy.trialsConfig,\n threshold: policy.threshold,\n timeoutSeconds: policy.timeoutSeconds,\n budgetUsd: policy.budgetUsd,\n });\n}\n\nfunction groupTestsByRunPolicy(params: {\n readonly tests: readonly EvalTest[];\n readonly options: NormalizedOptions;\n readonly defaultTrialsConfig?: TrialsConfig;\n readonly defaultThreshold?: number;\n readonly defaultTimeoutSeconds?: number;\n readonly defaultBudgetUsd?: number;\n}): readonly { readonly policy: EffectiveRunPolicy; readonly tests: readonly EvalTest[] }[] {\n const groups = new Map<string, { policy: EffectiveRunPolicy; tests: EvalTest[] }>();\n for (const test of params.tests) {\n const policy = resolveEffectiveRunPolicy({\n test,\n options: params.options,\n defaultTrialsConfig: params.defaultTrialsConfig,\n defaultThreshold: params.defaultThreshold,\n defaultTimeoutSeconds: params.defaultTimeoutSeconds,\n defaultBudgetUsd: params.defaultBudgetUsd,\n });\n const key = runPolicyKey(policy);\n const existing = groups.get(key);\n if (existing) {\n existing.tests.push(test);\n } else {\n groups.set(key, { policy, tests: [test] });\n }\n }\n return [...groups.values()];\n}\n\nfunction matchesTestFilter(id: string, filter: string | readonly string[]): boolean {\n return typeof filter === 'string'\n ? micromatch.isMatch(id, filter)\n : filter.some((pattern) => micromatch.isMatch(id, pattern));\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[]): 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[]) => display.addLogPaths(paths),\n };\n}\n\nfunction makeTestCaseKey(testFilePath: string, testId: string): string {\n return `${path.resolve(testFilePath)}::${testId}`;\n}\n\n/** Show the resolved target name when `default` is a `use_target` redirect. */\nfunction resolveTargetLabel(requestedName: string, resolvedName: string): string {\n if (resolvedName !== requestedName) {\n return `${requestedName} → ${resolvedName}`;\n }\n return requestedName;\n}\n\nfunction createDisplayIdTracker(): { getOrAssign(testCaseKey: string): number } {\n const map = new Map<string, number>();\n let nextId = 1;\n return {\n getOrAssign(testCaseKey: string): number {\n const existing = map.get(testCaseKey);\n if (existing !== undefined) {\n return existing;\n }\n const assigned = nextId++;\n map.set(testCaseKey, assigned);\n return assigned;\n },\n };\n}\n\n/**\n * Extract the model name from a resolved target, if available.\n * Azure uses `deploymentName`; most other providers use `model`.\n * CLI and mock providers have no model field.\n */\nfunction extractModelName(target: ResolvedTarget): string | undefined {\n if (target.kind === 'azure') {\n return target.config.deploymentName;\n }\n if ('model' in target.config && typeof target.config.model === 'string') {\n return target.config.model;\n }\n return undefined;\n}\n\n/**\n * Build the inline label suffix (e.g. `[provider=azure, model=gpt-4]`).\n */\nfunction buildTargetLabelSuffix(providerLabel: string, target: ResolvedTarget): string {\n const parts = [`provider=${providerLabel}`];\n const model = extractModelName(target);\n if (model) parts.push(`model=${model}`);\n return `[${parts.join(', ')}]`;\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\nfunction targetVariantForSelection(selection: TargetSelection): string | undefined {\n const target = selection.resolvedTarget;\n if (target.kind === 'replay') {\n return target.config.variant;\n }\n return undefined;\n}\n\nclass RunOutputWriter implements OutputWriter {\n private readonly indexPath: string;\n private writer: OutputWriter | undefined;\n\n constructor(\n private readonly invocationDir: string,\n private readonly appendMode: boolean,\n ) {\n this.indexPath = resolveRunIndexPath(invocationDir);\n }\n\n async append(result: EvaluationResult): Promise<void> {\n const writer = await this.writerForRun();\n await writer.append(result);\n }\n\n async close(): Promise<void> {\n await this.writer?.close();\n }\n\n indexPaths(): readonly string[] {\n return this.writer ? [this.indexPath] : [];\n }\n\n private async writerForRun(): Promise<OutputWriter> {\n if (this.writer) {\n return this.writer;\n }\n mkdirSync(this.invocationDir, { recursive: true });\n this.writer = await createOutputWriter(this.indexPath, { append: this.appendMode });\n return this.writer;\n }\n}\n\nasync function readExistingResultsFromRunDir(runDir: string): Promise<EvaluationResult[]> {\n const manifests = discoverRunManifestPaths(runDir);\n const results: EvaluationResult[] = [];\n for (const manifest of manifests) {\n const content = await readFile(manifest, 'utf8');\n results.push(...parseJsonlResults(content));\n }\n return results;\n}\n\nasync function resolveRerunFailedRunDir(cwd: string, source: string): Promise<string> {\n const trimmed = source.trim();\n if (!trimmed) {\n throw new Error('--rerun-failed requires a run ID, run workspace, or index.jsonl path.');\n }\n\n const candidate = path.isAbsolute(trimmed) ? trimmed : path.resolve(cwd, trimmed);\n if (existsSync(candidate)) {\n if (path.basename(candidate) !== RESULT_INDEX_FILENAME) {\n return candidate;\n }\n const manifestDir = path.dirname(candidate);\n return path.basename(manifestDir) === '.internal' ? path.dirname(manifestDir) : manifestDir;\n }\n\n const runIdCandidate = path.join(cwd, '.agentv', 'results', trimmed);\n if (existsSync(runIdCandidate)) {\n return runIdCandidate;\n }\n\n throw new Error(\n `Run not found for --rerun-failed: ${source}. Expected a run ID under .agentv/results, a run workspace, or an index.jsonl path.`,\n );\n}\n\nasync function prepareFileMetadata(params: {\n readonly testFilePath: string;\n readonly repoRoot: string;\n readonly cwd: string;\n readonly options: NormalizedOptions;\n readonly suiteFilter?: string | readonly string[];\n}): Promise<{\n readonly options: NormalizedOptions;\n readonly testIds: readonly string[];\n readonly testCases: 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 budgetUsd?: number;\n readonly failOnError?: FailOnError;\n readonly threshold?: number;\n readonly tags?: readonly string[];\n readonly providerFactory?: (\n target: import('@agentv/core').ResolvedTarget,\n ) => import('@agentv/core').Provider;\n}> {\n const { testFilePath, repoRoot, cwd, options, suiteFilter } = params;\n\n await ensureFileExists(testFilePath, 'Test file');\n await loadEnvFromHierarchy({\n testFilePath,\n repoRoot,\n verbose: options.verbose,\n });\n\n const relativePath = path.relative(cwd, testFilePath);\n const category = deriveCategory(relativePath);\n\n const suite = await loadCliEvalSuite(testFilePath, repoRoot, {\n verbose: options.verbose,\n filter: suiteFilter ?? options.filter,\n category,\n });\n const experimentOptions = applyExperimentOptions(options, suite.experimentConfig);\n const effectiveOptions =\n experimentOptions.workers === undefined && suite.workers !== undefined\n ? { ...experimentOptions, workers: suite.workers }\n : experimentOptions;\n const testCases =\n suiteFilter && effectiveOptions.filter\n ? suite.tests.filter((testCase) =>\n matchesTestFilter(testCase.id, effectiveOptions.filter ?? ''),\n )\n : suite.tests;\n const testIds = testCases.map((value) => value.id);\n const suiteTargetSpec = suite.targetSpec;\n const suiteTargets = suiteTargetSpec ? [suiteTargetSpec.name] : suite.targets;\n const defaultBudgetUsd =\n effectiveOptions.cliBudgetUsd === undefined\n ? (effectiveOptions.budgetUsd ?? suite.budgetUsd)\n : undefined;\n const suiteDefaultThreshold = suite.defaultTest?.threshold ?? suite.threshold;\n\n if (testCases.length === 0) {\n return {\n options: effectiveOptions,\n testIds,\n testCases,\n selections: [],\n trialsConfig: effectiveOptions.experimentTrialsConfig,\n suiteTargets,\n yamlCache: suite.cacheConfig?.enabled,\n yamlCachePath: suite.cacheConfig?.cachePath,\n budgetUsd: defaultBudgetUsd,\n failOnError: suite.failOnError,\n threshold: suiteDefaultThreshold,\n tags: suite.metadata?.tags,\n providerFactory: suite.providerFactory,\n };\n }\n\n let selections: { selection: TargetSelection; inlineTargetLabel: string }[];\n\n if (effectiveOptions.transcript) {\n // --transcript mode: bypass target resolution entirely.\n // Create a synthetic TargetSelection for the transcript provider.\n const transcriptSelection: TargetSelection = {\n definitions: [],\n resolvedTarget: {\n kind: 'transcript',\n name: 'transcript',\n config: {} as Record<string, never>,\n },\n targetName: 'transcript',\n targetSource: 'cli',\n targetsFilePath: effectiveOptions.transcript,\n };\n selections = [\n {\n selection: transcriptSelection,\n inlineTargetLabel: `transcript (${path.basename(effectiveOptions.transcript)})`,\n },\n ];\n } else if (suite.inlineTarget && effectiveOptions.cliTargets.length === 0) {\n const targetDefinition = suite.inlineTarget;\n const resolvedTarget = resolveTargetDefinition(targetDefinition, process.env, testFilePath, {\n emitDeprecationWarnings: false,\n });\n selections = [\n {\n selection: {\n definitions: [targetDefinition],\n resolvedTarget,\n targetName: targetDefinition.name,\n targetSource: 'test-file',\n targetsFilePath: testFilePath,\n },\n inlineTargetLabel: resolveTargetLabel(targetDefinition.name, resolvedTarget.name),\n },\n ];\n } else if (suite.providerFactory && effectiveOptions.cliTargets.length === 0) {\n const taskTarget: ResolvedTarget = {\n kind: 'mock',\n name: 'custom-task',\n graderTarget: undefined,\n config: {},\n };\n selections = [\n {\n selection: {\n definitions: [],\n resolvedTarget: taskTarget,\n targetName: 'custom-task',\n targetSource: 'test-file',\n targetsFilePath: testFilePath,\n },\n inlineTargetLabel: 'custom-task',\n },\n ];\n } else {\n // Determine target names: CLI --target flags override YAML\n const cliTargets = effectiveOptions.cliTargets;\n const experimentTargets = effectiveOptions.experimentTargets ?? [];\n const suiteTargetSpec = suite.targetSpec;\n const suiteTargets = suiteTargetSpec ? [suiteTargetSpec.name] : suite.targets;\n const suiteTargetRefs = suite.targetRefs;\n const experimentTargetRefs = effectiveOptions.experimentTargetRefs;\n\n // Resolve which target names to use (precedence: CLI/experiment > suite YAML targets > default)\n let targetNames: readonly string[];\n let targetRefs: readonly EvalTargetRef[] | undefined;\n let targetSource: 'cli' | 'test-file' = 'test-file';\n if (cliTargets.length > 0) {\n targetNames = cliTargets;\n targetRefs = experimentTargetRefs;\n targetSource = 'cli';\n } else if (experimentTargets.length > 0) {\n targetNames = experimentTargets;\n targetRefs = experimentTargetRefs;\n } else if (suiteTargets && suiteTargets.length > 0) {\n targetNames = suiteTargets;\n targetRefs = suiteTargetRefs;\n } else {\n targetNames = [];\n targetRefs = undefined;\n }\n\n if (targetNames.length > 1 || (targetNames.length === 1 && targetRefs)) {\n // Matrix mode: multiple targets\n const multiSelections = await selectMultipleTargets({\n testFilePath,\n repoRoot,\n cwd,\n explicitTargetsPath: effectiveOptions.targetsPath,\n env: process.env,\n targetNames,\n targetRefs,\n targetSource,\n modelOverride: effectiveOptions.targetModelOverride,\n });\n\n selections = multiSelections.map((sel) => ({\n selection: sel,\n inlineTargetLabel:\n sel.targetLabel ?? resolveTargetLabel(sel.targetName, sel.resolvedTarget.name),\n }));\n } else {\n // Single target mode (legacy path)\n const selection = await selectTarget({\n testFilePath,\n repoRoot,\n cwd,\n explicitTargetsPath: effectiveOptions.targetsPath,\n cliTargetName:\n targetSource === 'cli'\n ? targetNames.length === 1\n ? targetNames[0]\n : effectiveOptions.target\n : effectiveOptions.target,\n fileTargetName:\n targetSource === 'test-file' && targetNames.length === 1 ? targetNames[0] : undefined,\n fileTargetSpec:\n targetSource === 'test-file' && targetNames.length === 1 ? suiteTargetSpec : undefined,\n modelOverride: effectiveOptions.targetModelOverride,\n env: process.env,\n });\n\n // Attach target hooks from eval file if available\n const singleTargetRef = targetRefs?.find((ref) => ref.name === selection.targetName);\n const augmentedSelection: TargetSelection = {\n ...selection,\n ...(singleTargetRef?.label ? { targetLabel: singleTargetRef.label } : {}),\n ...(singleTargetRef?.hooks ? { targetHooks: singleTargetRef.hooks } : {}),\n };\n\n selections = [\n {\n selection: augmentedSelection,\n inlineTargetLabel:\n augmentedSelection.targetLabel ??\n resolveTargetLabel(\n augmentedSelection.targetName,\n augmentedSelection.resolvedTarget.name,\n ),\n },\n ];\n }\n }\n\n return {\n options: effectiveOptions,\n testIds,\n testCases,\n selections,\n trialsConfig: effectiveOptions.experimentTrialsConfig,\n suiteTargets,\n yamlCache: suite.cacheConfig?.enabled,\n yamlCachePath: suite.cacheConfig?.cachePath,\n budgetUsd: defaultBudgetUsd,\n failOnError: suite.failOnError,\n threshold: suiteDefaultThreshold,\n tags: suite.metadata?.tags,\n providerFactory: suite.providerFactory,\n };\n}\n\nfunction buildTaskBundleTargetSelections(\n activeTestFiles: readonly string[],\n fileMetadata: ReadonlyMap<\n string,\n { readonly selections: readonly { readonly selection: TargetSelection }[] }\n >,\n): readonly TaskBundleTargetSelection[] {\n return activeTestFiles.flatMap((testFilePath) => {\n const meta = fileMetadata.get(testFilePath);\n if (!meta) {\n return [];\n }\n return meta.selections.map(({ selection }) => ({\n evalFileAbsolutePath: testFilePath,\n targetName: selection.targetName,\n resolvedTargetName: selection.resolvedTarget.name,\n definitions: selection.definitions,\n }));\n });\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 cache?: EvaluationCache;\n readonly evaluationRunner: typeof defaultRunEvaluation;\n readonly workersOverride?: number;\n readonly progressReporter: ProgressReporter;\n readonly seenTestCases: Set<string>;\n readonly displayIdTracker: { getOrAssign(testCaseKey: string): number };\n readonly selection: TargetSelection;\n readonly inlineTargetLabel: string;\n readonly testCases: readonly EvalTest[];\n readonly trialsConfig?: TrialsConfig;\n readonly agentTimeoutSeconds?: number;\n readonly matrixMode?: boolean;\n readonly budgetUsd?: number;\n readonly runBudgetTracker?: RunBudgetTracker;\n readonly failOnError?: FailOnError;\n readonly threshold?: number;\n readonly providerFactory?: (\n target: import('@agentv/core').ResolvedTarget,\n ) => import('@agentv/core').Provider;\n}): Promise<{ results: EvaluationResult[] }> {\n const {\n testFilePath,\n cwd,\n repoRoot,\n options,\n outputWriter,\n cache,\n evaluationRunner,\n workersOverride,\n progressReporter,\n seenTestCases,\n displayIdTracker,\n selection,\n inlineTargetLabel,\n testCases,\n trialsConfig,\n agentTimeoutSeconds,\n matrixMode,\n budgetUsd,\n runBudgetTracker,\n failOnError,\n providerFactory,\n } = params;\n\n const targetName = selection.targetName;\n const replayRecording = options.recordReplay\n ? {\n fixturesPath: path.resolve(options.recordReplay),\n sourceTarget: targetName,\n variant: options.recordReplayVariant,\n }\n : undefined;\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 explicitVariant = targetVariantForSelection(resolvedTargetSelection);\n const providerLabel = resolvedTargetSelection.resolvedTarget.kind;\n const targetMessage = options.verbose\n ? `Using target (${resolvedTargetSelection.targetSource}): ${resolvedTargetSelection.targetName} ${buildTargetLabelSuffix(providerLabel, resolvedTargetSelection.resolvedTarget)} via ${resolvedTargetSelection.targetsFilePath}`\n : `Using target: ${inlineTargetLabel}`;\n if (!progressReporter.isInteractive || options.verbose) {\n console.log(`${targetMessage}`);\n }\n\n // Hint about pipeline for CLI agent targets\n const targetKind = resolvedTargetSelection.resolvedTarget.kind;\n if (targetKind === 'claude-cli' || targetKind === 'copilot-cli') {\n console.log('');\n console.log(' TIP: For subagent-mode evals, use `agentv pipeline` instead of `eval run`.');\n console.log(' The agent orchestrates executor + grader subagents directly.');\n console.log(' Run: agentv pipeline --help');\n console.log('');\n }\n\n const agentTimeoutMs =\n agentTimeoutSeconds != null ? Math.max(0, agentTimeoutSeconds) * 1000 : undefined;\n\n // Resolve workers: CLI/config > target setting > default\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) {\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 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 filter: options.filter,\n evalCases: testCases,\n verbose: options.verbose,\n maxConcurrency: resolvedWorkers,\n workspacePath: options.workspacePath,\n keepWorkspaces: options.keepWorkspaces,\n trials: trialsConfig,\n budgetUsd,\n runBudgetTracker,\n failOnError,\n graderTarget: options.graderTarget,\n model: options.model,\n threshold: params.threshold,\n targetHooks: resolvedTargetSelection.targetHooks,\n replayRecording,\n providerFactory,\n onResult: async (result: EvaluationResult) => {\n // Trim output messages for results JSONL based on --output-messages.\n // Each message is trimmed to { role, content } only (no toolCalls, startTime, etc.).\n const resultWithVariant =\n explicitVariant && !result.variant ? { ...result, variant: explicitVariant } : result;\n const resultWithMetadata = withSourceMetadata(resultWithVariant, testFilePath, options);\n const trimmedResult = prepareResultForJsonl(resultWithMetadata, options);\n await outputWriter.append(trimmedResult);\n },\n onProgress: async (event) => {\n const testCaseKeyId = matrixMode ? `${event.testId}@${targetName}` : event.testId;\n const testCaseKey = makeTestCaseKey(testFilePath, testCaseKeyId);\n if (event.status === 'pending' && !seenTestCases.has(testCaseKey)) {\n seenTestCases.add(testCaseKey);\n progressReporter.setTotal(seenTestCases.size);\n }\n const displayId = displayIdTracker.getOrAssign(testCaseKey);\n\n // Map executionStatus to verdict for display\n let verdict: Verdict | undefined;\n if (event.executionStatus === 'ok') verdict = 'PASS';\n else if (event.executionStatus === 'quality_failure') verdict = 'FAIL';\n else if (event.executionStatus === 'execution_error') verdict = 'ERROR';\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 score: event.score,\n verdict,\n durationMs: event.durationMs,\n totalDurationMs: event.evalRunDurationMs,\n });\n },\n });\n\n return {\n results: results.map((result) =>\n withSourceMetadata(\n explicitVariant && !result.variant ? { ...result, variant: explicitVariant } : result,\n testFilePath,\n options,\n ),\n ),\n };\n}\n\nexport interface RunEvalResult {\n readonly executionErrorCount: number;\n readonly outputPath: string;\n readonly testFiles: readonly string[];\n readonly target?: string;\n /** True when --threshold is set and mean score is below the threshold */\n readonly thresholdFailed?: boolean;\n /** True when all tests had execution errors and no evaluation was performed */\n readonly allExecutionErrors?: boolean;\n /** True when --budget-usd was set and the run-level budget was exceeded */\n readonly budgetExceeded?: boolean;\n}\n\ninterface RemoteEvalSummaryInput {\n readonly evalFile: string;\n readonly results: EvaluationResult[];\n}\n\nexport async function runEvalCommand(\n input: RunEvalCommandInput,\n): Promise<RunEvalResult | undefined> {\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. A mismatch is advisory\n // unless the user explicitly opts into --strict.\n let requiredVersionCheck: VersionCheckResult | undefined;\n if (yamlConfig?.required_version) {\n requiredVersionCheck = await enforceRequiredVersion(yamlConfig.required_version, {\n strict: normalizeBoolean(input.rawOptions.strict),\n });\n }\n\n let options = normalizeOptions(input.rawOptions, config, yamlConfig?.execution);\n const resolvedExperiment = resolveExperimentForRun(options.experiment);\n const evalPathInputs = input.testFiles.length > 0 ? [...input.testFiles] : [];\n if (evalPathInputs.length === 0 && process.stdin.isTTY) {\n const { launchInteractiveWizard } = await import('./interactive.js');\n await launchInteractiveWizard();\n return undefined;\n }\n const resolvedTestFiles = await resolveEvalPaths(evalPathInputs, cwd, {\n allowReadAdapters: true,\n });\n const fallbackResultGroupName =\n resolvedTestFiles.length === 1 ? deriveEvalResultGroupName(resolvedTestFiles[0]) : 'multi-eval';\n const primarySuite =\n resolvedTestFiles.length > 0\n ? await loadCliEvalSuite(resolvedTestFiles[0], repoRoot, {\n verbose: options.verbose,\n filter: options.filter,\n category: deriveCategory(path.relative(cwd, resolvedTestFiles[0])),\n })\n : undefined;\n const resultGroupName =\n resolvedTestFiles.length === 1\n ? (primarySuite?.metadata?.name ?? fallbackResultGroupName)\n : fallbackResultGroupName;\n // Resolve the promptfoo-shaped tags map: eval `tags` < project config `tags`\n // < CLI `--tag key=value`. The reserved `experiment` key feeds the namespace\n // between an explicit --experiment (CLI) and the eval-derived default.\n const resolvedTags = resolveEffectiveTags({\n evalTags: primarySuite?.tags,\n configTags: yamlConfig?.tags,\n cliTags: options.tagMap,\n });\n const { experiment: resolvedExperimentNamespace } = resolveExperimentNamespace({\n cliExperiment: resolvedExperiment.name,\n tagsExperiment: normalizeString(resolvedTags?.experiment),\n isMultiEval: resolvedTestFiles.length > 1,\n suiteName: primarySuite?.metadata?.name,\n resultGroupName,\n });\n // Normalize once so the row `experiment` field, AGENTV_EXPERIMENT, and the\n // emitted tags map all agree (and any invalid-name error surfaces in one place).\n const normalizedExperiment = normalizeExperimentName(resolvedExperimentNamespace);\n options = {\n ...options,\n experiment: resolvedExperimentNamespace,\n };\n // Keep the emitted tags map's `experiment` key in lockstep with the resolved\n // namespace ONLY when an experiment was intentionally set — via `--experiment`\n // or an authored `tags.experiment`. A run whose tags map carries no experiment\n // (e.g. only `--tag team=core`) must not gain an eval-default experiment key,\n // and a run with no tags at all emits no map.\n const emittedTags = syncTagsExperiment(resolvedTags, {\n experimentIsIntentional: resolvedExperiment.name !== undefined,\n normalizedExperiment,\n });\n const hasCliRuntimeConfig = hasCliRuntimeSource(input.rawOptions);\n\n if (!process.env.AGENTV_EXPERIMENT) {\n process.env.AGENTV_EXPERIMENT = normalizedExperiment;\n }\n\n // Validate --grader-target / --model combinations\n if (options.graderTarget === 'agentv' && !options.model) {\n throw new Error('--grader-target agentv requires --model (e.g., --model openai:gpt-5-mini)');\n }\n\n if (options.removedOut) {\n throw new Error(\n [\n '--out was removed from agentv eval. Use --output <dir> for the canonical run directory.',\n 'Flat result file export from agentv eval has been removed.',\n `Migration example: --out ${options.removedOut} -> --output <dir>`,\n ].join('\\n'),\n );\n }\n if (options.outputFormat) {\n throw new Error(\n `--output-format was removed from agentv eval. The run directory always writes ${RESULT_INDEX_FILENAME}.`,\n );\n }\n if (options.artifacts) {\n throw new Error(artifactsMigrationMessage(options.artifacts, options.outputDir));\n }\n if (options.outputDir && looksLikeLegacyOutputFilePath(options.outputDir)) {\n throw new Error(outputFileMigrationMessage(options.outputDir));\n }\n\n // --retry-errors: resume from a previous run by re-running execution_error and missing test cases.\n // Uses an exclusion filter to skip already-completed (non-error) cases, which naturally includes\n // both error cases and cases that never ran (e.g., due to a crash or interrupt).\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 completedIds = await loadFullyCompletedTestIds(retryPath);\n const errorIds = await loadErrorTestIds(retryPath);\n retryNonErrorResults = await loadNonErrorResults(retryPath);\n\n if (errorIds.length > 0) {\n console.log(`Found ${errorIds.length} execution-error test(s): ${errorIds.join(', ')}`);\n }\n // Use a negation filter to exclude fully-completed (non-error across all targets) cases.\n // This re-runs error cases, cases missing from the output (crash recovery), and cases\n // that errored on some targets even if they succeeded on others (matrix safety).\n if (completedIds.length > 0) {\n options = { ...options, filter: buildExclusionFilter(completedIds) };\n console.log(`Skipping ${completedIds.length} already-completed test(s).`);\n }\n }\n\n // --resume without an explicit --output: default to the\n // last-known run dir for this cwd from .agentv/cache.json. Matches promptfoo's\n // `--resume [evalId]` and OpenCompass's `-r [timestamp]` \"latest by default\"\n // convention. The cache pointer is written by saveRunCache after every eval.\n if (options.resume && !options.rerunFailedSource && !options.retryErrors && !options.outputDir) {\n const cachedDir = await resolveCachedRunDir(cwd);\n if (cachedDir) {\n options = { ...options, outputDir: cachedDir };\n const displayDir = path.relative(cwd, cachedDir) || cachedDir;\n console.log(`Auto-detected last run dir for --resume: ${displayDir}`);\n }\n }\n\n // --resume skips completed rows; --rerun-failed includes only latest failed/error rows.\n // IMPORTANT: JSONL must be loaded before the output writer is created (same file).\n let resumeSkipKeys: ResumeIdentityMatcher | undefined;\n let rerunIncludeKeys: ResumeIdentityMatcher | undefined;\n let isResumeAppend = false;\n if (options.resume && !options.retryErrors) {\n const sourceRunDir = options.rerunFailedSource\n ? await resolveRerunFailedRunDir(cwd, options.rerunFailedSource)\n : options.outputDir\n ? path.resolve(options.outputDir)\n : undefined;\n\n if (sourceRunDir) {\n if (options.rerunFailedSource && !options.outputDir) {\n options = { ...options, outputDir: sourceRunDir };\n }\n\n const resumeIndexPaths = discoverRunManifestPaths(sourceRunDir);\n if (resumeIndexPaths.length > 0) {\n const existingResults = await readExistingResultsFromRunDir(sourceRunDir);\n resumeSkipKeys = createResumeIdentityMatcher();\n rerunIncludeKeys = options.rerunFailed ? createResumeIdentityMatcher() : undefined;\n let completedResultCount = 0;\n for (const entry of latestResumeIdentityEntries(existingResults)) {\n if (shouldSkipExistingResultForResume(entry.result, options.rerunFailed)) {\n completedResultCount += 1;\n addResumeIdentityEntry(resumeSkipKeys, entry);\n } else if (rerunIncludeKeys) {\n addResumeIdentityEntry(rerunIncludeKeys, entry);\n }\n }\n isResumeAppend =\n options.outputDir !== undefined &&\n path.resolve(options.outputDir) === path.resolve(sourceRunDir);\n const modeLabel = options.rerunFailed ? 'Rerun-failed' : 'Resume';\n console.log(\n `${modeLabel}: found ${existingResults.length} existing result(s), skipping ${completedResultCount} completed.`,\n );\n } else if (options.rerunFailed) {\n rerunIncludeKeys = createResumeIdentityMatcher();\n console.log('Rerun-failed: no existing bundle run manifest found. Nothing to rerun.');\n } else {\n // No existing bundle manifest — behave like a normal run.\n console.log('Resume: no existing bundle run manifest found, starting fresh run.');\n }\n } else {\n console.warn(\n 'Warning: --resume requires --output <dir> (or a cached last run) to identify the run directory. Ignoring --resume.',\n );\n }\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 // Resolve artifact directory. The CLI run dir is the run bundle root; target,\n // model, and variant are metadata fields, not path dimensions.\n // Precedence: --output > config output.dir > default\n const explicitDir = options.outputDir;\n let runDir: string;\n let outputPath: string;\n let runDirName = process.env.AGENTV_RUN_TIMESTAMP?.trim() || createRunDirName();\n\n if (explicitDir) {\n runDir = path.resolve(explicitDir);\n mkdirSync(runDir, { recursive: true });\n outputPath = runDir;\n } else {\n // Default: .agentv/results/<run_id>/.\n runDir = buildDefaultRunDirFromName(cwd, resultGroupName, runDirName);\n let suffix = 1;\n while (existsSync(runDir)) {\n runDirName = `${process.env.AGENTV_RUN_TIMESTAMP?.trim() || createRunDirName()}-${suffix}`;\n runDir = buildDefaultRunDirFromName(cwd, resultGroupName, runDirName);\n suffix++;\n }\n mkdirSync(runDir, { recursive: true });\n outputPath = runDir;\n }\n if (!process.env.AGENTV_RUN_TIMESTAMP) {\n process.env.AGENTV_RUN_TIMESTAMP = path.basename(runDir);\n }\n process.env.AGENTV_RUN_DIR = runDir;\n\n console.log(`Artifact directory: ${runDir}`);\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 remoteEvalSummaries: RemoteEvalSummaryInput[] = [];\n const seenTestCases = new Set<string>();\n const displayIdTracker = createDisplayIdTracker();\n\n // CLI --budget-usd is invocation-wide. Inline experiment.budget_usd is handled per eval file.\n const runBudgetTracker = options.cliBudgetUsd\n ? new RunBudgetTracker(options.cliBudgetUsd)\n : undefined;\n if (runBudgetTracker) {\n console.log(`Run budget cap: $${runBudgetTracker.budgetCapUsd.toFixed(2)}`);\n }\n\n // Each file gets its own worker policy from CLI/config or that file's experiment block.\n const fileMetadata = new Map<\n string,\n {\n readonly options: NormalizedOptions;\n readonly testIds: readonly string[];\n readonly testCases: 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 budgetUsd?: number;\n readonly failOnError?: FailOnError;\n readonly threshold?: number;\n readonly tags?: readonly string[];\n readonly providerFactory?: (\n target: import('@agentv/core').ResolvedTarget,\n ) => import('@agentv/core').Provider;\n }\n >();\n for (const testFilePath of resolvedTestFiles) {\n const meta = await prepareFileMetadata({\n testFilePath,\n repoRoot,\n cwd,\n options,\n suiteFilter: undefined,\n });\n fileMetadata.set(testFilePath, meta);\n }\n\n // Apply --tag / --exclude-tag filtering at the eval-file level\n const hasTagFilters = options.tags.length > 0 || options.excludeTags.length > 0;\n if (hasTagFilters) {\n const skippedFiles: string[] = [];\n for (const [testFilePath, meta] of fileMetadata.entries()) {\n if (!matchesTagFilters(meta.tags, options.tags, options.excludeTags)) {\n fileMetadata.delete(testFilePath);\n skippedFiles.push(path.relative(cwd, testFilePath));\n }\n }\n if (skippedFiles.length > 0 && options.verbose) {\n console.log(\n `Skipped ${skippedFiles.length} eval file(s) by tag filter: ${skippedFiles.join(', ')}`,\n );\n }\n if (fileMetadata.size === 0) {\n console.log('No eval files matched the tag filters. Nothing to run.');\n return;\n }\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 tsConfigCache: options.tsConfigCache,\n });\n const activeCachePath = options.cachePath ?? yamlCachePath ?? options.tsConfigCachePath;\n const cache = cacheEnabled\n ? new ResponseCache(activeCachePath ? path.resolve(activeCachePath) : undefined)\n : undefined;\n\n if (cache) {\n console.log(`Response cache: enabled (${cache.cachePath})`);\n }\n if (options.recordReplay) {\n console.log(`Replay recording: ${path.resolve(options.recordReplay)}`);\n }\n\n // Resolve a global summary threshold only when the CLI supplies one or the first\n // active eval file is the only source of runtime policy. Multi-file runs with\n // inline thresholds are summarized from per-result execution status instead.\n const yamlThreshold = firstMeta?.threshold;\n const resolvedThreshold = options.threshold ?? yamlThreshold;\n if (resolvedThreshold !== undefined && (resolvedThreshold < 0 || resolvedThreshold > 1)) {\n throw new Error('--threshold must be between 0 and 1');\n }\n\n // Build the output writer for the single run-root manifest.\n const outputWriter = new RunOutputWriter(runDir, isResumeAppend);\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 × selected targets.\n // When resuming, subtract tests that will be skipped\n let totalEvalCount = 0;\n let resumeSkippedCount = 0;\n for (const meta of fileMetadata.values()) {\n for (const test of meta.testCases) {\n for (const { selection } of meta.selections) {\n const target = selection.targetName;\n const variant = targetVariantForSelection(selection);\n if (rerunIncludeKeys) {\n if (resumeIdentityMatches(rerunIncludeKeys, test, target, variant)) {\n totalEvalCount++;\n } else {\n resumeSkippedCount++;\n }\n } else if (resumeSkipKeys && resumeIdentityMatches(resumeSkipKeys, test, target, variant)) {\n resumeSkippedCount++;\n } else {\n totalEvalCount++;\n }\n }\n }\n }\n\n if (totalEvalCount === 0) {\n // When using --retry-errors, all tests being filtered means no errors or missing cases remain\n if (options.retryErrors && retryNonErrorResults && retryNonErrorResults.length > 0) {\n console.log('No execution errors or missing cases in the previous run. Nothing to retry.');\n return;\n }\n if (rerunIncludeKeys) {\n console.log('Nothing to rerun — no failed or errored test(s) matched the current suite.');\n return;\n }\n // When using --resume, all tests being completed means nothing to resume\n if (resumeSkipKeys && resumeSkippedCount > 0) {\n console.log(`Nothing to resume — all ${resumeSkippedCount} test(s) already completed.`);\n return;\n }\n throw new Error('No tests matched the provided filters.');\n }\n const progressReporter = createProgressReporter(options.workers ?? DEFAULT_WORKERS, {\n verbose: options.verbose,\n });\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]);\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]);\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]);\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]);\n });\n for (const [testFilePath, meta] of fileMetadata.entries()) {\n for (const { selection, inlineTargetLabel } of meta.selections) {\n for (const testId of meta.testIds) {\n const testCaseKey = makeTestCaseKey(\n testFilePath,\n meta.selections.length > 1 ? `${testId}@${selection.targetName}` : testId,\n );\n seenTestCases.add(testCaseKey);\n const displayId = displayIdTracker.getOrAssign(testCaseKey);\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 // Use only files that survived tag filtering.\n const activeTestFiles = resolvedTestFiles.filter((f) => fileMetadata.has(f));\n const activeSourceTests = activeTestFiles.flatMap(\n (activeTestFile) => fileMetadata.get(activeTestFile)?.testCases ?? [],\n );\n const singleActiveFileMetadata =\n activeTestFiles.length === 1 ? fileMetadata.get(activeTestFiles[0]) : undefined;\n const runExperimentMetadata = singleActiveFileMetadata?.options.experimentMetadata;\n const runtimeSourceMetadata = buildRuntimeSourceMetadata({\n cwd,\n activeTestFiles,\n sourceTests: activeSourceTests,\n fileMetadata,\n hasCliRuntimeConfig,\n });\n const hasPerFileRuntimeThresholds =\n options.cliThreshold === undefined &&\n activeTestFiles.some((activeTestFile) => {\n const metadata = fileMetadata.get(activeTestFile);\n return metadata?.options.threshold !== undefined || metadata?.threshold !== undefined;\n });\n\n // --transcript: create a shared TranscriptProvider and validate entry count\n let transcriptProviderFactory:\n | ((target: import('@agentv/core').ResolvedTarget) => import('@agentv/core').Provider)\n | undefined;\n if (options.transcript) {\n const { TranscriptProvider } = await import('@agentv/core');\n const transcriptProvider = await TranscriptProvider.fromFile(options.transcript);\n\n // Validate: transcript entries must match total test cases across all files\n const totalTests = [...fileMetadata.values()].reduce(\n (sum, meta) => sum + meta.testCases.length,\n 0,\n );\n const evalTestIds = [...fileMetadata.values()].flatMap((meta) =>\n meta.testCases.map((testCase) => testCase.id),\n );\n if (transcriptProvider.lineCount !== totalTests) {\n throw new Error(\n `Transcript has ${transcriptProvider.lineCount} entr${transcriptProvider.lineCount === 1 ? 'y' : 'ies'} but eval defines ${totalTests} test(s). Each transcript entry must map to one test case by test_id.`,\n );\n }\n const transcriptTestIds = new Set(transcriptProvider.testIds);\n const evalTestIdSet = new Set(evalTestIds);\n const missing = evalTestIds.filter((testId) => !transcriptTestIds.has(testId));\n const extra = transcriptProvider.testIds.filter((testId) => !evalTestIdSet.has(testId));\n if (missing.length > 0 || extra.length > 0) {\n throw new Error(\n [\n 'Transcript test_id values must match eval test ids for replay.',\n missing.length > 0 ? `Missing transcript entries: ${missing.join(', ')}` : undefined,\n extra.length > 0\n ? `Transcript entries without eval tests: ${extra.join(', ')}`\n : undefined,\n ]\n .filter((line): line is string => line !== undefined)\n .join(' '),\n );\n }\n\n transcriptProviderFactory = () => transcriptProvider;\n console.log(\n `Using transcript: ${options.transcript} (${transcriptProvider.lineCount} entry(s))`,\n );\n }\n\n // Write a stub summary.json in the run bundle before dispatching tests,\n // carrying the planned execution count so an interrupted run can still\n // surface as resumable in Dashboard. The end-of-run write preserves this\n // value via readPlannedTestCount inside aggregateRunDir /\n // writeArtifactsFromResults.\n // Skip on resume — we want to preserve the *original* planned count.\n if (!isResumeAppend && totalEvalCount > 0) {\n const evalFile = activeTestFiles.length === 1 ? activeTestFiles[0] : '';\n await writeInitialRunSummaryArtifact(runDir, {\n evalFile,\n plannedTestCount: totalEvalCount,\n experiment: normalizeExperimentName(options.experiment),\n runId: path.basename(runDir),\n experimentMetadata: runExperimentMetadata,\n runtimeSource: runtimeSourceMetadata,\n tags: emittedTags,\n });\n }\n\n // Periodic WIP checkpoint loop: push partial results to a unique non-default\n // branch every ~60s so pod loss doesn't discard completed-test output.\n // Only active when a results repo with auto_push is configured; otherwise a no-op.\n let wipLoop: WipCheckpointLoop | undefined;\n let wipCleanedUp = false;\n let finalExportStatus: RemoteExportStatus = 'disabled';\n {\n const wipConfig = await loadNormalizedResultsConfig(\n cwd,\n undefined,\n options.resultsOverrides,\n ).catch(() => undefined);\n if (wipConfig?.auto_push) {\n wipLoop = new WipCheckpointLoop({\n config: wipConfig,\n runDir,\n destinationPath: getRelativeRunPath(cwd, runDir),\n });\n await wipLoop.start();\n }\n }\n\n // Eval files run sequentially; within each file, --workers N test cases run in parallel.\n // This matches industry practice (promptfoo, deepeval, OpenAI Evals) and avoids cross-file\n // workspace races without any grouping complexity.\n let hasScopedRunPolicies = false;\n try {\n for (const testFilePath of activeTestFiles) {\n const targetPrep = fileMetadata.get(testFilePath);\n if (!targetPrep) {\n throw new Error(`Missing metadata for ${testFilePath}`);\n }\n const fileOptions = targetPrep.options;\n const fileBudgetTracker =\n runBudgetTracker ??\n (fileOptions.budgetUsd !== undefined\n ? new RunBudgetTracker(fileOptions.budgetUsd)\n : undefined);\n // Run-level budget check: skip remaining files if budget exceeded\n if (fileBudgetTracker?.isExceeded()) {\n const budgetMsg = `Run budget exceeded ($${fileBudgetTracker.currentCostUsd.toFixed(4)} / $${fileBudgetTracker.budgetCapUsd.toFixed(4)})`;\n console.log(`\\n⚠ ${budgetMsg} — skipping ${path.basename(testFilePath)}`);\n for (const { selection } of targetPrep.selections) {\n const explicitVariant = targetVariantForSelection(selection);\n const skippedResults: EvaluationResult[] = targetPrep.testCases.map((testCase) => ({\n timestamp: new Date().toISOString(),\n testId: testCase.testId ?? testCase.id,\n prompt: testCase.prompt,\n score: 0,\n assertions: [],\n output: budgetMsg,\n trace: buildTraceFromMessages({\n input: testCase.input as EvaluationResult['input'],\n output: [{ role: 'assistant' as const, content: budgetMsg }],\n finalOutput: budgetMsg,\n target: selection.targetName,\n testId: testCase.testId ?? testCase.id,\n conversationId: testCase.conversation_id,\n error: budgetMsg,\n }),\n error: budgetMsg,\n budgetExceeded: true,\n executionStatus: 'execution_error' as const,\n failureStage: 'setup' as const,\n failureReasonCode: 'budget_exceeded' as const,\n executionError: { message: budgetMsg, stage: 'setup' as const },\n target: selection.targetName,\n variant: explicitVariant,\n }));\n for (const r of skippedResults) {\n await outputWriter.append(withSourceMetadata(r, testFilePath, fileOptions));\n }\n allResults.push(\n ...skippedResults.map((r) => withSourceMetadata(r, testFilePath, fileOptions)),\n );\n }\n continue;\n }\n\n const fileWorkerLimit = Math.max(1, fileOptions.workers ?? DEFAULT_WORKERS);\n const targetConcurrency =\n targetPrep.selections.length > 1\n ? Math.min(fileWorkerLimit, targetPrep.selections.length)\n : 1;\n const perTargetWorkers =\n targetPrep.selections.length > 1\n ? Math.max(1, Math.floor(fileWorkerLimit / targetConcurrency))\n : fileWorkerLimit;\n const limitTarget = pLimit(targetConcurrency);\n\n // Run target matrix selections through a bounded pool. Each active target\n // receives a slice of the worker budget so total in-process case execution\n // never multiplies past max_concurrency.\n const targetResults = await Promise.all(\n targetPrep.selections.map(({ selection, inlineTargetLabel }) =>\n limitTarget(async () => {\n // Target selection is suite/experiment/CLI runtime policy; every selected\n // target runs every filtered test case for this eval file.\n const targetName = selection.targetName;\n const applicableTestCases = targetPrep.testCases;\n\n // --resume skips completed tests; --rerun-failed only includes prior failed/error tests.\n const filteredTestCases = rerunIncludeKeys\n ? applicableTestCases.filter((test) =>\n resumeIdentityMatches(\n rerunIncludeKeys,\n test,\n targetName,\n targetVariantForSelection(selection),\n ),\n )\n : resumeSkipKeys\n ? applicableTestCases.filter((test) => {\n const variant = targetVariantForSelection(selection);\n return !resumeIdentityMatches(resumeSkipKeys, test, targetName, variant);\n })\n : applicableTestCases;\n\n if (filteredTestCases.length === 0) {\n return [];\n }\n\n try {\n const runGroups = groupTestsByRunPolicy({\n tests: filteredTestCases,\n options: fileOptions,\n defaultTrialsConfig: fileOptions.transcript ? undefined : targetPrep.trialsConfig,\n defaultThreshold: targetPrep.threshold ?? fileOptions.threshold,\n defaultTimeoutSeconds: fileOptions.agentTimeoutSeconds,\n defaultBudgetUsd: targetPrep.budgetUsd,\n });\n const groupResults: EvaluationResult[] = [];\n for (const group of runGroups) {\n hasScopedRunPolicies ||= group.policy.hasScopedOverride;\n const result = await runSingleEvalFile({\n testFilePath,\n cwd,\n repoRoot,\n options: fileOptions,\n outputWriter,\n cache,\n evaluationRunner,\n workersOverride: perTargetWorkers,\n progressReporter,\n seenTestCases,\n displayIdTracker,\n selection,\n inlineTargetLabel,\n testCases: group.tests,\n trialsConfig: fileOptions.transcript ? undefined : group.policy.trialsConfig,\n agentTimeoutSeconds: group.policy.timeoutSeconds,\n matrixMode: targetPrep.selections.length > 1,\n budgetUsd: group.policy.budgetUsd,\n runBudgetTracker: fileBudgetTracker,\n failOnError: targetPrep.failOnError,\n threshold: group.policy.threshold,\n providerFactory: transcriptProviderFactory ?? targetPrep.providerFactory,\n });\n groupResults.push(...result.results);\n }\n const evalFile = path.relative(cwd, testFilePath);\n const existingSummary = remoteEvalSummaries.find(\n (summary) => summary.evalFile === evalFile,\n );\n if (existingSummary) {\n existingSummary.results.push(...groupResults);\n } else {\n remoteEvalSummaries.push({\n evalFile,\n results: [...groupResults],\n });\n }\n\n return groupResults;\n } catch (fileError) {\n // before_all or other setup failures should not abort the entire run.\n // Mark all tests in this file as errors and continue with other files.\n const message = fileError instanceof Error ? fileError.message : String(fileError);\n console.error(\n `\\n[ERROR] ⚠ Eval file failed: ${path.basename(testFilePath)} — ${message}\\n`,\n );\n const explicitVariant = targetVariantForSelection(selection);\n const errorResults: EvaluationResult[] = filteredTestCases.map((testCase) =>\n withSourceMetadata(\n {\n timestamp: new Date().toISOString(),\n testId: testCase.testId ?? testCase.id,\n prompt: testCase.prompt,\n score: 0,\n assertions: [],\n output: message,\n trace: buildTraceFromMessages({\n input: testCase.input as EvaluationResult['input'],\n output: [{ role: 'assistant' as const, content: message }],\n finalOutput: message,\n target: selection.targetName,\n testId: testCase.testId ?? testCase.id,\n conversationId: testCase.conversation_id,\n error: message,\n }),\n scores: [],\n error: message,\n executionStatus: 'execution_error' as const,\n failureStage: 'setup' as const,\n failureReasonCode: 'setup_error' as const,\n durationMs: 0,\n tokenUsage: { input: 0, output: 0 },\n target: selection.targetName,\n variant: explicitVariant,\n },\n testFilePath,\n fileOptions,\n ),\n );\n for (const errResult of errorResults) {\n await outputWriter.append(errResult);\n }\n return errorResults;\n }\n }),\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 // Flush the output writer so all results are on disk before we read back.\n await outputWriter.close().catch(() => undefined);\n\n // Compute summary from the persisted bundle indexes so resume includes old\n // rows and normal runs reflect the same manifests Dashboard will read.\n const summaryResults = deduplicateByTestIdTarget(await readExistingResultsFromRunDir(runDir));\n\n const thresholdOpts =\n hasScopedRunPolicies || hasPerFileRuntimeThresholds\n ? { thresholdLabel: 'configured threshold(s)', useExecutionStatus: true }\n : resolvedThreshold !== undefined\n ? { threshold: resolvedThreshold }\n : undefined;\n const summary = calculateEvaluationSummary(summaryResults, thresholdOpts);\n console.log(formatEvaluationSummary(summary, thresholdOpts));\n if (\n requiredVersionCheck &&\n !requiredVersionCheck.satisfied &&\n (summary.qualityFailureCount > 0 || summary.executionErrorCount > 0)\n ) {\n console.log(`\\n${formatRequiredVersionFailureNote(requiredVersionCheck)}`);\n }\n\n // Exit code: 2 when all tests are execution errors (no evaluation performed),\n // 1 when any test scored below threshold.\n const allExecutionErrors = summary.total > 0 && summary.executionErrorCount === summary.total;\n const thresholdFailed =\n (thresholdOpts?.useExecutionStatus === true || resolvedThreshold !== undefined) &&\n summary.qualityFailureCount > 0;\n\n // Print matrix summary when multiple targets were evaluated\n if (isMatrixMode && summaryResults.length > 0) {\n console.log(formatMatrixSummary(summaryResults));\n }\n\n // Write artifacts to the run bundle root (always, not conditional on flags).\n // Per-result artifact directories are allocated from row identity and\n // exposed through index.jsonl fields.\n if (allResults.length > 0) {\n const evalFile = activeTestFiles.length === 1 ? activeTestFiles[0] : '';\n const sourceTests = activeSourceTests;\n const taskBundleTargets = buildTaskBundleTargetSelections(activeTestFiles, fileMetadata);\n if (isResumeAppend) {\n // Resume mode: write per-test artifacts for newly-run tests, then\n // aggregate the run from its full row manifest (old + new results with\n // deduplication).\n const { writePerTestArtifacts } = await import('./artifact-writer.js');\n await writePerTestArtifacts(allResults, runDir, {\n experiment: normalizeExperimentName(options.experiment),\n runId: path.basename(runDir),\n resultGroup: resultGroupName,\n cwd,\n repoRoot,\n sourceTests,\n taskBundleTargets,\n runtimeSource: runtimeSourceMetadata,\n tags: emittedTags,\n });\n const { summaryPath } = await aggregateRunDir(runDir, {\n evalFile,\n experiment: normalizeExperimentName(options.experiment),\n runId: path.basename(runDir),\n experimentMetadata: runExperimentMetadata,\n runtimeSource: runtimeSourceMetadata,\n tags: emittedTags,\n });\n const indexPath = resolveRunIndexPath(runDir);\n console.log(`Artifact bundle updated: ${runDir}`);\n console.log(` Run manifest: ${indexPath}`);\n console.log(` Per-test artifacts: ${runDir} (${allResults.length} new test directories)`);\n console.log(` Summary: ${summaryPath}`);\n } else {\n const { testArtifactDir, summaryPath, indexPath } = await writeArtifactsFromResults(\n allResults,\n runDir,\n {\n evalFile,\n experiment: normalizeExperimentName(options.experiment),\n runId: path.basename(runDir),\n experimentMetadata: runExperimentMetadata,\n resultGroup: resultGroupName,\n cwd,\n repoRoot,\n sourceTests,\n taskBundleTargets,\n runtimeSource: runtimeSourceMetadata,\n tags: emittedTags,\n },\n );\n console.log(`Artifact bundle written to: ${runDir}`);\n console.log(` Run manifest: ${indexPath}`);\n console.log(\n ` Per-test artifacts: ${testArtifactDir} (${allResults.length} test directories)`,\n );\n console.log(` Summary: ${summaryPath}`);\n }\n }\n\n // Print workspace paths summary\n const resultsWithWorkspaces = allResults.filter((r) => r.workspacePath);\n const preservedWorkspaces = options.keepWorkspaces\n ? resultsWithWorkspaces\n : resultsWithWorkspaces.filter((r) => r.error || r.score < 0.5);\n\n if (preservedWorkspaces.length > 0) {\n console.log('\\nPreserved workspaces:');\n for (const result of preservedWorkspaces) {\n console.log(` ${result.testId} -> ${result.workspacePath}`);\n }\n }\n\n // Hint about --keep-workspaces when workspaces were used but some cleaned up\n const usedWorkspaces = resultsWithWorkspaces.length > 0;\n if (!options.keepWorkspaces && usedWorkspaces) {\n console.log('Use --keep-workspaces to preserve all workspaces for inspection.');\n }\n\n if (allResults.length > 0) {\n const writtenIndexes = outputWriter.indexPaths();\n outputPath = writtenIndexes[0] ?? outputPath;\n console.log(`\\nResults written to: ${outputPath}`);\n console.log(`\\nResults written under: ${runDir}`);\n for (const indexPath of writtenIndexes) {\n console.log(` ${indexPath}`);\n }\n\n // Persist last run path for `agentv results` commands\n await saveRunCache(cwd, runDir).catch(() => undefined);\n\n finalExportStatus = await maybeAutoExportRunArtifacts({\n cwd,\n run_dir: runDir,\n test_files: activeTestFiles,\n results: allResults,\n eval_summaries: remoteEvalSummaries.map((summary) => ({\n eval_file: summary.evalFile,\n total: summary.results.length,\n passed: summary.results.filter((result) => result.score >= DEFAULT_THRESHOLD).length,\n avg_score:\n summary.results.length > 0\n ? summary.results.reduce((sum, result) => sum + result.score, 0) /\n summary.results.length\n : 0,\n results: summary.results.map((result) => ({\n test_id: result.testId,\n score: result.score,\n status:\n result.executionStatus === 'execution_error' || result.error\n ? 'ERROR'\n : result.score >= DEFAULT_THRESHOLD\n ? 'PASS'\n : 'FAIL',\n })),\n })),\n experiment: normalizeExperimentName(options.experiment),\n results_overrides: options.resultsOverrides,\n });\n }\n\n // Suggest resume commands when execution errors are detected\n if (summary.executionErrorCount > 0 && !options.retryErrors && !options.resume) {\n const evalFileArgs = activeTestFiles.map((f) => path.relative(cwd, f)).join(' ');\n const targetFlag = options.target ? ` --target ${options.target}` : '';\n const relativeRunDir = path.relative(cwd, runDir);\n console.log(\n `\\nTip: ${summary.executionErrorCount} execution error(s) detected. Re-run failed tests with:\\n` +\n ` agentv eval run ${evalFileArgs}${targetFlag} --rerun-failed ${relativeRunDir}`,\n );\n }\n\n // Print run-level budget summary when exceeded\n const runBudgetExceeded = runBudgetTracker?.isExceeded() ?? false;\n if (runBudgetExceeded) {\n console.log(\n `\\n⚠ Run budget exceeded: $${runBudgetTracker?.currentCostUsd.toFixed(4)} spent of $${runBudgetTracker?.budgetCapUsd.toFixed(4)} cap`,\n );\n }\n\n // WIP cleanup on success: remove the WIP branch only after the final\n // results branch is confirmed published (or confirmed already up to date).\n // If export failed, leave the remote WIP checkpoint as the durable copy.\n if (\n wipLoop &&\n (finalExportStatus === 'published' || finalExportStatus === 'already_published')\n ) {\n wipCleanedUp = true;\n await wipLoop.stopAndDeleteWipBranch();\n }\n\n return {\n executionErrorCount: summary.executionErrorCount,\n outputPath,\n testFiles: activeTestFiles,\n target: options.target,\n thresholdFailed,\n allExecutionErrors,\n budgetExceeded: runBudgetExceeded || undefined,\n };\n } finally {\n // WIP cleanup on failure/interrupt: stop the loop but leave the remote\n // WIP branch intact for manual recovery.\n if (wipLoop && !wipCleanedUp) {\n await wipLoop.stop().catch(() => undefined);\n }\n unsubscribeCodexLogs();\n unsubscribePiLogs();\n unsubscribeCopilotSdkLogs();\n unsubscribeCopilotCliLogs();\n await outputWriter.close().catch(() => undefined);\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","/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\n\t\t// Clean up tail reference when queue becomes empty\n\t\tif (!this.#head) {\n\t\t\tthis.#tail = undefined;\n\t\t}\n\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n\n\t* drain() {\n\t\twhile (this.#head) {\n\t\t\tyield this.dequeue();\n\t\t}\n\t}\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tvalidateConcurrency(concurrency);\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t\t// Since `pendingCount` has been decreased by one, increase `activeCount` by one.\n\t\t\tactiveCount++;\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\t// Queue `internalResolve` instead of the `run` function\n\t\t// to preserve asynchronous context.\n\t\tnew Promise(internalResolve => {\n\t\t\tqueue.enqueue(internalResolve);\n\t\t}).then(\n\t\t\trun.bind(undefined, function_, resolve, arguments_),\n\t\t);\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// after the `internalResolve` function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency) {\n\t\t\t\tresumeNext();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise(resolve => {\n\t\tenqueue(function_, resolve, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t\tconcurrency: {\n\t\t\tget: () => concurrency,\n\n\t\t\tset(newConcurrency) {\n\t\t\t\tvalidateConcurrency(newConcurrency);\n\t\t\t\tconcurrency = newConcurrency;\n\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\twhile (activeCount < concurrency && queue.size > 0) {\n\t\t\t\t\t\tresumeNext();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nexport function limitFunction(function_, option) {\n\tconst {concurrency} = option;\n\tconst limit = pLimit(concurrency);\n\n\treturn (...arguments_) => limit(() => function_(...arguments_));\n}\n\nfunction validateConcurrency(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n}\n","import { coerce, 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 * Advisory version checks for project `required_version`.\n *\n * A mismatched installed version never prompts, self-updates, or exits by\n * default. Commands may print the returned warning to help users diagnose\n * failures, while explicit `--strict` callers can still opt into a hard gate.\n * Malformed ranges remain configuration errors.\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(coerce(currentVersion) ?? currentVersion, requiredVersion),\n currentVersion,\n requiredRange: requiredVersion,\n };\n}\n\nfunction formatVersionMismatch(result: VersionCheckResult): string {\n return `agentv ${result.currentVersion} does not satisfy this project's required_version ${result.requiredRange}`;\n}\n\nexport function formatRequiredVersionWarning(result: VersionCheckResult): string {\n return `${ANSI_YELLOW}Warning: ${formatVersionMismatch(result)}. Run \\`agentv self update\\`.${ANSI_RESET}`;\n}\n\nexport function formatRequiredVersionFailureNote(result: VersionCheckResult): string {\n return `note: ${formatVersionMismatch(result)} - this may be the cause. Run \\`agentv self update\\`.`;\n}\n\n/**\n * Run the version compatibility check.\n *\n * - If the version satisfies the range, returns the satisfied result silently.\n * - If the range is malformed, prints an error and exits with code 1.\n * - If the version is below the range, warns to stderr and continues.\n * - Strict mode remains an explicit opt-in hard failure.\n */\nexport function enforceRequiredVersion(\n requiredVersion: string,\n options?: { strict?: boolean },\n): VersionCheckResult {\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 result;\n }\n\n const warning = formatRequiredVersionWarning(result);\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 process.stderr.write(`${warning}\\n`);\n return result;\n}\n","import { existsSync } from 'node:fs';\nimport path from 'node:path';\n\nimport {\n DEFAULT_THRESHOLD,\n type EvaluationResult,\n type GitListedRun,\n type NormalizedResultsConfig,\n type ResultsConfig,\n type ResultsRepoStatus,\n type RuntimeResultsConfig,\n confirmResultsMergeAndPull,\n directPushResultsWithDetails,\n directorySizeBytes,\n getProject,\n getProjectForPath,\n getResultsRepoSyncStatus,\n listGitRunsCached,\n loadConfig,\n materializeGitRun,\n normalizeResultsConfig,\n resolveResultsConfigForProject,\n resolveResultsRepoRunsDir,\n syncResultsRepoForProject,\n} from '@agentv/core';\n\nimport { relativeRunPathFromCwd } from '../eval/result-layout.js';\nimport { findRepoRoot } from '../eval/shared.js';\nimport {\n type ResultFileMeta,\n listResultFiles,\n listResultFilesFromRunsDir,\n} from '../inspect/utils.js';\n\n// ── In-memory TTL cache for listGitRuns ────────────────────────────\n// Avoids repeated expensive git ls-tree + git cat-file --batch operations\n// on every API request. Cache key is repoDir + ref, TTL is 60 seconds.\nconst gitRunsCache = new Map<string, { data: Promise<GitListedRun[]>; expiresAt: number }>();\nconst GIT_RUNS_CACHE_TTL_MS = 60_000;\n\nfunction getResultsStorageRef(config: NormalizedResultsConfig): string | undefined {\n if (!config.branch) {\n return undefined;\n }\n return config.storageBranchWorktree\n ? `refs/remotes/${config.remote}/${config.branch}`\n : config.branch;\n}\n\nfunction cachedListGitRuns(repoDir: string, ref?: string) {\n const now = Date.now();\n const cacheKey = `${repoDir}\\0${ref ?? ''}`;\n const cached = gitRunsCache.get(cacheKey);\n if (cached && cached.expiresAt > now) {\n return cached.data;\n }\n const promise = ref ? listGitRunsCached(repoDir, ref) : listGitRunsCached(repoDir);\n gitRunsCache.set(cacheKey, { data: promise, expiresAt: now + GIT_RUNS_CACHE_TTL_MS });\n // Evict stale entry once the promise settles so a fresh fetch replaces it\n promise\n .catch(() => {})\n .finally(() => {\n const entry = gitRunsCache.get(cacheKey);\n if (entry && entry.expiresAt <= Date.now()) {\n gitRunsCache.delete(cacheKey);\n }\n });\n return promise;\n}\n\nfunction invalidateGitRunsCache(repoDir: string): void {\n for (const key of gitRunsCache.keys()) {\n if (key.startsWith(`${repoDir}\\0`)) {\n gitRunsCache.delete(key);\n }\n }\n}\n\nexport type RunSource = 'local' | 'remote';\n\nexport interface SourcedResultFileMeta extends ResultFileMeta {\n readonly source: RunSource;\n readonly raw_filename: string;\n readonly experiment?: string;\n readonly target?: string;\n readonly summaryPath?: string;\n readonly executionErrorCount?: number;\n /**\n * True when this run is present on the configured remote results branch.\n * A run synced to the remote keeps `source: 'local'` (the local copy is\n * preferred for reads) but still records `on_remote: true`, so the Dashboard\n * can show a per-run \"on remote\" indicator instead of an exclusive\n * local/remote filter. This is the flag the run-count summary derives from.\n */\n readonly on_remote: boolean;\n}\n\nexport interface RemoteEvalSummary {\n readonly eval_file: string;\n readonly total: number;\n readonly passed: number;\n readonly avg_score: number;\n readonly results: Array<{\n readonly test_id: string;\n readonly score: number;\n readonly status: 'PASS' | 'FAIL' | 'ERROR';\n }>;\n}\n\nexport interface RemoteExportPayload {\n readonly cwd: string;\n readonly run_dir: string;\n readonly test_files: readonly string[];\n readonly results: readonly EvaluationResult[];\n readonly eval_summaries: readonly RemoteEvalSummary[];\n readonly experiment?: string;\n readonly results_overrides?: ResultsPublishOverrides;\n}\n\nexport type RemoteExportStatus = 'disabled' | 'published' | 'already_published' | 'failed';\n\nexport interface RemoteResultsStatus extends ResultsRepoStatus {\n readonly run_count: number;\n}\n\nexport interface ResultsPublishOverrides {\n readonly repo?: string;\n readonly repo_path?: string;\n readonly branch?: string;\n readonly remote?: string;\n readonly auto_push?: boolean;\n readonly require_push?: boolean;\n}\n\nconst REMOTE_RUN_PREFIX = 'remote::';\nconst SIZE_WARNING_BYTES = 10 * 1024 * 1024;\n\nfunction getStatusMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction statusForResult(result: EvaluationResult): 'PASS' | 'FAIL' | 'ERROR' {\n if (result.executionStatus === 'execution_error' || result.error) {\n return 'ERROR';\n }\n return result.score >= DEFAULT_THRESHOLD ? 'PASS' : 'FAIL';\n}\n\nexport function getRelativeRunPath(cwd: string, runDir: string): string {\n const relative = relativeRunPathFromCwd(cwd, runDir);\n if (relative) {\n return relative;\n }\n\n throw new Error(`Run workspace must use .agentv/results/<run_id>: ${path.resolve(runDir)}`);\n}\n\nfunction buildCommitTitle(payload: RemoteExportPayload): string {\n const passed = payload.results.filter((result) => result.score >= DEFAULT_THRESHOLD).length;\n const avgScore =\n payload.results.length > 0\n ? payload.results.reduce((sum, result) => sum + result.score, 0) / payload.results.length\n : 0;\n const experiment = payload.experiment ?? 'default';\n return `feat(results): ${experiment} - ${passed}/${payload.results.length} PASS (${avgScore.toFixed(3)})`;\n}\n\nasync function maybeWarnLargeArtifact(runDir: string): Promise<void> {\n const sizeBytes = await directorySizeBytes(runDir);\n if (sizeBytes > SIZE_WARNING_BYTES) {\n console.warn(\n `Warning: run artifacts total ${(sizeBytes / (1024 * 1024)).toFixed(1)}MB. Export will continue.`,\n );\n }\n}\n\nexport async function loadNormalizedResultsConfig(\n cwd: string,\n projectId?: string,\n overrides?: ResultsPublishOverrides,\n): Promise<NormalizedResultsConfig | undefined> {\n const repoRoot = (await findRepoRoot(cwd)) ?? cwd;\n const config = await loadConfig(path.join(cwd, '_'), repoRoot);\n const project =\n projectId !== undefined\n ? getProject(projectId)\n : (getProjectForPath(repoRoot) ?? getProjectForPath(cwd));\n const projectResults = project?.results\n ? ({\n ...(project.results.repo !== undefined && { repo: project.results.repo }),\n ...(project.results.path !== undefined && { path: project.results.path }),\n ...(project.results.branch !== undefined && { branch: project.results.branch }),\n ...(project.results.autoPush !== undefined && { auto_push: project.results.autoPush }),\n } satisfies ResultsConfig)\n : undefined;\n const resultsConfig = projectResults ?? resolveResultsConfigForProject(config, project?.id);\n if (!resultsConfig && !overrides) {\n return undefined;\n }\n const baseConfig = resultsConfig\n ? normalizeResultsConfig(resultsConfig, { baseDir: project?.path ?? repoRoot })\n : undefined;\n const repoOverride = overrides?.repo ?? overrides?.repo_path;\n if (!baseConfig && !repoOverride) {\n return undefined;\n }\n if (!overrides) {\n return baseConfig;\n }\n\n const merged: RuntimeResultsConfig = {\n mode: 'github',\n ...(overrides.repo !== undefined\n ? { repo: overrides.repo }\n : overrides.repo_path !== undefined\n ? { repo_path: overrides.repo_path }\n : baseConfig?.repo_path\n ? { repo_path: baseConfig.repo_path }\n : baseConfig?.repo_url\n ? { repo_url: baseConfig.repo_url }\n : baseConfig?.repo\n ? { repo: baseConfig.repo }\n : {}),\n ...(overrides.branch !== undefined\n ? { branch: overrides.branch }\n : baseConfig?.branch\n ? { branch: baseConfig.branch }\n : {}),\n ...(overrides.remote !== undefined\n ? { remote: overrides.remote }\n : baseConfig?.remote\n ? { remote: baseConfig.remote }\n : {}),\n ...(repoOverride === undefined && baseConfig?.repo_path === undefined && baseConfig?.path\n ? { path: baseConfig.path }\n : {}),\n ...((overrides.auto_push ?? baseConfig?.auto_push) !== undefined && {\n auto_push: overrides.auto_push ?? baseConfig?.auto_push,\n }),\n ...((overrides.require_push ?? baseConfig?.require_push) !== undefined && {\n require_push: overrides.require_push ?? baseConfig?.require_push,\n }),\n };\n\n return normalizeResultsConfig(merged, { baseDir: project?.path ?? repoRoot });\n}\n\nexport function encodeRemoteRunId(filename: string): string {\n return `${REMOTE_RUN_PREFIX}${filename}`;\n}\n\nexport function isRemoteRunId(filename: string): boolean {\n return filename.startsWith(REMOTE_RUN_PREFIX);\n}\n\nexport function decodeRemoteRunId(filename: string): string {\n return filename.replace(REMOTE_RUN_PREFIX, '');\n}\n\nexport async function getRemoteResultsStatus(\n cwd: string,\n projectId?: string,\n): Promise<RemoteResultsStatus> {\n const config = await loadNormalizedResultsConfig(cwd, projectId);\n const status = await getResultsRepoSyncStatus(config);\n const runCount = await getRemoteRunCount(config, status);\n return {\n ...status,\n run_count: runCount,\n };\n}\n\nasync function getRemoteRunCount(\n config: NormalizedResultsConfig | undefined,\n status: ResultsRepoStatus,\n): Promise<number> {\n let runCount = 0;\n if (config && status.available) {\n try {\n runCount = (await cachedListGitRuns(config.path, getResultsStorageRef(config))).length;\n } catch {\n if (!config.branch) {\n runCount = listResultFilesFromRunsDir(resolveResultsRepoRunsDir(config)).length;\n }\n }\n }\n return runCount;\n}\n\nexport async function syncRemoteResults(\n cwd: string,\n projectId?: string,\n): Promise<RemoteResultsStatus> {\n const config = await loadNormalizedResultsConfig(cwd, projectId);\n if (!config) {\n return {\n ...(await getResultsRepoSyncStatus()),\n run_count: 0,\n };\n }\n\n try {\n const status = await syncResultsRepoForProject(config);\n invalidateGitRunsCache(config.path);\n return {\n ...status,\n run_count: await getRemoteRunCount(config, status),\n };\n } catch (error) {\n const status = await getResultsRepoSyncStatus(config);\n return {\n ...status,\n run_count: await getRemoteRunCount(config, status),\n last_error: getStatusMessage(error),\n blocked: true,\n block_reason: getStatusMessage(error),\n };\n }\n}\n\n/**\n * The Layer 2 \"OK\" action: the user has merged the pending temp branch into the\n * target on GitHub. Pull the merged target into the local results checkout and\n * resume normal sync. Mirrors {@link syncRemoteResults}'s config-load and\n * error-wrap behavior.\n */\nexport async function confirmRemoteResultsMerge(\n cwd: string,\n projectId?: string,\n): Promise<RemoteResultsStatus> {\n const config = await loadNormalizedResultsConfig(cwd, projectId);\n if (!config) {\n return {\n ...(await getResultsRepoSyncStatus()),\n run_count: 0,\n };\n }\n\n try {\n const status = await confirmResultsMergeAndPull(config);\n invalidateGitRunsCache(config.path);\n return {\n ...status,\n run_count: await getRemoteRunCount(config, status),\n };\n } catch (error) {\n const status = await getResultsRepoSyncStatus(config);\n return {\n ...status,\n run_count: await getRemoteRunCount(config, status),\n last_error: getStatusMessage(error),\n blocked: true,\n block_reason: getStatusMessage(error),\n };\n }\n}\n\nfunction dedupeSyncedRunCopies(runs: SourcedResultFileMeta[]): SourcedResultFileMeta[] {\n const byRunId = new Map<string, SourcedResultFileMeta>();\n\n for (const run of runs) {\n const existing = byRunId.get(run.raw_filename);\n if (!existing) {\n byRunId.set(run.raw_filename, run);\n continue;\n }\n // A run can appear once locally and once on the remote branch. Keep the\n // local copy (it is materialized on disk and readable), but remember that\n // the run is also present remotely so the per-run \"on remote\" indicator\n // and the summary count stay accurate for synced runs.\n const preferred = existing.source === 'remote' && run.source === 'local' ? run : existing;\n byRunId.set(run.raw_filename, {\n ...preferred,\n on_remote: existing.on_remote || run.on_remote,\n });\n }\n\n return [...byRunId.values()];\n}\n\nexport async function listMergedResultFiles(\n cwd: string,\n limit?: number,\n projectId?: string,\n): Promise<{ runs: SourcedResultFileMeta[]; remote_status: RemoteResultsStatus }> {\n const localRuns = listResultFiles(cwd).map(\n (meta) =>\n ({\n ...meta,\n source: 'local' as const,\n raw_filename: meta.filename,\n on_remote: false,\n }) satisfies SourcedResultFileMeta,\n );\n\n const remoteStatus = await getRemoteResultsStatus(cwd, projectId);\n const config = await loadNormalizedResultsConfig(cwd, projectId);\n if (!config || !remoteStatus.available) {\n return {\n runs: limit !== undefined && limit > 0 ? localRuns.slice(0, limit) : localRuns,\n remote_status: remoteStatus,\n };\n }\n\n let remoteRuns: SourcedResultFileMeta[] = [];\n if (config.mode === 'github') {\n try {\n const gitRuns = await cachedListGitRuns(config.path, getResultsStorageRef(config));\n remoteRuns = gitRuns.map((r) => ({\n filename: encodeRemoteRunId(r.run_id),\n raw_filename: r.run_id,\n source: 'remote' as const,\n on_remote: true,\n path: path.join(\n config.path,\n r.index_path ?? (r as { manifest_path?: string }).manifest_path ?? '',\n ),\n ...(r.summary_path && { summaryPath: path.join(config.path, r.summary_path) }),\n experiment: r.experiment,\n ...(r.target && { target: r.target }),\n displayName: r.display_name,\n timestamp: r.timestamp,\n testCount: r.test_count,\n ...(r.execution_error_count !== undefined && {\n executionErrorCount: r.execution_error_count,\n }),\n passRate: r.pass_rate || 0,\n avgScore: r.avg_score || 0,\n sizeBytes: r.size_bytes || 0,\n }));\n } catch (error) {\n if (config.branch) {\n console.error('git-native listing failed for configured results branch', error);\n } else {\n console.error('git-native listing failed, falling back', error);\n remoteRuns = listResultFilesFromRunsDir(resolveResultsRepoRunsDir(config)).map(\n (meta) =>\n ({\n ...meta,\n filename: encodeRemoteRunId(meta.filename),\n raw_filename: meta.filename,\n source: 'remote' as const,\n on_remote: true,\n }) satisfies SourcedResultFileMeta,\n );\n }\n }\n } else {\n remoteRuns = listResultFilesFromRunsDir(resolveResultsRepoRunsDir(config)).map(\n (meta) =>\n ({\n ...meta,\n filename: encodeRemoteRunId(meta.filename),\n raw_filename: meta.filename,\n source: 'remote' as const,\n on_remote: true,\n }) satisfies SourcedResultFileMeta,\n );\n }\n\n const merged = dedupeSyncedRunCopies([...localRuns, ...remoteRuns]).sort((a, b) =>\n b.timestamp.localeCompare(a.timestamp),\n );\n return {\n runs: limit !== undefined && limit > 0 ? merged.slice(0, limit) : merged,\n remote_status: remoteStatus,\n };\n}\n\nexport async function findRunById(\n cwd: string,\n runId: string,\n projectId?: string,\n): Promise<SourcedResultFileMeta | undefined> {\n const { runs } = await listMergedResultFiles(cwd, undefined, projectId);\n return runs.find((run) => run.filename === runId);\n}\n\nexport async function ensureRemoteRunAvailable(\n cwd: string,\n meta: Pick<SourcedResultFileMeta, 'source' | 'path'>,\n projectId?: string,\n): Promise<void> {\n if (meta.source !== 'remote' || existsSync(meta.path)) {\n return;\n }\n\n const config = await loadNormalizedResultsConfig(cwd, projectId);\n if (!config) {\n throw new Error('Remote results are not configured');\n }\n\n const relativeManifestPath = path.relative(config.path, meta.path).split(path.sep).join('/');\n if (\n relativeManifestPath.length === 0 ||\n relativeManifestPath === meta.path ||\n relativeManifestPath.startsWith('../')\n ) {\n throw new Error(`Remote manifest path is outside the results repo clone: ${meta.path}`);\n }\n\n const relativeRunPath = relativeRunPathFromManifestPath(relativeManifestPath);\n await materializeGitRun(config.path, relativeRunPath, getResultsStorageRef(config));\n}\n\nfunction relativeRunPathFromManifestPath(relativeManifestPath: string): string {\n const manifestDir = path.posix.dirname(relativeManifestPath);\n return path.posix.basename(manifestDir) === '.internal'\n ? path.posix.dirname(manifestDir)\n : manifestDir;\n}\n\nexport async function maybeAutoExportRunArtifacts(\n payload: RemoteExportPayload,\n): Promise<RemoteExportStatus> {\n const config = await loadNormalizedResultsConfig(\n payload.cwd,\n undefined,\n payload.results_overrides,\n );\n if (!config) {\n return 'disabled';\n }\n\n try {\n await maybeWarnLargeArtifact(payload.run_dir);\n\n const relativeRunPath = getRelativeRunPath(payload.cwd, payload.run_dir);\n const commitTitle = buildCommitTitle(payload);\n\n const pushResult = await directPushResultsWithDetails({\n config,\n sourceDir: payload.run_dir,\n destinationPath: relativeRunPath,\n commitMessage: commitTitle,\n });\n\n if (pushResult.blocked) {\n if (config.require_push) {\n throw new Error(pushResult.block_reason ?? 'Results branch push conflict');\n }\n console.warn(`Warning: skipping results export: ${pushResult.block_reason}`);\n return 'failed';\n }\n\n if (!pushResult.changed) {\n console.warn('Warning: results export produced no git changes.');\n return 'already_published';\n }\n\n const pushLabel = config.auto_push || config.require_push ? 'pushed' : 'published locally';\n console.log(\n `Results ${pushLabel} to ${config.repo} (${config.branch ?? 'default branch'}:${relativeRunPath})`,\n );\n if (pushResult.backup_ref) {\n console.log(\n `Backed up previous remote ${pushResult.target_branch ?? config.branch ?? 'results branch'} at ${pushResult.backup_ref}`,\n );\n }\n return 'published';\n } catch (error) {\n if (config.require_push) {\n throw error;\n }\n console.warn(`Warning: skipping results export: ${getStatusMessage(error)}`);\n console.warn(\"Warning: Run 'gh auth login' if GitHub authentication is missing.\");\n return 'failed';\n }\n}\n","import { readFileSync, readdirSync, statSync } from 'node:fs';\nimport path from 'node:path';\nimport type { EvaluationResult, TraceSummary } from '@agentv/core';\nimport { DEFAULT_THRESHOLD, toCamelCaseDeep, toSnakeCaseDeep } from '@agentv/core';\nimport {\n buildResultsRootDir,\n isReservedResultsNamespace,\n isRunManifestPath,\n resolveExistingRunPrimaryPath,\n resolveWorkspaceOrFilePath,\n} from '../eval/result-layout.js';\nimport { loadLightweightResults, loadManifestResults } from '../results/manifest.js';\nimport { ResultRowSchemaError, normalizeResultRow } from '../results/result-row-schema.js';\n\n// ANSI color codes (no dependency needed)\nconst colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n green: '\\x1b[32m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m',\n gray: '\\x1b[90m',\n};\n\nconst noColor = process.env.NO_COLOR !== undefined || !process.stdout.isTTY;\nexport const c = noColor\n ? (Object.fromEntries(Object.keys(colors).map((k) => [k, ''])) as typeof colors)\n : colors;\n\n// Regex to strip ANSI escape codes\nconst ansiPattern = new RegExp(`${String.fromCharCode(27)}\\\\[[0-9;]*m`, 'g');\n\nexport function stripAnsi(str: string): string {\n return str.replace(ansiPattern, '');\n}\n\nexport function padRight(str: string, len: number): string {\n const plainLen = stripAnsi(str).length;\n return str + ' '.repeat(Math.max(0, len - plainLen));\n}\n\nexport function padLeft(str: string, len: number): string {\n const plainLen = stripAnsi(str).length;\n return ' '.repeat(Math.max(0, len - plainLen)) + str;\n}\n\n/**\n * A raw JSONL result record with snake_case keys as stored on disk.\n */\nexport interface RawResult {\n timestamp?: string;\n test_id?: string;\n eval_id?: string;\n suite?: string;\n conversation_id?: string;\n score: number;\n assertions?: { text: string; passed: boolean; evidence?: string }[];\n target?: string;\n error?: string;\n scores?: RawEvaluatorScore[];\n trace?: RawTraceSummary;\n // Promoted execution metrics (snake_case from JSONL)\n token_usage?: { input: number; output: number; cached?: number };\n cost_usd?: number;\n duration_ms?: number;\n start_time?: string;\n end_time?: string;\n input?: unknown;\n output?: unknown;\n spans?: RawTraceSpan[];\n trials?: unknown[];\n aggregation?: unknown;\n file_changes?: string;\n}\n\nexport interface RawEvaluatorScore {\n name: string;\n type: string;\n score: number;\n assertions?: { text: string; passed: boolean; evidence?: string }[];\n weight?: number;\n}\n\nexport interface RawTraceSummary {\n event_count?: number;\n tool_calls?: Record<string, number>;\n error_count?: number;\n tool_durations?: Record<string, number[]>;\n llm_call_count?: number;\n // Execution metrics (present when trace includes provider metrics)\n token_usage?: { input: number; output: number; cached?: number };\n cost_usd?: number;\n duration_ms?: number;\n}\n\nexport interface RawTraceSpan {\n type?: 'tool' | 'llm' | string;\n name: string;\n duration_ms?: number;\n}\n\n/**\n * Load all result or trace records from a supported source.\n *\n * Supported sources:\n * - Run workspace directories / run manifests\n * - Standalone trace JSONL files for trace-only workflows\n * - External OTLP JSON trace files\n */\nexport function loadResultFile(filePath: string): RawResult[] {\n const resolvedFilePath = resolveTraceResultPath(filePath);\n\n if (path.extname(resolvedFilePath) === '.json') {\n return loadOtlpTraceFile(resolvedFilePath);\n }\n\n if (isRunManifestPath(resolvedFilePath)) {\n return loadManifestAsRawResults(resolvedFilePath);\n }\n\n return loadJsonlRecords(resolvedFilePath);\n}\n\nfunction resolveTraceResultPath(filePath: string): string {\n return resolveWorkspaceOrFilePath(filePath);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction shouldUseTraceScoreError(value: unknown): boolean {\n if (!isRecord(value)) {\n return false;\n }\n\n return (\n typeof value.test_id === 'string' ||\n typeof value.testId === 'string' ||\n Object.hasOwn(value, 'score') ||\n Object.hasOwn(value, 'trace') ||\n Object.hasOwn(value, 'spans')\n );\n}\n\nfunction loadJsonlRecords(filePath: string): RawResult[] {\n const content = readFileSync(filePath, 'utf8');\n const lines = content\n .trim()\n .split('\\n')\n .filter((line) => line.trim());\n\n return lines.map((line, i) => {\n const parsed = JSON.parse(line) as unknown;\n try {\n return normalizeResultRow(parsed, {\n lineNumber: i + 1,\n sourceLabel: filePath,\n }) as unknown as RawResult;\n } catch (error) {\n if (error instanceof ResultRowSchemaError && shouldUseTraceScoreError(parsed)) {\n throw new Error(\n `Missing or invalid score in result at line ${i + 1}: ${line.slice(0, 100)}`,\n );\n }\n throw error;\n }\n });\n}\n\nfunction loadManifestAsRawResults(filePath: string): RawResult[] {\n return loadManifestResults(filePath).map(toRawResult);\n}\n\nfunction toRawResult(result: EvaluationResult): RawResult {\n return {\n timestamp: result.timestamp,\n test_id: result.testId,\n suite: result.suite,\n conversation_id: result.conversationId,\n score: result.score,\n assertions: result.assertions?.map((assertion) => ({\n text: assertion.text,\n passed: assertion.passed,\n evidence: assertion.evidence,\n })),\n target: result.target,\n error: result.error,\n scores: result.scores?.map((score) => ({\n name: score.name,\n type: score.type,\n score: score.score,\n assertions: score.assertions?.map((assertion) => ({\n text: assertion.text,\n passed: assertion.passed,\n evidence: assertion.evidence,\n })),\n weight: score.weight,\n })),\n token_usage: result.tokenUsage\n ? {\n input: result.tokenUsage.input,\n output: result.tokenUsage.output,\n cached: result.tokenUsage.cached,\n }\n : undefined,\n cost_usd: result.costUsd,\n duration_ms: result.durationMs,\n start_time: result.startTime,\n end_time: result.endTime,\n input: result.input,\n output: result.output,\n trace: toSnakeCaseDeep(result.trace) as RawTraceSummary,\n file_changes: result.fileChanges,\n };\n}\n\ntype OtlpAttributeValue =\n | { stringValue?: string; intValue?: number | string; doubleValue?: number; boolValue?: boolean }\n | { arrayValue?: { values?: OtlpAttributeValue[] } };\n\ninterface OtlpAttribute {\n key: string;\n value: OtlpAttributeValue;\n}\n\ninterface OtlpEvent {\n name?: string;\n attributes?: OtlpAttribute[];\n}\n\ninterface OtlpSpan {\n traceId?: string;\n spanId?: string;\n parentSpanId?: string;\n name?: string;\n startTimeUnixNano?: string;\n endTimeUnixNano?: string;\n attributes?: OtlpAttribute[];\n status?: { code?: number; message?: string };\n events?: OtlpEvent[];\n}\n\nfunction loadOtlpTraceFile(filePath: string): RawResult[] {\n const parsed = JSON.parse(readFileSync(filePath, 'utf8')) as {\n resourceSpans?: { scopeSpans?: { spans?: OtlpSpan[] }[] }[];\n };\n\n const spans = parsed.resourceSpans\n ?.flatMap((resource) => resource.scopeSpans ?? [])\n .flatMap((scope) => scope.spans ?? []);\n\n if (!spans || spans.length === 0) {\n return [];\n }\n\n const spanMap = new Map<string, OtlpSpan>();\n const childMap = new Map<string, OtlpSpan[]>();\n\n for (const span of spans) {\n if (!span.spanId) continue;\n spanMap.set(span.spanId, span);\n if (span.parentSpanId) {\n const siblings = childMap.get(span.parentSpanId) ?? [];\n siblings.push(span);\n childMap.set(span.parentSpanId, siblings);\n }\n }\n\n const roots = spans.filter((span) => !span.parentSpanId || !spanMap.has(span.parentSpanId));\n const supportedRoots = roots.filter(isAgentvEvalRoot);\n const candidateRoots = supportedRoots.length > 0 ? supportedRoots : roots;\n\n return candidateRoots.map((root, index) => {\n const descendants = collectChildSpans(root.spanId, childMap);\n const rootAttrs = parseOtlpAttributes(root.attributes);\n const parsedDescendants = descendants.map((span) => ({\n ...span,\n parsedAttributes: parseOtlpAttributes(span.attributes),\n }));\n const toolSpans = parsedDescendants.filter(\n (span) => typeof span.parsedAttributes.gen_ai_tool_name === 'string',\n );\n const llmSpans = parsedDescendants.filter(\n (span) =>\n span.parsedAttributes.gen_ai_operation_name === 'chat' ||\n (typeof span.name === 'string' && span.name.startsWith('chat ')),\n );\n const tokenUsage = descendants.reduce(\n (acc, span) => {\n const attrs = parseOtlpAttributes(span.attributes);\n acc.input += numberAttr(attrs.gen_ai_usage_input_tokens) ?? 0;\n acc.output += numberAttr(attrs.gen_ai_usage_output_tokens) ?? 0;\n const cached = numberAttr(attrs.gen_ai_usage_cache_read_input_tokens);\n if (cached !== undefined && cached > 0) {\n acc.cached = (acc.cached ?? 0) + cached;\n }\n return acc;\n },\n { input: 0, output: 0, cached: undefined as number | undefined },\n );\n\n const traceSummary = buildDerivedTraceSummary({\n trace: {\n event_count:\n numberAttr(rootAttrs.agentv_trace_event_count) ??\n (toolSpans.length > 0 ? toolSpans.length : undefined),\n tool_calls: countRawSpanNames(\n toolSpans.map((span) => ({\n type: 'tool',\n name: String(span.parsedAttributes.gen_ai_tool_name),\n })),\n ),\n error_count: descendants.filter((span) => span.status?.code === 2).length || undefined,\n llm_call_count:\n numberAttr(rootAttrs.agentv_trace_llm_call_count) ??\n (llmSpans.length > 0 ? llmSpans.length : undefined),\n },\n spans: [\n ...llmSpans.map((span) => ({\n type: 'llm' as const,\n name: span.name ?? 'chat',\n duration_ms: durationFromSpan(span),\n })),\n ...toolSpans.map((span) => ({\n type: 'tool' as const,\n name: String(span.parsedAttributes.gen_ai_tool_name),\n duration_ms: durationFromSpan(span),\n })),\n ],\n duration_ms: numberAttr(rootAttrs.agentv_trace_duration_ms) ?? durationFromSpan(root),\n cost_usd: numberAttr(rootAttrs.agentv_trace_cost_usd),\n token_usage:\n tokenUsage.input ||\n tokenUsage.output ||\n tokenUsage.cached ||\n numberAttr(rootAttrs.agentv_trace_token_input) ||\n numberAttr(rootAttrs.agentv_trace_token_output) ||\n numberAttr(rootAttrs.agentv_trace_token_cached)\n ? {\n input: tokenUsage.input || numberAttr(rootAttrs.agentv_trace_token_input) || 0,\n output: tokenUsage.output || numberAttr(rootAttrs.agentv_trace_token_output) || 0,\n ...(tokenUsage.cached || numberAttr(rootAttrs.agentv_trace_token_cached)\n ? {\n cached:\n tokenUsage.cached || numberAttr(rootAttrs.agentv_trace_token_cached) || 0,\n }\n : {}),\n }\n : undefined,\n });\n\n const score = numberAttr(rootAttrs.agentv_score);\n if (score === undefined) {\n throw new Error(\n `Unsupported OTLP trace root span at index ${index + 1}: missing agentv.score attribute`,\n );\n }\n\n return {\n test_id:\n stringAttr(rootAttrs.agentv_test_id) ??\n stringAttr(rootAttrs.agentv_eval_id) ??\n `trace-${index + 1}`,\n suite: stringAttr(rootAttrs.agentv_suite),\n target: stringAttr(rootAttrs.agentv_target),\n score,\n error: root.status?.code === 2 ? root.status.message : undefined,\n cost_usd: traceSummary?.cost_usd,\n duration_ms: traceSummary?.duration_ms,\n token_usage: traceSummary?.token_usage,\n trace: traceSummary\n ? {\n event_count: traceSummary.event_count,\n tool_calls: traceSummary.tool_calls,\n error_count: traceSummary.error_count,\n tool_durations: traceSummary.tool_durations,\n llm_call_count: traceSummary.llm_call_count,\n token_usage: traceSummary.token_usage,\n cost_usd: traceSummary.cost_usd,\n duration_ms: traceSummary.duration_ms,\n }\n : undefined,\n spans: traceSummary?.spans,\n output: stringAttr(rootAttrs.agentv_output_text),\n scores: root.events\n ?.filter(\n (event) =>\n event.name?.startsWith('agentv.grader.') || event.name?.startsWith('agentv.evaluator.'),\n )\n .map((event) => {\n const attrs = parseOtlpAttributes(event.attributes);\n const name =\n event.name?.replace(/^agentv\\.grader\\./, '').replace(/^agentv\\.evaluator\\./, '') ??\n 'unknown';\n return {\n name,\n type:\n stringAttr(attrs.agentv_grader_type) ??\n stringAttr(attrs.agentv_evaluator_type) ??\n 'unknown',\n score:\n numberAttr(attrs.agentv_grader_score) ??\n numberAttr(attrs.agentv_evaluator_score) ??\n 0,\n };\n }),\n } satisfies RawResult;\n });\n}\n\nfunction isAgentvEvalRoot(span: OtlpSpan): boolean {\n const attrs = parseOtlpAttributes(span.attributes);\n return (\n span.name === 'agentv.eval' ||\n numberAttr(attrs.agentv_score) !== undefined ||\n typeof stringAttr(attrs.agentv_test_id) === 'string'\n );\n}\n\nfunction collectChildSpans(\n spanId: string | undefined,\n childMap: Map<string, OtlpSpan[]>,\n): OtlpSpan[] {\n if (!spanId) return [];\n const direct = childMap.get(spanId) ?? [];\n const all = [...direct];\n for (const child of direct) {\n all.push(...collectChildSpans(child.spanId, childMap));\n }\n return all;\n}\n\nfunction parseOtlpAttributes(attributes: OtlpAttribute[] | undefined): Record<string, unknown> {\n const parsed: Record<string, unknown> = {};\n for (const attribute of attributes ?? []) {\n parsed[attribute.key.replace(/\\./g, '_')] = parseOtlpValue(attribute.value);\n }\n return parsed;\n}\n\nfunction parseOtlpValue(value: OtlpAttributeValue | undefined): unknown {\n if (!value) return undefined;\n if ('stringValue' in value && value.stringValue !== undefined) return value.stringValue;\n if ('intValue' in value && value.intValue !== undefined) return Number(value.intValue);\n if ('doubleValue' in value && value.doubleValue !== undefined) return value.doubleValue;\n if ('boolValue' in value && value.boolValue !== undefined) return value.boolValue;\n if ('arrayValue' in value)\n return (value.arrayValue?.values ?? []).map((entry) => parseOtlpValue(entry));\n return undefined;\n}\n\nfunction durationFromSpan(\n span: Pick<OtlpSpan, 'startTimeUnixNano' | 'endTimeUnixNano'>,\n): number | undefined {\n const start = Number(span.startTimeUnixNano);\n const end = Number(span.endTimeUnixNano);\n if (!Number.isFinite(start) || !Number.isFinite(end)) return undefined;\n return Math.round((end - start) / 1_000_000);\n}\n\nfunction stringAttr(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction numberAttr(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\ninterface DerivedTraceSummary extends RawTraceSummary {\n spans?: RawTraceSpan[];\n}\n\nexport function buildDerivedTraceSummary(result: {\n trace?: RawTraceSummary;\n spans?: RawTraceSpan[];\n token_usage?: RawResult['token_usage'];\n cost_usd?: number;\n duration_ms?: number;\n}): DerivedTraceSummary | undefined {\n const toolSpans = (result.spans ?? []).filter((span) => span.type === 'tool');\n const llmSpans = (result.spans ?? []).filter((span) => span.type === 'llm');\n const toolCalls = result.trace?.tool_calls ?? countRawSpanNames(toolSpans);\n const toolDurations = result.trace?.tool_durations ?? groupRawSpanDurations(toolSpans);\n const hasSpanData = (result.spans?.length ?? 0) > 0;\n const eventCount = result.trace?.event_count ?? (hasSpanData ? toolSpans.length : undefined);\n const llmCallCount = result.trace?.llm_call_count ?? (hasSpanData ? llmSpans.length : undefined);\n\n if (\n !result.trace &&\n !result.spans?.length &&\n result.token_usage === undefined &&\n result.cost_usd === undefined &&\n result.duration_ms === undefined\n ) {\n return undefined;\n }\n\n return {\n event_count: eventCount,\n tool_calls: toolCalls,\n error_count: result.trace?.error_count,\n tool_durations: toolDurations,\n llm_call_count: llmCallCount,\n token_usage: result.trace?.token_usage ?? result.token_usage,\n cost_usd: result.trace?.cost_usd ?? result.cost_usd,\n duration_ms: result.trace?.duration_ms ?? result.duration_ms,\n spans: result.spans,\n };\n}\n\nfunction countRawSpanNames(spans: RawTraceSpan[]): Record<string, number> | undefined {\n const counts: Record<string, number> = {};\n for (const span of spans) {\n counts[span.name] = (counts[span.name] ?? 0) + 1;\n }\n return Object.keys(counts).length > 0 ? counts : undefined;\n}\n\nfunction groupRawSpanDurations(spans: RawTraceSpan[]): Record<string, number[]> | undefined {\n const grouped: Record<string, number[]> = {};\n for (const span of spans) {\n if (span.duration_ms === undefined) continue;\n const existing = grouped[span.name] ?? [];\n existing.push(span.duration_ms);\n grouped[span.name] = existing;\n }\n return Object.keys(grouped).length > 0 ? grouped : undefined;\n}\n\nexport function getTraceSummary(result: RawResult): RawTraceSummary | undefined {\n const derived = buildDerivedTraceSummary(result);\n if (!derived) return undefined;\n const { spans: _spans, ...trace } = derived;\n return trace;\n}\n\nexport function getTraceSpans(result: RawResult): RawTraceSpan[] {\n return buildDerivedTraceSummary(result)?.spans ?? [];\n}\n\nexport function toTraceSummary(result: RawResult): TraceSummary | undefined {\n const rawTrace = getTraceSummary(result);\n if (!rawTrace) return undefined;\n return toCamelCaseDeep(rawTrace) as TraceSummary;\n}\n\n/**\n * Metadata about a discovered run manifest for listing.\n */\nexport interface ResultFileMeta {\n path: string;\n filename: string;\n displayName: string;\n timestamp: string;\n testCount: number;\n passRate: number;\n avgScore: number;\n sizeBytes: number;\n}\n\nfunction buildRunId(relativeRunPath: string): string {\n const normalized = relativeRunPath.split(path.sep).join('/');\n const segments = normalized.split('/').filter(Boolean);\n return segments[0] ?? normalized;\n}\n\nfunction readRunDisplayName(runDir: string): string | undefined {\n try {\n const summary = JSON.parse(readFileSync(path.join(runDir, 'summary.json'), 'utf8')) as {\n metadata?: { display_name?: unknown };\n };\n const displayName = summary.metadata?.display_name;\n return typeof displayName === 'string' && displayName.trim() ? displayName.trim() : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction collectRunManifestPaths(\n runsDir: string,\n currentDir: string,\n files: { filePath: string; displayName: string; runId: string; sortName: string }[],\n): void {\n const primaryPath = resolveExistingRunPrimaryPath(currentDir);\n if (primaryPath) {\n const relativeRunPath = path.relative(runsDir, currentDir);\n const sortName = path.basename(currentDir);\n files.push({\n filePath: primaryPath,\n displayName: readRunDisplayName(currentDir) ?? sortName,\n runId: buildRunId(relativeRunPath),\n sortName,\n });\n return;\n }\n}\n\nfunction listResultFilesFromRoot(\n runsDir: string,\n options?: { limit?: number; skipTopLevelDirs?: ReadonlySet<string> },\n): ResultFileMeta[] {\n const files: { filePath: string; displayName: string; runId: string; sortName: string }[] = [];\n\n try {\n const entries = readdirSync(runsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (options?.skipTopLevelDirs?.has(entry.name) || isReservedResultsNamespace(entry.name)) {\n continue;\n }\n collectRunManifestPaths(runsDir, path.join(runsDir, entry.name), files);\n }\n }\n } catch {\n // Results root doesn't exist yet\n }\n\n // Sort by run directory name descending (most recent first for timestamped runs).\n files.sort((a, b) => b.sortName.localeCompare(a.sortName));\n\n const limited =\n options?.limit !== undefined && options.limit > 0 ? files.slice(0, options.limit) : files;\n\n const metas: ResultFileMeta[] = [];\n\n for (const { filePath, displayName, runId } of limited) {\n try {\n const fileStat = statSync(filePath);\n const results = loadLightweightResults(filePath);\n\n const testCount = results.length;\n const passCount = results.filter((r) => r.score >= DEFAULT_THRESHOLD).length;\n const passRate = testCount > 0 ? passCount / testCount : 0;\n const avgScore = testCount > 0 ? results.reduce((sum, r) => sum + r.score, 0) / testCount : 0;\n\n const filenameTimestamp = extractTimestampFromFilename(displayName);\n const timestamp = filenameTimestamp ?? results[0]?.timestamp ?? 'unknown';\n\n metas.push({\n path: filePath,\n filename: runId,\n displayName,\n timestamp,\n testCount,\n passRate,\n avgScore,\n sizeBytes: fileStat.size,\n });\n } catch {\n // Skip unreadable files\n }\n }\n\n return metas;\n}\n\n/**\n * Enumerate canonical run manifests in `.agentv/results/`.\n *\n * Reserved local namespaces such as `.agentv/results/.indexes/`,\n * `.agentv/results/.cache/`, `.agentv/results/runs/`,\n * `.agentv/results/metadata/`, and `.agentv/results/export/` are intentionally\n * skipped by default discovery. Discovery only treats direct children of\n * `.agentv/results/` as committed run bundles.\n */\nexport function listResultFiles(cwd: string, limit?: number): ResultFileMeta[] {\n const metas = listResultFilesFromRoot(buildResultsRootDir(cwd), {\n skipTopLevelDirs: new Set(['export', 'metadata', 'runs', '.indexes', '.cache']),\n }).sort((a, b) => {\n const byTimestamp = b.timestamp.localeCompare(a.timestamp);\n return byTimestamp !== 0 ? byTimestamp : b.displayName.localeCompare(a.displayName);\n });\n return limit !== undefined && limit > 0 ? metas.slice(0, limit) : metas;\n}\n\nexport function listResultFilesFromRunsDir(runsDir: string, limit?: number): ResultFileMeta[] {\n return listResultFilesFromRoot(runsDir, {\n limit,\n skipTopLevelDirs: new Set(['export', 'metadata', 'runs', '.indexes', '.cache']),\n });\n}\n\n/**\n * Extract ISO timestamp from eval filename like eval_2026-02-20T21-38-05-833Z.jsonl\n */\nexport function extractTimestampFromFilename(filename: string): string | undefined {\n const match = filename.match(\n /(?:^|eval_)(\\d{4}-\\d{2}-\\d{2}T\\d{2}-\\d{2}-\\d{2}-\\d{3}Z)(?:\\.jsonl)?$/,\n );\n if (!match) return undefined;\n // Re-convert dashes back to colons/dots for display\n return match[1].replace(/-(\\d{2})-(\\d{2})-(\\d{3})Z$/, ':$1:$2.$3Z');\n}\n\n/**\n * Format a number with commas for display.\n */\nexport function formatNumber(n: number): string {\n return n.toLocaleString();\n}\n\n/**\n * Format duration in ms to human-readable.\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n const minutes = Math.floor(ms / 60000);\n const seconds = ((ms % 60000) / 1000).toFixed(0);\n return `${minutes}m${seconds}s`;\n}\n\n/**\n * Format cost in USD.\n */\nexport function formatCost(usd: number): string {\n if (usd < 0.01) return `$${usd.toFixed(4)}`;\n return `$${usd.toFixed(3)}`;\n}\n\n/**\n * Format file size for display.\n */\nexport function formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\n/**\n * Format a score as percentage.\n */\nexport function formatScore(score: number): string {\n return `${(score * 100).toFixed(0)}%`;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport {\n type EvaluationResult,\n type ExternalTraceMetadataWire,\n type MetricsArtifactWire,\n type ResultArtifactPointersWire,\n type RunRuntimeSourceMetadata,\n type TraceSummary,\n buildTraceFromMessages,\n fromTraceEnvelopeWire,\n normalizeMetricsArtifactWire,\n toCamelCaseDeep,\n traceEnvelopeToTraceSummary,\n traceEnvelopeToTranscriptMessages,\n} from '@agentv/core';\n\nimport type { GradingArtifact } from '../eval/artifact-writer.js';\nimport {\n isDirectoryPath,\n isRunManifestPath,\n resolveRunManifestPath,\n} from '../eval/result-layout.js';\nimport { normalizeResultRow } from './result-row-schema.js';\n\nexport interface ResultManifestRecord {\n readonly timestamp?: string;\n readonly test_id?: string;\n readonly suite?: string;\n readonly category?: string;\n readonly experiment?: string;\n /** promptfoo-shaped tag map (`Record<string,string>`), e.g. `{experiment, team, env}`. */\n readonly tags?: Record<string, string>;\n readonly target?: string;\n readonly variant?: string;\n readonly score: number;\n readonly scores?: readonly Record<string, unknown>[];\n readonly samples?: readonly {\n readonly sample?: number;\n readonly sample_index?: number;\n readonly sample_path?: string;\n readonly run_path?: string;\n readonly score?: number;\n readonly status?: string;\n readonly [key: string]: unknown;\n }[];\n /** Legacy pre-v5 repeat sample field accepted when reading older bundles. */\n readonly attempts?: readonly {\n readonly attempt?: number;\n readonly attempt_path?: string;\n readonly sample_path?: string;\n readonly run_path?: string;\n readonly score?: number;\n readonly verdict?: string;\n readonly [key: string]: unknown;\n }[];\n /** Legacy pre-v5 repeat sample field accepted when reading older bundles. */\n readonly trials?: readonly {\n readonly attempt?: number;\n readonly attempt_path?: string;\n readonly sample_path?: string;\n readonly run_path?: string;\n readonly score?: number;\n readonly verdict?: string;\n readonly [key: string]: unknown;\n }[];\n readonly aggregation?: Record<string, unknown>;\n readonly execution_status?: string;\n readonly error?: string;\n readonly cost_usd?: number;\n readonly duration_ms?: number;\n readonly token_usage?: {\n readonly input?: number;\n readonly output?: number;\n readonly reasoning?: number;\n };\n readonly trace?: Record<string, unknown>;\n readonly summary_path?: string;\n readonly grading_path?: string;\n readonly timing_path?: string;\n readonly input_path?: string;\n readonly output_path?: string;\n readonly answer_path?: string;\n readonly trace_path?: string;\n readonly transcript_path?: string;\n readonly transcript_raw_path?: string;\n readonly metrics_path?: string;\n readonly raw_provider_log_path?: string;\n readonly artifact_pointers?: ResultArtifactPointersWire;\n readonly runtime_source?: RunRuntimeSourceMetadata;\n readonly external_trace?: ExternalTraceMetadataWire;\n readonly response_path?: string;\n readonly result_dir?: string;\n readonly test_dir?: string;\n readonly task_dir?: string;\n readonly eval_path?: string;\n readonly targets_path?: string;\n readonly files_path?: string;\n readonly graders_path?: string;\n readonly metadata?: Record<string, unknown>;\n}\n\ninterface LegacyTimingArtifact {\n readonly duration_ms?: number;\n readonly token_usage?: {\n readonly input?: number;\n readonly output?: number;\n readonly reasoning?: number;\n };\n}\n\nfunction manifestBaseDir(indexPath: string): string {\n const dir = path.dirname(indexPath);\n return path.basename(dir) === '.internal' ? path.dirname(dir) : dir;\n}\n\nexport interface ManifestHydrationOptions {\n /**\n * Defaults to true for report/inspect consumers that need a trace projection.\n * Dashboard detail routes set this false so transcript bodies are loaded only\n * by the explicit transcript artifact endpoint.\n */\n readonly hydrateTranscriptTrace?: boolean;\n}\n\ntype HydratedScore = NonNullable<EvaluationResult['scores']>[number];\n\nfunction mapGradingAssertions(\n value: unknown,\n): NonNullable<EvaluationResult['assertions']> | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n return value.map((assertion) => {\n const record = assertion as Record<string, unknown>;\n return {\n text: String(record.text ?? ''),\n passed: Boolean(record.passed),\n evidence: typeof record.evidence === 'string' ? record.evidence : undefined,\n };\n });\n}\n\nfunction readGradingAssertionResults(\n record: Record<string, unknown>,\n): NonNullable<EvaluationResult['assertions']> | undefined {\n return mapGradingAssertions(\n Array.isArray(record.assertion_results) ? record.assertion_results : record.assertions,\n );\n}\n\nfunction readNestedGradingScores(record: Record<string, unknown>): unknown {\n if (Array.isArray(record.component_results)) {\n return record.component_results;\n }\n if (Array.isArray(record.scores)) {\n return record.scores;\n }\n if (Array.isArray(record.graders)) {\n return record.graders;\n }\n if (Array.isArray(record.evaluators)) {\n return record.evaluators;\n }\n return undefined;\n}\n\nfunction componentLabel(component: Record<string, unknown>): string {\n const assertion = component.assertion;\n if (assertion && typeof assertion === 'object' && !Array.isArray(assertion)) {\n const record = assertion as Record<string, unknown>;\n for (const key of ['value', 'name', 'id', 'type']) {\n const value = record[key];\n if (typeof value === 'string' && value.trim().length > 0) {\n return value;\n }\n }\n }\n return typeof component.reason === 'string' ? component.reason : 'grading component';\n}\n\nfunction mapComponentAssertion(\n component: Record<string, unknown>,\n): EvaluationResult['assertions'][number] {\n return {\n text: componentLabel(component),\n passed: component.pass === true,\n evidence: typeof component.reason === 'string' ? component.reason : undefined,\n };\n}\n\nfunction collectComponentAssertions(value: unknown): NonNullable<EvaluationResult['assertions']> {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((component) => {\n if (!component || typeof component !== 'object' || Array.isArray(component)) {\n return [];\n }\n const record = component as Record<string, unknown>;\n const nested = collectComponentAssertions(record.component_results);\n return nested.length > 0 ? nested : [mapComponentAssertion(record)];\n });\n}\n\nfunction mapGradingEvaluator(evaluator: Record<string, unknown>): HydratedScore {\n const pass =\n typeof evaluator.pass === 'boolean'\n ? evaluator.pass\n : evaluator.verdict === 'pass' ||\n (typeof evaluator.score === 'number' && evaluator.score >= 0.8);\n const verdict = pass ? ('pass' as const) : ('fail' as const);\n const details =\n evaluator.details && typeof evaluator.details === 'object' && !Array.isArray(evaluator.details)\n ? (evaluator.details as HydratedScore['details'])\n : undefined;\n const assertion =\n evaluator.assertion &&\n typeof evaluator.assertion === 'object' &&\n !Array.isArray(evaluator.assertion)\n ? (evaluator.assertion as Record<string, unknown>)\n : undefined;\n\n return {\n name: String(assertion?.name ?? assertion?.id ?? evaluator.name ?? componentLabel(evaluator)),\n type: String(assertion?.type ?? evaluator.type ?? 'llm-grader') as HydratedScore['type'],\n score: typeof evaluator.score === 'number' ? evaluator.score : 0,\n reason: typeof evaluator.reason === 'string' ? evaluator.reason : undefined,\n assertions: (() => {\n const nestedAssertions = collectComponentAssertions(evaluator.component_results);\n if (nestedAssertions.length > 0) {\n return nestedAssertions;\n }\n return readGradingAssertionResults(evaluator) ?? [mapComponentAssertion(evaluator)];\n })(),\n scores: mapGradingEvaluators(readNestedGradingScores(evaluator)),\n weight: typeof evaluator.weight === 'number' ? evaluator.weight : undefined,\n verdict,\n details,\n };\n}\n\nfunction mapGradingEvaluators(value: unknown): EvaluationResult['scores'] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n return value.map((evaluator) => mapGradingEvaluator(evaluator as Record<string, unknown>));\n}\n\nfunction parseResultRows(content: string, sourceLabel?: string): ResultManifestRecord[] {\n return content\n .split(/\\r?\\n/)\n .map((line, index) => ({ line: line.trim(), lineNumber: index + 1 }))\n .filter(({ line }) => line.length > 0)\n .map(\n ({ line, lineNumber }) =>\n normalizeResultRow(JSON.parse(line), {\n lineNumber,\n sourceLabel,\n }) as unknown as ResultManifestRecord,\n );\n}\n\nfunction parseMarkdownMessages(content: string): { role: string; content: string }[] {\n const trimmed = content.trim();\n if (!trimmed.startsWith('@[')) {\n return [];\n }\n\n const matches = [...trimmed.matchAll(/^@\\[(.+?)\\]:\\n([\\s\\S]*?)(?=^@\\[(.+?)\\]:\\n|\\s*$)/gm)];\n return matches.map((match) => ({\n role: match[1],\n content: match[2].trimEnd(),\n }));\n}\n\nfunction readOptionalText(baseDir: string, relativePath: string | undefined): string | undefined {\n if (!relativePath) {\n return undefined;\n }\n\n const absolutePath = path.join(baseDir, relativePath);\n if (!existsSync(absolutePath)) {\n return undefined;\n }\n\n return readFileSync(absolutePath, 'utf8');\n}\n\nfunction readOptionalJson<T>(baseDir: string, relativePath: string | undefined): T | undefined {\n const text = readOptionalText(baseDir, relativePath);\n if (!text) {\n return undefined;\n }\n\n try {\n return JSON.parse(text) as T;\n } catch {\n return undefined;\n }\n}\n\nfunction hydrateInput(\n baseDir: string,\n record: ResultManifestRecord,\n): EvaluationResult['input'] | undefined {\n const inputText = readOptionalText(baseDir, record.input_path);\n if (!inputText) {\n return undefined;\n }\n\n const messages = parseMarkdownMessages(inputText);\n return messages.length > 0 ? messages : [{ role: 'user', content: inputText.trimEnd() }];\n}\n\nfunction hydrateOutput(\n baseDir: string,\n record: ResultManifestRecord,\n): EvaluationResult['output'] | undefined {\n const responseText = readOptionalText(\n baseDir,\n record.output_path ?? record.answer_path ?? record.response_path,\n );\n if (!responseText) {\n return undefined;\n }\n\n return responseText.trimEnd();\n}\n\nfunction hydrateTraceEnvelope(\n baseDir: string,\n record: ResultManifestRecord,\n): EvaluationResult['trace'] | undefined {\n const traceWire = readOptionalJson<unknown>(baseDir, record.trace_path);\n if (!traceWire) {\n return undefined;\n }\n\n try {\n const envelope = fromTraceEnvelopeWire(traceWire);\n const summary = traceEnvelopeToTraceSummary(envelope);\n return buildTraceFromMessages({\n output: traceEnvelopeToTranscriptMessages(envelope),\n summary: summary.trace,\n finalOutput: hydrateOutput(baseDir, record),\n tokenUsage: summary.tokenUsage,\n costUsd: summary.costUsd,\n durationMs: summary.durationMs,\n startTime: summary.startTime,\n endTime: summary.endTime,\n provider: envelope.source.provider,\n target: record.target ?? envelope.eval.target,\n testId: record.test_id ?? envelope.eval.testId,\n conversationId: envelope.eval.runId,\n });\n } catch {\n return undefined;\n }\n}\n\nfunction hydrateTrace(\n baseDir: string,\n record: ResultManifestRecord,\n options: ManifestHydrationOptions,\n): EvaluationResult['trace'] {\n if (options.hydrateTranscriptTrace !== false) {\n const trace = hydrateTraceEnvelope(baseDir, record);\n if (trace) {\n return trace;\n }\n }\n\n const output = hydrateOutput(baseDir, record) ?? '';\n return buildTraceFromMessages({\n input: hydrateInput(baseDir, record),\n output: output ? [{ role: 'assistant', content: output }] : [],\n summary: record.trace ? (toCamelCaseDeep(record.trace) as TraceSummary) : undefined,\n finalOutput: output,\n target: record.target,\n testId: record.test_id,\n });\n}\n\nfunction hydrateManifestRecord(\n baseDir: string,\n record: ResultManifestRecord,\n options: ManifestHydrationOptions,\n): EvaluationResult {\n const grading = readOptionalJson<GradingArtifact>(baseDir, record.grading_path);\n const metrics = normalizeMetricsArtifactWire(\n readOptionalJson<MetricsArtifactWire | Record<string, unknown>>(baseDir, record.metrics_path),\n );\n const timing = metrics ?? readOptionalJson<LegacyTimingArtifact>(baseDir, record.timing_path);\n const testId = record.test_id ?? 'unknown';\n const gradingAssertions = grading\n ? collectComponentAssertions((grading as unknown as Record<string, unknown>).component_results)\n : undefined;\n const gradingRecord = grading as\n | (GradingArtifact & {\n graders?: readonly Record<string, unknown>[];\n evaluators?: readonly Record<string, unknown>[];\n })\n | undefined;\n const gradingScores = mapGradingEvaluators(\n gradingRecord?.component_results ?? gradingRecord?.graders ?? gradingRecord?.evaluators,\n );\n\n return {\n timestamp: record.timestamp,\n testId,\n suite: record.suite,\n category: record.category,\n target: record.target,\n variant: record.variant,\n score: record.score,\n executionStatus: record.execution_status,\n error: record.error,\n assertions: gradingAssertions?.map((assertion) => ({\n text: assertion.text,\n passed: assertion.passed,\n evidence: assertion.evidence,\n })),\n scores:\n // `evaluators` was renamed to `graders` in v4.13 — read both for backwards compat with old artifacts.\n // TODO: remove `evaluators` fallback once old run directories are no longer in use.\n gradingScores ?? (record.scores as EvaluationResult['scores']),\n tokenUsage: metrics?.tokens\n ? {\n input: metrics.tokens.input,\n output: metrics.tokens.output,\n reasoning: metrics.tokens.reasoning,\n }\n : (timing as LegacyTimingArtifact | undefined)?.token_usage\n ? {\n input: (timing as LegacyTimingArtifact).token_usage?.input,\n output: (timing as LegacyTimingArtifact).token_usage?.output,\n reasoning: (timing as LegacyTimingArtifact).token_usage?.reasoning,\n }\n : record.token_usage,\n durationMs:\n metrics?.duration?.total_ms ??\n (timing as LegacyTimingArtifact | undefined)?.duration_ms ??\n record.duration_ms,\n costUsd: metrics?.cost?.usd ?? record.cost_usd,\n input: hydrateInput(baseDir, record),\n output: hydrateOutput(baseDir, record) ?? '',\n trace: hydrateTrace(baseDir, record, options),\n metadata: record.metadata,\n } as EvaluationResult;\n}\n\nexport function parseResultManifest(content: string): ResultManifestRecord[] {\n return parseResultRows(content);\n}\n\nexport function resolveResultSourcePath(source: string, cwd?: string): string {\n const resolved = path.isAbsolute(source) ? source : path.resolve(cwd ?? process.cwd(), source);\n if (isDirectoryPath(resolved) || isRunManifestPath(resolved)) {\n return resolveRunManifestPath(resolved);\n }\n return resolved;\n}\n\nexport function loadManifestResults(\n sourceFile: string,\n options: ManifestHydrationOptions = {},\n): EvaluationResult[] {\n const resolvedSourceFile = resolveRunManifestPath(sourceFile);\n const content = readFileSync(resolvedSourceFile, 'utf8');\n const records = parseResultRows(content, resolvedSourceFile);\n const baseDir = manifestBaseDir(resolvedSourceFile);\n return records.map((record) => hydrateManifestRecord(baseDir, record, options));\n}\n\nexport interface LightweightResultRecord {\n readonly testId: string;\n readonly evalPath?: string;\n readonly suite?: string;\n readonly category?: string;\n readonly target?: string;\n readonly variant?: string;\n readonly experiment?: string;\n /** promptfoo-shaped tag map from the JSONL row's `tags` field. */\n readonly tags?: Record<string, string>;\n readonly score: number;\n readonly scores?: readonly Record<string, unknown>[];\n readonly executionStatus?: string;\n readonly error?: string;\n readonly costUsd?: number;\n readonly timestamp?: string;\n readonly runtimeSource?: RunRuntimeSourceMetadata;\n}\n\n/**\n * Coerce a raw JSONL `tags` value into a `Record<string,string>`, dropping\n * non-string values. Returns undefined when the map is absent or empty so the\n * lightweight record stays sparse for old runs that never wrote a tags map.\n */\nexport function normalizeTagMap(value: unknown): Record<string, string> | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n const entries: [string, string][] = [];\n for (const [key, raw] of Object.entries(value as Record<string, unknown>)) {\n if (typeof raw === 'string') {\n entries.push([key, raw]);\n }\n }\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\nexport function loadLightweightResults(sourceFile: string): LightweightResultRecord[] {\n const resolvedSourceFile = resolveRunManifestPath(sourceFile);\n const content = readFileSync(resolvedSourceFile, 'utf8');\n return parseResultManifest(content).map((record) => ({\n testId: record.test_id ?? 'unknown',\n evalPath: record.eval_path,\n suite: record.suite,\n category: record.category,\n target: record.target,\n variant: record.variant,\n experiment: record.experiment,\n tags: normalizeTagMap(record.tags),\n score: record.score,\n scores: record.scores,\n executionStatus: record.execution_status,\n error: record.error,\n costUsd: record.cost_usd,\n timestamp: record.timestamp,\n runtimeSource: record.runtime_source,\n }));\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 the closest .env outward so the nearest file wins while parent\n // files still contribute missing keys. override: false also preserves\n // explicitly exported process.env values.\n for (let i = 0; i < envFiles.length; 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 { createWriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport path from 'node:path';\nimport { finished } from 'node:stream/promises';\nimport { type EvaluationResult, serializeEvaluationResultWire } from '@agentv/core';\nimport { Mutex } from 'async-mutex';\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, options?: { append?: boolean }): Promise<JsonlWriter> {\n await mkdir(path.dirname(filePath), { recursive: true });\n const flags = options?.append ? 'a' : 'w';\n const stream = createWriteStream(filePath, { flags, encoding: 'utf8' });\n return new JsonlWriter(stream);\n }\n\n async append(record: EvaluationResult): Promise<void> {\n await this.mutex.runExclusive(async () => {\n if (this.closed) {\n throw new Error('Cannot write to closed JSONL writer');\n }\n const snakeCaseRecord = serializeEvaluationResultWire(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 type { EvaluationResult } from '@agentv/core';\n\nimport { JsonlWriter } from './jsonl-writer.js';\n\nexport interface OutputWriter {\n append(result: EvaluationResult): Promise<void>;\n close(): Promise<void>;\n}\n\nexport async function createOutputWriter(\n filePath: string,\n options?: { append?: boolean },\n): Promise<OutputWriter> {\n return JsonlWriter.open(filePath, { append: options?.append });\n}\n","export type Verdict = 'PASS' | 'FAIL' | 'ERROR';\n\nexport 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 score?: number;\n verdict?: Verdict;\n durationMs?: number;\n totalDurationMs?: number;\n}\n\nconst ANSI_BOLD = '\\x1b[1m';\nconst ANSI_GREEN = '\\x1b[32m';\nconst ANSI_RED = '\\x1b[31m';\nconst ANSI_YELLOW = '\\x1b[33m';\nconst ANSI_RESET = '\\x1b[0m';\n\nfunction useColors(): boolean {\n if (process.env.NO_COLOR !== undefined) return false;\n return process.stdout.isTTY ?? false;\n}\n\nfunction formatVerdict(score: number | undefined, verdict: Verdict | undefined): string {\n if (verdict === undefined) return '';\n\n const colors = useColors();\n const scoreStr = score !== undefined ? `${Math.round(score * 100)}%` : '';\n const verdictLabel = verdict === 'ERROR' ? 'ERROR' : `${scoreStr} ${verdict}`;\n\n if (!colors) return ` | ${verdictLabel}`;\n\n const color = verdict === 'PASS' ? ANSI_GREEN : verdict === 'FAIL' ? ANSI_RED : ANSI_YELLOW;\n\n return ` | ${color}${ANSI_BOLD}${verdictLabel}${ANSI_RESET}`;\n}\n\nfunction formatDurations(\n durationMs: number | undefined,\n totalDurationMs: number | undefined,\n): string {\n if (durationMs === undefined && totalDurationMs === undefined) {\n return '';\n }\n\n if (durationMs !== undefined && totalDurationMs !== undefined) {\n const normalizedTotalMs = Math.max(durationMs, totalDurationMs);\n return ` | ${durationMs}/${normalizedTotalMs}ms`;\n }\n\n const singleDurationMs = durationMs ?? totalDurationMs;\n return singleDurationMs !== undefined ? ` | ${singleDurationMs}ms` : '';\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 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 // Pick icon based on verdict: ✅ PASS, ⚠️ FAIL, ❌ ERROR\n const icon = progress.verdict === 'FAIL' ? '⚠️' : progress.verdict === 'ERROR' ? '❌' : '✅';\n console.log(\n `${countPrefix} ${icon} ${progress.testId}${targetSuffix}${formatVerdict(progress.score, progress.verdict)}${formatDurations(progress.durationMs, progress.totalDurationMs)}`,\n );\n break;\n }\n case 'failed': {\n const failIcon = progress.verdict === 'ERROR' ? '❌' : '⚠️';\n console.log(\n `${countPrefix} ${failIcon} ${progress.testId}${targetSuffix}${formatVerdict(progress.score, progress.verdict)}${formatDurations(progress.durationMs, progress.totalDurationMs)}${progress.error ? `: ${progress.error}` : ''}`,\n );\n break;\n }\n }\n }\n\n addLogPaths(paths: readonly string[]): void {\n void paths;\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 type { EvaluationResult } from '@agentv/core';\n\nimport { loadManifestResults, resolveResultSourcePath } from '../results/manifest.js';\n\nasync function loadRetrySourceResults(jsonlPath: string): Promise<readonly EvaluationResult[]> {\n return loadManifestResults(resolveResultSourcePath(jsonlPath));\n}\n\n/**\n * Escape micromatch glob metacharacters in a string so it matches literally.\n * Characters escaped: * ? [ ] { } ( ) ! @ # + |\n */\nfunction escapeGlob(id: string): string {\n return id.replace(/[*?[\\]{}()!@#+|\\\\]/g, '\\\\$&');\n}\n\n/**\n * Load test IDs from an index/results source that have executionStatus === 'execution_error'.\n */\nexport async function loadErrorTestIds(jsonlPath: string): Promise<readonly string[]> {\n const ids = (await loadRetrySourceResults(jsonlPath))\n .filter((result) => result.executionStatus === 'execution_error')\n .map((result) => result.testId);\n\n return [...new Set(ids)];\n}\n\n/**\n * Load test IDs that are fully completed (non-error) across ALL targets.\n * A test ID is only considered \"completed\" if every result for that ID is non-error.\n * This is conservative for matrix runs: if case-1 succeeded on target A but errored\n * on target B, case-1 is NOT excluded (it will re-run on both targets).\n */\nexport async function loadFullyCompletedTestIds(jsonlPath: string): Promise<readonly string[]> {\n const results = await loadRetrySourceResults(jsonlPath);\n const allIds = new Set<string>();\n const errorIds = new Set<string>();\n\n for (const result of results) {\n if (!result.testId) continue;\n allIds.add(result.testId);\n if (result.executionStatus === 'execution_error') {\n errorIds.add(result.testId);\n }\n }\n\n // Only IDs where every result is non-error\n return [...allIds].filter((id) => !errorIds.has(id));\n}\n\n/**\n * Build a micromatch negation pattern that excludes the given test IDs.\n * Escapes glob metacharacters in IDs to ensure literal matching.\n */\nexport function buildExclusionFilter(completedIds: readonly string[]): string {\n const escaped = completedIds.map(escapeGlob);\n return escaped.length === 1 ? `!${escaped[0]}` : `!{${escaped.join(',')}}`;\n}\n\n/**\n * Load results from an index/results source 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 return (await loadRetrySourceResults(jsonlPath)).filter(\n (result) => result.testId && result.executionStatus !== 'execution_error',\n );\n}\n","import { existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport {\n RESULT_INDEX_FILENAME,\n discoverRunManifestPaths,\n isRunManifestPath,\n resolveExistingRunPrimaryPath,\n resolveRunIndexPath,\n} from './result-layout.js';\n\nconst CACHE_FILENAME = 'cache.json';\n\n/**\n * Persisted pointer to the last eval run, stored in .agentv/cache.json.\n * Keys use camelCase (not snake_case) for backward compat with pre-existing cache files.\n */\nexport interface RunCache {\n /** Directory path for the run workspace (e.g. .agentv/results/<run_id>/) */\n readonly lastRunDir?: string;\n /** @deprecated Legacy flat-file pointer from old cache files. Ignored on read. */\n readonly lastResultFile?: string;\n readonly timestamp: string;\n}\n\n/**\n * Resolve the primary result manifest path from a RunCache entry.\n */\nexport function resolveRunCacheFile(cache: RunCache): string {\n if (cache.lastRunDir) {\n const direct = resolveExistingRunPrimaryPath(cache.lastRunDir);\n if (direct) {\n return direct;\n }\n return discoverRunManifestPaths(cache.lastRunDir)[0] ?? resolveRunIndexPath(cache.lastRunDir);\n }\n return '';\n}\n\nfunction cachePath(cwd: string): string {\n return path.join(cwd, '.agentv', CACHE_FILENAME);\n}\n\nexport async function loadRunCache(cwd: string): Promise<RunCache | undefined> {\n try {\n const content = await readFile(cachePath(cwd), 'utf-8');\n return JSON.parse(content) as RunCache;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolve the cached last-run directory for a cwd, if it still exists on disk.\n * Returns undefined when there is no cache, the cache lacks a `lastRunDir`,\n * or the directory has since been deleted. Used by `--resume` to default\n * `--output` to the most recent run when no explicit dir is given, matching\n * the convention used by promptfoo (`--resume [evalId]`) and OpenCompass\n * (`-r [timestamp]`).\n */\nexport async function resolveCachedRunDir(cwd: string): Promise<string | undefined> {\n const cache = await loadRunCache(cwd);\n if (!cache?.lastRunDir) return undefined;\n if (!existsSync(cache.lastRunDir)) return undefined;\n return cache.lastRunDir;\n}\n\nexport async function saveRunCache(cwd: string, resultPath: string): Promise<void> {\n const dir = path.join(cwd, '.agentv');\n const lastRunDir = isRunManifestPath(resultPath) ? path.dirname(resultPath) : resultPath;\n await mkdir(dir, { recursive: true });\n const cache: RunCache = {\n lastRunDir,\n timestamp: new Date().toISOString(),\n };\n await writeFile(cachePath(cwd), `${JSON.stringify(cache, null, 2)}\\n`, 'utf-8');\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 readonly byTargetErrorKind: 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 options?: { threshold?: number; thresholdLabel?: string; useExecutionStatus?: boolean },\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 byTargetErrorKind: {},\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. When a custom threshold is provided,\n // recompute passed/failed from raw scores instead of executionStatus\n // (which uses the hardcoded DEFAULT_THRESHOLD of 0.8).\n const executionErrorCount = executionErrors.length;\n const scoreThreshold = options?.threshold;\n const passedCount =\n scoreThreshold !== undefined && options?.useExecutionStatus !== true\n ? qualityResults.filter((r) => r.score >= scoreThreshold).length\n : results.filter((r) => r.executionStatus === 'ok').length;\n const qualityFailureCount =\n scoreThreshold !== undefined && options?.useExecutionStatus !== true\n ? qualityResults.filter((r) => r.score < scoreThreshold).length\n : results.filter((r) => r.executionStatus === 'quality_failure').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 const byTargetErrorKind: 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 const targetErrorKind = result.targetExecution?.errorKind;\n if (targetErrorKind) {\n byTargetErrorKind[targetErrorKind] = (byTargetErrorKind[targetErrorKind] ?? 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 byTargetErrorKind,\n };\n}\n\nfunction formatScore(value: number): string {\n return `${Math.round(value * 100)}%`;\n}\n\nexport function formatEvaluationSummary(\n summary: EvaluationSummary,\n options?: { threshold?: number; thresholdLabel?: string; useExecutionStatus?: boolean },\n): 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 // Overall verdict: all non-error cases must score >= per-test threshold.\n const gradedCount = summary.total - summary.executionErrorCount;\n const threshold = options?.threshold ?? 0.8;\n const thresholdText = options?.thresholdLabel ?? `${Math.round(threshold * 100)}%`;\n const allExecutionErrors = summary.total > 0 && summary.executionErrorCount === summary.total;\n const overallPassed =\n !allExecutionErrors &&\n (summary.passedCount === gradedCount ||\n (summary.qualityFailureCount === 0 && summary.executionErrorCount === 0));\n const useColor = !(process.env.NO_COLOR !== undefined) && (process.stdout.isTTY ?? false);\n\n let overallVerdict: string;\n let verdictColor: string;\n let verdictText: string;\n if (allExecutionErrors) {\n overallVerdict = 'ERROR';\n verdictColor = '\\x1b[33m'; // yellow\n verdictText = `RESULT: ERROR (all ${summary.total} test(s) had execution errors — no evaluation was performed)`;\n } else {\n overallVerdict = overallPassed ? 'PASS' : 'FAIL';\n verdictColor = overallPassed ? '\\x1b[32m' : '\\x1b[31m';\n verdictText = `RESULT: ${overallVerdict} (${summary.passedCount}/${summary.total} scored >= ${thresholdText}, mean: ${formatScore(summary.mean)})`;\n }\n\n lines.push('\\n==================================================');\n if (useColor) {\n lines.push(`\\x1b[1m${verdictColor}${verdictText}\\x1b[0m`);\n } else {\n lines.push(verdictText);\n }\n lines.push('==================================================');\n\n lines.push('');\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(` ${Math.round(start * 100)}%-${Math.round(end * 100)}%: ${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 const targetErrorEntries = Object.entries(summary.byTargetErrorKind);\n if (targetErrorEntries.length > 0) {\n lines.push('\\nTarget runtime errors by kind:');\n for (const [kind, count] of targetErrorEntries) {\n lines.push(` ${kind}: ${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';\n\nimport {\n AGENTV_LOCAL_CONFIG_FILE_NAME,\n AGENTV_LOCAL_CONFIG_YML_FILE_NAME,\n isAgentVConfigFileName,\n} from '../../config-overlays.js';\nimport { parseYamlValue } from '../yaml-loader.js';\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/config.local.yaml under .agentv folder → 'config'\n * - targets.yaml under .agentv folder → 'targets'\n * - suite.yaml/suite.yml → 'eval'\n */\nexport async function detectFileType(filePath: string): Promise<FileType> {\n try {\n const content = await readFile(filePath, 'utf8');\n const parsed = parseYamlValue(content);\n\n // YAML array root → cases file (array of test case objects)\n if (Array.isArray(parsed)) {\n return 'cases';\n }\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 if (\n basename === AGENTV_LOCAL_CONFIG_FILE_NAME ||\n basename === AGENTV_LOCAL_CONFIG_YML_FILE_NAME\n ) {\n return 'config';\n }\n\n // Check if file is under .agentv folder\n if (normalized.includes('/.agentv/')) {\n if (isAgentVConfigFileName(basename)) {\n return 'config';\n }\n if (basename === 'targets.yaml' || basename === 'targets.yml') {\n return 'targets';\n }\n }\n\n // Recognize canonical eval suite filenames.\n const lower = basename.toLowerCase();\n if (\n lower === 'suite.yaml' ||\n lower === 'suite.yml' ||\n lower.endsWith('.eval.yaml') ||\n lower.endsWith('.eval.yml')\n ) {\n return 'eval';\n }\n\n // Unrecognized — do not assume eval type\n return 'unknown';\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, readdir, realpath, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport fg from 'fast-glob';\n\nimport { interpolateEnv } from '../interpolation.js';\nimport { loadCasesFromDirectory, loadCasesFromFile } from '../loaders/case-file-loader.js';\nimport { resolveEnvironmentRecipe } from '../loaders/environment-recipe.js';\nimport { buildSearchRoots } from '../loaders/file-resolver.js';\nimport { loadPromptMdFallback } from '../loaders/prompt-md-fallback.js';\nimport { isGraderKind } from '../types.js';\nimport { parseYamlValue } from '../yaml-loader.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[];\ntype SuiteImportStackEntry = {\n readonly identity: string;\n readonly displayPath: string;\n readonly filePath: string;\n};\ntype NormalizedImportEntry = {\n readonly path: string;\n readonly type: 'suite' | 'tests';\n readonly location: string;\n readonly select?: JsonValue;\n readonly run?: JsonValue;\n readonly legacy?: boolean;\n};\n\n/** Assertion grader 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 grader 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]);\nconst PROMPTFOO_ASSERTION_TYPES = new Set([\n 'assert-set',\n 'llm-rubric',\n 'javascript',\n 'python',\n 'webhook',\n 'similar',\n 'select-best',\n 'human',\n]);\nconst REMOVED_ASSERTION_TYPE_REPLACEMENTS = new Map<string, string>([\n ['composite', 'assert-set'],\n ['g-eval', 'llm-rubric'],\n ['rubrics', 'llm-rubric with value'],\n ['rubric', 'llm-rubric with value'],\n ['script-grader', 'script'],\n ['code-judge', 'script'],\n ['llm-judge', 'llm-grader'],\n]);\n\nconst UNSUPPORTED_PROMPTFOO_ASSERTION_TYPES = new Set([\n 'agent-rubric',\n 'answer-relevance',\n 'bleu',\n 'classifier',\n 'contains-html',\n 'contains-json',\n 'contains-sql',\n 'contains-xml',\n 'context-faithfulness',\n 'context-recall',\n 'context-relevance',\n 'conversation-relevance',\n 'factuality',\n 'finish-reason',\n 'gleu',\n 'guardrails',\n 'is-html',\n 'is-refusal',\n 'is-sql',\n 'is-valid-function-call',\n 'is-valid-openai-function-call',\n 'is-valid-openai-tools-call',\n 'is-xml',\n 'levenshtein',\n 'meteor',\n 'model-graded-closedqa',\n 'model-graded-factuality',\n 'moderation',\n 'perplexity',\n 'perplexity-score',\n 'pi',\n 'rouge-n',\n 'ruby',\n 'similar:cosine',\n 'similar:dot',\n 'similar:euclidean',\n 'select-best',\n 'human',\n 'max-score',\n 'tool-call-f1',\n 'trace-error-spans',\n 'trace-span-count',\n 'trace-span-duration',\n 'search-rubric',\n 'word-count',\n]);\n\nfunction formatJsonValue(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction hasToolTrajectoryLatencyCheck(value: JsonObject): boolean {\n const expected = value.expected;\n return (\n Array.isArray(expected) &&\n expected.some(\n (item) =>\n isObject(item) && (item.max_duration_ms !== undefined || item.maxDurationMs !== undefined),\n )\n );\n}\n\nfunction staleSkillTriggerMessage(value: JsonObject): string {\n const skill = typeof value.skill === 'string' && value.skill.trim() ? value.skill.trim() : '';\n const shouldTrigger = value.should_trigger !== false;\n if (!skill) {\n return \"Authored assertion type 'skill-trigger' has been removed. Use 'skill-used' with value: <skill> for expected skill use, or 'not-skill-used' with value: <skill> when the skill must not be used.\";\n }\n const replacementType = shouldTrigger ? 'skill-used' : 'not-skill-used';\n return `Authored assertion type 'skill-trigger' has been removed. Replace skill: ${skill} with type: ${replacementType}, value: ${skill}.`;\n}\n\nfunction staleToolTrajectoryMessage(value: JsonObject): string {\n const mode = typeof value.mode === 'string' ? value.mode : undefined;\n if (hasToolTrajectoryLatencyCheck(value)) {\n return \"Authored assertion type 'tool-trajectory' has been removed. Per-tool latency checks such as max_duration_ms have no Promptfoo trajectory:* equivalent in AgentV yet; use a custom script assertion or track this as unsupported future scope.\";\n }\n\n if (mode === 'any_order' && isObject(value.minimums)) {\n const [toolName, min] = Object.entries(value.minimums)[0] ?? [];\n const example =\n typeof toolName === 'string'\n ? ` For example: type: trajectory:tool-used, value: { name: ${toolName}, min: ${formatJsonValue(min)} }.`\n : '';\n return `Authored assertion type 'tool-trajectory' has been removed. Replace mode: any_order minimums with one Promptfoo trajectory:tool-used assertion per tool.${example}`;\n }\n\n if ((mode === 'in_order' || mode === 'exact') && Array.isArray(value.expected)) {\n const steps = value.expected\n .filter(isObject)\n .map((item) => item.tool)\n .filter((tool): tool is string => typeof tool === 'string');\n const hasArgs = value.expected.some(\n (item) => isObject(item) && item.args !== undefined && item.args !== 'any',\n );\n const sequenceHint =\n steps.length > 0\n ? ` Use type: trajectory:tool-sequence, value: { mode: ${mode}, steps: ${formatJsonValue(steps)} }.`\n : ' Use type: trajectory:tool-sequence with value: { mode, steps }.';\n const argsHint = hasArgs\n ? ' Move expected args checks to trajectory:tool-args-match with Promptfoo mode: partial or exact.'\n : '';\n return `Authored assertion type 'tool-trajectory' has been removed.${sequenceHint}${argsHint}`;\n }\n\n return \"Authored assertion type 'tool-trajectory' has been removed. Use Promptfoo trajectory:* assertions: trajectory:tool-used for tool presence/counts, trajectory:tool-sequence for in_order/exact steps, and trajectory:tool-args-match for argument checks. AgentV-specific latency checks are unsupported future scope.\";\n}\n\nfunction staleAuthoredAssertionMessage(value: JsonObject): string | undefined {\n if (typeof value.type !== 'string') return undefined;\n const type = value.type.replace(/_/g, '-');\n if (type === 'skill-trigger') return staleSkillTriggerMessage(value);\n if (type === 'tool-trajectory') return staleToolTrajectoryMessage(value);\n return undefined;\n}\n\n/** Valid file extensions for external test files. */\nconst VALID_TEST_FILE_EXTENSIONS = new Set([\n '.csv',\n '.cjs',\n '.js',\n '.json',\n '.jsonl',\n '.mjs',\n '.py',\n '.yaml',\n '.yml',\n]);\n\n/** Known fields at the top level of an eval file. */\nconst KNOWN_TOP_LEVEL_FIELDS = new Set([\n '$schema',\n 'name',\n 'description',\n 'category',\n 'version',\n 'author',\n 'tags',\n 'license',\n 'requires',\n 'expected_output',\n 'input',\n 'input_files',\n 'prompts',\n 'tests',\n 'graders',\n 'defaults',\n 'environment',\n 'target',\n 'targets',\n 'model',\n 'policy',\n 'experiment',\n 'execution',\n 'repeat',\n 'runs',\n 'early_exit',\n 'timeout_seconds',\n 'evaluate_options',\n 'threshold',\n 'default_test',\n 'assert',\n 'scenarios',\n 'derived_metrics',\n 'output_path',\n 'env',\n 'nunjucks_filters',\n 'extensions',\n 'on_run_complete',\n 'workspace',\n 'metadata',\n 'governance',\n]);\n\n/** Known fields on legacy tests[] include entries. */\nconst KNOWN_INCLUDE_FIELDS = new Set(['include', 'type', 'select', 'run']);\nconst KNOWN_RUN_OVERRIDE_FIELDS = new Set(['threshold', 'repeat', 'timeout_seconds', 'budget_usd']);\nconst KNOWN_DEFAULT_TEST_FIELDS = new Set([\n 'vars',\n 'provider',\n 'providers',\n 'prompts',\n 'provider_output',\n 'assert',\n 'assert_scoring_function',\n 'options',\n 'threshold',\n 'metadata',\n]);\nconst KNOWN_EVALUATE_OPTION_FIELDS = new Set([\n 'budget_usd',\n 'max_concurrency',\n 'cache',\n 'delay',\n 'generate_suggestions',\n 'repeat',\n 'timeout_ms',\n 'max_eval_time_ms',\n 'filter_range',\n]);\nconst KNOWN_REPEAT_FIELDS = new Set(['count', 'strategy', 'early_exit', 'cost_limit_usd']);\nconst KNOWN_REPEAT_STRATEGIES = new Set(['pass_any', 'pass_all', 'mean', 'confidence_interval']);\nconst KNOWN_TEST_EXECUTION_FIELDS = new Set([\n 'assert',\n 'skip_defaults',\n 'cache',\n 'trials',\n 'budget_usd',\n 'budgetUsd',\n 'fail_on_error',\n 'failOnError',\n 'threshold',\n 'workspace',\n]);\n\n/** Removed top-level fields with migration hints. */\nconst REMOVED_TOP_LEVEL_FIELDS = new Map<string, string>([\n [\n 'imports',\n \"Top-level 'imports' is not supported. Run eval files directly with CLI multi-file selection and tags for grouping. For raw case files, use tests: file://... or string entries under tests. For reusable config, use prompts: file://..., default_test: file://..., and environment: file://... for coding-agent testbeds.\",\n ],\n [\n 'expected_output',\n \"Top-level 'expected_output' has been removed from authored eval YAML. Put reference answers in default_test.vars.expected_output or tests[].vars.expected_output and consume them with an explicit assertion such as { type: 'llm-rubric', value: 'Matches the reference answer: {{ expected_output }}' }.\",\n ],\n [\n 'input',\n \"Top-level 'input' has been removed from authored eval YAML. Author prompt text or chat messages in top-level 'prompts' and put shared data in default_test.vars or per-row data in tests[].vars.\",\n ],\n [\n 'workers',\n \"'workers' has been removed from eval YAML. Set authored eval concurrency with evaluate_options.max_concurrency.\",\n ],\n ['model', \"Top-level 'model' is not part of eval YAML. Put model inside the target object.\"],\n [\n 'policy',\n \"Top-level 'policy' is not part of eval YAML. Put repeat under evaluate_options.repeat, timeout_seconds and threshold at the top level, and budget_usd under evaluate_options.\",\n ],\n [\n 'providers',\n \"Top-level 'providers' is not a runtime alias in AgentV eval YAML. Use 'targets' for systems under test; provider names backend kind inside each target.\",\n ],\n [\n 'eval_cases',\n \"Top-level 'eval_cases' has been removed from authored eval YAML. Use 'tests' instead.\",\n ],\n [\n 'evalcases',\n \"Top-level 'evalcases' has been removed from authored eval YAML. Use 'tests' instead.\",\n ],\n ['repeat', \"Top-level 'repeat' has been removed. Use evaluate_options.repeat instead.\"],\n ['runs', \"Top-level 'runs' has been removed. Use evaluate_options.repeat.count instead.\"],\n [\n 'early_exit',\n \"Top-level 'early_exit' has been removed. Use evaluate_options.repeat.early_exit instead.\",\n ],\n ['budget_usd', \"Top-level 'budget_usd' has been removed. Use evaluate_options.budget_usd.\"],\n [\n 'on_run_complete',\n \"Top-level 'on_run_complete' has been removed. Use extensions with an afterAll hook instead.\",\n ],\n [\n 'preprocessors',\n \"Top-level 'preprocessors' has been removed from authored eval YAML. Use default_test.options.transform or assertion-level transform instead.\",\n ],\n ['providerPromptMap', \"Top-level 'providerPromptMap' is not supported. Use 'targets'.\"],\n ['provider_prompt_map', \"Top-level 'provider_prompt_map' is not supported. Use 'targets'.\"],\n]);\n\n/** Deprecated top-level fields with migration hints. */\nconst DEPRECATED_TOP_LEVEL_FIELDS = new Map<string, string>([\n ['evaluator', \"'evaluator' is deprecated. Use 'assert' instead.\"],\n]);\n\n/** Known fields at the test level. */\nconst KNOWN_TEST_FIELDS = new Set([\n 'id',\n 'description',\n 'vars',\n 'criteria',\n 'provider',\n 'providers',\n 'prompts',\n 'provider_output',\n 'input',\n 'input_files',\n 'assert',\n 'assert_scoring_function',\n 'options',\n 'threshold',\n 'execution',\n 'run',\n 'environment',\n 'workspace',\n 'metadata',\n 'conversation_id',\n 'suite',\n 'depends_on',\n 'on_dependency_failure',\n 'mode',\n 'turns',\n 'aggregation',\n 'on_turn_failure',\n 'window_size',\n]);\n\nconst KNOWN_SCENARIO_FIELDS = new Set(['description', 'config', 'tests']);\nconst SUPPORTED_WORKSPACE_REPO_FIELDS = new Set(['path', 'repo', 'commit', 'ancestor', 'sparse']);\nconst KNOWN_REMOVED_WORKSPACE_FIELDS = new Set([\n 'template',\n 'repos',\n 'scope',\n 'docker',\n 'hooks',\n 'env',\n 'mode',\n 'isolation',\n 'path',\n]);\n\n/** Removed test-level fields with migration hints. */\nconst REMOVED_TEST_FIELDS = new Map<string, string>([]);\nREMOVED_TEST_FIELDS.set(\n 'input',\n \"tests[].input has been removed from authored eval YAML. Put prompt text or chat/system/user messages in top-level 'prompts' and put row-specific data in tests[].vars.\",\n);\nREMOVED_TEST_FIELDS.set(\n 'preprocessors',\n 'tests[].preprocessors has been removed from authored eval YAML. Use tests[].options.transform or assertion-level transform instead.',\n);\nREMOVED_TEST_FIELDS.set(\n 'postprocess',\n 'tests[].postprocess has been removed from authored eval YAML. Use tests[].options.transform instead.',\n);\nREMOVED_TEST_FIELDS.set(\n 'eval_cases',\n \"tests[].eval_cases has been removed from authored eval YAML. Use 'tests' rows directly.\",\n);\nREMOVED_TEST_FIELDS.set(\n 'evalcases',\n \"tests[].evalcases has been removed from authored eval YAML. Use 'tests' rows directly.\",\n);\n\n/** Deprecated test-level fields with migration hints. */\nconst DEPRECATED_TEST_FIELDS = new Map<string, string>([\n ['evaluator', \"'evaluator' is deprecated. Use 'assert' instead.\"],\n ['expected_outcome', \"'expected_outcome' is deprecated. Use 'assert' instead.\"],\n]);\n\n/** Name field pattern: lowercase alphanumeric with hyphens. */\nconst NAME_PATTERN = /^[a-z0-9-]+$/;\n\n/** Script file extensions recognised as custom assertion plugins. */\nconst ASSERTION_SCRIPT_EXTENSIONS = new Set(['.ts', '.js', '.mts', '.mjs', '.cts', '.cjs']);\n\n/** Cache: directory path → promise of discovered type names. */\nconst customAssertionCache = new Map<string, Promise<Set<string>>>();\n\n/**\n * Walk up the directory tree from `baseDir` collecting type names from\n * `.agentv/assertions/` directories — mirrors the runtime discovery in\n * `assertion-discovery.ts`.\n *\n * Results are cached by directory so concurrent validation of many files\n * in the same directory only does the filesystem walk once.\n */\nfunction discoverCustomAssertionTypes(baseDir: string): Promise<Set<string>> {\n const resolved = path.resolve(baseDir);\n const cached = customAssertionCache.get(resolved);\n if (cached) return cached;\n\n const promise = (async () => {\n const types = new Set<string>();\n let dir = resolved;\n const root = path.parse(dir).root;\n\n while (dir !== root) {\n const assertionsDir = path.join(dir, '.agentv', 'assertions');\n try {\n const entries = await readdir(assertionsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n const ext = path.extname(entry.name).toLowerCase();\n if (!ASSERTION_SCRIPT_EXTENSIONS.has(ext)) continue;\n types.add(entry.name.slice(0, -ext.length));\n }\n } catch {\n // Directory doesn't exist — skip\n }\n dir = path.dirname(dir);\n }\n\n return types;\n })();\n\n customAssertionCache.set(resolved, promise);\n return promise;\n}\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isIncludeEntry(value: JsonObject): value is JsonObject & { include: string } {\n return typeof value.include === 'string' && value.include.trim().length > 0;\n}\n\nasync function canonicalEvalFileIdentity(filePath: string): Promise<string> {\n const absolutePath = path.resolve(filePath);\n return realpath(absolutePath).catch(() => absolutePath);\n}\n\nfunction displayEvalImportPath(filePath: string): string {\n const relativePath = path.relative(process.cwd(), filePath);\n return relativePath && !relativePath.startsWith('..') && !path.isAbsolute(relativePath)\n ? relativePath\n : filePath;\n}\n\nfunction formatCircularImportChain(\n stack: readonly SuiteImportStackEntry[],\n repeated: SuiteImportStackEntry,\n): string {\n const start = stack.findIndex((entry) => entry.identity === repeated.identity);\n const cycle = [...(start >= 0 ? stack.slice(start) : stack), repeated];\n return cycle.map((entry) => entry.displayPath).join(' -> ');\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 const customAssertionTypes = await discoverCustomAssertionTypes(path.dirname(absolutePath));\n\n let parsed: unknown;\n try {\n const content = await readFile(absolutePath, 'utf8');\n parsed = interpolateEnv(parseYamlValue(content), process.env);\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 if (parsed.experiment !== undefined && typeof parsed.experiment !== 'string') {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'experiment',\n message: \"Top-level 'experiment' must be a string run/result grouping label.\",\n });\n }\n\n // Match promptfoo-style validation: unknown authored suite fields are hard\n // errors, not advisory warnings, because they otherwise silently do nothing.\n for (const key of Object.keys(parsed)) {\n const removedMessage = REMOVED_TOP_LEVEL_FIELDS.get(key);\n if (removedMessage) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: key,\n message: removedMessage,\n });\n continue;\n }\n const deprecationMessage = DEPRECATED_TOP_LEVEL_FIELDS.get(key);\n if (deprecationMessage) {\n errors.push({\n severity: 'warning',\n filePath: absolutePath,\n location: key,\n message: deprecationMessage,\n });\n } else if (!KNOWN_TOP_LEVEL_FIELDS.has(key)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: key,\n message: `Unknown top-level field '${key}'.`,\n });\n }\n }\n\n await validateEnvironmentConfig(parsed.environment, absolutePath, errors, 'environment');\n await validateSuiteWorkspaceConfigs(parsed, absolutePath, errors);\n validateTargetTestbedFields(parsed.target, 'target', absolutePath, errors);\n validateTargetsTestbedFields(parsed.targets, 'targets', absolutePath, errors);\n validateAuthoredWorkers(parsed, absolutePath, errors);\n validateExecutionPolicy(parsed.execution, 'execution', absolutePath, errors);\n validateEvaluateOptions(parsed.evaluate_options, 'evaluate_options', absolutePath, errors);\n validateAssertArray(parsed.assert, 'assert', absolutePath, errors, customAssertionTypes);\n validateDefaultTest(parsed.default_test, absolutePath, errors, customAssertionTypes);\n await validateScenarios(parsed.scenarios, parsed, absolutePath, errors, customAssertionTypes);\n const cases: JsonValue | undefined = parsed.tests;\n const hasImports = collectImportEntries(parsed).length > 0;\n const hasScenarios = Array.isArray(parsed.scenarios);\n\n // tests can be a string path (external file/directory reference) or an array\n if (typeof cases === 'string') {\n await validateRawCaseImportPath(cases, absolutePath, 'tests', errors);\n await validateCompositionDiagnostics(absolutePath, parsed, errors);\n await validateSuiteImportCycles(absolutePath, parsed, errors);\n\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 (cases === undefined && (hasImports || hasScenarios)) {\n await validateCompositionDiagnostics(absolutePath, parsed, errors);\n await validateSuiteImportCycles(absolutePath, parsed, 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:\n \"Missing or invalid 'tests' field (must be an array or a file path string, unless scenarios are provided)\",\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 // Tests array items can be file references (e.g., \"file://cases/accuracy.yaml\")\n if (typeof evalCase === 'string') {\n await validateRawCaseImportPath(evalCase, absolutePath, location, errors);\n continue;\n }\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 if (isIncludeEntry(evalCase)) {\n validateIncludeEntry(evalCase, location, absolutePath, errors);\n continue;\n }\n\n // Match promptfoo-style validation: unknown authored test fields are hard\n // errors, not advisory warnings, because they otherwise silently do nothing.\n for (const key of Object.keys(evalCase)) {\n const removedMessage = REMOVED_TEST_FIELDS.get(key);\n if (removedMessage) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.${key}`,\n message: removedMessage,\n });\n continue;\n }\n const deprecationMessage = DEPRECATED_TEST_FIELDS.get(key);\n if (deprecationMessage) {\n errors.push({\n severity: 'warning',\n filePath: absolutePath,\n location: `${location}.${key}`,\n message: deprecationMessage,\n });\n } else if (!KNOWN_TEST_FIELDS.has(key)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.${key}`,\n message: `Unknown test field '${key}'.`,\n });\n }\n }\n\n // Optional id. Promptfoo-style rows can omit id and receive a derived content id later.\n const id = evalCase.id;\n if (id !== undefined && (typeof id !== 'string' || id.trim().length === 0)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.id`,\n message: \"Invalid 'id' field (must be a non-empty string when provided)\",\n });\n }\n\n // Optional: criteria\n const criteria = evalCase.criteria;\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 } else if (criteria !== undefined && evalCase.assert !== undefined) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.criteria`,\n message:\n \"Do not combine test-level 'criteria' with 'assert'. Put human-readable case descriptions in tests[].description, or express grading text as an explicit assertion such as { type: 'llm-rubric', value: ... }.\",\n });\n }\n\n // input field (string/object shorthand or message array). When omitted,\n // AgentV accepts Vercel-style PROMPT.md fallback beside EVAL.yaml or in input_files.\n const caseExecution = isObject(evalCase.execution) ? evalCase.execution : undefined;\n if (caseExecution) {\n validateTestExecutionFields(caseExecution, absolutePath, errors, location);\n rejectRuntimeWorkspaceConfig(\n caseExecution.workspace,\n absolutePath,\n errors,\n `${location}.execution.workspace`,\n );\n }\n const skipDefaults = caseExecution?.skip_defaults === true;\n const hasPromptMdFallback =\n evalCase.input === undefined\n ? (await loadPromptMdFallback({\n evalFilePath: absolutePath,\n searchRoots: buildSearchRoots(absolutePath, process.cwd()),\n testInputFiles: evalCase.input_files,\n suiteInputFiles: skipDefaults ? undefined : parsed.input_files,\n })) !== undefined\n : false;\n validateInputField(evalCase.input, `${location}.input`, absolutePath, errors, {\n required:\n !hasPromptMdFallback &&\n evalCase.prompts === undefined &&\n parsed.prompts === undefined &&\n evalCase.provider_output === undefined,\n });\n\n const expectedOutputField = evalCase.expected_output;\n if (expectedOutputField !== undefined) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.expected_output`,\n message:\n \"tests[].expected_output has been removed from authored eval YAML. Put the reference answer in tests[].vars.expected_output and consume it with an explicit assertion, for example { type: 'llm-rubric', value: 'Matches the reference answer: {{ expected_output }}' }.\",\n });\n }\n\n validateAssertArray(\n evalCase.assert,\n `${location}.assert`,\n absolutePath,\n errors,\n customAssertionTypes,\n );\n\n validateRunOverride(evalCase.run, `${location}.run`, absolutePath, errors);\n validateTestOptions(evalCase.options, `${location}.options`, absolutePath, errors);\n await validateEnvironmentConfig(\n evalCase.environment,\n absolutePath,\n errors,\n `${location}.environment`,\n );\n\n // Cross-field validation for conversation mode\n validateConversationMode(evalCase, location, absolutePath, errors);\n\n await validateWorkspaceConfig(\n evalCase.workspace,\n absolutePath,\n errors,\n `${location}.workspace`,\n );\n }\n\n await validateCompositionDiagnostics(absolutePath, parsed, errors);\n await validateSuiteImportCycles(absolutePath, parsed, errors);\n\n return {\n valid: errors.filter((e) => e.severity === 'error').length === 0,\n filePath: absolutePath,\n fileType: 'eval',\n errors,\n };\n}\n\nexport async function validateTypeScriptEvalConfigFile(\n filePath: string,\n): Promise<ValidationResult> {\n const absolutePath = path.resolve(filePath);\n\n try {\n const { loadTsEvalSuite } = await import('../loaders/ts-eval-loader.js');\n await loadTsEvalSuite(absolutePath, process.cwd());\n return {\n valid: true,\n filePath: absolutePath,\n fileType: 'eval',\n errors: [],\n };\n } catch (error) {\n return {\n valid: false,\n filePath: absolutePath,\n fileType: 'eval',\n errors: [\n {\n severity: 'error',\n filePath: absolutePath,\n message: (error as Error).message,\n },\n ],\n };\n }\n}\n\nasync function validateSuiteWorkspaceConfigs(\n parsed: JsonObject,\n absolutePath: string,\n errors: ValidationError[],\n): Promise<void> {\n await validateWorkspaceConfig(parsed.workspace, absolutePath, errors, 'workspace');\n if (isObject(parsed.execution)) {\n rejectRuntimeWorkspaceConfig(\n parsed.execution.workspace,\n absolutePath,\n errors,\n 'execution.workspace',\n );\n }\n}\n\nasync function validateEnvironmentConfig(\n environment: JsonValue | undefined,\n evalFilePath: string,\n errors: ValidationError[],\n location: string,\n): Promise<void> {\n if (environment === undefined) {\n return;\n }\n try {\n await resolveEnvironmentRecipe(environment, path.dirname(evalFilePath), location);\n } catch (error) {\n errors.push({\n severity: 'error',\n filePath: evalFilePath,\n location,\n message: (error as Error).message,\n });\n }\n}\n\nfunction validateTargetTestbedFields(\n target: JsonValue | undefined,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (!isObject(target)) {\n return;\n }\n for (const field of ['environment', 'container', 'install'] as const) {\n if (target[field] === undefined) {\n continue;\n }\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.${field}`,\n message:\n field === 'environment'\n ? 'Target definitions cannot include environment; author environment at suite/test/case scope.'\n : `Target definitions cannot include ${field}; use an environment recipe for testbed setup.`,\n });\n }\n}\n\nfunction validateTargetsTestbedFields(\n targets: JsonValue | undefined,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n const entries = Array.isArray(targets) ? targets : targets === undefined ? [] : [targets];\n entries.forEach((entry, index) => {\n validateTargetTestbedFields(entry, `${location}[${index}]`, filePath, errors);\n });\n}\n\nfunction validateTestExecutionFields(\n caseExecution: JsonObject,\n filePath: string,\n errors: ValidationError[],\n location: string,\n): void {\n for (const key of Object.keys(caseExecution)) {\n if (key === 'workers') {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.execution.workers`,\n message:\n 'tests[].execution.workers has been removed from eval YAML. Set authored eval concurrency with evaluate_options.max_concurrency.',\n });\n continue;\n }\n if (!KNOWN_TEST_EXECUTION_FIELDS.has(key)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.execution.${key}`,\n message: `Unsupported test execution field '${key}'.`,\n });\n }\n }\n}\n\nfunction validateAuthoredWorkers(\n parsed: JsonObject,\n filePath: string,\n errors: ValidationError[],\n): void {\n rejectWorkersField(parsed.execution, 'execution', filePath, errors);\n rejectWorkersField(parsed.experiment, 'experiment', filePath, errors);\n if (Array.isArray(parsed.tests)) {\n parsed.tests.forEach((entry, index) => {\n if (!isObject(entry)) {\n return;\n }\n rejectWorkersField(entry.execution, `tests[${index}].execution`, filePath, errors);\n });\n }\n}\n\nfunction validateExecutionPolicy(\n execution: JsonValue | undefined,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (execution === undefined) {\n return;\n }\n if (!isObject(execution)) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message: \"Invalid 'execution' field (must be an object)\",\n });\n return;\n }\n const keys = Object.keys(execution);\n if (keys.length === 0) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message:\n \"Top-level 'execution' is not part of eval YAML. Use supported top-level fields or evaluate_options for authored run controls.\",\n });\n return;\n }\n for (const key of keys) {\n if (key === 'max_concurrency') {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.${key}`,\n message:\n \"Top-level 'execution.max_concurrency' has been removed from eval YAML. Use evaluate_options.max_concurrency for authored suite concurrency.\",\n });\n continue;\n }\n if (key === 'workers') {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.${key}`,\n message:\n \"Top-level 'execution.workers' has been removed from eval YAML. Use evaluate_options.max_concurrency for authored suite concurrency.\",\n });\n continue;\n }\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.${key}`,\n message: `Unsupported execution field '${key}'. Use supported top-level fields or evaluate_options for authored run controls.`,\n });\n }\n}\n\nfunction rejectWorkersField(\n raw: JsonValue | undefined,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (!isObject(raw)) {\n return;\n }\n if (raw.workers !== undefined) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.workers`,\n message: `${location}.workers has been removed from eval YAML. Set authored eval concurrency with evaluate_options.max_concurrency.`,\n });\n }\n rejectTargetWorkers(raw.targets, `${location}.targets`, filePath, errors);\n}\n\nfunction rejectTargetWorkers(\n rawTargets: JsonValue | undefined,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (!Array.isArray(rawTargets)) {\n return;\n }\n rawTargets.forEach((target, index) => {\n if (!isObject(target) || target.workers === undefined) {\n return;\n }\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}[${index}].workers`,\n message: `${location}[${index}].workers has been removed from eval YAML. Set authored eval concurrency with evaluate_options.max_concurrency.`,\n });\n });\n}\n\nfunction rejectRuntimeWorkspaceConfig(\n workspace: JsonValue | undefined,\n filePath: string,\n errors: ValidationError[],\n location: string,\n): void {\n if (workspace === undefined) {\n return;\n }\n\n errors.push({\n severity: 'error',\n filePath,\n location,\n message: `${location} has been removed from eval YAML. Put machine-local workspace_path in .agentv/config.local.yaml under execution, or pass --workspace-path. Keep portable coding-agent testbed setup in environment.`,\n });\n}\n\nfunction collectImportEntries(parsed: JsonObject): readonly NormalizedImportEntry[] {\n const entries: NormalizedImportEntry[] = [];\n const tests = parsed.tests;\n if (Array.isArray(tests)) {\n for (let i = 0; i < tests.length; i++) {\n const entry = tests[i];\n if (!isObject(entry) || !isIncludeEntry(entry)) {\n continue;\n }\n if (entry.type !== 'suite' && entry.type !== 'tests') {\n continue;\n }\n entries.push({\n path: entry.include.trim(),\n type: entry.type,\n location: `tests[${i}].include`,\n select: entry.select,\n run: entry.run,\n legacy: true,\n });\n }\n }\n return entries;\n}\n\nasync function validateCompositionDiagnostics(\n filePath: string,\n parsed: JsonObject,\n errors: ValidationError[],\n): Promise<void> {\n const includeEntries = collectImportEntries(parsed);\n if (includeEntries.length === 0) {\n return;\n }\n\n const parentHasRuntime = hasWrapperRuntimeControls(parsed);\n const hasSuiteImport = includeEntries.some((entry) => entry.type === 'suite');\n\n if (hasSuiteImport) {\n for (const location of parentWorkspaceLocations(parsed)) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message:\n location === 'environment'\n ? 'Parent environment is not allowed with legacy tests[].include suite entries. Run eval files directly, or use tests: file://... for raw cases that should use the parent environment.'\n : 'Parent workspace is not allowed with legacy tests[].include suite entries. Run eval files directly, or use tests: file://... for raw cases that should use the parent workspace.',\n });\n }\n }\n\n for (const entry of includeEntries) {\n const resolvedSuites = await resolveSuiteIncludePaths(entry.path, path.dirname(filePath));\n\n if (entry.type === 'suite') {\n for (const resolvedSuite of resolvedSuites) {\n const childParsed = await readImportedSuite(resolvedSuite.filePath);\n if (!childParsed) {\n continue;\n }\n const runtimeFields = childRuntimeControlFields(childParsed);\n if (runtimeFields.length === 0) {\n continue;\n }\n\n errors.push({\n severity: 'warning',\n filePath,\n location: entry.location,\n message: parentHasRuntime\n ? `Imported suite '${resolvedSuite.displayPath}' defines ${runtimeFields.join(', ')}, but child target and run controls are ignored by legacy tests[].include suite imports. Prefer running eval files directly with CLI multi-file selection and tags.`\n : `Imported suite '${resolvedSuite.displayPath}' defines ${runtimeFields.join(', ')}, but child target and run controls are ignored by legacy tests[].include suite imports. Prefer running eval files directly with CLI multi-file selection and tags.`,\n });\n }\n continue;\n }\n\n if (entry.type === 'tests') {\n for (const resolvedSuite of resolvedSuites) {\n if (!/\\.eval\\.ya?ml$/i.test(resolvedSuite.filePath)) {\n continue;\n }\n errors.push({\n severity: 'warning',\n filePath,\n location: entry.location,\n message: `Legacy tests[].include with type: tests imports raw cases from eval suite '${resolvedSuite.displayPath}' and drops suite context, including child environment, workspace, input, assertions, metadata, target, and run controls. Prefer tests: file://... for raw case files.`,\n });\n }\n }\n }\n}\n\nconst WRAPPER_RUNTIME_CONTROL_FIELDS = [\n 'experiment',\n 'target',\n 'repeat',\n 'timeout_seconds',\n 'evaluate_options',\n 'threshold',\n 'default_test',\n 'on_run_complete',\n] as const;\n\nfunction hasWrapperRuntimeControls(parsed: JsonObject): boolean {\n return WRAPPER_RUNTIME_CONTROL_FIELDS.some((field) => parsed[field] !== undefined);\n}\n\nfunction childRuntimeControlFields(parsed: JsonObject): readonly string[] {\n const fields: string[] = WRAPPER_RUNTIME_CONTROL_FIELDS.filter(\n (field) => parsed[field] !== undefined,\n );\n if (parsed.execution !== undefined) {\n fields.push('execution');\n }\n if (parsed.policy !== undefined) {\n fields.push('policy');\n }\n if (parsed.model !== undefined) {\n fields.push('model');\n }\n return fields;\n}\n\nfunction parentWorkspaceLocations(parsed: JsonObject): readonly string[] {\n const locations: string[] = [];\n if (parsed.workspace !== undefined) {\n locations.push('workspace');\n }\n if (parsed.environment !== undefined) {\n locations.push('environment');\n }\n if (isObject(parsed.execution) && parsed.execution.workspace !== undefined) {\n locations.push('execution.workspace');\n }\n return locations;\n}\n\nasync function readImportedSuite(filePath: string): Promise<JsonObject | undefined> {\n try {\n const parsed = interpolateEnv(parseYamlValue(await readFile(filePath, 'utf8')), process.env);\n return isObject(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction validateIncludeEntry(\n entry: JsonObject,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n errors.push({\n severity: 'warning',\n filePath,\n location,\n message:\n entry.type === 'suite'\n ? 'tests[].include with type: suite is deprecated. Run eval files directly with CLI multi-file selection and tags instead.'\n : 'tests[].include is deprecated. Use tests: file://... or string entries inside tests: for raw case files.',\n });\n\n for (const key of Object.keys(entry)) {\n if (!KNOWN_INCLUDE_FIELDS.has(key)) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.${key}`,\n message: `Unknown field '${key}'. This field will be ignored.`,\n });\n }\n }\n\n if (typeof entry.include !== 'string' || entry.include.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.include`,\n message: \"Invalid 'include' field (must be a non-empty string)\",\n });\n }\n\n if (entry.type === undefined) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.type`,\n message: \"Missing 'type' field (must be 'suite' or 'tests')\",\n });\n } else if (entry.type !== 'suite' && entry.type !== 'tests') {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.type`,\n message: \"Invalid 'type' field (must be 'suite' or 'tests')\",\n });\n }\n\n validateIncludeSelect(entry.select, `${location}.select`, filePath, errors);\n validateRunOverride(entry.run, `${location}.run`, filePath, errors);\n}\n\nfunction validateRunOverride(\n run: JsonValue | undefined,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (run === undefined) {\n return;\n }\n if (!isObject(run)) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message: \"Invalid 'run' override (must be an object)\",\n });\n return;\n }\n\n for (const key of Object.keys(run)) {\n if (!KNOWN_RUN_OVERRIDE_FIELDS.has(key)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.${key}`,\n message:\n 'Invalid run override field. Supported fields: threshold, repeat, timeout_seconds, budget_usd.',\n });\n }\n }\n\n const threshold = run.threshold;\n if (\n threshold !== undefined &&\n (typeof threshold !== 'number' || threshold < 0 || threshold > 1)\n ) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.threshold`,\n message: \"Invalid 'threshold' field (must be a number between 0 and 1)\",\n });\n }\n\n const timeoutSeconds = run.timeout_seconds;\n if (timeoutSeconds !== undefined && (typeof timeoutSeconds !== 'number' || timeoutSeconds <= 0)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.timeout_seconds`,\n message: \"Invalid 'timeout_seconds' field (must be a positive number)\",\n });\n }\n\n const budgetUsd = run.budget_usd;\n if (budgetUsd !== undefined && (typeof budgetUsd !== 'number' || budgetUsd <= 0)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.budget_usd`,\n message: \"Invalid 'budget_usd' field (must be a positive number)\",\n });\n }\n\n validateRepeatOverride(run.repeat, `${location}.repeat`, filePath, errors);\n}\n\nfunction validateTestOptions(\n options: JsonValue | undefined,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (options === undefined) {\n return;\n }\n if (!isObject(options)) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message: \"Invalid 'options' field (must be an object)\",\n });\n return;\n }\n if (options.postprocess !== undefined) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.postprocess`,\n message: `${location}.postprocess has been removed. Use ${location}.transform instead.`,\n });\n }\n validateEvaluateOptionsRepeat(options.repeat, `${location}.repeat`, filePath, errors);\n}\n\nfunction validateDefaultTest(\n defaultTest: JsonValue | undefined,\n filePath: string,\n errors: ValidationError[],\n customAssertionTypes: ReadonlySet<string>,\n): void {\n if (defaultTest === undefined) {\n return;\n }\n if (typeof defaultTest === 'string') {\n const trimmed = defaultTest.trim();\n if (trimmed.length === 0 || (!trimmed.startsWith('file://') && !trimmed.startsWith('ref://'))) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'default_test',\n message:\n \"Invalid 'default_test' field (must be an object, file:// reference, or ref:// reference)\",\n });\n }\n return;\n }\n if (!isObject(defaultTest)) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'default_test',\n message:\n \"Invalid 'default_test' field (must be an object, file:// reference, or ref:// reference)\",\n });\n return;\n }\n\n for (const key of Object.keys(defaultTest)) {\n if (!KNOWN_DEFAULT_TEST_FIELDS.has(key)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `default_test.${key}`,\n message:\n 'Invalid default_test field. Supported fields: vars, provider, providers, prompts, provider_output, assert, assert_scoring_function, options, threshold, metadata.',\n });\n }\n }\n\n if (defaultTest.expected_output !== undefined) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'default_test.expected_output',\n message:\n \"default_test.expected_output has been removed from authored eval YAML. Put shared reference answers in default_test.vars.expected_output and consume them with an explicit assertion, for example { type: 'llm-rubric', value: 'Matches the reference answer: {{ expected_output }}' }.\",\n });\n }\n\n validateAssertArray(\n defaultTest.assert,\n 'default_test.assert',\n filePath,\n errors,\n customAssertionTypes,\n );\n validateTestOptions(defaultTest.options, 'default_test.options', filePath, errors);\n const threshold = defaultTest.threshold;\n if (\n threshold !== undefined &&\n (typeof threshold !== 'number' || threshold < 0 || threshold > 1)\n ) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'default_test.threshold',\n message: \"Invalid 'default_test.threshold' field (must be a number between 0 and 1)\",\n });\n }\n\n const options = defaultTest.options;\n if (options !== undefined && !isObject(options)) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'default_test.options',\n message: \"Invalid 'default_test.options' field (must be an object)\",\n });\n }\n}\n\nasync function validateScenarios(\n scenarios: JsonValue | undefined,\n parsed: JsonObject,\n filePath: string,\n errors: ValidationError[],\n customAssertionTypes: ReadonlySet<string>,\n): Promise<void> {\n if (scenarios === undefined) {\n return;\n }\n if (!Array.isArray(scenarios)) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'scenarios',\n message: \"Invalid 'scenarios' field (must be an array)\",\n });\n return;\n }\n\n for (let scenarioIndex = 0; scenarioIndex < scenarios.length; scenarioIndex++) {\n const scenario = scenarios[scenarioIndex];\n const scenarioLocation = `scenarios[${scenarioIndex}]`;\n if (!isObject(scenario)) {\n errors.push({\n severity: 'error',\n filePath,\n location: scenarioLocation,\n message: 'Scenario must be an object',\n });\n continue;\n }\n\n for (const key of Object.keys(scenario)) {\n if (!KNOWN_SCENARIO_FIELDS.has(key)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${scenarioLocation}.${key}`,\n message: `Unknown scenario field '${key}'.`,\n });\n }\n }\n\n if (!Array.isArray(scenario.config)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${scenarioLocation}.config`,\n message: \"Invalid 'config' field (must be an array)\",\n });\n } else {\n for (let configIndex = 0; configIndex < scenario.config.length; configIndex++) {\n await validateScenarioTestLikeRow(\n scenario.config[configIndex],\n `${scenarioLocation}.config[${configIndex}]`,\n filePath,\n errors,\n customAssertionTypes,\n { requireInput: false },\n );\n }\n }\n\n const scenarioConfigs = Array.isArray(scenario.config) ? scenario.config : [];\n\n if (!Array.isArray(scenario.tests)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${scenarioLocation}.tests`,\n message: \"Invalid 'tests' field (must be an array)\",\n });\n continue;\n }\n\n for (let testIndex = 0; testIndex < scenario.tests.length; testIndex++) {\n const test = scenario.tests[testIndex];\n const everyConfigProvidesInput =\n scenarioConfigs.length > 0 &&\n scenarioConfigs.every(\n (config) =>\n isObject(config) &&\n (config.prompts !== undefined || config.provider_output !== undefined),\n );\n const requireInput =\n isObject(test) &&\n parsed.prompts === undefined &&\n test.prompts === undefined &&\n test.provider_output === undefined &&\n !everyConfigProvidesInput;\n await validateScenarioTestLikeRow(\n test,\n `${scenarioLocation}.tests[${testIndex}]`,\n filePath,\n errors,\n customAssertionTypes,\n { requireInput },\n );\n }\n }\n}\n\nasync function validateScenarioTestLikeRow(\n row: JsonValue | undefined,\n location: string,\n filePath: string,\n errors: ValidationError[],\n customAssertionTypes: ReadonlySet<string>,\n options: { readonly requireInput: boolean },\n): Promise<void> {\n if (!isObject(row)) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message: 'Scenario row must be an object',\n });\n return;\n }\n\n for (const key of Object.keys(row)) {\n const removedMessage = REMOVED_TEST_FIELDS.get(key);\n if (removedMessage) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.${key}`,\n message: removedMessage.replaceAll('tests[]', location),\n });\n continue;\n }\n const deprecationMessage = DEPRECATED_TEST_FIELDS.get(key);\n if (deprecationMessage) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.${key}`,\n message: deprecationMessage,\n });\n } else if (!KNOWN_TEST_FIELDS.has(key)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.${key}`,\n message: `Unknown test field '${key}'.`,\n });\n }\n }\n\n const id = row.id;\n if (id !== undefined && (typeof id !== 'string' || id.trim().length === 0)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.id`,\n message: \"Invalid 'id' field (must be a non-empty string when provided)\",\n });\n }\n\n const criteria = row.criteria;\n if (criteria !== undefined && (typeof criteria !== 'string' || criteria.trim().length === 0)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.criteria`,\n message: \"Invalid 'criteria' field (must be a non-empty string if provided)\",\n });\n } else if (criteria !== undefined && row.assert !== undefined) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.criteria`,\n message:\n \"Do not combine test-level 'criteria' with 'assert'. Put human-readable case descriptions in tests[].description, or express grading text as an explicit assertion such as { type: 'llm-rubric', value: ... }.\",\n });\n }\n\n validateInputField(row.input, `${location}.input`, filePath, errors, {\n required: options.requireInput,\n });\n\n if (row.expected_output !== undefined) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.expected_output`,\n message:\n \"tests[].expected_output has been removed from authored eval YAML. Put the reference answer in tests[].vars.expected_output and consume it with an explicit assertion, for example { type: 'llm-rubric', value: 'Matches the reference answer: {{ expected_output }}' }.\",\n });\n }\n\n validateAssertArray(row.assert, `${location}.assert`, filePath, errors, customAssertionTypes);\n validateRunOverride(row.run, `${location}.run`, filePath, errors);\n validateTestOptions(row.options, `${location}.options`, filePath, errors);\n await validateEnvironmentConfig(row.environment, filePath, errors, `${location}.environment`);\n validateConversationMode(row, location, filePath, errors);\n await validateWorkspaceConfig(row.workspace, filePath, errors, `${location}.workspace`);\n\n const caseExecution = isObject(row.execution) ? row.execution : undefined;\n if (caseExecution) {\n validateTestExecutionFields(caseExecution, filePath, errors, location);\n rejectRuntimeWorkspaceConfig(\n caseExecution.workspace,\n filePath,\n errors,\n `${location}.execution.workspace`,\n );\n }\n\n const targets = row.providers !== undefined ? row.providers : row.provider;\n if (targets !== undefined) {\n validateTargetTestbedFields(targets, `${location}.providers`, filePath, errors);\n }\n}\n\nfunction validateEvaluateOptions(\n evaluateOptions: JsonValue | undefined,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (evaluateOptions === undefined) {\n return;\n }\n if (!isObject(evaluateOptions)) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message: \"Invalid 'evaluate_options' field (must be an object)\",\n });\n return;\n }\n\n for (const key of Object.keys(evaluateOptions)) {\n if (!KNOWN_EVALUATE_OPTION_FIELDS.has(key)) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.${key}`,\n message: `Unknown evaluate_options field '${key}'. This field will be ignored.`,\n });\n }\n }\n\n const budgetUsd = evaluateOptions.budget_usd;\n if (budgetUsd !== undefined && (typeof budgetUsd !== 'number' || budgetUsd <= 0)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.budget_usd`,\n message: \"Invalid 'budget_usd' field (must be a positive number)\",\n });\n }\n\n const maxConcurrency = evaluateOptions.max_concurrency;\n if (\n maxConcurrency !== undefined &&\n (typeof maxConcurrency !== 'number' ||\n !Number.isInteger(maxConcurrency) ||\n maxConcurrency < 1 ||\n maxConcurrency > 50)\n ) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.max_concurrency`,\n message: \"Invalid 'max_concurrency' field (must be an integer between 1 and 50)\",\n });\n }\n\n validateNonNegativeNumber(evaluateOptions.delay, `${location}.delay`, filePath, errors);\n validatePositiveNumber(evaluateOptions.timeout_ms, `${location}.timeout_ms`, filePath, errors);\n validatePositiveNumber(\n evaluateOptions.max_eval_time_ms,\n `${location}.max_eval_time_ms`,\n filePath,\n errors,\n );\n validateEvaluateOptionsRepeat(evaluateOptions.repeat, `${location}.repeat`, filePath, errors);\n validateFilterRange(evaluateOptions.filter_range, `${location}.filter_range`, filePath, errors);\n}\n\nfunction validatePositiveNumber(\n value: JsonValue | undefined,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (value !== undefined && (typeof value !== 'number' || value <= 0)) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message: `Invalid '${location}' field (must be a positive number)`,\n });\n }\n}\n\nfunction validateNonNegativeNumber(\n value: JsonValue | undefined,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (value !== undefined && (typeof value !== 'number' || value < 0)) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message: `Invalid '${location}' field (must be a non-negative number)`,\n });\n }\n}\n\nfunction validateEvaluateOptionsRepeat(\n repeat: JsonValue | undefined,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (repeat === undefined) {\n return;\n }\n if (typeof repeat === 'number') {\n if (!Number.isInteger(repeat) || repeat < 1) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message: \"Invalid 'evaluate_options.repeat' field (must be a positive integer)\",\n });\n }\n return;\n }\n validateRepeatOverride(repeat, location, filePath, errors);\n}\n\nfunction validateFilterRange(\n filterRange: JsonValue | undefined,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (filterRange === undefined || typeof filterRange === 'string') {\n return;\n }\n if (\n !Array.isArray(filterRange) ||\n filterRange.length !== 2 ||\n filterRange.some((value) => typeof value !== 'number')\n ) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message: \"Invalid 'evaluate_options.filter_range' field (must be a two-number array)\",\n });\n }\n}\n\nfunction validateRepeatOverride(\n repeat: JsonValue | undefined,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (repeat === undefined) {\n return;\n }\n if (!isObject(repeat)) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message: \"Invalid 'repeat' field (must be an object)\",\n });\n return;\n }\n\n for (const key of Object.keys(repeat)) {\n if (!KNOWN_REPEAT_FIELDS.has(key)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.${key}`,\n message:\n 'Invalid repeat field. Supported fields: count, strategy, early_exit, cost_limit_usd.',\n });\n }\n }\n\n if (typeof repeat.count !== 'number' || !Number.isInteger(repeat.count) || repeat.count < 1) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.count`,\n message: \"Invalid 'count' field (must be a positive integer)\",\n });\n }\n\n if (\n repeat.strategy !== undefined &&\n (typeof repeat.strategy !== 'string' || !KNOWN_REPEAT_STRATEGIES.has(repeat.strategy))\n ) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.strategy`,\n message:\n \"Invalid 'strategy' field (must be pass_any, pass_all, mean, or confidence_interval; use pass_any instead of removed pass_at_k)\",\n });\n }\n\n const earlyExit = repeat.early_exit;\n if (earlyExit !== undefined && typeof earlyExit !== 'boolean') {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.early_exit`,\n message: \"Invalid 'early_exit' field (must be a boolean)\",\n });\n }\n\n const costLimit = repeat.cost_limit_usd;\n if (costLimit !== undefined && (typeof costLimit !== 'number' || costLimit < 0)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.cost_limit_usd`,\n message: \"Invalid 'cost_limit_usd' field (must be a non-negative number)\",\n });\n }\n}\n\nfunction validateIncludeSelect(\n select: JsonValue | undefined,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (select === undefined || typeof select === 'string') {\n return;\n }\n if (Array.isArray(select)) {\n if (!select.every((value) => typeof value === 'string')) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message: \"Invalid 'select' field (array values must be strings)\",\n });\n }\n return;\n }\n if (!isObject(select)) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message: \"Invalid 'select' field (must be a string, string array, or object)\",\n });\n return;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (key !== 'test_ids' && key !== 'tags' && key !== 'metadata') {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.${key}`,\n message: `Unknown field '${key}'. This field will be ignored.`,\n });\n continue;\n }\n\n if (key === 'metadata') {\n if (!isObject(value)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.metadata`,\n message: \"Invalid 'metadata' selector (must be an object)\",\n });\n }\n continue;\n }\n\n if (\n typeof value !== 'string' &&\n !(Array.isArray(value) && value.every((entry) => typeof entry === 'string'))\n ) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.${key}`,\n message: `Invalid '${key}' selector (must be a string or string array)`,\n });\n }\n }\n}\n\nasync function validateWorkspaceConfig(\n workspace: JsonValue | undefined,\n evalFilePath: string,\n errors: ValidationError[],\n location: string,\n): Promise<void> {\n if (workspace === undefined) {\n return;\n }\n\n if (typeof workspace === 'string') {\n errors.push({\n severity: 'error',\n filePath: evalFilePath,\n location,\n message: `${location} has been removed from public eval YAML. Use environment: file://... for reusable coding-agent testbed recipes.`,\n });\n return;\n }\n\n if (isObject(workspace)) {\n validateWorkspaceRepoConfig(workspace, evalFilePath, errors, location);\n return;\n }\n}\n\nfunction validateWorkspaceRepoConfig(\n workspace: JsonObject,\n filePath: string,\n errors: ValidationError[],\n location: string,\n): void {\n const repos = workspace.repos;\n const hooks = workspace.hooks;\n const afterEachHook = isObject(hooks) ? hooks.after_each : undefined;\n const scope = workspace.scope;\n\n const docker = workspace.docker;\n let hasRemovedTestbedField = false;\n\n if (Object.keys(workspace).length === 0) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message:\n 'workspace has been removed from public eval YAML. Use environment for coding-agent testbed setup.',\n });\n return;\n }\n\n if ('template' in workspace) {\n hasRemovedTestbedField = true;\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.template`,\n message:\n 'workspace.template has been removed from public eval YAML. Use environment.workdir and environment.setup for authored testbed setup.',\n });\n }\n if ('repos' in workspace) {\n hasRemovedTestbedField = true;\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.repos`,\n message:\n 'workspace.repos has been removed from public eval YAML. Use environment.setup.command argv to materialize repositories.',\n });\n }\n if ('scope' in workspace) {\n hasRemovedTestbedField = true;\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.scope`,\n message:\n 'workspace.scope has been removed from public eval YAML. Use environment at suite/test scope and let runtime manage workspace lifetime.',\n });\n }\n if ('docker' in workspace) {\n hasRemovedTestbedField = true;\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.docker`,\n message:\n 'workspace.docker has been removed from public eval YAML. Use environment.type: docker with image or context.',\n });\n }\n if ('hooks' in workspace) {\n hasRemovedTestbedField = true;\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.hooks`,\n message:\n 'workspace.hooks has been removed from public eval YAML. Use environment.setup for testbed setup and extensions for lifecycle instrumentation.',\n });\n }\n if ('env' in workspace) {\n hasRemovedTestbedField = true;\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.env`,\n message:\n 'workspace.env has been removed from public eval YAML. Use top-level env for provider/eval variables or environment.env for environment-scoped variables.',\n });\n }\n if (hasRemovedTestbedField) {\n return;\n }\n\n if ('mode' in workspace) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.mode`,\n message:\n 'workspace.mode has been removed from eval YAML. Use --workspace-path or execution.workspace_path for machine-local existing directories, and environment for portable testbed setup.',\n });\n }\n\n if ('isolation' in workspace) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.isolation`,\n message:\n 'workspace.isolation has been removed from eval YAML. Use environment at suite/test scope and let AgentV manage runtime isolation.',\n });\n }\n\n if ('path' in workspace) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.path`,\n message:\n 'workspace.path has been removed from eval YAML. Use environment.workdir for portable testbed cwd; put existing machine-local workspace paths in .agentv/config.local.yaml execution.workspace_path or pass --workspace-path.',\n });\n }\n\n for (const key of Object.keys(workspace)) {\n if (KNOWN_REMOVED_WORKSPACE_FIELDS.has(key)) {\n continue;\n }\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.${key}`,\n message: `${location}.${key} has been removed from public eval YAML. Use environment for portable coding-agent testbed setup.`,\n });\n }\n\n if (scope !== undefined && scope !== 'suite' && scope !== 'attempt') {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.scope`,\n message: \"workspace.scope must be 'suite' or 'attempt'.\",\n });\n }\n\n if (Array.isArray(repos)) {\n for (const repo of repos) {\n if (!isObject(repo)) continue;\n\n if ('source' in repo) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.repos[path=${repo.path ?? '(none)'}]`,\n message: 'workspace.repos[].source has been removed. Use workspace.repos[].repo.',\n });\n }\n\n if ('checkout' in repo) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.repos[path=${repo.path ?? '(none)'}]`,\n message:\n 'workspace.repos[].checkout has been removed. Use top-level commit and ancestor.',\n });\n }\n\n if ('clone' in repo) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.repos[path=${repo.path ?? '(none)'}]`,\n message: 'workspace.repos[].clone has been removed. Use top-level sparse if needed.',\n });\n }\n\n if ('type' in repo) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.repos[path=${repo.path ?? '(none)'}]`,\n message: 'workspace.repos[].type has been removed. Use workspace.repos[].repo.',\n });\n }\n\n if ('resolve' in repo) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.repos[path=${repo.path ?? '(none)'}]`,\n message: 'workspace.repos[].resolve has been removed. Configure repo_resolvers instead.',\n });\n }\n\n if ('resolver' in repo) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.repos[path=${repo.path ?? '(none)'}]`,\n message:\n 'workspace.repos[].resolver has been removed. Configure repo_resolvers.repos patterns instead.',\n });\n }\n\n for (const key of Object.keys(repo)) {\n if (!SUPPORTED_WORKSPACE_REPO_FIELDS.has(key)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.repos[path=${repo.path ?? '(none)'}]`,\n message: `workspace.repos[].${key} is not supported. Supported fields: path, repo, commit, ancestor, sparse.`,\n });\n }\n }\n\n if (!repo.repo && !isObject(docker)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.repos[path=${repo.path ?? '(none)'}]`,\n message:\n 'repos[].repo is required for non-Docker workspaces. ' +\n 'Repo-less entries are only valid when workspace.docker is configured.',\n });\n }\n }\n }\n\n // after_each reset with per-attempt scope warning.\n if (isObject(afterEachHook) && afterEachHook.reset && scope === 'attempt') {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.hooks.after_each`,\n message:\n 'hooks.after_each.reset is redundant with workspace.scope: attempt (each attempt 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', 'tool'];\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, array, or object)\n // Messages with tool_calls may omit content entirely (e.g., assistant tool-call messages).\n const content = message.content;\n const hasToolCalls = 'tool_calls' in message;\n if (content === undefined && hasToolCalls) {\n // Valid: assistant message with tool_calls but no content\n } else 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 if (isObject(content)) {\n // Structured content objects (e.g., { decision: \"CLEAR\" }) are valid\n // — the runtime accepts them for expected_output and input messages.\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, array, or object)\",\n });\n }\n }\n}\n\nfunction validateInputField(\n inputField: JsonValue | undefined,\n location: string,\n filePath: string,\n errors: ValidationError[],\n options: { readonly required?: boolean } = {},\n): void {\n if (inputField === undefined) {\n if (options.required) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message:\n \"Missing prompt input. Author top-level 'prompts' and put data in default_test.vars or tests[].vars; external raw-case files may still provide internal input.\",\n });\n }\n return;\n }\n\n if (typeof inputField === 'string') {\n // String shorthand is valid.\n return;\n }\n\n if (Array.isArray(inputField)) {\n validateMessages(inputField, location, filePath, errors);\n return;\n }\n\n if (isObject(inputField)) {\n if ('role' in inputField) {\n validateMessages([inputField], location, filePath, errors);\n }\n // Structured object shorthand is valid and expands to one user message.\n return;\n }\n\n const label = location === 'input' ? \"suite-level 'input'\" : \"'input'\";\n errors.push({\n severity: 'error',\n filePath,\n location,\n message: `Invalid ${label} field (must be a string, object, or array of messages)`,\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}\n\nfunction validateTestsStringPath(\n testsPath: string,\n filePath: string,\n errors: ValidationError[],\n location = 'tests',\n): boolean {\n let normalizedPath = testsPath.startsWith('file://')\n ? testsPath.slice('file://'.length)\n : testsPath;\n const scriptFunctionMatch = normalizedPath.match(/\\.(?:mjs|cjs|js|py):[^/\\\\:]+$/i);\n if (scriptFunctionMatch) {\n normalizedPath = normalizedPath.slice(0, normalizedPath.lastIndexOf(':'));\n }\n if (/\\.eval\\.ya?ml$/i.test(normalizedPath)) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message:\n 'tests shorthand imports raw case files only. Use an include entry with type: suite to import eval suites.',\n });\n return false;\n }\n const ext = path.extname(normalizedPath);\n if (ext && !VALID_TEST_FILE_EXTENSIONS.has(ext)) {\n errors.push({\n severity: 'warning',\n filePath,\n location,\n message: `Unsupported file extension '${ext}' for tests path '${testsPath}'. Supported extensions: ${[...VALID_TEST_FILE_EXTENSIONS].join(', ')}`,\n });\n return false;\n }\n return true;\n}\n\nfunction hasGlobMagic(value: string): boolean {\n return /[*?[\\]{}()!+@]/.test(value);\n}\n\nasync function validateRawCaseImportPath(\n testsPath: string,\n filePath: string,\n location: string,\n errors: ValidationError[],\n): Promise<void> {\n if (!validateTestsStringPath(testsPath, filePath, errors, location)) {\n return;\n }\n\n const rawPath = testsPath.startsWith('file://') ? testsPath.slice('file://'.length) : testsPath;\n const absolutePath = path.resolve(path.dirname(filePath), rawPath);\n try {\n const caseFiles = hasGlobMagic(rawPath)\n ? (\n await fg(absolutePath.replaceAll('\\\\', '/'), {\n onlyFiles: true,\n absolute: true,\n })\n ).sort()\n : [absolutePath];\n\n let caseIndex = 0;\n for (const casePath of caseFiles) {\n const statPath = casePath.match(/\\.(?:mjs|cjs|js|py):[^/\\\\:]+$/i)\n ? casePath.slice(0, casePath.lastIndexOf(':'))\n : casePath;\n const pathStat = await stat(statPath).catch(() => undefined);\n const externalCases = pathStat?.isDirectory()\n ? await loadCasesFromDirectory(casePath)\n : await loadCasesFromFile(casePath);\n for (const externalCase of externalCases) {\n await validateWorkspaceConfig(\n externalCase.workspace,\n filePath,\n errors,\n `${location}[${caseIndex}].workspace`,\n );\n caseIndex += 1;\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n errors.push({\n severity: 'error',\n filePath,\n location,\n message,\n });\n }\n}\n\nasync function resolveSuiteIncludePaths(\n includePath: string,\n evalFileDir: string,\n): Promise<readonly SuiteImportStackEntry[]> {\n const absolutePattern = path.resolve(evalFileDir, includePath);\n const matches = hasGlobMagic(includePath)\n ? (\n await fg(absolutePattern.replaceAll('\\\\', '/'), {\n onlyFiles: true,\n absolute: true,\n })\n ).sort()\n : [absolutePattern];\n const seen = new Set<string>();\n const resolved: SuiteImportStackEntry[] = [];\n for (const match of matches) {\n const identity = await canonicalEvalFileIdentity(match);\n if (seen.has(identity)) {\n continue;\n }\n seen.add(identity);\n resolved.push({\n identity,\n filePath: path.resolve(match),\n displayPath: displayEvalImportPath(path.resolve(match)),\n });\n }\n return resolved;\n}\n\nasync function validateSuiteImportCycles(\n filePath: string,\n parsed: JsonObject,\n errors: ValidationError[],\n): Promise<void> {\n const root: SuiteImportStackEntry = {\n identity: await canonicalEvalFileIdentity(filePath),\n filePath,\n displayPath: displayEvalImportPath(filePath),\n };\n await validateSuiteImportCyclesFromParsed(filePath, parsed, [root], errors);\n}\n\nasync function validateSuiteImportCyclesFromParsed(\n currentFilePath: string,\n parsed: JsonObject,\n stack: readonly SuiteImportStackEntry[],\n errors: ValidationError[],\n): Promise<void> {\n const includeEntries = collectImportEntries(parsed);\n if (includeEntries.length === 0) {\n return;\n }\n\n for (const entry of includeEntries) {\n if (entry.type !== 'suite') {\n continue;\n }\n\n const resolvedSuites = await resolveSuiteIncludePaths(\n entry.path,\n path.dirname(currentFilePath),\n );\n for (const resolvedSuite of resolvedSuites) {\n if (stack.some((ancestor) => ancestor.identity === resolvedSuite.identity)) {\n errors.push({\n severity: 'error',\n filePath: currentFilePath,\n location: entry.location,\n message: `Circular eval suite import: ${formatCircularImportChain(stack, resolvedSuite)}`,\n });\n continue;\n }\n\n let childParsed: unknown;\n try {\n childParsed = interpolateEnv(\n parseYamlValue(await readFile(resolvedSuite.filePath, 'utf8')),\n process.env,\n );\n } catch {\n continue;\n }\n if (!isObject(childParsed)) {\n continue;\n }\n await validateSuiteImportCyclesFromParsed(\n resolvedSuite.filePath,\n childParsed,\n [...stack, resolvedSuite],\n errors,\n );\n }\n }\n}\n\nfunction validateAssertArray(\n assertField: JsonValue | undefined,\n location: string,\n filePath: string,\n errors: ValidationError[],\n customAssertionTypes: ReadonlySet<string> = new Set(),\n): void {\n if (assertField === undefined) {\n return;\n }\n if (!Array.isArray(assertField)) {\n errors.push({\n severity: 'warning',\n filePath,\n location,\n message: `'${location}' must be an array of assertion objects.`,\n });\n return;\n }\n\n // String items in the assert array are valid shorthand — the parser collects them\n // into a single rubrics/llm-grader evaluator. Filter them out before object validation.\n const objectItems: { item: JsonObject; index: number }[] = [];\n for (let i = 0; i < assertField.length; i++) {\n const item = assertField[i];\n if (typeof item === 'string') {\n if (item.trim().length === 0) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}[${i}]`,\n message: 'Empty string assertion item will be ignored.',\n });\n }\n continue; // Valid shorthand — skip object validation\n }\n if (!isObject(item)) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}[${i}]`,\n message: 'Assertion item must be a string or an object with a type field.',\n });\n continue;\n }\n objectItems.push({ item, index: i });\n }\n\n for (const { item, index } of objectItems) {\n const itemLocation = `${location}[${index}]`;\n\n if (item.postprocess !== undefined) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${itemLocation}.postprocess`,\n message: `${itemLocation}.postprocess has been removed. Use ${itemLocation}.transform instead.`,\n });\n }\n if (item.preprocessors !== undefined) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${itemLocation}.preprocessors`,\n message: `${itemLocation}.preprocessors has been removed from authored eval YAML. Use ${itemLocation}.transform instead.`,\n });\n }\n\n validateAssertArray(\n item.assert,\n `${itemLocation}.assert`,\n filePath,\n errors,\n customAssertionTypes,\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: `${itemLocation}.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 const staleMessage = staleAuthoredAssertionMessage(item);\n if (staleMessage) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${itemLocation}.type`,\n message: staleMessage,\n });\n continue;\n }\n\n const replacement = REMOVED_ASSERTION_TYPE_REPLACEMENTS.get(typeValue);\n if (replacement) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${itemLocation}.type`,\n message: `Unsupported assertion type '${rawTypeValue}'. Use '${replacement}' instead.`,\n });\n continue;\n }\n\n const baseTypeValue = typeValue.startsWith('not-') ? typeValue.slice(4) : typeValue;\n if (UNSUPPORTED_PROMPTFOO_ASSERTION_TYPES.has(baseTypeValue)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${itemLocation}.type`,\n message: `Unsupported promptfoo assertion type '${rawTypeValue}'. This type is future scope in AgentV and is not accepted as a custom assertion.`,\n });\n continue;\n }\n\n if (\n !isGraderKind(typeValue) &&\n !isGraderKind(baseTypeValue) &&\n !PROMPTFOO_ASSERTION_TYPES.has(typeValue) &&\n !customAssertionTypes.has(typeValue)\n ) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${itemLocation}.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: `${itemLocation}.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: `${itemLocation}.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 (\n !Array.isArray(value) ||\n value.length === 0 ||\n value.some((entry) => typeof entry !== 'string')\n ) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${itemLocation}.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, itemLocation, 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 errors.push({\n severity: 'warning',\n filePath,\n location: `${parentLocation}.required`,\n message: `Numeric 'required: ${required}' has been removed. Use 'required: true' and 'min_score: ${required}' instead.`,\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. Use 'min_score' for custom score thresholds.`,\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\n/**\n * Cross-field validation for conversation mode fields.\n * Ensures consistency between mode, turns, aggregation, on_turn_failure, window_size.\n */\nfunction validateConversationMode(\n evalCase: JsonObject,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n const mode = evalCase.mode;\n const turns = evalCase.turns;\n const aggregation = evalCase.aggregation;\n const onTurnFailure = evalCase.on_turn_failure;\n const windowSize = evalCase.window_size;\n\n const isConversationMode = mode === 'conversation';\n\n // turns present without mode: conversation\n if (turns !== undefined && !isConversationMode) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.turns`,\n message: \"'turns' requires mode: conversation\",\n });\n }\n\n // mode: conversation without turns or empty turns\n if (isConversationMode && (!Array.isArray(turns) || turns.length === 0)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.mode`,\n message: \"mode: conversation requires a non-empty 'turns' array\",\n });\n }\n\n // turns + top-level expected_output\n if (isConversationMode && Array.isArray(turns) && evalCase.expected_output !== undefined) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.expected_output`,\n message:\n \"Top-level 'expected_output' is not allowed with mode: conversation (use per-turn expected_output instead)\",\n });\n }\n\n // aggregation without mode: conversation\n if (aggregation !== undefined && !isConversationMode) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.aggregation`,\n message: \"'aggregation' requires mode: conversation\",\n });\n }\n\n // on_turn_failure without mode: conversation\n if (onTurnFailure !== undefined && !isConversationMode) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.on_turn_failure`,\n message: \"'on_turn_failure' requires mode: conversation\",\n });\n }\n\n // window_size without mode: conversation\n if (windowSize !== undefined && !isConversationMode) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.window_size`,\n message: \"'window_size' requires mode: conversation\",\n });\n }\n\n // Validate each turn has non-empty input\n if (isConversationMode && Array.isArray(turns)) {\n for (let i = 0; i < turns.length; i++) {\n const turn = turns[i];\n if (!isObject(turn)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.turns[${i}]`,\n message: 'Turn must be an object',\n });\n continue;\n }\n const turnInput = turn.input;\n const isEmpty =\n turnInput === undefined ||\n turnInput === '' ||\n (typeof turnInput === 'string' && turnInput.trim() === '') ||\n (Array.isArray(turnInput) && turnInput.length === 0);\n if (isEmpty) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}.turns[${i}].input`,\n message: 'Each turn must have a non-empty input',\n });\n }\n }\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { parseYamlValue } from '../yaml-loader.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/**\n * Validate a cases file — a YAML file whose root is an array of test case objects.\n *\n * Cases files are referenced from eval files via `tests: path/to/cases.yaml` or\n * `file://cases/accuracy.yaml` entries in the tests array. Each item must have\n * at least an `id` (non-empty string) and an `input` (string or array).\n */\nexport async function validateCasesFile(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 = parseYamlValue(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 { valid: false, filePath: absolutePath, fileType: 'cases', errors };\n }\n\n if (!Array.isArray(parsed)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n message: 'Cases file must contain a YAML array of test case objects',\n });\n return { valid: false, filePath: absolutePath, fileType: 'cases', errors };\n }\n\n for (let i = 0; i < parsed.length; i++) {\n const item = parsed[i];\n const location = `[${i}]`;\n\n if (!isObject(item)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message: 'Each test case must be an object',\n });\n continue;\n }\n\n // Required: id\n const id = item.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 // Required: input\n const input = item.input;\n if (input === undefined) {\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 } else if (typeof input !== 'string' && !Array.isArray(input)) {\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 }\n\n return {\n valid: errors.filter((e) => e.severity === 'error').length === 0,\n filePath: absolutePath,\n fileType: 'cases',\n errors,\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport {\n CLI_PLACEHOLDERS,\n COMMON_TARGET_SETTINGS,\n findDeprecatedCamelCaseTargetWarnings,\n normalizeTargetDefinition,\n} from '../providers/targets.js';\nimport { KNOWN_PROVIDERS } from '../providers/types.js';\nimport { parseYamlValue } from '../yaml-loader.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[];\nconst LEGACY_ENV_PATTERN = /\\$\\{\\{\\s*([A-Z_][A-Z0-9_]*)\\s*\\}\\}/g;\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction isEnvTemplated(value: unknown): value is string {\n return (\n typeof value === 'string' &&\n (/^\\s*\\{\\{\\s*env\\.[\\s\\S]+?\\}\\}\\s*$/.test(value) ||\n /^\\s*\\$\\{\\{\\s*[A-Z_][A-Z0-9_]*\\s*\\}\\}\\s*$/.test(value))\n );\n}\n\nfunction validateLegacyEnvTemplates(\n value: unknown,\n filePath: string,\n location: string,\n errors: ValidationError[],\n): void {\n if (typeof value === 'string') {\n for (const match of value.matchAll(LEGACY_ENV_PATTERN)) {\n const name = match[1];\n errors.push({\n severity: 'error',\n filePath,\n location,\n message: `Legacy environment syntax \\${{ ${name} }} has been removed. Use {{ env.${name} }} instead.`,\n });\n }\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((entry, index) =>\n validateLegacyEnvTemplates(entry, filePath, `${location}[${index}]`, errors),\n );\n return;\n }\n if (isObject(value)) {\n for (const [key, nested] of Object.entries(value)) {\n validateLegacyEnvTemplates(nested, filePath, `${location}.${key}`, errors);\n }\n }\n}\n\n// Cross-provider settings derived from the schema source of truth in targets.ts.\n// Adding a field to COMMON_TARGET_SETTINGS automatically makes it valid here.\nconst COMMON_SETTINGS = new Set<string>(COMMON_TARGET_SETTINGS);\n\nconst RETRY_SETTINGS = new Set([\n 'max_retries',\n 'retry_initial_delay_ms',\n 'retry_max_delay_ms',\n 'retry_backoff_factor',\n 'retry_status_codes',\n]);\n\nconst AZURE_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n ...RETRY_SETTINGS,\n 'endpoint',\n 'resource',\n 'api_key',\n 'deployment',\n 'model',\n 'version',\n 'api_version',\n 'temperature',\n 'max_output_tokens',\n]);\n\nconst OPENAI_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n ...RETRY_SETTINGS,\n 'endpoint',\n 'base_url',\n 'api_key',\n 'model',\n 'deployment',\n 'variant',\n 'api_format',\n 'temperature',\n 'max_output_tokens',\n]);\n\nconst OPENROUTER_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n ...RETRY_SETTINGS,\n 'api_key',\n 'model',\n 'deployment',\n 'variant',\n 'temperature',\n 'max_output_tokens',\n]);\n\nconst ANTHROPIC_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n ...RETRY_SETTINGS,\n 'api_key',\n 'model',\n 'deployment',\n 'variant',\n 'temperature',\n 'max_output_tokens',\n 'thinking_budget',\n]);\n\nconst GEMINI_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n ...RETRY_SETTINGS,\n 'api_key',\n 'model',\n 'deployment',\n 'variant',\n 'temperature',\n 'max_output_tokens',\n]);\n\nconst CODEX_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'endpoint',\n 'base_url',\n 'api_key',\n 'api_format',\n 'model',\n 'reasoning_effort',\n 'model_reasoning_effort',\n 'model_verbosity',\n 'sandbox_mode',\n 'approval_policy',\n 'command',\n 'cwd',\n 'timeout_seconds',\n 'log_dir',\n 'log_directory',\n 'stream_log',\n 'system_prompt',\n]);\n\nconst COPILOT_SDK_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'cli_url',\n 'cli_path',\n 'args',\n 'arguments',\n 'github_token',\n 'model',\n 'cwd',\n 'timeout_seconds',\n 'log_dir',\n 'stream_log',\n 'system_prompt',\n 'subprovider',\n 'base_url',\n 'api_key',\n 'bearer_token',\n 'api_version',\n 'api_format',\n 'model_id',\n 'wire_model',\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 'log_dir',\n 'stream_log',\n 'system_prompt',\n 'subprovider',\n 'base_url',\n 'api_key',\n 'bearer_token',\n 'api_version',\n 'api_format',\n 'model_id',\n 'wire_model',\n]);\n\nconst PI_AGENT_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'executable',\n 'command',\n 'binary',\n 'args',\n 'arguments',\n 'subprovider',\n 'model',\n 'pi_model',\n 'api_key',\n 'base_url',\n 'endpoint',\n 'tools',\n 'pi_tools',\n 'thinking',\n 'pi_thinking',\n 'reasoning_effort',\n 'cwd',\n 'timeout_seconds',\n 'log_dir',\n 'log_directory',\n 'stream_log',\n 'system_prompt',\n 'runtime',\n]);\n\nconst VSCODE_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'executable',\n 'wait',\n 'dry_run',\n 'subagent_root',\n 'timeout_seconds',\n]);\n\nconst MOCK_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'response',\n 'trace', // For testing tool-trajectory evaluator\n]);\n\nconst REPLAY_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'fixtures',\n 'execution_traces',\n 'transcripts',\n 'source_target',\n 'suite',\n 'eval_path',\n 'variant',\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 'executable',\n 'command',\n 'binary',\n 'model',\n 'cwd',\n 'timeout_seconds',\n 'log_dir',\n 'log_directory',\n 'stream_log',\n 'system_prompt',\n 'max_turns',\n 'max_budget_usd',\n]);\n\nfunction getKnownSettings(provider: string): Set<string> | null {\n const normalizedProvider = provider.toLowerCase();\n switch (normalizedProvider) {\n case 'openai':\n return OPENAI_SETTINGS;\n case 'openrouter':\n return OPENROUTER_SETTINGS;\n case 'azure':\n return AZURE_SETTINGS;\n case 'anthropic':\n return ANTHROPIC_SETTINGS;\n case 'gemini':\n return GEMINI_SETTINGS;\n case 'codex-cli':\n case 'codex-app-server':\n case 'codex-sdk':\n return CODEX_SETTINGS;\n case 'copilot-sdk':\n return COPILOT_SDK_SETTINGS;\n case 'copilot-cli':\n return COPILOT_CLI_SETTINGS;\n case 'claude-cli':\n case 'claude-sdk':\n return CLAUDE_SETTINGS;\n case 'pi-cli':\n case 'pi-rpc':\n case 'pi-sdk':\n case 'pi-coding-agent':\n return PI_AGENT_SETTINGS;\n case 'vscode':\n case 'vscode-insiders':\n return VSCODE_SETTINGS;\n case 'mock':\n return MOCK_SETTINGS;\n case 'replay':\n return REPLAY_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 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([\n 'id',\n 'name',\n 'label',\n 'provider',\n 'config',\n 'prompts',\n 'transform',\n 'delay',\n 'env',\n 'grader_target',\n 'judge_target',\n 'use_target',\n 'workers',\n '$schema',\n 'targets',\n ]);\n\n const removedFields = new Set(['workspace_template', 'workspaceTemplate']);\n // Provider-specific removed fields. Map value is the migration message.\n const removedPerProvider: Record<string, Map<string, string>> = {\n azure: new Map([\n [\n 'api_format',\n \"The 'api_format' field has been removed from Azure targets. \" +\n \"AgentV always uses Azure's Responses API (`/openai/v1/responses`). \" +\n \"If your deployment only exposes /chat/completions, use 'provider: openai' \" +\n \"with a deployment-scoped 'base_url' instead.\",\n ],\n ]),\n };\n const removedForProvider = removedPerProvider[provider];\n\n for (const key of Object.keys(target)) {\n if (removedFields.has(key)) {\n errors.push({\n severity: 'warning',\n filePath: absolutePath,\n location: `${location}.${key}`,\n message:\n 'workspace_template has been removed from targets. Use eval-level environment.workdir and environment.setup instead.',\n });\n continue;\n }\n if (key === 'log_format' || key === 'log_output_format') {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.${key}`,\n message: `The '${key}' field has been removed. Use 'stream_log: raw' for per-event logs or 'stream_log: summary' for consolidated logs.`,\n });\n continue;\n }\n if (key === 'provider_batching') {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.${key}`,\n message: \"The 'provider_batching' field has been removed. Use 'batch_requests' instead.\",\n });\n continue;\n }\n if (removedForProvider?.has(key)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.${key}`,\n message: removedForProvider.get(key) as string,\n });\n continue;\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 let rawParsed: unknown;\n try {\n const content = await readFile(absolutePath, 'utf8');\n rawParsed = parseYamlValue(content);\n parsed = rawParsed;\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;\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}.timeout_seconds`,\n message: 'healthcheck.timeout_seconds 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 if (Array.isArray(parsed.providers)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'providers',\n message:\n \"Top-level 'providers' is not a runtime alias in targets.yaml. Use 'targets' for systems under test; provider names backend kind inside each target.\",\n });\n }\n\n // Validate targets array\n const targets = parsed.targets;\n const rawTargets =\n isObject(rawParsed) && Array.isArray(rawParsed.targets) ? rawParsed.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: readonly string[] = [...KNOWN_PROVIDERS];\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 validateLegacyEnvTemplates(rawTargets[i] ?? target, absolutePath, location, errors);\n\n let normalizedTarget: JsonObject | undefined;\n try {\n normalizedTarget = normalizeTargetDefinition(target) as unknown as JsonObject;\n } catch (error) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message: (error as Error).message,\n });\n }\n\n for (const warning of findDeprecatedCamelCaseTargetWarnings(\n normalizedTarget ?? target,\n location,\n )) {\n const fieldMatch = warning.message.match(/field '([^']+)'/);\n const replacementMatch = warning.message.match(/Use '([^']+)' instead/);\n const field = fieldMatch?.[1] ?? 'unknown';\n const replacement = replacementMatch?.[1] ?? 'snake_case';\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: warning.location,\n message: `camelCase field '${field}' is no longer supported in targets.yaml. Use '${replacement}' instead.`,\n });\n }\n\n // Required field: id. AgentV target identity is separate from provider.\n const id = target.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 if (typeof target.label === 'string' && target.label.trim().length > 0) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.label`,\n message: \"The target 'label' field has been removed. Use 'id' instead.\",\n });\n }\n if (typeof target.name === 'string' && target.name.trim().length > 0) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.name`,\n message: \"The target 'name' field has been removed. Use 'id' instead.\",\n });\n }\n\n // Required field: provider\n const effectiveTarget = normalizedTarget ?? target;\n const provider = effectiveTarget.provider;\n const rawTarget = rawTargets[i];\n const rawUseTarget = isObject(rawTarget) ? rawTarget.use_target : undefined;\n if (effectiveTarget.use_target !== undefined || rawUseTarget !== undefined) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.use_target`,\n message:\n \"The 'use_target' field has been removed from authored targets.yaml target definitions. Define a concrete target with 'provider' instead.\",\n });\n }\n const providerValue = typeof provider === 'string' ? provider.trim().toLowerCase() : undefined;\n const isTemplated = isEnvTemplated(provider);\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 (!isTemplated && (providerValue === 'claude' || providerValue === 'copilot')) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.provider`,\n message: `Ambiguous provider '${providerValue}' is not supported. Choose an explicit provider such as '${providerValue}-cli' or '${providerValue}-sdk'.`,\n });\n } else if (typeof provider === 'string' && !isTemplated && !knownProviders.includes(provider)) {\n // Warning for unknown providers (non-fatal); skip when provider uses {{ env.VAR }}\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(effectiveTarget, absolutePath, location, errors);\n }\n if (providerValue === 'replay') {\n const hasFixtures = isNonEmptyString(effectiveTarget.fixtures);\n const hasExecutionTraces = isNonEmptyString(effectiveTarget.execution_traces);\n const hasTranscripts = isNonEmptyString(effectiveTarget.transcripts);\n const sourceCount =\n (hasFixtures ? 1 : 0) + (hasExecutionTraces ? 1 : 0) + (hasTranscripts ? 1 : 0);\n if (sourceCount !== 1) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message:\n \"Replay provider requires exactly one replay source: 'fixtures', 'execution_traces', or 'transcripts'\",\n });\n }\n if (!isNonEmptyString(effectiveTarget.source_target)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.source_target`,\n message: \"Replay provider requires 'source_target' as a non-empty string\",\n });\n }\n }\n\n // Check for unknown settings properties on target object\n if (typeof provider === 'string' && !isTemplated) {\n validateUnknownSettings(effectiveTarget, provider, absolutePath, location, errors);\n }\n\n if (effectiveTarget.judge_target !== undefined) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.judge_target`,\n message: \"The 'judge_target' field has been removed. Use 'grader_target' instead.\",\n });\n }\n\n // Optional field: grader_target (must be string if present)\n if (\n effectiveTarget.grader_target !== undefined &&\n typeof effectiveTarget.grader_target !== 'string'\n ) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.grader_target`,\n message: \"Invalid 'grader_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 path from 'node:path';\n\nimport { getLocalConfigPath } from '../../config-overlays.js';\nimport { getAgentvConfigDir } from '../../paths.js';\nimport { interpolateEnv } from '../interpolation.js';\nimport {\n normalizeComposableConfigGraph,\n resolveConfigFieldReferences,\n} from '../loaders/config-graph.js';\nimport { parseYamlValue } from '../yaml-loader.js';\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(\n filePath: string,\n options: { scope?: 'project' | 'global' } = {},\n): Promise<ValidationResult> {\n const errors: ValidationError[] = [];\n const scope = options.scope ?? inferConfigScope(filePath);\n\n try {\n const content = await readFile(filePath, 'utf8');\n const parsed = interpolateEnv(parseYamlValue(content), process.env);\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 let config: Record<string, unknown>;\n try {\n config = await resolveConfigFieldReferences(parsed as Record<string, unknown>, filePath);\n } catch (error) {\n errors.push({\n severity: 'error',\n filePath,\n message: (error as Error).message,\n });\n return { valid: false, filePath, fileType: 'config', errors };\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 // Validate required_version if present\n const requiredVersion = config.required_version;\n if (requiredVersion !== undefined) {\n if (typeof requiredVersion !== 'string' || requiredVersion.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'required_version',\n message: 'Field \\'required_version\\' must be a non-empty string (e.g. \">=3.1.0\")',\n });\n }\n }\n\n validateResultsConfig(errors, filePath, config.results, 'results');\n validateRepoResolversConfig(errors, filePath, config.repo_resolvers);\n validateRefsConfig(errors, filePath, config.refs);\n validateComposableGraph(errors, filePath, config);\n validateDashboardConfig(errors, filePath, config.dashboard);\n validateHooksConfig(errors, filePath, config.hooks);\n validateEnvPathConfig(errors, filePath, config.env_path);\n validateEnvFromConfig(errors, filePath, config.env_from);\n\n const projects = config.projects;\n if (projects !== undefined) {\n if (scope === 'project') {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'projects',\n message:\n \"Field 'projects' is only valid in $AGENTV_HOME/config.yaml. Ignoring project registry entries in project-local .agentv/config.yaml.\",\n });\n } else if (!Array.isArray(projects)) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'projects',\n message: \"Field 'projects' must be an array\",\n });\n } else {\n validateProjects(errors, filePath, projects);\n }\n }\n\n const allowedFields = new Set([\n '$schema',\n 'eval_patterns',\n 'required_version',\n 'execution',\n 'results',\n 'repo_resolvers',\n 'refs',\n 'targets',\n 'graders',\n 'tests',\n 'defaults',\n 'projects',\n 'dashboard',\n 'studio',\n 'hooks',\n 'env_path',\n 'env_from',\n ]);\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\nfunction validateComposableGraph(\n errors: ValidationError[],\n filePath: string,\n config: Record<string, unknown>,\n): void {\n try {\n normalizeComposableConfigGraph(config, filePath);\n } catch (error) {\n addError(errors, filePath, undefined, (error as Error).message);\n }\n}\n\nfunction validateDashboardConfig(\n errors: ValidationError[],\n filePath: string,\n rawDashboard: unknown,\n): void {\n if (rawDashboard === undefined) {\n return;\n }\n if (!isPlainObject(rawDashboard)) {\n addError(errors, filePath, 'dashboard', \"Field 'dashboard' must be an object\");\n return;\n }\n if (Object.prototype.hasOwnProperty.call(rawDashboard, 'app_name')) {\n addError(\n errors,\n filePath,\n 'dashboard.app_name',\n \"Field 'dashboard.app_name' has been removed; the Dashboard app name is not user-configurable.\",\n );\n }\n}\n\nconst ENV_FROM_FORMATS = new Set(['shell_exports', 'json']);\n\nfunction validateHooksConfig(errors: ValidationError[], filePath: string, rawHooks: unknown): void {\n if (rawHooks === undefined || rawHooks === null) {\n return;\n }\n if (!isPlainObject(rawHooks)) {\n addError(errors, filePath, 'hooks', \"Field 'hooks' must be an object\");\n return;\n }\n\n if (rawHooks.before_session !== undefined) {\n validateOptionalString(errors, filePath, rawHooks.before_session, 'hooks.before_session');\n errors.push({\n severity: 'warning',\n filePath,\n location: 'hooks.before_session',\n message:\n \"'hooks.before_session' is deprecated; use 'env_path' and/or 'env_from' to load environment variables before validation and eval.\",\n });\n }\n}\n\nfunction validateEnvPathConfig(\n errors: ValidationError[],\n filePath: string,\n rawEnvPath: unknown,\n): void {\n if (rawEnvPath === undefined || rawEnvPath === null) {\n return;\n }\n\n const isList = Array.isArray(rawEnvPath);\n const entries = isList ? rawEnvPath : [rawEnvPath];\n entries.forEach((entry, index) => {\n const location = isList ? `env_path[${index}]` : 'env_path';\n if (typeof entry !== 'string' || entry.trim().length === 0) {\n addError(errors, filePath, location, `Field '${location}' must be a non-empty string`);\n }\n });\n}\n\nfunction validateEnvFromConfig(\n errors: ValidationError[],\n filePath: string,\n rawEnvFrom: unknown,\n): void {\n if (rawEnvFrom === undefined || rawEnvFrom === null) {\n return;\n }\n\n const isList = Array.isArray(rawEnvFrom);\n const entries = isList ? rawEnvFrom : [rawEnvFrom];\n entries.forEach((entry, index) => {\n const location = isList ? `env_from[${index}]` : 'env_from';\n if (!isPlainObject(entry)) {\n addError(errors, filePath, location, `Field '${location}' must be an object`);\n return;\n }\n\n const command = entry.command;\n if (typeof command === 'string') {\n addError(\n errors,\n filePath,\n `${location}.command`,\n `Field '${location}.command' must be an argv array of strings, not a shell command string. Use e.g. [\"bun\", \"scripts/load-secrets.ts\"].`,\n );\n } else if (\n !Array.isArray(command) ||\n command.length === 0 ||\n !command.every((part) => typeof part === 'string' && part.length > 0)\n ) {\n addError(\n errors,\n filePath,\n `${location}.command`,\n `Field '${location}.command' must be a non-empty array of strings`,\n );\n }\n\n if (entry.format !== undefined && !ENV_FROM_FORMATS.has(entry.format as string)) {\n addError(\n errors,\n filePath,\n `${location}.format`,\n `Field '${location}.format' must be \"shell_exports\" or \"json\"`,\n );\n }\n });\n}\n\nfunction validateRefsConfig(errors: ValidationError[], filePath: string, rawRefs: unknown): void {\n if (rawRefs === undefined) {\n return;\n }\n if (!isPlainObject(rawRefs)) {\n addError(errors, filePath, 'refs', \"Field 'refs' must be an object\");\n return;\n }\n\n for (const [name, value] of Object.entries(rawRefs)) {\n if (name.trim().length === 0) {\n addError(errors, filePath, 'refs', \"Field 'refs' has an empty ref name\");\n }\n if (typeof value !== 'string' || value.trim().length === 0) {\n addError(errors, filePath, `refs.${name}`, `Field 'refs.${name}' must be a non-empty string`);\n }\n }\n}\n\nfunction validateRepoResolversConfig(\n errors: ValidationError[],\n filePath: string,\n rawResolvers: unknown,\n): void {\n if (rawResolvers === undefined) {\n return;\n }\n\n if (!Array.isArray(rawResolvers)) {\n addError(errors, filePath, 'repo_resolvers', \"Field 'repo_resolvers' must be an array\");\n return;\n }\n\n const seenNames = new Set<string>();\n let defaultCount = 0;\n\n rawResolvers.forEach((resolver, index) => {\n const location = `repo_resolvers[${index}]`;\n if (!isPlainObject(resolver)) {\n addError(errors, filePath, location, `Field '${location}' must be an object`);\n return;\n }\n\n const name = resolver.name;\n if (typeof name !== 'string' || name.trim().length === 0) {\n addError(\n errors,\n filePath,\n `${location}.name`,\n `Field '${location}.name' must be a non-empty string`,\n );\n } else {\n const trimmedName = name.trim();\n if (seenNames.has(trimmedName)) {\n addError(\n errors,\n filePath,\n `${location}.name`,\n `Duplicate repo resolver name '${trimmedName}'`,\n );\n }\n seenNames.add(trimmedName);\n\n if (trimmedName === 'default') {\n defaultCount += 1;\n if (resolver.repos !== undefined) {\n addError(\n errors,\n filePath,\n `${location}.repos`,\n \"Repo resolver named 'default' must not declare repos\",\n );\n }\n }\n }\n\n const command = resolver.command;\n if (\n !Array.isArray(command) ||\n !command.every((entry) => typeof entry === 'string') ||\n command.length === 0\n ) {\n addError(\n errors,\n filePath,\n `${location}.command`,\n `Field '${location}.command' must be a non-empty string array`,\n );\n }\n\n const repos = resolver.repos;\n if (\n repos !== undefined &&\n (!Array.isArray(repos) ||\n repos.length === 0 ||\n !repos.every((entry) => typeof entry === 'string' && entry.trim().length > 0))\n ) {\n addError(\n errors,\n filePath,\n `${location}.repos`,\n `Field '${location}.repos' must be a non-empty string array when set`,\n );\n }\n\n if (resolver.config !== undefined && !isPlainObject(resolver.config)) {\n addError(\n errors,\n filePath,\n `${location}.config`,\n `Field '${location}.config' must be an object when set`,\n );\n }\n });\n\n if (defaultCount > 1) {\n addError(errors, filePath, 'repo_resolvers', \"Duplicate repo resolver named 'default'\");\n }\n}\n\nfunction inferConfigScope(filePath: string): 'project' | 'global' {\n const globalConfigPath = path.resolve(getAgentvConfigDir(), 'config.yaml');\n const globalLocalConfigPath = path.resolve(getLocalConfigPath(globalConfigPath));\n const resolvedPath = path.resolve(filePath);\n if (resolvedPath === globalConfigPath || resolvedPath === globalLocalConfigPath) {\n return 'global';\n }\n return filePath.split(/[\\\\/]/).includes('.agentv') ? 'project' : 'global';\n}\n\nfunction validateProjects(errors: ValidationError[], filePath: string, projects: unknown[]): void {\n projects.forEach((project, index) => {\n const location = `projects[${index}]`;\n if (typeof project !== 'object' || project === null || Array.isArray(project)) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message: `Field '${location}' must be an object`,\n });\n return;\n }\n\n const projectRecord = project as Record<string, unknown>;\n validateRequiredString(errors, filePath, projectRecord.id, `${location}.id`);\n validateProjectRepoConfig(errors, filePath, projectRecord, location);\n validateProjectResultsConfig(errors, filePath, projectRecord.results, `${location}.results`);\n });\n}\n\nfunction addError(\n errors: ValidationError[],\n filePath: string,\n location: string | undefined,\n message: string,\n): void {\n errors.push({ severity: 'error', filePath, ...(location ? { location } : {}), message });\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction validateRequiredString(\n errors: ValidationError[],\n filePath: string,\n value: unknown,\n location: string,\n): void {\n if (typeof value !== 'string' || value.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath,\n location,\n message: `Field '${location}' must be a non-empty string`,\n });\n }\n}\n\nfunction validateOptionalString(\n errors: ValidationError[],\n filePath: string,\n value: unknown,\n location: string,\n): void {\n if (value !== undefined && (typeof value !== 'string' || value.trim().length === 0)) {\n addError(errors, filePath, location, `Field '${location}' must be a non-empty string`);\n }\n}\n\nfunction validateProjectRepoConfig(\n errors: ValidationError[],\n filePath: string,\n projectRecord: Record<string, unknown>,\n location: string,\n): void {\n // Source repo is flat: required local checkout `path`, optional `repo`\n // (slug or Git URL), and optional `branch`.\n validateRequiredString(errors, filePath, projectRecord.path, `${location}.path`);\n validateOptionalString(errors, filePath, projectRecord.repo, `${location}.repo`);\n validateOptionalString(errors, filePath, projectRecord.branch, `${location}.branch`);\n}\n\nfunction validateResultsConfigBody(\n errors: ValidationError[],\n filePath: string,\n rawResults: unknown,\n location: string,\n): void {\n if (rawResults === undefined) {\n return;\n }\n\n if (!isPlainObject(rawResults)) {\n addError(errors, filePath, location, `Field '${location}' must be an object`);\n return;\n }\n\n const r = rawResults;\n\n if (r.mode !== undefined) {\n addError(\n errors,\n filePath,\n `${location}.mode`,\n `Remove '${location}.mode'; results use '${location}.repo' and '${location}.path'.`,\n );\n }\n\n validateOptionalString(errors, filePath, r.repo, `${location}.repo`);\n validateOptionalString(errors, filePath, r.path, `${location}.path`);\n validateOptionalString(errors, filePath, r.branch, `${location}.branch`);\n\n if (r.repo === undefined && r.path === undefined) {\n addError(errors, filePath, location, `Field '${location}' must set repo or path`);\n }\n\n if (r.auto_push !== undefined && typeof r.auto_push !== 'boolean') {\n addError(\n errors,\n filePath,\n `${location}.auto_push`,\n `Field '${location}.auto_push' must be a boolean`,\n );\n }\n}\n\nfunction validateProjectResultsConfig(\n errors: ValidationError[],\n filePath: string,\n rawResults: unknown,\n location: string,\n): void {\n validateResultsConfigBody(errors, filePath, rawResults, location);\n}\n\nfunction validateResultsConfig(\n errors: ValidationError[],\n filePath: string,\n rawResults: unknown,\n location: string,\n): void {\n validateResultsConfigBody(errors, filePath, rawResults, location);\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { buildSearchRoots, findGitRoot, resolveFileReference } from '../file-utils.js';\nimport { parseYamlValue } from '../yaml-loader.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 = parseYamlValue(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 const cases: JsonValue | undefined = parsed.tests;\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 { access, readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { parseYamlValue } from '../yaml-loader.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 workspace template and hook script paths in eval files exist.\n *\n * Catches two classes of errors that surface as `setup_error` at runtime but are\n * detectable statically:\n *\n * 1. `workspace.template` — the template path must exist.\n * 2. `workspace.hooks.*.command` — script arguments that look like relative file\n * paths (start with `./`/`../` or carry a script extension) must resolve to\n * existing files using the same cwd precedence the runtime uses:\n * `hook.cwd ?? workspaceFileDir ?? evalDir`\n *\n * When `workspace` is a string path to an external file, that file is also read\n * and its template/hook paths are checked relative to the workspace file's directory.\n * (The workspace file's existence itself is already checked by eval-validator.)\n */\nexport async function validateWorkspacePaths(\n evalFilePath: string,\n): Promise<readonly ValidationError[]> {\n const errors: ValidationError[] = [];\n const absolutePath = path.resolve(evalFilePath);\n const evalDir = path.dirname(absolutePath);\n\n let parsed: unknown;\n try {\n const content = await readFile(absolutePath, 'utf8');\n parsed = parseYamlValue(content);\n } catch {\n // Parse errors are already caught by eval-validator\n return errors;\n }\n\n if (!isObject(parsed)) return errors;\n\n const workspaceRaw = parsed.workspace;\n if (workspaceRaw === undefined || workspaceRaw === null) return errors;\n\n if (typeof workspaceRaw === 'string') {\n // External workspace file — existence is already checked by eval-validator.\n // Read and check template/hook paths inside the external file.\n const workspaceFilePath = path.resolve(evalDir, workspaceRaw);\n try {\n const wsContent = await readFile(workspaceFilePath, 'utf8');\n const wsParsed = parseYamlValue(wsContent);\n if (isObject(wsParsed)) {\n const wsDir = path.dirname(workspaceFilePath);\n await validateWorkspaceObject(wsParsed, wsDir, absolutePath, 'workspace', errors);\n }\n } catch {\n // File missing or invalid YAML — eval-validator already reports this\n }\n } else if (isObject(workspaceRaw)) {\n await validateWorkspaceObject(workspaceRaw, evalDir, absolutePath, 'workspace', errors);\n }\n\n return errors;\n}\n\nasync function validateWorkspaceObject(\n obj: JsonObject,\n baseDir: string,\n evalFilePath: string,\n location: string,\n errors: ValidationError[],\n): Promise<void> {\n // Check template path\n const template = obj.template;\n if (typeof template === 'string') {\n const templatePath = path.isAbsolute(template) ? template : path.resolve(baseDir, template);\n if (!(await fileExists(templatePath))) {\n errors.push({\n severity: 'error',\n filePath: evalFilePath,\n location: `${location}.template`,\n message: `Template path not found: ${template} (resolved to ${templatePath})`,\n });\n }\n }\n\n // Check hook script paths\n const hooks = obj.hooks;\n if (!isObject(hooks)) return;\n\n for (const hookName of ['before_all', 'before_each', 'after_each', 'after_all'] as const) {\n const hook = hooks[hookName];\n if (!isObject(hook)) continue;\n if ('script' in hook) {\n errors.push({\n severity: 'error',\n filePath: evalFilePath,\n location: `${location}.hooks.${hookName}.script`,\n message: \"Workspace hook field 'script' has been removed. Use 'command' instead.\",\n });\n continue;\n }\n\n // Resolve hook cwd the same way yaml-parser does at parse time:\n // config.cwd (resolved against baseDir) ?? baseDir\n // baseDir = workspaceFileDir for external workspace files, evalDir for inline.\n const hookCwdRaw = typeof hook.cwd === 'string' ? hook.cwd : undefined;\n const hookCwd = hookCwdRaw\n ? path.isAbsolute(hookCwdRaw)\n ? hookCwdRaw\n : path.resolve(baseDir, hookCwdRaw)\n : baseDir;\n\n const command = hook.command;\n if (!Array.isArray(command)) continue;\n\n for (let i = 0; i < command.length; i++) {\n const arg = command[i];\n if (typeof arg !== 'string') continue;\n if (!looksLikeFilePath(arg)) continue;\n\n const resolved = path.isAbsolute(arg) ? arg : path.resolve(hookCwd, arg);\n if (!(await fileExists(resolved))) {\n errors.push({\n severity: 'error',\n filePath: evalFilePath,\n location: `${location}.hooks.${hookName}.command[${i}]`,\n message: `Hook script not found: ${arg} (resolved to ${resolved})`,\n });\n }\n }\n }\n}\n\n/**\n * Heuristic: does this command argument look like a file path rather than a\n * system binary name?\n *\n * Detects:\n * - Explicit relative paths: `./foo`, `../bar/baz`\n * - Script-extension arguments: `setup.mjs`, `scripts/init.sh`\n */\nfunction looksLikeFilePath(arg: string): boolean {\n if (arg.startsWith('./') || arg.startsWith('../')) return true;\n const scriptExtensions = [\n '.mjs',\n '.cjs',\n '.js',\n '.ts',\n '.sh',\n '.bash',\n '.zsh',\n '.py',\n '.rb',\n '.pl',\n ];\n return scriptExtensions.some((ext) => arg.endsWith(ext));\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n","import {\n type EvalTargetSpec,\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\n/**\n * Resolve a target definition, following alias chains.\n *\n * If a target has an `alias` field (supports ${{ ENV_VAR }} syntax),\n * it is resolved to the referenced target. This allows a single env var\n * to switch the entire provider config:\n *\n * - name: default\n * alias: ${{ AGENT_TARGET }} # e.g. \"copilot-cli\"\n *\n * use_target chains are followed up to 5 levels deep to prevent cycles.\n */\nfunction resolveUseTarget(\n name: string,\n definitions: readonly TargetDefinition[],\n env: NodeJS.ProcessEnv,\n targetsFilePath: string,\n): TargetDefinition {\n const maxDepth = 5;\n let current: TargetDefinition | undefined = definitions.find((d) => d.name === name);\n if (!current) {\n const available = listTargetNames(definitions).join(', ');\n throw new Error(\n `Target '${name}' not found in ${targetsFilePath}. Available targets: ${available}`,\n );\n }\n\n for (let depth = 0; depth < maxDepth; depth++) {\n const useTarget = current.use_target;\n if (useTarget === undefined || useTarget === null) break;\n const raw: string = String(useTarget).trim();\n if (raw.length === 0) break;\n\n // Resolve ${{ ENV_VAR }} syntax\n const envMatch: RegExpMatchArray | null = raw.match(/^\\$\\{\\{\\s*([A-Z0-9_]+)\\s*\\}\\}$/i);\n const resolved: string = envMatch ? (env[envMatch[1]] ?? '') : raw;\n if (resolved.trim().length === 0) break;\n\n const next: TargetDefinition | undefined = definitions.find((d) => d.name === resolved.trim());\n if (!next) {\n const available = listTargetNames(definitions).join(', ');\n throw new Error(\n `Target '${name}' use_target '${resolved.trim()}' not found in ${targetsFilePath}. Available targets: ${available}`,\n );\n }\n current = next;\n }\n\n return current;\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 targetLabel?: string;\n readonly targetSource: 'cli' | 'test-file' | 'default';\n readonly targetsFilePath: string;\n /** Per-target hooks from eval file (eval-level customization) */\n readonly targetHooks?: import('@agentv/core').TargetHooksConfig;\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 fileTargetName?: string;\n readonly fileTargetSpec?: EvalTargetSpec;\n readonly modelOverride?: string;\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\nfunction withModelOverride(\n target: TargetDefinition,\n modelOverride: string | undefined,\n): TargetDefinition {\n const model = modelOverride?.trim();\n return model && model.length > 0 ? { ...target, model } : target;\n}\n\nfunction overlayTargetDefinition(params: {\n readonly spec: EvalTargetSpec | undefined;\n readonly definitions: readonly TargetDefinition[];\n readonly env: NodeJS.ProcessEnv;\n readonly targetsFilePath: string;\n}): TargetDefinition | undefined {\n const { spec, definitions, env, targetsFilePath } = params;\n if (!spec?.definition) {\n return undefined;\n }\n if (spec.extends) {\n const base = resolveUseTarget(spec.extends, definitions, env, targetsFilePath);\n return {\n ...base,\n ...spec.definition,\n name: spec.name,\n };\n }\n return spec.definition;\n}\n\nfunction definitionsWithEffectiveTarget(\n definitions: readonly TargetDefinition[],\n effective: TargetDefinition,\n): readonly TargetDefinition[] {\n return [effective, ...definitions.filter((definition) => definition.name !== effective.name)];\n}\n\nexport async function selectTarget(options: TargetSelectionOptions): Promise<TargetSelection> {\n const { testFilePath, repoRoot, cwd, explicitTargetsPath, cliTargetName, modelOverride, 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 fileTargetSpec = options.fileTargetSpec;\n const fileTargetName =\n options.fileTargetName ?? fileTargetSpec?.name ?? (await readTestSuiteTarget(testFilePath));\n const targetChoice = pickTargetName({ cliTargetName, fileTargetName });\n\n const overlayDefinition =\n targetChoice.source === 'test-file'\n ? overlayTargetDefinition({ spec: fileTargetSpec, definitions, env, targetsFilePath })\n : undefined;\n const targetDefinition = withModelOverride(\n overlayDefinition ?? resolveUseTarget(targetChoice.name, definitions, env, targetsFilePath),\n modelOverride,\n );\n const effectiveDefinitions =\n overlayDefinition !== undefined\n ? definitionsWithEffectiveTarget(definitions, targetDefinition)\n : definitions;\n\n try {\n const resolvedTarget = resolveTargetDefinition(targetDefinition, env, testFilePath, {\n emitDeprecationWarnings: false,\n });\n return {\n definitions: effectiveDefinitions,\n resolvedTarget,\n targetName: targetChoice.name,\n targetSource: targetChoice.source,\n targetsFilePath,\n ...(targetChoice.source === 'test-file' && fileTargetSpec?.hooks\n ? { targetHooks: fileTargetSpec.hooks }\n : {}),\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 & {\n readonly targetNames: readonly string[];\n readonly targetRefs?: readonly import('@agentv/core').EvalTargetRef[];\n readonly targetSource?: 'cli' | 'test-file';\n },\n): Promise<readonly TargetSelection[]> {\n const {\n testFilePath,\n repoRoot,\n cwd,\n explicitTargetsPath,\n env,\n targetNames,\n targetRefs,\n modelOverride,\n } = options;\n\n // Build a lookup for target hooks from eval target refs\n const hooksMap = new Map<string, import('@agentv/core').TargetHooksConfig>();\n const labelsMap = new Map<string, string>();\n if (targetRefs) {\n for (const ref of targetRefs) {\n if (ref.hooks) {\n hooksMap.set(ref.name, ref.hooks);\n }\n if (ref.label) {\n labelsMap.set(ref.name, ref.label);\n }\n }\n }\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 fileDefinitions = await readTargetDefinitions(targetsFilePath);\n\n // Inject synthetic definitions from eval target refs (for use_target delegation)\n const definitions = [...fileDefinitions];\n if (targetRefs) {\n for (const ref of targetRefs) {\n if (ref.definition && !fileDefinitions.some((d) => d.name === ref.name)) {\n definitions.push(ref.definition);\n } else if (ref.use_target && !fileDefinitions.some((d) => d.name === ref.name)) {\n definitions.push({ name: ref.name, use_target: ref.use_target } as TargetDefinition);\n }\n }\n }\n\n const results: TargetSelection[] = [];\n\n for (const name of targetNames) {\n const targetDefinition = withModelOverride(\n resolveUseTarget(name, definitions, env, targetsFilePath),\n modelOverride,\n );\n const hooks = hooksMap.get(name);\n const targetLabel = labelsMap.get(name);\n\n try {\n const resolvedTarget = resolveTargetDefinition(targetDefinition, env, testFilePath, {\n emitDeprecationWarnings: false,\n });\n results.push({\n definitions,\n resolvedTarget,\n targetName: name,\n ...(targetLabel ? { targetLabel } : {}),\n targetSource: options.targetSource ?? 'cli',\n targetsFilePath,\n ...(hooks && { targetHooks: hooks }),\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 return results;\n}\n","/**\n * WIP (work-in-progress) checkpoint loop for in-progress eval runs.\n *\n * Periodically force-pushes the partial run output directory to a unique\n * non-default branch (`agentv/wip/<hostname>/<run-dir-basename>`) in the\n * configured results repository. This protects against pod/process loss by\n * keeping completed-test results durable without requiring PVC or S3.\n *\n * Branch lifecycle:\n * 1. Start: set up a persistent git worktree for the WIP branch.\n * 2. Running: every ~30s, copy run dir → worktree, amend-commit, force-push.\n * 3. Success: after final publish to the normal results branch, delete the WIP branch.\n * 4. Failure: leave the WIP branch for manual recovery.\n *\n * Manual recovery from a WIP branch:\n * git clone <results-repo> /tmp/recovery\n * cd /tmp/recovery && git checkout agentv/wip/<hostname>/<run-dir>\n * cp -r <run-id> <project>/.agentv/results/\n * agentv eval <eval-file> --output <project>/.agentv/results/<run-id> --resume\n *\n * All checkpoint operations are best-effort: failures are logged as warnings\n * and never propagate to the eval run.\n */\n\nimport {\n type NormalizedResultsConfig,\n type WipWorktreeHandle,\n buildWipBranchName,\n deleteWipBranch,\n pushWipCheckpoint,\n setupWipWorktree,\n} from '@agentv/core';\n\nconst WIP_CHECKPOINT_INTERVAL_MS = 30_000;\n\nexport interface WipCheckpointLoopDependencies {\n readonly buildWipBranchName: (runDir: string) => string;\n readonly deleteWipBranch: typeof deleteWipBranch;\n readonly pushWipCheckpoint: typeof pushWipCheckpoint;\n readonly setupWipWorktree: typeof setupWipWorktree;\n}\n\nconst defaultDependencies: WipCheckpointLoopDependencies = {\n buildWipBranchName,\n deleteWipBranch,\n pushWipCheckpoint,\n setupWipWorktree,\n};\n\nfunction warnCheckpointError(context: string, error: unknown): void {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`WIP checkpoint: ${context}: ${message}`);\n}\n\nexport class WipCheckpointLoop {\n readonly wipBranch: string;\n private readonly config: NormalizedResultsConfig;\n private readonly runDir: string;\n private readonly destinationPath: string;\n private readonly intervalMs: number;\n private readonly deps: WipCheckpointLoopDependencies;\n private handle: WipWorktreeHandle | undefined;\n private timer: ReturnType<typeof setInterval> | undefined;\n private checkpointInFlight: Promise<void> | undefined;\n private active = false;\n\n constructor(params: {\n readonly config: NormalizedResultsConfig;\n readonly runDir: string;\n readonly destinationPath: string;\n readonly intervalMs?: number;\n readonly dependencies?: WipCheckpointLoopDependencies;\n }) {\n this.config = params.config;\n this.runDir = params.runDir;\n this.destinationPath = params.destinationPath;\n this.intervalMs = params.intervalMs ?? WIP_CHECKPOINT_INTERVAL_MS;\n this.deps = params.dependencies ?? defaultDependencies;\n this.wipBranch = this.deps.buildWipBranchName(params.runDir);\n }\n\n async start(): Promise<void> {\n try {\n this.handle = await this.deps.setupWipWorktree({\n config: this.config,\n wipBranch: this.wipBranch,\n });\n } catch (err) {\n warnCheckpointError('failed to set up WIP worktree', err);\n return;\n }\n this.active = true;\n this.timer = setInterval(() => {\n this.runCheckpointIfIdle();\n }, this.intervalMs);\n // Unref so the timer never prevents process exit.\n this.timer.unref?.();\n }\n\n private runCheckpointIfIdle(): void {\n if (!this.active || this.checkpointInFlight) return;\n this.checkpointInFlight = this.checkpoint()\n .catch((err) => warnCheckpointError('push failed', err))\n .finally(() => {\n this.checkpointInFlight = undefined;\n });\n }\n\n private async checkpoint(): Promise<void> {\n if (!this.handle) return;\n await this.deps.pushWipCheckpoint({\n handle: this.handle,\n sourceDir: this.runDir,\n destinationPath: this.destinationPath,\n });\n }\n\n /** Stop the loop and clean up the local worktree. Does NOT delete the remote WIP branch. */\n async stop(): Promise<void> {\n this.active = false;\n if (this.timer !== undefined) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n await this.checkpointInFlight;\n if (this.handle) {\n await this.handle\n .cleanup()\n .catch((err) => warnCheckpointError('worktree cleanup failed', err));\n this.handle = undefined;\n }\n }\n\n /**\n * Stop the loop and delete the remote WIP branch.\n * Call after a successful run to keep the results repo tidy.\n */\n async stopAndDeleteWipBranch(): Promise<void> {\n await this.stop();\n try {\n await this.deps.deleteWipBranch({ config: this.config, wipBranch: this.wipBranch });\n } catch (err) {\n warnCheckpointError(`failed to delete remote branch ${this.wipBranch}`, err);\n }\n }\n}\n"],"mappings":"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AA8B,oBAAI,IAAI;EAC1C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAGD,IAAM,2BAA2B,oBAAI,IAAoB;EACvD;IACE;IACA;EACF;EACA;IACE;IACA;EACF;EACA;IACE;IACA;EACF;EACA;IACE;IACA;EACF;EACA,CAAC,SAAS,iFAAiF;EAC3F;IACE;IACA;EACF;EACA;IACE;IACA;EACF;EACA;IACE;IACA;EACF;EACA;IACE;IACA;EACF;EACA,CAAC,UAAU,2EAA2E;EACtF,CAAC,QAAQ,+EAA+E;EACxF;IACE;IACA;EACF;EACA,CAAC,cAAc,2EAA2E;EAC1F;IACE;IACA;EACF;EACA;IACE;IACA;EACF;EACA,CAAC,qBAAqB,gEAAgE;EACtF,CAAC,uBAAuB,kEAAkE;AAC5F,CAAC;AAGD,IAAM,8BAA8B,oBAAI,IAAoB;EAC1D,CAAC,aAAa,kDAAkD;AAClE,CAAC;AAGD,IAAM,oBAAoB,oBAAI,IAAI;EAChC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,wBAAwB,oBAAI,IAAI,CAAC,eAAe,UAAU,OAAO,CAAC;AACxE,IAAM,kCAAkC,oBAAI,IAAI,CAAC,QAAQ,QAAQ,UAAU,YAAY,QAAQ,CAAC;AAChG,IAAM,iCAAiC,oBAAI,IAAI;EAC7C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAGD,IAAM,sBAAsB,oBAAI,IAAoB,CAAC,CAAC;AACtD,oBAAoB;EAClB;EACA;AACF;AACA,oBAAoB;EAClB;EACA;AACF;AACA,oBAAoB;EAClB;EACA;AACF;AACA,oBAAoB;EAClB;EACA;AACF;AACA,oBAAoB;EAClB;EACA;AACF;AAGA,IAAM,yBAAyB,oBAAI,IAAoB;EACrD,CAAC,aAAa,kDAAkD;EAChE,CAAC,oBAAoB,yDAAyD;AAChF,CAAC;AAGD,IAAM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GAAG;AACnB,eAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,KAAK,GAAG;AACjD,iCAA2B,QAAQ,UAAU,GAAG,QAAQ,IAAI,GAAG,IAAI,MAAM;IAC3E;EACF;AACF;AAIA,IAAM,kBAAkB,IAAI,IAAY,sBAAsB;AAE9D,IAAM,iBAAiB,oBAAI,IAAI;EAC7B;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,iBAAiB,oBAAI,IAAI;EAC7B,GAAG;EACH,GAAG;EACH;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;EACA;AACF,CAAC;AAED,IAAM,sBAAsB,oBAAI,IAAI;EAClC,GAAG;EACH,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,qBAAqB,oBAAI,IAAI;EACjC,GAAG;EACH,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,IAAM,kBAAkB,oBAAI,IAAI;EAC9B,GAAG;EACH,GAAG;EACH;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;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;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;EACA;AACF,CAAC;AAED,IAAM,oBAAoB,oBAAI,IAAI;EAChC,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;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;AACF,CAAC;AAED,IAAM,gBAAgB,oBAAI,IAAI;EAC5B,GAAG;EACH;EACA;;AACF,CAAC;AAED,IAAM,kBAAkB,oBAAI,IAAI;EAC9B,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAKD,IAAM,kBAAkB,oBAAI,IAAI;EAC9B,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAED,SAAS,iBAAiB,UAAsC;AAC9D,QAAM,qBAAqB,SAAS,YAAY;AAChD,UAAQ,oBAAoB;IAC1B,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;IACL,KAAK;IACL,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;IACL,KAAK;AACH,aAAO;IACT,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;AACH,aAAO;IACT,KAAK;IACL,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AAGH,aAAO;IACT;AACE,aAAO;EACX;AACF;AAEA,SAAS,wBACP,QACA,UACA,cACA,UACA,QACM;AACN,QAAM,gBAAgB,iBAAiB,QAAQ;AAC/C,MAAI,CAAC,eAAe;AAElB;EACF;AAGA,QAAM,aAAa,oBAAI,IAAI;IACzB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACF,CAAC;AAED,QAAM,gBAAgB,oBAAI,IAAI,CAAC,sBAAsB,mBAAmB,CAAC;AAEzE,QAAM,qBAA0D;IAC9D,OAAO,oBAAI,IAAI;MACb;QACE;QACA;MAIF;IACF,CAAC;EA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","names":["path","path","path","constants","access","path","path","access","constants","path","fg","path","fg","constants","existsSync","access","readFile","path","existsSync","path","readFileSync","readdirSync","statSync","path","existsSync","readFileSync","path","path","existsSync","readFileSync","path","isRecord","readFileSync","readdirSync","statSync","path","path","existsSync","constants","access","path","fileExists","path","path","ANSI_RED","ANSI_YELLOW","ANSI_RESET","colors","existsSync","mkdir","path","path","existsSync","mkdir","formatScore","readFile","path","stat","fg","access","path","readFile","fg","stat","isObject","absolutePath","errors","buildSearchRoots","fileExists","access","ANSI_YELLOW","ANSI_RED","ANSI_RESET","useColors","ANSI_YELLOW","ANSI_RESET","ANSI_RED","path","access","constants","readFile","existsSync","suiteTargetSpec","suiteTargets","stat","summary"]}
|