@agentv/core 4.22.0 → 4.24.0-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/dist/{chunk-LKX4QW3G.js → chunk-4VLOUBFL.js} +11 -4
- package/dist/chunk-4VLOUBFL.js.map +1 -0
- package/dist/{chunk-B3BLJRYI.js → chunk-CUVG5O5P.js} +71 -26
- package/dist/chunk-CUVG5O5P.js.map +1 -0
- package/dist/evaluation/validation/index.cjs +22 -19
- package/dist/evaluation/validation/index.cjs.map +1 -1
- package/dist/evaluation/validation/index.js +14 -18
- package/dist/evaluation/validation/index.js.map +1 -1
- package/dist/index.cjs +108 -40
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +22 -4
- package/dist/index.d.ts +22 -4
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/{ts-eval-loader-PA4YFM5D.js → ts-eval-loader-SYQYQPMC.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-B3BLJRYI.js.map +0 -1
- package/dist/chunk-LKX4QW3G.js.map +0 -1
- /package/dist/{ts-eval-loader-PA4YFM5D.js.map → ts-eval-loader-SYQYQPMC.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/evaluation/validation/file-type.ts","../../../src/evaluation/validation/eval-validator.ts","../../../src/evaluation/validation/cases-validator.ts","../../../src/evaluation/validation/targets-validator.ts","../../../src/evaluation/validation/config-validator.ts","../../../src/evaluation/validation/file-reference-validator.ts","../../../src/evaluation/validation/workspace-path-validator.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport type { FileType } from './types.js';\n\nconst SCHEMA_EVAL_V2 = 'agentv-eval-v2';\nconst SCHEMA_TARGETS_V2 = 'agentv-targets-v2.2';\nconst SCHEMA_CONFIG_V2 = 'agentv-config-v2';\n\n/**\n * Detect file type by reading $schema field from YAML file.\n * If $schema is missing, infers type from filename/path:\n * - config.yaml under .agentv folder → 'config'\n * - targets.yaml under .agentv folder → 'targets'\n * - All other YAML files → 'eval' (default)\n */\nexport async function detectFileType(filePath: string): Promise<FileType> {\n try {\n const content = await readFile(filePath, 'utf8');\n const parsed = parse(content) as unknown;\n\n // 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 // Check if file is under .agentv folder\n if (normalized.includes('/.agentv/')) {\n if (basename === 'config.yaml' || basename === 'config.yml') {\n return 'config';\n }\n if (basename === 'targets.yaml' || basename === 'targets.yml') {\n return 'targets';\n }\n }\n\n // Require .eval.yaml / .eval.yml suffix for eval files\n const lower = basename.toLowerCase();\n if (lower.endsWith('.eval.yaml') || lower.endsWith('.eval.yml')) {\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, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport { interpolateEnv } from '../interpolation.js';\nimport { loadCasesFromDirectory, loadCasesFromFile } from '../loaders/case-file-loader.js';\nimport { isGraderKind } from '../types.js';\nimport type { ValidationError, ValidationResult } from './types.js';\n\ntype JsonValue = string | number | boolean | null | JsonObject | JsonArray;\ntype JsonObject = { readonly [key: string]: JsonValue };\ntype JsonArray = readonly JsonValue[];\n\n/** Assertion 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]);\n\n/** Valid file extensions for external test files. */\nconst VALID_TEST_FILE_EXTENSIONS = new Set(['.yaml', '.yml', '.jsonl']);\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 'input',\n 'input_files',\n 'tests',\n 'target',\n 'execution',\n 'assertions',\n 'evaluators',\n 'preprocessors',\n 'workspace',\n]);\n\n/**\n * Deprecated top-level fields with migration hints.\n * These are still processed by yaml-parser but authors should migrate.\n */\nconst DEPRECATED_TOP_LEVEL_FIELDS = new Map<string, string>([\n ['eval_cases', \"'eval_cases' is deprecated. Use 'tests' instead.\"],\n ['evalcases', \"'evalcases' is deprecated. Use 'tests' instead.\"],\n ['evaluator', \"'evaluator' is deprecated. Use 'assertions' instead.\"],\n ['assert', \"'assert' is deprecated. Use 'assertions' instead.\"],\n]);\n\n/** Known fields at the test level. */\nconst KNOWN_TEST_FIELDS = new Set([\n 'id',\n 'criteria',\n 'input',\n 'input_files',\n 'expected_output',\n 'assertions',\n 'evaluators',\n 'rubrics',\n 'execution',\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\n/**\n * Deprecated test-level fields with migration hints.\n * These are still processed by yaml-parser but authors should migrate.\n */\nconst DEPRECATED_TEST_FIELDS = new Map<string, string>([\n ['evaluator', \"'evaluator' is deprecated. Use 'assertions' instead.\"],\n ['assert', \"'assert' is deprecated. Use 'assertions' instead.\"],\n ['expected_outcome', \"'expected_outcome' is deprecated. Use 'criteria' 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\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(parse(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\n // Warn on deprecated or unknown top-level fields\n for (const key of Object.keys(parsed)) {\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: 'warning',\n filePath: absolutePath,\n location: key,\n message: `Unknown field '${key}'. This field will be ignored.`,\n });\n }\n }\n\n // Validate suite-level input (optional: string shorthand or message array)\n const suiteInput = parsed.input;\n if (suiteInput !== undefined) {\n if (typeof suiteInput === 'string') {\n // String shorthand is valid\n } else if (Array.isArray(suiteInput)) {\n validateMessages(suiteInput, 'input', absolutePath, errors);\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'input',\n message: \"Invalid suite-level 'input' field (must be a string or array of messages)\",\n });\n }\n }\n\n const cases: JsonValue | undefined = parsed.tests;\n\n // tests can be a string path (external file/directory reference) or an array\n if (typeof cases === 'string') {\n await validateWorkspaceConfig(parsed.workspace, absolutePath, errors, 'workspace');\n\n const externalCasesPath = path.resolve(path.dirname(absolutePath), cases);\n let isDir = false;\n try {\n const pathStat = await stat(externalCasesPath);\n isDir = pathStat.isDirectory();\n } catch {\n // Path doesn't exist — fall through to file validation\n }\n\n if (isDir) {\n // Directory path: load and validate discovered cases\n try {\n const dirCases = await loadCasesFromDirectory(externalCasesPath);\n for (let i = 0; i < dirCases.length; i++) {\n const dirCase = dirCases[i];\n await validateWorkspaceConfig(\n dirCase.workspace,\n absolutePath,\n errors,\n `tests[${i}].workspace`,\n );\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'tests',\n message,\n });\n }\n } else {\n // File path: validate extension and load\n validateTestsStringPath(cases, absolutePath, errors);\n const ext = path.extname(cases).toLowerCase();\n if (VALID_TEST_FILE_EXTENSIONS.has(ext)) {\n try {\n const externalCases = await loadCasesFromFile(externalCasesPath);\n for (let i = 0; i < externalCases.length; i++) {\n const externalCase = externalCases[i];\n await validateWorkspaceConfig(\n externalCase.workspace,\n absolutePath,\n errors,\n `tests[${i}].workspace`,\n );\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'tests',\n message,\n });\n }\n }\n }\n\n return {\n valid: errors.filter((e) => e.severity === 'error').length === 0,\n filePath: absolutePath,\n fileType: 'eval',\n errors,\n };\n }\n\n if (!Array.isArray(cases)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'tests',\n message: \"Missing or invalid 'tests' field (must be an array or a file path string)\",\n });\n return {\n valid: errors.length === 0,\n filePath: absolutePath,\n fileType: 'eval',\n errors,\n };\n }\n\n // Validate each eval case\n for (let i = 0; i < cases.length; i++) {\n const evalCase = cases[i];\n const location = `tests[${i}]`;\n\n // Tests array items can be file references (e.g., \"file://cases/accuracy.yaml\")\n if (typeof evalCase === 'string') {\n if (evalCase.startsWith('file://')) {\n validateTestsStringPath(evalCase, absolutePath, errors);\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message: 'Test case string must be a file reference (file://...)',\n });\n }\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 // Warn on deprecated or unknown test-level fields\n for (const key of Object.keys(evalCase)) {\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: 'warning',\n filePath: absolutePath,\n location: `${location}.${key}`,\n message: `Unknown field '${key}'. This field will be ignored.`,\n });\n }\n }\n\n // Required fields: id, input\n const id = evalCase.id;\n if (typeof id !== 'string' || id.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.id`,\n message: \"Missing or invalid 'id' field (must be a non-empty string)\",\n });\n }\n\n // Optional: criteria\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 }\n\n // input field (string shorthand or message array)\n const inputField = evalCase.input;\n if (inputField !== undefined) {\n if (typeof inputField === 'string') {\n // String shorthand is valid - no further validation needed\n } else if (Array.isArray(inputField)) {\n validateMessages(inputField, `${location}.input`, absolutePath, errors);\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.input`,\n message: \"Invalid 'input' field (must be a string or array of messages)\",\n });\n }\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.input`,\n message: \"Missing 'input' field (must be a string or array of messages)\",\n });\n }\n\n // expected_output field (string/object shorthand or message array)\n const expectedOutputField = evalCase.expected_output;\n if (expectedOutputField !== undefined) {\n if (typeof expectedOutputField === 'string') {\n // String shorthand is valid - no further validation needed\n } else if (Array.isArray(expectedOutputField)) {\n // Check if it looks like a message array (first element has 'role')\n if (\n expectedOutputField.length > 0 &&\n isObject(expectedOutputField[0]) &&\n 'role' in expectedOutputField[0]\n ) {\n validateMessages(\n expectedOutputField,\n `${location}.expected_output`,\n absolutePath,\n errors,\n );\n }\n // Otherwise it's treated as structured array content - valid\n } else if (isObject(expectedOutputField)) {\n // Object shorthand or single message - both are valid\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.expected_output`,\n message: \"Invalid 'expected_output' field (must be a string, object, or array)\",\n });\n }\n }\n\n // assertions field (array of assertion objects)\n const assertField = evalCase.assertions;\n if (assertField !== undefined) {\n validateAssertArray(assertField, location, absolutePath, errors, customAssertionTypes);\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 validateWorkspaceConfig(parsed.workspace, absolutePath, errors, 'workspace');\n\n return {\n valid: errors.filter((e) => e.severity === 'error').length === 0,\n filePath: absolutePath,\n fileType: 'eval',\n errors,\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 (isObject(workspace)) {\n validateWorkspaceRepoConfig(workspace, evalFilePath, errors);\n return;\n }\n\n if (typeof workspace !== 'string') {\n return;\n }\n\n const workspacePath = path.resolve(path.dirname(evalFilePath), workspace);\n\n try {\n const workspaceContent = await readFile(workspacePath, 'utf8');\n const parsedWorkspace = interpolateEnv(parse(workspaceContent), process.env);\n if (!isObject(parsedWorkspace)) {\n errors.push({\n severity: 'error',\n filePath: evalFilePath,\n location,\n message: `External workspace file must contain a YAML object: ${workspace}`,\n });\n return;\n }\n\n validateWorkspaceRepoConfig(parsedWorkspace, workspacePath, errors);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n errors.push({\n severity: 'error',\n filePath: evalFilePath,\n location,\n message: `Failed to load external workspace file '${workspace}': ${message}`,\n });\n }\n}\n\nfunction validateWorkspaceRepoConfig(\n workspace: JsonObject,\n filePath: string,\n errors: ValidationError[],\n): void {\n const repos = workspace.repos;\n const hooks = workspace.hooks;\n const afterEachHook = isObject(hooks) ? hooks.after_each : undefined;\n const isolation = workspace.isolation;\n\n const docker = workspace.docker;\n\n // Depth vs ancestor warning\n if (Array.isArray(repos)) {\n for (const repo of repos) {\n if (!isObject(repo)) continue;\n const source = repo.source;\n const checkout = repo.checkout;\n const clone = repo.clone;\n\n // Source-less repos are only valid with Docker (repo exists inside container)\n if (!isObject(source) && !isObject(docker)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `workspace.repos[path=${repo.path ?? '(none)'}]`,\n message:\n 'repos[].source is required for non-Docker workspaces. ' +\n 'Source-less repos are only valid when workspace.docker is configured (repo exists inside the container).',\n });\n }\n\n if (isObject(source) && isObject(checkout)) {\n const sourceType = source.type;\n const resolve = checkout.resolve;\n if (sourceType === 'local' && typeof resolve === 'string') {\n errors.push({\n severity: 'warning',\n filePath,\n location: `workspace.repos[path=${repo.path ?? '(none)'}]`,\n message:\n 'checkout.resolve has no effect for a local source. ' +\n 'Use source.type to choose where the repo comes from; keep checkout.ref, checkout.base_commit, or checkout.ancestor only when pinning a local source.',\n });\n }\n }\n\n if (isObject(checkout) && isObject(clone)) {\n const ancestor = checkout.ancestor;\n const depth = clone.depth;\n if (typeof ancestor === 'number' && typeof depth === 'number' && depth < ancestor + 1) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `workspace.repos[path=${repo.path ?? '(none)'}]`,\n message:\n `clone.depth (${depth}) may be insufficient for checkout.ancestor (${ancestor}). ` +\n `Recommend depth >= ${ancestor + 1}.`,\n });\n }\n }\n }\n }\n\n // after_each reset with per_test isolation warning\n if (isObject(afterEachHook) && afterEachHook.reset && isolation === 'per_test') {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'workspace.hooks.after_each',\n message:\n 'hooks.after_each.reset is redundant with isolation: per_test (each test gets a fresh workspace).',\n });\n }\n}\n\nfunction validateMessages(\n messages: JsonArray,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i];\n const msgLocation = `${location}[${i}]`;\n\n if (!isObject(message)) {\n errors.push({\n severity: 'error',\n filePath,\n location: msgLocation,\n message: 'Message must be an object',\n });\n continue;\n }\n\n // Validate role field\n const role = message.role;\n const validRoles = ['system', 'user', 'assistant'];\n if (!validRoles.includes(role as string)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${msgLocation}.role`,\n message: `Invalid role '${role}'. Must be one of: ${validRoles.join(', ')}`,\n });\n }\n\n // Validate content field (can be string, 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 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): void {\n const ext = path.extname(testsPath);\n if (!VALID_TEST_FILE_EXTENSIONS.has(ext)) {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'tests',\n message: `Unsupported file extension '${ext}' for tests path '${testsPath}'. Supported extensions: ${[...VALID_TEST_FILE_EXTENSIONS].join(', ')}`,\n });\n }\n}\n\nfunction validateAssertArray(\n assertField: JsonValue,\n parentLocation: string,\n filePath: string,\n errors: ValidationError[],\n customAssertionTypes: ReadonlySet<string> = new Set(),\n): void {\n if (!Array.isArray(assertField)) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${parentLocation}.assertions`,\n message: \"'assertions' must be an array of assertion objects.\",\n });\n return;\n }\n\n // String items in the assertions 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: `${parentLocation}.assertions[${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: `${parentLocation}.assertions[${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 location = `${parentLocation}.assertions[${index}]`;\n\n // Validate type field\n const rawTypeValue = item.type;\n if (rawTypeValue === undefined || typeof rawTypeValue !== 'string') {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.type`,\n message: \"Assertion item is missing a 'type' field.\",\n });\n continue;\n }\n\n // Normalize snake_case to kebab-case for backward compatibility\n const typeValue = rawTypeValue.replace(/_/g, '-');\n\n if (!isGraderKind(typeValue) && !customAssertionTypes.has(typeValue)) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.type`,\n message: `Unknown assertion type '${rawTypeValue}'.`,\n });\n continue;\n }\n\n // Validate value field for types that require a string value\n if (ASSERTION_TYPES_WITH_STRING_VALUE.has(typeValue)) {\n const value = item.value;\n if (value === undefined || typeof value !== 'string') {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.value`,\n message: `Assertion type '${typeValue}' requires a 'value' field (string).`,\n });\n continue;\n }\n\n // For regex type, validate that the pattern is valid\n if (typeValue === 'regex') {\n try {\n new RegExp(value);\n } catch {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.value`,\n message: `Invalid regex pattern '${value}': not a valid regular expression.`,\n });\n }\n }\n }\n\n // Validate value field for types that require a string array value\n if (ASSERTION_TYPES_WITH_ARRAY_VALUE.has(typeValue)) {\n const value = item.value;\n if (!Array.isArray(value) || value.length === 0) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.value`,\n message: `Assertion type '${typeValue}' requires a 'value' field (non-empty string array).`,\n });\n continue;\n }\n }\n\n // Validate required field if present\n const required = item.required;\n if (required !== undefined) {\n validateRequiredField(required, location, filePath, errors);\n }\n }\n}\n\nfunction validateRequiredField(\n required: JsonValue,\n parentLocation: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (typeof required === 'boolean') {\n return; // Valid\n }\n if (typeof required === 'number') {\n if (required <= 0 || required > 1) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${parentLocation}.required`,\n message: `Invalid 'required' value ${required}. When a number, it must be between 0 (exclusive) and 1 (inclusive).`,\n });\n }\n return;\n }\n errors.push({\n severity: 'warning',\n filePath,\n location: `${parentLocation}.required`,\n message: `Invalid 'required' value. Must be a boolean or a number between 0 (exclusive) and 1 (inclusive).`,\n });\n}\n\nfunction validateContentForRoleMarkers(\n content: string,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n // Check for standard role markers that might confuse agentic providers\n const markers = ['@[System]:', '@[User]:', '@[Assistant]:', '@[Tool]:'];\n for (const marker of markers) {\n if (content.toLowerCase().includes(marker.toLowerCase())) {\n errors.push({\n severity: 'warning',\n filePath,\n location,\n message: `Content contains potential role marker '${marker}'. This may confuse agentic providers or cause prompt injection.`,\n });\n }\n }\n}\n\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';\nimport { parse } from 'yaml';\n\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 = parse(content);\n } catch (error) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n message: `Failed to parse YAML: ${(error as Error).message}`,\n });\n return { 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';\nimport { parse } from 'yaml';\n\nimport {\n CLI_PLACEHOLDERS,\n COMMON_TARGET_SETTINGS,\n findDeprecatedCamelCaseTargetWarnings,\n} from '../providers/targets.js';\nimport { KNOWN_PROVIDERS, PROVIDER_ALIASES } from '../providers/types.js';\nimport type { ValidationError, ValidationResult } from './types.js';\n\ntype JsonValue = string | number | boolean | null | JsonObject | JsonArray;\ntype JsonObject = { readonly [key: string]: JsonValue };\ntype JsonArray = readonly JsonValue[];\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n// 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 'api_format',\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 'model',\n 'executable',\n 'command',\n 'binary',\n 'args',\n 'arguments',\n 'cwd',\n 'timeout_seconds',\n 'log_dir',\n 'log_directory',\n 'log_format',\n 'log_output_format',\n 'system_prompt',\n]);\n\nconst COPILOT_SDK_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'cli_url',\n 'cli_path',\n 'github_token',\n 'model',\n 'cwd',\n 'timeout_seconds',\n 'log_dir',\n 'log_format',\n 'system_prompt',\n 'byok',\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 'log_format',\n 'system_prompt',\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\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 'log_format',\n 'log_output_format',\n 'system_prompt',\n 'max_turns',\n 'max_budget_usd',\n]);\n\nconst CC_MIRROR_SETTINGS = new Set([...CLAUDE_SETTINGS, 'variant']);\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 case 'azure-openai':\n return AZURE_SETTINGS;\n case 'anthropic':\n return ANTHROPIC_SETTINGS;\n case 'gemini':\n case 'google':\n case 'google-gemini':\n return GEMINI_SETTINGS;\n case 'codex':\n case 'codex-cli':\n return CODEX_SETTINGS;\n case 'copilot-sdk':\n case 'copilot_sdk':\n return COPILOT_SDK_SETTINGS;\n case 'copilot':\n case 'copilot-cli':\n return COPILOT_CLI_SETTINGS;\n case 'cc-mirror':\n return CC_MIRROR_SETTINGS;\n case 'claude':\n case 'claude-code':\n case 'claude-cli':\n case 'claude-sdk':\n return CLAUDE_SETTINGS;\n case 'vscode':\n case 'vscode-insiders':\n return VSCODE_SETTINGS;\n case 'mock':\n return MOCK_SETTINGS;\n case 'cli':\n // CLI provider validation is now handled by Zod schema in resolveCliConfig()\n // Return null to skip duplicate validation in validateUnknownSettings()\n return null;\n default:\n return null; // Unknown provider, can't validate settings\n }\n}\n\nfunction validateUnknownSettings(\n target: JsonObject,\n provider: string,\n absolutePath: string,\n location: string,\n errors: ValidationError[],\n): void {\n const 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 'name',\n 'provider',\n 'grader_target',\n 'judge_target',\n 'workers',\n '$schema',\n 'targets',\n ]);\n\n const removedFields = new Set(['workspace_template', 'workspaceTemplate']);\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 workspace.template instead.',\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 try {\n const content = await readFile(absolutePath, 'utf8');\n parsed = parse(content);\n } catch (error) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n message: `Failed to parse YAML: ${(error as Error).message}`,\n });\n return {\n valid: false,\n filePath: absolutePath,\n fileType: 'targets',\n errors,\n };\n }\n\n /**\n * Simplified CLI settings validation for early file validation.\n * Detailed type checking is now handled by Zod schema validation in resolveCliConfig().\n * This function focuses on critical early checks: command template presence and placeholder validation.\n */\n function validateCliSettings(\n target: JsonObject,\n absolutePath: string,\n location: string,\n errors: ValidationError[],\n ): void {\n // Critical check: command is required\n const command = target.command;\n if (typeof command !== 'string' || command.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.command`,\n message: \"CLI provider requires 'command' as a non-empty string\",\n });\n } else {\n // Validate CLI placeholders early to give helpful feedback\n recordUnknownPlaceholders(command, absolutePath, `${location}.command`, errors);\n }\n\n // Early validation of healthcheck structure and placeholders\n const healthcheck = target.healthcheck;\n if (healthcheck !== undefined) {\n validateCliHealthcheck(healthcheck, absolutePath, `${location}.healthcheck`, errors);\n }\n }\n\n function validateCliHealthcheck(\n healthcheck: unknown,\n absolutePath: string,\n location: string,\n errors: ValidationError[],\n ): void {\n if (!isObject(healthcheck)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message: \"'healthcheck' must be an object when provided\",\n });\n return;\n }\n\n const timeoutSeconds = healthcheck.timeout_seconds;\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 // Validate targets array\n const targets = parsed.targets;\n if (!Array.isArray(targets)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'targets',\n message: \"Missing or invalid 'targets' field (must be an array)\",\n });\n return {\n valid: errors.length === 0,\n filePath: absolutePath,\n fileType: 'targets',\n errors,\n };\n }\n\n // Validate each target definition\n const knownProviders = [...KNOWN_PROVIDERS, ...PROVIDER_ALIASES];\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n const location = `targets[${i}]`;\n\n if (!isObject(target)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message: 'Target must be an object',\n });\n continue;\n }\n\n for (const warning of findDeprecatedCamelCaseTargetWarnings(target, location)) {\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: name\n const name = target.name;\n if (typeof name !== 'string' || name.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.name`,\n message: \"Missing or invalid 'name' field (must be a non-empty string)\",\n });\n }\n\n // Required field: provider\n const provider = target.provider;\n const hasUseTarget =\n typeof target.use_target === 'string' && target.use_target.trim().length > 0;\n const providerValue = typeof provider === 'string' ? provider.trim().toLowerCase() : undefined;\n const isTemplated = typeof provider === 'string' && /^\\$\\{\\{.+\\}\\}$/.test(provider.trim());\n if (!hasUseTarget && (typeof provider !== 'string' || provider.trim().length === 0)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.provider`,\n message:\n \"Missing or invalid 'provider' field (must be a non-empty string, or use use_target for delegation)\",\n });\n } else if (typeof provider === 'string' && !isTemplated && !knownProviders.includes(provider)) {\n // Warning for unknown providers (non-fatal); skip when provider uses ${{ 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(target, absolutePath, location, errors);\n }\n\n // Check for unknown settings properties on target object\n if (typeof provider === 'string' && !isTemplated) {\n validateUnknownSettings(target, provider, absolutePath, location, errors);\n }\n\n // Optional field: grader_target / judge_target (must be string if present)\n const graderTarget = target.grader_target ?? target.judge_target;\n if (graderTarget !== undefined && typeof graderTarget !== 'string') {\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 { parse } from 'yaml';\n\nimport type { ValidationError, ValidationResult } from './types.js';\n\n/**\n * Validate a config.yaml file for schema compliance and structural correctness.\n */\nexport async function validateConfigFile(filePath: string): Promise<ValidationResult> {\n const errors: ValidationError[] = [];\n\n try {\n const content = await readFile(filePath, 'utf8');\n const parsed = parse(content) as unknown;\n\n // Check if parsed content is an object\n if (typeof parsed !== 'object' || parsed === null) {\n errors.push({\n severity: 'error',\n filePath,\n message: 'Config file must contain a valid YAML object',\n });\n return { valid: false, filePath, fileType: 'config', errors };\n }\n\n const config = parsed as Record<string, unknown>;\n\n // Validate 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 const results = config.results;\n if (results !== undefined) {\n if (typeof results !== 'object' || results === null || Array.isArray(results)) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'results',\n message: \"Field 'results' must be an object\",\n });\n } else {\n const exportConfig = (results as Record<string, unknown>).export;\n if (exportConfig !== undefined) {\n if (\n typeof exportConfig !== 'object' ||\n exportConfig === null ||\n Array.isArray(exportConfig)\n ) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'results.export',\n message: \"Field 'results.export' must be an object\",\n });\n } else {\n const exportRecord = exportConfig as Record<string, unknown>;\n if (typeof exportRecord.repo !== 'string' || exportRecord.repo.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'results.export.repo',\n message: \"Field 'results.export.repo' must be a non-empty string\",\n });\n }\n if (typeof exportRecord.path !== 'string' || exportRecord.path.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'results.export.path',\n message: \"Field 'results.export.path' must be a non-empty string\",\n });\n }\n if (\n exportRecord.auto_push !== undefined &&\n typeof exportRecord.auto_push !== 'boolean'\n ) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'results.export.auto_push',\n message: \"Field 'results.export.auto_push' must be a boolean\",\n });\n }\n if (\n exportRecord.branch_prefix !== undefined &&\n (typeof exportRecord.branch_prefix !== 'string' ||\n exportRecord.branch_prefix.trim().length === 0)\n ) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'results.export.branch_prefix',\n message: \"Field 'results.export.branch_prefix' must be a non-empty string\",\n });\n }\n }\n }\n }\n }\n\n const allowedFields = new Set([\n '$schema',\n 'eval_patterns',\n 'required_version',\n 'execution',\n 'results',\n 'studio',\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","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport { buildSearchRoots, findGitRoot, resolveFileReference } from '../file-utils.js';\nimport type { ValidationError } from './types.js';\n\ntype JsonValue = string | number | boolean | null | JsonObject | JsonArray;\ntype JsonObject = { readonly [key: string]: JsonValue };\ntype JsonArray = readonly JsonValue[];\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Validate that file references in eval file content exist.\n * Checks content blocks with type: \"file\" and validates the referenced file exists.\n * Also checks that referenced files are not empty.\n */\nexport async function validateFileReferences(\n evalFilePath: string,\n): Promise<readonly ValidationError[]> {\n const errors: ValidationError[] = [];\n const absolutePath = path.resolve(evalFilePath);\n\n // Find git root and build search roots (same as yaml-parser does at runtime)\n const gitRoot = await findGitRoot(absolutePath);\n if (!gitRoot) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n message: 'Cannot validate file references: git repository root not found',\n });\n return errors;\n }\n\n const searchRoots = buildSearchRoots(absolutePath, gitRoot);\n\n let parsed: unknown;\n try {\n const content = await readFile(absolutePath, 'utf8');\n parsed = parse(content);\n } catch {\n // Parse errors are already caught by eval-validator\n return errors;\n }\n\n if (!isObject(parsed)) {\n return errors;\n }\n\n let cases: JsonValue | undefined = parsed.tests;\n if (cases === undefined && 'eval_cases' in parsed) {\n cases = parsed.eval_cases;\n }\n if (cases === undefined && 'evalcases' in parsed) {\n cases = parsed.evalcases;\n }\n if (!Array.isArray(cases)) {\n return errors;\n }\n\n for (let i = 0; i < cases.length; i++) {\n const evalCase = cases[i];\n if (!isObject(evalCase)) {\n continue;\n }\n\n // Check input\n const inputField = evalCase.input;\n if (Array.isArray(inputField)) {\n await validateMessagesFileRefs(\n inputField,\n `tests[${i}].input`,\n searchRoots,\n absolutePath,\n errors,\n );\n }\n\n // Check expected_output\n const expectedOutputField = evalCase.expected_output;\n if (Array.isArray(expectedOutputField)) {\n await validateMessagesFileRefs(\n expectedOutputField,\n `tests[${i}].expected_output`,\n searchRoots,\n absolutePath,\n errors,\n );\n }\n }\n\n return errors;\n}\n\nasync function validateMessagesFileRefs(\n messages: JsonArray,\n location: string,\n searchRoots: readonly string[],\n filePath: string,\n errors: ValidationError[],\n): Promise<void> {\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i];\n if (!isObject(message)) {\n continue;\n }\n\n const content = message.content;\n if (typeof content === 'string') {\n continue;\n }\n\n if (!Array.isArray(content)) {\n continue;\n }\n\n for (let j = 0; j < content.length; j++) {\n const contentItem = content[j];\n if (!isObject(contentItem)) {\n continue;\n }\n\n const type = contentItem.type;\n if (type !== 'file') {\n continue;\n }\n\n const value = contentItem.value;\n if (typeof value !== 'string') {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}[${i}].content[${j}].value`,\n message: \"File reference must have a 'value' field with the file path\",\n });\n continue;\n }\n\n // Use the same file resolution logic as yaml-parser at runtime\n const { resolvedPath } = await resolveFileReference(value, searchRoots);\n\n if (!resolvedPath) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}[${i}].content[${j}]`,\n message: `Referenced file not found: ${value}`,\n });\n } else {\n // Check that file is not empty\n try {\n const fileContent = await readFile(resolvedPath, 'utf8');\n if (fileContent.trim().length === 0) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}[${i}].content[${j}]`,\n message: `Referenced file is empty: ${value}`,\n });\n }\n } catch (error) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}[${i}].content[${j}]`,\n message: `Cannot read referenced file: ${value} (${(error as Error).message})`,\n });\n }\n }\n }\n }\n}\n","import { access, readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\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 = parse(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 = parse(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\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 // Support both `command` (canonical) and `script` (deprecated alias)\n const command = hook.command ?? hook.script;\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"],"mappings":"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","names":["readFile","path","parse","path","readFile","parse","readFile","path","parse","isObject","readFile","path","parse","isObject","path","readFile","parse","absolutePath","errors","readFile","parse","readFile","path","parse","isObject","path","readFile","parse","readFile","path","parse","isObject"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/evaluation/validation/file-type.ts","../../../src/evaluation/validation/eval-validator.ts","../../../src/evaluation/validation/cases-validator.ts","../../../src/evaluation/validation/targets-validator.ts","../../../src/evaluation/validation/config-validator.ts","../../../src/evaluation/validation/file-reference-validator.ts","../../../src/evaluation/validation/workspace-path-validator.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\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 under .agentv folder → 'config'\n * - targets.yaml under .agentv folder → 'targets'\n * - All other YAML files → 'eval' (default)\n */\nexport async function detectFileType(filePath: string): Promise<FileType> {\n try {\n const content = await readFile(filePath, 'utf8');\n const parsed = 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 // Check if file is under .agentv folder\n if (normalized.includes('/.agentv/')) {\n if (basename === 'config.yaml' || basename === 'config.yml') {\n return 'config';\n }\n if (basename === 'targets.yaml' || basename === 'targets.yml') {\n return 'targets';\n }\n }\n\n // Require .eval.yaml / .eval.yml suffix for eval files\n const lower = basename.toLowerCase();\n if (lower.endsWith('.eval.yaml') || lower.endsWith('.eval.yml')) {\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, stat } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { interpolateEnv } from '../interpolation.js';\nimport { loadCasesFromDirectory, loadCasesFromFile } from '../loaders/case-file-loader.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[];\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]);\n\n/** Valid file extensions for external test files. */\nconst VALID_TEST_FILE_EXTENSIONS = new Set(['.yaml', '.yml', '.jsonl']);\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 'input',\n 'input_files',\n 'tests',\n 'target',\n 'execution',\n 'assertions',\n 'evaluators',\n 'preprocessors',\n 'workspace',\n 'metadata',\n 'governance',\n]);\n\n/**\n * Deprecated top-level fields with migration hints.\n * These are still processed by yaml-parser but authors should migrate.\n */\nconst DEPRECATED_TOP_LEVEL_FIELDS = new Map<string, string>([\n ['eval_cases', \"'eval_cases' is deprecated. Use 'tests' instead.\"],\n ['evalcases', \"'evalcases' is deprecated. Use 'tests' instead.\"],\n ['evaluator', \"'evaluator' is deprecated. Use 'assertions' instead.\"],\n ['assert', \"'assert' is deprecated. Use 'assertions' instead.\"],\n]);\n\n/** Known fields at the test level. */\nconst KNOWN_TEST_FIELDS = new Set([\n 'id',\n 'criteria',\n 'input',\n 'input_files',\n 'expected_output',\n 'assertions',\n 'evaluators',\n 'rubrics',\n 'execution',\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\n/**\n * Deprecated test-level fields with migration hints.\n * These are still processed by yaml-parser but authors should migrate.\n */\nconst DEPRECATED_TEST_FIELDS = new Map<string, string>([\n ['evaluator', \"'evaluator' is deprecated. Use 'assertions' instead.\"],\n ['assert', \"'assert' is deprecated. Use 'assertions' instead.\"],\n ['expected_outcome', \"'expected_outcome' is deprecated. Use 'criteria' 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\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\n // Warn on deprecated or unknown top-level fields\n for (const key of Object.keys(parsed)) {\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: 'warning',\n filePath: absolutePath,\n location: key,\n message: `Unknown field '${key}'. This field will be ignored.`,\n });\n }\n }\n\n // Validate suite-level input (optional: string shorthand or message array)\n const suiteInput = parsed.input;\n if (suiteInput !== undefined) {\n if (typeof suiteInput === 'string') {\n // String shorthand is valid\n } else if (Array.isArray(suiteInput)) {\n validateMessages(suiteInput, 'input', absolutePath, errors);\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'input',\n message: \"Invalid suite-level 'input' field (must be a string or array of messages)\",\n });\n }\n }\n\n const cases: JsonValue | undefined = parsed.tests;\n\n // tests can be a string path (external file/directory reference) or an array\n if (typeof cases === 'string') {\n await validateWorkspaceConfig(parsed.workspace, absolutePath, errors, 'workspace');\n\n const externalCasesPath = path.resolve(path.dirname(absolutePath), cases);\n let isDir = false;\n try {\n const pathStat = await stat(externalCasesPath);\n isDir = pathStat.isDirectory();\n } catch {\n // Path doesn't exist — fall through to file validation\n }\n\n if (isDir) {\n // Directory path: load and validate discovered cases\n try {\n const dirCases = await loadCasesFromDirectory(externalCasesPath);\n for (let i = 0; i < dirCases.length; i++) {\n const dirCase = dirCases[i];\n await validateWorkspaceConfig(\n dirCase.workspace,\n absolutePath,\n errors,\n `tests[${i}].workspace`,\n );\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'tests',\n message,\n });\n }\n } else {\n // File path: validate extension and load\n validateTestsStringPath(cases, absolutePath, errors);\n const ext = path.extname(cases).toLowerCase();\n if (VALID_TEST_FILE_EXTENSIONS.has(ext)) {\n try {\n const externalCases = await loadCasesFromFile(externalCasesPath);\n for (let i = 0; i < externalCases.length; i++) {\n const externalCase = externalCases[i];\n await validateWorkspaceConfig(\n externalCase.workspace,\n absolutePath,\n errors,\n `tests[${i}].workspace`,\n );\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'tests',\n message,\n });\n }\n }\n }\n\n return {\n valid: errors.filter((e) => e.severity === 'error').length === 0,\n filePath: absolutePath,\n fileType: 'eval',\n errors,\n };\n }\n\n if (!Array.isArray(cases)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'tests',\n message: \"Missing or invalid 'tests' field (must be an array or a file path string)\",\n });\n return {\n valid: errors.length === 0,\n filePath: absolutePath,\n fileType: 'eval',\n errors,\n };\n }\n\n // Validate each eval case\n for (let i = 0; i < cases.length; i++) {\n const evalCase = cases[i];\n const location = `tests[${i}]`;\n\n // Tests array items can be file references (e.g., \"file://cases/accuracy.yaml\")\n if (typeof evalCase === 'string') {\n if (evalCase.startsWith('file://')) {\n validateTestsStringPath(evalCase, absolutePath, errors);\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message: 'Test case string must be a file reference (file://...)',\n });\n }\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 // Warn on deprecated or unknown test-level fields\n for (const key of Object.keys(evalCase)) {\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: 'warning',\n filePath: absolutePath,\n location: `${location}.${key}`,\n message: `Unknown field '${key}'. This field will be ignored.`,\n });\n }\n }\n\n // Required fields: id, input\n const id = evalCase.id;\n if (typeof id !== 'string' || id.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.id`,\n message: \"Missing or invalid 'id' field (must be a non-empty string)\",\n });\n }\n\n // Optional: criteria\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 }\n\n // input field (string shorthand or message array)\n const inputField = evalCase.input;\n if (inputField !== undefined) {\n if (typeof inputField === 'string') {\n // String shorthand is valid - no further validation needed\n } else if (Array.isArray(inputField)) {\n validateMessages(inputField, `${location}.input`, absolutePath, errors);\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.input`,\n message: \"Invalid 'input' field (must be a string or array of messages)\",\n });\n }\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.input`,\n message: \"Missing 'input' field (must be a string or array of messages)\",\n });\n }\n\n // expected_output field (string/object shorthand or message array)\n const expectedOutputField = evalCase.expected_output;\n if (expectedOutputField !== undefined) {\n if (typeof expectedOutputField === 'string') {\n // String shorthand is valid - no further validation needed\n } else if (Array.isArray(expectedOutputField)) {\n // Check if it looks like a message array (first element has 'role')\n if (\n expectedOutputField.length > 0 &&\n isObject(expectedOutputField[0]) &&\n 'role' in expectedOutputField[0]\n ) {\n validateMessages(\n expectedOutputField,\n `${location}.expected_output`,\n absolutePath,\n errors,\n );\n }\n // Otherwise it's treated as structured array content - valid\n } else if (isObject(expectedOutputField)) {\n // Object shorthand or single message - both are valid\n } else {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.expected_output`,\n message: \"Invalid 'expected_output' field (must be a string, object, or array)\",\n });\n }\n }\n\n // assertions field (array of assertion objects)\n const assertField = evalCase.assertions;\n if (assertField !== undefined) {\n validateAssertArray(assertField, location, absolutePath, errors, customAssertionTypes);\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 validateWorkspaceConfig(parsed.workspace, absolutePath, errors, 'workspace');\n\n return {\n valid: errors.filter((e) => e.severity === 'error').length === 0,\n filePath: absolutePath,\n fileType: 'eval',\n errors,\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 (isObject(workspace)) {\n validateWorkspaceRepoConfig(workspace, evalFilePath, errors);\n return;\n }\n\n if (typeof workspace !== 'string') {\n return;\n }\n\n const workspacePath = path.resolve(path.dirname(evalFilePath), workspace);\n\n try {\n const workspaceContent = await readFile(workspacePath, 'utf8');\n const parsedWorkspace = interpolateEnv(parseYamlValue(workspaceContent), process.env);\n if (!isObject(parsedWorkspace)) {\n errors.push({\n severity: 'error',\n filePath: evalFilePath,\n location,\n message: `External workspace file must contain a YAML object: ${workspace}`,\n });\n return;\n }\n\n validateWorkspaceRepoConfig(parsedWorkspace, workspacePath, errors);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n errors.push({\n severity: 'error',\n filePath: evalFilePath,\n location,\n message: `Failed to load external workspace file '${workspace}': ${message}`,\n });\n }\n}\n\nfunction validateWorkspaceRepoConfig(\n workspace: JsonObject,\n filePath: string,\n errors: ValidationError[],\n): void {\n const repos = workspace.repos;\n const hooks = workspace.hooks;\n const afterEachHook = isObject(hooks) ? hooks.after_each : undefined;\n const isolation = workspace.isolation;\n\n const docker = workspace.docker;\n\n // Depth vs ancestor warning\n if (Array.isArray(repos)) {\n for (const repo of repos) {\n if (!isObject(repo)) continue;\n const source = repo.source;\n const checkout = repo.checkout;\n const clone = repo.clone;\n\n // Source-less repos are only valid with Docker (repo exists inside container)\n if (!isObject(source) && !isObject(docker)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `workspace.repos[path=${repo.path ?? '(none)'}]`,\n message:\n 'repos[].source is required for non-Docker workspaces. ' +\n 'Source-less repos are only valid when workspace.docker is configured (repo exists inside the container).',\n });\n }\n\n if (isObject(source) && isObject(checkout)) {\n const sourceType = source.type;\n const resolve = checkout.resolve;\n if (sourceType === 'local' && typeof resolve === 'string') {\n errors.push({\n severity: 'warning',\n filePath,\n location: `workspace.repos[path=${repo.path ?? '(none)'}]`,\n message:\n 'checkout.resolve has no effect for a local source. ' +\n 'Use source.type to choose where the repo comes from; keep checkout.ref, checkout.base_commit, or checkout.ancestor only when pinning a local source.',\n });\n }\n }\n\n if (isObject(checkout) && isObject(clone)) {\n const ancestor = checkout.ancestor;\n const depth = clone.depth;\n if (typeof ancestor === 'number' && typeof depth === 'number' && depth < ancestor + 1) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `workspace.repos[path=${repo.path ?? '(none)'}]`,\n message:\n `clone.depth (${depth}) may be insufficient for checkout.ancestor (${ancestor}). ` +\n `Recommend depth >= ${ancestor + 1}.`,\n });\n }\n }\n }\n }\n\n // after_each reset with per_test isolation warning\n if (isObject(afterEachHook) && afterEachHook.reset && isolation === 'per_test') {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'workspace.hooks.after_each',\n message:\n 'hooks.after_each.reset is redundant with isolation: per_test (each test gets a fresh workspace).',\n });\n }\n}\n\nfunction validateMessages(\n messages: JsonArray,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i];\n const msgLocation = `${location}[${i}]`;\n\n if (!isObject(message)) {\n errors.push({\n severity: 'error',\n filePath,\n location: msgLocation,\n message: 'Message must be an object',\n });\n continue;\n }\n\n // Validate role field\n const role = message.role;\n const validRoles = ['system', 'user', 'assistant'];\n if (!validRoles.includes(role as string)) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${msgLocation}.role`,\n message: `Invalid role '${role}'. Must be one of: ${validRoles.join(', ')}`,\n });\n }\n\n // Validate content field (can be string, 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 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): void {\n const ext = path.extname(testsPath);\n if (!VALID_TEST_FILE_EXTENSIONS.has(ext)) {\n errors.push({\n severity: 'warning',\n filePath,\n location: 'tests',\n message: `Unsupported file extension '${ext}' for tests path '${testsPath}'. Supported extensions: ${[...VALID_TEST_FILE_EXTENSIONS].join(', ')}`,\n });\n }\n}\n\nfunction validateAssertArray(\n assertField: JsonValue,\n parentLocation: string,\n filePath: string,\n errors: ValidationError[],\n customAssertionTypes: ReadonlySet<string> = new Set(),\n): void {\n if (!Array.isArray(assertField)) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${parentLocation}.assertions`,\n message: \"'assertions' must be an array of assertion objects.\",\n });\n return;\n }\n\n // String items in the assertions 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: `${parentLocation}.assertions[${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: `${parentLocation}.assertions[${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 location = `${parentLocation}.assertions[${index}]`;\n\n // Validate type field\n const rawTypeValue = item.type;\n if (rawTypeValue === undefined || typeof rawTypeValue !== 'string') {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.type`,\n message: \"Assertion item is missing a 'type' field.\",\n });\n continue;\n }\n\n // Normalize snake_case to kebab-case for backward compatibility\n const typeValue = rawTypeValue.replace(/_/g, '-');\n\n if (!isGraderKind(typeValue) && !customAssertionTypes.has(typeValue)) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.type`,\n message: `Unknown assertion type '${rawTypeValue}'.`,\n });\n continue;\n }\n\n // Validate value field for types that require a string value\n if (ASSERTION_TYPES_WITH_STRING_VALUE.has(typeValue)) {\n const value = item.value;\n if (value === undefined || typeof value !== 'string') {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.value`,\n message: `Assertion type '${typeValue}' requires a 'value' field (string).`,\n });\n continue;\n }\n\n // For regex type, validate that the pattern is valid\n if (typeValue === 'regex') {\n try {\n new RegExp(value);\n } catch {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.value`,\n message: `Invalid regex pattern '${value}': not a valid regular expression.`,\n });\n }\n }\n }\n\n // Validate value field for types that require a string array value\n if (ASSERTION_TYPES_WITH_ARRAY_VALUE.has(typeValue)) {\n const value = item.value;\n if (!Array.isArray(value) || value.length === 0) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}.value`,\n message: `Assertion type '${typeValue}' requires a 'value' field (non-empty string array).`,\n });\n continue;\n }\n }\n\n // Validate required field if present\n const required = item.required;\n if (required !== undefined) {\n validateRequiredField(required, location, filePath, errors);\n }\n }\n}\n\nfunction validateRequiredField(\n required: JsonValue,\n parentLocation: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n if (typeof required === 'boolean') {\n return; // Valid\n }\n if (typeof required === 'number') {\n if (required <= 0 || required > 1) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${parentLocation}.required`,\n message: `Invalid 'required' value ${required}. When a number, it must be between 0 (exclusive) and 1 (inclusive).`,\n });\n }\n return;\n }\n errors.push({\n severity: 'warning',\n filePath,\n location: `${parentLocation}.required`,\n message: `Invalid 'required' value. Must be a boolean or a number between 0 (exclusive) and 1 (inclusive).`,\n });\n}\n\nfunction validateContentForRoleMarkers(\n content: string,\n location: string,\n filePath: string,\n errors: ValidationError[],\n): void {\n // Check for standard role markers that might confuse agentic providers\n const markers = ['@[System]:', '@[User]:', '@[Assistant]:', '@[Tool]:'];\n for (const marker of markers) {\n if (content.toLowerCase().includes(marker.toLowerCase())) {\n errors.push({\n severity: 'warning',\n filePath,\n location,\n message: `Content contains potential role marker '${marker}'. This may confuse agentic providers or cause prompt injection.`,\n });\n }\n }\n}\n\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} from '../providers/targets.js';\nimport { KNOWN_PROVIDERS, PROVIDER_ALIASES } 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[];\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\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 'api_format',\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 'model',\n 'executable',\n 'command',\n 'binary',\n 'args',\n 'arguments',\n 'cwd',\n 'timeout_seconds',\n 'log_dir',\n 'log_directory',\n 'log_format',\n 'log_output_format',\n 'system_prompt',\n]);\n\nconst COPILOT_SDK_SETTINGS = new Set([\n ...COMMON_SETTINGS,\n 'cli_url',\n 'cli_path',\n 'github_token',\n 'model',\n 'cwd',\n 'timeout_seconds',\n 'log_dir',\n 'log_format',\n 'system_prompt',\n 'byok',\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 'log_format',\n 'system_prompt',\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\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 'log_format',\n 'log_output_format',\n 'system_prompt',\n 'max_turns',\n 'max_budget_usd',\n]);\n\nconst CC_MIRROR_SETTINGS = new Set([...CLAUDE_SETTINGS, 'variant']);\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 case 'azure-openai':\n return AZURE_SETTINGS;\n case 'anthropic':\n return ANTHROPIC_SETTINGS;\n case 'gemini':\n case 'google':\n case 'google-gemini':\n return GEMINI_SETTINGS;\n case 'codex':\n case 'codex-cli':\n return CODEX_SETTINGS;\n case 'copilot-sdk':\n case 'copilot_sdk':\n return COPILOT_SDK_SETTINGS;\n case 'copilot':\n case 'copilot-cli':\n return COPILOT_CLI_SETTINGS;\n case 'cc-mirror':\n return CC_MIRROR_SETTINGS;\n case 'claude':\n case 'claude-code':\n case 'claude-cli':\n case 'claude-sdk':\n return CLAUDE_SETTINGS;\n case 'vscode':\n case 'vscode-insiders':\n return VSCODE_SETTINGS;\n case 'mock':\n return MOCK_SETTINGS;\n case 'cli':\n // CLI provider validation is now handled by Zod schema in resolveCliConfig()\n // Return null to skip duplicate validation in validateUnknownSettings()\n return null;\n default:\n return null; // Unknown provider, can't validate settings\n }\n}\n\nfunction validateUnknownSettings(\n target: JsonObject,\n provider: string,\n absolutePath: string,\n location: string,\n errors: ValidationError[],\n): void {\n const 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 'name',\n 'provider',\n 'grader_target',\n 'judge_target',\n 'workers',\n '$schema',\n 'targets',\n ]);\n\n const removedFields = new Set(['workspace_template', 'workspaceTemplate']);\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 workspace.template instead.',\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 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 {\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 // Validate targets array\n const targets = parsed.targets;\n if (!Array.isArray(targets)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: 'targets',\n message: \"Missing or invalid 'targets' field (must be an array)\",\n });\n return {\n valid: errors.length === 0,\n filePath: absolutePath,\n fileType: 'targets',\n errors,\n };\n }\n\n // Validate each target definition\n const knownProviders = [...KNOWN_PROVIDERS, ...PROVIDER_ALIASES];\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n const location = `targets[${i}]`;\n\n if (!isObject(target)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location,\n message: 'Target must be an object',\n });\n continue;\n }\n\n for (const warning of findDeprecatedCamelCaseTargetWarnings(target, location)) {\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: name\n const name = target.name;\n if (typeof name !== 'string' || name.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.name`,\n message: \"Missing or invalid 'name' field (must be a non-empty string)\",\n });\n }\n\n // Required field: provider\n const provider = target.provider;\n const hasUseTarget =\n typeof target.use_target === 'string' && target.use_target.trim().length > 0;\n const providerValue = typeof provider === 'string' ? provider.trim().toLowerCase() : undefined;\n const isTemplated = typeof provider === 'string' && /^\\$\\{\\{.+\\}\\}$/.test(provider.trim());\n if (!hasUseTarget && (typeof provider !== 'string' || provider.trim().length === 0)) {\n errors.push({\n severity: 'error',\n filePath: absolutePath,\n location: `${location}.provider`,\n message:\n \"Missing or invalid 'provider' field (must be a non-empty string, or use use_target for delegation)\",\n });\n } else if (typeof provider === 'string' && !isTemplated && !knownProviders.includes(provider)) {\n // Warning for unknown providers (non-fatal); skip when provider uses ${{ 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(target, absolutePath, location, errors);\n }\n\n // Check for unknown settings properties on target object\n if (typeof provider === 'string' && !isTemplated) {\n validateUnknownSettings(target, provider, absolutePath, location, errors);\n }\n\n // Optional field: grader_target / judge_target (must be string if present)\n const graderTarget = target.grader_target ?? target.judge_target;\n if (graderTarget !== undefined && typeof graderTarget !== 'string') {\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';\n\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(filePath: string): Promise<ValidationResult> {\n const errors: ValidationError[] = [];\n\n try {\n const content = await readFile(filePath, 'utf8');\n const parsed = parseYamlValue(content);\n\n // Check if parsed content is an object\n if (typeof parsed !== 'object' || parsed === null) {\n errors.push({\n severity: 'error',\n filePath,\n message: 'Config file must contain a valid YAML object',\n });\n return { valid: false, filePath, fileType: 'config', errors };\n }\n\n const config = parsed as Record<string, unknown>;\n\n // Validate 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 const results = config.results;\n if (results !== undefined) {\n if (typeof results !== 'object' || results === null || Array.isArray(results)) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'results',\n message: \"Field 'results' must be an object\",\n });\n } else {\n const exportConfig = (results as Record<string, unknown>).export;\n if (exportConfig !== undefined) {\n if (\n typeof exportConfig !== 'object' ||\n exportConfig === null ||\n Array.isArray(exportConfig)\n ) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'results.export',\n message: \"Field 'results.export' must be an object\",\n });\n } else {\n const exportRecord = exportConfig as Record<string, unknown>;\n if (typeof exportRecord.repo !== 'string' || exportRecord.repo.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'results.export.repo',\n message: \"Field 'results.export.repo' must be a non-empty string\",\n });\n }\n if (typeof exportRecord.path !== 'string' || exportRecord.path.trim().length === 0) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'results.export.path',\n message: \"Field 'results.export.path' must be a non-empty string\",\n });\n }\n if (\n exportRecord.auto_push !== undefined &&\n typeof exportRecord.auto_push !== 'boolean'\n ) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'results.export.auto_push',\n message: \"Field 'results.export.auto_push' must be a boolean\",\n });\n }\n if (\n exportRecord.branch_prefix !== undefined &&\n (typeof exportRecord.branch_prefix !== 'string' ||\n exportRecord.branch_prefix.trim().length === 0)\n ) {\n errors.push({\n severity: 'error',\n filePath,\n location: 'results.export.branch_prefix',\n message: \"Field 'results.export.branch_prefix' must be a non-empty string\",\n });\n }\n }\n }\n }\n }\n\n const allowedFields = new Set([\n '$schema',\n 'eval_patterns',\n 'required_version',\n 'execution',\n 'results',\n 'studio',\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","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 let cases: JsonValue | undefined = parsed.tests;\n if (cases === undefined && 'eval_cases' in parsed) {\n cases = parsed.eval_cases;\n }\n if (cases === undefined && 'evalcases' in parsed) {\n cases = parsed.evalcases;\n }\n if (!Array.isArray(cases)) {\n return errors;\n }\n\n for (let i = 0; i < cases.length; i++) {\n const evalCase = cases[i];\n if (!isObject(evalCase)) {\n continue;\n }\n\n // Check input\n const inputField = evalCase.input;\n if (Array.isArray(inputField)) {\n await validateMessagesFileRefs(\n inputField,\n `tests[${i}].input`,\n searchRoots,\n absolutePath,\n errors,\n );\n }\n\n // Check expected_output\n const expectedOutputField = evalCase.expected_output;\n if (Array.isArray(expectedOutputField)) {\n await validateMessagesFileRefs(\n expectedOutputField,\n `tests[${i}].expected_output`,\n searchRoots,\n absolutePath,\n errors,\n );\n }\n }\n\n return errors;\n}\n\nasync function validateMessagesFileRefs(\n messages: JsonArray,\n location: string,\n searchRoots: readonly string[],\n filePath: string,\n errors: ValidationError[],\n): Promise<void> {\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i];\n if (!isObject(message)) {\n continue;\n }\n\n const content = message.content;\n if (typeof content === 'string') {\n continue;\n }\n\n if (!Array.isArray(content)) {\n continue;\n }\n\n for (let j = 0; j < content.length; j++) {\n const contentItem = content[j];\n if (!isObject(contentItem)) {\n continue;\n }\n\n const type = contentItem.type;\n if (type !== 'file') {\n continue;\n }\n\n const value = contentItem.value;\n if (typeof value !== 'string') {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}[${i}].content[${j}].value`,\n message: \"File reference must have a 'value' field with the file path\",\n });\n continue;\n }\n\n // Use the same file resolution logic as yaml-parser at runtime\n const { resolvedPath } = await resolveFileReference(value, searchRoots);\n\n if (!resolvedPath) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}[${i}].content[${j}]`,\n message: `Referenced file not found: ${value}`,\n });\n } else {\n // Check that file is not empty\n try {\n const fileContent = await readFile(resolvedPath, 'utf8');\n if (fileContent.trim().length === 0) {\n errors.push({\n severity: 'warning',\n filePath,\n location: `${location}[${i}].content[${j}]`,\n message: `Referenced file is empty: ${value}`,\n });\n }\n } catch (error) {\n errors.push({\n severity: 'error',\n filePath,\n location: `${location}[${i}].content[${j}]`,\n message: `Cannot read referenced file: ${value} (${(error as Error).message})`,\n });\n }\n }\n }\n }\n}\n","import { 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\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 // Support both `command` (canonical) and `script` (deprecated alias)\n const command = hook.command ?? hook.script;\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"],"mappings":"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","names":["readFile","path","path","readFile","readFile","path","isObject","path","readFile","readFile","path","isObject","path","readFile","absolutePath","errors","readFile","readFile","readFile","path","isObject","path","readFile","readFile","path","isObject","path","readFile"]}
|