@agentv/core 0.22.0 → 0.22.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.
@@ -689,4 +689,4 @@ export {
689
689
  PROVIDER_ALIASES,
690
690
  isAgentProvider
691
691
  };
692
- //# sourceMappingURL=chunk-BO7KG7JX.js.map
692
+ //# sourceMappingURL=chunk-B2J23S7D.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/evaluation/file-utils.ts","../src/evaluation/providers/targets.ts","../src/evaluation/providers/types.ts"],"sourcesContent":["import { constants } from 'node:fs';\nimport { access, readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Normalize line endings to LF (\\n).\n * This ensures consistent behavior across Windows (CRLF) and Unix (LF) systems.\n */\nexport function normalizeLineEndings(content: string): string {\n return content.replace(/\\r\\n/g, '\\n');\n}\n\n/**\n * Read a text file and normalize line endings to LF (\\n).\n * This ensures consistent behavior across Windows (CRLF) and Unix (LF) systems.\n */\nexport async function readTextFile(filePath: string): Promise<string> {\n const content = await readFile(filePath, 'utf8');\n return normalizeLineEndings(content);\n}\n\n/**\n * Find git repository root by walking up the directory tree.\n */\nexport async function findGitRoot(startPath: string): Promise<string | null> {\n let currentDir = path.dirname(path.resolve(startPath));\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const gitPath = path.join(currentDir, '.git');\n if (await fileExists(gitPath)) {\n return currentDir;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n\n return null;\n}\n\n/**\n * Build a chain of directories walking from a file's location up to repo root.\n * Used for discovering configuration files like targets.yaml or config.yaml.\n */\nexport function buildDirectoryChain(filePath: string, repoRoot: string): readonly string[] {\n const directories: string[] = [];\n const seen = new Set<string>();\n const boundary = path.resolve(repoRoot);\n let current: string | undefined = path.resolve(path.dirname(filePath));\n\n while (current !== undefined) {\n if (!seen.has(current)) {\n directories.push(current);\n seen.add(current);\n }\n if (current === boundary) {\n break;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n if (!seen.has(boundary)) {\n directories.push(boundary);\n }\n\n return directories;\n}\n\n/**\n * Build search roots for file resolution, matching yaml-parser behavior.\n * Searches from eval file directory up to repo root.\n */\nexport function buildSearchRoots(evalPath: string, repoRoot: string): readonly string[] {\n const uniqueRoots: string[] = [];\n const addRoot = (root: string): void => {\n const normalized = path.resolve(root);\n if (!uniqueRoots.includes(normalized)) {\n uniqueRoots.push(normalized);\n }\n };\n\n let currentDir = path.dirname(evalPath);\n let reachedBoundary = false;\n while (!reachedBoundary) {\n addRoot(currentDir);\n const parentDir = path.dirname(currentDir);\n if (currentDir === repoRoot || parentDir === currentDir) {\n reachedBoundary = true;\n } else {\n currentDir = parentDir;\n }\n }\n\n addRoot(repoRoot);\n addRoot(process.cwd());\n return uniqueRoots;\n}\n\n/**\n * Trim leading path separators for display.\n */\nfunction trimLeadingSeparators(value: string): string {\n const trimmed = value.replace(/^[/\\\\]+/, '');\n return trimmed.length > 0 ? trimmed : value;\n}\n\n/**\n * Resolve a file reference using search roots, matching yaml-parser behavior.\n */\nexport async function resolveFileReference(\n rawValue: string,\n searchRoots: readonly string[],\n): Promise<{\n readonly displayPath: string;\n readonly resolvedPath?: string;\n readonly attempted: readonly string[];\n}> {\n const displayPath = trimLeadingSeparators(rawValue);\n const potentialPaths: string[] = [];\n\n if (path.isAbsolute(rawValue)) {\n potentialPaths.push(path.normalize(rawValue));\n }\n\n for (const base of searchRoots) {\n potentialPaths.push(path.resolve(base, displayPath));\n }\n\n const attempted: string[] = [];\n const seen = new Set<string>();\n for (const candidate of potentialPaths) {\n const absoluteCandidate = path.resolve(candidate);\n if (seen.has(absoluteCandidate)) {\n continue;\n }\n seen.add(absoluteCandidate);\n attempted.push(absoluteCandidate);\n if (await fileExists(absoluteCandidate)) {\n return { displayPath, resolvedPath: absoluteCandidate, attempted };\n }\n }\n\n return { displayPath, attempted };\n}\n","import { z } from 'zod';\n\nimport type { EnvLookup, TargetDefinition } from './types.js';\n\nexport const CLI_PLACEHOLDERS = new Set([\n 'PROMPT',\n 'GUIDELINES',\n 'EVAL_ID',\n 'ATTEMPT',\n 'FILES',\n 'OUTPUT_FILE',\n]);\n\nexport interface RetryConfig {\n readonly maxRetries?: number;\n readonly initialDelayMs?: number;\n readonly maxDelayMs?: number;\n readonly backoffFactor?: number;\n readonly retryableStatusCodes?: readonly number[];\n}\n\n/**\n * Azure OpenAI settings used by the Vercel AI SDK.\n */\nexport interface AzureResolvedConfig {\n readonly resourceName: string;\n readonly deploymentName: string;\n readonly apiKey: string;\n readonly version?: string;\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly retry?: RetryConfig;\n}\n\n/**\n * Anthropic Claude settings used by the Vercel AI SDK.\n */\nexport interface AnthropicResolvedConfig {\n readonly apiKey: string;\n readonly model: string;\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly thinkingBudget?: number;\n readonly retry?: RetryConfig;\n}\n\n/**\n * Google Gemini settings used by the Vercel AI SDK.\n */\nexport interface GeminiResolvedConfig {\n readonly apiKey: string;\n readonly model: string;\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly retry?: RetryConfig;\n}\n\nexport interface CodexResolvedConfig {\n readonly executable: string;\n readonly args?: readonly string[];\n readonly cwd?: string;\n readonly timeoutMs?: number;\n readonly logDir?: string;\n readonly logFormat?: 'summary' | 'json';\n}\n\nexport interface MockResolvedConfig {\n readonly response?: string;\n readonly delayMs?: number;\n readonly delayMinMs?: number;\n readonly delayMaxMs?: number;\n}\n\nexport interface VSCodeResolvedConfig {\n readonly command: string;\n readonly waitForResponse: boolean;\n readonly dryRun: boolean;\n readonly subagentRoot?: string;\n readonly workspaceTemplate?: string;\n}\n\nexport type CliHealthcheck =\n | {\n readonly type: 'http';\n readonly url: string;\n readonly timeoutMs?: number;\n }\n | {\n readonly type: 'command';\n readonly commandTemplate: string;\n readonly timeoutMs?: number;\n readonly cwd?: string;\n };\n\nexport interface CliResolvedConfig {\n readonly commandTemplate: string;\n readonly filesFormat?: string;\n readonly cwd?: string;\n readonly timeoutMs?: number;\n readonly healthcheck?: CliHealthcheck;\n readonly verbose?: boolean;\n}\n\nexport type ResolvedTarget =\n | {\n readonly kind: 'azure';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: AzureResolvedConfig;\n }\n | {\n readonly kind: 'anthropic';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: AnthropicResolvedConfig;\n }\n | {\n readonly kind: 'gemini';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: GeminiResolvedConfig;\n }\n | {\n readonly kind: 'codex';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: CodexResolvedConfig;\n }\n | {\n readonly kind: 'mock';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: MockResolvedConfig;\n }\n | {\n readonly kind: 'vscode' | 'vscode-insiders';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: VSCodeResolvedConfig;\n }\n | {\n readonly kind: 'cli';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: CliResolvedConfig;\n };\n\nconst BASE_TARGET_SCHEMA = z\n .object({\n name: z.string().min(1, 'target name is required'),\n provider: z.string().min(1, 'provider is required'),\n judge_target: z.string().optional(),\n workers: z.number().int().min(1).optional(),\n })\n .passthrough();\n\nconst DEFAULT_AZURE_API_VERSION = '2024-10-01-preview';\n\nfunction normalizeAzureApiVersion(value: string | undefined): string {\n if (!value) {\n return DEFAULT_AZURE_API_VERSION;\n }\n\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return DEFAULT_AZURE_API_VERSION;\n }\n\n const withoutPrefix = trimmed.replace(/^api[-_]?version\\s*=\\s*/i, '').trim();\n return withoutPrefix.length > 0 ? withoutPrefix : DEFAULT_AZURE_API_VERSION;\n}\n\nfunction resolveRetryConfig(target: z.infer<typeof BASE_TARGET_SCHEMA>): RetryConfig | undefined {\n const maxRetries = resolveOptionalNumber(\n target.max_retries ?? target.maxRetries,\n `${target.name} max retries`,\n );\n const initialDelayMs = resolveOptionalNumber(\n target.retry_initial_delay_ms ?? target.retryInitialDelayMs,\n `${target.name} retry initial delay`,\n );\n const maxDelayMs = resolveOptionalNumber(\n target.retry_max_delay_ms ?? target.retryMaxDelayMs,\n `${target.name} retry max delay`,\n );\n const backoffFactor = resolveOptionalNumber(\n target.retry_backoff_factor ?? target.retryBackoffFactor,\n `${target.name} retry backoff factor`,\n );\n const retryableStatusCodes = resolveOptionalNumberArray(\n target.retry_status_codes ?? target.retryStatusCodes,\n `${target.name} retry status codes`,\n );\n\n // Only return retry config if at least one field is set\n if (\n maxRetries === undefined &&\n initialDelayMs === undefined &&\n maxDelayMs === undefined &&\n backoffFactor === undefined &&\n retryableStatusCodes === undefined\n ) {\n return undefined;\n }\n\n return {\n maxRetries,\n initialDelayMs,\n maxDelayMs,\n backoffFactor,\n retryableStatusCodes,\n };\n}\n\nexport function resolveTargetDefinition(\n definition: TargetDefinition,\n env: EnvLookup = process.env,\n): ResolvedTarget {\n const parsed = BASE_TARGET_SCHEMA.parse(definition);\n const provider = parsed.provider.toLowerCase();\n const providerBatching = resolveOptionalBoolean(\n parsed.provider_batching ?? parsed.providerBatching,\n );\n\n switch (provider) {\n case 'azure':\n case 'azure-openai':\n return {\n kind: 'azure',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveAzureConfig(parsed, env),\n };\n case 'anthropic':\n return {\n kind: 'anthropic',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveAnthropicConfig(parsed, env),\n };\n case 'gemini':\n case 'google':\n case 'google-gemini':\n return {\n kind: 'gemini',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveGeminiConfig(parsed, env),\n };\n case 'codex':\n case 'codex-cli':\n return {\n kind: 'codex',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveCodexConfig(parsed, env),\n };\n case 'mock':\n return {\n kind: 'mock',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveMockConfig(parsed),\n };\n case 'vscode':\n case 'vscode-insiders':\n return {\n kind: provider as 'vscode' | 'vscode-insiders',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveVSCodeConfig(parsed, env, provider === 'vscode-insiders'),\n };\n case 'cli':\n return {\n kind: 'cli',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveCliConfig(parsed, env),\n };\n default:\n throw new Error(`Unsupported provider '${parsed.provider}' in target '${parsed.name}'`);\n }\n}\n\nfunction resolveAzureConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): AzureResolvedConfig {\n const endpointSource = target.endpoint ?? target.resource ?? target.resourceName;\n const apiKeySource = target.api_key ?? target.apiKey;\n const deploymentSource = target.deployment ?? target.deploymentName ?? target.model;\n const versionSource = target.version ?? target.api_version;\n const temperatureSource = target.temperature;\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\n\n const resourceName = resolveString(endpointSource, env, `${target.name} endpoint`);\n const apiKey = resolveString(apiKeySource, env, `${target.name} api key`);\n const deploymentName = resolveString(deploymentSource, env, `${target.name} deployment`);\n const version = normalizeAzureApiVersion(\n resolveOptionalString(versionSource, env, `${target.name} api version`),\n );\n const temperature = resolveOptionalNumber(temperatureSource, `${target.name} temperature`);\n const maxOutputTokens = resolveOptionalNumber(\n maxTokensSource,\n `${target.name} max output tokens`,\n );\n const retry = resolveRetryConfig(target);\n\n return {\n resourceName,\n deploymentName,\n apiKey,\n version,\n temperature,\n maxOutputTokens,\n retry,\n };\n}\n\nfunction resolveAnthropicConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): AnthropicResolvedConfig {\n const apiKeySource = target.api_key ?? target.apiKey;\n const modelSource = target.model ?? target.deployment ?? target.variant;\n const temperatureSource = target.temperature;\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\n const thinkingBudgetSource = target.thinking_budget ?? target.thinkingBudget;\n\n const apiKey = resolveString(apiKeySource, env, `${target.name} Anthropic api key`);\n const model = resolveString(modelSource, env, `${target.name} Anthropic model`);\n const retry = resolveRetryConfig(target);\n\n return {\n apiKey,\n model,\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\n thinkingBudget: resolveOptionalNumber(thinkingBudgetSource, `${target.name} thinking budget`),\n retry,\n };\n}\n\nfunction resolveGeminiConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): GeminiResolvedConfig {\n const apiKeySource = target.api_key ?? target.apiKey;\n const modelSource = target.model ?? target.deployment ?? target.variant;\n const temperatureSource = target.temperature;\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\n\n const apiKey = resolveString(apiKeySource, env, `${target.name} Google API key`);\n const model =\n resolveOptionalString(modelSource, env, `${target.name} Gemini model`, {\n allowLiteral: true,\n optionalEnv: true,\n }) ?? 'gemini-2.5-flash';\n const retry = resolveRetryConfig(target);\n\n return {\n apiKey,\n model,\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\n retry,\n };\n}\n\nfunction resolveCodexConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): CodexResolvedConfig {\n const executableSource = target.executable ?? target.command ?? target.binary;\n const argsSource = target.args ?? target.arguments;\n const cwdSource = target.cwd;\n const timeoutSource = target.timeout_seconds ?? target.timeoutSeconds;\n const logDirSource =\n target.log_dir ?? target.logDir ?? target.log_directory ?? target.logDirectory;\n const logFormatSource =\n target.log_format ??\n target.logFormat ??\n target.log_output_format ??\n target.logOutputFormat ??\n env.AGENTV_CODEX_LOG_FORMAT;\n\n const executable =\n resolveOptionalString(executableSource, env, `${target.name} codex executable`, {\n allowLiteral: true,\n optionalEnv: true,\n }) ?? 'codex';\n\n const args = resolveOptionalStringArray(argsSource, env, `${target.name} codex args`);\n\n const cwd = resolveOptionalString(cwdSource, env, `${target.name} codex cwd`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n const timeoutMs = resolveTimeoutMs(timeoutSource, `${target.name} codex timeout`);\n const logDir = resolveOptionalString(logDirSource, env, `${target.name} codex log directory`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n const logFormat = normalizeCodexLogFormat(logFormatSource);\n\n return {\n executable,\n args,\n cwd,\n timeoutMs,\n logDir,\n logFormat,\n };\n}\n\nfunction normalizeCodexLogFormat(value: unknown): 'summary' | 'json' | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== 'string') {\n throw new Error(\"codex log format must be 'summary' or 'json'\");\n }\n const normalized = value.trim().toLowerCase();\n if (normalized === 'json' || normalized === 'summary') {\n return normalized;\n }\n throw new Error(\"codex log format must be 'summary' or 'json'\");\n}\n\nfunction resolveMockConfig(target: z.infer<typeof BASE_TARGET_SCHEMA>): MockResolvedConfig {\n const response = typeof target.response === 'string' ? target.response : undefined;\n return { response };\n}\n\nfunction resolveVSCodeConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n insiders: boolean,\n): VSCodeResolvedConfig {\n const workspaceTemplateEnvVar = resolveOptionalLiteralString(\n target.workspace_template ?? target.workspaceTemplate,\n );\n const workspaceTemplate = workspaceTemplateEnvVar\n ? resolveOptionalString(\n workspaceTemplateEnvVar,\n env,\n `${target.name} workspace template path`,\n {\n allowLiteral: false,\n optionalEnv: true,\n },\n )\n : undefined;\n\n const commandSource = target.vscode_cmd ?? target.command;\n const waitSource = target.wait;\n const dryRunSource = target.dry_run ?? target.dryRun;\n const subagentRootSource = target.subagent_root ?? target.subagentRoot;\n\n const defaultCommand = insiders ? 'code-insiders' : 'code';\n const command = resolveOptionalLiteralString(commandSource) ?? defaultCommand;\n\n return {\n command,\n waitForResponse: resolveOptionalBoolean(waitSource) ?? true,\n dryRun: resolveOptionalBoolean(dryRunSource) ?? false,\n subagentRoot: resolveOptionalString(subagentRootSource, env, `${target.name} subagent root`, {\n allowLiteral: true,\n optionalEnv: true,\n }),\n workspaceTemplate,\n };\n}\n\nfunction resolveCliConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): CliResolvedConfig {\n const commandTemplateSource = target.command_template ?? target.commandTemplate;\n const filesFormat = resolveOptionalLiteralString(\n target.files_format ??\n target.filesFormat ??\n target.attachments_format ??\n target.attachmentsFormat,\n );\n const cwd = resolveOptionalString(target.cwd, env, `${target.name} working directory`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n const timeoutMs = resolveTimeoutMs(\n target.timeout_seconds ?? target.timeoutSeconds,\n `${target.name} timeout`,\n );\n const healthcheck = resolveCliHealthcheck(target.healthcheck, env, target.name);\n\n const commandTemplate = resolveString(\n commandTemplateSource,\n env,\n `${target.name} CLI command template`,\n true,\n );\n assertSupportedCliPlaceholders(commandTemplate, `${target.name} CLI command template`);\n\n return {\n commandTemplate,\n filesFormat,\n cwd,\n timeoutMs,\n healthcheck,\n };\n}\n\nfunction resolveTimeoutMs(source: unknown, description: string): number | undefined {\n const seconds = resolveOptionalNumber(source, `${description} (seconds)`);\n if (seconds === undefined) {\n return undefined;\n }\n if (seconds <= 0) {\n throw new Error(`${description} must be greater than zero seconds`);\n }\n return Math.floor(seconds * 1000);\n}\n\nfunction resolveCliHealthcheck(\n source: unknown,\n env: EnvLookup,\n targetName: string,\n): CliHealthcheck | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (typeof source !== 'object' || Array.isArray(source)) {\n throw new Error(`${targetName} healthcheck must be an object`);\n }\n\n const candidate = source as Record<string, unknown>;\n const type = candidate.type;\n const timeoutMs = resolveTimeoutMs(\n candidate.timeout_seconds ?? candidate.timeoutSeconds,\n `${targetName} healthcheck timeout`,\n );\n\n if (type === 'http') {\n const url = resolveString(candidate.url, env, `${targetName} healthcheck URL`);\n return {\n type: 'http',\n url,\n timeoutMs,\n };\n }\n\n if (type === 'command') {\n const commandTemplate = resolveString(\n candidate.command_template ?? candidate.commandTemplate,\n env,\n `${targetName} healthcheck command template`,\n true,\n );\n assertSupportedCliPlaceholders(commandTemplate, `${targetName} healthcheck command template`);\n const cwd = resolveOptionalString(candidate.cwd, env, `${targetName} healthcheck cwd`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n return {\n type: 'command',\n commandTemplate,\n timeoutMs,\n cwd,\n };\n }\n\n throw new Error(`${targetName} healthcheck type must be 'http' or 'command'`);\n}\n\nfunction assertSupportedCliPlaceholders(template: string, description: string): void {\n const placeholders = extractCliPlaceholders(template);\n for (const placeholder of placeholders) {\n if (!CLI_PLACEHOLDERS.has(placeholder)) {\n throw new Error(\n `${description} includes unsupported placeholder '{${placeholder}}'. Supported placeholders: ${Array.from(CLI_PLACEHOLDERS).join(', ')}`,\n );\n }\n }\n}\n\nfunction extractCliPlaceholders(template: string): string[] {\n const matches = template.matchAll(/\\{([A-Z_]+)\\}/g);\n const results: string[] = [];\n for (const match of matches) {\n if (match[1]) {\n results.push(match[1]);\n }\n }\n return results;\n}\n\nfunction resolveString(\n source: unknown,\n env: EnvLookup,\n description: string,\n allowLiteral = false,\n): string {\n const value = resolveOptionalString(source, env, description, {\n allowLiteral,\n optionalEnv: false,\n });\n if (value === undefined) {\n throw new Error(`${description} is required`);\n }\n return value;\n}\n\nfunction resolveOptionalString(\n source: unknown,\n env: EnvLookup,\n description: string,\n options?: { allowLiteral?: boolean; optionalEnv?: boolean },\n): string | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (typeof source !== 'string') {\n throw new Error(`${description} must be a string`);\n }\n const trimmed = source.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n\n // Check for ${{ variable }} syntax\n const envVarMatch = trimmed.match(/^\\$\\{\\{\\s*([A-Z0-9_]+)\\s*\\}\\}$/i);\n if (envVarMatch) {\n const varName = envVarMatch[1];\n const envValue = env[varName];\n if (envValue !== undefined) {\n if (envValue.trim().length === 0) {\n throw new Error(`Environment variable '${varName}' for ${description} is empty`);\n }\n return envValue;\n }\n const optionalEnv = options?.optionalEnv ?? false;\n if (optionalEnv) {\n return undefined;\n }\n throw new Error(`Environment variable '${varName}' required for ${description} is not set`);\n }\n\n // Return as literal value\n const allowLiteral = options?.allowLiteral ?? false;\n if (!allowLiteral) {\n throw new Error(\n `${description} must use \\${{ VARIABLE_NAME }} syntax for environment variables or be marked as allowing literals`,\n );\n }\n return trimmed;\n}\n\nfunction resolveOptionalLiteralString(source: unknown): string | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (typeof source !== 'string') {\n throw new Error('expected string value');\n }\n const trimmed = source.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction resolveOptionalNumber(source: unknown, description: string): number | undefined {\n if (source === undefined || source === null || source === '') {\n return undefined;\n }\n if (typeof source === 'number') {\n return Number.isFinite(source) ? source : undefined;\n }\n if (typeof source === 'string') {\n const numeric = Number(source);\n if (Number.isFinite(numeric)) {\n return numeric;\n }\n }\n throw new Error(`${description} must be a number`);\n}\n\nfunction resolveOptionalBoolean(source: unknown): boolean | undefined {\n if (source === undefined || source === null || source === '') {\n return undefined;\n }\n if (typeof source === 'boolean') {\n return source;\n }\n if (typeof source === 'string') {\n const lowered = source.trim().toLowerCase();\n if (lowered === 'true' || lowered === '1') {\n return true;\n }\n if (lowered === 'false' || lowered === '0') {\n return false;\n }\n }\n throw new Error('expected boolean value');\n}\n\nfunction resolveOptionalStringArray(\n source: unknown,\n env: EnvLookup,\n description: string,\n): readonly string[] | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (!Array.isArray(source)) {\n throw new Error(`${description} must be an array of strings`);\n }\n if (source.length === 0) {\n return undefined;\n }\n const resolved: string[] = [];\n for (let i = 0; i < source.length; i++) {\n const item = source[i];\n if (typeof item !== 'string') {\n throw new Error(`${description}[${i}] must be a string`);\n }\n const trimmed = item.trim();\n if (trimmed.length === 0) {\n throw new Error(`${description}[${i}] cannot be empty`);\n }\n\n // Check for ${{ variable }} syntax\n const envVarMatch = trimmed.match(/^\\$\\{\\{\\s*([A-Z0-9_]+)\\s*\\}\\}$/i);\n if (envVarMatch) {\n const varName = envVarMatch[1];\n const envValue = env[varName];\n if (envValue !== undefined) {\n if (envValue.trim().length === 0) {\n throw new Error(`Environment variable '${varName}' for ${description}[${i}] is empty`);\n }\n resolved.push(envValue);\n continue;\n }\n throw new Error(`Environment variable '${varName}' for ${description}[${i}] is not set`);\n }\n\n // Treat as literal value\n resolved.push(trimmed);\n }\n return resolved.length > 0 ? resolved : undefined;\n}\n\nfunction resolveOptionalNumberArray(\n source: unknown,\n description: string,\n): readonly number[] | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (!Array.isArray(source)) {\n throw new Error(`${description} must be an array of numbers`);\n }\n if (source.length === 0) {\n return undefined;\n }\n const resolved: number[] = [];\n for (let i = 0; i < source.length; i++) {\n const item = source[i];\n if (typeof item !== 'number' || !Number.isFinite(item)) {\n throw new Error(`${description}[${i}] must be a number`);\n }\n resolved.push(item);\n }\n return resolved.length > 0 ? resolved : undefined;\n}\n","import type { JsonObject } from '../types.js';\r\n\r\nexport type ChatMessageRole = 'system' | 'user' | 'assistant' | 'tool' | 'function';\r\n\r\nexport interface ChatMessage {\r\n readonly role: ChatMessageRole;\r\n readonly content: string;\r\n readonly name?: string;\r\n}\r\n\r\nexport type ChatPrompt = readonly ChatMessage[];\r\n\r\nexport type ProviderKind =\r\n | 'azure'\r\n | 'anthropic'\r\n | 'gemini'\r\n | 'codex'\r\n | 'cli'\r\n | 'mock'\r\n | 'vscode'\r\n | 'vscode-insiders';\r\n\r\n/**\r\n * Agent providers that have filesystem access and don't need unwrapped guidelines.\r\n * These providers read files directly from the filesystem using file:// URIs.\r\n */\r\nexport const AGENT_PROVIDER_KINDS: readonly ProviderKind[] = [\r\n 'codex',\r\n 'vscode',\r\n 'vscode-insiders',\r\n] as const;\r\n\r\n/**\r\n * List of all supported provider kinds.\r\n * This is the source of truth for provider validation.\r\n */\r\nexport const KNOWN_PROVIDERS: readonly ProviderKind[] = [\r\n 'azure',\r\n 'anthropic',\r\n 'gemini',\r\n 'codex',\r\n 'cli',\r\n 'mock',\r\n 'vscode',\r\n 'vscode-insiders',\r\n] as const;\r\n\r\n/**\r\n * Provider aliases that are accepted in target definitions.\r\n * These map to the canonical ProviderKind values.\r\n */\r\nexport const PROVIDER_ALIASES: readonly string[] = [\r\n 'azure-openai', // alias for \"azure\"\r\n 'google', // alias for \"gemini\"\r\n 'google-gemini', // alias for \"gemini\"\r\n 'codex-cli', // alias for \"codex\"\r\n 'openai', // legacy/future support\r\n 'bedrock', // legacy/future support\r\n 'vertex', // legacy/future support\r\n] as const;\r\n\r\n/**\r\n * Schema identifier for targets.yaml files (version 2).\r\n */\r\nexport const TARGETS_SCHEMA_V2 = 'agentv-targets-v2.2';\r\n\r\nexport interface ProviderRequest {\r\n readonly question: string;\r\n readonly systemPrompt?: string;\r\n readonly guidelines?: string;\r\n readonly guideline_patterns?: readonly string[];\r\n readonly chatPrompt?: ChatPrompt;\r\n readonly inputFiles?: readonly string[];\r\n readonly evalCaseId?: string;\r\n readonly attempt?: number;\r\n readonly maxOutputTokens?: number;\r\n readonly temperature?: number;\r\n readonly metadata?: JsonObject;\r\n readonly signal?: AbortSignal;\r\n}\r\n\r\nexport interface ProviderResponse {\r\n readonly text: string;\r\n readonly reasoning?: string;\r\n readonly raw?: unknown;\r\n readonly usage?: JsonObject;\r\n}\r\n\r\n/**\r\n * Type guard to check if a provider is an agent provider with filesystem access.\r\n * Agent providers read files directly and don't need unwrapped guideline content.\r\n */\r\nexport function isAgentProvider(provider: Provider | undefined): boolean {\r\n return provider ? AGENT_PROVIDER_KINDS.includes(provider.kind) : false;\r\n}\r\n\r\nexport interface Provider {\r\n readonly id: string;\r\n readonly kind: ProviderKind;\r\n readonly targetName: string;\r\n invoke(request: ProviderRequest): Promise<ProviderResponse>;\r\n /**\r\n * Optional capability marker for provider-managed batching (single session handling multiple requests).\r\n */\r\n readonly supportsBatch?: boolean;\r\n /**\r\n * Optional batch invocation hook. When defined alongside supportsBatch=true,\r\n * the orchestrator may send multiple requests in a single provider session.\r\n */\r\n invokeBatch?(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]>;\r\n /**\r\n * Optional method to get a Vercel AI SDK LanguageModel instance for structured output generation.\r\n * Used by evaluators that need generateObject/generateText from the AI SDK.\r\n */\r\n asLanguageModel?(): import('ai').LanguageModel;\r\n}\r\n\r\nexport type EnvLookup = Readonly<Record<string, string | undefined>>;\r\n\r\nexport interface TargetDefinition {\r\n readonly name: string;\r\n readonly provider: ProviderKind | string;\r\n readonly judge_target?: string | undefined;\r\n readonly workers?: number | undefined;\r\n // Provider batching\r\n readonly provider_batching?: boolean | undefined;\r\n readonly providerBatching?: boolean | undefined;\r\n // Azure fields\r\n readonly endpoint?: string | unknown | undefined;\r\n readonly resource?: string | unknown | undefined;\r\n readonly resourceName?: string | unknown | undefined;\r\n readonly api_key?: string | unknown | undefined;\r\n readonly apiKey?: string | unknown | undefined;\r\n readonly deployment?: string | unknown | undefined;\r\n readonly deploymentName?: string | unknown | undefined;\r\n readonly model?: string | unknown | undefined;\r\n readonly version?: string | unknown | undefined;\r\n readonly api_version?: string | unknown | undefined;\r\n // Anthropic fields\r\n readonly variant?: string | unknown | undefined;\r\n readonly thinking_budget?: number | unknown | undefined;\r\n readonly thinkingBudget?: number | unknown | undefined;\r\n // Common fields\r\n readonly temperature?: number | unknown | undefined;\r\n readonly max_output_tokens?: number | unknown | undefined;\r\n readonly maxTokens?: number | unknown | undefined;\r\n // Codex fields\r\n readonly executable?: string | unknown | undefined;\r\n readonly command?: string | unknown | undefined;\r\n readonly binary?: string | unknown | undefined;\r\n readonly args?: unknown | undefined;\r\n readonly arguments?: unknown | undefined;\r\n readonly cwd?: string | unknown | undefined;\r\n readonly timeout_seconds?: number | unknown | undefined;\r\n readonly timeoutSeconds?: number | unknown | undefined;\r\n readonly log_dir?: string | unknown | undefined;\r\n readonly logDir?: string | unknown | undefined;\r\n readonly log_directory?: string | unknown | undefined;\r\n readonly logDirectory?: string | unknown | undefined;\r\n readonly log_format?: string | unknown | undefined;\r\n readonly logFormat?: string | unknown | undefined;\r\n readonly log_output_format?: string | unknown | undefined;\r\n readonly logOutputFormat?: string | unknown | undefined;\r\n // Mock fields\r\n readonly response?: string | unknown | undefined;\r\n readonly delayMs?: number | unknown | undefined;\r\n readonly delayMinMs?: number | unknown | undefined;\r\n readonly delayMaxMs?: number | unknown | undefined;\r\n // VSCode fields\r\n readonly vscode_cmd?: string | unknown | undefined;\r\n readonly wait?: boolean | unknown | undefined;\r\n readonly dry_run?: boolean | unknown | undefined;\r\n readonly dryRun?: boolean | unknown | undefined;\r\n readonly subagent_root?: string | unknown | undefined;\r\n readonly subagentRoot?: string | unknown | undefined;\r\n readonly workspace_template?: string | unknown | undefined;\r\n readonly workspaceTemplate?: string | unknown | undefined;\r\n // CLI fields\r\n readonly command_template?: string | unknown | undefined;\r\n readonly commandTemplate?: string | unknown | undefined;\r\n readonly files_format?: string | unknown | undefined;\r\n readonly filesFormat?: string | unknown | undefined;\r\n readonly attachments_format?: string | unknown | undefined;\r\n readonly attachmentsFormat?: string | unknown | undefined;\r\n readonly env?: unknown | undefined;\r\n readonly healthcheck?: unknown | undefined;\r\n // Retry configuration fields\r\n readonly max_retries?: number | unknown | undefined;\r\n readonly maxRetries?: number | unknown | undefined;\r\n readonly retry_initial_delay_ms?: number | unknown | undefined;\r\n readonly retryInitialDelayMs?: number | unknown | undefined;\r\n readonly retry_max_delay_ms?: number | unknown | undefined;\r\n readonly retryMaxDelayMs?: number | unknown | undefined;\r\n readonly retry_backoff_factor?: number | unknown | undefined;\r\n readonly retryBackoffFactor?: number | unknown | undefined;\r\n readonly retry_status_codes?: unknown | undefined;\r\n readonly retryStatusCodes?: unknown | undefined;\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/evaluation/file-utils.ts","../src/evaluation/providers/targets.ts","../src/evaluation/providers/types.ts"],"sourcesContent":["import { constants } from 'node:fs';\nimport { access, readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Normalize line endings to LF (\\n).\n * This ensures consistent behavior across Windows (CRLF) and Unix (LF) systems.\n */\nexport function normalizeLineEndings(content: string): string {\n return content.replace(/\\r\\n/g, '\\n');\n}\n\n/**\n * Read a text file and normalize line endings to LF (\\n).\n * This ensures consistent behavior across Windows (CRLF) and Unix (LF) systems.\n */\nexport async function readTextFile(filePath: string): Promise<string> {\n const content = await readFile(filePath, 'utf8');\n return normalizeLineEndings(content);\n}\n\n/**\n * Find git repository root by walking up the directory tree.\n */\nexport async function findGitRoot(startPath: string): Promise<string | null> {\n let currentDir = path.dirname(path.resolve(startPath));\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const gitPath = path.join(currentDir, '.git');\n if (await fileExists(gitPath)) {\n return currentDir;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n\n return null;\n}\n\n/**\n * Build a chain of directories walking from a file's location up to repo root.\n * Used for discovering configuration files like targets.yaml or config.yaml.\n */\nexport function buildDirectoryChain(filePath: string, repoRoot: string): readonly string[] {\n const directories: string[] = [];\n const seen = new Set<string>();\n const boundary = path.resolve(repoRoot);\n let current: string | undefined = path.resolve(path.dirname(filePath));\n\n while (current !== undefined) {\n if (!seen.has(current)) {\n directories.push(current);\n seen.add(current);\n }\n if (current === boundary) {\n break;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n if (!seen.has(boundary)) {\n directories.push(boundary);\n }\n\n return directories;\n}\n\n/**\n * Build search roots for file resolution, matching yaml-parser behavior.\n * Searches from eval file directory up to repo root.\n */\nexport function buildSearchRoots(evalPath: string, repoRoot: string): readonly string[] {\n const uniqueRoots: string[] = [];\n const addRoot = (root: string): void => {\n const normalized = path.resolve(root);\n if (!uniqueRoots.includes(normalized)) {\n uniqueRoots.push(normalized);\n }\n };\n\n let currentDir = path.dirname(evalPath);\n let reachedBoundary = false;\n while (!reachedBoundary) {\n addRoot(currentDir);\n const parentDir = path.dirname(currentDir);\n if (currentDir === repoRoot || parentDir === currentDir) {\n reachedBoundary = true;\n } else {\n currentDir = parentDir;\n }\n }\n\n addRoot(repoRoot);\n addRoot(process.cwd());\n return uniqueRoots;\n}\n\n/**\n * Trim leading path separators for display.\n */\nfunction trimLeadingSeparators(value: string): string {\n const trimmed = value.replace(/^[/\\\\]+/, '');\n return trimmed.length > 0 ? trimmed : value;\n}\n\n/**\n * Resolve a file reference using search roots, matching yaml-parser behavior.\n */\nexport async function resolveFileReference(\n rawValue: string,\n searchRoots: readonly string[],\n): Promise<{\n readonly displayPath: string;\n readonly resolvedPath?: string;\n readonly attempted: readonly string[];\n}> {\n const displayPath = trimLeadingSeparators(rawValue);\n const potentialPaths: string[] = [];\n\n if (path.isAbsolute(rawValue)) {\n potentialPaths.push(path.normalize(rawValue));\n }\n\n for (const base of searchRoots) {\n potentialPaths.push(path.resolve(base, displayPath));\n }\n\n const attempted: string[] = [];\n const seen = new Set<string>();\n for (const candidate of potentialPaths) {\n const absoluteCandidate = path.resolve(candidate);\n if (seen.has(absoluteCandidate)) {\n continue;\n }\n seen.add(absoluteCandidate);\n attempted.push(absoluteCandidate);\n if (await fileExists(absoluteCandidate)) {\n return { displayPath, resolvedPath: absoluteCandidate, attempted };\n }\n }\n\n return { displayPath, attempted };\n}\n","import { z } from 'zod';\n\nimport type { EnvLookup, TargetDefinition } from './types.js';\n\nexport const CLI_PLACEHOLDERS = new Set([\n 'PROMPT',\n 'GUIDELINES',\n 'EVAL_ID',\n 'ATTEMPT',\n 'FILES',\n 'OUTPUT_FILE',\n]);\n\nexport interface RetryConfig {\n readonly maxRetries?: number;\n readonly initialDelayMs?: number;\n readonly maxDelayMs?: number;\n readonly backoffFactor?: number;\n readonly retryableStatusCodes?: readonly number[];\n}\n\n/**\n * Azure OpenAI settings used by the Vercel AI SDK.\n */\nexport interface AzureResolvedConfig {\n readonly resourceName: string;\n readonly deploymentName: string;\n readonly apiKey: string;\n readonly version?: string;\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly retry?: RetryConfig;\n}\n\n/**\n * Anthropic Claude settings used by the Vercel AI SDK.\n */\nexport interface AnthropicResolvedConfig {\n readonly apiKey: string;\n readonly model: string;\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly thinkingBudget?: number;\n readonly retry?: RetryConfig;\n}\n\n/**\n * Google Gemini settings used by the Vercel AI SDK.\n */\nexport interface GeminiResolvedConfig {\n readonly apiKey: string;\n readonly model: string;\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly retry?: RetryConfig;\n}\n\nexport interface CodexResolvedConfig {\n readonly executable: string;\n readonly args?: readonly string[];\n readonly cwd?: string;\n readonly timeoutMs?: number;\n readonly logDir?: string;\n readonly logFormat?: 'summary' | 'json';\n}\n\nexport interface MockResolvedConfig {\n readonly response?: string;\n readonly delayMs?: number;\n readonly delayMinMs?: number;\n readonly delayMaxMs?: number;\n}\n\nexport interface VSCodeResolvedConfig {\n readonly command: string;\n readonly waitForResponse: boolean;\n readonly dryRun: boolean;\n readonly subagentRoot?: string;\n readonly workspaceTemplate?: string;\n}\n\nexport type CliHealthcheck =\n | {\n readonly type: 'http';\n readonly url: string;\n readonly timeoutMs?: number;\n }\n | {\n readonly type: 'command';\n readonly commandTemplate: string;\n readonly timeoutMs?: number;\n readonly cwd?: string;\n };\n\nexport interface CliResolvedConfig {\n readonly commandTemplate: string;\n readonly filesFormat?: string;\n readonly cwd?: string;\n readonly timeoutMs?: number;\n readonly healthcheck?: CliHealthcheck;\n readonly verbose?: boolean;\n}\n\nexport type ResolvedTarget =\n | {\n readonly kind: 'azure';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: AzureResolvedConfig;\n }\n | {\n readonly kind: 'anthropic';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: AnthropicResolvedConfig;\n }\n | {\n readonly kind: 'gemini';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: GeminiResolvedConfig;\n }\n | {\n readonly kind: 'codex';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: CodexResolvedConfig;\n }\n | {\n readonly kind: 'mock';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: MockResolvedConfig;\n }\n | {\n readonly kind: 'vscode' | 'vscode-insiders';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: VSCodeResolvedConfig;\n }\n | {\n readonly kind: 'cli';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: CliResolvedConfig;\n };\n\nconst BASE_TARGET_SCHEMA = z\n .object({\n name: z.string().min(1, 'target name is required'),\n provider: z.string().min(1, 'provider is required'),\n judge_target: z.string().optional(),\n workers: z.number().int().min(1).optional(),\n })\n .passthrough();\n\nconst DEFAULT_AZURE_API_VERSION = '2024-10-01-preview';\n\nfunction normalizeAzureApiVersion(value: string | undefined): string {\n if (!value) {\n return DEFAULT_AZURE_API_VERSION;\n }\n\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return DEFAULT_AZURE_API_VERSION;\n }\n\n const withoutPrefix = trimmed.replace(/^api[-_]?version\\s*=\\s*/i, '').trim();\n return withoutPrefix.length > 0 ? withoutPrefix : DEFAULT_AZURE_API_VERSION;\n}\n\nfunction resolveRetryConfig(target: z.infer<typeof BASE_TARGET_SCHEMA>): RetryConfig | undefined {\n const maxRetries = resolveOptionalNumber(\n target.max_retries ?? target.maxRetries,\n `${target.name} max retries`,\n );\n const initialDelayMs = resolveOptionalNumber(\n target.retry_initial_delay_ms ?? target.retryInitialDelayMs,\n `${target.name} retry initial delay`,\n );\n const maxDelayMs = resolveOptionalNumber(\n target.retry_max_delay_ms ?? target.retryMaxDelayMs,\n `${target.name} retry max delay`,\n );\n const backoffFactor = resolveOptionalNumber(\n target.retry_backoff_factor ?? target.retryBackoffFactor,\n `${target.name} retry backoff factor`,\n );\n const retryableStatusCodes = resolveOptionalNumberArray(\n target.retry_status_codes ?? target.retryStatusCodes,\n `${target.name} retry status codes`,\n );\n\n // Only return retry config if at least one field is set\n if (\n maxRetries === undefined &&\n initialDelayMs === undefined &&\n maxDelayMs === undefined &&\n backoffFactor === undefined &&\n retryableStatusCodes === undefined\n ) {\n return undefined;\n }\n\n return {\n maxRetries,\n initialDelayMs,\n maxDelayMs,\n backoffFactor,\n retryableStatusCodes,\n };\n}\n\nexport function resolveTargetDefinition(\n definition: TargetDefinition,\n env: EnvLookup = process.env,\n): ResolvedTarget {\n const parsed = BASE_TARGET_SCHEMA.parse(definition);\n const provider = parsed.provider.toLowerCase();\n const providerBatching = resolveOptionalBoolean(\n parsed.provider_batching ?? parsed.providerBatching,\n );\n\n switch (provider) {\n case 'azure':\n case 'azure-openai':\n return {\n kind: 'azure',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveAzureConfig(parsed, env),\n };\n case 'anthropic':\n return {\n kind: 'anthropic',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveAnthropicConfig(parsed, env),\n };\n case 'gemini':\n case 'google':\n case 'google-gemini':\n return {\n kind: 'gemini',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveGeminiConfig(parsed, env),\n };\n case 'codex':\n case 'codex-cli':\n return {\n kind: 'codex',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveCodexConfig(parsed, env),\n };\n case 'mock':\n return {\n kind: 'mock',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveMockConfig(parsed),\n };\n case 'vscode':\n case 'vscode-insiders':\n return {\n kind: provider as 'vscode' | 'vscode-insiders',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveVSCodeConfig(parsed, env, provider === 'vscode-insiders'),\n };\n case 'cli':\n return {\n kind: 'cli',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveCliConfig(parsed, env),\n };\n default:\n throw new Error(`Unsupported provider '${parsed.provider}' in target '${parsed.name}'`);\n }\n}\n\nfunction resolveAzureConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): AzureResolvedConfig {\n const endpointSource = target.endpoint ?? target.resource ?? target.resourceName;\n const apiKeySource = target.api_key ?? target.apiKey;\n const deploymentSource = target.deployment ?? target.deploymentName ?? target.model;\n const versionSource = target.version ?? target.api_version;\n const temperatureSource = target.temperature;\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\n\n const resourceName = resolveString(endpointSource, env, `${target.name} endpoint`);\n const apiKey = resolveString(apiKeySource, env, `${target.name} api key`);\n const deploymentName = resolveString(deploymentSource, env, `${target.name} deployment`);\n const version = normalizeAzureApiVersion(\n resolveOptionalString(versionSource, env, `${target.name} api version`),\n );\n const temperature = resolveOptionalNumber(temperatureSource, `${target.name} temperature`);\n const maxOutputTokens = resolveOptionalNumber(\n maxTokensSource,\n `${target.name} max output tokens`,\n );\n const retry = resolveRetryConfig(target);\n\n return {\n resourceName,\n deploymentName,\n apiKey,\n version,\n temperature,\n maxOutputTokens,\n retry,\n };\n}\n\nfunction resolveAnthropicConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): AnthropicResolvedConfig {\n const apiKeySource = target.api_key ?? target.apiKey;\n const modelSource = target.model ?? target.deployment ?? target.variant;\n const temperatureSource = target.temperature;\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\n const thinkingBudgetSource = target.thinking_budget ?? target.thinkingBudget;\n\n const apiKey = resolveString(apiKeySource, env, `${target.name} Anthropic api key`);\n const model = resolveString(modelSource, env, `${target.name} Anthropic model`);\n const retry = resolveRetryConfig(target);\n\n return {\n apiKey,\n model,\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\n thinkingBudget: resolveOptionalNumber(thinkingBudgetSource, `${target.name} thinking budget`),\n retry,\n };\n}\n\nfunction resolveGeminiConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): GeminiResolvedConfig {\n const apiKeySource = target.api_key ?? target.apiKey;\n const modelSource = target.model ?? target.deployment ?? target.variant;\n const temperatureSource = target.temperature;\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\n\n const apiKey = resolveString(apiKeySource, env, `${target.name} Google API key`);\n const model =\n resolveOptionalString(modelSource, env, `${target.name} Gemini model`, {\n allowLiteral: true,\n optionalEnv: true,\n }) ?? 'gemini-2.5-flash';\n const retry = resolveRetryConfig(target);\n\n return {\n apiKey,\n model,\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\n retry,\n };\n}\n\nfunction resolveCodexConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): CodexResolvedConfig {\n const executableSource = target.executable ?? target.command ?? target.binary;\n const argsSource = target.args ?? target.arguments;\n const cwdSource = target.cwd;\n const timeoutSource = target.timeout_seconds ?? target.timeoutSeconds;\n const logDirSource =\n target.log_dir ?? target.logDir ?? target.log_directory ?? target.logDirectory;\n const logFormatSource =\n target.log_format ??\n target.logFormat ??\n target.log_output_format ??\n target.logOutputFormat ??\n env.AGENTV_CODEX_LOG_FORMAT;\n\n const executable =\n resolveOptionalString(executableSource, env, `${target.name} codex executable`, {\n allowLiteral: true,\n optionalEnv: true,\n }) ?? 'codex';\n\n const args = resolveOptionalStringArray(argsSource, env, `${target.name} codex args`);\n\n const cwd = resolveOptionalString(cwdSource, env, `${target.name} codex cwd`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n const timeoutMs = resolveTimeoutMs(timeoutSource, `${target.name} codex timeout`);\n const logDir = resolveOptionalString(logDirSource, env, `${target.name} codex log directory`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n const logFormat = normalizeCodexLogFormat(logFormatSource);\n\n return {\n executable,\n args,\n cwd,\n timeoutMs,\n logDir,\n logFormat,\n };\n}\n\nfunction normalizeCodexLogFormat(value: unknown): 'summary' | 'json' | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== 'string') {\n throw new Error(\"codex log format must be 'summary' or 'json'\");\n }\n const normalized = value.trim().toLowerCase();\n if (normalized === 'json' || normalized === 'summary') {\n return normalized;\n }\n throw new Error(\"codex log format must be 'summary' or 'json'\");\n}\n\nfunction resolveMockConfig(target: z.infer<typeof BASE_TARGET_SCHEMA>): MockResolvedConfig {\n const response = typeof target.response === 'string' ? target.response : undefined;\n return { response };\n}\n\nfunction resolveVSCodeConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n insiders: boolean,\n): VSCodeResolvedConfig {\n const workspaceTemplateEnvVar = resolveOptionalLiteralString(\n target.workspace_template ?? target.workspaceTemplate,\n );\n const workspaceTemplate = workspaceTemplateEnvVar\n ? resolveOptionalString(\n workspaceTemplateEnvVar,\n env,\n `${target.name} workspace template path`,\n {\n allowLiteral: false,\n optionalEnv: true,\n },\n )\n : undefined;\n\n const commandSource = target.vscode_cmd ?? target.command;\n const waitSource = target.wait;\n const dryRunSource = target.dry_run ?? target.dryRun;\n const subagentRootSource = target.subagent_root ?? target.subagentRoot;\n\n const defaultCommand = insiders ? 'code-insiders' : 'code';\n const command = resolveOptionalLiteralString(commandSource) ?? defaultCommand;\n\n return {\n command,\n waitForResponse: resolveOptionalBoolean(waitSource) ?? true,\n dryRun: resolveOptionalBoolean(dryRunSource) ?? false,\n subagentRoot: resolveOptionalString(subagentRootSource, env, `${target.name} subagent root`, {\n allowLiteral: true,\n optionalEnv: true,\n }),\n workspaceTemplate,\n };\n}\n\nfunction resolveCliConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): CliResolvedConfig {\n const commandTemplateSource = target.command_template ?? target.commandTemplate;\n const filesFormat = resolveOptionalLiteralString(\n target.files_format ??\n target.filesFormat ??\n target.attachments_format ??\n target.attachmentsFormat,\n );\n const cwd = resolveOptionalString(target.cwd, env, `${target.name} working directory`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n const timeoutMs = resolveTimeoutMs(\n target.timeout_seconds ?? target.timeoutSeconds,\n `${target.name} timeout`,\n );\n const healthcheck = resolveCliHealthcheck(target.healthcheck, env, target.name);\n\n const commandTemplate = resolveString(\n commandTemplateSource,\n env,\n `${target.name} CLI command template`,\n true,\n );\n assertSupportedCliPlaceholders(commandTemplate, `${target.name} CLI command template`);\n\n return {\n commandTemplate,\n filesFormat,\n cwd,\n timeoutMs,\n healthcheck,\n };\n}\n\nfunction resolveTimeoutMs(source: unknown, description: string): number | undefined {\n const seconds = resolveOptionalNumber(source, `${description} (seconds)`);\n if (seconds === undefined) {\n return undefined;\n }\n if (seconds <= 0) {\n throw new Error(`${description} must be greater than zero seconds`);\n }\n return Math.floor(seconds * 1000);\n}\n\nfunction resolveCliHealthcheck(\n source: unknown,\n env: EnvLookup,\n targetName: string,\n): CliHealthcheck | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (typeof source !== 'object' || Array.isArray(source)) {\n throw new Error(`${targetName} healthcheck must be an object`);\n }\n\n const candidate = source as Record<string, unknown>;\n const type = candidate.type;\n const timeoutMs = resolveTimeoutMs(\n candidate.timeout_seconds ?? candidate.timeoutSeconds,\n `${targetName} healthcheck timeout`,\n );\n\n if (type === 'http') {\n const url = resolveString(candidate.url, env, `${targetName} healthcheck URL`);\n return {\n type: 'http',\n url,\n timeoutMs,\n };\n }\n\n if (type === 'command') {\n const commandTemplate = resolveString(\n candidate.command_template ?? candidate.commandTemplate,\n env,\n `${targetName} healthcheck command template`,\n true,\n );\n assertSupportedCliPlaceholders(commandTemplate, `${targetName} healthcheck command template`);\n const cwd = resolveOptionalString(candidate.cwd, env, `${targetName} healthcheck cwd`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n return {\n type: 'command',\n commandTemplate,\n timeoutMs,\n cwd,\n };\n }\n\n throw new Error(`${targetName} healthcheck type must be 'http' or 'command'`);\n}\n\nfunction assertSupportedCliPlaceholders(template: string, description: string): void {\n const placeholders = extractCliPlaceholders(template);\n for (const placeholder of placeholders) {\n if (!CLI_PLACEHOLDERS.has(placeholder)) {\n throw new Error(\n `${description} includes unsupported placeholder '{${placeholder}}'. Supported placeholders: ${Array.from(CLI_PLACEHOLDERS).join(', ')}`,\n );\n }\n }\n}\n\nfunction extractCliPlaceholders(template: string): string[] {\n const matches = template.matchAll(/\\{([A-Z_]+)\\}/g);\n const results: string[] = [];\n for (const match of matches) {\n if (match[1]) {\n results.push(match[1]);\n }\n }\n return results;\n}\n\nfunction resolveString(\n source: unknown,\n env: EnvLookup,\n description: string,\n allowLiteral = false,\n): string {\n const value = resolveOptionalString(source, env, description, {\n allowLiteral,\n optionalEnv: false,\n });\n if (value === undefined) {\n throw new Error(`${description} is required`);\n }\n return value;\n}\n\nfunction resolveOptionalString(\n source: unknown,\n env: EnvLookup,\n description: string,\n options?: { allowLiteral?: boolean; optionalEnv?: boolean },\n): string | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (typeof source !== 'string') {\n throw new Error(`${description} must be a string`);\n }\n const trimmed = source.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n\n // Check for ${{ variable }} syntax\n const envVarMatch = trimmed.match(/^\\$\\{\\{\\s*([A-Z0-9_]+)\\s*\\}\\}$/i);\n if (envVarMatch) {\n const varName = envVarMatch[1];\n const envValue = env[varName];\n if (envValue !== undefined) {\n if (envValue.trim().length === 0) {\n throw new Error(`Environment variable '${varName}' for ${description} is empty`);\n }\n return envValue;\n }\n const optionalEnv = options?.optionalEnv ?? false;\n if (optionalEnv) {\n return undefined;\n }\n throw new Error(`Environment variable '${varName}' required for ${description} is not set`);\n }\n\n // Return as literal value\n const allowLiteral = options?.allowLiteral ?? false;\n if (!allowLiteral) {\n throw new Error(\n `${description} must use \\${{ VARIABLE_NAME }} syntax for environment variables or be marked as allowing literals`,\n );\n }\n return trimmed;\n}\n\nfunction resolveOptionalLiteralString(source: unknown): string | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (typeof source !== 'string') {\n throw new Error('expected string value');\n }\n const trimmed = source.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction resolveOptionalNumber(source: unknown, description: string): number | undefined {\n if (source === undefined || source === null || source === '') {\n return undefined;\n }\n if (typeof source === 'number') {\n return Number.isFinite(source) ? source : undefined;\n }\n if (typeof source === 'string') {\n const numeric = Number(source);\n if (Number.isFinite(numeric)) {\n return numeric;\n }\n }\n throw new Error(`${description} must be a number`);\n}\n\nfunction resolveOptionalBoolean(source: unknown): boolean | undefined {\n if (source === undefined || source === null || source === '') {\n return undefined;\n }\n if (typeof source === 'boolean') {\n return source;\n }\n if (typeof source === 'string') {\n const lowered = source.trim().toLowerCase();\n if (lowered === 'true' || lowered === '1') {\n return true;\n }\n if (lowered === 'false' || lowered === '0') {\n return false;\n }\n }\n throw new Error('expected boolean value');\n}\n\nfunction resolveOptionalStringArray(\n source: unknown,\n env: EnvLookup,\n description: string,\n): readonly string[] | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (!Array.isArray(source)) {\n throw new Error(`${description} must be an array of strings`);\n }\n if (source.length === 0) {\n return undefined;\n }\n const resolved: string[] = [];\n for (let i = 0; i < source.length; i++) {\n const item = source[i];\n if (typeof item !== 'string') {\n throw new Error(`${description}[${i}] must be a string`);\n }\n const trimmed = item.trim();\n if (trimmed.length === 0) {\n throw new Error(`${description}[${i}] cannot be empty`);\n }\n\n // Check for ${{ variable }} syntax\n const envVarMatch = trimmed.match(/^\\$\\{\\{\\s*([A-Z0-9_]+)\\s*\\}\\}$/i);\n if (envVarMatch) {\n const varName = envVarMatch[1];\n const envValue = env[varName];\n if (envValue !== undefined) {\n if (envValue.trim().length === 0) {\n throw new Error(`Environment variable '${varName}' for ${description}[${i}] is empty`);\n }\n resolved.push(envValue);\n continue;\n }\n throw new Error(`Environment variable '${varName}' for ${description}[${i}] is not set`);\n }\n\n // Treat as literal value\n resolved.push(trimmed);\n }\n return resolved.length > 0 ? resolved : undefined;\n}\n\nfunction resolveOptionalNumberArray(\n source: unknown,\n description: string,\n): readonly number[] | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (!Array.isArray(source)) {\n throw new Error(`${description} must be an array of numbers`);\n }\n if (source.length === 0) {\n return undefined;\n }\n const resolved: number[] = [];\n for (let i = 0; i < source.length; i++) {\n const item = source[i];\n if (typeof item !== 'number' || !Number.isFinite(item)) {\n throw new Error(`${description}[${i}] must be a number`);\n }\n resolved.push(item);\n }\n return resolved.length > 0 ? resolved : undefined;\n}\n","import type { JsonObject } from '../types.js';\n\nexport type ChatMessageRole = 'system' | 'user' | 'assistant' | 'tool' | 'function';\n\nexport interface ChatMessage {\n readonly role: ChatMessageRole;\n readonly content: string;\n readonly name?: string;\n}\n\nexport type ChatPrompt = readonly ChatMessage[];\n\nexport type ProviderKind =\n | 'azure'\n | 'anthropic'\n | 'gemini'\n | 'codex'\n | 'cli'\n | 'mock'\n | 'vscode'\n | 'vscode-insiders';\n\n/**\n * Agent providers that have filesystem access and don't need unwrapped guidelines.\n * These providers read files directly from the filesystem using file:// URIs.\n */\nexport const AGENT_PROVIDER_KINDS: readonly ProviderKind[] = [\n 'codex',\n 'vscode',\n 'vscode-insiders',\n] as const;\n\n/**\n * List of all supported provider kinds.\n * This is the source of truth for provider validation.\n */\nexport const KNOWN_PROVIDERS: readonly ProviderKind[] = [\n 'azure',\n 'anthropic',\n 'gemini',\n 'codex',\n 'cli',\n 'mock',\n 'vscode',\n 'vscode-insiders',\n] as const;\n\n/**\n * Provider aliases that are accepted in target definitions.\n * These map to the canonical ProviderKind values.\n */\nexport const PROVIDER_ALIASES: readonly string[] = [\n 'azure-openai', // alias for \"azure\"\n 'google', // alias for \"gemini\"\n 'google-gemini', // alias for \"gemini\"\n 'codex-cli', // alias for \"codex\"\n 'openai', // legacy/future support\n 'bedrock', // legacy/future support\n 'vertex', // legacy/future support\n] as const;\n\n/**\n * Schema identifier for targets.yaml files (version 2).\n */\nexport const TARGETS_SCHEMA_V2 = 'agentv-targets-v2.2';\n\nexport interface ProviderRequest {\n readonly question: string;\n readonly systemPrompt?: string;\n readonly guidelines?: string;\n readonly guideline_patterns?: readonly string[];\n readonly chatPrompt?: ChatPrompt;\n readonly inputFiles?: readonly string[];\n readonly evalCaseId?: string;\n readonly attempt?: number;\n readonly maxOutputTokens?: number;\n readonly temperature?: number;\n readonly metadata?: JsonObject;\n readonly signal?: AbortSignal;\n}\n\nexport interface ProviderResponse {\n readonly text: string;\n readonly reasoning?: string;\n readonly raw?: unknown;\n readonly usage?: JsonObject;\n}\n\n/**\n * Type guard to check if a provider is an agent provider with filesystem access.\n * Agent providers read files directly and don't need unwrapped guideline content.\n */\nexport function isAgentProvider(provider: Provider | undefined): boolean {\n return provider ? AGENT_PROVIDER_KINDS.includes(provider.kind) : false;\n}\n\nexport interface Provider {\n readonly id: string;\n readonly kind: ProviderKind;\n readonly targetName: string;\n invoke(request: ProviderRequest): Promise<ProviderResponse>;\n /**\n * Optional capability marker for provider-managed batching (single session handling multiple requests).\n */\n readonly supportsBatch?: boolean;\n /**\n * Optional batch invocation hook. When defined alongside supportsBatch=true,\n * the orchestrator may send multiple requests in a single provider session.\n */\n invokeBatch?(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]>;\n /**\n * Optional method to get a Vercel AI SDK LanguageModel instance for structured output generation.\n * Used by evaluators that need generateObject/generateText from the AI SDK.\n */\n asLanguageModel?(): import('ai').LanguageModel;\n}\n\nexport type EnvLookup = Readonly<Record<string, string | undefined>>;\n\nexport interface TargetDefinition {\n readonly name: string;\n readonly provider: ProviderKind | string;\n readonly judge_target?: string | undefined;\n readonly workers?: number | undefined;\n // Provider batching\n readonly provider_batching?: boolean | undefined;\n readonly providerBatching?: boolean | undefined;\n // Azure fields\n readonly endpoint?: string | unknown | undefined;\n readonly resource?: string | unknown | undefined;\n readonly resourceName?: string | unknown | undefined;\n readonly api_key?: string | unknown | undefined;\n readonly apiKey?: string | unknown | undefined;\n readonly deployment?: string | unknown | undefined;\n readonly deploymentName?: string | unknown | undefined;\n readonly model?: string | unknown | undefined;\n readonly version?: string | unknown | undefined;\n readonly api_version?: string | unknown | undefined;\n // Anthropic fields\n readonly variant?: string | unknown | undefined;\n readonly thinking_budget?: number | unknown | undefined;\n readonly thinkingBudget?: number | unknown | undefined;\n // Common fields\n readonly temperature?: number | unknown | undefined;\n readonly max_output_tokens?: number | unknown | undefined;\n readonly maxTokens?: number | unknown | undefined;\n // Codex fields\n readonly executable?: string | unknown | undefined;\n readonly command?: string | unknown | undefined;\n readonly binary?: string | unknown | undefined;\n readonly args?: unknown | undefined;\n readonly arguments?: unknown | undefined;\n readonly cwd?: string | unknown | undefined;\n readonly timeout_seconds?: number | unknown | undefined;\n readonly timeoutSeconds?: number | unknown | undefined;\n readonly log_dir?: string | unknown | undefined;\n readonly logDir?: string | unknown | undefined;\n readonly log_directory?: string | unknown | undefined;\n readonly logDirectory?: string | unknown | undefined;\n readonly log_format?: string | unknown | undefined;\n readonly logFormat?: string | unknown | undefined;\n readonly log_output_format?: string | unknown | undefined;\n readonly logOutputFormat?: string | unknown | undefined;\n // Mock fields\n readonly response?: string | unknown | undefined;\n readonly delayMs?: number | unknown | undefined;\n readonly delayMinMs?: number | unknown | undefined;\n readonly delayMaxMs?: number | unknown | undefined;\n // VSCode fields\n readonly vscode_cmd?: string | unknown | undefined;\n readonly wait?: boolean | unknown | undefined;\n readonly dry_run?: boolean | unknown | undefined;\n readonly dryRun?: boolean | unknown | undefined;\n readonly subagent_root?: string | unknown | undefined;\n readonly subagentRoot?: string | unknown | undefined;\n readonly workspace_template?: string | unknown | undefined;\n readonly workspaceTemplate?: string | unknown | undefined;\n // CLI fields\n readonly command_template?: string | unknown | undefined;\n readonly commandTemplate?: string | unknown | undefined;\n readonly files_format?: string | unknown | undefined;\n readonly filesFormat?: string | unknown | undefined;\n readonly attachments_format?: string | unknown | undefined;\n readonly attachmentsFormat?: string | unknown | undefined;\n readonly env?: unknown | undefined;\n readonly healthcheck?: unknown | undefined;\n // Retry configuration fields\n readonly max_retries?: number | unknown | undefined;\n readonly maxRetries?: number | unknown | undefined;\n readonly retry_initial_delay_ms?: number | unknown | undefined;\n readonly retryInitialDelayMs?: number | unknown | undefined;\n readonly retry_max_delay_ms?: number | unknown | undefined;\n readonly retryMaxDelayMs?: number | unknown | undefined;\n readonly retry_backoff_factor?: number | unknown | undefined;\n readonly retryBackoffFactor?: number | unknown | undefined;\n readonly retry_status_codes?: unknown | undefined;\n readonly retryStatusCodes?: unknown | undefined;\n}\n"],"mappings":"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","names":[]}
@@ -42,6 +42,7 @@ module.exports = __toCommonJS(validation_exports);
42
42
 
43
43
  // src/evaluation/validation/file-type.ts
44
44
  var import_promises = require("fs/promises");
45
+ var import_node_path = __toESM(require("path"), 1);
45
46
  var import_yaml = require("yaml");
46
47
  var SCHEMA_EVAL_V2 = "agentv-eval-v2";
47
48
  var SCHEMA_TARGETS_V2 = "agentv-targets-v2.2";
@@ -51,12 +52,12 @@ async function detectFileType(filePath) {
51
52
  const content = await (0, import_promises.readFile)(filePath, "utf8");
52
53
  const parsed = (0, import_yaml.parse)(content);
53
54
  if (typeof parsed !== "object" || parsed === null) {
54
- return "unknown";
55
+ return inferFileTypeFromPath(filePath);
55
56
  }
56
57
  const record = parsed;
57
58
  const schema = record.$schema;
58
59
  if (typeof schema !== "string") {
59
- return "unknown";
60
+ return inferFileTypeFromPath(filePath);
60
61
  }
61
62
  switch (schema) {
62
63
  case SCHEMA_EVAL_V2:
@@ -66,12 +67,25 @@ async function detectFileType(filePath) {
66
67
  case SCHEMA_CONFIG_V2:
67
68
  return "config";
68
69
  default:
69
- return "unknown";
70
+ return inferFileTypeFromPath(filePath);
70
71
  }
71
72
  } catch {
72
- return "unknown";
73
+ return inferFileTypeFromPath(filePath);
73
74
  }
74
75
  }
76
+ function inferFileTypeFromPath(filePath) {
77
+ const normalized = import_node_path.default.normalize(filePath).replace(/\\/g, "/");
78
+ const basename = import_node_path.default.basename(filePath);
79
+ if (normalized.includes("/.agentv/")) {
80
+ if (basename === "config.yaml" || basename === "config.yml") {
81
+ return "config";
82
+ }
83
+ if (basename === "targets.yaml" || basename === "targets.yml") {
84
+ return "targets";
85
+ }
86
+ }
87
+ return "eval";
88
+ }
75
89
  function isValidSchema(schema) {
76
90
  return schema === SCHEMA_EVAL_V2 || schema === SCHEMA_TARGETS_V2 || schema === SCHEMA_CONFIG_V2;
77
91
  }
@@ -90,14 +104,14 @@ function getExpectedSchema(fileType) {
90
104
 
91
105
  // src/evaluation/validation/eval-validator.ts
92
106
  var import_promises2 = require("fs/promises");
93
- var import_node_path = __toESM(require("path"), 1);
107
+ var import_node_path2 = __toESM(require("path"), 1);
94
108
  var import_yaml2 = require("yaml");
95
109
  function isObject(value) {
96
110
  return typeof value === "object" && value !== null && !Array.isArray(value);
97
111
  }
98
112
  async function validateEvalFile(filePath) {
99
113
  const errors = [];
100
- const absolutePath = import_node_path.default.resolve(filePath);
114
+ const absolutePath = import_node_path2.default.resolve(filePath);
101
115
  let parsed;
102
116
  try {
103
117
  const content = await (0, import_promises2.readFile)(absolutePath, "utf8");
@@ -293,7 +307,7 @@ function validateContentForRoleMarkers(content, location, filePath, errors) {
293
307
 
294
308
  // src/evaluation/validation/targets-validator.ts
295
309
  var import_promises3 = require("fs/promises");
296
- var import_node_path2 = __toESM(require("path"), 1);
310
+ var import_node_path3 = __toESM(require("path"), 1);
297
311
  var import_yaml3 = require("yaml");
298
312
 
299
313
  // src/evaluation/providers/targets.ts
@@ -498,7 +512,7 @@ function validateUnknownSettings(target, provider, absolutePath, location, error
498
512
  }
499
513
  async function validateTargetsFile(filePath) {
500
514
  const errors = [];
501
- const absolutePath = import_node_path2.default.resolve(filePath);
515
+ const absolutePath = import_node_path3.default.resolve(filePath);
502
516
  let parsed;
503
517
  try {
504
518
  const content = await (0, import_promises3.readFile)(absolutePath, "utf8");
@@ -781,8 +795,8 @@ async function validateConfigFile(filePath) {
781
795
  }
782
796
  const config = parsed;
783
797
  const schema = config.$schema;
784
- if (schema !== SCHEMA_CONFIG_V22) {
785
- const message = typeof schema === "string" ? `Invalid $schema value '${schema}'. Expected '${SCHEMA_CONFIG_V22}'` : `Missing required field '$schema'. Please add '$schema: ${SCHEMA_CONFIG_V22}' at the top of the file.`;
798
+ if (schema !== void 0 && schema !== SCHEMA_CONFIG_V22) {
799
+ const message = `Invalid $schema value '${schema}'. Expected '${SCHEMA_CONFIG_V22}' or omit the field.`;
786
800
  errors.push({
787
801
  severity: "error",
788
802
  filePath,
@@ -842,13 +856,13 @@ async function validateConfigFile(filePath) {
842
856
 
843
857
  // src/evaluation/validation/file-reference-validator.ts
844
858
  var import_promises6 = require("fs/promises");
845
- var import_node_path4 = __toESM(require("path"), 1);
859
+ var import_node_path5 = __toESM(require("path"), 1);
846
860
  var import_yaml5 = require("yaml");
847
861
 
848
862
  // src/evaluation/file-utils.ts
849
863
  var import_node_fs = require("fs");
850
864
  var import_promises5 = require("fs/promises");
851
- var import_node_path3 = __toESM(require("path"), 1);
865
+ var import_node_path4 = __toESM(require("path"), 1);
852
866
  async function fileExists(filePath) {
853
867
  try {
854
868
  await (0, import_promises5.access)(filePath, import_node_fs.constants.F_OK);
@@ -858,14 +872,14 @@ async function fileExists(filePath) {
858
872
  }
859
873
  }
860
874
  async function findGitRoot(startPath) {
861
- let currentDir = import_node_path3.default.dirname(import_node_path3.default.resolve(startPath));
862
- const root = import_node_path3.default.parse(currentDir).root;
875
+ let currentDir = import_node_path4.default.dirname(import_node_path4.default.resolve(startPath));
876
+ const root = import_node_path4.default.parse(currentDir).root;
863
877
  while (currentDir !== root) {
864
- const gitPath = import_node_path3.default.join(currentDir, ".git");
878
+ const gitPath = import_node_path4.default.join(currentDir, ".git");
865
879
  if (await fileExists(gitPath)) {
866
880
  return currentDir;
867
881
  }
868
- const parentDir = import_node_path3.default.dirname(currentDir);
882
+ const parentDir = import_node_path4.default.dirname(currentDir);
869
883
  if (parentDir === currentDir) {
870
884
  break;
871
885
  }
@@ -876,16 +890,16 @@ async function findGitRoot(startPath) {
876
890
  function buildSearchRoots(evalPath, repoRoot) {
877
891
  const uniqueRoots = [];
878
892
  const addRoot = (root) => {
879
- const normalized = import_node_path3.default.resolve(root);
893
+ const normalized = import_node_path4.default.resolve(root);
880
894
  if (!uniqueRoots.includes(normalized)) {
881
895
  uniqueRoots.push(normalized);
882
896
  }
883
897
  };
884
- let currentDir = import_node_path3.default.dirname(evalPath);
898
+ let currentDir = import_node_path4.default.dirname(evalPath);
885
899
  let reachedBoundary = false;
886
900
  while (!reachedBoundary) {
887
901
  addRoot(currentDir);
888
- const parentDir = import_node_path3.default.dirname(currentDir);
902
+ const parentDir = import_node_path4.default.dirname(currentDir);
889
903
  if (currentDir === repoRoot || parentDir === currentDir) {
890
904
  reachedBoundary = true;
891
905
  } else {
@@ -903,16 +917,16 @@ function trimLeadingSeparators(value) {
903
917
  async function resolveFileReference(rawValue, searchRoots) {
904
918
  const displayPath = trimLeadingSeparators(rawValue);
905
919
  const potentialPaths = [];
906
- if (import_node_path3.default.isAbsolute(rawValue)) {
907
- potentialPaths.push(import_node_path3.default.normalize(rawValue));
920
+ if (import_node_path4.default.isAbsolute(rawValue)) {
921
+ potentialPaths.push(import_node_path4.default.normalize(rawValue));
908
922
  }
909
923
  for (const base of searchRoots) {
910
- potentialPaths.push(import_node_path3.default.resolve(base, displayPath));
924
+ potentialPaths.push(import_node_path4.default.resolve(base, displayPath));
911
925
  }
912
926
  const attempted = [];
913
927
  const seen = /* @__PURE__ */ new Set();
914
928
  for (const candidate of potentialPaths) {
915
- const absoluteCandidate = import_node_path3.default.resolve(candidate);
929
+ const absoluteCandidate = import_node_path4.default.resolve(candidate);
916
930
  if (seen.has(absoluteCandidate)) {
917
931
  continue;
918
932
  }
@@ -931,7 +945,7 @@ function isObject3(value) {
931
945
  }
932
946
  async function validateFileReferences(evalFilePath) {
933
947
  const errors = [];
934
- const absolutePath = import_node_path4.default.resolve(evalFilePath);
948
+ const absolutePath = import_node_path5.default.resolve(evalFilePath);
935
949
  const gitRoot = await findGitRoot(absolutePath);
936
950
  if (!gitRoot) {
937
951
  errors.push({